@peterwangze/claude-trigger-router 1.1.1 → 1.2.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 +100 -10
- package/config/deploy/README.md +36 -0
- package/config/deploy/docker-compose.server.yaml +29 -0
- package/config/deploy/systemd/claude-trigger-router.service +33 -0
- package/config/trigger.advanced.yaml +11 -0
- package/dist/cli.js +3774 -207
- package/dist/cli.js.map +4 -4
- package/docs/cli-test-matrix.md +175 -0
- package/docs/configuration-guide.md +415 -0
- package/docs/configuration-roles.md +42 -0
- package/docs/models-migration-guide.md +266 -0
- package/docs/release-notes-v1.2.0.md +40 -0
- package/docs/releasing.md +313 -0
- package/docs/remote-client-guide.md +67 -0
- package/docs/server-maintainer-guide.md +81 -0
- package/package.json +2 -1
|
@@ -0,0 +1,266 @@
|
|
|
1
|
+
# 模型配置迁移指南
|
|
2
|
+
|
|
3
|
+
这份文档面向旧用户。
|
|
4
|
+
|
|
5
|
+
如果你之前使用的是:
|
|
6
|
+
|
|
7
|
+
- `Providers`
|
|
8
|
+
- `provider,model`
|
|
9
|
+
- `claude-code-router`
|
|
10
|
+
|
|
11
|
+
那么这里说明怎么迁到当前推荐的:
|
|
12
|
+
|
|
13
|
+
- `Models`
|
|
14
|
+
- `modelId`
|
|
15
|
+
- `claude-trigger-router`
|
|
16
|
+
|
|
17
|
+
如果你是新用户,不建议先看这份文档,直接按 `README.md` 走 `ctr setup` 即可。
|
|
18
|
+
|
|
19
|
+
## 1. 迁移后的目标
|
|
20
|
+
|
|
21
|
+
迁移完成后,推荐你得到这样的配置方式:
|
|
22
|
+
|
|
23
|
+
```yaml
|
|
24
|
+
Models:
|
|
25
|
+
- id: sonnet
|
|
26
|
+
api: "https://openrouter.ai/api/v1/chat/completions"
|
|
27
|
+
key: "sk-xxx"
|
|
28
|
+
interface: "openai"
|
|
29
|
+
model: "anthropic/claude-sonnet-4"
|
|
30
|
+
|
|
31
|
+
- id: opus
|
|
32
|
+
api: "https://openrouter.ai/api/v1/chat/completions"
|
|
33
|
+
key: "sk-xxx"
|
|
34
|
+
interface: "openai"
|
|
35
|
+
model: "anthropic/claude-opus-4"
|
|
36
|
+
|
|
37
|
+
Router:
|
|
38
|
+
default: "sonnet"
|
|
39
|
+
think: "opus"
|
|
40
|
+
```
|
|
41
|
+
|
|
42
|
+
迁移目标只有两点:
|
|
43
|
+
|
|
44
|
+
- 每个模型直接配置成一个 `Models[]` 项
|
|
45
|
+
- 路由字段统一引用 `Models[].id`
|
|
46
|
+
|
|
47
|
+
## 2. 为什么要迁
|
|
48
|
+
|
|
49
|
+
旧配置的问题主要是:
|
|
50
|
+
|
|
51
|
+
- 用户要理解 `Providers`
|
|
52
|
+
- 路由字段里到处写 `provider,model`
|
|
53
|
+
- 不同厂商协议差异暴露给用户
|
|
54
|
+
|
|
55
|
+
新配置的收益是:
|
|
56
|
+
|
|
57
|
+
- 模型接入项更直接
|
|
58
|
+
- 路由字段更短、更稳定
|
|
59
|
+
- `openai` / `anthropic` 协议通过 `interface` 统一收敛
|
|
60
|
+
- `setup`、保存、运行时都围绕同一套配置心智
|
|
61
|
+
|
|
62
|
+
## 3. 新旧写法对照
|
|
63
|
+
|
|
64
|
+
旧写法:
|
|
65
|
+
|
|
66
|
+
```yaml
|
|
67
|
+
Providers:
|
|
68
|
+
- name: openrouter
|
|
69
|
+
api_base_url: "https://openrouter.ai/api/v1/chat/completions"
|
|
70
|
+
api_key: "sk-xxx"
|
|
71
|
+
models:
|
|
72
|
+
- "anthropic/claude-sonnet-4"
|
|
73
|
+
- "anthropic/claude-opus-4"
|
|
74
|
+
|
|
75
|
+
Router:
|
|
76
|
+
default: "openrouter,anthropic/claude-sonnet-4"
|
|
77
|
+
think: "openrouter,anthropic/claude-opus-4"
|
|
78
|
+
```
|
|
79
|
+
|
|
80
|
+
新写法:
|
|
81
|
+
|
|
82
|
+
```yaml
|
|
83
|
+
Models:
|
|
84
|
+
- id: sonnet
|
|
85
|
+
api: "https://openrouter.ai/api/v1/chat/completions"
|
|
86
|
+
key: "sk-xxx"
|
|
87
|
+
interface: "openai"
|
|
88
|
+
model: "anthropic/claude-sonnet-4"
|
|
89
|
+
|
|
90
|
+
- id: opus
|
|
91
|
+
api: "https://openrouter.ai/api/v1/chat/completions"
|
|
92
|
+
key: "sk-xxx"
|
|
93
|
+
interface: "openai"
|
|
94
|
+
model: "anthropic/claude-opus-4"
|
|
95
|
+
|
|
96
|
+
Router:
|
|
97
|
+
default: "sonnet"
|
|
98
|
+
think: "opus"
|
|
99
|
+
```
|
|
100
|
+
|
|
101
|
+
## 4. 字段映射关系
|
|
102
|
+
|
|
103
|
+
最常见的映射关系如下:
|
|
104
|
+
|
|
105
|
+
- `Providers[].api_base_url` -> `Models[].api`
|
|
106
|
+
- `Providers[].api_key` -> `Models[].key`
|
|
107
|
+
- `Providers[].models[]` -> `Models[].model`
|
|
108
|
+
- `protocol` -> `interface`
|
|
109
|
+
- `provider,model` -> `modelId`
|
|
110
|
+
|
|
111
|
+
当前实现仍兼容这些旧字段:
|
|
112
|
+
|
|
113
|
+
- `api_base_url`
|
|
114
|
+
- `api_key`
|
|
115
|
+
- `protocol`
|
|
116
|
+
|
|
117
|
+
但新文档和新模板统一以这些字段为准:
|
|
118
|
+
|
|
119
|
+
- `api`
|
|
120
|
+
- `key`
|
|
121
|
+
- `interface`
|
|
122
|
+
|
|
123
|
+
## 5. 路由字段怎么迁
|
|
124
|
+
|
|
125
|
+
基础路由:
|
|
126
|
+
|
|
127
|
+
```yaml
|
|
128
|
+
Router:
|
|
129
|
+
default: "provider_a,model-x" # 旧
|
|
130
|
+
think: "provider_b,model-y" # 旧
|
|
131
|
+
```
|
|
132
|
+
|
|
133
|
+
改成:
|
|
134
|
+
|
|
135
|
+
```yaml
|
|
136
|
+
Router:
|
|
137
|
+
default: "model_x"
|
|
138
|
+
think: "model_y"
|
|
139
|
+
```
|
|
140
|
+
|
|
141
|
+
规则路由:
|
|
142
|
+
|
|
143
|
+
```yaml
|
|
144
|
+
SmartRouter:
|
|
145
|
+
rules:
|
|
146
|
+
- name: architecture
|
|
147
|
+
model: "provider_a,model-opus"
|
|
148
|
+
```
|
|
149
|
+
|
|
150
|
+
改成:
|
|
151
|
+
|
|
152
|
+
```yaml
|
|
153
|
+
SmartRouter:
|
|
154
|
+
rules:
|
|
155
|
+
- name: architecture
|
|
156
|
+
model: "opus"
|
|
157
|
+
```
|
|
158
|
+
|
|
159
|
+
智能路由:
|
|
160
|
+
|
|
161
|
+
```yaml
|
|
162
|
+
SmartRouter:
|
|
163
|
+
router_model: "provider_a,model-sonnet"
|
|
164
|
+
candidates:
|
|
165
|
+
- model: "provider_a,model-sonnet"
|
|
166
|
+
- model: "provider_b,model-reasoner"
|
|
167
|
+
```
|
|
168
|
+
|
|
169
|
+
改成:
|
|
170
|
+
|
|
171
|
+
```yaml
|
|
172
|
+
SmartRouter:
|
|
173
|
+
router_model: "sonnet"
|
|
174
|
+
candidates:
|
|
175
|
+
- model: "sonnet"
|
|
176
|
+
description: "通用任务"
|
|
177
|
+
- model: "reasoner"
|
|
178
|
+
description: "复杂推理"
|
|
179
|
+
```
|
|
180
|
+
|
|
181
|
+
治理字段也建议统一迁成 `modelId`,尤其是:
|
|
182
|
+
|
|
183
|
+
- `Governance.sticky.alignment.summarizer_model`
|
|
184
|
+
- `Governance.cascade.levels[].from`
|
|
185
|
+
- `Governance.cascade.levels[].to`
|
|
186
|
+
- `Governance.semantic.classifier_model`
|
|
187
|
+
- `Governance.shadow.verifier_model`
|
|
188
|
+
|
|
189
|
+
## 6. 最推荐的迁移方式
|
|
190
|
+
|
|
191
|
+
当前最推荐直接用:
|
|
192
|
+
|
|
193
|
+
```bash
|
|
194
|
+
ctr setup
|
|
195
|
+
```
|
|
196
|
+
|
|
197
|
+
如果检测到旧 `claude-code-router` 配置,`setup` 会优先给出迁移选项。
|
|
198
|
+
|
|
199
|
+
当前已经通过 packaged CLI E2E 验证的主路径包括:
|
|
200
|
+
|
|
201
|
+
- 当前配置有效时放弃并迁移旧配置
|
|
202
|
+
- 首次使用直接迁移旧配置
|
|
203
|
+
- 跳过迁移后新建
|
|
204
|
+
- 旧配置读取失败时回退到新建
|
|
205
|
+
|
|
206
|
+
也就是说,迁移现在不是旁路流程,而是主流程的一部分。
|
|
207
|
+
|
|
208
|
+
## 7. 自动迁移当前会做什么
|
|
209
|
+
|
|
210
|
+
当前自动迁移规则可以概括为:
|
|
211
|
+
|
|
212
|
+
- 旧 provider 下的每个 model,会展开成一个 `Models[]` 项
|
|
213
|
+
- 新 `id` 会按 provider + model 派生
|
|
214
|
+
- 接口类型会按 endpoint 协议推断
|
|
215
|
+
- 包含 `/v1/messages` 通常推成 `anthropic`
|
|
216
|
+
- 其他默认推成 `openai`
|
|
217
|
+
- `Router.default` 会尽量改写成新的模型 id
|
|
218
|
+
|
|
219
|
+
如果某些字段无法安全自动补齐,`setup` 会继续提示你手动输入最少必要项。
|
|
220
|
+
|
|
221
|
+
## 8. 推荐迁移顺序
|
|
222
|
+
|
|
223
|
+
如果你是手动迁移,建议按这个顺序:
|
|
224
|
+
|
|
225
|
+
1. 先把 `Providers` 展开成 `Models`
|
|
226
|
+
2. 再改 `Router.*`
|
|
227
|
+
3. 再改 `SmartRouter.rules[].model`
|
|
228
|
+
4. 再改 `SmartRouter.router_model / candidates[].model`
|
|
229
|
+
5. 最后再改 `Governance` 里的模型引用
|
|
230
|
+
|
|
231
|
+
这样最容易分阶段验证,也最容易回退。
|
|
232
|
+
|
|
233
|
+
## 9. 迁移后怎么验
|
|
234
|
+
|
|
235
|
+
最低限度建议这样验证:
|
|
236
|
+
|
|
237
|
+
```bash
|
|
238
|
+
ctr setup
|
|
239
|
+
ctr status
|
|
240
|
+
ctr code
|
|
241
|
+
```
|
|
242
|
+
|
|
243
|
+
如果你是维护者或者想做发版前验证,建议再执行:
|
|
244
|
+
|
|
245
|
+
```bash
|
|
246
|
+
npm run release:verify
|
|
247
|
+
```
|
|
248
|
+
|
|
249
|
+
它现在包含打包后的 CLI E2E,会覆盖 setup 主路径和安装后主命令。
|
|
250
|
+
|
|
251
|
+
## 10. 迁移后的常见结论
|
|
252
|
+
|
|
253
|
+
迁移后请记住这几个原则:
|
|
254
|
+
|
|
255
|
+
- 新增模型时优先加到 `Models`
|
|
256
|
+
- 路由字段优先引用 `Models[].id`
|
|
257
|
+
- `thinking` 是可选增强项,不是接入必填项
|
|
258
|
+
- `interface` 表示协议,不表示厂商名
|
|
259
|
+
|
|
260
|
+
## 11. 参考文档
|
|
261
|
+
|
|
262
|
+
- 主入口:`README.md`
|
|
263
|
+
- 配置指南:`docs/configuration-guide.md`
|
|
264
|
+
- 最小示例:`config/trigger.example.yaml`
|
|
265
|
+
- 完整高级示例:`config/trigger.advanced.yaml`
|
|
266
|
+
- 发布验证:`docs/releasing.md`
|
|
@@ -0,0 +1,40 @@
|
|
|
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
|
+
- 严格质量维度评分:固定任务与自定义任务都可以用 `qualityDimensions` 解释语义覆盖、完整性、交付格式、安全卫生等差异;任一必需维度低于阈值会让该结果失败。
|
|
11
|
+
- 治理收益观测增强:routing outcome、task comparison、quality evidence、context window guard、switch/alignment/cascade 等指标可通过 metrics、health、CSV 和 UI 进入维护者调优路径。
|
|
12
|
+
- 发布链路继续使用 `release:verify` / `release:stage` / GitHub trusted publishing,并要求 tag 与 `package.json.version` 一致。
|
|
13
|
+
|
|
14
|
+
## 发布边界
|
|
15
|
+
|
|
16
|
+
本版本不把 CTR 宣称为完整云端平台或完整自动裁判系统。以下能力已经进入实施计划,但不作为 `v1.2.0` 的发布承诺:
|
|
17
|
+
|
|
18
|
+
- LLM 裁判与人工校准入口
|
|
19
|
+
- UI/治理面的 benchmark 摘要看板
|
|
20
|
+
- 公网 server/cloud 一键部署默认推荐
|
|
21
|
+
- 托管场景密钥轮换操作手册
|
|
22
|
+
- 服务发现、节点/集群编排
|
|
23
|
+
- 模型池主动健康探测、成本/速率元数据和更多调度策略
|
|
24
|
+
|
|
25
|
+
对用户的建议口径是:`v1.2.0` 已经适合用来验证多模型组合是否带来质量/速度收益;如果要把服务暴露给多人或公网,应继续按 README 的安全边界使用 managed key、quota、audit 和 HTTPS/内网保护,不要把 cloud/server 形态理解为已经具备完整托管控制面。
|
|
26
|
+
|
|
27
|
+
## 发布前必跑
|
|
28
|
+
|
|
29
|
+
```bash
|
|
30
|
+
npm run release:verify
|
|
31
|
+
npm run release:stage
|
|
32
|
+
```
|
|
33
|
+
|
|
34
|
+
正式发布前确认:
|
|
35
|
+
|
|
36
|
+
- `package.json` 与 `package-lock.json` 版本均为 `1.2.0`
|
|
37
|
+
- `ctr version` 输出 `Version: 1.2.0`
|
|
38
|
+
- `v1.2.0` tag 与包版本一致
|
|
39
|
+
- npm trusted publisher 指向 `peterwangze/claude-trigger-router` 的 `publish.yml`
|
|
40
|
+
- GitHub publish workflow 使用 Node 24 / npm 11.5.1+
|
|
@@ -0,0 +1,313 @@
|
|
|
1
|
+
# 发布说明
|
|
2
|
+
|
|
3
|
+
维护者后续发布建议走 GitHub Actions + npm trusted publishing。
|
|
4
|
+
|
|
5
|
+
当前仓库有两条配套工作流:
|
|
6
|
+
|
|
7
|
+
- `Release Check`:在 PR、`master` push 和手动触发时执行发布前检查
|
|
8
|
+
- `Publish Package`:在版本 tag、GitHub Release 或手动触发时执行正式发布
|
|
9
|
+
|
|
10
|
+
## 一次性准备
|
|
11
|
+
|
|
12
|
+
1. 在 npm 包 `@peterwangze/claude-trigger-router` 的包设置中添加 trusted publisher
|
|
13
|
+
2. GitHub source repository 选择:
|
|
14
|
+
- owner: `peterwangze`
|
|
15
|
+
- repository: `claude-trigger-router`
|
|
16
|
+
- workflow: `publish.yml`
|
|
17
|
+
- environment: 留空
|
|
18
|
+
3. 确认 npm 包权限为 `public`
|
|
19
|
+
4. 确认发布 workflow 使用 Node 24 / npm 11.5.1+;npm trusted publishing 依赖新版 npm CLI,旧版 npm 可能在 publish PUT 阶段表现为误导性的 404。
|
|
20
|
+
|
|
21
|
+
## 推荐正式发布流程
|
|
22
|
+
|
|
23
|
+
推荐主流程:
|
|
24
|
+
|
|
25
|
+
1. 更新版本号
|
|
26
|
+
- `v1.2.0` 这类 minor release 还需要同步更新版本依赖用例、README 发布定位和对应 release notes。
|
|
27
|
+
- 本次 `v1.2.0` 的发布边界以 `docs/release-notes-v1.2.0.md` 为准:主打智能路由评测与治理增强,不宣称完整云端平台或完整自动裁判系统。
|
|
28
|
+
2. 本地先执行发布包验证:
|
|
29
|
+
|
|
30
|
+
```bash
|
|
31
|
+
npm run release:verify
|
|
32
|
+
```
|
|
33
|
+
|
|
34
|
+
这一步会依次执行:
|
|
35
|
+
|
|
36
|
+
- `npm run build`
|
|
37
|
+
- `npm test -- --run`
|
|
38
|
+
- `npm run test:e2e:cli`
|
|
39
|
+
- `npm run test:e2e:acceptance`
|
|
40
|
+
- `npm pack --dry-run`
|
|
41
|
+
- `npm pack`
|
|
42
|
+
- 将 tarball 安装到隔离目录
|
|
43
|
+
- 运行 `ctr --help`、`ctr version`、`ctr upgrade`
|
|
44
|
+
|
|
45
|
+
其中两层打包后验证分别承担不同职责:
|
|
46
|
+
|
|
47
|
+
- `npm run test:e2e:cli`:覆盖打包后 CLI 的主要命令、选择路径与文件副作用边界
|
|
48
|
+
- `npm run test:e2e:acceptance`:通过真实 shell / 全局 wrapper / 隔离 HOME 做更贴近人工验收的主路径看护
|
|
49
|
+
|
|
50
|
+
当前已经覆盖:
|
|
51
|
+
|
|
52
|
+
- `help` / `--help` / `-h` / 空命令
|
|
53
|
+
- `init`
|
|
54
|
+
- `version`
|
|
55
|
+
- `upgrade`
|
|
56
|
+
- `start` / `status` / `stop` / `restart`
|
|
57
|
+
- `code`
|
|
58
|
+
- `ui`
|
|
59
|
+
- `setup` 的复用、迁移、跳过迁移、新建、repair、rebuild、cancel 等主选择路径
|
|
60
|
+
- `setup -> status -> code` 这种最容易暴露终端接管、wrapper、隔离 HOME、副作用边界问题的主流程
|
|
61
|
+
- `start --daemon -> status -> stop` 的真实 shell/wrapper 路径
|
|
62
|
+
- `restart --daemon` 的真实 shell/wrapper 生命周期
|
|
63
|
+
- 目标端口被非本服务占用时的安全提示与“无额外文件修改”边界
|
|
64
|
+
- 残留 / 失效 PID 文件的安全清理
|
|
65
|
+
- `release:stage` 生成的 `.release-stage\ctr-release-home.cmd` wrapper 是否真的指向隔离 `.release-home`
|
|
66
|
+
|
|
67
|
+
只有这一步通过后,才继续正式发布,避免“发布后才发现包内容、CLI 启动或 setup 主流程有问题”。
|
|
68
|
+
|
|
69
|
+
标准发布命令统一为:
|
|
70
|
+
|
|
71
|
+
```bash
|
|
72
|
+
npm run release
|
|
73
|
+
```
|
|
74
|
+
|
|
75
|
+
它等价于:
|
|
76
|
+
|
|
77
|
+
```bash
|
|
78
|
+
npm run release:publish
|
|
79
|
+
```
|
|
80
|
+
|
|
81
|
+
也就是调用统一的 `scripts/release-package.ps1` 发布链路,而不是直接裸跑 `npm publish`。
|
|
82
|
+
|
|
83
|
+
注意区分:
|
|
84
|
+
|
|
85
|
+
- `npm run release:verify` / `npm run release:stage`:这是维护者本地手动验收链路,包含本地打包、隔离安装、stage wrapper 等“贴近真实机器”的检查
|
|
86
|
+
- GitHub Actions:只保留 CI 适合做的构建、常规测试和 packaged CLI E2E,不再直接跑 `verify:package`
|
|
87
|
+
|
|
88
|
+
这样做是因为 `verify:package` 更偏向开发者本地验证,混入 CI 后容易把“本地/手工验收”问题误伤成工作流不稳定问题。
|
|
89
|
+
|
|
90
|
+
如果你想手动验收“待发布的新包 CLI”,可以先执行:
|
|
91
|
+
|
|
92
|
+
```bash
|
|
93
|
+
npm run release:stage
|
|
94
|
+
```
|
|
95
|
+
|
|
96
|
+
它会完成两件事:
|
|
97
|
+
|
|
98
|
+
- 把当前版本打包并安装到仓库内的隔离目录 `.release-stage`
|
|
99
|
+
- 准备一个隔离的测试 HOME 目录 `.release-home`,并自动生成测试配置
|
|
100
|
+
- 准备一个独立的 server profile HOME 目录 `.release-server-home`,并通过 staged wrapper 执行 `deploy init --target server --force`
|
|
101
|
+
- 在同一个 `.release-home` 下同时放入 `claude-code-router` legacy 配置样本,保证迁移验证走主流程 HOME
|
|
102
|
+
|
|
103
|
+
这样你在手动验证时不会污染自己真实的 `~/.claude-trigger-router` 配置。
|
|
104
|
+
|
|
105
|
+
如果你想指定测试端口,可以这样执行:
|
|
106
|
+
|
|
107
|
+
```bash
|
|
108
|
+
npm run release:stage -- -Port 6789
|
|
109
|
+
```
|
|
110
|
+
|
|
111
|
+
脚本会同时:
|
|
112
|
+
|
|
113
|
+
- 把 staged 配置里的 `PORT` 改成你指定的端口
|
|
114
|
+
- 在推荐命令清单里使用同一个端口
|
|
115
|
+
|
|
116
|
+
Windows 下脚本会额外生成一个包装命令 `.release-stage\ctr-release-home.cmd`,自动把 `HOME` / `USERPROFILE` 指向 `.release-home`。你可以直接用它验证新功能,例如:
|
|
117
|
+
|
|
118
|
+
```bash
|
|
119
|
+
".release-stage\\ctr-release-home.cmd" --help
|
|
120
|
+
".release-stage\\ctr-release-home.cmd" version
|
|
121
|
+
".release-stage\\ctr-release-home.cmd" setup
|
|
122
|
+
".release-stage\\ctr-release-home.cmd" status
|
|
123
|
+
".release-stage\\ctr-release-home.cmd" ui
|
|
124
|
+
".release-stage\\ctr-release-home.cmd" stop
|
|
125
|
+
".release-stage\\ctr-release-home.cmd" init --force
|
|
126
|
+
".release-stage\\ctr-release-server-home.cmd" deploy init --target server --force
|
|
127
|
+
".release-stage\\ctr-release-home.cmd" start --port 5678
|
|
128
|
+
```
|
|
129
|
+
|
|
130
|
+
`npm run release:stage` 的输出里也会直接打印一组“推荐验证清单”,顺序会尽量贴近真实用户主路径:
|
|
131
|
+
|
|
132
|
+
- `help`
|
|
133
|
+
- `version`
|
|
134
|
+
- `setup`
|
|
135
|
+
- `status`
|
|
136
|
+
- `ui`
|
|
137
|
+
- `stop`
|
|
138
|
+
|
|
139
|
+
如果你还想额外验证手动配置路径,再继续执行:
|
|
140
|
+
|
|
141
|
+
- `init --force`
|
|
142
|
+
- `start`
|
|
143
|
+
- `status`
|
|
144
|
+
- `stop`
|
|
145
|
+
|
|
146
|
+
如果你还想额外验证 server 部署入口,`release:stage` 会生成:
|
|
147
|
+
|
|
148
|
+
```bash
|
|
149
|
+
.release-server-home\.claude-trigger-router\config.yaml
|
|
150
|
+
```
|
|
151
|
+
|
|
152
|
+
Windows 下可以继续使用:
|
|
153
|
+
|
|
154
|
+
```bash
|
|
155
|
+
".release-stage\\ctr-release-server-home.cmd" doctor
|
|
156
|
+
```
|
|
157
|
+
|
|
158
|
+
该 profile 与普通 staged HOME 隔离,避免 server 模板覆盖本地用户主路径测试配置。
|
|
159
|
+
|
|
160
|
+
对于本次 `claude-code-router` 配置迁移这种高频通用能力,`release:stage` 现在也会默认在同一个主流程 HOME 中准备 legacy 配置样本。Windows 下可直接继续使用同一个 wrapper:
|
|
161
|
+
|
|
162
|
+
```bash
|
|
163
|
+
".release-stage\\ctr-release-home.cmd" setup
|
|
164
|
+
```
|
|
165
|
+
|
|
166
|
+
它会在 `.release-home` 中同时读取脚本自动生成的 legacy 样本:
|
|
167
|
+
|
|
168
|
+
```bash
|
|
169
|
+
.release-home\.claude-code-router\config.json
|
|
170
|
+
```
|
|
171
|
+
|
|
172
|
+
迁移后的目标配置请重点检查:
|
|
173
|
+
|
|
174
|
+
```bash
|
|
175
|
+
.release-home\.claude-trigger-router\config.yaml
|
|
176
|
+
```
|
|
177
|
+
|
|
178
|
+
如果要先修改测试配置,请编辑:
|
|
179
|
+
|
|
180
|
+
```bash
|
|
181
|
+
.release-home\.claude-trigger-router\config.yaml
|
|
182
|
+
```
|
|
183
|
+
|
|
184
|
+
这个 staged 配置文件顶部会额外提示你优先修改:
|
|
185
|
+
|
|
186
|
+
- `Models[*].key`
|
|
187
|
+
- `Models[*].api` / `model`
|
|
188
|
+
- `PORT`
|
|
189
|
+
|
|
190
|
+
并且示例里的 `sk-xxx` 会自动替换成更显眼的占位值 `REPLACE_WITH_REAL_API_KEY`,避免直接拿着示例值做验证。
|
|
191
|
+
|
|
192
|
+
验证完成后执行:
|
|
193
|
+
|
|
194
|
+
```bash
|
|
195
|
+
npm run release:clean
|
|
196
|
+
```
|
|
197
|
+
|
|
198
|
+
它会清理 `.release-stage` 和本地 tarball。
|
|
199
|
+
|
|
200
|
+
3. 提交并推送到 `master`
|
|
201
|
+
4. 创建并推送版本 tag,例如:
|
|
202
|
+
|
|
203
|
+
```bash
|
|
204
|
+
git tag v1.0.1
|
|
205
|
+
git push origin v1.0.1
|
|
206
|
+
```
|
|
207
|
+
|
|
208
|
+
5. `Publish Package` workflow 会自动执行:
|
|
209
|
+
- `npm ci`
|
|
210
|
+
- `npm run build`
|
|
211
|
+
- `npm test -- --run`
|
|
212
|
+
- `npm run test:e2e:cli`
|
|
213
|
+
- npm trusted publishing 版本门禁
|
|
214
|
+
- `npm publish --access public`
|
|
215
|
+
|
|
216
|
+
也支持两种补充触发方式:
|
|
217
|
+
|
|
218
|
+
- 发布 GitHub Release
|
|
219
|
+
- 在 Actions 中手动 `workflow_dispatch`
|
|
220
|
+
|
|
221
|
+
## 工作流保护
|
|
222
|
+
|
|
223
|
+
当前发布工作流已经内置:
|
|
224
|
+
|
|
225
|
+
- tag / release 与 `package.json` 版本一致性校验
|
|
226
|
+
- npm 已发布版本检查,避免重复发布同一版本
|
|
227
|
+
- npm trusted publishing CLI 版本检查,避免旧 npm 在发布阶段才失败
|
|
228
|
+
- 发布前 tarball 预检查
|
|
229
|
+
|
|
230
|
+
## 处理 GitHub Actions 发布 404
|
|
231
|
+
|
|
232
|
+
如果发布日志中已经完成 build、pack 和 provenance 生成,但最后在:
|
|
233
|
+
|
|
234
|
+
```text
|
|
235
|
+
PUT https://registry.npmjs.org/@peterwangze%2fclaude-trigger-router - Not found
|
|
236
|
+
```
|
|
237
|
+
|
|
238
|
+
失败,优先检查两件事:
|
|
239
|
+
|
|
240
|
+
- npm 包设置里 trusted publisher 是否精确指向 `peterwangze/claude-trigger-router` 的 `publish.yml`
|
|
241
|
+
- workflow 是否使用 Node 24 / npm 11.5.1+;旧 npm 不支持 trusted publishing 的正式发布路径
|
|
242
|
+
|
|
243
|
+
如果目标版本还没有发布,可以在修复 workflow 后从 Actions 页面用 `workflow_dispatch` 触发当前 `master` 的 `Publish Package`。如果当前代码已经继续演进,建议 bump 到下一个 patch 版本并重新打 tag,避免同一个版本号对应不同源码快照;单纯 rerun 旧 tag 的失败 job 仍会使用旧 tag 上的 workflow 文件。
|
|
244
|
+
|
|
245
|
+
建议统一使用 `vX.Y.Z` 形式的 tag,例如 `v1.0.1`。
|
|
246
|
+
|
|
247
|
+
如果你想快速查看当前 CLI 自动化覆盖矩阵,可参考:
|
|
248
|
+
|
|
249
|
+
```bash
|
|
250
|
+
docs/cli-test-matrix.md
|
|
251
|
+
```
|
|
252
|
+
|
|
253
|
+
## Release Check 会检查什么
|
|
254
|
+
|
|
255
|
+
`Release Check` 会提前检查:
|
|
256
|
+
|
|
257
|
+
- `npm ci`
|
|
258
|
+
- `npm run build`
|
|
259
|
+
- `npm test -- --run`
|
|
260
|
+
- `npm run test:e2e:cli`
|
|
261
|
+
- 当前 `package.json.version` 是否已经发布到 npm
|
|
262
|
+
- 如果 `package.json` 已改动,版本号是否真的发生变化
|
|
263
|
+
|
|
264
|
+
它会在这些情况下直接失败:
|
|
265
|
+
|
|
266
|
+
- `package.json` 改了,但版本号没有变化
|
|
267
|
+
- `package.json` 改了,而且目标版本已经存在于 npm
|
|
268
|
+
|
|
269
|
+
这样可以把常见发布问题提前暴露在 PR 或合入 `master` 之前。
|
|
270
|
+
|
|
271
|
+
## 本地兜底发布
|
|
272
|
+
|
|
273
|
+
如果需要手动发布,仍可在本地执行:
|
|
274
|
+
|
|
275
|
+
```bash
|
|
276
|
+
npm run release:verify
|
|
277
|
+
npm run release:publish
|
|
278
|
+
```
|
|
279
|
+
|
|
280
|
+
其中:
|
|
281
|
+
|
|
282
|
+
- `npm run release:verify`:做构建、常规测试、packaged CLI E2E、打包、隔离安装和 CLI 冒烟检查
|
|
283
|
+
- `npm run release:stage`:把待发布包安装到 `.release-stage`,并在同一个 `.release-home` 中准备基础验收配置与 legacy 迁移验证样本;推荐先按 `help -> version -> setup -> status -> ui -> stop` 验收主路径,再按需补充 `init -> start -> status -> stop`
|
|
284
|
+
- `npm run release:clean`:清理 `.release-stage`、`.release-home` 和本地 tarball
|
|
285
|
+
- `npm run release:publish`:发布前先检查目标版本是否已存在于 npm;如果不存在,会先执行完整验证,再执行 `npm publish`
|
|
286
|
+
|
|
287
|
+
如果你已经刚刚执行过验证,也可以直接调用底层脚本跳过重复验证:
|
|
288
|
+
|
|
289
|
+
```bash
|
|
290
|
+
pwsh -NoProfile -ExecutionPolicy Bypass -File scripts/release-package.ps1 -Action publish -SkipVerify
|
|
291
|
+
```
|
|
292
|
+
|
|
293
|
+
如果本机 `@peterwangze` scope 曾指向 GitHub Packages,需要先确认:
|
|
294
|
+
|
|
295
|
+
```bash
|
|
296
|
+
npm config get registry
|
|
297
|
+
```
|
|
298
|
+
|
|
299
|
+
并检查 `~/.npmrc` 中:
|
|
300
|
+
|
|
301
|
+
```text
|
|
302
|
+
@peterwangze:registry=https://registry.npmjs.org/
|
|
303
|
+
```
|
|
304
|
+
|
|
305
|
+
## 发布后检查
|
|
306
|
+
|
|
307
|
+
发布完成后建议确认:
|
|
308
|
+
|
|
309
|
+
```bash
|
|
310
|
+
npm view @peterwangze/claude-trigger-router version --registry=https://registry.npmjs.org/
|
|
311
|
+
npm install -g @peterwangze/claude-trigger-router
|
|
312
|
+
ctr --help
|
|
313
|
+
```
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
# Remote client guide
|
|
2
|
+
|
|
3
|
+
This guide is for someone who uses an existing Claude Trigger Router server.
|
|
4
|
+
|
|
5
|
+
If you are choosing between local use, server maintenance and remote service use, start with `docs/configuration-roles.md`.
|
|
6
|
+
|
|
7
|
+
You need two values from the server maintainer:
|
|
8
|
+
|
|
9
|
+
- server base URL, for example `https://router.example.com`
|
|
10
|
+
- a managed API key with `client + read-only` scopes
|
|
11
|
+
|
|
12
|
+
Do not use an admin/bootstrap key for daily model calls.
|
|
13
|
+
|
|
14
|
+
## Configure the local client profile
|
|
15
|
+
|
|
16
|
+
Run setup and choose the remote-service path, or edit the config manually:
|
|
17
|
+
|
|
18
|
+
```yaml
|
|
19
|
+
Runtime:
|
|
20
|
+
mode: "local"
|
|
21
|
+
remote_service:
|
|
22
|
+
enabled: true
|
|
23
|
+
base_url: "https://router.example.com"
|
|
24
|
+
auth_token: "${CTR_REMOTE_AUTH_TOKEN}"
|
|
25
|
+
|
|
26
|
+
Router: {}
|
|
27
|
+
```
|
|
28
|
+
|
|
29
|
+
Set the token in your shell:
|
|
30
|
+
|
|
31
|
+
```bash
|
|
32
|
+
export CTR_REMOTE_AUTH_TOKEN="ctr_..."
|
|
33
|
+
```
|
|
34
|
+
|
|
35
|
+
On Windows PowerShell:
|
|
36
|
+
|
|
37
|
+
```powershell
|
|
38
|
+
$env:CTR_REMOTE_AUTH_TOKEN = "ctr_..."
|
|
39
|
+
```
|
|
40
|
+
|
|
41
|
+
## Check readiness
|
|
42
|
+
|
|
43
|
+
```bash
|
|
44
|
+
ctr doctor
|
|
45
|
+
ctr status
|
|
46
|
+
ctr ui
|
|
47
|
+
```
|
|
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`, including the remote server's redacted registration summary when `/api/registration` is reachable.
|
|
50
|
+
|
|
51
|
+
## Use with Claude Code through local ctr
|
|
52
|
+
|
|
53
|
+
```bash
|
|
54
|
+
ctr setup
|
|
55
|
+
ctr doctor
|
|
56
|
+
ctr code
|
|
57
|
+
```
|
|
58
|
+
|
|
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
|
+
|
|
63
|
+
```bash
|
|
64
|
+
export ANTHROPIC_BASE_URL="https://router.example.com"
|
|
65
|
+
export ANTHROPIC_API_KEY="$CTR_REMOTE_AUTH_TOKEN"
|
|
66
|
+
claude
|
|
67
|
+
```
|