requestReply | requestReply | Requires request_reply_v1. FIFO capacity 16, lifetime receipt budget 256. Same ID and payload recovers latest state, including after resume. No implicit user message or replay under a new ID. |
replyAck | replyAck | |
responseDone | responseDone | Emitted once at logical response teardown across all segments, with status completed, cancelled or failed. May precede the final done segment fence. This is generation completion, not proof of playback; preserve queued audio and wait for each segment's done fence. |
interruptAck | interruptAck | |
conversationSnapshot | conversationSnapshot | After ready on fresh connection and resume. Atomically replaces the read-only retained window, at most 512 items and 512 KiB compact UTF-8 JSON. |
conversationItem | conversationItem | |
speechStarted | speechStarted | |
speechStopped | speechStopped | |
start | start | Opens a conversation. api_key may be omitted when the WebSocket handshake supplied Authorization: Bearer <key>. Voice mode requires audio; text mode omits it and requires the WebSocket transport. |
inputText | inputText | Commit a user turn in text mode. Dialt emits the ordinary asr, turn, text_delta, utterance, and done events without audio frames. |
setVoice | setVoice | Select a current stock voice key from GET /v1/voices for the next reply. Empty, unknown, retired or unavailable keys emit invalid_voice and leave the current voice unchanged. In voice sessions, changing the listening route or language hints also emits invalid_voice and requires a new call. Text sessions may change language. A voice event confirms every accepted selection, including the active key. |
setInstructions | setInstructions | Replace the session instructions (start.mode.instructions) mid-session; applies from the next reply and re-stamps prompt_config. new_speaker: true remains available for an independent speaker change and folds the call so far into one prior-agent transcript. With new_speaker the frame is refused while a reply is in flight (error code instructions_busy, retryable): send it after done. |
handoffAgent | continueWithAgent | Atomically continue the conversation with an initialized replacement agent at a safe boundary. One continuation may be pending. The broker sends queued, then applied or rejected within 10 seconds. It does not retry, survive reconnect, or start specialist speech. The former handoff_agent type remains a compatibility alias. |
toolResult | toolResult | |
toolDeferred | toolDeferred | Detach an eligible call from its voice turn while preserving managed job identity. |
toolProgress | toolProgress | |
toolPartialResult | toolPartialResult | Deliver a structured segment of an in-flight tool's eventual result without resolving the call. |
toolInteractionUpdate | toolInteractionUpdate | Host-side close of an open interaction (docs/tool-orchestration.md, Partial results and interactions): the decision was resolved out-of-band, cancelled, or superseded by newer intent -- without completing the parent call. Stops the ask's queued or actively-speaking narration and tells the model the decision is closed. Always answered by toolInteractionUpdateAck; late/duplicate/unknown updates are rejected deterministically. |
toolCancelClient | toolCancelClient | |
playbackStopped | playbackStopped | |
ready | ready | Authoritative initial session state, including selected voice and negotiated audio format, not merely an echo of start. Keep resume_token private and replace it after a successful resume; later acknowledged configuration changes update the initial state. |
silentMic | silentMic | |
turn | turn | |
asr | asr | |
injectContextAck | injectContextAck | Authoritative accepted/rejected acknowledgement for a correlated inject_context request. |
handoffAck | handoffAck | Correlated handoff acknowledgement. Rejection leaves the active configuration unchanged. |
utterance | utterance | |
done | done | Per-segment output fence identified by turn_id. It does not settle the logical response: response_done reports logical teardown and may arrive before the final done. Neither event proves client playback. |
sessionEndRequested | sessionEndRequested | |
interrupted | interrupted | |
canceled | canceled | |
textDelta | textDelta | Streamed assistant text, sent as the model produces it (ahead of audio and the final utterance frame). |
permissionPending | permissionPending | A permission-gated tool call is held for the configured caller or application approval source. |
permissionApproved | permissionApproved | A pending permission was approved and the admitted execution path returned, including accepted deferral. Emitted after tool_call, not as a pre-execution receipt. Handle the tool call and return its result without waiting for this event. This does not establish business success. The id matches the held tool call. |
permissionRefused | permissionRefused | A pending permission was declined; the held tool call did not run. |
toolCall | toolCall | |
toolDeferredAck | toolDeferredAck | |
toolDeferredResume | toolDeferredResume | |
toolCancelServer | toolCancelServer | |
toolJobDeliveryFailed | toolJobDeliveryFailed | A queued background-job completion voiceover could not be delivered. The turn still closes with done; job_ids lists jobs whose spoken delivery is terminally failed (their results remain in conversation context and can be asked about), requeued lists jobs re-queued for one more proactive spoken attempt (a newer user turn may supersede it, as with any queued completion). |
toolJobNarration | toolJobNarration | Narration-lifecycle ack for a queued tool_partial_result `interaction` (docs/tool-orchestration.md, Partial results and interactions). Scoped to interaction-kind jobs only -- a plain completion has no such wire-visible lifecycle. |
working | working | Dialt is blocking on a tool result with nothing audible (the silence after the spoken bridge, until the final reply's first audio), or that wait has ended. |
toolInteractionUpdateAck | toolInteractionUpdateAck | Deterministic answer to every toolInteractionUpdate. applied=false carries a stable reason: invalid_interaction_id, invalid_state, unknown_interaction (never seen, or from before a reconnect -- interaction state does not survive a resume), or already_closed (first close wins: cancel dismissed it, its call resolved, a newer ask replaced it, or a duplicate of this very frame -- a user turn superseding the ask's narration deliberately does NOT close the decision). |
voiceChanged | voiceChanged | |
error | error | |
webrtcIce | webrtcIce | Experimental. Sent over the signaling WebSocket right after a start frame carrying transport.kind webrtc. Build the RTCPeerConnection with these ice_servers, then send webrtcOffer. |
webrtcOffer | webrtcOffer | Experimental. Client's SDP offer, sent over the signaling WebSocket once the RTCPeerConnection is built with webrtcIce's servers. |
webrtcCandidate | webrtcCandidate | Experimental. One client ICE candidate sent after the offer when webrtcIce advertises trickle_ice. |
webrtcIceComplete | webrtcIceComplete | Experimental. Marks the end of client candidate gathering after all webrtcCandidate frames. |
webrtcAnswer | webrtcAnswer | Experimental. Server's SDP answer to webrtcOffer. The call then lives on the peer connection; the signaling socket may drop afterwards without affecting it. |
webrtcBye | bye | Sent on the webrtc "control" data channel just before the server closes the peer connection — the webrtc transport's counterpart of a WebSocket close frame/code. |
microphoneAudio | microphoneAudio | |
assistantAudio | assistantAudio | |
interrupt | interrupt | Legacy uncorrelated stop remains supported. Targeted interruption requires targeted_interrupt_v1, operation_id and exactly one response_id or target_operation_id. A stale target cannot stop a newer response. WebRTC does not support targeted interruption. |
setTools | setTools | Mid-session tool swap: agents that change capability by call phase no longer need a reconnect, which would destroy the conversation. |
setToolChoice | setToolChoice | Replace the effective tool_choice mid-session; applies from the next reply. one_shot: true reverts to the previous choice after the next caller or explicitly host-requested reply consumes the new one; autonomous jobs do not consume it. An invalid value is rejected with an `error` frame (code invalid_tool_choice) and changes nothing. A mid-session setTools resets tool_choice to "auto"; re-apply it after swapping tools. |
triggerReply | triggerReply | Client-triggered reply. Silently ignored if a reply is already in flight — do not stack these. |
injectContext | injectContext | Text/context injection with authoritative delivery acknowledgement. Supply message_id to correlate inject_context_ack and typed-turn asr events. |
sessionClosingSoon | sessionClosingSoon | Warns the client shortly before the server closes the connection due to the session time limit (or scoped credential expiry) — gives the client a chance to wrap up, or to reconnect with start.resume_token once closed. |
lowCreditWarning | lowCreditWarning | API-key (paid) sessions only. Warns the client once when the account's remaining balance is running low, so the call doesn't just cut off mid-conversation when credit runs out. |
playbackReport | playbackReport | |
playbackPause | playbackPause | Pause and retain the unplayed PCM for this reply. Sent only to WebSocket clients advertising playback_pause_v1. Acknowledge the matching hold ID with playback_paused. |
playbackResume | playbackResume | Resume the retained PCM for the matching hold ID and turn ID. Ignore stale IDs. A hard interruption or cancellation discards the held audio instead. |
playbackPaused | playbackPaused | Acknowledges a provisional pause with retained duration and hardware output tail. Repeated acknowledgements may report a buffer limit error; they never authorize resuming a different hold. |
permissionExpired | permissionExpired | A pending request expired without execution. Reset, tool replacement and disconnect also invalidate pending ids. |
resolveToolPermission | resolveToolPermission | Submit an application decision as the authenticated session host. Only application-source requests accept this command; the application authenticates its reviewer. Arguments and actor claims cannot be supplied. |
permissionResolution | permissionResolution | Acknowledges an application decision. A duplicate, invalid, expired or wrong-source decision cannot execute an action. Completion uses permission_approved/refused plus normal tool-result delivery. |
policyFlag | policyFlag | |
policyError | policyError | |
policyCheck | policyCheck | |
policySettled | policySettled | |
wrapUp | wrapUp | Request a graceful host-initiated sign-off in voice or text mode, including when mode.end_call is disabled. An active reply receives a bounded grace before the sign-off. No dedicated acknowledgement is sent; continue handling reply events and normal closure, and drain local playback. Sending this frame does not confirm the farewell was heard. |
inputAudioDone | inputAudioDone | Commit accumulated voice input when start.mode.turn_detection is client. Send after the audio for that turn. Ignored when client turn detection is not active; not a text-mode control and not an acknowledgement of transcription or reply completion. |
asrCorrection | asrCorrection | Replaces the text of an earlier voice transcript. When turn_id is present, update that turn rather than appending a new user turn. turn_id can be omitted; do not fabricate a correlation. Optional utterance_id, revision and policy_version describe the policy transcript revision. |
auth | auth | Check a credential on a fresh WebSocket connection. Send as the first frame instead of start, with api_key or a Bearer handshake header. Returns ok on success or error on failure and the connection ends. Does not open a conversation, emit ready, or prove credit or session capacity is available. |
feedback | feedback | Submit feedback as the first frame on a fresh authenticated WebSocket instead of start. Requires an owned recording and either rating or nonblank text. Success returns ok and the connection ends. Re-submitting feedback for the same session replaces the earlier feedback. Does not consume a conversation slot and remains available while the server drains. |
clientError | clientError | Report a client-side failure as the first frame on a fresh authenticated WebSocket instead of start. Omit session_id when failure predates session creation; when present it must name an owned recording. Success returns ok and the connection ends, without consuming a conversation slot. detail and context are diagnostic log content: do not send transcripts, replies, credentials or user conversation text. |
ok | ok | Successful acknowledgement for a fresh-connection auth, feedback or client_error request. The connection ends after this response; it is not the ready event for a conversation. |