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

Conecta tu asistente de voz a Decisions

Toma decisiones con baja latencia mientras el usuario sigue hablando.

Usa la integración nativa de la API de Decisions en GPT-Live para tomar decisiones con baja latencia mientras el usuario sigue hablando.

La delegación nativa evita que la solicitud tenga que pasar por tu aplicación. Con la delegación personalizada, Live notifica a tu aplicación y esta llama a Decisions. Con la delegación nativa, Live llama directamente a Decisions.

Elige cuándo tomar una decisión

  • Deja que Live delegue cuando reconozca una solicitud que tu aplicación pueda atender. Define las opciones en session.delegation e indica a Live cuándo debe delegar.
  • Reacciona a la conversación mientras el usuario habla o Live responde. Configura session.triggers para reaccionar a las actualizaciones incrementales de la transcripción de entrada o de salida.

Puedes cambiar las preguntas durante una sesión activa de Live. Envía session.update y espera a recibir el evento session.updated correspondiente antes de agregar un elemento de decisión para ese paso. Define el tipo de delegación al crear la sesión. Se mantiene fijo durante toda la sesión.

Deja que Live delegue

En una sola solicitud, Live puede pedirle a Decisions que elija entre las acciones que definas y que decida si tu aplicación debe llamar a la API de Responses.

Supón que estás creando un asistente de voz para un auto. El conductor puede pedir que se suba o baje la temperatura, que se encienda o apague el desempañador del parabrisas, o que se le indique cómo llegar a un destino y se busque un lugar para comer. La opción none deja el control correspondiente de la cabina tal como está.

Ajusta los controles de la cabina

Conductor

“Tengo un poco de frío”.

Resultados de la decisión
  • Temperatura de la cabinaSubir
  • DesempañadorSin cambios
  • Llamar a ResponsesNo
Tu aplicaciónSube la temperatura, consulta el nuevo ajuste y agrega el estado completo de la cabina a Decisions. Espera la confirmación y envía el resultado a Live.
Live responde

“Subí un poco la temperatura”.

Atiende una solicitud que va más allá de los controles de la cabina

Conductor“El parabrisas está empañado. Por favor, desempáñalo, guíame a San Francisco y búscame buenos restaurantes allí”.
Resultados de la decisión
  • Temperatura de la cabinaSin cambios
  • DesempañadorEncendido
  • Llamar a ResponsesSí
Tu aplicación
1. Enciende el desempañadorEncendido
2. Envía a Responses la solicitud completa del conductor y los resultados de los controles de la cabina

Usa las llamadas a herramientas de Responses para iniciar la navegación a San Francisco y buscar restaurantes allí. Devuelve ambos resultados a Responses.

Live informa

El estado del desempañador, si se inició la navegación y qué restaurantes se encontraron en la búsqueda.

Configura la delegación

Para empezar, necesitas una conexión activa con Live y el permiso api.decisions.write. Usa los encabezados habituales de tu conexión con Live. No necesitas un encabezado alfa específico de Decisions.

En la solicitud de sesión de WebRTC, coloca este objeto dentro de session, junto al campo transport que ya tienes. Las instrucciones de la sesión le indican a Live cuándo delegar. Las preguntas con opciones le indican a Decisions qué devolver. Con una sola solicitud de decisión nativa, Decisions responde las tres preguntas de forma independiente.

{
  "model": "gpt-live-1",
  "instructions": "Delegate the driver’s whole request, including cabin controls, navigation, and local search. Wait for the app to report what happened, then tell the driver in natural language.",
  "delegation": {
    "type": "decisions",
    "decisions": {
      "model": "gpt-6-luna",
      "questions": [
        {
          "type": "choice",
          "name": "cabin_temperature",
          "instructions": "Choose temperature_up if the driver feels cold or wants more heat, temperature_down if they feel hot or want to cool down, or none if the request is unrelated.",
          "choices": [
            { "value": "temperature_up" },
            { "value": "temperature_down" },
            { "value": "none" }
          ]
        },
        {
          "type": "choice",
          "name": "windshield_defogger",
          "instructions": "Choose on if the driver reports a foggy windshield or asks to defog it, off if they say the glass is clear now or ask to turn the defogger off, or none if the request is unrelated.",
          "choices": [
            { "value": "on" },
            { "value": "off" },
            { "value": "none" }
          ]
        },
        {
          "type": "choice",
          "name": "needs_response",
          "instructions": "Choose yes if any part of the request goes beyond these cabin controls, such as getting directions or finding restaurants. Otherwise choose no.",
          "choices": [{ "value": "yes" }, { "value": "no" }]
        }
      ]
    }
  }
}

Live envía automáticamente la transcripción de la conversación a Decisions.

Ejecuta las acciones e informa los resultados

Guarda el valor de delegation.id que recibas en session.delegation.created. Cuando recibas un decision.event con ese delegation_id, comprueba que event.type sea decision.completed y consulta la opción elegida para cada pregunta por su nombre en event.decision.answers. Si la respuesta es none, no ejecutes esa acción. Si filtras los eventos de WebRTC, permite tanto session.delegation.created como decision.event.

Ante “Tengo un poco de frío”, Decisions selecciona temperature_up, none y no. Sube la temperatura y consulta el ajuste real. Supón que el tablero ahora muestra una temperatura objetivo de 22 °C en modo automático, con el desempañador apagado. Envía ese estado confirmado de la cabina a Decisions con decision.item.create.

{
  "type": "decision.item.create",
  "event_id": "evt_cabin_after_temperature_up_1",
  "item": {
    "type": "message",
    "role": "user",
    "content": [
      {
        "type": "input_text",
        "text": "Use the latest cabin state snapshot as the current state. Cabin temperature is set to 22 °C in automatic mode. Windshield defogger is off."
      }
    ]
  }
}

Agrega una instantánea compacta del estado completo de la cabina solo cuando cambie el estado que muestra el tablero. Toma la instantánea más reciente como estado actual. Al conservar las entradas anteriores en su lugar, mantienes el prefijo para el almacenamiento en caché de prompts.

Espera a recibir decision.item.created y luego envía el resultado a Live con session.commentary.append. Usa el ID de delegación de esta solicitud.

{
  "type": "session.commentary.append",
  "delegation_id": "del_cabin_1",
  "content": "I raised the cabin temperature and confirmed the new setting on the dashboard."
}

Para la solicitud sobre San Francisco, Decisions selecciona none, on y yes. Enciende el desempañador, consulta su estado y agrega la instantánea actualizada de la cabina como en el ejemplo anterior. Luego llama a Responses desde tu servidor con el permiso api.responses.write. Incluye los resultados de los controles de la cabina y la solicitud completa del conductor para que Responses pueda asociar “allí” con San Francisco.

curl https://api.openai.com/v1/responses \
  -H "Authorization: Bearer $OPENAI_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "model": "gpt-6.1-sol",
    "instructions": "The car has handled the cabin controls. Use the tools for the rest of the request, then briefly tell the driver what happened based on the results.",
    "input": "Driver: My windshield is foggy, so please defog it, navigate to San Francisco, and find me some good restaurants there.\nCabin results: Windshield defogger confirmed on. Temperature unchanged.",
    "tools": [
      {
        "type": "function",
        "name": "start_navigation",
        "description": "Start navigation to a destination and report whether the route started.",
        "parameters": {
          "type": "object",
          "properties": { "destination": { "type": "string" } },
          "required": ["destination"],
          "additionalProperties": false
        },
        "strict": true
      },
      {
        "type": "function",
        "name": "find_restaurants",
        "description": "Find well-rated restaurants in the named city or area.",
        "parameters": {
          "type": "object",
          "properties": { "location": { "type": "string" } },
          "required": ["location"],
          "additionalProperties": false
        },
        "strict": true
      }
    ]
  }'

Esta es la solicitud inicial del flujo de llamadas a funciones de Responses. Por cada function_call, ejecuta la función indicada con los argumentos recibidos y devuelve un function_call_output con el resultado o el error real y el call_id correspondiente. Continúa hasta que Responses devuelva su respuesta final.

Envía a Live solo la respuesta final concisa de Responses y el estado confirmado de la cabina. Usa session.commentary.append con el mismo delegation_id.

Reacciona a las transcripciones

Usa un activador de transcripción cuando el momento de reaccionar dependa de la conversación. Al escuchar “¡Conseguí el trabajo!”, un personaje digital podría sonreír y asentir mientras el usuario sigue hablando. Un activador de salida podría hacer que el personaje sonría más y se incline hacia adelante mientras Live dice “¡Qué buena noticia!”.

Mientras escuchasession.input_transcript.delta
Tu usuario

“¡Conseguí el trabajo!”

Sonríe y asienteAlegría · intensidad media
Mientras hablasession.output_transcript.delta
Live

“¡Qué buena noticia!”

Sonríe y se inclina hacia adelanteAlegría · intensidad alta
Otro ejemplo al escucharsession.input_transcript.delta
Tu usuario

“No conseguí el trabajo”.

Se muestra triste y asiente levementeTristeza · intensidad baja

Agrega un activador como este a session.triggers. El activador pide que se elijan por separado la expresión, la intensidad y el gesto:

{
  "type": "decisions",
  "event_type": "session.input_transcript.delta",
  "decisions": {
    "questions": [
      {
        "type": "choice",
        "name": "expression",
        "instructions": "Choose your expression as you listen to the person's latest words.",
        "choices": [
          { "value": "neutral" },
          { "value": "happy" },
          { "value": "sad" },
          { "value": "concerned" }
        ]
      },
      {
        "type": "choice",
        "name": "intensity",
        "instructions": "Choose how strongly to show that expression.",
        "choices": [
          { "value": "low" },
          { "value": "medium" },
          { "value": "high" }
        ]
      },
      {
        "type": "choice",
        "name": "gesture",
        "instructions": "Choose a gesture that fits what you just heard.",
        "choices": [
          { "value": "none" },
          { "value": "nod" },
          { "value": "shake" },
          { "value": "lean" }
        ]
      }
    ]
  }
}

Para animar al personaje mientras responde, agrega un segundo activador con event_type establecido en session.output_transcript.delta y pide que se elijan opciones que correspondan a lo que dice Live en ese momento. Live proporciona el modelo y el ID del activador. Los activadores de transcripción funcionan de forma independiente de la delegación.

Si filtras los eventos de WebRTC, permite decision.event y el evento de transcripción de cada activador configurado: session.input_transcript.delta, session.output_transcript.delta o ambos. Live solo entrega el resultado de un activador si también se permite el evento de transcripción que lo originó.

El resultado de un activador identifica la actualización incremental de la transcripción que lo generó. Estos son los campos relevantes de un evento decision.event para el ejemplo “¡Conseguí el trabajo!”:

{
  "type": "decision.event",
  "delegation_id": null,
  "trigger_id": "trg_listening_1",
  "source_event_type": "session.input_transcript.delta",
  "source_event_id": "evt_input_42",
  "event": {
    "type": "decision.completed",
    "decision": {
      "answers": [
        { "type": "choice", "name": "expression", "choice": "happy" },
        { "type": "choice", "name": "intensity", "choice": "medium" },
        { "type": "choice", "name": "gesture", "choice": "nod" }
      ]
    }
  }
}

Asocia source_event_id con la actualización incremental correspondiente de la transcripción. Live puede combinar actualizaciones pendientes y los resultados pueden llegar fuera de orden. Aplica el resultado pertinente más reciente para cada sentido de la conversación (entrada o salida) y usa el audio para controlar el movimiento de la boca.