OSS Agents JP
オープンソース AI エージェント 日本語ガイド
← 一覧へ
OpenAI Realtime Agents
CODEX

OpenAI Realtime Agents

OpenAI Realtime Agents

Realtime API + Agents SDK で構築する音声エージェントの公式リファレンス実装。チャットボット・カスタマーサポート・診断系などのテンプレートを収録。

#公式#Realtime#音声エージェント
EDITOR'S TAKE

編集部メモ

OpenAI公式が示す、音声エージェント構築の実装パターン集

Realtime API と Agents SDK を組み合わせた音声エージェント構築のリファレンス実装です。Chat-Supervisor(複雑なタスクは外部モデルに委譲)と Sequential Handoff(専門エージェント間での役割分担)の 2 つの具体的なアーキテクチャパターンを提示しており、実装の選択肢が明確です。Next.js + TypeScript で構成されたオールインワンデモが含まれるため、コンセプトから実装まで実際の流れを追体験できます。音声対話型システムの実装を検討しているチームにとって、実装方針の参考値となる内容です。

USE CASES

こんな場面で使う

  • Realtime API を活用した音声ベースのカスタマーサポート回線を構築し、複数の専門エージェント間でユーザーを転送する
  • チャットボットから音声インターフェースへの段階的な移行時に、既存ロジックを Agents SDK でラップして対応する
  • 複数ドメインの専門知識を持つエージェントを組み合わせ、ユーザーの意図に応じて最適な専門家に自動ルーティングする
DIFFERENTIATOR

類似ツールとの違い

OpenAI公式実装であり、Realtime API と Agents SDK の組み合わせ方が標準として参照できます。同じくOpenAIのサンプルでも、単一エージェント中心のものと異なり、複数パターンの役割分担アーキテクチャを比較検討できる点が強みです。タイムリーな最終更新(2026年1月)により、最新版SDKとの互換性が保証されています。
CAVEAT

注意点・向かない用途

⚠️ Realtime API の使用により OpenAI の API コストが継続的に発生します。また、示されているのは比較的高度な実装パターンのため、音声エージェント初心者向けというより、すでにベースの実装経験がある開発チーム向けです。
BEST FOR

向いている読者

音声エージェント開発者Agents SDK 導入検討者OpenAI Realtime API の実装パターンを学びたいエンジニア

— OSS Agents JP 編集部による独自評価(OpenAI Realtime Agents に関する観察)

REPO STATS

リポジトリ統計

⭐ Stars
-
🍴 Forks
-
⚠️ Open Issues
-
🌿 Language
-
📄 License
-
🕒 最終更新
-
📅 公開日
-
🌿 Branch
-
REFERENCE

公式ドキュメント(README)

本ハブの独自評価は上記「編集部メモ」が一次情報です。以下は GitHub README の参考転載(折りたたみ)。

📖 GitHub README の日本語訳を読む(AI 自動翻訳 / 参考情報)

— AI による自動翻訳 (2026.05.07 更新)。正確な情報は GitHub の原文 をご確認ください。

リアルタイム API エージェント デモ

これは OpenAI Realtime API と OpenAI Agents SDK を使用した、音声エージェントのより高度なパターンのデモンストレーションです。

OpenAI Agents SDK について

このプロジェクトは OpenAI Agents SDK を使用しており、高度な AI エージェントの構築、管理、デプロイメントのためのツールキットです。SDK は以下を提供します:

  • エージェントの動作とツール統合を定義するための統一インターフェース。
  • エージェントオーケストレーション、状態管理、イベントハンドリングの組み込みサポート。
  • OpenAI Realtime API との簡単な統合により、低遅延でストリーミングなインタラクションが可能です。
  • マルチエージェント協業、ハンドオフ、ツール使用、ガードレールのための拡張可能なパターン。

完全なドキュメント、ガイド、API リファレンスについては、公式の OpenAI Agents SDK ドキュメント を参照してください。

注意: OpenAI Agents SDK を使用しないバージョンについては、without-agents-sdk ブランチ を参照してください。

以下の 2 つの主要なパターンが示されています:

  1. チャット-スーパーバイザー: リアルタイムベースのチャットエージェントはユーザーと対話し、ユーザーへのグリーティング、カジュアルな会話、情報収集などの基本的なタスクを処理します。より知的でテキストベースのスーパーバイザーモデル(例:gpt-4.1)がツールコールや、より複雑な応答を処理するために広く使用されます。このアプローチは簡単なオンランプと高品質な回答を提供し、わずかなレイテンシの増加があります。
  2. 連続的なハンドオフ: 特殊化されたエージェント(リアルタイム API で搭載)がユーザーを転送して、特定のユーザーインテント を処理します。これは、ユーザーのインテントが特定のドメインで優れた専門家モデルによって順序立てて処理できるカスタマーサービスに最適です。これは、すべての指示とツールを単一エージェントに含めることで、パフォーマンスが低下するのを避けるのに役立ちます。

セットアップ

  • これは Next.js TypeScript アプリです。npm i で依存関係をインストールしてください。
  • OPENAI_API_KEY を環境に追加してください。.bash_profile またはそれに相当するものに追加するか、.env.sample.env にコピーして追加してください。
  • npm run dev でサーバーを起動してください。
  • ブラウザを http://localhost:3000 で開いてください。デフォルトは chatSupervisor エージェント設定になります。
  • 右上の「Scenario」ドロップダウンで例を変更できます。

エージェントパターン 1: チャット-スーパーバイザー

これは chatSupervisor エージェント設定で示されています。チャットエージェントは Realtime モデルを使用してユーザーと会話し、ユーザーへのグリーティング、カジュアルな会話、情報収集などの基本的なタスクを処理します。より知的でテキストベースのスーパーバイザーモデル(例:gpt-4.1)がツールコールと、より複雑な応答を処理するために広く使用されます。決定境界を「オプトイン」することで、必要に応じて特定のタスクをチャットエージェントに処理させるように制御できます。

ビデオウォークスルー:https://x.com/noahmacca/status/1927014156152058075

チャット-スーパーバイザーフローのスクリーンショット このやり取りでは、電話番号を収集するための即座の応答と、ツールコールを処理して応答を作成するスーパーバイザーエージェントへの転送に注目してください。「give me a moment to check on that.」が話されるのが終わるのと、「Thanks for waiting. Your last bill...」が始まるのの間には約 2 秒です。

図解

sequenceDiagram
    participant User
    participant ChatAgent as Chat Agent<br/>(gpt-4o-realtime-mini)
    participant Supervisor as Supervisor Agent<br/>(gpt-4.1)
    participant Tool as Tool

    alt Basic chat or info collection
        User->>ChatAgent: User message
        ChatAgent->>User: Responds directly
    else Requires higher intelligence and/or tool call
        User->>ChatAgent: User message
        ChatAgent->>User: "Let me think"
        ChatAgent->>Supervisor: Forwards message/context
        alt Tool call needed
            Supervisor->>Tool: Calls tool
            Tool->>Supervisor: Returns result
        end
        Supervisor->>ChatAgent: Returns response
        ChatAgent->>User: Delivers response
    end
読み込み中

利点

  • オンボーディングの簡素化。 既に性能の良いテキストベースのチャットエージェントがあれば、同じプロンプトとツールセットをスーパーバイザーエージェントに提供し、チャットエージェントのプロンプトに若干の調整を加えるだけで、テキストエージェント同等のパフォーマンスを発揮する自然な音声エージェントを構築できます。
  • 完全なリアルタイムエージェントへのシンプルな段階的移行: エージェント全体をリアルタイム API に切り替えるのではなく、1 つずつタスクを移行でき、本番環境にデプロイする前に各タスクを検証して信頼を構築する時間が持てます。
  • 高い知能: gpt-4.1 のようなモデルの高い知能、優れたツール呼び出し能力、命令遵守能力の恩恵を音声エージェントで受けられます。
  • コストの削減: チャットエージェントが基本的なタスクにしか使用されていない場合、realtime-mini モデルを使用できます。これは gpt-4.1 と組み合わせても、完全な 4o-realtime モデルを使用するより安価です。
  • ユーザーエクスペリエンス: ユーザーが話し終わった後のレスポンスレイテンシーが 1.5 秒以上になることが多い複合モデルアーキテクチャよりも、より自然な会話体験です。このアーキテクチャでは、スーパーバイザーエージェントに頼ることになっても、モデルはユーザーに即座に応答します。
    • ただし、すぐに完全な応答をするのではなく、より多くのアシスタントレスポンスが「Let me think」で始まります。

独自のエージェント向けカスタマイズ

  1. supervisorAgent を更新します。
  • 既存のテキストエージェントのプロンプトとツールがあれば、それらを追加してください。これは音声エージェントロジックの「中核部分」を含む必要があり、何をするべき・すべきでないか、また正確にどのように応答すべきかについて非常に具体的である必要があります。この情報を ==== Domain-Specific Agent Instructions ==== の下に追加してください。
  • このプロンプトは音声に適したものに更新することをお勧めします。例えば、簡潔さを心がけ、長いリストの項目を避けるなどの指示を含めるとよいでしょう。
  1. chatAgent を更新します。
  • chatAgent の指示を自分のトーン、挨拶などでカスタマイズしてください。
  • chatAgentInstructions にツール定義を追加してください。モデルが混乱してツールを直接呼び出そうとしないよう、JSON ではなく簡潔な YAML 説明をお勧めします。
  • # Allow List of Permitted Actions セクションに新しい項目を追加することで、判定境界を変更できます。
  1. コストを削減するために、chatAgent に gpt-4o-mini-realtime を、スーパーバイザーモデルに gpt-4.1-mini を使用してみてください。特に難しいまたはハイリスクなタスクで知能を最大化するには、レイテンシーと引き換えにスーパーバイザープロンプトに連鎖思考を追加することを検討するか、o4-mini を使用する追加の推論モデルベースのスーパーバイザーを使用してください。

Agentic Pattern 2: 順序付きハンドオフ

このパターンは OpenAI Swarm に着想を得ており、ユーザーが専門化されたエージェント間で順序付きに受け渡されることを含みます。ハンドオフはモデルによって決定され、ツール呼び出しを通じて調整されます。可能なハンドオフはエージェントグラフで明示的に定義されます。ハンドオフは新しい指示とツールを含む session.update イベントをトリガーします。このパターンは、様々なユーザー意図を処理するのに効果的で、各エージェントは長い指示と多数のツールを持つ可能性があります。

ここに動作を示す ビデオウォークスルー があります。このリポジトリを使用して、20 分以内に独自のマルチエージェント リアルタイム音声アプリをプロトタイプ化できるはずです!

Screenshot of the Realtime API Agents Demo この簡潔な例では、ユーザーは greeter エージェントから haiku エージェントに転送されます。このフローの簡潔で完全な設定については以下を参照してください。

src/app/agentConfigs/simpleExample.ts での設定

import { RealtimeAgent } from '@openai/agents/realtime';

// Define agents using the OpenAI Agents SDK
export const haikuWriterAgent = new RealtimeAgent({
  name: 'haikuWriter',
  handoffDescription: 'Agent that writes haikus.', // Context for the agent_transfer tool
  instructions:
    'Ask the user for a topic, then reply with a haiku about that topic.',
  tools: [],
  handoffs: [],
});

export const greeterAgent = new RealtimeAgent({
  name: 'greeter',
  handoffDescription: 'Agent that greets the user.',
  instructions:
    "Please greet the user and ask them if they'd like a haiku. If yes, hand off to the 'haikuWriter' agent.",
  tools: [],
  handoffs: [haikuWriterAgent], // Define which agents this agent can hand off to
});

// An Agent Set is just an array of the agents that participate in the scenario
export default [greeterAgent, haikuWriterAgent];

CustomerServiceRetail Flow

これはより複雑で、代表的な実装で、以下の機能を備えた顧客サービスフローを示しています。

  • ユーザー認証、返品、販売、およびエスカレーション用のプレースホルダー人間エージェントを備えた、より複雑なエージェントグラフです。
  • 高リスク決定の例として、returns エージェントによる o4-mini へのエスカレーションで返品を検証および開始するもので、上記と同様のパターンを使用しています。
  • ユーザー認証のために、名前や電話番号などの情報を文字ごとに確認して正確に収集するなど、状態マシンに従うようモデルにプロンプトを指示しています。
    • このフローをテストするには、スノーボードを返したいと伝えて、必要なプロンプトを進めてください。

構成は src/app/agentConfigs/customerServiceRetail/index.ts にあります。

import authentication from "./authentication";
import returns from "./returns";
import sales from "./sales";
import simulatedHuman from "./simulatedHuman";
import { injectTransferTools } from "../utils";

authentication.downstreamAgents = [returns, sales, simulatedHuman];
returns.downstreamAgents = [authentication, sales, simulatedHuman];
sales.downstreamAgents = [authentication, returns, simulatedHuman];
simulatedHuman.downstreamAgents = [authentication, returns, sales];

const agents = injectTransferTools([
  authentication,
  returns,
  sales,
  simulatedHuman,
]);

export default agents;

スキーマティック図

このダイアグラムは、src/app/agentConfigs/customerServiceRetail/ で定義されたより高度なインタラクションフロー(詳細なイベントを含む)を示しています。

CustomerServiceRetail フロー図を表示
sequenceDiagram
    participant User
    participant WebClient as Next.js Client
    participant NextAPI as /api/session
    participant RealtimeAPI as OpenAI Realtime API
    participant AgentManager as Agents (authentication, returns, sales, simulatedHuman)
    participant o1mini as "o4-mini" (Escalation Model)

    Note over WebClient: User navigates to ?agentConfig=customerServiceRetail
    User->>WebClient: Open Page
    WebClient->>NextAPI: GET /api/session
    NextAPI->>RealtimeAPI: POST /v1/realtime/sessions
    RealtimeAPI->>NextAPI: Returns ephemeral session
    NextAPI->>WebClient: Returns ephemeral token (JSON)

    Note right of WebClient: Start RTC handshake
    WebClient->>RealtimeAPI: Offer SDP (WebRTC)
    RealtimeAPI->>WebClient: SDP answer
    WebClient->>WebClient: DataChannel "oai-events" established

    Note over AgentManager: Default agent is "authentication"
    User->>WebClient: "Hi, I'd like to return my snowboard."
    WebClient->>AgentManager: conversation.item.create (role=user)
    WebClient->>RealtimeAPI: {type: "conversation.item.create"}
    WebClient->>RealtimeAPI: {type: "response.create"}

    authentication->>AgentManager: Requests user info, calls authenticate_user_information()
    AgentManager-->>WebClient: function_call => name="authenticate_user_information"
    WebClient->>WebClient: handleFunctionCall => verifies details

    Note over AgentManager: After user is authenticated
    authentication->>AgentManager: transferAgents("returns")
    AgentManager-->>WebClient: function_call => name="transferAgents" args={ destination: "returns" }
    WebClient->>WebClient: setSelectedAgentName("returns")

    Note over returns: The user wants to process a return
    returns->>AgentManager: function_call => checkEligibilityAndPossiblyInitiateReturn
    AgentManager-->>WebClient: function_call => name="checkEligibilityAndPossiblyInitiateReturn"

    Note over WebClient: The WebClient calls /api/chat/completions with model="o4-mini"
    WebClient->>o1mini: "Is this item eligible for return?"
    o1mini->>WebClient: "Yes/No (plus notes)"

    Note right of returns: Returns uses the result from "o4-mini"
    returns->>AgentManager: "Return is approved" or "Return is denied"
    AgentManager->>WebClient: conversation.item.create (assistant role)
    WebClient->>User: Displays final verdict
">
RELATED

同じカテゴリの他のツール