Skip to main content
1 本の双方向 WebSocket でアプリケーションを既存の Managed Agent に接続し、ユーザー音声の送信、エージェント音声の受信、会話イベントやクライアントツールイベントの処理を行います。 このページは、すでにエージェントを作成・設定済みであることを前提としています。新しい会話ごとに、その agent_id を再利用してください。エージェントの作成については Managed Agents を、設定についてはエージェントの設定を参照してください。

前提条件

  • 既存の Managed Agent とその agent_id
  • 信頼できるサーバー用の Cartesia API キー、またはブラウザ・モバイルアプリ向けにサーバーで生成したエージェントアクセストークン
  • マイクやファイルなどの入力ソースから音声を読み取り、サポートされるオーディオ形式のバイト列を生成するコード
  • 同じ形式で返されるエージェント音声を再生または処理するコード

オーディオ形式

input_format は必須です。ヘッダーなしのモノラル音声を選択します: エージェント音声も入力と同じ形式を使用します。

クイックスタート

この Node.js のセッションスケルトンは、信頼できるサーバー上で API キーを使用します。接続して session_create を送信し、session_ready を待ち、返された base64 音声をバイト列に変換します。例の後に示す 3 つの音声統合ポイントを接続してください。 ws パッケージをインストールします:
これを agent-session.mjs として保存します:
agent-session.mjs
ブラウザやモバイルアプリには API キーを絶対に埋め込まないでください。サーバー側で短命のエージェントアクセストークンを発行し、クエリパラメータとして渡してください。ブラウザは WebSocket のヘッダーを設定できません。
スケルトンを実行します:
音声経路を完成させるには:
  • 音声入力チャンクごとに sendAudio(audioBytes) を呼び出します。audioBytes には session_create で選択した input_format のバイト列を渡します。この関数はそれを base64 エンコードして送信し、何も返しません。
  • playAudio(audioBytes) を、同じ形式のバイト列を再生キューに入れ、何も返さない関数に置き換えます。
  • stopPlayback() を、引数を取らず、キュー済みの出力を破棄して現在の再生を停止し、何も返さない関数に置き換えます。

接続

サーバーアプリケーションは X-API-Key ヘッダーで認証します。ブラウザおよびモバイルアプリケーションは access_token クエリパラメータを送信してください。クライアントアプリケーションで API キーを絶対に公開しないでください。トークンの取り扱いについてはクライアントアプリケーションの認証を参照してください。 接続は、オープンした時点のエージェントの現在のバージョンを取り込みます。設定変更は、すでに進行中の通話には影響しません。session_ready イベントは、解決された agent_version_id とその通話の call_id を報告します。

セッションの開始

接続から 10 秒以内に、最初のイベントとして session_create を送信します:
output_delivery のデフォルトは speaking_pace です。アプリケーションが独自の再生バッファを管理する場合は as_available を使用してください。エージェントにバックグラウンド音声が設定されている場合、as_available は使用できません。 音声を送信する前に session_ready を待ってください:
session_ready のすべてのフィールドについては Agent WebSocket API リファレンスを参照してください。

音声のストリーミング

すべてのイベントは JSON テキストフレームを使用します。audio_input と audio_output のどちらも、バイナリ音声バイト列を base64 エンコードしてイベントの audio 文字列に載せます。バイナリの WebSocket フレームは送信しないでください。 ユーザー音声は audio_input イベントとして送信します。
サーバーは設定された形式で audio_output イベントを返します:
ユーザーが話し始めると、サーバーは audio_output_clear を送信します(バージイン)。バッファ済みのエージェント音声を破棄し、直ちに再生を停止してください。このイベントはエージェント音声が再生されていないときにも届くことがあり、その場合はクリアすべきものはありません。

クライアントツール

エージェントがクライアントツールを呼び出すと、サーバーは client_tool_call を送信します:
expects_response が true の場合、同じ tool_call_id で応答してください:
遅延した結果、重複した結果、不一致の結果は無視されます。結果は最大 4096 バイトです。

会話イベント

発話状態の UI、トランスクリプト、その他の音声以外のワークフローには turn_started、turn_output_text_delta、turn_ended を使用します。アシスタントのテキストは turn_output_text_delta で逐次届きます。turn_ended.text には、どちらのロールについても確定テキストが含まれます。 エージェント音声は audio_output から再生してください。audio_output_clear が届いたら、キュー済みのエージェント音声を破棄して再生を停止してください。

セッションを終了する

クライアント側で正常に終了するときは、コード 1000 で WebSocket をクローズします:
session_ready で返される call_id は、このセッションの通話記録を識別します。通話終了後、これを Get Call エンドポイントに渡すと通話記録とトランスクリプトを取得でき、Download Call Audio に渡すと通話音声をダウンロードできます。他の通話記録を探すには List Calls を使用してください。

エラーと接続の制限

サーバーはイベントを拒否すると error イベントを送信します。回復可能なエラーは fatal: false を持ち、致命的なエラーの後には接続クローズが続きます。
  • JSON メッセージは最大 32 KiB です。それより大きいメッセージはコード 1009 でクローズされます。
  • 有効なクライアントイベントがないまま 120 秒経過すると、サーバーは接続を閉じます。無音を含め、音声を継続的にストリーミングすることで接続は維持されます。WebSocket の ping フレームは、このアプリケーションレベルのタイマーをリセットしません。
  • サーバーはプロトコルエラーにクローズコード 1008、内部障害に 1011 を使用します。

API リファレンス

すべてのイベントとフィールドについては WebSocket API リファレンスを参照してください。