GPT-5 モデルシリーズが Azure AI Foundry から利用可能になりました。開発者向けのコントロール(reasoning_effort や 冗長性などのパラメータ)により、推論の深度、速度、詳細度を調整できます。また、新しい自由形式のツール呼び出し機能により、厳格なスキーマに縛られることなくツールの互換性を拡張したり、逆に CFG ルールによって出力が文法に従うように厳格に制限したりできるようになりました。
Region availability
Model | Region |
---|---|
gpt-5 (2025-08-07) | East US 2 (Global Standard & Data Zones), Sweden Central (Global Standard & Data Zones) |
gpt-5-mini (2025-08-07) | East US 2 (Global Standard & Data Zones), Sweden Central (Global Standard & Data Zones) |
gpt-5-nano (2025-08-07) | East US 2 (Global Standard & Data Zones), Sweden Central (Global Standard & Data Zones) |
gpt-5-chat (2025-08-07) | East US 2 (Global Standard), Sweden Central (Global Standard) |
現在 gpt-5
のみ申請が必要ですが、以前に申請し o3
モデルへのアクセスを付与された方は、モデルリリース時に承認済みのサブスクリプションが自動的にアクセス権限を取得するため、再申請は不要です。
新機能
- Verbosity Parameter(冗長性パラメーター)
- Free-Form Function Calling(自由形式の関数呼び出し)
- Allowed tools
- Context-Free Grammar (CFG)
- Minimal Reasoning
- Preambles(序文)
GPT-5: 実世界ユースケースを可能にする7つの新機能
モデルの精度面など内部のアップデートについてはこちらにまとまっています。
Verbosity Parameter(冗長性パラメーター)
モデルに返答の拡張度を高くしたり低くしたりするようヒントを与えます。コーディングタスクの場合、詳細度パラメータは、生成されるコードの長さと複雑さ、そして付随する説明の深さにも影響します。
- 低→ 簡潔な UX、最小限の文章
- 中 (デフォルト) → バランスの取れた詳細度
- 高→ 詳細、監査、教育、または Hand-off に最適
素数判定(verbosity:low
)
response = client.responses.create(
model="gpt-5-mini",
input="素数を判定するPythonプログラムを出力してください。",
text={"verbosity": "low"},
)
# print(response.model_dump_json(indent=2))
output_text = ""
for item in response.output:
if hasattr(item, "content") and item.content:
for content in item.content:
if hasattr(content, "text") and content.text:
output_text += content.text
print(output_text)
#!/usr/bin/env python3
import sys
def is_prime(n: int) -> bool:
if n <= 1:
return False
if n <= 3:
return True
if n % 2 == 0:
return False
i = 3
while i * i <= n:
if n % i == 0:
return False
i += 2
return True
def main():
try:
n = int(input().strip())
except Exception:
print("整数を入力してください", file=sys.stderr)
return
print("素数です" if is_prime(n) else "素数ではありません")
if __name__ == "__main__":
main()
output_tokens
は 614 トークン。
素数判定(verbosity:medium
)
response = client.responses.create(
model="gpt-5-mini", # Replace with your model deployment name
input="素数を判定するPythonプログラムを出力してください。",
text={"verbosity": "medium"},
)
以下は与えられた整数が素数かどうかを判定する Python プログラムです。大きな整数にも高速に動作する Miller–Rabin テスト(64 ビット整数まで決定的になる基を使用)を実装しています。
```python
# prime_check.py
# 入力された整数が素数かどうか判定するプログラム
def is_prime(n: int) -> bool:
if n < 2:
return False
# 小さい素数で簡単に弾く
small_primes = (2, 3, 5, 7, 11, 13, 17, 19, 23, 29)
for p in small_primes:
if n == p:
return True
if n % p == 0:
return False
# n-1 = d * 2^s を計算
d = n - 1
s = 0
while d % 2 == 0:
d //= 2
s += 1
# 64ビットまで決定的となる基の集合(一般用途に十分)
bases = (2, 325, 9375, 28178, 450775, 9780504, 1795265022)
for a in bases:
if a % n == 0:
continue
x = pow(a, d, n)
if x == 1 or x == n - 1:
continue
for _ in range(s - 1):
x = (x * x) % n
if x == n - 1:
break
else:
return False
return True
if __name__ == "__main__":
try:
n = int(input("整数を入力してください: ").strip())
except ValueError:
print("整数を入力してください。")
else:
if is_prime(n):
print(f"{n} は素数です。")
else:
print(f"{n} は素数ではありません。")
output_tokens
は 1,323 トークン。
素数判定(verbosity:high
)
response = client.responses.create(
model="gpt-5-mini", # Replace with your model deployment name
input="素数を判定するPythonプログラムを出力してください。",
text={"verbosity": "high"},
)
print(response.model_dump_json(indent=2))
以下にいくつかの方法での素数判定プログラム(Python)を示します。用途に応じて使ってください。
1) 学習向けのシンプルな試し割り(O(√n))
2) 6k±1 に基づく高速化版(少し高速)
3) ミラー–ラビン(Miller–Rabin)の決定論的バージョン(64ビット整数まで正確) — 大きな数に対して高速かつ確実
各コードは関数 is_prime(n) を提供し、最後に簡単なコマンドライン/標準入力からの利用例を付けています。
注意:
- n <= 1 は素数ではありません(n=2,3 は素数)。
- 負の数、小数、非数入力はエラー扱いします。
- ミラー–ラビンの実装は、与えた基の集合により 64 ビット符号なし整数(< 2^64)まで完全(決定的)です。より大きな数は確率的テストになりますが、基を増やせば実用上十分に安全です。
------------------------------------------------------------
1) シンプルな試し割り(学習用)
------------------------------------------------------------
# シンプルな素数判定(O(√n))
def is_prime_simple(n: int) -> bool:
---省略---
------------------------------------------------------------
2) 6k±1 に基づく高速化(実用的な単純法)
------------------------------------------------------------
# 6k±1 を利用した試し割り(やや高速)
def is_prime_6k(n: int) -> bool:
---省略---
# 使い方は上と同様
------------------------------------------------------------
3) ミラー–ラビン(64ビットまで決定的) — 高速・実用的
------------------------------------------------------------
# Miller-Rabin(決定的な基で 64-bit 範囲まで正確)
def is_prime_miller_rabin(n: int) -> bool:
---省略---
# 使い方の例(コマンドライン利用)
if __name__ == "__main__":
import sys
if len(sys.argv) > 1:
# コマンドライン引数で複数個渡せる
for arg in sys.argv[1:]:
try:
n = int(arg)
except:
print(f"{arg}: 整数ではありません")
continue
print(f"{n}: {'素数' if is_prime_miller_rabin(n) else '合成数(素数ではない)'}")
else:
try:
n = int(input("判定する整数を入力してください: ").strip())
except:
print("整数を入力してください")
else:
print(f"{n} は素数です" if is_prime_miller_rabin(n) else f"{n} は素数ではありません")
------------------------------------------------------------
補足・選び方
- 学習・小さい数(数万・百万程度): is_prime_simple や is_prime_6k で十分です。実装がシンプルで理解しやすい。
- 64ビット整数(10^18 程度まで)を扱うなら is_prime_miller_rabin が高速で確実(上の基で決定的)。
- さらに大きな整数(暗号用途レベル)では Miller-Rabin を確率的に複数回行う、あるいは gmpy2 の is_prime(BPSW などの信頼できる実装)を使うのが一般的です。
- Python 標準の pow(a, d, n) は高速(繰り返し二乗法)で、Miller-Rabin 実装に必須です。
必要なら、以下も提供できます:
- Python スクリプトをファイル化してコマンドライン引数/標準入力で複数判定する例
- 大きな数に対する確率的 Miller-Rabin の反復回数と誤判定確率の説明
- gmpy2 を使った超高速判定(インストール手順と使用例)
どれが必要か教えてください。
output_tokens
は 2,048 トークン。
ということで、output_tokens
は以下のように変化したことが分かりました。
-
low
: 614 -
medium
: 1,323 -
high
: 2,048
Free-Form Function Calling(自由形式の関数呼び出し)
Python スクリプトから SQL クエリまで、あらゆる生のテキストペイロードを JSON ラップなしで直接カスタムツールに連携します。
response = client.responses.create(
model="gpt-5-mini",
input="code_exec ツールを使用して、strawberry の 'r' の文字数に等しい半径を持つ円の面積を計算してください。",
text={"format": {"type": "text"}},
tools=[
{
"type": "custom",
"name": "code_exec",
"description": "Executes arbitrary python code",
}
]
)
print(response.output)
[ResponseReasoningItem(id='rs_68951f42e5708190a8931f52b576ba480bed8f4c1d55f7d9', summary=[], type='reasoning', content=None, encrypted_content=None, status=None), ResponseCustomToolCall(call_id='call_2oSLJXWl8vLiCBTGjN0NacwS', input='# Python code to compute area of a circle whose radius equals the number of \'r\' characters in "strawberry"\nimport math\nword = "strawberry"\nr = word.count(\'r\')\narea = math.pi * r**2\n# Print radius and area (numeric and symbolic)\nprint(f"radius = {r}")\nprint(f"area = {area}") # numeric\nprint(f"area (exact) = {r**2} * pi") # exact form', name='code_exec', type='custom_tool_call', id='ctc_68951f45246c81909c8fa9f4a102c0f80bed8f4c1d55f7d9', status='completed')]
ResponseReasoningItem
, ResponseCustomToolCall
が返る。ResponseCustomToolCall
の input
をサンドボックスでそのまま実行できる。
# response.outputからinputの中身を取得
for item in response.output:
if hasattr(item, 'type') and item.type == 'custom_tool_call':
print("=== Generated Code ===")
print(item.input)
print("======================")
=== Generated Code ===
# Python code to compute area of a circle whose radius equals the number of 'r' characters in "strawberry"
import math
word = "strawberry"
r = word.count('r')
area = math.pi * r**2
# Print radius and area (numeric and symbolic)
print(f"radius = {r}")
print(f"area = {area}") # numeric
print(f"area (exact) = {r**2} * pi") # exact form
======================
構造化された JSON が必要なく、生のテキストの方がターゲット ツールにとって自然な場合に使用します。
とあるが、どこまで内容が保証される?
Allowed tools
allowed_tools
パラメーターは、GPT-5 Responses API の tool_choice
内で、N 個のツール定義を指定しつつ、モデルが使用できるツールを M(N 未満)に制限します。ツールの完全なリストを tools
に列挙し、allowed_tools
ブロックを使用してサブセットを指定し、モードを指定します。モードは auto
または required
のいずれかが指定可能。
"tool_choice": {
"type": "allowed_tools",
"mode": "auto",
"tools": [
{ "type": "function", "name": "get_weather" },
{ "type": "mcp", "server_label": "deepwiki" },
{ "type": "image_generation" }
]
}
}'
Context-Free Grammar (CFG)
とうとう来ましたね!出力が文法に従うように制限できる機能!去年勉強した技術が GPT-5 で使えるようになったんです!
CFG は、文法規則を用いて文字列を生成するための形式的なルールセットであり、これらの規則は「生成規則」として定義され、非終端記号と終端記号から構成されます。CFG はパーサーによって入力文字列が文法に従っているかどうかを判断するために使われます。これは、プログラミング言語の構文や OpenAI ツール用のカスタムフォーマットに出力を制約する際に役立ちます。
LLM は自然文は得意でも、JSON やコードのような厳格な構造出力では、確率的生成ゆえに稀に文法違反が起きます。ツール呼び出し/データ抽出/コード生成で致命傷になり得ます。そのため、制約付きデコーディング(Constrained Decoding)という技術により、次に生成されるトークンの確率分布を制御し、構文的に不正なトークンの確率をゼロにすることで、モデルが文法に従った有効な文字列のみを出力することを保証しています。モデルのサンプリングを制限するために、内部で LLGuidance を使用しているとの記述がありました。今回、これまで Structured Outputs の後ろに隠れていた技術がコントロール可能になったというわけです。
サポートされている文法構文
- Lark - https://lark-parser.readthedocs.io/en/stable/
- 正規表現 - https://docs.rs/regex/latest/regex/#syntax
1. Lark 文法 CFG 構文
OpenAI の例に従って、SQLの 特定の構文パターン を解析・生成するためのルールセットを Lark 文法で定義します。"SELECT ... FROM ... WHERE ... ORDER BY ..." のような典型的なクエリパターンのみをサポートしたい場合は以下のように記述します。これはむちゃくちゃいい例ですね!
import textwrap
# ----------------- grammars for MS SQL dialect -----------------
mssql_grammar = textwrap.dedent(r"""
// ---------- Punctuation & operators ----------
SP: " "
COMMA: ","
GT: ">"
EQ: "="
SEMI: ";"
// ---------- Start ----------
start: "SELECT" SP "TOP" SP NUMBER SP select_list SP "FROM" SP table SP "WHERE" SP amount_filter SP "AND" SP date_filter SP "ORDER" SP "BY" SP sort_cols SEMI
// ---------- Projections ----------
select_list: column (COMMA SP column)*
column: IDENTIFIER
// ---------- Tables ----------
table: IDENTIFIER
// ---------- Filters ----------
amount_filter: "total_amount" SP GT SP NUMBER
date_filter: "order_date" SP GT SP DATE
// ---------- Sorting ----------
sort_cols: "order_date" SP "DESC"
// ---------- Terminals ----------
IDENTIFIER: /[A-Za-z_][A-Za-z0-9_]*/
NUMBER: /[0-9]+/
DATE: /'[0-9]{4}-[0-9]{2}-[0-9]{2}'/
""")
# ----------------- grammars for PostgreSQL dialect -----------------
postgres_grammar = textwrap.dedent(r"""
// ---------- Punctuation & operators ----------
SP: " "
COMMA: ","
GT: ">"
EQ: "="
SEMI: ";"
// ---------- Start ----------
start: "SELECT" SP select_list SP "FROM" SP table SP "WHERE" SP amount_filter SP "AND" SP date_filter SP "ORDER" SP "BY" SP sort_cols SP "LIMIT" SP NUMBER SEMI
// ---------- Projections ----------
select_list: column (COMMA SP column)*
column: IDENTIFIER
// ---------- Tables ----------
table: IDENTIFIER
// ---------- Filters ----------
amount_filter: "total_amount" SP GT SP NUMBER
date_filter: "order_date" SP GT SP DATE
// ---------- Sorting ----------
sort_cols: "order_date" SP "DESC"
// ---------- Terminals ----------
IDENTIFIER: /[A-Za-z_][A-Za-z0-9_]*/
NUMBER: /[0-9]+/
DATE: /'[0-9]{4}-[0-9]{2}-[0-9]{2}'/
""")
PostgreSQL 生成
sql_prompt_pg = """
postgres_grammar を呼び出して、PostgreSQL 用のクエリを生成し、顧客ごとに最新の 5 件の注文を取得します。
取得するカラムは customer_id、order_id、order_date、および total_amount です。
ただし、total_amount が 500 を超え、order_date が 『2025-01-01』 以降である条件を満たすレコードのみを取得します。
"""
response_pg = client.responses.create(
model="gpt-5-mini",
input=sql_prompt_pg,
text={"format": {"type": "text"}},
tools=[
{
"type": "custom",
"name": "postgres_grammar",
"description": "Executes read-only PostgreSQL queries limited to SELECT statements with LIMIT and basic WHERE/ORDER BY. YOU MUST REASON HEAVILY ABOUT THE QUERY AND MAKE SURE IT OBEYS THE GRAMMAR.",
"format": {
"type": "grammar",
"syntax": "lark",
"definition": postgres_grammar
}
},
],
parallel_tool_calls=False,
)
print("--- PG SQL Query ---")
print(response_pg.output[1].input)
--- PG SQL Query ---
SELECT customer_id, order_id, order_date, total_amount FROM orders WHERE total_amount > 500 AND order_date > '2025-01-01' ORDER BY order_date DESC LIMIT 5;
MS SQL 生成
sql_prompt_mssql = """
mssql_grammar を呼び出して、Microsoft SQL Server 用のクエリを生成し、顧客ごとに最新の 5 件の注文を取得します。
取得するカラムは customer_id、order_id、order_date、および total_amount です。
ただし、total_amount が 500 を超え、order_date が 『2025-01-01』 以降である条件を満たすレコードのみを取得します。
"""
response_mssql = client.responses.create(
model="gpt-5-mini",
input=sql_prompt_mssql,
text={"format": {"type": "text"}},
tools=[
{
"type": "custom",
"name": "mssql_grammar",
"description": "Executes read-only Microsoft SQL Server queries limited to SELECT statements with LIMIT and basic WHERE/ORDER BY. YOU MUST REASON HEAVILY ABOUT THE QUERY AND MAKE SURE IT OBEYS THE GRAMMAR.",
"format": {
"type": "grammar",
"syntax": "lark",
"definition": mssql_grammar
}
},
],
parallel_tool_calls=False,
)
print("--- MS SQL Query ---")
print(response_mssql.output[1].input)
--- MS SQL Query ---
SELECT TOP 5 customer_id, order_id, order_date, total_amount FROM orders WHERE total_amount > 500 AND order_date > '2025-01-01' ORDER BY order_date DESC;
例:許可された最小限のタグだけを含むシンプルな HTML 断片 を生成
こーいうこともできるんだよ。
safe_html_grammar = textwrap.dedent(r"""
start: elements
elements: element*
element: tag_open content tag_close | self_closing_tag
tag_open: "<" tag_name ">"
tag_close: "</" tag_name ">"
self_closing_tag: "<" tag_name "/>"
tag_name: "p" | "b" | "i" | "strong" | "em" | "br"
content: (text | element)*
text: /[^<]+/
""")
html_prompt = (
"safe_html_grammar を呼び出して、シンプルな僕のホームページを生成します。"
)
response_html = client.responses.create(
model="gpt-5-mini",
input=html_prompt,
text={"format": {"type": "text"}},
tools=[
{
"type": "custom",
"name": "safe_html_grammar",
"description": "Saves a safe HTML snippet.",
"format": {
"type": "grammar",
"syntax": "lark",
"definition": safe_html_grammar
}
},
],
parallel_tool_calls=False
)
print("--- HTML ---")
print(response_html.output[1].input)
--- HTML ---
<p><strong>僕のホームページ</strong></p><p>こんにちは、ここは僕の小さなホームページです。
簡単な自己紹介と活動をまとめています。</p>
<p><strong>自己紹介</strong></p>
<p>ソフトウェアやデザインに興味があり、日々学びながらプロジェクトを作っています。読書と散歩、
コーヒーが好きです。</p>
<p><strong>スキル</strong></p>
<p>・プログラミング: JavaScript, Python<br/>・デザイン: UI/UX, プロトタイピング<br/>
・その他: ドキュメンテーション、チームコラボレーション</p>
<p><strong>プロジェクト</strong></p><p>最近は個人ツールや小さなウェブアプリを作っています。気になるものがあれば、ぜひ感想を送ってください。</p>
<p><strong>連絡先</strong></p>
<p>メール: yourname@example.com<br/>SNS: @yourhandle</p>
<p><em>見てくれてありがとう!</em></p>
- LLGuidance Syntax – https://github.com/guidance-ai/llguidance/blob/main/docs/syntax.md
制限
文法の一部はサポートされていないものもあるので注意。ベストプラクティスとトラブルシューティングを参照。
サポートされていない Lark 文法
- Lookaround in regexes ((?=...), (?!...), etc.)
- Lazy modifier (*?, +?, ??) in regexes.
- Terminal priorities, templates, %declares, %import (except %import common).
2. 正規表現 CFG 構文
timestamp_grammar_definition = r"^\d{4}-(0[1-9]|1[0-2])-(0[1-9]|[12]\d|3[01]) (?:[01]\d|2[0-3]):[0-5]\d$"
timestamp_prompt = (
"timestamp_grammar を呼び出して、2025年8月7日午前10時のタイムスタンプを生成します。"
)
response_time = client.responses.create(
model="gpt-5-mini",
input=timestamp_prompt,
text={"format": {"type": "text"}},
tools=[
{
"type": "custom",
"name": "timestamp_grammar",
"description": "Saves a timestamp in date + time in 24-hr format.",
"format": {
"type": "grammar",
"syntax": "regex",
"definition": timestamp_grammar_definition
}
},
],
parallel_tool_calls=False
)
print("--- Timestamp ---")
print(response_time.output[1].input)
--- Timestamp ---
2025-08-07 10:00
これは開発捗ります!
正規表現例:こんなことも(笑)
letter_grammar = r"^[^\s]+さんへ\n[\s\S]*?敬具$"
timestamp_prompt = (
"letter_grammar を呼び出して、白ヤギさんから黒ヤギさんに簡単な挨拶のお手紙を生成します"
)
response = client.responses.create(
model="gpt-5-mini",
input=timestamp_prompt,
text={"format": {"type": "text"}},
tools=[
{
"type": "custom",
"name": "letter_grammar",
"description": "Saves a safe letter snippet.",
"format": {
"type": "grammar",
"syntax": "regex",
"definition": letter_grammar
}
},
],
parallel_tool_calls=False,
)
print("--- letter_grammar ---")
print(response.output[1].input)
--- letter_grammar ---
黒ヤギさんへ
こんにちは。お元気ですか。
最近、散歩が気持ちいい季節になりましたね。
近いうちにお茶でもいかがですか。
お会いできるのを楽しみにしています。
白ヤギより
敬具
制限
正規表現は Rust の正規表現ライブラリ(crate)の構文を使用し、Python の re
モジュールは使用しません。正規表現の以下の機能はサポートされていません:
- Look around
- Lazy 量指定子 (*?, +?, ??)
⚠️注意: 8/8 朝の時点で Azure OpenAI のみ以下のエラーで CFG を使用できない状況
BadRequestError: Error code: 400 - {'error': {'message': "Missing required parameter: 'tools[0].format.grammar'.", 'type': 'invalid_request_error', 'param': 'tools[0].format.grammar', 'code': 'missing_required_parameter'}}
→8/12 修正を確認。
Minimal Reasoning
GPT-5 を推論トークンをほとんどまたは全く使用せずに実行することで、レイテンシを最小限に抑え、最初のトークン生成時間を短縮します。説明を必要としない、決定論的で軽量なタスク(抽出、フォーマット、短い書き換え、単純な分類など)に最適です。指定がない場合、effort
はデフォルトで medium
になります。
prompt = "レビューの感情を「ポジティブ」「ニュートラル」「ネガティブ」の3つに分類してください。1つの単語のみを返してください。"
response = client.responses.create(
model="gpt-5",
input= [{ 'role': 'developer', 'content': prompt },
{ 'role': 'user', 'content': 'そのレストランの料理は本当に美味しかったです!みんなにオススメします。' }],
reasoning = {
"effort": "minimal"
},
)
response.output[1].content[0].text
'ポジティブ'
"output_tokens": 10,
"output_tokens_details": {
"reasoning_tokens": 0
},
"total_tokens": 80
Preambles(序文)
Preambles は、GPT- 5がツールや関数を呼び出す前に生成する、ユーザーに見える短い説明です。その目的や計画(例:「このツールを呼び出す理由」)を説明します。Preambles は、思考の連鎖の後に表示され、実際のツール呼び出しの前に配置されます。これにより、モデルの推論プロセスが透明化し、デバッグのしやすさ、ユーザーの信頼性、および細かな制御可能性が向上します。
GPT-5 prompting guide を参考に、以下のようなプロンプトを注入します。
<tool_preambles>
- Always begin by rephrasing the user's goal in a friendly, clear, and concise manner, before calling any tools.
- Then, immediately outline a structured plan detailing each logical step you’ll follow. - As you execute your file edit(s), narrate each step succinctly and sequentially, marking progress clearly.
- Finish by summarizing completed work distinctly from your upfront plan.
</tool_preambles>
response = client.responses.create(
model="gpt-5-mini",
input= [{ 'role': 'developer', 'content': prompt },
{ 'role': 'user', 'content': "code_exec ツールを使用して、strawberry の 'r' の文字数に等しい半径を持つ円の面積を計算してください。" }],
text={"format": {"type": "text"}},
tools=[
{
"type": "custom",
"name": "code_exec",
"description": "Executes arbitrary python code",
}
]
)
print(response.output)
[ResponseReasoningItem(id='rs_689530f7ded8819388d0fcd86152cda60d8c3c898bd413eb', summary=[], type='reasoning', content=None, encrypted_content=None, status=None), ResponseOutputMessage(id='msg_6895310149c481938920c4597e4233700d8c3c898bd413eb', content=[ResponseOutputText(annotations=[], text='ご要望の確認: "strawberry" の中の文字 \'r\' の数を半径とし、その半径の円の面積を計算します。\n\n実行プラン:\n1. 文字列 "strawberry" に含まれる \'r\' の出現回数を数える。\n2. その出現回数を半径 r として設定する。\n3. 面積を A = π r^2 で計算し、数値で表示する。\n4. 結果(半径と面積の数値、および簡潔な式)を返す。\n\nこれから計算を実行します。実行中は各手順を順に報告します。まずステップ1〜3を実行します。', type='output_text', logprobs=[])], role='assistant', status='completed', type='message'), ResponseCustomToolCall(call_id='call_TgHNc4ddm3pSZJr8QOBLfwNb', input='s = "strawberry"\ncount = s.count(\'r\')\nr = count\nimport math\narea = math.pi * r**2\n{\n "word": s,\n "r_count": count,\n "radius": r,\n "area_numeric": area,\n "area_exact": f"{r**2}*pi"\n}', name='code_exec', type='custom_tool_call', id='ctc_68953102b79481938e05ddf319485d5f0d8c3c898bd413eb', status='completed')]
出力を構造化
# レスポンスから構造化されたデータを取得
def parse_response_structure(response_output):
result = {
"reasoning": [],
"messages": [],
"tool_calls": []
}
for item in response_output:
if hasattr(item, 'type'):
if item.type == 'reasoning':
result["reasoning"].append({
"id": item.id,
"summary": item.summary,
"status": item.status
})
elif item.type == 'message':
message_data = {
"id": item.id,
"role": item.role,
"status": item.status,
"content": []
}
if hasattr(item, 'content') and item.content:
for content in item.content:
if hasattr(content, 'text'):
message_data["content"].append({
"type": content.type,
"text": content.text
})
result["messages"].append(message_data)
elif item.type == 'custom_tool_call':
result["tool_calls"].append({
"id": item.id,
"call_id": item.call_id,
"name": item.name,
"input": item.input,
"status": item.status
})
return result
# 使用例
structured_data = parse_response_structure(response.output)
import json
print("=== 構造化されたレスポンス ===")
print(json.dumps(structured_data, indent=2, ensure_ascii=False))
ResponseOutputMessage
の解析
ResponseOutputText
が追加されていて実行プランが格納されている。
{
"reasoning": [
{
"id": "rs_689530f7ded8819388d0fcd86152cda60d8c3c898bd413eb",
"summary": [],
"status": null
}
],
"messages": [
{
"id": "msg_6895310149c481938920c4597e4233700d8c3c898bd413eb",
"role": "assistant",
"status": "completed",
"content": [
{
"type": "output_text",
"text": "ご要望の確認: \"strawberry\" の中の文字 'r' の数を半径とし、その半径の円の面積を計算します。\n\n実行プラン:\n1. 文字列 \"strawberry\" に含まれる 'r' の出現回数を数える。\n2. その出現回数を半径 r として設定する。\n3. 面積を A = π r^2 で計算し、数値で表示する。\n4. 結果(半径と面積の数値、および簡潔な式)を返す。\n\nこれから計算を実行します。実行中は各手順を順に報告します。まずステップ1〜3を実行します。"
}
]
}
],
"tool_calls": [
{
"id": "ctc_68953102b79481938e05ddf319485d5f0d8c3c898bd413eb",
"call_id": "call_TgHNc4ddm3pSZJr8QOBLfwNb",
"name": "code_exec",
"input": "s = \"strawberry\"\ncount = s.count('r')\nr = count\nimport math\narea = math.pi * r**2\n{\n \"word\": s,\n \"r_count\": count,\n \"radius\": r,\n \"area_numeric\": area,\n \"area_exact\": f\"{r**2}*pi\"\n}",
"status": "completed"
}
]
}
ご要望の確認: "strawberry" の中の文字 'r' の数を半径とし、その半径の円の面積を計算します。\n\n
実行プラン:\n
- 文字列 "strawberry" に含まれる 'r' の出現回数を数える。\n
- その出現回数を半径 r として設定する。\n
- 面積を A = π r^2 で計算し、数値で表示する。\n
- 結果(半径と面積の数値、および簡潔な式)を返す。\n\n
これから計算を実行します。実行中は各手順を順に報告します。まずステップ1〜3を実行します。
GitHub
参考
GPT-5 prompting guide 要勉強!