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'}
+