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