モデル
すべての Agent は最終的に LLM を呼び出します。 SDK では、モデルを 2 つの軽量なインターフェースの背後に抽象化しています。
Model– 特定の API に対して 1 回 のリクエストを行う方法を認識しますModelProvider– 人間が読めるモデル 名(例:'gpt‑5.4')をModelインスタンスに解決します
日常的には、通常はモデル 名 と、必要に応じて ModelSettings を扱うだけです。
import { Agent } from '@openai/agents';
const agent = new Agent({ name: 'Creative writer', model: 'gpt-5.4',});モデルの選択
Section titled “モデルの選択”デフォルトモデル
Section titled “デフォルトモデル”Agent の初期化時にモデルを指定しない場合は、デフォルトモデルが使用されます。 現在のデフォルトは、互換性と低レイテンシのため gpt-4.1 です。 利用可能であれば、明示的な modelSettings を維持しつつ、より高品質な gpt-5.4 をエージェントに設定することをおすすめします。
gpt-5.4 などの別のモデルに切り替えたい場合は、エージェントを設定する方法が 2 つあります。
1 つ目は、カスタムモデルを設定していないすべてのエージェントで特定のモデルを一貫して使いたい場合、エージェントを実行する前に OPENAI_DEFAULT_MODEL 環境変数を設定します。
export OPENAI_DEFAULT_MODEL=gpt-5.4node my-awesome-agent.js2 つ目は、Runner インスタンスにデフォルトモデルを設定する方法です。 エージェントにモデルを設定しない場合、この Runner のデフォルトモデルが使用されます。
import { Runner } from '@openai/agents';
const runner = new Runner({ model: 'gpt‑4.1-mini' });GPT-5.x モデル
Section titled “GPT-5.x モデル”この方法で gpt-5.4 などの GPT-5.x モデルを使うと、SDK はデフォルトの modelSettings を適用します。 これは多くのユースケースで最も適した設定です。 デフォルトモデルの推論 effort を調整したい場合は、独自の modelSettings を渡してください。
import { Agent } from '@openai/agents';
const myAgent = new Agent({ name: 'My Agent', instructions: "You're a helpful agent.", // If OPENAI_DEFAULT_MODEL=gpt-5.4 is set, passing only modelSettings works. // It's also fine to pass a GPT-5.x model name explicitly: model: 'gpt-5.4', modelSettings: { reasoning: { effort: 'high' }, text: { verbosity: 'low' }, },});レイテンシが重要な場合は、gpt-5.4 で reasoning.effort: "none" から始め、より慎重な推論が必要なタスクでのみ増やしてください。 gpt-4.1 ファミリー( mini や nano のバリアントを含む)も、インタラクティブなエージェントアプリの構築において引き続き有力な選択肢です。
非 GPT-5 モデル
Section titled “非 GPT-5 モデル”カスタム modelSettings なしで GPT-5 以外のモデル名を渡した場合、SDK は任意のモデルと互換性のある汎用的な modelSettings に戻します。
OpenAI プロバイダーの設定
Section titled “OpenAI プロバイダーの設定”OpenAI プロバイダー
Section titled “OpenAI プロバイダー”デフォルトの ModelProvider は OpenAI API を使用して名前を解決します。 これは 2 つの異なるエンドポイントをサポートします。
| API | 用途 | setOpenAIAPI() の呼び出し |
|---|---|---|
| Chat Completions | 標準的なチャットと Function Calling | setOpenAIAPI('chat_completions') |
| Responses | 新しいストリーミング ファーストの生成 API(ツール呼び出し、柔軟な出力) | setOpenAIAPI('responses') (デフォルト) |
import { setDefaultOpenAIKey } from '@openai/agents';
setDefaultOpenAIKey(process.env.OPENAI_API_KEY!); // sk-...カスタムのネットワーク設定が必要な場合は、setDefaultOpenAIClient(client) を使って独自の OpenAI クライアントを接続することもできます。
Responses WebSocket トランスポート
Section titled “Responses WebSocket トランスポート”Responses API で OpenAI プロバイダーを使用する場合、デフォルトの HTTP トランスポートではなく WebSocket トランスポートでリクエストを送信できます。
グローバルに有効化するには setOpenAIResponsesTransport('websocket') を使います。 または、プロバイダーごとに new OpenAIProvider({ useResponses: true, useResponsesWebSocket: true }) で有効化できます。
WebSocket トランスポートを使うだけであれば、withResponsesWebSocketSession(...) やカスタム OpenAIProvider は不要です。 各 run / request ごとの再接続を許容できるなら、setOpenAIResponsesTransport('websocket') を有効にした後も、既存の run() / Runner.run() の使い方をそのまま継続できます。
トランスポートの選択はモデル解決に従います。
setOpenAIResponsesTransport('websocket')は、Responses API を使用しつつ後で OpenAI プロバイダー経由で解決される文字列のモデル名にのみ影響します- 具体的な
ModelインスタンスをAgentまたはRunnerに渡した場合、そのインスタンスがそのまま使われます。OpenAIResponsesWSModelは WebSocket のまま、OpenAIResponsesModelは HTTP のまま、OpenAIChatCompletionsModelは Chat Completions のままです - 独自の
modelProviderを指定した場合は、そのプロバイダーがモデル解決を制御します。 グローバル setter に頼るのではなく、そこで WebSocket を有効化してください - プロキシ、ゲートウェイ、またはその他の OpenAI 互換エンドポイントを経由する場合、接続先が WebSocket の
/responsesエンドポイントをサポートしている必要があります。websocketBaseURLを明示的に設定する必要がある場合もあります
接続の再利用を最適化したい場合や、websocket プロバイダーのライフサイクルをより明示的に管理したい場合にのみ、withResponsesWebSocketSession(...) またはカスタム OpenAIProvider / Runner を使ってください。
withResponsesWebSocketSession(...): コールバック後に自動クリーンアップされる、便利なスコープ付きライフサイクル- カスタム
OpenAIProvider/Runner: 独自のアプリ構成の中での明示的なライフサイクル制御(シャットダウン時のクリーンアップを含む)
名前に反して、withResponsesWebSocketSession(...) はトランスポートのライフサイクルを補助するヘルパーであり、セッションガイド で説明されているメモリ Session インターフェースとは無関係です。
websocket プロキシまたはゲートウェイを使う場合は、OpenAIProvider の websocketBaseURL を設定するか、OPENAI_WEBSOCKET_BASE_URL を設定してください。
OpenAIProvider を自分でインスタンス化する場合は、websocket ベースの Responses モデルラッパーが接続再利用のためにデフォルトでキャッシュされることに注意してください。 これらのキャッシュされた接続を解放するため、シャットダウン時に await provider.close() を呼び出してください。 withResponsesWebSocketSession(...) は主にこのライフサイクルを管理するために存在します。 websocket 対応のプロバイダーと runner を作成し、それらをコールバックに渡し、最後に必ずプロバイダーを閉じます。 一時的なプロバイダーには providerOptions、コールバックにスコープされた runner のデフォルトには runnerConfig を使ってください。
Responses WebSocket トランスポートを使った完全なストリーミング + HITL の例は examples/basic/stream-ws.ts を参照してください。
Responses 専用の遅延ツール読み込み
Section titled “Responses 専用の遅延ツール読み込み”toolSearchTool(), toolNamespace(), および deferLoading: true を設定した関数ツールや Hosted MCP tools には OpenAI Responses API が必要です。 Chat Completions プロバイダーは名前空間付きまたは遅延関数ツールを拒否し、AI SDK アダプターは遅延 Responses ツール読み込みフローをサポートしていません。 ツール検索が必要な場合は Responses モデルを直接使用してください。
ツール検索は、Responses API でこれをサポートする GPT-5.4 以降のモデルリリースでのみ利用できます。
run に遅延ツールが含まれる場合は、同じエージェントに toolSearchTool() を追加し、modelSettings.toolChoice を 'auto' のままにしてください。 これらの定義をいつ読み込むかはモデルが判断する必要があるため、SDK では組み込みの tool_search ツールや遅延関数ツールを名前指定で強制できません。 完全な設定については、ツールガイド と公式の OpenAI tool search guide を参照してください。
モデルの振る舞いとプロンプト
Section titled “モデルの振る舞いとプロンプト”ModelSettings
Section titled “ModelSettings”ModelSettings は OpenAI のパラメーターを反映していますが、プロバイダー非依存です。
| Field | Type | Notes |
|---|---|---|
temperature | number | 創造性と決定性のバランス |
topP | number | Nucleus sampling |
frequencyPenalty | number | 繰り返しトークンへのペナルティ |
presencePenalty | number | 新しいトークンを促進 |
toolChoice | 'auto' | 'required' | 'none' | string | ツール使用の強制 を参照してください。 OpenAI Responses では、toolChoice: 'computer' により、利用可能な場合は GA の組み込み computer ツールを強制します |
parallelToolCalls | boolean | サポートされている場合に並列 Function Calling を許可 |
truncation | 'auto' | 'disabled' | トークン切り詰め戦略 |
maxTokens | number | レスポンスの最大トークン数 |
store | boolean | 取得 / RAG ワークフローのためにレスポンスを永続化 |
promptCacheRetention | 'in-memory' | '24h' | null | サポート時にプロバイダーのプロンプトキャッシュ保持を制御 |
reasoning.effort | 'none' | 'minimal' | 'low' | 'medium' | 'high' | 'xhigh' | gpt-5.x モデルの推論 effort |
reasoning.summary | 'auto' | 'concise' | 'detailed' | モデルが返す推論サマリー量を制御 |
text.verbosity | 'low' | 'medium' | 'high' | gpt-5.x などのテキスト冗長度 |
providerData | Record<string, any> | 基盤モデルに転送される、プロバイダー固有の passthrough オプション |
retry | ModelRetrySettings | 実行時専用の opt-in リトライ設定。 モデルのリトライ を参照してください |
設定はどちらのレベルにも付与できます。
import { Runner, Agent } from '@openai/agents';
const agent = new Agent({ name: 'Creative writer', // ... modelSettings: { temperature: 0.7, toolChoice: 'auto' },});
// or globallynew Runner({ modelSettings: { temperature: 0.3 } });Runner レベルの設定は、競合するエージェントごとの設定を上書きします。 注目すべき例外は retry です。 undefined で継承値を明示的にクリアしない限り、そのネストされたフィールドは runner と agent の設定間でマージされます。
モデルのリトライ
Section titled “モデルのリトライ”リトライは実行時専用で、opt-in です。 SDK は、modelSettings.retry を設定し、かつポリシーがリトライ判断を返さない限り、モデルリクエストをリトライしません。
import { Agent, Runner, retryPolicies } from '@openai/agents';
const sharedRetry = { maxRetries: 4, backoff: { initialDelayMs: 500, maxDelayMs: 5_000, multiplier: 2, jitter: true, }, policy: retryPolicies.any( retryPolicies.providerSuggested(), retryPolicies.retryAfter(), retryPolicies.networkError(), retryPolicies.httpStatus([408, 409, 429, 500, 502, 503, 504]), ),};
const runner = new Runner({ modelSettings: { retry: sharedRetry, },});
const agent = new Agent({ name: 'Assistant', instructions: 'You are a concise assistant.', modelSettings: { retry: { maxRetries: 2, backoff: { maxDelayMs: 2_000, }, }, },});
await runner.run(agent, 'Summarize exponential backoff in plain English.');ModelRetrySettings には 3 つのフィールドがあります。
| Field | Type | Notes |
|---|---|---|
maxRetries | number | 初回リクエスト後に許可されるリトライ試行回数 |
backoff | { initialDelayMs?, maxDelayMs?, multiplier?, jitter? } | ポリシーが delayMs を返さずにリトライする場合のデフォルト遅延戦略 |
policy | RetryPolicy | リトライするかどうかを判断するコールバック。 この関数は実行時専用であり、永続化された run 状態にはシリアライズされません |
リトライポリシーは、次を含む RetryPolicyContext を受け取ります。
attemptとmaxRetries。 試行回数に応じた判断を行えますstream。 ストリーミングと非ストリーミングの振る舞いを分岐できますerror。 元のエラーを確認できますnormalizedの情報。statusCode、retryAfterMs、errorCode、isNetworkError、isAbortなどです- 基盤となるモデル / プロバイダーがリトライガイダンスを提供できる場合の
providerAdvice
ポリシーは次のいずれかを返せます。
- 単純なリトライ判断のための
true/false - 遅延を上書きしたり、ログ用の診断理由を付加したい場合の
{ retry, delayMs?, reason? }
SDK は retryPolicies に、すぐ使えるヘルパーをエクスポートしています。
| Helper | Behavior |
|---|---|
retryPolicies.never() | 常に opt out します |
retryPolicies.providerSuggested() | 利用可能な場合はプロバイダーのリトライ助言に従います |
retryPolicies.networkError() | 一時的なトランスポート / 接続障害に一致します |
retryPolicies.httpStatus([..]) | 選択した HTTP ステータスコードに一致します |
retryPolicies.retryAfter() | retry-after のヒントがある場合にのみ、その遅延でリトライします |
retryPolicies.any(...) | いずれかのネストされたポリシーが opt in したときにリトライします |
retryPolicies.all(...) | すべてのネストされたポリシーが opt in したときにのみリトライします |
ポリシーを組み合わせる場合、providerSuggested() は最も安全な最初の構成要素です。 プロバイダーがそれらを区別できる場合、プロバイダーの拒否や replay-safe の承認を保持できるためです。
一部の失敗は自動では決してリトライされません。
- Abort エラー
- 可視イベントまたは元のモデルイベントがすでに 1 つでも出力された後のストリーミング run
- 再実行が安全ではないと示すプロバイダー助言
previousResponseId または conversationId を使う状態保持型の後続リクエストも、より保守的に扱われます。 これらのリクエストでは、networkError() や httpStatus([500]) のような非プロバイダー述語だけでは不十分です。 リトライポリシーには、通常は retryPolicies.providerSuggested() を通じた、プロバイダーからの replay-safe 承認を含める必要があります。
Runner と agent のマージ動作
Section titled “Runner と agent のマージ動作”retry は runner レベルと agent レベルの modelSettings 間でディープマージされます。
- agent は
retry.maxRetriesだけを上書きしつつ、runner のpolicyを継承できます - agent は
retry.backoffの一部だけを上書きしつつ、他の backoff フィールドは runner から維持できます - 継承された
policyまたはbackoffを削除したい場合は、そのフィールドを明示的にundefinedに設定してください
より詳細な例とログについては、examples/basic/retry.ts および examples/ai-sdk/retry.ts を参照してください。
Agents は prompt パラメーターで設定できます。 これは、Agent の振る舞いを制御するために使用するサーバー保存済みプロンプト設定を示します。 現在、このオプションは OpenAI の Responses API を使用する場合にのみサポートされています。
prompt は静的なオブジェクトでも、実行時にそれを返す関数でも指定できます。 コールバックの形については、動的プロンプト を参照してください。
| Field | Type | Notes |
|---|---|---|
promptId | string | プロンプトの一意な識別子 |
version | string | 使用したいプロンプトのバージョン |
variables | object | プロンプトに埋め込む変数のキー / 値ペア。 値には文字列や、テキスト・画像・ファイルなどの content input type を指定できます |
import { parseArgs } from 'node:util';import { Agent, run } from '@openai/agents';
/*NOTE: This example will not work out of the box, because the default prompt ID will notbe available in your project.
To use it, please:1. Go to https://platform.openai.com/chat/edit2. Create a new prompt variable, `poem_style`.3. Create a system prompt with the content: Write a poem in {{poem_style}}4. Run the example with the `--prompt-id` flag.*/
const DEFAULT_PROMPT_ID = 'pmpt_6965a984c7ac8194a8f4e79b00f838840118c1e58beb3332';const POEM_STYLES = ['limerick', 'haiku', 'ballad'];
function pickPoemStyle(): string { return POEM_STYLES[Math.floor(Math.random() * POEM_STYLES.length)];}
async function runDynamic(promptId: string) { const poemStyle = pickPoemStyle(); console.log(`[debug] Dynamic poem_style: ${poemStyle}`);
const agent = new Agent({ name: 'Assistant', prompt: { promptId, version: '1', variables: { poem_style: poemStyle }, }, });
const result = await run(agent, 'Tell me about recursion in programming.'); console.log(result.finalOutput);}
async function runStatic(promptId: string) { const agent = new Agent({ name: 'Assistant', prompt: { promptId, version: '1', variables: { poem_style: 'limerick' }, }, });
const result = await run(agent, 'Tell me about recursion in programming.'); console.log(result.finalOutput);}
async function main() { const args = parseArgs({ options: { dynamic: { type: 'boolean', default: false }, 'prompt-id': { type: 'string', default: DEFAULT_PROMPT_ID }, }, });
const promptId = args.values['prompt-id']; if (!promptId) { console.error('Please provide a prompt ID via --prompt-id.'); process.exit(1); }
if (args.values.dynamic) { await runDynamic(promptId); } else { await runStatic(promptId); }}
main().catch((error) => { console.error(error); process.exit(1);});ツールや instructions など、追加のエージェント設定は、保存済みプロンプトで設定されている値を上書きします。
保存済みプロンプトがすでにモデルを定義している場合、SDK は明示的に上書きしない限り、エージェントのデフォルトモデルを送信しません。 これは computerTool() にとって重要です。 prompt 管理 run は互換性のため、デフォルトで従来の preview wire shape を維持します。 prompt 管理 run で GA Responses computer ツールを有効にするには、modelSettings.toolChoice: 'computer' を明示的に設定するか、gpt-5.4 のような明示的なモデルを送信してください。 関連するコンピュータ操作の詳細は ツール を参照してください。
高度なプロバイダーと可観測性
Section titled “高度なプロバイダーと可観測性”カスタムモデルプロバイダー
Section titled “カスタムモデルプロバイダー”独自のプロバイダー実装は簡単です。 ModelProvider と Model を実装し、そのプロバイダーを Runner コンストラクターに渡します。
import { ModelProvider, Model, ModelRequest, ModelResponse, ResponseStreamEvent,} from '@openai/agents-core';
import { Agent, Runner } from '@openai/agents';
class EchoModel implements Model { name: string; constructor() { this.name = 'Echo'; } async getResponse(request: ModelRequest): Promise<ModelResponse> { return { usage: {}, output: [{ role: 'assistant', content: request.input as string }], } as any; } async *getStreamedResponse( _request: ModelRequest, ): AsyncIterable<ResponseStreamEvent> { yield { type: 'response.completed', response: { output: [], usage: {} }, } as any; }}
class EchoProvider implements ModelProvider { getModel(_modelName?: string): Promise<Model> | Model { return new EchoModel(); }}
const runner = new Runner({ modelProvider: new EchoProvider() });console.log(runner.config.modelProvider.getModel());const agent = new Agent({ name: 'Test Agent', instructions: 'You are a helpful assistant.', model: new EchoModel(), modelSettings: { temperature: 0.7, toolChoice: 'auto' },});console.log(agent.model);すべての run() 呼び出しと新しく構築されるすべての Runner で、同じプロバイダーをデフォルトで使いたい場合は、アプリ起動時に一度だけ設定してください。
import { setDefaultModelProvider } from '@openai/agents';
setDefaultModelProvider({ async getModel() { // Return any Model implementation here. throw new Error('Provide your own model implementation.'); },});これは、アプリが OpenAI 以外のプロバイダーに標準化されており、どこでもカスタム Runner を渡したくない場合に便利です。
AI SDK 連携
Section titled “AI SDK 連携”ModelProvider を自分で実装せずに OpenAI 以外のモデルを使いたい場合は、Vercel の AI SDK で任意のモデルを使う を参照してください。 このアダプターを使うと、AI SDK モデルを Agents ランタイムに直接接続できます。 アプリがすでに AI SDK プロバイダーに標準化されている場合や、より広いプロバイダーエコシステムを利用したい場合に便利です。 また、Agents SDK の providerData が AI SDK の providerMetadata にどのように対応するか、および AI SDK UI ルートで利用できるストリームヘルパーについても説明しています。
トレーシング認証情報
Section titled “トレーシング認証情報”サポートされているサーバーランタイムでは、トレーシングはすでにデフォルトで有効です。 トレースのエクスポートにデフォルトの OpenAI API キーとは異なる認証情報を使う場合にのみ、setTracingExportApiKey() を使用してください。
import { setTracingExportApiKey } from '@openai/agents';
setTracingExportApiKey('sk-...');これにより、その認証情報を使ってトレースが OpenAI dashboard に送信されます。 カスタム ingest エンドポイントやリトライ調整など、エクスポーターのカスタマイズについては トレーシング を参照してください。