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 = {
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 {