@abhiloiwal/openclaw-video-call
v0.1.0
Published
OpenClaw video-call plugin via Tavus CVI
Readme
@openclaw/video-call
Video call plugin for OpenClaw via Tavus CVI (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
# Copy to extensions directory
cp -r video-call ~/.openclaw/extensions/
cd ~/.openclaw/extensions/video-call
npm install
# Restart gateway
openclaw gateway restartConfigure
Add to ~/.openclaw/openclaw.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
- Create an account at platform.tavus.io
- Create a Persona (defines behavior, LLM, voice settings)
- Pick a Replica (the video avatar)
- Copy the persona ID and replica ID into your config
For Approach B (BYO LLM)
- Enable chat completions on your gateway:
{
"gateway": {
"http": {
"endpoints": {
"chatCompletions": { "enabled": true }
}
}
}
}- Expose your gateway publicly (e.g., Tailscale Funnel):
tailscale funnel 18789- 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
- Model:
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
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 listGateway 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 responsesFile 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 typesLicense
MIT
