@jsonstudio/rcc 0.90.141 → 0.90.181
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/dist/build-info.js +2 -2
- package/dist/cli/commands/config.js +5 -5
- package/dist/cli/commands/config.js.map +1 -1
- package/dist/cli/commands/init/basic.js +30 -25
- package/dist/cli/commands/init/basic.js.map +1 -1
- package/dist/cli/commands/init/interactive.js +6 -1
- package/dist/cli/commands/init/interactive.js.map +1 -1
- package/dist/cli/commands/init/workflows.js +7 -7
- package/dist/cli/commands/init/workflows.js.map +1 -1
- package/dist/cli/commands/init.js +45 -104
- package/dist/cli/commands/init.js.map +1 -1
- package/dist/cli/config/bootstrap-provider-templates.d.ts +4 -0
- package/dist/cli/config/bootstrap-provider-templates.js +107 -0
- package/dist/cli/config/bootstrap-provider-templates.js.map +1 -0
- package/dist/cli/config/init-config.js +37 -102
- package/dist/cli/config/init-config.js.map +1 -1
- package/dist/cli/config/init-provider-catalog.d.ts +30 -0
- package/dist/cli/config/init-provider-catalog.js +381 -265
- package/dist/cli/config/init-provider-catalog.js.map +1 -1
- package/dist/cli/config/init-v2-builder.d.ts +20 -0
- package/dist/cli/config/init-v2-builder.js +150 -0
- package/dist/cli/config/init-v2-builder.js.map +1 -0
- package/dist/commands/provider-update.js +163 -173
- package/dist/commands/provider-update.js.map +1 -1
- package/dist/provider-sdk/provider-add-template.d.ts +17 -0
- package/dist/provider-sdk/provider-add-template.js +110 -0
- package/dist/provider-sdk/provider-add-template.js.map +1 -0
- package/dist/provider-sdk/provider-inspect.d.ts +37 -0
- package/dist/provider-sdk/provider-inspect.js +166 -0
- package/dist/provider-sdk/provider-inspect.js.map +1 -0
- package/dist/provider-sdk/provider-runtime-inference.d.ts +14 -0
- package/dist/provider-sdk/provider-runtime-inference.js +226 -0
- package/dist/provider-sdk/provider-runtime-inference.js.map +1 -0
- package/dist/provider-sdk/vercel-ai-doctor.d.ts +35 -0
- package/dist/provider-sdk/vercel-ai-doctor.js +150 -0
- package/dist/provider-sdk/vercel-ai-doctor.js.map +1 -0
- package/dist/providers/core/api/provider-types.d.ts +2 -0
- package/dist/providers/core/api/provider-types.js.map +1 -1
- package/dist/providers/core/runtime/http-request-executor.d.ts +2 -0
- package/dist/providers/core/runtime/http-request-executor.js +39 -40
- package/dist/providers/core/runtime/http-request-executor.js.map +1 -1
- package/dist/providers/core/runtime/http-transport-provider.d.ts +5 -0
- package/dist/providers/core/runtime/http-transport-provider.js +53 -6
- package/dist/providers/core/runtime/http-transport-provider.js.map +1 -1
- package/dist/providers/core/runtime/openai-responses-sdk-transport.d.ts +7 -0
- package/dist/providers/core/runtime/openai-responses-sdk-transport.js +142 -0
- package/dist/providers/core/runtime/openai-responses-sdk-transport.js.map +1 -0
- package/dist/providers/core/runtime/provider-factory.js +3 -0
- package/dist/providers/core/runtime/provider-factory.js.map +1 -1
- package/dist/providers/core/runtime/provider-request-executor-deps-factory.d.ts +2 -1
- package/dist/providers/core/runtime/provider-request-executor-deps-factory.js +1 -0
- package/dist/providers/core/runtime/provider-request-executor-deps-factory.js.map +1 -1
- package/dist/providers/core/runtime/provider-startup-tasks.d.ts +1 -0
- package/dist/providers/core/runtime/provider-startup-tasks.js +12 -0
- package/dist/providers/core/runtime/provider-startup-tasks.js.map +1 -0
- package/dist/providers/core/runtime/vercel-ai-sdk/anthropic-sdk-transport.d.ts +9 -0
- package/dist/providers/core/runtime/vercel-ai-sdk/anthropic-sdk-transport.js +642 -0
- package/dist/providers/core/runtime/vercel-ai-sdk/anthropic-sdk-transport.js.map +1 -0
- package/dist/providers/core/runtime/vercel-ai-sdk/openai-sdk-transport.d.ts +10 -0
- package/dist/providers/core/runtime/vercel-ai-sdk/openai-sdk-transport.js +539 -0
- package/dist/providers/core/runtime/vercel-ai-sdk/openai-sdk-transport.js.map +1 -0
- package/dist/providers/profile/provider-profile-loader.js +12 -1
- package/dist/providers/profile/provider-profile-loader.js.map +1 -1
- package/dist/providers/profile/provider-profile.d.ts +2 -0
- package/dist/server/handlers/chat-handler.js +4 -2
- package/dist/server/handlers/chat-handler.js.map +1 -1
- package/dist/server/handlers/config-admin-handler.js +75 -67
- package/dist/server/handlers/config-admin-handler.js.map +1 -1
- package/dist/server/handlers/handler-response-utils.js +126 -1
- package/dist/server/handlers/handler-response-utils.js.map +1 -1
- package/dist/server/handlers/handler-utils.d.ts +1 -1
- package/dist/server/handlers/handler-utils.js +5 -2
- package/dist/server/handlers/handler-utils.js.map +1 -1
- package/dist/server/handlers/messages-handler.js +4 -2
- package/dist/server/handlers/messages-handler.js.map +1 -1
- package/dist/server/handlers/responses-handler.js +4 -2
- package/dist/server/handlers/responses-handler.js.map +1 -1
- package/dist/server/runtime/http-server/antigravity-startup-tasks.d.ts +30 -0
- package/dist/server/runtime/http-server/antigravity-startup-tasks.js +108 -0
- package/dist/server/runtime/http-server/antigravity-startup-tasks.js.map +1 -0
- package/dist/server/runtime/http-server/executor/provider-response-converter.js +5 -0
- package/dist/server/runtime/http-server/executor/provider-response-converter.js.map +1 -1
- package/dist/server/runtime/http-server/executor-response.js +7 -1
- package/dist/server/runtime/http-server/executor-response.js.map +1 -1
- package/dist/server/runtime/http-server/http-server-bootstrap.js +3 -0
- package/dist/server/runtime/http-server/http-server-bootstrap.js.map +1 -1
- package/dist/server/runtime/http-server/http-server-runtime-providers.js +3 -72
- package/dist/server/runtime/http-server/http-server-runtime-providers.js.map +1 -1
- package/dist/server/runtime/http-server/request-executor.js +19 -8
- package/dist/server/runtime/http-server/request-executor.js.map +1 -1
- package/dist/server/runtime/http-server/routes.js +185 -25
- package/dist/server/runtime/http-server/routes.js.map +1 -1
- package/dist/server/utils/finish-reason.d.ts +2 -0
- package/dist/server/utils/finish-reason.js +75 -0
- package/dist/server/utils/finish-reason.js.map +1 -0
- package/docs/provider-analysis.md +331 -0
- package/package.json +5 -2
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
export const STREAM_LOG_FINISH_REASON_KEY = "__routecodex_finish_reason";
|
|
2
|
+
export function deriveFinishReason(body) {
|
|
3
|
+
const record = asRecord(body);
|
|
4
|
+
if (!record) {
|
|
5
|
+
return undefined;
|
|
6
|
+
}
|
|
7
|
+
const choices = Array.isArray(record.choices) ? record.choices : [];
|
|
8
|
+
const firstChoice = asRecord(choices[0]);
|
|
9
|
+
const choiceFinishReason = readNonEmptyString(firstChoice?.finish_reason);
|
|
10
|
+
if (choiceFinishReason) {
|
|
11
|
+
return choiceFinishReason;
|
|
12
|
+
}
|
|
13
|
+
const stopReason = readNonEmptyString(record.stop_reason);
|
|
14
|
+
if (stopReason) {
|
|
15
|
+
return mapStopReasonToFinishReason(stopReason);
|
|
16
|
+
}
|
|
17
|
+
const responseStatus = readNonEmptyString(record.status)?.toLowerCase();
|
|
18
|
+
if (hasResponsesToolCall(record)) {
|
|
19
|
+
return "tool_calls";
|
|
20
|
+
}
|
|
21
|
+
const incompleteReason = readNonEmptyString(asRecord(record.incomplete_details)?.reason);
|
|
22
|
+
if (incompleteReason) {
|
|
23
|
+
return mapIncompleteReasonToFinishReason(incompleteReason);
|
|
24
|
+
}
|
|
25
|
+
if (responseStatus === "completed") {
|
|
26
|
+
return "stop";
|
|
27
|
+
}
|
|
28
|
+
if (responseStatus === "requires_action") {
|
|
29
|
+
return "tool_calls";
|
|
30
|
+
}
|
|
31
|
+
return readNonEmptyString(record[STREAM_LOG_FINISH_REASON_KEY]);
|
|
32
|
+
}
|
|
33
|
+
function hasResponsesToolCall(record) {
|
|
34
|
+
const requiredAction = asRecord(record.required_action);
|
|
35
|
+
if (asRecord(requiredAction?.submit_tool_outputs)) {
|
|
36
|
+
return true;
|
|
37
|
+
}
|
|
38
|
+
const output = Array.isArray(record.output) ? record.output : [];
|
|
39
|
+
return output.some((item) => {
|
|
40
|
+
const type = readNonEmptyString(asRecord(item)?.type)?.toLowerCase();
|
|
41
|
+
return type === "function_call" || type === "tool_call";
|
|
42
|
+
});
|
|
43
|
+
}
|
|
44
|
+
function mapStopReasonToFinishReason(stopReason) {
|
|
45
|
+
const normalized = stopReason.trim().toLowerCase();
|
|
46
|
+
switch (normalized) {
|
|
47
|
+
case "end_turn":
|
|
48
|
+
return "stop";
|
|
49
|
+
case "tool_use":
|
|
50
|
+
return "tool_calls";
|
|
51
|
+
case "max_tokens":
|
|
52
|
+
return "length";
|
|
53
|
+
default:
|
|
54
|
+
return normalized;
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
function mapIncompleteReasonToFinishReason(reason) {
|
|
58
|
+
const normalized = reason.trim().toLowerCase();
|
|
59
|
+
switch (normalized) {
|
|
60
|
+
case "max_output_tokens":
|
|
61
|
+
case "max_tokens":
|
|
62
|
+
return "length";
|
|
63
|
+
default:
|
|
64
|
+
return normalized;
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
function readNonEmptyString(value) {
|
|
68
|
+
return typeof value === "string" && value.trim() ? value.trim() : undefined;
|
|
69
|
+
}
|
|
70
|
+
function asRecord(value) {
|
|
71
|
+
return value && typeof value === "object" && !Array.isArray(value)
|
|
72
|
+
? value
|
|
73
|
+
: null;
|
|
74
|
+
}
|
|
75
|
+
//# sourceMappingURL=finish-reason.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"finish-reason.js","sourceRoot":"","sources":["../../../src/server/utils/finish-reason.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,331 @@
|
|
|
1
|
+
# RouteCodex Provider 配置与初始化引导梳理
|
|
2
|
+
|
|
3
|
+
## 一、当前 Provider 初始化状态机
|
|
4
|
+
|
|
5
|
+
```
|
|
6
|
+
┌─────────────────────────────────────────────────────────────────┐
|
|
7
|
+
│ Provider 初始化流程 │
|
|
8
|
+
└─────────────────────────────────────────────────────────────────┘
|
|
9
|
+
|
|
10
|
+
[开始]
|
|
11
|
+
│
|
|
12
|
+
▼
|
|
13
|
+
┌─────────────────────────────────────────────────────────────────┐
|
|
14
|
+
│ 1. 检查配置状态 (inspectConfigState) │
|
|
15
|
+
│ ├─ missing → 首次初始化 │
|
|
16
|
+
│ ├─ invalid → 错误退出 │
|
|
17
|
+
│ ├─ v1 → V1→V2 迁移 │
|
|
18
|
+
│ └─ v2 → V2 维护菜单 │
|
|
19
|
+
└─────────────────────────────────────────────────────────────────┘
|
|
20
|
+
│
|
|
21
|
+
▼
|
|
22
|
+
┌─────────────────────────────────────────────────────────────────┐
|
|
23
|
+
│ 2. 配置初始化分支 │
|
|
24
|
+
│ │
|
|
25
|
+
│ ┌─────────────┐ ┌──────────────┐ ┌──────────────────┐ │
|
|
26
|
+
│ │ 首次初始化 │→ │ V1→V2 迁移 │→ │ V2 维护菜单 │ │
|
|
27
|
+
│ └─────────────┘ └──────────────┘ └──────────────────┘ │
|
|
28
|
+
│ │ │ │ │
|
|
29
|
+
│ ▼ ▼ ▼ │
|
|
30
|
+
│ ┌──────────────┐ ┌──────────────┐ ┌──────────────────┐ │
|
|
31
|
+
│ │- 选择 Provider│ │- 拆分 Provider│ │- 编辑路由 │ │
|
|
32
|
+
│ │ 模板 │ │ 配置文件 │ │- 添加/删除 Provider│ │
|
|
33
|
+
│ │- 设置默认 │ │- 备份原配置 │ │- 调整端口/主机 │ │
|
|
34
|
+
│ │ Provider │ │- 生成 V2 配置 │ │- 配置 Web Search │ │
|
|
35
|
+
│ │- 配置路由 │ └──────────────┘ └──────────────────┘ │
|
|
36
|
+
│ └──────────────┘ │
|
|
37
|
+
└─────────────────────────────────────────────────────────────────┘
|
|
38
|
+
│
|
|
39
|
+
▼
|
|
40
|
+
┌─────────────────────────────────────────────────────────────────┐
|
|
41
|
+
│ 3. Provider 配置生成 (writeProviderV2) │
|
|
42
|
+
│ 位置: ~/.routecodex/provider/{providerId}/config.v2.json │
|
|
43
|
+
│ │
|
|
44
|
+
│ 配置结构: │
|
|
45
|
+
│ { │
|
|
46
|
+
│ "version": "v2", │
|
|
47
|
+
│ "providerId": "openai", │
|
|
48
|
+
│ "provider": { │
|
|
49
|
+
│ "id": "openai", │
|
|
50
|
+
│ "enabled": true, │
|
|
51
|
+
│ "type": "openai", │
|
|
52
|
+
│ "baseURL": "https://api.openai.com/v1", │
|
|
53
|
+
│ "auth": { "type": "apikey", "apiKey": "${OPENAI_API_KEY}" },│
|
|
54
|
+
│ "models": { "gpt-5.2": { "supportsStreaming": true } } │
|
|
55
|
+
│ } │
|
|
56
|
+
│ } │
|
|
57
|
+
└─────────────────────────────────────────────────────────────────┘
|
|
58
|
+
│
|
|
59
|
+
▼
|
|
60
|
+
┌─────────────────────────────────────────────────────────────────┐
|
|
61
|
+
│ 4. 主配置生成 (buildV2ConfigObject) │
|
|
62
|
+
│ 位置: ~/.routecodex/config.json │
|
|
63
|
+
│ │
|
|
64
|
+
│ 配置结构: │
|
|
65
|
+
│ { │
|
|
66
|
+
│ "virtualrouterMode": "v2", │
|
|
67
|
+
│ "httpserver": { "host": "127.0.0.1", "port": 5555 }, │
|
|
68
|
+
│ "virtualrouter": { │
|
|
69
|
+
│ "activeRoutingPolicyGroup": "default", │
|
|
70
|
+
│ "routingPolicyGroups": { │
|
|
71
|
+
│ "default": { │
|
|
72
|
+
│ "routing": { │
|
|
73
|
+
│ "default": [{ "id": "default-primary", "targets": [...] }],│
|
|
74
|
+
│ "thinking": [...], │
|
|
75
|
+
│ "tools": [...], │
|
|
76
|
+
│ "web_search": [...] │
|
|
77
|
+
│ } │
|
|
78
|
+
│ } │
|
|
79
|
+
│ } │
|
|
80
|
+
│ } │
|
|
81
|
+
│ } │
|
|
82
|
+
└─────────────────────────────────────────────────────────────────┘
|
|
83
|
+
│
|
|
84
|
+
▼
|
|
85
|
+
┌─────────────────────────────────────────────────────────────────┐
|
|
86
|
+
│ 5. 可选: Camoufox 环境准备 (maybePrepareCamoufoxEnvironment) │
|
|
87
|
+
└─────────────────────────────────────────────────────────────────┘
|
|
88
|
+
│
|
|
89
|
+
▼
|
|
90
|
+
┌─────────────────────────────────────────────────────────────────┐
|
|
91
|
+
│ 6. Provider 运行时初始化 (服务器启动时) │
|
|
92
|
+
│ ├─ bootstrapVirtualRouterConfig() │
|
|
93
|
+
│ ├─ initializeProviderRuntimes() │
|
|
94
|
+
│ ├─ 非阻塞认证验证 (runNonBlockingCredentialValidation) │
|
|
95
|
+
│ └─ Antigravity 预热 (fire-and-forget) │
|
|
96
|
+
└─────────────────────────────────────────────────────────────────┘
|
|
97
|
+
│
|
|
98
|
+
▼
|
|
99
|
+
[完成]
|
|
100
|
+
```
|
|
101
|
+
|
|
102
|
+
## 二、如何初始化新的 Provider
|
|
103
|
+
|
|
104
|
+
### 方式一: 使用 CLI 交互式初始化
|
|
105
|
+
|
|
106
|
+
```bash
|
|
107
|
+
# 1. 查看可用 Provider 模板
|
|
108
|
+
routecodex init --list-providers
|
|
109
|
+
|
|
110
|
+
# 2. 交互式初始化 (选择 Provider、路由等)
|
|
111
|
+
routecodex init
|
|
112
|
+
|
|
113
|
+
# 3. 或使用命令行参数直接指定
|
|
114
|
+
routecodex init --providers openai,qwen --default-provider qwen --force
|
|
115
|
+
```
|
|
116
|
+
|
|
117
|
+
### 方式二: 手动添加 Provider
|
|
118
|
+
|
|
119
|
+
1. **创建 Provider 配置目录**:
|
|
120
|
+
|
|
121
|
+
```bash
|
|
122
|
+
mkdir -p ~/.routecodex/provider/myprovider
|
|
123
|
+
```
|
|
124
|
+
|
|
125
|
+
2. **创建 config.v2.json**:
|
|
126
|
+
|
|
127
|
+
```json
|
|
128
|
+
{
|
|
129
|
+
"version": "v2",
|
|
130
|
+
"providerId": "myprovider",
|
|
131
|
+
"provider": {
|
|
132
|
+
"id": "myprovider",
|
|
133
|
+
"enabled": true,
|
|
134
|
+
"type": "openai",
|
|
135
|
+
"baseURL": "https://api.myprovider.com/v1",
|
|
136
|
+
"compatibilityProfile": "chat:openai",
|
|
137
|
+
"auth": {
|
|
138
|
+
"type": "apikey",
|
|
139
|
+
"apiKey": "${MYPROVIDER_API_KEY}"
|
|
140
|
+
},
|
|
141
|
+
"models": {
|
|
142
|
+
"my-model-1": { "supportsStreaming": true },
|
|
143
|
+
"my-model-2": { "supportsStreaming": true }
|
|
144
|
+
},
|
|
145
|
+
"defaultModel": "my-model-1"
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
```
|
|
149
|
+
|
|
150
|
+
3. **更新主配置 config.json 中的路由**:
|
|
151
|
+
|
|
152
|
+
```json
|
|
153
|
+
{
|
|
154
|
+
"virtualrouter": {
|
|
155
|
+
"routingPolicyGroups": {
|
|
156
|
+
"default": {
|
|
157
|
+
"routing": {
|
|
158
|
+
"default": [
|
|
159
|
+
{
|
|
160
|
+
"id": "default-primary",
|
|
161
|
+
"targets": ["myprovider.my-model-1"]
|
|
162
|
+
}
|
|
163
|
+
]
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
}
|
|
169
|
+
```
|
|
170
|
+
|
|
171
|
+
4. **设置环境变量**:
|
|
172
|
+
|
|
173
|
+
```bash
|
|
174
|
+
export MYPROVIDER_API_KEY="your-api-key-here"
|
|
175
|
+
```
|
|
176
|
+
|
|
177
|
+
### 方式三: 使用 Provider Doctor 验证
|
|
178
|
+
|
|
179
|
+
```bash
|
|
180
|
+
# 检查 Provider 配置
|
|
181
|
+
routecodex provider inspect myprovider
|
|
182
|
+
|
|
183
|
+
# 使用路由提示
|
|
184
|
+
routecodex provider inspect myprovider --routing-hints
|
|
185
|
+
|
|
186
|
+
# 使用 Vercel AI SDK 验证连接
|
|
187
|
+
routecodex provider doctor myprovider
|
|
188
|
+
```
|
|
189
|
+
|
|
190
|
+
## 三、README 中标注情况分析
|
|
191
|
+
|
|
192
|
+
### ✅ 已清晰标注的内容
|
|
193
|
+
|
|
194
|
+
1. **基本初始化流程** (README.md 第 93-157 行):
|
|
195
|
+
- `rcc init` 基本用法
|
|
196
|
+
- V1→V2 迁移步骤
|
|
197
|
+
- 环境变量配置
|
|
198
|
+
- Provider 鉴权类型对照表
|
|
199
|
+
|
|
200
|
+
2. **Provider 目录结构** (README.md 第 142-144 行):
|
|
201
|
+
- `~/.routecodex/provider/<providerId>/config.v2.json`
|
|
202
|
+
|
|
203
|
+
3. **Provider 类型文档**:
|
|
204
|
+
- `docs/PROVIDER_TYPES.md` - Provider 类型说明
|
|
205
|
+
- `docs/PROVIDERS_BUILTIN.md` - 内置 Provider 列表
|
|
206
|
+
|
|
207
|
+
4. **Provider 模块架构**:
|
|
208
|
+
- `src/providers/README.md` - Provider V2 模块说明
|
|
209
|
+
|
|
210
|
+
### ⚠️ 不够清晰或缺失的内容
|
|
211
|
+
|
|
212
|
+
1. **手动添加 Provider 的完整步骤** - 只有 CLI 方式,缺少手动创建配置的详细指南
|
|
213
|
+
2. **Provider 配置文件 schema 说明** - 没有完整的 config.v2.json 字段说明文档
|
|
214
|
+
3. **自定义 Provider 开发指南** - 如何添加不在 catalog 中的新 Provider 类型
|
|
215
|
+
4. **路由配置详细说明** - routingPolicyGroups 的完整 schema 和最佳实践
|
|
216
|
+
5. **provider inspect/routing-hints 的使用场景** - 这些高级功能的实际应用案例
|
|
217
|
+
|
|
218
|
+
## 四、优化方向
|
|
219
|
+
|
|
220
|
+
### 1. 文档优化
|
|
221
|
+
|
|
222
|
+
#### A. 新增或完善文档
|
|
223
|
+
|
|
224
|
+
- [ ] `docs/PROVIDER_CONFIG_V2.md` - Provider V2 配置完整 schema 说明
|
|
225
|
+
- [ ] `docs/PROVIDER_ADD_MANUAL.md` - 手动添加 Provider 完整步骤指南
|
|
226
|
+
- [ ] `docs/ROUTING_POLICY_GUIDE.md` - 路由策略配置完整指南
|
|
227
|
+
- [ ] 更新 `README.md` - 补充手动添加 Provider 的章节
|
|
228
|
+
|
|
229
|
+
#### B. 增强现有文档
|
|
230
|
+
|
|
231
|
+
- [ ] 在 `README.md` 中添加 "Provider 管理" 独立章节
|
|
232
|
+
- [ ] 在 `src/providers/README.md` 中添加配置示例
|
|
233
|
+
- [ ] 补充 `provider inspect --routing-hints` 的实际应用案例
|
|
234
|
+
|
|
235
|
+
### 2. CLI 工具增强
|
|
236
|
+
|
|
237
|
+
#### A. 新增命令
|
|
238
|
+
|
|
239
|
+
```bash
|
|
240
|
+
# 新增 provider add 命令
|
|
241
|
+
routecodex provider add myprovider \
|
|
242
|
+
--type openai \
|
|
243
|
+
--base-url https://api.myprovider.com/v1 \
|
|
244
|
+
--auth-type apikey \
|
|
245
|
+
--env-var MYPROVIDER_API_KEY \
|
|
246
|
+
--model "my-model-1:supportsStreaming=true" \
|
|
247
|
+
--model "my-model-2:supportsStreaming=true" \
|
|
248
|
+
--default-model my-model-1
|
|
249
|
+
|
|
250
|
+
# 新增 provider template 命令 - 导出模板
|
|
251
|
+
routecodex provider template openai > myprovider-template.json
|
|
252
|
+
|
|
253
|
+
# 新增 provider validate 命令 - 验证配置
|
|
254
|
+
routecodex provider validate myprovider
|
|
255
|
+
```
|
|
256
|
+
|
|
257
|
+
#### B. 增强现有命令
|
|
258
|
+
|
|
259
|
+
- [ ] `init` 命令支持从 JSON 模板导入 Provider 配置
|
|
260
|
+
- [ ] `provider inspect` 输出更友好的配置建议
|
|
261
|
+
- [ ] `provider doctor` 支持更多 Provider 类型
|
|
262
|
+
|
|
263
|
+
### 3. 配置系统增强
|
|
264
|
+
|
|
265
|
+
#### A. Provider Catalog 扩展
|
|
266
|
+
|
|
267
|
+
- [ ] 支持自定义 catalog 扩展 (`~/.routecodex/provider-catalog.json`)
|
|
268
|
+
- [ ] 支持从远程 URL 加载 catalog
|
|
269
|
+
- [ ] catalog 版本管理和更新检查
|
|
270
|
+
|
|
271
|
+
#### B. 配置验证
|
|
272
|
+
|
|
273
|
+
- [ ] Provider 配置加载时的完整 schema 验证
|
|
274
|
+
- [ ] 更友好的配置错误提示
|
|
275
|
+
- [ ] 配置 lint 工具
|
|
276
|
+
|
|
277
|
+
### 4. 开发者体验优化
|
|
278
|
+
|
|
279
|
+
#### A. 配置生成辅助
|
|
280
|
+
|
|
281
|
+
- [ ] 交互式 `provider add` 向导
|
|
282
|
+
- [ ] 从 OpenAPI/Swagger 文档生成 Provider 配置
|
|
283
|
+
- [ ] Provider 配置分享和导入导出
|
|
284
|
+
|
|
285
|
+
#### B. 调试工具
|
|
286
|
+
|
|
287
|
+
- [ ] Provider 配置 dry-run 模式
|
|
288
|
+
- [ ] 实时配置变更预览
|
|
289
|
+
- [ ] 配置历史和回滚
|
|
290
|
+
|
|
291
|
+
## 五、优先级建议
|
|
292
|
+
|
|
293
|
+
### P0 (立即实施)
|
|
294
|
+
|
|
295
|
+
1. **文档**: 新增 `docs/PROVIDER_CONFIG_V2.md` - Provider V2 配置完整 schema
|
|
296
|
+
2. **文档**: 在 `README.md` 中补充"手动添加 Provider"完整步骤
|
|
297
|
+
3. **CLI**: 增强 `provider inspect --routing-hints` 输出更实用的配置片段
|
|
298
|
+
|
|
299
|
+
### P1 (短期)
|
|
300
|
+
|
|
301
|
+
1. **CLI**: 新增 `provider add` 命令
|
|
302
|
+
2. **文档**: 新增 `docs/ROUTING_POLICY_GUIDE.md`
|
|
303
|
+
3. **验证**: 实现 Provider 配置 schema 验证
|
|
304
|
+
|
|
305
|
+
### P2 (中期)
|
|
306
|
+
|
|
307
|
+
1. **扩展**: 支持自定义 Provider catalog
|
|
308
|
+
2. **工具**: Provider 配置导入导出
|
|
309
|
+
3. **调试**: 配置 dry-run 和预览
|
|
310
|
+
|
|
311
|
+
## 六、总结
|
|
312
|
+
|
|
313
|
+
### 当前状态
|
|
314
|
+
|
|
315
|
+
- ✅ CLI 初始化流程完善
|
|
316
|
+
- ✅ Provider 模板 catalog 丰富
|
|
317
|
+
- ✅ 基本文档覆盖
|
|
318
|
+
- ⚠️ 手动配置指引不足
|
|
319
|
+
- ⚠️ 高级功能文档缺失
|
|
320
|
+
|
|
321
|
+
### 核心问题
|
|
322
|
+
|
|
323
|
+
1. **新用户上手难**: 缺少完整的手动添加 Provider 指南
|
|
324
|
+
2. **配置不透明**: 缺少完整的配置 schema 文档
|
|
325
|
+
3. **工具链不完整**: 缺少 `provider add` 等便捷命令
|
|
326
|
+
|
|
327
|
+
### 优化重点
|
|
328
|
+
|
|
329
|
+
1. **文档优先**: 先完善文档,降低使用门槛
|
|
330
|
+
2. **工具增强**: 补充便捷 CLI 命令
|
|
331
|
+
3. **扩展性**: 支持自定义 Provider 类型和 catalog
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@jsonstudio/rcc",
|
|
3
|
-
"version": "0.90.
|
|
3
|
+
"version": "0.90.181",
|
|
4
4
|
"description": "Multi-provider OpenAI proxy server with anthropic/responses/chat support (release)",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "dist/index.js",
|
|
@@ -156,11 +156,14 @@
|
|
|
156
156
|
"fix:cli-permission": "node scripts/ensure-cli-executable.mjs"
|
|
157
157
|
},
|
|
158
158
|
"dependencies": {
|
|
159
|
+
"@ai-sdk/anthropic": "^3.0.58",
|
|
160
|
+
"@ai-sdk/openai": "^3.0.41",
|
|
159
161
|
"@anthropic-ai/sdk": "^0.65.0",
|
|
160
|
-
"@jsonstudio/llms": "0.6.
|
|
162
|
+
"@jsonstudio/llms": "0.6.3539",
|
|
161
163
|
"@lmstudio/sdk": "^1.5.0",
|
|
162
164
|
"@radix-ui/react-switch": "^1.2.6",
|
|
163
165
|
"@types/socket.io": "^3.0.1",
|
|
166
|
+
"ai": "^6.0.116",
|
|
164
167
|
"ajv": "^8.17.1",
|
|
165
168
|
"axios": "^1.12.2",
|
|
166
169
|
"chalk": "^5.6.2",
|