fix(canvas): capture current image model and canvas save callback at Agent admission

This commit is contained in:
134 2026-10-20 23:40:25 +08:00
parent 4ee3e369c6
commit 0ab68d28ba

View File

@ -5822,7 +5822,7 @@ export function CanvasChatPanel({
const SMART_AUTO_MODEL = { const SMART_AUTO_MODEL = {
id: "auto", id: "auto",
modelId: "auto", modelId: "auto",
displayName: "Agent模式", displayName: !isVideoWorkspace && !isWorkspacePresentation ? "自动选择" : "Agent模式",
avatarUrl: modelsData?.agentModel?.avatarUrl || null, avatarUrl: modelsData?.agentModel?.avatarUrl || null,
sortOrder: -999, sortOrder: -999,
providerType: "auto", providerType: "auto",
@ -5931,6 +5931,10 @@ export function CanvasChatPanel({
), ),
[visualModels] [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 currentModel = allModels.find((model) => model.id === selectedModelId);
const atlasVideoReferenceLimit = const atlasVideoReferenceLimit =
currentModel?.providerType === "atlascloud" currentModel?.providerType === "atlascloud"
@ -7943,7 +7947,10 @@ export function CanvasChatPanel({
selectedChatModel: currentModelIdRef.current, selectedChatModel: currentModelIdRef.current,
}); });
const effectiveSelectedChatModel = requestPolicy.effectiveSelectedChatModel; 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 (model) => model.id === effectiveSelectedChatModel
); );
const requestIsVideoModel = isCanvasVideoModel(requestModel); const requestIsVideoModel = isCanvasVideoModel(requestModel);
@ -7960,12 +7967,12 @@ export function CanvasChatPanel({
agentPresetId: agentPresetId:
effectiveComposerMode === "agent" && effectiveComposerMode === "agent" &&
effectiveAgentEntryMode === "preset" && effectiveAgentEntryMode === "preset" &&
selectedAgentPreset?.id requestPreset?.id
? selectedAgentPreset.id ? requestPreset.id
: undefined, : undefined,
selectedChatModel: effectiveSelectedChatModel, selectedChatModel: effectiveSelectedChatModel,
selectedImageModel: effectiveComposerMode === "agent" && isCanvasImageModel(allModels.find(model => model.id === currentModelIdRef.current)) selectedImageModel: effectiveComposerMode === "agent" && selectedImage?.id !== "auto" && isCanvasImageModel(selectedImage)
? currentModelIdRef.current : undefined, ? selectedImage!.id : undefined,
composerMode: effectiveComposerMode, composerMode: effectiveComposerMode,
workspaceVariant: isVideoWorkspace ? "video" : "canvas", workspaceVariant: isVideoWorkspace ? "video" : "canvas",
selectedVisibilityType: "private", selectedVisibilityType: "private",
@ -7991,7 +7998,7 @@ export function CanvasChatPanel({
const useAgent = shouldUseCanvasAgentRuntime(preparedBody); const useAgent = shouldUseCanvasAgentRuntime(preparedBody);
// Persist references before the isolated Agent reads the owned canvas. // Persist references before the isolated Agent reads the owned canvas.
// Transport admission is already guarded against duplicate sends. // Transport admission is already guarded against duplicate sends.
if (useAgent && onBeforeAgentRequest && !(await onBeforeAgentRequest())) { if (useAgent && requestSettings.beforeAgentRequest && !(await requestSettings.beforeAgentRequest())) {
throw new Error("画布保存未完成,未开始 Agent 任务,请稍后重试。"); throw new Error("画布保存未完成,未开始 Agent 任务,请稍后重试。");
} }
return { return {