コンテンツにスキップ

モデル

すべての 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',
});

Agent の初期化時にモデルを指定しない場合は、デフォルトモデルが使用されます。 現在のデフォルトは、互換性と低レイテンシのため gpt-4.1 です。 利用可能であれば、明示的な modelSettings を維持しつつ、より高品質な gpt-5.4 をエージェントに設定することをおすすめします。

gpt-5.4 などの別のモデルに切り替えたい場合は、エージェントを設定する方法が 2 つあります。

1 つ目は、カスタムモデルを設定していないすべてのエージェントで特定のモデルを一貫して使いたい場合、エージェントを実行する前に OPENAI_DEFAULT_MODEL 環境変数を設定します。

Terminal window
export OPENAI_DEFAULT_MODEL=gpt-5.4
node my-awesome-agent.js

2 つ目は、Runner インスタンスにデフォルトモデルを設定する方法です。 エージェントにモデルを設定しない場合、この Runner のデフォルトモデルが使用されます。

Runner のデフォルトモデル設定
import { Runner } from '@openai/agents';
const runner = new Runner({ model: 'gpt‑4.1-mini' });

この方法で gpt-5.4 などの GPT-5.x モデルを使うと、SDK はデフォルトの modelSettings を適用します。 これは多くのユースケースで最も適した設定です。 デフォルトモデルの推論 effort を調整したい場合は、独自の modelSettings を渡してください。

GPT-5 のデフォルト設定のカスタマイズ
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.4reasoning.effort: "none" から始め、より慎重な推論が必要なタスクでのみ増やしてください。 gpt-4.1 ファミリー( mini や nano のバリアントを含む)も、インタラクティブなエージェントアプリの構築において引き続き有力な選択肢です。

カスタム modelSettings なしで GPT-5 以外のモデル名を渡した場合、SDK は任意のモデルと互換性のある汎用的な modelSettings に戻します。


デフォルトの ModelProvider は OpenAI API を使用して名前を解決します。 これは 2 つの異なるエンドポイントをサポートします。

API用途setOpenAIAPI() の呼び出し
Chat Completions標準的なチャットと Function CallingsetOpenAIAPI('chat_completions')
Responses新しいストリーミング ファーストの生成 API(ツール呼び出し、柔軟な出力)setOpenAIAPI('responses') (デフォルト)
デフォルトの OpenAI キー設定
import { setDefaultOpenAIKey } from '@openai/agents';
setDefaultOpenAIKey(process.env.OPENAI_API_KEY!); // sk-...

カスタムのネットワーク設定が必要な場合は、setDefaultOpenAIClient(client) を使って独自の OpenAI クライアントを接続することもできます。

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 プロキシまたはゲートウェイを使う場合は、OpenAIProviderwebsocketBaseURL を設定するか、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 は OpenAI のパラメーターを反映していますが、プロバイダー非依存です。

FieldTypeNotes
temperaturenumber創造性と決定性のバランス
topPnumberNucleus sampling
frequencyPenaltynumber繰り返しトークンへのペナルティ
presencePenaltynumber新しいトークンを促進
toolChoice'auto' | 'required' | 'none' | stringツール使用の強制 を参照してください。 OpenAI Responses では、toolChoice: 'computer' により、利用可能な場合は GA の組み込み computer ツールを強制します
parallelToolCallsbooleanサポートされている場合に並列 Function Calling を許可
truncation'auto' | 'disabled'トークン切り詰め戦略
maxTokensnumberレスポンスの最大トークン数
storeboolean取得 / 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 などのテキスト冗長度
providerDataRecord<string, any>基盤モデルに転送される、プロバイダー固有の passthrough オプション
retryModelRetrySettings実行時専用の opt-in リトライ設定。 モデルのリトライ を参照してください

設定はどちらのレベルにも付与できます。

モデル設定
import { Runner, Agent } from '@openai/agents';
const agent = new Agent({
name: 'Creative writer',
// ...
modelSettings: { temperature: 0.7, toolChoice: 'auto' },
});
// or globally
new Runner({ modelSettings: { temperature: 0.3 } });

Runner レベルの設定は、競合するエージェントごとの設定を上書きします。 注目すべき例外は retry です。 undefined で継承値を明示的にクリアしない限り、そのネストされたフィールドは runner と agent の設定間でマージされます。

リトライは実行時専用で、opt-in です。 SDK は、modelSettings.retry を設定し、かつポリシーがリトライ判断を返さない限り、モデルリクエストをリトライしません。

モデルリトライの opt in
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 つのフィールドがあります。

FieldTypeNotes
maxRetriesnumber初回リクエスト後に許可されるリトライ試行回数
backoff{ initialDelayMs?, maxDelayMs?, multiplier?, jitter? }ポリシーが delayMs を返さずにリトライする場合のデフォルト遅延戦略
policyRetryPolicyリトライするかどうかを判断するコールバック。 この関数は実行時専用であり、永続化された run 状態にはシリアライズされません

リトライポリシーは、次を含む RetryPolicyContext を受け取ります。

  • attemptmaxRetries。 試行回数に応じた判断を行えます
  • stream。 ストリーミングと非ストリーミングの振る舞いを分岐できます
  • error。 元のエラーを確認できます
  • normalized の情報。 statusCoderetryAfterMserrorCodeisNetworkErrorisAbort などです
  • 基盤となるモデル / プロバイダーがリトライガイダンスを提供できる場合の providerAdvice

ポリシーは次のいずれかを返せます。

  • 単純なリトライ判断のための true / false
  • 遅延を上書きしたり、ログ用の診断理由を付加したい場合の { retry, delayMs?, reason? }

SDK は retryPolicies に、すぐ使えるヘルパーをエクスポートしています。

HelperBehavior
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 承認を含める必要があります。

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 は静的なオブジェクトでも、実行時にそれを返す関数でも指定できます。 コールバックの形については、動的プロンプト を参照してください。

FieldTypeNotes
promptIdstringプロンプトの一意な識別子
versionstring使用したいプロンプトのバージョン
variablesobjectプロンプトに埋め込む変数のキー / 値ペア。 値には文字列や、テキスト・画像・ファイルなどの content input type を指定できます
prompt を持つ Agent
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 not
be available in your project.
To use it, please:
1. Go to https://platform.openai.com/chat/edit
2. 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 “高度なプロバイダーと可観測性”

独自のプロバイダー実装は簡単です。 ModelProviderModel を実装し、そのプロバイダーを 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 を渡したくない場合に便利です。

ModelProvider を自分で実装せずに OpenAI 以外のモデルを使いたい場合は、Vercel の AI SDK で任意のモデルを使う を参照してください。 このアダプターを使うと、AI SDK モデルを Agents ランタイムに直接接続できます。 アプリがすでに AI SDK プロバイダーに標準化されている場合や、より広いプロバイダーエコシステムを利用したい場合に便利です。 また、Agents SDK の providerData が AI SDK の providerMetadata にどのように対応するか、および AI SDK UI ルートで利用できるストリームヘルパーについても説明しています。


サポートされているサーバーランタイムでは、トレーシングはすでにデフォルトで有効です。 トレースのエクスポートにデフォルトの OpenAI API キーとは異なる認証情報を使う場合にのみ、setTracingExportApiKey() を使用してください。

トレーシング エクスポート API キーの設定
import { setTracingExportApiKey } from '@openai/agents';
setTracingExportApiKey('sk-...');

これにより、その認証情報を使ってトレースが OpenAI dashboard に送信されます。 カスタム ingest エンドポイントやリトライ調整など、エクスポーターのカスタマイズについては トレーシング を参照してください。