Anva for LiveKit Agents

Give your LiveKit agent a face.

You already have a voice agent that listens, thinks and speaks. Anva joins the same room as an avatar participant and says your agent's words with the lips in time — no change to your STT, LLM or TTS.

Two lines in the pipeline you already have

pip install livekit-plugins-anva

A LiveKit agent with an Anva avatar
from livekit import agents
from livekit.agents import Agent, AgentSession
from livekit.plugins import anva, deepgram, openai, silero

async def entrypoint(ctx: agents.JobContext):
    session = AgentSession(
        stt=deepgram.STT(), llm=openai.LLM(), tts=openai.TTS(), vad=silero.VAD.load(),
    )
    avatar = anva.AvatarSession(avatar_id="av_...")   # or preset_id="..."
    await avatar.start(session, room=ctx.room)
    await session.start(agent=Agent(instructions="You are a friendly guide."), room=ctx.room)

How it works

  1. Anva joins your room. start() mints a token for the avatar participant and asks Anva to connect. It returns once the avatar is in the room with its video and audio published.
  2. Your agent keeps its own voice. The agent's audio is routed to the avatar over the room's data stream instead of straight to the room, so the face and the voice arrive together, in sync.
  3. Interruptions already work. Barge-in and playback receipts use LiveKit’s standard lk.clear_buffer, lk.playback_started and lk.playback_finished RPCs. Nothing to wire up.

Common questions

Do I have to change my STT, LLM or TTS?
No. Anva does not replace any part of your pipeline. It receives the audio your agent already produces and returns a face that speaks it.
Which LiveKit deployment does this work with?
Any of them. Anva connects to the room with a token you mint, so LiveKit Cloud and self-hosted LiveKit both work. You keep your own LiveKit account.
What does my front end have to do?
Nothing special. It sees a second agent participant, and LiveKit's components pick up the avatar's tracks automatically — it is the participant whose lk.publish_on_behalf attribute is your agent's identity.
How is it billed?
At the Avatar Only rate, per connected minute, on the Developer plan or above. A join that fails costs nothing.

Give it a face

The full reference — session options, webhooks, the events socket and every error code — is in the documentation.