⏳ This skill is pending AI review.

Scores will appear once the review pipeline completes.

v5.0.0

Context Compressor

@happyfaptain0 stars

自动上下文压缩。当session超阈值时,先提取重要内容到日记,再压缩JSONL。支持light/standard/aggressive模式。触发条件:session>8K tokens、用户要求压缩、心跳维护时发现session过大。v5.0新增:防死循环、大输出截断、性能优化。

/10

// RATINGS

GitHub Stars

New / niche

🟢ProSkills Score
📍

Not yet listed on ClawHub or SkillsMP

// README


name: Context Compressor slug: context-compressor version: 5.0.0 description: 自动上下文压缩。当session超阈值时,先提取重要内容到日记,再压缩JSONL。支持light/standard/aggressive模式。触发条件:session>8K tokens、用户要求压缩、心跳维护时发现session过大。v5.0新增:防死循环、大输出截断、性能优化。 metadata: {"openclaw":{"emoji":"📦","requires":{"bins":[]},"os":["linux","darwin","win32"]}}

Context Compressor 📦

两阶段压缩:先提取,再压缩。不提取就压缩 = 丢信息。

何时压缩

条件动作
Session > 8K tokens(~32K字符)主动压缩
用户说"压缩上下文"/"compress context"立即压缩
心跳检查发现session膨胀主动压缩
长任务开始前,session已很大先压缩再继续

不要压缩:任务进行中、session即将结束、刚压缩过且仍低于2倍阈值。

Token估算

内容公式说明
主要中文字符数 / 1.5中文token密度高
主要英文字符数 / 4英文token密度低
混合字符数 / 3通用估算(脚本默认)
JSON/代码多字符数 / 3.5结构化内容更紧凑

注意:以上为粗略估算,实际token数因模型而异。建议用模型官方tokenizer精确计算。

快速判断:session文件 > 32K字符 ≈ > 8K tokens(混合内容),该压缩了。


Phase 1: 提取(必须先做)

扫描session中间部分,把重要内容存到外部文件。

要提取的存到哪里格式
用户偏好/事实SOUL.md → 偏好部分更新或新增bullet
关键决策/结论memory/YYYY-MM-DD.md## Decision: <topic>
创作作品全文memory/YYYY-MM-DD.md## Creative: <title>
重要对话摘录memory/YYYY-MM-DD.md## Conversation: <topic>
技术解决方案memory/YYYY-MM-DD.md## Technical: <issue>
新话题/类别SOUL.md → 事件索引新增条目
闲聊/日常不存

日记追加格式

---

## 压缩提取 HH:mm

### <Category>: <Brief Title>
- **Context**: 为什么重要
- **Content**: 实际信息
- **Session ref**: 大致轮次范围

日记追加,绝不覆盖。


Phase 2: 压缩Session

优先级系统(从低到高删)

优先级内容删减顺序
P0无法解析的行(安全保留)保留
P1大型tool输出(>2000字符)1st
P2导航/探索调用(ls, pwd, grep未命中)2nd
P3成功但常规的tool调用3rd
P4冗长的assistant解释4th
P5日常寒暄("好的""谢谢")5th
P6有意图的用户消息保留
P7最近对话(tail)保留
P8System消息保留
P9已有Summary(合并处理)合并
P10Session header保留

压缩模式

模式Token目标操作适用场景
light6K只删P1-P2刚过阈值,主要是tool膨胀
standard4K删P1-P3,摘要P4-P5常规维护(默认)
aggressive2.5K删P1-P5,最大化摘要session很长,需要最大压缩

大输出截断策略

当tool输出 >2000字符时,不要只做全删/全留二选一。优先截断:

策略操作节省
截断到500字符保留前500字符 + ...[truncated, N chars omitted]~75%
截断到200字符保留前200字符 + 截断标记~90%
全删完全移除该行100%

截断优先级:先截断到500 → 仍超标则截断到200 → 仍超标则全删。

截断时保留tool调用的结构信息(tool name、参数摘要),只删输出内容。

操作步骤

1. 读取 session JSONL
   路径: ~/.openclaw-autoclaw/agents/<agentId>/sessions/<sessionId>.jsonl

2. 估算token数,低于阈值则退出

3. 检查防死循环标记(见下方),如触发则跳过

4. 备份原文件 → <sessionId>.jsonl.bak

5. 分类每行(P0-P10),缓存解析结果,避免重复JSON解析

6. 识别tail(从末尾往前数60行P6+内容)

7. 截断大输出(P1行先截断到500字符,再截断到200,最后全删)

8. 按优先级从低到高删除(不删tail)
   直到token数达标或只剩P6+
   每删一行计数+1,超过maxIter则停止

9. 生成 [SESSION SUMMARY](合并已有摘要,不要堆叠)
   ≤6条bullet,每条≤2行,带文件引用

10. 组装:header + summary(1行) + tail

11. 验证:每行有效JSON、至少1条user+1条assistant、token数达标

12. 写入,验证通过后删.bak,失败则回滚

13. 写入防死循环标记

14. 日志:追加到 memory/YYYY-MM-DD.md

Summary格式

[SESSION SUMMARY]
• [Decision] <决定内容> → memory/<YYYY-MM-DD>.md##Section
• [Technical] <解决方案> → memory/<YYYY-MM-DD>.md##Section
• [Fact] <关键事实>
• [State] <当前任务状态>
• [Warning] <未来必须知道的事>

规则:≤6条、每条≤2行、带文件引用、用标签分类、只写结果不写过程。日期使用当天日期。

处理已有Summary

如果session中已有 [SESSION SUMMARY]

  1. 解析旧summary
  2. 与新内容合并
  3. 去重:[State]替换为新[State],已解决的[Warning]删除,同类多bullet保留(如多个[Technical]
  4. 结果始终只有一条 [SESSION SUMMARY]

绝对不要堆叠多条summary。


防死循环机制 ⚠️

本地模型执行压缩时可能陷入死循环。以下机制防止此问题:

1. 最大迭代限制

参数默认值说明
maxIter100模型内操作时,删除操作的最大迭代次数
maxIter (脚本)5000脚本执行时的最大迭代次数

超过限制后立即停止,输出当前结果。

2. 压缩冷却期

压缩完成后,在session中写入标记:

{"type":"system","lastCompressed":"<timestamp>","compressedTokens":<N>}

规则

  • 距上次压缩 < 5分钟 → 不压缩
  • 上次压缩后token数未增长 > 20% → 不压缩
  • 连续3次压缩后仍未达标 → 停止压缩,报告错误

3. 压缩效果检查

压缩后验证:

  • 压缩后token数必须 < 压缩前token数 × 0.9(至少减少10%)
  • 如果压缩后几乎没减少 → 说明session主要由P6+内容组成,无法进一步压缩
  • 此时不要重试,而是报告:"Session主要由高优先级内容组成,无法进一步压缩。建议增大阈值或手动清理。"

4. 模型执行安全

当由本地模型执行压缩时:

  • 单次执行:每次只执行一次完整的压缩流程
  • 不自动重试:压缩完成后不自动检查是否需要再次压缩
  • 明确退出:压缩完成后输出 "Compression complete. <N> tokens remaining." 然后停止
  • 异常中断:如果执行过程中遇到错误,立即停止并报告,不要尝试恢复

安全与恢复

步骤动作
压缩前复制 .jsonl.jsonl.bak
验证通过删除 .jsonl.bak
验证失败回滚 .jsonl.bak.jsonl
手动恢复用户可从 .jsonl.bak 恢复

验证清单:每行有效JSON ✅ 至少1条user消息 ✅ 至少1条assistant消息 ✅ token数达标 ✅


脚本(可选)

如需脚本化执行,见 scripts/ 目录:

脚本平台用法
compress-session.ps1Windows.\compress-session.ps1 -SessionFile <path> [-Mode standard] [-KeepTail 60] [-MaxIter 100] [-DryRun]
compress-session.shLinux/macOS./compress-session.sh <session-file> [mode] [keep-tail] [dry-run]
compress-simple.py跨平台python compress-simple.py <session.jsonl> [mode] [tail_lines]
compress-all.py跨平台(批量)python compress-all.py
diary-logger.py跨平台见下方日记记录章节

模型内操作优先:直接用read/write/exec工具按上述步骤执行,比脚本更灵活。


日记记录

diary-logger.py 用法

# Phase 1: 压缩前提取重要内容到日记
python diary-logger.py extract <session.jsonl> <workspace_dir>

# 压缩后记录压缩事件
python diary-logger.py log-compression <workspace_dir> --mode standard --before 8000 --after 4000 --removed 45

# 验证日记完整性
python diary-logger.py validate <workspace_dir>

# 手动更新 MEMORY.md 索引
python diary-logger.py update-index <workspace_dir> --note "手动添加的备注"

日记记录触发机制

触发时机动作命令
压缩前(Phase 1)提取重要内容到日记diary-logger.py extract
压缩后记录压缩事件diary-logger.py log-compression
心跳检查时验证日记完整性diary-logger.py validate
手动更新MEMORY.md索引diary-logger.py update-index

日记数据格式

压缩提取追加到 memory/YYYY-MM-DD.md

---

## 压缩提取 HH:mm

### Decision: <简要标题>
- **Context**: 为什么重要
- **Content**: 实际信息
- **Source**: user/assistant/summary

压缩事件追加到 memory/YYYY-MM-DD.md

---

## 压缩执行 HH:mm

### Compression: standard mode
- **Before**: 8,000 tokens
- **After**: 4,000 tokens
- **Saved**: 50.0%
- **Removed lines**: 45
- **Timestamp**: 2026-04-21T12:00:00+08:00

错误处理策略

错误场景处理方式
日记文件不存在自动创建,含正确标题
写入失败从 .bak 回滚,报告错误
MEMORY.md 格式异常前缀匹配日期,兼容 ### 2026-04-21 — 标题 格式
提取无重要内容输出提示,不创建空条目
.bak 文件残留validate 命令检测并报告

完整性验证

diary-logger.py validate 检查以下项目:

  1. ✅ 今日日记文件存在
  2. ✅ 日记标题格式正确(# YYYY-MM-DD
  3. ✅ 日记包含章节内容
  4. ✅ MEMORY.md 包含今日条目
  5. ✅ SOUL.md 存在
  6. ✅ memory/ 目录存在且有文件
  7. ✅ 无残留 .bak 文件
  8. ⚠️ 检测空章节
  9. ⚠️ 检测压缩提取次数过多(>3次)

配置

参数默认值说明
tokenThreshold8000超过此token数触发压缩
charThreshold32000备用:超过此字符数触发
keepTail60保留最近对话的最小行数
modestandard压缩模式:light/standard/aggressive
autoBackuptrue压缩前自动备份
maxIter100模型内操作最大迭代次数
truncateThreshold2000超过此字符数的tool输出触发截断
truncateSize500截断后保留的字符数
cooldownMinutes5两次压缩之间的最小间隔(分钟)

最佳实践

  1. 先提取再压缩 — 不提取就压缩 = 永久丢失信息
  2. 按token不是按行 — 100行短对话 ≠ 100行tool输出
  3. 先截断再删除 — 截断大输出比全删更安全,保留上下文线索
  4. 先删tool调用 — 最低价值、最高token,通常单这一步就能省20-40%
  5. 只有一条summary — 合并不堆叠
  6. summary里引用外部文件 — 让未来的自己能找到详情
  7. 不中途压缩 — 等任务边界再压缩
  8. 遵守冷却期 — 不要连续压缩,至少间隔5分钟
  9. 日志记录 — 压缩后追加到日记:"Compressed X→Y tokens (mode)"
  10. 压缩失败就停止 — 不要重试,报告错误让用户决定

// HOW IT'S BUILT

KEY FILES

SKILL.md

// REPO STATS

0 stars

// ACTIONS

Rate this skill

login to rate

// SCORE

Pending review

// DETAILS

Categoryother
Versionv5.0.0
PriceFree