Caso de uso
Decisions API para a próxima ação do agente
Um loop de agente é uma série de decisões finitas: chamar uma tool, perguntar ao usuário, terminar. Uma chamada de decisão escolhe a próxima ação e devolve uma probabilidade por opção — sem texto livre para parsear, sem esquema de tool para validar.
Atualizado
O loop do agente como pergunta choice
Cada iteração entrega ao modelo o estado atual e faz uma pergunta finita: o que deve acontecer agora. A resposta é uma das suas ações nomeadas mais uma confiança — exatamente o contrato que o executor do loop precisa.
Como as opções são declaradas, o modelo nunca pode devolver uma ação que seu loop não implementa. Saída inválida é impossível por construção, não por disciplina de prompt.
Decisão de próxima ação
// Agent loop: decisions-1 picks the next action each step.
type Action = "search_docs" | "call_tool" | "ask_user" | "finish";
async function decideNext(state: unknown): Promise<{ action: Action; confidence: number }> {
const res = await fetch("https://decisions-api.net/api/v1/decisions", {
method: "POST",
headers: {
Authorization: `Bearer ${process.env.DECISIONS_API_KEY}`,
"Content-Type": "application/json",
},
body: JSON.stringify({
model: "decisions-1",
state, // string, JSON object, or array of text
questions: {
next: {
type: "choice",
instructions: "What should the agent do next?",
criteria: {
search_docs: "Look up documentation before acting.",
call_tool: "Run the next planned tool call.",
ask_user: "Stop and ask the user for clarification.",
finish: "The task is complete; produce the final answer.",
},
},
done: { type: "noul", instructions: "Is the user's task fully complete?" },
},
}),
});
const { answers } = await res.json();
return { action: answers.next.choice, confidence: answers.next.confidence };
}
const MAX_STEPS = 8;
async function runAgent(agentState: unknown) {
for (let step = 0; step < MAX_STEPS; step++) {
const { action, confidence } = await decideNext(agentState);
// Illustrative response: { action: "call_tool", confidence: 0.83 }
if (confidence < 0.8) { await askUser(agentState); continue; }
switch (action) {
case "finish": return;
case "search_docs": await searchDocs(agentState); break;
case "call_tool": await runTool(agentState); break;
case "ask_user": await askUser(agentState); break;
}
}
// MAX_STEPS reached: hand off to a human instead of looping forever.
}Dê ao agente uma saída honesta
Sempre inclua uma ação de escape — ask_user ou finish — nos criteria. Um agente sem forma de parar vai inventar trabalho; uma saída honesta transforma 'terminei' ou 'estou travado' em respostas de primeira classe.
Você também pode fazer uma pergunta noul independente na mesma chamada — 'a tarefa está totalmente completa?' — como verificação cruzada do choice.
Limite a autonomia pela confiança
A confiança transforma a resposta em política: deixe passos de alta confiança — digamos 0.8 ou mais — rodarem sozinhos, e mande os passos duvidosos para ask_user ou revisão humana. A probabilidade da segunda opção diz o quão disputado foi o passo.
Registre a distribuição, não só o vencedor: um passo que passou no limiar por 0.51 contra 0.49 merece uma segunda olhada.
Quanto custa um passo
Uma chamada bem-sucedida custa 1 crédito, com 1 ou 6 perguntas — então um choice de próxima ação mais um check de conclusão ainda custa um crédito por passo do loop.
FAQ
Qual a diferença para tool calling?
Tool calling escolhe uma função e gera seus argumentos — a forma é aberta. Uma chamada de decisão escolhe uma das suas ações nomeadas com probabilidade por opção e sem argumentos livres, então a saída é restrita por construção.
O que vai no state?
Tudo que o modelo precisa para decidir: um resumo compacto do progresso, o último resultado de tool, os passos restantes e as restrições. state aceita uma string, um objeto JSON ou um array de texto.
Uma chamada pode checar mais que a próxima ação?
Sim — uma chamada comporta até 6 perguntas. Combine o choice de próxima ação com um noul 'a tarefa terminou?' ou um score do risco do passo pendente.
E se a confiança for sempre baixa?
Normalmente significa que a lista de ações é granular demais ou que o state não tem sinal. Mescle ações quase duplicadas, enriqueça o state e mantenha ask_user como o fallback que o modelo pode escolher honestamente.
Impulsione um passo do agente
Uma decisão de teste grátis para novos visitantes — cole o estado do seu loop no playground e veja a distribuição da próxima ação.