{"version":3,"sources":["../../src/realtime/api_proto.ts"],"sourcesContent":["// SPDX-FileCopyrightText: 2024 LiveKit, Inc.\n//\n// SPDX-License-Identifier: Apache-2.0\n\nexport const SAMPLE_RATE = 24000;\nexport const NUM_CHANNELS = 1;\nexport const IN_FRAME_SIZE = 2400; // 100ms\nexport const OUT_FRAME_SIZE = 1200; // 50ms\n\nexport const BASE_URL = 'wss://api.openai.com/v1';\n\nexport type Model = 'gpt-4o-realtime-preview-2024-10-01' | string; // Open-ended, for future models\n\n/**\n * Models that support the `reasoning` configuration on the Realtime API.\n * Currently only the `gpt-realtime-2` family supports it.\n *\n * Ref: https://developers.openai.com/api/reference/resources/realtime/subresources/calls/methods/accept\n */\nexport type ReasoningEffort = 'minimal' | 'low' | 'medium' | 'high' | 'xhigh';\n\nexport interface Reasoning {\n  effort?: ReasoningEffort;\n}\nexport type Voice =\n  | 'alloy'\n  | 'shimmer'\n  | 'echo'\n  | 'ash'\n  | 'ballad'\n  | 'coral'\n  | 'sage'\n  | 'verse'\n  | string;\n\n/** @deprecated Use LegacyAudioFormat for Beta API string format or AudioFormat for GA API object format */\nexport type LegacyAudioFormat = 'pcm16'; // TODO: 'g711-ulaw' | 'g711-alaw' (Beta format)\nexport type Role = 'system' | 'assistant' | 'user' | 'tool';\nexport type GenerationFinishedReason = 'stop' | 'max_tokens' | 'content_filter' | 'interrupt';\nexport type InputTranscriptionModel = 'whisper-1' | string; // Open-ended, for future models\nexport type Modality = 'text' | 'audio';\nexport type ToolChoice = 'auto' | 'none' | 'required' | string;\nexport type State = 'initializing' | 'listening' | 'thinking' | 'speaking' | string;\nexport type ResponseStatus =\n  | 'in_progress'\n  | 'completed'\n  | 'incomplete'\n  | 'cancelled'\n  | 'failed'\n  | string;\nexport type ClientEventType =\n  | 'session.update'\n  | 'input_audio_buffer.append'\n  | 'input_audio_buffer.commit'\n  | 'input_audio_buffer.clear'\n  | 'conversation.item.create'\n  | 'conversation.item.truncate'\n  | 'conversation.item.delete'\n  | 'response.create'\n  | 'response.cancel';\n\nexport type ServerEventType =\n  | 'error'\n  | 'session.created'\n  | 'session.updated'\n  | 'conversation.created'\n  | 'input_audio_buffer.committed'\n  | 'input_audio_buffer.cleared'\n  | 'input_audio_buffer.speech_started'\n  | 'input_audio_buffer.speech_stopped'\n  | 'conversation.item.added' // GA: renamed from conversation.item.created\n  | 'conversation.item.created' // Beta: kept for backward compatibility\n  | 'conversation.item.input_audio_transcription.delta'\n  | 'conversation.item.input_audio_transcription.completed'\n  | 'conversation.item.input_audio_transcription.failed'\n  | 'conversation.item.truncated'\n  | 'conversation.item.deleted'\n  | 'response.created'\n  | 'response.done'\n  | 'response.output_item.added'\n  | 'response.output_item.done'\n  | 'response.content_part.added'\n  | 'response.content_part.done'\n  | 'response.output_text.delta' // GA: renamed from response.text.delta\n  | 'response.output_text.done' // GA: renamed from response.text.done\n  | 'response.text.delta' // Beta: kept for backward compatibility\n  | 'response.text.done' // Beta: kept for backward compatibility\n  | 'response.output_audio_transcript.delta' // GA: renamed from response.audio_transcript.delta\n  | 'response.output_audio_transcript.done' // GA: renamed from response.audio_transcript.done\n  | 'response.audio_transcript.delta' // Beta: kept for backward compatibility\n  | 'response.audio_transcript.done' // Beta: kept for backward compatibility\n  | 'response.output_audio.delta' // GA: renamed from response.audio.delta\n  | 'response.output_audio.done' // GA: renamed from response.audio.done\n  | 'response.audio.delta' // Beta: kept for backward compatibility\n  | 'response.audio.done' // Beta: kept for backward compatibility\n  | 'response.function_call_arguments.delta'\n  | 'response.function_call_arguments.done'\n  | 'rate_limits.updated';\n\nexport type AudioBase64Bytes = string;\n\nexport interface Tool {\n  type: 'function';\n  name: string;\n  description?: string;\n  parameters: {\n    type: 'object';\n    properties: {\n      [prop: string]: {\n        [prop: string]: any;\n      };\n    };\n    required: string[];\n  };\n}\n\nexport type TurnDetectionType =\n  | {\n      type: 'semantic_vad';\n      eagerness?: 'auto' | 'low' | 'medium' | 'high'; // default: auto\n      create_response?: boolean; // default: true\n      interrupt_response?: boolean; // default: true\n    }\n  | {\n      type: 'server_vad';\n      threshold?: number; // 0.0 to 1.0, default: 0.5\n      prefix_padding_ms?: number; // default: 300\n      silence_duration_ms?: number; // default: 200\n      create_response?: boolean; // default: true\n      interrupt_response?: boolean; // default: true\n    };\n\nexport type InputAudioTranscription = {\n  model: InputTranscriptionModel;\n  language?: string;\n  languages?: string[];\n  keywords?: string[];\n  prompt?: string;\n};\n\nexport type NoiseReductionType = 'near_field' | 'far_field';\n\nexport interface NoiseReduction {\n  type: NoiseReductionType;\n}\n\nexport interface AudioFormat {\n  type: 'audio/pcm';\n  rate: number;\n}\n\nexport interface RealtimeAudioConfigInput {\n  format?: AudioFormat;\n  noise_reduction?: NoiseReduction | null;\n  transcription?: InputAudioTranscription | null;\n  turn_detection?: TurnDetectionType | null;\n}\n\nexport interface RealtimeAudioConfigOutput {\n  format?: AudioFormat;\n  speed?: number;\n  voice?: Voice;\n}\n\nexport interface RealtimeAudioConfig {\n  input?: RealtimeAudioConfigInput;\n  output?: RealtimeAudioConfigOutput;\n}\n\nexport interface InputTextContent {\n  type: 'input_text';\n  text: string;\n}\n\nexport interface InputAudioContent {\n  type: 'input_audio';\n  audio: AudioBase64Bytes;\n}\n\nexport interface InputImageContent {\n  type: 'input_image';\n  image_url: string;\n}\n\nexport interface TextContent {\n  type: 'text';\n  text: string;\n}\n\nexport interface OutputTextContent {\n  type: 'output_text';\n  text: string;\n}\n\nexport interface AudioContent {\n  type: 'audio';\n  audio: AudioBase64Bytes;\n  transcript: string;\n}\n\nexport type Content =\n  | InputTextContent\n  | InputAudioContent\n  | InputImageContent\n  | TextContent\n  | OutputTextContent\n  | AudioContent;\nexport type ContentPart = {\n  type: 'text' | 'audio' | 'output_text' | 'output_audio'; // GA: output_text/output_audio\n  audio?: AudioBase64Bytes;\n  transcript?: string;\n  text?: string; // GA: text field for output_text\n};\n\nexport interface BaseItem {\n  id: string;\n  object: 'realtime.item';\n  type: string;\n}\n\nexport interface SystemItem extends BaseItem {\n  type: 'message';\n  role: 'system';\n  content: InputTextContent;\n}\n\nexport interface UserItem extends BaseItem {\n  type: 'message';\n  role: 'user';\n  content: (InputTextContent | InputAudioContent | InputImageContent)[];\n}\n\nexport interface AssistantItem extends BaseItem {\n  type: 'message';\n  role: 'assistant';\n  content: (TextContent | OutputTextContent | AudioContent)[];\n}\n\nexport interface FunctionCallItem extends BaseItem {\n  type: 'function_call';\n  call_id: string;\n  name: string;\n  arguments: string;\n}\n\nexport interface FunctionCallOutputItem extends BaseItem {\n  type: 'function_call_output';\n  call_id: string;\n  output: string;\n}\n\nexport type ItemResource =\n  | SystemItem\n  | UserItem\n  | AssistantItem\n  | FunctionCallItem\n  | FunctionCallOutputItem;\n\n// Session Resource\nexport interface SessionResource {\n  id: string;\n  object: 'realtime.session';\n  model: string;\n  modalities: Modality[]; // default: [\"text\", \"audio\"]\n  instructions: string;\n  voice: Voice; // default: \"alloy\"\n  input_audio_format: LegacyAudioFormat; // default: \"pcm16\"\n  output_audio_format: LegacyAudioFormat; // default: \"pcm16\"\n  input_audio_transcription: InputAudioTranscription | null;\n  turn_detection: TurnDetectionType | null;\n  tools: Tool[];\n  tool_choice: ToolChoice; // default: \"auto\"\n  temperature: number; // default: 0.8\n  max_response_output_tokens: number | 'inf';\n  expires_at: number;\n}\n\n// Conversation Resource\nexport interface ConversationResource {\n  id: string;\n  object: 'realtime.conversation';\n}\n\nexport type ResponseStatusDetails =\n  | string\n  | {\n      type: 'incomplete';\n      reason: 'max_output_tokens' | 'content_filter' | string;\n    }\n  | {\n      type: 'failed';\n      error?: {\n        code: 'server_error' | 'rate_limit_exceeded' | string;\n        message: string;\n      };\n    }\n  | {\n      type: 'cancelled';\n      reason: 'turn_detected' | 'client_cancelled' | string;\n    };\n\nexport interface ModelUsage {\n  total_tokens: number;\n  input_tokens: number;\n  output_tokens: number;\n  input_token_details: {\n    text_tokens: number;\n    audio_tokens: number;\n    cached_tokens: number;\n    cached_tokens_details: {\n      text_tokens: number;\n      audio_tokens: number;\n      image_tokens: number;\n    };\n  };\n  output_token_details: {\n    text_tokens: number;\n    audio_tokens: number;\n  };\n}\n\nexport interface ResponseResource {\n  id: string;\n  object: 'realtime.response';\n  status: ResponseStatus;\n  status_details: ResponseStatusDetails;\n  output: ItemResource[];\n  usage?: ModelUsage;\n  metadata?: Record<string, string>;\n}\n\n// Client Events\ninterface BaseClientEvent {\n  event_id?: string;\n  type: ClientEventType;\n}\n\nexport interface SessionUpdateEvent extends BaseClientEvent {\n  type: 'session.update';\n  session: Partial<{\n    // GA fields\n    type?: 'realtime' | 'transcription'; // GA: session type\n    output_modalities?: Modality[]; // GA: renamed from modalities\n    audio?: RealtimeAudioConfig; // GA: nested audio config\n    max_output_tokens?: number | 'inf'; // GA: renamed from max_response_output_tokens\n    tracing?: TracingConfig | null; // GA: tracing config\n    reasoning?: Reasoning | null; // GA: reasoning config (gpt-realtime-2 only)\n    // Common fields\n    model: Model;\n    instructions: string;\n    tools: Tool[];\n    tool_choice: ToolChoice;\n    // Beta fields (kept for backward compatibility)\n    modalities: Modality[];\n    voice: Voice;\n    input_audio_format: LegacyAudioFormat;\n    output_audio_format: LegacyAudioFormat;\n    input_audio_transcription: InputAudioTranscription | null;\n    turn_detection: TurnDetectionType | null;\n    temperature: number;\n    max_response_output_tokens?: number | 'inf';\n    speed?: number;\n  }>;\n}\n\nexport interface TracingConfig {\n  enabled?: boolean;\n}\n\nexport interface InputAudioBufferAppendEvent extends BaseClientEvent {\n  type: 'input_audio_buffer.append';\n  audio: AudioBase64Bytes;\n}\n\nexport interface InputAudioBufferCommitEvent extends BaseClientEvent {\n  type: 'input_audio_buffer.commit';\n}\n\nexport interface InputAudioBufferClearEvent extends BaseClientEvent {\n  type: 'input_audio_buffer.clear';\n}\n\nexport interface UserItemCreate {\n  id: string;\n  type: 'message';\n  role: 'user';\n  content: (InputTextContent | InputAudioContent | InputImageContent)[];\n}\n\nexport interface AssistantItemCreate {\n  id: string;\n  type: 'message';\n  role: 'assistant';\n  content: TextContent[];\n}\n\nexport interface SystemItemCreate {\n  id: string;\n  type: 'message';\n  role: 'system';\n  content: InputTextContent[];\n}\n\nexport interface FunctionCallOutputItemCreate {\n  id: string;\n  type: 'function_call_output';\n  call_id: string;\n  output: string;\n}\n\nexport type ConversationItemCreateContent =\n  | UserItemCreate\n  | AssistantItemCreate\n  | SystemItemCreate\n  | FunctionCallOutputItemCreate;\n\nexport interface ConversationItemCreateEvent extends BaseClientEvent {\n  type: 'conversation.item.create';\n  previous_item_id?: string;\n  item: ConversationItemCreateContent;\n}\n\nexport interface ConversationItemTruncateEvent extends BaseClientEvent {\n  type: 'conversation.item.truncate';\n  item_id: string;\n  content_index: number;\n  audio_end_ms: number;\n}\n\nexport interface ConversationItemDeleteEvent extends BaseClientEvent {\n  type: 'conversation.item.delete';\n  item_id: string;\n}\n\nexport interface ResponseCreateEvent extends BaseClientEvent {\n  type: 'response.create';\n  response?: Partial<{\n    modalities: Modality[];\n    instructions: string;\n    voice: Voice;\n    output_audio_format: LegacyAudioFormat;\n    tools?: Tool[];\n    tool_choice: ToolChoice;\n    temperature: number;\n    max_output_tokens: number | 'inf';\n    metadata?: Record<string, string>;\n  }>;\n}\n\nexport interface ResponseCancelEvent extends BaseClientEvent {\n  type: 'response.cancel';\n  response_id?: string;\n}\n\nexport type ClientEvent =\n  | SessionUpdateEvent\n  | InputAudioBufferAppendEvent\n  | InputAudioBufferCommitEvent\n  | InputAudioBufferClearEvent\n  | ConversationItemCreateEvent\n  | ConversationItemTruncateEvent\n  | ConversationItemDeleteEvent\n  | ResponseCreateEvent\n  | ResponseCancelEvent;\n\ninterface BaseServerEvent {\n  event_id: string;\n  type: ServerEventType;\n}\n\nexport interface ErrorEvent extends BaseServerEvent {\n  type: 'error';\n  error: {\n    type: 'invalid_request_error' | 'server_error' | string;\n    code?: string;\n    message: string;\n    param: string;\n    event_id: string;\n  };\n}\n\nexport interface SessionCreatedEvent extends BaseServerEvent {\n  type: 'session.created';\n  session: SessionResource;\n}\n\nexport interface SessionUpdatedEvent extends BaseServerEvent {\n  type: 'session.updated';\n  session: SessionResource;\n}\n\nexport interface ConversationCreatedEvent extends BaseServerEvent {\n  type: 'conversation.created';\n  conversation: ConversationResource;\n}\n\nexport interface InputAudioBufferCommittedEvent extends BaseServerEvent {\n  type: 'input_audio_buffer.committed';\n  item_id: string;\n}\n\nexport interface InputAudioBufferClearedEvent extends BaseServerEvent {\n  type: 'input_audio_buffer.cleared';\n}\n\nexport interface InputAudioBufferSpeechStartedEvent extends BaseServerEvent {\n  type: 'input_audio_buffer.speech_started';\n  audio_start_ms: number;\n  item_id: string;\n}\n\nexport interface InputAudioBufferSpeechStoppedEvent extends BaseServerEvent {\n  type: 'input_audio_buffer.speech_stopped';\n  audio_end_ms: number;\n  item_id: string;\n}\n\nexport interface ConversationItemCreatedEvent extends BaseServerEvent {\n  type: 'conversation.item.created';\n  previous_item_id: string;\n  item: ItemResource;\n}\n\nexport interface ConversationItemAddedEvent extends BaseServerEvent {\n  type: 'conversation.item.added';\n  previous_item_id: string;\n  item: ItemResource;\n}\n\nexport interface ConversationItemInputAudioTranscriptionDeltaEvent extends BaseServerEvent {\n  type: 'conversation.item.input_audio_transcription.delta';\n  item_id: string;\n  content_index?: number;\n  delta?: string;\n}\n\nexport interface ConversationItemInputAudioTranscriptionCompletedEvent extends BaseServerEvent {\n  type: 'conversation.item.input_audio_transcription.completed';\n  item_id: string;\n  content_index: number;\n  transcript: string;\n  status?: 'in_progress' | 'completed' | string;\n}\n\nexport interface ConversationItemInputAudioTranscriptionFailedEvent extends BaseServerEvent {\n  type: 'conversation.item.input_audio_transcription.failed';\n  item_id: string;\n  content_index: number;\n  error: {\n    type: string;\n    code?: string;\n    message: string;\n    param: null;\n  };\n}\n\nexport interface ConversationItemTruncatedEvent extends BaseServerEvent {\n  type: 'conversation.item.truncated';\n  item_id: string;\n  content_index: number;\n  audio_end_ms: number;\n}\n\nexport interface ConversationItemDeletedEvent extends BaseServerEvent {\n  type: 'conversation.item.deleted';\n  item_id: string;\n}\n\nexport interface ResponseCreatedEvent extends BaseServerEvent {\n  type: 'response.created';\n  response: ResponseResource;\n}\n\nexport interface ResponseDoneEvent extends BaseServerEvent {\n  type: 'response.done';\n  response: ResponseResource;\n}\n\nexport interface ResponseOutputItemAddedEvent extends BaseServerEvent {\n  type: 'response.output_item.added';\n  response_id: string;\n  output_index: number;\n  item: ItemResource;\n}\n\nexport interface ResponseOutputItemDoneEvent extends BaseServerEvent {\n  type: 'response.output_item.done';\n  response_id: string;\n  output_index: number;\n  item: ItemResource;\n}\n\nexport interface ResponseContentPartAddedEvent extends BaseServerEvent {\n  type: 'response.content_part.added';\n  response_id: string;\n  item_id: string;\n  output_index: number;\n  content_index: number;\n  part: ContentPart;\n}\n\nexport interface ResponseContentPartDoneEvent extends BaseServerEvent {\n  type: 'response.content_part.done';\n  response_id: string;\n  item_id: string;\n  output_index: number;\n  content_index: number;\n  part: ContentPart;\n}\n\nexport interface ResponseTextDeltaEvent extends BaseServerEvent {\n  type: 'response.text.delta';\n  response_id: string;\n  item_id: string;\n  output_index: number;\n  content_index: number;\n  delta: string;\n}\n\nexport interface ResponseTextDoneEvent extends BaseServerEvent {\n  type: 'response.text.done';\n  response_id: string;\n  item_id: string;\n  output_index: number;\n  content_index: number;\n  text: string;\n}\n\nexport interface ResponseAudioTranscriptDeltaEvent extends BaseServerEvent {\n  type: 'response.audio_transcript.delta';\n  response_id: string;\n  item_id: string;\n  output_index: number;\n  content_index: number;\n  delta: string;\n  // Start time of this transcript segment in seconds (relative to audio output).\n  start_time?: number;\n}\n\nexport interface ResponseAudioTranscriptDoneEvent extends BaseServerEvent {\n  type: 'response.audio_transcript.done';\n  response_id: string;\n  output_index: number;\n  content_index: number;\n  transcript: string;\n}\n\nexport interface ResponseAudioDeltaEvent extends BaseServerEvent {\n  type: 'response.audio.delta';\n  response_id: string;\n  item_id: string;\n  output_index: number;\n  content_index: number;\n  delta: AudioBase64Bytes;\n}\n\nexport interface ResponseAudioDoneEvent extends BaseServerEvent {\n  type: 'response.audio.done';\n  response_id: string;\n  output_index: number;\n  content_index: number;\n}\n\nexport interface ResponseFunctionCallArgumentsDeltaEvent extends BaseServerEvent {\n  type: 'response.function_call_arguments.delta';\n  response_id: string;\n  output_index: number;\n  delta: string;\n}\n\nexport interface ResponseFunctionCallArgumentsDoneEvent extends BaseServerEvent {\n  type: 'response.function_call_arguments.done';\n  response_id: string;\n  output_index: number;\n  arguments: string;\n}\n\nexport interface RateLimitsUpdatedEvent extends BaseServerEvent {\n  type: 'rate_limits.updated';\n  rate_limits: {\n    name: 'requests' | 'tokens' | 'input_tokens' | 'output_tokens' | string;\n    limit: number;\n    remaining: number;\n    reset_seconds: number;\n  }[];\n}\n\nexport type ServerEvent =\n  | ErrorEvent\n  | SessionCreatedEvent\n  | SessionUpdatedEvent\n  | ConversationCreatedEvent\n  | InputAudioBufferCommittedEvent\n  | InputAudioBufferClearedEvent\n  | InputAudioBufferSpeechStartedEvent\n  | InputAudioBufferSpeechStoppedEvent\n  | ConversationItemCreatedEvent\n  | ConversationItemAddedEvent // GA: renamed from conversation.item.created\n  | ConversationItemInputAudioTranscriptionDeltaEvent\n  | ConversationItemInputAudioTranscriptionCompletedEvent\n  | ConversationItemInputAudioTranscriptionFailedEvent\n  | ConversationItemTruncatedEvent\n  | ConversationItemDeletedEvent\n  | ResponseCreatedEvent\n  | ResponseDoneEvent\n  | ResponseOutputItemAddedEvent\n  | ResponseOutputItemDoneEvent\n  | ResponseContentPartAddedEvent\n  | ResponseContentPartDoneEvent\n  | ResponseTextDeltaEvent\n  | ResponseTextDoneEvent\n  | ResponseAudioTranscriptDeltaEvent\n  | ResponseAudioTranscriptDoneEvent\n  | ResponseAudioDeltaEvent\n  | ResponseAudioDoneEvent\n  | ResponseFunctionCallArgumentsDeltaEvent\n  | ResponseFunctionCallArgumentsDoneEvent\n  | RateLimitsUpdatedEvent;\n"],"mappings":";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAIO,MAAM,cAAc;AACpB,MAAM,eAAe;AACrB,MAAM,gBAAgB;AACtB,MAAM,iBAAiB;AAEvB,MAAM,WAAW;","names":[]}