33 lines
1.6 KiB
TypeScript
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 "提示词模型调用失败,请稍后重试或选择其他文字模型。原提示词已保留。";
|
|
}
|