Use a integração nativa da API Decisions com o GPT-Live para tomar decisões com baixa latência enquanto o usuário ainda está falando.
A delegação nativa elimina uma ida e volta pelo aplicativo. Com a delegação personalizada, o Live notifica o aplicativo, que então chama o Decisions. Com a delegação nativa, o Live chama o Decisions diretamente.
Escolha quando tomar uma decisão
- Deixe o Live delegar quando ele reconhecer um pedido que seu aplicativo pode atender. Defina as opções em
session.delegatione indique ao Live quando delegar. - Reaja à conversa enquanto o usuário fala ou o Live responde. Configure
session.triggerspara os deltas da transcrição de entrada ou de saída.
Você pode alterar as perguntas durante uma sessão ativa do Live. Envie session.update e aguarde o session.updated correspondente antes de adicionar um item de decisão para essa etapa. Defina o tipo de delegação ao criar a sessão. Ele permanece fixo durante toda a sessão.
Deixe o Live delegar
Em uma única requisição, o Live pode pedir ao Decisions que escolha entre as ações que você definiu e decida se o aplicativo deve chamar a API Responses.
Imagine que você está criando um assistente de voz para um carro. O motorista pode pedir para aumentar ou diminuir a temperatura, ligar ou desligar o desembaçador do para-brisa ou traçar uma rota e encontrar um lugar para comer. A opção none mantém o ajuste atual do controle correspondente da cabine.
Ajuste a temperatura da cabine
“Estou com um pouco de frio.”
- Temperatura da cabineAumentar
- DesembaçadorSem alteração
- Chamar a API ResponsesNão
“Aumentei um pouco a temperatura.”
Atenda a um pedido que vai além dos controles da cabine
- Temperatura da cabineSem alteração
- DesembaçadorLigar
- Chamar a API ResponsesSim
Use as chamadas de ferramentas da API Responses para iniciar a navegação até San Francisco e encontrar restaurantes por lá. Devolva os dois resultados à API Responses.
O estado do desembaçador, se a navegação foi iniciada e quais restaurantes a busca encontrou.
Configure a delegação
Comece com uma conexão ativa com o Live e com a permissão api.decisions.write. Use os cabeçalhos habituais da conexão com o Live. Não é necessário um cabeçalho alfa específico do Decisions.
Na requisição de sessão WebRTC, inclua este objeto em session, no mesmo nível do campo transport já existente. As instruções da sessão indicam ao Live quando delegar. As perguntas de múltipla escolha indicam ao Decisions o que retornar. Uma única requisição de decisão nativa responde às três perguntas de forma independente.
{
"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" }]
}
]
}
}
}
O Live envia automaticamente a transcrição da conversa ao Decisions.
Execute as ações e informe os resultados
Salve o valor de delegation.id recebido em session.delegation.created. Ao receber um decision.event com esse delegation_id, verifique se event.type é decision.completed e consulte cada escolha pelo nome da pergunta em event.decision.answers. Se a resposta for none, não execute a ação correspondente. Se você filtrar eventos WebRTC, permita tanto session.delegation.created quanto decision.event.
Para a fala “Estou com um pouco de frio”, o Decisions seleciona temperature_up, none e no. Aumente a temperatura e consulte o valor efetivamente configurado. Suponha que o painel agora indique uma temperatura desejada de 22 °C no modo automático, com o desembaçador desligado. Envie esse estado confirmado da cabine ao Decisions com 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."
}
]
}
}
Acrescente um registro compacto do estado completo da cabine somente quando o estado indicado no painel mudar. Considere o registro mais recente como o estado atual. Manter as entradas anteriores no lugar preserva o prefixo usado pelo cache de prompts.
Aguarde decision.item.created e envie o resultado ao Live com session.commentary.append, usando o ID de delegação dessa requisição.
{
"type": "session.commentary.append",
"delegation_id": "del_cabin_1",
"content": "I raised the cabin temperature and confirmed the new setting on the dashboard."
}
Para o pedido sobre San Francisco, o Decisions seleciona none, on e yes. Ligue o desembaçador, consulte seu estado e acrescente o registro atualizado da cabine como no exemplo anterior. Em seguida, chame a API Responses pelo servidor com a permissão api.responses.write. Inclua os resultados dos ajustes da cabine e o pedido completo do motorista para que a API Responses possa associar “por lá” a 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
}
]
}'Essa é a requisição inicial do fluxo de chamadas de função da API Responses. Para cada function_call, execute a função indicada com os argumentos fornecidos. Em seguida, retorne um function_call_output com o resultado ou erro obtido e o call_id correspondente. Continue até que a API Responses retorne a resposta final.
Envie ao Live apenas a resposta final concisa da API Responses e o estado confirmado da cabine. Use session.commentary.append com o mesmo delegation_id.
Reaja às transcrições
Use um gatilho de transcrição quando a reação precisar acompanhar o ritmo da conversa. Ao ouvir “Consegui a vaga!”, uma pessoa virtual pode sorrir e fazer um gesto afirmativo com a cabeça enquanto o usuário ainda está falando. Um gatilho de saída pode fazer o personagem abrir um sorriso maior e se inclinar para a frente enquanto o Live diz “Que maravilha!”.
session.input_transcript.delta“Consegui a vaga!”
session.output_transcript.delta“Que maravilha!”
session.input_transcript.delta“Não consegui a vaga.”
Adicione um gatilho como este a session.triggers. Ele solicita escolhas separadas para a expressão, a intensidade e o 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 o personagem durante a resposta, adicione um segundo gatilho com event_type definido como session.output_transcript.delta e solicite escolhas que combinem com o que o Live está dizendo. O Live fornece o modelo e o ID do gatilho. Os gatilhos de transcrição funcionam independentemente da delegação.
Se você filtrar eventos WebRTC, permita decision.event e o evento de transcrição de cada gatilho configurado (session.input_transcript.delta, session.output_transcript.delta ou ambos). O Live só entrega o resultado de um gatilho quando o filtro também permite o evento de transcrição que o acionou.
O resultado do gatilho identifica o delta da transcrição que o acionou. Veja os campos relevantes de um decision.event para o exemplo “Consegui a vaga!”.
{
"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" }
]
}
}
}
Associe source_event_id ao delta da transcrição correspondente. O Live pode combinar deltas pendentes, e os resultados podem chegar fora de ordem. Aplique o resultado relevante mais recente para cada direção (entrada e saída) e use o áudio para controlar o movimento da boca.