From 8aba32d35d7de4e14422b9aca348f4f90711baf9 Mon Sep 17 00:00:00 2001 From: Your Name Date: Thu, 19 Feb 2026 04:54:58 +0800 Subject: [PATCH] fix chat pending drop when title model fails and filter auto-title vision model --- app/(chat)/actions.ts | 33 +++++++++++++++++++----------- app/api/canvas/auto-title/route.ts | 14 ++++++++++++- 2 files changed, 34 insertions(+), 13 deletions(-) diff --git a/app/(chat)/actions.ts b/app/(chat)/actions.ts index 25170ea54..f2bab6ef7 100644 --- a/app/(chat)/actions.ts +++ b/app/(chat)/actions.ts @@ -23,19 +23,28 @@ export async function generateTitleFromUserMessage({ }: { message: UIMessage; }) { - // 优先使用数据库配置的模型,回退到预定义模型 - let model = await getSystemModel("title"); - if (!model) { - model = myProvider.languageModel("title-model"); + const prompt = (getTextFromMessage(message) || "").trim(); + const fallbackTitle = prompt.slice(0, 20) || "新对话"; + + try { + // 优先使用数据库配置的模型,回退到预定义模型 + let model = await getSystemModel("title"); + if (!model) { + model = myProvider.languageModel("title-model"); + } + + const { text: title } = await generateText({ + model, + system: titlePrompt, + prompt, + }); + + const normalized = (title || "").trim(); + return normalized || fallbackTitle; + } catch (error) { + console.warn("[generateTitleFromUserMessage] fallback title:", error); + return fallbackTitle; } - - const { text: title } = await generateText({ - model, - system: titlePrompt, - prompt: getTextFromMessage(message), - }); - - return title; } export async function deleteTrailingMessages({ id }: { id: string }) { diff --git a/app/api/canvas/auto-title/route.ts b/app/api/canvas/auto-title/route.ts index 7846c6b51..62bb37508 100644 --- a/app/api/canvas/auto-title/route.ts +++ b/app/api/canvas/auto-title/route.ts @@ -21,15 +21,27 @@ export async function POST(request: NextRequest) { return NextResponse.json({ error: "Image URL is required" }, { status: 400 }); } + const blockedProviderTypes = new Set([ + "fal-video", + "qianwen-video", + "volcano-video", + "doubao-video", + ]); + // 从数据库获取支持视觉的模型(优先使用 supportsVision) const modelsData = await getEnabledAiModelsWithProvider(); console.log("[Auto-title] Available models count:", modelsData.length); console.log("[Auto-title] All model IDs:", modelsData.map(m => m.model.modelId)); - let visionModelData = modelsData.find(m => m.model.supportsVision); + let visionModelData = modelsData.find( + (m) => m.model.supportsVision && !blockedProviderTypes.has(String(m.provider?.type || "")), + ); if (!visionModelData) { // 兼容旧配置:根据模型名称兜底匹配 visionModelData = modelsData.find(m => { + if (blockedProviderTypes.has(String(m.provider?.type || ""))) { + return false; + } const id = m.model.modelId?.toLowerCase() || ''; const name = m.model.displayName?.toLowerCase() || ''; return id.includes('qwen-vl') ||