> ## Documentation Index
> Fetch the complete documentation index at: https://docs.openrtc.tech/llms.txt
> Use this file to discover all available pages before exploring further.

# OpenRTC

> livekit-agents on steroids. Host all your agents in one worker, with hot reload, live introspection, per-tenant isolation, and zero-downtime deploys. Your Agent code does not change.

**OpenRTC is livekit-agents with the operational parts filled in.** Keep writing
standard `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.**

<CardGroup cols={2}>
  <Card title="Coming from livekit-agents?" icon="arrow-right-arrow-left" href="/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.
  </Card>

  <Card title="Quickstart" icon="rocket" href="/getting-started">
    Install OpenRTC and run two agents through one worker in a few minutes.
  </Card>
</CardGroup>

## What changes (and what doesn't)

|                       | livekit-agents                | OpenRTC                                |
| --------------------- | ----------------------------- | -------------------------------------- |
| **Your `Agent` code** | standard subclasses           | **unchanged**                          |
| **Workers**           | one process per agent         | one worker hosts every agent           |
| **Prewarm**           | reloads per process           | loaded once, shared                    |
| **Scaling**           | \~3 GB per idle worker        | 50+ concurrent sessions in one process |
| **Shipping a change** | restart, drop in-flight calls | hot reload, no dropped calls           |

## What you get on top

<CardGroup cols={2}>
  <Card title="One worker, many agents" icon="layer-group" href="/coming-from-livekit-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.
  </Card>

  <Card title="Coroutine density" icon="bolt" href="/benchmarks/density-v0.1">
    Sessions run as `asyncio` tasks in one loop, 50+ concurrent, sharing one
    Silero VAD and turn detector. Process isolation is one flag away.
  </Card>

  <Card title="Smart routing" icon="route" href="/concepts/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.
  </Card>

  <Card title="Hot reload" icon="arrows-rotate" href="/concepts/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.
  </Card>

  <Card title="Live introspection" icon="gauge-high" href="/concepts/session-introspection">
    `openrtc top` gives an htop-style view of per-session memory, CPU, and
    event-loop blocks inside the shared worker.
  </Card>

  <Card title="Multi-tenancy" icon="building" href="/concepts/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.
  </Card>

  <Card title="Zero-downtime deploys" icon="tower-broadcast" href="/operations/deployments">
    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.
  </Card>

  <Card title="How it works" icon="sitemap" href="/concepts/architecture">
    The universal entrypoint, coroutine density, and shared prewarm under the
    hood, when you want the details.
  </Card>
</CardGroup>

<Note>
  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.
</Note>
