fromJson static method
Parse an arbitrary WebSocket JSON payload into the specific RealtimeEvent
implementation for that type
. Throws if the type
is missing or unknown.
Implementation
static RealtimeEvent fromJson(Map<String, dynamic> j) {
final String type = j['type'] as String? ?? (throw ArgumentError('RealtimeEvent JSON is missing a "type" field'));
switch (type) {
/* ── client → server ─────────────────────────────────────────────── */
case 'session.update':
return SessionUpdateEvent.fromJson(j);
case 'input_audio_buffer.append':
return InputAudioBufferAppendEvent.fromJson(j);
case 'input_audio_buffer.commit':
return InputAudioBufferCommitEvent.fromJson(j);
case 'input_audio_buffer.clear':
return InputAudioBufferClearEvent.fromJson(j);
case 'conversation.item.create':
return RealtimeConversationItemCreateEvent.fromJson(j);
case 'conversation.item.retrieve':
return RealtimeConversationItemRetrieveEvent.fromJson(j);
case 'conversation.item.truncate':
return RealtimeConversationItemTruncateEvent.fromJson(j);
case 'conversation.item.delete':
return RealtimeConversationItemDeleteEvent.fromJson(j);
case 'response.create':
return RealtimeResponseCreateEvent.fromJson(j);
case 'response.cancel':
return RealtimeResponseCancelEvent.fromJson(j);
case 'output_audio_buffer.clear':
return OutputAudioBufferClearEvent.fromJson(j);
/* ── server → client : session-level ─────────────────────────────── */
case 'session.created':
return SessionCreatedEvent.fromJson(j);
case 'session.updated':
return SessionUpdatedEvent.fromJson(j);
case 'rate_limits.updated':
return RateLimitsUpdatedEvent.fromJson(j);
/* ── server → client : conversation-level ────────────────────────── */
case 'conversation.created':
return ConversationCreatedEvent.fromJson(j);
case 'conversation.item.created':
return ConversationItemCreatedEvent.fromJson(j);
case 'conversation.item.done':
return ConversationItemDoneEvent.fromJson(j);
case 'conversation.item.added':
return ConversationItemAddedEvent.fromJson(j);
case 'conversation.item.retrieved':
return ConversationItemRetrievedEvent.fromJson(j);
case 'conversation.item.input_audio_transcription.completed':
return ConversationItemInputAudioTranscriptionCompletedEvent.fromJson(j);
case 'conversation.item.input_audio_transcription.delta':
return ConversationItemInputAudioTranscriptionDeltaEvent.fromJson(j);
case 'conversation.item.input_audio_transcription.failed':
return ConversationItemInputAudioTranscriptionFailedEvent.fromJson(j);
case 'conversation.item.input_audio_transcription.segment':
return ConversationItemInputAudioTranscriptionSegmentEvent.fromJson(j);
case 'conversation.item.truncated':
return ConversationItemTruncatedEvent.fromJson(j);
case 'conversation.item.deleted':
return ConversationItemDeletedEvent.fromJson(j);
/* ── server → client : input-audio buffer ────────────────────────── */
case 'input_audio_buffer.committed':
return InputAudioBufferCommittedEvent.fromJson(j);
case 'input_audio_buffer.cleared':
return InputAudioBufferClearedEvent.fromJson(j);
case 'input_audio_buffer.speech_started':
return InputAudioBufferSpeechStartedEvent.fromJson(j);
case 'input_audio_buffer.timeout_triggered':
return InputAudioBufferTimeoutTriggeredEvent.fromJson(j);
/* ── server → client : response-level ────────────────────────────── */
case 'response.created':
return RealtimeResponseCreateEvent.fromJson(j);
case 'response.done':
return RealtimeResponseDoneEvent.fromJson(j);
case 'response.output_item.added':
return RealtimeResponseOutputItemAddedEvent.fromJson(j);
case 'response.output_item.done':
return RealtimeResponseOutputItemDoneEvent.fromJson(j);
case 'response.content_part.added':
return RealtimeResponseContentPartAddedEvent.fromJson(j);
case 'response.content_part.done':
return RealtimeResponseContentPartDoneEvent.fromJson(j);
case 'response.text.delta':
return RealtimeResponseTextDeltaEvent.fromJson(j);
case 'response.text.done':
return RealtimeResponseTextDoneEvent.fromJson(j);
case 'response.audio_transcript.delta':
return RealtimeResponseAudioTranscriptDeltaEvent.fromJson(j);
case 'response.audio_transcript.done':
return RealtimeResponseAudioTranscriptDoneEvent.fromJson(j);
case 'response.audio.delta':
return RealtimeResponseAudioDeltaEvent.fromJson(j);
case 'response.audio.done':
return RealtimeResponseAudioDoneEvent.fromJson(j);
case 'response.function_call_arguments.delta':
return RealtimeResponseFunctionCallArgumentsDeltaEvent.fromJson(j);
case 'response.function_call_arguments.done':
return RealtimeResponseFunctionCallArgumentsDoneEvent.fromJson(j);
/* ── server → client : WebRTC audio-buffer events ────────────────── */
case 'output_audio_buffer.started':
return OutputAudioBufferStartedEvent.fromJson(j);
case 'output_audio_buffer.stopped':
return OutputAudioBufferStoppedEvent.fromJson(j);
case 'output_audio_buffer.cleared':
return OutputAudioBufferClearedEvent.fromJson(j);
case 'input_audio_buffer.speech_stopped':
return InputAudioBufferSpeechStoppedEvent.fromJson(j);
/* ── server → client : generic error ─────────────────────────────── */
case 'error':
return RealtimeErrorEvent.fromJson(j);
/* ── server → client : response-level (MCP) ─────────────────────────── */
case 'response.mcp_call_arguments.delta':
return RealtimeResponseMcpCallArgumentsDeltaEvent.fromJson(j);
case 'response.mcp_call_arguments.done':
return RealtimeResponseMcpCallArgumentsDoneEvent.fromJson(j);
case 'response.mcp_call.in_progress':
return RealtimeResponseMcpCallInProgressEvent.fromJson(j);
case 'response.mcp_call.completed':
return RealtimeResponseMcpCallCompletedEvent.fromJson(j);
case 'response.mcp_call.failed':
return RealtimeResponseMcpCallFailedEvent.fromJson(j);
/* ── server → client : mcp_list_tools lifecycle ─────────────────────── */
case 'mcp_list_tools.in_progress':
return RealtimeMcpListToolsInProgressEvent.fromJson(j);
case 'mcp_list_tools.completed':
return RealtimeMcpListToolsCompletedEvent.fromJson(j);
case 'mcp_list_tools.failed':
return RealtimeMcpListToolsFailedEvent.fromJson(j);
/* ── server → client : response-level (output_* variants) ─────────── */
case 'response.output_text.delta':
return RealtimeResponseOutputTextDeltaEvent.fromJson(j);
case 'response.output_text.done':
return RealtimeResponseOutputTextDoneEvent.fromJson(j);
case 'response.output_audio_transcript.delta':
return RealtimeResponseOutputAudioTranscriptDeltaEvent.fromJson(j);
case 'response.output_audio_transcript.done':
return RealtimeResponseOutputAudioTranscriptDoneEvent.fromJson(j);
case 'response.output_audio.delta':
return RealtimeResponseOutputAudioDeltaEvent.fromJson(j);
case 'response.output_audio.done':
return RealtimeResponseOutputAudioDoneEvent.fromJson(j);
/* ── unknown / future-proofing ───────────────────────────────────── */
default:
throw ArgumentError('Unknown realtime event type "$type"');
}
}