@peterwangze/claude-trigger-router 1.0.4 → 1.0.6

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,296 +1,332 @@
1
- # Claude Trigger Router
2
-
3
- 面向 Claude Code 的本地模型路由代理。它接管 Claude Code 发出的上游请求,再按你的规则和路由策略分发到不同模型。
4
-
5
- 核心目标只有两件事:
6
-
7
- - 让你用 `Models[].id` 管理模型,而不是到处手写 `provider,model`
8
- - 让你只关心模型接入信息,消息格式转换由路由层统一处理
9
-
10
- ## 快速开始
11
-
12
- ### 1. 安装
13
-
14
- ```bash
15
- npm install -g @peterwangze/claude-trigger-router
16
- ```
17
-
18
- 如果 npm registry 还没有同步到最新公开包,或者当前包尚未完成首次公开发布,可以先临时改用 GitHub 安装:
19
-
20
- ```bash
21
- npm install -g github:peterwangze/claude-trigger-router
22
- ```
23
-
24
- ### 2. 运行初始化向导
25
-
26
- ```bash
27
- ctr setup
28
- ```
29
-
30
- `ctr setup` 会:
31
-
32
- - 优先检查当前配置是否可直接复用
33
- - 检测旧版 `~/.ccr/config.yaml` 或 `~/.claude-code-router/config.yaml` 并优先提供迁移
34
- - 在需要新建时,先确认接入方式与 provider 预设,再带出默认模型和默认模型 ID 供确认
35
- - 只生成最小可用配置(`Models + Router.default`),高级路由稍后再补
36
- - 保存配置后启动服务并进入 Claude Code
37
-
38
- ### 3. 使用最小配置
39
-
40
- 如果你更喜欢手动编辑,也可以先执行:
41
-
42
- ```bash
43
- ctr init
44
- ```
45
-
46
- 然后把 `~/.claude-trigger-router/config.yaml` 调整为:
47
-
48
- ```yaml
49
- Models:
50
- - id: sonnet
51
- api: "https://openrouter.ai/api/v1/chat/completions"
52
- key: "sk-xxx"
53
- interface: "openai"
54
- model: "anthropic/claude-sonnet-4"
55
- thinking: "auto"
56
-
57
- Router:
58
- default: "sonnet"
59
- ```
60
-
61
- ### 4. 启动服务
62
-
63
- ```bash
64
- ctr start
65
- ```
66
-
67
- 确认配置可用后,可改为后台运行:
68
-
69
- ```bash
70
- ctr start --daemon
71
- ```
72
-
73
- ### 5. 启动 Claude Code
74
-
75
- ```bash
76
- ctr code
77
- ```
78
-
79
- `ctr code` 会检查目标端口上是否真的是 Claude Trigger Router,然后再注入 `ANTHROPIC_BASE_URL` 并拉起 Claude Code。
80
-
81
- ## 新配置心智
82
-
83
- 推荐始终从 `Models` 出发。每个模型接入项描述的是“这个模型怎么连”,而不是“内部 provider 怎么拼”。
84
-
85
- 每个模型的最少必填字段是:
86
-
87
- | 字段 | 是否必填 | 说明 |
88
- |------|----------|------|
89
- | `id` | 必填 | 模型唯一标识,供 Router / TriggerRouter / SmartRouter / Governance 引用 |
90
- | `api` | 必填 | 上游接口地址 |
91
- | `key` | 必填 | 对应 API Key |
92
- | `interface` | 必填 | 接口类型,当前支持 `openai` / `anthropic` |
93
- | `model` | 必填 | 目标模型名 |
94
- | `thinking` | 可选 | 思考强度,推荐 `off / auto / on / low / medium / high` |
95
-
96
- 额外可选项:
97
-
98
- - `metadata.vendor_hint`
99
- - `metadata.supports_reasoning`
100
- - `metadata.supports_tools`
101
- - `metadata.supports_images`
102
-
103
- 兼容性说明:
104
-
105
- - 当前实现仍兼容旧字段 `api_base_url` / `api_key` / `protocol`
106
- - 保存和对外展示优先使用新字段 `api` / `key` / `interface`
107
- - `thinking` 既支持简写字符串,也支持 `{ mode, effort, budget_tokens }` 对象
108
-
109
- ## 接口类型怎么选
110
-
111
- `interface` 只表示目标上游期望的消息协议类型,不等于“厂商名”。
112
-
113
- 常见映射如下:
114
-
115
- | 场景 | `api` 示例 | `interface` |
116
- |------|------------|-------------|
117
- | OpenAI 官方 | `https://api.openai.com/v1/chat/completions` | `openai` |
118
- | Anthropic 官方 | `https://api.anthropic.com/v1/messages` | `anthropic` |
119
- | OpenRouter | `https://openrouter.ai/api/v1/chat/completions` | `openai` |
120
- | DeepSeek | `https://api.deepseek.com/chat/completions` | `openai` |
121
- | SiliconFlow / 本地兼容服务 | 对应兼容地址 | `openai` |
122
-
123
- 路由层会按 `interface` 把统一消息转换成目标上游请求体。
124
-
125
- 当前统一转换已覆盖:
126
-
127
- - 文本消息
128
- - 图片输入
129
- - tool call / tool result
130
- - `thinking`
131
-
132
- 如果目标模型声明不支持某项能力,路由会做显式降级,并给出 warning。
133
-
134
- ## 常见路由配置
135
-
136
- ### 单模型
137
-
138
- ```yaml
139
- Models:
140
- - id: sonnet
141
- api: "https://openrouter.ai/api/v1/chat/completions"
142
- key: "sk-xxx"
143
- interface: "openai"
144
- model: "anthropic/claude-sonnet-4"
145
-
146
- Router:
147
- default: "sonnet"
148
- ```
149
-
150
- ### 规则路由
151
-
152
- ```yaml
153
- Models:
154
- - id: sonnet
155
- api: "https://openrouter.ai/api/v1/chat/completions"
156
- key: "sk-xxx"
157
- interface: "openai"
158
- model: "anthropic/claude-sonnet-4"
159
-
160
- - id: opus
161
- api: "https://openrouter.ai/api/v1/chat/completions"
162
- key: "sk-xxx"
163
- interface: "openai"
164
- model: "anthropic/claude-opus-4"
165
-
166
- Router:
167
- default: "sonnet"
168
-
169
- TriggerRouter:
170
- enabled: true
171
- analysis_scope: "last_message"
172
- rules:
173
- - name: "architecture"
174
- priority: 90
175
- enabled: true
176
- patterns:
177
- - type: exact
178
- keywords: ["架构设计", "system design"]
179
- model: "opus"
180
- ```
181
-
182
- ### 规则 + 智能路由
183
-
184
- ```yaml
185
- Models:
186
- - id: sonnet
187
- api: "https://openrouter.ai/api/v1/chat/completions"
188
- key: "sk-xxx"
189
- interface: "openai"
190
- model: "anthropic/claude-sonnet-4"
191
-
192
- - id: reasoner
193
- api: "https://api.deepseek.com/chat/completions"
194
- key: "sk-xxx"
195
- interface: "openai"
196
- model: "deepseek-reasoner"
197
- thinking: "high"
198
-
199
- Router:
200
- default: "sonnet"
201
- think: "reasoner"
202
-
203
- SmartRouter:
204
- enabled: true
205
- router_model: "sonnet"
206
- candidates:
207
- - model: "sonnet"
208
- description: "通用编程与调试"
209
- - model: "reasoner"
210
- description: "复杂推理与严谨分析"
211
- ```
212
-
213
- 完整示例见 `config/trigger.example.yaml`。
214
-
215
- ## warning 与 capability hint
216
-
217
- 如果你已经知道某个模型不支持完整能力,可以在配置里显式声明:
218
-
219
- ```yaml
220
- Models:
221
- - id: restricted
222
- api: "https://api.example.com/v1/chat/completions"
223
- key: "sk-xxx"
224
- interface: "openai"
225
- model: "vendor/text-only"
226
- thinking: "high"
227
- metadata:
228
- supports_reasoning: false
229
- supports_tools: false
230
- supports_images: false
231
- ```
232
-
233
- 当前行为:
234
-
235
- - `supports_reasoning: false` 时,请求里的 `thinking` 会被忽略
236
- - `supports_tools: false` 时,工具定义和 tool call/result 会退化为文本
237
- - `supports_images: false` 时,图片块会退化为文本说明
238
-
239
- 这些信息会出现在:
240
-
241
- - `ctr setup` 的配置提示
242
- - `POST /api/config` 返回的 `warnings`
243
- - `GET /api/models/compiled`
244
- - `/ui` 的 Draft Config Preview 和 Capability Warnings
245
-
246
- ## `/ui` 可以做什么
247
-
248
- 访问 `http://127.0.0.1:5678/ui` 后,可以直接:
249
-
250
- - 编辑 `Models` 草稿
251
- - 预览 compiled model map
252
- - 查看 `errors / warnings / capabilityWarnings`
253
- - 保存当前草稿配置
254
- - 对部分 warning 执行快捷修正
255
-
256
- `/ui` 的新增模型卡片和 Provider template 现在也共用同一份 preset 目录,不同模板会带出各自的默认模型、示例项和 placeholder。
257
-
258
- 适合用来做配置校准,但主线配置入口仍然建议优先用 `ctr setup` 或直接编辑配置文件。
259
-
260
- ## 旧配置迁移
261
-
262
- 如果你还在使用旧的 `Providers + provider,model` 配置:
263
-
264
- - 当前版本仍然兼容旧格式
265
- - `ctr setup` 会优先尝试迁移旧 `ccr` / `claude-code-router` 配置
266
- - 路由字段推荐逐步改成直接引用 `Models[].id`
267
-
268
- 迁移后的核心变化是:
269
-
270
- - `provider,model` -> `modelId`
271
- - `api_base_url` -> `api`
272
- - `api_key` -> `key`
273
- - `protocol` -> `interface`
274
-
275
- 详见 `docs/models-migration-guide.md`。
276
-
277
- ## 常用命令
278
-
279
- ```bash
280
- ctr setup
281
- ctr init
282
- ctr version
283
- ctr upgrade
284
- ctr start
285
- ctr start --daemon
286
- ctr stop
287
- ctr restart --daemon
288
- ctr status
289
- ctr code
290
- ```
291
-
292
- ## 推荐阅读
293
-
294
- - 配置模板与分工建议:`docs/configuration-guide.md`
295
- - 旧配置迁移:`docs/models-migration-guide.md`
296
- - 完整示例:`config/trigger.example.yaml`
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
+ - 预览 capability 配置可能触发的运行时降级,例如 thinking 忽略、工具降级为文本、图片降级为文本
248
+ - 在征得你同意后,对配置中的模型发送最小探测请求,确认模型是否真实可用
249
+
250
+ 其中模型探测会消耗少量额度,所以 doctor 会先征求你的确认。探测失败时,doctor 会优先给出面向用户的失败说明和处理建议,再保留原始远端报错供继续排查。
251
+
252
+ ## 推荐使用顺序
253
+
254
+ 首次使用:
255
+
256
+ ```bash
257
+ ctr help
258
+ ctr version
259
+ ctr setup
260
+ ctr status
261
+ ctr code
262
+ ```
263
+
264
+ 如果你更喜欢手动配置:
265
+
266
+ ```bash
267
+ ctr init --force
268
+ ctr start
269
+ ctr code
270
+ ```
271
+
272
+ 后台运行:
273
+
274
+ ```bash
275
+ ctr start --daemon
276
+ ctr status
277
+ ctr ui
278
+ ctr code
279
+ ```
280
+
281
+ 补充说明:
282
+
283
+ - `ctr restart` 当前默认按后台模式重启
284
+ - `ctr restart --daemon` 只是更显式的等价写法
285
+
286
+ ## 旧配置迁移
287
+
288
+ 如果你之前在用 `claude-code-router`:
289
+
290
+ - `ctr setup` 会自动探测旧配置
291
+ - 会优先提供迁移选项
292
+ - 迁移后的新配置会落到 `~/.claude-trigger-router/config.yaml`
293
+
294
+ 当前推荐的新配置心智是:
295
+
296
+ - 每个模型直接写成一个 `Models[]` 项
297
+ - 路由规则直接引用 `Models[].id`
298
+ - 不再让用户到处手写 `provider,model`
299
+
300
+ ## UI
301
+
302
+ 运行:
303
+
304
+ ```bash
305
+ ctr ui
306
+ ```
307
+
308
+ 当前会打开:
309
+
310
+ ```text
311
+ http://127.0.0.1:5678/ui
312
+ ```
313
+
314
+ 如果本地服务还没启动,CLI 会先提醒你运行 `ctr start` 或 `ctr start --daemon`。
315
+
316
+ 它适合做配置查看和调试,但主线入口仍然建议优先使用 `ctr setup`。
317
+
318
+ ## 示例配置
319
+
320
+ 最小示例:
321
+
322
+ - `config/trigger.example.yaml`
323
+
324
+ 完整高级示例:
325
+
326
+ - `config/trigger.advanced.yaml`
327
+
328
+ 如果你需要高级路由能力,再继续看这些文档:
329
+
330
+ - `docs/configuration-guide.md`
331
+ - `docs/models-migration-guide.md`
332
+ - `docs/releasing.md`