ツール
ツールにより、エージェントは アクションを実行 できます。データの取得、外部 API の呼び出し、コードの実行、さらにはコンピュータの使用も可能です。JavaScript/TypeScript SDK は 7 つのカテゴリーをサポートしています。
どのエージェントがタスクを担当すべきか分かっており、そのエージェントに機能を与えたい場合は、エージェント を読んだ後でこのページを読んでください。委任パターンをまだ検討中の場合は、エージェントオーケストレーション を参照してください。
- OpenAI がホストするツール – OpenAI サーバー上でモデルと並行して実行されます。(Web 検索、ファイル検索、Code Interpreter、画像生成、ツール検索)
- 組み込み実行ツール – モデルの外部で実行される、SDK 提供のツールです。(コンピュータ操作と apply_patch はローカルで実行されます。shell はローカルまたはホストされたコンテナで実行できます)
- 関数ツール – 任意のローカル関数を JSON スキーマでラップし、LLM が呼び出せるようにします。
- Agents as tools – エージェント全体を呼び出し可能なツールとして公開します。
- MCP サーバー – Model Context Protocol サーバー(ローカルまたはリモート)を接続します。
- サンドボックス機能 – ワークスペーススコープの shell、filesystem、skills、memory、compaction ツールを
SandboxAgentに接続します。 - 実験的: Codex ツール – Codex SDK を関数ツールとしてラップし、ワークスペースを認識したタスクを実行します。
ツールのカテゴリー
Section titled “ツールのカテゴリー”このガイドの残りでは、まず各ツールカテゴリーを説明し、その後で横断的なツール選択とプロンプトのガイダンスをまとめます。
1. 組み込みツール(Hosted)(OpenAI Responses API)
Section titled “1. 組み込みツール(Hosted)(OpenAI Responses API)”OpenAIResponsesModel を使用する場合、次の組み込みツールを追加できます。
| ツール | 型文字列 | 目的 |
|---|---|---|
| Web 検索 | 'web_search' | インターネット検索 |
| ファイル / retrieval 検索 | 'file_search' | OpenAI 上でホストされているベクトルストアをクエリします |
| Code Interpreter | 'code_interpreter' | サンドボックス環境でコードを実行します |
| 画像生成 | 'image_generation' | テキストに基づいて画像を生成します |
| ツール検索 | 'tool_search' | 遅延された関数ツール、名前空間、検索可能な MCP ツールを実行時に読み込みます |
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 は、ホスト型ツール定義を返すヘルパー関数を提供します。
| ヘルパー関数 | 注記 |
|---|---|
webSearchTool(options?) | searchContextSize、userLocation、filters.allowedDomains など、JS フレンドリーなオプション |
fileSearchTool(ids, options?) | 1 つ以上のベクトルストア ID を最初の引数として受け取り、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 を指定するとクライアント実行もサポートします |
これらのヘルパーは、JavaScript/TypeScript フレンドリーなオプション名を、基盤となる OpenAI Responses API ツールペイロードにマッピングします。ランキングオプションやセマンティックフィルターなど、完全なツールスキーマと高度なオプションについては、公式の OpenAI ツールガイド を参照してください。また、現在の組み込みツール検索フローとモデルの利用可否については、公式の ツール検索ガイド を参照してください。
2. 組み込み実行ツール
Section titled “2. 組み込み実行ツール”これらのツールは SDK に組み込まれていますが、実行自体はモデルのレスポンスの外側で行われます。
- コンピュータ操作 –
Computerインターフェイスを実装し、computerTool()に渡します。これは常に、あなたが提供するローカルのComputer実装に対して実行されます。 - Shell – ローカルの
Shell実装を提供するか、shellTool({ environment })でホスト型コンテナ環境を設定します。 - Apply patch –
Editorインターフェイスを実装し、applyPatchTool()に渡します。これは常に、あなたが提供するローカルのEditor実装に対して実行されます。 - サンドボックス shell と filesystem ツール – これらのアクションをサンドボックスワークスペース内で実行する必要がある場合は、
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 }), ],});Computer ツールの詳細
Section titled “Computer ツールの詳細”computerTool() は次のいずれかを受け取ります。
- 具体的な
Computerインスタンス - 実行ごとに
Computerを作成する初期化関数 - 実行スコープのセットアップとティアダウンが必要な場合の
{ create, dispose }を持つプロバイダーオブジェクト
OpenAI の現在のコンピュータ操作パスを使用するには、gpt-5.4 のようなコンピュータ対応モデルを設定します。リクエストモデルが明示されている場合、SDK は GA の組み込み computer ツール形式を送信します。有効なモデルが保存済みプロンプトや別の古い連携から来ている場合は、modelSettings.toolChoice: 'computer' で明示的に GA パスを選択しない限り、SDK は互換性のために従来の computer_use_preview ワイヤ形式を維持します。
GA の computer 呼び出しでは、単一の computer_call 内にバッチ化された actions[] を含めることができます。SDK はそれらを順番に実行し、各アクションに対して needsApproval を評価し、最終的なスクリーンショットをツール出力として返します。interruption.rawItem から承認 UI を構築する場合は、存在する場合は actions を読み取り、従来のプレビュー項目では action にフォールバックしてください。
影響の大きいコンピュータ操作をユーザーレビューのために一時停止する必要がある場合は needsApproval を使用し、computer 呼び出しに対して報告された保留中の安全性チェックを承認または拒否したい場合は 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、filesystem の path でローカルスキルをマウントできます。
ホスト型コンテナモードでは、次のいずれかを使って shellTool({ environment }) を設定します。
type: 'container_auto'で、その実行用の管理コンテナを作成します。type: 'container_reference'で、containerIdにより既存のコンテナを再利用します。
ホスト型の 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 を参照してください。
Apply-patch ツールの詳細
Section titled “Apply-patch ツールの詳細”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 などのメタデータが含まれます |
errorFunction | いいえ | 内部エラーをユーザーに見える文字列に変換するためのカスタムハンドラー (context, error) => string |
timeoutMs | いいえ | 呼び出しごとのタイムアウト(ミリ秒)。0 より大きく、2147483647 以下である必要があります |
timeoutBehavior | いいえ | タイムアウトモード: error_as_result(既定)はモデルに見えるタイムアウトメッセージを返し、raise_exception は ToolTimeoutError を投げます |
timeoutErrorFunction | いいえ | timeoutBehavior が error_as_result の場合のタイムアウト出力用カスタムハンドラー (context, timeoutError) => string |
needsApproval | いいえ | 実行前に人間の承認を要求します。人間の介入(HITL) を参照してください |
isEnabled | いいえ | 実行ごとにツールを条件付きで公開します。boolean または述語を受け取ります |
inputGuardrails | いいえ | ツール実行前に実行されるガードレールです。拒否または例外を投げることができます。ガードレール を参照してください |
outputGuardrails | いいえ | ツール実行後に実行されるガードレールです。拒否または例外を投げることができます。ガードレール を参照してください |
関数ツールのタイムアウト
Section titled “関数ツールのタイムアウト”各関数ツールの呼び出しを制限するには、timeoutMs を使用します。
timeoutBehavior: 'error_as_result'(既定)は、Tool '<name>' timed out after <timeoutMs>ms.をモデルに返します。timeoutBehavior: 'raise_exception'はToolTimeoutErrorを投げます。これは エージェントの実行 の一部として捕捉できます。timeoutErrorFunctionにより、error_as_resultモードでのタイムアウト文言をカスタマイズできます。- タイムアウトは
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 ループが必要です。 - 名前空間には即時メンバーと遅延メンバーを混在させることができます。即時メンバーはツール検索なしで呼び出し可能なままで、同じ名前空間内の遅延メンバーはオンデマンドで読み込まれます。
- 遅延関数ツールと
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 は既定の設定で runner を作成し、関数実行内でその runner を使ってエージェントを実行します。runConfig や runOptions のプロパティを指定したい場合は、それらを asTool() メソッドに渡して runner の動作をカスタマイズできます。
Human in the loop (人間の介入) フローや条件付きツール可用性と連携するために、asTool() オプションを通じてエージェントツールに needsApproval と isEnabled を設定することもできます。
customOutputExtractor 内では、現在の Agent.asTool() 呼び出しを調べるために result.agentToolInvocation を使用します。このコールバックでは結果は常に Agent.asTool() から来るため、agentToolInvocation は常に定義され、toolName、toolCallId、toolArguments を公開します。通常のアプリコンテキストには result.runContext を使用し、ツール入力には toolInput を使用します。このメタデータは現在のネストされた呼び出しにスコープされ、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(...)ハンドラーを指定すると、agent-as-tool は自動的にストリーミングモードで実行されます。指定しない場合は非ストリーミングパスのままです。- ハンドラーは並列に呼び出されるため、遅い
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 は codexTool() を提供します。これはモデルのツール呼び出しを Codex SDK にルーティングする関数ツールで、エージェントがワークスペーススコープのタスク(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は最新の thread ID をrunContext.contextから読み取り/保存します。これはアプリ状態でターンをまたいで再利用する場合に役立ちます。 - Thread ID の優先順位: ツール呼び出しの
threadId(スキーマに含まれる場合)が最優先され、次に run context thread ID、最後にcodexTool({ threadId })が使われます。 - Run context キー:
name: 'codex'の場合は既定でcodexThreadId、name: 'engineer'のような名前の場合はcodexThreadId_<suffix>(正規化後はcodex_engineer)になります。 - 可変コンテキスト要件:
useRunContextThreadIdが有効な場合は、run(..., { context })として可変オブジェクトまたはMapを渡します。 - 命名: ツール名は
codex名前空間に正規化され(engineerはcodex_engineerになります)、エージェント内で Codex ツール名が重複すると拒否されます。 - ストリーミング:
onStreamは Codex イベント(推論、コマンド実行、MCP ツール呼び出し、ファイル変更、Web 検索)を反映するため、進行状況をログまたはトレースできます。 - 出力: ツール結果には
response、usage、threadIdが含まれ、Codex トークン使用量はRunContextに記録されます。 - 構造:
outputSchemaには descriptor、JSON スキーマオブジェクト、または Zod オブジェクトを指定できます。JSON オブジェクトスキーマでは、additionalPropertiesはfalseである必要があります。
Run context thread の再利用例:
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;ツール戦略とベストプラクティス
Section titled “ツール戦略とベストプラクティス”ツール使用動作
Section titled “ツール使用動作”モデルがいつどのようにツールを使用する必要があるか(modelSettings.toolChoice、toolUseBehavior など)を制御する方法については、エージェント を参照してください。
ベストプラクティス
Section titled “ベストプラクティス”- 短く明示的な説明 – ツールが 何を するのか、 いつ使うか を説明します。
- 入力の検証 – 可能な場合は、厳密な JSON 検証のために Zod スキーマを使用します。
- エラーハンドラーでの副作用の回避 –
errorFunctionは例外を投げるのではなく、有用な文字列を返すべきです。 - ツールごとに 1 つの責務 – 小さく構成可能なツールは、モデルの推論を向上させます。