@peterwangze/claude-trigger-router 1.1.2 → 1.3.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,6 +11,22 @@ Claude Trigger Router 是给 Claude Code 用的本地路由代理。
11
11
  - 想在 Claude Code 外层增加配置校验、健康检查、治理观测和 UI 工作台
12
12
  - 想从 `claude-code-router` 迁移到更清晰的 `Models + Router` 配置心智
13
13
 
14
+ ## v1.3.0 发布定位
15
+
16
+ `v1.3.0` 是基础路由常用体验版。它把用户每天最常用的 `Router.default` / `think` / `longContext` / `background` / `webSearch` 五个槽位收口到可复制模板、README 使用说明、`ctr doctor` 诊断、`/ui` 路由解释和 packaged smoke 验收里。
17
+
18
+ 这个版本的目标是让新用户能完成基础分流配置,并能看懂当前请求为什么选中某个模型;它不把 SmartRouter 完整模板、benchmark 历史看板、托管级一键部署或更复杂模型池策略纳入发布承诺。完整发布边界见 [docs/release-notes-v1.3.0.md](docs/release-notes-v1.3.0.md)。
19
+
20
+ ## 后续路线
21
+
22
+ 从用户使用频率看,后续演进会优先回到最常用的基础路由和 SmartRouter 体验:
23
+
24
+ - `v1.4.0`:SmartRouter 常用体验,重点收口规则模板、候选模型配置、路由决策解释、sticky/alignment 切换体感和调优建议。
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)。
29
+
14
30
  ## 功能概览
15
31
 
16
32
  - **本地代理服务**:默认监听 `127.0.0.1:5678`,接管 Claude Code 上游请求。
@@ -19,7 +35,8 @@ Claude Trigger Router 是给 Claude Code 用的本地路由代理。
19
35
  - **基础路由**:用 `Router.default`、`Router.think`、`Router.longContext` 等槽位指定不同任务的默认模型。
20
36
  - **SmartRouter**:先用显式规则命中高确定性任务,也可以在规则未命中时让路由模型从候选模型中自动选择。
21
37
  - **Governance 观测**:记录 trace、metrics、异常摘要和健康状态,帮助你理解路由选择和运行风险。
22
- - **doctor 诊断**:检查配置、服务可启动性、鉴权安全状态、模型兼容策略和可选模型探测。
38
+ - **路由评测**:`ctr eval --tasks` 查看固定任务契约,`ctr eval --input results.json` 离线评分,`ctr eval --run --models "sonnet;haiku"` 真实调用 CTR 做多模型 A/B;追加 `--judge-model` 后可调用一个 LLM 裁判模型给结果打分。
39
+ - **doctor 诊断**:检查配置、服务可启动性、基础路由槽位、上下文窗口提示、鉴权安全状态、模型兼容策略和可选模型探测。
23
40
  - **UI 工作台**:`ctr ui` 打开本地页面,查看服务上下文、远程状态、鉴权安全状态、配置草稿、compiled models、capability warnings、治理 trace、metrics 和 Health 摘要。
24
41
  - **远程状态基础**:可配置 `Runtime.remote_service`,通过 `/api/remote-status` 查看远程服务健康、compiled model 摘要和治理告警摘要。默认用户不需要配置远程模式。
25
42
 
@@ -87,8 +104,9 @@ ctr start --daemon
87
104
  - 如果配置了 `HOST: "0.0.0.0"` 但没有设置 `APIKEY` 或 active managed key,运行时会为了安全强制只监听 `127.0.0.1`。
88
105
  - `APIKEY` 定位为 bootstrap/admin key;服务端启动后用它调用 `POST /api/auth/keys` 生成给远程使用者的 managed key。
89
106
  - 远程日常 token 推荐同时授予 `client + read-only`:`client` 用于模型调用,`read-only` 用于 ready/status、compiled models 和 governance 观测接口。
90
- - `admin` key 才能访问 `/ui`、配置保存、重启、auth 管理和治理写操作。列表接口只返回 key 前后缀,secret 只在创建时返回一次。
91
- - managed key 支持过期、撤销和 `quota.request_limit` / `quota.token_limit` / `quota.window_seconds`;窗口配额超限时 429 会返回 `quota.windowResetAt` 和 `Retry-After`。
107
+ - `admin` key 才能访问 `/ui`、配置保存和 auth 管理。列表接口只返回 key 前后缀,secret 只在创建时返回一次。
108
+ - `operator` key 用于日常运维写操作,例如重启、治理指标快照/定时快照、异常阈值和归档删除;它不能读取配置、保存配置或管理 auth key。
109
+ - managed key 支持过期、撤销和 `quota.request_limit` / `quota.token_limit` / `quota.window_seconds`;窗口配额会持久化到本地状态文件,超限时 429 会返回 `quota.windowResetAt` 和 `Retry-After`。
92
110
  - `GET /api/service-info` 会返回脱敏的 `auth` / `security` 摘要和 quota 用量;`GET /api/auth/audit` 可用 admin key 查看最近鉴权允许/拒绝记录。
93
111
  - 公网入口仍建议放在 HTTPS 反向代理之后;远程浏览器访问 UI 时建议使用本地隧道、内网访问,或由反向代理处理认证。
94
112
 
@@ -236,6 +254,27 @@ Router:
236
254
 
237
255
  推荐所有路由字段都引用 `Models[].id`,比如上面的 `sonnet`、`reasoner`。
238
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
+
239
278
  ## 显式规则路由
240
279
 
241
280
  适合能用关键词稳定识别的任务,例如架构设计、代码审查、长文档评审。
@@ -295,6 +334,15 @@ Models:
295
334
  supports_reasoning: false
296
335
  supports_tools: false
297
336
  supports_images: false
337
+
338
+ - id: long_context
339
+ api: "https://api.example.com/v1/messages"
340
+ key: "sk-xxx"
341
+ interface: "anthropic"
342
+ model: "vendor/long-context"
343
+ metadata:
344
+ context_window_tokens: 200000
345
+ safe_input_tokens: 180000
298
346
  ```
299
347
 
300
348
  当前行为:
@@ -302,8 +350,10 @@ Models:
302
350
  - `supports_reasoning: false`:忽略 `thinking`
303
351
  - `supports_tools: false`:工具调用退化为文本表达
304
352
  - `supports_images: false`:图片输入退化为文本描述
353
+ - `context_window_tokens`:模型总上下文窗口;路由会用 `input + max_tokens + thinking budget` 做容量保护
354
+ - `safe_input_tokens`:建议输入上限;当前请求超过已选模型上限时,会优先切到 `Router.longContext`
305
355
 
306
- 不确定时可以先不配,等主路径跑通后再补。
356
+ 多模型上下文大小不一致时,建议给小窗口模型和长上下文模型都补上这两个字段,并配置 `Router.longContext`。不确定时可以先不配,等主路径跑通后再补;未声明上下文窗口的模型会保持原有兼容行为。
307
357
 
308
358
  ## UI 工作台
309
359
 
@@ -344,6 +394,53 @@ http://127.0.0.1:5678/ui
344
394
 
345
395
  Health 摘要下方的 action 可以直接把 trace 表切到对应排查视图:cascade action 会筛选 `cascadeTriggered=true`,shadow action 会筛选 `shadowChecked=true`,其他 action 会回到近期 trace。
346
396
 
397
+ 如果你想比较不同模型组合在固定任务上的质量和速度,可以先把多模型输出整理成 JSON,再运行离线评测:
398
+
399
+ ```bash
400
+ ctr eval --tasks
401
+ ctr eval --input results.json
402
+ ctr eval --run --models "sonnet;haiku"
403
+ ctr eval --run --models "sonnet;haiku" --judge-model sonnet
404
+ ```
405
+
406
+ 输入文件可以是数组,也可以是 `{ "results": [...] }`:
407
+
408
+ ```json
409
+ [
410
+ {
411
+ "taskId": "coding_fix",
412
+ "model": "provider,model",
413
+ "output": "模型输出文本",
414
+ "latencyMs": 1200,
415
+ "humanScore": 0.9,
416
+ "judgeScore": 0.85,
417
+ "calibrationNotes": "人工或外部 LLM 裁判的可选说明",
418
+ "judgeFindings": ["可选裁判发现"]
419
+ }
420
+ ]
421
+ ```
422
+
423
+ `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,不等同于人工复核。
424
+
425
+ 如果你已经有人工复核或外部 LLM 裁判结果,可以在输入里补 `humanScore` / `judgeScore`,范围是 `0..1`。报告会生成 calibration summary,并标出 deterministic rubric 与人工/裁判结果差异较大的任务,帮助维护者判断某个模型组合是否真的带来质量提升。
426
+
427
+ 也可以让 CTR 自动调用一个裁判模型:
428
+
429
+ ```bash
430
+ ctr eval --input results.json --judge-model sonnet --base-url http://127.0.0.1:5678 --api-key <client-or-bootstrap-key>
431
+ ctr eval --run --models "sonnet;haiku" --judge-model sonnet --base-url http://127.0.0.1:5678 --api-key <client-or-bootstrap-key>
432
+ ```
433
+
434
+ 裁判模型会通过同一个 CTR `/v1/messages` 入口收到固定 JSON rubric 提示,并返回 `judgeScore`、`judgeFindings` 和 `calibrationNotes`。如果裁判响应不可解析、超时或返回 HTTP 错误,报告会记录 `judge_error`,但不会把失败裁判误算进 calibration score。
435
+
436
+ 如果本机或远端 CTR 已启动,也可以显式自动跑固定任务集:
437
+
438
+ ```bash
439
+ ctr eval --run --models "sonnet;haiku" --base-url http://127.0.0.1:5678 --api-key <client-or-bootstrap-key>
440
+ ```
441
+
442
+ `--run` 会对每个模型逐个调用 `POST /v1/messages`,默认 `--concurrency 2`、`--timeout-ms 30000`、`--max-tokens 768`。多个模型用分号 `;` 分隔,因为 legacy 模型引用本身可能包含逗号。追加 `--judge-max-tokens 256` 可调整裁判输出长度。该模式会真实调用模型服务并消耗上游额度;启用 `--judge-model` 时会额外消耗裁判模型额度。
443
+
347
444
  如果服务没有启动,`ctr ui` 会提示先运行:
348
445
 
349
446
  ```bash
@@ -374,6 +471,8 @@ ctr doctor
374
471
  - 当前监听地址;server/cloud 会提示远程客户端应设置的 `ANTHROPIC_BASE_URL`
375
472
  - 当前鉴权状态;如果 server/cloud 或公网监听没有配置 `APIKEY` / managed key,会提示安全风险
376
473
  - 如果启用了 `Runtime.remote_service`,会单独检查远程服务可达和 ready 状态
474
+ - 基础路由槽位:`Router.default` / `think` / `longContext` / `background` / `webSearch` 是否能解析到模型
475
+ - 上下文窗口提示:槽位模型是否缺少 `metadata.context_window_tokens` / `metadata.safe_input_tokens`,以及 `Router.longContext` 是否真的比默认模型更适合大上下文
377
476
  - 模型兼容策略和请求编译方式
378
477
  - capability hint 可能触发的运行时降级
379
478
  - 在你确认后,对模型发送最小探测请求
@@ -428,6 +527,10 @@ GET /api/auth/audit
428
527
  | `ctr stop` | 停止服务 |
429
528
  | `ctr code` | 带 Trigger Router 环境启动 Claude Code |
430
529
  | `ctr doctor` | 配置和服务诊断 |
530
+ | `ctr eval --tasks` | 查看固定评测任务、prompt 和 rubric |
531
+ | `ctr eval --input results.json` | 离线固定任务集评测 |
532
+ | `ctr eval --run --models "sonnet;haiku"` | 自动调用 CTR 后评测固定任务集 |
533
+ | `ctr eval --run --models "sonnet;haiku" --judge-model sonnet` | 自动执行并追加 LLM 裁判校准 |
431
534
  | `ctr ui` | 打开本地 UI 工作台 |
432
535
  | `ctr version` | 查看版本 |
433
536
  | `ctr upgrade` | 升级 |
@@ -455,6 +558,7 @@ setup 会自动探测旧配置,并优先提供迁移选项。迁移后的配
455
558
  ## 更多示例和文档
456
559
 
457
560
  - 最小示例:`config/trigger.example.yaml`
561
+ - 基础路由五槽位示例:`config/trigger.routing.yaml`
458
562
  - 高级示例:`config/trigger.advanced.yaml`
459
563
  - 配置细节:`docs/configuration-guide.md`
460
564
  - Models 迁移:`docs/models-migration-guide.md`
@@ -25,12 +25,18 @@ Models:
25
25
  interface: "openai"
26
26
  model: "anthropic/claude-sonnet-4"
27
27
  thinking: "auto"
28
+ metadata:
29
+ context_window_tokens: 200000
30
+ safe_input_tokens: 180000
28
31
 
29
32
  - id: opus
30
33
  api: "https://openrouter.ai/api/v1/chat/completions"
31
34
  key: "sk-xxx"
32
35
  interface: "openai"
33
36
  model: "anthropic/claude-opus-4"
37
+ metadata:
38
+ context_window_tokens: 200000
39
+ safe_input_tokens: 180000
34
40
 
35
41
  - id: deepseek_reasoner
36
42
  api: "https://api.deepseek.com/chat/completions"
@@ -38,6 +44,9 @@ Models:
38
44
  interface: "openai"
39
45
  model: "deepseek-reasoner"
40
46
  thinking: "high"
47
+ metadata:
48
+ context_window_tokens: 64000
49
+ safe_input_tokens: 56000
41
50
 
42
51
  - id: ollama_qwen
43
52
  api: "http://localhost:11434/v1/chat/completions"
@@ -140,6 +149,8 @@ SmartRouter:
140
149
  session_ttl_ms: 3600000
141
150
  fingerprint_similarity_threshold: 0.82
142
151
  break_on_explicit_route: true
152
+ # Alignment 为显式开启项:Claude Code 已经携带会话上下文。
153
+ # 只有跨模型交接摘要值得额外一次调用成本时再开启。
143
154
  alignment:
144
155
  enabled: true
145
156
  summarizer_model: "sonnet"
@@ -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"