コンテンツにスキップ

ツール

ツールを使うと、エージェントは アクションを実行 できます。たとえば、データの取得、外部 API の呼び出し、コードの実行、さらにはコンピューターの使用も可能です。JavaScript/TypeScript SDK は、次の 7 つのカテゴリーをサポートしています。

どのエージェントにタスクを担当させるかを決定し、そのエージェントに機能を追加したくなったら、エージェントの次にこのページをお読みください。委譲パターンをまだ検討中の場合は、エージェントオーケストレーションを参照してください。

  1. OpenAI がホストするツール – OpenAI のサーバー上でモデルとともに実行されます。(Web 検索、ファイル検索、Code Interpreter、画像生成、ツール検索)
  2. 内蔵実行ツール – SDK が提供し、モデルの外部で実行されるツールです。(コンピュータ操作と apply_patch はローカルで実行され、shell はローカルまたはホストされたコンテナで実行できます)
  3. 関数ツール – 任意のローカル関数を JSON スキーマでラップし、LLM から呼び出せるようにします。
  4. Agents as tools – エージェント全体を呼び出し可能なツールとして公開します。
  5. MCP サーバー – Model Context Protocol サーバー(ローカルまたはリモート)を接続します。
  6. サンドボックス機能 – ワークスペースにスコープされた shell、ファイルシステム、スキル、メモリ、圧縮ツールを SandboxAgent に接続します。
  7. 実験的機能:Codex ツール – Codex SDK を関数ツールとしてラップし、ワークスペースを認識するタスクを実行します。

このガイドの残りの部分では、まず各ツールカテゴリーについて説明し、その後、カテゴリー横断のツール選択とプロンプト作成に関するガイダンスをまとめます。

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 の実行。
組み込みツール(Hosted)
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?)searchContextSizeuserLocationfilters.allowedDomains など、JS で扱いやすいオプション。
fileSearchTool(ids, options?)1 つ以上のベクトルストア ID を第 1 引数として受け取り、さらに maxNumResultsincludeSearchResultsrankingOptions、フィルターなどのオプションを受け取ります。
codeInterpreterTool(options?)container が指定されていない場合、デフォルトで自動管理コンテナを使用します。
imageGenerationTool(options?)modelsizequalitybackgroundinputFidelityinputImageMaskmoderationoutputCompressionpartialImages、出力形式などの画像生成設定をサポートします。
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 ガイドを参照してください。


これらのツールは SDK に組み込まれていますが、実行自体はモデルのレスポンスの外部で行われます。

  • コンピュータ操作Computer インターフェースを実装し、computerTool() に渡します。これは常に、ユーザーが提供するローカルの Computer 実装に対して実行されます。
  • Shell – ローカルの Shell 実装を提供するか、shellTool({ environment }) を使用してホストされたコンテナ環境を設定します。
  • パッチの適用Editor インターフェースを実装し、applyPatchTool() に渡します。これは常に、ユーザーが提供するローカルの Editor 実装に対して実行されます。
  • サンドボックスの shell およびファイルシステムツール – これらのアクションをサンドボックスワークスペース内で実行する必要がある場合は、SandboxAgentshell()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 コンピュータ操作ガイドと、その移行に関する注記を参照してください。

shellTool() には 2 つのモードがあります。

  • ローカルモード:shell を指定し、必要に応じて environment: { type: 'local', skills } に加えて、自動承認処理用の needsApprovalonApproval を指定します。
  • ホストされたコンテナモード:type: 'container_auto' または type: 'container_reference'environment を指定します。

ローカルモードでは、environment.skills を使って、namedescription、ファイルシステムの path によりローカルスキルをマウントできます。

ホストされたコンテナモードでは、次のいずれかを指定して shellTool({ environment }) を設定します。

  • 実行用の管理対象コンテナを作成する type: 'container_auto'
  • containerId で既存のコンテナを再利用する type: 'container_reference'

ホストされた container_auto 環境は、次をサポートします。

  • domainSecrets を持つ許可リストを含む networkPolicy
  • アップロード済みファイルをマウントするための fileIds
  • コンテナサイズを設定するための memoryLimit
  • skill_reference またはインラインの zip バンドルによる skills

ホストされた shell 環境では、ローカルプロセスではなくホストされたコンテナ環境で実行されるため、shellneedsApprovalonApproval は受け付けません。

エンドツーエンドの使用方法については、examples/tools/local-shell.tsexamples/tools/container-shell-skill-ref.tsexamples/tools/container-shell-inline-skill.ts を参照してください。

applyPatchTool() は、shellTool() のローカル承認フローと同様に動作します。ファイル編集前に一時停止するには needsApproval を使用し、アプリケーションレベルのコールバックで自動承認または拒否するには onApproval を使用します。


tool() ヘルパーを使うと、任意の 関数をツールに変換できます。

Zod パラメーターを使用する関数ツール
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.`;
},
});
フィールド必須説明
nameいいえデフォルトでは関数名(例:get_weather)になります。
descriptionはいLLM に表示される、明確で人間が理解しやすい説明です。
parametersはいZod スキーマまたは元の JSON スキーマオブジェクトです。Zod パラメーターでは strict モードが自動的に有効になります。
strictいいえtrue(デフォルト)の場合、引数の検証に失敗すると SDK はモデルエラーを返します。曖昧なマッチングを行うには false に設定します。
executeはい(args, context, details) => string | unknown | Promise<...> – ビジネスロジックです。文字列以外の出力はモデル向けにシリアライズされます。context は省略可能な RunContext です。details には toolCallresumeStatesignal などのメタデータが含まれます。
allowedCallersいいえツールを直接、プログラム経由、またはその両方から呼び出せるかを制御する、Responses 専用の空でないリストです。'direct''programmatic'、または両方の値を使用します。
outputSchemaいいえツールの実行結果を定義する Responses 専用スキーマです。Zod スキーマは execute の戻り値の型を制約し、実行時の実行結果を検証および変換します。元の JSON スキーマはワイヤーコントラクトのみを記述します。
errorFunctionいいえ内部エラーをモデルから参照できる実行結果に変換するカスタムハンドラー (context, error, details) => result です。outputSchema が設定されている場合、実行結果はそのスキーマを満たす必要があります。デフォルトハンドラーは無効になっているため、元のエラーが再スローされます。
timeoutMsいいえ呼び出しごとのタイムアウト(ミリ秒)です。0 より大きく、2147483647 以下である必要があります。
timeoutBehaviorいいえタイムアウトモードです。error_as_result はモデルから参照できる実行結果を返し、raise_exceptionToolTimeoutError をスローします。デフォルトは、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いいえツールの実行後に動作するガードレールです。拒否またはスローできます。ガードレールを参照してください。

アプリケーションで、レンダラー向けのヒント、内部 ID、またはその他の JSON 互換メタデータをツールの実行結果に添える必要がある場合は、customDataExtractor を使用します。このコールバックは、実行コンテキスト、ツール定義、モデルのツール呼び出し、解析済み入力、出力、および複製された元の出力項目を受け取ります。返されたデータは RunToolCallOutputItem.customDataRunState に保存されますが、history とモデルの再実行からは除外されます。

各関数ツールの呼び出し時間を制限するには、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 を使用すると、通常のエージェント実行と同じタイムアウト動作を適用できます。

モデルに無効または不完全な入力を 推測 させる必要がある場合、元の JSON スキーマを使用するときに strict モードを無効にできます。

非 strict JSON スキーマツール
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 の遅延ツール読み込みフローをサポートしていません。

会話を完全にハンドオフすることなく、あるエージェントから別のエージェントを 支援役 として利用したい場合があります。その場合は agent.asTool() を使用します。

agent.asTool()handoff() のどちらを使用するか検討中の場合は、エージェントエージェントオーケレーションでパターンを比較してください。

Agents as tools
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() のオプションを介してエージェントツールに needsApprovalisEnabled を設定し、Human in the loop (人間の介入) フローおよび条件付きのツール可用性と連携できます。

customOutputExtractor 内では、result.agentToolInvocation を使用して現在の Agent.asTool() 呼び出しを確認します。このコールバック内の実行結果は常に Agent.asTool() から取得されるため、agentToolInvocation は常に定義されており、toolNametoolCallIdtoolArguments を公開します。通常のアプリケーションコンテキストと 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_eventrun_item_stream_eventagent_updated_stream_event
  • onStream は最も簡単な「すべてを捕捉する」方法で、ツールをインラインで宣言する場合(tools: [agent.asTool({ onStream })])に適しています。イベントごとの振り分けが不要な場合に使用します。
  • on(eventName, handler) を使うと、選択的に、または '*' ですべてのイベントを購読できます。よりきめ細かい処理が必要な場合や、作成後にリスナーを追加する場合に最適です。
  • onStream またはいずれかの on(...) ハンドラーを指定すると、Agents as tools は自動的にストリーミングモードで実行されます。どちらも指定しない場合は、非ストリーミングパスのままです。
  • ハンドラーは並列に呼び出されるため、低速な onStream コールバックが on(...) ハンドラーをブロックすることはなく、その逆も同様です。
  • モデルのツール呼び出しを介してツールが呼び出された場合は、toolCallId が提供されます。invoke() の直接呼び出しやプロバイダー固有の動作では、省略される場合があります。

Model Context Protocol (MCP) サーバーを介してツールを公開し、エージェントに接続できます。たとえば、MCPServerStdio を使用して stdio MCP サーバーを起動し、接続できます。

ローカル 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 連携を参照してください。複数のサーバーを管理する場合や一部のサーバーで障害が発生した場合は、connectMcpServersMCP 連携にあるライフサイクルのガイダンスを使用してください。


@openai/agents-extensions/experimental/codex は、モデルのツール呼び出しを Codex SDK にルーティングする関数ツール codexTool() を提供します。これにより、エージェントはワークスペースにスコープされたタスク(shell、ファイル編集、MCP ツール)を自律的に実行できます。この機能は実験的なものであり、変更される可能性があります。

まず依存関係をインストールします。

Terminal window
npm install @openai/agents-extensions @openai/codex-sdk

クイックスタート:

実験的な Codex ツール
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 } が含まれている必要があります。
  • 安全性:sandboxModeworkingDirectory を組み合わせて使用します。ディレクトリが Git リポジトリでない場合は、skipGitRepoCheck を設定します。
  • スレッド:useRunContextThreadId: true は、最新のスレッド ID を runContext.context から読み取るか、そこに保存します。これは、アプリケーション状態でターンをまたいで再利用する場合に役立ちます。
  • スレッド ID の優先順位:ツール呼び出しの threadId(スキーマに含まれる場合)が最優先され、次に実行コンテキストのスレッド ID、最後に codexTool({ threadId }) が使用されます。
  • 実行コンテキストキー:name: 'codex' の場合はデフォルトで codexThreadId になり、name: 'engineer' のような名前の場合は codexThreadId_<suffix> になります(正規化後は codex_engineer)。
  • 可変コンテキストの要件:useRunContextThreadId が有効な場合は、可変オブジェクトまたは Maprun(..., { context }) として渡します。
  • 命名:ツール名は codex 名前空間に正規化されます(engineercodex_engineer になります)。エージェント内で重複する Codex ツール名は拒否されます。
  • ストリーミング:onStream は Codex イベント(推論、コマンド実行、MCP ツール呼び出し、ファイル変更、Web 検索)を反映するため、進行状況をログまたはトレースできます。
  • 出力:ツールの実行結果には responseusagethreadId が含まれ、Codex のトークン使用量は RunContext に記録されます。
  • 構造:outputSchema には、記述子、JSON スキーマオブジェクト、または Zod オブジェクトを指定できます。JSON オブジェクトスキーマの場合、additionalPropertiesfalse である必要があります。

実行コンテキストのスレッド再利用例:

Codex 実行コンテキストのスレッド再利用
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 を使用すると、対応する Responses モデルが、ホストされた実行環境内で複数のツール呼び出しを連携させる JavaScript を生成できます。クライアントが所有するツールは引き続きアプリケーションが実行するため、既存の検証、権限、承認、ガードレール、副作用はそのまま適用されます。

Programmatic Tool Calling
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 つの手順があります。

  1. エージェントに programmaticToolCallingTool() を追加します。
  2. 生成されたプログラムが呼び出せる各ツールに 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 “ツール戦略とベストプラクティス”

モデルがツールを使用するタイミングと方法(modelSettings.toolChoicetoolUseBehavior など)の制御については、エージェントを参照してください。


  • 短く明確な説明 – ツールが 何をするかいつ使用するか を説明します。
  • 入力の検証 – 可能な場合は、厳密な JSON 検証に Zod スキーマを使用します。
  • エラーハンドラーでの副作用の回避errorFunction はスローせず、役立つ文字列を返す必要があります。
  • ツールごとに 1 つの責務 – 小さく組み合わせ可能なツールにすることで、モデルの推論が向上します。

  • ツールを持つエージェントの定義と toolUseBehavior の制御については、エージェント
  • Agents as tools とハンドオフのどちらを使用するかの判断については、エージェントオーケストレーション
  • 実行フロー、ストリーミング、会話状態については、エージェントの実行
  • OpenAI がホストするモデルの設定と Responses トランスポートの選択については、モデル
  • ツールの入力または出力の検証については、ガードレール
  • tool() および各種の組み込みツール(Hosted)の型については、TypeDoc リファレンスを参照してください。