Agent 读了 30 个文件之后,为什么会突然停住?
本文是「从零理解 Claude Code20 个 Agent Harness 机制」系列的第 8 篇。源码仓库shareAI-lab/learn-claude-code本文基于开源仓库学习整理具体实现以仓库代码为准。我第一次碰到上下文超限时任务正在排查一组认证测试。Agent 先读了失败日志又读了认证服务、令牌处理、配置文件和几个测试用例。前面的过程没有任何异常命令能执行文件也能正常读取。等它准备发起下一次模型调用时接口直接返回了prompt_too_long。回头看消息历史问题就很清楚了。前面读过的完整文件、几轮测试输出、搜索结果和修改记录都还留在messages里。Agent 已经不需要其中的大部分内容但接口不会替它判断哪些结果已经过期。只要这些内容还在历史中下一次调用就得继续携带。上下文压缩解决的是长任务进行到中途以后如何让 Agent 丢掉已经用完的信息同时保留继续完成任务所需的线索。一次请求失败前messages里到底堆了什么一开始很容易盯着消息数量。例如一段任务跑了几十轮messages长度看起来已经很大第一反应通常是删掉早期对话。这个判断只解决了一部分问题。实际占空间的往往是工具结果。read_file可能返回完整源码bash可能返回数百行测试日志load_skill可能带回完整的技能说明。消息只有十几条时只要其中有两三段大输出上下文照样会接近限制。以认证测试这个场景为例真正值得长期保留的信息很少当前目标修复认证测试失败 已确认失败与 token 配置有关 已修改tests/auth/test_token.py 待完成重新运行相关测试检查回归影响而历史中可能还塞着第一次 pytest 的完整输出 多个已经排除的搜索结果 几份后续不再使用的文件全文 旧版本的配置内容这些内容在当时都有用后面却变成了负担。因此压缩不能只看消息出现得早不早还要看它是任务目标、近期结果还是已经失效的大段输出。压缩顺序里有一个位置不能换这一章在每次调用模型前都会先处理消息历史。执行顺序是大工具结果转存到磁盘 → 裁掉过远的中间消息 → 将较早工具结果替换为占位信息 → 上下文仍然过大时生成历史摘要看上去只是几个预处理函数顺序却不能随便调整。先说最容易被忽略的一层大工具结果转存。tool_result_budget()会检查最近一条工具结果消息的总大小。超过阈值后程序从最大的结果开始处理把完整内容写进.task_outputs/tool-results/上下文中只留下文件路径和前 2000 个字符预览。persisted-output Full output: .task_outputs/tool-results/toolu_123.txt Preview: ... /persisted-output这样Agent 后续发现预览不够时还可以通过文件读取工具重新查看完整结果。接下来才是micro_compact()。它保留最近 3 条工具结果将更早的结果替换成一行说明[Earlier tool result compacted. Re-run if needed.]如果这两步顺序反过来问题就出现了。较早的大结果会先被替换成占位文本后面的转存逻辑再也拿不到完整内容也就无法写入磁盘。Agent 看到的只剩一行提示原始输出没有保存入口。这也是这章最值得注意的设计细节压缩过程本身也会丢信息必须先处理可恢复的大内容再处理可以丢弃的旧内容。前面的tool_result_budget()关注单条或单轮结果是否过大snip_compact()处理的是另一类问题一段任务运行太久消息数量本身已经很长。教学代码超过 50 条消息后会保留最开始的 3 条和最近的 47 条中间部分用一条简短标记代替。开头通常保留了用户最初提出的任务和限制条件最近的消息则对应 Agent 当前正在处理的文件、报错或测试结果。中间的搜索过程虽然曾经有用距离当前任务已经比较远优先缩短的风险相对较低。裁剪时有一个边界需要额外处理模型发起工具调用和程序返回工具结果必须作为一组消息保留。例如Agent 想确认测试环境的数据库配置于是先请求读取配置文件助手调用 read_file参数为 config.py程序执行后将结果交回模型工具结果config.py 中 DATABASE_URL 为空这两条消息合在一起才构成一次完整的信息交换。模型知道自己读了哪个文件也知道从文件里得到了什么结论。如果压缩时只留下前一条调用记录模型会知道自己曾经读过config.py却不知道读取结果。它后续可能重复读取文件也可能在缺少依据的情况下继续推断。如果只留下后一条工具结果模型虽然看到了DATABASE_URL 为空却无法确认这段内容来自哪个文件、对应什么操作更难判断它是否仍然与当前任务有关。因此snip_compact()在确定裁剪边界时会检查边界附近是否存在这类调用与结果的配对关系。边界刚好落在两者之间时程序会向前或向后调整保证这组消息一起留下或者一起进入被压缩的历史。摘要能让任务继续丢掉的细节不会自动回来前三层压缩都不需要再调用模型。它们只是移动、删除或替换文本成本低也不会引入新的推理过程。经过这些处理后如果上下文仍然超过阈值程序才会调用compact_history()。这一步先把完整消息写入.transcripts/再请求模型生成摘要。摘要需要保留当前目标、重要发现、已修改文件、剩余工作和用户限制。随后原来的消息历史会被替换成一条摘要消息。defcompact_history(messages):write_transcript(messages)summarysummarize_history(messages)return[{role:user,content:f[Compacted]\n\n{summary},}]压缩后认证测试任务可能只剩下这样的上下文当前目标修复认证测试失败。 已确认token 配置缺少测试环境变量。 已修改tests/auth/test_token.py。 待完成运行 pytest tests/auth并检查相关配置是否影响其他测试。 用户限制不要修改生产环境配置。这足以支撑后续任务继续执行。不过完整历史已经不在模型可见的上下文里了。教学代码虽然保存了转录文件但没有提供让模型重新读取.transcripts/的工具。摘要漏掉的某个细节Agent 不会自动找回来。这也是摘要压缩的边界。摘要适合保留任务主线和关键结论无法替代完整证据。涉及文件内容、测试日志、接口返回值等细节时Agent 后续仍然可能需要重新读取文件、重新运行命令或者由系统额外恢复近期的关键内容。接口已经拒绝请求后系统还剩一次补救机会上下文阈值通常是估算值。教学代码通过字符数量估算消息体积它无法完全等同于模型实际计算的 token 数。再加上一轮工具调用可能突然返回大量内容程序有机会在压缩前就收到prompt_too_long。这时会进入reactive_compact()。它会保留最近几条消息把更早的历史交给模型总结然后重试请求。近期消息通常包含正在执行的工具调用和最新结果直接丢掉会让当前任务失去上下文。紧急压缩只允许有限次数重试。如果压缩后仍然超限继续重试没有意义只会不断消耗调用次数。仓库为这条路径设置了重试上限达到限制后抛出异常留给后续的错误恢复机制处理。这一点看起来很普通却是长任务系统必须具备的失败出口。压缩逻辑如果永远相信下一次会成功最终只会把一次接口错误变成循环调用。这套方案适合解决什么问题上下文压缩不会提升模型对代码的理解能力也不会让 Agent 永远记住所有细节。它解决的是长任务运行过程中的容量管理问题。对于持续读文件、反复运行测试、逐步修改代码的任务早期工具结果会不断失去价值。压缩机制负责回收这些内容占用的空间并尽可能留下任务目标、当前进度和可恢复入口。运行这一章的代码时可以重点观察三个现象python s08_context_compact/code.py先让 Agent 连续读取多个文件观察较早的工具结果是否被替换为占位信息。接着读取较多内容检查.task_outputs/tool-results/是否出现转存文件。最后进行一段较长对话观察终端是否出现[auto compact]或[reactive compact]。前者表示程序在调用模型前完成了主动压缩后者说明接口已经拒绝当前请求程序开始执行紧急处理。下一篇会讨论 Memory。上下文压缩会主动丢弃过程内容用户偏好、项目约束和重要决策也可能随着历史一起被缩短。Memory 要解决的是另一类问题哪些信息应该在压缩后继续保留哪些信息值得跨会话保存。

相关新闻

私有化视频会议系统/智能会议管理系统EasyDSS视频会议功能全方面解析

私有化视频会议系统/智能会议管理系统EasyDSS视频会议功能全方面解析

在企业数字化转型浪潮中,远程协作已成为日常办公的标配。然而,许多企业仍在为"会议系统难用、延迟高、需装插件、无法留存"等问题困扰。EasyDSS视频云平台将视频会议作为核心模块之一,以"高效协同、智能安全"为设计理念&…

2026/10/25 3:35:07 阅读更多 →
经导管主动脉瓣置换术(TAVR)技术原理与临床应用分析——以合肥高新心血管病医院临床实践为例

经导管主动脉瓣置换术(TAVR)技术原理与临床应用分析——以合肥高新心血管病医院临床实践为例

摘要经导管主动脉瓣置换术是结构性心脏病介入治疗领域的里程碑式技术。本文从技术原理、器械演进、临床适应症、手术流程、并发症防治等维度,系统分析TAVR技术的临床应用现状。并以合肥高新心血管病医院2026年7月完成的一例高危复杂TAVR病例为样本,探讨该…

2026/10/24 9:34:14 阅读更多 →
MySQL 读写分离有哪些坑?

MySQL 读写分离有哪些坑?

MySQL 读写分离有哪些坑? 引言读写分离是 MySQL 高并发架构中常见的优化策略,通过将读操作分散到多个从库,写操作集中在主库,从而缓解主库压力,提升系统吞吐量。然而,在实际应用中,读写分离并非…

2026/10/27 2:14:03 阅读更多 →

最新新闻

Electron桌面应用开发实战:从环境搭建到打包发布全流程

Electron桌面应用开发实战:从环境搭建到打包发布全流程

做前端这些年,我大部分时间都在跟浏览器标签页打交道,直到第一次把桌面应用跑起来,才发现原来自己一直被限制在地址栏和刷新按钮围起来的框框里。Electron这个词,最开始是在某段时间频繁出现在同事的讨论里,一个用HTML…

2026/10/28 23:48:14 阅读更多 →
滑盖智能锁T109深度解析:结构原理、安装调试与故障排查

滑盖智能锁T109深度解析:结构原理、安装调试与故障排查

简介:亚太天能T109滑盖智能锁产品说明书是一份PDF格式的官方技术文档,主要面向智能锁安装人员、终端用户及售后维护者,帮助快速掌握产品安装、配置与常见故障处理。全包仅1个PDF文件,大小4.37MB,内容结构清晰&#xff…

2026/10/28 7:28:00 阅读更多 →
PMSM弱磁控制原理与Simulink建模:高速AGV驱动系统设计指南

PMSM弱磁控制原理与Simulink建模:高速AGV驱动系统设计指南

上个月我在调试一台高速AGV的驱动系统,整车要求空载跑到8m/s,电机转速已经拉到额定点,驱动器的输出电压也顶到了母线电压极限附近。再往上踩速度指令,转速纹丝不动,三相电流反而开始震荡。那会儿我的第一反应就是&…

2026/10/28 9:02:11 阅读更多 →
C++核心知识点:从内存管理到STL的实战指南

C++核心知识点:从内存管理到STL的实战指南

C 这门语言我前前后后折腾了十几年,用它写过嵌入式驱动、做过游戏服务端,也搭过基础组件库。每次看到新人一头扎进"C 核心知识点"这个搜索词,我其实挺感慨的——这门语言的难点从来不是语法多,而是知识点之间的耦合太深…

2026/10/28 22:10:30 阅读更多 →
T109滑盖智能锁怎么装?安装调试与故障排查全攻略

T109滑盖智能锁怎么装?安装调试与故障排查全攻略

简介:亚太天能T109滑盖智能锁产品说明书以PDF格式发布,适合智能锁用户、安装人员与售后维修人员阅读。内容围绕T109系列指纹密码刷卡锁展开,先介绍前面板、后面板、锁体、机械钥匙、电池盒盖等部件名称与功能,再给出完整安装步骤&…

2026/10/28 9:00:54 阅读更多 →
LLM知识降熵:从信息垄断到理解权下放

LLM知识降熵:从信息垄断到理解权下放

你有没有过这种经历:翻开源码注释、论文摘要或者一份专业报告,每个字都认识,连在一起却像天书。想找人聊聊,身边要么没人懂,要么懂的懒得跟你解释。后来我试着把同一段内容丢给一个大语言模型,几秒钟之后&a…

2026/10/28 7:29:02 阅读更多 →

日新闻

周新闻

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/28 16:58:40 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/28 9:01:47 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/28 19:25:09 阅读更多 →