fix agent user-facing image edit preface

This commit is contained in:
134 2026-07-08 15:51:08 +08:00
parent 778fc1c0b8
commit fef8947e73
5 changed files with 96 additions and 8 deletions

View File

@ -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`,
);

View File

@ -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,

View File

@ -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,

View File

@ -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),
);
}

View File

@ -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",