From fdff0c2865f4b5eeb3661aa66bd1d6dd5efbabec Mon Sep 17 00:00:00 2001 From: 134 Date: Mon, 15 Jun 2026 15:05:14 +0800 Subject: [PATCH] fix: reject empty gpt image results --- app/(chat)/api/chat/route.ts | 31 ++++++++++++++++++++++++++++--- 1 file changed, 28 insertions(+), 3 deletions(-) diff --git a/app/(chat)/api/chat/route.ts b/app/(chat)/api/chat/route.ts index 1840f41e3..de8057322 100644 --- a/app/(chat)/api/chat/route.ts +++ b/app/(chat)/api/chat/route.ts @@ -129,6 +129,7 @@ import { buildAgentToolVideoMarkdown, prependImageModelBadge, } from "@/lib/ai/runtime/agent-media-markdown"; +import { extractImageUrlsFromText } from "@/lib/image-url"; import { saveGeneratedImages } from "@/lib/ai/runtime/generated-image-persistence"; import { recordAiModelHealthFailure, @@ -6332,6 +6333,21 @@ export async function POST(request: Request) { return injectHistoryImagesToLastUserMessage(messagesForGemini, smartAutoHistoryImages); }; + const assertGeneratedImageMarkdown = (markdown: string, modelLabel: string) => { + const normalizedMarkdown = String(markdown || "").trim(); + const imageUrls = extractImageUrlsFromText(normalizedMarkdown); + if (imageUrls.length > 0) { + return normalizedMarkdown; + } + + const failureHintPattern = + /生成图片失败|未找到图片数据|未解析到图片|模型未返回生成图片|图片数据不可用/i; + const reason = failureHintPattern.test(normalizedMarkdown) + ? normalizedMarkdown + : "模型响应未包含可用图片"; + throw new Error(`${modelLabel} 未返回可用图片:${reason.slice(0, 160)}`); + }; + // 🆕 尝试生成图片的函数(支持备用模型切换) const tryGenerateImage = async (modelIdToUse: string, isRetry = false): Promise => { chatApiLogger.info(`[Chat API] ${isRetry ? "🔄 Retry with fallback" : "🚀 Trying"} model: ${modelIdToUse}`); @@ -6352,7 +6368,10 @@ export async function POST(request: Request) { overrideModelId: isRetry ? modelIdToUse : undefined, // 🆕 使用备用模型 ID }); - return result.text || "图片生成失败"; + return assertGeneratedImageMarkdown( + result.text || "", + isRetry ? `备用模型 ${modelIdToUse}` : `主模型 ${modelIdToUse}`, + ); }; let stopKeepalive: (() => void) | null = null; @@ -6428,7 +6447,10 @@ export async function POST(request: Request) { imageSize: defaultImageQualityParams.imageSize, }, }); - imageMarkdown = fallbackResult.text; + imageMarkdown = assertGeneratedImageMarkdown( + fallbackResult.text, + `备用模型 ${fallbackResult.displayName}`, + ); usedModelId = fallbackResult.usedModelId; fallbackSuccess = true; chatApiLogger.info(`[Chat API] ✅ Fallback model ${fallbackResult.displayName} succeeded!`); @@ -6493,7 +6515,10 @@ export async function POST(request: Request) { imageCount: defaultImageQualityParams.imageCount, }, }); - imageMarkdown = fallbackResult.text; + imageMarkdown = assertGeneratedImageMarkdown( + fallbackResult.text, + `跨服务备用模型 ${fallbackResult.displayName}`, + ); usedModelId = fallbackResult.usedModelId; fallbackSuccess = true; chatApiLogger.info(`[Chat API] ✅ Gemini cross-provider fallback model ${fallbackResult.displayName} succeeded!`);