リアルタイム動画理解
MOSS-VL-Realtimeを使用して、1本のWebSocket接続でJPEG、PNG、またはWebPの画像フレームを継続的に送信し、同じセッション内で質問して増分テキストの回答を受け取ります。カメラや画面などのリアルタイム映像を理解するシナリオに適しています。
/v1/realtimemoss-vl-realtime-1.0APIキーを作成
APIキー管理プラットフォームでキーを作成し、サーバー側の環境変数でのみ使用してください。
環境変数 MOSS_API_KEY=<your_api_key_here>接続と認証
サーバー側のWebSocketクライアントでAPIに接続します。クエリパラメータでモデルを指定し、ハンドシェイクのリクエストヘッダーでAPIキーを渡します。
フィールド型必須説明モデルIDです。moss-vl-realtime-1.0を使用します。スナップショットを固定する場合は、moss-vl-realtime-1.0-2026-09-09を使用できます。WebSocket接続URLのクエリパラメータに指定します。
Bearer
<API Key>。WebSocketハンドシェイクのリクエストヘッダーにのみ指定できます。接続URL wss://api.mosi.cn/v1/realtime?model=moss-vl-realtime-1.0 Authorization: Bearer $MOSS_API_KEYセッションを設定
接続に成功したら、まず
session.createdを受信し、次にsession.configureを1回送信します。サーバーからsession.configuredとsession.readyが返されるのを待ってから、映像や質問を送信できます。フィールド型必須説明session.configureで固定です。
初期のユーザープロンプトです。デフォルトは空文字列です。
新しい入力のたびにリセットされる生成枠です。デフォルトは4096で、セッション全体の出力上限ではありません。
session.usage観測イベントを送信するかどうかです。デフォルトはfalseで、最終的な使用量の返却には影響しません。
session.configure { "type": "session.configure", "prompt": "画面を観察し続けて、私の質問に答えてください。", "max_new_tokens": 128, "include_usage": false }リアルタイム映像を送信
カメラや画面の映像を画像フレームに変換します。まず1フレームを送信して素早く疎通を確認し、継続的な観察が必要な場合は、同じ手順で後続のフレームを送信し続けます。各フレームでは、まず
input.frameメタデータを送信し、input.frame.readyを受信したら画像のバイナリを送信し、input.frame.acceptedを受信してから次のフレームを送信します。映像を送信するだけでは回答は自動生成されません。質問は次のステップで別途送信します。フィールド型必須説明input.frameで固定です。
画像フレームと質問で共有する、0から始まる連続したシーケンス番号です。
映像のキャプチャ時刻で、単位は秒です。それまでに受け付けられたフレームのタイムスタンプより前の値にすることはできません。
image/jpeg、image/png、またはimage/webpを指定し、実際のエンコードと一致させる必要があります。
input.frame · JSONメタデータ { "type": "input.frame", "seq_no": 0, "timestamp": 0.0, "mime_type": "image/jpeg" }そのフレームの
input.frame.readyを受信したら、JPEGファイルのバイナリ(バイト列)全体を送信します。画像をJSON、Base64、またはmultipartに入れることはできません。画像が受け付けられたら、次のフレームを送信することも、次のステップに進んで質問することもできます。質問を送信
映像フレームの送信が完了したら、
input.promptを別途送信して質問します。質問に画像を再度添付する必要はなく、サーバーは受信済みのリアルタイム映像に基づいて回答を生成します。final=falseの質問自体は回答をトリガーしません。質問後も前のステップの手順で映像フレームを送信し続ける必要があり、回答は後続のフレームが届いてから出力されます。フィールド型必須説明input.promptで固定です。
映像フレームに続く、連続した次のシーケンス番号を使用します。
空でない質問テキストです。
デフォルトはfalseです。最後の質問ではtrueに設定してセッションを終了できます。
input.prompt { "type": "input.prompt", "seq_no": 1, "prompt": "画面の細部を説明してください。", "final": false }質問後も次のフレームを送信し続けます。番号は連続した
seq_noを引き継ぎ、手順は前のステップと同じです。この例では質問後にもう1フレームを送信します。通常、モデルはこのフレームを処理した後に回答の出力を開始します。それでも出力がない場合は、フレームの送信を続けてください。input.frame · 質問後の次のフレーム { "type": "input.frame", "seq_no": 2, "timestamp": 1.0, "mime_type": "image/jpeg" }回答の受信と表示
サーバーイベントを継続的に受信し、
response.text.deltaのdeltaを順番に連結します。response_idで回答のセグメントを区別します。入力の確認を待っている間も、テキスト、エラー、クローズのイベントを処理する必要があります。サーバーイベント {"type":"response.text.delta","delta":"画面に車が1台あります。","response_id":"resp_xxx","response_seq":0} {"type":"response.done","response_id":"resp_xxx","response_seq":0,"finish_reason":"stop"}セッションを終了
さらに質問を続ける場合は、次のシーケンス番号を引き続き使用できます。終了する準備ができたら、最後の
input.promptをfinal=trueに設定し、session.doneを受信するまでイベントの受信を続けます。途中で終了する場合は、session.abortを送信できます。これら2つの終了方法は、いずれか一方を使用してください。最後の入力 { "type": "input.prompt", "seq_no": 3, "prompt": "今見た内容を要約してください。", "final": true }途中で終了 { "type": "session.abort" }成功を確認
この例の質問について、映像フレームを追加送信した後に空でないテキストを受信して連結し、最後に
reason=completedのsession.doneを受信したことを確認します。モデルは一部の映像や質問に対して、正常な動作として何も出力しないことがあるため、テキストがないたびに呼び出しの失敗と判断しないでください。最初から最後までテキストがない場合は、まず質問後に映像フレームを送信し続けたかどうかを確認してください。