From c0d5d5a0501ffab554c6da8a5e5f9ba4976691de Mon Sep 17 00:00:00 2001 From: Hao OUYANG Date: Wed, 22 Jul 2026 20:51:19 +0800 Subject: [PATCH] =?UTF-8?q?fix(canvas):=20Agent=20=E4=BC=9A=E8=AF=9D=20-?= =?UTF-8?q?=20=E5=B1=95=E7=A4=BA=E5=90=8E=E7=AB=AF=E5=85=B7=E4=BD=93?= =?UTF-8?q?=E5=A4=B1=E8=B4=A5=E5=8E=9F=E5=9B=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Refs #9 --- web/src/components/canvas/canvas-assistant-panel.tsx | 4 ++-- web/src/pages/canvas/use-canvas-document-workflow.ts | 4 ++-- web/src/services/api/task-center.ts | 12 ++++++++++++ 3 files changed, 16 insertions(+), 4 deletions(-) diff --git a/web/src/components/canvas/canvas-assistant-panel.tsx b/web/src/components/canvas/canvas-assistant-panel.tsx index 19e1b5c85..27bc173b8 100644 --- a/web/src/components/canvas/canvas-assistant-panel.tsx +++ b/web/src/components/canvas/canvas-assistant-panel.tsx @@ -8,7 +8,7 @@ import { modelOptionName, normalizeModelOptionValue, resolveModelChannel, resolv import { canvasThemes } from "@/lib/canvas-theme"; import { nanoid } from "nanoid"; import { requestToolResponse, type ResponseFunctionTool, type ResponseInputMessage, type ResponseToolCall } from "@/services/api/image"; -import { createAgentSession, queryAgentSession } from "@/services/api/task-center"; +import { agentSessionFailureMessage, createAgentSession, queryAgentSession } from "@/services/api/task-center"; import { imageToDataUrl } from "@/services/image-storage"; import { useAssetStore } from "@/stores/use-asset-store"; import { useThemeStore } from "@/stores/use-theme-store"; @@ -1004,7 +1004,7 @@ async function createCinematicSessionOps(projectId: string, prompt: string, snap let detail = created; for (let attempt = 0; attempt < 120; attempt += 1) { if (detail.session.status === "completed") break; - if (detail.session.status === "failed") throw new Error("后端影视 Agent 会话失败"); + if (detail.session.status === "failed") throw new Error(agentSessionFailureMessage(detail)); await delay(2000); detail = await queryAgentSession(created.session.id); } diff --git a/web/src/pages/canvas/use-canvas-document-workflow.ts b/web/src/pages/canvas/use-canvas-document-workflow.ts index db51b4928..4a30403a0 100644 --- a/web/src/pages/canvas/use-canvas-document-workflow.ts +++ b/web/src/pages/canvas/use-canvas-document-workflow.ts @@ -7,7 +7,7 @@ import { parseDocumentCharacterBreakdown, partitionCharacterBreakdowns, upsertCh import { createDocumentChapter } from "@/lib/canvas/canvas-document"; import { createCanvasNode } from "@/lib/canvas/canvas-project-domain"; import { backendProviderConfig, buildGenerationConfig, runBackendCanvasGenerationTask } from "@/lib/canvas/canvas-project-generation"; -import { createAgentSession, queryAgentSession } from "@/services/api/task-center"; +import { agentSessionFailureMessage, createAgentSession, queryAgentSession } from "@/services/api/task-center"; import { resolveModelRequestConfig, useConfigStore, useEffectiveConfig } from "@/stores/use-config-store"; import { CanvasNodeType, type CanvasConnection, type CanvasDocumentChapter, type CanvasNodeData, type CanvasNodeMetadata, type CanvasRichDocument, type Position, type ViewportTransform } from "@/types/canvas"; @@ -167,7 +167,7 @@ export function useCanvasDocumentWorkflow({ let detail = created; for (let attempt = 0; attempt < 120; attempt += 1) { if (detail.session.status === "completed") break; - if (detail.session.status === "failed") throw new Error("后端影视 Agent 会话失败"); + if (detail.session.status === "failed") throw new Error(agentSessionFailureMessage(detail)); await new Promise((resolve) => window.setTimeout(resolve, 2000)); detail = await queryAgentSession(created.session.id); } diff --git a/web/src/services/api/task-center.ts b/web/src/services/api/task-center.ts index 2b7274bed..974583fc6 100644 --- a/web/src/services/api/task-center.ts +++ b/web/src/services/api/task-center.ts @@ -141,6 +141,18 @@ export function queryAgentSession(id: string) { return request(api.get(`/query_session/${encodeURIComponent(id)}`)); } +export function agentSessionFailureMessage(detail: AgentSessionDetail, fallback = "后端影视 Agent 会话失败") { + for (let index = detail.tasks.length - 1; index >= 0; index -= 1) { + const task = detail.tasks[index]; + if ((task.status === "failed" || task.status === "cancelled") && task.error?.trim()) return generationErrorMessage(task.error.trim()); + } + for (let index = detail.messages.length - 1; index >= 0; index -= 1) { + const message = detail.messages[index]; + if (message.role === "assistant" && message.content.trim()) return generationErrorMessage(message.content.trim()); + } + return fallback; +} + export function downloadSessionResults(id: string) { return request(api.get(`/download_results/${encodeURIComponent(id)}`)); }