170 lines
5.7 KiB
Markdown
170 lines
5.7 KiB
Markdown
# Baseten plugin for LiveKit Agents
|
||
|
||
Support for [Baseten](https://baseten.co/)-hosted models in LiveKit Agents, including **STT** (Speech-to-Text), **TTS** (Text-to-Speech), and **LLM** (Large Language Model) integrations.
|
||
|
||
## Installation
|
||
|
||
```bash
|
||
pip install livekit-plugins-baseten
|
||
```
|
||
|
||
## Pre-requisites
|
||
|
||
You'll need an API key from Baseten. It can be set as an environment variable: `BASETEN_API_KEY`
|
||
|
||
You also need to deploy a model to Baseten and will need your model endpoint to configure the plugin.
|
||
|
||
## STT (Speech-to-Text)
|
||
|
||
The STT plugin connects to Baseten's [Whisper Streaming](https://docs.baseten.co/reference/inference-api/predict-endpoints/streaming-transcription-api) WebSocket endpoint for real-time transcription. It works with both **truss** and **chain** deployments.
|
||
|
||
### Recommended model
|
||
|
||
[Whisper v3 Turbo – WebSocket](https://www.baseten.co/library/whisper-streaming-large-v3/)
|
||
|
||
### Endpoint URL formats
|
||
|
||
| Deployment type | URL pattern |
|
||
|---|---|
|
||
| **Truss** | `wss://model-{model_id}.api.baseten.co/environments/production/websocket` |
|
||
| **Chain** | `wss://chain-{chain_id}.api.baseten.co/environments/production/websocket` |
|
||
|
||
### Basic usage
|
||
|
||
You can specify the endpoint in three ways:
|
||
|
||
```python
|
||
from livekit.plugins import baseten
|
||
|
||
# 1. Using a truss model ID (recommended for truss deployments)
|
||
stt = baseten.STT(
|
||
api_key="your-baseten-api-key", # or set BASETEN_API_KEY env var
|
||
model_id="your-model-id",
|
||
language="en",
|
||
)
|
||
|
||
# 2. Using a chain ID (recommended for chain deployments)
|
||
stt = baseten.STT(
|
||
api_key="your-baseten-api-key",
|
||
chain_id="your-chain-id",
|
||
language="en",
|
||
)
|
||
|
||
# 3. Using a full endpoint URL (for custom routing or deployment URLs)
|
||
stt = baseten.STT(
|
||
api_key="your-baseten-api-key",
|
||
model_endpoint="wss://model-{model_id}.api.baseten.co/environments/production/websocket",
|
||
language="en",
|
||
)
|
||
```
|
||
|
||
### Configuration options
|
||
|
||
| Parameter | Default | Description |
|
||
|---|---|---|
|
||
| `api_key` | `BASETEN_API_KEY` env var | Baseten API key |
|
||
| `model_endpoint` | `BASETEN_MODEL_ENDPOINT` env var | Full WebSocket URL (takes priority over `model_id`/`chain_id`) |
|
||
| `model_id` | — | Baseten truss model ID; auto-constructs the endpoint URL |
|
||
| `chain_id` | — | Baseten chain ID; auto-constructs the endpoint URL |
|
||
| `language` | `"en"` | BCP-47 language code (use `"auto"` for auto-detection) |
|
||
| `encoding` | `"pcm_s16le"` | Audio encoding (`pcm_s16le` or `pcm_mulaw`) |
|
||
| `sample_rate` | `16000` | Audio sample rate in Hz |
|
||
| `enable_partial_transcripts` | `True` | Emit interim transcripts while the speaker is talking |
|
||
| `partial_transcript_interval_s` | `1.0` | Interval (seconds) between partial transcript updates |
|
||
| `final_transcript_max_duration_s` | `30` | Max seconds of audio before forcing a final transcript |
|
||
| `show_word_timestamps` | `True` | Include word-level timestamps in results |
|
||
| `vad_threshold` | `0.5` | Server-side VAD speech probability threshold (0.0–1.0) |
|
||
| `vad_min_silence_duration_ms` | `300` | Minimum silence (ms) to mark end of speech |
|
||
| `vad_speech_pad_ms` | `30` | Padding (ms) added around detected speech |
|
||
|
||
### Full voice pipeline example
|
||
|
||
```python
|
||
import os
|
||
from livekit import agents
|
||
from livekit.agents import AgentSession, Agent, RoomInputOptions, inference
|
||
from livekit.plugins import baseten, openai, noise_cancellation
|
||
from livekit.agents.inference import TurnDetector
|
||
|
||
BASETEN_API_KEY = os.getenv("BASETEN_API_KEY")
|
||
whisper_model_id = "your-whisper-model-id" # or use chain_id for chain deployments
|
||
orpheus_model_id = "your-orpheus-model-id"
|
||
|
||
|
||
class Assistant(Agent):
|
||
def __init__(self) -> None:
|
||
super().__init__(instructions="You are a helpful voice AI assistant.")
|
||
|
||
|
||
async def entrypoint(ctx: agents.JobContext):
|
||
session = AgentSession(
|
||
stt=baseten.STT(
|
||
api_key=BASETEN_API_KEY,
|
||
model_id=whisper_model_id, # or chain_id="your-chain-id"
|
||
language="en",
|
||
enable_partial_transcripts=True,
|
||
),
|
||
llm=openai.LLM(
|
||
api_key=BASETEN_API_KEY,
|
||
base_url="https://inference.baseten.co/v1",
|
||
model="openai/gpt-oss-120b",
|
||
),
|
||
tts=baseten.TTS(
|
||
api_key=BASETEN_API_KEY,
|
||
model_endpoint=(
|
||
f"https://model-{orpheus_model_id}"
|
||
".api.baseten.co/environments/production/predict"
|
||
),
|
||
),
|
||
vad=inference.VAD(),
|
||
turn_detection=TurnDetector(),
|
||
)
|
||
|
||
await session.start(
|
||
room=ctx.room,
|
||
agent=Assistant(),
|
||
room_input_options=RoomInputOptions(
|
||
noise_cancellation=noise_cancellation.BVC(),
|
||
),
|
||
)
|
||
|
||
await session.generate_reply(
|
||
instructions="Greet the user and offer your assistance."
|
||
)
|
||
|
||
|
||
if __name__ == "__main__":
|
||
agents.cli.run_app(agents.WorkerOptions(entrypoint_fnc=entrypoint))
|
||
```
|
||
|
||
## TTS (Text-to-Speech)
|
||
|
||
The TTS plugin calls Baseten-hosted TTS models (e.g. [Orpheus 3B](https://www.baseten.co/library/orpheus-tts/)) over HTTP.
|
||
|
||
```python
|
||
tts = baseten.TTS(
|
||
api_key="your-baseten-api-key",
|
||
model_endpoint="https://model-{model_id}.api.baseten.co/environments/production/predict",
|
||
voice="tara",
|
||
language="en",
|
||
)
|
||
```
|
||
|
||
## LLM (Large Language Model)
|
||
|
||
The LLM plugin wraps Baseten's OpenAI-compatible inference endpoint.
|
||
|
||
```python
|
||
llm = baseten.LLM(
|
||
api_key="your-baseten-api-key",
|
||
model="openai/gpt-oss-120b",
|
||
)
|
||
```
|
||
|
||
## Documentation
|
||
|
||
- [LiveKit STT integration guide](https://docs.livekit.io/agents/integrations/stt/baseten/)
|
||
- [LiveKit TTS integration guide](https://docs.livekit.io/agents/integrations/tts/baseten/)
|
||
- [Baseten Whisper Streaming docs](https://docs.baseten.co/reference/inference-api/predict-endpoints/streaming-transcription-api)
|
||
- [Baseten Model Library](https://www.baseten.co/library/)
|