ai-chatbot/lib/video-canvas/prompt-tools.ts

33 lines
1.6 KiB
TypeScript

import { z } from "zod";
import { isCanvasLanguageModel, type CanvasModelDescriptor } from "./model-matching";
export const promptToolSchema = z.object({
mode: z.enum(["optimize", "translate"]),
prompt: z.string().trim().min(1, "请先输入提示词").max(12000, "提示词不能超过 12000 字"),
model: z.string().trim().max(200).optional(),
});
export type PromptToolMode = z.infer<typeof promptToolSchema>["mode"];
export const promptToolFunctionKey = (mode: PromptToolMode) => `video-prompt-${mode}`;
export function selectPromptToolModel<T extends CanvasModelDescriptor>(models: T[], requested?: string) {
const candidates = models.filter(model => model.isEnabled !== false && isCanvasLanguageModel(model));
const ref = requested?.trim();
const model = ref && ref !== "auto"
? candidates.find(item => item.id === ref || item.modelId === ref)
: candidates[0];
if (!model) throw new Error(ref && ref !== "auto"
? "所选提示词模型不可用或不是文字模型,请重新选择"
: "当前没有可用的提示词处理模型");
return model;
}
export function promptToolErrorMessage(error: unknown) {
const message = error instanceof Error ? error.message : "";
if (/overdue|good standing|insufficient.*balance|欠费/i.test(message)) {
return "模型服务商账户余额或状态异常,请管理员检查。原提示词已保留。";
}
if (/abort|timeout|timed out/i.test(message)) return "提示词处理超时,请重试。原提示词已保留。";
return "提示词模型调用失败,请稍后重试或选择其他文字模型。原提示词已保留。";
}