{"_id":"@abhiloiwal/openclaw-video-call","name":"@abhiloiwal/openclaw-video-call","dist-tags":{"latest":"0.1.0"},"versions":{"0.1.0":{"name":"@abhiloiwal/openclaw-video-call","version":"0.1.0","description":"OpenClaw video-call plugin via Tavus CVI","type":"module","dependencies":{"@sinclair/typebox":"0.34.48","zod":"^4.3.6"},"openclaw":{"extensions":["./index.ts"]},"_id":"@abhiloiwal/openclaw-video-call@0.1.0","gitHead":"46c5932bc61515817d957638cca934c6e9b0498c","_nodeVersion":"24.2.0","_npmVersion":"11.3.0","dist":{"integrity":"sha512-t3HCQ55v54lvYHk78saPtRgsH3kplvWitos3AwOALBXm6UfjlXpCgAM3PMIp/MQvE4BDRvAonlY754aHB8SQVA==","shasum":"3add93415ab9830fc22fca69665d3e900aa0e308","tarball":"https://registry.npmjs.org/@abhiloiwal/openclaw-video-call/-/openclaw-video-call-0.1.0.tgz","fileCount":10,"unpackedSize":41830,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEYCIQD2qFELm/wKTVn+BaVrHsNw4mQzmEbEk6FwIhZvVukZCgIhAOhdy+54F0atHWeJQV+IrcUW/DatimW6gAVKckhKea6t"}]},"_npmUser":{"name":"abhiloiwal-personal","email":"loiwal.abhishek@gmail.com"},"directories":{},"maintainers":[{"name":"abhiloiwal-personal","email":"loiwal.abhishek@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/openclaw-video-call_0.1.0_1771021646555_0.12831673948331113"},"_hasShrinkwrap":false}},"time":{"created":"2026-02-13T22:27:26.435Z","0.1.0":"2026-02-13T22:27:26.701Z","modified":"2026-02-13T22:27:26.896Z"},"maintainers":[{"name":"abhiloiwal-personal","email":"loiwal.abhishek@gmail.com"}],"description":"OpenClaw video-call plugin via Tavus CVI","readme":"# @openclaw/video-call\n\nVideo call plugin for [OpenClaw](https://openclaw.ai) via [Tavus CVI](https://tavus.io) (Conversational Video Interface).\n\nStart 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.\n\n## Two Modes\n\n**Approach A — Tavus LLM (simple)**\nTavus runs its own LLM. OpenClaw passes conversational context when creating the call. No extra infrastructure needed.\n\n**Approach B — OpenClaw Brain (powerful)**\nTavus 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).\n\n## Install\n\n```bash\n# Copy to extensions directory\ncp -r video-call ~/.openclaw/extensions/\ncd ~/.openclaw/extensions/video-call\nnpm install\n\n# Restart gateway\nopenclaw gateway restart\n```\n\n## Configure\n\nAdd to `~/.openclaw/openclaw.json`:\n\n```json\n{\n  \"plugins\": {\n    \"entries\": {\n      \"video-call\": {\n        \"enabled\": true,\n        \"config\": {\n          \"tavusApiKey\": \"your-tavus-api-key\",\n          \"defaultPersonaId\": \"your-persona-id\",\n          \"defaultReplicaId\": \"your-replica-id\"\n        }\n      }\n    }\n  }\n}\n```\n\nThe API key can also be set via `TAVUS_API_KEY` environment variable.\n\n## Tavus Setup\n\n1. Create an account at [platform.tavus.io](https://platform.tavus.io)\n2. Create a Persona (defines behavior, LLM, voice settings)\n3. Pick a Replica (the video avatar)\n4. Copy the persona ID and replica ID into your config\n\n### For Approach B (BYO LLM)\n\n1. Enable chat completions on your gateway:\n```json\n{\n  \"gateway\": {\n    \"http\": {\n      \"endpoints\": {\n        \"chatCompletions\": { \"enabled\": true }\n      }\n    }\n  }\n}\n```\n\n2. Expose your gateway publicly (e.g., Tailscale Funnel):\n```bash\ntailscale funnel 18789\n```\n\n3. Create a Tavus Persona with Custom LLM:\n   - Model: `openclaw:main`\n   - Base URL: `https://your-tailscale-hostname.ts.net/v1`\n   - API Key: your gateway auth token\n\n## Usage\n\n### Agent Tool\nThe agent can start video calls via the `video_call` tool:\n\n| Action | Description |\n|--------|-------------|\n| `start_conversation` | Create a new video call (returns join URL) |\n| `end_conversation` | End an active call |\n| `get_status` | Check call status |\n| `get_transcript` | Retrieve conversation transcript |\n\n### CLI\n```bash\nopenclaw videocall start --context \"Discuss quarterly results\"\nopenclaw videocall start --persona <id> --replica <id> --greeting \"Hello!\"\nopenclaw videocall status --id <conversationId>\nopenclaw videocall transcript --id <conversationId>\nopenclaw videocall end --id <conversationId>\nopenclaw videocall list\n```\n\n### Gateway RPC\n```\nvideocall.start   { personaId?, replicaId?, context?, greeting?, name? }\nvideocall.end     { conversationId }\nvideocall.status  { conversationId }\nvideocall.transcript { conversationId }\n```\n\n## Configuration Reference\n\n| Field | Required | Description |\n|-------|----------|-------------|\n| `tavusApiKey` | Yes | Tavus API key (or `TAVUS_API_KEY` env) |\n| `defaultPersonaId` | Yes | Default Tavus persona ID |\n| `defaultReplicaId` | Yes | Default Tavus replica ID |\n| `gatewayPublicUrl` | No | Public gateway URL for BYO LLM mode |\n| `agentId` | No | OpenClaw agent ID (default: `main`) |\n| `defaults.maxCallDuration` | No | Max call seconds (default: 3600) |\n| `defaults.enableRecording` | No | Enable recording (default: false) |\n| `defaults.enableClosedCaptions` | No | Enable captions (default: true) |\n| `defaults.language` | No | Language (default: `english`) |\n| `store` | No | Path for conversation logs |\n\n## How It Works\n\n```\nUser asks agent for a video call\n  -> Agent calls video_call tool\n    -> Plugin creates Tavus conversation via API\n      -> Returns conversation URL\n        -> User clicks link, joins in browser\n          -> Tavus handles video/audio/avatar\n            -> (Approach B) Tavus calls OpenClaw for responses\n```\n\n## File Structure\n\n```\nvideo-call/\n├── package.json\n├── openclaw.plugin.json     # Plugin manifest + config schema\n├── index.ts                 # Plugin entry: tool, RPC, CLI, service registration\n└── src/\n    ├── config.ts            # Zod config validation\n    ├── tavus-client.ts      # Tavus API HTTP client\n    ├── manager.ts           # Conversation session manager\n    ├── store.ts             # JSONL persistence\n    ├── cli.ts               # CLI commands\n    └── types.ts             # TypeScript types\n```\n\n## License\n\nMIT\n","readmeFilename":"README.md","_rev":"1-3435cd82a7da7d6dc37f641edbbda809"}