跳转至

SOP:启用 ctx-scout 子智能体 + 积分门控一键切换

主题:subagent-20261002 | 变更类型:C 类(新增全局配置与工具,改变 agent 行为) 备份台账:backup/README.md

1. 背景

Trae 支持用 Markdown 定义 Subagent(~/.trae-cn/agents/*.md),其价值是独立上下文 窗口——把需要读大量文件 / 多轮检索的重活挡在主对话之外,直接打击本工程实测的 「成本 93% 集中在 ≥150k prompt 请求」这一项。

用户当前有 1666 Trae 积分,希望: - 积分充足时,Subagent 用 Trae 内置模型(消耗积分、走 TRAE 通道); - 积分不足(阈值 200)时,Subagent 只保留上下文隔离价值,改用自定义模型(走本机 token_proxy 代理,消耗上游 ¥、不耗积分)。

硬约束(决定了本方案形态):Trae 官方文档明确,Subagent 的 model 字段 「仅支持指定内置模型,不支持自定义模型」,且只能静态写死在文件里,无法按次切换; Trae 积分是账号侧数据,本机无可编程读取入口。因此「按积分门控」只能做成 人工触发的一键开关,而不是自动判断。

2. 目标

  • 新增一个用户级只读 Subagent ctx-scout,默认处于 trae 档(写内置模型名);
  • 提供一个幂等的一键切换脚本与 slash 命令,可在 trae 档 / proxy 档之间切换;
  • 切换只改 ~/.trae-cn/agents/ctx-scout.md 的 model: 行,不动其它任何配置。

可验证状态:switch_subagent_model.py status 能正确报出当前档位;切换两次到同一档位, 第二次零变更。

3. 前置条件

项 要求
Trae 开关 设置 > Beta > Subagents,打开「启用 Subagents 目录」;否则 agents/ 不被加载
运行环境 本机 python3(仅用标准库,无需 venv)
目录 ~/.trae-cn/agents/ 存在(本次已建)
权限 以 rain 用户运行即可,无需 sudo

4. 影响范围

  • 主机:仅本机 192.168.31.250(rain),单机。
  • 组件:新增 ~/.trae-cn/agents/ctx-scout.md、~/.trae-cn/commands/subagent-mode.md; 新增脚本 subagent-20261002/switch_subagent_model.py。
  • 是否停服:否。不触碰 代理 token-proxy、hooks.json、user_rules 现有内容(仅规则索引追加一行)。
  • 窗口期:无。可在任意时刻执行;切换对在途会话无影响,下一个新会话 / Subagent 调用生效。

5. 分步操作

步骤 1:建用户级 Subagent 定义

Subagent 靠 description 被主 Agent 自动匹配调用,model 行是唯一的档位开关。 本步写入 model: DeepSeek-V4-Flash(与代理 ds 路由的 DeepSeek V4-Flash 族同款)。

坑:name 必须字母开头、只含字母数字与连字符、≤50 字符;frontmatter 必须是标准 YAML(首尾 ---、无 BOM),否则文件被静默忽略。

mkdir -p ~/.trae-cn/agents
cat > ~/.trae-cn/agents/ctx-scout.md <<'EOF'
---
name: ctx-scout
description: 只读的探索型子智能体,用于需要大量检索、读取多份文件、跨文件取证或多轮统计、但最终只需返回结论的任务……
model: DeepSeek-V4-Flash
tools: Read, Glob, Grep, Bash, WebSearch, WebFetch, Skill
---

(系统提示词:只读、先结论后证据、限定目录检索、保持简短。全文见文件本身。)
EOF

预期:文件存在且首行为 ---。 失败判断:无 description / frontmatter 不合法 → 该 Subagent 不会被调用(见第 6 章排查)。

步骤 2:建一键切换脚本

脚本对 ~/.trae-cn/agents/<agent>.md 的 frontmatter 做原子改写:trae 档确保有 model: <内置模型名> 行,proxy 档删除该行。幂等(目标档已满足即零变更)。

坑:改写 frontmatter 时必须保留文件首行的 ---——拆分函数返回的「front 部分」 不含首定界符,重组时要显式补回,否则文件会坏掉、Subagent 加载失败(本次实机验证时 第一版就踩到,已修并回归)。

cd ~/Documents/services/token_proxy/subagent-20261002
chmod +x switch_subagent_model.py
python3 switch_subagent_model.py status

预期:[status] ctx-scout 当前档位 = trae(内置模型 DeepSeek-V4-Flash,消耗 Trae 积分)。 失败判断:报 未找到子智能体文件 → 第 1 步未完成或 --agent 名称不符。

步骤 3:建 slash 命令

让用户在 Trae 里 /subagent-mode 一键触发脚本,命令正文只做「意图 → 参数」映射, 不改任何文件。

cat > ~/.trae-cn/commands/subagent-mode.md <<'EOF'
---
name: "subagent-mode"
description: "切换 ctx-scout 子智能体的模型档位:积分充足用 Trae 内置,积分不足改走自定义代理模型"
---
(正文:用户意图映射 trae/proxy/status,运行 switch_subagent_model.py,原样回报输出。)
EOF

预期:ls ~/.trae-cn/commands/subagent-mode.md 存在。slash 命令在被调用时展开、不进系统提示,无需为它开新会话。

步骤 4:切换档位(日常操作)

cd ~/Documents/services/token_proxy/subagent-20261002
python3 switch_subagent_model.py status   # 看当前
python3 switch_subagent_model.py proxy    # 积分 < 200:删除 model 行,走代理
python3 switch_subagent_model.py trae      # 积分充足:写回内置模型名

预期:[完成] … 或 [跳过] 已是 …档,零变更。 失败判断:非零退出且打印 [错误] → 按提示核对文件路径。

6. 验证

# ① 档位正确
cd ~/Documents/services/token_proxy/subagent-20261002 && python3 switch_subagent_model.py status

# ② 幂等:同档位连切两次,第二次必须零变更
python3 switch_subagent_model.py trae && python3 switch_subagent_model.py trae   # 预期第二次 [跳过]
python3 switch_subagent_model.py proxy && python3 switch_subagent_model.py proxy # 预期第二次 [跳过]

# ③ 文件未损坏:首行为 --- 、含 name/description
sed -n '1,6p' ~/.trae-cn/agents/ctx-scout.md

离线用例已在实机跑通 10 项(见附录)。真机端到端验证(需用户动作):

  1. 设置 > Beta 打开「启用 Subagents 目录」;
  2. 开新会话;
  3. 让它做一件「读多份文件、只要结论」的事,观察是否出现 ctx-scout 子智能体卡片。

7. 回滚

本变更全部新增,回滚即删除新增文件,不改回任何既有配置:

rm -f ~/.trae-cn/agents/ctx-scout.md          # 移除 Subagent
rm -f ~/.trae-cn/commands/subagent-mode.md     # 移除 slash 命令
rm -rf ~/Documents/services/token_proxy/subagent-20261002   # 移除脚本与档案(含备份)

若是文档类修改(docs/HANDOFF.md / docs/PROJECT-MAP.md / docs/SOP.md / ~/.trae-cn/user_rules/rule-skill-index.md)需回退,用同目录下的备份覆盖:

cp -p <主题>/backup/docs/HANDOFF.md.bak.<原时间戳>      ~/Documents/services/token_proxy/docs/HANDOFF.md
cp -p <主题>/backup/docs/PROJECT-MAP.md.bak.<原时间戳>  ~/Documents/services/token_proxy/docs/PROJECT-MAP.md
cp -p <主题>/backup/docs/SOP.md.bak.<原时间戳>          ~/Documents/services/token_proxy/docs/SOP.md
cp -p <主题>/backup/trae-cn/user_rules/rule-skill-index.md.bak.<原时间戳>  ~/.trae-cn/user_rules/rule-skill-index.md

备份存放位置与清单见 backup/README.md。

回滚后验证:~/.trae-cn/agents/ 下无 ctx-scout.md;开新会话不再出现该 Subagent。 注意:回退规则文件后需再开一次新会话(规则进每轮前缀)。

8. 风险说明

风险 缓解
阈值(200)与本机实际积分口径可能不同;积分无法自动读取 阈值由人判断,切换为人工一键操作,不存在「自动切错」
误以为切档立即生效 脚本输出与本文均提示:下一个新会话 / Subagent 调用才生效;无需重启代理
脚本改写 frontmatter 写坏文件 原子写(临时文件 + os.replace);离线 10 项回归含「首行保留 / 幂等 / 未知对象报错」
子智能体 description 过宽导致误触发 描述已限定为「只读、需大量检索且只需结论」,并写明「不用于改文件/变更任务」
多档位并存造成状态发散 只有 model: 行一个开关,同一时刻只有一个档位;不存在两份文件

附录:离线验证用例(实机跑通 10 项)

# 用例 预期 结果
1 初始 status trae / DeepSeek-V4-Flash 通过
2 重复 trae [跳过] 零变更 通过
3 proxy 删除 model 行,首行 --- 保留 通过
4 落盘校验 行数 26、frontmatter 完整 通过
5 status proxy 通过
6 重复 proxy [跳过] 零变更 通过
7 trae 还原 写回 model 行 通过
8 还原后 frontmatter 含 model: DeepSeek-V4-Flash 通过
9 --agent no-such [错误] + exit 2 通过
10 正文完整性 末行未丢失 通过

来源:/home/rain/Documents/services/token_proxy/subagent-20261002/SOP.md | 最后更新:2026-10-02 19:21(由 build/sync.py 同步,请勿在站点侧修改)