livekit.agents.Agent subclasses. Register them on one AgentPool
instead of one worker per agent, and host them all in a single process: shared
prewarm loads once, every call still gets its own AgentSession, and you never
inherit an OpenRTC base class.
The payoff is the stuff livekit-agents leaves to you: 50+ sessions per worker,
hot reload, live introspection, per-tenant isolation, and zero-downtime deploys.
Coming from livekit-agents?
See the before/after: what you delete, what you keep, and what you gain.
Start here if you already run livekit-agents.
Quickstart
Install OpenRTC and run two agents through one worker in a few minutes.
What changes (and what doesn’t)
What you get on top
One worker, many agents
Register any number of standard
Agent subclasses on one pool. No base class,
no rewrite: your tools and node hooks stay exactly as written.Coroutine density
Sessions run as
asyncio tasks in one loop, 50+ concurrent, sharing one
Silero VAD and turn detector. Process isolation is one flag away.Smart routing
Every call resolves to one agent by job metadata, room metadata, or room-name
prefix. Precedence is explicit and a typo never falls through silently.
Hot reload
Edit an agent file and live calls swap to the new code on their next turn,
with zero dropped audio. A bad save rolls back on its own.
Live introspection
openrtc top gives an htop-style view of per-session memory, CPU, and
event-loop blocks inside the shared worker.Multi-tenancy
Give every client its own provider keys, session caps, and blast-radius
circuit breaker, all in one pool. One noisy tenant never touches the others.
Zero-downtime deploys
Blue-green drain: the new version takes new calls while the old drains its
in-flight calls to hangup, then exits. No live call is ever dropped.
How it works
The universal entrypoint, coroutine density, and shared prewarm under the
hood, when you want the details.
OpenRTC owns the runtime lane: density, routing, hot reload, introspection,
per-tenant isolation, and deploys. For cost, pipeline latency, and quality
metrics, it emits
agent_name and metadata["tenant"] on every session for
voicegateway to consume, and does not duplicate that lane.
