メインコンテンツへスキップ
Comfy Router は、fal が提供する xAI の Grok Voice とのリアルタイム音声対音声セッションを中継します。Comfy API キーを使って Router への WebSocket を1本開きます。Router はアカウントとクレジットを確認し、上流でセッションを開いてから、イベントを双方向に中継します。セッションの秒単位の料金は Comfy のクレジットから支払われます。

エンドポイント

リクエストは WebSocket アップグレードです(Connection: Upgrade と Upgrade: websocket を伴う GET)。それ以外のリクエストは 426 で拒否されます。

認証

アップグレードリクエストのヘッダーで、Comfy API キーを X-API-Key: comfyui-... または Authorization: Bearer comfyui-... として送信します。Router はクエリ文字列や WebSocket サブプロトコルからキーを読み取りません。
ブラウザは WebSocket にヘッダーを設定できません。また、Comfy API キーを絶対にブラウザへ到達させてはいけません。サーバーからセッションを開き、オーディオをブラウザへ自分で中継してください。

接続

アップグレードが成功したら、xAI が Grok Voice 向けに文書化しているリアルタイムイベントを送受信します。この例ではセッションを設定し、1 回のテキストターンを送信して、受信した各イベントタイプを出力します。
終わったらすぐにソケットを閉じてください。課金されるのは最後のレスポンスまでではなく、セッションが閉じるまでです。

イベント

Router は独自のイベントプロトコルを定義していません。サーバーイベントは fal が送信するそのままの形で届き、Router が受け付けるクライアントイベントは変更されずに転送されます。イベント一覧、セッションのフィールド、ボイス、オーディオ形式については、次を参照してください。 各クライアントイベントは、例のように 1 つの msgpack バイナリメッセージとして送信してください。これは fal のリアルタイムクライアントが使用するフレーミングであり、モデルのイベントも同じ方法で、session.created で始まる msgpack バイナリメッセージとして返されます。fal は独自の x-fal-message タイプの JSON テキストメッセージ(タイミング情報)も送信しますが、これらはスキップしてかまいません。Router のチェックではクライアントイベントを 1 つの JSON テキストメッセージとして受け付けることもできますが、クライアントで JSON をテスト済みでない限り msgpack を使用してください。 Router は転送前に各クライアントイベントをチェックします:
  • イベントタイプ: session.update、input_audio_buffer.append、input_audio_buffer.commit、input_audio_buffer.clear、conversation.item.create、conversation.item.delete、conversation.item.truncate、response.create、response.cancel、および fal の x-fal-session.configure。
  • モデル: session.update 内の model は grok-voice-latest、grok-voice-3.0、または grok-voice-2.0 である必要があります。
  • ツール: クライアントが実行する関数ツールは許可されます。サーバー側のツール(ウェブ検索、X 検索、ファイル検索、MCP)は拒否されます。
  • メディア: 画像とビデオの入力は拒否されます。セッションは音声とテキストのみです。
  • サイズ: 1 つのクライアントメッセージは最大 1 MiB です。
拒否されたイベントは転送されず、Router はクローズコード 1008 でセッションを閉じます。

料金

セッションには**1秒あたり$0.0011869**の費用がかかります(1分あたり約$0.0712、または1秒あたり0.2504クレジット、1分あたり約15.0クレジット。211クレジット = 1 USDのレートで)。セッションが開いている間は15秒単位で課金され、最後の端数は秒単位で切り上げて課金されます。課金はアップグレードからソケットが閉じるまで、オーディオが流れているかどうかに関係なく継続します。

制限

セッションが時間制限に達した場合、またはクレジットが不足した場合、接続は close フレームなしで閉じることがあります(多くの場合、close コード 1006 として現れます)。チャージした後にのみ再接続するか、より長い時間が必要な場合は新しいセッションを開始してください。

エラー

アップグレード前

Router が接続を拒否した場合、プロトコルを切り替えずに HTTP ステータスと JSON ボディで応答します。
判定には code を使用してください。detail は人向けの説明です。

アップグレード後

その他のクローズは fal または xAI によるものです。イベントにリンクされている各社のドキュメントを参照してください。

次のステップ

  • 課金: Router の課金方法と使用量の照合方法について説明します。
  • エラーとリトライ: 他の Router 呼び出しが返すエラーの分類について説明します。
  • 制限事項: リクエストレートやその他の制限について説明します。