Metadata-Version: 2.4
Name: zrt
Version: 0.1.2
Summary: Build real-time AI voice agents in Python. Zero Runtime runs the speech-to-speech pipeline (STT, LLM, TTS) for you.
Author-email: Zujo Tech Pvt Ltd <support@videosdk.live>
License-Expression: LicenseRef-Proprietary
Project-URL: Homepage, https://zeroruntime.ai/
Project-URL: Examples, https://github.com/ZeroRuntimeAI/zrt-python-sdk-examples
Keywords: voice-agents,voice-ai,ai-voice-agent,conversational-ai,voice-assistant,speech-to-speech,realtime-voice,voicebot,llm,stt,tts,speech-to-text,text-to-speech,telephony,sip,webrtc,zero-runtime
Classifier: Development Status :: 5 - Production/Stable
Classifier: Intended Audience :: Developers
Classifier: Operating System :: OS Independent
Classifier: Programming Language :: Python :: 3
Classifier: Programming Language :: Python :: 3.10
Classifier: Programming Language :: Python :: 3.11
Classifier: Programming Language :: Python :: 3.12
Classifier: Programming Language :: Python :: 3.13
Classifier: Programming Language :: Python :: 3.14
Classifier: Topic :: Multimedia :: Sound/Audio :: Speech
Classifier: Topic :: Scientific/Engineering :: Artificial Intelligence
Classifier: Topic :: Software Development :: Libraries :: Python Modules
Classifier: Typing :: Typed
Requires-Python: >=3.10
Description-Content-Type: text/markdown
License-File: LICENSE
Requires-Dist: grpcio>=1.81.0
Requires-Dist: protobuf>=7.35.0
Requires-Dist: aiohttp>=3.9.0
Requires-Dist: python-dotenv
Provides-Extra: vision
Requires-Dist: Pillow>=10.0; extra == "vision"
Provides-Extra: dev
Requires-Dist: pytest>=8.4; extra == "dev"
Requires-Dist: pytest-asyncio>=0.24; extra == "dev"
Requires-Dist: grpcio-tools>=1.81.0; extra == "dev"
Requires-Dist: build>=1.2; extra == "dev"
Requires-Dist: twine>=6.0; extra == "dev"
Requires-Dist: ruff>=0.6; extra == "dev"
Dynamic: license-file

# ZRT: Zero Runtime Python SDK

[![PyPI version](https://img.shields.io/pypi/v/zrt.svg)](https://pypi.org/project/zrt/)
[![Python versions](https://img.shields.io/pypi/pyversions/zrt.svg)](https://pypi.org/project/zrt/)

**Serverless voice AI agents for Python.** Write the agent in real Python with your own
STT, LLM, and TTS providers. **Zero Runtime** runs the live speech‑to‑speech pipeline
(turn detection, denoising, interruptions) at low latency in the cloud.

> **You write the agent. We run the runtime.** No media servers, no GPUs, no autoscaling.

|                                    | Self‑hosted frameworks | No‑code platforms | **Zero Runtime**  |
| ---------------------------------- | :--------------------: | :---------------: | :---------------: |
| Real Python + custom tools         |           ✅           |  ❌ (dashboard)   |        ✅         |
| Run media servers / GPUs / scaling |  ❌ _you operate it_   |    ✅ managed     | ✅ **serverless** |
| Bring any provider + your own keys |           ✅           |      limited      |        ✅         |

## Install

```bash
pip install zrt
```

Requires **Python 3.10+**.

## Quickstart

Get your auth token from [app.zeroruntime.ai](https://app.zeroruntime.ai).

```bash
export ZRT_AUTH_TOKEN=<your-token>
export DEEPGRAM_API_KEY=<key>    # speech-to-text
export GOOGLE_API_KEY=<key>      # LLM (Gemini)
export CARTESIA_API_KEY=<key>    # text-to-speech
```

```python
# agent.py
import zrt
from zrt import Agent, Pipeline, Room, function_tool
from zrt.plugins import CartesiaTTS, DeepgramSTT, GoogleLLM, SileroVAD, TurnDetector

AGENT_ID = "assistant"

class Assistant(Agent):
    def __init__(self) -> None:
        super().__init__(
            name="Assistant",
            agent_id=AGENT_ID,
            instructions=(
                "You are a friendly voice assistant. Keep replies short and natural. "
                "When asked about the weather, call the get_weather tool."
            ),
            pipeline=Pipeline(
                stt=DeepgramSTT(model="nova-2-conversationalai"),
                llm=GoogleLLM(model="gemini-3-flash-preview", thinking_budget=0),
                tts=CartesiaTTS(model="sonic-3.5"),
                vad=SileroVAD(),
                turn_detector=TurnDetector(model="echo-large"),
            ),
        )

    async def on_enter(self) -> None:
        await self.session.say("Hi! I'm your assistant. Ask me about the weather in any city.")

    async def on_exit(self) -> None:
        await self.session.say("Thanks for calling. Goodbye!")

    @function_tool
    async def get_weather(self, city: str) -> dict:
        """Get the current weather for a city.

        Args:
            city: Name of the city to look up.
        """
        return {"city": city, "temperature_c": 28, "condition": "Sunny", "humidity": 55}


def invoke_agent() -> None:
    """Start a session once the agent is registered (fired by serve's on_ready)."""
    zrt.invoke(AGENT_ID, room=Room(playground=True))

if __name__ == "__main__":
    zrt.serve(Assistant, on_ready=invoke_agent)

```

```bash
python agent.py
```

`serve()` registers the agent under its `agent_id` and serves a session to each caller;
once it's ready, `on_ready` fires `invoke()` to start a playground session and print a
link you can open to talk to it.

**Pass your `Agent` class** (or any callable that returns a fresh agent) — recommended.
`serve()` then builds a new agent + pipeline .

## Concepts

| Building block            | What it is                                                                            |
| ------------------------- | ------------------------------------------------------------------------------------- |
| **`Agent`**               | Your behavior: instructions, tools, and what it says on enter/exit.                   |
| **`Pipeline`**            | STT (hear) → LLM (think) → TTS (speak), plus optional VAD, turn detection, denoising. |
| **`serve(Agent)`**        | Register your agent (pass the class) and serve a session to each caller.              |
| **`invoke(agent_id, …)`** | Start a session on demand (e.g. an outbound call).                                    |

Add a `@function_tool` method to your agent and the LLM calls it (with your typed
args) whenever it needs to. Methods are auto-registered; for tools defined outside
the agent, pass them via `tools=[...]`.

## Providers

Mix and match. Swap any stage in a line:

- **STT:** Deepgram, AssemblyAI, Google, Azure, Sarvam, and more.
- **LLM:** OpenAI, Google Gemini, Anthropic Claude, Groq, Cerebras, xAI Grok, Sarvam, and more.
- **TTS:** Cartesia, ElevenLabs, Google, Azure, Deepgram, and more.
- **Realtime (speech‑to‑speech):** OpenAI Realtime, Gemini Live, and more.
- **Turn detection:** Namo · **VAD:** Silero · **Denoise:** RNNoise

## Resources

- **Docs:** https://docs.zeroruntime.ai/
- **Examples:** https://github.com/ZeroRuntimeAI/zrt-python-sdk-examples
- **Dashboard & tokens:** https://app.zeroruntime.ai
- **Support:** support@zeroruntime.ai

---

© 2026 Zujo Tech Pvt Ltd. All rights reserved.
