Decisions APIは、何かを分類、ルーティング、スコアリング、またはゲートするジョブで、確率を返してほしい場合に使用します。これはGPT-6 Lunaで動作し、テキストではなく型付きの回答を返し、出力、キャッシュ読み取り、キャッシュ書き込み料金なしで100万トークンあたり$0.10の入力のみを課金します。OpenAIによると、Responses APIよりも約10倍高速です。Responses APIは、生成されたテキスト、独自のスキーマでのJSON、ツール呼び出し、ストリーミング、会話の状態が必要な場合に使用します。Decisionsは2026年10月6日にパブリックベータ版として公開されました。 この投稿では、1つのジョブ(サポートチケットのルーティング)を両方のエンドポイントで実行し、それぞれが返すものを比較し、コストを計算し、移行に関する注意点と、両方を1つのApidogプロジェクトでテストする方法で締めくくります。エンドポイントの構造についてはDecisions APIの基礎から始め、ベースラインについては弊社のResponses APIガイドをご覧ください。ボタン
機能比較表
| Decisions API | Responses API (GPT-6 Luna) | |
|---|---|---|
| エンドポイント | POST /v1/decisions |
POST /v1/responses |
| 出力 | エンドポイントからの確率と信頼度を伴うpredicate、choice、scoreの回答(およびrefusal) |
生成されたテキスト、またはtext.formatを介してスキーマに従うJSON |
| 独自のJSONスキーマ | なし | あり、strict: trueを伴うjson_schema |
| ツール / 関数呼び出し | なし | あり |
| ストリーミング | なし | あり |
| 会話の状態 | なし | あり |
| プロンプトキャッシング | キャッシュ料金なし;OpenAIのフォーラムによると、まだキャッシングはなし | あり、キャッシュされた入力は100万トークンあたり$0.01 |
| バッチ | ドキュメント化されていない | あり、標準料金の50% |
| 画像 | あり、Base64データURL;リファレンスには公開HTTP(S) URLも記載されており、リクエストあたり最大128個 | あり、Lunaはテキストと画像を扱う |
| チェーン化された(依存する)決定 | 別々のリクエスト | 1つの生成されたレスポンスが依存フィールドを保持できる |
| 100万トークンあたりの料金、短いコンテキスト | 入力$0.10;出力料金なし | 入力$0.10、出力$0.50(推論トークンを含む) |
| ZDR / HIPAA | 対象顧客向けにサポート;米国およびEUでの地域処理 | この比較には含まれていません;OpenAIのデータ管理ページを参照してください |
各行は、OpenAIのDecisionsガイド、APIリファレンス、および料金ページから引用されています。
同じジョブを両方の方法で:サポートチケットをルーティングする
チケットには「注文が二重請求されました」と書かれています。部署は経理、技術、配送、その他です。以下は構造化出力を使用したResponsesリクエストで、これが現在のほとんどのチームのやり方です。
curl https://api.openai.com/v1/responses \
-H "Authorization: Bearer $OPENAI_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"model": "gpt-6-luna",
"input": "Route this support ticket to one department.\n\nTicket: I was charged twice for my order.",
"text": {
"format": {
"type": "json_schema",
"name": "ticket_route",
"strict": true,
"schema": {
"type": "object",
"properties": {
"department": {
"type": "string",
"enum": ["billing", "technical", "shipping", "other"]
}
},
"required": ["department"],
"additionalProperties": false
}
}
}
}'
そして、同じチケットに対するDecisionsリクエストです。
curl https://api.openai.com/v1/decisions \
-H "Authorization: Bearer $OPENAI_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"model": "gpt-6-luna",
"input": "I was charged twice for my order.",
"questions": [
{
"type": "choice",
"name": "department",
"instructions": "Which department should handle this ticket?",
"choices": [
{"value": "billing", "description": "Charges, refunds, invoices"},
{"value": "technical", "description": "Bugs, errors, login problems"},
{"value": "shipping", "description": "Delivery, tracking, returns in transit"},
{"value": "other", "description": "Anything else"}
]
}
]
}'
Responsesのボディは、プロンプト内に質問を、スキーマ内に許可される回答を保持します。Decisionsのボディは、生のチケットを`input`として、質問を2〜255個の一意な値を持つ`choice`として保持します。このエンドポイントには`temperature`、`reasoning`、`stream`、`text`フィールドは存在しないため、それらは含まれません。
それぞれが返すもの
Responsesは生成されたテキストを返します。厳密なスキーマを使用する場合、そのテキストは有効なJSONであるため、解析後にラベルを保持します。
{"department": "billing"}
信頼度が必要な場合は、スキーマにフィールドを追加し、モデルに書き込むよう依頼します。返されるのは確率のように見える生成されたテキストであり、測定されたものではありません。 Decisionsはラベルとその背後にある分布を返します。以下の数値は、この正確な入力に対するOpenAIのガイド例です。
{
"model": "gpt-6-luna",
"answers": [
{
"type": "choice",
"name": "department",
"choice": "billing",
"probabilities": [
{"value": "billing", "probability": 0.95},
{"value": "technical", "probability": 0.02},
{"value": "shipping", "probability": 0.01},
{"value": "other", "probability": 0.02}
],
"confidence": 0.93
}
]
}
`usage`オブジェクトは`answers`に続きます(コストのセクションに示されています)。パーサーも正規表現も必要ありません。`confidence`フィールドはしきい値として使用するもので、OpenAIのガイダンスでは、精度やキャリブレーションの数値は公開されていないため、独自のラベル付きサンプルからしきい値を設定することをお勧めしています。拒否は`{"type": "refusal", "name": "department"}`として到着します。同じリクエスト内の他の質問には引き続き回答が提供されます。
コスト:一度の計算
両方のエンドポイントは、短いコンテキスト(最大272K入力トークン)でLunaの入力に対して100万トークンあたり$0.10を課金します。分割は出力に対して行われます。500トークンのチケットを1,000,000リクエストで考えてみましょう。
- Decisions: 500 / 1,000,000 x $0.10 = リクエストあたり$0.00005、したがって100万リクエストで$50。出力またはキャッシュラインを追加する必要はありません。
- Responses: 同様に$50の入力に加え、出力は100万トークンあたり$0.50です。40トークンのJSONラベルは40 / 1,000,000 x $0.50 = リクエストあたり$0.00002、または100万リクエストで$20です。さらに、Lunaが$0.50で出力として課金する推論トークンが追加されます。
したがって、ラベルのみでの目に見える差は$50対$70です。より大きな差は推論の行であり、正直に言えば、Decisionsは出力トークンを全く課金しません。OpenAIの参照例では、両方のカウンターが0と表示されます。
"usage": {
"input_tokens": 42,
"input_tokens_details": {"cached_tokens": 0, "cache_write_tokens": 0},
"output_tokens": 0,
"output_tokens_details": {"reasoning_tokens": 0},
"total_tokens": 42
}
2つの注意点があります。ResponsesにはDecisionsにはない機能があります。`reasoning.effort`はLunaでは`none`まで下げることができ、プロンプトキャッシングは繰り返される入力を100万トークンあたり$0.01に引き下げ、Batch APIは標準料金を半減させます。これらはいずれもDecisionsではドキュメント化されていません。また、長いコンテキストの入力(272Kトークン以上)は両方の入力料金を2倍にするため、長いDecisionsリクエストは100万入力トークンあたり$0.20になります(料金ページの乗数から派生)。地域処理は10%追加されます。
速度
OpenAIによると、Decisions APIはResponses APIよりも約10倍高速です。絶対的なレイテンシの数値は公開されていないため、この主張は予算ではなく方向性として捉え、ホットパスを移行する前に自身のp50とp95を測定してください。OpenAIフォーラムのある開発者は、遅い接続で画像入力の決定が約0.8秒で返されたと報告しましたが、これは逸話であり、ベンチマークではありません。この方向性はもっともらしいです。Responsesは推論を含むトークンを生成し、最後のトークンを待つ必要があります。
決定ルール
出力が以下のいずれかである場合はDecisionsを選択してください。
- 確率を伴うYes/No(`predicate`):「このメッセージはスパムですか?」
- N個の順序付けされていないカテゴリのいずれか(`choice`):部署、意図、次に呼び出すモデルやツール。たとえば「その他」のようなフォールバックを含めます。
- 順序付けされたレベル(`score`):重要度、優先度、緊急度。スコアは0ベースのレベルインデックスの確率加重平均であり、1.1はレベル1とレベル2の間で、1に近いことを意味します。
- ゲート:`confidence`または`probability`をしきい値と比較し、信頼度の低い項目を人間のキューに送ります。
以下のいずれかが当てはまる場合はResponsesを選択してください。
- 人が読むテキストが必要な場合:要約、返信、説明。
- 独自の形式でオブジェクトが必要な場合:抽出されたフィールド、ネストされた構造、長さが不明な配列。これは構造化出力の領域であり、OpenAIのガイドもそう述べています。
- モデルが引数付きのツール呼び出しを要求する必要がある場合:関数呼び出し。
- ストリーミング、会話の状態、またはLuna以外のモデルが必要な場合。
- ある決定が別の決定に依存しており、両方を1回のラウンドトリップで実行したい場合。Decisionsは1つの入力に対して複数の独立した質問を保持しますが、依存する決定には別々のリクエストが必要です。
多くのパイプラインでは両方が必要です。分類とゲートにはDecisions、返信の作成にはResponsesです。
ResponsesからDecisionsへの分類器の移行
厳密なenumスキーマでチケットをルーティングしている場合、移行は小さなものです。
- 同じ`input`を、生のチケットにまで遡って簡素化し、質問をプロンプトから外します。
- 質問を`questions`に`choice`として入れ、enum値を`choices[].value`として、それぞれ1行の`description`を付けます。値は文字列またはブール値にでき、`true`と`"true"`は区別されます。
- パーサーを削除します。`answers[0].choice`と`answers[0].confidence`を読み取ります。回答は尋ねた順序で到着し、設定した`name`をエコーします。次に、ラベル付きサンプルからしきい値を設定します。
- 入力パスを確認します。Decisionsはユーザーメッセージのみを受け入れます。システムまたはアシスタントの役割、関数呼び出し、ファイル、`file_id`は受け入れません。システムプロンプトのルールを`instructions`または選択肢の説明に組み込みます。画像はBase64データURLとして入力されます。リファレンスには公開HTTP(S) URLも記載されているため、まずホストされた画像をテストしてください。
- チェーンを分割します。「分類し、請求の場合は返金資格を決定する」は2つのリクエストになります。
1つのApidogプロジェクトで両方をテストする
最もクリーンな決定方法は、同じラベル付きチケットに対して両方のリクエストを実行し、比較することです。Apidogでは、キーを環境変数として一度保存し、両方の保存されたリクエストの`Authorization: Bearer`ヘッダーで`{{OPENAI_API_KEY}}`を参照することで、リテラルキーが保存されたボディに書き込まれないようにします。 両方のリクエストに同じアサーションを与えます。つまり、部署が`billing`であることです。Decisionsリクエストでは、これは`$.answers[0].choice`に対するJSONPathアサーションで、`$.answers[0].confidence`が0.8より大きく、`$.usage.output_tokens`が0であることと並行してチェックされます。Responsesリクエストでは、ラベルは生成されたテキスト内に存在するため、短いリクエスト後スクリプトがそれをアサーションがチェックする変数に解析します。次に、2つのレスポンスの`usage`を比較します。Decisionsは出力トークンと推論トークンをゼロと報告しますが、Responsesはそうではありません。 チケットテキストと期待される部署のCSVに基づいたデータ駆動型テストシナリオにこのペアを変換し、実行すると、各エンドポイントが信頼度ラインを超えて正しくルーティングするチケットの数が示されます。ルーターを最初に構築できるように`answers`配列をモックします(条件付きモックレスポンスのように)。そして、Apidog CLIを使用してCIでシナリオを実行することで、文言やモデルエイリアスの変更によってチケットが誤ルーティングされるのではなく、テストが失敗するようにします。LLMアプリケーションのテストで、より多くのアサーションパターンをご覧ください。
よくある質問
Responses APIはDecisionsのように確率を返すことができますか? 測定値としてはできません。JSONスキーマ内の`confidence`フィールドは、モデルが書き込んだ数値を返しますが、これは生成されたテキストです。Decisionsは、エンドポイント自体から提供したオプションに対する確率を返します。
DecisionsでGPT-6 Luna以外のモデルを使用できますか? いいえ。ガイドには、現在利用可能なモデルはgpt-6-lunaのみであると記載されています。弊社のGPT-6 Luna概要をご覧ください。
DecisionsはTypeSafeのJevとどう違うのですか? どちらも型付きの回答と確率を返し、入力のみを課金します。これらは料金、入力、レスポンスの形状が異なります。Decisions API vs Jevをご覧ください。
Decisions APIは無料ですか? いいえ。入力100万トークンあたり$0.10が課金されます。無料のDecisionsティアはドキュメント化されていません。Luna自体への無料ルートについては、GPT-6 Lunaを無料で利用する方法をご覧ください。
次のステップ
今日Responsesで実行している分類器を1つ取り上げ、それを`choice`の質問として再構築し、同じアサーションでApidogの50枚のラベル付きチケットで両方を実行します。信頼度のしきい値が維持され、使用量に出力トークンがゼロと表示された場合、それがあなたの答えです。Apidogをダウンロードし、最初の呼び出しと完全なテストウォークスルーについてはDecisions APIの使用方法に従ってください。
