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