fix: reject empty gpt image results

This commit is contained in:
134 2026-06-15 15:05:14 +08:00
parent 010d7d1be5
commit fdff0c2865

View File

@ -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<string> => {
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!`);