强化图片Agent预分析并降低模板化回复
Some checks failed
Lint / build (20) (push) Has been cancelled
Playwright Tests / test (push) Has been cancelled

This commit is contained in:
Your Name 2026-02-08 22:43:26 +08:00
parent 955b577bc5
commit e0feb87964
2 changed files with 52 additions and 17 deletions

View File

@ -699,12 +699,18 @@ export async function POST(request: Request) {
!smartAutoFriendlyMessage;
if (needsRicherAutoReply) {
smartAutoFriendlyMessage = buildAutoModeFallbackMessage({
text: autoTextForFallback,
hasImage,
fromHistory: smartAutoHistoryImages.length > 0,
});
console.log("[Smart Auto Mode] 🧩 Upgraded to richer conversational reply");
if (isImageTask) {
smartAutoFriendlyMessage =
autoGraphResult.analysis?.conversationalReply ||
"我先分析你这轮图片里的主体、风格和构图,再给你执行方案。";
} else {
smartAutoFriendlyMessage = buildAutoModeFallbackMessage({
text: autoTextForFallback,
hasImage,
fromHistory: smartAutoHistoryImages.length > 0,
});
}
console.log("[Smart Auto Mode] 🧩 Filled missing conversational reply");
}
if (autoGraphResult.optimizedPrompt) {
@ -737,12 +743,8 @@ export async function POST(request: Request) {
let bestModel = null;
if (hasImage) {
bestModel = allModels.find(m => m.model.supportsImageGen && !m.model.isSubModel);
// 回退时也保持结构化、可感知的自动模式反馈
smartAutoFriendlyMessage = buildAutoModeFallbackMessage({
text: autoTextForFallback,
hasImage: true,
fromHistory: autoFromHistoryForFallback || smartAutoHistoryImages.length > 0,
});
smartAutoFriendlyMessage =
"我先完成这一轮图片分析,再按你的要求执行修改并返回结果。";
} else {
smartAutoFriendlyMessage = buildAutoModeFallbackMessage({
text: autoTextForFallback,

View File

@ -69,8 +69,11 @@ async function generateAgentConversation(
const { getLanguageModelById } = await import("./dynamic-provider");
const allModels = await getEnabledAiModelsWithProvider();
const preferredVisionModel = allModels.find(
(m) => m.provider.type === "alibaba" && m.model.supportsVision && m.model.isEnabled
);
const candidateModel = state.hasImage
? allModels.find((m) => m.model.supportsVision && m.model.isEnabled)
? preferredVisionModel || allModels.find((m) => m.model.supportsVision && m.model.isEnabled)
: allModels.find((m) => m.model.isEnabled && !m.model.isSubModel);
if (!candidateModel) {
@ -87,10 +90,42 @@ async function generateAgentConversation(
.map((msg) => `${msg.role === "user" ? "用户" : "助手"}: ${compactText(msg.content, 120)}`)
.join("\n");
const validImageUrls = state.imageUrls
.filter((url) => /^https?:\/\//i.test(url))
.slice(0, 4);
const imageInfo = state.hasImage
? `用户本轮可用图片数量:${state.imageUrls.length || 1}。图片来源:${state.imageFromHistory ? "历史消息复用" : "本轮上传"}。`
: "用户本轮没有上传图片。";
let visualAnalysis = "";
if (state.hasImage && validImageUrls.length > 0) {
try {
const visionPrompt = `请分析以下参考图片,给出可用于生图/修图执行前决策的结果。
要求:
1) 每张图输出 1 行,格式:图X:主体...;风格...;构图...;光影与色调...;材质/氛围...
2) 只写客观可见信息,不要编造品牌、尺寸、镜头参数。
3) 全部输出控制在 6 行内。`;
const visionInputs = validImageUrls.map((url) => ({ type: "image" as const, image: url }));
const { text: visionText } = await generateText({
model,
messages: [
{
role: "user" as const,
content: [{ type: "text" as const, text: visionPrompt }, ...visionInputs],
},
],
temperature: 0.2,
maxTokens: 360,
} as any);
visualAnalysis = visionText.trim();
} catch (error) {
visualAnalysis = "";
}
}
const systemPrompt = `你是一个真实执行中的 AI 生图/修图 Agent。
请根据用户需求和本轮输入图片,给出“执行前”的分析汇报。
@ -110,6 +145,7 @@ async function generateAgentConversation(
`【用户原始需求】${state.text || "(无文本)"}`,
`【意图分析】intent=${analysis.intent}; subIntent=${analysis.subIntent || "none"}; confidence=${analysis.confidence}`,
`【图片信息】${imageInfo}`,
visualAnalysis ? `【视觉模型预分析】\n${visualAnalysis}` : "",
state.context ? `【画布上下文】${compactText(state.context, 300)}` : "",
history ? `【最近对话】\n${history}` : "",
state.hasImage
@ -119,10 +155,7 @@ async function generateAgentConversation(
.filter(Boolean)
.join("\n\n");
const imageInputs = state.imageUrls
.filter((url) => /^https?:\/\//i.test(url))
.slice(0, 4)
.map((url) => ({ type: "image" as const, image: url }));
const imageInputs = validImageUrls.map((url) => ({ type: "image" as const, image: url }));
const requestPayload = state.hasImage && imageInputs.length > 0
? {