openai-agents について
OpenAI Agents SDKでテキストおよびリアルタイム音声エージェントを構築するためのスキルです。マルチエージェント連携、型付きツール、検証、人による承認のパターンを扱います。
主な機能
- 01テキスト・リアルタイム音声エージェント
- 02マルチエージェントの引き継ぎ
- 03型付きツールと構造化出力
- 04入出力ガードレール
- 05ツール実行の人による承認
活用シーン
- 01ツールを使うテキストエージェントの構築
- 02専門エージェントへのリクエスト振り分け
- 03エージェントの構造化応答の検証
- 04ツール実行前の承認要求
MCP 対応
READMEでは、MCPサーバーを使う場合のエージェントのトレース初期化について説明しています。
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ jezweb/ claude-skills --skill openai-agentsインストール後、Claude Code で/openai-agentsを入力して読み込まれたか確認します。
同梱ファイル
SKILL.md と一緒にインストールされる参考資料やスクリプト。
README.md.claude-plugin/plugin.jsonreferences/agent-patterns.mdcloudflare-integration.mdcommon-errors.mdofficial-links.mdrealtime-transports.mdrules/openai-agents.mdscripts/check-versions.shtemplates/cloudflare-workers/worker-agent-hono.tsworker-text-agent.tstemplates/nextjs/api-agent-route.tsapi-realtime-route.tstemplates/realtime-agents/realtime-agent-basic.tsrealtime-handoffs.tsrealtime-session-browser.tsxtemplates/shared/error-handling.tspackage.jsontracing-setup.tstemplates/text-agents/agent-basic.tsagent-guardrails-input.tsagent-guardrails-output.tsagent-handoffs.tsagent-human-approval.tsagent-parallel.tsagent-streaming.tsagent-structured-output.ts詳細
OpenAI Agents SDK
テキストエージェント、音声エージェント(リアルタイム)、マルチエージェントワークフロー、ツール、ガードレール、ヒューマン・イン・ザ・ループのパターンを使って、AI アプリケーションを構築できます。
クイックスタート
npm install @openai/agents zod@4 # v0.4.0+ requires Zod 4 (breaking change)
npm install @openai/agents-realtime # Voice agents
export OPENAI_API_KEY="your-key"
破壊的変更(v0.4.0):Zod 3 はサポートされなくなりました。zod@4 にアップグレードしてください。
ランタイム:Node.js 22 以降、Deno、Bun、Cloudflare Workers(実験的)
基本概念
エージェント:指示とツールを備えた LLM
import { Agent } from '@openai/agents';
const agent = new Agent({ name: 'Assistant', tools: [myTool], model: 'gpt-5-mini' });
ツール:Zod スキーマを持つ関数
import { tool } from '@openai/agents';
import { z } from 'zod';
const weatherTool = tool({
name: 'get_weather',
parameters: z.object({ city: z.string() }),
execute: async ({ city }) => `Weather in ${city}: sunny`,
});
ハンドオフ:マルチエージェントへの委任
const triageAgent = Agent.create({ handoffs: [specialist1, specialist2] });
ガードレール:入出力の検証
const agent = new Agent({ inputGuardrails: [detector], outputGuardrails: [filter] });
構造化出力:型安全な応答
const agent = new Agent({ outputType: z.object({ sentiment: z.enum(['positive', 'negative']) }) });
テキストエージェント
基本:const result = await run(agent, 'What is 2+2?')
ストリーミング:
const stream = await run(agent, 'Tell me a story', { stream: true });
for await (const event of stream) {
if (event.type === 'raw_model_stream_event') process.stdout.write(event.data?.choices?.[0]?.delta?.content || '');
}
マルチエージェントのハンドオフ
const billingAgent = new Agent({ name: 'Billing', handoffDescription: 'For billing questions', tools: [refundTool] });
const techAgent = new Agent({ name: 'Technical', handoffDescription: 'For tech issues', tools: [ticketTool] });
const triageAgent = Agent.create({ name: 'Triage', handoffs: [billingAgent, techAgent] });
エージェントをツールとして使う場合のコンテキスト分離:agent.asTool() を使用する場合、サブエージェントは親の会話履歴を共有しません(デバッグを簡素化するための意図的な設計です)。
回避策:ツールのパラメーターを介してコンテキストを渡します。
const helperTool = tool({
name: 'use_helper',
parameters: z.object({
query: z.string(),
context: z.string().optional(),
}),
execute: async ({ query, context }) => {
return await run(subAgent, `${context}\n\n${query}`);
},
});
出典:Issue #806
ガードレール
入力:処理前に検証します
const guardrail: InputGuardrail = {
execute: async ({ input }) => ({ tripwireTriggered: detectHomework(input) })
};
const agent = new Agent({ inputGuardrails: [guardrail] });
出力:応答をフィルタリングします(PII 検出、コンテンツの安全性)
ヒューマン・イン・ザ・ループ
const refundTool = tool({ name: 'process_refund', requiresApproval: true, execute: async ({ amount }) => `Refunded $${amount}` });
let result = await runner.run(input);
while (result.interruption?.type === 'tool_approval') {
result = await promptUser(result.interruption) ? result.state.approve(result.interruption) : result.state.reject(result.interruption);
}
ストリーミング HITL:requiresApproval とともに stream: true を使用する場合は、中断を明示的に確認する必要があります。
const stream = await run(agent, input, { stream: true });
let result = await stream.finalResult();
while (result.interruption?.type === 'tool_approval') {
const approved = await promptUser(result.interruption);
result = approved
? await result.state.approve(result.interruption)
: await result.state.reject(result.interruption);
}
リアルタイム音声エージェント
作成:
import { RealtimeAgent } from '@openai/agents-realtime';
const voiceAgent = new RealtimeAgent({
voice: 'alloy', // alloy, echo, fable, onyx, nova, shimmer
model: 'gpt-5-realtime',
tools: [weatherTool],
});
ブラウザーセッション:
import { RealtimeSession } from '@openai/agents-realtime';
const session = new RealtimeSession(voiceAgent, { apiKey: sessionApiKey, transport: 'webrtc' });
await session.connect();
重要:OPENAI_API_KEY をブラウザーに送信しないでください。サーバー側で一時的なセッショントークンを生成してください。
音声ハンドオフ:エージェント間で音声/モデルを一致させる必要があります(ハンドオフ中に変更できません)。
制限事項:
- ビデオストリーミングはサポートされていません:カメラの例があるにもかかわらず、リアルタイムのビデオストリーミングはネイティブではサポートされていません。モデルはビデオイベントに基づいて自発的に発話しない場合があります。(Issue #694)
テンプレート:
templates/realtime-agents/realtime-agent-basic.tstemplates/realtime-agents/realtime-session-browser.tsxtemplates/realtime-agents/realtime-handoffs.ts
参考資料:
references/realtime-transports.md- WebRTC と WebSocket の比較
フレームワークとの統合
Cloudflare Workers(実験的):
export default {
async fetch(request: Request, env: Env) {
// Disable tracing or use startTracingExportLoop()
process.env.OTEL_SDK_DISABLED = 'true';
process.env.OPENAI_API_KEY = env.OPENAI_API_KEY;
const agent = new Agent({ name: 'Assistant', model: 'gpt-5-mini' });
const result = await run(agent, (await request.json()).message);
return Response.json({ response: result.finalOutput, tokens: result.usage.totalTokens });
}
};
制限事項:
- 音声エージェントには対応していません
- CPU の上限は 30 秒、メモリは 128MB
- トレーシングには手動でのセットアップが必要です -
OTEL_SDK_DISABLED=trueを設定するか、startTracingExportLoop()を呼び出してください(Issue #16)
Next.js:app/api/agent/route.ts → run(agent, message) を使った POST ハンドラー
テンプレート:cloudflare-workers/、nextjs/
エラー処理(11 件以上のエラーを防止)
1. Zod スキーマの型エラー
エラー:ツールのパラメーターに関する型エラーです。
回避策:スキーマをインラインで定義します。
// ❌ Can cause type errors
parameters: mySchema
// ✅ Works reliably
parameters: z.object({ field: z.string() })
注:v0.4.1 以降、ツール呼び出し引数の無効な JSON は適切に処理されます(以前は SyntaxError によるクラッシュの原因となっていました)。(PR #887)
出典:GitHub #188
2. MCP トレーシングエラー
エラー:MCP サーバーで「既存のトレースが見つかりません」と表示されます。
回避策:
import { initializeTracing } from '@openai/agents/tracing';
await initializeTracing();
出典:GitHub #580
3. MaxTurnsExceededError
エラー:エージェントが無限ループします。
解決策:maxTurns を増やすか、指示を改善します。
const result = await run(agent, input, {
maxTurns: 20, // Increase limit
});
// Or improve instructions
instructions: `After using tools, provide a final answer.
Do not loop endlessly.`
4. ToolCallError
エラー:ツールの実行に失敗します。
解決策:指数バックオフを使って再試行します。
for (let attempt = 1; attempt <= 3; attempt++) {
try {
return await run(agent, input);
} catch (error) {
if (error instanceof ToolCallError && attempt < 3) {
await sleep(1000 * Math.pow(2, attempt - 1));
continue;
}
throw error;
}
}
5. スキーマの不一致
エラー:出力が outputType と一致しません。
解決策:より高性能なモデルを使うか、検証の指示を追加します。
const agent = new Agent({
model: 'gpt-5', // More reliable than gpt-5-mini
instructions: 'CRITICAL: Return JSON matching schema exactly',
outputType: mySchema,
});
6. 推論の労力に関するデフォルト設定の変更(v0.4.0)
エラー:v0.4.0へのアップグレード後、予期しない推論動作が発生します。
発生する理由:v0.4.0では、gpt-5.1/5.2の推論の労力に関するデフォルト設定が"low"から"none"に変更されました。
予防策:推論の労力が必要な場合は、明示的に設定してください。
// v0.4.0+ - default is now "none"
const agent = new Agent({
model: 'gpt-5.1',
reasoning: { effort: 'low' }, // Explicitly set if needed: 'low', 'medium', 'high'
});
ソース:リリース v0.4.0 | PR #876
7. 推論内容がJSON出力に漏れる
エラー:構造化出力にresponse_reasoningフィールドが予期せず含まれます。
発生する理由:推論モデルでoutputTypeを使用した場合に発生するモデルエンドポイントの問題です(SDKのバグではありません)。
回避策:出力からresponse_reasoningを除外してください。
const result = await run(agent, input);
const { response_reasoning, ...cleanOutput } = result.finalOutput;
return cleanOutput;
ソース:Issue #844 ステータス:モデル側の問題であり、OpenAIのチームと連携して対応中です
すべてのエラー:references/common-errors.mdを参照してください
テンプレート:templates/shared/error-handling.ts
オーケストレーションパターン
LLMベース:エージェントが自律的にルーティングを決定します(適応性が高く、トークン消費量も多くなります)
コードベース:条件分岐を使用した明示的な制御フローです(予測しやすく、コストを抑えられます)
並列:Promise.all([run(agent1, text), run(agent2, text)])(並行実行)
デバッグ
process.env.DEBUG = '@openai/agents:*'; // Verbose logging
const result = await run(agent, input);
console.log(result.usage.totalTokens, result.history.length, result.currentAgent?.name);
❌ 次の場合は使用しないでください:
- シンプルなOpenAI API呼び出し(代わりに
openai-apiスキルを使用してください) - OpenAI以外のモデルのみを使用する場合
- 大規模な本番環境の音声処理(LiveKit Agentsを検討してください)
本番環境チェックリスト
-
OPENAI_API_KEYを環境シークレットとして設定する - すべてのエージェント呼び出しにエラー処理を実装する
- 安全性が重要なアプリケーションにガードレールを追加する
- デバッグ用にトレースを有効にする
- コストの予期しない増加を防ぐため、適切な
maxTurnsを設定する - コスト効率を高めるため、可能な場合は
gpt-5-miniを使用する - レート制限を実装する
- コスト監視用にトークン使用量を記録する
- ハンドオフのフローを十分にテストする
- APIキーをブラウザーに公開しない(セッショントークンを使用する)
トークン効率
推定削減率:約60%
| タスク | スキルなし | スキルあり | 削減率 |
|---|---|---|---|
| マルチエージェントのセットアップ | 約12kトークン | 約5kトークン | 58% |
| 音声エージェント | 約10kトークン | 約4kトークン | 60% |
| エラーのデバッグ | 約8kトークン | 約3kトークン | 63% |
| 平均 | 約10k | 約4k | 約60% |
防止されたエラー:記録された11件の問題=エラーを100%防止
テンプレート一覧
テキストエージェント(8):
agent-basic.ts- ツールを使うシンプルなエージェントagent-handoffs.ts- マルチエージェントのトリアージagent-structured-output.ts- Zodスキーマagent-streaming.ts- リアルタイムイベントagent-guardrails-input.ts- 入力の検証agent-guardrails-output.ts- 出力のフィルタリングagent-human-approval.ts- HITLパターンagent-parallel.ts- 並行実行
リアルタイムエージェント(3):
9. realtime-agent-basic.ts - 音声のセットアップ
10. realtime-session-browser.tsx - Reactクライアント
11. realtime-handoffs.ts - 音声の委譲
フレームワーク統合(4):
12. worker-text-agent.ts - Cloudflare Workers
13. worker-agent-hono.ts - Honoフレームワーク
14. api-agent-route.ts - Next.js API
15. api-realtime-route.ts - Next.js音声
ユーティリティ(2):
16. error-handling.ts - 包括的なエラー処理
17. tracing-setup.ts - デバッグ
参考資料
agent-patterns.md- オーケストレーション戦略common-errors.md- 回避策を含む9件のエラーrealtime-transports.md- WebRTCとWebSocketの比較cloudflare-integration.md- Workersの制限事項official-links.md- ドキュメントへのリンク
公式リソース
- ドキュメント: https://openai.github.io/openai-agents-js/
- GitHub: https://github.com/openai/openai-agents-js
- npm: https://www.npmjs.com/package/@openai/agents
- Issue: https://github.com/openai/openai-agents-js/issues
バージョン: SDK v0.4.1 最終確認日: 2026-01-21 スキルの作成者: Jeremy Dawes (Jezweb) 本番環境でのテスト: はい 変更点: v0.4.0の破壊的変更(Zod 4、推論のデフォルト設定)の追加、無効なJSONの処理(v0.4.1)、推論出力の漏えい、ストリーミングHITLパターン、エージェントをツールとして使用する際のコンテキスト分離、動画の制限、Cloudflareのトレーシング設定