From fef8947e735cc042498570df42ae245252e2fe93 Mon Sep 17 00:00:00 2001 From: 134 Date: Wed, 8 Jul 2026 15:51:08 +0800 Subject: [PATCH] fix agent user-facing image edit preface --- app/(chat)/api/chat/route.ts | 13 ++-- lib/ai/auto-agent-graph.ts | 4 ++ lib/ai/runtime/direct-agent-execution.ts | 66 +++++++++++++++++++ .../runtime/direct-agent-response-builders.ts | 8 +-- tests/routes/canvas-chat-helpers.test.ts | 13 ++++ 5 files changed, 96 insertions(+), 8 deletions(-) diff --git a/app/(chat)/api/chat/route.ts b/app/(chat)/api/chat/route.ts index 93fd9f99c..e4015b6e6 100644 --- a/app/(chat)/api/chat/route.ts +++ b/app/(chat)/api/chat/route.ts @@ -239,6 +239,8 @@ import { safePersistDirectAgentVideoFailedTurn, } from "@/lib/ai/runtime/direct-agent-working-state"; import { + getDirectAgentToolDisplayName, + getDirectAgentToolPrefaceFallback, getDirectAgentToolErrorMessage, getDirectAgentToolLabel, getDirectAgentToolTargetMissingMessage, @@ -8296,6 +8298,9 @@ export async function POST(request: Request) { const assistantMessageId = generateUUID(); const directToolLabel = getDirectAgentToolLabel(directAgentToolCapability); + const directToolDisplayName = getDirectAgentToolDisplayName( + directAgentToolCapability, + ); const directToolStream = createUIMessageStream({ execute: async ({ writer }) => { await writeAgentExecutionPrefaceMessage({ @@ -8303,7 +8308,7 @@ export async function POST(request: Request) { chatId: id, label: `agent:${directAgentToolCapability}:preface`, friendlyMessage: smartAutoFriendlyMessage, - fallback: `好的,我来帮你${directToolLabel},稍等我处理一下。`, + fallback: getDirectAgentToolPrefaceFallback(directAgentToolCapability), }); writeAgentProgressChunk( writer, @@ -8318,7 +8323,7 @@ export async function POST(request: Request) { buildDirectAgentImageEditSelectProgress({ toolName: directAgentExecution.toolName, capability: directAgentToolCapability, - label: directToolLabel, + label: directToolDisplayName, }), `agent:${directAgentToolCapability}:progress-select-tool`, ); @@ -8331,7 +8336,7 @@ export async function POST(request: Request) { buildDirectAgentImageEditExecutingProgress({ toolName: directAgentExecution.toolName, capability: directAgentToolCapability, - label: directToolLabel, + label: directToolDisplayName, }), `agent:${directAgentToolCapability}:progress-executing`, ); @@ -8480,7 +8485,7 @@ export async function POST(request: Request) { buildDirectAgentImageEditCompletedProgress({ toolName: directAgentExecution.toolName, capability: directAgentToolCapability, - label: directToolLabel, + label: directToolDisplayName, }), `agent:${directAgentToolCapability}:progress-completed`, ); diff --git a/lib/ai/auto-agent-graph.ts b/lib/ai/auto-agent-graph.ts index ed723f6c3..bc722c0b7 100644 --- a/lib/ai/auto-agent-graph.ts +++ b/lib/ai/auto-agent-graph.ts @@ -1178,6 +1178,10 @@ function buildStrategicFriendlyMessage( analysis.intent === "image_gen" || analysis.intent === "video_gen" ) { + if (existingReply) { + return Promise.resolve(existingReply); + } + const imageParams = heuristicImageParams(state.text, analysis); const planningBrief = buildAgentPlanningBriefMarkdown({ userText: state.text, diff --git a/lib/ai/runtime/direct-agent-execution.ts b/lib/ai/runtime/direct-agent-execution.ts index 79a6f6642..517da2047 100644 --- a/lib/ai/runtime/direct-agent-execution.ts +++ b/lib/ai/runtime/direct-agent-execution.ts @@ -503,6 +503,72 @@ export function getDirectAgentToolLabel(capability: DirectAgentToolCapability): } } +export function getDirectAgentToolDisplayName( + capability: DirectAgentToolCapability, +): string { + switch (capability) { + case "analyze": + return "图片分析"; + case "generic_edit": + return "图片编辑"; + case "remove_background": + return "抠图"; + case "remove_watermark": + return "去水印"; + case "enhance": + return "图像增强"; + case "resize": + return "尺寸调整"; + case "extend": + return "图像拓展"; + case "angle_variant": + return "多视角"; + case "local_edit": + return "局部编辑"; + case "box_cutout": + return "框选抠图"; + case "generate_image": + return "图片生成"; + case "generate_video": + return "视频生成"; + default: + return "图像处理"; + } +} + +export function getDirectAgentToolPrefaceFallback( + capability: DirectAgentToolCapability, +): string { + switch (capability) { + case "analyze": + return "好的,我先帮你看看这张图,稍等我一下。"; + case "generic_edit": + return "好的,我来帮你修改这张图,稍等我一下。"; + case "remove_background": + return "好的,我来帮你抠出主体,稍等我一下。"; + case "remove_watermark": + return "好的,我来帮你去掉水印,稍等我一下。"; + case "enhance": + return "好的,我来帮你增强这张图,稍等我一下。"; + case "resize": + return "好的,我来帮你调整图片尺寸,稍等我一下。"; + case "extend": + return "好的,我来帮你扩展这张图,稍等我一下。"; + case "angle_variant": + return "好的,我来帮你生成新的视角,稍等我一下。"; + case "local_edit": + return "好的,我来帮你修改这个局部区域,稍等我一下。"; + case "box_cutout": + return "好的,我来帮你把框选区域抠出来,稍等我一下。"; + case "generate_image": + return "好的,我按你的描述来做一版画面,稍等我处理一下。"; + case "generate_video": + return "好的,我按你的需求来做这段视频,稍等我处理一下。"; + default: + return "好的,我来继续处理,稍等我一下。"; + } +} + export function findAgentToolCallArgs( toolName: AgentPlannedToolCall["name"], execution?: AgentPreparedExecution, diff --git a/lib/ai/runtime/direct-agent-response-builders.ts b/lib/ai/runtime/direct-agent-response-builders.ts index 0576f56d1..6a867f3e7 100644 --- a/lib/ai/runtime/direct-agent-response-builders.ts +++ b/lib/ai/runtime/direct-agent-response-builders.ts @@ -5,7 +5,7 @@ import { prependImageModelBadge, } from "@/lib/ai/runtime/agent-media-markdown"; import { - getDirectAgentToolLabel, + getDirectAgentToolDisplayName, getDirectAgentToolSuccessMessage, type DirectAgentToolCapability, } from "@/lib/ai/runtime/direct-agent-execution"; @@ -73,7 +73,7 @@ export function buildDirectAgentAnalysisAssistantText(params: { ] .filter(Boolean) .join("\n\n"), - getDirectAgentToolLabel("analyze"), + getDirectAgentToolDisplayName("analyze"), ); } @@ -121,7 +121,7 @@ export function buildDirectAgentImageEditAssistantText(params: { }), followUp: getDirectAgentFollowUpMessage(params.capability), }), - getDirectAgentToolLabel(params.capability), + getDirectAgentToolDisplayName(params.capability), ); } @@ -139,6 +139,6 @@ export function buildDirectAgentBatchImageEditAssistantText(params: { mediaMarkdown: buildAgentToolImagesMarkdown(params.results), followUp: getDirectAgentFollowUpMessage(params.capability), }), - getDirectAgentToolLabel(params.capability), + getDirectAgentToolDisplayName(params.capability), ); } diff --git a/tests/routes/canvas-chat-helpers.test.ts b/tests/routes/canvas-chat-helpers.test.ts index d2175bb3d..c4b94d227 100644 --- a/tests/routes/canvas-chat-helpers.test.ts +++ b/tests/routes/canvas-chat-helpers.test.ts @@ -142,7 +142,9 @@ import { shouldBypassCanvasImagePointsPrecheckForAgentControl, } from "@/lib/canvas/agent-client-intent"; import { + getDirectAgentToolDisplayName, getDirectAgentToolLabel, + getDirectAgentToolPrefaceFallback, getDirectAgentToolSuccessMessage, hasExplicitDirectAgentBatchImageEditIntent, isDirectAgentBatchImageEditCapability, @@ -1313,9 +1315,20 @@ test.describe("canvas chat pure helpers", () => { expect(editText).toContain("### 执行结果"); expect(editText).toContain("- 已完成抠图处理,结果如下。"); expect(editText).toContain("https://cdn.example.com/cutout.png"); + expect(editText).toContain("◈ 抠图"); + expect(editText).not.toContain("Agent工具:"); expect(editText).toContain("替换背景"); }); + test("uses user-facing direct agent tool labels in fallbacks", () => { + expect(getDirectAgentToolDisplayName("generic_edit")).toBe("图片编辑"); + expect(getDirectAgentToolDisplayName("local_edit")).toBe("局部编辑"); + expect(getDirectAgentToolPrefaceFallback("generic_edit")).toBe( + "好的,我来帮你修改这张图,稍等我一下。" + ); + expect(getDirectAgentToolPrefaceFallback("generic_edit")).not.toContain("Agent工具:"); + }); + test("builds capability-aware agent progress node labels", () => { const selectingSteps = buildAgentProgressNodeSteps({ stage: "planning",