問い合わせの振り分け、商品画像の破損判定、障害報告の優先度付け。こうした判断処理をアプリケーションに組み込むための仕組みが、OpenAIの「Decisions API」です。
2026年10月22日に一般提供が始まりました。本記事では、2026年10月27日時点の公式資料をもとに機能と料金を整理し、同日に4件の問い合わせを分類した実行結果を紹介します。OpenAIの変更履歴
Decisions APIとは?
Decisions APIは、テキスト・画像・JSONなどを評価し、条件への該当確率、選択肢、スコアを返します。主な仕様は次のとおりです。
項目 | 内容 |
|---|---|
エンドポイント |
|
対応モデル |
|
主な入力 | テキスト、画像、JSON、会話履歴 |
判断形式 |
|
1リクエストの質問数 | 1〜400件 |
OpenAIは、Responses APIと比較して約10倍高速と説明しています。約10倍という値は提供元の説明で、本記事ではResponses APIとの速度比較は行っていません。Decisions API公式ガイド
問い合わせを「請求担当」と分類した場合、その結果を受け取ったアプリケーションが転送します。登録や通知など、判断に続く処理はアプリケーション側に実装します。
3種類の判断形式:predicate・choice・score
必要な答えに合わせて、質問の形式を選びます。
predicate:条件に該当する確率を返す
predicateは、「商品画像に破損が見えるか」などの条件に対して、0〜1のprobabilityを返します。
以下は返り値の形式を示す架空の例です。
{
"type": "predicate",
"name": "has_damage",
"probability": 0.92
}
この値を使って確認対象を絞り込めます。ただし、0.92は「92%の正解保証」を意味しません。実際のデータで誤判定の傾向を調べ、処理を分ける基準を決めます。
choice:用意した候補から選択する
choiceは、「請求」「技術サポート」「その他」といった候補から1つを選びます。候補数は2〜255件です。
候補ごとの確率分布とconfidenceも返ります。候補の意味が重ならないように説明し、分類できない入力を受け止める「その他」を用意すると、後続処理を設計しやすくなります。
score:順序のある基準で評価する
scoreは、2〜10段階の評価基準を使う形式です。たとえば障害の影響を「軽微」「代替手段あり」「業務停止」の順に定義します。
各段階には0から始まる番号が付き、返されるスコアは、その番号を各段階の確率で重み付けした平均です。3段階の確率がそれぞれ0.1、0.7、0.2なら、スコアは次のようになります。
0 × 0.1 + 1 × 0.7 + 2 × 0.2 = 1.1
スコアは整数とは限りません。単一のカテゴリを選びたい場合はchoice、順序のある評価を数値で扱いたい場合はscoreが適しています。判断形式と返り値の公式説明、APIリファレンス
Responses APIとはどう使い分ける?
Decisions APIは、分類や採点など、答えの形式が決まっている処理に向いています。要約や返信文の生成にはResponses API、独自のJSONスキーマに沿った情報抽出にはStructured Outputsを使います。
たとえば、Decisions APIで問い合わせを分類し、その結果と問い合わせ内容をResponses APIへ渡して返信案を作る、といった構成が考えられます。
料金はいくら?10万回の処理で試算
Decisions APIの通常入力料金は、100万トークンあたり0.10米ドルです。キャッシュ読み取りには割引料金が適用され、キャッシュへの書き込みは有料です。
課金区分 | 100万トークンあたりの料金 |
|---|---|
通常入力 | $0.10 |
キャッシュ読み取り | $0.01 |
キャッシュ書き込み・30分 | $0.125 |
出力トークン | $0.00 |
上記は通常の短いコンテキストでの単価です。長文入力や地域内処理には追加の料金条件があります。料金はDecisions APIの料金説明と公式料金表を参照しています。
1回あたり500入力トークンなら?
質問文や候補定義などを含む総入力が1回あたり500トークンで、キャッシュを利用せず、追加料金もないと仮定すると、料金は次のように計算できます。
API呼び出し回数 | 総入力トークン数 | 入力料金の試算 |
|---|---|---|
1万回 | 500万 | $0.50 |
10万回 | 5,000万 | $5.00 |
100万回 | 5億 | $50.00 |
これは条件を固定した試算です。本文が500トークンでも、質問文・選択肢・画像などが加われば総入力は増えます。費用の見積もりには、実際のレスポンスに含まれるusageを使いましょう。
キャッシュが向いているのは共通入力の再利用
キャッシュ対象となる共通入力の先頭部分には、1,024トークン以上が必要です。questionsは対象に含まれません。同じ長い参照資料を繰り返し評価する用途に向き、毎回内容が変わる短い問い合わせでは効果が限定的です。キャッシュの公式説明
実例:TypeScriptで4件の問い合わせを分類する
「二重請求」「ログインエラー」「商品の未着」「登壇依頼」の4件を、請求・返金/技術サポート/配送・お届け/その他に分類します。choiceを使い、問い合わせ1件につき1回、合計4回APIを呼び出します。
Node.js 22以上と、Decisions APIに対応したOpenAI SDKを用意します。以下はPowerShellの準備例です。APIキーは、実行するターミナルの環境変数に設定してください。
npm install openai
npm install --save-dev typescript tsx @types/node
$env:OPENAI_API_KEY = "取得したAPIキー"
以下は、検証用プログラムから分類処理を抜き出した最小例です。classification-example.tsとして保存します。
import OpenAI from "openai";
const departments = {
billing: {
label: "請求・返金",
description: "請求額、重複請求、支払い内容、返金の相談。",
},
technical: {
label: "技術サポート",
description: "アプリや管理画面の不具合、ログインエラー、システムの操作方法。",
},
shipping: {
label: "配送・お届け",
description: "配達状況、未着、追跡番号、届け先変更。",
},
other: {
label: "その他",
description: "上記以外。登壇依頼、協業の相談など。",
},
} as const;
const tickets = [
"同じ注文の代金がクレジットカードから2回引き落とされています。重複した分を返金してほしいです。",
"管理画面にログインすると認証エラーが表示されます。パスワードを再設定してもログインできません。",
"商品の配達予定日を3日過ぎましたが、まだ届いていません。配送状況と追跡番号を教えてください。",
"来月開催するイベントで、御社の担当者に登壇をお願いしたいです。企画書を送る窓口を教えてください。",
];
async function main() {
const client = new OpenAI();
const rows = [];
for (const message of tickets) {
const startedAt = performance.now();
const decision = await client.decisions.create({
model: "gpt-6-luna",
input: message,
questions: [{
type: "choice",
name: "department",
instructions:
"問い合わせの主な用件を担当する窓口を1つ選んでください。請求や返金の相談はbilling、アプリの不具合はtechnical、配送の相談はshipping、それ以外はotherです。",
choices: Object.entries(departments).map(([value, department]) => ({
value,
description: department.description,
})),
}],
});
const elapsedMs = Math.round(performance.now() - startedAt);
const answer = decision.answers.find(answer => answer.name === "department");
if (!answer || answer.type !== "choice" ||
typeof answer.choice !== "string" ||
!Object.hasOwn(departments, answer.choice)) {
rows.push({ 問い合わせ: message, 分類結果: "判定できませんでした" });
continue;
}
const category = answer.choice as keyof typeof departments;
rows.push({
問い合わせ: message,
分類結果: departments[category].label,
confidence: answer.confidence,
応答時間ms: elapsedMs,
入力トークン: decision.usage.input_tokens,
出力トークン: decision.usage.output_tokens,
});
}
console.table(rows);
}
main().catch((error: unknown) => {
let message = error instanceof Error ? error.message : String(error);
const apiKey = process.env.OPENAI_API_KEY;
if (apiKey) message = message.replaceAll(apiKey, "[REDACTED]");
console.error("分類に失敗しました。", message);
process.exitCode = 1;
});
実行すると、問い合わせ本文、日本語の分類結果、信頼度、応答時間、使用トークン数を一覧で表示します。
[Console]::OutputEncoding = [Text.UTF8Encoding]::new($false)
npx tsx classification-example.ts
英語コードを日本語のラベルに変換し、分類結果を読みやすくしています。選択する分類はAPIに任せています。
実行結果:4件はどこに分類された?
2026年10月27日、同じ入力文・質問・候補定義を使い、HTML保存機能を加えた検証用プログラムで実際にAPIを呼び出しました。次の表は、その結果です。入力文は表内では要約しています。
入力した問い合わせの要約 | APIの分類結果 | confidence | 応答時間 |
|---|---|---|---|
同じ注文が二重に引き落とされた | 請求・返金 | 1.00 | 1.767秒 |
管理画面にログインできない | 技術サポート | 1.00 | 0.389秒 |
配達予定日を過ぎても商品が届かない | 配送・お届け | 1.00 | 0.262秒 |
イベントへの登壇を依頼したい | その他 | 0.99 | 0.210秒 |
これらはAPIが返した選択結果です。担当者への実際の転送や通知は行っていません。

2026年10月27日の実行結果。保存したAPIの返り値を日本語の一覧に表示した画面です。
4リクエストの入力トークン数は合計1,079、出力トークン数は合計0でした。応答時間は、各API呼び出しの前後をアプリ側で測った値です。
今回は分かりやすい4例での動作確認です。confidenceが1.00でも正解を保証するものではなく、大量データでの精度やResponses APIに対する速度差を検証した結果ではありません。
判定拒否などで分類できない場合の表示も用意します。
導入前に確認したいこと
データで精度と応答時間を測る
正解ラベルを付けたデータで精度を測り、誤検知と見逃しの影響に応じて、自動処理と人間の確認を分ける基準を決めます。confidenceは各候補の確率とは別の指標です。回答の解釈に関する公式説明
応答時間は、質問数やネットワークも含めて測定します。既存方式と同じデータを使い、精度・速度・費用を比較しましょう。
入力形式と対応範囲を確認する
項目 | 確認時点の制約 |
|---|---|
モデル |
|
PDFなどのファイル | Decisionsエンドポイントへの直接入力は非対応 |
音声 | Decisionsエンドポイントへの直接入力は非対応。GPT-Liveとの連携を利用 |
画像 | 公開HTTP/HTTPS URL、またはBase64のデータURL。 |
依存する判断 | 前の回答に依存する判断は別リクエストで実行 |
入力形式の詳細はDecisions API公式ガイドで確認できます。
まずはDecisions Playgroundで質問と候補を試し評価します。小さな分類処理から始め、自動化できる範囲を見極めるとよいでしょう。