caveman 深度评测:10.8 万 Star 的省 token 技能,简介还写 65%,自家文档只认 8.5%

caveman 深度评测:10.8 万 Star 的省 token 技能,简介还写 65%,自家文档只认 8.5%

用 Claude Code 的人大多盯着屏幕右下角那个额度条一路往下掉,然后就习惯性地把指令写得更短一点(prompt,也就是你给 AI 的那句要求)。有个开源技能说不用——让 AI 反过来说话短点就行,最多能砍 65% 的计费单位(token,模型读写文字的最小单位,也是账单单位)。它叫 caveman,中文圈一般叫「洞穴人」,从 Hacker News 头条一路火到 10.8 万 Star。

我把它的仓库整个搬进隔离沙箱,逐项复现:它自己提交在仓库里的评测快照、它自带的基准测试(benchmark,也就是一套标准考题)脚本、404 个自动化测试,以及那份写着 65% 的仓库简介。结论先放这:它省的是 AI 的「嘴」,不是「耳朵」,而 65% 这个数字只对聊天式问答成立——真实编码任务上,官方第三方实测是 8.5%。

它是什么,怎么做到的

caveman 不是一个模型,是一层「说话纪律」。装完之后 AI 还是那个 AI,只是回答从求职信变成了电报稿。它规定得很细:

  • 删冠词、删客套、删「当然可以」「这是个好问题」这类开场白,删「just / really / basically」这类纯填充词
  • 代码、命令、文件路径、报错原文一字不改。它专门写了一句话:只有代码周围的散文会被压缩
  • 安全警告和「你确定要删库吗」这类不可逆确认,自动切回完整句子,做完再切回去

最反直觉的一条是它禁止为了「像原始人」而加词。别人模仿原始人会说 when it not,它说这比 when not 多花一个 token,却表达同一件事,属于净亏——压缩是唯一的风格。它的规则文件里甚至把「自己造 cfg / impl / req 这类缩写」列为禁止项,理由是分词器会把它们切成和完整单词一样多的片段,零节省,读者还得多解码一次。这一条是我在这个仓库里读到最有工程味的地方:它不装傻,它算过账。

等级分成日常三档(轻、标准、极简)和文言三档,默认是标准档。文言档在中文上按「汉字数」而非 token 数宣传削减,规则里自己标注了这个区别。

除了「管说」的技能本身,仓库里还有两层「管读」的东西:一个跑在本机的代理程序,把日志、测试输出、结构化数据、网页抓取结果在你发给模型之前先压一遍(原文落在本地数据库,随时可以取回);以及一个可以塞进你自己代码里的中间件。这两层是商业许可,不是开源(下面第 6 条细说)。

实测:我把它的评测快照跑了一遍,也把它的测试跑了一遍

⚠️ 先说清楚边界:真跑一轮「带技能 vs 不带技能」的模型对比,需要 Claude Code 命令行加商业接口额度,评测机不具备。所以下面凡是模型生成的分数,都是仓库自己提交的数据;我复现的是这些数据的算法、结论口径和一致性。

第一步复现快照。仓库里存着一次完整评测:10 道开发问题、每道题跑三种条件(不加系统提示 / 只加一句「Answer concisely.」/ 那句加上技能全文),模型是 claude-opus-4-6,生成时间 2026-04-08。我按它自带的评测脚本口径重算(它用 tiktoken 这套开源分词器数 token):

十道题 只加「简短回答」 加上 caveman 削减
解释数据库连接池 339 41 省 87.9%
为什么会 CORS 报错 328 138 省 57.9%
哈希表怎么处理冲突 167 103 省 38.3%
怎么修 Node 内存泄漏 227 226 省 0.4%
十题合计 2,045 1,026 中位省 50%、均值省 46%

三道题的表现就是这个技能的完整画像:问题越像聊天、越要让 AI 讲道理,省得越多;问题越像「给我代码」,省得越少,甚至一分不省。十道题里最差的那道只省了 0.4%(227 token 变 226),而离散度是 24.7 个百分点——这意味着「省 50%」这个中位数容易让人误以为稳定,其实它是一堆差异极大的结果平均出来的。

第二步,找矛盾。同一个仓库里,它的首页文档引用了两家第三方的测量:Adobe 研究院的论文测出输出侧压缩把实际成本降到 1/1.4 到 1/2.4(最好情况 1/3);JetBrains 用 86 个真实编码任务做配对 A/B,测出省 8.5% 的输出 token、约 10% 的成本,而且这是「强制开启」的上限值(自动触发只会更少),质量上没有可检测的退化(符号检验 p = 0.82,82 组配对里 8 题更好、10 题更差、64 题打平)。

10 道聊天题省 50%,86 个真实编码任务省 8.5%。差距不是谁在撒谎,而是分母换了:在编码 agent(也就是能自己多步干活的 AI 程序)里,token 大头是代码和工具调用,而 caveman 明确不动这两样。它自己在首页文档里也把两句话并排写出来,这点是诚实的。

第三步,也就是这篇文章真正的发现:65% 这个数字,仓库早就把它从后端撤了,只剩 GitHub 简介还挂着。可复现的证据链有三条:

  1. 它自己的《诚实数字》文档里,输出削减那一栏写的是「未公布(Not published)」,理由是没有提交过经过复核的原始结果。
  1. 首页本该放基准表格的位置,是一段 HTML 注释占位,写着「这里尚无经过复核的接口基准结果」。
  1. 提供「已省多少」的后端统计早就不报数字了,代码注释里写明历史上的固定比例字段已不再使用,状态栏也不再显示节省百分比。
  1. 但 GitHub 仓库简介今天仍然是原话:「cuts 65% of tokens」。而这不是没发现——仓库在 2026-07-02 的提交里自己写了一句:「GitHub 仓库简介还写着『cuts 65%』,应该改成『约省 50-65% 输出 token(实测)』。本地提交改不了它。」

时间线更能说明问题:7 月 2 日先把宣传从「约 75%」改成「约 50-65%」并补上方法;7 月 3 日又发了一个提交,把「所有产品面」统一拉平成一句话 65%;直到 9 月 8 日,后端口径才撤回成「只报告日志里真实显示的内容」。一次改小、一次改回大、一次撤数字——三次里改动最小的那个位置,恰好是唯一改不动的地方。

顺手还挖到两个快照本身的问题,都属于「数字对不上现在的仓库」。

一是这份快照是 2026-04-08 一次跑完的单轮结果(每道题每种条件只跑一次、默认温度、没有显著性检验),而它测的那个技能文件在之后又改过 22 次,最近一次是 9 月 8 日——也就是说这份「50%」代表的不是今天的 caveman。

二是快照里参与竞速的四个技能中,中文版和西语版两个已在加入的次日删除,「压缩」那一路也已改名;而现在技能目录下躺着 20 个技能文件。这段对比数字连参赛者名单都对不上今天。

第四步,跑测试。仓库指定的测试命令是 node --test tests/installer/.test.mjs tests/hooks/.test.mjs。我在沙箱里跑完 404 个:381 通过、17 跳过、6 失败。

其中 3 个我看过失败原因,属于我们沙箱侧的限制:一个是容器里 /tmp 与根目录不同设备、跨设备硬链接被拒,两个是同时跑多个测试用例时 Node 起线程池撞上沙箱的进程数上限。

另外 3 个都跟 OpenClaw 的自动检测有关,我尝试把 OpenClaw 从系统查找路径里隔离后仍然复现——它们的失败信息是「没找到 OpenClaw 工作区」。

不下定论说这是仓库缺陷(真实用户的机器环境千差万别),但可以确定的是:这 6 个红不是「装了 OpenClaw 的机器才有」那么简单。

第五步,量体量。最近 30 天有 100 次提交、分布在 11 天里,持续集成流水线累计跑过 516 次、最近 5 次全绿;140 个待处理 issue,npm 上的命令行工具近 30 天下载 83,484 次。一句话:这不是蹭热度的仓库,维护强度是实打实的。

和同类比,你该装吗

「省 token」这个赛道其实分三层,装之前先分清你要省哪一层。

压读的一层:flowctx 走 OpenClaw 上下文引擎,实测砍 56% 输入 token 且解题率没掉;context-mode(也就是「上下文模式」)用 MCP 沙箱(MCP,也就是模型上下文协议、给 AI 接外部工具的通用接口)把 315KB 的工具输出压成 5.4KB。

压说的一层就是 caveman,以及管输出风格的 i-have-adhd。再往上是 ECC 这类整体工程纪律。这三篇我们之前都单独写过,文末可以顺着看。

caveman 的位置很特别:它是唯一同时做「说」和「读」的,而「说」那一半是 MIT 这种最宽松的开源许可、免费永久,「读」那一半要装本地代理。

第 6 条得单独说,因为它影响「能不能用在公司项目里」:这个仓库是混装许可。

技能目录、命令行工具、开发套件都是 MIT;但真正做压缩的几块——压缩引擎主体、本机代理、改写器、网页驱动、命令行输出压缩——是被称为 BSL-1.1 的商业许可,不是开源促进会认可的那种开源。

它允许你自用、自托管、内部生产使用,但不允许把它作为托管或嵌入式服务提供给第三方,那需要单独商业授权;变更日是 2030-06-21,届时转成 Apache 2.0。GitHub 接口给出的许可字段是「无法识别」,正是因为这个混装。

你想核实的 去哪看(都在仓库里) 我跑出来的
评测快照与算法 自带的评测目录,含结果快照与评测脚本 十题合计 2,045 → 1,026 个计费单位,中位省 50%
「未公布」的原话 文档目录里的《诚实数字》页 输出削减一栏确为「未公布」
测试命令与结果 项目配置里声明的测试命令 404 个用例:381 通过 / 17 跳过 / 6 失败
沙箱侧两个失败的成因 一个是跨设备硬链接被系统拒绝,一个是线程池起不来 均与沙箱限制一致,非项目缺陷
许可混装 根目录的许可文件与逐目录许可说明 逐目录列明,引擎相关目录为商业许可

最后是我实测下来觉得该提醒的三件事。

一,规则文件本身每次调用都要作为输入发一遍,当前那份技能正文约 1,650 token(按同一个分词器算),短问答里它可能比需要的还贵——仓库自己的 issue 里就有用户测出净亏。

二,按请求或按积分计费的工具(比如 GitHub Copilot 那类按「次」算的),回答短了还是同一次请求,一分钱省不下来。

三,首页公开过一条用户自测:某个 Cursor 的 A/B 里带 caveman 反而花了 430 万 token、对不带的 100 万,耗时还翻倍;仓库承认这条无法复现。

所以正确读法是——规则重复注入、以及缓存(也就是把算过的结果存起来、下次直接用)计费这两件事,能盖过输出端的节省,请在自己的任务上量一遍。

判断

装,但要装着正确的期待。它是一层写作纪律,不是省钱魔法:你的活越像聊天、越按 token 付费、回答里散文越多,它越值;你的活越像「给我代码」、越按次数付费,它就越接近零。8.5% 是真实编码任务上的上限,不是地板;50% 只在十道聊天题里成立。项目真正值得学的地方,反倒是它那份把「我什么时候会亏」写进文档的自觉——以及它到现在还没改掉的那句 65% 简介,提醒所有人:仓库里的数字会随文档更新一起改,产品页面上的那句话不会。

关注 AI商业快讯,每天一篇 AI 热点深度解读。

相关阅读:

ayghri/i-have-adhd 深度评测:5.1 万 Star 的输出样式技能,14 项评测 10 胜 2 平 2 负、自带发布闸门却判 FAIL,我复现了全部 70 个测试

ayghri/i-have-adhd 深度评测:5.1 万 Star 的输出样式技能,14 项评测 10 胜 2 平 2 负、自带发布闸门却判 FAIL,我复现了全部 70 个测试

如果你用 AI 编程,每天至少要被这样一段话浪费掉一次注意力:「这是个好问题!让我想想。你的认证流程有几个环节,中间件、令牌校验、Cookie 处理……另外你的依赖版本好像也旧了,顺便说一句……希望对你有帮助,有需要随时问我。」 你问的是「怎么修」,它答了三百字,你读完还不知道第一行该敲什么。

有一个开源技能就是专门治这个毛病的。它叫 i-have-adhd,5 个月前出现在 GitHub 上,现在 5.1 万 Star。它的做法和你见过的「请简洁一点」完全不同:它写死了 10 条输出纪律——第一行就给可执行动作、多步任务必须编号、每轮都要复述进度、列表最多 5 条、禁掉「好问题」这类开场白和「希望对你有帮助」这类收尾。

它最有价值的地方不是这 10 条规则,而是它自带一整套评测。项目作者写了一台机器,拿 14 道题让同一个模型分别在「不带技能」和「带技能」两种情况下作答,再让评分模型盲评五个维度。结果是五个维度全线上涨,加权总分从 4.045 涨到 4.473。

但真正有意思的是接下来这件事:它自己的发布闸门,把这份成绩单判成了 FAIL。 项目里白纸黑字写着「发布门:未通过」。原因不在分数,在下文那张表。

它是什么,怎么做到的

先说清它到底是个什么东西。i-have-adhd 是一份给 AI 看的写作规范,一份纯文本文件,把 10 条输出纪律写进去。你把它装进 Claude Code、Codex、Cursor、Gemini CLI 这些编码助手(也就是能自己读文件、跑命令的 AI 编程工具),它就会在每次回答时被读一遍,管住输出的形状。

我把它 clone 下来逐层拆了一遍。整个项目 245 次提交、48 位贡献者,从 5 月 13 日建仓到现在 4 个多月,热度没有掉(最近 30 天还有 59 次提交,一周前刚合过代码)。规则本身只有 142 行、1187 个英文词——按比例换算大约 1700 个 token(也就是模型读写文字的最小计量单位,同时也是计费单位),这就是它每次回答要额外付的开销。

10 条规则里,前 3 条是核心,其余 7 条都在给这 3 条堵漏:

规则 一句话要求 它想治的病
1 动作先行 第一行就是能跑的指令、路径或代码 开场先铺垫背景
2 多步编号 一步一个动作,不许「然后」套「然后」 步骤糊成一段
3 末尾给一个下一步 指明 2 分钟内能做完的那一件事 结尾用「随时问我」收场
7 让完成可见 「登录能用了,去跑这个命令」 把成果埋在复述里
9 列表封顶 5 条 排序后只显示 5 条,其余留在内部 一口气甩 20 条清单
10 无开场白、无复述、无客套 删掉「好问题」「希望对你有帮助」 AI 味最重的两头

有个设计我认为值得单独说:规则 9 特意写了「只在展示层收敛,不许丢信息」——它只压缩你看到的清单,不压缩它搜过的结果。这一条是被用户骂出来的,我在下面「翻车点」里细说。

实测:我复现了全部 70 个测试,也复现了它自己的判据

它自带的评测有三层,我从最便宜的一层往上跑,全部在隔离沙箱里完成(一次性的容器式沙箱,跑完即删,不碰本机环境)。

第一层:70 个自动化测试,我逐个复现。项目里有 7 个测试文件,覆盖会话钩子、评分脚本、评测调度、安装文档路径、多平台打包。我按它官方 CI 用的同一套命令跑:

测试文件 用例数 我的结果
会话钩子(always_on_hooks) 7 全过
盲评脚本(judge) 17 全过
评测调度(run_evals) 25 全过
场景评测(run_scenario_eval) 7 全过
安装文档(install_docs) 2 全过
打包(omp_package) 2 全过
OpenCode 插件 10 全过
合计 70 70 过 0 挂

这里有个插曲值得记:第一次跑,有 2 个用例挂了,报错是「找不到 awk」。我一开始以为是仓库的 bug,追下去发现是我的沙箱问题——那两个用例调用一个文本处理小工具,而它在系统里是通过一条软链接间接指向真身的,我的沙箱只读挂载了主程序目录、没挂那个软链接目录,于是「工具在,但找不到」。我把真身直接接进去再跑,7 个用例全过。

也就是说:这 2 个失败是我的环境造成的假阳性,不是项目缺陷。我把它写出来,是因为「评测翻车往往是评测者自己的问题」这件事,比 70 个全绿更常见。

第二层:评测清单能跑通。项目的评测调度脚本有两个命令:一个校验 14 道题的清单格式,一个打印「要跑哪些组合」。前者输出「用例有效」;后者按 3 次重复 × 14 道题 × 3 种条件(不带技能 / 带技能)算出 126 次作答的排期。这两步我都跑通了,说明评测脚手架本身是好的。

第三层:评分环节我没有跑通,原因必须说清楚。项目的评分流程要用命令行调用 Claude Code 或 Codex(也就是 Anthropic 和 OpenAI 的编码助手命令行),由它们实际生成作答、再盲评打分。

我这台评测机没有装这两个工具、也没有对应的商业 API 额度,所以我无法自己生成那 126 次作答,也就无法亲手复核那五组分数。下面的数字来自项目公开的成绩单,不是我跑出来的——这一点我在文末的口径说明里再强调一次。

它自己那份成绩单是这样的(同一模型、14 道题 × 3 次重复,共 84 份作答,盲评时被打乱成 A / B / C 三组、评委不知道哪份带技能)。五个维度各自满分 5 分,带技能后全部上涨:

  • 正确性(权重 35%):4.333 → 4.524,涨 0.190
  • 自主性(25%):3.762 → 4.167,涨 0.405
  • 可执行性(20%):3.905 → 4.619,涨 0.714
  • 安全性(10%):4.643 → 4.667,涨 0.024
  • 简洁度(10%):3.429 → 4.571,涨 1.143
  • 加权总分:4.045 → 4.473,涨 0.427

最值得看的是「正确性」和「安全性」也在涨——这两项权重最高,而且向风格类改动要收益是最难的:一般「让 AI 说短点」的做法,最容易拿简洁度换掉正确性,表现成「答得更短,但也更不准」。它在这里没有掉,说明压缩的是废话,不是内容。

再细一层,14 道题里它 10 道赢、2 道平、2 道输。涨幅最大的两道是「多步任务报进度」和「报错怎么说」——加权分分别涨了 2.53 和 2.40,这两道题几乎贡献了全部总分增量。而「写代码」和「写长文」两道题是零变化:题目本身就规定了输出格式,技能没有乱插手。这个「该让的时候让了」的结果,比总分上涨更能说明规则设计得克制。

翻车点:它的发布闸门判自己 FAIL,这事不能算小事

现在说开头那个反差。项目里有一份发布门规则,写着 4 条放行条件,其中第一条是「不得存在任何阻断问题」。它自己跑出来的结果是:不带技能 7 处阻断问题,带技能 3 处——砍掉了一半以上,但发布门依然 FAIL。

因为那条规则写的是「零」,而不是「比之前少」。所以一个把缺陷数量砍掉 57% 的版本,和原版一样被拦下。这不是分数问题,是判据的写法问题,项目自己也在文档里点破了这一点:按这条规则的字面意思,只要题目集里还剩下任何一处阻断问题,任何版本都永远不可能通过,无论它改善了多少。

这个设计我认为是本项目最耐看的地方,也是最该被别家抄的地方:它的成绩单和它的发布门是两台独立的机器,而且发布门比成绩单严。 绝大多数开源项目的「评测」是自我介绍,它的评测是准入门槛,并且真的拦住了自己。

那 3 处没消掉的阻断问题里,有 2 处集中在一道题上。项目的解释是那道题没有任何一次运行能通过:题目要求 AI「直接改仓库,别把修改交回给用户」,但评测时所有命令行都被设成了「不加载任何工具」,于是没有一次作答真的能动手。这是题目本身的缺陷,不是技能的问题。

把这道题排除后,计数变成「不带技能 5 处、带技能 1 处」,发布门按同一条规则判,依然 FAIL。

真正值得警惕的是剩下那 1 处,它指向技能本身的一个副作用。题目给的是「三个检查跑完:代码风格检查通过、单元测试通过、集成测试失败」这种证据不全的场景。带技能的作答给出了一份很笃定的判断——「缺认证请求头就是确定原因」——而评分者认为这句话在没有任何诊断证据的情况下把猜测写成了定论。

机制说得通,而且技能作者自己把它挂成了公开 issue:第 8 条规则要求「报错要说清原因和修法,不许用『哎呀』『好像有问题』这种口气」。原文照字面执行,就等于逼模型必须给出一个原因;而证据不足时,它就会去猜一个。作者在 issue 里也承认这个推论样本不够(只有 3 次重复,其中 2 次明显下行、1 次持平),但方向和机制都对得上,所以标为「值得加更多重复次数去验证的那一个」。

从工程角度看,这几乎是一道送分题的陷阱:「说清原因」和「不许无依据断言」在证据不足时会打架。我自己写技术文档时也踩过——把「可能是 X」改写成「就是 X」能让句子更干脆,代价是撒谎。

另外三处来自真实用户的抱怨,也一并列出来:

  1. 规则 9 被理解成了硬性的 5 条上限。一条 15 人讨论的 issue 里,用户反馈它不只是把长清单分成「现在做 / 以后做」,而是直接砍到 5 条,把后面的信息丢了。作者的回应是正在把规则改成不写具体数字的写法。

这解释了为什么现在的规则正文里反复强调「只在展示层收敛、不许丢信息」——那是事后补上的补丁。

  1. 在某个模型上严重退化。有用户报告在 Grok 4.6 上开启后,AI 变得「只会描述步骤、不肯动手」,多步推理也明显变差;同配置在 4.5 上正常,关掉技能立刻恢复。这是模型相关的水土不服,不是普适缺陷,但说明输出规范类技能并非对所有模型都安全。
  1. 加载方式有兼容性坑。有 issue 指出技能文件头部的元数据写法(嵌入了一层嵌套对象)会让严格按规范解析的客户端直接跳过这个技能,报告者贴出的报错显示某个客户端解析失败后就不加载了。

局限也要说清:它的评测只有 3 次重复、且评委模型和作答模型是同一家。项目自己在文档里承认,单题标准差最高到 0.95,单题涨幅低于约 0.5 就不该当作信号,只有汇总分比较可信;同时评委和选手同源会带来偏好偏差,理想的对照组应该换一家模型来评。换句话说:+0.427 这个总变化可以参考,那张逐题表里的小数不要当真。

判断:谁该装,谁别装

装它的理由:如果你的痛点是「AI 答得没错,但读了半天不知道该干嘛」,这就是最对症的一类工具,而且它是纯文本改写、没有任何运行时依赖——没有需要单独安装的程序、也没有常驻后台的进程,最坏情况下它只是不生效。参数上也很清楚:每次回答多花约 1700 个 token(整个规则文件的长度换算而来),换来加权分 +0.427、劣势项「简洁度」+1.143(均为项目自测,非我实测)。

别装的情况:如果你的任务是让它写长文档、做方案评审、要它展开讲原理,它的 10 条规则里至少 3 条会和你打架。

好在技能文件里专门留了「什么时候可以破例」一节,明确写了「用户要求解释时,就完整解释」——这道逃生门是设计的一部分,不是补丁。

判断的分界线是:你更常被「答案埋在废话里」烦,还是更常被「回答太短不够用」烦。前者装它,后者绕道。

还有一点值得单列:它值不值得学,跟你用不用它无关。这套东西真正可复用的不是那 10 条规则(规则本身多数人一看就懂),而是「给自己配一台独立的、会拦住自己的验收机」这个习惯。同一批开源技能里,绝大多数把「我们做了评测」当勋章挂着,成绩单漂亮就够了;这个项目多走了一步——让成绩单和发布门互相独立,并且让发布门判自己 FAIL。它那条「零阻断才能发布」的规则写得过于绝对,项目自己也承认这是个「该在发版前特意拍板、而不是发版时才发现」的性质问题——但肯把这条规则和它判自己失败的结论一起公开,比一个漂亮的百分比更有价值。

项目地址:ayghri/i-have-adhd(MIT 协议)。技能全文 142 行,直接复制 skills/i-have-adhd/SKILL.md 到你的技能目录即可,不必装整个仓库。

口径与利益声明:本文作者与该项目及作者无任何商业关系,非付费用户,未接受任何形式的赞助或评审授权。文中「70 个测试全绿」「沙箱复现」为作者在隔离沙箱中对 ayghri/i-have-adhd 主分支实测结果;五维分数、14 道题的胜负分布、「7 处砍到 3 处」等数字来自项目公开的成绩单(2026-08-02 记录),非作者实测,原因是本项目评测需要商业模型命令行与对应额度,评测机不具备。仓库元数据(5.1 万 Star / 2,965 fork / 245 次提交 / 48 位贡献者 / MIT)抓取于 2026-09-27。该项目无版本号发布(无 tag、无 release),文中所述为 2026-09-19 的主分支状态。

相关阅读:

关注 AI商业快讯,每天一篇 AI 热点深度解读。

addyosmani/agent-skills 深度评测:9.9 万 Star 的 25 个工程技能,自带评测 100% 全绿,我实测只对 24%

addyosmani/agent-skills 深度评测:9.9 万 Star 的 25 个工程技能,自带评测 100% 全绿,我实测只对 24%

如果你给 AI 编码助手装过技能包,大概遇到过同一个尴尬:装是装上了,可它该触发的时候不触发,不该管的事又抢着管。一个 25 个技能的包里,你想用的那个到底会不会被选中?

addyosmani/agent-skills 这个仓库给出了一个罕见的答案:它自带评测套件、把通过率写进 CI 当门禁。我把它 clone 下来跑了一遍——官方跑分 100%,我按真实用户的口吻出题,只剩 24%。差别不在项目好坏,在于它的评测用的是书面语,而你说话不是。

它是什么,凭什么 9.9 万 Star

一句话定位:把资深工程师的工作流、质量闸门和验收标准写成 25 个可自动触发的技能,让 AI 编码助手在每个开发阶段都照着做。作者 Addy Osmani 是 Google 的工程负责人,仓库 MIT 许可,JavaScript 为主,创建 220 天冲到 98,752 星、10,372 个 fork,一天前还有提交。

它的设计思路不是「教模型更聪明」,而是「给流程装栏杆」。开发被切成六段——定义、计划、构建、验证、审查、上线——对应 9 个斜杠命令,每个命令自动激活相关技能:

阶段 命令 核心原则
定义 /spec 先写规格再写代码
计划 /plan 任务切到原子级
构建 /build 一次只推进一薄片
验证 /test 测试就是证据
审查 /review 先提升代码健康度
上线 /ship 更慢反而更安全

技能本身不是空话。25 份 SKILL.md 合计 7,519 行,平均 301 行,最长的是 performance-optimization(496 行)。随手翻一份 doubt-driven-development,它先把「什么算非平凡决策」定义清楚——引入分支逻辑、跨模块边界、断言编译器验不了的属性、爆炸半径不可逆——再明确列出不该用的场景:重命名、格式化、用户已明确要求提速。「怀疑每一次按键就什么都发不了」写在正文里。这种自我设限,比多数「万能提示词」克制得多。

真正让它区别开的是 evals/ 目录:82 个文件、25 份用例、25 套 fixture,外加 13 个校验脚本。分三层——结构层查 frontmatter 和命名,路由层查触发准确率,行为层用真实 agent 跑用例打分。前两层免费且在 CI 里强制执行。

实测:100% 与 24% 之间差了什么

官方路由层评测的门槛写在 CI 里:node scripts/run-evals.js --min-rank1 95。我在这台机器上原样跑了一遍,结果是 88 条正向提示全部命中自己的技能,rank-1 准确率 100%,140 项检查零错误零警告。

这个数字很漂亮,但它是怎么来的?我读了 runner 的实现:它把所有技能描述做成词袋,用带词干还原的 TF-IDF 向量算余弦相似度,取最相近的那个。也就是说,它比的不是语义,是用词重叠。

于是我做了一件事:不看它的测试集,自己写题。同一批技能,换三种问法。

第一组是啰嗦口语,就是人真会说的话——「应用点保存就崩了,我也搞不清为啥」这种带噪声的长句。21 条里只对了 5 条,rank-1 准确率 24%。第二组换成中等长度的书面请求,12/15 命中,80%。第三组压到 3-6 个词的短语,9/10,90%。

为了排除「我写得太怪」的可能,我又做了一组严格对照:同一个意图,写成短语、标准句、啰嗦口语三种版本各 10 条。

问法 rank-1 准确率 top-3 命中
短语(3-6 词) 90% 90%
标准书面句 100% 100%
啰嗦口语(带噪声) 40% 80%

变量很清楚:提示越长、噪声越多,词法路由器越容易被无关词稀释掉关键信号。它认的是关键词密度,不是你想干什么。

还有一组更直接的证据。我把作者 88 条测试提示与对应技能描述的词汇重叠率算了出来:平均 56.2%,其中 57% 的条目重叠率超过一半——「write a failing test」对上描述里的 test,「pull request」对上描述里的 code review,几乎是原词照抄。我自己写的那 21 条,平均重叠率只有 12.6%。

最后是消融实验:把每条提示里与技能描述重叠的实词删掉,保留其余部分,重新路由。结果 rank-1 从 100% 掉到 2%,top-3 也只剩 7%。词一拿掉,路由器就不认识自己的技能了。

需要说清楚的是,这不等于项目在造假。它的评测文档把话讲得很明白:路由层是「词汇近似」,判不了语义,抓的是两种真实故障——描述缺了用户会说的词,或描述太宽泛挤掉了正确的技能。这套检查确实管用,而且它有个真本事:25 个技能描述两两比余弦,300 对里最高只有 0.260,离 0.5 的告警线还很远。也就是说,这套技能的边界互不打架,这在同类技能包里相当少见。

翻车点在别处。它的分词正则只保留 a-z0-9,中文字符会被整体清空——我用纯中文提问,分词结果直接是空数组,所有技能得分都是 0.0000,排序退化成按目录顺序。中文用户拿到的是一个完全失效的路由器。另外 25 个技能里有 5 个叫 *-driven-development(constraint / doubt / source / spec / test),命名高度雷同,靠名字区分基本不可能。行为层(Tier 3)要调真实模型、花 token,我在这个克隆里没找到任何历史结果文件,evals/skill-impact.md 是一张只有表头的空账本——「哪些改动被评测否掉了」,目前无从查证。

放到同类里看

技能路由这个题目,最近一个月已经有三篇值得对照。

reverse-skill(36.9k 星)同样是路由包,我实测它自己的 178 条路由全绿,而我出的 56 条错了 7 条——和这里的结论几乎一致:自测集通过率高,不等于你的问法能过。mattpocock/skills(254k 星,37 个小工具)走的是反面路线,明确拒绝流程绑架,不做统一编排。Spec Kit(13.7 万星)长成了插件市场,169 个社区扩展实测八成已休眠——规模上去之后,维护是另一回事。

适合谁:团队里用 Claude Code、Cursor、Codex、Copilot、Cline、Gemini 等 8 种以上助手,且希望把「先写规格、测试先行、上线前审查」变成默认动作的人。25 个技能可以整体装,也可以单装——npx skills add addyosmani/agent-skills --skill code-review-and-quality 这样点名取用。

不适合谁:技能内容全是英文,中文团队要用得自己重写描述;如果你只想要一两个技能,整包 7,519 行的体量反而增加上下文负担;如果你的诉求是「让 AI 更聪明」,这套东西治的是纪律,不是智力。

结论

9.9 万 Star、25 个技能、7,519 行内容、CI 里跑着 100% 的评测——这个仓库的工程质量在同类里是第一梯队。但它的路由评测是一把词法尺子,量的是「用户的用词和描述的用词有多像」,而不是「用户想干什么」。所以看到任何技能包宣称「触发准确率 100%」,值得多问一句:你的测试提示,是谁写的、照着什么措辞写的。

我的建议是放进观察清单并试用,但装完之后用自己的话测一遍你最常用的三个场景——如果它没触发,你要改的是技能描述,不是自己的说话方式。

关注 AI商业快讯,每天一篇 AI 热点深度解读。

相关阅读:

reverse-skill 实测:36.9k 星的技能路由包,它自己 178 条路由全绿,我出的 56 条错了 7 条

reverse-skill 实测:36.9k 星的技能路由包,它自己 178 条路由全绿,我出的 56 条错了 7 条

132 天 36,908 星,平均每天约 280 个 star——reverse-skill 是近期安全向 Agent 技能里涨得最快的一个。它的判断很简单:AI 不是不会用工具,是不知道该用哪个工具,于是把 44 条路由规则摆在最前面,让 jadx、IDA、Frida、Burp 先各归各位,再进入 45 个场景模块里的那一个。仓库自带 178 条路由回归用例,我在 Linux 上全量跑完,178 条全绿;随后自己出 56 条对抗用例,它错了 7 条,其中 3 类是真问题——最典型的一个 bug,会让「sandbox escape」这种标准提法被路由去分析恶意软件。

一个「先选剧本再动手」的技能路由包

拆开仓库,它由三层组成:单一事实源 skills/config/routing.json(15,089 字节,44 条规则按优先级排列,每条规则由 must 命中、mustAll 全中、exclude 一票否决三段组成)、45 个场景模块的 SKILL.md,以及一套 bootstrap 脚本负责探测本机工具链。路由产出 PRIMARY/SECONDARY 两档 skill 路径和置信度(high/medium/low),还附带 case-init 流程:授权范围与网络档没就绪之前,不许对真实目标动手。

项 我实测的数字
路由规则 44 条(R0–R45,R0 为兜底),优先级链单独列出
场景模块 45 个 + 根路由 SKILL.md,INDEX.md 由脚本自动生成
CTF 子技能 41 个 competition-* 目录、42 个 SKILL.md
SKILL.md 合计 46 个、324,983 字节,按 1.8 字节/token 约 18 万 token
首屏负担 主路由只读 routing.json + MASTER-ROUTING.md(7,435 字节),模块按需展开
提交与人力 181 次提交、15 位贡献者(前三名 42、36、36 次)

上手路径也是三条:给 Claude Code 装 reverse-skill 插件、复制仓库根的 AGENTS.md 到项目 AGENTS/、或 git clone 后用 master-route.sh 单独跑路由——仓库为 Claude、Codex、OpenCode、Cursor、Copilot、Gemini 各准备了各自的桥接文件(CLAUDE.md、AGENTS.md、opencode.json、GEMINI.md 等),最小加载路径甚至可以为零。我在干净的 Alpine 沙盒里跑了 bootstrap:--list 列出 23 项发现能力、7 个工具组、4 条纪律(只发现不激活、MCP 默认不注册、每个安装给一行理由、端口只读探活),并直接点名缺 java、jadx、frida、radare2;它的工具索引刷新后给出 34 项清单,只有 5 项在沙盒里可用(python3、node、npm、npx、burp-mcp-full),每个缺失项都带 install_hint。路由的判定逻辑可以一句话概括:must 命中、mustAll 全中、exclude 一票否决,同分时按优先级链仲裁——官方基准里就有「ghidra + .so」这种用例:两条规则都命中,预设路由是 ghidra 而不是 IDA,靠的正是优先级而非关键词数量。

我抽开了被路由频次最高的 apk-reverse 模块:11,727 字节、14 个 H2,开头是五步 ACTION REQUIRED——NOW 读 precedent-reverse.md 确认这是已授权的常规操作、NOW 核对适用范围、NEXT 查 tool-index.md 校验工具真实路径、缺工具就调 bootstrap 而不是猜路径、ACT 进工作流第一步别停在确认状态;结尾则是「任务完成自检(声称完成前 MUST 通过)」,中间夹着工具分工、自带脚本、禁止事项、输出要求、路由上下文和按需自举六段。相邻的 mobile-reverse 是 6,234 字节,结构同款。首尾各一道强制协议,比在提示词里写一句「要注意安全」硬得多——agent 想跳过,得先跳过自己刚读过的清单。

授权边界在这套体系里不是口头约定。master-route.sh 的下一步是 case-init:先写 scope 文件,声明 authorization_ready(靶标、测试账号、时间窗)、network_profile(read_only / controlled_active / active 三档)和 response_format(no_write / read_only / active),三者没对齐之前,R45 的强制 scope 检查不让任何 ACT 动作落地。配套的 RULES.md(中英两版)还写了更细的硬约束,比如单个红队阶段不超过 5 分钟、不超过 15 个动作,收尾必须提交 Evidence → Finding → Path 三件套到时间线,报告格式由 REPORTING.md 模板锁死。换句话说,它把「你有没有资格动手」变成了一个可被 agent 循环反复校验的状态,而不是一句提示词里的情绪表达。

这个体量设计值得单独说一句。我们评测过的 a-stock-data 把 7,288 行塞进单个 SKILL.md,一次加载 11 万 token;reverse-skill 的 46 个 SKILL.md 全量也有 18 万 token,但它是路由型结构,首轮只读十 KB 级的路由配置,命中哪个模块才开哪个——同一堆文档,上下文成本差一个量级。对比同赛道的大星仓库:ECC 25.5 万星管的是工程纪律,marketingskills 47k 星管的是营销流程,reverse-skill 管的是危险动作的顺序与授权边界——这是三者里唯一把「不许对没授权的目标动手」写进流程的。

实测一:它自己出的 178 道题全绿,状态表却写错了

克隆仓库后我把六套测试全部跑了一遍:

测试 结果
test-routing(路由回归) 178/178 全绿;其中 quick 冒烟 44 条、中文用例 103 条、英文 75 条,44 条路由全部有覆盖
test-bash-workflow 5/5,1.9 秒;含网络档校验、未授权拒绝两条安全断言
verify-repository-security 599 个文件全部被跟踪、74 个可执行源、无符号链接,OK
verify-doc-links 全部内部 Markdown 链接可达
bootstrap 两套回归(manifest + client-neutral) 全过
refresh-tool-index 34 项工具只探测到 5 项可用(python3/node/npm/npx/burp-mcp-full),java、jadx、frida、r2 全缺,每项附 install_hint

基准本身的质量高得超出预期:每条路由至少 2 条用例、44 条全覆盖、中英双语,还是跨平台 CI(Windows + Ubuntu)跑的。但README 的 Current status 表把回归基准写成 175 cases,实际文件里是 178 条(基准 meta 停在 2026-08-02)——文档和数据第一次对不上,就发生在最该对得上的那个数字上。治理面同样偏紧:15 位贡献者、18 个 open issue、7 个 closed,唯一的 PR 还挂着,0 个被合并,主线实际上仍是作者一人在推(最新提交 9 月 22 日)。文档滞后一两天不致命,但滞后偏偏发生在 README 首屏的状态表里——后来者第一眼看到的就是一个错数。

实测二:我出的 56 条对抗用例,49 过 7 错

官方基准的用例几乎都含规则里的字面关键词,等于命题人和考生共用一张表。我另出 56 条:口语化重述、中英混合、多个技能域竞争,全部走真实入口 master-route.sh。结果 49 过 7 错(中文 45/51、英文 4/5),单次路由延迟 min 304ms / p50 358ms / p90 683ms。7 条失败分三类:

类型 用例 → 实际路由 判定
子串误命中 docker sandbox escape → malware-analysis 真 bug
关键词不对称 redis 未授权访问安全评估 → R11 通用渗透 真洞
优先级平局 iOS APP 证书校验绕过 objection → apk-reverse 真错
平局取工具方 用 nmap 扫完出个报告 → R11;mysql 注入 → R35 可辩护
口语掉置信 抓一下 APP 的请求看看签名怎么算 → R0,confidence=low 标记正确

第一个是实锤 bug:R9 恶意软件规则的 mustAll 里有一项裸词 cape(指 CAPE 沙箱),没有词边界,于是 “escape” 直接命中。我补测了四个变体:「sandbox escape」「k8s sandbox escape」「escape from sandbox」全部被判给 malware-analysis,只有中文「容器逃逸」落到正确的 cloud-k8s——因为规则写的是 docker.?escape|container.?escape,中间插一个词就不匹配,而官方基准里 R23 的逃逸用例措辞恰好全都带字面 container/docker,所以 178 条自测全绿也测不出这个洞。第二个是规则不对称:mysql、postgres、mongodb 是裸词直达 R35 数据库安全,redis 却要求 redis.?secur 相邻出现,一句「redis 未授权访问」(渗透测试里最经典的一句话)就漏到了通用渗透。第三个是优先级设计:iOS 与 APK 两条规则同时命中时,R1 排在 R2 前面,于是带 objection 的 iOS 任务进了 APK 技能。

我又围绕这个洞补了四个探针:「sandbox escape」「k8s sandbox escape」「escape from sandbox」三条英文全部落进 malware-analysis,「sandbox 逃逸」因为没有 escape 字面、R9 的 mustAll 不成立,干脆跌到逆向工程兜底——同一个意思,换种说法就换来三种不同结局,路由表对英文子串的敏感和对中文语义的迟钝同时暴露。

值得肯定的是置信度机制真的在工作:中文口语「抓一下这个 APP 的请求看看签名」匹配不到任何字面关键词,路由退回兜底 R0 并标了 confidence=low——它知道自己没听懂,这比硬给一个 high 强得多。合起来看,官方基准考的是「关键词表内命题」,我的 56 条考的是「把同一件事换种说法再问一遍」——178/178 与 49/56 之间的差距,就是这套路由在真实对话里的安全边际。

生态、赞助与中文圈的数字滞后

项目挂了三家赞助(UCloud AstraFlow、AtlasCloud、Kite AI),自建了教程站与 star-history 图,并上了 Trendshift 榜。文档纪律倒是罕见地完整:REPORTING.md 约束证据格式(Finding 必须带 PoC、Path、Impact 三件套)、CHANGELOG 记录到最近一次提交(v1.0.1 是唯一正式 release)、RULES 有中英两版,甚至 burp-mcp-full/ 里嵌了完整的 MCP 服务端代码。中文圈已有教程向覆盖:知乎两篇、腾讯云一篇、CSDN 与 CodePass 各一篇,但口径明显滞后——8 月 20 日的知乎长文还写着「41 条路由规则 + 163 个回归用例」(现在是 44 + 178),Threads 上 20 小时前的热帖还在转「27.5k 星」,而我实测拿到的是 36,908,两天差了九千多。没有一篇做过实测复核——中文教程基本停在安装向,没人跑过一次 test-routing,也没人指出 README 状态表与实际文件差了 3 条用例。这也是本文只做一件事的原因:把它自己出的题和我出的题都跑一遍,让 36,908 这个星数落在可验证的地面上。

什么时候不适合用

它不是万能插件,四种场景建议绕开:任务不在 44 条规则覆盖域里(Web CRUD、数据分析、写作润色),每次请求都要先付一遍路由上下文再落到 R0 兜底,纯亏;中文口语描述容易掉出关键词覆盖,命中不了就得自己补一句术语(我实测中文场景 88% 通过,剩下基本败在口语重述上);越是关键任务,越不能只信那 178 条全绿——cape 这个洞证明自测基准有盲区,master-route 的输出要人眼过一遍再往下走;另外它的主线是 Windows(PowerShell 一等公民,bash 是对等移植),Linux/Kali 用户建议直接读 kali/ 平台文档。如果你只是想给 Agent 加一个单点能力,装个几百行的小 skill 比引一整套路由与授权流程轻得多——那样的话,先看你更适合哪种,再决定要不要它。

a-stock-data 深度评测:7,288 行的单文件塞进 34 个 A 股数据源,我实测跑通 76 个端点

a-stock-data 深度评测:7,288 行的单文件塞进 34 个 A 股数据源,我实测跑通 76 个端点

想让 AI 帮你查 A 股,最麻烦的从来不是写策略,而是把数据接进来:K 线藏在腾讯的分段参数里,盘后包是通达信的二进制格式,研报 PDF 要带东财的 Referer 头,龙虎榜和两融散在不同域名下,还要防着哪天 IP 突然被风控。a-stock-data 把这件事压缩成了一个文件:408 KB 的 SKILL.md,15 层、85 个端点、34 个数据源、零鉴权(只有一家要 Key)。

我把它 clone 下来做了独立复核:作者自带的 142 条测试我跑了,全过;我把 SKILL.md 里 89 个代码块里的代码全部抠出来,用真实参数调了 103 个函数名,76 个返回了非空真实数据。最大的那个端点一次给我 52,314 行,那是一个交易日沪深北全部证券的日线,下载加解析 10.4 秒。

但同一个文件也藏着一个代价:一次加载约 11 万 token。

一个文件,34 个数据源,零鉴权

先说清楚它是什么。simonlin1212/a-stock-data 2026 年 5 月 11 日建仓,到今天 132 天,9,992 星、1,819 fork,Apache-2.0,最新版本 V3.9.0 发布于 9 月 20 日(昨天)。

它不是 Python 包,没有 requirements.txt——作者明确说过这是有意设计的:整个项目就是一个 SKILL.md,拷进 ~/.claude/skills/a-stock-data/,Claude Code / Codex / OpenClaw 都能直接识别。文件里内嵌了 89 个 Python 代码块、5,638 行可运行代码,不是「文档告诉你怎么写」,而是「代码直接抄」。

覆盖的范围按作者自己的分层是 15 层:行情 K 线(腾讯日周月前后复权 + 1 至 60 分钟、通达信官网盘后包、百度、新浪复权因子)、研报(东财 + 新浪 + 同花顺 + iwencai)、市场信号(强势股归因、北向、板块归属、龙虎榜、解禁)、资金面与筹码(两融、大宗、股东户数、分红、ETF 份额、本地推演的筹码分布)、新闻(财联社、东财、华尔街见闻、新闻联播文字稿)、财务三表与 F10、公告(巨潮)、打板四池、ETF 期权希腊字母、舆情互动、宏观与利率(社融、PMI、中债收益率曲线、回购定盘利率、LPR、宏观日历)、指数与交易日历、期货与大宗商品(五家期货交易所)、事件驱动、可转债。另有 5 个备胎源,主源被封时降级用。

34 个数据源里,只有 iwencai 需要 API Key。这一点我实测验证过:不填 Key 调 iwencai 的两个函数,返回的是 HTTP 401 no auth / not_found_apikey,报错清清楚楚,没有拿空表糊弄。

它的测试工程值得单独说:142 条测试,测的是 SKILL.md 里那份代码

这是我这次复核里最意外的部分。仓库根目录只有 14 个文件,其中两个测试文件合计 11.4 万字节。它们的加载方式是这样的:

skill = (Path(__file__).resolve().parents[1] / "SKILL.md").read_text(encoding="utf-8")
# 按  之类的标记块切出来,再正则取 ```python 段
exec(compile(block, "SKILL.md:official-data-core", "exec"), namespace)

测试不测第二份实现,而是把 SKILL.md 里的代码当场抠出来执行。这个选择很关键:绝大多数「文档型工具包」的测试会和文档漂移,这里从机制上漂不了。

我跑的完整离线套件:142 条测试,23.1 秒,全部通过(2 条跳过)。断言写得也很具体,比如「腾讯 K 线三段窗口每段都回同一根日期时,只按总区间过滤会静默返回 1 根」「盘后包里空的北交所文件会被沪深 13,000 行盖过去」「代码表用 replace 解码会把坏字节变成 �00000 放行」。

作者在 docs 目录留了两份《数据源整合记录》,里面写了验证方法:每个修复都做变异检查——把修复改回去,对应测试必须失败。V3.9.0 那份记录里写着 209 处变异,发布前复跑适用的 190 处,186 处全部失败,4 处属双重保护。

同一份记录里还有一句很诚实的话:「本次没有重跑旧版 60 个入口的全部真实请求,它们的历史验证日期保留在原章节。」——这也正好说明我这次独立复核补上了什么。

我的独立复核:76 个端点返回真实数据,两次扫描的失败项还不一样

先说作者自带的联网测试。V3.9.0 的 31 个新入口用真实交易日跑,我跑了两轮,每轮 30/31 通过,但两轮失败的不是同一个端点:第一轮挂在通达信盘后包(下载被截断,BadZipFile),第二轮挂在 ST 名单(返回空,报「不能当成完整快照」),而单独复跑这两个端点又都正常(ST 名单 208 行,盘后包 52,314 行)。同一份代码、同一个网络,失败项在漂——这就是这类工具的日常。

官方数据源的联网用例 142 条里 140 过 2 错:中证指数那台 xls 主机连不上(同一次运行里国证成分 100 行是好的),以及上交所两融备份报「该日数据未发布或分页不完整」,而同一天的深交所版返回 2,105 行。

然后是我自己的扫描。用真实参数(贵州茅台 600519、2026-09-18 交易日)逐个调用:

端点 拿到什么 行数
tdx_daily_package 一个交易日沪深北全部证券日线 52,314
options_daily(中金所) 股指期权日行情与 Delta 6,546
sge_spot 上海金现货日线 2,368
equity_pledge 股权质押 2,212
lpr_history 1 年 / 5 年 LPR 全历史 1,538
futures_position_rank 会员持仓排名 1,320
etf_shares 上交所 ETF 份额 912
repo_fixing_rates 回购定盘利率 747
eastmoney_reports 个股研报 500
st_stock_list 沪深京 ST 名单 208
em_zt_pool 涨停池(78 只) 78
sina_research_reports 新浪研报列表(第二来源) 40

103 个函数名里 76 个返回非空真实数据。没通过的那批,我把原因分成了三类:沙盒环境(申万站点在这台机器上 SSL 证书校验失败,curl 同样失败;通达信 TCP 那条路因为 #52 已经失效,报错前要等 93.57 秒逐台验活 10 台服务器)、源侧风控(东财 push2 系连着调之后直接拒连)、我自己的参数(期货实时接口不吃股票代码)。

还有一类要特别点出来:报错质量。北交所快照接口传旧日期会明确抛「北交所快照不是请求的交易日;本接口不提供历史回填」,而不是给你一份错的行情。这个项目把「确实没有数据」和「接口坏了」分开报错,是它跟一般爬虫脚本最大的区别。

装上去才会撞见的六个坑

第一,lxml 不在安装命令里。SKILL.md 的安装说明是 pip install mootdx requests pandas stockstats numpy baostock xlrd openpyxl,但 ths_eps_forecast()(机构一致预期 EPS)和 full_valuation() 走的是 pd.read_html,缺 lxml 就直接 ImportError: Missing optional dependency 'lxml'。我补装后,这两个端点分别返回 3 行和 12 行。有意思的是,被拒的社区 PR #22 里恰好有一条改动就是「ths_eps_forecast() 增加 lxml 依赖说明」。

第二,baostock 是硬依赖。估值历史(PE/PB/PS/PCF + 换手率 + 停牌 + ST)和上市退市日这两个端点只走 baostock,装上才有数据(6 行标的信息、14 行估值历史)。作者在 CHANGELOG 里承认过:「零第三方封装依赖」这句话现在只适用于其余端点。

第三,日期格式是 YYYYMMDD,填错不报错。em_zt_pool("2026-09-18") 返回 0 行、没有任何提示;em_zt_pool("20260918") 返回 78 行。同一个库里多数端点的日期参数是 YYYY-MM-DD,只有打板层这几个要紧凑格式,是很容易踩的静默空。

第四,东财风控是真的,而且表现为「静默空表」。作者的对策做得很扎实:所有东财请求统一走 em_get()——串行、最小间隔 1 秒加随机抖动、复用 Keep-Alive 会话、403 不重试(重试反而加重)、带正常 UA 与 Referer。但我连着扫了一百多次调用之后,push2 系端点开始连接被拒;更麻烦的是同一组参数在两次扫描里,资金流端点第一次返回 100 行、第二次返回 0 行。调用方拿到的不是报错,是空表。

第五,通达信那条路已经半废。tdx_client() 依赖的 mootdx 库 2024 年就停更了,2026 年 9 月起通达信公开服务器的 K 线、盘口、逐笔全部返回 0 行(issue #52,作者自己开的)。现在只剩财务快照和 F10 能用,K 线改走腾讯和通达信官网盘后包。作者没有删掉这个端点,而是让报错直接指路——这个处理是对的,但你要是照抄了半年前的教程,会先浪费 90 秒等它失败。

第六,SKILL.md 里没有免责声明。README 的最后有「本项目仅提供数据获取工具,不构成任何投资建议」,但这份 408 KB、真正被 AI 读进上下文的文件里,一个字都没有。它面对的是「帮我看看这只股票」这类问题,而投资建议的边界只写在不会进模型上下文的那个文件里。

争议:社区要拆四次,作者的原话是「有意产品决策,长期保持」

a-stock-data 最有意思的地方不是它写了什么,是它长成了什么形状。

SKILL.md 现在是 408,549 字节、7,289 行,其中 41,945 个汉字、89 个代码块、5,772 行代码。Anthropic 官方《Skill 编写最佳实践》里有一句:「将 SKILL.md 正文保持在 500 行以内以获得最佳性能;接近此限制时将内容拆分为单独的文件。」这里是那个数的 14.6 倍。

它不是一天长成的。我把每个提交点的文件大小拉了出来:5 月 30 日的 v3.2.1 是 2,090 行 / 78 KB,7 月 10 日 2,648 行,8 月 19 日 4,137 行,9 月 20 日的 v3.9.0 一步从 4,552 行加到 7,288 行——113 天里行数涨了 3.5 倍,字节数涨了 5.2 倍。

社区不是没看见。6 月 2 日 issue #21 的原话是「当前 skill 巨大,读一次 token 就没好多」;6 月 3 日有人交了 PR #22,一份完整的渐进式披露重构:把 SKILL.md 改成轻量路由入口,端点实现拆进 scripts/,说明拆进 references/,连 agents/openai.yaml 和 smoke test 脚本都写了;6 月 17 日 #27 建议用 Anthropic 的 skill-creator 重新 review;6 月 22 日 #29 逐条给出了拆分方案,包括统一 JSON 输出契约。

作者 7 月 10 日给了最终答复,并把理由摊开:单文件自包含是有意产品决策,长期保持,不做目录化拆分。三条理由——① 「形态即卖点」,拷一个文件就能用,过去两周有 3,000+ 人 clone、1,400+ 人直接在 GitHub 上读 SKILL.md,拆分换不来这种可携性;② 单人维护下「拆分版 + 单文件版」双形态必然漂移,漂移比 token 成本更伤用户;③ token 痛点用不改形态的方式缓解——把 description 收窄,因为「误触发才是最大的浪费」,当时的口径是「此前任何 A 股话题都可能误触发加载 50K token」。

第 ③ 条是真的落地了:现在的 description 明确写着「仅在需要调用数据接口取数时使用」,并且点名排除「A 股概念解释、投资观点讨论、策略问答」;文首还有一张「端点路由速查」总表,鼓励按需局部读取。

但数字也摆在明面上:他当时说「误触发一次 5 万 token」的时候,文件是 2,177 行;现在是 7,289 行。按常见分词器粗算,一次完整加载约 11 万 token(我的算法:4.2 万个汉字约 1 token 一个,26 万字符的代码与英文按约 3.5 字符一个 token,实际数字取决于分词器,但量级没有争议)。他自己在 #21 里留了后门:「如果未来端点规模翻倍、单文件确实不可持续,会重新评估」——v3.2 到 v3.9,端点从大约 30 个走到 85 个。

还有一个数字值得一起看:这个仓库 12 个 PR,一个都没合并。作者在 issue 里承认过 PR 里的问题,然后自己重写一遍进 CHANGELOG(比如 PR #20 的巨潮 orgId 动态化,v3.2.2 里以作者自己的改动落地)。这不一定是坏事——issue #27 里一位用户让 GLM 跑 review,报的五条里最重的一条被作者核对后确认并修掉:full_valuation() 按列位置 iloc[2] 取 EPS,实际取到的是同花顺的「最小值」列而不是「均值」,导致 PE 与 PEG 长期系统性偏差。作者改成了按列名取。但你也该知道,这个仓库的演进节奏完全由一个人决定。

顺带一句:这类工具的地基一直在动。CHANGELOG 的 FAQ 里有一节叫「已死透别用」——网易财经整站下线、和讯、凤凰行情、腾讯资金流接口、雪球免登录数据,全死了;mootdx 库 2024 年停更;2026 年 9 月通达信公开服务器的行情命令集体返回 0 行。「34 个数据源」不是一个稳定数字,而是一份随时会过期、需要有人持续跟进的快照。

判断:什么时候该拷这个文件

它值得用的场景很明确:你要让 AI 或者脚本以最低的安装摩擦拿到 A 股数据,能接受「一个人维护、会随版本跟进」;你在国内网络(我这台机器出口是广州联通的 IP,实测 76 个端点直接返回真实数据);你需要的是单次或低频取数,认可它把数据边界写清楚的做法——每个端点标注数据来源、口径、实测日期,连「大商所官网有 JS 反爬、HTTP 返回 412 所以没接」都写在文档里。这种诚实度在国内数据接口项目里并不多见。

不该用的场景也一样明确:别把它装成常驻自动触发的 skill,除非你已经想好每次触发 11 万 token 的代价,更划算的做法是把它当一个手册放在项目目录里,让 agent 按层局部读——这也正是作者推荐的用法;别拿它做高频批量,东财的风控会以「空表」而不是报错的形式找上你;别指望回测,作者的 FAQ 里写明了本 skill 不带回测;也别指望所有源永远活着,你真正买到的是「源死了有人改」这条流水线。

类似的取舍在其他评测里也出现过:零密钥的方案往往要靠轮换多个不稳定的公开源来换取免注册(Wigolo,18 个搜索源实测只剩 1 个在干活);而当一个生态由单人维护时,社区贡献会以「被采纳但不合并」的方式落地,这一点在 Spec Kit 那份评测里也能看到同一个规律。

至于「单文件还是渐进式披露」,这不是一个非黑即白的工程问题。作者用 113 天和一个 408 KB 的文件给出了他的答案:可携性优先,token 靠收窄触发来省,而不是靠拆目录。这个答案在「拷走就能用」的传播场景里是成立的,在「长期常驻、天天触发」的用法里就不成立——所以真正需要你自己判断的,不是他对不对,而是你打算怎么用它。

Plugin4Shell 实测:分支名伪装成 SHA,四大 AI 编程助手的插件校验全线失守

Plugin4Shell 实测:分支名伪装成 SHA,四大 AI 编程助手的插件校验全线失守

你什么都没点,插件自己换了。

Claude Code、OpenAI Codex、GitHub Copilot、Gemini CLI——四款最主流的 AI 编程助手,插件市场用的是同一套校验逻辑,也犯了同一个错误。9 月 17 日,安全公司 Air 公开了这处漏洞,取名 Plugin4Shell:不点链接、不装新插件、不改任何设置,只要攻击者控制了你已装插件的上游仓库,恶意代码就会自己走进你的电脑。Air 称它是「AI Agent 生态的第一个供应链漏洞」,受影响的是「数百万个 agent」。

校验通过了,代码为什么还是会被换掉

给 AI 编程助手装插件,走的是包管理器的老路:市场把插件锁在一个具体 commit 的 40 位 SHA 上,这叫 SHA pinning。逻辑很干净——审过的代码就是这一版,谁再改都会露馅,这也是企业敢用第三方插件的前提。

四款 agent 都老老实实执行了「checkout 市场钉下的那个 SHA」,但没有一家检查「checkout 完,工作区里到底是哪个 commit」。这一处缺失就是整个漏洞。git 在解析一个名字时,如果它既能当 ref(分支/标签)又能当对象 id,会优先当成 ref,只在 stderr 打一行 refname '…' is ambiguous。攻击者在自己的插件仓库里建一条名字就是那串 SHA 的分支,把它设为仓库默认分支,agent 的 git checkout 就会把这条分支当成目标——审查、pin、安装流程全部显示正常。

要强调的是,受害者的操作没有任何问题。Air 的原话是:受害者只需要装了一个插件,来自他信任的市场,经过审查、并且「完全按照安全模型的设计」被 pin 住——企业把插件 pin 到审过的 commit 再分发,本来是把风险往下压的做法,这一层也同样被穿透,「所有建立在 pin 上的下游审查流程,都继承了这个失效」。

攻击有两条路。一条是先当好人:往市场里提交一个真良性插件,过审、被装,之后再把它变恶意——这件事 Air 此前已经做过一遍,那个假 skill 拿到了 26,000 个 agent 的控制权。另一条更省事:直接接管别人的仓库,让恶意版本顺着这条路径推给所有已装用户,而 pin 存在的意义本来是拦住这件事。

我把两个变体都跑了一遍

Air 描述了两条路径。我在本地沙盒(git 2.47.3)把它们都复现了一遍。

变体一是 Claude Code、Codex、GitHub Copilot 共用的写法:

git clone <插件仓库> ./
git checkout 59276317d87a72f4396ef9b61b0ba4be3e005e95   # 市场钉下的 SHA

这条 SHA 同时是攻击者建的默认分支名。执行结果:只有一行警告 refname is ambiguous,然后 plugin.txt 的内容是 MALICIOUS PAYLOAD,当前分支显示为那串 SHA。顺带核了一下前提条件,git check-ref-format refs/heads/<40位十六进制> 返回 0——git 自己就接受这种分支名。

我还做了对照组:同样存在一条 SHA 同名分支,但它不是默认分支。这次 clone 下来它只是一条 remote-tracking ref,git checkout 落回了真正的 commit,HEAD 与 pin 完全相等,文件还是良性版本,攻击不成立。也就是说,「把 SHA 同名分支设成默认分支」是攻击的必要条件,不是可选动作。

变体二是 Gemini CLI 的三步写法:

git clone --depth 1 <插件仓库> ./
git fetch origin 41d0bc0a4aeb2fbf797dacea39e876d98c95024b
git checkout FETCH_HEAD

如果仓库的默认分支恰好叫 FETCH_HEAD,第三步同样只打一行 ambiguous 警告,然后落地恶意内容;此时 .git/FETCH_HEAD 文件里躺着的,仍然是那个被正确拉取的 commit——拉回来了,然后被丢掉了。

修复只要一行断言,Air 给的原话是:checkout 之后解析工作区真正的 HEAD,不等于 pin 就中止。

test "$(git rev-parse HEAD)" = "" || abort

这行必须写在 agent 里、不能交给市场,因为 pin 是在客户端解析的。这也正是它叫「零点击」的原因:后台自动更新是 Claude Code 和 Codex 的默认行为,市场一改 pin,所有已装用户会在没有任何提示的情况下被换成恶意版本——攻击者甚至不需要你装任何新东西,只需要那个良性插件本来就在你机器上。

四家的响应,和我在 npm 上核到的版本

厂商 产品 当前状态
Anthropic Claude Code 已修复,2.1.179(2026-06-17 确认)
OpenAI Codex 已修复,0.146.0(2026-08-12 验证)
GitHub / 微软 GitHub Copilot 未发补丁
谷歌 Gemini CLI 不修,直接弃用

Air 给出的时间线是:2026 年 5 月发现并对四款都做出可用 PoC,6 月完成披露,8 月 4 日谷歌确认不修、让用户迁到 Antigravity,9 月 17 日公开。

修复版本是不是真的发出去了,可以直接在 npm 上核:Claude Code 当前 2.1.278、Codex 0.155.1,都已经越过修复线;@github/copilot 停在 1.0.86,仍在更新但没修这个洞。Gemini CLI 更有意思——谷歌 8 月就说弃用,可 npm 上的 nightly 一直发到 0.62.0-nightly.20260919(9 月 19 日),仓库活着,只是这个漏洞不打算修了,已装的每一台都永久暴露。

微软一侧的说法值得单独记一笔。GitHub 发言人对 The Register 表示:为防止 SHA 被滥用,GitHub 不允许创建形似 commit SHA 的分支名或标签名,因此这个漏洞在 GitHub 上无法利用。Air 的回应是这条缓解不够,因为 Claude Code 官方文档明确写着市场可以托管在「任何 git 服务」上——GitLab、Bitbucket、自建服务器都行,而 Bitbucket 和自建 git 都允许 40 位十六进制分支名;微软自家的 Copilot 同样支持这些来源。Air 还补了一句:6 月起就向微软报告过,因为对方披露量太大,没有收到回复。

规模上有一组可查的数字:近 30 天 npm 下载量,Claude Code 6,486 万次、Codex 7,850 万次、GitHub Copilot 1,026 万次、Gemini CLI 139 万次,合计约 1.55 亿次(下载量不等于机器数,CI 会放大,但量级可参考)。这也不是 Air 第一次做这件事——此前它用一个假 skill 拿到过 26,000 个 agent 的控制权,SkillJacking 里发现 925 个在用 skill 的仓库可被接管、波及 134,000 个 agent,8 月又找出 155 个依赖过期域名、可被劫持的 MCP。

需要声明的是,Air 是一家 9 月 1 日刚走出隐身状态的创业公司,卖的产品正是 agent 防护,研究文末还写着「使用我们产品的企业不受此漏洞影响」「数据来源方在卖解药」这件事,读数字时要一起考虑。漏洞本身不受影响,因为上面的复现是我自己跑的。中文圈的报道到 9 月 19 日基本还是快讯:新浪财经、凤凰网各一条,其中凤凰写的是「除 GitHub 外其余三家已修复」——按 Air 的时间线,谷歌是明确不修、直接弃用,不是修复。

这次坏掉的其实是一个假设

Plugin4Shell 里没有一行复杂的利用代码,它打掉的是行业默认的一个安全假设:把 hash 钉死,就等于把代码钉死。

这个假设在包管理世界里早就被拆过一遍——npm 后来补上了包签名和透明日志,因为「内容的哈希」只能证明内容没变,不能证明「你解析到的就是那份内容」。agent 生态正在把插件、skill、MCP 当作基础设施大规模铺开,校验逻辑却还停在「拿到一个 SHA 就 checkout」的水平上。四家实验室写出了同一个 bug,不是巧合,是这一层还没有人认真做过。

你该做什么

  • Claude Code 与 Codex 用户:升级到 2.1.179 / 0.146.0 以上(当前版本已远超),这是唯一完整的修复。
  • GitHub Copilot 用户:官方没有补丁。Air 给出的现实约束是,尽量只从 GitHub 托管的 marketplace 装插件,因为 Bitbucket 和自建 git 托管的市场都能被这种手法打穿。
  • Gemini CLI 用户:官方建议迁到 Antigravity,它没有这套插件 SHA pinning 机制,因此攻击面不存在;留在 Gemini CLI 上就是永久暴露。
  • 所有人:如果你所在团队的内部市场是自己 pin 的 commit,去检查一遍默认分支名有没有 40 位十六进制的;同时考虑关掉插件的后台自动更新,把更新动作变成需要人确认的一步。

一行断言就能修的东西,从披露到公开花了四个月,还有两家没修。Agent 的供应链安全,现在还处在包管理器的 2015 年——插件越多,这个账越难还。

相关阅读:

unlazy 深度评测:3,462 星的反摆烂验收闸门,把「做完了」变成一条能跑的命令

unlazy 深度评测:3,462 星的反摆烂验收闸门,把「做完了」变成一条能跑的命令

你让 AI 改 80 个文件里的 bug,它交回一份自信的完工报告,每个文件都打了勾。你抽查一遍,发现它实际只打开了 11 个。

unlazy 的作者把这件事写在仓库最显眼的位置。这个 2026 年 8 月 9 日建仓、40 天涨到 3,462 星的 skill,只做一件事:把「做完了」这句话变成一条能跑的命令。

它不劝模型努力,不写更长的提示词,也不骂模型。它要求 agent 在动手之前先写一份验收台账 GATES.md,每条闸门必须配一条命令和一句成功标记;跑完之后,检查器把「定义摘要、退出码、输出指纹」写回台账,agent 只能报告检查器认可的结果。

我在 Alpine 沙盒里把它拆开,跑了 6 组对抗实验,包括我自己伪造证据去骗它。结论比宣传语复杂:它能识破手写的假报告,但挡不住会算哈希的骗子——而作者自己承认了这一点。

它是一段代码,不是一段话术

反摆烂这个赛道里,unlazy 算是最冷的一条路。

它没有一句「你必须在放弃前再试 3 次」这类施压话术,核心是一个 960 行的 Node 脚本 gate-check.mjs,配套 953 行的解析库。整个仓库的运行时依赖是零:只用 node:fs、node:crypto 这些内置模块,没有 node_modules,Node 16 以上直接跑。SKILL.md 常驻上下文只有 10,520 字符,占整个技能包 114,606 字符的 9.2%,其余方法论、编排、安全说明都靠按需加载。

它给三种场景配了三档模式:

  • solo:一个 GATES.md 管一个任务,适合一个会话能干完的活。
  • orchestrated:先写 PLAN.md 定义契约和树结构,每个叶子和分支各自带台账。
  • parallel:多个叶子并行时,靠 OWNS: 声明文件所有权,先声明再开工,出错时能知道谁动了哪块。

闸门本身长这样,CHECK: 后面是可以执行的 shell 代码,EXPECT: 是只有成功才会打印的那句话:

- [ ] G1: pricing fixtures render the expected tiers
  CHECK: node scripts/verify-pricing.mjs
  EXPECT: pricing verification passed
  EVIDENCE: pending

判定规则只有两条:进程退出 0 + EXPECT 命中输出。两条都满足,检查器才会写回一条自动证据,长这样:

automatic-evidence=v1; definition-sha256=5f9ebdcc…; exit=0; EXPECT=matched;
output-sha256=67265cd5…; output-bytes=9; shell=/bin/sh; cwd=…; path=2da0e2f6c375/7 entries

这条 346 字符的证据,是整篇文章最值得注意的地方:它不是人写的,是检查器写的,而且和这条闸门的 CHECK:、EXPECT:、CWD: 三个字段的 SHA-256 绑定。你只要改动其中任何一个字,证据立刻作废。

实测:6 组对抗实验

我把测试分两类:它能不能识破别人撒谎,以及它自己会不会被糊弄。

实验 我做的事 结果
手写假证据 给一条命令实际会 exit 1 的闸门打勾,证据栏写「passed – independently verified」 --status 判 UNMET,理由是证据未绑定;加 --approve 真跑一遍后,勾被取消,证据回到 pending
未审批直接跑 不带任何参数运行检查器 只打印 CHECK、EXPECT、CWD、SHELL、PATH,一行命令都不执行
输出超限 让闸门打印 2 MiB 再退出 0 不是把输出截断成通过,而是直接 SIGKILL,报 output exceeded 1048576 bytes
定义漂移 把 CHECK 里的 ok.mjs 改成内容完全相同的 ok2.mjs 不执行任何 shell,--status 直接判 stale-unmet
台账畸形 空台账、重复 id、缩进写 ABANDON: 均 exit 2 并给出行号;顶格 ABANDON 判 exit 1 HANDOFF REQUIRED,不算成功
停止钩子 连续触发 6 次停止事件 前 6 次全部 decision: block,第 7 次主动释放,理由是「6 次无进展」,防止把 agent 卡死

有一组实验它没扛住。

它的证据绑定用的是无密钥的 SHA-256:摘要算法是公开的,仓库自己把 gateDefinitionDigest() 导出了。我把这个函数 import 进来,算出一条会失败闸门的定义摘要,然后手写一条声称 exit=0; EXPECT=matched 的证据,再打上勾——--status 立刻把它读成 MET,整份台账报「4 gates,UNMET 1」。一条命令实际退出码为 1 的闸门,就这样被判为通过。

README 里其实写着这件事:这种绑定能发现结构性漂移,但挡不住能编辑台账的人伪造看起来合法的证据。所以正确的用法是父层复核——加 --reverify 重跑所有可跑闸门。我试了,同样一份被我伪造过的台账,重跑 3 条闸门后,假的那条被判 FAIL,勾被取消,证据清空。输出里还有一行 reran: 3, previously met reverified: 3。

说白了:它防的是「不小心糊弄」,不是「故意撒谎」。

官方测试和自己承认的账

仓库自带 8 个测试文件,近 7,000 行。我在沙盒里逐个跑完:34/34、27/27、51/51、29/29、8/8、15/15,压力测试 24 条里通过 23 条,合计 187/188。

唯一挂掉的那条,是安装器拒绝硬链接文件的那组压力测试。我复现后发现失败发生在清理阶段,报的是 ENOTEMPTY。原因是我的沙盒对硬链接做了特殊模拟,ln 之后会留下 .l2s.* 临时副本,连 rm 都报 Operation not permitted——不是产品问题,是环境问题。产品那一侧的断言(拒绝写入、不改受害者文件)实际是通过的。

更有意思的是这个仓库对自己宣传数据的态度。

初版 README 写着深度树的算术:努力量等于 T 乘以 2 的 N 次方减 1,tree 3 就是 4 倍工作量,tree 7 是 64 倍。现在的版本把这句话改掉了,改成「深度树是分解与整合,而不是算术上的努力倍增器」。早期那组「六次运行对比」输出的 token 比例和自找缺陷数,也被明确标注为不可复现、不得当作 benchmark 承诺,仓库里专门放了一份 research/validation-protocol.md,给出预注册、隔离运行、操作化指标、盲评、发布计算过程、限定结论这 6 步可复现协议。

顺便说一句,它的引用是干净的:README 里列的 9 篇论文,我逐个打开 arXiv 核对,编号、标题、日期全部对得上;SlopCodeBench 摘要里那句「没有任何 agent 端到端解决问题,最好的 agent 通过 14.8% 的检查点」,和 README 的引用一字不差。

代价方面:--status 跑一次 206 毫秒,3 条闸门的 --reverify 934 毫秒,一条自动证据 346 字符。这个开销换来的是那句你不能反驳的交付报告。

三条反摆烂路线,选哪条

把已发过的几篇放在一起看,反摆烂目前有三条路线:

路线 代表 做法 你得到什么
话术施压 tanweai/pua(19.6k 星) 用压力话术和方法论约束 agent 的行为 模型行为的改变,无法验证
文件化计划 Planning-with-Files(26k 星) 用三个文件让 agent 不失忆 一份可读的计划和进度
可执行验收 unlazy(3.4k 星) 每条验收标准绑定一条命令 一份能被脚本复核的完成证据

适合谁:长任务、多部件交付、需要向别人交代证据的场景,或者你被 agent 的假完成坑过。它的 solo 模式上手成本很低,一份十来行的 GATES.md 加两条命令就能跑起来。

不适合谁:一次性的小改动别用,SKILL.md 自己写了——琐碎编辑和事实性回答不需要建台账。另外停止钩子只在 Claude Code 里生效,换别的宿主就只剩手动跑检查器这一半能力。最要紧的一条:如果你需要的是防作弊,它不行,它只是让作弊变得需要多写一行代码。

结论

值得放进工具箱,但别把它当防作弊工具。

我的建议是只用它的两个动作:开工前写 GATES.md,交付前跑 --reverify。第一条治的是「凭感觉觉得做完了」,第二条治的是「证据过期了还以为通过」。这两件事它做得比任何提示词都硬。

它现在的短板也很实在:仓库 0 release、0 tag,README 明确说 2.1.0 只是源码里的目标版本,你 npx skills add 装到的是未发布的源码树;11 个 issue 全部关闭、24 个 PR 合并 16 个,治理看着干净,但版本这件事上你得自己锁 commit。

真正让我愿意为它写一篇的,是作者的克制。一个 3,462 星的仓库,主动把早前那句「tree 7 = 64 倍努力」撤掉,把六次运行的对比数据标成不可复现,再附一份自己还没跑的可复现协议——这件事在 skill 生态里比任何性能数字都少见。

关注 AI商业快讯,每天一篇 AI 热点深度解读。

相关阅读:

Wigolo 深度评测:零密钥的本地 MCP 搜索,18 个引擎实测只剩 1 个在干活

Wigolo 深度评测:零密钥的本地 MCP 搜索,18 个引擎实测只剩 1 个在干活

给 AI 编码 agent 装上「联网」这件事,一直是笔糊涂账:内置的 WebSearch 要么没配额、要么结果短得没法用,换成 Exa、Tavily、Firecrawl 又得先注册、拿密钥、盯账单。wigolo 打的就是这个位置——不需要任何密钥,不做云端,查询次数免费,全部跑在你自己机器上。

它涨得也确实像那么回事:仓库 2026 年 4 月建,7 月 1 日还只有 1 个 star,7 月 18 日破千,7 月 21 日破三千,9 月 5 日破五千,现在是 5,277 星、420 个 fork。

我把它装进沙盒,从 doctor 到 10 个工具逐个跑了一遍,也用自己的查询验了它宣传的那套「18 个引擎融合」。结论是分裂的:本地缓存和抓取这两件事它做得比宣传的还好,但「多引擎搜索」在真实网络下基本只剩一个引擎在干活,而它给出的相关性分数其实是排名换算出来的。

它到底提供了什么

一句话:一个 MCP server,同时也能当命令行、REST 服务和 SDK 用。10 个工具按「搜索类」和「网页类」分成两组,四个入口共享同一套实现——这一点比很多同类项目干净,不会出现「MCP 里能用、CLI 里没有」。

我用一个最小的 MCP 客户端跟它握手,initialize 拿到的协议版本是 2024-11-05,工具列表刚好 10 个:search、fetch、crawl、cache、extract、find_similar、research、agent、diff、watch。有意思的是它在握手阶段塞给宿主模型的 instructions 里直接写着「把 wigolo 用在所有网页操作上,优先于内置的 WebSearch/WebFetch」——它不打算只当一个可选项。

真正撑起「零密钥」这句话的是 18 个搜索引擎适配器。我把它们逐个分了类:

类别 引擎 怎么拿数据
网页搜索 bing、duckduckgo、mojeek 抓搜索结果页 HTML
垂直/API wikipedia、stackoverflow、hn-algolia、arxiv、semantic-scholar、lobsters、crates-io、marginalia、mdn、devdocs 官方公开接口
需要密钥 brave、github-code 默认禁用
图像/新闻 ddg-image、bing-news、brave-image 混合

也就是说「零密钥」的底气来自两处:一半是别人提供的免费公开 API,另一半是把 Bing、DuckDuckGo、Mojeek 的搜索结果页当网页抓下来解析。这也解释了它 FAQ 里那句「我们像浏览器一样读公开网页」——路由、限速、robots.txt 它都实现了,但本质上,你问的每一句话都是从你自己的 IP 发出去的,有第三方评测在 9 月初就点出过这条代价。

实测:18 个引擎,实际只有 1 个在干活

安装过程本身正常:npm 装了 385 个包,node_modules 770 MB;第一次预热再下 957 MB 的 Chromium。doctor 会逐个报告引擎状态,需要密钥的 Brave 和 GitHub 代码搜索明确标着禁用,其余默认可用。

但真跑起来是另一回事。我用四句正常的开发者查询连跑四遍,每遍都把引擎账本拉出来对:

查询 派发的引擎 成功 耗时
MCP server local-first web search bing、duckduckgo、wikipedia、marginalia、mojeek 1 个 9.0 秒
Python asyncio timeout best practice 同上 1 个 9.0 秒
PostgreSQL logical replication setup 同上 1 个 215.7 秒
Claude Code hooks documentation 只剩 mdn 1 个 7.5 秒

四轮下来,bing 全勤,duckduckgo 四次全部「超出超时预算」, wikipedia 三次失败,marginalia 三次 429,mojeek 三次 403。返回体里那个 engine_pool 字段写得很清楚:healthy: 1, total: 5, degraded: true。

需要说明的是,这其中有我的环境因素——429 和 403 本来就跟出口 IP 的信誉有关,作者自己在 doctor 里也标注了 mojeek「可能间歇性 403」。但结论不受影响:当只剩下一个引擎时,README 架构图里那句「18 个引擎融合,任一失败都不会影响结果」就失去了意义——没有融合,只有单点。

更值得看的是第三行那个 215 秒。同一批查询、同一台机器,三次都在 8 到 9 秒,只有一次卡了三分半;total_time_ms 里 215,592 毫秒全耗在搜索阶段,soft-deadline 那道保护没拦住它。agent 在等这个调用的时候,用户看到的是「模型卡住了」。

结果正文的质量也跟着掉。29 条结果里有 21 条带着 fetch_failed(72%),意味着这些「结果」其实是搜索引擎摘要,不是网页正文——响应体里用 content_from_snippet: true 老实标了出来,这一点值得肯定,但它同时还在给这些摘要算「字节级溯源」的 source_span,而那个 span 指向的是 124 个字符的摘要本身。

一次彻底跑偏,和一套换算出来的分数

四轮里最难看的一轮是 Claude Code hooks documentation。它被 query_understanding 判成 intent: docs,于是调度层只派了 mdn 一个引擎,返回的十条结果全是 MDN:排在第一位的是「Web 开发入门」,后面跟着 HTML 元素的参考页、Code Point 术语表、Code unit 术语表。我用同一个函数名换成 React hooks documentation 再跑一次,react.dev 的官方文档就正常出现在前两位——所以不是「这类查询都烂」,而是文档类意图一旦被派到垂直引擎,而那个引擎里没有对应内容,它会用无关的文档页把结果位填满,两次复现一模一样。

比跑偏更值得警惕的,是它给这些结果打的分:

名次 展示的相关性分 实际是
第 1 名 1.000000 永远等于 1
第 2 名 0.983871 61/(61+1)
第 3 名 0.968254 61/(61+2)
第 8 名 0.884058 61/(61+6)

我把两次不同查询的十名分数拉出来对比,序列一模一样。翻源码能确认:orchestrator.ts 最后一步是拿所有结果除以最大值,所以第一名必然是 1;而当只有一个引擎供数时,融合分就是倒数排名融合的 1/(60+名次),归一化之后自然变成一根与查询内容无关的衰减曲线。

所以那些 MDN 无关文档,拿到的分数是 1.0 到 0.87。一个按「相关性分 > 0.7 就采信」办事的 agent,会把它们全部当真。它确实还提供了可解释的 evidence_score.components(域质量、词法对齐、引擎共识、时间新鲜度),这也是它比同类更透明的地方,但最显眼、最容易被 agent 当阈值用的那个数字,只反映名次。想让它真的有用,得读组件分而不是总分。

它自己的 benchmark 跑不起来

这个仓库带了完整的 benchmarks/ 目录,四个基准:搜索、抽取、agent、嵌入。我把 package.json 里的命令照抄执行,结果是:

  • bench:search、bench:extraction、bench:agent 三个入口文件里没有 main 函数,tsx 加载完就退出,什么都不产出;只有 bench:embedding 有入口;
  • 搜索基准依赖一个预录制的引擎响应目录,这个目录不在仓库里;
  • baselines/ 下唯一的「改造前基线」文件,内容是作者本机路径的模块加载报错日志——基准从来没被采集成功过;
  • 每周一的 CI 任务照跑 bench:search,再用「MRR ≥ 0.4」当门槛;它读的是那个不会生成的结果文件。

于是 README 里那段「Benchmark」,实际是一次单条查询的四路对比动图,由 agent 当场评判。它是好的产品演示,但不是基准,仓库里也没有任何 precision、nDCG 或 MRR 的数字被公布过。

治理:一个人的仓库,14 个外部 PR 零合并

这一项不是缺陷,但读者该知道自己在用什么。

我拉了全部 300 个 PR:286 个由作者本人提交,14 个来自外部贡献者,其中被合并的是 0 个。贡献者列表总共 11 人,作者一个人占 1,976 次提交(占全部 2,007 次的 98.5%)。一个叫 Frankie-Xu 的贡献者在 8 月一口气提了 7 个 PR,包括给 PyPI、npm registry 加搜索引擎适配器和修补 SSRF 校验,全部没进主干。

更实际的问题是节奏错位:npm 上的版本停在 0.2.1,2026 年 7 月 19 日,而仓库每天还在提交(最近一周还有 60 多次)。CHANGELOG 的最后一版也停在 v0.2.0。这意味着你 npx wigolo 装到的,是两个月前的构建,里面那些已知问题都还在。

我顺手复现了其中一个:issue #303 说 --search-engines 参数声明了但没人消费。我照着 issue 里的命令跑 search "gold price" --search-engines=duckduckgo,wikipedia,返回体的 engines_used 依旧是 ["bing"],引擎账本里 duckduckgo 和 wikipedia 照样被派发、照样超时。在源码里搜 searchEngines 有 41 处匹配,没有一处读取这个入参。另一个更静默的是 issue #231:ARM64 的官方 Docker 镜像缺一个分词器原生依赖,向量搜索会无声退化成只做重排——7 月 22 日开的,到现在还挂着。我在 Alpine 沙盒里也撞上同一类降级:sqlite-vec 扩展加载失败(代码里对 musl 平台是软失败设计),find_similar 于是退化成纯关键词匹配,我拿「vector database for RAG」去问,它返回的是剑桥词典的「local」词条。

省下的钱,没有想象中多

它最响的口号是「$0/query」。这句话是真的,但省钱这件事要看你一个月查多少次。按各家 2026 年 9 月的公开价,一家一口径算下来:

每月搜索次数 wigolo Tavily Exa Firecrawl
1,000 次 $0 免费额度内 $0 $7 超出免费额度,$16/月档
50,000 次 $0 $400 $350 $83

结论不算意外:一个人用,免费额度基本够覆盖,wigolo 省的是每月十几美元,换来的是 1.7 GB 磁盘、你自己的 IP 和时好时坏的延迟;真正拉开差距的是 agent 高频刷量,那才是它「不以查询计费」值钱的地方。

判断

它是一个工程密度很高、诚实度也不低的项目:四个入口共享一套实现、缓存命中后同一查询从 9.5 秒掉到 5 毫秒、失败和降级都写在返回体里而不是藏起来、AGPL 协议加社区赞助的路线也堵死了「先免费后收割」的想象。这些都比同类开源项目做得好。

但它现在最适合被当成两样东西用:一份本地网页缓存(cache 工具在离线时确实好用),和一把网页抓取与结构化抽取的瑞士刀(extract 的表格/元数据模式我实测很稳)。至于「多引擎网络搜索」,等它的引擎池在你自己的网络下能常年保持三个以上健康再说——在那之前,把它当单一搜索源来用,并且别拿 relevance_score 当质量阈值。

关注 AI商业快讯,每天一篇 AI 热点深度解读。

相关阅读

本文数据截至 2026 年 9 月 18 日:仓库 5,277 星、420 fork、AGPL-3.0、npm 版本 0.2.1;实测在 Alpine Linux 沙盒内完成,wigolo 版本 0.2.1,节点 22。

Dashi PPT 实测:8,250 星的开源 PPT Skill,1020 套版式,一份 JSON 导出 36 页可编辑 PPTX

Dashi PPT 实测:8,250 星的开源 PPT Skill,1020 套版式,一份 JSON 导出 36 页可编辑 PPTX

做过汇报的人都有过同一种卡壳:内容早在脑子里排好了,时间全耗在把字挪进模板、调对齐、换配色。让 AI 代劳也不省心——它吐出来的 HTML 常常是「看着像 PPT,改起来像拆炸弹」,动一行样式整页崩。

所以当一个 8,250 星、97 天冲到榜单的 PPT Skill 出现在雷达里,我决定不只看它的宣传页,而是把它彻底跑一遍:不装插件、不开浏览器点选,只喂一份内容 JSON,看它能不能离线产出一份真正能改的演示稿。结论先放这里:9 页稿子跑通了,还导出成 36 页可编辑 PPTX(11MB、740 个可编辑文本对象);但它自带的校验器也会误报,这点后面细说。

它把 PPT 拆成了三层

Dashi PPT 是一个 Agent Skill,核心思路和「让大模型直接写 HTML」完全相反:模型不负责画版式,只负责填内容。

它内部有 12 套视觉主题,每套主题是一批预置版式(封面、数据、对比、流程、风险、结论……),每个版式都是一段带控件的 React 组件。生成时先由 layout:query 按「页面角色 + 主题 + 随机种子」选出候选版式,再让 Agent 写一份 PageContentPack:每页只写标题、摘要、要点、图表数据,不写任何样式。随后 goal:scaffold 为每个逻辑页产出 4 个方案——3 个模板方案(锁死版式的视觉结构,只替换文字)+ 1 个按本页内容定制的方案。最后渲染成静态 HTML,导出 PPTX。

关键在「锁模板填文案」这条约束:页面的视觉、结构、数量、显隐、配色由版式决定,Agent 只能改文字。这既是它的可控性来源,也是它的上限所在。主题清单也能看出它的取舍:轻拟态风对应企业内部汇报,深浅代码风对应技术方案,色谱图表风对应数据分析,黑金实验风对应高端发布——都不是给品牌视觉团队准备的。

真正撑起这套体系的不是模板数量,而是三个量化文件:3.5MB 的 layout-manifest.json 登记了每个版式的控件与默认值,71KB 的属性契约约束每个控件能取什么值,82KB 的 spec 校验脚本负责在渲染前拦住非法结构。前者定义「有什么」,后两者定义「不能乱来」。

宣称 我的离线复核
12 套视觉主题 12 套,每套 71 到 111 个版式
1020 个版式页面 1020 条,逐条数列一致
8576 个可调控件 8576 个:开关 4276、滑杆 2372、下拉 1825、图标 77、图片位 26

三个数字全部精确对上,没有注水。

实测:从内容 JSON 到可编辑 PPTX

我把这次评测本身写成了 9 页内容计划,然后在 Alpine/Linux 沙盒里跑完整流程:

  • 依赖只有 35 个包、90MB,npm ci 32 秒装完,没有需要编译的原生模块;
  • 生成器先是两次拒绝了我的输入:一次是我把 chartData 的 id 写成了和 items 相同的 fact-1(要求 id 唯一、label/value/unit 必须一致),一次是同页图表单位混用「个 / 套 / 星」(要求要么全填、要么全空)。这两条不是文档里的客气话,是硬拦截;
  • 通过后产出 9 页 × 4 方案的 goal.json(122KB),渲染出 index.html(601KB)+ assets(7.9MB),离线双击即开;
  • 导出 PPTX 走了无头 Chromium:11MB、36 页、740 个可编辑文本对象、1309 个形状、147 张图片,打开后每段文字都能改。

但「可编辑」有边界:导出器同时给出了几百条降级警告——背景光效、渐变底、部分 SVG 与遮罩元素无法翻译成 PPT 形状,会被栅格化成图片贴上去。也就是说,文字和基础形状是真可编辑的,那些让页面显得精致的视觉特效,到了 PPTX 里就变成了一张底图。这是所有「网页转 PPTX」方案共同的物理限制,不是它独有的毛病。

另外两点体验值得一提:一是中文并没有被打包进字体,index.html 里明确写着 Noto Sans SC 这类中文字体超出体积预算、改用系统字体回退,所以同一份稿子在 Mac 和 Windows 上中文字重会略有差别;二是它的依赖干净得少见,没有原生模块,在一台只装了 Node 的机器上 90MB 就能跑起来。

也就是说,它宣传的「HTML 能编辑、PPTX 可交付」是真的。

但同一个流程里,它自带的文案校验器给了我一个退出码 1:报出 27 处「未覆写模板文案槽」(每页 3 处,对应 3 个模板方案),外加一条「AI Capital / 投融资默认文案残留:大模型」。

我去查了这两条的成色。那条「大模型」来自我自己写的正文「让大模型直接吐 HTML」——词表把常见词当成了投融资模板的特征词。而被判「未覆写」的 statLine,实际是投影阶段被显式清空(值写成空字符串),cards 也已绑定到我的 3 条内容和 1 条图表摘要,只是校验器把「空值」和「没写」算成了一回事。渲染出来的 9 页里,我一处模板默认文案都没找到。

模板默认文案确实存在,但位置很隐蔽:第 1 页所用版式的默认值是一整套「AI Capital Lab / 战略投资者 / 云资源授信 118 亿美元」的投融资示例,在文件里出现 10 次,全部躺在 data-prop-defaults 里——那是浏览器编辑器里控件的默认值,不是你交付出去就摆在观众面前的字。换句话说,这道闸门偏保守:宁可误报,也要逼你逐槽确认。

两条路线,怎么选

维度 版式库路线(Dashi PPT) 让模型直接吐 HTML
可控性 每个控件有契约与默认值,改坏了会被校验拦住 依赖模型自觉,改一处可能整页崩
自由度 只能组合已有版式 任意布局,上限更高
返工成本 改内容不动样式 常要整页重写
交付 静态 HTML + 可编辑 PPTX 通常只有一次性 HTML

几个必须先知道的前提:一是可编辑 PPTX 导出要在本机跑一次无头浏览器(官方推荐 macOS/Windows,Linux 需要自备 Chromium);我在沙盒里就撞上了环境限制——导出 CLI 启动的预览服务读取网卡信息失败,最后是绕过预览服务、直接调用导出引擎才拿到文件。二是许可证是 AGPL-3.0,公司内部用没问题,把它包进自家产品再分发前要确认合规。三是版式覆盖的是常见汇报结构,发布会主视觉那种强定制需求仍要人工介入。

适合谁:周报月报、方案评审、产品介绍这类高频、结构固定的汇报,收益最大;需要交付 PPTX 继续人工改的团队也合适。不适合谁:追求品牌级排版的视觉团队,以及指望它一键完成「内容 + 视觉双定制」的人。

我的判断

值得放进工具箱,但别把它当成万能排版引擎。它真正的价值不在 1020 个版式,而在那套「内容与样式分离 + 生成前后双校验」的工程约束——这正是多数 AI 出图/出稿工具缺的一环。它的问题是闸门做得太保守,误报会消耗信任;一句话概括:它不擅长帮你把 PPT 做漂亮,但很擅长让你别在排版上浪费时间。

关注 AI商业快讯,每天一篇 AI 热点深度解读。

相关阅读:

OpenAI 133 周后反超 Anthropic:重回 OpenRouter 花销第一,Anthropic 份额从 19% 跌到 3.8%

OpenAI 133 周后反超 Anthropic:重回 OpenRouter 花销第一,Anthropic 份额从 19% 跌到 3.8%

133 周。这是 OpenAI 上一次在 OpenRouter 上拿下「花销第一」,到今天的距离。

2026 年 9 月 7 日到 13 日那一周,OpenRouter 上的开发者花在 OpenAI 模型上的钱,第一次超过了 Anthropic。OpenRouter 官方账号的说法是「2.5 年多没发生过」;公司洞察负责人 Peter Walker 给的数字更精确——OpenAI 隔了 133 周重新拿回钱包份额第一,推动它的是 9 月 3 日上线的 GPT-6 Astra。

这是 2026 年最值得盯的一条模型竞争数据:不看谁在榜单上更聪明,只看开发者的钱往哪边流。

OpenRouter 的钱包份额,为什么值得当尺子

OpenRouter 是把几百个模型收进一个 API 的聚合路由平台,开发者在上面换模型只需要改一个字符串。今年 8 月,Stripe 以 75 亿美元把它买下(关于这笔交易我们此前写过)。

它有个别的平台给不出的副产品:作为第三方中转,它同时握着模型方和调用方的账本。各家自己公布的用量可以挑口径,这里的花销不能。

口径也要说清楚:这只覆盖走 OpenRouter 的流量,不含两家直连的 API、企业年框合同和订阅套餐。所以它是一把切片尺,不是全行业普查表。

我拉了 OpenRouter 官方公开的周度数据接口,把从 2025 年 9 月 22 日开始的 52 周逐周对照了一遍。

指标(2026 年 9 月 7 日–13 日那一周) 数值
全平台 token 量 126.76 万亿(一年前同周 5.26 万亿)
花销第一 OpenAI(133 周来首次)
OpenAI token 份额 18.9%
Anthropic token 份额 3.8%
Anthropic 份额峰值 19.1%(1 月 12 日那一周)
Anthropic 用量峰值 7.34 万亿 token(7 月 13 日那一周)

一年时间,这个平台的周 token 量涨了 24 倍。同期 Anthropic 的绝对用量几乎原地踏步:从 7 月的峰值 7.34 万亿掉到 4.83 万亿,缩了三分之一;而 OpenAI 从 4.29 万亿涨到 23.95 万亿,接近六倍。

开关在 7 月 30 日那一刀

反转不是突然发生的,起点能精确到一天。

7 月 9 日,OpenAI 发布 GPT-5.6 家族:Luna 定价每百万 token 输入 1 美元、输出 6 美元,Terra 是 2.5/15,Sol 是 5/30。7 月 30 日,OpenAI 把 Luna 的价格直接砍掉 80%,变成输入 0.2 美元、输出 1.2 美元,Terra 同步降 20%。

对照我拉的周度份额,时间点几乎重合:7 月 20 日那一周,OpenAI 在 OpenRouter 上的 token 份额是 6.9%,Anthropic 是 9.1%;降价后的 7 月 27 日那一周变成 9.8% 对 8.0%;再往后是 12.4% 对 7.0%、16.1% 对 4.9%,到 9 月 7 日那一周定格在 18.9% 对 3.8%。

一个 20 美分级的模型,配上一个 9 月 3 日上线的旗舰 Astra(每百万 token 输入 10 美元、输出 50 美元),形成两头夹击:Luna 吃掉海量的智能体调用,Astra 收割高价值请求。按我拿 OpenRouter 公开单价和官方 token 量做的估算,OpenAI 这一边花销最大的是 Astra,一周约 750 万美元;token 量最大的则是 Luna,一周 17.44 万亿,折成钱只有约 390 万美元。

这也解释了一个容易被混淆的地方。按 token 算,OpenAI 早在 2025 年 12 月就有两周短暂反超过 Anthropic,从今年 7 月 27 日那一周起变成稳定领先;但按花销算,9 月 7 日那一周才是 133 周里的第一次。两者差在单价:同样按公开单价估算,Anthropic 在这段时间的平均价格约每百万 token 4.48 美元,OpenAI 约 0.82 美元,差 5.5 倍。旗舰对旗舰更夸张,Anthropic 的 Fable 5.1 输入价是 Luna 的 50 倍。

Anthropic 这一边:一边砍额度,一边冲 IPO

9 月 14 日起,Anthropic 把 Claude Code 的标准周用量上限永久提高 25%,但与此同时到期的,是 5 月 13 日起实施的临时 50% 加码——两者相抵,Pro、Max、Team 和按席位计费的 Enterprise 用户,实际可用额度比之前少了 17%。官方账号自己在那条推文里写明:与今天相比,这等于周用量限制减少 17%。这项加码从推出到现在已经延期过 4 次。

把额度收紧,通常只有两种解释:算力不够分,或者额度本身就是价格工具。无论哪一种,对重度用户的效果是一样的——他们开始计算「同样的活,换一家模型要花多少钱」。

这里有个时间关系要摆正:Claude Code 的额度收紧发生在 9 月 14 日,晚于反超的那一周(9 月 7 日至 13 日)。所以不能倒果为因说「砍额度导致开发者出走」——真正推动那一周数据的是 7 月底的降价和 9 月 3 日的 Astra。额度收紧会作用在之后几周,10 月的 OpenRouter 数据才是检验它的地方。

不过 Anthropic 的账本并不难看。2026 年 4 月它曾以约 300 亿美元的年化收入首次超过 OpenAI,到 7 月底这个数字超过 650 亿美元;IPO 拟募资最多 1000 亿美元、目标估值约 2 万亿美元,英伟达计划以基石投资者身份投入最多 100 亿美元(上个月我们拆过这笔交易)。

真正耐人寻味的是另一组数字:OpenRouter 的应用排行榜上,Claude Code 是第三大应用,最近一周跑掉 5.79 万亿 token——比 Anthropic 自家模型在 9 月 7 日至 13 日那一周的全部用量(4.83 万亿)还多。也就是说,挂着 Claude Code 这个名字的流量,很大一部分并没有落在 Anthropic 的模型上。编码智能体(harness)与模型已经解耦:壳可以是 Claude Code,脑子可以是别人。

真正的赢家可能不是这两家

顺带看一眼同一份数据里的其他名字,会得到比「OpenAI 反超 Anthropic」更重要的结论。

9 月 7 日那一周,OpenRouter 全平台的 token 份额里,DeepSeek 占 19.1% 排第一,OpenAI 18.9% 第二,腾讯 16.3% 第三,智谱 12.9% 第四,小米 6.3% 第七。把这几家中国实验室加总,是 54.6%——一年前这个数字是 14.3%。而 OpenAI、Anthropic、谷歌、Meta、xAI、英伟达六家美国公司合起来是 34.3%。

OpenRouter 与 a16z 在 2025 年底联合发布的《State of AI 2025》里还留下过两条基线:编程类请求在该平台 token 中的占比,从 2025 年初的约 11% 升到年末的超过 50%;而 Anthropic 一直垄断着编程类花销,长期占 60% 以上,直到 2025 年 11 月 17 日那一周才第一次跌破这条线。

从这个角度看,今天这场反超与其说是 OpenAI 赢回开发者,不如说是「贵模型」整体在这类平台上被「够用且便宜」的模型挤压。Anthropic 守的是高端定价,OpenAI 这两年做的则是把价格打下来、把量吃进去,再用一两款旗舰去接最贵的活。

对开发者意味着什么

第一,模型可替换已经是既成事实,而不是威胁。同一套 harness 接不同模型,切换成本几乎为零,这就是你手上的议价权。第二,看到「份额」这类数字先问一句口径:是 token 份额还是花销份额?免费和补贴模型会把 token 份额吹得很大,只有钱不会说谎。

至于判断,这一轮竞争的胜负手早就不在「谁更聪明」。真正被争夺的是把活干完的单位成本——谁能用 20 美分百万 token 的模型吃掉海量调用,再留一款旗舰去收高价值的钱,谁就在账本上占优。OpenRouter 上这 133 周里最贵的一次教训,Anthropic 大概已经收到了。

相关阅读:

关注 AI 商业快讯,每天一篇 AI 热点深度解读。