carbon-tokenization / backend /src /agent /embed-chat.ts
tfrere's picture
tfrere HF Staff
feat(embed-studio): make agent-generated charts theme-aware
27abbe5
import {
EMBED_SYSTEM_PROMPT,
BANNER_SYSTEM_PROMPT,
buildEmbedContext,
buildDataFilesContext,
buildThemeContext,
} from "./embed-system-prompt.js";
import { embedTools } from "./embed-tools.js";
import { streamChatResponse } from "./stream-handler.js";
import type { Request, Response } from "express";
export async function handleEmbedChat(req: Request, res: Response) {
const { context } = req.body;
const contextBlock = buildEmbedContext(context?.embedHtml);
const isBanner = Boolean(context?.isBanner);
const isScratch = Boolean(context?.isScratch);
const dataFilesBlock = buildDataFilesContext(context?.dataFiles);
const themeBlock = buildThemeContext(context?.theme);
const parts = [EMBED_SYSTEM_PROMPT];
if (isBanner) parts.push(BANNER_SYSTEM_PROMPT);
if (isScratch) {
parts.push(
"## New chart\n\nThis chart is BRAND NEW - it has an auto-generated " +
"placeholder filename. Your VERY FIRST `createEmbed` call MUST include " +
"a descriptive `filename` slug (kebab-case, no extension, 2-4 words) " +
"that reflects what the chart represents. The client will rename the " +
"underlying file and keep the document in sync.",
);
}
if (themeBlock) parts.push(themeBlock);
if (contextBlock) parts.push(`## Current chart\n\n${contextBlock}`);
if (dataFilesBlock) parts.push(`## Attached data\n\n${dataFilesBlock}`);
const systemPrompt = parts.join("\n\n");
return streamChatResponse(req, res, {
systemPrompt,
tools: embedTools,
logPrefix: "embed-chat",
});
}