Install
openclaw skills install telnyx-ragSemantic search and Q&A over workspace files using Telnyx Storage + AI embeddings. Index your memory, knowledge, and skills for natural language retrieval and AI-powered answers.
openclaw skills install telnyx-ragSemantic search and RAG-powered Q&A over your OpenClaw workspace using Telnyx's native embedding, similarity search, and inference APIs.
Use a consistent naming scheme so anyone can adopt this:
openclaw-{agent-id}
| Agent | Bucket |
|---|---|
| Chief (main) | openclaw-main |
| Bob the Builder | openclaw-builder |
| Voice agent | openclaw-voice |
| Your agent | openclaw-{your-id} |
Why?
openclaw-* prefix groups all agent buckets in Telnyx Storage UIcd ~/skills/telnyx-rag
# Set YOUR Telnyx API key (each user/agent uses their own)
echo 'TELNYX_API_KEY=KEY...' > .env
# Run setup with validation
./setup.sh --check # Validate requirements first
./setup.sh # Full setup (uses bucket from config.json)
# Search your memory
./search.py "What are my preferences?"
# Ask questions (full RAG pipeline)
./ask.py "What is the porting process?"
export TELNYX_API_KEY="KEY..."
./setup.sh
echo 'TELNYX_API_KEY=KEY...' > .env
./setup.sh
./setup.sh --check # Validate requirements without making changes
./setup.sh my-custom-bucket
# Basic question answering
./ask.py "What is Telnyx's porting process?"
# Show retrieved context alongside answer
./ask.py "How do I deploy?" --context
# Use a different model
./ask.py "Explain voice setup" --model meta-llama/Meta-Llama-3.1-8B-Instruct
# More/fewer context chunks
./ask.py "meeting decisions" --num 12
# JSON output for scripting
./ask.py "API usage limits" --json
# Search a different bucket
./ask.py "project timeline" --bucket work-memory
# Basic search with improved error handling
./search.py "What are David's communication preferences?"
# Search specific bucket
./search.py "meeting notes" --bucket my-other-bucket
# More results with timeout control
./search.py "procedures" --num 10 --timeout 45
# JSON output (for scripts)
./search.py "procedures" --json
# Incremental sync with auto-chunking
./sync.py
# Override chunk size (tokens)
./sync.py --chunk-size 600
# Quiet mode for cron jobs
./sync.py --quiet
# Remove orphaned files (including stale chunks)
./sync.py --prune
# Sync + trigger embedding
./sync.py --embed
# Check status
./sync.py --status
# List indexed files (shows chunks too)
./sync.py --list
# Watch for changes and auto-sync with chunking
./sync.py --watch
# Trigger embedding for current bucket
./embed.sh
# OR
./sync.py --embed
# Check embedding status
./sync.py --embed-status <task_id>
Why is this needed? Uploading files to Telnyx Storage doesn't automatically generate embeddings. The embedding process converts your files into searchable vectors. Without this step, search.py and ask.py won't return results.
Edit config.json to customize behavior:
{
"bucket": "openclaw-memory",
"region": "us-central-1",
"workspace": ".",
"patterns": [
"MEMORY.md",
"memory/*.md",
"knowledge/*.json",
"skills/*/SKILL.md"
],
"priority_prefixes": ["memory/", "MEMORY.md"],
"default_num_docs": 5,
"chunk_size": 800,
"ask_model": "meta-llama/Meta-Llama-3.1-70B-Instruct",
"ask_num_docs": 8,
"retrieve_num_docs": 20
}
| Field | Default | Description |
|---|---|---|
bucket | openclaw-{agent-id} | Telnyx Storage bucket name (see naming convention) |
region | us-central-1 | Storage region |
workspace | . | Root directory to scan for files |
patterns | (see above) | Glob patterns for files to index |
priority_prefixes | ["memory/", "MEMORY.md"] | Sources to rank higher in results |
exclude | ["*.tmp", ...] | Patterns to exclude |
chunk_size | 800 | Target tokens per chunk (~4 chars/token) |
ask_model | Meta-Llama-3.1-70B-Instruct | LLM model for ask.py |
ask_num_docs | 8 | Final context chunks for LLM |
retrieve_num_docs | 20 | Initial retrieval count (before reranking) |
┌─────────────────┐ ┌──────────────────────────────────┐
│ Your Workspace │ │ Telnyx Cloud │
│ ├── memory/ │ │ │
│ ├── knowledge/ │──┐ │ Storage: your-bucket/ │
│ └── skills/ │ │ │ └── file__chunk-001.md │
└─────────────────┘ │ │ └── file__chunk-002.md │
│ │ │ │
Smart Chunking ◀──┘ │ ▼ embed │
├── Markdown: split │ Telnyx AI Embeddings │
│ on ## headers │ │ │
├── JSON/Slack: split │ ▼ │
│ by thread/time │ Similarity Search │
└── Metadata tags │ │ │
└──────────────┼──────────────────┘
│
ask.py Pipeline: │
┌─────────────────────────────────┐ │
│ 1. Retrieve top-20 chunks ◀────┘ │
│ 2. Rerank (TF-IDF + priority) │
│ 3. Deduplicate adjacent chunks │
│ 4. Build prompt with top-8 │
│ 5. Call Telnyx Inference LLM │
│ 6. Return answer + sources │
└─────────────────────────────────┘
Large files are automatically split into semantic chunks before upload:
## and ### headers firstChunks use deterministic filenames:
knowledge/meetings.md → knowledge/meetings__chunk-001.md
knowledge/meetings__chunk-002.md
knowledge/meetings__chunk-003.md
Each chunk includes a YAML-style header:
---
source: knowledge/meetings.md
chunk: 2/5
title: Q4 Planning Discussion
---
(chunk content here)
For Slack exports, additional fields:
---
source: slack/general.json
chunk: 3/12
title: general
channel: general
date_range: 2024-01-15 to 2024-01-16
authors: alice, bob, charlie
---
.sync-state.json--prune cleans up orphaned chunks from deleted filesThe RAG pipeline uses a multi-signal reranking strategy:
priority_prefixes sources ranked higherInitial retrieval fetches retrieve_num_docs (default 20), reranking selects the best ask_num_docs (default 8) for the LLM prompt.
--chunk-size flag or chunk_size in configask.py)--context shows retrieved chunks--json for structured responses.sync-state.json--prune: Removes files from bucket that were deleted locally--quiet flag for cron jobsAdd to your TOOLS.md:
## Semantic Memory & Q&A
Ask questions about your workspace:
\`\`\`bash
cd ~/skills/telnyx-rag && ./ask.py "your question"
\`\`\`
Search memory semantically:
\`\`\`bash
cd ~/skills/telnyx-rag && ./search.py "your query"
\`\`\`
Add to your heartbeat or cron:
# Quiet sync with orphan cleanup
cd ~/skills/telnyx-rag && ./sync.py --quiet --prune
# Sync with embedding
cd ~/skills/telnyx-rag && ./sync.py --quiet --embed
"Python version too old"
python3 --version"API key test failed"
echo $TELNYX_API_KEY"Bucket not found"
./sync.py --create-bucket
"No results found"
./sync.py --list./sync.py --embed"Files not syncing"
.sync-state.json for corruptionrm .sync-state.json && ./sync.py"LLM generation failed"
./ask.py "query" --model meta-llama/Meta-Llama-3.1-8B-Instruct"No relevant documents found"
from ask import ask
from search import search_memory
# Ask a question (full RAG pipeline)
answer = ask("What is the deployment process?")
print(answer)
# With options
answer = ask(
"project timeline",
num_final=5,
model="meta-llama/Meta-Llama-3.1-8B-Instruct",
show_context=True,
output_json=True,
)
print(answer)
# Basic search
results = search_memory("What do I know about X?", num_docs=5)
print(results)
# Ask and capture answer
answer=$(./ask.py "What are the API limits?" --json)
# Search and capture JSON
results=$(./search.py "query" --json)
--quiet for cron jobs to reduce output--prune periodically to clean up deleted files./sync.py --watch./sync.py && ./sync.py --embedBuilt for OpenClaw using Telnyx Storage and AI APIs.