From 8357e698209a3c17056cd56112ff414a58491814 Mon Sep 17 00:00:00 2001 From: Your Name Date: Fri, 6 Mar 2026 18:30:54 +0800 Subject: [PATCH] fix: avoid image models in analyzer vision path --- lib/ai/smart-analyzer.ts | 19 ++++++++++++++----- 1 file changed, 14 insertions(+), 5 deletions(-) diff --git a/lib/ai/smart-analyzer.ts b/lib/ai/smart-analyzer.ts index 88b64b5fc..042047073 100644 --- a/lib/ai/smart-analyzer.ts +++ b/lib/ai/smart-analyzer.ts @@ -1325,6 +1325,7 @@ function isLikelyVisionCapableModel(modelWithProvider: { isEnabled: boolean; isSubModel: boolean; supportsVision?: boolean; + supportsImageGen?: boolean; displayName?: string | null; modelId?: string | null; capabilities?: unknown; @@ -1337,11 +1338,21 @@ function isLikelyVisionCapableModel(modelWithProvider: { const model = modelWithProvider.model; const providerType = String(modelWithProvider.provider?.type || ""); if (!model?.isEnabled || model.isSubModel) return false; + const modelText = `${model.displayName || ""} ${model.modelId || ""}`.toLowerCase(); + const likelyImageGenerationOnly = + !model.supportsVision && + Boolean(model.supportsImageGen) && + ((["custom", "openai", "local"].includes(providerType) && + /(doubao[-_.]?seed[-_.]?2[-_.]?0|seed[-_.]?2[-_.]?0|seedream|gpt[-_.]?image|nano[-_.]?banana|flux|imagen|image[-_.]?edit)/i.test( + modelText, + )) || + ["gemini", "huanke-gemini", "alibaba-image", "ruxa-image", "fal-image"].includes( + providerType, + )); + if (likelyImageGenerationOnly) return false; if (model.supportsVision) return true; if (isAiModelMultimodal(model)) return true; - const modelText = `${model.displayName || ""} ${model.modelId || ""}`.toLowerCase(); - if (providerType === "volcano-vision" || providerType === "volcano-multimodal") return true; if ( @@ -1575,9 +1586,7 @@ async function analyzWithLLM( const selectedAnalyzerModel = hasImage ? multimodalAgentVisionModel || preferredVisionModel || - analyzerVisionCandidates[0] || - usableAgentModel || - analyzerTextCandidates[0] + analyzerVisionCandidates[0] : usableAgentModel || analyzerTextCandidates.find((m) => m.provider.type === "zhipu" && !m.model.isSubModel) || analyzerTextCandidates[0];