Your voice agent remembers forever. Give voice agents automatic memory of every conversation using BlueColumn. Use when a voice/phone agent must remember callers, meetings, coaching sessions, sales calls, or journal entries; when wiring voice transcripts into BlueColumn; or when a caller needs continuity across calls. Requires a BlueColumn API key (bc_live_*).
Memory
voice-agent-memory
Try itFull-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.
What it does
Full-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.
The skill document
🎙️ Voice Agent Memory — Cross-Call BlueColumn Recall
Give 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.
Why This Exists
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 | ✅ |
Architecture
┌─────────────────────────┐
│ 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
What Makes This Different
1️⃣ Caller-Based Memory Isolation
Each phone number gets its own memory namespace. When +12065550123 calls:
- BlueColumn recalls every past interaction from that caller
- Agent greets them by name, picks up where they left off
- No cross-contamination between callers
2️⃣ Auto-Transcribe + Auto-Store
Every call transcript is automatically:
- Truncated/summarized to key info
- Pushed to BlueColumn
/agent-rememberwith caller phone as title - Tagged with
voice-call, caller number, and date - Available for recall on the NEXT call before the agent says a word
3️⃣ Pre-Call Context Injection
On inbound call, before the agent speaks:
- Bridge reads caller ID from ElevenLabs metadata
- Queries BlueColumn: "what do I know about [caller]?"
- Injects answer into Claude's system prompt
- Agent starts the call already informed
4️⃣ Real-Time Streaming Recall (Optional)
Mid-call recall queries:
- Agent can ask "what did we discuss about pricing last time?"
- Bridge streams recall results into the conversation context
- Sub-100ms recall means no awkward pauses
Setup
Prerequisites
- OpenClaw running (gateway on port 18789)
- Twilio account + phone number (already configured: +1 (929) 828-8689)
- BlueColumn API key (already configured: bc_live_*)
- ElevenLabs account + API key
- Anthropic API key (already configured)
- Cloudflare tunnel or ngrok (for exposing bridge to ElevenLabs)
Step 1: Configure Environment
# Copy template
cp .env.example .env
# Edit with your keys
Step 2: Install Dependencies
cd ~/.openclaw/workspace/skills/voice-agent-memory
pip install -r requirements.txt
# Or individually:
pip install fastapi uvicorn httpx anthropic python-dotenv
Step 3: Start the Bridge Server
python3 bridge/server.py
# Starts on port 8013
# Endpoint: POST /v1/chat/completions
Step 4: Expose with Cloudflare Tunnel
# If using existing tunnel:
cloudflared tunnel --url http://localhost:8013
# Or configure a permanent tunnel in Cloudflare dashboard
# Point a subdomain to localhost:8013
Step 5: Configure ElevenLabs Agent
In ElevenLabs dashboard:
- Create a Conversational AI Agent
- Set Custom LLM URL to:
https://your-tunnel.ngrok.dev/v1/chat/completions - Add auth header:
Authorization: Bearer - Set your Twilio number as the agent's phone number
Step 6: Connect Twilio
In ElevenLabs agent settings → Phone section:
- Enter Twilio Account SID and Auth Token
- Select your Twilio phone number
- Save — your number is now live with BlueColumn memory
How It Works (Detailed)
BlueColumn Integration
The bridge uses three BlueColumn API endpoints:
Base URL: https://xkjkwqbfvkswwdmbtndo.supabase.co/functions/v1
Pre-Call Recall (on inbound ring)
# 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
}
Post-Call Storage (after call ends)
# 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"]
}
Mid-Call Quick Note (during call)
# Agent saves an observation mid-conversation
POST /agent-note
{
"text": "Caller prefers email over phone for follow-up",
"tags": ["voice-call", "+12065550123", "preference"]
}
Memory Prompts (Zero→First→Nth Call)
| 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?" |
Voice Bridge Server
The bridge server (bridge/server.py) handles:
- HTTP Method: POST
- Endpoint:
/v1/chat/completions(OpenAI-compatible) - Auth: Bearer token in
Authorizationheader - Streaming: SSE-based streaming (ElevenLabs expects this)
- Model routing: Claude Sonnet 4 (via Anthropic API) or OpenClaw gateway
Key Features in the Bridge
- Parallel recall: Starts BlueColumn recall in a background task while initializing the Claude stream — if recall finishes in <2s, it's injected; if slow, the call proceeds without it
- Fire-and-forget memory: After each call exchange, the conversation is auto-stored to BlueColumn asynchronously
- Cost tracking: Logs per-call costs (Twilio + ElevenLabs + Anthropic) to JSONL for analytics
- Caller identification: Extracts caller ID from ElevenLabs metadata for memory namespacing
BlueColumn Audio API (Direct Audio Ingestion)
BlueColumn 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"
}'
Outbound Calling
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 " \
-d '{
"to": "+12065550123",
"purpose": "Follow up on pricing page deadline",
"pre_call_recall": true
}'
The bridge will:
- Query BlueColumn for context about this caller
- Initiate the call via Twilio
- Inject memory into the agent's prompt before the call connects
- Auto-store the transcript after the call
Costs
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 |
Files
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
Testing
# 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 " \
-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
License
MIT — built on BlueColumn.ai and OpenClaw.
Related skills
Memory for voice agents and voice-first workflows — every call transcribed, summarized, and searchable by caller, topic, and outcome. Use when a voice agent must remember callers across conversations. Requires a BlueColumn API key (bc_live_*).
Give AI agents persistent semantic memory using the BlueColumn API (bluecolumn.ai). Use when asked to remember, store, recall, or search memory using BlueColumn; when ingesting notes, conversations, documents, or audio into BlueColumn; when querying what an agent has previously stored; or when wiring up BlueColumn memory endpoints (/agent-remember, /agent-recall, /agent-note) in any workflow. Also use when the user mentions their BlueColumn API key (bc_live_*) and wants to store or retrieve information.
Call continuity — every phone conversation leaves a trace so the next call starts with full context. Use when an agent handles inbound or outbound calls and needs to know who called, why, and what was agreed. Requires a BlueColumn API key (bc_live_*).
Ingest live edge-device audio (car, doorbell, wearable, kiosk) into per-device streaming memory and recall what a device heard. Use when an agent streams audio chunks from devices, monitors ambient audio, or answers questions about a device's audio history. Requires a BlueColumn API key (bc_live_*).
Give AI agents Customer support that never re-asks. using BlueColumn persistent memory. Use when an agent handles support tickets and needs full context; when the user wants to store, recall, or search customer support memory context. Requires a BlueColumn API key (bc_live_*).