Compare models
More ▾
Essence 2 renders a photoreal person and Expression 2 any character, each from one portrait. Where each model renders, which to pick, and how an avatar is created.
The avatar renders in the bitHuman cloud, and the conversation runs on bitHuman's servers.
Every model reads the same .imx avatar file and has the same shape: push audio in, take lip-synced frames out. The same agent works on every platform that runs its model.
The models
- Essence 2A photoreal person from one portrait. Sample avatar:
sofia-ramirez.Renders on the devicebitHuman cloud - Expression 2Any character from one portrait. Sample avatar:
wise-pup.Renders on the devicebitHuman cloud
Essence 2 Max is available on the Enterprise plan only. Contact sales to enable it.
Essence 1 and Expression 1 are the first generation. They stay supported, and nothing changes for agents that use them.
Which should I choose?
- A photorealistic person: Essence 2.
- A stylized or non-human character, or a whole generated scene: Expression 2.
- Not sure: create with
model: "auto". A photorealistic person routes to Essence 2, anything else to Expression 2. - On a phone, a Mac or in a browser: Essence 2 or Expression 2.
- Maintaining a first-generation agent: keep it. Essence 1 runs on your own CPU; Expression 1 runs in the bitHuman cloud.
Where each model runs
Each place links to the page that sets it up.
| Where | Essence 2 | Expression 2 | Essence 1 | Expression 1 |
|---|---|---|---|---|
| iPhone and iPad | Yes Swift package, Essence2Kit (iOS 26) | Yes Swift package, Expression2 | — | — |
| Mac | Yes Swift package (macOS 26, M3 or newer), CLI, Python | Yes Swift package (macOS 13), CLI, Python | Yes CLI ( run), Python | — |
| Android | Yesessence2-android | Yesexpression2-android | — | — |
| Linux, no GPU | Yes CLI, Python | Yes CLI, Python | Yes CLI ( run), Python | — |
| Browser (WebGPU) | Yesrender=local, for identities with a browser build | Yesrender=local | Yesrender=local | — |
| Your servers | Yes CLI, Python, LiveKit plugin | Yes CLI, Python, LiveKit plugin | Yes CLI ( run), Python | — |
| bitHuman cloud | Yes web embed, REST API, LiveKit | Yes web embed, REST API, LiveKit | Yes web embed, REST API, LiveKit | Yes web embed, REST API, LiveKit |
| Fully offline | Not yet Coming later | Not yet Coming later | Yes Linux x86_64 and ARM64, bitHuman 2.11.16 or later; Business & Enterprise | — |
Fully offline is for Business and Enterprise clients, arranged through sales (Fully offline).
Rendering on your own hardware, every place but the bitHuman cloud, bills at the self-hosted rate (pricing). How fast each model renders on each device: Performance.
How creation works
You create an agent once, with POST /v1/agent/generate or in the bitHuman app, and serve it anywhere its model runs.
- The input is one portrait image. Essence 2 generates its identity video from it; Expression 2 trains straight from the photo. An uploaded image is treated as a reference and regenerated to a standard framing.
- Creation happens in the bitHuman cloud; the finished avatar model then runs on your devices.
- Both second-generation models train on create. Allow about 2 to 2.5 hours, and poll
GET /v1/agent/status/{agent_id}until the status isreadyorfailed(successis not terminal). - Essence 2 needs a photorealistic human subject. A stylized input is refused with
422 MODEL_SUBJECT_MISMATCHbefore anything is billed;autoroutes it to Expression 2 instead. - Always send
model. An omittedmodelcreates an Expression 1 agent; sendessence-2,expression-2orauto. - An existing agent can gain a model with
POST /v1/agent/{code}/models.
What creation costs is on pricing; request fields and failure modes are on the Agents API.
Naming & migration
This is the one place the historical names are documented. Every other page uses the four product names. Deprecating a word does not rename a wire format, so some legacy names are still strings you read or type:
| Legacy name you may meet | Where | What it means | Do you type it? |
|---|---|---|---|
essence, expression | older ?model= links and request bodies | Essence 1, Expression 1 | No — write essence-1 / expression-1 |
essence2-light | the Engine: line from bithuman open — a legacy engine value | Essence 2 | No — read the Family: line |
essence-2-light | the retired tier name (the old Light tier) | Essence 2 | No — a request naming it gets a 400; write essence-2 |
elevate, essence-2-quality | retired names of the premium tier, now Essence 2 Max (Enterprise plan only) | a separate tier, not Essence 2 | No — a request naming them gets a 400 |
embody | a retired request spelling | Expression 2 | No — a request naming it gets a 400 naming expression-2 |
.lebundle.imx, .avatar | older file extensions | an Essence 2 or Expression 2 model file | Only if you already have one; it opens as-is |
[embody] | the legacy prefix on log lines of the Apple Expression2 engine | Expression 2 | Grep your logs for it |
BITHUMAN_EMBODY_DIR, EMBODY_DEBUG_FAIL_PREDICT | legacy variables the Apple Expression2 engine still reads beside their EXPRESSION2_ twins | Expression 2 | No — set BITHUMAN_EXPRESSION2_DIR |
libelevate, libelevate-android | legacy library names | Essence 2 | No — the Android coordinate is ai.bithuman:essence2-android |
libelevate-web | the legacy path of the in-browser runtime | Essence 2 in a browser | No — embed with https://www.bithuman.ai/embed/<CODE> |
bithuman.tessera_offline, OfflineTesseraRenderer, TesseraOfflineError | legacy Python module and class names, still importable | the Essence 2 MP4 route | No — write bithuman.offline, OfflineRenderer, render_offline, OfflineRenderError |
BITHUMAN_TESSERA_DIRECTOR and the other BITHUMAN_TESSERA_* variables | legacy environment variables, still read | Essence 2 engine settings | No — the defaults are the fast path |
bithuman[tessera], bithuman[offline] | legacy pip extras, removed from the wheel in 2.11.6 | nothing — pip warns and installs the base wheel | No — pip install bithuman |
Saved links keep working: essence-2-light-gpu / essence-2-light-cpu still pin
their tiers, links carrying essence-2-light or essence-2-light-ane route to
the Essence 2 default chain, and the older essence-2-ane / expression-2-ane
spellings of the Apple tier stay accepted. A link carrying the retired
?model=essence-2-quality falls back to the agent’s stored model.
One more naming point: the cloud’s Apple tier is called Apple, not “ANE”. It is the whole Apple silicon target, not one accelerator inside it.