【开源项目】Learn Claude Code

📅 2026/6/15 20:31:54
【开源项目】Learn Claude Code
项目地址Learn Claude CodeLearn Claude Code的作者认为现在很多的Agent都是伪Agent都是使用代码编排好了流程。真的Agent应该将决策权交给大模型而不是在代码中写死。模型就是Agent代码只是起到Harness的作用。Learn Claude Code就是教你怎么搭建Harness代码由s01-s12来演示。Learn Claude Code给出Agent就是一个Loop。用户发来请求由大模型判断是否要调用外部工具如果需要则调用工具然后返回结果给大模型最后由大模型判断下一步要做什么。所有复杂的机制都叠加在这个永远不变的Loop上代码作为Harness只做三件事跑循环执行工具像大模型返回结果。Loop痛点这个Loop也不是没有问题的主要有下面四个痛点1.Context Fade 失忆大模型在执行多步任务的时候很可能会丢失进度造成重复执行已经执行过的任务跳步跑偏等等。这个时候上下文会越来越长系统提示的能力被稀释。s03、s07解决方式TodoWrite约束强迫大模型写下计划同时也要设定约束规则最多20项仅1个in_process连续3轮未更新系统自动提醒。大模型生成的任务列表要有结构包括当前任务的状态依赖哪些前置文件。要想执行一个任务这个任务必须是pending状态并且blockedBy为空。class TaskManager: def __init__(self, tasks_dir: Path): self.dir tasks_dir self.dir.mkdir(exist_okTrue) self._next_id self._max_id() 1 def create(self, subject, description): task {id: self._next_id, subject: subject, status: pending, blockedBy: [], owner: } self._save(task) self._next_id 1 return json.dumps(task, indent2)2.Context Pollution 探索垃圾比如一个用户问了一个问题这个项目的架构是什么。此时父agent上下文已经有一部分了如果此时再去分析这个问题可能会导致上下文不纯净上下文过长。s04解决方式Subagent隔离主进程写代码子进程读文件探索。完全隔离保护主进程认知清晰度。关于这个子task其实也是一个工具大模型判断是否需要调用这个工具。3.知识瓶颈比如我们想要大模型按照某个特定的工作流来执行某个任务但是其本身其实不知道怎么执行因此我们就会给他一个提示这个提示其实就是skill。s05但是如果我们的skill比较多怎么办比如有100个难道要全部加载进去吗其实不用。解决方式Skills渐进式加载100个预置Skill按需加载。我们可以写一个总的skill预览表像目录一样需要哪个再按需加载即可。4.上下文爆表上下文窗口是有限的因为我们的上下文是不能无限增长的需要进行压缩提炼。s06解决方式三层压缩防御Micro旧工具结果变占位符- Auto超50K自动摘要-Manual主动调用 compact。完整的历史上下文保存至硬盘中信息没有消失只是移出了活跃上下文。第一层Micro旧工具结果变占位符每次调用大模型前默认执行只保留近三条工具结果将更早的工具结果替换成工具的名称。第二层Auto超50K自动摘要到达条件自动触发摘要先将所有信息以JSON的格式写入硬盘中。再使用大模型进行摘要要包括已完成的工作、当前状态、关键决策。最后用一条message替代messages列表。第三层Manual主动调用 compact由模型自行判断是否需要主动调用compact工具之后执行的过程与第二层一样。团队协作真正的团队协作需要三样东西: (1) 能跨多轮对话存活的持久 Agent, (2) 身份和生命周期管理, (3) Agent 之间的通信通道。Agent之间通过JSONL 收件箱来通信每个agent都有一个自己的邮箱一个json文件每次调用大模型前都要去邮箱中查看是否邮件如果有就加入上下文中。只有收发功能是不行的必须要有双方怎么响应怎么协调。因此引入了通信协议。此时的子Agent你不给他分配工作他不干属于是踢一脚走一步。因此我们要让子Agent自己扫描任务面板没人干的活自己领一个。但是这个也有一个问题如果两个agent同时改同一个文件未提交的改动相互污染根本就回滚不了了。因此我们使用git worktree创建不同的目录每个agent都在自己的目录下执行互不影响。流程展示1.用户与Agent对话执行过程2.Agent_Loop的具体过程