> ## 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

> Run multiple LiveKit voice agents in a single shared worker process.

Register multiple LiveKit agents in one process, route by metadata, and prewarm models once.

<CardGroup cols={2}>
  <Card title="Getting Started" icon="rocket" href="/getting-started">
    Install and run your first multi-agent worker in minutes.
  </Card>

  <Card title="Architecture" icon="sitemap" href="/concepts/architecture">
    Learn how coroutine mode, routing, and shared prewarm work.
  </Card>

  <Card title="AgentPool API" icon="code" href="/api/pool">
    Full reference for registration, routing, and session configuration.
  </Card>

  <Card title="CLI" icon="terminal" href="/cli">
    `openrtc dev`, `start`, `console`, `connect`, and JSONL metrics.
  </Card>
</CardGroup>

## Why OpenRTC?

| Problem                                   | OpenRTC                                                   |
| ----------------------------------------- | --------------------------------------------------------- |
| One worker process per agent class        | One worker hosts all your agents                          |
| VAD and turn detector load per subprocess | Loaded once, shared across every session                  |
| Hard-coded single-agent entrypoints       | Route by room metadata, job metadata, or room-name prefix |
| 3 GB per idle worker                      | 50+ concurrent sessions in a single process               |

## Features

**Coroutine-mode worker (v0.1):** Host 50+ concurrent sessions per process as
`asyncio` tasks instead of paying one subprocess per session. Cooperative
backpressure is routed back to LiveKit dispatch via `current_load`.

**Multi-agent routing:** Dispatch the right `Agent` implementation from a single
worker using room or job metadata. Priority order:

1. `ctx.job.metadata["agent"]`
2. `ctx.job.metadata["demo"]`
3. `ctx.job.room.metadata["agent"]` / `["demo"]`
4. Room name prefix (`support-call-123` routes to the `support` agent)
5. First registered agent (fallback)

**Shared prewarm:** Load VAD, turn detection, and other heavy dependencies once
for every session in the pool.

**LiveKit-native:** Built on `livekit-agents` with the same `dev`, `start`,
`console`, and `connect` workflows. Drop into `isolation="process"` for
per-subprocess isolation when you need it.
