Install
openclaw skills install @bluecolumnconsulting-lgtm/voice-agent-memoryFull-stack voice agent with BlueColumn persistent memory. Make and receive phone calls with real-time transcription, automatic vector memory storage, and cross-call recall. Every call remembers who called, what they said, and what happened last time.
openclaw skills install @bluecolumnconsulting-lgtm/voice-agent-memoryGive your AI agent a phone number and a memory that never forgets.
This skill connects Twilio telephony → ElevenLabs/Deepgram voice engine → BlueColumn vector memory in one integrated pipeline. Every call is automatically transcribed, stored in BlueColumn, and recalled before the next call from that caller.
The existing skills in the ecosystem are fragmented:
| Skill | Does Voice Calls? | Has Vector Memory? | Auto-Recall on Answer? |
|---|---|---|---|
phone-voice | ✅ ElevenLabs + Twilio | ❌ Flat files only | ❌ |
bluecolumn-memory | ❌ | ✅ Text/docs/audio | ❌ |
meeting-memory | ❌ | ✅ Meeting transcripts | ❌ |
clawvoice (external) | ✅ Plugin | ❌ Sandbox files only | ❌ |
| voice-agent-memory 🆕 | ✅ | ✅ BlueColumn vectors | ✅ |
┌─────────────────────────┐
│ Twilio Phone # │
│ +1 (929) 828-8689 │
└──────────┬──────────────┘
│ SIP / Webhook
▼
┌─────────────────────────┐
│ ElevenLabs Agent (TTS) │
│ or Deepgram Voice Agt │
└──────────┬──────────────┘
│ /v1/chat/completions
▼
┌─────────────────────────┐
│ Voice Bridge Server │ ←── port 8013
│ (FastAPI + Claude) │
└──┬─────────────────┬────┘
│ │
┌──────────▼────┐ ┌───────▼──────────┐
│ BlueColumn │ │ Cost Tracking │
│ /agent-recall│ │ Transcript Logs │
│ /agent-store │ │ Call Analytics │
└───────────────┘ └──────────────────┘
CALL FLOW:
1. Phone rings → Twilio routes to ElevenLabs
2. ElevenLabs → Voice Bridge (port 8013) with caller ID
3. Bridge → BlueColumn recall: "what do we know about +12065550123?"
4. Bridge injects memory into Claude's system prompt
5. Claude responds → ElevenLabs TTS → Caller hears
6. After call → Bridge auto-stores transcript → BlueColumn
Each phone number gets its own memory namespace. When +12065550123 calls:
Every call transcript is automatically:
/agent-remember with caller phone as titlevoice-call, caller number, and dateOn inbound call, before the agent speaks:
Mid-call recall queries:
# Copy template
cp .env.example .env
# Edit with your keys
cd ~/.openclaw/workspace/skills/voice-agent-memory
pip install -r requirements.txt
# Or individually:
pip install fastapi uvicorn httpx anthropic python-dotenv
python3 bridge/server.py
# Starts on port 8013
# Endpoint: POST /v1/chat/completions
# If using existing tunnel:
cloudflared tunnel --url http://localhost:8013
# Or configure a permanent tunnel in Cloudflare dashboard
# Point a subdomain to localhost:8013
In ElevenLabs dashboard:
https://your-tunnel.ngrok.dev/v1/chat/completionsAuthorization: Bearer <your-bridge-token>In ElevenLabs agent settings → Phone section:
The bridge uses three BlueColumn API endpoints:
Base URL: https://xkjkwqbfvkswwdmbtndo.supabase.co/functions/v1
# Before agent speaks, query memory for this caller
POST /agent-recall
{
"q": "What do I know about caller +12065550123?"
}
# Response:
{
"answer": "Joe Pagano set up BlueColumn... prefers bullet points...",
"sources": [...] # With relevance scores
}
# Store the conversation summary
POST /agent-remember
{
"text": "Full transcript or summary of the call...",
"title": "Voice call - +12065550123 - 2026-06-08"
}
# Response:
{
"session_id": "sess_...",
"summary": "Discussed pricing plans...",
"action_items": ["Send proposal by Friday"]
}
# Agent saves an observation mid-conversation
POST /agent-note
{
"text": "Caller prefers email over phone for follow-up",
"tags": ["voice-call", "+12065550123", "preference"]
}
| Call # | Memory State | Experience |
|---|---|---|
| 1st call | No memory | "Hi, this is Leon from BlueColumn. How can I help you today?" |
| 2nd call | Recalls 1st call | "Welcome back, Joe! Last time we discussed your pricing concerns. Did you have a chance to review the plans?" |
| 3rd call+ | Rich history | "Hey Joe, good to hear from you again. I see you asked about the Developer plan last time — want to pick up where we left off?" |
The bridge server (bridge/server.py) handles:
/v1/chat/completions (OpenAI-compatible)Authorization headerBlueColumn also accepts audio files directly — useful for uploading call recordings post-hoc:
# Upload a recorded call for memory storage
curl -X POST https://xkjkwqbfvkswwdmbtndo.supabase.co/functions/v1/agent-remember \
-H "Authorization: Bearer bc_live_YOUR_KEY" \
-H "Content-Type: application/json" \
-d '{
"audio_url": "https://your-storage/call-recording-2026-06-08.mp3",
"title": "Voice call recording - +12065550123 - 2026-06-08"
}'
# Or upload via file URL (PDFs also supported)
curl -X POST .../agent-remember \
-d '{
"file_url": "https://your-storage/transcript.pdf",
"title": "Call transcript - +12065550123"
}'
In addition to inbound, the bridge supports outbound calls:
# Trigger an outbound call from the agent
curl -X POST http://localhost:8013/call/outbound \
-H "Authorization: Bearer <bridge-token>" \
-d '{
"to": "+12065550123",
"purpose": "Follow up on pricing page deadline",
"pre_call_recall": true
}'
The bridge will:
Estimated per-minute:
| Component | Cost |
|---|---|
| Twilio (inbound) | ~$0.01/min |
| ElevenLabs TTS | ~$0.05/min (varies by voice) |
| Anthropic Claude | ~$0.01/min (varies by tokens) |
| BlueColumn API | ~$0.002/recall + $0.003/remember |
| Total | ~$0.07–0.08/min |
voice-agent-memory/
├── SKILL.md ← This file
├── .env.example ← Config template
├── requirements.txt ← Python dependencies
├── bridge/
│ ├── server.py ← FastAPI bridge (port 8013)
│ ├── prompt_builder.py ← System prompt + memory injection
│ └── memory.py ← BlueColumn recall/store helpers
├── scripts/
│ ├── start.sh ← Start the bridge server
│ ├── test-recall.sh ← Test BlueColumn recall for a caller
│ └── test-call.sh ← Test making an outbound call
└── contacts.json ← Whitelisted callers
# Test BlueColumn recall for a specific caller
./scripts/test-recall.sh +12065550123
# Test the bridge directly (simulate ElevenLabs)
curl -X POST http://localhost:8013/v1/chat/completions \
-H "Authorization: Bearer <bridge-token>" \
-H "Content-Type: application/json" \
-d '{
"model": "claude-sonnet-4",
"messages": [
{"role": "user", "content": "Hello, this is Joe calling again"}
],
"stream": false
}'
# Check call logs
tail -f ~/.openclaw/workspace/memory/voice-calls/costs.jsonl
MIT — built on BlueColumn.ai and OpenClaw.