From 0ab68d28baeecdd35af879500073dc85356e71be Mon Sep 17 00:00:00 2001 From: 134 Date: Tue, 20 Oct 2026 23:40:25 +0800 Subject: [PATCH] fix(canvas): capture current image model and canvas save callback at Agent admission --- components/canvas/CanvasChatPanel.tsx | 21 ++++++++++++++------- 1 file changed, 14 insertions(+), 7 deletions(-) diff --git a/components/canvas/CanvasChatPanel.tsx b/components/canvas/CanvasChatPanel.tsx index 9e9017592..92d9cee64 100644 --- a/components/canvas/CanvasChatPanel.tsx +++ b/components/canvas/CanvasChatPanel.tsx @@ -5822,7 +5822,7 @@ export function CanvasChatPanel({ const SMART_AUTO_MODEL = { id: "auto", modelId: "auto", - displayName: "Agent模式", + displayName: !isVideoWorkspace && !isWorkspacePresentation ? "自动选择" : "Agent模式", avatarUrl: modelsData?.agentModel?.avatarUrl || null, sortOrder: -999, providerType: "auto", @@ -5931,6 +5931,10 @@ export function CanvasChatPanel({ ), [visualModels] ); + // The chat transport is created once by useChat. Read changing controls and + // the loaded catalog through refs instead of its first-render closure. + const composerRequestSettingsRef = useRef({ models: allModels, preset: selectedAgentPreset, beforeAgentRequest: onBeforeAgentRequest }); + composerRequestSettingsRef.current = { models: allModels, preset: selectedAgentPreset, beforeAgentRequest: onBeforeAgentRequest }; const currentModel = allModels.find((model) => model.id === selectedModelId); const atlasVideoReferenceLimit = currentModel?.providerType === "atlascloud" @@ -7943,7 +7947,10 @@ export function CanvasChatPanel({ selectedChatModel: currentModelIdRef.current, }); const effectiveSelectedChatModel = requestPolicy.effectiveSelectedChatModel; - const requestModel = allModels.find( + const requestSettings = composerRequestSettingsRef.current; + const requestPreset = requestSettings.preset; + const selectedImage = requestSettings.models.find(model => model.id === currentModelIdRef.current); + const requestModel = requestSettings.models.find( (model) => model.id === effectiveSelectedChatModel ); const requestIsVideoModel = isCanvasVideoModel(requestModel); @@ -7960,12 +7967,12 @@ export function CanvasChatPanel({ agentPresetId: effectiveComposerMode === "agent" && effectiveAgentEntryMode === "preset" && - selectedAgentPreset?.id - ? selectedAgentPreset.id + requestPreset?.id + ? requestPreset.id : undefined, selectedChatModel: effectiveSelectedChatModel, - selectedImageModel: effectiveComposerMode === "agent" && isCanvasImageModel(allModels.find(model => model.id === currentModelIdRef.current)) - ? currentModelIdRef.current : undefined, + selectedImageModel: effectiveComposerMode === "agent" && selectedImage?.id !== "auto" && isCanvasImageModel(selectedImage) + ? selectedImage!.id : undefined, composerMode: effectiveComposerMode, workspaceVariant: isVideoWorkspace ? "video" : "canvas", selectedVisibilityType: "private", @@ -7991,7 +7998,7 @@ export function CanvasChatPanel({ const useAgent = shouldUseCanvasAgentRuntime(preparedBody); // Persist references before the isolated Agent reads the owned canvas. // Transport admission is already guarded against duplicate sends. - if (useAgent && onBeforeAgentRequest && !(await onBeforeAgentRequest())) { + if (useAgent && requestSettings.beforeAgentRequest && !(await requestSettings.beforeAgentRequest())) { throw new Error("画布保存未完成,未开始 Agent 任务,请稍后重试。"); } return {