fromJson static method

RealtimeEvent fromJson(
  1. Map<String, dynamic> j
)

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"');
  }
}