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_calls を true に設定し、呼び出しを順番に実行する必要がある場合は false に設定します。カスタム関数の実行と、依存関係や承認要件の適用は、引き続きアプリケーションが担います。これらの設定は、ライブモデルに委譲を強制するものではありません。
Responses の設定では、作成時にバックエンドの model を指定する必要があります。tools では、function の定義と web_search のエントリがサポートされています。また、max_output_tokens(設定する場合は 16 以上)、service_tier、および選択したバックエンドモデルがサポートする reasoning と text の設定も利用できます。調整できる設定については、バックエンドのレイテンシーの削減を参照してください。
お使いのモデルとプロジェクトで Fast モード が利用可能な場合、低レイテンシーが求められる呼び出しでの使用を検討してください。GPT-Live では、delegation.responses.service_tier: "priority" で選択します。
会話の変化に応じて、session.delegation.responses の変更内容を含む session.update を送信すると、新しい Live セッションを開始せずに、バックエンドモデル、指示、利用可能なツール、tool_choice、その他のサポートされている設定を更新できます。省略した設定は、それまでの値を保持します。delegation を null に設定するとクライアントモードが選択されますが、実行中の Responses セッションをリセットすることはできません。モードを切り替えようとすると、immutable_field_update エラーで失敗します。
これらの設定には Responses でおなじみの概念が使われていますが、Live がサポートするのは単体の Responses API の一部です。Live は会話のコンテキストを提供し、委譲する処理を開始します。バックエンドはセッションを通じて設定してください。Live の response.create コマンドはその設定を使用し、単体の Responses リクエストボディは受け付けません。
アプリケーションからのライブ会話の誘導
Responses 委譲ではバックエンドのワークフローが管理されますが、アプリケーションから GPT-Live モデルにコンテキストを直接送信することもできます。サイドバンド WebSocket またはメインのイベント接続で通話を監視している場合、session.instructions.append、session.thinking.append、session.commentary.append のいずれかを delegation_id: null とともに使用できます。たとえば、文字起こしに基づくガードレールで指示を追加し、会話の方向を変えることができます。これはライブモデルを誘導するものであり、Responses バックエンドのプロンプトを変更したり、すでに進行中の処理をキャンセルしたりするものではありません。
Responses 委譲の処理
Responses を利用する処理では、session.delegation.created に target: "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_id、name、arguments が含まれます。引数の生成完了イベントだけでは、呼び出しを特定できません。
ネストされた response.created のレスポンス ID を外側の delegation_id とともに追跡し、response.output_item.done からそのレスポンスの関数呼び出しを収集してください。転送されるライフサイクルスナップショットには、response.completed の時点も含め、意図的に response.output: [] が設定されています。また、tools 配列は空、instructions は null となり、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 委譲が必要です。
クライアント委譲の設定
Live セッションの作成時に delegation を設定します。
export const session = {
model: "gpt-live-1",
delegation: {
type: "client",
},
};これにより、セッションでクライアント委譲が選択されます。バックエンドは別途設定してください。モデルまたはサービス、指示、ツール、処理の振り分け方法はアプリケーションで選択します。そのバックエンドに Responses API を使用する場合は、アプリケーションが送信する Responses リクエストでモデルとツールを設定します。Live セッションは、これらのバックエンドツールを設定したり実行したりしません。
GPT-Live が支援を求めると、アプリケーションは会話とアプリケーションのコンテキストからバックエンドリクエストを構築し、処理を実行して、どの結果を返すかを判断します。ツールを実行する前に、権限と必要な確認を必ず適用してください。バックエンドリクエストごとに関連するコンテキストを提供できるよう、会話履歴全体をアプリケーションで保持してください。
アプリケーションでの会話コンテキストの保持
クライアント委譲では、 文字起こしの収集と現在のタスク状態の保持を自分で行ってください。
session.input_transcript.delta と session.output_transcript.delta をリッスンしてください。これらのイベントには、delta 内の文字起こしテキストと、start_ms および end_ms のタイムスタンプが含まれます。「はい」のような短い返答や、「金曜日ではなく木曜日です」のような訂正、以前に伝えられた詳細を理解できるだけの履歴を保持してください。文字起こしの断片はユーザーの発話ターン全体を表すものではなく、文字起こしに誤りが含まれる場合もあります。
別のイベントである session.delegation.created には、offset_ms タイムスタンプと、delegation.id や delegation.target などの委譲メタデータが含まれます。ユーザーの発話やタスクのテキストは 含まれません 。文字起こしイベントとアプリケーションの状態を使って、ユーザーの意図を把握してください。更新内容をそのリクエストと対応付けられるよう、delegation.id を保存してください。
長い記録とツールの出力全体はバックエンドで保持してください。セッションを置き換える場合は、アプリケーションから関連するコンテキストを復元し、処理を繰り返す前に、どの操作がすでに実行済みかを確認してください。
クライアント委譲の受信
session.delegation.created で委譲を識別します。
{
"type": "session.delegation.created",
"event_id": "event_delegation",
"offset_ms": 1000,
"delegation": {
"id": "item_9tA2bF3h7K9m2P5q8R1s4",
"type": "delegation",
"target": "client"
}
}event.delegation.id を読み取ります。委譲オブジェクトに含まれるのはメタデータであり、タスクのテキストではありません。委譲された作業を処理する独自のハンドラーに必要な文字起こしとアプリケーションのコンテキストを保持してください。現在の ID には、この例のように item_ プレフィックスが付いています。ただし、ID 全体を内部構造に立ち入らない不透明な値として扱い、自分で組み立てたり解析したりせず、そのまま返してください。
その ID を使って結果を返します。
export function sendUpdate(connection) {
connection.send({
type: "session.commentary.append",
event_id: "result_123",
delegation_id: "item_9tA2bF3h7K9m2P5q8R1s4",
content: "The order shipped today and should arrive tomorrow.",
});
}追加時に読み上げずにモデルの内部推論へ情報を加えるには、session.thinking.append を使います。モデルに読み上げさせたい結果には session.commentary.append を使います。モデルは、追加されたテキストを言い換えて伝えるように学習されています。追加する内容はすべて通常の文字列で、delegation_id が必須です。値が null の場合も省略できません。null 以外の ID は、既知のクライアント委譲を指す必要があります。
結果を繰り返し追加することで、同じクライアント委譲を継続できます。追加の確認応答は、コンテキストの注入が完了したと推定される時点の後に届きます。モデルが結果を取り込んだことや読み上げたこと、外部の操作が成功したことを証明するものではありません。
既存のバックエンドプロンプトの活用
既存のテキストエージェント用プロンプトを出発点にします。タスクの指示とビジネスルールはバックエンド側に保持し、テキストチャットや発話の直接制御を前提とした指示を調整してください。音声の文字起こしの扱い方と、有用な結果の返し方を明示します。権限の適用と必要な確認の実施は、アプリケーションで徹底してください。
## 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.append を delegation_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.appended、session.commentary.appended、session.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.append を delegation_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 を送信します。関数の結果を待っている場合は、まず必要な結果をすべて返します。テキストをキューに追加するだけでは、実行中の処理はキャンセルされません。
クライアント委任では、入力された値を、会話を処理するバックエンドに直接送信します。その値が実行中のタスクを修正するものであれば、同じ処理を再び開始せず、そのタスクを更新します。session.thinking.append を使って事実を短くまとめた内容をライブセッションにも反映できます。ユーザーに音声で伝えるべき結果には session.commentary.append を使用します。
画像と視覚的コンテキストの追加
通話中のユーザーが写真や画面について話せるようにするには、アプリケーションから視覚認識に対応したバックエンドに、画像と関連するコンテキストを送信します。バックエンドは画像を解釈し、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:モデルの対応状況とプロジェクトのアクセス権に応じて、auto、default、flex、priorityのいずれかを使用します。autoはプロジェクトの設定に従います。選択したティアの性能とコストを評価してください。
セッション中は session.update を使って、対応する設定を更新します。カスタムツールは引き続きアプリケーション内で実行されるため、Live が Responses 接続を管理していても、サービス呼び出しの遅さ、キュー、ツール結果のバッファリングによって回答が遅れることがあります。必要なツール結果をそれぞれ速やかに返し、バックエンドのレスポンスを継続します。
クライアント委任
委任の受信から結果の返却までの処理経路は、アプリケーションが管理します。音声セッションの実行中に、その経路を準備します。
- バックエンド接続を再利用します。 委任のたびに接続し直すことがないよう、API クライアントと接続プールを維持します。Responses を繰り返し呼び出す場合は、永続的な Responses WebSocket 接続を検討してください。
- 事前に決まっている設定を準備します。 最初のリクエストで必要になる前に、指示、ツール、接続を初期化します。Responses の WebSocket モードでは、生成前に既知のリクエスト状態をウォームアップすることもできます。セットアップのガイドに従ってください。
- 役立つ結果をストリーミングします。
session.commentary.appendで、検証済みの結果を意味のまとまった単位で返します。音声に出さずに進捗を伝えるにはsession.thinking.appendを使用します。クライアント委任 ID を維持し、1 回の追加につき 500 トークンの上限を守ります。非公開の推論はバックエンドにとどめ、成功を伝える前にアクションの実行結果を確認します。 - 再利用できる入力を維持します。 指示、ツールの定義と順序、履歴の先頭から変更されていない部分を保持します。バックエンドがキャッシュと継続に対応している場合は、再利用できる内容の後に新しい情報を追加します。
- 不要なバッファリングを避けます。 役立つ結果が準備できたら、すぐに転送します。バッファリングは、出力を分類して意味のまとまった単位にするために必要な範囲にとどめます。処理段階を示す構造化メタデータの使用を推奨します。テキストのプレフィックスで進捗と結果を区別する場合は、プレフィックス全体を受信してからテキストを転送します。
この処理経路を 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 への移行に従ってください。