@peterwangze/claude-trigger-router 1.2.0 → 1.4.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
@@ -11,11 +11,21 @@ Claude Trigger Router 是给 Claude Code 用的本地路由代理。
11
11
  - 想在 Claude Code 外层增加配置校验、健康检查、治理观测和 UI 工作台
12
12
  - 想从 `claude-code-router` 迁移到更清晰的 `Models + Router` 配置心智
13
13
 
14
- ## v1.2.0 发布定位
14
+ ## v1.4.0 发布定位
15
15
 
16
- `v1.2.0` 是智能路由评测与治理增强版。它重点闭环多模型组合的可验证收益:用 `ctr eval --tasks` 固定任务契约,用 `ctr eval --run --models "sonnet;haiku"` 真实调用 CTR 跑多模型 A/B,再用 deterministic rubric 和质量维度解释不同模型在质量、速度、失败风险上的差异。
16
+ `v1.4.0` SmartRouter 常用体验版。它把 CTR 的智能路由从“有能力但需要理解内部机制”推进到“能复制模板、能配置候选、能看懂为什么选模、能发现切换割裂,并能按配置路径调优”。
17
17
 
18
- 这个版本不把 CTR 宣称为完整云端平台或完整自动裁判系统。LLM 裁判、人工校准、UI benchmark 摘要、托管级一键部署、集群编排和更复杂模型池策略仍是后续演进事项。完整发布边界见 [docs/release-notes-v1.2.0.md](docs/release-notes-v1.2.0.md)。
18
+ 这个版本的目标是让用户能把规则和候选模型稳定用于高频任务:`config/trigger.smart-router.yaml` 提供可复制起步模板,`/ui` 展示 SmartRouter 规则、候选、route decision 和 switch continuity summary,health routing tuning 会把慢路由、错路由、上下文窗口和切换割裂转成 `configSuggestions`。它不把 benchmark 历史看板、完整 server/cloud 托管平台或更复杂模型池策略纳入发布承诺。完整发布边界见 [docs/release-notes-v1.4.0.md](docs/release-notes-v1.4.0.md)。
19
+
20
+ ## 版本路线
21
+
22
+ 从用户使用频率看,版本演进会优先回到最常用的基础路由和 SmartRouter 体验:
23
+
24
+ - `v1.3.0`:基础路由常用体验,已收口 `Router.default` / `think` / `longContext` / `background` / `webSearch` 五槽位、doctor 诊断、UI 路由解释和 packaged smoke。
25
+ - `v1.5.0`:多模型收益运营化,继续补 benchmark 历史看板、人工校准表单和评测/真实 trace 的统一解释。
26
+ - `v1.6.0`:服务化与模型池安全体验,继续补服务端安全默认值、密钥轮换手册、主动 pool health、成本/速率元数据和更多调度策略。
27
+
28
+ 完整版本计划见 [docs/superpowers/plans/2026-05-07-core-routing-version-plan.md](docs/superpowers/plans/2026-05-07-core-routing-version-plan.md)。
19
29
 
20
30
  ## 功能概览
21
31
 
@@ -25,8 +35,8 @@ Claude Trigger Router 是给 Claude Code 用的本地路由代理。
25
35
  - **基础路由**:用 `Router.default`、`Router.think`、`Router.longContext` 等槽位指定不同任务的默认模型。
26
36
  - **SmartRouter**:先用显式规则命中高确定性任务,也可以在规则未命中时让路由模型从候选模型中自动选择。
27
37
  - **Governance 观测**:记录 trace、metrics、异常摘要和健康状态,帮助你理解路由选择和运行风险。
28
- - **路由评测**:`ctr eval --tasks` 查看固定任务契约,`ctr eval --input results.json` 离线评分,`ctr eval --run --models "sonnet;haiku"` 真实调用 CTR 做多模型 A/B
29
- - **doctor 诊断**:检查配置、服务可启动性、鉴权安全状态、模型兼容策略和可选模型探测。
38
+ - **路由评测**:`ctr eval --tasks` 查看固定任务契约,`ctr eval --input results.json` 离线评分,`ctr eval --run --models "sonnet;haiku"` 真实调用 CTR 做多模型 A/B;追加 `--judge-model` 后可调用一个 LLM 裁判模型给结果打分。
39
+ - **doctor 诊断**:检查配置、服务可启动性、基础路由槽位、上下文窗口提示、鉴权安全状态、模型兼容策略和可选模型探测。
30
40
  - **UI 工作台**:`ctr ui` 打开本地页面,查看服务上下文、远程状态、鉴权安全状态、配置草稿、compiled models、capability warnings、治理 trace、metrics 和 Health 摘要。
31
41
  - **远程状态基础**:可配置 `Runtime.remote_service`,通过 `/api/remote-status` 查看远程服务健康、compiled model 摘要和治理告警摘要。默认用户不需要配置远程模式。
32
42
 
@@ -244,6 +254,27 @@ Router:
244
254
 
245
255
  推荐所有路由字段都引用 `Models[].id`,比如上面的 `sonnet`、`reasoner`。
246
256
 
257
+ ## 基础路由五个槽位
258
+
259
+ 日常使用优先理解这五个槽位。最小可用配置只需要 `default`;当你开始接入多个模型时,再逐步补 `think`、`longContext`、`background` 和 `webSearch`。
260
+
261
+ | 槽位 | 何时触发 | 推荐放什么模型 |
262
+ |---|---|---|
263
+ | `Router.default` | 普通请求、规则未命中、其他槽位未配置时 | 稳定通用模型 |
264
+ | `Router.think` | 请求包含 `thinking` 时 | 推理能力更强的模型 |
265
+ | `Router.longContext` | 输入超过 `longContextThreshold`,或当前模型 `safe_input_tokens` 不够时 | 上下文窗口更大的模型 |
266
+ | `Router.background` | Claude Code 轻量后台模型请求时 | 便宜、快、可本地化的模型 |
267
+ | `Router.webSearch` | 请求包含 `web_search` 工具时 | 支持搜索工具或搜索结果处理稳定的模型 |
268
+
269
+ 可复制模板见 `config/trigger.routing.yaml`。它把五个槽位都写完整,并给模型补了 `metadata.context_window_tokens` / `metadata.safe_input_tokens`,方便 `ctr doctor` 和运行时提前识别大上下文请求。
270
+
271
+ 常见误区:
272
+
273
+ - 不要把 `Router.longContext` 指向比默认模型窗口更小的模型。
274
+ - 不确定某个模型是否支持 reasoning 时,先不要放进 `Router.think`;运行 `ctr doctor` 会提示能力不匹配。
275
+ - `background` 可以先不配,未配置时会回到 `default`。
276
+ - `webSearch` 不是“联网开关”,它只是 web search 请求出现时的模型槽位。
277
+
247
278
  ## 显式规则路由
248
279
 
249
280
  适合能用关键词稳定识别的任务,例如架构设计、代码审查、长文档评审。
@@ -267,6 +298,8 @@ SmartRouter:
267
298
 
268
299
  规则命中时优先使用规则指定模型;没命中时回到 `Router.default`。
269
300
 
301
+ 可复制的 SmartRouter 常用模板见 `config/trigger.smart-router.yaml`。它已经把 `coding`、`review`、`architecture`、`long_context` 和 `fast_reply` 五类高频任务写成规则,并保留 `router_model + candidates` 作为规则未命中时的智能兜底起点。
302
+
270
303
  ## 智能模型选择
271
304
 
272
305
  如果任务边界比较模糊,可以让 SmartRouter 用一个路由模型从候选模型中选择:
@@ -369,6 +402,7 @@ Health 摘要下方的 action 可以直接把 trace 表切到对应排查视图
369
402
  ctr eval --tasks
370
403
  ctr eval --input results.json
371
404
  ctr eval --run --models "sonnet;haiku"
405
+ ctr eval --run --models "sonnet;haiku" --judge-model sonnet
372
406
  ```
373
407
 
374
408
  输入文件可以是数组,也可以是 `{ "results": [...] }`:
@@ -379,12 +413,27 @@ ctr eval --run --models "sonnet;haiku"
379
413
  "taskId": "coding_fix",
380
414
  "model": "provider,model",
381
415
  "output": "模型输出文本",
382
- "latencyMs": 1200
416
+ "latencyMs": 1200,
417
+ "humanScore": 0.9,
418
+ "judgeScore": 0.85,
419
+ "calibrationNotes": "人工或外部 LLM 裁判的可选说明",
420
+ "judgeFindings": ["可选裁判发现"]
383
421
  }
384
422
  ]
385
423
  ```
386
424
 
387
- `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,不等同于完整人工或 LLM 裁判评测。
425
+ `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,不等同于人工复核。
426
+
427
+ 如果你已经有人工复核或外部 LLM 裁判结果,可以在输入里补 `humanScore` / `judgeScore`,范围是 `0..1`。报告会生成 calibration summary,并标出 deterministic rubric 与人工/裁判结果差异较大的任务,帮助维护者判断某个模型组合是否真的带来质量提升。
428
+
429
+ 也可以让 CTR 自动调用一个裁判模型:
430
+
431
+ ```bash
432
+ ctr eval --input results.json --judge-model sonnet --base-url http://127.0.0.1:5678 --api-key <client-or-bootstrap-key>
433
+ ctr eval --run --models "sonnet;haiku" --judge-model sonnet --base-url http://127.0.0.1:5678 --api-key <client-or-bootstrap-key>
434
+ ```
435
+
436
+ 裁判模型会通过同一个 CTR `/v1/messages` 入口收到固定 JSON rubric 提示,并返回 `judgeScore`、`judgeFindings` 和 `calibrationNotes`。如果裁判响应不可解析、超时或返回 HTTP 错误,报告会记录 `judge_error`,但不会把失败裁判误算进 calibration score。
388
437
 
389
438
  如果本机或远端 CTR 已启动,也可以显式自动跑固定任务集:
390
439
 
@@ -392,7 +441,7 @@ ctr eval --run --models "sonnet;haiku"
392
441
  ctr eval --run --models "sonnet;haiku" --base-url http://127.0.0.1:5678 --api-key <client-or-bootstrap-key>
393
442
  ```
394
443
 
395
- `--run` 会对每个模型逐个调用 `POST /v1/messages`,默认 `--concurrency 2`、`--timeout-ms 30000`、`--max-tokens 768`。多个模型用分号 `;` 分隔,因为 legacy 模型引用本身可能包含逗号。该模式会真实调用模型服务并消耗上游额度。
444
+ `--run` 会对每个模型逐个调用 `POST /v1/messages`,默认 `--concurrency 2`、`--timeout-ms 30000`、`--max-tokens 768`。多个模型用分号 `;` 分隔,因为 legacy 模型引用本身可能包含逗号。追加 `--judge-max-tokens 256` 可调整裁判输出长度。该模式会真实调用模型服务并消耗上游额度;启用 `--judge-model` 时会额外消耗裁判模型额度。
396
445
 
397
446
  如果服务没有启动,`ctr ui` 会提示先运行:
398
447
 
@@ -424,6 +473,8 @@ ctr doctor
424
473
  - 当前监听地址;server/cloud 会提示远程客户端应设置的 `ANTHROPIC_BASE_URL`
425
474
  - 当前鉴权状态;如果 server/cloud 或公网监听没有配置 `APIKEY` / managed key,会提示安全风险
426
475
  - 如果启用了 `Runtime.remote_service`,会单独检查远程服务可达和 ready 状态
476
+ - 基础路由槽位:`Router.default` / `think` / `longContext` / `background` / `webSearch` 是否能解析到模型
477
+ - 上下文窗口提示:槽位模型是否缺少 `metadata.context_window_tokens` / `metadata.safe_input_tokens`,以及 `Router.longContext` 是否真的比默认模型更适合大上下文
427
478
  - 模型兼容策略和请求编译方式
428
479
  - capability hint 可能触发的运行时降级
429
480
  - 在你确认后,对模型发送最小探测请求
@@ -481,6 +532,7 @@ GET /api/auth/audit
481
532
  | `ctr eval --tasks` | 查看固定评测任务、prompt 和 rubric |
482
533
  | `ctr eval --input results.json` | 离线固定任务集评测 |
483
534
  | `ctr eval --run --models "sonnet;haiku"` | 自动调用 CTR 后评测固定任务集 |
535
+ | `ctr eval --run --models "sonnet;haiku" --judge-model sonnet` | 自动执行并追加 LLM 裁判校准 |
484
536
  | `ctr ui` | 打开本地 UI 工作台 |
485
537
  | `ctr version` | 查看版本 |
486
538
  | `ctr upgrade` | 升级 |
@@ -508,6 +560,8 @@ setup 会自动探测旧配置,并优先提供迁移选项。迁移后的配
508
560
  ## 更多示例和文档
509
561
 
510
562
  - 最小示例:`config/trigger.example.yaml`
563
+ - 基础路由五槽位示例:`config/trigger.routing.yaml`
564
+ - SmartRouter 常用规则示例:`config/trigger.smart-router.yaml`
511
565
  - 高级示例:`config/trigger.advanced.yaml`
512
566
  - 配置细节:`docs/configuration-guide.md`
513
567
  - Models 迁移:`docs/models-migration-guide.md`
@@ -0,0 +1,67 @@
1
+ # Claude Trigger Router 基础路由配置示例
2
+ # 用于理解 Router.default / think / longContext / background / webSearch 五个常用槽位。
3
+ # 复制到 ~/.claude-trigger-router/config.yaml 后,先替换 API Key 和上游模型名。
4
+
5
+ HOST: "127.0.0.1"
6
+ PORT: 5678
7
+
8
+ LOG: true
9
+ LOG_LEVEL: "debug"
10
+
11
+ Models:
12
+ - id: sonnet
13
+ api: "https://openrouter.ai/api/v1/chat/completions"
14
+ key: "sk-xxx"
15
+ interface: "openai"
16
+ model: "anthropic/claude-sonnet-4"
17
+ thinking: "auto"
18
+ metadata:
19
+ context_window_tokens: 200000
20
+ safe_input_tokens: 180000
21
+
22
+ - id: reasoner
23
+ api: "https://api.deepseek.com/chat/completions"
24
+ key: "sk-xxx"
25
+ interface: "openai"
26
+ model: "deepseek-reasoner"
27
+ thinking: "high"
28
+ metadata:
29
+ context_window_tokens: 64000
30
+ safe_input_tokens: 56000
31
+
32
+ - id: long_context
33
+ api: "https://openrouter.ai/api/v1/chat/completions"
34
+ key: "sk-xxx"
35
+ interface: "openai"
36
+ model: "google/gemini-2.5-pro"
37
+ thinking: "auto"
38
+ metadata:
39
+ context_window_tokens: 1000000
40
+ safe_input_tokens: 900000
41
+
42
+ - id: fast_background
43
+ api: "http://localhost:11434/v1/chat/completions"
44
+ key: "ollama"
45
+ interface: "openai"
46
+ model: "qwen2.5-coder:latest"
47
+ thinking: "off"
48
+ metadata:
49
+ context_window_tokens: 32768
50
+ safe_input_tokens: 24000
51
+
52
+ Router:
53
+ # 默认槽位:普通对话、代码生成、规则未命中时使用。
54
+ default: "sonnet"
55
+
56
+ # 思考槽位:请求包含 thinking 时优先使用。
57
+ think: "reasoner"
58
+
59
+ # 长上下文槽位:输入超过阈值,或当前模型 safe_input_tokens 不够时使用。
60
+ longContext: "long_context"
61
+ longContextThreshold: 60000
62
+
63
+ # 后台槽位:Claude Code 轻量后台模型请求时使用。
64
+ background: "fast_background"
65
+
66
+ # 联网搜索槽位:请求包含 web_search 工具时使用。
67
+ webSearch: "sonnet"
@@ -0,0 +1,213 @@
1
+ # Claude Trigger Router SmartRouter rule template
2
+ # 复制到 ~/.claude-trigger-router/config.yaml 后,先替换 API Key、模型名和本地模型地址。
3
+ # 这个模板面向 v1.4.0 的高频智能路由场景:
4
+ # coding / review / architecture / long context / fast reply。
5
+
6
+ HOST: "127.0.0.1"
7
+ PORT: 5678
8
+
9
+ LOG: true
10
+ LOG_LEVEL: "debug"
11
+
12
+ Models:
13
+ - id: sonnet
14
+ api: "https://openrouter.ai/api/v1/chat/completions"
15
+ key: "sk-xxx"
16
+ interface: "openai"
17
+ model: "anthropic/claude-sonnet-4"
18
+ thinking: "auto"
19
+ metadata:
20
+ context_window_tokens: 200000
21
+ safe_input_tokens: 180000
22
+
23
+ - id: reviewer
24
+ api: "https://openrouter.ai/api/v1/chat/completions"
25
+ key: "sk-xxx"
26
+ interface: "openai"
27
+ model: "anthropic/claude-sonnet-4"
28
+ thinking: "auto"
29
+ metadata:
30
+ context_window_tokens: 200000
31
+ safe_input_tokens: 180000
32
+
33
+ - id: architect
34
+ api: "https://openrouter.ai/api/v1/chat/completions"
35
+ key: "sk-xxx"
36
+ interface: "openai"
37
+ model: "anthropic/claude-opus-4"
38
+ thinking: "high"
39
+ metadata:
40
+ context_window_tokens: 200000
41
+ safe_input_tokens: 180000
42
+
43
+ - id: long_context
44
+ api: "https://openrouter.ai/api/v1/chat/completions"
45
+ key: "sk-xxx"
46
+ interface: "openai"
47
+ model: "google/gemini-2.5-pro"
48
+ thinking: "auto"
49
+ metadata:
50
+ context_window_tokens: 1000000
51
+ safe_input_tokens: 900000
52
+
53
+ - id: fast_background
54
+ api: "http://localhost:11434/v1/chat/completions"
55
+ key: "ollama"
56
+ interface: "openai"
57
+ model: "qwen2.5-coder:latest"
58
+ thinking: "off"
59
+ metadata:
60
+ context_window_tokens: 32000
61
+ safe_input_tokens: 24000
62
+
63
+ Router:
64
+ default: "sonnet"
65
+ think: "architect"
66
+ longContext: "long_context"
67
+ longContextThreshold: 60000
68
+ background: "fast_background"
69
+ webSearch: "sonnet"
70
+
71
+ SmartRouter:
72
+ enabled: true
73
+ analysis_scope: "last_message"
74
+ rules:
75
+ - name: "long_context"
76
+ priority: 95
77
+ enabled: true
78
+ description: "长文档、长上下文、全文总结或需要大窗口承载的请求"
79
+ patterns:
80
+ - type: exact
81
+ keywords:
82
+ - "长上下文"
83
+ - "长文档"
84
+ - "全文总结"
85
+ - "large context"
86
+ - "long context"
87
+ - type: regex
88
+ pattern: "(长上下文|长文档|全文总结|long context|large context)"
89
+ model: "long_context"
90
+ semantic_profile:
91
+ prototype: "长文档 长上下文 全文 总结 大窗口 large context long document"
92
+
93
+ - name: "architecture"
94
+ priority: 90
95
+ enabled: true
96
+ description: "架构设计、系统设计、技术方案和模块拆分"
97
+ patterns:
98
+ - type: exact
99
+ keywords:
100
+ - "架构设计"
101
+ - "系统设计"
102
+ - "技术方案"
103
+ - "模块拆分"
104
+ - "architecture"
105
+ - "system design"
106
+ - type: regex
107
+ pattern: "(架构|系统设计|技术方案|模块拆分|architecture|system design)"
108
+ model: "architect"
109
+ semantic_profile:
110
+ prototype: "架构 系统设计 技术方案 模块边界 演进路线 architecture system design"
111
+
112
+ - name: "review"
113
+ priority: 80
114
+ enabled: true
115
+ description: "代码审查、风险检查、安全检查和回归风险评估"
116
+ patterns:
117
+ - type: exact
118
+ keywords:
119
+ - "代码审查"
120
+ - "code review"
121
+ - "review code"
122
+ - "检查代码"
123
+ - "安全风险"
124
+ - "回归风险"
125
+ - type: regex
126
+ pattern: "(代码|code).{0,8}(审查|review|检查|审核)"
127
+ model: "reviewer"
128
+ semantic_profile:
129
+ prototype: "代码审查 风险 安全 回归 regression review bug finding"
130
+
131
+ - name: "coding"
132
+ priority: 70
133
+ enabled: true
134
+ description: "实现功能、修复 bug、重构代码和补测试"
135
+ patterns:
136
+ - type: exact
137
+ keywords:
138
+ - "实现"
139
+ - "写代码"
140
+ - "修复 bug"
141
+ - "补测试"
142
+ - "implement"
143
+ - "refactor"
144
+ - "feature"
145
+ - type: regex
146
+ pattern: "(实现|编写|修复|重构|补测试|implement|refactor|feature|bug)"
147
+ model: "sonnet"
148
+ semantic_profile:
149
+ prototype: "实现 功能 修复 bug 重构 单元测试 编程 coding implementation"
150
+
151
+ - name: "fast_reply"
152
+ priority: 10
153
+ enabled: true
154
+ description: "简单问题、快速答复、短答案和低成本后台任务"
155
+ patterns:
156
+ - type: exact
157
+ keywords:
158
+ - "快速回答"
159
+ - "简单回答"
160
+ - "不用详细"
161
+ - "quick"
162
+ - "short answer"
163
+ - "simple"
164
+ - type: regex
165
+ pattern: "(快速回答|简单回答|不用详细|quick|short answer|simple)"
166
+ model: "fast_background"
167
+ semantic_profile:
168
+ prototype: "快速 简单 短答案 低成本 fast quick short answer simple"
169
+
170
+ router_model: "sonnet"
171
+ candidates:
172
+ - model: "sonnet"
173
+ description: "通用 coding、日常调试、多轮任务和默认 Claude Code 体验"
174
+ - model: "reviewer"
175
+ description: "代码审查、风险识别、安全检查和回归影响判断"
176
+ - model: "architect"
177
+ description: "架构设计、系统方案、复杂权衡和高质量长推理"
178
+ - model: "long_context"
179
+ description: "长文档、超长上下文、全文总结和大规格输入"
180
+ - model: "fast_background"
181
+ description: "快速短答、低成本后台任务和简单重复问题"
182
+ cache_ttl: 600000
183
+ max_tokens: 256
184
+ fallback: "default"
185
+ router_hint:
186
+ include_task_summary: true
187
+ include_top_route_candidates: true
188
+
189
+ sticky:
190
+ enabled: true
191
+ session_ttl_ms: 3600000
192
+ fingerprint_similarity_threshold: 0.82
193
+ break_on_explicit_route: true
194
+ # Claude Code 的请求本身会携带会话上下文。
195
+ # 只有明确需要跨模型交接摘要,并接受额外 summarizer 调用时,再开启 alignment。
196
+ alignment:
197
+ enabled: false
198
+ summarizer_model: "sonnet"
199
+ max_summary_tokens: 256
200
+
201
+ semantic:
202
+ enabled: true
203
+ mode: "embedding"
204
+ threshold: 0.2
205
+ prototypes:
206
+ coding: "实现 功能 修复 bug 重构 单元测试 编程 coding implementation"
207
+ review: "代码审查 风险 安全 回归 regression review bug finding"
208
+ architecture: "架构 系统设计 技术方案 模块边界 演进路线 architecture system design"
209
+ long_context: "长文档 长上下文 全文 总结 大窗口 large context long document"
210
+ fast_reply: "快速 简单 短答案 低成本 fast quick short answer simple"
211
+
212
+ Governance:
213
+ enabled: true