| name | openviking-context-database |
| description | Expert skill for using OpenViking, the open-source context database for AI Agents that manages memory, resources, and skills via a filesystem paradigm. |
| triggers | ["set up OpenViking for my AI agent","how do I use OpenViking context database","configure OpenViking with my LLM provider","add memory to my AI agent with OpenViking","OpenViking filesystem context management","integrate OpenViking RAG into my project","OpenViking agent memory and skills setup","how to query OpenViking context database"] |
OpenViking Context Database
Skill by ara.so — Daily 2026 Skills collection.
OpenViking is an open-source context database for AI Agents that replaces fragmented vector stores with a unified filesystem paradigm. It manages agent memory, resources, and skills in a tiered L0/L1/L2 structure, enabling hierarchical context delivery, observable retrieval trajectories, and self-evolving session memory.
Installation
Python Package
pip install openviking --upgrade --force-reinstall
Optional Rust CLI
curl -fsSL https://raw.githubusercontent.com/volcengine/OpenViking/main/crates/ov_cli/install.sh | bash
cargo install --git https://github.com/volcengine/OpenViking ov_cli
Prerequisites
- Python 3.10+
- Go 1.22+ (for AGFS components)
- GCC 9+ or Clang 11+ (for core extensions)
Configuration
Create ~/.openviking/ov.conf:
{
"storage": {
"workspace": "/home/user/openviking_workspace"
},
"log": {
"level": "INFO",
"output": "stdout"
},
"embedding": {
"dense": {
"api_base": "https://api.openai.com/v1",
"api_key": "$OPENAI_API_KEY",
"provider": "openai",
"dimension": 1536,
"model": "text-embedding-3-large"
},
"max_concurrent": 10
},
"vlm": {
"api_base"
Note: OpenViking reads api_key values as strings; use environment variable injection at startup rather than literal secrets.
Provider Options
| Role | Provider Value | Example Model |
|---|
| VLM | openai | gpt-4o |
| VLM | volcengine | doubao-seed-2-0-pro-260215 |
| VLM | litellm | claude-3-5-sonnet-20240620, ollama/llama3.1 |
| Embedding | openai | text-embedding-3-large |
| Embedding | volcengine | doubao-embedding-vision-250615 |
| Embedding | jina | jina-embeddings-v3 |
LiteLLM VLM Examples
{
"vlm": {
"provider": "litellm",
"model": "claude-3-5-sonnet-20240620",
"api_key": "$ANTHROPIC_API_KEY"
}
}
{
"vlm": {
"provider": "litellm",
"model": "ollama/llama3.1",
"api_base": "http://localhost:11434"
}
}
{
"vlm": {
"provider": "litellm",
"model": "deepseek-chat",
"api_key": "$DEEPSEEK_API_KEY"
}
}
Core Concepts
Filesystem Paradigm
OpenViking organizes agent context like a filesystem:
workspace/
├── memories/ # Long-term agent memories (L0 always loaded)
│ ├── user_prefs/
│ └── task_history/
├── resources/ # External knowledge, documents (L1 on demand)
│ ├── codebase/
│ └── docs/
└── skills/ # Reusable agent capabilities (L2 retrieved)
├── coding/
└── analysis/
Tiered Context Loading (L0/L1/L2)
- L0: Always loaded — core identity, persistent preferences
- L1: Loaded on demand — relevant resources fetched per task
- L2: Semantically retrieved — skills pulled by similarity search
This tiered approach minimizes token consumption while maximizing context relevance.
Python API Usage
Basic Setup
import os
from openviking import OpenViking
ov = OpenViking(config_path="~/.openviking/ov.conf")
ov = OpenViking(
workspace="/home/user/openviking_workspace",
vlm_provider="openai",
vlm_model="gpt-4o",
vlm_api_key=os.environ["OPENAI_API_KEY"],
embedding_provider="openai",
embedding_model="text-embedding-3-large",
embedding_api_key=os.environ["OPENAI_API_KEY"],
embedding_dimension=1536,
)
Managing a Context Namespace (Agent Brain)
brain = ov.namespace("my_agent")
brain.write("memories/user_prefs.md", """
# User Preferences
- Language: Python
- Code style: PEP8
- Preferred framework: FastAPI
""")
brain.write("resources/api_docs/stripe.md", open("stripe_docs.md").read())
brain.write("skills/coding/write_tests.md", """
# Skill: Write Unit Tests
When asked to write tests, use pytest with fixtures.
Always mock external API calls. Aim for 80%+ coverage.
""")
Querying Context
results = brain.search("how does the user prefer code to be formatted?")
for result in results:
print(result.path, result.score, result.content[:200])
skill_results = brain.search(
query="write unit tests for a FastAPI endpoint",
directory="skills/",
top_k=3,
)
prefs = brain.read("memories/user_prefs.md")
print(prefs.content)
Session Memory & Auto-Compression
session = brain.session("task_build_api")
session.add_turn(role="user", content="Build me a REST API for todo items")
session.add_turn(role="assistant", content="I'll create a FastAPI app with CRUD operations...")
summary = session.compress()
session.close()
Retrieval Trajectory (Observable RAG)
with brain.observe() as tracker:
results = brain.search("authentication best practices")
trajectory = tracker.trajectory()
for step in trajectory.steps:
print(f"[{step.level}] {step.path} → score={step.score:.3f}")
Common Patterns
Pattern 1: Agent with Persistent Memory
import os
from openviking import OpenViking
ov = OpenViking(config_path="~/.openviking/ov.conf")
brain = ov.namespace("coding_agent")
def agent_respond(user_message: str, conversation_history: list) -> str:
context_results = brain.search(user_message, top_k=5)
context_text = "\n\n".join(r.content for r in context_results)
system_prompt = f"""You are a coding assistant.
## Relevant Context
{context_text}
"""
response = call_llm(system_prompt, conversation_history, user_message)
brain.session("current").add_turn("user", user_message)
brain.session("current").add_turn("assistant", response)
return response
Pattern 2: Hierarchical Skill Loading
import pathlib
skills_dir = pathlib.Path("./agent_skills")
for skill_file in skills_dir.rglob("*.md"):
relative = skill_file.relative_to(skills_dir)
brain.write(f"skills/{relative}", skill_file.read_text())
def get_relevant_skills(task: str) -> list[str]:
results = brain.search(task, directory="skills/", top_k=3)
return [r.content for r in results]
task = "Refactor this class to use dependency injection"
skills = get_relevant_skills(task)
Pattern 3: RAG over Codebase
import subprocess
import pathlib
brain = ov.namespace("codebase_agent")
def index_codebase(repo_path: str):
for f in pathlib.Path(repo_path).rglob("*.py"):
content = f.read_text(errors="ignore")
rel = f.relative_to(repo_path)
brain.write(f"resources/codebase/{rel}", content)
index_codebase("/home/user/myproject")
def find_relevant_code(query: str) -> list:
return brain.search(
query=query,
directory="resources/codebase/",
top_k=5,
)
hits = find_relevant_code("database connection pooling")
for h in hits:
print(h.path, "\n", h.content[:300])
Pattern 4: Multi-Agent Shared Context
agent1_brain = ov.namespace("researcher_agent")
agent1_brain.write("memories/findings/api_rate_limits.md", """
# API Rate Limits Discovered
- Stripe: 100 req/s in live mode
- SendGrid: 600 req/min
""")
agent2_brain = ov.namespace("coder_agent")
shared = ov.namespace("shared_knowledge")
rate_limits = shared.read("memories/findings/api_rate_limits.md")
CLI Commands (ov_cli)
ov --version
ov namespace list
ov namespace create my_agent
ov write my_agent/memories/prefs.md --file ./prefs.md
ov read my_agent/memories/prefs.md
ov search my_agent "how to handle authentication" --top-k 5
ov search my_agent "database migrations" --trace
ov session compress my_agent/task_build_api
ov ls my_agent/skills/
ov rm my_agent/resources/outdated_docs.md
ov export my_agent ./exported_brain/
ov import ./exported_brain/ my_agent_restored
Troubleshooting
Config Not Found
ls -la ~/.openviking/ov.conf
export OV_CONFIG=/path/to/custom/ov.conf
Embedding Dimension Mismatch
If you switch embedding models, the stored vector dimensions will conflict:
brain.reindex(force=True)
Workspace Permission Errors
chmod -R 755 /home/user/openviking_workspace
df -h /home/user/openviking_workspace
LiteLLM Provider Not Detected
{
"vlm": {
"provider": "litellm",
"model": "openrouter/anthropic/claude-3-5-sonnet",
"api_key": "$OPENROUTER_API_KEY",
"api_base": "https://openrouter.ai/api/v1"
}
}
High Token Usage
Enable tiered loading to reduce L1/L2 fetches:
results = brain.search(
query=user_message,
directory="skills/relevant_domain/",
top_k=2,
min_score=0.75,
)
Slow Indexing on Large Codebases
{
"embedding": {
"max_concurrent": 20
},
"vlm": {
"max_concurrent": 50
}
}
import asyncio
async def index_async(files):
tasks = [brain.awrite(f"resources/{p}", c) for p, c in files]
await asyncio.gather(*tasks)
Environment Variables Reference
| Variable | Purpose |
|---|
OV_CONFIG | Path to ov.conf override |
OPENAI_API_KEY | OpenAI API key for VLM/embedding |
ANTHROPIC_API_KEY | Anthropic Claude via LiteLLM |
DEEPSEEK_API_KEY | DeepSeek via LiteLLM |
GEMINI_API_KEY | Google Gemini via LiteLLM |
OV_LOG_LEVEL | Override log level (DEBUG, INFO, WARN) |
OV_WORKSPACE | Override workspace path |
Resources