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
Theme

Controles del lado del servidor

Controla las sesiones y ejecuta las herramientas privadas en tu servidor.

Elige la API que usas para ver los pasos de conexión y los eventos de sesión correspondientes.

Controla una sesión de GPT-Live desde tu servidor

Conecta el servidor de tu aplicación a una sesión existente de GPT-Live que use WebRTC o SIP cuando el servidor necesite recibir eventos de conversación, ejecutar herramientas privadas o actualizar la conversación. Esta segunda conexión se denomina WebSocket auxiliar. Ambas conexiones comparten una sesión, y WebRTC o SIP se encarga del transporte principal de audio.

El canal auxiliar transmite eventos y comandos. Tu aplicación se encarga de ejecutar las herramientas, verificar la autorización y aplicar las reglas de negocio. Guarda las claves de API y las credenciales de las herramientas en tu servidor.

Decide si necesitas un canal auxiliar

En aplicaciones de navegador, usa el canal de datos de WebRTC para mostrar subtítulos y actualizar la interfaz local. Usa un canal auxiliar cuando proceses la transcripción en tu servidor, por ejemplo, para aplicar controles de seguridad, analizar el sentimiento o hacer llamadas especulativas a herramientas. Tu servidor puede recibir eventos y controlar directamente esa misma sesión mientras el navegador sigue transmitiendo el audio por WebRTC. Consulta los ejemplos en Cómo reaccionar a los fragmentos de transcripción.

Si tu backend transmite audio por la conexión WebSocket principal, usa esa conexión para recibir eventos y enviar comandos.

La delegación en Responses también funciona sin un canal auxiliar. El navegador puede reenviar los eventos de llamada a función desde su canal de datos a un backend autenticado para que ejecute las funciones. Las herramientas alojadas por OpenAI se ejecutan a través del backend delegado sin necesidad de que la aplicación implemente un ejecutor de herramientas.

Conéctate a la sesión existente

  1. Guarda el ID de la sesión que controlará tu backend. Para WebRTC o una llamada SIP saliente, usa session.id de la respuesta JSON a POST /v1/live/sessions. Para llamadas SIP entrantes, primero acepta la llamada entrante y luego usa data.session_id de su webhook. Guarda el ID junto con el registro del usuario y de la conversación en tu aplicación.

  2. Abre una conexión WebSocket desde tu servidor con la siguiente URL. Sustituye el marcador por el ID guardado, sin modificarlo. Autentícate con Authorization: Bearer $OPENAI_API_KEY usando las credenciales del proyecto que creó o aceptó la sesión. Incluye los mismos encabezados de conexión que se requieren al crear la sesión.

    wss://api.openai.com/v1/live/sessions/{session_id}/attach
  3. Recibe eventos y envía comandos por el socket conectado a la sesión. La sesión ya está en curso. No vuelvas a enviar session.start.

Usa el ID de sesión sin modificarlo, incluido el prefijo, y verifica que tu aplicación tenga autorización para acceder a esa sesión.

Observa eventos y envía comandos

Tarea Eventos o comandos
Seguir la conversación Recibe deltas de las transcripciones del usuario y del asistente, eventos de delegación y eventos anidados de Responses.
Actualizar la configuración del backend Usa session.update para cambiar los ajustes compatibles con el modo de delegación actual. Los ajustes iniciales, como el modelo del frontend y la configuración de audio, permanecen fijos.
Proporcionar contexto Usa session.instructions.append para agregar instrucciones, session.thinking.append para aportar contexto que no se expresa en voz alta y session.commentary.append para agregar novedades que el asistente pueda comunicar en voz alta.
Devolver resultados de herramientas Si usas la delegación en Responses, envía response.item.create y luego response.create para continuar el trabajo en el backend.
Controlar la entrada del micrófono Usa session.input_audio.mute y session.input_audio.unmute. Silenciar la entrada no detiene la salida del asistente.
Finalizar la sesión Envía session.close y espera a recibir session.closed antes de desconectarte.

Los comandos siguen las mismas reglas de validación y delegación que en la conexión principal. Al agregar contexto general a la sesión, usa delegation_id: null. Si el ID no es nulo, debe identificar una delegación existente del cliente. Consulta Delegación y herramientas para ver cómo configurar la delegación y ejecutar funciones, así como ejemplos de cómo agregar contexto.

En las sesiones de navegador, mantén la entrada del micrófono y la salida de los altavoces en la pista multimedia negociada mediante WebRTC. Usa el canal auxiliar para recibir eventos de conversación y controlar la sesión, y haz el seguimiento de la reproducción en tu reproductor de audio.

Recibe copias del audio

Una vez conectado, el canal auxiliar también recibe copias del audio de entrada y salida que se transmite a partir de ese momento. La conexión principal sigue transportando el audio en vivo.

Evento Campo de audio Información temporal
session.input_audio.append audio Sin marcas de tiempo.
session.output_audio.delta delta start_ms y end_ms indican el intervalo que ocupa el audio de salida en la línea de tiempo de la sesión.

Ambas cargas útiles contienen audio PCM16LE mono sin procesar a 24 kHz, codificado en base64, independientemente del formato de audio del transporte principal. Ninguno de los eventos tiene un event_id. La copia del audio de entrada contiene el audio recibido antes de silenciar la entrada. Recibirla no confirma que el modelo haya procesado esas muestras. Los intervalos del audio de salida copiado pueden presentar discontinuidades si se descartan tramas y no indican cuándo escuchó el audio la persona que llamó.

Envía el audio del micrófono únicamente por la conexión principal. Usa el canal auxiliar para recibir las copias del audio.

Asigna un solo responsable a cada acción

Decide si el navegador o el backend se encargará de cada acción. Si ambas conexiones reciben un evento de llamada a función, ejecuta la función una sola vez. Aplica la misma regla a las actualizaciones de contexto y a las solicitudes para continuar el trabajo en el backend.

Conecta el backend lo antes posible si necesita observar la conversación desde el inicio. Guarda las transcripciones y el estado de las herramientas en tu aplicación, incluido el historial recopilado antes de la conexión.

El navegador puede seguir recibiendo eventos de sesión mientras el canal auxiliar está conectado. Mantén las credenciales sensibles de las herramientas y las decisiones de autorización en tu backend, y devuelve solo el contexto necesario para la conversación.

Aplica controles de seguridad a la conversación

Usa la conexión WebSocket principal de tu servidor o el canal auxiliar para monitorear la conversación y verificar que las solicitudes cumplan las políticas de tu aplicación. Tu aplicación realiza las verificaciones, bloquea las acciones afectadas y envía instrucciones correctivas cuando detecta un problema.

Ejecuta las verificaciones mientras continúa la conversación

Al procesar los fragmentos de transcripción a medida que llegan, puedes aplicar controles de seguridad. Con el mismo flujo puedes iniciar una consulta especulativa o actualizar la interfaz mientras se ejecutan las verificaciones.

  1. Monitorea las transcripciones. Acumula los fragmentos de session.input_transcript.delta para detectar intentos de jailbreak, información sensible o infracciones de las políticas en las solicitudes del usuario. Usa session.output_transcript.delta para detectar afirmaciones sin fundamento o respuestas fuera del alcance de tu aplicación en lo que dice el asistente. Mantén cada verificación asociada con la transcripción y la solicitud de la aplicación que evaluó.
  2. Ejecuta las verificaciones en paralelo. Un modelo rápido y ligero puede evaluar las solicitudes mientras continúa la conversación. Devuelve un resultado estructurado breve, como {"triggered": true}, que tu aplicación pueda usar para decidir cómo actuar. Ejecuta las acciones que requieren aprobación solo después de que superen las verificaciones. Mantenlas bloqueadas si alguna verificación falla o excede el tiempo de espera.
  3. Bloquea las acciones afectadas. Cuando se active un control de seguridad, marca la solicitud como bloqueada en el estado de la aplicación. Consulta ese estado antes de ejecutar una herramienta o confirmar un cambio, incluso si el trabajo ya está en cola.
  4. Detén el trabajo relacionado. Cancela las tareas que gestiona tu aplicación si el backend admite su cancelación, y descarta los resultados tardíos de las solicitudes bloqueadas o reemplazadas. Si usas la delegación en Responses, deja de ejecutar las funciones personalizadas afectadas y no envíes response.create para continuar el trabajo bloqueado. Esto no cancela una respuesta alojada que ya esté en curso ni detiene la voz del frontend.
  5. Registra la decisión y reorienta la conversación. Registra la decisión junto con los ID de la solicitud y de la delegación afectadas, y luego envía una instrucción correctiva.

Consulta Deltas de transcripción para recopilar fragmentos y Delegación y herramientas para que los resultados del backend correspondan a la tarea actual.

Reorienta la conversación

Usa session.instructions.append para reorientar la conversación cuando se active un control de seguridad. Este comando puede interrumpir al asistente mientras habla y aplicar una nueva instrucción. Por ejemplo, después de que tu aplicación bloquee una solicitud, envía lo siguiente:

export function sendUpdate(connection) {
  connection.send({
    type: "session.instructions.append",
    event_id: "guardrail_block_17",
    delegation_id: null,
    content:
      "Stop speaking immediately. Do not continue or act on the last request. Refuse briefly, then wait.",
  });
}

Asegúrate de que tu aplicación redacte la instrucción. No copies en ella texto no confiable del usuario como si fuera una instrucción. Usa delegation_id: null para aplicar esta corrección a toda la sesión y limita content a un máximo de 500 tokens.

Asocia el evento session.instructions.appended con tu comando mediante client_event_id. La confirmación llega después del momento estimado de incorporación del contexto. Para impedir que el audio llegue a la persona que llamó, usa los controles de reproducción que se describen a continuación.

Usa instrucciones también para los avisos que deban comunicarse en voz alta con una formulación específica. Consulta Cómo comunicar un aviso para ver un ejemplo y algunas consideraciones sobre la reproducción.

Controla la reproducción cuando sea necesario

Si tu aplicación necesita bloquear el audio del modelo, controla la reproducción en el cliente o en el retransmisor multimedia. Silencia o descarta temporalmente la salida, descarta el audio en la cola local y envía la instrucción correctiva. Después de eliminar el audio que ya no corresponde, reanuda la reproducción según la política de recuperación de tu aplicación. La confirmación de la instrucción no indica que debas reanudarla. El canal auxiliar por sí solo no controla la reproducción, y las instrucciones correctivas no pueden retirar el audio que la persona que llamó ya escuchó.

session.input_audio.mute controla la entrada del micrófono de la persona que llamó. No silencia la salida del modelo ni cancela el trabajo delegado.

Verifica lo que dice el asistente antes de reproducirlo

En la mayoría de las aplicaciones, monitorea las transcripciones del usuario y del asistente mientras continúa la conversación. Cuando se active un control de seguridad, tu aplicación podrá bloquear las acciones afectadas o enviar instrucciones correctivas.

Si tu aplicación necesita verificar lo que dice el asistente antes de reproducirlo, almacena temporalmente el audio en el búfer del reproductor o del puente multimedia antes de enviarlo a la persona que llamó. Sigue recibiendo eventos de audio y de transcripción mientras se ejecuta la verificación, y lee las transcripciones independientemente de la reproducción.

  1. Recopila el audio y su transcripción. Implementa la detección de actividad de voz (VAD) en la salida de tu aplicación o usa una puerta de ruido que ofrezca tu framework multimedia para identificar posibles segmentos de voz. GPT-Live no proporciona un detector de actividad de voz ni una puerta de ruido en la salida para este flujo de trabajo. Espera a recibir la transcripción necesaria para verificar cada segmento.
  2. Habilita la reproducción del audio aprobado. Cuando un segmento supere la verificación, agrega el audio original de ese segmento, almacenado en el búfer, a la cola de reproducción. Si la verificación falla, falta la transcripción o se excede el tiempo de espera, descarta el segmento y usa una alternativa segura definida por tu aplicación.
  3. Gestiona las interrupciones. Asocia el audio, la transcripción, el resultado de la verificación y el estado de reproducción con un ID generado por tu aplicación. Si una interrupción cancela ese segmento de voz, elimina su audio del búfer y de la cola, e ignora cualquier aprobación posterior del segmento.

Una pausa puede delimitar un posible segmento de voz aunque el modelo aún esté formulando la respuesta. Si tu política exige verificar la respuesta completa, define cómo determinará tu aplicación que la respuesta ha terminado. La detección de actividad de voz por sí sola no basta para determinarlo.

El almacenamiento en búfer agrega latencia. Lo que el asistente dijo permanece en el contexto de conversación del modelo aunque descartes el audio. Por eso, prueba cómo continúa la conversación después de omitir un segmento de audio o de usar una alternativa segura.

Prueba la intervención

Prueba solicitudes permitidas y bloqueadas, falsos positivos, verificaciones lentas o fallidas y resultados tardíos de tareas canceladas. Prueba también qué ocurre si se activa un control mientras el asistente habla o mientras se ejecuta una herramienta. Verifica por separado el bloqueo de acciones, el estado de la aplicación, lo que dice el asistente para corregir la situación y el audio que se reproduce. Si controlas la salida, incluye en la prueba el audio en cola y la recuperación. Usa la guía del Cookbook para evaluar agentes de voz para comparar el éxito de las tareas y el tiempo de respuesta por voz.

Cierra la sesión de forma ordenada

Sigue recibiendo eventos mientras las herramientas terminan de ejecutarse y la sesión informa del uso final. Registra el manejador de session.closed antes de enviar session.close, y mantén abiertos la conexión WebRTC, el canal de datos y el canal auxiliar hasta que termine el trabajo pendiente. Antes de liberar los recursos, guarda los datos de uso finales de la sesión y los datos de uso del backend que hayas recibido en eventos de Responses. Si la conexión falla antes de que llegue el evento final, registra el cierre como incompleto. Consulta la secuencia de cierre en Gestión de sesiones.