For the complete documentation index, see llms.txt. Markdown versions of documentation pages are available by appending .md to the page URL.
メインナビゲーション
Theme

ツール検索

ツールの読み込みを実行時まで遅らせ、モデルが必要な定義だけを読み込めるようにします。

ツール検索を使うと、モデルは必要に応じてツールを動的に検索し、コンテキストに読み込めます。最初からすべてのツール定義をモデルのコンテキストに読み込む必要がなくなるため、全体のトークン使用量とコストを抑えられる場合があります。ツール検索は、コストとレイテンシを最適化するためにモデルのキャッシュを維持する設計になっています。モデルが新しいツールを見つけると、そのツールはコンテキストウィンドウの末尾に追加されます。

Responses API では、gpt-5.4 以降のモデルのみが tool_search に対応しています。

以下の設定と例では Responses API を使用します。セッション単位での関数の読み込みと MCP ツールの自動検出については、Agents API を参照してください。

Responses API でツール検索を有効にするには、次の 2 つの設定が必要です。

  1. tool_search をツールとして tools 配列に追加します。
  2. 関数を使用する場合は、遅延読み込みの対象とする関数に defer_loading: true を設定します。MCP サーバーを使用する場合は、MCP サーバーのツール定義に defer_loading: true を設定します。

名前空間の活用

ツール検索は、遅延読み込みの対象とする関数、名前空間、MCP サーバーで利用できます。可能な限り、名前空間または MCP サーバーの使用を推奨します。モデルは主に名前空間や MCP サーバーを検索するように学習しており、通常はトークンの削減効果も大きくなります。

名前空間を使用する場合、defer_loading は名前空間内の個々の関数に設定します。名前空間オブジェクト自体は設定の対象外です。

リクエストの開始時点で、モデルには検索対象の名前と説明が提示されます。名前空間や MCP サーバーの場合、最初に提示されるのは名前空間やサーバーの名前と説明だけです。そこに含まれる個々の関数の詳細は、ツール検索で読み込むまで提示されません。個別の関数を遅延読み込みの対象にした場合、その関数の名前と説明は最初からモデルに提示されるため、実際に読み込みを遅らせるのは主にパラメータのスキーマです。

トークンをできる限り節約するには、遅延読み込みの対象となる関数を名前空間や MCP サーバーにまとめ、それぞれに含まれる関数の用途が一目でわかる説明を付けることを推奨します。こうすると、モデルが効率よく検索し、必要な関数だけを読み込めます。トークン効率とモデルの性能を高めるため、各名前空間の関数は 10 個未満を目安にしてください。

{
    "tools": [
      {
        "type": "namespace",
        "name": "crm",
        "description": "CRM tools for customer lookup and order management.",
        "tools": [
          {
            "type": "function",
            "name": "list_open_orders",
            "description": "List open orders for a customer ID.",
            "defer_loading": true,
            "parameters": {
              "type": "object",
              "properties": {
                "customer_id": { "type": "string" }
              },
              "required": ["customer_id"],
              "additionalProperties": false
            }
          }
        ]
      },
      {
        "type": "tool_search"
      }
    ]
  }

同じ名前空間に、遅延読み込みのツールと即時読み込みのツールを混在させることができます。defer_loading: true を設定していないツールはすぐに呼び出せます。同じ名前空間で遅延読み込みに設定したツールは、ツール検索を通じて読み込まれます。

ツール検索の種類

ツール検索には、次の 2 つの方式があります。

  • ホスト型ツール検索: OpenAI がリクエストで宣言された遅延読み込み対象のツールを検索し、そのうち読み込んだツールを同じレスポンスで返します。
  • クライアント実行型ツール検索: モデルが tool_search_call を出力すると、アプリケーションが検索を実行し、対応する tool_search_output を返します。

リクエストの作成時点で候補となるツールがわかっている場合は、まずホスト型ツール検索を使用してください。検索対象がプロジェクトやテナントの状態、またはアプリケーションが管理する別のシステムに依存する場合は、クライアント実行型ツール検索を使用してください。

ホスト型ツール検索

モデルに検索させたい関数、名前空間、MCP サーバーがすべてわかっている場合は、ホスト型ツール検索が最も簡単です。検索対象をあらかじめ宣言し、{"type": "tool_search"} を追加すれば、何を読み込むかは API が判断します。

ホスト型ツール検索の設定
from openai import OpenAI

client = OpenAI()

crm_namespace = {
    "type": "namespace",
    "name": "crm",
    "description": "CRM tools for customer lookup and order management.",
    "tools": [
        {
            "type": "function",
            "name": "get_customer_profile",
            "description": "Fetch a customer profile by customer ID.",
            "parameters": {
                "type": "object",
                "properties": {
                    "customer_id": {"type": "string"},
                },
                "required": ["customer_id"],
                "additionalProperties": False,
            },
        },
        {
            "type": "function",
            "name": "list_open_orders",
            "description": "List open orders for a customer ID.",
            "defer_loading": True,
            "parameters": {
                "type": "object",
                "properties": {
                    "customer_id": {"type": "string"},
                },
                "required": ["customer_id"],
                "additionalProperties": False,
            },
        },
    ],
}

response = client.responses.create(
    model="gpt-6-astra",
    input="List open orders for customer CUST-12345.",
    tools=[
        crm_namespace,
        {"type": "tool_search"},
    ],
    parallel_tool_calls=False,
)

print(response.output)

モデルが遅延読み込み対象のツールを必要と判断した場合、レスポンスには、実際の関数呼び出しの前に次の 2 つの出力項目が含まれます。

  • tool_search_call は、ホスト側で実行した検索ステップを記録します。
  • tool_search_output には、検索対象のうち、読み込まれて呼び出し可能になったツールが含まれます。
ホスト型ツール検索のレスポンス
[
  {
    "type": "tool_search_call",
    "execution": "server",
    "call_id": null,
    "status": "completed",
    "arguments": {
      "paths": ["crm"]
    }
  },
  {
    "type": "tool_search_output",
    "execution": "server",
    "call_id": null,
    "status": "completed",
    "tools": [
      {
        "type": "namespace",
        "name": "crm",
        "description": "CRM tools for customer lookup and order management.",
        "tools": [
          {
            "type": "function",
            "name": "list_open_orders",
            "description": "List open orders for a customer ID.",
            "defer_loading": true,
            "parameters": {
              "type": "object",
              "properties": {
                "customer_id": { "type": "string" }
              },
              "required": ["customer_id"],
              "additionalProperties": false
            }
          }
        ]
      }
    ]
  },
  {
    "type": "function_call",
    "name": "list_open_orders",
    "namespace": "crm",
    "call_id": "call_abc123",
    "arguments": "{\"customer_id\":\"CUST-12345\"}"
  }
]

ホスト型では、execution に server が設定され、call_id に null が設定されます。

複雑なタスクでは、モデルが 1 回の tool_search_call で複数の名前空間や MCP サーバーを読み込むこともできます。たとえば、1 つのタスクを完了するために異なる名前空間の関数が必要な場合、モデルは関数を呼び出す前に、それらの名前空間をまとめて検索して読み込むことがあります。

クライアント実行型ツール検索

クライアント実行型ツール検索では、ツールの検出方法をアプリケーション側で全面的に制御できます。利用可能なツールが、最初の tools リストで宣言するのが難しい情報に依存する場合に適しています。

tool_search ツールに execution: "client" を設定し、アプリケーションが受け取る検索引数のスキーマを指定します。

クライアント実行型ツール検索の設定
from openai import OpenAI

client = OpenAI()

first_response = client.responses.create(
    model="gpt-6-astra",
    input="Find the shipping ETA tool first, then use it for order_42.",
    tools=[
        {
            "type": "tool_search",
            "execution": "client",
            "description": "Find the project-specific tools needed to continue the task.",
            "parameters": {
                "type": "object",
                "properties": {
                    "goal": {"type": "string"},
                },
                "required": ["goal"],
                "additionalProperties": False,
            },
        }
    ],
    parallel_tool_calls=False,
)

search_call = next(
    item for item in first_response.output if item.type == "tool_search_call"
)

loaded_tools = [
    {
        "type": "function",
        "name": "get_shipping_eta",
        "description": "Look up shipping ETA details for an order.",
        "defer_loading": True,
        "parameters": {
            "type": "object",
            "properties": {
                "order_id": {"type": "string"},
            },
            "required": ["order_id"],
            "additionalProperties": False,
        },
    }
]

second_response = client.responses.create(
    model="gpt-6-astra",
    previous_response_id=first_response.id,
    input=[
        {
            "type": "tool_search_output",
            "execution": "client",
            "call_id": search_call.call_id,
            "status": "completed",
            "tools": loaded_tools,
        },
    ],
)

print(second_response.output)

最初のターンでは、モデルは tool_search_call を出力した時点でそのターンの処理を終了します。

クライアント側でのツール検索呼び出し
[
  {
    "type": "tool_search_call",
    "execution": "client",
    "call_id": "call_abc123",
    "status": "completed",
    "arguments": {
      "goal": "Find the shipping ETA tool for order_42."
    }
  }
]

次に、アプリケーションが検索を実行し、読み込むツールを含む tool_search_output を返します。

tool_search_output の返却
[
  {
    "type": "tool_search_output",
    "execution": "client",
    "call_id": "call_abc123",
    "status": "completed",
    "tools": [
      {
        "type": "function",
        "name": "get_shipping_eta",
        "description": "Look up shipping ETA details for an order.",
        "defer_loading": true,
        "parameters": {
          "type": "object",
          "properties": {
            "order_id": { "type": "string" }
          },
          "required": ["order_id"],
          "additionalProperties": false
        }
      }
    ]
  }
]

次のターンでは、読み込んだツールを通常の関数と同じように呼び出せます。

読み込んだ関数の呼び出し
[
  {
    "type": "function_call",
    "name": "get_shipping_eta",
    "namespace": "get_shipping_eta",
    "call_id": "call_xyz456",
    "arguments": "{\"order_id\":\"order_42\"}"
  }
]

クライアント実行型では、execution に client が設定され、call_id に値が割り当てられます。call_id は、tool_search_call で受け取った値をそのまま tool_search_output に含めて返してください。

応用

名前空間の用途が伝わる説明

モデルは名前空間の説明をもとに、その中の一部の関数をいつ読み込むかを判断します。名前空間の説明には用途を明確に記述してください。説明が長くなりすぎないようにし、詳しい情報は、必要なときだけ読み込まれる個々の関数の説明に記載してください。

読み込まれるツールの範囲

tool_search_output.tools には、モデルが動的に読み込んだツールの一覧が含まれます。モデルは以降のターンでもこれらのツールを呼び出せるため、クライアント実行型でもターンごとに同じツールを読み込み直す必要はありません。この配列に含まれていないツールはモデルから利用できません。読み込み済みのツールを無効にするには、読み込むツールの一覧を定義した tool_search_output 項目から、そのツールを削除します。ただし、一覧を変更すると、その時点以降のモデルのキャッシュが無効になります。

ツールを動的に追加する応用パターン

ほとんどの実装では、リクエストの tools パラメータでツールを宣言します。クライアント実行型ツール検索では、元のリクエストに含まれていなかったツールをアプリケーションが返すこともできます。この高度なワークフローを使用する場合は、返されるスキーマを慎重に検証し、信頼できるツール定義だけを公開してください。

ツール検索とキャッシュ

すべてのツールは、モデルのコンテキストウィンドウの末尾に読み込まれます。これはホスト型ツール検索でもクライアント実行型ツール検索でも同じです。そのため、リクエスト間でモデルのキャッシュを維持でき、全体のコストを抑えながら処理を高速化できます。

入力の特定の位置へのツールの追加

高度なワークフローでは、additional_tools 入力項目を使って、会話の特定の時点からツールを利用可能にできます。アプリケーションが通常のツール検索とは別にツールを読み込む場合や、以前のレスポンスで追加したツールの順序を維持する必要がある場合に役立ちます。

role を developer に設定し、追加するツールをその項目の tools 配列に含めます。

{
    "type": "additional_tools",
    "role": "developer",
    "tools": [
      {
        "type": "function",
        "name": "get_customer",
        "description": "Look up a customer by ID.",
        "parameters": {
          "type": "object",
          "properties": {
            "customer_id": { "type": "string" }
          },
          "required": ["customer_id"],
          "additionalProperties": false
        }
      }
    ]
  }

additional_tools 項目に含まれるツールは、入力内でその項目が現れた後に初めて利用可能になります。会話の項目を手動で次のリクエストに引き継ぐ場合は、モデルが会話の同じ時点で同じツールを利用できるように、項目の位置を維持してください。

Agents API

Agents API は、デフォルトでは関数定義を最初に読み込みます。特定の関数の読み込みを遅らせるには、{ "type": "tool_search" } を agent.tools に含め、エージェントが必要に応じて検索する各関数に defer_loading: true を設定します。tool_search を追加しただけでは、すべての関数が遅延読み込みの対象になるわけではありません。

セッションのリクエストには、名前、説明、引数のスキーマを含む完全な関数定義を引き続き指定します。ツール検索によって変わるのは、その定義がモデルに渡されるタイミングです。関数が見つかった後は、通常どおりアプリケーションが関数呼び出しを処理し、結果を返します。結果の処理については、関数を参照してください。

この例を実行する前に OPENAI_API_KEY を設定してください。

必要なときだけ関数ツールを読み込む例
import OpenAI from "openai";
const client = new OpenAI();

const result = await client.beta.agents.sessions.create({
  agent: {
    model: "gpt-6-astra",
    tools: [
      {
        type: "tool_search",
      },
      {
        type: "function",
        name: "lookup_account",
        description: "Find an account by its account number.",
        parameters: {
          type: "object",
          properties: {
            account_id: {
              type: "string",
            },
          },
          required: ["account_id"],
          additionalProperties: false,
        },
        defer_loading: true,
      },
    ],
  },
  environment: {
    type: "none",
  },
  input: [
    {
      role: "user",
      content: [
        {
          type: "input_text",
          text: "Look up account 42.",
        },
      ],
    },
  ],
});
console.log(result.id);

関数の読み込み方式の選択

方式 設定 適した用途 考慮事項
即時読み込み defer_loading を省略するか、false に設定します。 関数が少ない場合や、ほとんどのタスクで必要になる関数に適しています。 未使用の定義もコンテキストを消費します。定義を変更すると、キャッシュされたプレフィックスが無効になることがあります。
遅延読み込み defer_loading: true を設定し、tool_search を含めます。 関数が多数あり、各タスクで必要な関数が少ない場合に適しています。 検索のステップが増えます。必要なツールが検索で見つかって初めて呼び出せます。

Agents API のセッションでは、即時読み込みの関数と遅延読み込みの関数を混在させることもできますが、一般には推奨しません。遅延読み込みの関数には、用途が明確に伝わる名前と説明を付けてください。デフォルトの方式を選ぶ前に、代表的なリクエストでタスクの完了状況、入力トークン使用量、レイテンシを比較してください。

MCP ツールとプラグインのツール

Agents API では、モデルとプロバイダーがツール検索に対応している場合、MCP ツールが自動的に検出されます。ランタイムは MCP ツールを遅延読み込みの対象とし、遅延読み込みの対象に検索可能なツールがある場合にツール検索を追加します。これはリモート MCP、エグゼキューター MCP、プラグインが提供する MCP ツールに適用されます。

MCP ツールのためだけに { "type": "tool_search" } を追加したり、MCP サーバーに関数レベルの defer_loading フラグを設定したりする必要はありません。MCP 接続を使ってサーバーを設定してください。このガイドの前半で説明した Responses API の設定は、Agents API の MCP サーバーには適用されません。

関連ガイド

  • 呼び出し可能な関数やカスタムツールを定義する方法については、Function Calling を参照してください。
  • Responses API で利用できるツールの全体像については、ツールの使用を参照してください。