设置
工具剪枝和循环守卫默认开启。在这两个默认值下,插件只在某一轮出现循环迹象时才会调用模型:即裁判,以及它发现该轮卡住时写下的重定向。设置按仓库生效(加 --global 则全局生效),并由该仓库里的所有智能体共享。
三种机制开关模式
微技能默认关闭,因为它的提议器会增加模型调用,而它能省下多少取决于仓库与任务性质。除了 on 和 off,微技能与工具剪枝还支持不调模型或仅提议的中间模式:
| 机制 | 配置键 | 设为 on 时的行为 | 其他可选值 |
|---|---|---|---|
| 微技能(默认关闭) | microskills | envfacts+distiller:无模型调用的环境事实层,加上每隔 microskills_propose_every 个会话运行一次的提议器模型 | off:关闭;envfacts:仅从反复失败中提取事实(零模型调用);distiller:仅运行提议器模型 |
| 工具剪枝(默认开启) | toolprune | auto:证据充足且会话空闲满 toolprune_quiet_minutes(或满一天)后自动写入拒绝列表,并在下次会话开始时播报 | off:停止生成新列表(已应用的列表需用 toolprune restore 归还);propose:仅提议,等你运行 toolprune apply 后再生效 |
| 循环守卫(默认开启) | loopguard | nudge:裁判模型判断疑似循环的轮次是否卡住;若卡住则注入最多 loopguard_nudges 次重定向,仍卡住则提示你如何中断 | off:关闭守卫与裁判调用;stop:在插件中等同于 nudge(插件绝不自行终止轮次) |
九项核心设置
首页与论文中用斜体字母标记的九项核心参数及其默认值如下:
| 字母 | 设置名称 | 默认值 | 控制什么 |
|---|---|---|---|
k | microskills_propose_every | 3 | 微技能提议器两次运行之间相隔的会话数(首次运行提前一个会话,即默认在第 2 个会话后) |
p | toolprune_evidence | 10 | 一个工具在被排除前必须未被使用的提示数(NotebookEdit 与 Codex image_media 为 3 倍) |
m | toolprune_min_sessions | 2 | 这些未使用提示必须横跨的会话数;设为 1 则允许单个长会话决定 |
s | toolprune_sessions | 5 | 或者横跨这么多会话均未使用,不论每个会话跑了多少条提示 |
q | toolprune_quiet_minutes | 60 | 仓库会话空闲多少分钟后才写出拒绝列表,避免热缓存失效(最迟在列表形成一天后写入) |
e | loopguard.envelope_min_samples | 5 | 在此处「正常结束」(最后一次编辑后没有失败检查)的轮数,达到后循环守卫才开始行动 |
c | loopguard.judge_confidence | 0.7 | 裁判模型判定某一轮「卡住」所需的最低把握度 |
r | loopguard_nudges | 1 | 每轮在守卫仅向你发出停止提示之前,最多可注入重定向的次数 |
b | loopguard.backstop_mult | 2.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> | conservative | default | aggressive | 含义说明 |
|---|---|---|---|---|
min_turns | 28 | 20 | 14 | 一轮中至少发生多少次工具调用后,才可能被判定为卡住 |
edit_churn | 5 | 4 | 3 | 对同一文件的反复编辑达到多少次算作空转(含 shell 内编辑) |
distinct_edit_files | 3 | 3 | 3 | 编辑过多少个不同文件算作分散改动 |
error_outputs | 8 | 6 | 4 | 失败的工具结果累计达到多少次算作持续报错 |
stagnation | 0.30 | 0.20 | 0.12 | 重复此前错误的失败结果占比阈值 |
envelope_pct | 90 | 90 | 90 | 计算仓库「正常结束轮次」包络时取用的分位数 |
envelope_margin | 1.5 | 1.25 | 1.0 | 乘在该分位数上的安全裕度系数 |
envelope_min_samples | 7 | 5 | 3 | 循环守卫开始行动前需要积累的「正常结束轮次」样本数 |
backstop_mult | 3.5 | 2.5 | 1.8 | 超出包络多少倍且满足严格空转规则时,即使裁判不同意也强制重定向 |
judge_confidence | 0.85 | 0.7 | 0.55 | 裁判模型判定卡住所需的置信度阈值 |
gate_min_turns | 24 | 18 | 12 | 唤醒裁判模型前至少经过的工具调用次数(不低于 min_turns) |
gate_error_outputs | 8 | 8 | 8 | 即使没有完全相同的重复失败,累计多少次报错也会唤醒裁判 |
进阶与其它设置
| 设置名称 | 默认值 | 控制什么 |
|---|---|---|
microskills_max_facts | 4 | 会话开始时从「反复出现的失败」注入的事实条数上限(提议器生成的事实不受此上限约束) |
microskills_max_tokens | 150 | 上述环境事实块的体积上限(按 token 计,约每 4 个字符 1 token) |
toolprune_protect | 无 | 永不排除的工具名或通配模式(如 mcp__headroom__*),逗号分隔;插件此前为其写下的拒绝规则会在下次归档时移除 |
loopguard_aggr | default | 循环守卫阈值预设档位:conservative(保守)、default(默认)或 aggressive(激进) |
repomap | off | 第四机制「仓库地图」:on 为按首条提示中的标识符排序;start 为会话开始时直接注入缓存地图 |
repomap_tokens | 2048 | 仓库地图的最大 token 预算 |
repomap_timeout | 8 | 首条提示等待排序版仓库地图的秒数上限,超时则回退使用缓存地图 |
paid_model | "" | 插件自身模型调用使用的模型;留空时 Claude Code 用 haiku,Codex 与 Pi 用各自默认模型,Copilot 用具体模型或 Haiku |
shadow | false | 影子模式:照常计算并记录所有决策到日志,但不执行任何注入、剪枝或重定向 |
mode | auto | 强制指定 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 一节。