For the complete documentation index, see llms.txt. Markdown versions of documentation pages are available by appending .md to the page URL.
Navegación principal

Telefonía y SIP

Elige una conexión SIP o un puente de audio en la aplicación para las llamadas telefónicas.

Elige la API que usa tu aplicación. Cada API tiene sus propios mecanismos de autenticación y creación de sesiones, y su propio contrato de eventos.

Elige una conexión de telefonía

Una llamada telefónica puede llegar a GPT-Live a través de una troncal SIP o de una aplicación que retransmite audio. Elige la opción que se adapte a tu sistema telefónico actual y al lugar donde tu aplicación necesite procesar el audio.

ConexiónAudio y responsabilidades de la aplicación
SIP directoEl proveedor intercambia el audio de la llamada con OpenAI. Tu aplicación se encarga de los webhooks, la configuración de la sesión, las decisiones sobre la llamada y la lógica de negocio.
Puente de audio del servidorTu aplicación retransmite el audio del proveedor o de la sala a GPT-Live a través de WebSocket. Administra ambas conexiones, la traducción de eventos, la reproducción y el ciclo de vida de la llamada.

La conexión del proveedor con tu aplicación y la conexión de tu aplicación con OpenAI son independientes. Por ejemplo, una persona que llama puede unirse a una sala a través de SIP mientras un agente de esa sala se conecta a GPT-Live mediante WebSocket.

¿Usas Twilio, Telnyx, LiveKit o Daily/Pipecat? Consulta Integraciones con socios de GPT-Live para ver las guías específicas de cada proveedor.

SIP directo

SIP directo mantiene el audio de la llamada en la ruta de medios entre el proveedor y OpenAI. La señalización SIP usa TLS, y GPT-Live requiere SRTP para el audio de la llamada. Tu backend sigue siendo responsable de la decisión sobre la llamada entrante, la configuración de la sesión, la autorización y la lógica de negocio.

Usa una conexión de banda lateral cuando tu backend necesite recibir eventos de la sesión o enviar comandos. Esta se conecta a la conversación existente mientras SIP transporta el audio. Asigna un controlador a cada acción para que las entregas duplicadas de webhooks o los eventos observados en varias conexiones no ejecuten las herramientas dos veces.

Mantén el enrutamiento SIP y la configuración del proveedor junto con la integración que los usa. Los eventos de webhook, los identificadores de llamada y las cargas útiles de aceptación de Realtime pertenecen a la Realtime API; usa el contrato de GPT-Live para una sesión de Live.

Gestiona el ciclo de vida de la llamada

Antes de usar este flujo, confirma que la compatibilidad con SIP de GPT-Live esté habilitada para tu proyecto y que la troncal SIP de tu proveedor esté enrutada a ese proyecto. Las cargas útiles de webhook y de aceptación de Realtime que aparecen en la otra pestaña corresponden a un contrato de API diferente.

Recibe la llamada entrante

Configura el punto de acceso de webhook de tu proyecto para live.transport.incoming. Verifica la firma del webhook y elimina las entregas duplicadas antes de tomar una decisión sobre la llamada. Confirmar la recepción de una entrega no implica aceptar la llamada.

El webhook identifica una llamada SIP con data.type: "sip" y proporciona data.session_id. Usa ese ID de sesión sin modificarlo en cada acción de llamada de Live. Trata data.sip_headers como metadatos no confiables de quien llama, no como autorización.

Es posible que las integraciones existentes aún reciban el evento obsoleto live.call.incoming, que no tiene data.type. Durante la migración, maneja ambos nombres y conserva la suscripción anterior hasta que se hayan procesado todas las entregas y los reintentos del sistema anterior. La misma llamada pendiente también puede emitir un webhook de Realtime; asigna un solo controlador a la decisión de aceptar o rechazar, en lugar de aceptar a través de ambas API.

Acepta o rechaza la llamada

Aplica las reglas de autorización y enrutamiento de tu aplicación. Para aceptar la llamada, envía una solicitud POST /v1/live/sessions/{session_id}/accept autenticada con un objeto session de nivel superior:

{
  "session": {
    "type": "live",
    "model": "gpt-live-1",
    "instructions": "You are answering an inbound support call.",
    "audio": { "output": { "voice": "marin" } },
    "delegation": { "type": "client" }
  }
}

Usa Authorization: Bearer $OPENAI_API_KEY desde tu backend de confianza para las solicitudes de control de llamadas. Elige la voz y el modo de delegación al aceptar la llamada. SIP negocia el formato de audio, así que omite audio.format. El ejemplo selecciona la delegación al cliente; tu backend debe encargarse del trabajo delegado. Consulta Delegación y herramientas para ver las configuraciones de cliente y Responses.

Si la aceptación se completa correctamente, se devuelve 200 OK con un cuerpo vacío después de inicializar la sesión. Maneja los errores HTTP antes de considerar que la llamada se ha aceptado.

Para rechazar la llamada, envía POST /v1/live/sessions/{session_id}/reject con un código de estado SIP, como { "status_code": 486 } para indicar que está ocupado. El estado debe ser un número entero entre 300 y 699, inclusive. Prevalece la primera decisión de aceptar o rechazar; cualquier decisión posterior que compita con ella devuelve decision_already_made.

Conecta tu backend

Después de aceptar la llamada, conecta un WebSocket de banda lateral en wss://api.openai.com/v1/live/sessions/{session_id}/attach. Usa el ID de la sesión aceptada y la misma autenticación del proyecto y los mismos encabezados de conexión. No vuelvas a enviar session.start.

SIP transporta el audio de la llamada. Usa la conexión de banda lateral para las transcripciones, la delegación, las herramientas, los comandos y el audio reflejado. Elige un único responsable de cada efecto secundario, incluso si varias conexiones observan un evento.

Observa los eventos del teclado telefónico

La conexión de banda lateral recibe transport.dtmf.received cuando quien llama presiona una tecla y transport.dtmf.send después de que una herramienta alojada envía un tono correctamente. El campo event del evento contiene uno de los siguientes valores: 09, *, # o AD.

Estas son notificaciones para observadores, no comandos del cliente. No envíes transport.dtmf.send para solicitar un tono ni supongas que el canal de datos del navegador recibe eventos del teclado telefónico.

Transfiere o finaliza la llamada

Para transferir la llamada, envía POST /v1/live/sessions/{session_id}/refer con { "target_uri": "sip:agent@example.com" } para indicar el destino. Para colgar, envía POST /v1/live/sessions/{session_id}/hangup sin cuerpo de solicitud. Ambas operaciones devuelven 200 OK con un cuerpo vacío si se completan correctamente.

Mantén abierta la conexión de banda lateral para recibir los eventos finales y los datos de uso antes de liberar los recursos de la aplicación. Una solicitud de colgar completada correctamente o una desconexión inesperada no sustituyen a session.closed. Consulta Uso y cierre ordenado para obtener información sobre la finalización y los motivos de cierre.

Este flujo acepta llamadas entrantes. No se admite la creación de llamadas SIP salientes mediante POST /v1/live/sessions; usa la integración con socios correspondiente para las llamadas salientes gestionadas por el proveedor.

Puentes de audio del servidor

Usa la conexión WebSocket de GPT-Live cuando tu aplicación reciba un flujo de audio de un proveedor de telefonía o de un framework de agentes. La aplicación autentica ambas conexiones, traduce sus envoltorios de eventos y retransmite el audio en ambas direcciones.

GPT-Live admite audio sin procesar G.711 μ-law y A-law a 8 kHz a través de WebSocket. Cuando el flujo del proveedor usa el mismo códec, frecuencia de muestreo y número de canales, tu aplicación puede reenviar los bytes de audio sin procesar sin convertirlos a PCM. Conserva el orden del audio y usa el formato de mensaje requerido por cada conexión. Que los formatos de audio coincidan no hace que los dos protocolos de eventos sean intercambiables.

El puente también es responsable de todo el audio que pone en cola para reproducirlo. Incluye en el diseño de tu aplicación el almacenamiento en búfer del proveedor, las interrupciones y la finalización de la llamada. Consulta Administración de sesiones para conocer el ciclo de vida de las sesiones de Live y Migrar a GPT-Live para conocer los cambios en la gestión de turnos y el control de reproducción.

Conserva el identificador de llamada o de sala del proveedor junto con el ID de sesión de OpenAI para poder rastrear una conversación en ambos sistemas.

Próximos pasos con GPT-Live