사용 사례
Decisions API로 에이전트 다음 액션
에이전트 루프는 유한한 결정의 연속입니다: 툴을 호출할지, 사용자에게 물을지, 종료할지. 의사결정 호출은 다음 액션을 고르고 모든 옵션의 확률을 반환합니다 — 자유 텍스트 파싱도, 툴 스키마 검증도 없습니다.
업데이트
에이전트 루프를 choice 질문으로
루프의 각 반복은 현재 상태를 모델에 넘기고 유한한 질문 하나를 합니다: 다음에 무엇을 할 것인가. 답은 명명된 액션 중 하나와 confidence — 루프 러너가 필요로 하는 정확한 계약입니다.
옵션은 선언되어 있으므로 모델이 루프에 구현되지 않은 액션을 반환할 수 없습니다. 잘못된 출력은 프롬프트 규율이 아니라 구조적으로 불가능합니다.
다음 액션 결정
// 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.
}에이전트에게 정직한 출구를
criteria에는 항상 탈출 액션 — ask_user나 finish — 을 넣으세요. 멈출 수 없는 에이전트는 일을 지어냅니다; 정직한 출구는 '완료했어요'와 '막혔어요'를 일급 답변으로 만듭니다.
같은 호출에 독립적인 noul 질문 — '태스크가 완전히 끝났는가' — 을 넣어 choice 답을 교차 검증할 수도 있습니다.
confidence로 자율성을 게이트
confidence가 답을 정책으로 바꿉니다. 예를 들어 0.8 이상은 무인 실행, 낮은 단계는 ask_user나 사람 검토로. 2위 옵션의 확률은 그 단계가 얼마나 접전이었는지 알려줍니다.
승자만이 아니라 분포를 로깅하세요: 0.51 대 0.49로 임계값을 통과한 단계도 다시 볼 가치가 있습니다.
단계당 비용
성공한 호출 한 번에 1크레딧 — 1개든 6개 질문이든. 그래서 다음 액션 choice와 완료 체크를 합쳐도 루프 단계당 1크레딧입니다.
FAQ
툴 콜링과 어떻게 다른가요?
툴 콜링은 함수를 고르고 인자를 생성합니다 — 형태가 개방적입니다. 의사결정 호출은 명명된 액션 중 하나를 옵션별 확률과 함께 고르고 자유 형식 인자가 없으므로, 출력이 구조적으로 제약됩니다.
state에는 무엇을 넣나요?
모델이 결정하는 데 필요한 모든 것: 진행 요약, 마지막 툴 결과, 남은 단계, 제약. state는 문자열, JSON 객체, 텍스트 배열을 받습니다.
한 호출로 다음 액션 이상을 확인할 수 있나요?
네 — 한 호출에 최대 6개 질문이 들어갑니다. 다음 액션 choice에 noul '태스크 완료 여부' 체크나 대기 단계의 위험도 score를 함께 넣으세요.
confidence가 항상 낮으면?
보통 액션 목록이 너무 세분되어 있거나 state에 신호가 부족한 경우입니다. 비슷한 액션을 합치고, state를 풍부하게 하고, ask_user를 모델이 정직하게 고를 수 있는 폴백으로 두세요.
에이전트 단계를 구동하세요
신규 방문자 무료 체험 1회 — 루프 상태를 플레이그라운드에 붙여넣고 다음 액션 분포를 확인하세요.