@peterwangze/claude-trigger-router 1.1.0 → 1.1.2
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 +122 -14
- 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/dist/cli.js +2003 -183
- package/dist/cli.js.map +4 -4
- package/docs/cli-test-matrix.md +175 -0
- package/docs/configuration-guide.md +390 -0
- package/docs/configuration-roles.md +42 -0
- package/docs/models-migration-guide.md +266 -0
- package/docs/releasing.md +311 -0
- package/docs/remote-client-guide.md +68 -0
- package/docs/server-maintainer-guide.md +81 -0
- package/package.json +2 -1
package/README.md
CHANGED
|
@@ -18,11 +18,80 @@ Claude Trigger Router 是给 Claude Code 用的本地路由代理。
|
|
|
18
18
|
- **协议兼容**:支持 `openai` / `anthropic` 两类接口协议,OpenRouter、DeepSeek 等 OpenAI-compatible 服务按 `openai` 配。
|
|
19
19
|
- **基础路由**:用 `Router.default`、`Router.think`、`Router.longContext` 等槽位指定不同任务的默认模型。
|
|
20
20
|
- **SmartRouter**:先用显式规则命中高确定性任务,也可以在规则未命中时让路由模型从候选模型中自动选择。
|
|
21
|
-
- **Governance 观测**:记录 trace、metrics
|
|
22
|
-
- **doctor
|
|
23
|
-
- **UI 工作台**:`ctr ui`
|
|
21
|
+
- **Governance 观测**:记录 trace、metrics、异常摘要和健康状态,帮助你理解路由选择和运行风险。
|
|
22
|
+
- **doctor 诊断**:检查配置、服务可启动性、鉴权安全状态、模型兼容策略和可选模型探测。
|
|
23
|
+
- **UI 工作台**:`ctr ui` 打开本地页面,查看服务上下文、远程状态、鉴权安全状态、配置草稿、compiled models、capability warnings、治理 trace、metrics 和 Health 摘要。
|
|
24
24
|
- **远程状态基础**:可配置 `Runtime.remote_service`,通过 `/api/remote-status` 查看远程服务健康、compiled model 摘要和治理告警摘要。默认用户不需要配置远程模式。
|
|
25
25
|
|
|
26
|
+
## 部署模式与边界
|
|
27
|
+
|
|
28
|
+
当前配置里可以用 `Runtime.mode` 表达部署心智:
|
|
29
|
+
|
|
30
|
+
- `local`:默认模式。你的机器上运行一个本地 `ctr` 服务,Claude Code 通过本地代理访问上游模型。
|
|
31
|
+
- `server`:把 `ctr` 作为远程路由服务运行。它暴露 `/api/service-info`、`/api/remote-status`、`/api/registration`、`/ui` 等服务端状态和管理入口。
|
|
32
|
+
- `cloud`:保留给托管/云端形态的配置语义;当前 npm 包仍按自托管进程运行,不包含托管控制面或集群编排。
|
|
33
|
+
|
|
34
|
+
已落地的远程能力聚焦在“远程服务连接配置、状态查询和注册摘要”。它不会默认替代本地代理主路径,也不会自动启用尚未实现的集群、节点调度或托管控制面。
|
|
35
|
+
|
|
36
|
+
如果要把当前机器作为远程 `server` 暴露给其他客户端,先生成安全默认的服务端配置:
|
|
37
|
+
|
|
38
|
+
```bash
|
|
39
|
+
ctr deploy init --target server
|
|
40
|
+
```
|
|
41
|
+
|
|
42
|
+
该命令会写入 `HOST: "0.0.0.0"`、随机 bootstrap `APIKEY`、`Runtime.mode: "server"`、日志开关、健康检查所需端口和一份可编辑的 `Models + Router.default` 起步模板。它不会覆盖已有配置;如需重建模板,显式追加 `--force`。
|
|
43
|
+
|
|
44
|
+
npm 包也随附可复制部署模板:
|
|
45
|
+
|
|
46
|
+
- `config/deploy/docker-compose.server.yaml`
|
|
47
|
+
- `config/deploy/systemd/claude-trigger-router.service`
|
|
48
|
+
|
|
49
|
+
角色化手册:
|
|
50
|
+
|
|
51
|
+
- 配置角色总览:[docs/configuration-roles.md](docs/configuration-roles.md)
|
|
52
|
+
- 服务提供者/维护者:[docs/server-maintainer-guide.md](docs/server-maintainer-guide.md)
|
|
53
|
+
- 远程服务使用者:[docs/remote-client-guide.md](docs/remote-client-guide.md)
|
|
54
|
+
|
|
55
|
+
这些模板仍以 `ctr deploy init --target server` 生成的配置为起点。首次暴露给其他机器前,请先确认 `APIKEY` 或 active managed key 存在,并优先放在 HTTPS 反向代理或内网之后。
|
|
56
|
+
|
|
57
|
+
生成后确认或调整的最小结构如下:
|
|
58
|
+
|
|
59
|
+
```yaml
|
|
60
|
+
HOST: "0.0.0.0"
|
|
61
|
+
PORT: 5678
|
|
62
|
+
APIKEY: "ctr_bootstrap_..."
|
|
63
|
+
|
|
64
|
+
Runtime:
|
|
65
|
+
mode: "server"
|
|
66
|
+
|
|
67
|
+
Models:
|
|
68
|
+
- id: sonnet
|
|
69
|
+
api: "https://openrouter.ai/api/v1/chat/completions"
|
|
70
|
+
key: "sk-xxx"
|
|
71
|
+
interface: "openai"
|
|
72
|
+
model: "anthropic/claude-sonnet-4"
|
|
73
|
+
|
|
74
|
+
Router:
|
|
75
|
+
default: "sonnet"
|
|
76
|
+
```
|
|
77
|
+
|
|
78
|
+
启动方式:
|
|
79
|
+
|
|
80
|
+
```bash
|
|
81
|
+
ctr doctor
|
|
82
|
+
ctr start --daemon
|
|
83
|
+
```
|
|
84
|
+
|
|
85
|
+
安全边界:
|
|
86
|
+
|
|
87
|
+
- 如果配置了 `HOST: "0.0.0.0"` 但没有设置 `APIKEY` 或 active managed key,运行时会为了安全强制只监听 `127.0.0.1`。
|
|
88
|
+
- `APIKEY` 定位为 bootstrap/admin key;服务端启动后用它调用 `POST /api/auth/keys` 生成给远程使用者的 managed key。
|
|
89
|
+
- 远程日常 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`。
|
|
92
|
+
- `GET /api/service-info` 会返回脱敏的 `auth` / `security` 摘要和 quota 用量;`GET /api/auth/audit` 可用 admin key 查看最近鉴权允许/拒绝记录。
|
|
93
|
+
- 公网入口仍建议放在 HTTPS 反向代理之后;远程浏览器访问 UI 时建议使用本地隧道、内网访问,或由反向代理处理认证。
|
|
94
|
+
|
|
26
95
|
## 安装
|
|
27
96
|
|
|
28
97
|
```bash
|
|
@@ -48,19 +117,24 @@ ctr setup
|
|
|
48
117
|
|
|
49
118
|
- 复用已有 `~/.claude-trigger-router/config.yaml`
|
|
50
119
|
- 探测并迁移旧 `claude-code-router` 配置
|
|
51
|
-
-
|
|
52
|
-
-
|
|
53
|
-
-
|
|
54
|
-
-
|
|
120
|
+
- 在没有可用配置时询问“本地使用”、“连接远程服务”还是“部署为远程服务端”
|
|
121
|
+
- 本地使用时创建最小可用配置
|
|
122
|
+
- 连接远程服务时写入 `Runtime.remote_service`,不要求你先填写本地 provider/model
|
|
123
|
+
- 部署为远程服务端时生成 server profile 和 bootstrap admin `APIKEY`,但不会自动启动服务
|
|
124
|
+
- 本地使用时,引导填写默认模型 ID、接口地址、API Key 和模型名
|
|
125
|
+
- 本地使用时,可选追加复杂任务模型,并生成 SmartRouter 起步模板
|
|
126
|
+
- 保存配置后按角色输出下一步:本地路径提示 `ctr code` 和路由模板,远程客户端路径提示 `ctr status` / 远端 ready 检查,服务端路径提示 `ctr doctor` / `ctr start --daemon`
|
|
55
127
|
|
|
56
|
-
|
|
128
|
+
本地使用路径完成后按这个顺序使用:
|
|
57
129
|
|
|
58
130
|
```bash
|
|
59
131
|
ctr status
|
|
60
132
|
ctr code
|
|
61
133
|
```
|
|
62
134
|
|
|
63
|
-
`ctr code` 会带着本地代理环境启动 Claude Code。之后你在 Claude Code
|
|
135
|
+
`ctr code` 会带着本地代理环境启动 Claude Code。之后你在 Claude Code 里的请求会经过本地 Trigger Router。
|
|
136
|
+
|
|
137
|
+
如果 setup 选择的是“连接远程服务”,当前主要用于生成远程服务连接配置并通过 `ctr status` 检查远端 ready 状态;日常直连远程服务时,请按服务维护者提供的 `ANTHROPIC_BASE_URL` 和 `ANTHROPIC_AUTH_TOKEN` 配置 Claude Code。首次日常使用仍建议先跑通本地 `Models + Router.default` 主路径。如果选择“部署为远程服务端”,setup 只生成配置,不会自动启动;请先编辑 `Models[].key` / `Models[].model`,再运行 `ctr doctor` 和 `ctr start --daemon`。
|
|
64
138
|
|
|
65
139
|
## 手动配置
|
|
66
140
|
|
|
@@ -248,7 +322,27 @@ http://127.0.0.1:5678/ui
|
|
|
248
322
|
当前 UI 分成两层:
|
|
249
323
|
|
|
250
324
|
- **使用者工作台**:查看和编辑配置草稿、模型、路由、compiled preview 和保存结果。
|
|
251
|
-
- **维护者工作台**:查看 Governance trace、metrics、异常阈值、快照和归档。
|
|
325
|
+
- **维护者工作台**:查看 Governance trace、Health 摘要、metrics、异常阈值、快照和归档。
|
|
326
|
+
|
|
327
|
+
首屏状态区会显示:
|
|
328
|
+
|
|
329
|
+
- 本地服务 ready 状态、端口、模型数和 `Router.default`
|
|
330
|
+
- `Runtime.mode` 与当前服务角色
|
|
331
|
+
- 当前监听地址和远程客户端接入建议
|
|
332
|
+
- 远程服务状态摘要
|
|
333
|
+
- Registration 模型和上游服务摘要
|
|
334
|
+
- Auth 与 Security 摘要,用于发现 server/cloud 或公网监听无鉴权风险
|
|
335
|
+
|
|
336
|
+
维护者工作台里的 Health 摘要来自 `GET /api/governance/health`,用于快速判断近期治理状态:
|
|
337
|
+
|
|
338
|
+
- `idle`:还没有 trace 样本,先让请求经过路由服务
|
|
339
|
+
- `healthy`:当前窗口没有治理告警
|
|
340
|
+
- `watch`:存在 warning,需要关注级联、影子监督或延迟趋势
|
|
341
|
+
- `critical`:存在 critical 告警,应优先查看异常列表和最近 trace
|
|
342
|
+
|
|
343
|
+
同一份摘要也会出现在 `GET /api/governance/metrics` 的 `health` 字段里。异常数量按总告警数展示,并同时给出 critical / warning 明细,避免只看到单类告警而低估风险。
|
|
344
|
+
|
|
345
|
+
Health 摘要下方的 action 可以直接把 trace 表切到对应排查视图:cascade action 会筛选 `cascadeTriggered=true`,shadow action 会筛选 `shadowChecked=true`,其他 action 会回到近期 trace。
|
|
252
346
|
|
|
253
347
|
如果服务没有启动,`ctr ui` 会提示先运行:
|
|
254
348
|
|
|
@@ -276,17 +370,21 @@ ctr doctor
|
|
|
276
370
|
- 缺失字段和低风险结构问题
|
|
277
371
|
- 配置是否能通过本地校验
|
|
278
372
|
- 服务是否可启动
|
|
373
|
+
- 当前服务上下文:`local` / `server` / `cloud`
|
|
374
|
+
- 当前监听地址;server/cloud 会提示远程客户端应设置的 `ANTHROPIC_BASE_URL`
|
|
375
|
+
- 当前鉴权状态;如果 server/cloud 或公网监听没有配置 `APIKEY` / managed key,会提示安全风险
|
|
376
|
+
- 如果启用了 `Runtime.remote_service`,会单独检查远程服务可达和 ready 状态
|
|
279
377
|
- 模型兼容策略和请求编译方式
|
|
280
378
|
- capability hint 可能触发的运行时降级
|
|
281
379
|
- 在你确认后,对模型发送最小探测请求
|
|
282
380
|
|
|
283
|
-
模型探测会消耗少量额度,所以 doctor
|
|
381
|
+
模型探测会消耗少量额度,所以 doctor 会先征求确认。如果当前是远程客户端配置且没有本地 `Models`,doctor 会跳过本地模型探测。
|
|
284
382
|
|
|
285
383
|
## 远程服务状态
|
|
286
384
|
|
|
287
385
|
默认情况下,你只需要本地模式,不需要配置远程服务。
|
|
288
386
|
|
|
289
|
-
如果你已经有一个远程 Trigger Router
|
|
387
|
+
如果你已经有一个远程 Trigger Router 服务,可以通过 `ctr setup` 选择“连接远程服务”,或手动配置远程目标:
|
|
290
388
|
|
|
291
389
|
```yaml
|
|
292
390
|
Runtime:
|
|
@@ -294,7 +392,7 @@ Runtime:
|
|
|
294
392
|
remote_service:
|
|
295
393
|
enabled: true
|
|
296
394
|
base_url: "https://router.example.com"
|
|
297
|
-
auth_token: "${CTR_REMOTE_AUTH_TOKEN}"
|
|
395
|
+
auth_token: "${CTR_REMOTE_AUTH_TOKEN}" # 推荐使用远程服务端生成的 managed key;如需 ready/status 探测,同时授予 client 与 read-only scope
|
|
298
396
|
|
|
299
397
|
Router: {}
|
|
300
398
|
```
|
|
@@ -305,7 +403,16 @@ Router: {}
|
|
|
305
403
|
GET /api/remote-status
|
|
306
404
|
```
|
|
307
405
|
|
|
308
|
-
|
|
406
|
+
相关服务端状态接口:
|
|
407
|
+
|
|
408
|
+
```text
|
|
409
|
+
GET /api/service-info
|
|
410
|
+
GET /api/remote-status
|
|
411
|
+
GET /api/registration
|
|
412
|
+
GET /api/auth/audit
|
|
413
|
+
```
|
|
414
|
+
|
|
415
|
+
这条能力当前作为远程接入基础 contract 提供,用于服务发现、状态检查和注册摘要;它不表示已经自动把 Claude Code 请求转发到远端。首次使用仍建议从本地 `ctr setup -> ctr start -> ctr code` 开始。
|
|
309
416
|
|
|
310
417
|
## 常用命令
|
|
311
418
|
|
|
@@ -313,6 +420,7 @@ GET /api/remote-status
|
|
|
313
420
|
|---|---|
|
|
314
421
|
| `ctr setup` | 首次配置、复用、迁移、修复配置 |
|
|
315
422
|
| `ctr init --force` | 生成最小配置模板 |
|
|
423
|
+
| `ctr deploy init --target server` | 生成安全默认的自托管 server 配置 |
|
|
316
424
|
| `ctr start` | 前台启动本地服务 |
|
|
317
425
|
| `ctr start --daemon` | 后台启动本地服务 |
|
|
318
426
|
| `ctr status` | 查看服务状态 |
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
# Claude Trigger Router server deployment templates
|
|
2
|
+
|
|
3
|
+
These templates are included in the npm package under `config/deploy`.
|
|
4
|
+
|
|
5
|
+
Role-specific guides live in:
|
|
6
|
+
|
|
7
|
+
- `docs/server-maintainer-guide.md`
|
|
8
|
+
- `docs/remote-client-guide.md`
|
|
9
|
+
|
|
10
|
+
Recommended flow:
|
|
11
|
+
|
|
12
|
+
```bash
|
|
13
|
+
ctr deploy init --target server
|
|
14
|
+
ctr doctor
|
|
15
|
+
ctr start --daemon
|
|
16
|
+
```
|
|
17
|
+
|
|
18
|
+
Use `docker-compose.server.yaml` when you want a minimal container profile. Prepare `./ctr-home/.claude-trigger-router/config.yaml` with `ctr deploy init --target server`, edit `Models[].key` and `Models[].model`, then run:
|
|
19
|
+
|
|
20
|
+
```bash
|
|
21
|
+
docker compose -f docker-compose.server.yaml up -d
|
|
22
|
+
```
|
|
23
|
+
|
|
24
|
+
Use `systemd/claude-trigger-router.service` when you want a Linux service unit. Copy it to `/etc/systemd/system/`, edit the service user and paths, prepare the service user's config, then run:
|
|
25
|
+
|
|
26
|
+
```bash
|
|
27
|
+
systemctl daemon-reload
|
|
28
|
+
systemctl enable --now claude-trigger-router
|
|
29
|
+
```
|
|
30
|
+
|
|
31
|
+
Security notes:
|
|
32
|
+
|
|
33
|
+
- Keep the generated bootstrap `APIKEY` for maintainers only.
|
|
34
|
+
- Generate managed `client + read-only` keys for remote clients.
|
|
35
|
+
- Put public deployments behind HTTPS reverse proxy or private network access.
|
|
36
|
+
- Use `ctr status`, `ctr doctor`, and `/ui` to confirm role, listener, auth state, and remote client connection guidance after deployment.
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
# Claude Trigger Router self-hosted server profile.
|
|
2
|
+
# Prepare ./ctr-home/.claude-trigger-router/config.yaml with:
|
|
3
|
+
# HOME=./ctr-home ctr deploy init --target server
|
|
4
|
+
#
|
|
5
|
+
# The config file must contain a bootstrap APIKEY or active managed key before
|
|
6
|
+
# exposing HOST: 0.0.0.0 to other machines.
|
|
7
|
+
services:
|
|
8
|
+
claude-trigger-router:
|
|
9
|
+
image: node:24-alpine
|
|
10
|
+
container_name: claude-trigger-router
|
|
11
|
+
working_dir: /srv/ctr
|
|
12
|
+
command: >
|
|
13
|
+
sh -lc "npm install -g @peterwangze/claude-trigger-router@latest
|
|
14
|
+
&& ctr start --port 5678"
|
|
15
|
+
environment:
|
|
16
|
+
HOME: /srv/ctr
|
|
17
|
+
USERPROFILE: /srv/ctr
|
|
18
|
+
NODE_ENV: production
|
|
19
|
+
volumes:
|
|
20
|
+
- ./ctr-home:/srv/ctr
|
|
21
|
+
ports:
|
|
22
|
+
- "5678:5678"
|
|
23
|
+
restart: unless-stopped
|
|
24
|
+
healthcheck:
|
|
25
|
+
test: ["CMD-SHELL", "wget -qO- http://127.0.0.1:5678/health | grep claude-trigger-router"]
|
|
26
|
+
interval: 30s
|
|
27
|
+
timeout: 5s
|
|
28
|
+
retries: 3
|
|
29
|
+
start_period: 20s
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
# Claude Trigger Router self-hosted server unit.
|
|
2
|
+
# Copy to /etc/systemd/system/claude-trigger-router.service, then edit User,
|
|
3
|
+
# WorkingDirectory, Environment, and ExecStart paths for your host.
|
|
4
|
+
#
|
|
5
|
+
# Prepare the service user's config first:
|
|
6
|
+
# sudo -u ctr env HOME=/var/lib/claude-trigger-router ctr deploy init --target server
|
|
7
|
+
#
|
|
8
|
+
# The generated config must keep APIKEY or an active managed key before
|
|
9
|
+
# exposing HOST: 0.0.0.0.
|
|
10
|
+
[Unit]
|
|
11
|
+
Description=Claude Trigger Router
|
|
12
|
+
After=network-online.target
|
|
13
|
+
Wants=network-online.target
|
|
14
|
+
|
|
15
|
+
[Service]
|
|
16
|
+
Type=simple
|
|
17
|
+
User=ctr
|
|
18
|
+
Group=ctr
|
|
19
|
+
WorkingDirectory=/var/lib/claude-trigger-router
|
|
20
|
+
Environment=HOME=/var/lib/claude-trigger-router
|
|
21
|
+
Environment=USERPROFILE=/var/lib/claude-trigger-router
|
|
22
|
+
Environment=NODE_ENV=production
|
|
23
|
+
ExecStart=/usr/bin/env ctr start --port 5678
|
|
24
|
+
Restart=on-failure
|
|
25
|
+
RestartSec=5
|
|
26
|
+
NoNewPrivileges=true
|
|
27
|
+
PrivateTmp=true
|
|
28
|
+
ProtectSystem=full
|
|
29
|
+
ProtectHome=false
|
|
30
|
+
ReadWritePaths=/var/lib/claude-trigger-router
|
|
31
|
+
|
|
32
|
+
[Install]
|
|
33
|
+
WantedBy=multi-user.target
|