For the complete documentation index, see llms.txt. Markdown versions of documentation pages are available by appending .md to the page URL.
メインナビゲーション

GPT-Live の委任とツール

バックエンドエージェントを接続し、検証済みの結果をリアルタイムの会話に返します。

GPT-Live は音声での会話を管理しながら、推論とツールの使用をバックエンドに委任します。バックエンドの処理は、設定した Responses モデルで実行できます。クライアント委任を使う場合は、アプリケーションが運用する任意のモデル、エージェント、サービスで実行できます。どちらのモードでも、権限、確認、業務記録、タスクの状態はアプリケーションが管理します。

詳しくは、プロンプトガイドの委任とツールに関するライブモデルの制御をご覧ください。

委任モードの選択

Responses 委任では、GPT-Live が指定された Responses モデルを呼び出し、会話のコンテキストを渡して、バックエンドの結果をリアルタイムの会話に返します。 クライアント委任では、アプリケーションがコンテキストを準備し、エージェントやワークフローを実行して、結果を GPT-Live に返します。

マネージドワークフローが用途に合う場合は、Responses 委任から始めてください。バックエンドのコンテキスト、実行、または GPT-Live に返す結果をより細かく制御する必要がある場合は、クライアント委任を選択してください。

検討事項Responses 委任が適している場合クライアント委任が適している場合
実装の手間バックエンドリクエストの準備、接続の管理、会話への結果の返却を GPT-Live に任せたい場合です。これらの仕組みを自分で構築・運用したい場合です。
バックエンドの結果のレビューバックエンドの出力を GPT-Live に直接返してよい場合です。GPT-Live に届く前に、アプリケーションで結果の検証、機密部分の削除、統合、破棄を行う必要がある場合です。
バックエンドでできることGPT-Live がサポートする Responses の設定とツールでワークフローに対応できる場合です。別のバックエンド、複数のモデル、または管理対象の設定では利用できない API 機能が必要な場合です。
コンテキストの管理主体GPT-Live が提供する会話のコンテキストがアプリケーションに適している場合です。各バックエンドリクエストに渡す履歴、メモリ、アプリケーションの状態を厳密に選ぶ必要がある場合です。
実行ポリシー設定したモデルとツールの実行ループがタスクに適している場合です。バックエンドの各ステップにわたって、コードとモデル間の独自のルーティング、フォールバック、チェックポイント、予算の設定が必要な場合です。

たとえば、旅行アシスタントは、フライトの運航状況に関する質問を航空会社のサービスに送り、旅程の変更を別の計画エージェントに送ることができます。どのバックエンドを呼び出し、どの検証済みの結果を GPT-Live に返すかは、アプリケーションが選択します。

どちらのモードでも、アプリケーションがタスクの状態を管理し、カスタムツールの実行前に権限と必要な確認を徹底します。バックエンドの結果をレビューするかどうかは、それとは別の判断です。結果のレビューは、GPT-Live の発言を一言一句承認するものではなく、検証中に発話しないことを保証するものでもありません。必要に応じた再生の制御をご覧ください。

クライアント委任では、アプリケーションで会話のコンテキストを維持することも必要です。委任イベントに含まれるのはメタデータであり、タスクのテキストではありません。文字起こしイベントとアプリケーションの状態を使って、バックエンドリクエストを準備してください。

音声エージェントを評価する際は、実際のワークロードでレイテンシ、タスクの成功状況、コストを比較してください。既存のアーキテクチャに応じたガイダンスは、GPT-Live への移行をご覧ください。

モードはセッションの作成時に選択します。モードを変更するには、新しいセッションを開始してください。

委譲モード

Responses 委譲の設定

Live セッションの作成時に、この委譲設定を追加します。Responses モデルは音声モデルとは別に選択します。

export const session = {
  model: "gpt-live-1",
  delegation: {
    type: "responses",
    responses: {
      model: "gpt-5.6-terra",
      instructions: "[Your backend prompt]",
    },
  },
};

まずは GPT-5.6 Terra を使うか、コストを重視するワークロードには GPT-5.6 Luna をお試しください。バックエンドモデルを選ぶ前に、実際のタスクで回答の品質とレイテンシーを比較してください。

サポートされているツールを delegation.responses.tools に登録します。バックエンドが使用できるツールは delegation.responses.tool_choice で制御します。"auto" はバックエンドに選択を任せ、"required" はツール呼び出しを必須にし、"none" はツール呼び出しを禁止します。関数名を指定して選択することもできます。独立した検索を同時に実行できるようにするには delegation.responses.parallel_tool_callstrue に設定し、呼び出しを順番に実行する必要がある場合は false に設定します。カスタム関数の実行と、依存関係や承認要件の適用は、引き続きアプリケーションが担います。これらの設定は、ライブモデルに委譲を強制するものではありません。

Responses の設定では、作成時にバックエンドの model を指定する必要があります。tools では、function の定義と web_search のエントリがサポートされています。また、max_output_tokens(設定する場合は 16 以上)、service_tier、および選択したバックエンドモデルがサポートする reasoningtext の設定も利用できます。調整できる設定については、バックエンドのレイテンシーの削減を参照してください。

お使いのモデルとプロジェクトで Fast モード が利用可能な場合、低レイテンシーが求められる呼び出しでの使用を検討してください。GPT-Live では、delegation.responses.service_tier: "priority" で選択します。

会話の変化に応じて、session.delegation.responses の変更内容を含む session.update を送信すると、新しい Live セッションを開始せずに、バックエンドモデル、指示、利用可能なツール、tool_choice、その他のサポートされている設定を更新できます。省略した設定は、それまでの値を保持します。delegationnull に設定するとクライアントモードが選択されますが、実行中の Responses セッションをリセットすることはできません。モードを切り替えようとすると、immutable_field_update エラーで失敗します。

これらの設定には Responses でおなじみの概念が使われていますが、Live がサポートするのは単体の Responses API の一部です。Live は会話のコンテキストを提供し、委譲する処理を開始します。バックエンドはセッションを通じて設定してください。Live の response.create コマンドはその設定を使用し、単体の Responses リクエストボディは受け付けません。

アプリケーションからのライブ会話の誘導

Responses 委譲ではバックエンドのワークフローが管理されますが、アプリケーションから GPT-Live モデルにコンテキストを直接送信することもできます。サイドバンド WebSocket またはメインのイベント接続で通話を監視している場合、session.instructions.appendsession.thinking.appendsession.commentary.append のいずれかを delegation_id: null とともに使用できます。たとえば、文字起こしに基づくガードレールで指示を追加し、会話の方向を変えることができます。これはライブモデルを誘導するものであり、Responses バックエンドのプロンプトを変更したり、すでに進行中の処理をキャンセルしたりするものではありません。

Responses 委譲の処理

Responses を利用する処理では、session.delegation.createdtarget: "responses"response_id が含まれます。以降の Responses イベントは、response.event エンベロープ内に格納されて届きます。

{
  "type": "response.event",
  "event_id": "event_response_1",
  "delegation_id": "item_9tA2cB6n2V8c4X1z7Q5r9",
  "event": {
    "type": "response.output_text.delta",
    "sequence_number": 4,
    "item_id": "msg_123",
    "output_index": 0,
    "content_index": 0,
    "delta": "The forecast is",
    "logprobs": []
  }
}

envelope.event.type に応じて処理を振り分け、外側の delegation_id を保持してください。トップレベルの response.* の値をすべて、ラップされていない Responses イベントとして扱わないでください。ネストされた Responses ライフサイクルイベントが追加されても対応できるようにしてください。

Live の発話と委譲された処理は、それぞれ独立して進行します。バックエンドのレスポンスが完了しても、それだけでユーザーが回答を聞いたことにはなりません。やり取りのうち発話された部分には、Live の出力文字起こしと音声を使用してください。

クライアントで実行する関数呼び出しの完了

ネストされた response.output_item.done イベントから、生成が完了した関数呼び出しを読み取ります。完成した関数アイテムには call_idnamearguments が含まれます。引数の生成完了イベントだけでは、呼び出しを特定できません。

ネストされた response.created のレスポンス ID を外側の delegation_id とともに追跡し、response.output_item.done からそのレスポンスの関数呼び出しを収集してください。転送されるライフサイクルスナップショットには、response.completed の時点も含め、意図的に response.output: [] が設定されています。また、tools 配列は空、instructionsnull となり、input は省略されます。終了時の出力リストが空でも、保留中の関数呼び出しがないことを意味する わけではありません 。収集した呼び出しを使って、続行する前に送信すべき結果を判断してください。

認可された操作を実行したら、結果を Responses アイテムとして追加します。

export function sendUpdate(connection) {
  connection.send({
    type: "response.item.create",
    event_id: "tool_result_1",
    item: {
      type: "function_call_output",
      call_id: "call_123",
      output: '{"status":"confirmed","order_id":"order_123"}',
    },
  });
}

その後、明示的にレスポンスを続行します。

export function sendUpdate(connection) {
  connection.send({
    type: "response.create",
    event_id: "continue_1",
  });
}

続行する前に、保留中のツール呼び出しに必要な結果をすべて送信してください。関数の結果を追加しても、レスポンスは自動的には続行されません。response.item.create には単独の成功確認通知はありません。エラーと、その後に届くネストされたレスポンスのライフサイクルイベントの処理を続けてください。

response.create は、セッションで設定されたバックエンドを使用して、Responses に委譲する処理を作成または続行するための Live コマンドです。このイベントには、Responses API の作成リクエストボディ、バックエンドモデルの上書き指定、delegation_id を付けないでください。どちらのコマンドも Responses 委譲が必要です。

既存のバックエンドプロンプトの活用

既存のテキストエージェント用プロンプトを出発点にします。タスクの指示とビジネスルールはバックエンド側に保持し、テキストチャットや発話の直接制御を前提とした指示を調整してください。音声の文字起こしの扱い方と、有用な結果の返し方を明示します。権限の適用と必要な確認の実施は、アプリケーションで徹底してください。

## Voice conversation context
You are helping an assistant in a live voice conversation. Transcripts
can contain mistakes, unfinished phrases, and later corrections. Use
the latest context and verified records. If a needed detail is still
unclear, ask for that detail instead of guessing.

## Task instructions
[Your task instructions, business rules, available tools,
and confirmation requirements.]

## Return the result
Return the relevant facts, whether the task is complete, and what comes next.
Use confirmed values. Do not invent a successful action.

大きな構造化ペイロード、長いツール出力、表示用の Markdown はバックエンドに保持します。GPT-Live には関連する事実を渡し、その伝え方を任せてください。ツールの結果が簡潔であれば、音声向けに書き直すための追加のモデル呼び出しは不要です。

クライアント委譲では、結果を GPT-Live に直接返します。Responses 委譲では、関数の結果を返すフローに従ってバックエンドの処理を継続します。

以下の SDK イベントの例では、接続ガイドに従って接続済みのプライマリ Live WebSocket またはサイドバンドを connection として使います。プライマリ接続では、session.started の後にヘルパーを呼び出してください。接続済みのサイドバンドは、すでに実行中のセッションに属しています。

用途に合った更新の送信

GPT-Live に内容をどう使わせたいかに応じて、イベントを選びます。

送信する内容イベント
挨拶、開示事項、発話の停止など、ライブモデルに対するシステムレベルの指示session.instructions.append
追加時には読み上げられず、関連するユーザーの質問への回答に使える内部推論用の情報session.thinking.append
追加されたテキストをモデルが言い換えて読み上げるための情報session.commentary.append

3 つとも通常の文字列の content を使い、1 回の追加につき 500 トークンまでに制限されます。delegation_id を含めてください。そのタスクに関する更新には元のクライアント委譲 ID を、セッション全般のコンテキストには null を指定します。null 以外の ID は、既知のクライアント委譲を識別する必要があります。指示は引き続きライブセッションに適用されます。ID を指定しても、別のバックエンドプロンプトになるわけではありません。

追加した指示は、モデルの現在の発話や動作を中断することがあります。アプリケーションで会話の方向を変える必要がある場合に使ってください。関連するツールや操作のブロックは、アプリケーションの状態管理で徹底します。

クライアントが管理するタスクで、読み上げずに進捗を伝える場合の例です。

export function sendUpdate(connection) {
  connection.send({
    type: "session.thinking.append",
    event_id: "availability_progress",
    delegation_id: "item_123",
    content: "Checking Thursday availability. No appointment has been booked.",
  });
}

予約が確定したら、ユーザーに音声で伝える結果を送信します。

export function sendUpdate(connection) {
  connection.send({
    type: "session.commentary.append",
    event_id: "appointment_result",
    delegation_id: "item_123",
    content: "Your appointment is confirmed for Thursday at 2:00 PM",
  });
}

その結果は、予約が実際に成功した後にのみ送信してください。セッション全体への指示には、session.instructions.appenddelegation_id: null とともに使います。

たとえば、アプリケーションがガードレールに基づいてリクエストをブロックした後、会話の方向を変えることができます。

export function sendUpdate(connection) {
  connection.send({
    type: "session.instructions.append",
    event_id: "guardrail_block_17",
    delegation_id: null,
    content:
      "Stop speaking about that request. Briefly explain that you cannot help with it, then wait for the user.",
  });
}

この指示でバックエンドの処理がキャンセルされることはありません。アプリケーションで対象の操作をブロックし、すでに実行中の処理にも対応してください

対応する確認応答は session.thinking.appendedsession.commentary.appendedsession.instructions.appended です。これらの client_event_id を、送信した event_id と照合してください。確認応答は、コンテキストの注入が完了したと推定される時点まで待ちますが、発話や再生の完了までは待ちません。タイミングとエラー処理については、コンテキストがモデルに届くタイミングを参照してください。

読み上げないコンテキストでも、その後のモデルの発話に影響することがあります。秘密情報や非公開の推論を置くためのプライベートな場所ではありません。有用な事実や簡潔な進捗の要約を送信してください。

正確で役立つ更新

長時間のタスクでは、ステップの完了、無視できない遅延の発生、ユーザーの回答が必要な質問など、伝える価値のある変化が生じたときに更新を送信します。

クライアントモードでバックグラウンドの進捗を伝えるには session.thinking.append を使います。音声で伝える価値がある更新には session.commentary.append を使います。

音声で更新を伝える場合は、確認済みのタスクの状態に合った内容を session.commentary.append で送信します。

状態内容の例
処理中“I'm checking the available appointments.”
完了“You're booked for Thursday at 2:00 PM.”
失敗“That time is no longer available.”
キャンセル確認済み“Your appointment has been canceled.”

音声で割り込んでも、バックエンドの処理は自動的にはキャンセルされません。ユーザーが金曜日を木曜日に変更した場合は、進行中のタスクを更新し、遅れて届いた金曜日の結果は無視してください。処理をキャンセルするか、変更するか、そのまま完了させるかは、アプリケーションで判断する必要があります。キャンセルしたと伝える前に、実際にキャンセルが成功したことを確認してください。

失敗したツール呼び出しを再試行する前に、元の操作がすでに実行されていないか確認してください。たとえば、応答が届かなかったからといって、予約を重複させてはいけません。結果が不明な場合は、その旨を伝え、次に取れる有用な対応を提示してください。

UI コンテキストの共有

現在のページやタスク、関連する選択内容、「このオプション」などの指示表現を解釈するのに役立つ事実を、簡潔にまとめて GPT-Live に渡します。要約はアプリケーションの状態から直接作成してください。整形するためにモデルを追加で呼び出す必要はありません。

セッションの開始時と、関連する状態が変わったときに UI コンテキストを送信します。変更がなければ送信せず、短時間に続く変更は最新の状態を示す短い要約にまとめてください。以前の選択から何が変わったかを明示します。

  • 初期コンテキスト: “The user is reviewing a restaurant reservation: August 6 at 7 PM, two guests. No reservation has been made.”
  • 訂正: “The selected time is now 8 PM; the previous selection was 7 PM.”

どちらの委譲モードでも、バックグラウンドでのコンテキスト更新には session.thinking.appenddelegation_id: null とともに使います。HTML 全体、DOM ツリー、大きな JSON ペイロード、操作ログは、アプリケーションまたはバックエンドに保持してください。ページの内容は指示ではなく、参照データとして扱います。

テキスト入力の受け付け

通話中のユーザーが注文番号などの正確な値をテキストで入力した場合は、タスクを処理するバックエンドに渡します。音声のみのアプリケーションでは、この処理経路は不要です。入力された値は、ライブモデルへの指示ではなくユーザーデータとして扱ってください。

Responses 委譲では、バックエンド向けのユーザーメッセージをキューに追加します。

export function sendUpdate(connection) {
  connection.send({
    type: "response.item.create",
    event_id: "typed_order_number",
    item: {
      type: "message",
      role: "user",
      content: [
        {
          type: "input_text",
          text: "My order number is A0042.",
        },
      ],
    },
  });
}

バックエンドを実行または継続する準備ができたら、response.create を送信します。関数の結果を待っている場合は、まず必要な結果をすべて返します。テキストをキューに追加するだけでは、実行中の処理はキャンセルされません。

画像と視覚的コンテキストの追加

通話中のユーザーが写真や画面について話せるようにするには、アプリケーションから視覚認識に対応したバックエンドに、画像と関連するコンテキストを送信します。バックエンドは画像を解釈し、GPT-Live が会話で使える関連テキストを返します。Live の音声フロントエンドは、画像を直接受け付けません。

Responses 委任では、視覚認識に対応したバックエンドモデルを設定します。response.item.create で、Responses がサポートする画像入力アイテムをキューに追加し、response.create を送信してバックエンドの処理を実行または再開します。継続する前に、返却待ちの必要な関数の結果をすべて返します。Responses 委任の処理を参照してください。

バックエンドへの画像入力は、起動時に Live フロントエンドにテキスト履歴を渡す session.input とは別に扱います。対応する画像形式とモデルの制限については、画像と視覚認識を参照してください。

バックエンドのレイテンシの削減

バックエンドへの処理リクエストから、会話に役立つ結果が得られるまでの時間を短縮します。各段階のレイテンシを測定し、遅延の発生箇所を特定します。同じシナリオで、役立つ音声応答が得られるまでの時間とタスクの成功状況を比較します。評価方法については、音声エージェント評価の Cookbook を参照してください。

Responses 委任

Live は Responses への永続的な WebSocket 接続を管理し、接続と事前に決まっているリクエスト設定を準備して、利用可能な場合は以前のレスポンスの状態を再利用します。ホスト型バックエンドでは、これらの手順を自分で実装する必要はありません。再利用は、アクティブな接続と互換性のある状態に依存し、キャッシュヒットや特定のレイテンシを保証するものではありません。

delegation.responses でバックエンドを調整します。

  • model:音声モデルとは独立して、推論とツール選択を担うモデルを選びます。
  • reasoning.effort:そのモデルがサポートする値を使って、推論時間とタスクの品質のバランスを調整します。
  • service_tier:モデルの対応状況とプロジェクトのアクセス権に応じて、autodefaultflexpriority のいずれかを使用します。auto はプロジェクトの設定に従います。選択したティアの性能とコストを評価してください。

セッション中は session.update を使って、対応する設定を更新します。カスタムツールは引き続きアプリケーション内で実行されるため、Live が Responses 接続を管理していても、サービス呼び出しの遅さ、キュー、ツール結果のバッファリングによって回答が遅れることがあります。必要なツール結果をそれぞれ速やかに返し、バックエンドのレスポンスを継続します。

文字起こしの断片への対応

アプリケーションで文字起こしの断片を処理するかどうかは任意で、どちらの委任モードでも利用できます。ユーザーとアシスタントの文字起こしの断片は、WebSocket または WebRTC データチャネルを通じて届きます。アプリケーションのロジックや軽量モデルで処理すれば、委任イベントが届く前に処理を開始できます。また、文字起こし自体をきっかけとして、アプリケーションが管理する処理を開始することもできます。

このパターンは、次の用途に使えます。

  • 待ち時間を短縮します。 十分な情報がそろった時点で、先回りして検索を開始します。たとえば、ユーザーが希望を話している間に、空き状況を確認できます。
  • ガードレールを実行します。 逐次追加される文字起こしを確認し、介入が必要なリクエストや応答がないかをチェックします。会話へのガードレールの適用を参照してください。
  • 状況に合わせて会話を調整します。 混乱やいら立ちを示す言い回しを検出し、ユーザー体験を調整するか、要点を絞った指示を送信します。
  • インターフェースを更新します。 関連する操作項目を強調表示したり、入力欄に候補値を設定したり、結果が得られ次第表示したりします。

ブラウザアプリケーションでは、字幕やローカル UI の更新に WebRTC データチャネルを使います。ガードレール、軽量モデルによるチェック、先回りしたツール呼び出しなどのためにサーバーで文字起こしを処理する場合は、サイドバンド WebSocket を使ってイベントを受信し、同じ GPT-Live セッションを直接制御します。

意味のある新しい情報が届いたら、それまでに蓄積したテキストを処理します。断片は不完全な場合があり、後続の発言でリクエストが変わることもあります。古くなった結果は破棄し、後続の委任処理と連携してアクションの重複を避けます。重要な影響を伴うアクションを実行する前には、通常の権限チェックと確認手順を適用します。

会話に情報を返すには、次のイベントを使います。

目的イベント
ライブモデルの動作を変更する、または会話の方向を変えるsession.instructions.append
後続の応答に使うコンテキストを、音声に出さずに提供するsession.thinking.append
モデルが音声で伝えるべき情報を提供するsession.commentary.append

クライアント委任に属さない更新には、delegation_id: null を使用します。これらの追加はライブモデルの動作を調整するもので、UI の変更、ツールの実行、キャンセルはアプリケーションが制御します。追加の例は、適切な種類の更新の送信を参照してください。

共通の最適化

次のバックエンドの改善は、どちらの委任モードにも有効です。

  • タスクに合ったモデルと推論強度を選びます。 精度の要件を満たす構成を比較します。低い推論強度でもタスクを確実に完了できる場合は、その設定を使用します。
  • 回答を簡潔にします。 GPT-Live が会話を続けるために必要な事実と状況を返します。長い説明や、結果を音声向けに書き換えるためだけの追加のモデル呼び出しは避けます。
  • ツールの遅延と不要な呼び出しを減らします。 許可された処理は入力がそろった時点で開始し、結果が有効な間は再利用して、完了済みの検索を繰り返さないようにします。
  • 独立した処理を並行して実行します。 互いに独立した検索呼び出しは同時に実行できます。依存関係と、アクションに必要な確認手順を守ってください。parallel_tool_calls を使うと、モデルは複数の呼び出しをリクエストできますが、カスタム関数の実行スケジュールと実行自体は、引き続きアプリケーションが管理します。

Responses に関する一般的なガイドはレイテンシの最適化を、変更のない入力の再利用についてはプロンプトキャッシュを参照してください。

やり取り全体の検証

アプリケーションが正として管理する状態と、クライアントが再生した音声の両方をテストします。結果の読み上げが中断されてもバックエンドのレスポンスは完了することがあり、コンテキストの確認応答が示すのは受理であって、再生ではありません。再接続、再試行、遅れて届いた結果によってアクションが重複したり取り消されたりしないように、操作 ID とタスクのリビジョンは委任 ID とは分けて管理します。

再現性のあるテストには、音声エージェントの評価を活用してください。既存の Realtime のツールループや連鎖型バックエンドについては、GPT-Live への移行に従ってください。