diff --git a/web/pages/Assistants.tsx b/web/pages/Assistants.tsx index fc09b04..e116d17 100644 --- a/web/pages/Assistants.tsx +++ b/web/pages/Assistants.tsx @@ -2315,7 +2315,6 @@ const TranscriptionLog: React.FC<{ ))} - {isLoading &&
Thinking...
} ); @@ -2380,6 +2379,7 @@ export const DebugDrawer: React.FC<{ const [inputText, setInputText] = useState(''); const [isLoading, setIsLoading] = useState(false); const [callStatus, setCallStatus] = useState<'idle' | 'calling' | 'active'>('idle'); + const [agentState, setAgentState] = useState<'waiting' | 'listening' | 'thinking' | 'speaking'>('waiting'); const [textPromptDialog, setTextPromptDialog] = useState({ open: false, message: '', @@ -2562,6 +2562,7 @@ export const DebugDrawer: React.FC<{ clearResponseTracking(); setMessages([]); setCallStatus('idle'); + setAgentState('waiting'); } } else { setMode('text'); @@ -2585,6 +2586,7 @@ export const DebugDrawer: React.FC<{ setSettingsDrawerOpen(false); setIsSwapped(false); setCallStatus('idle'); + setAgentState('waiting'); } }, [isOpen, assistant, mode]); @@ -3110,6 +3112,7 @@ export const DebugDrawer: React.FC<{ console.error(e); stopVoiceCapture(); setCallStatus('idle'); + setAgentState('waiting'); const err = e as Error & { __dynamicVariables?: boolean }; if (err.__dynamicVariables) { setWsStatus('disconnected'); @@ -3135,6 +3138,7 @@ export const DebugDrawer: React.FC<{ stopMedia(); closeWs(); setCallStatus('idle'); + setAgentState('waiting'); clearResponseTracking(); setMessages([]); setTextPromptDialog({ open: false, message: '', promptType: 'text' }); @@ -3500,6 +3504,7 @@ export const DebugDrawer: React.FC<{ setChoicePromptDialog({ open: false, question: '', options: [] }); setTextSessionStarted(false); stopPlaybackImmediately(); + setAgentState('waiting'); if (isOpen) setWsStatus('disconnected'); }; @@ -3580,6 +3585,12 @@ export const DebugDrawer: React.FC<{ if (type === 'output.audio.start') { // New utterance audio starts: cancel old queued/playing audio to avoid overlap. stopPlaybackImmediately(); + setAgentState('speaking'); + return; + } + + if (type === 'output.audio.end') { + setAgentState('waiting'); return; } @@ -3595,6 +3606,7 @@ export const DebugDrawer: React.FC<{ assistantDraftIndexRef.current = null; setIsLoading(false); stopPlaybackImmediately(); + setAgentState('waiting'); return; } @@ -3878,6 +3890,7 @@ export const DebugDrawer: React.FC<{ if (type === 'session.started') { wsReadyRef.current = true; setWsStatus('ready'); + setAgentState('waiting'); pendingResolveRef.current?.(); pendingResolveRef.current = null; pendingRejectRef.current = null; @@ -3899,11 +3912,13 @@ export const DebugDrawer: React.FC<{ if (type === 'input.speech_started') { setIsLoading(true); + setAgentState('listening'); return; } if (type === 'input.speech_stopped') { setIsLoading(false); + setAgentState('thinking'); return; } @@ -4500,13 +4515,38 @@ export const DebugDrawer: React.FC<{
-

通话进行中

+

+ {agentState === 'listening' ? '正在倾听...' : + agentState === 'thinking' ? '思考中...' : + agentState === 'speaking' ? '正在回复...' : + '待机中'} +

- - + + -

已连接

+

+ {agentState === 'listening' ? 'Listening' : + agentState === 'thinking' ? 'Thinking' : + agentState === 'speaking' ? 'Speaking' : + 'Waiting'} +