@paroicms/site-generator-plugin
Version:
ParoiCMS Site Generator Plugin
75 lines (74 loc) • 3.54 kB
JavaScript
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 };
}