<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Python on Vibe Coding 笔记</title><link>https://8-152-7-248.sslip.io/tags/python/</link><description>Recent content in Python on Vibe Coding 笔记</description><generator>Hugo -- gohugo.io</generator><language>zh_CN</language><lastBuildDate>Mon, 02 Nov 2026 00:00:00 +0800</lastBuildDate><atom:link href="https://8-152-7-248.sslip.io/tags/python/index.xml" rel="self" type="application/rss+xml"/><item><title>代理烧掉的 token，有多少花在用不上的工具上</title><link>https://8-152-7-248.sslip.io/p/tokeneconomizer-token-waste/</link><pubDate>Mon, 02 Nov 2026 00:00:00 +0800</pubDate><guid>https://8-152-7-248.sslip.io/p/tokeneconomizer-token-waste/</guid><description>&lt;img src="https://8-152-7-248.sslip.io/p/tokeneconomizer-token-waste/images/cover.png" alt="Featured image of post 代理烧掉的 token，有多少花在用不上的工具上" /&gt;&lt;p&gt;微软研究院和 UC Berkeley 的一群人，把三个命令交到你手里：&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-sh" data-lang="sh"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;git clone https://github.com/microsoft/TokenEconomizer.git&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;claude plugin marketplace add &lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="nv"&gt;$PWD&lt;/span&gt;&lt;span class="s2"&gt;/TokenEconomizer&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;claude plugin install tokeneconomizer@tokeneconomizer&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;装完的东西不换模型、不改代理、也不碰你的凭据，它只想解决一件事：你在同一个仓库里反复跑代理，那些每次都重新付一遍的钱。&lt;/p&gt;&#10;&lt;p&gt;仓库 2026 年 10 月 13 日建的，算到今天 20 天，3,757 个 star，66 次提交。README 顶上的数据块写得很硬：&lt;/p&gt;&#10;&#10; &lt;blockquote&gt;&#10; &lt;p&gt;Our measurement on SWE-Bench tasks: &lt;strong&gt;18.4–30.9% lower mean cost&lt;/strong&gt; across five agent–model combinations, cheaper in &lt;strong&gt;all 30&lt;/strong&gt; repository × combination cells, and Pass@1 up in &lt;strong&gt;4 of 5&lt;/strong&gt;.&lt;/p&gt;&#10;&#10; &lt;/blockquote&gt;&#10;&lt;p&gt;在 SWE-Bench 任务上量的：跨五组「代理 × 模型」组合，平均成本低了 18.4% 到 30.9%；30 个「仓库 × 组合」的单元格全都变便宜；Pass@1 五组里有四组上升。&lt;/p&gt;&#10;&lt;h2 id="省下来的钱长什么样"&gt;省下来的钱，长什么样&#10;&lt;/h2&gt;&lt;p&gt;五组组合并排放：&lt;/p&gt;&#10;&lt;table&gt;&#10;&#9;&lt;thead&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;代理 × 模型&lt;/th&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th style="text-align: right"&gt;平均成本&lt;/th&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th style="text-align: right"&gt;Pass@1&lt;/th&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&lt;/thead&gt;&#10;&#9;&lt;tbody&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;Claude Code + Sonnet 5&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td style="text-align: right"&gt;-23.6%&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td style="text-align: right"&gt;+1.3&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;Claude Code + Opus 4.8&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td style="text-align: right"&gt;-30.9%&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td style="text-align: right"&gt;-1.0&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;Codex + GPT-5.6 Terra&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td style="text-align: right"&gt;-24.7%&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td style="text-align: right"&gt;+0.9&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;Codex + GPT-5.6 Sol&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td style="text-align: right"&gt;-26.1%&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td style="text-align: right"&gt;+1.6&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;Copilot CLI + Sonnet 5&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td style="text-align: right"&gt;-18.4%&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td style="text-align: right"&gt;+2.6&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&lt;/tbody&gt;&#10;&lt;/table&gt;&#10;&lt;p&gt;最省的那一组，也是唯一一组变差的那一组：Opus 4.8，成本掉了将近三成，通过率掉了 1.0。这两个数挨着摆在 README 最显眼的位置，作者没把那一格挪进脚注。&lt;/p&gt;&#10;&lt;p&gt;实验规模是 277 个 SWE-Bench 任务、6 个仓库，每个任务一个会话，同一仓库的任务按顺序跑，开头时什么都不记得。成本按缓存价算，且算上了插件自己发的那些模型调用。落到每个仓库内部、每一组组合里，降幅是 5% 到 40%；Web-Bench 上是 16% 到 21%，两个安全审计基准上是 6% 到 20%，后者每个任务都在此前没进过的新仓库里。&lt;/p&gt;&#10;&lt;p&gt;&lt;img alt="三组基准与五组组合的降幅" class="gallery-image" data-flex-basis="324px" data-flex-grow="135" height="800" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://8-152-7-248.sslip.io/p/tokeneconomizer-token-waste/images/02-benchmarks.png" srcset="https://8-152-7-248.sslip.io/p/tokeneconomizer-token-waste/images/02-benchmarks_hu_84471f544173d18d.png 800w, https://8-152-7-248.sslip.io/p/tokeneconomizer-token-waste/images/02-benchmarks.png 1080w" width="1080"&gt;&lt;/p&gt;&#10;&lt;h2 id="三种浪费三种修法"&gt;三种浪费，三种修法&#10;&lt;/h2&gt;&lt;p&gt;&lt;img alt="三种浪费与三个机制" class="gallery-image" data-flex-basis="341px" data-flex-grow="142" height="760" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://8-152-7-248.sslip.io/p/tokeneconomizer-token-waste/images/01-waste-shapes.png" srcset="https://8-152-7-248.sslip.io/p/tokeneconomizer-token-waste/images/01-waste-shapes_hu_574a195290679228.png 800w, https://8-152-7-248.sslip.io/p/tokeneconomizer-token-waste/images/01-waste-shapes.png 1080w" width="1080"&gt;&lt;/p&gt;&#10;&lt;p&gt;省 token 通常有两条路：让代理少说话，或者让代理少读东西。这个仓库走的是第三条——让代理别为同一件事反复付钱。&lt;/p&gt;&#10;&lt;p&gt;代理在一个仓库里反复跑，浪费有三种形状。&lt;/p&gt;&#10;&lt;p&gt;第一种是每次都重新认一遍仓库。会话之间不留记忆，于是「这个项目要先跑哪一步构建」「测试命令到底该写 &lt;code&gt;python -m pytest&lt;/code&gt; 还是 &lt;code&gt;pytest&lt;/code&gt;」「哪个环境变量必须先设」这些事，每开一个新会话就得重新发现一次。&lt;/p&gt;&#10;&lt;p&gt;micro-skills 把这些事实攒起来，来源有两个：跨会话反复出现的失败，和一个每 k 次会话复盘一次近期会话、提出事实的模型。k 默认是 3，一条事实被三个会话确认过，就在之后每次会话的开头陈述，后面被推翻就丢掉。&lt;/p&gt;&#10;&lt;p&gt;第二种是从不用的工具，定义照发。每一个加载进来的工具，它的定义都会跟着每一次请求送出去。从来没人调过的 Notebook、Browser，定义照样在账单上。&lt;/p&gt;&#10;&lt;p&gt;tool pruning 的判定是两个条件满足其一：一个工具在跨至少 m 个会话的 p 次 prompt 里没用过，或者在 s 个任意长度的会话里都没用过。默认 p=10、m=2、s=5，判定成立后这个工具就从后续会话里剔掉，走的是代理自己的设置文件，不要求代理学会任何新东西。一条命令能还回去。&lt;/p&gt;&#10;&lt;p&gt;第三种是卡在同一个错里。一个 turn（代理处理一个 prompt 的全过程）反复撞同一个失败时，judge 模型来判断它是不是卡住，把握度到 c=0.7 才动手，给代理塞一条重定向提示，每个 turn 最多 r=1 次。改完还是卡，它只告诉你怎么停，自己绝不终止 turn。&lt;/p&gt;&#10;&lt;h2 id="参数开关和一个-60-分钟的等待"&gt;参数、开关，和一个 60 分钟的等待&#10;&lt;/h2&gt;&lt;p&gt;机制的实现方式是走代理自己的设置，而不是教代理新本事。同一个 tool pruning，在不同代理里能剔掉的粒度并不一样。&lt;/p&gt;&#10;&lt;table&gt;&#10;&#9;&lt;thead&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;代理&lt;/th&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;tool pruning 剔掉什么&lt;/th&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;写进哪&lt;/th&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&lt;/thead&gt;&#10;&#9;&lt;tbody&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;Claude Code&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;单个工具&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;code&gt;.claude/settings.local.json&lt;/code&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;Codex&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;整个 capability package&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;code&gt;.codex/config.toml&lt;/code&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;Copilot CLI&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;整个 MCP server&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;code&gt;.github/copilot/settings.local.json&lt;/code&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;Pi&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;不剔，它只加载四个工具&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;—&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;opencode&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;目前还不剔&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;—&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&lt;/tbody&gt;&#10;&lt;/table&gt;&#10;&lt;p&gt;默认参数里有个 q=60：deny list 不是立刻写下去，要等这个仓库里的会话空闲满 60 分钟，或者最迟一天，才落盘。README 给的理由写在 Settings 一节：会话恢复后工具变了，整段历史就得重新写进 prompt cache 而不是从 cache 里读，而空闲一个小时之后，那个 cache 本来也已经过期了。&lt;/p&gt;&#10;&lt;p&gt;也就是说这 60 分钟不是在等用户，是在等缓存自己过期，好让工具变更和缓存失效落在同一段时间里。&lt;/p&gt;&#10;&lt;p&gt;开关是逐项的：&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;/tokeneconomizer:config set microskills=on # 打开 micro-skills&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;/tokeneconomizer:config set toolprune_evidence=20 # p = 20：等二十次没用过&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;/tokeneconomizer:config set loopguard_nudges=2 # r = 2：重定向两次再告诉你&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;两个模式也值得知道：&lt;code&gt;toolprune=propose&lt;/code&gt; 只把 deny list 提出来，不动任何东西，等你跑 &lt;code&gt;toolprune apply&lt;/code&gt; 才真正生效；&lt;code&gt;microskills=envfacts&lt;/code&gt; 只从反复出现的失败里学事实，一次模型调用都不发。&lt;/p&gt;&#10;&lt;p&gt;默认状态不是全开。tool pruning 和 loop guard 默认开，micro-skills 默认关，它的提议器要额外发模型调用，省多少取决于这个仓库和你干的活儿。&lt;/p&gt;&#10;&lt;p&gt;几个日常命令记一下就够：&lt;code&gt;/tokeneconomizer:status&lt;/code&gt; 看它学到了什么、这次会话花了多少；&lt;code&gt;/tokeneconomizer:toolprune&lt;/code&gt; 看剔掉了哪些工具以及凭什么剔的；&lt;code&gt;toolprune restore&lt;/code&gt; 把工具还回去，还回去之后不会再被剔。&lt;/p&gt;&#10;&lt;p&gt;&lt;code&gt;/tokeneconomizer:toolprune refresh-catalog&lt;/code&gt; 每台机器上跑一次，Claude Code 更新之后还要再跑一次，它会把每次会话加载过哪些工具记下来，整个过程不发模型调用。&lt;/p&gt;&#10;&lt;p&gt;实在不想让它介入，启动时代理前面加个环境变量 &lt;code&gt;TE_DISABLE=1 claude&lt;/code&gt; 就行。学到的东西落在你自己机器的 &lt;code&gt;~/.tokeneconomizer&lt;/code&gt;，插件自己发的模型调用走的是你自己的代理账号和套餐，费用算在它自己的报告里。&lt;/p&gt;&#10;&lt;h2 id="仓库里现在是什么样"&gt;仓库里现在是什么样&#10;&lt;/h2&gt;&lt;p&gt;&lt;img alt="仓库结构与提交分布" class="gallery-image" data-flex-basis="308px" data-flex-grow="128" height="840" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://8-152-7-248.sslip.io/p/tokeneconomizer-token-waste/images/03-repo-layout.png" srcset="https://8-152-7-248.sslip.io/p/tokeneconomizer-token-waste/images/03-repo-layout_hu_e8ac21866949295a.png 800w, https://8-152-7-248.sslip.io/p/tokeneconomizer-token-waste/images/03-repo-layout.png 1080w" width="1080"&gt;&lt;/p&gt;&#10;&lt;p&gt;66 次提交，contributors 列表上是 8 个人：aaron-jx-li 一个占 53 次，剩下 7 位加起来 9 次。而论文的作者名单上排着 Ion Stoica、Jianfeng Gao、Michel Galley。这两件事不矛盾，但说明这个仓库基本是一个人扛的。&lt;/p&gt;&#10;&lt;p&gt;语言构成：Python 1.9 MB、Shell 74 KB、TypeScript 29 KB、JavaScript 1.2 KB。README 里那句「The package is standard-library only」说的是 &lt;code&gt;tokeneconomizer/&lt;/code&gt; 这个 Python 包，TypeScript 是 Pi 扩展和 opencode 插件用的。&lt;/p&gt;&#10;&lt;p&gt;它还很新，边角也确实毛。issue 里能看到一批 Windows 和 Codex 上的边界问题：&lt;code&gt;toolprune refresh-catalog&lt;/code&gt; 清临时目录报 WinError 32（#86），Codex 把每个可信项目都报成不可信（#83），Claude Code 的 side call 一直挂着全部 MCP server，导致一次 Haiku 调用摊到约 57 万等效 token（#87）。这三个都是 10 月 30 日提的，现在都已经关掉了。&lt;/p&gt;&#10;&lt;p&gt;开放 issue 只剩 3 条，开放的 PR 倒有 10 个。其中一条是 #85「Will other agents be supported?」，问的是除了 Claude Code、Codex、Copilot CLI 和 Pi，还会不会接别的代理。opencode 是实验性支持，README 只在 1.19.5 和 2.2.0 上测过。&lt;/p&gt;&#10;&lt;h2 id="那些数字是怎么跑出来的"&gt;那些数字是怎么跑出来的&#10;&lt;/h2&gt;&lt;p&gt;论文用的代码没有混进插件，两边只共享 &lt;code&gt;tokeneconomizer/&lt;/code&gt;。要自己跑一遍的话，&lt;code&gt;experiments/&lt;/code&gt; 目录里是完整的实验台：277 个 SWE-Bench 任务、102 个 Web-Bench 任务，加上逐个 agent × model 的 arm 定义。&lt;/p&gt;&#10;&lt;p&gt;跑它要一台 Linux x86_64 机器、能免 sudo 用 Docker、约 200 GB 磁盘，以及 Anthropic 和 OpenAI 两把 key。Claude Code 和 Copilot CLI 记第一把，Codex 记第二把。&lt;/p&gt;&#10;&lt;p&gt;不想跑实验的话，读 &lt;code&gt;docs/PLUGIN.md&lt;/code&gt; 更划算，那份文档记录了每个代理的 hook 和设置行为是怎么被验证的。想看数字怎么算的，&lt;code&gt;experiments/README.md&lt;/code&gt; 里是一行一条结果的启动命令。&lt;/p&gt;&#10;</description></item></channel></rss>