From 5239250465f3cde7efc3027a2c5f8fa7bdc5b018 Mon Sep 17 00:00:00 2001 From: Your Name Date: Tue, 19 May 2026 15:16:12 +0800 Subject: [PATCH] feat: improve agent progress feedback --- app/(chat)/api/chat/route.ts | 25 +++++++ components/canvas/CanvasChatPanel.tsx | 16 ++--- lib/ai/runtime/direct-agent-progress.ts | 86 +++++++++++++++++++------ 3 files changed, 101 insertions(+), 26 deletions(-) diff --git a/app/(chat)/api/chat/route.ts b/app/(chat)/api/chat/route.ts index f7a5d47b8..d8ca94ef2 100644 --- a/app/(chat)/api/chat/route.ts +++ b/app/(chat)/api/chat/route.ts @@ -165,6 +165,7 @@ import { buildDirectAgentAnalyzeCompletedProgress, buildDirectAgentAnalyzeFailedProgress, buildDirectAgentAnalyzePlanningProgress, + buildDirectAgentImageContextProgress, buildDirectAgentImageEditCompletedProgress, buildDirectAgentImageEditExecutingProgress, buildDirectAgentImageEditFailedProgress, @@ -9335,6 +9336,14 @@ export async function POST(request: Request) { ) { const directImageStream = createUIMessageStream({ execute: async ({ writer }) => { + writeAgentProgressChunk( + writer, + buildDirectAgentImageContextProgress({ + imageCount: directAgentToolTargetImageUrls.length, + mode: "generate", + }), + "agent:generate_image:progress-image-context", + ); writeAgentProgressChunk( writer, buildDirectAgentImageGenerateSelectProgress(), @@ -9510,6 +9519,14 @@ export async function POST(request: Request) { const directVideoStream = createUIMessageStream({ execute: async ({ writer }) => { const assistantMessageId = generateUUID(); + writeAgentProgressChunk( + writer, + buildDirectAgentImageContextProgress({ + imageCount: directAgentToolTargetImageUrls.length, + mode: "video", + }), + "agent:generate_video:progress-image-context", + ); writeAgentProgressChunk( writer, buildDirectAgentVideoGenerateSelectProgress(), @@ -9687,6 +9704,14 @@ export async function POST(request: Request) { const directToolLabel = getDirectAgentToolLabel(directAgentToolCapability); const directToolStream = createUIMessageStream({ execute: async ({ writer }) => { + writeAgentProgressChunk( + writer, + buildDirectAgentImageContextProgress({ + imageCount: directAgentToolTargetImageUrls.length, + mode: "edit", + }), + `agent:${directAgentToolCapability}:progress-image-context`, + ); writeAgentProgressChunk( writer, buildDirectAgentImageEditSelectProgress({ diff --git a/components/canvas/CanvasChatPanel.tsx b/components/canvas/CanvasChatPanel.tsx index 1d340d0b2..f6642afed 100644 --- a/components/canvas/CanvasChatPanel.tsx +++ b/components/canvas/CanvasChatPanel.tsx @@ -428,25 +428,25 @@ const AGENT_PROGRESS_STEPS: Array<{ key: NonNullable; label: string; }> = [ - { key: "lock_target", label: "锁定目标" }, + { key: "lock_target", label: "整理素材" }, { key: "analyze", label: "理解需求" }, - { key: "select_tool", label: "选择工具" }, - { key: "execute", label: "执行处理" }, + { key: "select_tool", label: "优化提示" }, + { key: "execute", label: "提交生成" }, { key: "finalize", label: "整理结果" }, ]; function getAgentProgressFallbackTitle(payload?: AgentProgressStreamPayload | null) { switch (payload?.stage) { case "clarify": - return "等待确认"; + return "需要补充信息"; case "executing": - return "正在处理"; + return "正在生成结果"; case "completed": - return "处理完成"; + return "创作完成"; case "failed": - return "处理失败"; + return "创作失败"; default: - return "正在准备"; + return "正在理解需求"; } } diff --git a/lib/ai/runtime/direct-agent-progress.ts b/lib/ai/runtime/direct-agent-progress.ts index b22477759..6de9517b8 100644 --- a/lib/ai/runtime/direct-agent-progress.ts +++ b/lib/ai/runtime/direct-agent-progress.ts @@ -30,12 +30,62 @@ function buildDirectAgentProgressPayload(params: DirectAgentProgressPayload) { return params; } +export function buildDirectAgentImageContextProgress(params: { + imageCount?: number; + mode?: "generate" | "edit" | "video"; +}) { + const imageCount = Math.max(0, Math.floor(Number(params.imageCount || 0))); + const hasMultipleImages = imageCount > 1; + const hasImage = imageCount > 0; + + if (params.mode === "edit") { + return buildDirectAgentProgressPayload({ + stage: "planning", + currentStep: "lock_target", + title: hasMultipleImages ? "正在理解多张待编辑图片" : "正在理解待编辑图片", + message: hasImage + ? "我会先识别主体、风格、构图和需要保留的内容,再确认这次要改变的部分。" + : "我会先根据你的文字需求确认编辑目标,再整理成适合模型执行的方向。", + toolName: "editImage", + capability: "generic_edit", + }); + } + + if (params.mode === "video") { + return buildDirectAgentProgressPayload({ + stage: "planning", + currentStep: "lock_target", + title: hasImage ? "正在理解视频参考图" : "正在规划视频画面", + message: hasImage + ? "我会先提取参考图的主体、镜头、风格和运动约束,再整理成视频生成方向。" + : "我会先根据你的描述整理镜头主体、运动节奏和画面风格。", + toolName: "generateVideo", + capability: "generate_video", + }); + } + + return buildDirectAgentProgressPayload({ + stage: "planning", + currentStep: "lock_target", + title: hasMultipleImages + ? "正在理解多张参考图片" + : hasImage + ? "正在理解参考图片" + : "正在规划画面方向", + message: hasImage + ? "我会先识别图片主体、风格、构图和关键约束,再提炼可执行的创作方向。" + : "我会先根据你的描述整理画面主体、风格和关键约束。", + toolName: "generateImage", + capability: "generate_image", + }); +} + export function buildDirectAgentAnalyzePlanningProgress() { return buildDirectAgentProgressPayload({ stage: "planning", currentStep: "analyze", - title: "正在分析目标图片", - message: "我会先提取稳定的视觉摘要,再整理成更直接的分析结论。", + title: "正在描述目标图片", + message: "我会先识别主体、风格、构图、光线和材质,再整理成可直接阅读的观察结论。", toolName: "analyzeImage", capability: "analyze", }); @@ -46,7 +96,7 @@ export function buildDirectAgentAnalyzeCompletedProgress() { stage: "completed", currentStep: "finalize", title: "图片分析完成", - message: "我已经整理好可直接阅读的分析结论。", + message: "我已经把图片要点整理成清晰结论,方便继续修图、生图或做风格延展。", toolName: "analyzeImage", capability: "analyze", }); @@ -67,8 +117,8 @@ export function buildDirectAgentImageGenerateSelectProgress() { return buildDirectAgentProgressPayload({ stage: "planning", currentStep: "select_tool", - title: "已选中图片生成工具", - message: "我正在整理参考图和生图参数,准备开始生成。", + title: "正在优化生图提示词", + message: "我会把你的需求转成更适合当前模型的提示词,并保留主体、风格、构图和画面约束。", toolName: "generateImage", capability: "generate_image", }); @@ -78,8 +128,8 @@ export function buildDirectAgentImageGenerateExecutingProgress() { return buildDirectAgentProgressPayload({ stage: "executing", currentStep: "execute", - title: "正在生成图片", - message: "我会结合当前提示词和参考图生成新的画面。", + title: "正在提交生图模型", + message: "已将优化后的提示词与参考图一起提交生成,完成后会回写到对话和画布。", toolName: "generateImage", capability: "generate_image", }); @@ -90,7 +140,7 @@ export function buildDirectAgentImageGenerateCompletedProgress() { stage: "completed", currentStep: "finalize", title: "图片生成完成", - message: "结果已经回写到对话和画布。", + message: "结果已整理并回写到当前对话和画布。", toolName: "generateImage", capability: "generate_image", }); @@ -111,8 +161,8 @@ export function buildDirectAgentVideoGenerateSelectProgress() { return buildDirectAgentProgressPayload({ stage: "planning", currentStep: "select_tool", - title: "已选中视频生成工具", - message: "我正在整理模式、参考图和视频参数。", + title: "正在优化视频提示词", + message: "我会把你的描述整理成镜头、主体、运动和风格更明确的视频生成提示词。", toolName: "generateVideo", capability: "generate_video", }); @@ -122,8 +172,8 @@ export function buildDirectAgentVideoGenerateExecutingProgress() { return buildDirectAgentProgressPayload({ stage: "executing", currentStep: "execute", - title: "正在生成视频", - message: "我正在按当前模式执行视频生成。", + title: "正在提交视频生成", + message: "已将优化后的镜头提示词与参考图提交生成,完成后会回写到对话和画布。", toolName: "generateVideo", capability: "generate_video", }); @@ -134,7 +184,7 @@ export function buildDirectAgentVideoGenerateCompletedProgress() { stage: "completed", currentStep: "finalize", title: "视频生成完成", - message: "结果已经写回对话和画布。", + message: "结果已整理并回写到当前对话和画布。", toolName: "generateVideo", capability: "generate_video", }); @@ -159,8 +209,8 @@ export function buildDirectAgentImageEditSelectProgress(params: { return buildDirectAgentProgressPayload({ stage: "planning", currentStep: "select_tool", - title: `已选中${params.label}`, - message: "我正在整理目标图和当前参数,准备开始执行。", + title: "正在优化修图提示词", + message: `我会把你的编辑需求整理成更适合${params.label}执行的提示词,明确保留项和变化项。`, toolName: params.toolName, capability: params.capability, }); @@ -174,8 +224,8 @@ export function buildDirectAgentImageEditExecutingProgress(params: { return buildDirectAgentProgressPayload({ stage: "executing", currentStep: "execute", - title: `正在执行${params.label}`, - message: "执行完成后我会把结果直接回写到当前对话和画布。", + title: `正在提交${params.label}`, + message: "已将优化后的编辑提示词和目标图提交生成,完成后会回写到当前对话和画布。", toolName: params.toolName, capability: params.capability, }); @@ -190,7 +240,7 @@ export function buildDirectAgentImageEditCompletedProgress(params: { stage: "completed", currentStep: "finalize", title: `${params.label}完成`, - message: "结果已经回写到当前对话和画布。", + message: "结果已整理并回写到当前对话和画布。", toolName: params.toolName, capability: params.capability, });