JavaScript ガイド

JavaScript で使う OpenAI Decisions API

OpenAI は Decisions API の SDK を公開していません——client.decisions.create のようなメソッドは存在しません。このページでは、このサイトのエンドポイント(decisions-1 を提供する、呼び出せる OpenAI Decisions API の代替)向けの動く JavaScript を示します。同じ制約付きデシジョンパターンに従います。

更新日

呼び出す

Bearer キーで /api/v1/decisions へ 1 回 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 クレジットでプレイグラウンドから実際に呼べます。