【免费下载链接】CoreCoderMinimal AI coding agent (~1,000 lines of Python) inspired by Claude Code. Works with any LLM. Think NanoGPT for coding agents. Formerly NanoCoder.项目地址https://gitcode.com/gh_mirrors/co/CoreCoder点击查看免费下载CoreCoder 是一个仅一千多行 Python 的开源 AI 编程 Agent它的上下文管理模块用一套「三层压缩策略」解决了 AI Agent 的老大难问题超长编程任务怎么才能在有限的上下文窗口里活到最后。读透 corecoder/context.py 这 220 行代码你也能给自己的 Agent 设计一套靠谱的上下文压缩方案。为什么 AI Agent 处理长编程任务总会「失忆」上下文窗口是 AI Agent 绕不过去的物理约束窗口就那么大。而编码任务偏偏是最「产 token」的工种。Agent 读一个千行文件一千行连同行号全进历史跑一次测试几百行输出全进历史grep 一下几十个匹配又全进历史。一个稍像样的任务转上十几轮几万 token 就没了。窗口一旦塞满结局只有两种要么 API 直接报错要么你手动砍历史。而砍历史砍不好Agent 就会「忘事」——前面读过的文件转头又读一遍刚做过的决定又推翻重来。所以「怎么在有限窗口里装下一个长任务」是 Agent 工程里最硬核的子问题之一。CoreCoder 的答案是分层压缩、从轻到重、惰性触发。三层压缩策略一览50%、70%、90% 三道水位线CoreCoder 的 ContextManager 在初始化时就定好了三道阈值每层在窗口用到一定比例时才触发层级触发水位手段成本第一层截断工具输出50%纯文本处理不调模型几乎为零第二层LLM 摘要旧对话70%调用模型写摘要一次额外 LLM 调用第三层硬折叠90%只留最后几条 摘要最后手段这套逻辑的精髓在于能用便宜手段省出来的空间绝不动用贵手段。调度者是 maybe_compress它在每次发请求前、每轮工具执行后都会被喊一声见 corecoder/agent.py但绝大多数时候窗口没满它什么都不做就返回了。压缩是惰性的只在真要撞墙时才花力气。至于 token 怎么估的estimate_tokens 用的是一个糙到可爱的办法按字符数估算还区分了中文约 1.5 字符/token和代码符号密集时约 2.8 字符/token。它不精确但压缩判断要的不是精确值而是「现在大概到几成了」这个量级感——零依赖、零开销够用就好。第一层压缩旧的工具输出是有保质期的窗口用到 50% 时_snip_tool_outputs 上场。它不调模型纯文本处理把所有超过 1500 字符的工具结果截成「只留头三行 尾三行」。这一层背后有个很漂亮的洞察工具输出是有保质期的。二十轮之前那次 grep 吐出的两百行匹配在当时很有用模型靠它定位了代码。但到了现在模型早用完那个结果了那两百行就成了纯粹的占位垃圾。截成头尾几行既保留了「这里曾经查过一次」的线索又把绝大部分死重量扔掉了。新鲜的信息值钱陈旧的信息廉价压缩就该优先压陈旧的。为什么留头尾、弃中间因为命令输出最有用的信息常在两端开头是它在干什么结尾是结果和报错。中间那一大坨过程往往可以丢。第二层压缩让模型给旧对话写个摘要第一层只压工具输出压不动对话本身。窗口涨到 70% 时_summarize_old 接管把旧对话整段交给模型写一个摘要只留最近 8 条消息原样不动。压缩后的历史变成一条「这是之前对话的摘要」消息 一条模型「我记下了」的回应 原封不动的近期消息。摘要指令非常聚焦见 _get_summary保留改过的文件路径、做过的关键决定、遇到的错误、当前任务状态丢掉啰嗦的命令输出、代码清单、来回的废话。这正是一个长任务里真正需要被记住的东西。更聪明的是它的降级路径如果摘要调用失败了就用正则把文件路径和带 error 的行抽出来拼一个粗摘要。宁可给个糙摘要也不让压缩这一步把整个会话拖垮。第三层压缩硬折叠宁可丢上下文也要活下去窗口涨到 90%说明前两层都没压够。_hard_collapse 是急刹车只保留最后 4 条消息加一个摘要其余全部折叠掉。这层很少触发它存在的意义是「万一前两层都不够至少别让 Agent 直接撞墙死掉」。宁可丢掉较多上下文也要让会话活下去——这也是为什么它排在 90% 这个几乎贴近硬上限的水位上。那个一定会咬你的坑孤儿 tool 消息这是全文最值得记住的细节也是作者打磨项目时实打实踩过的坑。OpenAI 兼容 API 有一条铁律一条带tool_calls的 assistant 消息后面必须跟着配对的 tool 回复少一个 API 都会拒收。而压缩的本质是在历史某个位置切一刀前面压掉、后面留下。问题来了——如果这一刀正好切在一组工具调用的中间呢「保留最近 8 条」的边界如果恰好落在某条 tool 回复上这条 tool 回复就会被留在尾巴里而产生它的那条 assistant 消息却被切进摘要里没了。这条 tool 回复成了孤儿下一次请求带着它发出去API 当场拒绝。你的压缩逻辑本来是来救场的结果亲手把会话搞死了。CoreCoder 的解法短得不能再短_safe_split 在切分前把边界往前挪直到边界那条消息不再是 tool。就这么一个 while 循环往回退。少了它压缩就是个定时炸弹平时不响偏在长对话、窗口吃紧、最不该出事的时候炸。作者还用两个测试把这条不变式钉死了test_safe_split_never_orphans_a_tool_message 验证切分点不落在 tool 上test_compress_never_leaves_an_orphan_tool_reply 验证整轮压缩后每条 tool 回复都还紧跟着它的 tool_calls。把「藏在脑子里的不变式」固化成代码是对抗这类隐蔽 bug 的正道。动手体验/compact 手动压缩上下文如果你想亲眼看到压缩发生CoreCoder 的 CLI 提供了一个/compact斜杠命令。在会话里输入它就会立刻估算压缩前后的 token 数并打印结果例如「Compressed: 52310 → 21480 tokens (12 messages)」实现见 corecoder/cli.py。给自己造一个足够长的任务比如让它连续读文件、跑测试十几轮再输入/compact你就能看到三层策略现场省下了多少空间。CoreCoder 与 Claude Code 的上下文管理对照CoreCoder 的注释里写得很清楚Claude Code 是四层截断工具输出、带缓存的微压缩、硬折叠、周期性后台压缩CoreCoder 蒸馏成三层。差别的主体是 Claude Code 多出的那层缓存微压缩和后台自动压缩工程上更精细。但「分层、从轻到重、惰性触发、优先压陈旧信息」这套核心思路两者完全一致。CoreCoder 把它压成三层刚好够你看清每一层在解决什么、代价是什么而不至于淹没在缓存和调度的细节里。总结给你的 Agent 设计上下文压缩的三个原则分层触发从轻到重能用纯文本截断省出来的空间就别动用 LLM 摘要90% 水位上的硬折叠永远是最后手段。优先压陈旧信息工具输出有保质期陈旧的输出是压缩首选目标新鲜信息值钱陈旧信息廉价。小心切分点任何对历史动刀的操作都要保证 tool 回复不与其 tool_calls 分离并用测试把这条不变式钉死。最后回答一个反直觉的问题为什么 Agent 偶尔会「忘事」因为压缩本来就是有损的被摘要掉的细节确实丢了。好的压缩策略不是不丢而是丢得聪明。想继续深挖细节可以读 corecoder/context.py 全文或参考仓库自带的源码解读 article/04-context.md。赞分享【免费下载链接】CoreCoderMinimal AI coding agent (~1,000 lines of Python) inspired by Claude Code. Works with any LLM. Think NanoGPT for coding agents. Formerly NanoCoder.项目地址https://gitcode.com/gh_mirrors/co/CoreCoder点击查看免费下载相关推荐OpenClaw 如何理解并调整会话压缩 Compaction让长对话不超上下文OpenClaw 如何理解并调整会话压缩 Compaction让长对话不超上下文 每个模型都有上下文窗口context window即一次能处理的最大AI 应用AI Agent交互助手后端即时通讯网关learn-claude-code s06 Context Compact:用三层压缩管道让 Agent 突破上下文窗口限制learn claude code s06 Context Compact:用三层压缩管道让 Agent 突破上下文窗口限制 本文基于 learn claude示例工程AI Agent人工智能如何快速安装Jellyfin-Kodi插件3分钟上手流媒体播放神器如何快速安装Jellyfin Kodi插件3分钟上手流媒体播放神器 Jellyfin Kodi插件是连接Jellyfin媒体服务器和Kodi播放器的终极桥梁创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考