bithuman: cloud lane serves Expression 1 to an expression-2 agent (silent downgrade, billed as gen-1)

オープン
#7,077 コメント 1 件 リアクション 0 件 担当者 0 名 GitHub で見る

メンテナーはふだん 1 日以内に返信

まだ誰も着手していません。

評価

難易度
4/5
見積もり時間
3〜5日
初心者へのやさしさ
35/100
issue の種類
バグ
明瞭さ
おおむね明確
活発さ
静か
技術スタック
python

調査の方向性

Start by reading avatar.py around lines 326–350 and checking how the plugin maps its model option to the runtime-token request. Then investigate the reported GPU-lane behavior and whether the fix belongs in this repository or the BitHuman service. Done means expression-2 is served when available, or the GPU launcher fails closed rather than silently downgrading.

索引モデルが issue の本文から書いたものです。

説明

Summary

The bitHuman cloud lane behind livekit-plugins-bithuman (POST auth.api.bithuman.ai/v1/runtime-tokens/request) serves Expression 1 to an agent whose only built model is expression-2 — a silent downgrade, billed at the Expression-1 rate. The docs for this lane promise the opposite.

Expected

Per the LiveKit deployment guide:

a second-generation agent serves its own model automatically … no model= kwarg is needed

And per models-v2, expression-2 is served on every cloud tier (GPU / ANE / CPU) and through every delivery surface including the LiveKit plugin.

Actual

Agent A57CQP1723 (Pro account) is built as expression-2 (model_status.expression-2.state: "ready"; supported_models: ["essence-2-max", "expression-2"]). No gen-1 model is built on it at all. Same agent, same account, same day:

lane billing_type video track face
bitHuman embed viewer usage_expression_2_model_cloud 416x720 renders correctly
runtime-tokens (this plugin's endpoint) usage_expression_model_cloud 512x512 featureless smear

The agent's stylized (non-photoreal) portrait is only renderable by Expression 2, so on this lane the face is destroyed — and the session bills 4.0 cr/min for the older engine vs 3.81 for Expression 2 on the viewer lane.

Note the launcher asymmetry: mode: "cpu" correctly refuses the agent (503: "that launcher serves essence-1 models, and this agent's available model(s) are: essence-2-max, expression-2"), while mode: "gpu" silently substitutes Expression 1 instead of refusing or serving expression-2.

Repro

POST https://auth.api.bithuman.ai/v1/runtime-tokens/request
headers: api-secret: <key>
json: {"livekit_url": ..., "livekit_token": <agent-kind token>,
       "room_name": ..., "mode": "gpu", "agent_id": "A57CQP1723"}

Worker joins and publishes 512x512; the account ledger (GET /v2/{user_id}/runtime-sessions) records billing_type: "usage_expression_model_cloud".

Ruled out

  • Extra body fields (model, model_version, billing_type) return 200 and are ignored; mode accepts only gpu/cpu.
  • Plugin v1.7.1 exposes no gen-2 selector (model: Literal["expression","essence"] only flips mode).
  • The plugin's exact JWT attribute set on the worker token (api_secret + agent_id + lk.publish_on_behalf, avatar.py L326–350) — tested, no change.
  • The model itself is fine: POST /v1/video/generate with model: "expression-2" renders the same agent flawlessly.

Ask

Serve expression-2 on the runtime-tokens lane for agents that have it built (as documented), or expose a parameter that selects it — or at minimum make the gpu launcher fail closed like the cpu launcher does, instead of silently downgrading and billing for it.

Happy to share room names, timestamps and session ids privately. (cc @sgu-bithuman)

主要言語
Python
スター
14.6k
フォーク
3.9k
平均マージ
2日 7時間
マージ済み PR(30日)
224

環境構築

このプロジェクトには開発コンテナ、Dockerfile、コントリビューションガイドがありません。まず README を読み、一般的な手順ははじめてのコントリビューションガイドを参照してください。

はじめの一歩

  1. issue を最後まで読み、次にプロジェクトのコントリビューションガイドを読みます。
  2. 着手することを issue にコメントします — 二人が同じ作業をするのを防げます。
  3. リポジトリをフォークし、ブランチを切って変更します。
  4. issue 番号を参照したプルリクエストを送ります。

livekit/agents のほかの issue

livekit/agents の issue をすべて見る

似ている issue

Python の issue をもっと見る

新しい issue をメールで受け取る

初心者向けの GitHub issue を短くまとめたダイジェスト。