@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 +108 -4
- package/config/trigger.advanced.yaml +11 -0
- package/config/trigger.routing.yaml +67 -0
- package/dist/cli.js +2608 -169
- package/dist/cli.js.map +4 -4
- package/docs/configuration-guide.md +33 -8
- package/docs/release-notes-v1.2.0.md +43 -0
- package/docs/release-notes-v1.3.0.md +39 -0
- package/docs/releasing.md +2 -0
- package/docs/remote-client-guide.md +11 -12
- package/docs/server-maintainer-guide.md +2 -2
- package/package.json +1 -1
|
@@ -16,7 +16,7 @@ ctr setup
|
|
|
16
16
|
如果你不确定自己属于哪种部署角色,先看 `docs/configuration-roles.md`。当前三条路径是:
|
|
17
17
|
|
|
18
18
|
- 本地使用者:配置 `Models + Router.default`,运行 `ctr start / ctr status / ctr code`。
|
|
19
|
-
- 服务维护者:用 `ctr deploy init --target server` 生成 server
|
|
19
|
+
- 服务维护者:用 `ctr deploy init --target server` 生成 server 配置;服务所有者用 admin/bootstrap key 管理配置和 auth,日常值守可使用 managed `operator` key 执行重启和治理维护动作。
|
|
20
20
|
- 远程使用者:拿到服务地址和 managed `client + read-only` key,再配置 `Runtime.remote_service` 或直接设置 Claude Code 的 `ANTHROPIC_BASE_URL`。
|
|
21
21
|
|
|
22
22
|
## 1. 推荐配置心智
|
|
@@ -96,7 +96,7 @@ Router:
|
|
|
96
96
|
ctr start --daemon
|
|
97
97
|
```
|
|
98
98
|
|
|
99
|
-
如果配置了非本机 `HOST` 但没有配置 `APIKEY` 或 active managed key,运行时会强制回退到 `127.0.0.1`。远程客户端访问该服务时,`Runtime.remote_service.auth_token` 应填写服务端生成的 managed `client + read-only` key;bootstrap `APIKEY`
|
|
99
|
+
如果配置了非本机 `HOST` 但没有配置 `APIKEY` 或 active managed key,运行时会强制回退到 `127.0.0.1`。远程客户端访问该服务时,`Runtime.remote_service.auth_token` 应填写服务端生成的 managed `client + read-only` key;bootstrap `APIKEY` 只建议服务所有者使用。日常维护可以发放 managed `operator` key,用于重启、治理快照、定时快照、异常阈值和归档删除,但不能读写配置或管理 auth。公网部署建议放在 HTTPS 反向代理后面。启用 `APIKEY` 或 managed key 后 `/ui` 也会受认证保护;远程浏览器访问 UI 时建议使用本地隧道、内网访问,或由反向代理处理认证。
|
|
100
100
|
|
|
101
101
|
远程客户端配置是可选路径,不是默认路径。最小写法:
|
|
102
102
|
|
|
@@ -111,7 +111,7 @@ Runtime:
|
|
|
111
111
|
Router: {}
|
|
112
112
|
```
|
|
113
113
|
|
|
114
|
-
这个配置允许本机没有 `Models
|
|
114
|
+
这个配置允许本机没有 `Models`,用于连接远程服务、查看远程状态摘要,并让本地 `ctr` 代理把 `/v1/messages` 与 `/v1/chat/completions` 转发到远程服务。当前仍不要把它理解成已经有集群节点调度或托管控制面。
|
|
115
115
|
|
|
116
116
|
相关状态接口:
|
|
117
117
|
|
|
@@ -213,6 +213,18 @@ SmartRouter:
|
|
|
213
213
|
description: "复杂推理"
|
|
214
214
|
```
|
|
215
215
|
|
|
216
|
+
默认情况下,`SmartRouter` 会启用语义增强和 sticky 稳定性修正,但不会自动启用 `sticky.alignment` 上下文摘要注入。Claude Code 会在每次请求里携带已有会话上下文;只有在你明确需要跨模型切换交接摘要,并接受额外一次 summarizer 调用带来的首包等待时,才建议显式开启:
|
|
217
|
+
|
|
218
|
+
```yaml
|
|
219
|
+
SmartRouter:
|
|
220
|
+
sticky:
|
|
221
|
+
enabled: true
|
|
222
|
+
alignment:
|
|
223
|
+
enabled: true
|
|
224
|
+
summarizer_model: "sonnet"
|
|
225
|
+
max_summary_tokens: 256
|
|
226
|
+
```
|
|
227
|
+
|
|
216
228
|
治理模块:
|
|
217
229
|
|
|
218
230
|
```yaml
|
|
@@ -255,7 +267,7 @@ Governance:
|
|
|
255
267
|
- 本地使用时新建最小配置
|
|
256
268
|
- 连接远程服务时写入 `Runtime.remote_service`,不要求先填写本地 provider/model
|
|
257
269
|
- 部署为远程服务端时写入 `HOST: "0.0.0.0"`、bootstrap admin `APIKEY`、`Runtime.mode: "server"` 和可编辑的 `Models + Router.default` 起步模板,并且不会自动启动服务
|
|
258
|
-
- 保存后按角色输出下一步:本地路径提示本地代理状态、`ctr code` 和路由模板;远程客户端路径提示 `ctr status`、远端 ready/status
|
|
270
|
+
- 保存后按角色输出下一步:本地路径提示本地代理状态、`ctr code` 和路由模板;远程客户端路径提示 `ctr status`、远端 ready/status、本地代理转发和可选直连 `ANTHROPIC_BASE_URL` / `ANTHROPIC_API_KEY`;服务端路径提示 `ctr doctor` 与 `ctr start --daemon`
|
|
259
271
|
- 在当前配置损坏时 repair / rebuild
|
|
260
272
|
|
|
261
273
|
当前对用户主流程已经补了打包态 E2E,覆盖:
|
|
@@ -287,7 +299,7 @@ Governance:
|
|
|
287
299
|
- 远程服务状态摘要
|
|
288
300
|
- Registration 模型和上游服务摘要
|
|
289
301
|
|
|
290
|
-
这些信息来自现有 `/api/service-info` 和 `/api/remote-status
|
|
302
|
+
这些信息来自现有 `/api/service-info` 和 `/api/remote-status`,不会引入新的平行运行时。启用 `Runtime.remote_service` 时,`/api/remote-status` 还会只读同步远端 `/api/registration` 的脱敏摘要,用于显示远端注册模型数和 upstream 服务数;它不会把远端注册写回本地配置。
|
|
291
303
|
|
|
292
304
|
维护者工作台还会展示治理 Health 摘要。它来自 `/api/governance/health`,同样也包含在 `/api/governance/metrics` 的 `health` 字段里:
|
|
293
305
|
|
|
@@ -306,8 +318,9 @@ Health 摘要只解释已有 trace / metrics / anomaly 数据,不会改变路
|
|
|
306
318
|
|
|
307
319
|
- `models`:可注册模型列表,字段复用 `Models[]` 的最小模型配置语义;多个相同 `id` 会编译成同一个 logical model pool。
|
|
308
320
|
- `upstream_services`:上游服务引用列表,只保存服务 ID、base URL 和可选 token。
|
|
321
|
+
- `strategy`:可选,当前支持 `priority` 和 `least-latency`;默认是 `priority`,显式设置 `least-latency` 后会优先选择已有成功延迟样本中平均延迟最低的健康 endpoint,没有样本时回退 priority。
|
|
309
322
|
- `metadata.pool_endpoint_id`:可选,给某个 pool endpoint 一个稳定 ID。
|
|
310
|
-
- `metadata.pool_priority
|
|
323
|
+
- `metadata.pool_priority`:可选,数值越小优先级越高;在 `priority` 策略下直接决定 active endpoint,在 `least-latency` 没有延迟样本或延迟相同时作为稳定回退顺序。
|
|
311
324
|
- `metadata.pool_enabled`:可选,设为 `false` 时该 endpoint 会保留在 pool 中但不会成为 active endpoint。
|
|
312
325
|
- `metadata.upstream_service_id`:可选,将 endpoint 关联到 `upstream_services[].id`,用于维护者观测和后续调度。
|
|
313
326
|
|
|
@@ -316,6 +329,7 @@ Health 摘要只解释已有 trace / metrics / anomaly 数据,不会改变路
|
|
|
316
329
|
```yaml
|
|
317
330
|
Registration:
|
|
318
331
|
enabled: true
|
|
332
|
+
strategy: "least-latency"
|
|
319
333
|
upstream_services:
|
|
320
334
|
- id: "edge-router"
|
|
321
335
|
base_url: "https://edge.example.com"
|
|
@@ -340,7 +354,7 @@ Registration:
|
|
|
340
354
|
pool_priority: 20
|
|
341
355
|
```
|
|
342
356
|
|
|
343
|
-
编译结果可以通过 `GET /api/models/compiled`、`POST /api/models/compiled/preview` 或 `/ui` 的 Compiled Models 区查看。当前阶段 pool 会把
|
|
357
|
+
编译结果可以通过 `GET /api/models/compiled`、`POST /api/models/compiled/preview` 或 `/ui` 的 Compiled Models 区查看。当前阶段 pool 会把 active endpoint 编译成真实内部 provider;如果没有同名顶层 `Models[]` 覆盖,`Router.default: sonnet` 这类 logical model id 会解析到 active pool endpoint,并在治理 trace 中记录 `model_pool:<modelId>:<endpointId>`。当当前 pool endpoint 返回非流式 upstream error 时,运行时会按当前策略选择下一个 enabled endpoint 做一次本地重试,并记录 `model_pool_fallback:<modelId>:<endpointId>`;失败 endpoint 会进入短冷却,连续失败达到阈值后会进入更长的 `open` 熔断状态,后续 logical model 解析和 fallback candidate 会优先跳过冷却或熔断中的 endpoint。成功响应会写入延迟窗口,compiled model pool、`/api/models/pool-health` 和 `/ui` 可看到 endpoint 的平均延迟;当 `Registration.strategy: "least-latency"` 时,这个延迟窗口会参与 active endpoint 和 fallback candidate 选择。启用远程客户端配置时,本地 `/api/remote-status` 会拉取远端 `/api/registration` 的只读脱敏摘要,帮助使用者确认远端服务端注册了多少模型和 upstream 服务,但不会自动同步或覆盖本地 `Registration`。
|
|
344
358
|
|
|
345
359
|
当前明确不支持 `nodes`、`node_id`、`cluster` 这类集群/节点编排字段。
|
|
346
360
|
|
|
@@ -359,6 +373,15 @@ Models:
|
|
|
359
373
|
supports_reasoning: false
|
|
360
374
|
supports_tools: false
|
|
361
375
|
supports_images: false
|
|
376
|
+
|
|
377
|
+
- id: long_context
|
|
378
|
+
api: "https://api.example.com/v1/messages"
|
|
379
|
+
key: "sk-xxx"
|
|
380
|
+
interface: "anthropic"
|
|
381
|
+
model: "vendor/long-context"
|
|
382
|
+
metadata:
|
|
383
|
+
context_window_tokens: 200000
|
|
384
|
+
safe_input_tokens: 180000
|
|
362
385
|
```
|
|
363
386
|
|
|
364
387
|
当前行为:
|
|
@@ -366,8 +389,10 @@ Models:
|
|
|
366
389
|
- `supports_reasoning: false`:忽略 `thinking`
|
|
367
390
|
- `supports_tools: false`:工具能力退化为文本
|
|
368
391
|
- `supports_images: false`:图片输入退化为文本说明
|
|
392
|
+
- `context_window_tokens`:声明模型总上下文窗口;运行时按 `input + max_tokens + thinking budget` 判断是否能安全承载
|
|
393
|
+
- `safe_input_tokens`:声明输入安全上限;已选模型放不下时会优先切到 `Router.longContext`
|
|
369
394
|
|
|
370
|
-
|
|
395
|
+
多模型上下文大小差异明显时,建议同时配置小窗口模型和长上下文模型的上下文 metadata,并设置 `Router.longContext`。如果所有候选模型都放不下,运行时会在发往上游前返回明确的 context window 错误,避免让小模型隐性截断或质量劣化。如果你不确定,不建议一开始就配太多 capability hint,先让模型跑通主路径。
|
|
371
396
|
|
|
372
397
|
## 11. 建议的配置演进顺序
|
|
373
398
|
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
# v1.2.0 Release Notes
|
|
2
|
+
|
|
3
|
+
`v1.2.0` 定位为“智能路由评测与治理增强版”。这个版本把多模型组合从“能配置、能路由”推进到“能用固定任务复现、能按维度解释质量差异、能在治理面看到收益和风险证据”。
|
|
4
|
+
|
|
5
|
+
## 本次发布主线
|
|
6
|
+
|
|
7
|
+
- `ctr eval --tasks`:导出固定任务、prompt、期望输出、rubric、质量维度和 result template,方便维护者建立稳定的多模型 A/B 输入。
|
|
8
|
+
- `ctr eval --input results.json`:对已有多模型输出做 deterministic rubric 评分,输出 pass rate、quality、speed、latency、best run、维度均分和失败 findings。
|
|
9
|
+
- `ctr eval --run --models "sonnet;haiku"`:通过 CTR `/v1/messages` 自动执行固定任务集,支持 `--base-url`、`--api-key`、`--timeout-ms`、`--concurrency`、`--max-tokens` 和 JSON 输出。
|
|
10
|
+
- `ctr eval --run --models "sonnet;haiku" --judge-model sonnet`:自动执行后继续调用一个 LLM 裁判模型,回填 `judgeScore`、`judgeFindings` 和 `calibrationNotes`;`ctr eval --input results.json --judge-model sonnet` 也可对已有结果补裁判分。
|
|
11
|
+
- 严格质量维度评分:固定任务与自定义任务都可以用 `qualityDimensions` 解释语义覆盖、完整性、交付格式、安全卫生等差异;任一必需维度低于阈值会让该结果失败。
|
|
12
|
+
- 人工/裁判校准入口:`ctr eval` 输入可以附带 `humanScore`、`judgeScore`、`calibrationNotes` 和 `judgeFindings`,也可以用 `--judge-model` 自动生成裁判分;报告会输出 calibration summary 和高分歧样本,裁判失败会以 `judge_error` 进入 findings 但不会误计入 calibration score。
|
|
13
|
+
- 治理收益观测增强:routing outcome、task comparison、quality evidence、context window guard、switch/alignment/cascade 等指标可通过 metrics、health、CSV 和 UI 进入维护者调优路径。
|
|
14
|
+
- UI benchmark summary:维护者工作台会把 task comparison、quality evidence 和 `ctr eval --run` 下一步动作合并成 benchmark 摘要。
|
|
15
|
+
- 发布链路继续使用 `release:verify` / `release:stage` / GitHub trusted publishing,并要求 tag 与 `package.json.version` 一致。
|
|
16
|
+
|
|
17
|
+
## 发布边界
|
|
18
|
+
|
|
19
|
+
本版本不把 CTR 宣称为完整云端平台或完整自动裁判系统。`--judge-model` 已提供可重复的裁判执行入口,但它仍应和人工复核一起作为校准信号使用。以下能力已经进入实施计划,但不作为 `v1.2.0` 的发布承诺:
|
|
20
|
+
|
|
21
|
+
- 人工校准 UI 表单
|
|
22
|
+
- 更完整的 benchmark 历史看板
|
|
23
|
+
- 公网 server/cloud 一键部署默认推荐
|
|
24
|
+
- 托管场景密钥轮换操作手册
|
|
25
|
+
- 服务发现、节点/集群编排
|
|
26
|
+
- 模型池主动健康探测、成本/速率元数据和更多调度策略
|
|
27
|
+
|
|
28
|
+
对用户的建议口径是:`v1.2.0` 已经适合用来验证多模型组合是否带来质量/速度收益;如果要把服务暴露给多人或公网,应继续按 README 的安全边界使用 managed key、quota、audit 和 HTTPS/内网保护,不要把 cloud/server 形态理解为已经具备完整托管控制面。
|
|
29
|
+
|
|
30
|
+
## 发布前必跑
|
|
31
|
+
|
|
32
|
+
```bash
|
|
33
|
+
npm run release:verify
|
|
34
|
+
npm run release:stage
|
|
35
|
+
```
|
|
36
|
+
|
|
37
|
+
正式发布前确认:
|
|
38
|
+
|
|
39
|
+
- `package.json` 与 `package-lock.json` 版本均为 `1.2.0`
|
|
40
|
+
- `ctr version` 输出 `Version: 1.2.0`
|
|
41
|
+
- `v1.2.0` tag 与包版本一致
|
|
42
|
+
- npm trusted publisher 指向 `peterwangze/claude-trigger-router` 的 `publish.yml`
|
|
43
|
+
- GitHub publish workflow 使用 Node 24 / npm 11.5.1+
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
# v1.3.0 Release Notes
|
|
2
|
+
|
|
3
|
+
`v1.3.0` 定位为“基础路由常用体验版”。这个版本把 CTR 的最高频用户路径从“已经能配置多模型”推进到“新用户能配置、能诊断、能在 UI 看懂、也有 packaged smoke 防回退”。
|
|
4
|
+
|
|
5
|
+
## 本次发布主线
|
|
6
|
+
|
|
7
|
+
- 基础路由五槽位说明:README 围绕 `Router.default`、`Router.think`、`Router.longContext`、`Router.background`、`Router.webSearch` 补齐触发条件、推荐模型类型和常见误区。
|
|
8
|
+
- 可复制基础路由模板:新增 `config/trigger.routing.yaml`,用于快速建立 default / thinking / long context / background / web search 的分流配置。
|
|
9
|
+
- `ctr doctor` 路由槽位体检:检查默认模型是否存在、各槽位是否能解析到 `Models[].id`、thinking 能力是否匹配,以及上下文窗口元数据是否缺失。
|
|
10
|
+
- `/ui` 使用者工作台路由解释:展示当前五槽位引用、上游 provider/model、能力提示和潜在 warning,帮助用户确认当前配置是否按预期生效。
|
|
11
|
+
- Context window guide:在 `/ui` 中展示 default 与 longContext 容量、最大上下文候选、缺失元数据计数,并支持把推荐模型设为 `Router.longContext`。
|
|
12
|
+
- packaged basic routing smoke:打包后 acceptance 覆盖 fresh setup、`ctr status`、`ctr code` 环境、五槽位解析,以及真实 `/v1/messages` 请求触发 longContext fallback。
|
|
13
|
+
|
|
14
|
+
## 发布边界
|
|
15
|
+
|
|
16
|
+
本版本不把 CTR 宣称为完整 SmartRouter 产品化版本,也不承诺完整云端托管平台。以下事项已经进入后续计划,但不作为 `v1.3.0` 的发布承诺:
|
|
17
|
+
|
|
18
|
+
- SmartRouter 规则模板、候选模型配置向导、路由决策解释和慢路由/错路由调优建议。
|
|
19
|
+
- benchmark 历史看板和人工校准 UI 表单。
|
|
20
|
+
- 公网 server/cloud 一键部署默认推荐、托管级密钥轮换手册和集群编排。
|
|
21
|
+
- 模型池主动健康探测、成本/速率元数据和更多调度策略。
|
|
22
|
+
|
|
23
|
+
对用户的建议口径是:`v1.3.0` 已经适合把本地 Claude Code 的基础分流路径作为日常主路径使用;如果要启用 SmartRouter 候选模型或远程服务端,应继续按照 README 的边界说明使用,并等待后续版本把模板、解释和运维入口进一步收口。
|
|
24
|
+
|
|
25
|
+
## 发布前必跑
|
|
26
|
+
|
|
27
|
+
```bash
|
|
28
|
+
npm run release:verify
|
|
29
|
+
npm run release:stage
|
|
30
|
+
```
|
|
31
|
+
|
|
32
|
+
正式发布前确认:
|
|
33
|
+
|
|
34
|
+
- `package.json` 与 `package-lock.json` 版本均为 `1.3.0`
|
|
35
|
+
- `ctr version` 输出 `Version: 1.3.0`
|
|
36
|
+
- `v1.3.0` tag 与包版本一致
|
|
37
|
+
- npm registry 中不存在 `@peterwangze/claude-trigger-router@1.3.0`
|
|
38
|
+
- npm trusted publisher 指向 `peterwangze/claude-trigger-router` 的 `publish.yml`
|
|
39
|
+
- GitHub publish workflow 使用 Node 24 / npm 11.5.1+
|
package/docs/releasing.md
CHANGED
|
@@ -46,23 +46,22 @@ ctr status
|
|
|
46
46
|
ctr ui
|
|
47
47
|
```
|
|
48
48
|
|
|
49
|
-
`doctor` checks the configured remote service and reports whether it is reachable and ready. `status` shows the local role and remote-service connection hint. `ui` shows remote health through `/api/remote-status
|
|
49
|
+
`doctor` checks the configured remote service and reports whether it is reachable and ready. `status` shows the local role and remote-service connection hint. `ui` shows remote health through `/api/remote-status`, including the remote server's redacted registration summary when `/api/registration` is reachable.
|
|
50
50
|
|
|
51
|
-
## Use with Claude Code
|
|
52
|
-
|
|
53
|
-
When the maintainer gives you the direct server URL, Claude Code can point at it:
|
|
51
|
+
## Use with Claude Code through local ctr
|
|
54
52
|
|
|
55
53
|
```bash
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
54
|
+
ctr setup
|
|
55
|
+
ctr doctor
|
|
56
|
+
ctr code
|
|
59
57
|
```
|
|
60
58
|
|
|
61
|
-
|
|
59
|
+
With `Runtime.remote_service.enabled`, the local `ctr` service acts as a thin client proxy for model calls. Claude Code still talks to local `ctr`, while `ctr` forwards `/v1/messages` and `/v1/chat/completions` to the configured remote service with `Runtime.remote_service.auth_token`.
|
|
60
|
+
|
|
61
|
+
You can still point Claude Code directly at the remote server when you do not want a local proxy:
|
|
62
62
|
|
|
63
63
|
```bash
|
|
64
|
-
|
|
65
|
-
|
|
64
|
+
export ANTHROPIC_BASE_URL="https://router.example.com"
|
|
65
|
+
export ANTHROPIC_API_KEY="$CTR_REMOTE_AUTH_TOKEN"
|
|
66
|
+
claude
|
|
66
67
|
```
|
|
67
|
-
|
|
68
|
-
The current remote-service profile focuses on connection config, readiness checks and registration summaries. It does not yet claim full automatic remote request forwarding for every local command.
|
|
@@ -39,7 +39,7 @@ ctr status
|
|
|
39
39
|
|
|
40
40
|
## 3. Issue client keys
|
|
41
41
|
|
|
42
|
-
Keep the bootstrap `APIKEY` for
|
|
42
|
+
Keep the bootstrap `APIKEY` for service owners. Use it only to open `/ui`, save config, and manage auth.
|
|
43
43
|
|
|
44
44
|
Create a managed key for remote users:
|
|
45
45
|
|
|
@@ -53,7 +53,7 @@ Recommended remote-user scopes:
|
|
|
53
53
|
["client", "read-only"]
|
|
54
54
|
```
|
|
55
55
|
|
|
56
|
-
`client` allows model calls. `read-only` allows ready/status checks such as `/api/health`, `/api/service-info`, compiled model summaries and governance GET endpoints. Generated secrets are returned once.
|
|
56
|
+
`client` allows model calls. `read-only` allows ready/status checks such as `/api/health`, `/api/service-info`, compiled model summaries and governance GET endpoints. `operator` is for day-to-day maintenance writes such as restart, governance snapshots, schedules, anomaly thresholds and archive deletion; it cannot read or save config and cannot manage auth keys. Generated secrets are returned once.
|
|
57
57
|
|
|
58
58
|
## 4. Expose safely
|
|
59
59
|
|
package/package.json
CHANGED