ツール
ツールを使うと、エージェントは アクションを実行 できます。たとえば、データの取得、外部 API の呼び出し、コードの実行、さらにはコンピューターの使用も可能です。JavaScript/TypeScript SDK は、次の 7 つのカテゴリーをサポートしています。
どのエージェントにタスクを担当させるかを決定し、そのエージェントに機能を追加したくなったら、エージェントの次にこのページをお読みください。委譲パターンをまだ検討中の場合は、エージェントオーケストレーションを参照してください。
- OpenAI がホストするツール – OpenAI のサーバー上でモデルとともに実行されます。(Web 検索、ファイル検索、Code Interpreter、画像生成、ツール検索)
- 内蔵実行ツール – SDK が提供し、モデルの外部で実行されるツールです。(コンピュータ操作と apply_patch はローカルで実行され、shell はローカルまたはホストされたコンテナで実行できます)
- 関数ツール – 任意のローカル関数を JSON スキーマでラップし、LLM から呼び出せるようにします。
- Agents as tools – エージェント全体を呼び出し可能なツールとして公開します。
- MCP サーバー – Model Context Protocol サーバー(ローカルまたはリモート)を接続します。
- サンドボックス機能 – ワークスペースにスコープされた shell、ファイルシステム、スキル、メモリ、圧縮ツールを
SandboxAgentに接続します。 - 実験的機能:Codex ツール – Codex SDK を関数ツールとしてラップし、ワークスペースを認識するタスクを実行します。
ツールのカテゴリー
Section titled “ツールのカテゴリー”このガイドの残りの部分では、まず各ツールカテゴリーについて説明し、その後、カテゴリー横断のツール選択とプロンプト作成に関するガイダンスをまとめます。
1. 組み込みツール(Hosted)(OpenAI Responses API)
Section titled “1. 組み込みツール(Hosted)(OpenAI Responses API)”OpenAIResponsesModel を使用すると、次の組み込みツールを追加できます。
| ツール | 型文字列 | 用途 |
|---|---|---|
| Web 検索 | 'web_search' | インターネット検索。 |
| ファイル/検索 | 'file_search' | OpenAI でホストされているベクトルストアへのクエリ。 |
| Code Interpreter | 'code_interpreter' | サンドボックス環境でのコード実行。 |
| 画像生成 | 'image_generation' | テキストに基づく画像生成。 |
| ツール検索 | 'tool_search' | 遅延読み込みされる関数ツール、名前空間、または検索可能な MCP ツールの実行時読み込み。 |
| Programmatic Tool Calling | 'programmatic_tool_calling' | 対象ツールを連携させる、モデル生成の JavaScript の実行。 |
import { Agent, codeInterpreterTool, fileSearchTool, imageGenerationTool, webSearchTool,} from '@openai/agents';
const agent = new Agent({ name: 'Travel assistant', tools: [ webSearchTool({ searchContextSize: 'medium' }), fileSearchTool('VS_ID', { maxNumResults: 3 }), codeInterpreterTool(), imageGenerationTool({ size: '1024x1024' }), ],});SDK は、組み込みツール(Hosted)の定義を返すヘルパー関数を提供します。
| ヘルパー関数 | 注記 |
|---|---|
webSearchTool(options?) | searchContextSize、userLocation、filters.allowedDomains など、JS で扱いやすいオプション。 |
fileSearchTool(ids, options?) | 1 つ以上のベクトルストア ID を第 1 引数として受け取り、さらに maxNumResults、includeSearchResults、rankingOptions、フィルターなどのオプションを受け取ります。 |
codeInterpreterTool(options?) | container が指定されていない場合、デフォルトで自動管理コンテナを使用します。 |
imageGenerationTool(options?) | model、size、quality、background、inputFidelity、inputImageMask、moderation、outputCompression、partialImages、出力形式などの画像生成設定をサポートします。 |
toolSearchTool(options?) | 組み込みの tool_search ヘルパーを追加します。deferLoading: true が設定された遅延関数ツールまたは組み込み MCP ツールと組み合わせて使用します。デフォルトではホスト実行をサポートし、execution: 'client' と execute を指定するとクライアント実行もサポートします。 |
programmaticToolCallingTool() | Programmatic Tool Calling を有効にします。allowedCallers に 'programmatic' が含まれるツールと組み合わせて使用します。 |
これらのヘルパーは、JavaScript/TypeScript で扱いやすいオプション名を、基盤となる OpenAI Responses API のツールペイロードにマッピングします。完全なツールスキーマや、ランキングオプション、セマンティックフィルターなどの高度なオプションについては、公式の OpenAI ツールガイドを参照してください。現在の組み込みツール検索フローと利用可能なモデルについては、公式のツール検索ガイドを参照してください。モデルのサポート状況とワイヤーレベルの動作については、公式の Programmatic Tool Calling ガイドを参照してください。
2. 内蔵実行ツール
Section titled “2. 内蔵実行ツール”これらのツールは SDK に組み込まれていますが、実行自体はモデルのレスポンスの外部で行われます。
- コンピュータ操作 –
Computerインターフェースを実装し、computerTool()に渡します。これは常に、ユーザーが提供するローカルのComputer実装に対して実行されます。 - Shell – ローカルの
Shell実装を提供するか、shellTool({ environment })を使用してホストされたコンテナ環境を設定します。 - パッチの適用 –
Editorインターフェースを実装し、applyPatchTool()に渡します。これは常に、ユーザーが提供するローカルのEditor実装に対して実行されます。 - サンドボックスの shell およびファイルシステムツール – これらのアクションをサンドボックスワークスペース内で実行する必要がある場合は、
SandboxAgentでshell()、filesystem()、skills()、memory()、またはcompaction()を使用します。
ツール呼び出し自体は引き続きモデルによって要求されますが、実際の処理はアプリケーションまたは設定済みの実行環境が行います。
サンドボックス機能のツールは、プロセス全体で使用される内蔵ツールとは異なります。これらは、現在の SandboxAgent 実行における稼働中のサンドボックスセッションに紐付けられます。ツールをアプリケーションプロセスではなく、エージェントの分離されたワークスペースで動作させる場合は、クイックスタートを使用してください。
import { Agent, applyPatchTool, computerTool, shellTool, Computer, Editor, Shell,} from '@openai/agents';
const computer: Computer = { environment: 'browser', dimensions: [1024, 768], screenshot: async () => '', click: async () => {}, doubleClick: async () => {}, scroll: async () => {}, type: async () => {}, wait: async () => {}, move: async () => {}, keypress: async () => {}, drag: async () => {},};
const shell: Shell = { run: async () => ({ output: [ { stdout: '', stderr: '', outcome: { type: 'exit', exitCode: 0 }, }, ], }),};
const editor: Editor = { createFile: async () => ({ status: 'completed' }), updateFile: async () => ({ status: 'completed' }), deleteFile: async () => ({ status: 'completed' }),};
const agent = new Agent({ name: 'Local tools agent', model: 'gpt-5.4', tools: [ computerTool({ computer }), shellTool({ shell, needsApproval: true }), applyPatchTool({ editor, needsApproval: true }), ],});コンピュータ操作ツールの詳細
Section titled “コンピュータ操作ツールの詳細”computerTool() は、次のいずれかを受け取ります。
- 具体的な
Computerインスタンス - 実行ごとに
Computerを作成する初期化関数 - 実行スコープのセットアップと後処理が必要な場合の
{ create, dispose }を持つプロバイダーオブジェクト
OpenAI の現在のコンピュータ操作パスを使用するには、gpt-5.4 など、コンピュータ操作に対応したモデルを設定します。リクエストのモデルが明示されている場合、SDK は GA 版の組み込み computer ツール形式を送信します。有効なモデルが保存済みプロンプトや別の古い連携から引き続き取得される場合、modelSettings.toolChoice: 'computer' で GA パスを明示的に選択しない限り、SDK は互換性のため従来の computer_use_preview ワイヤー形式を維持します。
GA 版のコンピューター呼び出しでは、1 回の computer_call に一括処理される actions[] を含めることができます。SDK はそれらを順番に実行し、各アクションに対して needsApproval を評価して、最終的なスクリーンショットをツール出力として返します。interruption.rawItem から承認 UI を構築する場合は、存在すれば actions を読み取り、従来のプレビュー項目では action にフォールバックしてください。
影響の大きいコンピューター操作をユーザーのレビューまで一時停止する場合は needsApproval を使用します。コンピューター呼び出しに対して報告された保留中の安全性チェックを確認または拒否する場合は、onSafetyCheck を使用します。モデル側のガイダンスと移行の詳細については、公式の OpenAI コンピュータ操作ガイドと、その移行に関する注記を参照してください。
Shell ツールの詳細
Section titled “Shell ツールの詳細”shellTool() には 2 つのモードがあります。
- ローカルモード:
shellを指定し、必要に応じてenvironment: { type: 'local', skills }に加えて、自動承認処理用のneedsApprovalとonApprovalを指定します。 - ホストされたコンテナモード:
type: 'container_auto'またはtype: 'container_reference'のenvironmentを指定します。
ローカルモードでは、environment.skills を使って、name、description、ファイルシステムの path によりローカルスキルをマウントできます。
ホストされたコンテナモードでは、次のいずれかを指定して shellTool({ environment }) を設定します。
- 実行用の管理対象コンテナを作成する
type: 'container_auto' containerIdで既存のコンテナを再利用するtype: 'container_reference'
ホストされた container_auto 環境は、次をサポートします。
domainSecretsを持つ許可リストを含むnetworkPolicy- アップロード済みファイルをマウントするための
fileIds - コンテナサイズを設定するための
memoryLimit skill_referenceまたはインラインの zip バンドルによるskills
ホストされた shell 環境では、ローカルプロセスではなくホストされたコンテナ環境で実行されるため、shell、needsApproval、onApproval は受け付けません。
エンドツーエンドの使用方法については、examples/tools/local-shell.ts、examples/tools/container-shell-skill-ref.ts、examples/tools/container-shell-inline-skill.ts を参照してください。
パッチ適用ツールの詳細
Section titled “パッチ適用ツールの詳細”applyPatchTool() は、shellTool() のローカル承認フローと同様に動作します。ファイル編集前に一時停止するには needsApproval を使用し、アプリケーションレベルのコールバックで自動承認または拒否するには onApproval を使用します。
3. 関数ツール
Section titled “3. 関数ツール”tool() ヘルパーを使うと、任意の 関数をツールに変換できます。
import { tool } from '@openai/agents';import { z } from 'zod';
const getWeatherTool = tool({ name: 'get_weather', description: 'Get the weather for a given city', parameters: z.object({ city: z.string() }), async execute({ city }) { return `The weather in ${city} is sunny.`; },});オプションリファレンス
Section titled “オプションリファレンス”| フィールド | 必須 | 説明 |
|---|---|---|
name | いいえ | デフォルトでは関数名(例:get_weather)になります。 |
description | はい | LLM に表示される、明確で人間が理解しやすい説明です。 |
parameters | はい | Zod スキーマまたは元の JSON スキーマオブジェクトです。Zod パラメーターでは strict モードが自動的に有効になります。 |
strict | いいえ | true(デフォルト)の場合、引数の検証に失敗すると SDK はモデルエラーを返します。曖昧なマッチングを行うには false に設定します。 |
execute | はい | (args, context, details) => string | unknown | Promise<...> – ビジネスロジックです。文字列以外の出力はモデル向けにシリアライズされます。context は省略可能な RunContext です。details には toolCall、resumeState、signal などのメタデータが含まれます。 |
allowedCallers | いいえ | ツールを直接、プログラム経由、またはその両方から呼び出せるかを制御する、Responses 専用の空でないリストです。'direct'、'programmatic'、または両方の値を使用します。 |
outputSchema | いいえ | ツールの実行結果を定義する Responses 専用スキーマです。Zod スキーマは execute の戻り値の型を制約し、実行時の実行結果を検証および変換します。元の JSON スキーマはワイヤーコントラクトのみを記述します。 |
errorFunction | いいえ | 内部エラーをモデルから参照できる実行結果に変換するカスタムハンドラー (context, error, details) => result です。outputSchema が設定されている場合、実行結果はそのスキーマを満たす必要があります。デフォルトハンドラーは無効になっているため、元のエラーが再スローされます。 |
timeoutMs | いいえ | 呼び出しごとのタイムアウト(ミリ秒)です。0 より大きく、2147483647 以下である必要があります。 |
timeoutBehavior | いいえ | タイムアウトモードです。error_as_result はモデルから参照できる実行結果を返し、raise_exception は ToolTimeoutError をスローします。デフォルトは、outputSchema がない場合は error_as_result、ある場合は raise_exception です。 |
timeoutErrorFunction | いいえ | error_as_result 用のカスタムハンドラー (context, timeoutError, details) => result です。outputSchema が設定されている場合、このハンドラーは必須であり、その実行結果はスキーマを満たす必要があります。 |
customDataExtractor | いいえ | SDK 専用メタデータを、生成される RunToolCallOutputItem.customData に追加するためのコールバック (context) => Record<string, unknown> | null | undefined です。このデータはモデルには送り返されません。 |
needsApproval | いいえ | 実行前に人間による承認を要求します。人間の介入(HITL)を参照してください。 |
isEnabled | いいえ | 実行ごとに条件付きでツールを公開します。真偽値または述語を受け取ります。 |
inputGuardrails | いいえ | ツールの実行前に動作するガードレールです。拒否またはスローできます。ガードレールを参照してください。 |
outputGuardrails | いいえ | ツールの実行後に動作するガードレールです。拒否またはスローできます。ガードレールを参照してください。 |
SDK 専用のカスタムデータ
Section titled “SDK 専用のカスタムデータ”アプリケーションで、レンダラー向けのヒント、内部 ID、またはその他の JSON 互換メタデータをツールの実行結果に添える必要がある場合は、customDataExtractor を使用します。このコールバックは、実行コンテキスト、ツール定義、モデルのツール呼び出し、解析済み入力、出力、および複製された元の出力項目を受け取ります。返されたデータは RunToolCallOutputItem.customData と RunState に保存されますが、history とモデルの再実行からは除外されます。
関数ツールのタイムアウト
Section titled “関数ツールのタイムアウト”各関数ツールの呼び出し時間を制限するには、timeoutMs を使用します。
timeoutBehavior: 'error_as_result'は、Tool '<name>' timed out after <timeoutMs>ms.をモデルに返します。outputSchemaが設定されていない場合のデフォルトです。timeoutBehavior: 'raise_exception'はToolTimeoutErrorをスローします。このエラーは、実行時の例外の一部として捕捉できます。timeoutErrorFunctionを使用すると、error_as_resultモードのタイムアウトテキストをカスタマイズできます。outputSchemaが設定されている場合、デフォルトはraise_exceptionに変わります。error_as_resultを使用するには、スキーマ互換の値を返すtimeoutErrorFunctionが必要です。- タイムアウト時には
details.signalが中断されるため、長時間実行されるツールはキャンセルを監視することで速やかに停止できます。
関数ツールを直接呼び出す場合は、invokeFunctionTool を使用すると、通常のエージェント実行と同じタイムアウト動作を適用できます。
非 strict JSON スキーマツール
Section titled “非 strict JSON スキーマツール”モデルに無効または不完全な入力を 推測 させる必要がある場合、元の JSON スキーマを使用するときに strict モードを無効にできます。
import { tool } from '@openai/agents';
interface LooseToolInput { text: string;}
const looseTool = tool({ description: 'Echo input; be forgiving about typos', strict: false, parameters: { type: 'object', properties: { text: { type: 'string' } }, required: ['text'], additionalProperties: true, }, execute: async (input) => { // because strict is false we need to do our own verification if (typeof input !== 'object' || input === null || !('text' in input)) { return 'Invalid input. Please try again'; } return (input as LooseToolInput).text; },});ツール検索による遅延ツール読み込み
Section titled “ツール検索による遅延ツール読み込み”ツール検索を使うと、すべてのスキーマを事前に送信する代わりに、モデルが必要なツール定義だけを実行時に読み込めます。SDK では、遅延されるトップレベル関数ツール、toolNamespace() グループ、および deferLoading: true が設定された組み込み MCP ツールをこの方法で使用します。
ツール検索は、Responses API でサポートされる GPT-5.4 以降のモデルリリースでのみ使用してください。
import { Agent, tool, toolNamespace, toolSearchTool } from '@openai/agents';import { z } from 'zod';
const customerIdParams = z.object({ customerId: z.string().describe('The customer identifier to look up.'),});
// Keep a standalone deferred tool at the top level when it represents a// single searchable capability that does not need a shared namespace.const shippingLookup = tool({ name: 'get_shipping_eta', description: 'Look up a shipment ETA by customer identifier.', parameters: customerIdParams, deferLoading: true, async execute({ customerId }) { return { customerId, eta: '2026-03-07', carrier: 'Priority Express', }; },});
// Group related tools into a namespace when one domain description should// cover several deferred tools and let tool search load them together.const crmTools = toolNamespace({ name: 'crm', description: 'CRM tools for customer profile lookups.', tools: [ tool({ name: 'get_customer_profile', description: 'Fetch a basic customer profile.', parameters: customerIdParams, deferLoading: true, async execute({ customerId }) { return { customerId, tier: 'enterprise', }; }, }), ],});
const agent = new Agent({ name: 'Operations assistant', model: 'gpt-5.4', // Mixing namespaced and top-level deferred tools in one request is supported. tools: [shippingLookup, ...crmTools, toolSearchTool()],});この例では、意図的に両方のスタイルを混在させています。
shippingLookupは単独で検索可能な機能であるため、トップレベルのままです。crmToolsは、関連する CRM ツールが 1 つの高レベルなラベルと説明を共有するため、toolNamespace()を使用します。- 同じリクエスト内で、名前空間付きツールとトップレベルの遅延ツールを混在させることができます。ツール検索では、
crmのような名前空間パスと、get_shipping_etaのようなトップレベルパスの両方を読み込めます。
ツール検索を使用する場合は、次の点に注意してください。
- 遅延する各関数ツールに
deferLoading: trueを設定します。 - 複数の関連ツールで 1 つのドメイン説明を共有し、グループとして読み込む場合は、
toolNamespace({ name, description, tools })を使用します。 - 単一の独立した機能であり、ツール名自体が適切な検索対象となる場合は、ツールをトップレベルのままにします。
- 遅延関数ツールまたは組み込み MCP ツールのいずれかが
deferLoading: trueを使用する場合は、必ず同じtools配列にtoolSearchTool()を追加します。 modelSettings.toolChoiceは'auto'のままにします。SDK は、組み込みのtool_searchツールまたは遅延関数ツールを名前で強制する設定を拒否します。- デフォルトはホスト実行です。
toolSearchTool({ execution: 'client', execute })を設定した場合、標準のrun()ループがサポートするのは、組み込みの{ paths: string[] }クライアントクエリ形式のみです。クライアント側のカスタムスキーマには、独自の Responses ループが必要です。 - 1 つの名前空間に、即時読み込みと遅延読み込みのメンバーを混在させることができます。即時メンバーはツール検索なしで呼び出せるまま維持され、同じ名前空間内の遅延メンバーは必要に応じて読み込まれます。
- 遅延関数ツールと
toolNamespace()は Responses 専用です。Chat Completions では拒否され、AI SDK アダプターは Responses の遅延ツール読み込みフローをサポートしていません。
4. Agents as tools
Section titled “4. Agents as tools”会話を完全にハンドオフすることなく、あるエージェントから別のエージェントを 支援役 として利用したい場合があります。その場合は agent.asTool() を使用します。
agent.asTool() と handoff() のどちらを使用するか検討中の場合は、エージェントとエージェントオーケレーションでパターンを比較してください。
import { Agent } from '@openai/agents';
const summarizer = new Agent({ name: 'Summarizer', instructions: 'Generate a concise summary of the supplied text.',});
const summarizerTool = summarizer.asTool({ toolName: 'summarize_text', toolDescription: 'Generate a concise summary of the supplied text.',});
const mainAgent = new Agent({ name: 'Research assistant', tools: [summarizerTool],});内部では、SDK は次の処理を行います。
- 単一の
inputパラメーターを持つ関数ツールの作成 - ツール呼び出し時に、その入力を使用したサブエージェントの実行
- 最後のメッセージ、または
customOutputExtractorで抽出された出力の返却
エージェントをツールとして実行すると、Agents SDK はデフォルト設定でランナーを作成し、関数の実行内でそのランナーを使ってエージェントを実行します。runConfig または runOptions のプロパティを指定する場合は、それらを asTool() メソッドに渡してランナーの動作をカスタマイズできます。
また、asTool() のオプションを介してエージェントツールに needsApproval と isEnabled を設定し、Human in the loop (人間の介入) フローおよび条件付きのツール可用性と連携できます。
customOutputExtractor 内では、result.agentToolInvocation を使用して現在の Agent.asTool() 呼び出しを確認します。このコールバック内の実行結果は常に Agent.asTool() から取得されるため、agentToolInvocation は常に定義されており、toolName、toolCallId、toolArguments を公開します。通常のアプリケーションコンテキストと toolInput には result.runContext を使用します。このメタデータのスコープは現在のネストされた呼び出しに限定され、RunState にはシリアライズされません。
import { Agent } from '@openai/agents';
const billingAgent = new Agent({ name: 'Billing Agent', instructions: 'Handle billing questions and subscription changes.',});
const billingTool = billingAgent.asTool({ toolName: 'billing_agent', toolDescription: 'Handles customer billing questions.', customOutputExtractor(result) { console.log('tool', result.agentToolInvocation.toolName); // Direct invoke() calls may not have a model-generated tool call id. console.log('call', result.agentToolInvocation.toolCallId); console.log('args', result.agentToolInvocation.toolArguments);
return String(result.finalOutput ?? ''); },});
const orchestrator = new Agent({ name: 'Support Orchestrator', instructions: 'Delegate billing questions to the billing agent tool.', tools: [billingTool],});agent.asTool() の高度な構造化入力オプションは次のとおりです。
inputBuilder:構造化されたツール引数を、ネストされたエージェントの入力ペイロードにマッピングします。includeInputSchema:スキーマをより強く認識した動作のために、入力 JSON スキーマをネストされた実行に含めます。resumeState:シリアライズされたネスト済みRunStateを再開するときのコンテキスト調整戦略を制御します。'merge'(デフォルト)は、現在の承認状態とコンテキスト状態をシリアライズ済み状態にマージします。'replace'は代わりに現在の実行コンテキストを使用し、'preferSerialized'はシリアライズ済みコンテキストを変更せずに再開します。
エージェントツールからのストリーミングイベント
Section titled “エージェントツールからのストリーミングイベント”エージェントツールは、ネストされたすべての実行イベントをアプリケーションへストリーミングできます。ツールの構築方法に合ったフック形式を選択してください。
import { Agent } from '@openai/agents';
const billingAgent = new Agent({ name: 'Billing Agent', instructions: 'Answer billing questions and compute simple charges.',});
const billingTool = billingAgent.asTool({ toolName: 'billing_agent', toolDescription: 'Handles customer billing questions.', // onStream: simplest catch-all when you define the tool inline. onStream: (event) => { console.log(`[onStream] ${event.event.type}`, event); },});
// on(eventName) lets you subscribe selectively (or use '*' for all).billingTool.on('run_item_stream_event', (event) => { console.log('[on run_item_stream_event]', event);});billingTool.on('raw_model_stream_event', (event) => { console.log('[on raw_model_stream_event]', event);});
const orchestrator = new Agent({ name: 'Support Orchestrator', instructions: 'Delegate billing questions to the billing agent tool.', tools: [billingTool],});- イベント型は
RunStreamEvent['type']と一致します:raw_model_stream_event、run_item_stream_event、agent_updated_stream_event onStreamは最も簡単な「すべてを捕捉する」方法で、ツールをインラインで宣言する場合(tools: [agent.asTool({ onStream })])に適しています。イベントごとの振り分けが不要な場合に使用します。on(eventName, handler)を使うと、選択的に、または'*'ですべてのイベントを購読できます。よりきめ細かい処理が必要な場合や、作成後にリスナーを追加する場合に最適です。onStreamまたはいずれかのon(...)ハンドラーを指定すると、Agents as tools は自動的にストリーミングモードで実行されます。どちらも指定しない場合は、非ストリーミングパスのままです。- ハンドラーは並列に呼び出されるため、低速な
onStreamコールバックがon(...)ハンドラーをブロックすることはなく、その逆も同様です。 - モデルのツール呼び出しを介してツールが呼び出された場合は、
toolCallIdが提供されます。invoke()の直接呼び出しやプロバイダー固有の動作では、省略される場合があります。
5. MCP サーバー
Section titled “5. MCP サーバー”Model Context Protocol (MCP) サーバーを介してツールを公開し、エージェントに接続できます。たとえば、MCPServerStdio を使用して stdio MCP サーバーを起動し、接続できます。
import { Agent, MCPServerStdio } from '@openai/agents';
const server = new MCPServerStdio({ fullCommand: 'pnpm exec mcp-server-filesystem ./sample_files',});
await server.connect();
const agent = new Agent({ name: 'Assistant', mcpServers: [server],});完全なコード例については、filesystem-example.ts を参照してください。また、MCP サーバーツール連携の包括的なガイドをお探しの場合は、詳細について MCP 連携を参照してください。複数のサーバーを管理する場合や一部のサーバーで障害が発生した場合は、connectMcpServers と MCP 連携にあるライフサイクルのガイダンスを使用してください。
6. 実験的機能:Codex ツール
Section titled “6. 実験的機能:Codex ツール”@openai/agents-extensions/experimental/codex は、モデルのツール呼び出しを Codex SDK にルーティングする関数ツール codexTool() を提供します。これにより、エージェントはワークスペースにスコープされたタスク(shell、ファイル編集、MCP ツール)を自律的に実行できます。この機能は実験的なものであり、変更される可能性があります。
まず依存関係をインストールします。
npm install @openai/agents-extensions @openai/codex-sdkクイックスタート:
import { Agent } from '@openai/agents';import { codexTool } from '@openai/agents-extensions/experimental/codex';
export const codexAgent = new Agent({ name: 'Codex Agent', instructions: 'Use the codex tool to inspect the workspace and answer the question. When skill names, which usually start with `$`, are mentioned, you must rely on the codex tool to use the skill and answer the question.', tools: [ codexTool({ sandboxMode: 'workspace-write', workingDirectory: '/path/to/repo', defaultThreadOptions: { model: 'gpt-5.4', networkAccessEnabled: true, webSearchEnabled: false, }, }), ],});知っておくべき点:
- 認証:
CODEX_API_KEY(推奨)またはOPENAI_API_KEYを指定するか、codexOptions.apiKeyを渡します。 - 入力:strict スキーマです。
inputsには、少なくとも 1 つの{ type: 'text', text }または{ type: 'local_image', path }が含まれている必要があります。 - 安全性:
sandboxModeとworkingDirectoryを組み合わせて使用します。ディレクトリが Git リポジトリでない場合は、skipGitRepoCheckを設定します。 - スレッド:
useRunContextThreadId: trueは、最新のスレッド ID をrunContext.contextから読み取るか、そこに保存します。これは、アプリケーション状態でターンをまたいで再利用する場合に役立ちます。 - スレッド ID の優先順位:ツール呼び出しの
threadId(スキーマに含まれる場合)が最優先され、次に実行コンテキストのスレッド ID、最後にcodexTool({ threadId })が使用されます。 - 実行コンテキストキー:
name: 'codex'の場合はデフォルトでcodexThreadIdになり、name: 'engineer'のような名前の場合はcodexThreadId_<suffix>になります(正規化後はcodex_engineer)。 - 可変コンテキストの要件:
useRunContextThreadIdが有効な場合は、可変オブジェクトまたはMapをrun(..., { context })として渡します。 - 命名:ツール名は
codex名前空間に正規化されます(engineerはcodex_engineerになります)。エージェント内で重複する Codex ツール名は拒否されます。 - ストリーミング:
onStreamは Codex イベント(推論、コマンド実行、MCP ツール呼び出し、ファイル変更、Web 検索)を反映するため、進行状況をログまたはトレースできます。 - 出力:ツールの実行結果には
response、usage、threadIdが含まれ、Codex のトークン使用量はRunContextに記録されます。 - 構造:
outputSchemaには、記述子、JSON スキーマオブジェクト、または Zod オブジェクトを指定できます。JSON オブジェクトスキーマの場合、additionalPropertiesはfalseである必要があります。
実行コンテキストのスレッド再利用例:
import { Agent, run } from '@openai/agents';import { codexTool } from '@openai/agents-extensions/experimental/codex';
// Derived from codexTool({ name: 'engineer' }) when runContextThreadIdKey is omitted.type ExampleContext = { codexThreadId_engineer?: string;};
const agent = new Agent<ExampleContext>({ name: 'Codex assistant', instructions: 'Use the codex tool for workspace tasks.', tools: [ codexTool({ // `name` is optional for a single Codex tool. // We set it so the run-context key is tool-specific and to avoid collisions when adding more Codex tools. name: 'engineer', // Reuse the same Codex thread across runs that share this context object. useRunContextThreadId: true, sandboxMode: 'workspace-write', workingDirectory: '/path/to/repo', defaultThreadOptions: { model: 'gpt-5.4', approvalPolicy: 'never', }, }), ],});
// The default key for useRunContextThreadId with name=engineer is codexThreadId_engineer.const context: ExampleContext = {};
// First turn creates (or resumes) a Codex thread and stores the thread ID in context.await run(agent, 'Inspect src/tool.ts and summarize it.', { context });// Second turn reuses the same thread because it shares the same context object.await run(agent, 'Now list refactoring opportunities.', { context });
const threadId = context.codexThreadId_engineer;Programmatic Tool Calling
Section titled “Programmatic Tool Calling”Programmatic Tool Calling を使用すると、対応する Responses モデルが、ホストされた実行環境内で複数のツール呼び出しを連携させる JavaScript を生成できます。クライアントが所有するツールは引き続きアプリケーションが実行するため、既存の検証、権限、承認、ガードレール、副作用はそのまま適用されます。
import { Agent, programmaticToolCallingTool, tool } from '@openai/agents';import { z } from 'zod';
const getInventory = tool({ name: 'get_inventory', description: 'Return inventory for a SKU.', parameters: z.object({ sku: z.string() }), allowedCallers: ['programmatic'], outputSchema: z.object({ sku: z.string(), availableUnits: z.number(), }), async execute({ sku }) { return { sku, availableUnits: 42 }; },});
const getDemand = tool({ name: 'get_demand', description: 'Return requested units for a SKU.', parameters: z.object({ sku: z.string() }), allowedCallers: ['programmatic'], outputSchema: z.object({ sku: z.string(), requestedUnits: z.number(), }), async execute({ sku }) { return { sku, requestedUnits: 31 }; },});
const agent = new Agent({ name: 'Inventory planner', model: 'gpt-5.6', instructions: `Use Programmatic Tool Calling to fetch inventory and demand concurrently.Return the source values and the calculated shortage in the final answer. `.trim(), tools: [getInventory, getDemand, programmaticToolCallingTool()],});セットアップには 2 つの手順があります。
- エージェントに
programmaticToolCallingTool()を追加します。 - 生成されたプログラムが呼び出せる各ツールに
allowedCallersを設定します。
allowedCallers | 動作 |
|---|---|
省略または ['direct'] | モデルはツールを直接呼び出せます。 |
['programmatic'] | 生成されたプログラムのみがツールを呼び出せます。 |
['direct', 'programmatic'] | モデルまたは生成されたプログラムのどちらからでもツールを呼び出せます。 |
SDK は、tool()、ローカルまたはホストされた shellTool()、applyPatchTool()、hostedMcpTool()、codeInterpreterTool() で作成されたツールに対するプログラム経由の呼び出しをサポートします。
SDK はリクエストを送信する前に設定を検証します。プログラム経由でのみ呼び出せるツールには、programmaticToolCallingTool() が必要です。また、このヘルパーを使用するには、リクエストにツール検索または対象ツールを提供できる保存済みプロンプトが含まれていない限り、少なくとも 1 つの対象ツールが必要です。
関数ツールが構造化データを返す必要がある場合は、outputSchema を使用します。Zod スキーマは execute の戻り値の型を制約し、実行時の実行結果を検証および変換します。元の JSON スキーマはワイヤーコントラクトを記述しますが、SDK 側の実行結果検証は追加しません。無効な Zod の実行結果では、InvalidToolOutputError が発生します。
structured outputs はエラー処理も変更します。
- デフォルトの
errorFunctionは無効になるため、実行エラーは再スローされます。カスタムハンドラーは、outputSchemaと互換性のある値を返す必要があります。 - デフォルトのタイムアウト動作は
'raise_exception'になります。 'error_as_result'を使用するには、outputSchemaを満たす戻り値を返すtimeoutErrorFunctionを指定します。- 出力ガードレールによって置き換えられた値も、
outputSchemaを満たす必要があります。
Programmatic Tool Calling は Responses 専用です。Chat Completions、リアルタイムエージェント、AI SDK モデルアダプターでは、これらのオプションは拒否されます。対象ツールが遅延されている場合、後続の生成プログラムから呼び出す前に、ツール検索で読み込む必要があります。
完全なコード例については、examples/tools/programmatic-tool-calling.ts を参照してください。
ツール戦略とベストプラクティス
Section titled “ツール戦略とベストプラクティス”ツール使用時の動作
Section titled “ツール使用時の動作”モデルがツールを使用するタイミングと方法(modelSettings.toolChoice、toolUseBehavior など)の制御については、エージェントを参照してください。
ベストプラクティス
Section titled “ベストプラクティス”- 短く明確な説明 – ツールが 何をするか と いつ使用するか を説明します。
- 入力の検証 – 可能な場合は、厳密な JSON 検証に Zod スキーマを使用します。
- エラーハンドラーでの副作用の回避 –
errorFunctionはスローせず、役立つ文字列を返す必要があります。 - ツールごとに 1 つの責務 – 小さく組み合わせ可能なツールにすることで、モデルの推論が向上します。