@llumiverse/core
Version:
Provide an universal API to LLMs. Support for existing LLMs can be added by writing a driver.
96 lines • 3.49 kB
JavaScript
import { PromptRole } from "@llumiverse/common";
import { readStreamAsBase64 } from "../stream.js";
import { getJSONSafetyNotice } from "./commons.js";
/**
* A formatter used by Bedrock to format prompts for nova related models
*/
export async function formatNovaPrompt(segments, schema) {
const system = [];
const safety = [];
const messages = [];
let negative = "";
let mask = "";
for (const segment of segments) {
const parts = [];
if (segment.files)
for (const f of segment.files) {
//TODO add video support
if (!f.mime_type?.startsWith('image')) {
continue;
}
const source = await f.getStream();
const data = await readStreamAsBase64(source);
const format = f.mime_type?.split('/')[1] || 'png';
parts.push({
image: {
format: format,
source: {
bytes: data
}
}
});
}
if (segment.content) {
parts.push({
text: segment.content
});
}
if (segment.role === PromptRole.system) {
system.push(segment.content);
}
else if (segment.role === PromptRole.safety) {
safety.push(segment.content);
}
else if (messages.length > 0 && messages[messages.length - 1].role === segment.role) {
//Maybe can remove for nova?
//concatenate messages of the same role (Claude requires alternative user and assistant roles)
messages[messages.length - 1].content.push(...parts);
}
else if (segment.role === PromptRole.negative) {
negative = negative.concat(segment.content, ', ');
}
else if (segment.role === PromptRole.mask) {
mask = mask.concat(segment.content, ' ');
}
else if (segment.role !== PromptRole.tool) {
messages.push({
role: segment.role,
content: parts
});
}
}
if (schema) {
safety.push("IMPORTANT: " + getJSONSafetyNotice(schema));
}
// messages must contains at least 1 item. If the prompt does not contains a user message (but only system messages)
// we need to put the system messages in the messages array
let systemMessage = system.join('\n').trim();
if (messages.length === 0) {
if (!systemMessage) {
throw new Error('Prompt must contain at least one message');
}
messages.push({ content: [{ text: systemMessage }], role: 'user' });
systemMessage = safety.join('\n');
}
else if (safety.length > 0) {
systemMessage = systemMessage + '\n\nIMPORTANT: ' + safety.join('\n');
}
/*start Nova's message to make sure it answers properly in JSON
if enabled, this requires to add the { to Nova's response*/
if (schema) {
messages.push({
role: "assistant",
content: [{
text: "{"
}]
});
}
// put system messages first and safety last
return {
system: systemMessage ? [{ text: systemMessage }] : [{ text: "" }],
messages: messages,
negative: negative || undefined,
mask: mask || undefined,
};
}
//# sourceMappingURL=nova.js.map