TokenEconomizer 实测:微软开源的编码 Agent 省钱插件,我在 opencode 上跑通了仓库手册注入,也踩了三个坑

编码 Agent 的账单有个不太直觉的结构:让模型干活本身花不了几个钱,真正的大头是重复——每个会话开头重新摸一遍这个仓库怎么跑测试、每个请求都背着全套工具 schema、卡在同一个报错里来回打转。微软研究院联合 UC Berkeley 在 10 月 30 日开源的 TokenEconomizer,瞄准的就是这三类浪费。它不改模型、不改 Agent 代码,靠”从历史会话学经验”来省钱,官方论文数据是 277 个 SWE-Bench 任务上平均成本降 18.4%–30.9%(论文见 arXiv:2610.22732,项目页有交互图表)。

这种”跨会话复用”和我之前写过的两条省 token 路线都不一样:Headroom 那类上下文压缩是把当前上下文压小,Graft 那类代码图谱是把代码检索变准;TokenEconomizer 学的是”事实”——这个仓库的测试要用哪个命令跑、哪个脚本要什么环境变量——然后把事实写进下个会话的开头。

官方支持 Claude Code、Codex、Copilot CLI 和 Pi,opencode 是实验性支持。我手头正好有一台装着 opencode 2.1.4 的 MacBook(上个月实测 OpenCode 2.0用的同一台 M4/16GB),就决定在 opencode 上把它真实跑一遍:装插件、跑对照实验、看它到底学不学得会、注不注入。结论先说:核心机制真实有效,但 opencode 这条实验性通路有三个坑,动手前值得知道。

它的三个机制,一分钟版

  • micro-skills(仓库手册):每完成一个会话,插件把它折叠成摘要(改了哪些文件、跑过哪些命令、哪些命令带着报错失败),再从失败重复和模型提案两个来源提炼”事实”。一个事实要累计三次会话确认才会注入,后续会话 contradicted 就剔除。
  • tool pruning(工具剪枝):每个加载的工具定义每个请求都要重发一遍。连续多个会话没被用过的工具,直接从 Agent 的设置里摘掉,一条命令能恢复。
  • failure-loop intervention(循环守卫):回合里反复撞同一个错时,用一次模型调用判断是否卡死,是就往上下文里塞一条”换个思路”的重定向,每回合最多一次,插件从不替你停回合。

工具剪枝和循环守卫在 Claude Code 上默认开启;micro-skills 默认关着,因为提案要额外花模型调用。opencode 上默认配置相同,但实际能力打折——下面细说。

安装与实测环境

本次实测环境:macOS 26.5.2,M4 / 16GB,opencode 2.1.4,模型走 OpenRouter 免费档 opencode/glm-5.3-flash-free(所有会话成本为 0,方便只看 token 数),Python 3.13.12,插件代码为仓库 commit e428fc91b0f8。opencode 的安装方式是软链一个插件文件:

Bash
git clone https://github.com/microsoft/TokenEconomizer.git
mkdir -p ~/.config/opencode/plugins
ln -s "$PWD/TokenEconomizer/plugin/opencode/tokeneconomizer.ts" \
  ~/.config/opencode/plugins/tokeneconomizer.ts

装完在任意仓库跑一次 opencode,会话结束时就会被导出到 ~/.tokeneconomizer/。日常查看和配置用终端命令(opencode 没有插件命令体系,所以这些都要在终端跑):

Bash
~/.tokeneconomizer/bin/te --host opencode status    # 看状态
~/.tokeneconomizer/bin/te --cwd /path/to/repo config set microskills=on
~/.tokeneconomizer/bin/te --cwd /path/to/repo config set paid_model=你的模型
~/.tokeneconomizer/bin/te --cwd /path/to/repo fold  # 手动折叠会话
~/.tokeneconomizer/bin/te --cwd /path/to/repo facts # 看学到了什么

实验设计:一个埋了三个坑的假仓库

我搭了个 Python 小项目 shopcalc,故意埋了三个”每次都得重新发现”的坑:测试只能用 .venv/bin/pytest 加 PYTHONPATH=src 跑(系统 Python 里没装 pytest);改了 prices.yaml 必须先跑 python3 tools/gen_prices.py 重新生成,否则测试必挂;tools/report.py 必须带 REPORT_MODE=1 环境变量才会出报告。

然后分两组跑同构任务:A 组 4 个会话(修 bug、加优惠码、修”明明改了配置还挂”的测试、生成报告)不装插件;B 组 4 个同类型任务装上插件。每个会话都是独立的 opencode run,token 用量从 opencode 数据库里逐条消息加总,不是目测。

组别 会话数 input tokens output tokens cache 读 总耗时
A 组(无插件) 4 70,297 4,382 413,440 306.7s
B 组(装插件) 4 45,926 2,507 240,448 132.5s

B 组 input 少了 34.7%,时间快了一倍多。但这里必须说句实话:B 组跑的时候,插件的注入还没生效——事实要三次会话确认才出闸门,B 组结束时插件还什么都没学到。所以这组差值主要来自任务顺序、模型发挥这些混杂因素,不能记在 TokenEconomizer 头上。官方论文里”越用越省”的曲线要积累到第六个任务才稳定,我的 8 个会话量级太小,撑不起归因。这个表当个量级参考就好。

真正值钱的三条证据

插件真正被验证的是这三件事,每条都有文件级证据。

第一,会话折叠与统计是真实在跑的。 装插件后的 11 个会话里 10 个被导出折叠(最后一个还没过静默期),te status 显示 146.3k effective tokens;循环守卫从 20 个正常回合里学出了”14 次工具调用”的正常回合包络。我的任务都太顺,0 次重定向触发——守卫学会了什么是正常,但没等到出手的机会。

第二,事实真的被学出来了。 在 D 组连续三次”帮我跑测试”的会话之后,te facts 给出了三条:

Plaintext
CANDIDATE fire= 3/3   prices-gen-regenerate
ACTIVE    fire= 2/5 INJECTED pytest-needs-pythonpath-src
ACTIVE    fire= 3/3   report-tool-report-mode

它不仅学会了”测试要用 PYTHONPATH=src .venv/bin/python -m pytest 跑”,连”报告脚本要 REPORT_MODE=1″和”改配置要重新生成”这两个坑也各自进了候选和激活名单。这三条完全来自它对我会话失败记录的观察。

第三,注入是逐字生效的。 手册渲染进系统提示词后,我开了个新会话直接问模型。它的回答原样引用了手册条目,和 injection.json 里渲染的内容一字不差;更实际的是行为变化——这个会话里它第一步就写出 REPORT_MODE=1 ... report.py > report4.csv,零次试错,而基线组的同款任务要先读脚本摸索。

opencode 通路上的三个坑

坑一:tool pruning 在 opencode 上不可用。 te status 直接写着 toolprune not available on this host。opencode 没有能让插件改工具列表的设置通道,所以三机制在这里只剩两个半——循环守卫的判定在,剪枝没有。论文里剪枝是最大的单项节省来源(13.2%–17.7%),这意味着 opencode 用户能拿到的收益上限天然低一截。

坑二:会话不会自动折叠。 无头 opencode run 结束后,导出文件躺在那里,status 却一直是 0 folded。翻源码才看明白:折叠要求会话静默 10 分钟才判定为”已结束”,插件自己的折叠子进程在我这儿也没跑成。也就是说你装完插件立刻连跑几个会话,status 会一直骗你说什么都没发生——要么等 10 分钟,要么手动跑一次 te fold。这一点官方 README 没写明白,第一体验非常劝退。

坑三:插件自己的模型调用,在免费模型上是个死循环。 事实提案(distiller)每 3 个会话调一次模型,走的是你 Agent 的默认模型。我的默认模型一上来就 402——它按 131072 max_tokens 发请求,免费额度只付得起 79,812。得手动 config set paid_model=opencode/glm-5.3-flash-free 把侧调用的模型钉到免费档。改完之后提案调用确实发出去了(账单上多了 5,879 输入 + 1,058 输出 token),但 GLM 这个免费档是推理模型,这次调用返回的 assistant 消息 parts 是空的——插件解析不到正文文本,提案照样空转。最后帮它跨过终点线的是 envfacts 层——不调模型、纯靠失败模式匹配的那一层,三条事实全是它学出来的。

什么人该装,什么人别装

该装:白天泡在同一个大仓库里、用 Claude Code 或 Codex 付费档的开发者。论文数据显示收益是”30 个仓库×模型组合全部更便宜”,且机制不改你任何现有工作流,坏了也只是静默失效。

别装:一次性脚本仓库和新仓库(论文自己承认 fresh repo 只有 6%–20%,micro-skills 在没历史会话的地方无处可学);以及免费推理模型用户——坑三意味着你现在装上大概率只能用到 envfacts 这一层,值回票价的 distiller 是哑的。

还有一个更根本的判断:这类工具的前提是你真的按 token 付费。我用免费模型跑全套实验,成本恒为 0,省下的 token 只体现在数字里。如果你在用包月订阅或免费档,先算算自己的实际 token 账单,再决定要不要为 30% 的节省装一个常驻插件。

对比一下时间线也很有意思:从给 Agent 装审查层看它改了什么,到编排与审计链,再到这次的成本控制层,编码 Agent 生态正在把”跑得快”之外的每一环都变成独立工具。TokenEconomizer 抢的是其中最实在的一环——账单。

未实测部分如实说明:Claude Code / Codex / Copilot CLI / Pi 四个正式支持平台的安装与效果我没有逐一验证(本机无对应订阅);工具剪枝的恢复命令、循环守卫的真实重定向、repomap 功能也都未跑过。官方三个支持版本区间收得很窄(如 Claude Code 2.1.300–2.1.310),装之前先核对你自己的版本。

推荐阅读

  • Bernstein 实测:给 CLI 编码 Agent 加一层可离线验证的编排,四组破坏实验测出审计链的真正边界

    Bernstein 是 10 月 29 日登上 Hacker News 首页的开源 Agent 治理层,调度器里没有 LLM。我在 16GB M4 MacBook 上从装包测到 Ed25519 回执:…

  • 百度开源 Unlimited OCR 2 实测:一次读完 3600 页的 OCR,我在 16GB MacBook 上把它跑通了,多页模式有个数字坑

    百度 10 月 27 日开源的 Unlimited OCR 2 把文档解析上限推到「无限页」。本文用官方 Space 和 16GB MacBook 各实测一遍:单页 19 秒输出带坐标的结构化 Mar…

  • LFM3 实测:六款 2B 级模型共用一个骨干,16GB Mac 上我跑通了文本、视觉、音频和决策

    Liquid AI 的 LFM3 把文本、视觉、音频、决策塞进 1.7B 骨干,六款权重各 1.1GB。我在 M4/16GB 上编译 llama.cpp master 跑了四款:文本 65 tok/s…

  • Hob 实测:开源离线 AI 桌面端,16GB Mac 上它替我挑了 5GB 模型,预测 35 tok/s 实测只有 27

    Hob 是 10 月 26 日开源的本地 AI 桌面端,不选模型、不要账号,装完先扫你的机器。我把它的选型代码抽出来,在 16GB M4 上跑出它给的答案:推荐 Gemma 4 E4B、预测 35 t…