はじめに
こんにちは、マナティです!
2026年10月9日、Amazon Bedrock上のOpenAIモデルがResponses APIの reasoning.summary パラメータに対応しました。モデルが回答に至るまでの推論過程を人間が読める要約として一緒に返してくれる機能です。
実はちょっと前まで、Bedrockで reasoning.summary を付けるとエラーで弾かれていました。9月にはCodex CLIのIssueでこんなエラーが報告されています。
Unsupported parameter: 'reasoning.summary' is not supported with the 'global.openai.gpt-5.6-terra' model.
それが今回Bedrock上の全OpenAIモデルで使えるようになったとのこと。
せっかくなので、9月末にBedrockに来たばかりの GPT-6.1 Sol でサクッと試してみました。後半では同じGPT-6.1 Solが前日に対応したUltrafastモードも少しだけ試しています!
reasoning.summaryってなんぞや?
GPT系の推論モデルは回答を出す前に内部で「考える」ステップを踏みます。ただ、その推論の中身はそのままでは返ってきません。reasoning.summary を指定すると、その推論を要約したテキストが reasoning 出力アイテムの summary 配列に入って返ってきます。
指定できる値は次の3つになります。
| 値 | 内容 |
|---|---|
auto |
モデル側でいい感じに選ぶ |
concise |
短めの要約 |
detailed |
詳しめの要約 |
ちなみにnone や minimal を渡すと「Supported values are: 'concise', 'detailed', and 'auto'.」の400エラーになるそうです(aws-samplesのPRで報告されていました)。
What's Newでは応答の評価やデバッグ、ユーザーに「モデルがどう考えたか」を見せる用途が挙げられています。
今回の環境
| 項目 | 内容 |
|---|---|
| リージョン | ap-northeast-1(東京) |
| エンドポイント | bedrock-runtime(https://bedrock-runtime.ap-northeast-1.amazonaws.com/openai/v1) |
| モデル |
global.openai.gpt-6.1-sol(Global推論プロファイル) |
| 実行場所 | AWS CloudShell(Python 3.13) |
| SDK | openai 3.28.0 |
| reasoning effort | medium |
題材には次の論理パズルを使いました(正解はBになります)。
A、B、Cの3人のうち、1人だけが本当のことを言っています。
A「Bは嘘をついている」
B「Cは嘘をついている」
C「AもBも嘘をついている」
本当のことを言っているのは誰ですか?
東京リージョンでGPT-6.1 Solを選ぶと、推論プロファイルは「Global OpenAI GPT-6.1 Sol」の1択でした。
bedrock-runtimeエンドポイントでGPTモデルを呼ぶときは、基盤モデルID(openai.gpt-6.1-sol)ではなく推論プロファイルID(global.openai.gpt-6.1-sol)を指定します。
プレイグラウンドでは設定できなかった
APIを叩く前に、まずはコンソールのプレイグラウンドで試してみました。論理パズルを投げると回答はちゃんと返ってきます。
ただ出てくるのは回答だけで推論の要約は表示されません。設定パネルを開いても項目はシステムプロンプト・最大出力トークン・停止シーケンス・Guardrailsだけで、推論サマリーの設定は見当たりませんでした。
「⋮」メニューの「APIリクエストを表示」を開いてみると見当たらなかった理由が分かりました。
中身を見るとプレイグラウンドは裏でConverse APIを呼んでいました。一方でGPT-6.1 Solのモデルカードを見ると、推論サマリーは「Responses API only」の対応になっています。
2026年10月10日時点ではプレイグラウンド(Converse API)に推論サマリーやUltrafastの設定項目はありませんでした。試すときはResponses APIから呼ぶ必要があります。
ということで、今回はCloudShellからResponses APIを直接呼んで試します。
手順1: 短期APIキーを発行する
OpenAI SDKからBedrockを呼ぶにはBedrockのAPIキーが必要です。今回はお試しなので、期限が来たら勝手に失効する短期APIキーを使います。
Bedrockコンソールの左メニューから「APIキー」を開き、「短期APIキー」タブの「短期 API キーを生成」を押します。
短期キーは最大12時間で、コンソールセッションが終わると一緒に期限切れになります。権限はいまのコンソールセッションのものを引き継ぐので、追加のIAM設定もいりませんでした。
APIキーは生成した画面を閉じると再表示できません。また、キーを知っていれば誰でもBedrockを呼べてしまうのでスクショやブログ、Gitリポジトリには載せないようお気をつけを…
手順2: CloudShellで準備する
コンソール右上のCloudShellを開いてエンドポイントとキーを環境変数に入れます。
export OPENAI_BASE_URL="https://bedrock-runtime.ap-northeast-1.amazonaws.com/openai/v1"
export OPENAI_API_KEY="<コピーしたキー>"
pip install -q openai
このあと手順3で使うコードは、ファイルに保存して「アクション → ファイルのアップロード」で上げました。続けてアップロードしたら一度「Too Many Requests」で失敗したので、1ファイルずつ少し間を空けるのが良さそうです。
手順3: summaryを変えて呼んでみる
論理パズルをsummaryなし / auto / concise / detailed の4パターンで投げます。
import openai
from openai import OpenAI
client = OpenAI(timeout=60, max_retries=0) # OPENAI_BASE_URL / OPENAI_API_KEY を読む
PROMPT = (
"A、B、Cの3人のうち、1人だけが本当のことを言っています。\n"
"A「Bは嘘をついている」\n"
"B「Cは嘘をついている」\n"
"C「AもBも嘘をついている」\n"
"本当のことを言っているのは誰ですか?"
)
for summary in [None, "auto", "concise", "detailed"]:
reasoning = {"effort": "medium"}
if summary:
reasoning["summary"] = summary # ← これだけ
res = client.responses.create(
model="global.openai.gpt-6.1-sol",
input=PROMPT,
reasoning=reasoning,
max_output_tokens=2000,
store=False,
)
for item in res.output:
if item.type == "reasoning":
for s in item.summary:
print(s.text)
print(res.output_text)
Responses APIの store はデフォルトで true になっていて、入出力がBedrock側に30日間保持されます。保存が不要なら store=False を付けるのがいいと思います。
結果: 付けると読めるけど英語で返ってきた
| summary | summaryの件数 | 文字数 | 言語 | reasoningトークン | 回答 |
|---|---|---|---|---|---|
| なし | 0 | - | - | 106 | B(正解) |
| auto | 1 | 466 | 英語 | 98 | B(正解) |
| concise | 1 | 412 | 英語 | 83 | B(正解) |
| detailed | 1 | 380 | 英語 | 68 | B(正解) |
まず気づいたのが、日本語で質問しても要約は英語で返ってくることです。回答はちゃんと日本語ですが、要約だけ英語なんですよね。日本語のアプリでユーザーにそのまま見せたいなら、翻訳を挟む必要がありそうです。
面白いのは detailed で、auto と concise は「Aが本当なら…」「Bが本当なら…」と1人ずつ仮定する場合分けで解いていたんですが、detailed だけ解き方が違いました。
**Resolving the logic**
I’m checking the three conditions for consistency. Since A is the opposite of B, exactly one of A and B must be true. The condition that C is the opposite of both A and B then forces C to be false, because A and B cannot both be false. With C false, B must be true, which makes A false. So the consistent assignment is: **A = false, B = true, C = false**.
「AとBは反対のことを言っているので、どちらか1人だけが本当」と、論理で絞り込んでいます。回答はどれも同じ「B」でも、そこまでの道筋は毎回同じとは限らないということですね。これは要約が見えないと分からないところかなと思います。
一方で、名前に反して detailed が一番短い という結果になりました。reasoningトークンも detailed が68で一番少ないので、元の推論が短く済んだ分要約も短くなったのかなと思います。1回ずつなので「detailedは短い」とまでは言えません。
ちなみにsummaryを付けても出力トークンは増えていませんでした。ただ要約自体が課金対象に入るかどうかは、この数字だけでは判断できません。
9月にエラーになっていたterraはどうだったのか?
最初に紹介したIssueで弾かれていた global.openai.gpt-5.6-terra でも、手順3のコードの model だけ変えて試してみました。
結果、エラーは出ず4パターンとも要約が返ってきました。 9月の問題は解消されているみたいですね。
| summary | 文字数 | reasoningトークン |
|---|---|---|
| なし | - | 132 |
| auto | 447 | 158 |
| concise | 413 | 118 |
| detailed | 488 | 102 |
terra では detailed が一番長くなっていてSol とは順番が違いました。やっぱり1回ごとの揺れが大きいですね。
terra の detailed の要約は最後がこう締めくくられていました。
Therefore, B is the only truthful speaker. I’ll explain this concisely in Japanese.
推論は英語で進めつつ「日本語で簡潔に説明しよう」と回答の方針を決めているのが見えます。要約が英語で返ってくるのは、そもそも中で英語で考えているからなのかもしれません。
また、concise の要約には「Aが本当ならBは嘘で、Cも嘘になる。でもBの発言からCは本当になって矛盾」という、途中で話が食い違っている文がありました。回答は正しい「B」です。要約はあくまで要約で、推論そのものを正確に写したものとは限らない、というのは頭に置いておいたほうが良さそうです。
Ultrafastモードも試してみた
GPT-6.1 Solは前日の10月8日にUltrafastモードにも対応しています。
Responses APIで service_tier="ultrafast" を付けるだけで、速い推論に切り替わります。
| 100万トークンあたり(Global経由) | 入力 | 出力 |
|---|---|---|
| 通常 | $2 | $10 |
| Ultrafast | $12 | $60 |
Ultrafastの料金は通常の6倍です(高いなぁ…)。試すときは max_output_tokens で出力の上限を決めておくと安心です。
同じ論理パズルを通常とUltrafastで交互に5回ずつ呼んで比べました。
res = client.responses.create(
model="global.openai.gpt-6.1-sol",
input=PROMPT,
reasoning={"effort": "medium"},
service_tier="ultrafast", # ← これだけ
max_output_tokens=2000,
store=False,
)
print(res.service_tier) # 実際に処理されたティア
| 応答時間(中央値) | 応答時間(範囲) | 出力トークン/秒(中央値) | 返ってきた service_tier
|
|
|---|---|---|---|---|
| 通常 | 7.90秒 | 6.02〜10.69秒 | 28.1 | 5/5 default
|
| Ultrafast | 1.20秒 | 1.11〜1.48秒 | 172.2 | 5/5 ultrafast
|
東京からGlobal経由でもUltrafastはちゃんと効いていました。中央値で比べると応答時間は約6.6倍、出力トークン/秒は約6.1倍速いです。料金も6倍なので、今回の条件では「6倍払って約6倍速くなる」というきれいな対応になりました。
速さだけでなく、ばらつきの小ささも目立ちました。通常は6〜10.7秒と揺れたのに対して、Ultrafastは1.1〜1.5秒に収まっています。リアルタイムに返したいチャットやコーディング支援なら効いてきそうです。
ちなみに1回目の計測では通常のリクエストが1回、応答が返ってこないまま止まってしまいました。
openaiのSDKは何も指定しないと、1回のリクエストで最大10分待ち、接続エラーや429・5xxなどでは自動で最大2回リトライします。検証では OpenAI(timeout=60, max_retries=0) のようにしておくと、止まったときやエラーのときに状況が分かりやすいです。
今回の検証は全部合わせても、単価からの概算で$0.15くらいでした。
今回やっていないこと
- 推論サマリーは1パターン1回ずつ、Ultrafastは5回ずつなので、数字はあくまで今回の環境での値です。LLMの出力はばらつくので、傾向をちゃんと言うにはもっと回数が必要です。
- 要約を日本語で返させる方法は試していません。
- 推論サマリーはResponses APIだけで試しています(プレイグラウンドのConverse APIでは試していません)。
- ストリーミングでの最初のトークンが届くまでの時間(TTFT)は測っていません。
まとめ
BedrockのOpenAIモデルで reasoning.summary が使えるようになったので、GPT-6.1 Solで試してみました。
-
reasoningに"summary": "auto"を足すだけで、推論の要約がsummary配列に入って返ってくる。 - 日本語で質問しても要約は英語で返ってくる。
-
detailedだけ解き方が違うなど、同じ答えでも道筋の違いが見える。 - 9月にエラーが報告されていた gpt-5.6-terra も今は要約が返ってくる。
- ついでに試したUltrafastは6倍の料金で約6倍速かった。
1行足すだけでモデルがどう考えたかが見えるのは、デバッグにも説明にも使えそうで面白かったです。日本語にも対応してもらえるとありがたい…(切実)







