8.0 KiB
8.0 KiB
OpenClaw Session 与上下文机制分析
分析时间:2026-03-12 目标:理解 session/上下文机制,优化大模型服务商请求
一、核心概念区分
1.1 两个 ID
| 概念 | 作用 | 示例 |
|---|---|---|
| Session Key | 对话路由/隔离桶 | agent:val:telegram:direct:8745444509 |
| Session ID | 具体 transcript 文件 | 79d11a95-d110-4593-bcb2-ea204c324059 |
- Session Key 决定"你在哪个对话中"
- Session ID 决定"这个对话的历史文件是哪个"
1.2 两个 Token 概念
| 概念 | 含义 | 来源 |
|---|---|---|
| Context Window | 模型上下文窗口上限 | 模型定义(kimi-k2.5: 262,144) |
| maxTokens | 单次生成回复上限 | 配置文件(当前: 32,768) |
二、上下文构成(Context = 发给模型的一切)
┌─────────────────────────────────────────────────────────┐
│ Context Window │
│ ┌─────────────────────────────────────────────────┐ │
│ │ System Prompt (每次重建) │ │
│ │ ├── Tool list + descriptions │ │
│ │ ├── Skills list (元数据) │ │
│ │ ├── Runtime info (时间/主机/模型) │ │
│ │ └── Project Context (注入的 workspace 文件) │ │
│ └─────────────────────────────────────────────────┘ │
│ ┌─────────────────────────────────────────────────┐ │
│ │ Conversation History (JSONL transcript) │ │
│ │ ├── User messages │ │
│ │ ├── Assistant messages │ │
│ │ ├── Tool calls + results │ │
│ │ ├── Compaction summaries │ │
│ │ └── Attachments (images/files) │ │
│ └─────────────────────────────────────────────────┘ │
│ ┌─────────────────────────────────────────────────┐ │
│ │ Tool Schemas (JSON) │ │
│ │ └── 每个工具的 JSON schema(不可见但计入) │ │
│ └─────────────────────────────────────────────────┘ │
└─────────────────────────────────────────────────────────┘
2.1 System Prompt 细分
| 组件 | 大小估算 | 说明 |
|---|---|---|
| Tool list text | ~1,000 chars | 工具名称和简短描述 |
| Tool schemas (JSON) | ~32,000 chars | 最大开销之一 |
| Skills list | ~2,000 chars | 12 个技能元数据 |
| Project Context | 变化大 | 注入的 workspace 文件 |
2.2 Project Context 注入
默认注入的文件(如存在):
AGENTS.mdSOUL.mdIDENTITY.mdUSER.mdTOOLS.mdHEARTBEAT.md
截断规则:
- 单文件上限:
bootstrapMaxChars(默认 20,000 chars) - 总上限:
bootstrapTotalMaxChars(默认 150,000 chars)
三、Session 生命周期
3.1 Session 重置触发
| 触发方式 | 说明 |
|---|---|
| Daily Reset | 默认凌晨 4:00,新消息创建新 Session ID |
| Idle Reset | 空闲超过 idleMinutes,新消息创建新 Session ID |
| 手动 Reset | /new 或 /reset 命令 |
| Per-type override | resetByType 可针对 direct/group/thread 不同策略 |
3.2 DM Scope(直聊隔离策略)
| 模式 | Session Key 格式 | 适用场景 |
|---|---|---|
main (默认) |
agent:<id>:main |
单用户,跨设备连续性 |
per-peer |
agent:<id>:dm:<peerId> |
多用户隔离 |
per-channel-peer |
agent:<id>:<channel>:dm:<peerId> |
多用户推荐 |
per-account-channel-peer |
agent:<id>:<channel>:<account>:dm:<peerId> |
多账户推荐 |
四、上下文控制机制
4.1 Compaction(压缩)
触发条件:
contextTokens > contextWindow - reserveTokens
工作方式:
- 将旧对话压缩成摘要 entry
- 摘要持久化到 JSONL
- 保留
keepRecentTokens的最近消息
配置示例:
{
compaction: {
enabled: true,
reserveTokens: 16384, // 剩余多少 token 时触发
keepRecentTokens: 20000, // 保留最近多少 token
},
}
Memory Flush:
- 在 compaction 前,运行静默 turn 写入持久化记忆
- 防止 compaction 丢失关键上下文
4.2 Session Pruning(裁剪)
工作方式:
- 仅移除旧的 toolResult
- 不修改 JSONL transcript
- 仅影响当前请求的 in-memory context
适用模型: 主要是 Anthropic API(配合 prompt caching)
配置示例:
{
agents: {
defaults: {
contextPruning: {
mode: "cache-ttl",
ttl: "5m",
keepLastAssistants: 3,
},
},
},
}
4.3 文件截断
控制点:
bootstrapMaxChars: 单文件上限 (20,000)bootstrapTotalMaxChars: 总上限 (150,000)
五、当前配置分析
5.1 已知配置
| 配置项 | 当前值 | 说明 |
|---|---|---|
| 模型 | lkeap/kimi-k2.5 | |
| Context Window | 262,144 tokens | 模型上下文窗口 |
| maxTokens | 32,768 | 单次生成上限 |
| 当前已用 | ~16,648 tokens | session tokens |
5.2 潜在问题点
-
Tool Schemas 开销大
- 浏览器工具 schema ~9,812 chars
- exec 工具 schema ~6,240 chars
- 所有工具 schema ~32,000 chars (~8,000 tokens)
-
Project Context 可能膨胀
- 多个 workspace 文件注入
- 单文件 20,000 chars 上限可能不够精确控制
-
Compaction 配置未知
- reserveTokens 和 keepRecentTokens 需要检查
六、优化建议
6.1 减少每次请求的 Token
| 优化点 | 方法 | 预估节省 |
|---|---|---|
| Tool Schemas | 限制可用工具列表 | ~5,000-10,000 tokens |
| Project Context | 精简注入文件,或调低 bootstrapMaxChars |
变化大 |
| Skills List | 减少安装的技能数量 | ~500-1,000 tokens |
6.2 控制上下文增长
| 优化点 | 方法 |
|---|---|
| Session Pruning | 启用 contextPruning.mode: "cache-ttl" |
| Compaction 阈值 | 调低 reserveTokens 更早触发压缩 |
| Idle Reset | 设置合理的 idleMinutes,长空闲后重置 |
6.3 监控与调试
# 查看上下文详情
/context detail
# 查看会话状态
/status
# 手动压缩
/compact
# 查看所有 session
openclaw sessions --json
七、需要进一步检查的配置
# 查看完整配置
cat ~/.openclaw/openclaw.json | jq '.agents.defaults'
# 查看 compaction 配置
cat ~/.openclaw/openclaw.json | jq '.agents.defaults.compaction'
# 查看 session 配置
cat ~/.openclaw/openclaw.json | jq '.session'
八、服务商限制应对
如果服务商限制请求频率或 token 消耗:
-
减少单次请求大小
- 精简工具列表
- 控制注入文件大小
- 启用 session pruning
-
控制请求频率
- 合理设置 session reset 策略
- 避免频繁 /new 或长时间会话
-
监控用量
- 定期检查
/status和/context detail - 关注 token 使用趋势
- 定期检查
文档版本: v1.0 生成时间: 2026-03-12 09:00 GMT+8