TokenEconomizer经验驱动的黑盒成本控制

设置

工具剪枝和循环守卫默认开启。在这两个默认值下,插件只在某一轮出现循环迹象时才会调用模型:即裁判,以及它发现该轮卡住时写下的重定向。设置按仓库生效(加 --global 则全局生效),并由该仓库里的所有智能体共享。

三种机制开关模式

微技能默认关闭,因为它的提议器会增加模型调用,而它能省下多少取决于仓库与任务性质。除了 on 和 off,微技能与工具剪枝还支持不调模型或仅提议的中间模式:

机制配置键设为 on 时的行为其他可选值
微技能(默认关闭)microskillsenvfacts+distiller:无模型调用的环境事实层,加上每隔 microskills_propose_every 个会话运行一次的提议器模型off:关闭;envfacts:仅从反复失败中提取事实(零模型调用);distiller:仅运行提议器模型
工具剪枝(默认开启)toolpruneauto:证据充足且会话空闲满 toolprune_quiet_minutes(或满一天)后自动写入拒绝列表,并在下次会话开始时播报off:停止生成新列表(已应用的列表需用 toolprune restore 归还);propose:仅提议,等你运行 toolprune apply 后再生效
循环守卫(默认开启)loopguardnudge:裁判模型判断疑似循环的轮次是否卡住;若卡住则注入最多 loopguard_nudges 次重定向,仍卡住则提示你如何中断off:关闭守卫与裁判调用;stop:在插件中等同于 nudge(插件绝不自行终止轮次)

九项核心设置

首页与论文中用斜体字母标记的九项核心参数及其默认值如下:

字母设置名称默认值控制什么
kmicroskills_propose_every3微技能提议器两次运行之间相隔的会话数(首次运行提前一个会话,即默认在第 2 个会话后)
ptoolprune_evidence10一个工具在被排除前必须未被使用的提示数(NotebookEdit 与 Codex image_media 为 3 倍)
mtoolprune_min_sessions2这些未使用提示必须横跨的会话数;设为 1 则允许单个长会话决定
stoolprune_sessions5或者横跨这么多会话均未使用,不论每个会话跑了多少条提示
qtoolprune_quiet_minutes60仓库会话空闲多少分钟后才写出拒绝列表,避免热缓存失效(最迟在列表形成一天后写入)
eloopguard.envelope_min_samples5在此处「正常结束」(最后一次编辑后没有失败检查)的轮数,达到后循环守卫才开始行动
cloopguard.judge_confidence0.7裁判模型判定某一轮「卡住」所需的最低把握度
rloopguard_nudges1每轮在守卫仅向你发出停止提示之前,最多可注入重定向的次数
bloopguard.backstop_mult2.5反复空转的轮次超过通常长度(包络)的几倍时,无需裁判同意也直接重定向并标记

下面以 Claude Code 的写法展示常用修改命令(其他智能体替换前缀即可):

修改与重置设置
/tokeneconomizer:config set microskills=on                 # 在当前仓库开启微技能
/tokeneconomizer:config set microskills=on --global        # 在所有仓库开启微技能
/tokeneconomizer:config set microskills_propose_every=5    # k = 5:更不频繁地提议事实
/tokeneconomizer:config set toolprune_evidence=20          # p = 20:等待二十次未使用的提示
/tokeneconomizer:config set loopguard_nudges=2 loopguard.min_turns=30
/tokeneconomizer:config unset loopguard.min_turns          # 恢复为当前预设档位的默认值

循环守卫三档预设阈值

循环守卫通过 loopguard_aggr 提供三档灵敏度预设(conservative、default、aggressive),你也可以用 loopguard.<name>=值 单独覆盖其中任意一项:

loopguard.<name>conservativedefaultaggressive含义说明
min_turns282014一轮中至少发生多少次工具调用后,才可能被判定为卡住
edit_churn543对同一文件的反复编辑达到多少次算作空转(含 shell 内编辑)
distinct_edit_files333编辑过多少个不同文件算作分散改动
error_outputs864失败的工具结果累计达到多少次算作持续报错
stagnation0.300.200.12重复此前错误的失败结果占比阈值
envelope_pct909090计算仓库「正常结束轮次」包络时取用的分位数
envelope_margin1.51.251.0乘在该分位数上的安全裕度系数
envelope_min_samples753循环守卫开始行动前需要积累的「正常结束轮次」样本数
backstop_mult3.52.51.8超出包络多少倍且满足严格空转规则时,即使裁判不同意也强制重定向
judge_confidence0.850.70.55裁判模型判定卡住所需的置信度阈值
gate_min_turns241812唤醒裁判模型前至少经过的工具调用次数(不低于 min_turns)
gate_error_outputs888即使没有完全相同的重复失败,累计多少次报错也会唤醒裁判

进阶与其它设置

设置名称默认值控制什么
microskills_max_facts4会话开始时从「反复出现的失败」注入的事实条数上限(提议器生成的事实不受此上限约束)
microskills_max_tokens150上述环境事实块的体积上限(按 token 计,约每 4 个字符 1 token)
toolprune_protect无永不排除的工具名或通配模式(如 mcp__headroom__*),逗号分隔;插件此前为其写下的拒绝规则会在下次归档时移除
loopguard_aggrdefault循环守卫阈值预设档位:conservative(保守)、default(默认)或 aggressive(激进)
repomapoff第四机制「仓库地图」:on 为按首条提示中的标识符排序;start 为会话开始时直接注入缓存地图
repomap_tokens2048仓库地图的最大 token 预算
repomap_timeout8首条提示等待排序版仓库地图的秒数上限,超时则回退使用缓存地图
paid_model""插件自身模型调用使用的模型;留空时 Claude Code 用 haiku,Codex 与 Pi 用各自默认模型,Copilot 用具体模型或 Haiku
shadowfalse影子模式:照常计算并记录所有决策到日志,但不执行任何注入、剪枝或重定向
modeauto强制指定 interactive(交互模式)或 headless(无头模式),覆盖插件的自动检测

仓库地图(repomap)与 rtk

可选第四机制:仓库地图(Repository map)

借助 aider-chat 生成仓库关键文件与符号签名的压缩地图(按被引用频次排序,默认最多 2048 tokens),在会话开始时注入上下文,帮助智能体在读取文件前就掌握代码结构,且不消耗任何模型调用:

启用仓库地图
pip install aider-chat                      # 或 pipx install aider-chat / uv tool install aider-chat
~/.tokeneconomizer/bin/te config set repomap=on      # 设置由该仓库下的所有智能体共享

在 Claude Code、Copilot CLI 与 Pi 上,repomap=on 会根据你首条提示中的标识符动态重排地图(若超过 repomap_timeout 秒则回退使用缓存地图);在 Codex 上或设为 repomap=start 时,则在会话启动时直接注入按 commit 缓存的地图,绝不延迟提示响应。

与 rtk 配合使用

rtk 用于压缩终端命令输出。两者互不干扰:插件会自动将 rtk 前缀命令还原为其包裹的真实命令来分析;唯一需要注意的细节是在 rtk 0.45.0 下,当环境缺失 pytest 时 rtk pytest 退出码为 1 但不打印报错文本,插件无法从中触发环境事实提取,而显式指定解释器的命令(如 .venv/bin/python -m pytest)不会被 rtk 改写,仍可正常工作。

环境变量与优先级

配置优先级从高到低依次为:单次会话环境变量 > 当前仓库设置 > 全局设置(--global) > 内置默认值。每一项设置的环境变量名均为 TE_ 加上其大写名称:

环境变量覆盖
TE_DISABLE=1 claude                                    # 单次会话关闭整个插件
TE_LOOPGUARD=off codex                                 # 单次会话只关掉某一机制
TE_LOOPGUARD_THRESHOLDS='{"min_turns": 30}' claude     # 单次会话覆盖循环守卫子阈值

早期版本中的旧配置名(inject_*、untool_*、spiral_* 以及环境变量 TE_INJECT、TE_UNTOOL、TE_SPIRAL)依然向后兼容读取。完整列表见 plugin/README.md 的 Settings 一节。

本站为 TokenEconomizer 论文与仓库的中文导览 · Apache-2.0加州大学伯克利分校 · 微软研究院