UNPKG

@paroicms/site-generator-plugin

Version:

ParoiCMS Site Generator Plugin

75 lines (74 loc) 3.54 kB
import { languageLabelIn } from "@paroicms/public-anywhere-lib"; import { batchInvokeMinistral } from "../lib/calling-llm-mistral.js"; import { readPromptFile } from "../lib/create-prompt.js"; import { debugBatchLlmOutputs } from "../lib/debug-utils.js"; import { parseLlmResponseAsList } from "../lib/parse-llm-response.js"; import { buildPromptTemplate } from "../lib/prompt-template.js"; // Load and create prompt templates const singlePromptTemplate = buildPromptTemplate(await readPromptFile("generate-fake-content-single.md")); const multipleDocumentsPromptTemplate = buildPromptTemplate(await readPromptFile("generate-fake-content-multiple-documents.md")); const multiplePartsPromptTemplate = buildPromptTemplate(await readPromptFile("generate-fake-content-multiple-parts.md")); const multipleTermsPromptTemplate = buildPromptTemplate(await readPromptFile("generate-fake-content-multiple-terms.md")); export async function invokeGenerateFakeContent(ctx, input, outputTags, options) { const { language, typeKind } = input; const single = input.count === 1; const llmTaskName = `fake-content-${options.llmTaskName}${single ? "" : `-${input.count}`}`; const tagAndDescriptions = outputTags .map(({ tagName, tagDescription }) => `<${tagName}>${tagDescription}</${tagName}>`) .join("\n"); // Call LLM in batch mode const maxBatchSize = 15; const batchInputs = []; let startIndex = 0; while (startIndex < input.count) { const nextIndex = startIndex + maxBatchSize; const end = Math.min(nextIndex, input.count); const llmInput = { tagAndDescriptions, typeLabel: input.typeLabel, typeDescription: input.typeDescription, siteTheme: input.siteTheme, language: languageLabelIn(language, "en"), }; if (typeKind === "part") { llmInput.documentDescription = input.documentDescription; } if (!single) { llmInput.count = `${end - startIndex}`; } batchInputs.push(llmInput); startIndex = nextIndex; } const debug = await debugBatchLlmOutputs(ctx, llmTaskName, ctx.mistralModelName, undefined, batchInputs); let llmOutput = debug.stored; if (!llmOutput) { // Select the appropriate prompt template const promptTemplate = single ? singlePromptTemplate : typeKind === "document" ? input.isTaxonomyTerm ? multipleTermsPromptTemplate : multipleDocumentsPromptTemplate : multiplePartsPromptTemplate; // Process batch inputs const messages = batchInputs.map(promptTemplate); const results = await batchInvokeMinistral(ctx, messages, { llmTaskName, temperature: 0.1, maxTokens: 50_000, timeoutMs: 60_000, }); llmOutput = await debug.getMessageContents(results); } const results = []; for (const llmMessageContent of llmOutput.outputs) { const list = parseLlmResponseAsList(llmMessageContent, outputTags, { ...options, titleFromMarkdownHeading: outputTags.some((tag) => tag.key === "title") ? "title" : undefined, }); results.push(...list.map((fields) => Object.fromEntries(Object.entries(fields).map(([fieldName, value]) => [fieldName, { [language]: value }])))); } return { contents: results, llmReport: llmOutput.llmReport }; }