zvec-local-rag-service
Run local RAG search with Ollama embeddings and zvec.
Included files
scripts/rag-service.mjs→ HTTP service implementationscripts/manage.sh→ bootstrap/start/stop/restart/health/ingest/searchreferences/launchd.plist.template→ macOS LaunchAgent template
Prerequisites
- Node.js 18+
- Ollama daemon running
- Embedding model (default):
mxbai-embed-large
Prepare model once:
ollama pull mxbai-embed-large
Quick start
From the skill directory:
scripts/manage.sh bootstrap
scripts/manage.sh install-launchd # writes plist, inspect once
scripts/manage.sh start
scripts/manage.sh health
Ingest and search:
scripts/manage.sh ingest ./docs
scripts/manage.sh search "your query"
Install + smoke test (copy/paste)
# 1) prerequisites
ollama pull mxbai-embed-large
# 2) bootstrap and start service
scripts/manage.sh bootstrap
scripts/manage.sh install-launchd
scripts/manage.sh start
# 3) verify health
scripts/manage.sh health
# 4) create tiny test corpus
mkdir -p ./docs
cat > ./docs/sample.md <<'EOF'
Zvec + Ollama enables local semantic search.
EOF
# 5) ingest + query
scripts/manage.sh ingest ./docs
scripts/manage.sh search "local semantic search with ollama"
Endpoints
GET /healthPOST /ingestwith{ "dir": "./docs", "reset": true }POST /searchwith{ "query": "...", "topk": 5 }
Persistence (macOS launchd)
Install and enable LaunchAgent:
scripts/manage.sh install-launchd
scripts/manage.sh start
scripts/manage.sh status
Remove LaunchAgent:
scripts/manage.sh uninstall-launchd
Always inspect generated plist before enabling persistence:
~/Library/LaunchAgents/com.openclaw.zvec-rag-service.plist
Config via env vars
RAG_HOST(default127.0.0.1)RAG_PORT(default8787)OLLAMA_URL(defaulthttp://127.0.0.1:11434)OLLAMA_EMBED_MODEL(defaultmxbai-embed-large)RAG_BASE_DIR(default~/.openclaw/data/zvec-rag-service)ALLOW_REMOTE_OLLAMA(defaultfalse, blocks non-local OLLAMA_URL)ALLOW_NON_LOOPBACK_HOST(defaultfalse, blocks externally reachable bind host)
Notes
- Secure defaults: loopback-only service + loopback-only Ollama.
- Remote embedding/host binding require explicit opt-in env flags.
launchdoperations are macOS-specific. On non-macOS, run withscripts/manage.sh start(manual mode).