nageyqma·git
HTTPS https://git.nageyqma.icu/nageyqma/kimi_subagent_router.git SSH git@git.nageyqma.icu:nageyqma/kimi_subagent_router.git

HTTPS 链接可直接 git clone;推送代码请使用 SSH。

15.7 KB · 205 行raw
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205
# Kimi Subagent Router(kimi-subagent-router)

为 Kimi Code CLI 提供**按 subagent 类型自动路由不同模型与思考强度**的插件,解决 `[secondary_model]` 只能设置一个全局默认模型、无法按任务复杂度分发的问题。

- 默认值只使用 **Kimi Code 内置模型**(K2.8 Preview、K3-256k),不假设已接入任何第三方模型。
- 所有映射关系**可在 `subagent-models.json` 中配置**,后期可切换到第三方订阅模型。
- 同一模型的不同思考强度(如 K2.8 high 与 K2.8 max)通过**模型变体别名**实现。

## 工作原理

Kimi Code CLI 的 `Agent` 工具在配置了 `[secondary_model]` 模型池后支持 `model` 参数(池别名或 `"primary"`),但**没有 effort 参数**。思考强度按官方机制由模型变体别名的 `default_effort` 绑定:变体是 `[models]` 中指向同一底层模型的独立条目,用 `[models."<别名>".overrides].default_effort` 覆盖档位(变体不继承被指向条目的字段,`capabilities`、`support_efforts` 必须完整照抄)。对 subagent 而言,变体的 `default_effort` 优先于全局 `[thinking].effort`,只有 `[secondary_model].default_effort` 优先级更高——**所以不要设置 `[secondary_model].default_effort`**。

因此本插件的派发路径为:

1. 主 Agent 以**编排器与执行器**自居:默认姿态是"这个任务该派给谁",只有完全指定、无需判断、至多一两步的琐碎任务(如 `git init`、按字面删一行)才自己做;任何设计/权衡类决策一律先派 `k3-planner` 思考定案。插件**关闭时不注入 `SKILL.md`**,`agents/*.md` 与 MCP 工具也随插件启停,表现与原生 CLI 完全一致。
2. 主 Agent 依据 `SKILL.md` 的路由规则选择 subagent 类型,调用 MCP 工具 `route_subagent_model` 取得当前配置的模型别名(思考强度内嵌在该别名的 `default_effort` 中;`k3-planner` 档有快路径,可直接带默认别名 `k3-256k-max` 派发,跳过路由查询)。
3. 主 Agent 调用 `Agent(subagent_type=<类型>, model=<别名>, prompt=..., description=...)` 完成派发。
4. 若未传 `model`,由 `[secondary_model].default_model` 承接(默认 K3-256k + max,与临时环境基准一致)。

默认路由表(主 Agent 自身保持轻量,快速判断后派发):

| 任务 | subagent | 模型别名 | 思考强度 |
|---|---|---|---|
| 重复性机械操作 | `cheap-coder` | `k2.8-high`(K2.8 Preview) | high |
| 只读探索 | `cheap-explore` | `k2.8-low` | low |
| 单文件修改等局部改动 | `k2.8-medium` | `k2.8-high` | high |
| 简单功能实现、常规测试、常规调试排错 | `k2.8-debug` | `k2.8-max` | max |
| 复杂构思/架构/跨模块重构/非显而易见 bug | `k3-planner` | `k3-256k-max`(K3-256k,**优先使用**) | max |
| 最困难任务**且**预估上下文超过 256k | `k3-max` | `k3-max`(kimi-code/k3,**1M 上下文**) | max |
| 文档编写 | `doc-writer` | `alibaba-cn/qwen3.8-flash`(第三方,需先注册) | xhigh |

档位设计要点:**尽量用 K3-256k**——`k3-planner` 与 `k3-max` 思考强度都是 max,只有"最困难任务且预估上下文超过 256k"两个条件同时成立时才升级 1M 的 `k3-max`,其余复杂任务一律 `k3-planner`。K2.8 一侧按推理量细分:局部单文件修改走 `k2.8-medium`(high),简单功能实现/常规测试/常规调试排错走 `k2.8-debug`(max)。`doc-writer` 默认路由到第三方模型 `alibaba-cn/qwen3.8-flash`(OpenAI 兼容,xhigh 档位),使用前需按「切换到第三方模型」一节完成注册。

若主 Agent 或某个 subagent 想用其它档位,把 `subagent-models.json` 中对应条目的 `model`/`effort` 改为 `k2.8-low`/`k2.8-high`/`k2.8-max`/`k3-256k-high` 等即可;这些内置变体 `setup-config` 都会自动注册。

## 提示词语言约定

模型实际读到的文本一律用英文:`SKILL.md`、`agents/*.md` 的 frontmatter 与正文、`subagent-models.json` 的 `description`、MCP 工具描述与返回里的 `notes`/`dispatch` 模板、以及 `setup-config` 写进 `[secondary_model.models]` 的别名说明。中文提示词会让模型先内部翻译一遍再执行,既占上下文又降低指令服从度。边界按"谁会读这段文字"划:配置解析错误、`doctor` 的条目正文(`[错误] doc-writer: 模型别名 … 未注册`)这类**指向人的修复指引**保持中文——它们的终点是用户去改 `config.toml`,主 Agent 只是转述;而 `doctor --json` 的 `level` 字段与全部路由结果、工具返回是模型要据此行动的,一律英文。`--help`、`setup-config` 的提示同样保持中文。

`agents/*.md` 的写法按各档位模型的习性调过:

| 档位(模型) | 模型特点 | 提示词对策 |
|---|---|---|
| `cheap-explore`(K2.8 low) | 不会自己补全意图,容易一次命中就收工 | 编号步骤、检索预算(约 15 次调用)、固定输出格式,禁止开放式判断 |
| `cheap-coder` / `k2.8-medium`(K2.8 high) | 高思考档最爱"顺手改"与过度设计 | 范围锁定、字面执行、改完做机械性验证(旧 token 零命中) |
| `k2.8-debug`(K2.8 max) | 推理预算足,但会写成一篇长文 | 复现→定位→单假设证伪→根因修复的循环;思考留在思考里,结论按格式简短交付 |
| `k3-planner`(K3-256k max) | 长链推理强,容易输出方案菜单与"待验证" | 要求定案一个推荐+被否方案各一行;无 shell,改为移交验证命令 |
| `k3-max`(k3 1M max) | 上下文是它存在的理由,但要防读散 | 先 Glob/Grep 建地图再大块读,每条结论附 `path:line` |
| `doc-writer`(qwen3.8-flash xhigh) | 文笔好,但易浮夸堆表情、把没读过的细节写得很像真的 | 代码为唯一事实来源、风格禁则、沿用仓库语言(中文文档保持中文) |

`doc-writer` 同时被明令:不确定的内容写 `TODO: verify`,宁缺毋造。

## 目录结构

```
kimi-subagent-router/
├── kimi.plugin.json      # 插件清单(CLI 实际读取;plugin.json 为同步副本)
├── plugin.json           # 与 kimi.plugin.json 内容一致(交付物命名要求)
├── SKILL.md              # 派发姿态与路由规则,会话启动时自动加载给主 Agent
├── subagent-models.json  # 用户可编辑的映射配置
├── README.md
├── agents/               # 七个 subagent 定义(插件级 agent,自动被发现)
│   ├── cheap-coder.md    # 排除后台任务管理与 Plan 模式进入
│   ├── cheap-explore.md  # 只读工具白名单
│   ├── k2.8-medium.md
│   ├── k2.8-debug.md     # 中等难度调试/排错(K2.8 max)
│   ├── k3-planner.md     # 无 shell,可读可写
│   ├── k3-max.md
│   └── doc-writer.md     # 排除 shell 与后台任务工具
└── scripts/
    ├── kimi_subagent_router.py   # 路由工具:MCP 服务 + CLI(Python 3 标准库,无依赖)
    └── deploy.sh                 # 一键部署脚本:同步到插件安装目录 + setup-config + doctor
```

## 安装

要求:Python 3.8+(脚本仅用标准库);Kimi Code CLI 已 `/login`(内置托管模型别名由登录流程注入)。

```bash
# 1. 安装并启用插件(在 Kimi Code TUI 中)
/plugins install /path/to/kimi-subagent-router   # 也可用 zip URL / GitHub URL
/plugins enable kimi-subagent-router

# 2. 注册模型变体并写入 [secondary_model] 池(幂等,先备份 config.toml)
python3 /path/to/kimi-subagent-router/scripts/kimi_subagent_router.py setup-config

# 3. 检查一致性,然后激活
python3 /path/to/kimi-subagent-router/scripts/kimi_subagent_router.py doctor
# 在 TUI 中执行 /reload 或 /new
```

也可手动安装:把 `scripts/kimi_subagent_router.py print-config` 打印的 TOML 片段并入 `~/.kimi-code/config.toml`(变体条目 + `[secondary_model]` 段),效果相同。

`setup-config` 行为说明:

- 片段包在 `# >>> kimi-subagent-router >>>` 标记内,重复运行会原地更新(幂等);改动映射后重跑一次即可。
- 若你的 `config.toml` 已存在 `[secondary_model]` 段或冲突的 `[models]` 条目,脚本**拒绝写入**并打印需手动合并的片段(不会破坏现有配置)。
- 写入前总是先备份为 `config.toml.kimi-subagent-router.bak-<时间戳>`;生成的 TOML 经解析校验后才落盘,失败自动回滚。
- 卸载:`python3 scripts/kimi_subagent_router.py remove-config`(只删标记块,不碰其他配置),再 `/plugins remove kimi-subagent-router`。

## 重新部署

维护修改本仓库后,一键同步到已安装的插件目录并刷新配置:

```bash
bash scripts/deploy.sh
```

脚本自动完成:定位插件安装目录(读 `~/.kimi-code/plugins/installed.json`,失败回退默认路径)→ `rsync` 镜像同步(排除 `.git`/`.qoder`,目标缺失或非插件目录时中止)→ 重跑 `setup-config`(幂等,自动备份 config.toml)→ 运行 `doctor` 验证(有错误则非零退出)。完成后在 Kimi Code TUI 中执行 `/reload` 或 `/new` 生效。

## 修改映射

编辑 `subagent-models.json`(插件根目录下的副本,或复制到 `~/.kimi-code/subagent-models.json` 以获得更高优先级——查找顺序:`$KIMI_SUBAGENT_MODELS` 环境变量 > `$KIMI_CODE_HOME/subagent-models.json` > 插件目录 > 内置默认值;每次工具调用都会重新读取,改完立即生效,无需重启)。

字段说明:

| 字段 | 含义 |
|---|---|
| `subagents.<名称>.model` | 模型别名。缺失或 `null` 时回退到 `[secondary_model].default_model`。指向内置变体(`k2.8-low` 等)时无需其他操作;指向自定义别名时需先在 `config.toml` 注册该别名并加入 `[secondary_model.models]` 池 |
| `subagents.<名称>.effort` | 思考强度声明(Kimi 档位 `low`/`high`/`max`,第三方模型可为 `xhigh` 等)。实际绑定靠别名的 `default_effort`;声明值用于核对,`doctor` 发现不一致会警告。第三方模型不支持 Kimi 档位时设为 `null` 或删除 |
| `subagents.<名称>.subagent_type` | 该条目继承的内置类型语义(`coder`/`explore`/`plan`),供阅读与工具策略参考 |
| `subagents.<名称>.exclude_tools` | 高风险工具排除说明(信息性;实际强制在 `agents/*.md` 的 `tools`/`disallowedTools`) |
| `subagents.<名称>.description` | 职责描述,会随路由工具返回进入主 Agent 上下文(另见「提示词语言约定」:用英文) |
| `default_model` | 顶层兜底:当某条目 `model` 为 `null` 时用它(本仓库默认为 `"k3-256k-max"`);若该字段本身缺失或为 `null`,`setup-config` 回退到内置池默认值 `k3-256k-max` 并打印警告 |

可自由增删条目:新增一个 subagent 名称 + 对应 `agents/<名称>.md` agent 文件即可;自定义模型别名若是第三方模型,按下一节注册。

## 切换到第三方订阅模型

两步,约 5 分钟:

### 第一步:在 `config.toml` 注册第三方模型

以 DeepSeek(OpenAI 兼容协议)为例,在 `~/.kimi-code/config.toml` 中添加:

```toml
[providers.deepseek]
type = "openai"
base_url = "https://api.deepseek.com/v1"
api_key = "你的API_KEY"

[models."deepseek/deepseek-v4.1-flash"]
provider = "deepseek"
model = "deepseek-chat"
max_context_size = 131072
capabilities = [ "tool_use" ]
```

也可以直接在 TUI 运行 `/provider`(或 shell 命令 `kimi provider`)走交互式向导:选供应商、输 API Key、选模型;models.dev 已收录的供应商会自动拉取模型列表。

注意事项:

- **能力声明**:模型不支持 `thinking` 就不要在 `capabilities` 里声明。部分第三方模型支持 `reasoning_effort` 字段,但取值与 Kimi 的 `low`/`high`/`max` 不同,本插件不假设兼容性——不支持 Kimi 档位时把 JSON 里的 `effort` 设为 `null` 或删除。
- **池成员**:新别名必须加入 `[secondary_model.models]` 池,`Agent` 工具的 `model` 参数只接受池别名或 `"primary"`。最简单的方式是改完 JSON 后重跑 `setup-config`(它能自动把新别名补进池中;生成不了条目时会明确提示手动注册)。
- **凭证管理**:`api_key` 可直接写在 `config.toml`,也可用 `[providers.<name>.env]` 子表引用环境变量名(仅作回退来源,不会修改 shell 环境)。

### 第二步:修改 `subagent-models.json`

```json
"cheap-coder": {
  "model": "deepseek/deepseek-v4.1-flash",
  "effort": null,
  "subagent_type": "coder",
  "description": "Mechanical, pattern-fixed coding: bulk renames, formatting, boilerplate"
}
```

重跑 `doctor` 确认无错误,执行 `/reload`。

## 验收自查

```bash
# 复杂任务路由(k3-planner = K3-256k max;k3-max = kimi-code/k3 1M max)
python3 scripts/kimi_subagent_router.py route --type k3-planner
python3 scripts/kimi_subagent_router.py route --type k3-max
# 廉价任务路由(cheap-coder 应返回 k2.8-high;cheap-explore 应返回 k2.8-low)
python3 scripts/kimi_subagent_router.py route --type cheap-coder
python3 scripts/kimi_subagent_router.py route --type cheap-explore
# K2.8 细分档(应返回 k2.8-high / k2.8-max)
python3 scripts/kimi_subagent_router.py route --type k2.8-medium
python3 scripts/kimi_subagent_router.py route --type k2.8-debug
# 文档任务(应返回 alibaba-cn/qwen3.8-flash,effort 为 xhigh;需先注册该第三方模型)
python3 scripts/kimi_subagent_router.py route --type doc-writer
# 一致性检查(0 错误即通过;doc-writer 未注册第三方模型时会如实报错)
python3 scripts/kimi_subagent_router.py doctor
```

安装后让主 Agent 执行一个明显复杂的任务(如"为这个项目设计插件架构"),它应派发 `k3-planner`/`k3-max`;执行"把 src 下所有 .js 文件重命名为 .ts"这类任务应派发 `cheap-coder`。

## 已知限制

1. **`Agent` 工具没有 effort 参数**:思考强度只能经由模型变体别名的 `default_effort` 绑定;插件的 `route_subagent_model` 工具返回 effort 仅供核对/展示。同理,插件无法实现"封装 `dispatch_subagent` 内部直接派发"的路径(MCP 工具无法调用 CLI 内部的 Agent 机制),采用的是路径 A:工具返回别名,主 Agent 显式传入 `Agent` 的 `model` 参数。
2. **映射是路由建议而非强制**:最终由主 Agent 在 `Agent` 调用中传 `model` 生效;若主 Agent 省略 `model`,spawn 落到 `[secondary_model].default_model`(默认 `k3-256k-max`)。
3. **`[secondary_model].default_effort` 会击穿路由**:该字段优先级最高且段级生效,设置后所有变体档位失效。`doctor` 会警告;请保持未设置。
4. **`k2.8-medium` 名称含点号**:个别 CLI 版本对 agent 名的 kebab-case 校验可能不允许点号,导致该 agent 文件被跳过(派发时提示未知类型)。解决办法:把 `agents/k2.8-medium.md` 重命名为 `k28-medium.md`、frontmatter 的 `name` 改为 `k28-medium`,并同步修改 `subagent-models.json` 的键与 `SKILL.md` 路由表。
5. **单层委派**:插件 agent 均声明 `subagents: []`,无法在 subagent 内继续派发,委派链单层终止。
6. **配置错误 fail-loud**:池别名解析不到 `[models]` 条目时,会话启动/恢复会直接报错并列出断链别名(这是 Kimi Code 的行为,先于插件)。改配置后跑 `doctor` 可提前发现。

## 参考文档

- Agents and Sub-Agents:https://www.kimi.com/code/docs/en/kimi-code-cli/customization/agents.html
- Plugins:https://www.kimi.com/code/docs/en/kimi-code-cli/customization/plugins.html
- 配置文件(`[secondary_model]` 与模型变体机制):https://www.kimi.com/code/docs/en/kimi-code-cli/configuration/config-files.html
- Providers and models:https://www.kimi.com/code/docs/en/kimi-code-cli/configuration/providers.html