@peterwangze/claude-trigger-router 1.0.7 → 1.1.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.
Files changed (4) hide show
  1. package/README.md +194 -187
  2. package/dist/cli.js +559 -83
  3. package/dist/cli.js.map +4 -4
  4. package/package.json +74 -74
package/README.md CHANGED
@@ -1,12 +1,27 @@
1
1
  # Claude Trigger Router
2
2
 
3
- Claude Code 的本地路由代理。
3
+ Claude Trigger Router 是给 Claude Code 用的本地路由代理。
4
4
 
5
- 它的目标很简单:
5
+ 你可以把它理解成 Claude Code 和上游模型之间的一层本地服务:Claude Code 仍然照常使用,但请求会先经过 `ctr`,再按你的配置转发到 OpenAI、Anthropic、OpenRouter、DeepSeek 或其他 OpenAI-compatible 接口。
6
6
 
7
- - 用一个本地服务接管 Claude Code 的上游请求
8
- - 按你的配置把请求路由到不同模型
9
- - 用统一的模型配置格式管理 OpenAI / Anthropic 及兼容接口
7
+ 它适合这些场景:
8
+
9
+ - 想用统一配置管理多个模型和供应商
10
+ - 想让日常任务走便宜/快的模型,复杂任务自动切到更强模型
11
+ - 想在 Claude Code 外层增加配置校验、健康检查、治理观测和 UI 工作台
12
+ - 想从 `claude-code-router` 迁移到更清晰的 `Models + Router` 配置心智
13
+
14
+ ## 功能概览
15
+
16
+ - **本地代理服务**:默认监听 `127.0.0.1:5678`,接管 Claude Code 上游请求。
17
+ - **统一模型配置**:用 `Models[]` 描述模型接入项,路由直接引用 `Models[].id`。
18
+ - **协议兼容**:支持 `openai` / `anthropic` 两类接口协议,OpenRouter、DeepSeek 等 OpenAI-compatible 服务按 `openai` 配。
19
+ - **基础路由**:用 `Router.default`、`Router.think`、`Router.longContext` 等槽位指定不同任务的默认模型。
20
+ - **SmartRouter**:先用显式规则命中高确定性任务,也可以在规则未命中时让路由模型从候选模型中自动选择。
21
+ - **Governance 观测**:记录 trace、metrics、异常摘要,帮助你理解路由选择和运行状态。
22
+ - **doctor 诊断**:检查配置、服务可启动性、模型兼容策略和可选模型探测。
23
+ - **UI 工作台**:`ctr ui` 打开本地页面,查看配置草稿、compiled models、capability warnings、治理 trace 和 metrics。
24
+ - **远程状态基础**:可配置 `Runtime.remote_service`,通过 `/api/remote-status` 查看远程服务健康、compiled model 摘要和治理告警摘要。默认用户不需要配置远程模式。
10
25
 
11
26
  ## 安装
12
27
 
@@ -14,45 +29,62 @@ Claude Code 的本地路由代理。
14
29
  npm install -g @peterwangze/claude-trigger-router
15
30
  ```
16
31
 
17
- 安装后先确认:
32
+ 安装后确认命令可用:
18
33
 
19
34
  ```bash
20
35
  ctr version
21
36
  ctr help
22
37
  ```
23
38
 
24
- ## 最推荐的开始方式
39
+ ## 5 分钟跑起来
25
40
 
26
- 直接运行:
41
+ 首次使用最推荐走交互式 setup:
27
42
 
28
43
  ```bash
29
44
  ctr setup
30
45
  ```
31
46
 
32
- `ctr setup` 会按顺序处理这些事情:
47
+ `ctr setup` 会自动处理:
33
48
 
34
- - 检查当前 `~/.claude-trigger-router` 配置是否可以直接复用
35
- - 检查旧的 `claude-code-router` 配置是否可以迁移
36
- - 如果都不适用,就按“默认模型 ID -> 接入方式 -> API 信息”的顺序引导你创建最小可用配置
37
- - 完成最小配置后,可选继续添加一个复杂任务模型,并直接生成 SmartRouter 路由模板
49
+ - 复用已有 `~/.claude-trigger-router/config.yaml`
50
+ - 探测并迁移旧 `claude-code-router` 配置
51
+ - 在没有可用配置时创建最小可用配置
52
+ - 引导填写默认模型 ID、接口地址、API Key 和模型名
53
+ - 可选追加复杂任务模型,并生成 SmartRouter 起步模板
38
54
  - 保存配置后启动本地服务
39
55
 
40
- 这是当前最推荐、也是覆盖最完整的用户入口。
56
+ 完成后按这个顺序使用:
57
+
58
+ ```bash
59
+ ctr status
60
+ ctr code
61
+ ```
62
+
63
+ `ctr code` 会带着本地代理环境启动 Claude Code。之后你在 Claude Code 里的请求会经过 Trigger Router。
41
64
 
42
- ## 最小配置
65
+ ## 手动配置
43
66
 
44
- 如果你想手动编辑,可以先生成模板:
67
+ 如果你更喜欢手动编辑,可以先生成模板:
45
68
 
46
69
  ```bash
47
70
  ctr init --force
48
71
  ```
49
72
 
50
- 然后编辑 `~/.claude-trigger-router/config.yaml`,最小可用配置类似这样:
73
+ 配置文件位置:
74
+
75
+ ```text
76
+ ~/.claude-trigger-router/config.yaml
77
+ ```
78
+
79
+ 最小可用配置如下:
51
80
 
52
81
  ```yaml
53
82
  HOST: "127.0.0.1"
54
83
  PORT: 5678
55
84
 
85
+ LOG: true
86
+ LOG_LEVEL: "debug"
87
+
56
88
  Models:
57
89
  - id: sonnet
58
90
  api: "https://openrouter.ai/api/v1/chat/completions"
@@ -65,50 +97,48 @@ Router:
65
97
  default: "sonnet"
66
98
  ```
67
99
 
68
- `ctr init --force` 现在和 `ctr setup` 一样,都会落到同一类“最小可用配置”心智:
69
-
70
- - 必要运行时字段已补齐
71
- - `Models[0]` 已是可校验的最小接入结构
72
- - `Router.default` 已指向默认模型 ID
73
- - 修改最少必要字段后即可直接 `ctr start`
74
-
75
- 最少只需要关心这几个字段:
100
+ 你第一次通常只需要改:
76
101
 
77
- - `api`:目标接口地址
78
- - `key`:API Key
79
- - `interface`:接口类型,当前支持 `openai` / `anthropic`
80
- - `thinking`:可选,支持的模型才需要配置
102
+ - `Models[0].api`:上游接口地址
103
+ - `Models[0].key`:API Key
104
+ - `Models[0].interface`:接口协议,通常是 `openai` `anthropic`
105
+ - `Models[0].model`:上游真实模型名
106
+ - `Router.default`:默认使用哪个 `Models[].id`
81
107
 
82
- 消息格式转换由路由层统一处理,不需要你自己按不同厂商手写消息体。
108
+ 改完后启动:
83
109
 
84
- 如果你在 `ctr setup` 中选择继续添加“复杂任务专用模型”,setup 还可以直接帮你补一层 SmartRouter 模板:
85
-
86
- - 规则模板:把架构设计、代码审查、深入分析等高确定性任务切到复杂任务模型
87
- - 规则 + 智能兜底:在规则之外,再让 `router_model` 在默认模型和复杂任务模型之间自动选择
110
+ ```bash
111
+ ctr start
112
+ ctr code
113
+ ```
88
114
 
89
- 这样首次接入时就能同时得到:
115
+ 后台运行:
90
116
 
91
- - 一个默认模型
92
- - 一个复杂任务模型
93
- - 一套可直接修改的 SmartRouter 起步模板
117
+ ```bash
118
+ ctr start --daemon
119
+ ctr status
120
+ ctr code
121
+ ```
94
122
 
95
- ## Router:显式规则优先
123
+ ## `interface` 怎么选
96
124
 
97
- 统一 `Router` 的第一层能力,是先用显式规则处理“高确定性任务”:
125
+ `interface` 表示上游接口协议,不是厂商名。
98
126
 
99
- - 架构设计
100
- - 代码审查
101
- - 长文档评审
102
- - 复杂推理
127
+ 常见写法:
103
128
 
104
- 这类任务通常可以通过关键词或规则稳定识别,然后直接路由到你指定的模型。
129
+ | 服务 | interface |
130
+ |---|---|
131
+ | OpenAI 官方 | `openai` |
132
+ | Anthropic 官方 | `anthropic` |
133
+ | OpenRouter | `openai` |
134
+ | DeepSeek | `openai` |
135
+ | 其他 OpenAI-compatible 服务 | `openai` |
105
136
 
106
- 当前这层能力由 `SmartRouter.rules` 承载:
137
+ 路由层会负责请求格式转换,你不需要自己按不同供应商手写消息体。
107
138
 
108
- - 默认请求先走 `Router.default`
109
- - 命中显式规则的请求,优先切到规则指定模型
139
+ ## 配多个模型
110
140
 
111
- 示例:
141
+ 每个 `Models[]` 项都是一个可被路由引用的模型接入项:
112
142
 
113
143
  ```yaml
114
144
  Models:
@@ -118,12 +148,25 @@ Models:
118
148
  interface: "openai"
119
149
  model: "anthropic/claude-sonnet-4"
120
150
 
121
- - id: opus
122
- api: "https://openrouter.ai/api/v1/chat/completions"
151
+ - id: reasoner
152
+ api: "https://api.deepseek.com/chat/completions"
123
153
  key: "sk-xxx"
124
154
  interface: "openai"
125
- model: "anthropic/claude-opus-4"
155
+ model: "deepseek-reasoner"
156
+ thinking: "high"
126
157
 
158
+ Router:
159
+ default: "sonnet"
160
+ think: "reasoner"
161
+ ```
162
+
163
+ 推荐所有路由字段都引用 `Models[].id`,比如上面的 `sonnet`、`reasoner`。
164
+
165
+ ## 显式规则路由
166
+
167
+ 适合能用关键词稳定识别的任务,例如架构设计、代码审查、长文档评审。
168
+
169
+ ```yaml
127
170
  Router:
128
171
  default: "sonnet"
129
172
 
@@ -137,45 +180,16 @@ SmartRouter:
137
180
  patterns:
138
181
  - type: exact
139
182
  keywords: ["架构设计", "system design"]
140
- model: "opus"
183
+ model: "reasoner"
141
184
  ```
142
185
 
143
- ## Router:候选模型智能兜底
144
-
145
- 统一 `Router` 的第二层能力,是在显式规则未命中时,用候选模型做智能兜底。
146
-
147
- 它适合“规则难以穷举,但模型选择仍然很重要”的任务:
148
-
149
- - 通用编程 vs 深度推理
150
- - 日常修复 vs 架构设计
151
- - 常规回答 vs 长上下文分析
152
-
153
- 你提供一个路由模型和一组候选模型,路由器会在规则未命中时,从候选模型里自动挑一个更合适的目标。
186
+ 规则命中时优先使用规则指定模型;没命中时回到 `Router.default`。
154
187
 
155
- - 规则负责稳定命中
156
- - 智能兜底负责补上规则没覆盖到的模糊任务
188
+ ## 智能模型选择
157
189
 
158
- 示例:
190
+ 如果任务边界比较模糊,可以让 SmartRouter 用一个路由模型从候选模型中选择:
159
191
 
160
192
  ```yaml
161
- Models:
162
- - id: sonnet
163
- api: "https://openrouter.ai/api/v1/chat/completions"
164
- key: "sk-xxx"
165
- interface: "openai"
166
- model: "anthropic/claude-sonnet-4"
167
-
168
- - id: reasoner
169
- api: "https://api.deepseek.com/chat/completions"
170
- key: "sk-xxx"
171
- interface: "openai"
172
- model: "deepseek-reasoner"
173
- thinking: "high"
174
-
175
- Router:
176
- default: "sonnet"
177
- think: "reasoner"
178
-
179
193
  SmartRouter:
180
194
  enabled: true
181
195
  router_model: "sonnet"
@@ -183,164 +197,157 @@ SmartRouter:
183
197
  - model: "sonnet"
184
198
  description: "通用编程、代码生成、日常调试"
185
199
  - model: "reasoner"
186
- description: "复杂推理、严谨分析"
200
+ description: "复杂推理、严谨分析、架构设计"
187
201
  ```
188
202
 
189
- 可以简单理解成:
203
+ 推荐心智:
190
204
 
191
205
  - `Router.default` 负责默认去向
192
- - 显式规则负责“能明确命中的任务”
193
- - 智能兜底负责“规则没命中时的动态选模”
206
+ - `SmartRouter.rules` 负责高确定性任务
207
+ - `SmartRouter.candidates` 负责规则未命中时的智能兜底
194
208
 
195
- 这两层能力可以同时启用:
209
+ ## capability hint
196
210
 
197
- - 先让显式规则处理高确定性任务
198
- - 再让智能兜底处理剩余的模糊任务
211
+ 如果你明确知道某个模型能力受限,可以配置 `metadata`:
199
212
 
200
- ## `interface` 怎么选
213
+ ```yaml
214
+ Models:
215
+ - id: text_only
216
+ api: "https://api.example.com/v1/chat/completions"
217
+ key: "sk-xxx"
218
+ interface: "openai"
219
+ model: "vendor/text-only"
220
+ metadata:
221
+ supports_reasoning: false
222
+ supports_tools: false
223
+ supports_images: false
224
+ ```
201
225
 
202
- `interface` 表示目标上游接口协议,不是厂商名。
226
+ 当前行为:
203
227
 
204
- 常见场景:
228
+ - `supports_reasoning: false`:忽略 `thinking`
229
+ - `supports_tools: false`:工具调用退化为文本表达
230
+ - `supports_images: false`:图片输入退化为文本描述
205
231
 
206
- - OpenAI 官方:`interface: openai`
207
- - Anthropic 官方:`interface: anthropic`
208
- - OpenRouter:`interface: openai`
209
- - DeepSeek 兼容接口:`interface: openai`
210
- - 其他 OpenAI-compatible 服务:`interface: openai`
232
+ 不确定时可以先不配,等主路径跑通后再补。
211
233
 
212
- ## 常用命令
234
+ ## UI 工作台
213
235
 
214
- 初始化或修复配置:
236
+ 启动服务后运行:
215
237
 
216
238
  ```bash
217
- ctr setup
218
- ctr init
239
+ ctr ui
219
240
  ```
220
241
 
221
- 服务生命周期:
242
+ 默认打开:
222
243
 
223
- ```bash
224
- ctr start
225
- ctr start --daemon
226
- ctr status
227
- ctr restart
228
- ctr restart --daemon
229
- ctr stop
244
+ ```text
245
+ http://127.0.0.1:5678/ui
230
246
  ```
231
247
 
232
- 配合 Claude Code 使用:
248
+ 当前 UI 分成两层:
249
+
250
+ - **使用者工作台**:查看和编辑配置草稿、模型、路由、compiled preview 和保存结果。
251
+ - **维护者工作台**:查看 Governance trace、metrics、异常阈值、快照和归档。
252
+
253
+ 如果服务没有启动,`ctr ui` 会提示先运行:
233
254
 
234
255
  ```bash
235
- ctr code
256
+ ctr start
236
257
  ```
237
258
 
238
- 其它:
259
+ 或:
239
260
 
240
261
  ```bash
241
- ctr version
242
- ctr upgrade
243
- ctr doctor
244
- ctr ui
262
+ ctr start --daemon
245
263
  ```
246
264
 
247
- ## doctor
265
+ ## doctor 诊断
248
266
 
249
- 如果你已经有配置,但不确定为什么服务起不来、模型不可用,或者迁移后想做一次统一体检,可以运行:
267
+ 配置不确定、服务起不来、模型不可用、迁移后想体检,都可以运行:
250
268
 
251
269
  ```bash
252
270
  ctr doctor
253
271
  ```
254
272
 
255
- `ctr doctor` 会按顺序执行:
273
+ 它会检查:
256
274
 
257
- - 诊断当前配置文件是否存在格式问题
258
- - 自动修复低风险、可确定补全的结构问题
259
- - 确认修复后的配置是否还能通过本地校验并让服务启动
260
- - 用可理解的说明展示当前模型的兼容策略与请求编译方式
261
- - 预览 capability 配置可能触发的运行时降级,例如 thinking 忽略、工具降级为文本、图片降级为文本
262
- - 在征得你同意后,对配置中的模型发送最小探测请求,确认模型是否真实可用
275
+ - 配置文件是否存在或能否解析
276
+ - 缺失字段和低风险结构问题
277
+ - 配置是否能通过本地校验
278
+ - 服务是否可启动
279
+ - 模型兼容策略和请求编译方式
280
+ - capability hint 可能触发的运行时降级
281
+ - 在你确认后,对模型发送最小探测请求
263
282
 
264
- 其中模型探测会消耗少量额度,所以 doctor 会先征求你的确认。探测失败时,doctor 会优先给出面向用户的失败说明和处理建议,再保留原始远端报错供继续排查。
283
+ 模型探测会消耗少量额度,所以 doctor 会先征求确认。
265
284
 
266
- ## 推荐使用顺序
285
+ ## 远程服务状态
267
286
 
268
- 首次使用:
287
+ 默认情况下,你只需要本地模式,不需要配置远程服务。
269
288
 
270
- ```bash
271
- ctr help
272
- ctr version
273
- ctr setup
274
- ctr status
275
- ctr code
276
- ```
289
+ 如果你已经有一个远程 Trigger Router 服务,可以在本地配置远程目标:
277
290
 
278
- 如果你更喜欢手动配置:
279
-
280
- ```bash
281
- ctr init --force
282
- ctr start
283
- ctr code
291
+ ```yaml
292
+ Runtime:
293
+ mode: "local"
294
+ remote_service:
295
+ enabled: true
296
+ base_url: "https://router.example.com"
297
+ auth_token: "${CTR_REMOTE_AUTH_TOKEN}"
298
+
299
+ Router: {}
284
300
  ```
285
301
 
286
- 后台运行:
302
+ 启用后,服务状态接口会返回远程健康、compiled model 摘要和治理告警摘要:
287
303
 
288
- ```bash
289
- ctr start --daemon
290
- ctr status
291
- ctr ui
292
- ctr code
304
+ ```text
305
+ GET /api/remote-status
293
306
  ```
294
307
 
295
- 补充说明:
308
+ 这条能力当前作为远程接入基础 contract 提供;首次使用仍建议从本地 `ctr setup -> ctr start -> ctr code` 开始。
296
309
 
297
- - `ctr restart` 当前默认按后台模式重启
298
- - `ctr restart --daemon` 只是更显式的等价写法
299
-
300
- ## 旧配置迁移
301
-
302
- 如果你之前在用 `claude-code-router`:
303
-
304
- - `ctr setup` 会自动探测旧配置
305
- - 会优先提供迁移选项
306
- - 迁移后的新配置会落到 `~/.claude-trigger-router/config.yaml`
307
-
308
- 当前推荐的新配置心智是:
310
+ ## 常用命令
309
311
 
310
- - 每个模型直接写成一个 `Models[]`
311
- - 路由规则直接引用 `Models[].id`
312
- - 不再让用户到处手写 `provider,model`
312
+ | 命令 | 用途 |
313
+ |---|---|
314
+ | `ctr setup` | 首次配置、复用、迁移、修复配置 |
315
+ | `ctr init --force` | 生成最小配置模板 |
316
+ | `ctr start` | 前台启动本地服务 |
317
+ | `ctr start --daemon` | 后台启动本地服务 |
318
+ | `ctr status` | 查看服务状态 |
319
+ | `ctr restart` | 重启服务,默认按后台模式 |
320
+ | `ctr stop` | 停止服务 |
321
+ | `ctr code` | 带 Trigger Router 环境启动 Claude Code |
322
+ | `ctr doctor` | 配置和服务诊断 |
323
+ | `ctr ui` | 打开本地 UI 工作台 |
324
+ | `ctr version` | 查看版本 |
325
+ | `ctr upgrade` | 升级 |
313
326
 
314
- ## UI
327
+ ## 旧配置迁移
315
328
 
316
- 运行:
329
+ 如果你之前使用 `claude-code-router`:
317
330
 
318
331
  ```bash
319
- ctr ui
332
+ ctr setup
320
333
  ```
321
334
 
322
- 当前会打开:
335
+ setup 会自动探测旧配置,并优先提供迁移选项。迁移后的配置会写入:
323
336
 
324
337
  ```text
325
- http://127.0.0.1:5678/ui
338
+ ~/.claude-trigger-router/config.yaml
326
339
  ```
327
340
 
328
- 如果本地服务还没启动,CLI 会先提醒你运行 `ctr start` 或 `ctr start --daemon`。
329
-
330
- 它适合做配置查看和调试,但主线入口仍然建议优先使用 `ctr setup`。
331
-
332
- ## 示例配置
333
-
334
- 最小示例:
335
-
336
- - `config/trigger.example.yaml`
337
-
338
- 完整高级示例:
341
+ 迁移后的推荐心智是:
339
342
 
340
- - `config/trigger.advanced.yaml`
343
+ - 每个模型写成一个 `Models[]`
344
+ - 路由引用 `Models[].id`
345
+ - 少写旧式 `provider,model`
341
346
 
342
- 如果你需要高级路由能力,再继续看这些文档:
347
+ ## 更多示例和文档
343
348
 
344
- - `docs/configuration-guide.md`
345
- - `docs/models-migration-guide.md`
346
- - `docs/releasing.md`
349
+ - 最小示例:`config/trigger.example.yaml`
350
+ - 高级示例:`config/trigger.advanced.yaml`
351
+ - 配置细节:`docs/configuration-guide.md`
352
+ - Models 迁移:`docs/models-migration-guide.md`
353
+ - 发布验证:`docs/releasing.md`