diff --git a/src/client/Chat.tsx b/src/client/Chat.tsx index f21cb6a..54f6bf2 100644 --- a/src/client/Chat.tsx +++ b/src/client/Chat.tsx @@ -9,6 +9,7 @@ import { contextualMessage, type PageContext } from './page-context'; import { api } from './api'; import type { Page } from '../server/pages'; import { useEffect, useRef, useState } from 'react'; +import { CopilotKitCoreErrorCode } from '@copilotkit/core'; import { CopilotChatToolCallsView, useRenderTool, @@ -97,6 +98,8 @@ export function Chat({ const [source, setSource] = useState(''); const [sourceOpen, setSourceOpen] = useState(false); const [error, setError] = useState(''); + const [runError, setRunError] = useState(''); + const chatError = error || runError; const [loaded, setLoaded] = useState(false); const [running, setRunning] = useState(false); const voice = useVoice(thread.id, onSaved, agent.messages.at(-1)?.id); @@ -104,10 +107,22 @@ export function Chat({ const bottom = useRef(null); useEffect(() => { const subscription = copilotkit.subscribe({ - onError: ({ error }) => setError(error.message), + onError: ({ error, code }) => { + if ( + code === CopilotKitCoreErrorCode.AGENT_RUN_ERROR_EVENT || + code === CopilotKitCoreErrorCode.AGENT_RUN_FAILED_EVENT || + code === CopilotKitCoreErrorCode.AGENT_RUN_FAILED || + code === CopilotKitCoreErrorCode.AGENT_THREAD_LOCKED + ) + setRunError(error.message); + else setError(error.message); + }, }); const events = agent.subscribe({ - onRunErrorEvent: ({ event }) => setError(event.message), + onRunErrorEvent: ({ event }) => setRunError(event.message), + onRunFinishedEvent: ({ outcome }) => { + if (outcome === 'success') setRunError(''); + }, }); return () => { subscription.unsubscribe(); @@ -135,6 +150,7 @@ export function Chat({ const send = async (text: string) => { if (!text.trim() || running || !loaded || !contextReady || paused) return; setError(''); + setRunError(''); setRunning(true); agent.addMessage({ id: crypto.randomUUID?.() ?? `${Date.now()}-${Math.random()}`, @@ -152,7 +168,7 @@ export function Chat({ ); onSaved(); } catch (e) { - setError( + setRunError( e instanceof Error ? e.message : 'The turn failed. Your conversation remains saved.', @@ -366,13 +382,14 @@ export function Chat({ )} - {(error || voice.error) && ( + {(chatError || voice.error) && (
- {error || voice.error} - {error && ( + {chatError || voice.error} + {chatError && (