@peterwangze/claude-trigger-router 1.10.0 → 1.12.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +103 -460
- package/dist/cli.js +238 -20
- package/dist/cli.js.map +2 -2
- package/docs/release-notes-v1.11.0.md +36 -0
- package/docs/release-notes-v1.12.0.md +38 -0
- package/docs/releasing.md +5 -4
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -1,589 +1,232 @@
|
|
|
1
1
|
# Claude Trigger Router
|
|
2
2
|
|
|
3
|
-
Claude Trigger Router 是给 Claude Code
|
|
3
|
+
Claude Trigger Router 是给 Claude Code 用的本地模型路由代理。Claude Code 仍按原来的方式工作,但请求会先经过 `ctr`,再按你的配置转发到 Anthropic、OpenAI、OpenRouter、DeepSeek 或其他 OpenAI-compatible 服务。
|
|
4
4
|
|
|
5
|
-
|
|
5
|
+
它适合想把多个模型接到同一个 Claude Code 入口里的人:日常任务走快模型,复杂任务切到强模型,长上下文、后台请求、web search 和代码审查都可以有自己的路由策略。
|
|
6
6
|
|
|
7
|
-
|
|
7
|
+
## 你会得到什么
|
|
8
8
|
|
|
9
|
-
-
|
|
10
|
-
-
|
|
11
|
-
-
|
|
12
|
-
-
|
|
9
|
+
- 一个本地 Claude Code 代理:默认监听 `127.0.0.1:5678`。
|
|
10
|
+
- 一份统一模型配置:用 `Models[]` 管供应商、接口、API key 和模型名。
|
|
11
|
+
- 基础路由:用 `Router.default`、`think`、`longContext`、`background`、`webSearch` 覆盖高频场景。
|
|
12
|
+
- SmartRouter:用规则、语义匹配、候选模型画像和 LLM 路由选择更合适的模型。
|
|
13
|
+
- 治理与 UI:通过 `ctr doctor` 和 `ctr ui` 看配置、健康状态、路由原因、trace 和协作证据。
|
|
13
14
|
|
|
14
15
|
## 5 分钟跑起来
|
|
15
16
|
|
|
16
|
-
|
|
17
|
+
安装:
|
|
17
18
|
|
|
18
19
|
```bash
|
|
19
20
|
npm install -g @peterwangze/claude-trigger-router
|
|
20
21
|
ctr version
|
|
21
|
-
ctr help
|
|
22
22
|
```
|
|
23
23
|
|
|
24
|
-
|
|
24
|
+
初始化配置:
|
|
25
25
|
|
|
26
26
|
```bash
|
|
27
27
|
ctr setup
|
|
28
28
|
```
|
|
29
29
|
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
- 复用已有 `~/.claude-trigger-router/config.yaml`
|
|
33
|
-
- 探测并迁移旧 `claude-code-router` 配置
|
|
34
|
-
- 在没有可用配置时询问“本地使用”、“连接远程服务”还是“部署为远程服务端”
|
|
35
|
-
- 本地使用时创建最小可用配置
|
|
36
|
-
- 连接远程服务时写入 `Runtime.remote_service`,不要求你先填写本地 provider/model
|
|
37
|
-
- 部署为远程服务端时生成 server profile 和 bootstrap admin `APIKEY`,但不会自动启动服务
|
|
38
|
-
- 本地使用时,引导填写默认模型 ID、接口地址、API Key 和模型名
|
|
39
|
-
- 本地使用时,可选追加复杂任务模型,并生成 SmartRouter 起步模板
|
|
40
|
-
- 保存配置后按角色输出下一步:本地路径提示 `ctr code` 和路由模板,远程客户端路径提示 `ctr doctor` / `ctr status` / 本地代理转发,服务端路径提示 `ctr doctor` / `ctr start --daemon`
|
|
41
|
-
|
|
42
|
-
本地日常使用路径:
|
|
30
|
+
检查并启动:
|
|
43
31
|
|
|
44
32
|
```bash
|
|
45
|
-
ctr status
|
|
46
33
|
ctr doctor
|
|
47
|
-
ctr
|
|
48
|
-
ctr
|
|
34
|
+
ctr start --daemon
|
|
35
|
+
ctr status
|
|
49
36
|
```
|
|
50
37
|
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
如果 setup 选择的是“连接远程服务”,它会生成远程服务连接配置;先用 `ctr doctor` / `ctr status` 检查远端 ready 状态,再运行 `ctr code`,Claude Code 会继续连接本地 `ctr`,由本地 `ctr` 把模型调用转发到远端 CTR。直接把 Claude Code 指向远端服务仍然可用,但属于可选路径;这时使用 `ANTHROPIC_BASE_URL` 指向远端服务地址,并用 `ANTHROPIC_AUTH_TOKEN` 传服务维护者发放的 managed key。
|
|
54
|
-
|
|
55
|
-
如果 setup 选择的是“部署为远程服务端”,setup 只生成配置,不会自动启动;请先编辑 `Models[].key` / `Models[].model`,再运行 `ctr doctor` 和 `ctr start --daemon`。服务端和远程客户端细节见下方“部署模式与边界”。
|
|
56
|
-
|
|
57
|
-
## v1.10.0 发布定位
|
|
58
|
-
|
|
59
|
-
`v1.10.0` 是智能路由自适应与多模型协同增强版。它把真实 trace 里的质量、失败、延迟、cascade、shadow 和人工校准证据反哺 SmartRouter,让路由不只依赖静态描述,而是能基于候选模型画像、confidence threshold 和 latency budget 选择更合适的 fast/deep/verify/cascade 路径。
|
|
60
|
-
|
|
61
|
-
这个版本不声明完整自动化多 agent 编排、全量任务拆解执行器、跨请求在线学习系统或完整云端模型调度平台;`compare_then_arbiter` / `cascade_on_evidence` 先作为可配置协作 contract 和可观测策略入口收口。完整发布边界见 [docs/release-notes-v1.10.0.md](docs/release-notes-v1.10.0.md)。
|
|
62
|
-
|
|
63
|
-
## 版本路线
|
|
64
|
-
|
|
65
|
-
从用户使用频率看,版本演进会优先回到最常用的基础路由和 SmartRouter 体验:
|
|
66
|
-
|
|
67
|
-
- `v1.3.0`:基础路由常用体验,已收口 `Router.default` / `think` / `longContext` / `background` / `webSearch` 五槽位、doctor 诊断、UI 路由解释和 packaged smoke。
|
|
68
|
-
- `v1.4.0`:SmartRouter 常用体验,已收口规则模板、候选模型配置向导、路由决策解释、切换体感摘要和配置路径级调优建议。
|
|
69
|
-
- `v1.5.0`:入口基础功能稳定与易用性巩固,已补 packaged entry smoke、remote/server setup slice、UI DOM smoke 和配置保存安全线。
|
|
70
|
-
- `v1.6.0`:多模型收益运营化,已补 benchmark history、人工校准 UI、核心路由场景任务集和评测/真实 trace 统一解释。
|
|
71
|
-
- `v1.7.0`:服务化与模型池安全体验,已补服务端安全默认值、密钥轮换、主动 pool health、成本/速率元数据和更多调度策略。
|
|
72
|
-
- `v1.8.0`:低侵入 agent/tool 增强与架构减压,已补 runtime pipeline、管理 API route contract、UI fragment contract、handoff summary、tool capability guardrail、输入/输出 guardrail 和 trace spans。
|
|
73
|
-
- `v1.9.0`:用户入口与远程客户端一致性收口,已补远程客户端 proxy 文档、setup next steps、远程 Claude Code 鉴权变量、受保护 `/ui` admin 入口指导和 README 新用户路径前置。
|
|
74
|
-
- `v1.10.0`:智能路由自适应与多模型协同增强,已补 outcome-driven routing feedback、模型能力画像、confidence/latency budget、多模型协作模式和 UI 协作证据入口。
|
|
75
|
-
|
|
76
|
-
完整版本计划见 [docs/superpowers/plans/2026-05-07-core-routing-version-plan.md](docs/superpowers/plans/2026-05-07-core-routing-version-plan.md)。
|
|
77
|
-
|
|
78
|
-
## 功能概览
|
|
79
|
-
|
|
80
|
-
- **本地代理服务**:默认监听 `127.0.0.1:5678`,接管 Claude Code 上游请求。
|
|
81
|
-
- **统一模型配置**:用 `Models[]` 描述模型接入项,路由直接引用 `Models[].id`。
|
|
82
|
-
- **协议兼容**:支持 `openai` / `anthropic` 两类接口协议,OpenRouter、DeepSeek 等 OpenAI-compatible 服务按 `openai` 配。
|
|
83
|
-
- **基础路由**:用 `Router.default`、`Router.think`、`Router.longContext` 等槽位指定不同任务的默认模型。
|
|
84
|
-
- **SmartRouter**:先用显式规则命中高确定性任务,也可以在规则未命中时让路由模型从候选模型中自动选择。
|
|
85
|
-
- **Governance 观测**:记录 trace、metrics、异常摘要和健康状态,帮助你理解路由选择和运行风险。
|
|
86
|
-
- **路由评测**:`ctr eval --tasks` 查看固定任务契约,`ctr eval --input results.json` 离线评分,`ctr eval --run --models "sonnet;haiku"` 真实调用 CTR 做多模型 A/B;追加 `--judge-model` 后可调用一个 LLM 裁判模型给结果打分。
|
|
87
|
-
- **doctor 诊断**:检查配置、服务可启动性、基础路由槽位、上下文窗口提示、鉴权安全状态、模型兼容策略和可选模型探测。
|
|
88
|
-
- **UI 工作台**:`ctr ui` 打开本地页面,查看服务上下文、远程状态、鉴权安全状态、配置草稿、compiled models、capability warnings、治理 trace、metrics 和 Health 摘要。
|
|
89
|
-
- **远程客户端基础**:可配置 `Runtime.remote_service`,通过 `/api/remote-status` 查看远程服务健康、compiled model 摘要和治理告警摘要;在本地 `ctr code` 主路径中,本地 `ctr` 也可作为 thin proxy 把模型调用转发到远端 CTR。默认用户不需要配置远程模式。
|
|
90
|
-
|
|
91
|
-
## 部署模式与边界
|
|
92
|
-
|
|
93
|
-
当前配置里可以用 `Runtime.mode` 表达部署心智:
|
|
94
|
-
|
|
95
|
-
- `local`:默认模式。你的机器上运行一个本地 `ctr` 服务,Claude Code 通过本地代理访问上游模型。
|
|
96
|
-
- `server`:把 `ctr` 作为远程路由服务运行。它暴露 `/api/service-info`、`/api/remote-status`、`/api/registration`、`/ui` 等服务端状态和管理入口。
|
|
97
|
-
- `cloud`:保留给托管/云端形态的配置语义;当前 npm 包仍按自托管进程运行,不包含托管控制面或集群编排。
|
|
98
|
-
|
|
99
|
-
已落地的远程能力聚焦在“远程服务连接配置、状态查询、注册摘要和本地 thin proxy 转发”。远程客户端配置下,Claude Code 仍连接本地 `ctr`,本地 `ctr` 会把 `/v1/messages` 与 `/v1/chat/completions` 转发到远端 CTR;这不会自动启用尚未实现的集群、节点调度或托管控制面。
|
|
100
|
-
|
|
101
|
-
如果要把当前机器作为远程 `server` 暴露给其他客户端,先生成安全默认的服务端配置:
|
|
38
|
+
通过路由器进入 Claude Code:
|
|
102
39
|
|
|
103
40
|
```bash
|
|
104
|
-
ctr
|
|
105
|
-
```
|
|
106
|
-
|
|
107
|
-
该命令会写入 `HOST: "0.0.0.0"`、随机 bootstrap `APIKEY`、`Runtime.mode: "server"`、日志开关、健康检查所需端口和一份可编辑的 `Models + Router.default` 起步模板。它不会覆盖已有配置;如需重建模板,显式追加 `--force`。
|
|
108
|
-
|
|
109
|
-
npm 包也随附可复制部署模板:
|
|
110
|
-
|
|
111
|
-
- `config/deploy/docker-compose.server.yaml`
|
|
112
|
-
- `config/deploy/systemd/claude-trigger-router.service`
|
|
113
|
-
|
|
114
|
-
角色化手册:
|
|
115
|
-
|
|
116
|
-
- 配置角色总览:[docs/configuration-roles.md](docs/configuration-roles.md)
|
|
117
|
-
- 服务提供者/维护者:[docs/server-maintainer-guide.md](docs/server-maintainer-guide.md)
|
|
118
|
-
- 远程服务使用者:[docs/remote-client-guide.md](docs/remote-client-guide.md)
|
|
119
|
-
|
|
120
|
-
这些模板仍以 `ctr deploy init --target server` 生成的配置为起点。生成的 server profile 会写入 `Runtime.security` 默认策略:公网监听必须有鉴权、bootstrap key 只用于 admin、远程客户端使用 managed `client + read-only` key,公网部署前应放在 HTTPS 反向代理或内网之后。`GET /api/service-info` 会返回同一策略和部署 checklist,方便 `/ui`、`ctr status` 和维护脚本复核。
|
|
121
|
-
|
|
122
|
-
生成后确认或调整的最小结构如下:
|
|
123
|
-
|
|
124
|
-
```yaml
|
|
125
|
-
HOST: "0.0.0.0"
|
|
126
|
-
PORT: 5678
|
|
127
|
-
APIKEY: "ctr_bootstrap_..."
|
|
128
|
-
|
|
129
|
-
Runtime:
|
|
130
|
-
mode: "server"
|
|
131
|
-
|
|
132
|
-
Models:
|
|
133
|
-
- id: sonnet
|
|
134
|
-
api: "https://openrouter.ai/api/v1/chat/completions"
|
|
135
|
-
key: "sk-xxx"
|
|
136
|
-
interface: "openai"
|
|
137
|
-
model: "anthropic/claude-sonnet-4"
|
|
138
|
-
|
|
139
|
-
Router:
|
|
140
|
-
default: "sonnet"
|
|
41
|
+
ctr code
|
|
141
42
|
```
|
|
142
43
|
|
|
143
|
-
|
|
44
|
+
打开本地工作台:
|
|
144
45
|
|
|
145
46
|
```bash
|
|
146
|
-
ctr
|
|
147
|
-
ctr start --daemon
|
|
47
|
+
ctr ui
|
|
148
48
|
```
|
|
149
49
|
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
- 如果配置了 `HOST: "0.0.0.0"` 但没有设置 `APIKEY` 或 active managed key,运行时会为了安全强制只监听 `127.0.0.1`。
|
|
153
|
-
- `APIKEY` 定位为 bootstrap/admin key;服务端启动后用它调用 `POST /api/auth/keys` 生成给远程使用者的 managed key。
|
|
154
|
-
- 远程日常 token 推荐同时授予 `client + read-only`:`client` 用于模型调用,`read-only` 用于 ready/status、compiled models 和 governance 观测接口。
|
|
155
|
-
- `admin` key 才能访问 `/ui`、配置保存和 auth 管理。列表接口只返回 key 前后缀,secret 只在创建时返回一次。
|
|
156
|
-
- 启用鉴权后,浏览器直接打开 `/ui` 不能自动携带 `Authorization` header;维护者应通过内网/本地隧道或 HTTPS 反向代理注入 `Authorization: Bearer <admin-key>` 后访问,不要把 admin key 放进 URL。API smoke 可以用 `curl -H "Authorization: Bearer $CTR_ADMIN_KEY" http://127.0.0.1:5678/api/service-info`。
|
|
157
|
-
- `operator` key 用于日常运维写操作,例如重启、治理指标快照/定时快照、异常阈值和归档删除;它不能读取配置、保存配置或管理 auth key。
|
|
158
|
-
- managed key 支持过期、撤销和 `quota.request_limit` / `quota.token_limit` / `quota.window_seconds`;窗口配额会持久化到本地状态文件,超限时 429 会返回 `quota.windowResetAt` 和 `Retry-After`。
|
|
159
|
-
- `GET /api/service-info` 会返回脱敏的 `auth` / `security` 摘要和 quota 用量;`GET /api/auth/audit` 可用 admin key 查看最近鉴权允许/拒绝记录。
|
|
160
|
-
- `POST /api/auth/keys/:id/rotate` 会生成替代 managed key、只返回一次新 secret,并立即吊销旧 key;用于定期轮换、交接和疑似泄漏处置。
|
|
161
|
-
- `POST /api/models/pool-health/probe` 可由 operator/admin 触发主动 pool 探测,用轻量 `HEAD` 检查 enabled endpoint 可达性,并把成功延迟或失败写入现有 pool health。
|
|
162
|
-
- `Registration.models[].metadata` 可声明成本和速率限制:`cost_per_1m_input_tokens`、`cost_per_1m_output_tokens`、`cost_currency`、`rate_limit_rpm`、`rate_limit_tpm`,这些字段会进入 compiled model pool 和 `/api/models/pool-health`。
|
|
163
|
-
- `Registration.strategy` 支持 `priority`、`least-latency`、`round-robin`、`health-aware`、`cost-aware`,active endpoint 和 fallback candidate 使用同一排序口径。
|
|
164
|
-
- 公网入口仍建议放在 HTTPS 反向代理之后;远程浏览器访问 UI 时建议使用本地隧道、内网访问,或由反向代理处理认证。
|
|
165
|
-
|
|
166
|
-
## 手动配置
|
|
50
|
+
第一次使用时,`ctr setup` 会尽量替你处理选择题:复用已有配置、迁移旧 `claude-code-router` 配置、创建本地配置、连接远程服务,或生成服务端部署 profile。
|
|
167
51
|
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
```bash
|
|
171
|
-
ctr init --force
|
|
172
|
-
```
|
|
52
|
+
## 最小配置长什么样
|
|
173
53
|
|
|
174
|
-
|
|
54
|
+
配置文件默认在:
|
|
175
55
|
|
|
176
56
|
```text
|
|
177
57
|
~/.claude-trigger-router/config.yaml
|
|
178
58
|
```
|
|
179
59
|
|
|
180
|
-
|
|
60
|
+
最小可用配置:
|
|
181
61
|
|
|
182
62
|
```yaml
|
|
183
63
|
HOST: "127.0.0.1"
|
|
184
64
|
PORT: 5678
|
|
185
65
|
|
|
186
|
-
LOG: true
|
|
187
|
-
LOG_LEVEL: "debug"
|
|
188
|
-
|
|
189
66
|
Models:
|
|
190
67
|
- id: sonnet
|
|
191
68
|
api: "https://openrouter.ai/api/v1/chat/completions"
|
|
192
69
|
key: "sk-xxx"
|
|
193
70
|
interface: "openai"
|
|
194
71
|
model: "anthropic/claude-sonnet-4"
|
|
195
|
-
thinking: "auto"
|
|
196
72
|
|
|
197
73
|
Router:
|
|
198
74
|
default: "sonnet"
|
|
199
75
|
```
|
|
200
76
|
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
- `Models[0].api`:上游接口地址
|
|
204
|
-
- `Models[0].key`:API Key
|
|
205
|
-
- `Models[0].interface`:接口协议,通常是 `openai` 或 `anthropic`
|
|
206
|
-
- `Models[0].model`:上游真实模型名
|
|
207
|
-
- `Router.default`:默认使用哪个 `Models[].id`
|
|
208
|
-
|
|
209
|
-
改完后启动:
|
|
210
|
-
|
|
211
|
-
```bash
|
|
212
|
-
ctr start
|
|
213
|
-
ctr code
|
|
214
|
-
```
|
|
215
|
-
|
|
216
|
-
后台运行:
|
|
217
|
-
|
|
218
|
-
```bash
|
|
219
|
-
ctr start --daemon
|
|
220
|
-
ctr status
|
|
221
|
-
ctr code
|
|
222
|
-
```
|
|
223
|
-
|
|
224
|
-
## `interface` 怎么选
|
|
225
|
-
|
|
226
|
-
`interface` 表示上游接口协议,不是厂商名。
|
|
227
|
-
|
|
228
|
-
常见写法:
|
|
229
|
-
|
|
230
|
-
| 服务 | interface |
|
|
231
|
-
|---|---|
|
|
232
|
-
| OpenAI 官方 | `openai` |
|
|
233
|
-
| Anthropic 官方 | `anthropic` |
|
|
234
|
-
| OpenRouter | `openai` |
|
|
235
|
-
| DeepSeek | `openai` |
|
|
236
|
-
| 其他 OpenAI-compatible 服务 | `openai` |
|
|
237
|
-
|
|
238
|
-
路由层会负责请求格式转换,你不需要自己按不同供应商手写消息体。
|
|
77
|
+
`interface` 表示上游接口协议,不是厂商名。OpenRouter、DeepSeek 和大多数 OpenAI-compatible 服务通常用 `openai`;Anthropic 官方接口用 `anthropic`。
|
|
239
78
|
|
|
240
79
|
## 配多个模型
|
|
241
80
|
|
|
242
|
-
每个 `Models[]`
|
|
81
|
+
每个 `Models[]` 项都是一个可被路由引用的模型接入项。路由字段建议引用 `Models[].id`,不要把供应商和模型名散落在各处。
|
|
243
82
|
|
|
244
83
|
```yaml
|
|
245
84
|
Models:
|
|
246
|
-
- id:
|
|
85
|
+
- id: fast
|
|
247
86
|
api: "https://openrouter.ai/api/v1/chat/completions"
|
|
248
87
|
key: "sk-xxx"
|
|
249
88
|
interface: "openai"
|
|
250
|
-
model: "anthropic/claude-
|
|
89
|
+
model: "anthropic/claude-3-5-haiku"
|
|
251
90
|
|
|
252
|
-
- id:
|
|
91
|
+
- id: deep
|
|
253
92
|
api: "https://api.deepseek.com/chat/completions"
|
|
254
93
|
key: "sk-xxx"
|
|
255
94
|
interface: "openai"
|
|
256
95
|
model: "deepseek-reasoner"
|
|
257
|
-
thinking: "high"
|
|
258
96
|
|
|
259
97
|
Router:
|
|
260
|
-
default: "
|
|
261
|
-
think: "
|
|
98
|
+
default: "fast"
|
|
99
|
+
think: "deep"
|
|
100
|
+
longContext: "deep"
|
|
262
101
|
```
|
|
263
102
|
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
## 基础路由五个槽位
|
|
267
|
-
|
|
268
|
-
日常使用优先理解这五个槽位。最小可用配置只需要 `default`;当你开始接入多个模型时,再逐步补 `think`、`longContext`、`background` 和 `webSearch`。
|
|
269
|
-
|
|
270
|
-
| 槽位 | 何时触发 | 推荐放什么模型 |
|
|
271
|
-
|---|---|---|
|
|
272
|
-
| `Router.default` | 普通请求、规则未命中、其他槽位未配置时 | 稳定通用模型 |
|
|
273
|
-
| `Router.think` | 请求包含 `thinking` 时 | 推理能力更强的模型 |
|
|
274
|
-
| `Router.longContext` | 输入超过 `longContextThreshold`,或当前模型 `safe_input_tokens` 不够时 | 上下文窗口更大的模型 |
|
|
275
|
-
| `Router.background` | Claude Code 轻量后台模型请求时 | 便宜、快、可本地化的模型 |
|
|
276
|
-
| `Router.webSearch` | 请求包含 `web_search` 工具时 | 支持搜索工具或搜索结果处理稳定的模型 |
|
|
277
|
-
|
|
278
|
-
可复制模板见 `config/trigger.routing.yaml`。它把五个槽位都写完整,并给模型补了 `metadata.context_window_tokens` / `metadata.safe_input_tokens`,方便 `ctr doctor` 和运行时提前识别大上下文请求。
|
|
279
|
-
|
|
280
|
-
常见误区:
|
|
281
|
-
|
|
282
|
-
- 不要把 `Router.longContext` 指向比默认模型窗口更小的模型。
|
|
283
|
-
- 不确定某个模型是否支持 reasoning 时,先不要放进 `Router.think`;运行 `ctr doctor` 会提示能力不匹配。
|
|
284
|
-
- `background` 可以先不配,未配置时会回到 `default`。
|
|
285
|
-
- `webSearch` 不是“联网开关”,它只是 web search 请求出现时的模型槽位。
|
|
286
|
-
|
|
287
|
-
## 显式规则路由
|
|
103
|
+
常用路由槽位:
|
|
288
104
|
|
|
289
|
-
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
|
|
293
|
-
|
|
294
|
-
|
|
295
|
-
|
|
296
|
-
enabled: true
|
|
297
|
-
analysis_scope: "last_message"
|
|
298
|
-
rules:
|
|
299
|
-
- name: "architecture"
|
|
300
|
-
priority: 90
|
|
301
|
-
enabled: true
|
|
302
|
-
patterns:
|
|
303
|
-
- type: exact
|
|
304
|
-
keywords: ["架构设计", "system design"]
|
|
305
|
-
model: "reasoner"
|
|
306
|
-
```
|
|
105
|
+
| 槽位 | 用途 |
|
|
106
|
+
|---|---|
|
|
107
|
+
| `default` | 普通请求和兜底模型 |
|
|
108
|
+
| `think` | 明确需要推理的任务 |
|
|
109
|
+
| `longContext` | 长上下文或当前模型窗口不够时 |
|
|
110
|
+
| `background` | Claude Code 轻量后台请求 |
|
|
111
|
+
| `webSearch` | 带 web search 工具的请求 |
|
|
307
112
|
|
|
308
|
-
|
|
113
|
+
可复制模板:
|
|
309
114
|
|
|
310
|
-
|
|
115
|
+
- [config/trigger.example.yaml](config/trigger.example.yaml):最小配置
|
|
116
|
+
- [config/trigger.routing.yaml](config/trigger.routing.yaml):基础路由五槽位
|
|
117
|
+
- [config/trigger.smart-router.yaml](config/trigger.smart-router.yaml):SmartRouter 常用规则
|
|
118
|
+
- [config/trigger.advanced.yaml](config/trigger.advanced.yaml):高级治理示例
|
|
311
119
|
|
|
312
|
-
##
|
|
120
|
+
## SmartRouter
|
|
313
121
|
|
|
314
|
-
|
|
122
|
+
SmartRouter 适合任务边界不稳定、模型能力差异明显、或者你想让真实运行证据反哺路由的场景。
|
|
315
123
|
|
|
316
124
|
```yaml
|
|
317
125
|
SmartRouter:
|
|
318
126
|
enabled: true
|
|
319
|
-
router_model: "
|
|
127
|
+
router_model: "fast"
|
|
320
128
|
candidates:
|
|
321
|
-
- model: "
|
|
322
|
-
description: "
|
|
323
|
-
- model: "
|
|
324
|
-
description: "
|
|
129
|
+
- model: "fast"
|
|
130
|
+
description: "快速回复、轻量修改、日常解释"
|
|
131
|
+
- model: "deep"
|
|
132
|
+
description: "复杂推理、架构设计、深度代码审查"
|
|
325
133
|
```
|
|
326
134
|
|
|
327
135
|
推荐心智:
|
|
328
136
|
|
|
329
|
-
- `Router.default`
|
|
330
|
-
- `SmartRouter.rules`
|
|
331
|
-
- `SmartRouter.candidates`
|
|
332
|
-
|
|
333
|
-
|
|
334
|
-
|
|
335
|
-
如果你明确知道某个模型能力受限,可以配置 `metadata`:
|
|
137
|
+
- `Router.default` 负责默认去向。
|
|
138
|
+
- `SmartRouter.rules` 负责能被关键词稳定识别的任务。
|
|
139
|
+
- `SmartRouter.candidates` 负责规则未命中时的智能兜底。
|
|
140
|
+
- `SmartRouter.routing_budget.latency_budget_ms` 和 `confidence_threshold` 用来控制速度/质量取舍。
|
|
141
|
+
- `SmartRouter.collaboration.mode` 可表达 `route_only`、`verify_only`、`compare_then_arbiter`、`cascade_on_evidence` 这类协作路径。
|
|
336
142
|
|
|
337
|
-
|
|
338
|
-
Models:
|
|
339
|
-
- id: text_only
|
|
340
|
-
api: "https://api.example.com/v1/chat/completions"
|
|
341
|
-
key: "sk-xxx"
|
|
342
|
-
interface: "openai"
|
|
343
|
-
model: "vendor/text-only"
|
|
344
|
-
metadata:
|
|
345
|
-
supports_reasoning: false
|
|
346
|
-
supports_tools: false
|
|
347
|
-
supports_images: false
|
|
348
|
-
|
|
349
|
-
- id: long_context
|
|
350
|
-
api: "https://api.example.com/v1/messages"
|
|
351
|
-
key: "sk-xxx"
|
|
352
|
-
interface: "anthropic"
|
|
353
|
-
model: "vendor/long-context"
|
|
354
|
-
metadata:
|
|
355
|
-
context_window_tokens: 200000
|
|
356
|
-
safe_input_tokens: 180000
|
|
357
|
-
```
|
|
143
|
+
从 `v1.10.0` 开始,SmartRouter 会把真实 trace 中的质量、失败、延迟、cascade、shadow 和人工校准证据纳入候选模型画像,并在 route decision 中展示 `routingMode`、`collaborationMode` 和 `routingEvidence`。
|
|
358
144
|
|
|
359
|
-
|
|
360
|
-
|
|
361
|
-
- `supports_reasoning: false`:忽略 `thinking`
|
|
362
|
-
- `supports_tools: false`:工具调用退化为文本表达
|
|
363
|
-
- `supports_images: false`:图片输入退化为文本描述
|
|
364
|
-
- `context_window_tokens`:模型总上下文窗口;路由会用 `input + max_tokens + thinking budget` 做容量保护
|
|
365
|
-
- `safe_input_tokens`:建议输入上限;当前请求超过已选模型上限时,会优先切到 `Router.longContext`
|
|
366
|
-
|
|
367
|
-
多模型上下文大小不一致时,建议给小窗口模型和长上下文模型都补上这两个字段,并配置 `Router.longContext`。不确定时可以先不配,等主路径跑通后再补;未声明上下文窗口的模型会保持原有兼容行为。
|
|
368
|
-
|
|
369
|
-
## UI 工作台
|
|
370
|
-
|
|
371
|
-
启动服务后运行:
|
|
145
|
+
## UI 与诊断
|
|
372
146
|
|
|
373
147
|
```bash
|
|
148
|
+
ctr doctor
|
|
374
149
|
ctr ui
|
|
375
150
|
```
|
|
376
151
|
|
|
377
|
-
|
|
152
|
+
`ctr doctor` 用来检查配置、服务启动、模型引用、上下文窗口、鉴权状态和可选模型探测。模型探测会消耗少量额度,所以会先征求确认。
|
|
153
|
+
|
|
154
|
+
`ctr ui` 默认打开:
|
|
378
155
|
|
|
379
156
|
```text
|
|
380
157
|
http://127.0.0.1:5678/ui
|
|
381
158
|
```
|
|
382
159
|
|
|
383
|
-
|
|
384
|
-
|
|
385
|
-
- **使用者工作台**:查看和编辑配置草稿、模型、路由、compiled preview 和保存结果。
|
|
386
|
-
- **维护者工作台**:查看 Governance trace、Health 摘要、metrics、异常阈值、快照和归档。
|
|
387
|
-
|
|
388
|
-
首屏状态区会显示:
|
|
389
|
-
|
|
390
|
-
- 本地服务 ready 状态、端口、模型数和 `Router.default`
|
|
391
|
-
- `Runtime.mode` 与当前服务角色
|
|
392
|
-
- 当前监听地址和远程客户端接入建议
|
|
393
|
-
- 远程服务状态摘要
|
|
394
|
-
- Registration 模型和上游服务摘要
|
|
395
|
-
- Auth 与 Security 摘要,用于发现 server/cloud 或公网监听无鉴权风险
|
|
396
|
-
|
|
397
|
-
维护者工作台里的 Health 摘要来自 `GET /api/governance/health`,用于快速判断近期治理状态:
|
|
398
|
-
|
|
399
|
-
- `idle`:还没有 trace 样本,先让请求经过路由服务
|
|
400
|
-
- `healthy`:当前窗口没有治理告警
|
|
401
|
-
- `watch`:存在 warning,需要关注级联、影子监督或延迟趋势
|
|
402
|
-
- `critical`:存在 critical 告警,应优先查看异常列表和最近 trace
|
|
403
|
-
|
|
404
|
-
同一份摘要也会出现在 `GET /api/governance/metrics` 的 `health` 字段里。异常数量按总告警数展示,并同时给出 critical / warning 明细,避免只看到单类告警而低估风险。
|
|
405
|
-
|
|
406
|
-
Health 摘要下方的 action 可以直接把 trace 表切到对应排查视图:cascade action 会筛选 `cascadeTriggered=true`,shadow action 会筛选 `shadowChecked=true`,其他 action 会回到近期 trace。
|
|
407
|
-
|
|
408
|
-
如果你想比较不同模型组合在固定任务上的质量和速度,可以先把多模型输出整理成 JSON,再运行离线评测:
|
|
409
|
-
|
|
410
|
-
```bash
|
|
411
|
-
ctr eval --tasks
|
|
412
|
-
ctr eval --input results.json
|
|
413
|
-
ctr eval --run --models "sonnet;haiku"
|
|
414
|
-
ctr eval --run --models "sonnet;haiku" --judge-model sonnet
|
|
415
|
-
ctr eval --history
|
|
416
|
-
```
|
|
417
|
-
|
|
418
|
-
输入文件可以是数组,也可以是 `{ "results": [...] }`:
|
|
419
|
-
|
|
420
|
-
```json
|
|
421
|
-
[
|
|
422
|
-
{
|
|
423
|
-
"taskId": "coding_fix",
|
|
424
|
-
"model": "provider,model",
|
|
425
|
-
"output": "模型输出文本",
|
|
426
|
-
"latencyMs": 1200,
|
|
427
|
-
"humanScore": 0.9,
|
|
428
|
-
"judgeScore": 0.85,
|
|
429
|
-
"calibrationNotes": "人工或外部 LLM 裁判的可选说明",
|
|
430
|
-
"judgeFindings": ["可选裁判发现"]
|
|
431
|
-
}
|
|
432
|
-
]
|
|
433
|
-
```
|
|
434
|
-
|
|
435
|
-
`ctr eval --tasks` 会列出固定任务的 prompt、expected output、关键词、字符数、延迟预算、质量维度和 result template;加 `--json` 可导出给后续自动执行器或外部脚本。当前内置任务覆盖 quick reply、coding、architecture、long context、server auth/deployment 和 model pool incident。评测会输出按模型和任务聚合的 pass rate、quality、speed、latency、best run、维度均分和失败 findings;默认是离线 deterministic rubric,不等同于人工复核。
|
|
436
|
-
|
|
437
|
-
如果你已经有人工复核或外部 LLM 裁判结果,可以在输入里补 `humanScore` / `judgeScore`,范围是 `0..1`。报告会生成 calibration summary,并标出 deterministic rubric 与人工/裁判结果差异较大的任务,帮助维护者判断某个模型组合是否真的带来质量提升。
|
|
438
|
-
|
|
439
|
-
如果想把多次评测变成可比较的历史趋势,给离线或自动评测追加 `--save-history`:
|
|
440
|
-
|
|
441
|
-
```bash
|
|
442
|
-
ctr eval --input results.json --save-history --history-label baseline
|
|
443
|
-
ctr eval --run --models "sonnet;haiku" --save-history --history-label smart-router-candidates
|
|
444
|
-
ctr eval --history
|
|
445
|
-
```
|
|
446
|
-
|
|
447
|
-
benchmark history 默认保存到 `~/.claude-trigger-router/benchmark-history.json`,只保存摘要、模型均分、best run 和趋势指标,不保存原始模型输出。需要放到别的位置时可以用 `--history-file path/to/history.json`。
|
|
160
|
+
UI 主要看四件事:
|
|
448
161
|
|
|
449
|
-
|
|
162
|
+
- 当前服务是否 ready。
|
|
163
|
+
- 编译后的模型和路由是否符合预期。
|
|
164
|
+
- 最近请求为什么选了某个模型。
|
|
165
|
+
- governance trace、metrics、Health 摘要和 SmartRouter 协作证据。
|
|
450
166
|
|
|
451
|
-
|
|
452
|
-
ctr eval --input results.json --judge-model sonnet --base-url http://127.0.0.1:5678 --api-key <client-or-bootstrap-key>
|
|
453
|
-
ctr eval --run --models "sonnet;haiku" --judge-model sonnet --base-url http://127.0.0.1:5678 --api-key <client-or-bootstrap-key>
|
|
454
|
-
```
|
|
455
|
-
|
|
456
|
-
裁判模型会通过同一个 CTR `/v1/messages` 入口收到固定 JSON rubric 提示,并返回 `judgeScore`、`judgeFindings` 和 `calibrationNotes`。如果裁判响应不可解析、超时或返回 HTTP 错误,报告会记录 `judge_error`,但不会把失败裁判误算进 calibration score。
|
|
457
|
-
|
|
458
|
-
如果本机或远端 CTR 已启动,也可以显式自动跑固定任务集:
|
|
459
|
-
|
|
460
|
-
```bash
|
|
461
|
-
ctr eval --run --models "sonnet;haiku" --base-url http://127.0.0.1:5678 --api-key <client-or-bootstrap-key>
|
|
462
|
-
```
|
|
463
|
-
|
|
464
|
-
`--run` 会对每个模型逐个调用 `POST /v1/messages`,默认 `--concurrency 2`、`--timeout-ms 30000`、`--max-tokens 768`。多个模型用分号 `;` 分隔,因为 legacy 模型引用本身可能包含逗号。追加 `--judge-max-tokens 256` 可调整裁判输出长度。该模式会真实调用模型服务并消耗上游额度;启用 `--judge-model` 时会额外消耗裁判模型额度。
|
|
465
|
-
|
|
466
|
-
如果服务没有启动,`ctr ui` 会提示先运行:
|
|
467
|
-
|
|
468
|
-
```bash
|
|
469
|
-
ctr start
|
|
470
|
-
```
|
|
471
|
-
|
|
472
|
-
或:
|
|
473
|
-
|
|
474
|
-
```bash
|
|
475
|
-
ctr start --daemon
|
|
476
|
-
```
|
|
477
|
-
|
|
478
|
-
## doctor 诊断
|
|
167
|
+
## 部署模式与边界
|
|
479
168
|
|
|
480
|
-
|
|
169
|
+
默认使用本地模式即可。只有需要让多台机器共享同一个 CTR 服务时,才需要看远程/服务端配置。
|
|
481
170
|
|
|
482
171
|
```bash
|
|
172
|
+
ctr deploy init --target server
|
|
483
173
|
ctr doctor
|
|
174
|
+
ctr start --daemon
|
|
484
175
|
```
|
|
485
176
|
|
|
486
|
-
|
|
487
|
-
|
|
488
|
-
- 配置文件是否存在或能否解析
|
|
489
|
-
- 缺失字段和低风险结构问题
|
|
490
|
-
- 配置是否能通过本地校验
|
|
491
|
-
- 服务是否可启动
|
|
492
|
-
- 当前服务上下文:`local` / `server` / `cloud`
|
|
493
|
-
- 当前监听地址;server/cloud 会提示远程客户端应设置的 `ANTHROPIC_BASE_URL`
|
|
494
|
-
- 当前鉴权状态;如果 server/cloud 或公网监听没有配置 `APIKEY` / managed key,会提示安全风险
|
|
495
|
-
- 如果启用了 `Runtime.remote_service`,会单独检查远程服务可达和 ready 状态
|
|
496
|
-
- 基础路由槽位:`Router.default` / `think` / `longContext` / `background` / `webSearch` 是否能解析到模型
|
|
497
|
-
- 上下文窗口提示:槽位模型是否缺少 `metadata.context_window_tokens` / `metadata.safe_input_tokens`,以及 `Router.longContext` 是否真的比默认模型更适合大上下文
|
|
498
|
-
- 模型兼容策略和请求编译方式
|
|
499
|
-
- capability hint 可能触发的运行时降级
|
|
500
|
-
- 在你确认后,对模型发送最小探测请求
|
|
177
|
+
当前支持的角色:
|
|
501
178
|
|
|
502
|
-
|
|
503
|
-
|
|
504
|
-
|
|
505
|
-
|
|
506
|
-
|
|
507
|
-
|
|
508
|
-
如果你已经有一个远程 Trigger Router 服务,可以通过 `ctr setup` 选择“连接远程服务”,或手动配置远程目标:
|
|
509
|
-
|
|
510
|
-
```yaml
|
|
511
|
-
Runtime:
|
|
512
|
-
mode: "local"
|
|
513
|
-
remote_service:
|
|
514
|
-
enabled: true
|
|
515
|
-
base_url: "https://router.example.com"
|
|
516
|
-
auth_token: "${CTR_REMOTE_AUTH_TOKEN}" # 推荐使用远程服务端生成的 managed key;如需 ready/status 探测,同时授予 client 与 read-only scope
|
|
517
|
-
|
|
518
|
-
Router: {}
|
|
519
|
-
```
|
|
179
|
+
| 模式 | 适合谁 | 说明 |
|
|
180
|
+
|---|---|---|
|
|
181
|
+
| `local` | 单机 Claude Code 用户 | 默认模式,本地代理转发到上游模型 |
|
|
182
|
+
| `server` | 服务维护者 | 暴露远程 CTR 服务,提供模型调用、状态和管理接口 |
|
|
183
|
+
| `local + remote_service` | 远程服务使用者 | 本地 `ctr code` 作为 thin proxy,把模型请求转发到远端 CTR |
|
|
184
|
+
| `cloud` | 未来托管形态 | 只保留配置语义,当前 npm 包不包含托管控制面 |
|
|
520
185
|
|
|
521
|
-
|
|
186
|
+
远程 Claude Code 直接连接服务端时,推荐使用:
|
|
522
187
|
|
|
523
|
-
```
|
|
524
|
-
|
|
188
|
+
```bash
|
|
189
|
+
ANTHROPIC_BASE_URL=https://router.example.com
|
|
190
|
+
ANTHROPIC_AUTH_TOKEN=<managed-key>
|
|
525
191
|
```
|
|
526
192
|
|
|
527
|
-
|
|
193
|
+
启用鉴权后,浏览器直接打开 `/ui` 不能自动携带 `Authorization` header。受保护 UI 需要 admin key,建议通过内网、本地隧道或 HTTPS 反向代理注入 `Authorization: Bearer <admin-key>`;不要把 admin key 放进 URL。
|
|
528
194
|
|
|
529
|
-
|
|
530
|
-
GET /api/service-info
|
|
531
|
-
GET /api/remote-status
|
|
532
|
-
GET /api/registration
|
|
533
|
-
GET /api/auth/audit
|
|
534
|
-
```
|
|
195
|
+
更多部署细节:
|
|
535
196
|
|
|
536
|
-
|
|
197
|
+
- [docs/configuration-roles.md](docs/configuration-roles.md)
|
|
198
|
+
- [docs/server-maintainer-guide.md](docs/server-maintainer-guide.md)
|
|
199
|
+
- [docs/remote-client-guide.md](docs/remote-client-guide.md)
|
|
537
200
|
|
|
538
201
|
## 常用命令
|
|
539
202
|
|
|
540
203
|
| 命令 | 用途 |
|
|
541
204
|
|---|---|
|
|
542
|
-
| `ctr setup` |
|
|
543
|
-
| `ctr
|
|
544
|
-
| `ctr deploy init --target server` | 生成安全默认的自托管 server 配置 |
|
|
545
|
-
| `ctr start` | 前台启动本地服务 |
|
|
205
|
+
| `ctr setup` | 首次配置、复用配置、迁移旧配置 |
|
|
206
|
+
| `ctr doctor` | 配置和服务诊断 |
|
|
546
207
|
| `ctr start --daemon` | 后台启动本地服务 |
|
|
547
208
|
| `ctr status` | 查看服务状态 |
|
|
548
|
-
| `ctr
|
|
549
|
-
| `ctr stop` | 停止服务 |
|
|
550
|
-
| `ctr code` | 带 Trigger Router 环境启动 Claude Code |
|
|
551
|
-
| `ctr doctor` | 配置和服务诊断 |
|
|
552
|
-
| `ctr eval --tasks` | 查看固定评测任务、prompt 和 rubric |
|
|
553
|
-
| `ctr eval --input results.json` | 离线固定任务集评测 |
|
|
554
|
-
| `ctr eval --run --models "sonnet;haiku"` | 自动调用 CTR 后评测固定任务集 |
|
|
555
|
-
| `ctr eval --run --models "sonnet;haiku" --judge-model sonnet` | 自动执行并追加 LLM 裁判校准 |
|
|
556
|
-
| `ctr eval --history` | 查看已保存 benchmark 历史趋势 |
|
|
209
|
+
| `ctr code` | 带路由环境启动 Claude Code |
|
|
557
210
|
| `ctr ui` | 打开本地 UI 工作台 |
|
|
558
|
-
| `ctr
|
|
559
|
-
| `ctr
|
|
560
|
-
|
|
561
|
-
|
|
211
|
+
| `ctr eval --tasks` | 查看内置评测任务 |
|
|
212
|
+
| `ctr eval --run --models "fast;deep"` | 真实调用 CTR 做多模型评测 |
|
|
213
|
+
| `ctr stop` | 停止后台服务 |
|
|
214
|
+
| `ctr upgrade` | 查看升级指引 |
|
|
562
215
|
|
|
563
|
-
|
|
564
|
-
|
|
565
|
-
```bash
|
|
566
|
-
ctr setup
|
|
567
|
-
```
|
|
216
|
+
## 文档入口
|
|
568
217
|
|
|
569
|
-
|
|
218
|
+
- 配置指南:[docs/configuration-guide.md](docs/configuration-guide.md)
|
|
219
|
+
- Models 迁移:[docs/models-migration-guide.md](docs/models-migration-guide.md)
|
|
220
|
+
- CLI 测试矩阵:[docs/cli-test-matrix.md](docs/cli-test-matrix.md)
|
|
221
|
+
- 发布说明:[docs/release-notes-v1.12.0.md](docs/release-notes-v1.12.0.md)
|
|
222
|
+
- 发布验证:[docs/releasing.md](docs/releasing.md)
|
|
570
223
|
|
|
571
|
-
|
|
572
|
-
~/.claude-trigger-router/config.yaml
|
|
573
|
-
```
|
|
224
|
+
## v1.12.0 发布定位
|
|
574
225
|
|
|
575
|
-
|
|
226
|
+
`v1.12.0` 是流式传输韧性与远程中转稳定性修复版。它在 `v1.11.0` 首轮止血基础上继续修复用户复现的 socket 断连和中转卡顿:上游流式中途断开时返回可读 SSE error event,远程中转会在客户端断开时主动取消上游请求,并修复 SSE parser 在多字节字符跨 chunk 时的解析风险。
|
|
576
227
|
|
|
577
|
-
|
|
578
|
-
- 路由引用 `Models[].id`
|
|
579
|
-
- 少写旧式 `provider,model`
|
|
228
|
+
这个版本不新增 SmartRouter 协作模式、不改变远程客户端配置心智;`v1.10.0` 的 routing advisor、confidence threshold、latency budget 和 collaboration contract 继续保留。完整发布边界见 [docs/release-notes-v1.12.0.md](docs/release-notes-v1.12.0.md)。
|
|
580
229
|
|
|
581
|
-
##
|
|
230
|
+
## License
|
|
582
231
|
|
|
583
|
-
|
|
584
|
-
- 基础路由五槽位示例:`config/trigger.routing.yaml`
|
|
585
|
-
- SmartRouter 常用规则示例:`config/trigger.smart-router.yaml`
|
|
586
|
-
- 高级示例:`config/trigger.advanced.yaml`
|
|
587
|
-
- 配置细节:`docs/configuration-guide.md`
|
|
588
|
-
- Models 迁移:`docs/models-migration-guide.md`
|
|
589
|
-
- 发布验证:`docs/releasing.md`
|
|
232
|
+
MIT
|