ai-chatbot/lib/db/ai-model-flags.ts
Your Name cc26d2eb7f
Some checks failed
Lint / build (20) (push) Has been cancelled
Playwright Tests / test (push) Has been cancelled
feat(ai): add volcano multimodal provider and agent multimodal mode
2026-02-18 19:58:31 +08:00

96 lines
2.6 KiB
TypeScript

const AGENT_AUTO_MODEL_KEY = "agentAutoModel";
const MULTIMODAL_MODEL_KEY = "multimodalModel";
function toRecord(value: unknown): Record<string, unknown> | null {
if (!value || typeof value !== "object" || Array.isArray(value)) {
return null;
}
return value as Record<string, unknown>;
}
export function isAiModelAgentAuto(input: {
defaultParams?: unknown;
capabilities?: unknown;
modelId?: string | null;
displayName?: string | null;
supportsVision?: boolean | null;
supportsImageGen?: boolean | null;
}): boolean {
const defaultParams = toRecord(input.defaultParams);
if (typeof defaultParams?.[AGENT_AUTO_MODEL_KEY] === "boolean") {
return defaultParams[AGENT_AUTO_MODEL_KEY] as boolean;
}
const capabilities = toRecord(input.capabilities);
if (typeof capabilities?.[AGENT_AUTO_MODEL_KEY] === "boolean") {
return capabilities[AGENT_AUTO_MODEL_KEY] as boolean;
}
const supportsVision = Boolean(input.supportsVision);
const supportsImageGen = Boolean(input.supportsImageGen);
if (!supportsVision || supportsImageGen) {
return false;
}
const modelText = `${input.modelId || ""} ${input.displayName || ""}`.toLowerCase();
const isQwenLikeModel =
modelText.includes("qwen") || modelText.includes("通义");
const isVisionLikeModel =
modelText.includes("vl") ||
modelText.includes("vision") ||
modelText.includes("多模态");
if (isQwenLikeModel && isVisionLikeModel) {
return true;
}
return false;
}
export function withAgentAutoModelFlag(
defaultParams: unknown,
enabled: boolean
): Record<string, unknown> | null {
const next = { ...(toRecord(defaultParams) || {}) };
if (enabled) {
next[AGENT_AUTO_MODEL_KEY] = true;
} else {
delete next[AGENT_AUTO_MODEL_KEY];
}
return Object.keys(next).length > 0 ? next : null;
}
export function isAiModelMultimodal(input: {
capabilities?: unknown;
defaultParams?: unknown;
}): boolean {
const defaultParams = toRecord(input.defaultParams);
if (typeof defaultParams?.[MULTIMODAL_MODEL_KEY] === "boolean") {
return defaultParams[MULTIMODAL_MODEL_KEY] as boolean;
}
const capabilities = toRecord(input.capabilities);
if (typeof capabilities?.[MULTIMODAL_MODEL_KEY] === "boolean") {
return capabilities[MULTIMODAL_MODEL_KEY] as boolean;
}
return false;
}
export function withMultimodalModelFlag(
capabilities: unknown,
enabled: boolean
): Record<string, unknown> | null {
const next = { ...(toRecord(capabilities) || {}) };
if (enabled) {
next[MULTIMODAL_MODEL_KEY] = true;
} else {
delete next[MULTIMODAL_MODEL_KEY];
}
return Object.keys(next).length > 0 ? next : null;
}