diff --git a/components/canvas/CanvasChatPanel.tsx b/components/canvas/CanvasChatPanel.tsx index d243ecf34..79fd78151 100644 --- a/components/canvas/CanvasChatPanel.tsx +++ b/components/canvas/CanvasChatPanel.tsx @@ -3506,6 +3506,19 @@ export function CanvasChatPanel({ activeComposerModeRef.current = activeComposerMode; }, [activeComposerMode]); + useEffect(() => { + if (composerModeOverride !== "agent") return; + if (agentEnabled && hasSelectedAgentPreset) return; + + activeComposerModeRef.current = computedComposerMode; + setComposerModeOverride(null); + }, [ + agentEnabled, + composerModeOverride, + computedComposerMode, + hasSelectedAgentPreset, + ]); + useEffect(() => { if (!selectedModelId && siteSettings) { const nextModelId = agentEnabled ? "auto" : firstImageModelId || firstVideoModelId || ""; @@ -7637,6 +7650,12 @@ export function CanvasChatPanel({ textContent = `请基于当前工作流设定生成方案:${workflowContext.summaryText}`; } const effectiveComposerMode = activeComposerModeRef.current || activeComposerMode; + if (effectiveComposerMode === "agent" && !selectedAgentPresetId) { + toast.error("智能体模式缺少生图模式配置,请先选择智能体后再发送"); + activeComposerModeRef.current = computedComposerMode; + setComposerModeOverride(null); + return; + } if (!textContent && hasAgentUploadSlots && selectedAgentPreset) { textContent = `请按「${selectedAgentPreset.name}」智能体配置顺序处理产品图1、产品图2和模特图。`; @@ -7791,6 +7810,7 @@ export function CanvasChatPanel({ ensureImagePointsBeforeSend, getSendGuard, clearStreamImageGenerationStateForChat, + computedComposerMode, releaseSendGuard, setSendGuard, shouldBlockDuplicateSend, diff --git a/lib/utils.ts b/lib/utils.ts index 685969e81..8b328c83a 100644 --- a/lib/utils.ts +++ b/lib/utils.ts @@ -19,8 +19,12 @@ export const fetcher = async (url: string) => { const response = await fetch(url); if (!response.ok) { - const { code, cause } = await response.json(); - throw new ChatSDKError(code as ErrorCode, cause); + const { code, cause, message } = await response.json(); + const error = new ChatSDKError(code as ErrorCode, cause); + if (typeof message === "string" && message.trim()) { + error.message = message; + } + throw error; } return response.json(); @@ -48,7 +52,11 @@ export async function fetchWithErrorHandlers( const cause = typeof payload?.cause === "string" ? payload.cause : undefined; if (code) { - throw new ChatSDKError(code, cause); + const error = new ChatSDKError(code, cause); + if (typeof payload?.message === "string" && payload.message.trim()) { + error.message = payload.message; + } + throw error; } const fallbackMessage =