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.