← Back to Plugins
Voice

Video Call

abhishekloiwal By abhishekloiwal 👁 60 views ▲ 0 votes

Video call plugin for OpenClaw via Tavus CVI β€” face-to-face AI video conversations

GitHub

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

Loading comments...