JavaScript 가이드
JavaScript에서의 OpenAI Decisions API
OpenAI는 Decisions API용 SDK를 공개하지 않았습니다 — 복사할 client.decisions.create가 없습니다. 이 페이지는 이 사이트의 엔드포인트(decisions-1을 제공하는, 호출 가능한 OpenAI Decisions API 대안)를 위한 실제 동작하는 JavaScript 코드를 보여줍니다. 같은 제한적 의사결정 패턴을 따릅니다.
업데이트
호출하기
Bearer 키로 /api/v1/decisions에 POST 한 번. 본문은 model, state, questions — 1~6개 질문이며 각각 noul, choice, score 타입입니다. DECISIONS_API_KEY를 대시보드의 키로 설정하세요.
fetch를 쓰세요 — Node 18+, Deno, 브라우저에서 동일한 API입니다. 모든 호출에 타임아웃(AbortSignal.timeout)을 두세요. 멈춘 의사결정은 파이프라인을 정지시키지 말고 빠르게 실패해야 합니다.
JavaScript
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: 'I was charged twice for my subscription this morning.',
questions: {
refund: {
type: 'noul',
instructions: 'Is the customer asking for money back?',
},
},
}),
})
const { answers } = await res.json()
console.log(answers.refund.noul)확률 읽기
answers는 질문 ID를 키로 반환됩니다. noul 답변은 문장이 참일 확률입니다. choice 답변은 이긴 choice, 모든 옵션의 확률, confidence를 담습니다 — 자동 실행 여부는 승자가 아니라 confidence로 결정하세요.
JavaScript
// noul: probability the statement is true
if (answers.refund.noul >= 0.8) routeToRefunds()
// choice: winning label + per-option probabilities + confidence
const team = answers.team
console.log(team.choice, team.probabilities, team.confidence)타임아웃과 재시도
429와 502는 짧은 백오프 재시도 가치가 있습니다 — 실패 호출은 과금되지 않습니다. 402는 잔액 부족입니다: 충전하세요, 재시도는 소용없습니다. 422는 검증 오류이며 메시지가 필드를 명시하니 본문을 고치세요.
JavaScript
async function decide(body, attempts = 3) {
for (let i = 0; i < attempts; i++) {
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(body),
signal: AbortSignal.timeout(30000),
})
if (res.status === 429 || res.status === 502) {
await new Promise(r => setTimeout(r, 2 ** i * 1000))
continue
}
if (res.status === 402) throw new Error('out of credits')
if (!res.ok) throw new Error(`decision call failed: ${res.status}`)
return (await res.json()).answers
}
throw new Error('decision call failed')호출을 헬퍼로 감싸기
호출자는 텍스트를 넣고 라벨을 받는 함수만 보아야 합니다 — HTTP 세부사항이 아니라. 타임아웃, 402 체크, 재시도 루프를 decide() 안에 한 번만 넣으면 모든 호출 지점이 깔끔하게 유지됩니다.
JavaScript
// Keep the call behind one function — timeouts, 402s,
// and retries live inside it, not at every call site.
export async function routeTicket(text) {
const answers = await decide({
model: 'decisions-1',
state: text,
questions: {
team: {
type: 'choice',
instructions: 'Which team should own this ticket?',
criteria: {
payments: 'Checkout or billing.',
frontend: 'Rendering or browser behavior.',
account: 'Login or permissions.',
},
},
},
})
const team = answers.team
return team.confidence >= 0.7 ? team.choice : 'triage'
}자주 묻는 질문
Decisions API용 공식 OpenAI SDK 예제가 있나요?
없습니다. OpenAI는 Decisions API의 SDK 메서드나 요청 스키마를 공개하지 않았습니다 — client.decisions.create를 보여주는 코드는 전부 지어낸 것입니다. 이 페이지는 평범한 HTTP를 쓰.
fetch 대신 axios 같은 HTTP 클라이언트를 써도 되나요?
네 — 엔드포인트는 평범한 HTTPS POST입니다. axios, undici, got 모두 동일합니다. 타임아웃과 상태 처리를 동일하게 유지하세요.
구조화된 컨텍스트는 어떻게내나요?
state는 문자열뿐 아니라 JSON 객체나 배열도 받습니다 — json 본문에 dict를 그대로 전달하면 모델이 컨텍스트로 읽습니다.
브라우저에서 의사결정 실행
설정 없이 — 신규 방문자 무료 크레딧 1개로 플레이그라운드에서 실제 호출을 실행하세요.