Voice
Video Call
Video call plugin for OpenClaw via Tavus CVI β face-to-face AI video conversations
Install
npm install
#
Configuration Example
{
"plugins": {
"entries": {
"video-call": {
"enabled": true,
"config": {
"tavusApiKey": "your-tavus-api-key",
"defaultPersonaId": "your-persona-id",
"defaultReplicaId": "your-replica-id"
}
}
}
}
}
README
# @openclaw/video-call
Video call plugin for [OpenClaw](https://openclaw.ai) via [Tavus CVI](https://tavus.io) (Conversational Video Interface).
Start face-to-face AI video conversations from any OpenClaw channel. The agent creates a video call URL, sends it to the user, and they join in the browser to talk with an AI-powered video replica.
## Two Modes
**Approach A β Tavus LLM (simple)**
Tavus runs its own LLM. OpenClaw passes conversational context when creating the call. No extra infrastructure needed.
**Approach B β OpenClaw Brain (powerful)**
Tavus calls back to OpenClaw's `/v1/chat/completions` endpoint as a BYO LLM. The video replica IS your OpenClaw agent β same memory, same tools, same session. Requires a publicly reachable gateway (Tailscale Funnel or ngrok).
## Install
```bash
# Copy to extensions directory
cp -r video-call ~/.openclaw/extensions/
cd ~/.openclaw/extensions/video-call
npm install
# Restart gateway
openclaw gateway restart
```
## Configure
Add to `~/.openclaw/openclaw.json`:
```json
{
"plugins": {
"entries": {
"video-call": {
"enabled": true,
"config": {
"tavusApiKey": "your-tavus-api-key",
"defaultPersonaId": "your-persona-id",
"defaultReplicaId": "your-replica-id"
}
}
}
}
}
```
The API key can also be set via `TAVUS_API_KEY` environment variable.
## Tavus Setup
1. Create an account at [platform.tavus.io](https://platform.tavus.io)
2. Create a Persona (defines behavior, LLM, voice settings)
3. Pick a Replica (the video avatar)
4. Copy the persona ID and replica ID into your config
### For Approach B (BYO LLM)
1. Enable chat completions on your gateway:
```json
{
"gateway": {
"http": {
"endpoints": {
"chatCompletions": { "enabled": true }
}
}
}
}
```
2. Expose your gateway publicly (e.g., Tailscale Funnel):
```bash
tailscale funnel 18789
```
3. Create a Tavus Persona with Custom LLM:
- Model: `openclaw:main`
- Base URL: `https://your-tailscale-hostname.ts.net/v1`
- API Key: your gateway auth token
## Usage
### Agent Tool
The agent can start video calls via the `video_call` tool:
| Action | Description |
|--------|-------------|
| `start_conversation` | Create a new video call (returns join URL) |
| `end_conversation` | End an active call |
| `get_status` | Check call status |
| `get_transcript` | Retrieve conversation transcript |
### CLI
```bash
openclaw videocall start --context "Discuss quarterly results"
openclaw videocall start --persona <id> --replica <id> --greeting "Hello!"
openclaw videocall status --id <conversationId>
openclaw videocall transcript --id <conversationId>
openclaw videocall end --id <conversationId>
openclaw videocall list
```
### Gateway RPC
```
videocall.start { personaId?, replicaId?, context?, greeting?, name? }
videocall.end { conversationId }
videocall.status { conversationId }
videocall.transcript { conversationId }
```
## Configuration Reference
| Field | Required | Description |
|-------|----------|-------------|
| `tavusApiKey` | Yes | Tavus API key (or `TAVUS_API_KEY` env) |
| `defaultPersonaId` | Yes | Default Tavus persona ID |
| `defaultReplicaId` | Yes | Default Tavus replica ID |
| `gatewayPublicUrl` | No | Public gateway URL for BYO LLM mode |
| `agentId` | No | OpenClaw agent ID (default: `main`) |
| `defaults.maxCallDuration` | No | Max call seconds (default: 3600) |
| `defaults.enableRecording` | No | Enable recording (default: false) |
| `defaults.enableClosedCaptions` | No | Enable captions (default: true) |
| `defaults.language` | No | Language (default: `english`) |
| `store` | No | Path for conversation logs |
## How It Works
```
User asks agent for a video call
-> Agent calls video_call tool
-> Plugin creates Tavus conversation via API
-> Returns conversation URL
-> User clicks link, joins in browser
-> Tavus handles video/audio/avatar
-> (Approach B) Tavus calls OpenClaw for responses
```
## File Structure
```
video-call/
βββ package.json
βββ openclaw.plugin.json # Plugin manifest + config schema
βββ index.ts # Plugin entry: tool, RPC, CLI, service registration
βββ src/
βββ config.ts # Zod config validation
βββ tavus-client.ts # Tavus API HTTP client
βββ manager.ts # Conversation session manager
βββ store.ts # JSONL persistence
βββ cli.ts # CLI commands
βββ types.ts # TypeScript types
```
## License
MIT
voice
Comments
Sign in to leave a comment