@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 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
- 你可以把它理解成 Claude Code 和上游模型之间的一层本地服务:Claude Code 仍然照常使用,但请求会先经过 `ctr`,再按你的配置转发到 OpenAI、Anthropic、OpenRouter、DeepSeek 或其他 OpenAI-compatible 接口。
5
+ 它适合想把多个模型接到同一个 Claude Code 入口里的人:日常任务走快模型,复杂任务切到强模型,长上下文、后台请求、web search 和代码审查都可以有自己的路由策略。
6
6
 
7
- 它适合这些场景:
7
+ ## 你会得到什么
8
8
 
9
- - 想用统一配置管理多个模型和供应商
10
- - 想让日常任务走便宜/快的模型,复杂任务自动切到更强模型
11
- - 想在 Claude Code 外层增加配置校验、健康检查、治理观测和 UI 工作台
12
- - 想从 `claude-code-router` 迁移到更清晰的 `Models + Router` 配置心智
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
- 首次使用最推荐走交互式 setup:
24
+ 初始化配置:
25
25
 
26
26
  ```bash
27
27
  ctr setup
28
28
  ```
29
29
 
30
- `ctr setup` 会自动处理:
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 code
48
- ctr ui
34
+ ctr start --daemon
35
+ ctr status
49
36
  ```
50
37
 
51
- `ctr code` 会带着本地代理环境启动 Claude Code。之后你在 Claude Code 里的请求会经过本地 Trigger Router;`ctr ui` 用于查看当前服务、配置草稿、远程状态、compiled models 和治理摘要。
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 deploy init --target server
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 doctor
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: sonnet
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-sonnet-4"
89
+ model: "anthropic/claude-3-5-haiku"
251
90
 
252
- - id: reasoner
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: "sonnet"
261
- think: "reasoner"
98
+ default: "fast"
99
+ think: "deep"
100
+ longContext: "deep"
262
101
  ```
263
102
 
264
- 推荐所有路由字段都引用 `Models[].id`,比如上面的 `sonnet`、`reasoner`。
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
- ```yaml
292
- Router:
293
- default: "sonnet"
294
-
295
- SmartRouter:
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
- 规则命中时优先使用规则指定模型;没命中时回到 `Router.default`。
113
+ 可复制模板:
309
114
 
310
- 可复制的 SmartRouter 常用模板见 `config/trigger.smart-router.yaml`。它已经把 `coding`、`review`、`architecture`、`long_context` 和 `fast_reply` 五类高频任务写成规则,并保留 `router_model + candidates` 作为规则未命中时的智能兜底起点。
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
- 如果任务边界比较模糊,可以让 SmartRouter 用一个路由模型从候选模型中选择:
122
+ SmartRouter 适合任务边界不稳定、模型能力差异明显、或者你想让真实运行证据反哺路由的场景。
315
123
 
316
124
  ```yaml
317
125
  SmartRouter:
318
126
  enabled: true
319
- router_model: "sonnet"
127
+ router_model: "fast"
320
128
  candidates:
321
- - model: "sonnet"
322
- description: "通用编程、代码生成、日常调试"
323
- - model: "reasoner"
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
- ## capability hint
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
- ```yaml
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
- 当前 UI 分成两层:
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
- 也可以让 CTR 自动调用一个裁判模型:
162
+ - 当前服务是否 ready。
163
+ - 编译后的模型和路由是否符合预期。
164
+ - 最近请求为什么选了某个模型。
165
+ - governance trace、metrics、Health 摘要和 SmartRouter 协作证据。
450
166
 
451
- ```bash
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
- 模型探测会消耗少量额度,所以 doctor 会先征求确认。如果当前是远程客户端配置且没有本地 `Models`,doctor 会跳过本地模型探测。
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
- 启用后,服务状态接口会返回远程健康、compiled model 摘要和治理告警摘要:
186
+ 远程 Claude Code 直接连接服务端时,推荐使用:
522
187
 
523
- ```text
524
- GET /api/remote-status
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
- ```text
530
- GET /api/service-info
531
- GET /api/remote-status
532
- GET /api/registration
533
- GET /api/auth/audit
534
- ```
195
+ 更多部署细节:
535
196
 
536
- 这条能力当前作为远程接入基础 contract 提供,用于服务发现、状态检查、注册摘要和本地 thin proxy 转发。启用 `Runtime.remote_service` 后,Claude Code 仍可通过本地 `ctr code` 进入,本地 `ctr` 会把模型请求转发到远端 CTR;直接连接远端服务只是可选高级路径。首次本地使用仍建议从 `ctr setup -> ctr start -> ctr code` 开始。
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 init --force` | 生成最小配置模板 |
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 restart` | 重启服务,默认按后台模式 |
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 version` | 查看版本 |
559
- | `ctr upgrade` | 升级 |
560
-
561
- ## 旧配置迁移
211
+ | `ctr eval --tasks` | 查看内置评测任务 |
212
+ | `ctr eval --run --models "fast;deep"` | 真实调用 CTR 做多模型评测 |
213
+ | `ctr stop` | 停止后台服务 |
214
+ | `ctr upgrade` | 查看升级指引 |
562
215
 
563
- 如果你之前使用 `claude-code-router`:
564
-
565
- ```bash
566
- ctr setup
567
- ```
216
+ ## 文档入口
568
217
 
569
- setup 会自动探测旧配置,并优先提供迁移选项。迁移后的配置会写入:
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
- ```text
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
- - 每个模型写成一个 `Models[]` 项
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
- - 最小示例:`config/trigger.example.yaml`
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