feat: improve agent progress feedback
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-05-19 15:16:12 +08:00
parent 1db3d108d4
commit 5239250465
3 changed files with 101 additions and 26 deletions

View File

@ -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({

View File

@ -428,25 +428,25 @@ const AGENT_PROGRESS_STEPS: Array<{
key: NonNullable<AgentProgressStreamPayload["currentStep"]>;
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 "正在理解需求";
}
}

View File

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