Skip to main content
Realtime

Conversation に接続

既存の Conversation に WebSocket で接続し、リアルタイムの音声・テキスト対話およびバックグラウンドタスクイベントを送受信します。

Realtime は現在 Beta 機能です。API 定義、イベント構造、および動作は変更される可能性があります。ドキュメントの更新を確認し、本番環境で使用する前に互換性を検証してください。
GET /api/v1/forward/realtime 1 つの Realtime 接続を維持できる最長時間は 60 分です。

ヘッダー

Header必須説明
AuthorizationはいBearer <PAT または SAT>
Upgradeはいwebsocket。WebSocket クライアントが生成します。
ConnectionはいUpgrade。WebSocket クライアントが生成します。

クエリパラメーター

パラメーター型必須説明
conversation_idstringはい現在の認証情報でアクセスでき、ステータスが ready の Conversation ID。

リクエスト例

wss://api.qoder.com/api/v1/forward/realtime?conversation_id=conv_xxx
GET /api/v1/forward/realtime?conversation_id=conv_xxx HTTP/1.1
Host: api.qoder.com
Authorization: Bearer <PAT または SAT>
Upgrade: websocket
Connection: Upgrade

レスポンス例

HTTP 101 Switching Protocols WebSocket 接続の準備が整うと、サーバーは voice.ready を送信します。
{
  "version": "voice.realtime.v1",
  "type": "voice.ready",
  "event_id": "evt_xxx",
  "sequence": 2,
  "conversation_id": "conv_xxx",
  "timestamp": "2026-08-31T02:00:01Z",
  "payload": {
    "config": {
      "audio": {
        "output": {
          "voice": "longanlingxin"
        }
      }
    },
    "provider": "qoder",
    "input_audio": {
      "format": "pcm16",
      "sample_rate": 16000,
      "channels": 1
    },
    "output_audio": {
      "format": "pcm16",
      "sample_rate": 24000,
      "channels": 1
    },
    "capabilities": {
      "graceful_close": true
    }
  }
}

voice.ready.payload のフィールド

イベントの共通フィールドについては、Realtime イベントを参照してください。
フィールド型説明
configobject現在の接続で有効な Conversation 設定。
config.audio.output.voicestring現在の接続で有効な音声識別子。
providerstringサービスプロバイダー。公開環境では常に qoder。
input_audioobjectaudio.append で使用する音声形式。
input_audio.formatstring常に pcm16。WAV ヘッダーを含まない、リトルエンディアンの符号付き 16 ビット Raw PCM。
input_audio.sample_rateinteger常に 16000 Hz。
input_audio.channelsinteger常に 1(モノラル)。
output_audioobjectaudio.delta で使用する音声形式。
output_audio.formatstring常に pcm16。入力音声と同じ方法でエンコードされます。
output_audio.sample_rateinteger常に 24000 Hz。
output_audio.channelsinteger常に 1(モノラル)。
capabilitiesobject現在の接続でサポートされるプロトコル機能。
capabilities.graceful_closeboolean正常終了プロトコルをサポートするかどうか。現在は true。

エラー

ハンドシェイク完了前のエラーは HTTP レスポンスで返されます。
HTTPCode発生条件
400conversation_id_required、unsupported_query_parameterWSS クエリパラメーターがないか、サポートされていません。
401authentication_required、ゲートウェイの TOKEN_INVALIDPAT または SAT が無効または期限切れであるか、Service Account Key が直接使用されています。
403permission_errorSAT が利用可能な Workspace に紐付けられていません。
404conversation_not_foundConversation が存在しないか、現在の認証情報では関連するユーザー、Workspace、または Identity にアクセスできません。
409conversation_not_readyConversation の準備ができていません。
500conversation_persistence_errorサービス内部エラーが発生しました。
502forward_unavailable、forward_protocol_error依存サービスでエラーが発生しました。
503gateway_unavailableサービスが一時的に利用できません。
ハンドシェイク完了後のエラーは error イベントで返されます。WebSocket エラーを参照してください。

Realtime イベント

イベントは UTF-8 JSON テキストメッセージとして送信されます。バイナリメッセージは使用できません。クライアントメッセージは JSON と Base64 を含めて最大 256 KiB です。音声またはテキストは voice.ready を受信した後に送信してください。

共通フィールド

フィールド型説明
versionstring双方向で必須。常に voice.realtime.v1。
typestring双方向で必須。イベントタイプ。
payloadobject双方向で必須。イベントデータ。ビジネスフィールドがない場合は {}。
event_idstringサーバーが常に返します。履歴イベント ID ではなく、現在の WSS 配信 ID です。クライアントは送信しません。
sequenceintegerサーバーが常に返します。現在の接続内で増加し、再接続後にリセットされます。再開カーソルとしては使用されません。
conversation_idstringサーバーが常に返します。関連する Conversation。
timestampstringサーバーが常に返します。RFC 3339 形式の時刻で、ナノ秒精度の小数部を含む場合があります。
work_idstringサーバーが任意で返す、関連タスクの ID。
announcement_idstringサーバーが任意で返す、関連アナウンスの ID。

クライアントイベント

{
  "version": "voice.realtime.v1",
  "type": "text.message",
  "payload": {
    "text": "こんにちは。簡単に自己紹介してください。"
  }
}
typepayload フィールド説明
audio.appendaudio: string空でない Base64 PCM16 を分割して送信します。エンコードは voice.ready.payload.input_audio を参照してください。サーバーが音声アクティビティを検出するため、commit イベントは不要です。
text.messagetext: string前後の空白を削除した後で空ではなく、UTF-8 で最大 16 KiB。
interruptなし現在のレスポンスを中断します。クライアントは再生を停止し、キューをクリアします。
playback.startedwork_id: string、announcement_id: string。対応する音声イベントに含まれる場合は必須。再生が実際に開始されました。対応する音声イベントのトップレベル識別子をそのまま返します。識別子がない場合は {} を送信します。
playback.endedwork_id: string、announcement_id: string。対応する音声イベントに含まれる場合は必須。現在の音声セグメントの再生が完了し、キューが空になりました。
playback.cancelledwork_id: string、announcement_id: string。対応する音声イベントに含まれる場合は必須。再生を開始できないか、再生がキャンセルされました。中断時は再生を停止してキューをクリアし、元の音声識別子を付けてこの受領イベントを送信します。
pingなし接続確認。レスポンスは pong。
connection.closerequest_id: string収集と再生を停止した後に送信し、同じ request_id を持つ connection.closed を待ちます。識別子は空ではない 128 バイト以下の値で、先頭または末尾の空白、改行、null 文字を含めることはできません。

サーバーイベント

イベント構造の例はレスポンス例を参照してください。
typepayload フィールド説明
voice.statestate: stringconnecting、ready、idle、interrupted。
voice.readyconfig: object、provider: string、input_audio: object、output_audio: object、capabilities: object接続の準備が完了しました。有効な Conversation 設定と音声転送形式を返します。
voice.replacedreason: string接続が置き換えられました。
transcript.deltarole: string、text: string。任意で item_id: string、response_id: string。ユーザー音声の認識テキスト更新、またはアシスタント字幕の差分。
transcript.final上記と同じ一時字幕を置き換える最終字幕。
audio.deltaaudio: stringBase64 PCM16 音声。エンコードは voice.ready.payload.output_audio を参照してください。
audio.doneなし現在の音声セグメントの出力が完了しました。クライアント側での再生完了を意味するものではありません。
playback.interruptreason: string再生を停止し、キューをクリアします。
work.acceptedstatus: "accepted"、objective: stringタスクが受け付けられました。
work.runningstatus: "running"タスクを実行中です。
work.progresskind: string、detail: string。任意で title: string、is_error: boolean、event_id: string。タスクの進捗。payload の event_id は永続化された Forward イベント ID です。
work.milestoneannouncement_id: string、milestone_type: string、summary: stringタスクのマイルストーン情報。
work.completedstatus: "completed"、result: string。任意で event_id: string。タスクが完了しました。アナウンスの再生は継続している場合があります。payload の event_id は永続化された Forward イベント ID です。
work.failedstatus: "failed"、error.code: string。任意で event_id: string。接続状態とは独立して、タスクが失敗またはキャンセルされました。payload の event_id は永続化された Forward イベント ID です。
pongなしping へのレスポンス。
connection.closedrequest_id: string、outcome: string元の request_id を返す終了確認。outcome は no_active_response、no_content、saved、または saved_interrupted。
errorcode: string、message: string。任意で retryable: boolean、retry_after_ms: integer。プロトコルまたはサービスのエラー。

WebSocket エラー

Code接続を終了発生条件
invalid_event、text_too_longいいえイベントが無効か、テキストの上限を超えています。
voice_not_readyいいえRealtime 接続の準備ができていません。
invalid_playback_receiptいいえ再生受領イベントが無効です。
connection_closingいいえ接続を終了中で、ビジネスイベントを受け付けません。
invalid_work_request、work_busy、work_unavailable、work_persistence_error、forward_request_failed、forward_cancel_failed、forward_protocol_errorいいえタスクリクエストまたは実行でエラーが発生しました。
provider_initialization_failed、voice_configuration_failed、context_restore_failedはいRealtime モデルの初期化、音声の確認、またはコンテキストの復元に失敗しました。
provider_unavailable、service_restartingはいサービスが利用できません。retry_after_ms がある場合は、その時間後に再接続してください。
event_persistence_failedはいイベントの保存に失敗し、最後の履歴イベントが欠落している可能性があります。

HTTP エラーレスポンス

{
  "type": "error",
  "request_id": "req_xxx",
  "error": {
    "type": "invalid_request_error",
    "code": "invalid_idempotency_key",
    "message": "Idempotency-Key is required and must be at most 256 characters"
  }
}

レスポンスフィールド

フィールド型説明
typestring常に error。
request_idstringリクエストトレース ID。
error.typestringinvalid_request_error、authentication_error、permission_error、not_found_error、conflict_error、api_error などのエラーカテゴリ。
error.codestring安定したビジネスエラーコード。
error.messagestringエラーの説明。
サーバーはレスポンスヘッダーでもリクエストトレース ID を返します。
X-Request-Id: req_xxx
ゲートウェイの認証エラーでは、次の構造が使用されます(HTTP 401)。
{
  "code": "TOKEN_INVALID",
  "message": "missing authorization token"
}
プロキシまたは標準の WebSocket ハンドシェイクに失敗した場合は、JSON 以外のレスポンスが返されることがあります。

関連項目