Based on a simplified mapping of human cognitive patterns and engineering considerations, OpenViking abstracts context into three basic types: Resource, Memory, and Skill, each serving different purposes in Agent applications.
| Type | Purpose | Lifecycle | Initiative |
|---|---|---|---|
| Resource | Knowledge and rules | Long-term, relatively static | User adds |
| Memory | Agent's cognition | Long-term, dynamically updated | Agent records |
| Skill | Callable capabilities | Long-term, static | Agent invokes |
Resources are external knowledge that Agents can reference.
- User-driven: Resource information actively added by users to supplement LLM knowledge, such as product manuals and code repositories
- Static content: Content rarely changes after addition, usually modified by users
- Structured storage: Organized by project or topic in directory hierarchy, with multi-layer information extraction
- API docs, product manuals
- FAQ databases, code repositories
- Research papers, technical specs
# Add resource
client.add_resource(
"https://docs.example.com/api.pdf",
reason="API documentation"
)
# Search resources
results = client.find(
"authentication methods",
target_uri="viking://resources/"
)Memories are divided into user memories and Agent memories, representing learned knowledge about users and the world.
- Agent-driven: Memory information actively extracted and recorded by Agent
- Dynamic updates: Continuously updated from interactions by Agent
- Personalized: Learned for specific users or specific Agents
| Category | Location | Description | Update Strategy |
|---|---|---|---|
| profile | user/memories/.overview.md |
User basic info | ✅ Appendable |
| preferences | user/memories/preferences/ |
User preferences by topic | ✅ Appendable |
| entities | user/memories/entities/ |
Entity memories (people, projects) | ✅ Appendable |
| events | user/memories/events/ |
Event records (decisions, milestones) | ❌ No update |
| cases | agent/memories/cases/ |
Learned cases | ❌ No update |
| patterns | agent/memories/patterns/ |
Learned patterns | ❌ No update |
# Memories are auto-extracted from sessions
session = client.session()
await session.add_message("user", [{"type": "text", "text": "I prefer dark mode"}])
await session.commit() # Extracts preference memory
# Search memories
results = await client.find(
"UI preferences",
target_uri="viking://user/memories/"
)Skills are capabilities that Agents can invoke, such as current Skills, MCP, etc.
- Defined capabilities: Tool definitions for completing specific tasks
- Relatively static: Skill definitions don't change at runtime, but usage memories related to tools are updated in memory
- Callable: Agent decides when to use which skill
viking://agent/skills/{skill-name}/
├── .abstract.md # L0: Short description
├── SKILL.md # L1: Detailed overview
└── scripts # L2: Full definition
# Add skill
await client.add_skill({
"name": "search-web",
"description": "Search the web for information",
"content": "# search-web\n..."
})
# Search skills
results = await client.find(
"web search",
target_uri="viking://agent/skills/"
)Based on Agent's needs, supports unified search across all three context types, providing comprehensive information:
# Search across all context types
results = await client.find("user authentication")
for ctx in results.memories:
print(f"Memory: {ctx.uri}")
for ctx in results.resources:
print(f"Resource: {ctx.uri}")
for ctx in results.skills:
print(f"Skill: {ctx.uri}")- Architecture Overview - System architecture
- Context Layers - L0/L1/L2 model
- Viking URI - URI specification
- Session Management - Memory extraction mechanism