# 上下文类型

基于对人类认知模式的简化映射与工程化思考，OpenViking 将上下文抽象为 **资源、记忆、能力三种**基本类型，每种类型在 Agent 中有不同的用途。

## 概览

| 类型 | 用途 | 生命周期 | 主动性 |
|------|------|----------|--------|
| **Resource** | 知识和规则 | 长期，相对静态 | 用户添加 |
| **Memory** | Agent 的认知 | 长期，动态更新 | Agent 记录 |
| **Skill** | 可声明的 agent 能动性配置（AgentDefinedContextType） | 长期，静态 | 用户或系统添加 |

## Resource（资源）

资源是 Agent 可以引用的外部知识。

### 特点

- **用户主动**：由用户主动添加的资源类信息，用于补充大模型的知识，比如产品手册、代码仓库
- **静态内容**：添加后内容很少发生变化，通常为用户主动修改
- **结构化存储**：将按照项目或主题以目录层级组织，并提取出多层信息。

### 示例

- API 文档、产品手册
- FAQ 数据库、代码仓库
- 研究论文、技术规范

### 使用

```python
# 添加资源
client.add_resource(
    "https://docs.example.com/api.pdf",
    reason="API 文档"
)

# 搜索资源
results = client.find(
    "认证方法",
    target_uri="viking://resources/"
)
```

## Memory（记忆）

记忆分为用户记忆和Agent记忆，是 Agent 关于用户和世界的学习知识。

### 特点

- **Agent 主动：**由 Agent 主动提取和记录的记忆信息
- **动态更新：**由 Agent 从交互中持续更新
- **个性化：**针对特定用户和稳定 peer 学习记录

### 8 种分类

| 分类 | 位置 | 说明 | 更新策略 |
|------|------|------|----------|
| **profile** | `user/memories/profile.md` | 用户基本信息 | ✅ 合并到单文件 |
| **preferences** | `user/memories/preferences/` | 按主题的用户偏好 | ✅ 可追加 |
| **entities** | `user/memories/entities/` | 实体记忆（人物、项目） | ✅ 可追加 |
| **events** | `user/memories/events/` | 事件记录（决策、里程碑） | ❌ 不更新 |
| **trajectories** | `user/memories/trajectories/` | 可复用的操作契约 | ❌ 不更新 |
| **experiences** | `user/memories/experiences/` | 可复用的执行经验 | ✅ 可合并 |
| **tools** | `user/memories/tools/` | 工具使用经验与最佳实践 | ✅ 可合并 |
| **skills** | `user/memories/skills/` | 技能执行经验与工作流策略 | ✅ 可合并 |

### 使用

```python
# 记忆从会话中自动提取
session = client.session()
await session.add_message("user", [{"type": "text", "text": "我喜欢深色模式"}])
commit = await session.commit()  # 启动后台记忆提取
task = await client.get_task(commit["task_id"])  # 轮询直到 task["status"] == "completed"

# 搜索记忆
results = await client.find(
    "用户界面偏好",
    target_uri="viking://user/memories/"
)
```

## Skill（技能 / AgentDefinedContextType）

技能（Skill）是 Agent 可以调用的能力，属于 AgentDefinedContextType 范畴。包括传统工作流定义、通信端点、工具配置和支付能力等。它们的共同特征是：**定义了 agent 如何与外部系统交互**，运行时定义相对静态，但调用经验会在 Memory 中更新。

### 特点

- **定义的能力：**用于完成某项工作的工具定义
- **相对静态：**运行时技能定义不变，但和工具相关的使用记忆会在记忆中更新
- **可调用：**Agent 决定何时使用哪种技能

### 存储位置

```
viking://user/skills/{skill-name}/  # 默认存储路径
├── .abstract.md          # L0: 简短描述
├── SKILL.md              # L1: 详细概览
└── scripts               # L2: 完整定义

viking://agent/skills/{skill-name}/  # 通过 --uri 覆盖，公开共享（account 全局）
├── .abstract.md          # L0: 简短描述
├── SKILL.md              # L1: 详细概览
└── scripts               # L2: 完整定义
```

### AgentDefinedContextType 子类型

AgentDefinedContextType 包含以下子类型，均存储于 `viking://agent/` 作用域：

| 子类型 | 位置 | 说明 |
|--------|------|------|
| **Skill** | `agent/skills/` | 传统工作流定义，如搜索、代码生成 |
| **Endpoint** | `agent/endpoints/` | 通信端点配置（a2a, anp 等）（规划中） |
| **Tool** | `agent/tools/` | 工具配置（mcp 等）（规划中） |
| **Payment** | `agent/payments/` | 支付能力配置（ap2 等）（规划中） |

### 使用

```python
# 添加技能（默认写入 viking://user/skills/）
await client.add_skill({
    "name": "search-web",
    "description": "搜索网络获取信息",
    "content": "# search-web\n..."
})

# 通过 -p 指定写入全局 agent 技能根（公开共享）
ov skills add search-web -p viking://agent/skills

# 搜索用户技能
results = await client.find(
    "网络搜索",
    target_uri="viking://user/skills/"
)

# 搜索全局 agent 技能
results = await client.find(
    "网络搜索",
    target_uri="viking://agent/skills/"
)
```

## 统一检索

根据Agent的需求需求，支持对三种上下文类型统一搜索，提供全面信息：

```python
# 跨所有上下文类型搜索
results = await client.find("用户认证")

for ctx in results.memories:
    print(f"记忆: {ctx.uri}")
for ctx in results.resources:
    print(f"资源: {ctx.uri}")
for ctx in results.skills:
    print(f"技能: {ctx.uri}")
```

## 相关文档

- [架构概述](./01-architecture.md) - 系统整体架构
- [上下文层级](./03-context-layers.md) - L0/L1/L2 模型
- [Viking URI](./04-viking-uri.md) - URI 规范
- [会话管理](./08-session.md) - 记忆提取机制
