UNPKG

@llumiverse/core

Version:

Provide an universal API to LLMs. Support for existing LLMs can be added by writing a driver.

99 lines 3.67 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.formatNovaPrompt = formatNovaPrompt; const common_1 = require("@llumiverse/common"); const stream_js_1 = require("../stream.js"); const commons_js_1 = require("./commons.js"); /** * A formatter used by Bedrock to format prompts for nova related models */ 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 (0, stream_js_1.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 === common_1.PromptRole.system) { system.push(segment.content); } else if (segment.role === common_1.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 === common_1.PromptRole.negative) { negative = negative.concat(segment.content, ', '); } else if (segment.role === common_1.PromptRole.mask) { mask = mask.concat(segment.content, ' '); } else if (segment.role !== common_1.PromptRole.tool) { messages.push({ role: segment.role, content: parts }); } } if (schema) { safety.push("IMPORTANT: " + (0, commons_js_1.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