@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.
Files changed (97) hide show
  1. package/dist/build-info.js +2 -2
  2. package/dist/cli/commands/config.js +5 -5
  3. package/dist/cli/commands/config.js.map +1 -1
  4. package/dist/cli/commands/init/basic.js +30 -25
  5. package/dist/cli/commands/init/basic.js.map +1 -1
  6. package/dist/cli/commands/init/interactive.js +6 -1
  7. package/dist/cli/commands/init/interactive.js.map +1 -1
  8. package/dist/cli/commands/init/workflows.js +7 -7
  9. package/dist/cli/commands/init/workflows.js.map +1 -1
  10. package/dist/cli/commands/init.js +45 -104
  11. package/dist/cli/commands/init.js.map +1 -1
  12. package/dist/cli/config/bootstrap-provider-templates.d.ts +4 -0
  13. package/dist/cli/config/bootstrap-provider-templates.js +107 -0
  14. package/dist/cli/config/bootstrap-provider-templates.js.map +1 -0
  15. package/dist/cli/config/init-config.js +37 -102
  16. package/dist/cli/config/init-config.js.map +1 -1
  17. package/dist/cli/config/init-provider-catalog.d.ts +30 -0
  18. package/dist/cli/config/init-provider-catalog.js +381 -265
  19. package/dist/cli/config/init-provider-catalog.js.map +1 -1
  20. package/dist/cli/config/init-v2-builder.d.ts +20 -0
  21. package/dist/cli/config/init-v2-builder.js +150 -0
  22. package/dist/cli/config/init-v2-builder.js.map +1 -0
  23. package/dist/commands/provider-update.js +163 -173
  24. package/dist/commands/provider-update.js.map +1 -1
  25. package/dist/provider-sdk/provider-add-template.d.ts +17 -0
  26. package/dist/provider-sdk/provider-add-template.js +110 -0
  27. package/dist/provider-sdk/provider-add-template.js.map +1 -0
  28. package/dist/provider-sdk/provider-inspect.d.ts +37 -0
  29. package/dist/provider-sdk/provider-inspect.js +166 -0
  30. package/dist/provider-sdk/provider-inspect.js.map +1 -0
  31. package/dist/provider-sdk/provider-runtime-inference.d.ts +14 -0
  32. package/dist/provider-sdk/provider-runtime-inference.js +226 -0
  33. package/dist/provider-sdk/provider-runtime-inference.js.map +1 -0
  34. package/dist/provider-sdk/vercel-ai-doctor.d.ts +35 -0
  35. package/dist/provider-sdk/vercel-ai-doctor.js +150 -0
  36. package/dist/provider-sdk/vercel-ai-doctor.js.map +1 -0
  37. package/dist/providers/core/api/provider-types.d.ts +2 -0
  38. package/dist/providers/core/api/provider-types.js.map +1 -1
  39. package/dist/providers/core/runtime/http-request-executor.d.ts +2 -0
  40. package/dist/providers/core/runtime/http-request-executor.js +39 -40
  41. package/dist/providers/core/runtime/http-request-executor.js.map +1 -1
  42. package/dist/providers/core/runtime/http-transport-provider.d.ts +5 -0
  43. package/dist/providers/core/runtime/http-transport-provider.js +53 -6
  44. package/dist/providers/core/runtime/http-transport-provider.js.map +1 -1
  45. package/dist/providers/core/runtime/openai-responses-sdk-transport.d.ts +7 -0
  46. package/dist/providers/core/runtime/openai-responses-sdk-transport.js +142 -0
  47. package/dist/providers/core/runtime/openai-responses-sdk-transport.js.map +1 -0
  48. package/dist/providers/core/runtime/provider-factory.js +3 -0
  49. package/dist/providers/core/runtime/provider-factory.js.map +1 -1
  50. package/dist/providers/core/runtime/provider-request-executor-deps-factory.d.ts +2 -1
  51. package/dist/providers/core/runtime/provider-request-executor-deps-factory.js +1 -0
  52. package/dist/providers/core/runtime/provider-request-executor-deps-factory.js.map +1 -1
  53. package/dist/providers/core/runtime/provider-startup-tasks.d.ts +1 -0
  54. package/dist/providers/core/runtime/provider-startup-tasks.js +12 -0
  55. package/dist/providers/core/runtime/provider-startup-tasks.js.map +1 -0
  56. package/dist/providers/core/runtime/vercel-ai-sdk/anthropic-sdk-transport.d.ts +9 -0
  57. package/dist/providers/core/runtime/vercel-ai-sdk/anthropic-sdk-transport.js +642 -0
  58. package/dist/providers/core/runtime/vercel-ai-sdk/anthropic-sdk-transport.js.map +1 -0
  59. package/dist/providers/core/runtime/vercel-ai-sdk/openai-sdk-transport.d.ts +10 -0
  60. package/dist/providers/core/runtime/vercel-ai-sdk/openai-sdk-transport.js +539 -0
  61. package/dist/providers/core/runtime/vercel-ai-sdk/openai-sdk-transport.js.map +1 -0
  62. package/dist/providers/profile/provider-profile-loader.js +12 -1
  63. package/dist/providers/profile/provider-profile-loader.js.map +1 -1
  64. package/dist/providers/profile/provider-profile.d.ts +2 -0
  65. package/dist/server/handlers/chat-handler.js +4 -2
  66. package/dist/server/handlers/chat-handler.js.map +1 -1
  67. package/dist/server/handlers/config-admin-handler.js +75 -67
  68. package/dist/server/handlers/config-admin-handler.js.map +1 -1
  69. package/dist/server/handlers/handler-response-utils.js +126 -1
  70. package/dist/server/handlers/handler-response-utils.js.map +1 -1
  71. package/dist/server/handlers/handler-utils.d.ts +1 -1
  72. package/dist/server/handlers/handler-utils.js +5 -2
  73. package/dist/server/handlers/handler-utils.js.map +1 -1
  74. package/dist/server/handlers/messages-handler.js +4 -2
  75. package/dist/server/handlers/messages-handler.js.map +1 -1
  76. package/dist/server/handlers/responses-handler.js +4 -2
  77. package/dist/server/handlers/responses-handler.js.map +1 -1
  78. package/dist/server/runtime/http-server/antigravity-startup-tasks.d.ts +30 -0
  79. package/dist/server/runtime/http-server/antigravity-startup-tasks.js +108 -0
  80. package/dist/server/runtime/http-server/antigravity-startup-tasks.js.map +1 -0
  81. package/dist/server/runtime/http-server/executor/provider-response-converter.js +5 -0
  82. package/dist/server/runtime/http-server/executor/provider-response-converter.js.map +1 -1
  83. package/dist/server/runtime/http-server/executor-response.js +7 -1
  84. package/dist/server/runtime/http-server/executor-response.js.map +1 -1
  85. package/dist/server/runtime/http-server/http-server-bootstrap.js +3 -0
  86. package/dist/server/runtime/http-server/http-server-bootstrap.js.map +1 -1
  87. package/dist/server/runtime/http-server/http-server-runtime-providers.js +3 -72
  88. package/dist/server/runtime/http-server/http-server-runtime-providers.js.map +1 -1
  89. package/dist/server/runtime/http-server/request-executor.js +19 -8
  90. package/dist/server/runtime/http-server/request-executor.js.map +1 -1
  91. package/dist/server/runtime/http-server/routes.js +185 -25
  92. package/dist/server/runtime/http-server/routes.js.map +1 -1
  93. package/dist/server/utils/finish-reason.d.ts +2 -0
  94. package/dist/server/utils/finish-reason.js +75 -0
  95. package/dist/server/utils/finish-reason.js.map +1 -0
  96. package/docs/provider-analysis.md +331 -0
  97. 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.141",
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.3214",
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",