GPT-5.6 のリリースに伴い、Programmatic Tool Calling が公開されました。これを機に、エージェントツールの概要と、ツールの利用が増える中でモデルの集中力を維持する方法を振り返ってみましょう。
サポートエージェントに「注文 A-104 が遅れている理由」を尋ねると、エージェントは注文を確認し、運送会社に電話し、遅延の理由を説明するかもしれません。このやり取りの裏側では、モデルがアクションを要求し、ランタイムがそれを実行し、結果が返ってくるというループが動作しています。組み込みツール、MCP、スキル、Tool Search、Programmatic Tool Calling は、モデルが何を見て、何が返ってくるかを変えます。
1. Tool Calling の基本:モデルが要求し、アプリケーションが実行する
クライアント所有の関数 の場合、モデルはあなたのコードを実行しません。モデルはツール名、JSON 引数、コール ID を返します。あなたのアプリケーションがリクエストを確認し、関数を実行し、同じ ID を持つ function_call_output を返します。

クライアント所有のツールループ:あなたのアプリケーションがステップ 3 を実行するまで、外部アクションは発生しません。GPT-Image-2 in Codex で生成。
Python では、function_call_output を返すことで制御がモデルに戻ります:
1import json2from openai import OpenAI34client = OpenAI()56def get_order(order_id): return {"order_id": order_id, "promised_date": "2026-07-13"}78order_tool = {9 "type": "function", "name": "get_order", "strict": True,10 "description": "注文の約束された配送日を返します。",11 "parameters": {12 "type": "object",13 "properties": {"order_id": {"type": "string"}},14 "required": ["order_id"], "additionalProperties": False,15 },16 "output_schema": {17 "type": "object",18 "properties": {19 "order_id": {"type": "string"}, "promised_date": {"type": "string"},20 },21 "required": ["order_id", "promised_date"], "additionalProperties": False,22 },23}2425first = client.responses.create(26 model="gpt-5.6", tools=[order_tool], input="注文 A-104 が遅れている理由は?",27 tool_choice={"type": "function", "name": "get_order"},28)29call = next(item for item in first.output if item.type == "function_call")30result = get_order(**json.loads(call.arguments))3132final = client.responses.create(33 model="gpt-5.6",34 tools=[order_tool],35 input=[*first.output, {36 "type": "function_call_output",37 "call_id": call.call_id,38 "output": json.dumps(result),39 }],40)41print(final.output_text)
ハーネスは、モデルが最終メッセージを返すまでこのループを繰り返します。Strict スキーマは引数の形式を整えます。実行権限のチェックは依然としてエグゼキュータが行います。
2. ツールの実行場所は異なる場合がある
組み込みツール(Web 検索、ファイル検索、ホスト型シェルを含む)は、OpenAI のインフラストラクチャ上で実行できます。リモート MCP サーバー はツールをリモートで公開・実行します。Responses はこれらのサーバーと OpenAI 管理のコネクタをサポートし、デフォルトではデータ共有前に承認を求めます。
スキル は、指示とファイルをバンドルします。ホスト型シェル にアタッチすると、モデルはその手順に従ったり、スクリプトを実行したりできます。モデルはまずスキルの名前、説明、パスを確認し、選択されると SKILL.md を読み取ります。
1carrier_mcp = {2 "type": "mcp",3 "server_label": "carrier",4 "server_url": "https://example.com/mcp",5 "allowed_tools": ["track_package"],6 "require_approval": "always",7}8incident_shell = {9 "type": "shell",10 "environment": {11 "type": "container_auto",12 "skills": [{"type": "skill_reference", "skill_id": "skill_..."}],13 },14}1516response = client.responses.create(17 model="gpt-5.6",18 tools=[carrier_mcp, incident_shell],19 input="インシデントスキルを使用して、注文 A-104 が遅れている理由を調査してください。",20)
ハーネスはこれらのサーフェスを統合します。MCP はリモートツールを公開し、スキルは手順とファイルを提供し、ハーネスは呼び出しの実行場所を制御します。
3. Tool Search:コンテキストが制約になるとき
表示されているすべてのツール定義はコンテキストを消費します。名前、説明、スキーマは入力トークンを使用し、類似したツールは区別が難しくなり、大規模な MCP カタログは巨大なプロンプトになります。
Tool Search を使用すると、互換性のある GPT-5.4 以降のモデルが、必要なときだけ遅延読み込みされた定義をロードできます:
1shipping = {2 "type": "namespace", "name": "shipping",3 "description": "注文追跡と配送ツール。",4 "tools": [{5 "type": "function", "name": "get_delivery_eta",6 "description": "注文の到着予定時刻を返します。",7 "defer_loading": True,8 "parameters": {9 "type": "object", "required": ["order_id"],10 "properties": {"order_id": {"type": "string"}},11 "additionalProperties": False,12 },13 }],14}1516response = client.responses.create(17 model="gpt-5.6",18 input="注文 A-104 はいつ届きますか?",19 tools=[shipping, {"type": "tool_search"}],20)
ホスト型 Tool Search はリクエストで宣言されたツールから選択します。クライアント実行型検索は、現在のテナントまたはプロジェクトのツールを返すことができます。検索はステップを追加するため、小規模なカタログではメリットが少ない可能性があります。遅延関数は依然として名前と説明を公開しますが、名前空間や MCP サーバーは最初に 1 つの短い説明から始めることができます。ロードされたツールは、キャッシュプレフィックスを保持するために追加されます。スキルは指示とファイルを遅延させます。Tool Search は呼び出し可能なスキーマを遅延させます。
4. 予測可能なマルチツール処理のための Programmatic Tool Calling
直接呼び出しは、各結果をモデルに返します。これは、結果が次の決定を変える場合に便利ですが、単純な結合、フィルター、並列ルックアップは、コードで削減できるデータでコンテキストを埋め尽くす可能性があります。
Programmatic Tool Calling を使用すると、GPT-5.6 は新しく分離された V8 ランタイムで実行される JavaScript を記述できます。V8 は Chrome 内で JavaScript を実行しますが、これはブラウザや Node.js ではありません。トップレベル await、ループ、条件、並列呼び出しをサポートしますが、パッケージのインストール、直接的なネットワークアクセス、汎用ファイルシステム、サブプロセス、コンソール、永続状態はありません。

分離された V8 ランタイムでの 3 つの直接呼び出しと 3 つの並列呼び出しの比較。GPT-Image-2 in Codex で生成。
プログラムがクライアント所有の関数に到達すると、アプリケーションが呼び出しを実行している間、一時停止します。その call_id と caller を返すと、プログラムが再開します。carrier_mcp も承認のために一時停止する可能性があり、output_schema は JavaScript にどのフィールドを検査できるかを伝えます。
1for tool in (order_tool, carrier_mcp):2 tool["allowed_callers"] = ["programmatic"]34response = client.responses.create(5 model="gpt-5.6",6 tools=[7 order_tool,8 carrier_mcp,9 {"type": "programmatic_tool_calling"},10 ],11 input="注文 A-104 を運送会社のステータスと比較し、遅延の証拠を返してください。",12)
プログラムは、関数ツールとカスタムツール、MCP、apply_patch、シェル、コードインタプリタを呼び出すことができますが、Web 検索やファイル検索は呼び出せません。トップレベルの Tool Search は、プログラムの開始前に遅延ツールをロードする必要があります。実行中のプログラムはツールを検索できません。
次のステップにモデルの判断、承認、引用、または副作用が必要な場合は、直接呼び出しを維持してください。明確なルールにより、コードが証拠を失うことなくより小さな結果を返すことができる場合は、プログラムを使用してください。ホスト型実行は作業の実行場所を変更し、Tool Search はコンテキストに入る定義を変更し、プログラムによる呼び出しは返される結果を変更します。評価で、正確性が維持されながらトークン、レイテンシ、またはコストが改善されることが示された場合に、これらを組み合わせてください。
ボーナス:長いツールループを 1 つの接続に保つ
エージェントがモデルとクライアント所有のツールを繰り返し切り替える場合、Responses WebSocket モード は継続のオーバーヘッドを削減できます。ソケットはハーネスを Responses に接続します。ツールの実行速度が上がるわけではありません。関数、MCP、Tool Search、Programmatic Tool Calling に対して同じ response.create フィールドを受け入れますが、ドキュメントですべての組み合わせのベンチマークが取られているわけではありません。OpenAI は、20 回以上の呼び出しがあるロールアウトで最大 40% の実行速度向上を観測しています。そのため、ご自身のワークフローで測定してください。
あなたのエージェントで試してみる
この記事の Appshot を取得し、Codex でエージェントプロジェクトを開き、以下を貼り付けてください:
この記事と現在のコードベースを使用して、このエージェントのツールパスをアップグレードしてください。大規模または使用頻度の低いツールをグループ化し、Tool Search を有効にしてそれらを遅延読み込みします。Programmatic Tool Calling が呼び出しを並列実行し、コンパクトな結果を返すことができる境界のあるステージを見つけてください。意味的な判断、承認、引用、副作用は直接呼び出しとして維持してください。本番ルーティングを変更する前に、正確性、証拠の網羅性、ツールの成功率、トークン、レイテンシ、リトライ数、コストについて両方のパスを比較してください。





