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

Delegación y herramientas en GPT-Live

Conecta un agente de backend y devuelve resultados verificados a la conversación en vivo.

GPT-Live delega el razonamiento y el uso de herramientas a un backend mientras gestiona la conversación hablada. El trabajo del backend puede ejecutarse mediante el modelo de Responses configurado o, con la delegación al cliente, mediante cualquier modelo, agente o servicio que opere tu aplicación. En ambos modos, tu aplicación se encarga de los permisos, las confirmaciones, los registros del negocio y el estado de las tareas.

Obtén más información sobre cómo orientar al modelo en vivo para la delegación y el uso de herramientas en la guía de diseño de prompts.

Elegir un modo de delegación

Con la delegación a Responses, GPT-Live llama al modelo de Responses que elijas, proporciona el contexto de la conversación y devuelve los resultados del backend a la conversación en vivo. Con la delegación al cliente, tu aplicación prepara el contexto, ejecuta un agente o un flujo de trabajo y envía los resultados a GPT-Live.

Empieza con la delegación a Responses si su flujo de trabajo administrado se ajusta a tus necesidades. Elige la delegación al cliente cuando necesites más control sobre el contexto del backend, la ejecución o los resultados que se devuelven a GPT-Live.

Aspecto a considerarPrefiere la delegación a Responses cuando…Prefiere la delegación al cliente cuando…
Esfuerzo de implementaciónQuieres que GPT-Live prepare las solicitudes al backend, gestione las conexiones y devuelva los resultados a la conversación.Quieres desarrollar y operar esos componentes por tu cuenta.
Revisión de los resultados del backendLa salida del backend puede volver directamente a GPT-Live.Tu aplicación debe validar los resultados, ocultar información, combinarlos o descartarlos antes de que lleguen a GPT-Live.
Capacidades del backendTu flujo de trabajo se ajusta a la configuración y las herramientas de Responses que admite GPT-Live.Necesitas otro backend, varios modelos o capacidades de la API que van más allá de la configuración administrada.
Control del contextoEl contexto de conversación que proporciona GPT-Live se ajusta a tu aplicación.Necesitas elegir exactamente qué historial, memoria y estado de la aplicación recibe cada solicitud al backend.
Política de ejecuciónUn ciclo configurado de modelo y herramientas se ajusta a la tarea.Necesitas enrutamiento personalizado entre código y modelos, alternativas de respaldo, puntos de control o presupuestos para los distintos pasos del backend.

Por ejemplo, un asistente de viajes puede enviar preguntas sobre el estado de un vuelo a un servicio de la aerolínea y cambios de itinerario a un agente de planificación independiente. La aplicación elige a qué backend llamar y qué resultado verificado devolver a GPT-Live.

En ambos modos, tu aplicación gestiona el estado de las tareas y hace cumplir los permisos y las confirmaciones requeridas antes de ejecutar sus herramientas personalizadas. Revisar los resultados del backend es una decisión independiente: no implica aprobar cada palabra que dice GPT-Live ni garantiza que permanezca en silencio durante la validación. Consulta Controlar la reproducción cuando sea necesario.

La delegación al cliente también requiere que tu aplicación mantenga el contexto de la conversación. El evento de delegación contiene metadatos, no el texto de la tarea; usa los eventos de transcripción y el estado de la aplicación para preparar la solicitud al backend.

Compara la latencia, el éxito de las tareas y el costo con tu propia carga de trabajo al evaluar tu agente de voz. Para obtener orientación específica para tu arquitectura actual, consulta Migrar a GPT-Live.

Elige el modo al crear la sesión; para cambiar de modo, inicia una sesión nueva.

Modo de delegación

Configurar la delegación a Responses

Agrega esta configuración de delegación al crear tu sesión de Live. Elige el modelo de Responses de forma independiente del modelo de voz:

export const session = {
  model: "gpt-live-1",
  delegation: {
    type: "responses",
    responses: {
      model: "gpt-5.6-terra",
      instructions: "[Your backend prompt]",
    },
  },
};

Empieza con GPT-5.6 Terra o prueba GPT-5.6 Luna para cargas de trabajo en las que el costo sea un factor clave. Compara la calidad de las respuestas y la latencia en tus tareas antes de elegir un modelo para el backend.

Registra las herramientas compatibles en delegation.responses.tools. Usa delegation.responses.tool_choice para controlar qué herramientas puede usar el backend: "auto" le permite elegir, "required" exige una llamada a una herramienta y "none" la impide. También puedes seleccionar una función por su nombre. Establece delegation.responses.parallel_tool_calls en true para permitir consultas independientes simultáneas, o en false cuando las llamadas deban ejecutarse de forma secuencial. Tu aplicación sigue ejecutando sus funciones personalizadas y haciendo cumplir las dependencias y las aprobaciones. Estas opciones no obligan al modelo en vivo a delegar.

La configuración de Responses requiere un model para el backend al momento de la creación. Admite definiciones de function y entradas de web_search en tools. También ofrece max_output_tokens (al menos 16 si se establece), service_tier y las opciones de reasoning y text compatibles con el modelo de backend seleccionado. Consulta Reducir la latencia del backend para conocer las opciones que puedes ajustar.

Si el Modo rápido está disponible para tu modelo y proyecto, considera usarlo para llamadas sensibles a la latencia. En GPT-Live, selecciónalo con delegation.responses.service_tier: "priority".

A medida que cambie la conversación, envía session.update con cambios en session.delegation.responses para actualizar el modelo del backend, las instrucciones, las herramientas disponibles, tool_choice u otras opciones compatibles sin iniciar una nueva sesión de Live. Las opciones omitidas conservan sus valores. Establecer delegation en null selecciona el modo de cliente y no permite restablecer una sesión de Responses en ejecución; cambiar de modo falla con immutable_field_update.

Estas opciones usan conceptos conocidos de Responses, pero Live admite solo un subconjunto de la API Responses independiente. Live proporciona el contexto de la conversación e inicia el trabajo delegado. Configura el backend a través de la sesión; el comando response.create de Live usa esa configuración y no acepta el cuerpo de una solicitud independiente de Responses.

Dirigir la conversación en vivo desde tu aplicación

La delegación a Responses gestiona el flujo de trabajo del backend, pero tu aplicación puede seguir enviando contexto directamente al modelo GPT-Live. Si supervisas la llamada mediante un WebSocket de canal auxiliar o la conexión principal de eventos, puedes usar session.instructions.append, session.thinking.append o session.commentary.append con delegation_id: null. Por ejemplo, una medida de protección basada en la transcripción puede agregar una instrucción para redirigir la conversación. Esto orienta al modelo en vivo; no cambia el prompt del backend de Responses ni cancela el trabajo que ya está en curso.

Gestionar la delegación a Responses

Para el trabajo que usa Responses como backend, session.delegation.created contiene target: "responses" y un response_id. Los eventos posteriores de Responses llegan dentro de una envoltura response.event:

{
  "type": "response.event",
  "event_id": "event_response_1",
  "delegation_id": "item_9tA2cB6n2V8c4X1z7Q5r9",
  "event": {
    "type": "response.output_text.delta",
    "sequence_number": 4,
    "item_id": "msg_123",
    "output_index": 0,
    "content_index": 0,
    "delta": "The forecast is",
    "logprobs": []
  }
}

Dirige cada evento al controlador correspondiente según envelope.event.type y conserva el delegation_id externo. No trates todos los valores response.* de nivel superior como eventos de Responses sin envoltura. Admite eventos anidados adicionales del ciclo de vida de Responses.

El habla en vivo y el trabajo delegado continúan de forma independiente. Una respuesta completada del backend no significa por sí sola que el usuario haya escuchado la respuesta. Usa la transcripción y el audio de salida de Live para la parte hablada de la interacción.

Completar una llamada a una función que el cliente puede ejecutar

Lee las llamadas a funciones completadas en los eventos anidados response.output_item.done. El elemento de función finalizado contiene call_id, name y arguments; un evento de finalización de argumentos por sí solo no basta para identificar la llamada.

Registra el ID de respuesta del evento anidado response.created junto con el delegation_id externo y recopila las llamadas a funciones de esa respuesta a partir de response.output_item.done. Las instantáneas reenviadas del ciclo de vida contienen deliberadamente response.output: [], incluso en response.completed; su arreglo tools está vacío, instructions es null y se omite input. Una lista de salida vacía al finalizar no significa que no haya llamadas a funciones pendientes. Usa las llamadas recopiladas para determinar qué resultados deben enviarse antes de continuar.

Después de ejecutar la operación autorizada, agrega el resultado como un elemento de Responses:

export function sendUpdate(connection) {
  connection.send({
    type: "response.item.create",
    event_id: "tool_result_1",
    item: {
      type: "function_call_output",
      call_id: "call_123",
      output: '{"status":"confirmed","order_id":"order_123"}',
    },
  });
}

Luego, continúa la respuesta de forma explícita:

export function sendUpdate(connection) {
  connection.send({
    type: "response.create",
    event_id: "continue_1",
  });
}

Envía todos los resultados requeridos para las llamadas a herramientas pendientes antes de continuar. Agregar el resultado de una función no continúa la respuesta automáticamente. response.item.create no tiene una confirmación de éxito independiente; sigue procesando los errores y los eventos anidados posteriores del ciclo de vida de la respuesta.

response.create es un comando de Live para crear o continuar trabajo delegado a Responses mediante el backend configurado en la sesión. No adjuntes a este evento un cuerpo de creación de la API Responses, una anulación del modelo del backend ni delegation_id. Ambos comandos requieren delegación a Responses.

Partir del prompt actual de tu backend

Usa el prompt actual de tu agente de texto como punto de partida. Mantén sus instrucciones de tarea y reglas de negocio en el backend, y adapta las instrucciones que presuponen un chat de texto o el control directo del habla. Explica cómo manejar las transcripciones de voz y devolver resultados útiles. Haz cumplir los permisos y las confirmaciones requeridas en tu aplicación.

## Voice conversation context
You are helping an assistant in a live voice conversation. Transcripts
can contain mistakes, unfinished phrases, and later corrections. Use
the latest context and verified records. If a needed detail is still
unclear, ask for that detail instead of guessing.

## Task instructions
[Your task instructions, business rules, available tools,
and confirmation requirements.]

## Return the result
Return the relevant facts, whether the task is complete, and what comes next.
Use confirmed values. Do not invent a successful action.

Mantén en el backend las cargas de datos estructurados de gran tamaño, los resultados extensos de las herramientas y el Markdown destinado a mostrarse en pantalla. Proporciona a GPT-Live los datos relevantes y deja que elija cómo expresarlos. Un resultado conciso de una herramienta no necesita una llamada adicional al modelo para adaptarlo al habla.

Con la delegación al cliente, devuelve el resultado directamente a GPT-Live. Con la delegación a Responses, sigue el flujo de resultados de funciones para continuar el trabajo del backend.

Los siguientes ejemplos de eventos del SDK usan connection, una conexión WebSocket principal de Live o una conexión auxiliar ya establecida según las guías de conexión. Llama a la función auxiliar después de session.started en una conexión principal; una conexión auxiliar adjunta ya pertenece a una sesión en ejecución.

Enviar el tipo de actualización adecuado

Elige un evento según cómo deba usar GPT-Live el contenido:

Qué quieres enviarEvento
Instrucciones de nivel de sistema para el modelo en vivo, como un saludo, un aviso informativo o una indicación para que deje de hablarsession.instructions.append
Información para el razonamiento interno que no se dice en voz alta al agregarla, pero puede usarse para responder preguntas pertinentes del usuariosession.thinking.append
Información que el modelo debe decir en voz alta, parafraseando el texto agregadosession.commentary.append

Los tres usan content como cadena simple, con un límite de 500 tokens por adición. Incluye delegation_id: usa el ID original de la delegación al cliente para una actualización sobre esa tarea, o null para el contexto general de la sesión. Un ID no nulo debe identificar una delegación al cliente conocida. Las instrucciones siguen aplicándose a la sesión en vivo; un ID no las convierte en un prompt independiente para el backend.

Una instrucción agregada puede interrumpir el habla o el comportamiento actual del modelo. Úsala cuando la aplicación necesite redirigir la conversación; aplica cualquier bloqueo relacionado de herramientas o acciones en el estado de la aplicación.

Para informar del progreso sin hablar durante una tarea gestionada por el cliente:

export function sendUpdate(connection) {
  connection.send({
    type: "session.thinking.append",
    event_id: "availability_progress",
    delegation_id: "item_123",
    content: "Checking Thursday availability. No appointment has been booked.",
  });
}

Para una reserva confirmada, envía el resultado que el usuario debe escuchar:

export function sendUpdate(connection) {
  connection.send({
    type: "session.commentary.append",
    event_id: "appointment_result",
    delegation_id: "item_123",
    content: "Your appointment is confirmed for Thursday at 2:00 PM",
  });
}

Envía ese resultado solo después de que la reserva se haya realizado correctamente. Para una instrucción que se aplique a toda la sesión, usa session.instructions.append con delegation_id: null.

Por ejemplo, después de que tu aplicación bloquee una solicitud mediante sus medidas de protección, puedes redirigir la conversación:

export function sendUpdate(connection) {
  connection.send({
    type: "session.instructions.append",
    event_id: "guardrail_block_17",
    delegation_id: null,
    content:
      "Stop speaking about that request. Briefly explain that you cannot help with it, then wait for the user.",
  });
}

La instrucción no cancela el trabajo del backend. Bloquea la acción afectada y gestiona cualquier trabajo que ya esté en ejecución en tu aplicación.

Los acuses de recibo correspondientes son session.thinking.appended, session.commentary.appended y session.instructions.appended. Asocia su client_event_id con el event_id que enviaste. El acuse de recibo espera hasta el momento estimado de incorporación del contexto, no hasta que termine el habla o la reproducción. Consulta cuándo llega el contexto al modelo para obtener información sobre los tiempos y el manejo de errores.

El contexto que no se dice en voz alta puede influir en lo que el modelo diga después. No es un espacio privado para secretos ni razonamiento oculto. Envía datos útiles y resúmenes breves del progreso.

Mantener las actualizaciones precisas y útiles

Durante las tareas más largas, envía una actualización cuando haya un cambio relevante: se complete un paso, una demora sea significativa o el usuario deba responder una pregunta.

Usa session.thinking.append para informar del progreso en segundo plano en el modo de cliente. Usa session.commentary.append cuando sea útil decir la actualización en voz alta.

Para las actualizaciones habladas, envía session.commentary.append con contenido que coincida con el estado verificado de la tarea:

EstadoContenido de ejemplo
En curso“I'm checking the available appointments.”
Completada“You're booked for Thursday at 2:00 PM.”
Fallida“That time is no longer available.”
Cancelación confirmada“Your appointment has been canceled.”

Una interrupción hablada no cancela automáticamente el trabajo del backend. Si el usuario cambia el viernes por el jueves, actualiza la tarea activa e ignora los resultados para el viernes que lleguen tarde. Tu aplicación debe decidir si cancela el trabajo, lo modifica o deja que termine. Verifica que la cancelación se haya realizado correctamente antes de afirmarlo.

Antes de reintentar una llamada a una herramienta que falló, verifica si la acción original ya se realizó. Por ejemplo, la pérdida de una respuesta no debe provocar una segunda reserva. Si el resultado no está claro, indícalo y ofrece el siguiente paso útil.

Compartir el contexto de la interfaz

Proporciona a GPT-Live un resumen conciso de la página o tarea actual, las selecciones relevantes y los datos que ayuden a interpretar referencias como “esta opción”. Crea el resumen directamente a partir del estado de la aplicación; no hace falta una llamada adicional al modelo para darle formato.

Envía el contexto de la interfaz al iniciar la sesión y cuando cambie algún estado relevante. Omite las actualizaciones sin cambios y combina los cambios rápidos en un resumen breve del estado más reciente. Indica explícitamente los cambios en las selecciones anteriores:

  • Contexto inicial: “The user is reviewing a restaurant reservation: August 6 at 7 PM, two guests. No reservation has been made.”
  • Corrección: “The selected time is now 8 PM; the previous selection was 7 PM.”

En cualquiera de los modos de delegación, usa session.thinking.append con delegation_id: null para las actualizaciones de contexto en segundo plano. Mantén el HTML completo, los árboles DOM, las cargas JSON de gran tamaño y los registros de interacción en tu aplicación o backend. Trata el contenido de la página como datos de referencia, no como instrucciones.

Aceptar datos ingresados por escrito

Si la persona que llama escribe un valor exacto, como un número de pedido, pásalo al backend que gestiona la tarea. Una aplicación que solo usa voz no necesita este flujo. Trata el valor escrito como un dato del usuario, no como una instrucción para el modelo en vivo.

Con la delegación a Responses, pon en cola un mensaje del usuario para el backend:

export function sendUpdate(connection) {
  connection.send({
    type: "response.item.create",
    event_id: "typed_order_number",
    item: {
      type: "message",
      role: "user",
      content: [
        {
          type: "input_text",
          text: "My order number is A0042.",
        },
      ],
    },
  });
}

Envía response.create cuando estés listo para ejecutar o continuar el trabajo del backend. Si está esperando resultados de funciones, devuelve primero todos los resultados requeridos. Poner texto en cola no cancela por sí solo el trabajo que ya está en ejecución.

Agrega imágenes y contexto visual

Para ayudar a una persona que llama a conversar sobre una foto o pantalla, envía la imagen y el contexto relevante de tu aplicación a un backend con capacidad de visión. El backend interpreta la imagen y devuelve texto relevante para que GPT-Live lo use en la conversación. El frontend de audio de Live no acepta imágenes directamente.

Con la delegación a Responses, configura un modelo de backend con capacidad de visión. Pon en cola un elemento de entrada de imagen compatible con Responses mediante response.item.create y luego envía response.create para ejecutar o reanudar el trabajo del backend. Devuelve todos los resultados de funciones pendientes requeridos antes de continuar. Consulta Gestiona la delegación a Responses.

Mantén la entrada de imágenes del backend separada de session.input, que proporciona el historial de texto inicial al frontend de Live al iniciarse. Consulta Imágenes y visión para conocer los formatos de imagen compatibles y las limitaciones del modelo.

Reduce la latencia del backend

Reduce el tiempo entre una solicitud de trabajo al backend y un resultado útil para la conversación. Mide la latencia en cada etapa para localizar las demoras. Compara el tiempo hasta obtener una respuesta hablada útil y el éxito de las tareas en los mismos escenarios, y consulta el Cookbook de evaluación de agentes de voz para obtener orientación sobre la evaluación.

Delegación a Responses

Live gestiona conexiones WebSocket persistentes con Responses, prepara de antemano la conexión y la configuración conocida de la solicitud, y reutiliza el estado de respuestas anteriores cuando está disponible. No necesitas implementar esos pasos para el backend alojado. La reutilización depende de la conexión activa y de que el estado sea compatible; no garantiza un acierto de caché ni una latencia específica.

Ajusta el backend mediante delegation.responses:

  • model: elige el modelo que se encarga del razonamiento y la selección de herramientas de forma independiente del modelo de voz.
  • reasoning.effort: equilibra el tiempo de razonamiento y la calidad de la tarea con valores compatibles con ese modelo.
  • service_tier: usa auto, default, flex o priority, según la compatibilidad del modelo y el acceso del proyecto. auto sigue la configuración del proyecto. Evalúa el rendimiento y el costo del nivel que elijas.

Actualiza los ajustes compatibles durante la sesión con session.update. Tus herramientas personalizadas siguen ejecutándose en tu aplicación, por lo que las llamadas lentas a servicios, las colas y el almacenamiento en búfer de los resultados de herramientas pueden retrasar la respuesta incluso cuando Live gestiona la conexión con Responses. Devuelve cada resultado de herramienta requerido sin demora y continúa la respuesta del backend.

Reacciona a los fragmentos de transcripción

Procesar fragmentos de transcripción en tu aplicación es opcional y funciona con cualquiera de los dos modos de delegación. Los fragmentos de transcripción del usuario y del asistente llegan a través de WebSocket o del canal de datos de WebRTC. Puedes procesarlos con la lógica de la aplicación o con un modelo ligero para iniciar el trabajo antes de que llegue un evento de delegación, o usar la propia transcripción para activar trabajo gestionado por la aplicación.

Usa este patrón para:

  • Reducir la espera. Inicia una consulta especulativa cuando haya suficiente información disponible; por ejemplo, consulta la disponibilidad mientras el usuario sigue describiendo sus preferencias.
  • Aplicar medidas de protección. Revisa la transcripción a medida que crece para detectar solicitudes o respuestas que requieran intervención. Consulta Aplica medidas de protección a la conversación.
  • Adaptar la conversación. Busca expresiones que sugieran confusión o frustración y luego ajusta la experiencia o envía una instrucción específica.
  • Actualizar la interfaz. Resalta los controles relevantes, completa los campos sugeridos o muestra los resultados a medida que estén disponibles.

En las aplicaciones de navegador, usa el canal de datos de WebRTC para los subtítulos y las actualizaciones locales de la interfaz. Cuando el procesamiento de transcripciones se ejecute en tu servidor, ya sea para aplicar medidas de protección, realizar comprobaciones con modelos ligeros o hacer llamadas especulativas a herramientas, usa una conexión WebSocket de canal lateral para recibir eventos y dirigir la misma sesión de GPT-Live directamente.

Procesa el texto acumulado cuando llegue información nueva relevante. Un fragmento puede estar incompleto, y lo que se diga después puede cambiar la solicitud. Descarta los resultados desactualizados, coordina el trabajo con las tareas delegadas posteriores para evitar acciones duplicadas y aplica tus comprobaciones habituales de permisos y confirmaciones antes de realizar acciones con consecuencias.

Para incorporar información de vuelta a la conversación:

IntenciónEvento
Cambiar el comportamiento del modelo en vivo o redirigir la conversaciónsession.instructions.append
Proporcionar contexto para respuestas posteriores sin que se diga en voz altasession.thinking.append
Proporcionar información que el modelo deba decir en voz altasession.commentary.append

Para las actualizaciones ajenas a una delegación al cliente, usa delegation_id: null. Estas adiciones dirigen el modelo en vivo; tu aplicación controla los cambios de la interfaz, la ejecución de herramientas y la cancelación. Consulta Envía el tipo de actualización adecuado para ver ejemplos de adiciones.

Optimizaciones compartidas

Ambos modos de delegación se benefician de las mismas mejoras del backend:

  • Elige el modelo y el esfuerzo de razonamiento adecuados para la tarea. Compara configuraciones que cumplan tus requisitos de precisión. Usa un esfuerzo de razonamiento menor cuando permita completar la tarea de forma confiable.
  • Mantén las respuestas concisas. Devuelve los hechos y el estado que GPT-Live necesita para continuar la conversación. Evita las explicaciones largas y las llamadas adicionales al modelo destinadas únicamente a reformular los resultados para expresarlos de forma hablada.
  • Reduce las demoras de las herramientas y las llamadas innecesarias. Inicia el trabajo autorizado cuando sus entradas estén listas, reutiliza los resultados mientras sigan siendo válidos y evita repetir una consulta ya completada.
  • Ejecuta el trabajo independiente de forma concurrente. Las llamadas de consulta independientes pueden ejecutarse al mismo tiempo. Respeta las dependencias y las confirmaciones requeridas para las acciones. parallel_tool_calls permite que un modelo solicite varias llamadas; tu aplicación sigue siendo responsable de programar y ejecutar sus funciones personalizadas.

Consulta Optimización de la latencia para obtener orientación general sobre Responses y Almacenamiento de prompts en caché para reutilizar entradas estables.

Verifica la interacción completa

Prueba tanto el estado de la aplicación que sirve como fuente de verdad como el audio que reprodujo el cliente. Una respuesta del backend puede completarse mientras se interrumpe el resultado hablado, y un acuse de recibo del contexto confirma su aceptación, no su reproducción. Mantén los ID de operación y las revisiones de tareas separados de los ID de delegación para que las reconexiones, los reintentos y los resultados tardíos no repitan ni reviertan una acción.

Usa Evaluación de agentes de voz para realizar pruebas repetibles. Si tienes un ciclo de herramientas de Realtime o un backend encadenado existente, sigue Migrar a GPT-Live.