fix: reject empty gpt image results
This commit is contained in:
parent
010d7d1be5
commit
fdff0c2865
@ -129,6 +129,7 @@ import {
|
|||||||
buildAgentToolVideoMarkdown,
|
buildAgentToolVideoMarkdown,
|
||||||
prependImageModelBadge,
|
prependImageModelBadge,
|
||||||
} from "@/lib/ai/runtime/agent-media-markdown";
|
} from "@/lib/ai/runtime/agent-media-markdown";
|
||||||
|
import { extractImageUrlsFromText } from "@/lib/image-url";
|
||||||
import { saveGeneratedImages } from "@/lib/ai/runtime/generated-image-persistence";
|
import { saveGeneratedImages } from "@/lib/ai/runtime/generated-image-persistence";
|
||||||
import {
|
import {
|
||||||
recordAiModelHealthFailure,
|
recordAiModelHealthFailure,
|
||||||
@ -6332,6 +6333,21 @@ export async function POST(request: Request) {
|
|||||||
return injectHistoryImagesToLastUserMessage(messagesForGemini, smartAutoHistoryImages);
|
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> => {
|
const tryGenerateImage = async (modelIdToUse: string, isRetry = false): Promise<string> => {
|
||||||
chatApiLogger.info(`[Chat API] ${isRetry ? "🔄 Retry with fallback" : "🚀 Trying"} model: ${modelIdToUse}`);
|
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
|
overrideModelId: isRetry ? modelIdToUse : undefined, // 🆕 使用备用模型 ID
|
||||||
});
|
});
|
||||||
|
|
||||||
return result.text || "图片生成失败";
|
return assertGeneratedImageMarkdown(
|
||||||
|
result.text || "",
|
||||||
|
isRetry ? `备用模型 ${modelIdToUse}` : `主模型 ${modelIdToUse}`,
|
||||||
|
);
|
||||||
};
|
};
|
||||||
|
|
||||||
let stopKeepalive: (() => void) | null = null;
|
let stopKeepalive: (() => void) | null = null;
|
||||||
@ -6428,7 +6447,10 @@ export async function POST(request: Request) {
|
|||||||
imageSize: defaultImageQualityParams.imageSize,
|
imageSize: defaultImageQualityParams.imageSize,
|
||||||
},
|
},
|
||||||
});
|
});
|
||||||
imageMarkdown = fallbackResult.text;
|
imageMarkdown = assertGeneratedImageMarkdown(
|
||||||
|
fallbackResult.text,
|
||||||
|
`备用模型 ${fallbackResult.displayName}`,
|
||||||
|
);
|
||||||
usedModelId = fallbackResult.usedModelId;
|
usedModelId = fallbackResult.usedModelId;
|
||||||
fallbackSuccess = true;
|
fallbackSuccess = true;
|
||||||
chatApiLogger.info(`[Chat API] ✅ Fallback model ${fallbackResult.displayName} succeeded!`);
|
chatApiLogger.info(`[Chat API] ✅ Fallback model ${fallbackResult.displayName} succeeded!`);
|
||||||
@ -6493,7 +6515,10 @@ export async function POST(request: Request) {
|
|||||||
imageCount: defaultImageQualityParams.imageCount,
|
imageCount: defaultImageQualityParams.imageCount,
|
||||||
},
|
},
|
||||||
});
|
});
|
||||||
imageMarkdown = fallbackResult.text;
|
imageMarkdown = assertGeneratedImageMarkdown(
|
||||||
|
fallbackResult.text,
|
||||||
|
`跨服务备用模型 ${fallbackResult.displayName}`,
|
||||||
|
);
|
||||||
usedModelId = fallbackResult.usedModelId;
|
usedModelId = fallbackResult.usedModelId;
|
||||||
fallbackSuccess = true;
|
fallbackSuccess = true;
|
||||||
chatApiLogger.info(`[Chat API] ✅ Gemini cross-provider fallback model ${fallbackResult.displayName} succeeded!`);
|
chatApiLogger.info(`[Chat API] ✅ Gemini cross-provider fallback model ${fallbackResult.displayName} succeeded!`);
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user