コンテンツにスキップ

ツール

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

どのエージェントがタスクを担当すべきかが決まり、そのエージェントに機能を持たせたい場合は、エージェントの次にこのページをお読みください。委任パターンを検討中の場合は、エージェントオーケストレーションを参照してください。

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

ヘルパー関数備考
webSearchTool(options?)searchContextSizeuserLocationfilters.allowedDomains など、JavaScript で扱いやすいオプション
fileSearchTool(ids, options?)1 つ以上のベクトルストア ID を最初の引数として受け取り、さらに maxNumResultsincludeSearchResultsrankingOptions、フィルターなどのオプションを指定可能
codeInterpreterTool(options?)container が指定されていない場合、デフォルトで自動管理コンテナを使用
imageGenerationTool(options?)modelsizequalitybackgroundinputFidelityinputImageMaskmoderationoutputCompressionpartialImages、出力形式などの画像生成設定をサポート
toolSearchTool(options?)組み込みの tool_search ヘルパーを追加。deferLoading: true が設定された遅延読み込みの関数ツールまたはホストされた MCP ツールと組み合わせて使用。デフォルトではホストされた実行をサポートし、execution: 'client'execute を使用したクライアント実行もサポート

これらのヘルパーは、JavaScript/TypeScript で扱いやすいオプション名を、基盤となる OpenAI Responses API のツールペイロードにマッピングします。完全なツールスキーマと、ランキングオプションやセマンティックフィルターなどの高度なオプションについては、公式の OpenAI ツールガイドを参照してください。現在の組み込みツール検索フローと利用可能なモデルについては、公式のツール検索ガイドを参照してください。


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

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

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':実行用の管理対象コンテナを作成
  • type: 'container_reference'containerId を指定して既存のコンテナを再利用

ホストされた container_auto 環境では、次の機能がサポートされます。

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

ホストされたシェル環境では、実行がローカルプロセスではなくホストされたコンテナ環境で行われるため、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 などのメタデータが含まれます。
errorFunctionいいえ内部エラーをユーザーに表示する文字列へ変換するカスタムハンドラー (context, error) => string
timeoutMsいいえ呼び出し単位のタイムアウト(ミリ秒)。0 より大きく、2147483647 以下である必要があります。
timeoutBehaviorいいえタイムアウトモード。error_as_result(デフォルト)はモデルに表示されるタイムアウトメッセージを返し、raise_exceptionToolTimeoutError をスローします。
timeoutErrorFunctionいいえtimeoutBehaviorerror_as_result の場合に、タイムアウト出力を生成するカスタムハンドラー (context, timeoutError) => string
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. をモデルに返します。
  • timeoutBehavior: 'raise_exception'ToolTimeoutError をスローします。これは実行時の例外の一部としてキャッチできます。
  • timeoutErrorFunction を使用すると、error_as_result モードでのタイムアウトテキストをカスタマイズできます。
  • タイムアウト時には 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 は次の処理を行います。

  • 1 つの input パラメーターを持つ関数ツールを作成
  • ツールが呼び出されたときに、その入力を使用してサブエージェントを実行
  • 最後のメッセージ、または customOutputExtractor で抽出した出力を返却

エージェントをツールとして実行すると、Agents SDK はデフォルト設定で Runner を作成し、関数の実行内でその Runner を使用してエージェントを実行します。runConfig または runOptions のプロパティを指定する場合は、それらを asTool() メソッドに渡して Runner の動作をカスタマイズできます。

また、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(...) ハンドラーを指定すると、エージェントツールは自動的にストリーミングモードで実行されます。どちらも指定しない場合は、非ストリーミングフローのままです。
  • ハンドラーは並列に呼び出されるため、低速な 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() を提供します。これにより、エージェントはワークスペース単位のタスク(シェル、ファイル編集、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' の場合はデフォルトで codexThreadIdname: 'engineer' のような名前では codexThreadId_<suffix>(正規化後は codex_engineer)になります。
  • ミュータブルなコンテキストの要件:useRunContextThreadId を有効にする場合は、run(..., { context }) に変更可能なオブジェクトまたは Map を渡します。
  • 命名:ツール名は 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;

ツール戦略とベストプラクティス

Section titled “ツール戦略とベストプラクティス”

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


  • 短く明示的な説明 – ツールが 何をするか、そして いつ使用するか を説明します。
  • 入力の検証 – 可能な限り Zod スキーマを使用して厳密な JSON 検証を行います。
  • エラーハンドラーでの副作用の回避errorFunction は例外をスローせず、有用な文字列を返すようにします。
  • ツールごとに 1 つの責務 – 小さく構成可能なツールにすると、モデルの推論が向上します。

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