Utilisez l’intégration native de l’API Decisions dans GPT-Live pour prendre des décisions avec une faible latence pendant que votre utilisateur parle.
La délégation native évite un aller-retour par votre application. Avec la délégation personnalisée, Live avertit votre application, qui appelle ensuite Decisions. Avec la délégation native, Live appelle directement Decisions.
Choisissez quand prendre une décision
- Laissez Live déléguer lorsqu’il reconnaît une demande que votre application peut traiter. Définissez les choix dans
session.delegationet indiquez à Live quand déléguer. - Réagissez à la conversation à mesure que votre utilisateur parle ou que Live répond. Configurez
session.triggerspour réagir aux mises à jour de la transcription en entrée ou en sortie.
Vous pouvez modifier les questions pendant une session Live. Envoyez session.update, puis attendez l’événement session.updated correspondant avant d’ajouter un élément de décision pour cette étape. Définissez le type de délégation à la création de la session. Il reste fixe pendant toute la session.
Laissez Live déléguer
En une seule requête, Live peut demander à Decisions de choisir parmi les actions que vous définissez et de déterminer si votre application doit appeler l’API Responses.
Imaginez que vous développez un assistant vocal pour une voiture. Le conducteur peut demander d’augmenter ou de baisser la température, d’activer ou de désactiver le désembuage du pare-brise, ou encore d’obtenir un itinéraire et de trouver un endroit où manger. Le choix none conserve le réglage de l’habitacle concerné.
Réglez la température de l’habitacle
« J’ai un peu froid. »
- Température de l’habitacleAugmenter
- DésembuageAucun changement
- Appeler ResponsesNon
« J’ai un peu augmenté la température. »
Traitez une demande qui dépasse les réglages de l’habitacle
- Température de l’habitacleAucun changement
- DésembuageActivé
- Appeler ResponsesOui
Utilisez les appels d’outils de Responses pour lancer le guidage vers San Francisco et y rechercher des restaurants. Renvoyez les deux résultats à Responses.
Live indique si le désembuage est activé, si le guidage a démarré et quels restaurants votre recherche a trouvés.
Configurez la délégation
Vérifiez que vous disposez d’une connexion Live opérationnelle et de l’autorisation api.decisions.write. Utilisez vos en-têtes de connexion Live habituels. Aucun en-tête alpha propre à Decisions n’est nécessaire.
Dans votre requête de session WebRTC, placez cet objet sous session, au même niveau que votre champ transport existant. Les instructions de session indiquent à Live quand déléguer. Les questions à choix indiquent à Decisions quoi renvoyer. Une seule requête de décision native permet de répondre indépendamment aux trois questions.
{
"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 envoie automatiquement la transcription de la conversation à Decisions.
Exécutez les actions et transmettez les résultats
Enregistrez la valeur de delegation.id reçue dans session.delegation.created. À la réception d’un événement decision.event portant ce delegation_id, vérifiez que event.type vaut decision.completed, puis retrouvez chaque choix par le nom de sa question dans event.decision.answers. Une réponse none indique qu’il n’y a rien à faire pour l’action concernée. Si vous filtrez les événements WebRTC, autorisez à la fois session.delegation.created et decision.event.
Pour « J’ai un peu froid. », Decisions sélectionne temperature_up, none et no. Augmentez la température, puis relevez la consigne effective. Supposons que le tableau de bord affiche désormais une consigne de 22 °C en mode automatique et que le désembuage soit désactivé. Envoyez cet état confirmé de l’habitacle à Decisions avec 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."
}
]
}
}
Ajoutez un instantané compact de l’état complet de l’habitacle uniquement lorsque les réglages affichés au tableau de bord changent. Prenez le dernier instantané comme état actuel. Conservez les entrées précédentes pour préserver le préfixe utilisé pour la mise en cache des prompts.
Attendez decision.item.created, puis envoyez le résultat à Live avec session.commentary.append en utilisant l’identifiant de délégation de cette requête.
{
"type": "session.commentary.append",
"delegation_id": "del_cabin_1",
"content": "I raised the cabin temperature and confirmed the new setting on the dashboard."
}
Pour la demande concernant San Francisco, Decisions sélectionne none, on et yes. Activez le désembuage, vérifiez son état et ajoutez l’instantané actualisé de l’habitacle comme dans l’exemple précédent. Appelez ensuite Responses depuis votre serveur avec l’autorisation api.responses.write. Incluez les résultats des réglages de l’habitacle et la demande complète du conducteur pour que Responses puisse associer « là-bas » à 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
}
]
}'Il s’agit de la requête initiale du processus d’appel de fonction de Responses. Pour chaque function_call, exécutez la fonction indiquée avec les arguments fournis, puis renvoyez un function_call_output contenant le résultat obtenu ou l’erreur rencontrée, ainsi que le call_id correspondant. Continuez jusqu’à ce que Responses renvoie sa réponse finale.
Envoyez à Live uniquement la réponse finale concise de Responses et l’état confirmé de l’habitacle. Utilisez session.commentary.append avec le même delegation_id.
Réagissez aux transcriptions
Utilisez un déclencheur de transcription pour synchroniser les réactions avec la conversation. En entendant « J’ai décroché le poste ! », un personnage virtuel pourrait sourire et hocher la tête pendant que votre utilisateur parle encore. Un déclencheur en sortie pourrait élargir son sourire et le faire se pencher en avant au moment où Live répond « C’est formidable ! »
session.input_transcript.delta« J’ai décroché le poste ! »
session.output_transcript.delta« C’est formidable ! »
session.input_transcript.delta« Je n’ai pas eu le poste. »
Ajoutez un déclencheur comme celui-ci à session.triggers. Il demande de choisir séparément l’expression, son intensité et le geste :
{
"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" }
]
}
]
}
}
Pour animer le personnage pendant sa réponse, ajoutez un second déclencheur dont event_type vaut session.output_transcript.delta et demandez des choix qui correspondent aux paroles de Live. Live fournit le modèle et l’identifiant du déclencheur. Les déclencheurs de transcription fonctionnent indépendamment de la délégation.
Si vous filtrez les événements WebRTC, autorisez decision.event ainsi que l’événement de transcription de chaque déclencheur configuré : session.input_transcript.delta, session.output_transcript.delta ou les deux. Live transmet le résultat d’un déclencheur uniquement si l’événement de transcription qui en est à l’origine est également autorisé.
Le résultat d’un déclencheur identifie la mise à jour de la transcription qui en est à l’origine. Voici les champs pertinents d’un événement decision.event pour l’exemple « J’ai décroché le poste ! » :
{
"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" }
]
}
}
}
Associez source_event_id à la mise à jour de transcription correspondante. Live peut regrouper plusieurs mises à jour en attente, et les résultats peuvent arriver dans le désordre. En entrée comme en sortie, appliquez le résultat pertinent le plus récent et utilisez l’audio pour animer la bouche du personnage.