@jsonstudio/rcc 0.89.1348 → 0.89.1457
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 +51 -1427
- package/dist/build-info.js +2 -2
- package/dist/cli/commands/config.js +3 -0
- package/dist/cli/commands/config.js.map +1 -1
- package/dist/cli/commands/init.js +3 -0
- package/dist/cli/commands/init.js.map +1 -1
- package/dist/cli/config/bundled-docs.js +2 -2
- package/dist/cli/config/bundled-docs.js.map +1 -1
- package/dist/cli/config/init-config.d.ts +2 -1
- package/dist/cli/config/init-config.js +33 -1
- package/dist/cli/config/init-config.js.map +1 -1
- package/dist/client/gemini/gemini-protocol-client.js +2 -1
- package/dist/client/gemini/gemini-protocol-client.js.map +1 -1
- package/dist/client/gemini-cli/gemini-cli-protocol-client.js +39 -15
- package/dist/client/gemini-cli/gemini-cli-protocol-client.js.map +1 -1
- package/dist/client/openai/chat-protocol-client.js +2 -1
- package/dist/client/openai/chat-protocol-client.js.map +1 -1
- package/dist/client/responses/responses-protocol-client.js +2 -1
- package/dist/client/responses/responses-protocol-client.js.map +1 -1
- package/dist/error-handling/quiet-error-handling-center.js +46 -8
- package/dist/error-handling/quiet-error-handling-center.js.map +1 -1
- package/dist/manager/modules/quota/provider-quota-daemon.events.js +4 -2
- package/dist/manager/modules/quota/provider-quota-daemon.events.js.map +1 -1
- package/dist/manager/modules/quota/provider-quota-daemon.model-backoff.js +9 -6
- package/dist/manager/modules/quota/provider-quota-daemon.model-backoff.js.map +1 -1
- package/dist/providers/auth/antigravity-userinfo-helper.d.ts +2 -1
- package/dist/providers/auth/antigravity-userinfo-helper.js +25 -4
- package/dist/providers/auth/antigravity-userinfo-helper.js.map +1 -1
- package/dist/providers/auth/tokenfile-auth.d.ts +2 -0
- package/dist/providers/auth/tokenfile-auth.js +33 -1
- package/dist/providers/auth/tokenfile-auth.js.map +1 -1
- package/dist/providers/core/config/camoufox-launcher.d.ts +5 -0
- package/dist/providers/core/config/camoufox-launcher.js +5 -0
- package/dist/providers/core/config/camoufox-launcher.js.map +1 -1
- package/dist/providers/core/config/service-profiles.js +7 -18
- package/dist/providers/core/config/service-profiles.js.map +1 -1
- package/dist/providers/core/runtime/base-provider.d.ts +0 -5
- package/dist/providers/core/runtime/base-provider.js +26 -112
- package/dist/providers/core/runtime/base-provider.js.map +1 -1
- package/dist/providers/core/runtime/gemini-cli-http-provider.d.ts +7 -0
- package/dist/providers/core/runtime/gemini-cli-http-provider.js +362 -93
- package/dist/providers/core/runtime/gemini-cli-http-provider.js.map +1 -1
- package/dist/providers/core/runtime/http-request-executor.d.ts +3 -0
- package/dist/providers/core/runtime/http-request-executor.js +110 -38
- package/dist/providers/core/runtime/http-request-executor.js.map +1 -1
- package/dist/providers/core/runtime/http-transport-provider.d.ts +3 -0
- package/dist/providers/core/runtime/http-transport-provider.js +80 -37
- package/dist/providers/core/runtime/http-transport-provider.js.map +1 -1
- package/dist/providers/core/runtime/rate-limit-manager.d.ts +1 -12
- package/dist/providers/core/runtime/rate-limit-manager.js +4 -77
- package/dist/providers/core/runtime/rate-limit-manager.js.map +1 -1
- package/dist/providers/core/utils/http-client.js +20 -43
- package/dist/providers/core/utils/http-client.js.map +1 -1
- package/dist/server/handlers/handler-utils.js +5 -1
- package/dist/server/handlers/handler-utils.js.map +1 -1
- package/dist/server/handlers/responses-handler.js +1 -1
- package/dist/server/handlers/responses-handler.js.map +1 -1
- package/dist/server/runtime/http-server/index.js +68 -29
- package/dist/server/runtime/http-server/index.js.map +1 -1
- package/dist/server/runtime/http-server/request-executor.js +50 -6
- package/dist/server/runtime/http-server/request-executor.js.map +1 -1
- package/dist/server/runtime/http-server/routes.js +4 -1
- package/dist/server/runtime/http-server/routes.js.map +1 -1
- package/dist/utils/strip-internal-keys.d.ts +12 -0
- package/dist/utils/strip-internal-keys.js +28 -0
- package/dist/utils/strip-internal-keys.js.map +1 -0
- package/docs/CHAT_PROCESS_PROTOCOL_AND_PIPELINE.md +221 -0
- package/docs/antigravity-gemini-format-cleanup.md +102 -0
- package/docs/antigravity-routing-contract.md +31 -0
- package/docs/chat-semantic-expansion-plan.md +8 -6
- package/docs/glm-chat-completions.md +1 -1
- package/docs/servertool-framework.md +65 -0
- package/docs/v2-architecture/README.md +6 -8
- package/docs/verified-configs/README.md +60 -0
- package/docs/verified-configs/v0.45.0/README.md +244 -0
- package/docs/verified-configs/v0.45.0/lmstudio-5521-gpt-oss-20b-mlx.json +135 -0
- package/docs/verified-configs/v0.45.0/merged-config.5521.json +1205 -0
- package/docs/verified-configs/v0.45.0/merged-config.qwen-5522.json +1559 -0
- package/docs/verified-configs/v0.45.0/qwen-5522-qwen3-coder-plus-final.json +221 -0
- package/docs/verified-configs/v0.45.0/qwen-5522-qwen3-coder-plus-fixed.json +242 -0
- package/docs/verified-configs/v0.45.0/qwen-5522-qwen3-coder-plus.json +242 -0
- package/package.json +17 -11
- package/scripts/build-core.mjs +3 -1
- package/scripts/ci/repo-sanity.mjs +138 -0
- package/scripts/mock-provider/run-regressions.mjs +157 -1
- package/scripts/run-bg.sh +0 -14
- package/scripts/tests/ci-jest.mjs +119 -0
- package/scripts/tools-dev/responses-debug-client/README.md +23 -0
- package/scripts/tools-dev/responses-debug-client/payloads/poem.json +13 -0
- package/scripts/tools-dev/responses-debug-client/payloads/sample-no-tools.json +98 -0
- package/scripts/tools-dev/responses-debug-client/payloads/text.json +13 -0
- package/scripts/tools-dev/responses-debug-client/payloads/tool.json +27 -0
- package/scripts/tools-dev/responses-debug-client/run.mjs +65 -0
- package/scripts/tools-dev/responses-debug-client/src/index.ts +281 -0
- package/scripts/tools-dev/run-llmswitch-chat.mjs +53 -0
- package/scripts/tools-dev/server-tools-dev/run-web-fetch.mjs +65 -0
- package/scripts/vendor-core.mjs +13 -3
- package/scripts/test-fc-responses.mjs +0 -66
- package/scripts/test-guidance.mjs +0 -100
- package/scripts/test-iflow-web-search.mjs +0 -141
- package/scripts/test-iflow.mjs +0 -379
- package/scripts/test-tool-exec.mjs +0 -26
package/README.md
CHANGED
|
@@ -1,1474 +1,98 @@
|
|
|
1
|
-
# RouteCodex
|
|
1
|
+
# RouteCodex
|
|
2
2
|
|
|
3
3
|
[](https://www.npmjs.com/package/@jsonstudio/rcc)
|
|
4
4
|
[](https://opensource.org/licenses/MIT)
|
|
5
|
-
[](https://www.typescriptlang.org/)
|
|
6
5
|
|
|
7
|
-
RouteCodex
|
|
6
|
+
RouteCodex 是一个 **多 Provider 的 AI 代理网关**:为 Codex、Claude Code,以及任何 OpenAI-compatible 客户端提供统一入口,并在不同上游协议之间完成 **路由 + 协议转换 + 工具调用治理**。
|
|
8
7
|
|
|
9
|
-
|
|
10
|
-
- **Dev Worktree (`routecodex`)**:本仓库源码,开发者可修改、构建并贡献。
|
|
8
|
+
## 主要功能
|
|
11
9
|
|
|
12
|
-
|
|
10
|
+
- **多入口同时支持(同一服务端口)**
|
|
11
|
+
- OpenAI Chat:`POST /v1/chat/completions`
|
|
12
|
+
- OpenAI Responses:`POST /v1/responses`
|
|
13
|
+
- Anthropic Messages:`POST /v1/messages`
|
|
14
|
+
- **多 Provider / 多协议支持**
|
|
15
|
+
- OpenAI-compatible、Anthropic、Gemini/Gemini CLI、GLM、Qwen、iFlow、LM Studio 等(按配置启用)。
|
|
16
|
+
- 部分 Provider 支持 OAuth / token file(按配置启用)。
|
|
17
|
+
- **可配置路由**
|
|
18
|
+
- 将不同“流量池/路由类别”(如 `default` / `thinking` / `tools` / `search` / `longcontext` 等)映射到不同 Provider 目标列表。
|
|
19
|
+
- **请求级“语法控制”**
|
|
20
|
+
- **指定 Provider/模型**:`model` 可直接写成 `provider.model`(例如 `iflow.glm-4.7`)。
|
|
21
|
+
- **路由指令**:可在用户文本中插入 `<**...**>` 指令(例如 `<**glm.glm-4.7**>`),详见 `docs/routing-instructions.md`。
|
|
22
|
+
- **Passthrough(透传)**
|
|
23
|
+
- 可按 Provider 配置启用透传:只做鉴权/路由/日志,不做语义修补(适合严格 SSE 透传场景)。
|
|
13
24
|
|
|
14
|
-
|
|
25
|
+
> Release CLI:`@jsonstudio/rcc`(命令 `rcc`)
|
|
15
26
|
|
|
16
|
-
##
|
|
27
|
+
## 安装
|
|
17
28
|
|
|
18
|
-
|
|
29
|
+
环境要求:Node.js 20+(推荐 LTS)。
|
|
19
30
|
|
|
20
|
-
```
|
|
21
|
-
HTTP Server → llmswitch-core Hub Pipeline → Provider V2 Runtime → 上游 AI API
|
|
22
|
-
```
|
|
23
|
-
|
|
24
|
-
- **Hub Pipeline(llmswitch-core)**:唯一的工具治理点,完成协议归一、tool call 修复、路由决策、SSE 处理。
|
|
25
|
-
- **Provider V2**:纯运输层,只负责认证、重试和兼容性 hook;不解析或修改用户语义。
|
|
26
|
-
- **Compatibility**:按 upstream 协议最小字段映射,确保 usage / finish_reason / required_action 一致。
|
|
27
|
-
- **Host (RouteCodexHttpServer)**:只做 HTTP/SSE 封装、配置加载与 provider 生命周期管理。
|
|
28
|
-
|
|
29
|
-
### 模块职责矩阵
|
|
30
|
-
|
|
31
|
-
| 模块 | 代码位置 | 职责 | 禁止行为 |
|
|
32
|
-
| --- | --- | --- | --- |
|
|
33
|
-
| HTTP Server | `src/server/runtime/http-server` | Express 路由、SSE 包装、调用 Hub Pipeline | 工具决策、路由逻辑、配置拼装 |
|
|
34
|
-
| Hub Pipeline | `sharedmodule/llmswitch-core` | 请求标准化、tool_calls 统一处理、虚拟路由 | 进行 HTTP 请求、处理认证 |
|
|
35
|
-
| Provider V2 | `src/providers` | 请求签名、HTTP 发送、快照输出 | 解析/修复工具调用、修改配置 |
|
|
36
|
-
| Compatibility | `sharedmodule/llmswitch-core/src/conversion/compat/*` | 上下游字段映射、最小清理 | 工具解码、兜底 try/catch |
|
|
37
|
-
|
|
38
|
-
更多细节请参考 `docs/ARCHITECTURE.md` 与 `docs/CONFIG_ARCHITECTURE.md`。
|
|
39
|
-
|
|
40
|
-
---
|
|
41
|
-
|
|
42
|
-
## 安装与升级
|
|
43
|
-
|
|
44
|
-
### 环境要求
|
|
45
|
-
- Node.js 20.x(20.11 及以上,<26)
|
|
46
|
-
- npm 9.x 或 10.x
|
|
47
|
-
- macOS / Linux:bash 或 zsh
|
|
48
|
-
- Windows:PowerShell 5.1+ 或 Windows Terminal
|
|
49
|
-
|
|
50
|
-
### Release CLI(推荐)
|
|
51
|
-
|
|
52
|
-
> CLI 名称:`rcc`,包名:`@jsonstudio/rcc`
|
|
53
|
-
|
|
54
|
-
**macOS / Linux**
|
|
55
31
|
```bash
|
|
56
32
|
npm install -g @jsonstudio/rcc
|
|
57
33
|
rcc --version
|
|
58
34
|
```
|
|
59
35
|
|
|
60
|
-
|
|
61
|
-
```powershell
|
|
62
|
-
npm install -g @jsonstudio/rcc
|
|
63
|
-
rcc --version
|
|
64
|
-
```
|
|
65
|
-
|
|
66
|
-
安装成功后,`rcc --version` 会显示形如 `0.89.xxx (release)` 的版本信息;可通过 `npm update -g @jsonstudio/rcc` 升级,`npm uninstall -g @jsonstudio/rcc` 卸载。
|
|
36
|
+
## 使用
|
|
67
37
|
|
|
68
|
-
###
|
|
38
|
+
### 1) 初始化配置并启动
|
|
69
39
|
|
|
70
40
|
```bash
|
|
71
41
|
rcc init
|
|
72
42
|
rcc start
|
|
73
43
|
```
|
|
74
44
|
|
|
75
|
-
|
|
76
|
-
-
|
|
77
|
-
-
|
|
78
|
-
- `docs/INSTRUCTION_MARKUP.md`
|
|
79
|
-
- `docs/PORTS.md`
|
|
80
|
-
- `docs/PROVIDER_TYPES.md`
|
|
81
|
-
- `docs/CODEX_AND_CLAUDE_CODE.md`
|
|
82
|
-
|
|
83
|
-
### Dev CLI(本仓库)
|
|
84
|
-
开发者使用以下命令安装 dev CLI(必须先构建 sharedmodule):
|
|
85
|
-
|
|
86
|
-
```bash
|
|
87
|
-
npm --prefix sharedmodule/llmswitch-core run build
|
|
88
|
-
npm run build:dev
|
|
89
|
-
npm run install:global
|
|
90
|
-
```
|
|
91
|
-
|
|
92
|
-
> ⚠️ 禁止:`routecodex` 只用于本地调试,严禁发布到 npm。发布 `@jsonstudio/rcc` 必须使用 `npm run install:release`。
|
|
93
|
-
|
|
94
|
-
---
|
|
95
|
-
|
|
96
|
-
## 默认目录结构
|
|
97
|
-
|
|
98
|
-
| 系统 | 主配置 | Provider 配置 | 日志 / 快照 |
|
|
99
|
-
| --- | --- | --- | --- |
|
|
100
|
-
| macOS / Linux | `~/.routecodex/config.json`(或 `ROUTECODEX_CONFIG_PATH` 指定路径) | `~/.routecodex/provider/<name>/config.v1.json` | `~/.routecodex/logs`、`~/.routecodex/codex-samples/*` |
|
|
101
|
-
| Windows | `%USERPROFILE%\.routecodex\config.json` | `%USERPROFILE%\.routecodex\provider\<name>\config.v1.json` | `%USERPROFILE%\.routecodex\logs` 等 |
|
|
102
|
-
|
|
103
|
-
RouteCodex 会按以下优先级查找配置:
|
|
104
|
-
|
|
105
|
-
1. CLI 参数 `--config <path>`
|
|
106
|
-
2. 环境变量 `ROUTECODEX_CONFIG_PATH`
|
|
107
|
-
3. 默认路径(见上表)
|
|
108
|
-
|
|
109
|
-
---
|
|
110
|
-
|
|
111
|
-
## 无密钥配置样本
|
|
112
|
-
|
|
113
|
-
仓库附带了一份不含真实密钥的示例:`samples/configs/openai-chat-sample.json`。复制到本地后,只需提供环境变量即可启动。
|
|
114
|
-
也可以直接参考:`configsamples/config.reference.json`,或使用 `rcc init` 自动生成。
|
|
115
|
-
|
|
116
|
-
```json
|
|
117
|
-
{
|
|
118
|
-
"httpserver": { "host": "127.0.0.1", "port": 5555 },
|
|
119
|
-
"virtualrouter": {
|
|
120
|
-
"providers": {
|
|
121
|
-
"demo.glm": {
|
|
122
|
-
"providerType": "openai",
|
|
123
|
-
"protocol": "openai-chat",
|
|
124
|
-
"baseUrl": "https://api.example.com/v1",
|
|
125
|
-
"auth": { "type": "apikey", "env": "GLM_API_KEY" },
|
|
126
|
-
"models": {
|
|
127
|
-
"glm-4.6": {
|
|
128
|
-
"supportsStreaming": true,
|
|
129
|
-
"profiles": ["glm-default"]
|
|
130
|
-
}
|
|
131
|
-
}
|
|
132
|
-
}
|
|
133
|
-
},
|
|
134
|
-
"routing": {
|
|
135
|
-
"default": ["demo.glm.glm-4.6"]
|
|
136
|
-
}
|
|
137
|
-
}
|
|
138
|
-
}
|
|
139
|
-
```
|
|
140
|
-
|
|
141
|
-
使用步骤:
|
|
142
|
-
|
|
143
|
-
1. **复制样本**
|
|
144
|
-
```bash
|
|
145
|
-
mkdir -p ~/.routecodex
|
|
146
|
-
cp samples/configs/openai-chat-sample.json ~/.routecodex/config.json
|
|
147
|
-
```
|
|
148
|
-
2. **提供密钥(示例为环境变量)**
|
|
149
|
-
- macOS / Linux:`export GLM_API_KEY="sk-your-key"`
|
|
150
|
-
- Windows:`setx GLM_API_KEY "sk-your-key"`
|
|
151
|
-
3. **启动**
|
|
152
|
-
```bash
|
|
153
|
-
rcc start --config ~/.routecodex/config.json
|
|
154
|
-
```
|
|
155
|
-
4. **验证**
|
|
156
|
-
- 健康检查:`curl http://127.0.0.1:5555/health`
|
|
157
|
-
- Chat API:`curl http://127.0.0.1:5555/v1/chat/completions ...`
|
|
158
|
-
|
|
159
|
-
> 样本仅用于演示。请把 `baseUrl` / `routing` 更新为真实 provider,再通过环境变量、`authfile-*` 或 Secret 管理工具提供密钥。
|
|
160
|
-
|
|
161
|
-
### 自定义路由关键字
|
|
162
|
-
|
|
163
|
-
虚拟路由器内置了一组默认关键字(如 `思考/think` → `thinking` 路由,`vision/image` → `vision` 路由)。若希望在不覆盖默认词表的前提下追加命中词,可以在用户配置中加入 `virtualrouter.classifier.keywordInjections`:
|
|
164
|
-
|
|
165
|
-
```json
|
|
166
|
-
{
|
|
167
|
-
"virtualrouter": {
|
|
168
|
-
"classifier": {
|
|
169
|
-
"keywordInjections": {
|
|
170
|
-
"thinking": ["慢慢分析", "stepwise"],
|
|
171
|
-
"vision": ["截图如下"],
|
|
172
|
-
"background": ["context dump please"]
|
|
173
|
-
}
|
|
174
|
-
}
|
|
175
|
-
}
|
|
176
|
-
}
|
|
177
|
-
```
|
|
178
|
-
|
|
179
|
-
- 字段名对应路由类别(`thinking` / `background` / `vision` / `coding`),只需写新增词条即可,默认常量会自动保留。
|
|
180
|
-
- 若同一词出现在多个路由,将沿用 `ROUTE_PRIORITY`(`longcontext → thinking → vision → ...`)顺序做匹配。
|
|
181
|
-
- 更新配置文件后重启服务即可生效。
|
|
182
|
-
|
|
183
|
-
---
|
|
184
|
-
|
|
185
|
-
## 快速使用
|
|
186
|
-
|
|
187
|
-
1. **准备配置**:如上所述放置 `config.json` 或使用 `--config` 指定文件。
|
|
188
|
-
2. **启动 release server**
|
|
189
|
-
```bash
|
|
190
|
-
rcc start --config ~/.routecodex/config.json
|
|
191
|
-
```
|
|
192
|
-
CLI 会输出健康检查地址、配置文件路径和当前版本。
|
|
193
|
-
3. **调用 API**
|
|
194
|
-
- OpenAI Chat:`POST /v1/chat/completions`
|
|
195
|
-
- OpenAI Responses:`POST /v1/responses`
|
|
196
|
-
- Anthropic:`POST /v1/messages`
|
|
197
|
-
4. **开发者模式**
|
|
198
|
-
- `rcc code ...`:启动 Claude Code 并把所有请求代理到本地 RouteCodex。
|
|
199
|
-
- `rcc start --exclusive`:独占端口,自动终止旧实例。
|
|
45
|
+
默认配置路径:
|
|
46
|
+
- macOS / Linux:`~/.routecodex/config.json`
|
|
47
|
+
- Windows:`%USERPROFILE%\\.routecodex\\config.json`
|
|
200
48
|
|
|
201
|
-
|
|
49
|
+
`rcc init` 会在 `~/.routecodex/` 生成默认 `config.json`,并把常用文档复制到 `~/.routecodex/docs`。
|
|
202
50
|
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
- **AuthFile 引用**:在配置中使用 `authfile-<name>`,RouteCodex 会读取 `~/.routecodex/auth/<name>`。适用于多账号切换。
|
|
206
|
-
- **环境变量**:将 `auth.type` 设为 `apikey` 且 `env` 字段指定变量名,server 会在启动时解析。
|
|
207
|
-
- **provider profiles**:`src/providers/profile/` 定义了各 provider 允许的协议、Auth 方式及兼容 profile,可在配置中通过 `profiles` 字段引用。
|
|
208
|
-
|
|
209
|
-
更多细节见 `docs/CONFIG_ARCHITECTURE.md`。
|
|
210
|
-
|
|
211
|
-
---
|
|
212
|
-
|
|
213
|
-
## 开发者工作流
|
|
214
|
-
|
|
215
|
-
1. **克隆仓库并安装依赖**
|
|
216
|
-
```bash
|
|
217
|
-
git clone https://github.com/jsonstudio/routecodex.git
|
|
218
|
-
cd routecodex
|
|
219
|
-
npm install
|
|
220
|
-
```
|
|
221
|
-
2. **构建 sharedmodule(必要)**
|
|
222
|
-
```bash
|
|
223
|
-
npm --prefix sharedmodule/llmswitch-core run build
|
|
224
|
-
```
|
|
225
|
-
3. **编译与验证**
|
|
226
|
-
```bash
|
|
227
|
-
npm run build:dev # 生成 dist 并执行工具链验证
|
|
228
|
-
npm run install:global # 安装本地版 routecodex CLI
|
|
229
|
-
```
|
|
230
|
-
4. **与 release 区分**
|
|
231
|
-
- Release:使用 npm 安装 `@jsonstudio/rcc`
|
|
232
|
-
- Dev:仓库内 `routecodex` CLI,支持 `npm run start:bg` 等脚本
|
|
233
|
-
|
|
234
|
-
---
|
|
235
|
-
|
|
236
|
-
## 故障排查
|
|
237
|
-
|
|
238
|
-
| 症状 | 检查点 |
|
|
239
|
-
| --- | --- |
|
|
240
|
-
| `config:core:run` 提示缺失 | Release CLI 默认跳过动态 pipeline 生成;自定义流程可设置 `config:core:run` 脚本。 |
|
|
241
|
-
| SSE 变为 JSON | 检查入口 `stream` 字段与客户端 `Accept` 头;RouteCodex 会根据 inbound 请求保持一致。 |
|
|
242
|
-
| usage 始终 100% | 确保配置启用了对应 provider 的 `supportsStreaming`,并检查 `~/.routecodex/codex-samples/*` 快照确认 usage 字段已写入。 |
|
|
243
|
-
| Release install 验证失败 | 查看 `/tmp/routecodex-release-verify-*.log`;脚本位于 `scripts/install-verify.mjs`,可单独执行 `node scripts/install-verify.mjs --launcher cli --cli-binary rcc ...`。 |
|
|
244
|
-
|
|
245
|
-
---
|
|
246
|
-
|
|
247
|
-
---
|
|
248
|
-
|
|
249
|
-
## 参考文档
|
|
250
|
-
|
|
251
|
-
- `docs/ARCHITECTURE.md` – 全量架构细节与数据流
|
|
252
|
-
- `docs/CONFIG_ARCHITECTURE.md` – 配置解析、authfile、虚拟路由
|
|
253
|
-
- `docs/pipeline-routing-report.md` – Hub Pipeline 节点详解
|
|
254
|
-
- `docs/codex-samples-replay.md` – 快照与回放说明
|
|
255
|
-
|
|
256
|
-
如需提交问题或贡献代码,请查看 `CONTRIBUTING.md`(若不存在可参考 Issues 模板)并遵守 `AGENTS.md` 中的 V2 工作约定。
|
|
257
|
-
- **Provider层**: 统一HTTP通信、认证管理、连接池优化、双向请求响应处理
|
|
258
|
-
- **External AI Service层**: 多提供商AI模型支持、性能监控、双向数据流
|
|
259
|
-
|
|
260
|
-
### 🔧 智能路由系统
|
|
261
|
-
支持7种动态路由类别,自动选择最优处理流水线:
|
|
262
|
-
- `default`: 标准请求路由
|
|
263
|
-
- `longcontext`: 长文本处理请求(tiktoken 统计超过 180k token 时切向 ≥256k provider,例如 fai/c4m)
|
|
264
|
-
- `thinking`: 复杂推理请求
|
|
265
|
-
- `background`: 后台处理请求
|
|
266
|
-
- `websearch`: 网络搜索请求
|
|
267
|
-
- `vision`: 图像处理请求
|
|
268
|
-
- `coding`: 代码生成请求
|
|
269
|
-
|
|
270
|
-
**强制路由/模型标签(请求文本内插入 `<**...**>`)**
|
|
271
|
-
- `<**thinking|coding|tools|vision|websearch|longcontext|background**>`:强制命中对应路由,忽略其它关键词。
|
|
272
|
-
- `<**provider.model**>`:强制命中某个 provider 模型(如 `<**c4m.gpt-5.1-codex**>`,当 provider 存在并健康时直接命中)。
|
|
273
|
-
- 标签在路由阶段被剥离,真实请求不会把控制标签透传给上游。
|
|
274
|
-
|
|
275
|
-
### 🛠️ Provider V2架构
|
|
276
|
-
完全重构的Provider系统,提供:
|
|
277
|
-
- 统一的OpenAI标准接口(支持5大提供商)
|
|
278
|
-
- 配置驱动的服务适配(API Key + OAuth)
|
|
279
|
-
- 认证管理模块化
|
|
280
|
-
- 请求/响应快照系统
|
|
281
|
-
- Fail Fast错误处理机制
|
|
282
|
-
|
|
283
|
-
### 🎯 Dry-Run调试系统
|
|
284
|
-
完整的调试和测试框架:
|
|
285
|
-
- 节点级dry-run执行
|
|
286
|
-
- 智能输入模拟
|
|
287
|
-
- 双向管道处理
|
|
288
|
-
- 完整快照链路追踪
|
|
289
|
-
- 结构化错误分析
|
|
290
|
-
|
|
291
|
-
### 📊 实时监控界面
|
|
292
|
-
基于Web的综合调试界面:
|
|
293
|
-
- 实时系统监控
|
|
294
|
-
- 性能可视化
|
|
295
|
-
- 模块管理
|
|
296
|
-
- 事件探索
|
|
297
|
-
|
|
298
|
-
## 📦 支持的提供商
|
|
299
|
-
|
|
300
|
-
| 提供商 | 支持状态 | 认证方式 | 特色功能 | V2架构状态 |
|
|
301
|
-
|--------|----------|----------|----------|-------------|
|
|
302
|
-
| **OpenAI** | ✅ 完全支持 | API Key | GPT系列模型,DALL-E图像生成 | ✅ Provider V2 |
|
|
303
|
-
| **Anthropic** | ✅ 完全支持 | API Key | Claude系列模型,长上下文支持 | ✅ Provider V2 |
|
|
304
|
-
| **Qwen** | ✅ 完全支持 | OAuth | 阿里云通义千问系列,客户端元数据 | ✅ Provider V2 |
|
|
305
|
-
| **GLM** | ✅ 完全支持 | API Key | 智谱AI GLM系列,思考内容处理 | ✅ Compatibility V2 + Provider V2 |
|
|
306
|
-
| **LM Studio** | ✅ 完全支持 | API Key | 本地模型部署,工具调用支持 | ✅ Provider V2 |
|
|
307
|
-
| **iFlow** | ✅ 完全支持 | OAuth | 多模态AI服务,PKCE支持 | ✅ Provider V2 |
|
|
308
|
-
|
|
309
|
-
## 🚀 快速开始
|
|
310
|
-
|
|
311
|
-
### 系统要求
|
|
312
|
-
|
|
313
|
-
- **Node.js**: 20.0.0 或更高版本(推荐 < 26)
|
|
314
|
-
- **npm**: 8.0.0 或更高版本
|
|
315
|
-
- **操作系统**: Windows 10+, macOS 10.15+, Ubuntu 20.04+
|
|
316
|
-
- **内存**: 建议 4GB 以上
|
|
317
|
-
- **磁盘空间**: 500MB 可用空间
|
|
318
|
-
|
|
319
|
-
### 安装
|
|
320
|
-
|
|
321
|
-
#### 自动安装(推荐,dev 包 `routecodex`)
|
|
51
|
+
如果配置文件已存在,需要重新生成模板:
|
|
322
52
|
|
|
323
53
|
```bash
|
|
324
|
-
|
|
325
|
-
npm run install:global
|
|
54
|
+
rcc init --force
|
|
326
55
|
```
|
|
327
56
|
|
|
328
|
-
|
|
329
|
-
- ✅ 检查Node.js版本(需要>=20)
|
|
330
|
-
- ✅ 清理旧的安装残留
|
|
331
|
-
- ✅ 构建项目(编译为 dev 模式,默认端口 5555)
|
|
332
|
-
- ✅ 处理权限配置
|
|
333
|
-
- ✅ 全局安装到正确位置
|
|
334
|
-
- ✅ 验证安装结果
|
|
57
|
+
它会先备份旧配置为 `config.json.bak`(或 `config.json.bak.N`),再生成新模板。
|
|
335
58
|
|
|
336
|
-
|
|
59
|
+
### 2) 调用 API(示例)
|
|
337
60
|
|
|
338
|
-
|
|
61
|
+
健康检查:
|
|
339
62
|
|
|
340
63
|
```bash
|
|
341
|
-
|
|
342
|
-
git clone https://github.com/your-repo/routecodex.git
|
|
343
|
-
cd routecodex
|
|
344
|
-
|
|
345
|
-
# 安装依赖
|
|
346
|
-
npm install
|
|
347
|
-
|
|
348
|
-
# 构建项目
|
|
349
|
-
npm run build
|
|
350
|
-
|
|
351
|
-
# 全局安装(dev 包 routecodex)
|
|
352
|
-
npm install -g .
|
|
64
|
+
curl http://127.0.0.1:5555/health
|
|
353
65
|
```
|
|
354
66
|
|
|
355
|
-
|
|
67
|
+
OpenAI Chat:
|
|
356
68
|
|
|
357
69
|
```bash
|
|
358
|
-
|
|
359
|
-
|
|
70
|
+
curl http://127.0.0.1:5555/v1/chat/completions \
|
|
71
|
+
-H 'Content-Type: application/json' \
|
|
72
|
+
-d '{"model":"iflow.glm-4.7","messages":[{"role":"user","content":"hi"}],"stream":false}'
|
|
360
73
|
```
|
|
361
74
|
|
|
362
|
-
|
|
363
|
-
- 适合在实际使用环境中按配置文件严格控制监听端口。
|
|
364
|
-
|
|
365
|
-
#### 清理旧安装
|
|
366
|
-
|
|
367
|
-
如果遇到安装问题,可以先清理旧安装:
|
|
75
|
+
OpenAI Responses:
|
|
368
76
|
|
|
369
77
|
```bash
|
|
370
|
-
|
|
371
|
-
|
|
372
|
-
|
|
373
|
-
# 然后重新安装
|
|
374
|
-
npm run install:global
|
|
78
|
+
curl http://127.0.0.1:5555/v1/responses \
|
|
79
|
+
-H 'Content-Type: application/json' \
|
|
80
|
+
-d '{"model":"tab.gpt-5.2","input":[{"role":"user","content":"hi"}],"stream":false}'
|
|
375
81
|
```
|
|
376
82
|
|
|
377
|
-
|
|
378
|
-
|
|
379
|
-
如果遇到权限问题,请参考 [INSTALL.md](./INSTALL.md) 中的详细说明。
|
|
380
|
-
|
|
381
|
-
> 说明:统一使用 `scripts/install-global.sh`,支持自动权限处理和旧安装清理。安装脚本会在安装完成后自动使用 `~/.routecodex/provider/glm/config.v1.json` 启动一次服务器,并向模型发送“列出本地文件目录”的工具请求来验证端到端链路,请保证该配置文件存在且有效。
|
|
382
|
-
|
|
383
|
-
### 会话级路由 / sticky 指令语法总览
|
|
384
|
-
|
|
385
|
-
RouteCodex 支持在用户消息中通过 `<**...**>` 标签设置**当前会话的路由 / 粘性 / 禁用 / 自动续写**行为。这些标签只在路由层解析,不会透传给上游模型。
|
|
386
|
-
|
|
387
|
-
- **单次强制模型 / provider**
|
|
388
|
-
- `<**provider.model**>`:仅对当前请求强制使用某个模型
|
|
389
|
-
- 例:`<**glm.glm-4.7**>`、`<**antigravity.claude-sonnet-4-5**>`
|
|
390
|
-
- `<**provider**>`:将当前会话的 provider 白名单重置为该 provider
|
|
391
|
-
- 例:`<**antigravity**>`(只允许 antigravity 的所有模型/key 命中)
|
|
392
|
-
|
|
393
|
-
- **粘性(sticky)指定,跨轮生效**
|
|
394
|
-
- `<**!provider.model**>`:对当前会话粘在某个模型上,并在该模型的多 key 之间轮询
|
|
395
|
-
- 例:`<**!antigravity.claude-sonnet-4-5**>`
|
|
396
|
-
- `<**!provider.keyAlias.model**>` / `<**!provider.N**>`:粘在某一个具体 key 上,不再轮询其它 alias
|
|
397
|
-
- 例:`<**!antigravity.geminikey.gemini-3-pro-high**>`、`<**!openai.2**>`
|
|
398
|
-
|
|
399
|
-
- **白名单 / 禁用 / 解除禁用**
|
|
400
|
-
- 白名单(只允许这些 provider)
|
|
401
|
-
- `<**!glm**>`、`<**!glm,openai**>`
|
|
402
|
-
- 禁用(只对当前会话生效,支持 provider / keyAlias / 序号)
|
|
403
|
-
- `<**#glm**>`(禁用 glm 全部 key)
|
|
404
|
-
- `<**#openai.1**>`、`<**#anthropic.primary**>`
|
|
405
|
-
- 启用(解除禁用)
|
|
406
|
-
- `<**@glm**>`、`<**@openai.1**>`
|
|
407
|
-
|
|
408
|
-
- **清理所有路由状态**
|
|
409
|
-
- `<**clear**>`:清除 sticky / 白名单 / 禁用 状态,恢复默认路由
|
|
410
|
-
|
|
411
|
-
- **自动续写 stopMessage(基于 sticky 状态)**
|
|
412
|
-
- 启用 / 更新:
|
|
413
|
-
- `<**stopMessage:"继续"**>` → 默认最多自动续写 1 次
|
|
414
|
-
- `<**stopMessage:"继续",3**>` → 最多自动续写 3 次
|
|
415
|
-
- `<**stopMessage:<file://stopMessage/message1.md>**>` → 读取 `~/.routecodex/stopMessage/message1.md` 作为 stopMessage 文案(设置时读取并缓存到内存)
|
|
416
|
-
- 清理:
|
|
417
|
-
- `<**stopMessage:clear**>`
|
|
418
|
-
- 触发条件(由内置 `stop_message_auto` servertool 在服务端判断):
|
|
419
|
-
- 当前响应 `finish_reason = "stop"`;
|
|
420
|
-
- 当前轮没有工具调用(`tool_calls` 为空);
|
|
421
|
-
- `stopMessageUsed < stopMessageMaxRepeats` 且客户端仍连接。
|
|
422
|
-
- 会话要求:sticky 状态依赖 `sessionId` / `conversationId`。`/v1/messages` 请求请确保 `metadata.user_id` 内包含 `session_<uuid>` 字样,系统会在缺少 header/metadata.sessionId 时从 `metadata.__raw_request_body.metadata.user_id` 自动提取用作会话键。
|
|
423
|
-
- 行为:在保存的原始请求消息末尾追加一条 `{ role: "user", content: "<配置的文本>" }`,通过内部 `reenterPipeline` 自动发下一轮对话,对客户端透明。
|
|
424
|
-
|
|
425
|
-
> 完整说明、状态持久化规则及 daemon 管理示例,参见 `docs/routing-instructions.md`。
|
|
426
|
-
|
|
427
|
-
### 基础配置
|
|
428
|
-
|
|
429
|
-
1. **创建配置文件**
|
|
430
|
-
```bash
|
|
431
|
-
# 复制示例配置
|
|
432
|
-
cp config/examples/basic-config.json ~/.routecodex/config.json
|
|
433
|
-
```
|
|
434
|
-
|
|
435
|
-
2. **V2架构配置示例**
|
|
436
|
-
```json
|
|
437
|
-
{
|
|
438
|
-
"version": "1.0",
|
|
439
|
-
"providers": {
|
|
440
|
-
"glm-provider": {
|
|
441
|
-
"type": "chat-http-provider",
|
|
442
|
-
"config": {
|
|
443
|
-
"providerType": "openai",
|
|
444
|
-
"providerId": "glm",
|
|
445
|
-
"baseUrl": "https://open.bigmodel.cn/api/coding/paas/v4",
|
|
446
|
-
"auth": {
|
|
447
|
-
"type": "apikey",
|
|
448
|
-
"apiKey": "${GLM_API_KEY}"
|
|
449
|
-
},
|
|
450
|
-
"models": {
|
|
451
|
-
"glm-4": {
|
|
452
|
-
"maxTokens": 8192,
|
|
453
|
-
"temperature": 0.7
|
|
454
|
-
}
|
|
455
|
-
}
|
|
456
|
-
}
|
|
457
|
-
},
|
|
458
|
-
"qwen-provider": {
|
|
459
|
-
"type": "chat-http-provider",
|
|
460
|
-
"config": {
|
|
461
|
-
"providerType": "openai",
|
|
462
|
-
"auth": {
|
|
463
|
-
"type": "qwen-oauth",
|
|
464
|
-
"clientId": "${QWEN_CLIENT_ID}",
|
|
465
|
-
"clientSecret": "${QWEN_CLIENT_SECRET}",
|
|
466
|
-
"tokenFile": "${HOME}/.routecodex/auth/qwen-oauth.json"
|
|
467
|
-
}
|
|
468
|
-
}
|
|
469
|
-
}
|
|
470
|
-
},
|
|
471
|
-
"pipelines": [
|
|
472
|
-
{
|
|
473
|
-
"id": "glm-pipeline",
|
|
474
|
-
"providerId": "glm-provider",
|
|
475
|
-
"models": ["glm-4"],
|
|
476
|
-
"modules": {
|
|
477
|
-
"llmSwitch": { "type": "llmswitch-v2" },
|
|
478
|
-
"compatibility": { "type": "compat:passthrough" },
|
|
479
|
-
"provider": { "type": "chat-http-provider" }
|
|
480
|
-
}
|
|
481
|
-
}
|
|
482
|
-
],
|
|
483
|
-
"dynamicRouting": {
|
|
484
|
-
"enabled": true,
|
|
485
|
-
"defaultTarget": {
|
|
486
|
-
"providerId": "glm-provider",
|
|
487
|
-
"modelId": "glm-4"
|
|
488
|
-
}
|
|
489
|
-
}
|
|
490
|
-
}
|
|
491
|
-
```
|
|
492
|
-
|
|
493
|
-
3. **设置环境变量**
|
|
494
|
-
```bash
|
|
495
|
-
# GLM API密钥(智谱AI)
|
|
496
|
-
export GLM_API_KEY="your-glm-api-key"
|
|
497
|
-
|
|
498
|
-
# Qwen OAuth配置(阿里云)
|
|
499
|
-
export QWEN_CLIENT_ID="your-qwen-client-id"
|
|
500
|
-
export QWEN_CLIENT_SECRET="your-qwen-client-secret"
|
|
501
|
-
|
|
502
|
-
# 其他提供商密钥
|
|
503
|
-
export OPENAI_API_KEY="your-openai-api-key"
|
|
504
|
-
export ANTHROPIC_API_KEY="your-anthropic-api-key"
|
|
505
|
-
```
|
|
506
|
-
|
|
507
|
-
### 启动服务
|
|
508
|
-
|
|
509
|
-
```bash
|
|
510
|
-
# 启动RouteCodex服务器
|
|
511
|
-
routecodex start --config ~/.routecodex/config.json --port 5506
|
|
512
|
-
|
|
513
|
-
# 后台运行
|
|
514
|
-
routecodex start --config ~/.routecodex/config.json --port 5506 --daemon
|
|
515
|
-
|
|
516
|
-
# 前台运行(限时)
|
|
517
|
-
routecodex start --config ~/.routecodex/config.json --port 5506 --timeout 300
|
|
518
|
-
```
|
|
519
|
-
|
|
520
|
-
### 验证安装
|
|
521
|
-
|
|
522
|
-
```bash
|
|
523
|
-
# 检查版本
|
|
524
|
-
routecodex --version
|
|
525
|
-
|
|
526
|
-
# 检查配置
|
|
527
|
-
routecodex config validate
|
|
528
|
-
|
|
529
|
-
# 测试API连接
|
|
530
|
-
curl -X POST http://localhost:5506/v1/chat/completions \
|
|
531
|
-
-H "Content-Type: application/json" \
|
|
532
|
-
-H "Authorization: Bearer test-key" \
|
|
533
|
-
-d '{
|
|
534
|
-
"model": "gpt-3.5-turbo",
|
|
535
|
-
"messages": [{"role": "user", "content": "Hello, world!"}]
|
|
536
|
-
}'
|
|
537
|
-
```
|
|
538
|
-
|
|
539
|
-
## 📖 使用指南
|
|
540
|
-
|
|
541
|
-
### 基础API调用
|
|
542
|
-
|
|
543
|
-
RouteCodex提供与OpenAI完全兼容的API接口:
|
|
544
|
-
|
|
545
|
-
#### Chat Completions
|
|
546
|
-
|
|
547
|
-
```bash
|
|
548
|
-
curl -X POST http://localhost:5506/v1/chat/completions \
|
|
549
|
-
-H "Content-Type: application/json" \
|
|
550
|
-
-H "Authorization: Bearer your-api-key" \
|
|
551
|
-
-d '{
|
|
552
|
-
"model": "gpt-4",
|
|
553
|
-
"messages": [
|
|
554
|
-
{"role": "system", "content": "You are a helpful assistant."},
|
|
555
|
-
{"role": "user", "content": "Explain quantum computing in simple terms."}
|
|
556
|
-
],
|
|
557
|
-
"max_tokens": 1000,
|
|
558
|
-
"temperature": 0.7
|
|
559
|
-
}'
|
|
560
|
-
```
|
|
561
|
-
|
|
562
|
-
#### 工具调用
|
|
563
|
-
|
|
564
|
-
```bash
|
|
565
|
-
curl -X POST http://localhost:5506/v1/chat/completions \
|
|
566
|
-
-H "Content-Type: application/json" \
|
|
567
|
-
-H "Authorization: Bearer your-api-key" \
|
|
568
|
-
-d '{
|
|
569
|
-
"model": "gpt-4",
|
|
570
|
-
"messages": [
|
|
571
|
-
{"role": "user", "content": "What is the weather in Tokyo?"}
|
|
572
|
-
],
|
|
573
|
-
"tools": [
|
|
574
|
-
{
|
|
575
|
-
"type": "function",
|
|
576
|
-
"function": {
|
|
577
|
-
"name": "get_weather",
|
|
578
|
-
"description": "Get current weather information",
|
|
579
|
-
"parameters": {
|
|
580
|
-
"type": "object",
|
|
581
|
-
"properties": {
|
|
582
|
-
"location": {"type": "string", "description": "City name"}
|
|
583
|
-
},
|
|
584
|
-
"required": ["location"]
|
|
585
|
-
}
|
|
586
|
-
}
|
|
587
|
-
}
|
|
588
|
-
]
|
|
589
|
-
}'
|
|
590
|
-
```
|
|
591
|
-
|
|
592
|
-
#### 流式响应
|
|
593
|
-
|
|
594
|
-
```bash
|
|
595
|
-
curl -X POST http://localhost:5506/v1/chat/completions \
|
|
596
|
-
-H "Content-Type: application/json" \
|
|
597
|
-
-H "Authorization: Bearer your-api-key" \
|
|
598
|
-
-d '{
|
|
599
|
-
"model": "gpt-4",
|
|
600
|
-
"messages": [{"role": "user", "content": "Write a short story"}],
|
|
601
|
-
"stream": true
|
|
602
|
-
}'
|
|
603
|
-
```
|
|
604
|
-
|
|
605
|
-
### 高级功能
|
|
606
|
-
|
|
607
|
-
#### 动态路由配置
|
|
608
|
-
|
|
609
|
-
```json
|
|
610
|
-
{
|
|
611
|
-
"dynamicRouting": {
|
|
612
|
-
"enabled": true,
|
|
613
|
-
"categories": {
|
|
614
|
-
"longcontext": {
|
|
615
|
-
"targets": [
|
|
616
|
-
{
|
|
617
|
-
"providerId": "fai-provider",
|
|
618
|
-
"modelId": "gpt-5.1-codex"
|
|
619
|
-
},
|
|
620
|
-
{
|
|
621
|
-
"providerId": "c4m-provider",
|
|
622
|
-
"modelId": "gpt-5.1-codex"
|
|
623
|
-
}
|
|
624
|
-
],
|
|
625
|
-
"triggers": [
|
|
626
|
-
{"type": "token_count", "threshold": 180000},
|
|
627
|
-
{"type": "content_type", "value": "document"}
|
|
628
|
-
]
|
|
629
|
-
},
|
|
630
|
-
"coding": {
|
|
631
|
-
"targets": [
|
|
632
|
-
{
|
|
633
|
-
"providerId": "qwen-provider",
|
|
634
|
-
"modelId": "qwen3-coder-plus"
|
|
635
|
-
}
|
|
636
|
-
],
|
|
637
|
-
"triggers": [
|
|
638
|
-
{"type": "keyword", "values": ["code", "function", "bug"]},
|
|
639
|
-
{"type": "language_detection", "languages": ["python", "javascript", "typescript"]}
|
|
640
|
-
]
|
|
641
|
-
}
|
|
642
|
-
}
|
|
643
|
-
}
|
|
644
|
-
}
|
|
645
|
-
```
|
|
646
|
-
|
|
647
|
-
#### Dry-Run调试
|
|
83
|
+
Anthropic Messages:
|
|
648
84
|
|
|
649
85
|
```bash
|
|
650
|
-
|
|
651
|
-
|
|
652
|
-
|
|
653
|
-
# 运行dry-run测试
|
|
654
|
-
routecodex dry-run --config ~/.routecodex/config.json --test-file examples/test-request.json
|
|
655
|
-
|
|
656
|
-
# 生成dry-run报告
|
|
657
|
-
routecodex dry-run --config ~/.routecodex/config.json --output-report debug-report.json
|
|
86
|
+
curl http://127.0.0.1:5555/v1/messages \
|
|
87
|
+
-H 'Content-Type: application/json' \
|
|
88
|
+
-d '{"model":"anthropic.claude-sonnet-4-5","messages":[{"role":"user","content":"hi"}],"stream":false}'
|
|
658
89
|
```
|
|
659
90
|
|
|
660
|
-
|
|
661
|
-
|
|
662
|
-
```bash
|
|
663
|
-
# 启用监控
|
|
664
|
-
routecodex start --config ~/.routecodex/config.json --monitoring
|
|
665
|
-
|
|
666
|
-
# 查看性能指标
|
|
667
|
-
curl http://localhost:5506/api/debug/metrics
|
|
668
|
-
|
|
669
|
-
# 导出监控数据
|
|
670
|
-
curl http://localhost:5506/api/debug/export/json > monitoring-data.json
|
|
671
|
-
```
|
|
672
|
-
|
|
673
|
-
## 🏗️ 架构设计
|
|
674
|
-
|
|
675
|
-
### 整体架构图
|
|
676
|
-
|
|
677
|
-
```
|
|
678
|
-
┌─────────────────────────────────────────────────────────────────┐
|
|
679
|
-
│ RouteCodex V2 双向流水线架构 │
|
|
680
|
-
├─────────────────────────────────────────────────────────────────┤
|
|
681
|
-
│ │
|
|
682
|
-
│ ┌─────────────────┐ ┌─────────────────┐ ┌─────────────────┐ │
|
|
683
|
-
│ │ HTTP Server │ │ WebSocket │ │ Debug API │ │
|
|
684
|
-
│ │ (双向通信) │ │ Interface │ │ (双向监控) │ │
|
|
685
|
-
│ │ • REST API │ │ • Real-time │ │ • Metrics │ │
|
|
686
|
-
│ │ • Streaming │ │ updates │ │ • Event log │ │
|
|
687
|
-
│ │ • Authentication│ │ • Monitoring │ │ • Health check │ │
|
|
688
|
-
│ └─────────────────┘ └─────────────────┘ └─────────────────┘ │
|
|
689
|
-
│ ▲▼ ▲▼ ▲▼ │
|
|
690
|
-
│ │
|
|
691
|
-
│ ┌─────────────────────────────────────────────────────────────┐ │
|
|
692
|
-
│ │ 双向4-Layer Pipeline Architecture │ │
|
|
693
|
-
│ │ ▲▼ 双向数据流 │ │
|
|
694
|
-
│ │ ┌─────────────┬──────────────┬──────────────────────────┐ │ │
|
|
695
|
-
│ │ │LLM Switch │ Compatibility │ Provider │ │ │
|
|
696
|
-
│ │ │ Workflow │ Layer │ Layer │ │ │
|
|
697
|
-
│ │ │ ▲▼ │ ▲▼ │ ▲▼ │ │ │
|
|
698
|
-
│ │ │ • 双向路由 │ • 双向格式 │ • 双向HTTP通信 │ │ │
|
|
699
|
-
│ │ │ • 双向协议 │ 转换 │ • 双向认证 │ │ │
|
|
700
|
-
│ │ │ • 双向分类 │ • 双向字段 │ • 双向错误处理 │ │ │
|
|
701
|
-
│ │ │ • 工具统一 │ 映射 │ • 双向健康监控 │ │ │
|
|
702
|
-
│ │ │ 处理 │ │ │ │ │
|
|
703
|
-
│ │ └─────────────┴──────────────┴──────────────────────────┘ │ │
|
|
704
|
-
│ └─────────────────────────────────────────────────────────────┘ │
|
|
705
|
-
│ ▲▼ 双向工具处理循环 │
|
|
706
|
-
│ │
|
|
707
|
-
│ ┌─────────────────────────────────────────────────────────────┐ │
|
|
708
|
-
│ │ llmswitch-core 双向工具处理核心 │ │
|
|
709
|
-
│ │ ▲▼ │ │
|
|
710
|
-
│ │ ┌─────────────┬──────────────┬──────────────────────────┐ │ │
|
|
711
|
-
│ │ │ 工具规范化器 │ 文本收割器 │ 系统工具指引 │ │ │
|
|
712
|
-
│ │ │ ▲▼ │ ▲▼ │ ▲▼ │ │ │
|
|
713
|
-
│ │ │ • 双向规范 │ • 双向收割 │ • 双向schema增强 │ │ │
|
|
714
|
-
│ │ │ • 双向生成 │ • 双向提取 │ • 双向指引注入 │ │ │
|
|
715
|
-
│ │ │ • 双向去重 │ • 双向清理 │ • 双向行为标准化 │ │ │
|
|
716
|
-
│ │ └─────────────┴──────────────┴──────────────────────────┘ │ │
|
|
717
|
-
│ └─────────────────────────────────────────────────────────────┘ │
|
|
718
|
-
│ │
|
|
719
|
-
│ ┌─────────────────────────────────────────────────────────────┐ │
|
|
720
|
-
│ │ Configuration & Management │ │
|
|
721
|
-
│ │ ▲▼ │ │
|
|
722
|
-
│ │ ┌─────────────┬──────────────┬──────────────────────────┐ │ │
|
|
723
|
-
│ │ │ Config │ Monitoring │ Dry-Run System │ │ │
|
|
724
|
-
│ │ │ Engine │ │ │ │ │
|
|
725
|
-
│ │ │ • 双向JSON │ • 双向性能 │ • 双向节点级执行 │ │ │
|
|
726
|
-
│ │ │ • 双向验证 │ • 双向指标 │ • 双向输入模拟 │ │ │
|
|
727
|
-
│ │ │ • 双向热重载 │ • 双向健康 │ • 双向错误边界 │ │ │
|
|
728
|
-
│ │ └─────────────┴──────────────┴──────────────────────────┘ │ │
|
|
729
|
-
│ └─────────────────────────────────────────────────────────────┘ │
|
|
730
|
-
└─────────────────────────────────────────────────────────────────┘
|
|
731
|
-
|
|
732
|
-
▲▼ 双向数据流:请求流(↓)和响应流(↑)在每一层双向传递
|
|
733
|
-
工具循环:工具选择 → llmswitch处理 → Provider修剪 → AI执行 → 结果收集 → 下一轮请求
|
|
734
|
-
```
|
|
735
|
-
|
|
736
|
-
### 核心组件
|
|
737
|
-
|
|
738
|
-
#### 1. LLM Switch Workflow层
|
|
739
|
-
- **双向动态路由分类**: 基于请求内容自动选择处理流水线
|
|
740
|
-
- **双向协议转换**: OpenAI ↔ Anthropic ↔ Gemini协议双向转换
|
|
741
|
-
- **llmswitch-core工具处理**: 统一工具调用处理、文本收割、系统指引
|
|
742
|
-
- **双向请求预处理**: 模型映射、参数标准化、工具调用处理
|
|
743
|
-
|
|
744
|
-
#### 2. Compatibility层
|
|
745
|
-
- **双向格式转换**: 字段映射、数据结构适配、双向修剪转换
|
|
746
|
-
- **双向提供商适配**: 处理不同提供商的特殊要求
|
|
747
|
-
- **双向响应标准化**: 统一输出格式,错误处理,字段映射
|
|
748
|
-
|
|
749
|
-
#### 3. Provider层 (V2)
|
|
750
|
-
- **双向统一接口**: 标准化的Provider实现,支持双向请求响应
|
|
751
|
-
- **双向认证管理**: API Key、OAuth、会话管理
|
|
752
|
-
- **双向连接管理**: 连接池、重试机制、健康检查、双向HTTP通信
|
|
753
|
-
- **协议化实现**: `chat-http-provider.ts`、`responses-http-provider.ts`、`anthropic-http-provider.ts`、`gemini-http-provider.ts` 分别对应四大协议,通过 ProviderComposite 执行最小兼容,再交由 Provider Runtime Profile 注入 baseURL/headers/auth。
|
|
754
|
-
|
|
755
|
-
#### 4. External AI Service层
|
|
756
|
-
- **双向多提供商支持**: 统一的AI服务接口,双向数据流
|
|
757
|
-
- **双向模型管理**: 动态模型加载、能力检测
|
|
758
|
-
- **双向性能优化**: 批量处理、缓存机制、双向监控
|
|
759
|
-
|
|
760
|
-
### 配置系统
|
|
761
|
-
|
|
762
|
-
#### 配置文件结构
|
|
763
|
-
```json
|
|
764
|
-
{
|
|
765
|
-
"version": "1.0",
|
|
766
|
-
"server": {
|
|
767
|
-
"host": "0.0.0.0",
|
|
768
|
-
"port": 5506,
|
|
769
|
-
"cors": {
|
|
770
|
-
"enabled": true,
|
|
771
|
-
"origins": ["*"]
|
|
772
|
-
}
|
|
773
|
-
},
|
|
774
|
-
"providers": {
|
|
775
|
-
"provider-id": {
|
|
776
|
-
"type": "chat-http-provider|responses-http-provider|anthropic-http-provider|gemini-http-provider",
|
|
777
|
-
"enabled": true,
|
|
778
|
-
"config": {
|
|
779
|
-
"providerType": "openai|responses|anthropic|gemini",
|
|
780
|
-
"providerId": "glm|qwen|c4m",
|
|
781
|
-
"baseUrl": "https://api.provider.com/v1",
|
|
782
|
-
"auth": {
|
|
783
|
-
"type": "apikey|oauth",
|
|
784
|
-
"apiKey": "${API_KEY}" | "oauth-config"
|
|
785
|
-
},
|
|
786
|
-
"models": {
|
|
787
|
-
"model-id": {
|
|
788
|
-
"maxTokens": 8192,
|
|
789
|
-
"temperature": 0.7,
|
|
790
|
-
"supportsTools": true,
|
|
791
|
-
"supportsStreaming": true
|
|
792
|
-
}
|
|
793
|
-
},
|
|
794
|
-
"overrides": {
|
|
795
|
-
"defaultModel": "gpt-4",
|
|
796
|
-
"headers": {
|
|
797
|
-
"User-Agent": "RouteCodex/2.0"
|
|
798
|
-
}
|
|
799
|
-
}
|
|
800
|
-
}
|
|
801
|
-
}
|
|
802
|
-
},
|
|
803
|
-
"pipelines": [
|
|
804
|
-
{
|
|
805
|
-
"id": "pipeline-id",
|
|
806
|
-
"providerId": "provider-id",
|
|
807
|
-
"models": ["model-1", "model-2"],
|
|
808
|
-
"modules": {
|
|
809
|
-
"llmSwitch": {
|
|
810
|
-
"type": "openai-passthrough|anthropic-converter",
|
|
811
|
-
"config": {}
|
|
812
|
-
},
|
|
813
|
-
"compatibility": {
|
|
814
|
-
"type": "openai-normalizer|field-mapping",
|
|
815
|
-
"config": {}
|
|
816
|
-
},
|
|
817
|
-
"provider": {
|
|
818
|
-
"type": "openai-http|anthropic-http",
|
|
819
|
-
"config": {}
|
|
820
|
-
}
|
|
821
|
-
},
|
|
822
|
-
"hooks": {
|
|
823
|
-
"preProcess": [],
|
|
824
|
-
"postProcess": []
|
|
825
|
-
}
|
|
826
|
-
}
|
|
827
|
-
],
|
|
828
|
-
"dynamicRouting": {
|
|
829
|
-
"enabled": true,
|
|
830
|
-
"defaultTarget": {
|
|
831
|
-
"providerId": "default-provider",
|
|
832
|
-
"modelId": "default-model"
|
|
833
|
-
},
|
|
834
|
-
"categories": {
|
|
835
|
-
"category-id": {
|
|
836
|
-
"targets": [
|
|
837
|
-
{
|
|
838
|
-
"providerId": "provider-id",
|
|
839
|
-
"modelId": "model-id",
|
|
840
|
-
"weight": 1.0
|
|
841
|
-
}
|
|
842
|
-
],
|
|
843
|
-
"triggers": [
|
|
844
|
-
{
|
|
845
|
-
"type": "token_count|content_type|keyword|language_detection",
|
|
846
|
-
"condition": ">=|<=|==|contains|matches",
|
|
847
|
-
"value": "threshold|pattern|list"
|
|
848
|
-
}
|
|
849
|
-
]
|
|
850
|
-
}
|
|
851
|
-
}
|
|
852
|
-
},
|
|
853
|
-
"monitoring": {
|
|
854
|
-
"enabled": true,
|
|
855
|
-
"metrics": {
|
|
856
|
-
"performance": true,
|
|
857
|
-
"errors": true,
|
|
858
|
-
"usage": true
|
|
859
|
-
},
|
|
860
|
-
"logging": {
|
|
861
|
-
"level": "info",
|
|
862
|
-
"format": "json"
|
|
863
|
-
}
|
|
864
|
-
},
|
|
865
|
-
"dryRun": {
|
|
866
|
-
"enabled": false,
|
|
867
|
-
"global": {
|
|
868
|
-
"defaultMode": "output-validation",
|
|
869
|
-
"verbosity": "normal",
|
|
870
|
-
"autoCleanup": true
|
|
871
|
-
},
|
|
872
|
-
"memory": {
|
|
873
|
-
"maxMemoryUsage": 536870912,
|
|
874
|
-
"cleanupInterval": 60000,
|
|
875
|
-
"enableMonitoring": true
|
|
876
|
-
}
|
|
877
|
-
}
|
|
878
|
-
}
|
|
879
|
-
```
|
|
880
|
-
|
|
881
|
-
## 🔧 开发指南
|
|
882
|
-
|
|
883
|
-
### 项目结构
|
|
884
|
-
|
|
885
|
-
```
|
|
886
|
-
routecodex/
|
|
887
|
-
├── src/ # 源代码目录
|
|
888
|
-
│ ├── cli.ts # CLI入口点
|
|
889
|
-
│ ├── index.ts # 主模块入口
|
|
890
|
-
│ ├── commands/ # CLI命令实现
|
|
891
|
-
│ │ ├── start.ts # 启动命令
|
|
892
|
-
│ │ ├── config.ts # 配置命令
|
|
893
|
-
│ │ ├── dry-run.ts # Dry-run命令
|
|
894
|
-
│ │ └── debug.ts # 调试命令
|
|
895
|
-
│ ├── server/ # HTTP服务器
|
|
896
|
-
│ │ ├── http-server.ts # 主HTTP服务器
|
|
897
|
-
│ │ ├── websocket-server.ts # WebSocket服务器
|
|
898
|
-
│ │ └── handlers/ # API处理器
|
|
899
|
-
│ ├── modules/ # 核心模块
|
|
900
|
-
│ │ ├── pipeline/ # 4层管道架构
|
|
901
|
-
│ │ │ ├── modules/ # 管道模块
|
|
902
|
-
│ │ │ │ ├── provider/ # Provider V2模块
|
|
903
|
-
│ │ │ │ └── ...
|
|
904
|
-
│ │ │ └── ...
|
|
905
|
-
│ │ ├── config-manager/ # 配置管理
|
|
906
|
-
│ │ ├── monitoring/ # 监控系统
|
|
907
|
-
│ │ └── debug/ # 调试系统
|
|
908
|
-
│ └── types/ # TypeScript类型定义
|
|
909
|
-
├── sharedmodule/ # 共享模块
|
|
910
|
-
│ ├── llmswitch-core/ # LLM转换核心
|
|
911
|
-
│ ├── config-engine/ # 配置引擎
|
|
912
|
-
│ └── config-testkit/ # 配置测试工具
|
|
913
|
-
├── config/ # 配置文件
|
|
914
|
-
│ ├── examples/ # 配置示例
|
|
915
|
-
│ └── schemas/ # JSON Schema定义
|
|
916
|
-
├── scripts/ # 构建和安装脚本
|
|
917
|
-
├── web-interface/ # Web调试界面
|
|
918
|
-
├── docs/ # 文档
|
|
919
|
-
├── tests/ # 测试文件
|
|
920
|
-
└── vendor/ # 第三方依赖
|
|
921
|
-
```
|
|
922
|
-
|
|
923
|
-
#### HTTP服务器职责(精简版)
|
|
924
|
-
|
|
925
|
-
- 服务器只负责 **HTTP ↔ Hub Pipeline** 转发:`/v1/chat`、`/v1/messages`、`/v1/responses` handler 将请求封装为 `HubPipelineRequest`,调用 `hubPipeline.execute()`,然后把返回的 provider payload/runtimeKey 交给对应 Provider。
|
|
926
|
-
- ProviderPool、兼容层、Virtual Router、工具治理都由 llmswitch-core 完成。Host 只在启动时执行 `bootstrapVirtualRouterConfig`、构造 Hub Pipeline,并根据 `targetRuntime` 初始化 Provider 实例。
|
|
927
|
-
- Provider runtime map 是唯一的数据来源:`bootstrapVirtualRouterConfig` 会输出 `targetRuntime[providerKey]`,Server 把该 profile 注入 `ChatHttpProvider`/`ResponsesHttpProvider`/`AnthropicHttpProvider`,同时通过 `attachProviderRuntimeMetadata` 把 `providerKey/runtimeKey/routeName` 写入请求体,确保错误上报与熔断都能定位到具体 key-alias。
|
|
928
|
-
- SSE/JSON 序列化、错误处理、日志快照均由 llmswitch-core 的节点链完成,HTTP handler 不再负责心跳/重试等逻辑,真正实现“瘦”外壳,便于未来接入自定义编排。
|
|
929
|
-
|
|
930
|
-
### 🏗️ 兼容层架构重构
|
|
931
|
-
|
|
932
|
-
#### 概述
|
|
933
|
-
|
|
934
|
-
RouteCodex V2架构已完成兼容层的函数化重构,实现了两层架构设计,大幅提升了代码可维护性和模块化程度。
|
|
935
|
-
|
|
936
|
-
#### 两层架构设计
|
|
937
|
-
|
|
938
|
-
**第一层:接口兼容层**
|
|
939
|
-
- 保持现有接口完全不变
|
|
940
|
-
- 确保与PipelineManager的集成无任何破坏性改动
|
|
941
|
-
- 提供向后兼容性和稳定性
|
|
942
|
-
|
|
943
|
-
**第二层:函数化实现层**
|
|
944
|
-
- 将复杂逻辑拆分为纯函数
|
|
945
|
-
- 单一职责原则,每个函数专注特定功能
|
|
946
|
-
- 易于测试、维护和扩展
|
|
947
|
-
|
|
948
|
-
#### 重构成果
|
|
949
|
-
|
|
950
|
-
**代码减少统计**
|
|
951
|
-
- GLM兼容模块:234行 → 141行(减少40%)
|
|
952
|
-
- iFlow兼容模块:201行 → 115行(减少43%)
|
|
953
|
-
- 总计减少冗余代码:约740行
|
|
954
|
-
|
|
955
|
-
**架构优化**
|
|
956
|
-
- 移除重复wrapper实现
|
|
957
|
-
- 统一适配器模式(`CompatibilityToPipelineAdapter`)
|
|
958
|
-
- 正确的上下文传递和元数据管理
|
|
959
|
-
- 完整的模块注册机制
|
|
960
|
-
|
|
961
|
-
#### 核心文件结构
|
|
962
|
-
|
|
963
|
-
```
|
|
964
|
-
sharedmodule/llmswitch-core/src/conversion/compat/
|
|
965
|
-
├── compat/profile-store # built-in profile registry
|
|
966
|
-
├── profiles/chat-*.json # chat models(glm / qwen / iflow / lmstudio ...)
|
|
967
|
-
├── profiles/responses-*.json # responses family(c4m、fai……)
|
|
968
|
-
└── compat-engine.ts # request/response 映射引擎
|
|
969
|
-
|
|
970
|
-
⚠️ 0.89.258 起,兼容逻辑 **全部** 驻留在 llmswitch-core,由 virtual router 在命中 provider 后将 `compatibilityProfile` 注入 Hub Pipeline。Host 仓库已删除 `src/providers/compat/*`,仅保留 provider/runtime/handler;新增的兼容需求请直接在 sharedmodule 中新增 profile 并引用。
|
|
971
|
-
```
|
|
972
|
-
|
|
973
|
-
#### 函数化实现模式
|
|
974
|
-
|
|
975
|
-
每个Provider模块采用统一的函数化模式:
|
|
976
|
-
|
|
977
|
-
```typescript
|
|
978
|
-
// 函数化处理器(functions/provider-processor.ts)
|
|
979
|
-
export const processProviderIncoming = async (request, config, context) => {
|
|
980
|
-
// 请求处理逻辑
|
|
981
|
-
};
|
|
982
|
-
|
|
983
|
-
export const processProviderOutgoing = async (response, config, context) => {
|
|
984
|
-
// 响应处理逻辑
|
|
985
|
-
};
|
|
986
|
-
|
|
987
|
-
export const sanitizeProviderToolsSchema = async (tools, config, context) => {
|
|
988
|
-
// 工具schema清理
|
|
989
|
-
};
|
|
990
|
-
|
|
991
|
-
// 兼容模块主类(provider/provider-compatibility.ts)
|
|
992
|
-
export class ProviderCompatibility implements CompatibilityModule {
|
|
993
|
-
async processIncoming(request: UnknownObject, context: CompatibilityContext): Promise<UnknownObject> {
|
|
994
|
-
return await processProviderIncoming(request, this.processConfig, context);
|
|
995
|
-
}
|
|
996
|
-
}
|
|
997
|
-
```
|
|
998
|
-
|
|
999
|
-
#### 关键技术修复
|
|
1000
|
-
|
|
1001
|
-
1. **模块注册修复**:在PipelineManager中正确注册GLM和iFlow模块
|
|
1002
|
-
2. **上下文传递修复**:从SharedPipelineRequest.route.requestId提取真实ID
|
|
1003
|
-
3. **端点识别修复**:在CompatibilityContext顶层设置entryEndpoint
|
|
1004
|
-
4. **接口扩展**:为CompatibilityContext添加entryEndpoint字段
|
|
1005
|
-
|
|
1006
|
-
#### 使用示例
|
|
1007
|
-
|
|
1008
|
-
**创建新的Provider兼容模块**
|
|
1009
|
-
|
|
1010
|
-
```typescript
|
|
1011
|
-
// 1. 创建functions/processor.ts
|
|
1012
|
-
export const processNewProviderIncoming = async (request, config, context) => {
|
|
1013
|
-
// 实现新Provider的请求转换逻辑
|
|
1014
|
-
};
|
|
1015
|
-
|
|
1016
|
-
// 2. 创建兼容模块主类
|
|
1017
|
-
export class NewProviderCompatibility implements CompatibilityModule {
|
|
1018
|
-
// 实现CompatibilityModule接口
|
|
1019
|
-
async processIncoming(request: UnknownObject, context: CompatibilityContext): Promise<UnknownObject> {
|
|
1020
|
-
return await processNewProviderIncoming(request, this.processConfig, context);
|
|
1021
|
-
}
|
|
1022
|
-
}
|
|
1023
|
-
|
|
1024
|
-
// 3. 在PipelineManager中注册
|
|
1025
|
-
this.registry.registerModule("new-provider", this.createNewProviderCompatibilityModule);
|
|
1026
|
-
```
|
|
1027
|
-
|
|
1028
|
-
### 构建和开发
|
|
1029
|
-
|
|
1030
|
-
```bash
|
|
1031
|
-
# 安装依赖
|
|
1032
|
-
npm install
|
|
1033
|
-
|
|
1034
|
-
# 开发模式(热重载)
|
|
1035
|
-
npm run dev
|
|
1036
|
-
|
|
1037
|
-
# 构建项目
|
|
1038
|
-
npm run build
|
|
1039
|
-
|
|
1040
|
-
# 运行测试
|
|
1041
|
-
npm test
|
|
1042
|
-
|
|
1043
|
-
# 代码检查
|
|
1044
|
-
npm run lint
|
|
1045
|
-
|
|
1046
|
-
# 自动修复lint问题
|
|
1047
|
-
npm run lint:fix
|
|
1048
|
-
|
|
1049
|
-
# 类型检查
|
|
1050
|
-
npm run type-check
|
|
1051
|
-
|
|
1052
|
-
# 清理构建文件
|
|
1053
|
-
npm run clean
|
|
1054
|
-
```
|
|
1055
|
-
|
|
1056
|
-
### 测试
|
|
1057
|
-
|
|
1058
|
-
```bash
|
|
1059
|
-
# 运行所有测试
|
|
1060
|
-
npm test
|
|
1061
|
-
|
|
1062
|
-
# 运行特定测试
|
|
1063
|
-
npm test -- --grep "provider"
|
|
1064
|
-
|
|
1065
|
-
# 运行集成测试
|
|
1066
|
-
npm run test:integration
|
|
1067
|
-
|
|
1068
|
-
# 运行E2E测试
|
|
1069
|
-
npm run test:e2e
|
|
1070
|
-
|
|
1071
|
-
# 生成测试覆盖率报告
|
|
1072
|
-
npm run test:coverage
|
|
1073
|
-
|
|
1074
|
-
# 运行性能测试
|
|
1075
|
-
npm run test:performance
|
|
1076
|
-
|
|
1077
|
-
# 黄金样本 + Mock 回归(覆盖 chat/responses/anthropic)
|
|
1078
|
-
npm run test:golden
|
|
1079
|
-
|
|
1080
|
-
# 将 ~/.routecodex/golden_samples/new/** 同步到仓库内的 samples/ci-goldens/**
|
|
1081
|
-
npm run sync:ci-goldens
|
|
1082
|
-
```
|
|
1083
|
-
|
|
1084
|
-
#### Provider 专项测试
|
|
1085
|
-
|
|
1086
|
-
| 测试文件 | 作用 |
|
|
1087
|
-
| --- | --- |
|
|
1088
|
-
| `tests/provider/provider-outbound-provider.test.ts` | 使用黄金样本(openai-chat/responses)验证 `ChatHttpProvider`/`ResponsesHttpProvider` 的请求整形、兼容层开关以及 HTTP 头部/模型注入。 |
|
|
1089
|
-
| `tests/provider/provider-outbound-param.test.ts` | 从 `~/.routecodex/codex-samples` 按需加载聊天快照,分别对 openai/responses/anthropic 协议执行出站整形,确保三条链路共用相同 payload。 |
|
|
1090
|
-
| `tests/provider/provider-composite-guards.test.ts` | 覆盖 ProviderComposite 的协议守卫(protocol ↔ providerType),模拟 ErrorCenter 回调,确保 mismatch 会 fail fast。 |
|
|
1091
|
-
| `tests/provider/provider-factory.test.ts` | 校验 ProviderFactory 的 Fail-Fast 行为,未知 `providerType/moduleType` 会直接抛错,防止静默回退。 |
|
|
1092
|
-
|
|
1093
|
-
> 建议在跑专项测试前设置 `RCC_TEST_FAKE_OPENAI_COMPAT=1` 等 mock 环境变量,以避免真实兼容模块加载 import.meta。
|
|
1094
|
-
|
|
1095
|
-
#### 黄金样本库与 Mock 测试
|
|
1096
|
-
|
|
1097
|
-
`samples/ci-goldens/<entry>/<provider>/` 随仓库提供一套最小聊天请求,确保在完全离线的 CI
|
|
1098
|
-
环境也能复现工具字段、system 块与 streaming 行为。`npm run test:golden` 会:
|
|
1099
|
-
|
|
1100
|
-
1. 执行 `scripts/tools/capture-provider-goldens.mjs --custom-only --update-golden`,把
|
|
1101
|
-
`~/.routecodex/golden_samples/new/**` 或 `samples/ci-goldens/**` 中的最新请求复制到
|
|
1102
|
-
`~/.routecodex/golden_samples/provider_golden_samples/`;
|
|
1103
|
-
2. 执行 `scripts/mock-provider/run-regressions.mjs`,通过 mock provider 跑完整的
|
|
1104
|
-
chat/responses/anthropic 回归。
|
|
1105
|
-
|
|
1106
|
-
若本地存在 `~/.routecodex/codex-samples`,脚本会提示额外运行
|
|
1107
|
-
`node scripts/mock-provider/capture-from-configs.mjs` 把真实 provider 录制转成 mock
|
|
1108
|
-
样本。若需要把最新的 `~/.routecodex/golden_samples/new/**` 同步进仓库,执行
|
|
1109
|
-
`npm run sync:ci-goldens`;更多细节参见 `docs/golden-ci-library.md`。
|
|
1110
|
-
|
|
1111
|
-
### 代码规范
|
|
1112
|
-
|
|
1113
|
-
- **TypeScript**: 严格模式,完整类型定义
|
|
1114
|
-
- **ESLint**: 代码风格检查和错误预防
|
|
1115
|
-
- **Prettier**: 代码格式化
|
|
1116
|
-
- **Husky**: Git hooks,确保代码质量
|
|
1117
|
-
- **Conventional Commits**: 标准化提交信息
|
|
1118
|
-
|
|
1119
|
-
## 📊 监控和调试
|
|
1120
|
-
|
|
1121
|
-
### Web调试界面
|
|
1122
|
-
|
|
1123
|
-
RouteCodex提供功能强大的Web调试界面:
|
|
1124
|
-
|
|
1125
|
-
```bash
|
|
1126
|
-
# 启动Web界面
|
|
1127
|
-
cd web-interface
|
|
1128
|
-
npm install
|
|
1129
|
-
npm run dev
|
|
1130
|
-
|
|
1131
|
-
# 访问界面
|
|
1132
|
-
open http://localhost:3000
|
|
1133
|
-
```
|
|
1134
|
-
|
|
1135
|
-
**功能特性**:
|
|
1136
|
-
- 📊 实时性能仪表板
|
|
1137
|
-
- 🔧 模块管理和配置
|
|
1138
|
-
- 📈 交互式图表
|
|
1139
|
-
- 🔍 事件探索器
|
|
1140
|
-
- 🎨 响应式设计,支持深色模式
|
|
1141
|
-
|
|
1142
|
-
### CLI调试工具
|
|
1143
|
-
|
|
1144
|
-
```bash
|
|
1145
|
-
# 查看系统状态
|
|
1146
|
-
routecodex status
|
|
1147
|
-
|
|
1148
|
-
# 验证配置
|
|
1149
|
-
routecodex config validate
|
|
1150
|
-
|
|
1151
|
-
# 测试提供商连接
|
|
1152
|
-
routecodex test-provider --provider openai-provider
|
|
1153
|
-
|
|
1154
|
-
# 查看实时日志
|
|
1155
|
-
routecodex logs --follow
|
|
1156
|
-
|
|
1157
|
-
# 导出调试数据
|
|
1158
|
-
routecodex debug export --format json
|
|
1159
|
-
|
|
1160
|
-
# 性能分析
|
|
1161
|
-
routecodex debug profile --duration 60
|
|
1162
|
-
```
|
|
1163
|
-
|
|
1164
|
-
### API调试端点
|
|
1165
|
-
|
|
1166
|
-
```bash
|
|
1167
|
-
# 系统健康检查
|
|
1168
|
-
GET /api/debug/health
|
|
1169
|
-
|
|
1170
|
-
# 模块状态列表
|
|
1171
|
-
GET /api/debug/modules
|
|
1172
|
-
|
|
1173
|
-
# 模块详细信息
|
|
1174
|
-
GET /api/debug/modules/:id
|
|
1175
|
-
|
|
1176
|
-
# 事件列表(支持过滤)
|
|
1177
|
-
GET /api/debug/events?type=error&limit=100
|
|
1178
|
-
|
|
1179
|
-
# 性能指标
|
|
1180
|
-
GET /api/debug/metrics
|
|
1181
|
-
|
|
1182
|
-
# 导出调试数据
|
|
1183
|
-
GET /api/debug/export/:format
|
|
1184
|
-
```
|
|
1185
|
-
|
|
1186
|
-
## 🔌 集成示例
|
|
1187
|
-
|
|
1188
|
-
### Node.js集成
|
|
1189
|
-
|
|
1190
|
-
```javascript
|
|
1191
|
-
import { RouteCodexClient } from 'routecodex-client';
|
|
1192
|
-
|
|
1193
|
-
const client = new RouteCodexClient({
|
|
1194
|
-
baseURL: 'http://localhost:5506',
|
|
1195
|
-
apiKey: 'your-api-key'
|
|
1196
|
-
});
|
|
1197
|
-
|
|
1198
|
-
// 简单对话
|
|
1199
|
-
const response = await client.chat.completions.create({
|
|
1200
|
-
model: 'gpt-4',
|
|
1201
|
-
messages: [
|
|
1202
|
-
{ role: 'user', content: 'Hello, RouteCodex!' }
|
|
1203
|
-
]
|
|
1204
|
-
});
|
|
1205
|
-
|
|
1206
|
-
console.log(response.choices[0].message.content);
|
|
1207
|
-
```
|
|
1208
|
-
|
|
1209
|
-
### Python集成
|
|
1210
|
-
|
|
1211
|
-
```python
|
|
1212
|
-
import openai
|
|
1213
|
-
|
|
1214
|
-
# 配置RouteCodex端点
|
|
1215
|
-
openai.api_base = "http://localhost:5506/v1"
|
|
1216
|
-
openai.api_key = "your-api-key"
|
|
1217
|
-
|
|
1218
|
-
# 使用标准OpenAI客户端
|
|
1219
|
-
response = openai.ChatCompletion.create(
|
|
1220
|
-
model="gpt-4",
|
|
1221
|
-
messages=[
|
|
1222
|
-
{"role": "user", "content": "Hello from Python!"}
|
|
1223
|
-
]
|
|
1224
|
-
)
|
|
1225
|
-
|
|
1226
|
-
print(response.choices[0].message.content)
|
|
1227
|
-
```
|
|
1228
|
-
|
|
1229
|
-
### cURL集成
|
|
1230
|
-
|
|
1231
|
-
```bash
|
|
1232
|
-
# 设置环境变量
|
|
1233
|
-
export ROUTECODEX_URL="http://localhost:5506"
|
|
1234
|
-
export ROUTECODEX_API_KEY="your-api-key"
|
|
1235
|
-
|
|
1236
|
-
# 创建别名方便使用
|
|
1237
|
-
alias rcurl='curl -H "Authorization: Bearer $ROUTECODEX_API_KEY" -H "Content-Type: application/json" $ROUTECODEX_URL/v1'
|
|
1238
|
-
|
|
1239
|
-
# 使用别名调用API
|
|
1240
|
-
rcurl/chat/completions -d '{
|
|
1241
|
-
"model": "gpt-4",
|
|
1242
|
-
"messages": [{"role": "user", "content": "Hello from cURL!"}]
|
|
1243
|
-
}'
|
|
1244
|
-
```
|
|
1245
|
-
|
|
1246
|
-
## 🚨 故障排除
|
|
1247
|
-
|
|
1248
|
-
### 常见问题
|
|
1249
|
-
|
|
1250
|
-
#### 1. 安装问题
|
|
1251
|
-
|
|
1252
|
-
**问题**: `npm install -g routecodex` 权限错误
|
|
1253
|
-
```bash
|
|
1254
|
-
# 解决方案1:使用nvm管理Node.js
|
|
1255
|
-
curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.0/install.sh | bash
|
|
1256
|
-
nvm install node
|
|
1257
|
-
npm install -g routecodex
|
|
1258
|
-
|
|
1259
|
-
# 解决方案2:直接使用npm install -g
|
|
1260
|
-
npm install -g routecodex
|
|
1261
|
-
```
|
|
1262
|
-
|
|
1263
|
-
#### 2. 启动失败
|
|
1264
|
-
|
|
1265
|
-
**问题**: 端口被占用
|
|
1266
|
-
```bash
|
|
1267
|
-
# 查看端口占用
|
|
1268
|
-
lsof -i :5506
|
|
1269
|
-
|
|
1270
|
-
# 杀死占用进程
|
|
1271
|
-
kill -9 <PID>
|
|
1272
|
-
|
|
1273
|
-
# 或者使用其他端口
|
|
1274
|
-
routecodex start --port 5507
|
|
1275
|
-
```
|
|
1276
|
-
|
|
1277
|
-
#### 3. 认证问题
|
|
1278
|
-
|
|
1279
|
-
**问题**: API密钥无效
|
|
1280
|
-
```bash
|
|
1281
|
-
# 检查环境变量
|
|
1282
|
-
echo $OPENAI_API_KEY
|
|
1283
|
-
|
|
1284
|
-
# 测试API连接
|
|
1285
|
-
routecodex test-provider --provider openai-provider
|
|
1286
|
-
|
|
1287
|
-
# 验证配置
|
|
1288
|
-
routecodex config validate
|
|
1289
|
-
```
|
|
1290
|
-
|
|
1291
|
-
#### 4. 性能问题
|
|
1292
|
-
|
|
1293
|
-
**问题**: 响应速度慢
|
|
1294
|
-
```bash
|
|
1295
|
-
# 启用性能监控
|
|
1296
|
-
routecodex start --monitoring
|
|
1297
|
-
|
|
1298
|
-
# 查看性能指标
|
|
1299
|
-
curl http://localhost:5506/api/debug/metrics
|
|
1300
|
-
|
|
1301
|
-
# 优化建议:
|
|
1302
|
-
# 1. 增加连接池大小
|
|
1303
|
-
# 2. 启用请求缓存
|
|
1304
|
-
# 3. 调整超时设置
|
|
1305
|
-
# 4. 使用更快的模型
|
|
1306
|
-
```
|
|
1307
|
-
|
|
1308
|
-
### 调试模式
|
|
1309
|
-
|
|
1310
|
-
```bash
|
|
1311
|
-
# 启用详细日志
|
|
1312
|
-
DEBUG=routecodex:* routecodex start
|
|
1313
|
-
|
|
1314
|
-
# 启用调试API
|
|
1315
|
-
routecodex start --debug-api
|
|
1316
|
-
|
|
1317
|
-
# 查看内部状态
|
|
1318
|
-
curl http://localhost:5506/api/debug/internal
|
|
1319
|
-
```
|
|
1320
|
-
|
|
1321
|
-
### 日志分析
|
|
1322
|
-
|
|
1323
|
-
```bash
|
|
1324
|
-
# 查看错误日志
|
|
1325
|
-
routecodex logs --level error
|
|
1326
|
-
|
|
1327
|
-
# 实时跟踪日志
|
|
1328
|
-
routecodex logs --follow
|
|
1329
|
-
|
|
1330
|
-
# 导出日志
|
|
1331
|
-
routecodex logs --export logs.json
|
|
1332
|
-
|
|
1333
|
-
# 分析日志模式
|
|
1334
|
-
routecodex logs --analyze --pattern "timeout"
|
|
1335
|
-
```
|
|
1336
|
-
|
|
1337
|
-
## 📈 性能优化
|
|
1338
|
-
|
|
1339
|
-
### 配置优化
|
|
1340
|
-
|
|
1341
|
-
```json
|
|
1342
|
-
{
|
|
1343
|
-
"server": {
|
|
1344
|
-
"compression": true,
|
|
1345
|
-
"maxRequestSize": "10mb",
|
|
1346
|
-
"timeout": 30000
|
|
1347
|
-
},
|
|
1348
|
-
"providers": {
|
|
1349
|
-
"provider-id": {
|
|
1350
|
-
"connectionPool": {
|
|
1351
|
-
"maxConnections": 10,
|
|
1352
|
-
"minConnections": 2,
|
|
1353
|
-
"acquireTimeout": 5000
|
|
1354
|
-
},
|
|
1355
|
-
"cache": {
|
|
1356
|
-
"enabled": true,
|
|
1357
|
-
"ttl": 300,
|
|
1358
|
-
"maxSize": 1000
|
|
1359
|
-
}
|
|
1360
|
-
}
|
|
1361
|
-
}
|
|
1362
|
-
}
|
|
1363
|
-
```
|
|
1364
|
-
|
|
1365
|
-
### 监控指标
|
|
1366
|
-
|
|
1367
|
-
- **响应时间**: P50, P95, P99延迟
|
|
1368
|
-
- **吞吐量**: 每秒请求数
|
|
1369
|
-
- **错误率**: 4xx/5xx错误比例
|
|
1370
|
-
- **内存使用**: 堆内存和系统内存
|
|
1371
|
-
- **CPU使用**: 处理器使用率
|
|
1372
|
-
|
|
1373
|
-
### 扩展性
|
|
1374
|
-
|
|
1375
|
-
- **水平扩展**: 支持多实例部署
|
|
1376
|
-
- **负载均衡**: 内置负载均衡策略
|
|
1377
|
-
- **缓存策略**: 多级缓存机制
|
|
1378
|
-
- **连接复用**: HTTP连接池管理
|
|
1379
|
-
|
|
1380
|
-
## 🤝 贡献指南
|
|
1381
|
-
|
|
1382
|
-
### 开发流程
|
|
1383
|
-
|
|
1384
|
-
1. **Fork仓库**并创建功能分支
|
|
1385
|
-
```bash
|
|
1386
|
-
git checkout -b feature/amazing-feature
|
|
1387
|
-
```
|
|
1388
|
-
|
|
1389
|
-
2. **编写代码**并遵循项目规范
|
|
1390
|
-
- TypeScript严格模式
|
|
1391
|
-
- 完整的单元测试
|
|
1392
|
-
- 详细的文档注释
|
|
1393
|
-
|
|
1394
|
-
3. **运行测试**确保代码质量
|
|
1395
|
-
```bash
|
|
1396
|
-
npm test
|
|
1397
|
-
npm run lint
|
|
1398
|
-
npm run type-check
|
|
1399
|
-
```
|
|
1400
|
-
|
|
1401
|
-
4. **提交代码**使用规范化信息
|
|
1402
|
-
```bash
|
|
1403
|
-
git commit -m "feat: add amazing feature"
|
|
1404
|
-
```
|
|
1405
|
-
|
|
1406
|
-
5. **推送分支**并创建Pull Request
|
|
1407
|
-
```bash
|
|
1408
|
-
git push origin feature/amazing-feature
|
|
1409
|
-
```
|
|
1410
|
-
|
|
1411
|
-
### 代码贡献规范
|
|
1412
|
-
|
|
1413
|
-
- **提交信息**: 遵循[Conventional Commits](https://www.conventionalcommits.org/)
|
|
1414
|
-
- **代码风格**: 使用ESLint和Prettier保持一致
|
|
1415
|
-
- **测试覆盖率**: 新功能必须包含测试,覆盖率>90%
|
|
1416
|
-
- **文档更新**: 重大变更需要更新相关文档
|
|
1417
|
-
|
|
1418
|
-
### 问题报告
|
|
1419
|
-
|
|
1420
|
-
使用GitHub Issues报告问题时,请包含:
|
|
1421
|
-
|
|
1422
|
-
- **详细描述**: 问题的具体表现
|
|
1423
|
-
- **复现步骤**: 如何触发问题
|
|
1424
|
-
- **环境信息**: OS、Node.js版本、RouteCodex版本
|
|
1425
|
-
- **相关日志**: 错误日志和调试信息
|
|
1426
|
-
- **期望行为**: 您期望发生什么
|
|
1427
|
-
|
|
1428
|
-
## 📄 许可证
|
|
1429
|
-
|
|
1430
|
-
本项目采用MIT许可证 - 详见[LICENSE](LICENSE)文件。
|
|
1431
|
-
|
|
1432
|
-
## 🙏 致谢
|
|
1433
|
-
|
|
1434
|
-
感谢以下开源项目的支持:
|
|
1435
|
-
|
|
1436
|
-
- **OpenAI**: GPT模型和API标准
|
|
1437
|
-
- **Anthropic**: Claude模型和安全研究
|
|
1438
|
-
- **TypeScript**: 类型安全的JavaScript
|
|
1439
|
-
- **Fastify**: 高性能Node.js web框架
|
|
1440
|
-
- **Zod**: 运行时类型验证
|
|
1441
|
-
- **Winston**: 日志管理库
|
|
1442
|
-
|
|
1443
|
-
## 📞 支持
|
|
1444
|
-
|
|
1445
|
-
- **文档**: [完整文档](https://docs.routecodex.com)
|
|
1446
|
-
- **API参考**: [API文档](https://api.routecodex.com)
|
|
1447
|
-
- **社区**: [GitHub Discussions](https://github.com/your-repo/routecodex/discussions)
|
|
1448
|
-
- **问题反馈**: [GitHub Issues](https://github.com/your-repo/routecodex/issues)
|
|
1449
|
-
- **邮箱**: support@routecodex.com
|
|
1450
|
-
|
|
1451
|
-
## 🗺️ 路线图
|
|
1452
|
-
|
|
1453
|
-
### v1.0 (当前版本)
|
|
1454
|
-
- ✅ 4层管道架构
|
|
1455
|
-
- ✅ Provider V2系统
|
|
1456
|
-
- ✅ 动态路由分类
|
|
1457
|
-
- ✅ Dry-Run调试系统
|
|
1458
|
-
- ✅ Web调试界面
|
|
1459
|
-
|
|
1460
|
-
### v1.1 (计划中)
|
|
1461
|
-
- 🔄 更多AI提供商支持
|
|
1462
|
-
- 🔄 插件系统
|
|
1463
|
-
- 🔄 高级缓存策略
|
|
1464
|
-
- 🔄 分布式部署支持
|
|
1465
|
-
|
|
1466
|
-
### v1.2 (未来版本)
|
|
1467
|
-
- 📋 机器学习模型
|
|
1468
|
-
- 📋 自动化测试
|
|
1469
|
-
- 📋 性能优化
|
|
1470
|
-
- 📋 安全增强
|
|
1471
|
-
|
|
1472
|
-
---
|
|
91
|
+
## 文档
|
|
1473
92
|
|
|
1474
|
-
|
|
93
|
+
- 安装与快速上手:`docs/INSTALLATION_AND_QUICKSTART.md`
|
|
94
|
+
- 内置 Provider:`docs/PROVIDERS_BUILTIN.md`
|
|
95
|
+
- Provider 类型与协议:`docs/PROVIDER_TYPES.md`
|
|
96
|
+
- 路由指令/语法:`docs/routing-instructions.md`
|
|
97
|
+
- 端口与入口:`docs/PORTS.md`
|
|
98
|
+
- Codex / Claude Code 集成:`docs/CODEX_AND_CLAUDE_CODE.md`
|