读Crush源码-AGI时代的LLM操作系统

发布时间:2026/9/26 14:45:04

读Crush源码-AGI时代的LLM操作系统 读 Crush 源码一个好用的 AI 编程助手背后到底套着多少层 Harness我们这一年代写代码的人每天都在和AI 编程助手打交道。但用得多了一个疑问会自然冒出来同样是接 GPT/Claude 的 API为什么有的工具能把一个复杂重构任务从头跑完有的跑两步就卡死、跑偏、或者原地转圈模型明明是同一个模型。带着这个疑问我翻了 Charmbracelet 开源的Crush一个终端里的 AI 编程助手类似 Claude Code 的开源对位产品的源码。读完最大的感受是一个能用的 agentic 产品其价值有九成不在模型而在那套套在模型外面的 harness——执行外壳。本文聊聊我从 Crush 里读到的、关于 harness 的那些工程取舍以及它带给我自己的一些思考。一、先对齐一下什么是 Harness如果你写过一点 LLM 应用多半见过最朴素的 agent 循环whileTrue:respllm.chat(messages,toolstools)ifnotresp.tool_calls:breakforcallinresp.tool_calls:resultrun_tool(call)messages.append(result)这就是一个 harness 的雏形——它决定了模型说的话怎么变成动作、动作的结果怎么回到模型。但这个十几行的循环离生产可用差了十万八千里。一旦模型决定连续改二十个文件、一旦某个工具卡住三十秒、一旦模型陷入读同一个文件、报同一个错的死循环这个循环就会把整个会话带崩。Crush 的internal/agent/agent.go里这个核心循环围绕agent.Stream连同它外围的调度、权限、hook、防循环、上下文压缩、取消机制撑起了几千行代码。这几千行就是 harness 的本体。下面我挑几个让我印象最深的设计讲讲。二、Harness 的第一性原理把不可信的执行者关进笼子读完 Crush 我最大的体会是harness 的设计哲学可以用一句话概括永远假设模型会犯错并保证每个错误都有兜底。这听起来像废话但落实在代码里是处处可见的偏执。举几个例子1. 权限是 Harness 的一等公民Crush 里有一个独立的internal/permission包。模型每次想跑一个工具bash、edit、write……都要先过 permission 这道闸。它的设计很讲究按 (session, tool, action, path) 四元组记忆授权。用户在某个会话里允许了编辑这个文件后续对同一文件的编辑就不再弹窗。这个粒度卡得很准——既不烦人又不会一次授权全局放行。Hook 可以预授权。WithHookApproval把一个 toolCallID 通过 context 传下去permission 看到这个标记就直接放行。这意味着用户写的 PreToolUse hook 可以成为一道自动审批策略——比如凡是只读操作一律放行。这其实是个很优雅的扩展点把什么操作安全这件事交给用户用 shell 脚本自己定义。--yolo模式。一键跳过所有权限。Crush 在 README 里反复用 “Be very, very careful” 警告。这是一个很诚实的取舍harness 可以默认严格但必须给信任环境的用户一条别烦我的快车道。我自己之前做 agent 时权限是事后才加上去的加得七零八落。看完 Crush 我意识到权限应该是 harness 的骨架之一从第一天就内建而不是出事了再打补丁。2. Hook用户能在 Harness 里插桩的中间件hooked_tool.go是个典型的装饰器decorator模式实现。每个内置工具被一层hookedTool包起来在真正执行前先跑用户配置的 shell 脚本PreToolUse hook。这个 hook 有三种决策能力deny阻止这次调用把错误塞回给模型让它换个思路。halt直接终结整个 turn不只是阻止这次工具。用于事态严重立刻停手。改写输入UpdatedInputhook 可以修改工具的参数。比如模型想rm -rf /tmphook 可以把它改成rm -rf /tmp/specific_dir。这个设计让我眼前一亮。它本质上是把 harness 的控制权部分让渡给用户——你不需要改 Crush 的源码写个 shell 脚本就能干预模型每一次动作。这比那种只能在配置文件里开关几个布尔值的产品高明得多。一个细节sub-agent 不会再触发 hookisSubAgent时直接返回原工具。这避免了主 agent 调用子 agent 工具时已经过了一次 hook子 agent 内部每个工具再过一遍的双重拦截。这种边界处理是好 harness 和糙 harness 的分水岭。3. 循环检测给原地打转的模型踩刹车这是我觉得整个项目最巧妙的设计之一在loop_detection.go里全部代码不到 100 行const(loopDetectionWindowSize10// 看最近 10 步loopDetectionMaxRepeats5// 同一签名出现超过 5 次)它的做法是给每一个工具调用 工具结果的组合算一个 SHA256 签名工具名、输入参数、输出结果三者拼接哈希。在最近的 10 步窗口里如果同一个签名出现超过 5 次就判定为陷入循环强行中断。为什么这个设计好它不依赖模型自报家门。很多 agent 让模型自己输出我在第几步但模型不可靠。Crush 用的是客观的输入输出指纹模型骗不了。签名包含输出。这点容易被忽略但很关键。如果只哈希工具名输入那模型每次读同一个文件、文件内容因为模型自己改了而变化签名就不一样检测就失效。把输出也纳入哈希意味着只有完全相同的动作产生完全相同的结果才会被算作重复——这才是真正的死循环。窗口 阈值的组合。10 步窗口避免了对长任务的误判5 次阈值给了模型一定的重试容错。这俩参数显然是调过的。我自己见过太多 agent 因为模型陷入读文件→报错→换个姿势读同一个文件→又报错的怪圈而把 context 烧光的。一个 100 行的循环检测能省下真金白银的 token 和用户的耐心。三、Harness 的第二性原理让模型持续可用地工作光防错还不够harness 还得保证模型能在长任务里持续工作。这涉及几个更基础设施层面的问题。1. 上下文压缩长对话的续命术任何 agentic 产品都绕不开 context window 的物理上限。模型改一个项目读几十个文件、跑几十次测试上下文很容易撑爆。Crush 在SessionAgent里有自动摘要机制——当 token 数逼近阈值调用一个小模型把历史对话压缩成摘要腾出空间继续干。这其实是 harness 里最容易被低估的难点。压缩做得粗暴会丢失关键的我刚才改过哪个文件、用户说过哪个偏好做得太细又频繁触发、拖慢响应。这是一个没有银弹、只能靠真实任务反复调参的工程问题。2. 会话级的串行化并发不是越多越好SessionAgent里有一把dispatchMu锁和一个请求队列。同一个 session 内LLM 请求和工具执行是严格串行的——如果上一个任务还在跑新来的 prompt 会被排队而不是并发插入。这乍看反直觉并发不是更快吗但细想非常合理。Agent 的状态本质上是对话历史 待执行计划这是个强状态机。两个 prompt 并发改同一个文件、并发修改同一个会话上下文结果几乎一定是灾难。宁可排队也不要在 agent 状态机上玩并发——这是 harness 区别于普通 Web 服务的重要特征。Web 服务无状态可以并发agent 有状态必须串行。3. 取消机制让用户能随时喊停agent.Stream跑起来之后模型可能要连续执行十几个工具调用每个都可能耗时。如果用户中途想停“诶方向不对”harness 必须能立刻中断而且要中断得干净——不能留下半截写坏的文件、不能让 LLM 请求继续烧 token。Crush 用context.Context贯穿整个调用链来实现取消并且在排队逻辑里做了精细处理一个被取消的 queued prompt 不会被执行但它的 RunID 仍会收到一个已取消的 RunComplete 通知避免调用方一直 hang 住。这种取消也要通知到等待者的细节是分布式系统里才常见的讲究放在 agent harness 里说明作者很懂。四、一些超出预期的设计读完核心模块还有几个设计让我觉得这帮人是真的在拿这个工具干活而不是做 demo1. 工具自描述.go配.md每个内置工具都是一对文件bash.go实现bash.md给 LLM 看的说明文档。LLM 看到的工具描述不是写死在代码里的字符串而是一份独立的 markdown。这意味着改工具的 prompt 不用碰逻辑代码改逻辑代码也不用怕影响 prompt。这种高内聚、自包含的组织方式对维护一个几十个工具的项目来说是刚需。2. 配置即服务而不是全局变量Config is a Service——配置通过config.Service访问不是 package-level 的全局变量。这使得配置可以被注入、mock、热加载。读到这里我有点汗颜我自己写过不少全局 config 结构体 init 函数的代码Crush 给我上了一课配置是依赖依赖就该走 DI而不是全局态。3. 内建 Bash 解释器做配置Crush 的crushrc配置文件不是 JSON/YAML而是真正的 Bash 脚本配合一组内置命令provider add、mcp add、permissions allow。这意味着配置里可以写if、可以source、可以$(op read ...)从 1Password 取密钥。这个取舍很大胆。好处是配置的表达力极强跨平台一致Windows 上也能跑因为自带 bash 解释器代价是配置变成了可信代码——README 里反复警告别 source 来历不明的文件。这是一个典型的权力越大责任越大的工程选择我个人很欣赏这种不把用户当傻子的设计。4. 双重 Fallback配置里指定的模型如果不可用比如 Provider 列表里没了Crush 会自动回退到安全的默认模型比如 Sonnet并写回配置。这种启动时自愈的设计让升级、换模型时的容错性好很多。一个 harness 不应该因为用户配错了一个字段就拒绝启动。五、回到我自己读完之后想改的几件事读源码的意义最终还是落回我自己的东西能怎么改进。我整理了几条对自己有触动的把权限当成骨架不是补丁。下次写 agent第一天就把 (session, tool, action, target) 四元组的权限模型建起来而不是等到出事。给 agent 一个循环检测器。这个 100 行的指纹方案可以直接抄。烧 context 的死循环是 agentic 系统最隐蔽的成本黑洞。Hook 化的中间件思维。与其把安全策略写死在代码里不如暴露成 hook 让用户自己定义。这既是扩展性也是一种谦逊——承认 harness 作者不可能穷尽所有用户场景。串行化会话状态。别在 agent 状态机上图并发那是 Web 服务的思维套到 agent 上必崩。工具的 prompt 和实现分离。这是个小习惯但对长期维护的帮助巨大。六、结语Harness 是 agentic 时代的操作系统合上 Crush 的源码我有一个越来越强烈的感受未来的 agentic 产品竞争模型层会越来越同质化大家都能调同样的 API真正的护城河是 harness。模型决定能做到什么harness 决定能不能稳定地做到。前者是上限后者是下限。一个产品如果只有好的模型接入、没有好的 harness用户用两次就会因为它又卡死了它又把文件改坏了而流失反过来一个 harness 扎实的产品哪怕接的是中等水平的模型也能给出靠谱的体验。从这个角度看Claude Code、Cursor、Crush 这些工具本质上都是在做同一件事给 LLM 写一个操作系统。进程调度agent 循环、权限管理permission、系统调用tools、信号处理cancel/halt、文件系统context 管理、shell 脚本hooks/skills……这些操作系统的经典概念在 agentic harness 里几乎一一对应。Crush 的价值在于它把这套LLM 操作系统开源了出来让你能拆开看看里面每一个齿轮怎么转。如果你在做 agentic 方向的产品不管用不用 Crush认真读一遍它的internal/agent和internal/permission比看十篇 agent 综述都有用。因为那些模型不会告诉你、论文也不会写的工程细节——循环检测怎么算签名、取消怎么不丢通知、权限怎么记忆——才是 agentic 产品真正难的地方。而这大概也是开源最大的意义不是让你免费用别人的成果而是让你看见别人踩过的坑、想明白的取舍。利益无关本文基于 Crush 公开源码的阅读笔记仅为技术探讨。Crush 是 Charmbracelet 出品的开源项目MIT 风格许可证地址 github.com/charmbracelet/crush。
延伸阅读

更多相关文章

2026/9/26 14:44:59

TTS语音合成接口排错实战:从HTTP状态码到业务码的逐层定位

排错之前:先画一张请求链路的故障定位图 TTS 语音合成接口的调用链路并不长:客户端构造 JSON 请求体 -> 携带鉴权头发送 POST 请求 -> 服务端返回 JSON(包含 base64 音频) -> 客户端解码并消费音频。但错误可能出现在这…

2026/9/25 21:16:43

抖音无水印下载器:3分钟掌握批量下载的终极方案

抖音无水印下载器:3分钟掌握批量下载的终极方案 【免费下载链接】douyin-downloader A practical Douyin downloader for both single-item and profile batch downloads, with progress display, retries, SQLite deduplication, and browser fallback support. 抖…

2026/9/19 23:40:08

市场国产替代的国产存储芯片测试座厂家芯片检测利器

老王经营一家存储芯片封测厂,最近跟我抱怨:“一个进口的测试座,报价三万多,还要等三个多月,没有现货,出了问题沟通还很不方便。” 这不是他一个人的烦恼,很多行业朋友都有类似的遭遇。在存储芯片…

2026/9/26 14:40:08

cc switch + codex + 米醋:用 TaoToken 统一 Key 打通 AI 办公配置链

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

2026/9/26 14:40:08

tick-stock-panel 15个一级菜单页面全导航:部署后先看哪里?

tick-stock-panel 15个一级菜单页面全导航:部署后先看哪里? 【免费下载链接】tick-stock-panel TSP自托管、零运维的 A 股「选股 监控 回测」量化工作台 | LLM能力驱使策略定制个股分析复盘 | 自由接入第三方数据源与个性化扩展数据 | 个人开源 项目…

2026/9/26 14:40:08

YOLOv5手势识别入门:2000张标注数据训练到部署全流程解析

简介:这套YOLOv5手势识别资料包面向目标检测与深度学习实践者,聚焦人机交互场景中10种常见手势(如数字、字母、比心等)的识别,适合用于算法学习、毕业设计或小型手势控制系统开发。包内数据为2000张已标注图像&#xf…

2026/9/26 14:40:08

MATLAB轨道交通仿真系统:从列车运行到客流交互的完整实现

简介:轨道交通仿真系统代码包,面向城市交通规划、轨道运营优化及仿真建模技术人员,用于模拟列车从启动、加速到减速停车的完整过程,并还原乘客上下车与换乘行为。代码将线路条件、信号系统、牵引供电等复杂因素统一建模&#xff0…

2026/9/26 14:35:08

YooAsset资源管理设计哲学:三态模式、Handle与热更新全解析

在Unity项目里,资源管理大概是讨论热度最高、翻车率也最高的模块之一。AssetBundle怎么打、怎么加载、怎么卸载、怎么热更,每个项目都能讲出一段血泪史。YooAsset这个名字近两年在国内团队里越来越常见,很大一个原因是它把“资源管理”从一堆…

2026/9/25 21:00:17

GAMP 5 基于风险的计算机化系统验证:软件分类与审计追踪实践

简介:《A Risk-Based Approach to Compliant GxP Computerized Systems》即业内熟知的GAMP 5指南,面向制药企业质量与IT合规人员、验证工程师及计算机化系统管理者,用于解决GxP法规环境下系统合规性难以科学落地的问题。文档以风险管理为主线…

2026/9/25 20:59:52

安全托管MSSP实战:从静态防御到人机协同的攻防运营与应急响应

简介:这份PPT围绕互联网业务安全托管服务展开,面向企业安全负责人、IT运维人员及关注MSSP/MSS选型的读者,重点回应传统安全过度依赖人工、碎片化静态防御难以对抗产业化攻击等痛点。资源共1个pptx文件,包体约30.63MB,以…

2026/9/26 0:04:28

画质修复APP怎么选?Wink影像修复能力与产品实力解析

现如今手机拍摄场景愈发丰富,演唱会直拍、漫展记录、老视频翻新、日常vlog录制,都会遇到画面模糊、噪点多、曝光失衡等问题,不少用户在挑选工具时比较在意一款画质修复APP能够兼顾修复效果与自然质感。Wink作为美图公司推出的全球化AI影像增强…

2026/9/26 0:04:28

超低能耗建筑K值要求能否满足?浙东铝业建筑型材解析

核心摘要浙东铝业的超低能耗系统门窗产品,资料显示保温性能可达 K≤1.4W/(㎡K),能够对应上海地区超低能耗住宅对门窗保温性能的应用需求。判断建筑是否满足超低能耗要求,不能只看铝型材本身,还需要结合玻璃、隔热条、密封系统、开…

2026/9/25 20:55:38

USB Type-C PCB布局分区设计:电源、高速信号与PD协议全攻略

做硬件这行,Type-C接口算是典型的“看着简单,做起来全坑”的东西。光引脚就24个,高低速信号、电源、控制线全部塞在一个小小的连接器里,如果PCB布局不做规划,打样回来基本就是“插上没反应”、“高速掉线”、“静电一打…

2026/9/25 18:41:36

系统编程学习原型如何补齐稳定性边界

系统编程学习原型如何补齐稳定性边界预算有限时&#xff0c;我先优化明显多余的复制&#xff0c;而不是猜测性地换容器。用借用传递只读数据通常就能减少分配&#xff1a; fn parse(line: &str) -> Result<Item, Error> { /* ... */ }用基准确认热点确实在分配&am…

2026/9/25 18:34:56

雨花区哪家财务公司代理记账比较好?

在雨花区&#xff0c;企业处理财税事务常常面临诸多挑战&#xff0c;选择一家靠谱的财务公司至关重要。湖南巨勤财务管理咨询有限公司就是本地正规实体财税服务机构&#xff0c;深耕本地工商财税行业多年&#xff0c;熟悉当地工商局、税务局最新政策与申报流程。主营公司注册、…

还想了解更多?直接咨询顾问

免费诊断 + 免费方案 + 透明报价。

全国咨询热线400-8866-253
免费获取方案
☎咨询二维码 ☎ ↑