@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
@@ -4,302 +4,418 @@ function apikeyAuthEnv(envVar) {
4
4
  apiKey: `\${${envVar}}`
5
5
  };
6
6
  }
7
- export function getInitProviderCatalog() {
8
- return [
9
- {
7
+ const CATALOG = [
8
+ {
9
+ id: 'openai',
10
+ label: 'OpenAI (Chat)',
11
+ description: 'OpenAI-compatible Chat API (/v1/chat/completions)',
12
+ sdkBinding: { family: 'openai-compatible', supported: true },
13
+ capabilities: { supportsReasoning: true, supportsTools: true },
14
+ provider: {
10
15
  id: 'openai',
11
- label: 'OpenAI (Chat)',
12
- description: 'OpenAI-compatible Chat API (/v1/chat/completions)',
13
- provider: {
14
- id: 'openai',
15
- enabled: true,
16
- type: 'openai',
17
- baseURL: 'https://api.openai.com/v1',
18
- auth: apikeyAuthEnv('OPENAI_API_KEY'),
19
- models: {
20
- 'gpt-5.2': { supportsStreaming: true },
21
- 'gpt-5.2-codex': { supportsStreaming: true }
22
- }
23
- },
24
- defaultModel: 'gpt-5.2'
16
+ enabled: true,
17
+ type: 'openai',
18
+ baseURL: 'https://api.openai.com/v1',
19
+ auth: apikeyAuthEnv('OPENAI_API_KEY'),
20
+ models: {
21
+ 'gpt-5.2': { supportsStreaming: true },
22
+ 'gpt-5.2-codex': { supportsStreaming: true }
23
+ }
25
24
  },
26
- {
25
+ defaultModel: 'gpt-5.2'
26
+ },
27
+ {
28
+ id: 'tab',
29
+ label: 'TAB (Responses)',
30
+ description: 'OpenAI Responses compatible endpoint (/v1/responses)',
31
+ sdkBinding: {
32
+ family: 'openai-compatible',
33
+ supported: true,
34
+ notes: 'Doctor uses the OpenAI-compatible adapter; verify endpoint supports text generation.'
35
+ },
36
+ capabilities: { supportsReasoning: true, supportsTools: true },
37
+ provider: {
27
38
  id: 'tab',
28
- label: 'TAB (Responses)',
29
- description: 'OpenAI Responses compatible endpoint (/v1/responses)',
30
- provider: {
31
- id: 'tab',
32
- enabled: true,
33
- type: 'responses',
34
- baseURL: 'https://api.tabcode.cc/openai',
35
- auth: apikeyAuthEnv('TAB_API_KEY'),
36
- models: {
37
- 'gpt-5.2': { supportsStreaming: true },
38
- 'gpt-5.2-codex': { supportsStreaming: true }
39
- },
40
- responses: { process: 'chat', streaming: 'always' },
41
- config: { responses: { streaming: 'always' } }
39
+ enabled: true,
40
+ type: 'responses',
41
+ baseURL: 'https://api.tabcode.cc/openai',
42
+ auth: apikeyAuthEnv('TAB_API_KEY'),
43
+ models: {
44
+ 'gpt-5.2': { supportsStreaming: true },
45
+ 'gpt-5.2-codex': { supportsStreaming: true }
42
46
  },
43
- defaultModel: 'gpt-5.2'
47
+ responses: { process: 'chat', streaming: 'always' },
48
+ config: { responses: { streaming: 'always' } }
44
49
  },
45
- {
50
+ defaultModel: 'gpt-5.2'
51
+ },
52
+ {
53
+ id: 'deepseek-web',
54
+ label: 'DeepSeek Web (Account)',
55
+ description: 'DeepSeek Web account provider (chat:deepseek-web compatibility)',
56
+ sdkBinding: {
57
+ family: 'custom-runtime',
58
+ supported: false,
59
+ notes: 'Requires the DeepSeek web-account runtime path rather than direct Vercel AI SDK auth.'
60
+ },
61
+ capabilities: { supportsReasoning: true, supportsTools: true },
62
+ webSearch: {
63
+ engineId: 'deepseek:web_search',
64
+ providerKey: 'deepseek-web.deepseek-chat',
65
+ routeTarget: 'deepseek-web.deepseek-chat',
66
+ modelId: 'deepseek-chat',
67
+ description: 'DeepSeek native web_search route backend',
68
+ executionMode: 'direct',
69
+ directActivation: 'route',
70
+ default: true
71
+ },
72
+ provider: {
46
73
  id: 'deepseek-web',
47
- label: 'DeepSeek Web (Account)',
48
- description: 'DeepSeek Web account provider (chat:deepseek-web compatibility)',
49
- provider: {
50
- id: 'deepseek-web',
51
- enabled: true,
52
- type: 'openai',
53
- baseURL: 'https://chat.deepseek.com',
54
- compatibilityProfile: 'chat:deepseek-web',
55
- auth: {
56
- type: 'deepseek-account',
57
- entries: [
58
- {
59
- alias: '1',
60
- type: 'deepseek-account',
61
- tokenFile: '~/.routecodex/auth/deepseek-account-1.json'
62
- }
63
- ]
64
- },
65
- deepseek: {
66
- strictToolRequired: true,
67
- toolProtocol: 'text',
68
- powTimeoutMs: 15000,
69
- powMaxAttempts: 2,
70
- sessionReuseTtlMs: 1800000
71
- },
72
- models: {
73
- 'deepseek-chat': {
74
- supportsStreaming: true,
75
- aliases: ['deepseek-chat-search', 'deepseek-v3-search']
76
- },
77
- 'deepseek-reasoner': {
78
- supportsStreaming: true,
79
- aliases: ['deepseek-reasoner-search', 'deepseek-r1-search']
74
+ enabled: true,
75
+ type: 'openai',
76
+ baseURL: 'https://chat.deepseek.com',
77
+ compatibilityProfile: 'chat:deepseek-web',
78
+ auth: {
79
+ type: 'deepseek-account',
80
+ entries: [
81
+ {
82
+ alias: '1',
83
+ type: 'deepseek-account',
84
+ tokenFile: '~/.routecodex/auth/deepseek-account-1.json'
80
85
  }
81
- }
86
+ ]
82
87
  },
83
- defaultModel: 'deepseek-chat'
88
+ deepseek: {
89
+ strictToolRequired: true,
90
+ toolProtocol: 'text',
91
+ powTimeoutMs: 15000,
92
+ powMaxAttempts: 2,
93
+ sessionReuseTtlMs: 1800000
94
+ },
95
+ models: {
96
+ 'deepseek-chat': {
97
+ supportsStreaming: true,
98
+ aliases: ['deepseek-chat-search', 'deepseek-v3-search']
99
+ },
100
+ 'deepseek-reasoner': {
101
+ supportsStreaming: true,
102
+ aliases: ['deepseek-reasoner-search', 'deepseek-r1-search']
103
+ }
104
+ }
84
105
  },
85
- {
106
+ defaultModel: 'deepseek-chat'
107
+ },
108
+ {
109
+ id: 'glm',
110
+ label: 'GLM (OpenAI-compatible)',
111
+ description: 'Zhipu/BigModel OpenAI-compatible endpoint',
112
+ sdkBinding: { family: 'openai-compatible', supported: true },
113
+ capabilities: { supportsReasoning: true, supportsTools: true, supportsLongContext: true },
114
+ provider: {
86
115
  id: 'glm',
87
- label: 'GLM (OpenAI-compatible)',
88
- description: 'Zhipu/BigModel OpenAI-compatible endpoint',
89
- provider: {
90
- id: 'glm',
91
- enabled: true,
92
- type: 'openai',
93
- baseURL: 'https://open.bigmodel.cn/api/paas/v4',
94
- compatibilityProfile: 'chat:glm',
95
- auth: apikeyAuthEnv('GLM_API_KEY'),
96
- models: {
97
- 'glm-4.7': { supportsStreaming: true, maxContext: 202752 },
98
- 'glm-4.6': { supportsStreaming: true }
99
- }
100
- },
101
- defaultModel: 'glm-4.7'
116
+ enabled: true,
117
+ type: 'openai',
118
+ baseURL: 'https://open.bigmodel.cn/api/paas/v4',
119
+ compatibilityProfile: 'chat:glm',
120
+ auth: apikeyAuthEnv('GLM_API_KEY'),
121
+ models: {
122
+ 'glm-4.7': { supportsStreaming: true, maxContext: 202752 },
123
+ 'glm-4.6': { supportsStreaming: true }
124
+ }
102
125
  },
103
- {
104
- id: 'glm-anthropic',
105
- label: 'GLM (Anthropic Messages)',
106
- description: 'GLM via Anthropic Messages wire (/v1/messages upstream, bridged by RouteCodex)',
107
- provider: {
108
- id: 'glm',
109
- enabled: true,
110
- type: 'anthropic',
111
- baseURL: 'https://open.bigmodel.cn/api/anthropic',
112
- process: 'chat',
113
- auth: apikeyAuthEnv('GLM_API_KEY'),
114
- models: {
115
- 'glm-4.6': { supportsStreaming: true }
116
- }
117
- },
118
- defaultModel: 'glm-4.6'
126
+ defaultModel: 'glm-4.7'
127
+ },
128
+ {
129
+ id: 'glm-anthropic',
130
+ label: 'GLM (Anthropic Messages)',
131
+ description: 'GLM via Anthropic Messages wire (/v1/messages upstream, bridged by RouteCodex)',
132
+ sdkBinding: { family: 'anthropic-compatible', supported: true },
133
+ capabilities: { supportsReasoning: true, supportsTools: true },
134
+ provider: {
135
+ id: 'glm',
136
+ enabled: true,
137
+ type: 'anthropic',
138
+ baseURL: 'https://open.bigmodel.cn/api/anthropic',
139
+ process: 'chat',
140
+ auth: apikeyAuthEnv('GLM_API_KEY'),
141
+ models: {
142
+ 'glm-4.6': { supportsStreaming: true }
143
+ }
119
144
  },
120
- {
145
+ defaultModel: 'glm-4.6'
146
+ },
147
+ {
148
+ id: 'kimi',
149
+ label: 'Kimi (OpenAI-compatible)',
150
+ description: 'Moonshot Kimi coding endpoint',
151
+ sdkBinding: { family: 'openai-compatible', supported: true },
152
+ capabilities: { supportsCoding: true, supportsTools: true },
153
+ provider: {
121
154
  id: 'kimi',
122
- label: 'Kimi (OpenAI-compatible)',
123
- description: 'Moonshot Kimi coding endpoint',
124
- provider: {
125
- id: 'kimi',
126
- enabled: true,
127
- type: 'openai',
128
- baseURL: 'https://api.kimi.com/coding/v1',
129
- auth: apikeyAuthEnv('KIMI_API_KEY'),
130
- headers: { 'User-Agent': 'KimiCLI/1.0' },
131
- models: {
132
- 'kimi-for-coding': { supportsStreaming: true }
133
- }
134
- },
135
- defaultModel: 'kimi-for-coding'
155
+ enabled: true,
156
+ type: 'openai',
157
+ baseURL: 'https://api.kimi.com/coding/v1',
158
+ auth: apikeyAuthEnv('KIMI_API_KEY'),
159
+ headers: { 'User-Agent': 'KimiCLI/1.0' },
160
+ models: {
161
+ 'kimi-for-coding': { supportsStreaming: true }
162
+ }
136
163
  },
137
- {
164
+ defaultModel: 'kimi-for-coding'
165
+ },
166
+ {
167
+ id: 'modelscope',
168
+ label: 'ModelScope (OpenAI-compatible)',
169
+ description: 'ModelScope inference OpenAI-compatible endpoint',
170
+ sdkBinding: { family: 'openai-compatible', supported: true },
171
+ provider: {
138
172
  id: 'modelscope',
139
- label: 'ModelScope (OpenAI-compatible)',
140
- description: 'ModelScope inference OpenAI-compatible endpoint',
141
- provider: {
142
- id: 'modelscope',
143
- enabled: true,
144
- type: 'openai',
145
- baseURL: 'https://api-inference.modelscope.cn/v1',
146
- auth: apikeyAuthEnv('MODELSCOPE_API_KEY'),
147
- models: {
148
- 'deepseek-ai/DeepSeek-R1-0528': { supportsStreaming: true }
149
- }
150
- },
151
- defaultModel: 'deepseek-ai/DeepSeek-R1-0528'
173
+ enabled: true,
174
+ type: 'openai',
175
+ baseURL: 'https://api-inference.modelscope.cn/v1',
176
+ auth: apikeyAuthEnv('MODELSCOPE_API_KEY'),
177
+ models: {
178
+ 'deepseek-ai/DeepSeek-R1-0528': { supportsStreaming: true }
179
+ }
152
180
  },
153
- {
181
+ defaultModel: 'deepseek-ai/DeepSeek-R1-0528'
182
+ },
183
+ {
184
+ id: 'lmstudio',
185
+ label: 'LM Studio (local OpenAI-compatible)',
186
+ description: 'Local LM Studio server (default: http://127.0.0.1:1234/v1)',
187
+ sdkBinding: { family: 'openai-compatible', supported: true },
188
+ provider: {
154
189
  id: 'lmstudio',
155
- label: 'LM Studio (local OpenAI-compatible)',
156
- description: 'Local LM Studio server (default: http://127.0.0.1:1234/v1)',
157
- provider: {
158
- id: 'lmstudio',
159
- enabled: true,
160
- type: 'openai',
161
- baseURL: 'http://127.0.0.1:1234/v1',
162
- auth: { type: 'apikey', apiKey: '' },
163
- models: {
164
- 'gpt-oss-20b-mlx': { supportsStreaming: true }
165
- }
166
- },
167
- defaultModel: 'gpt-oss-20b-mlx'
190
+ enabled: true,
191
+ type: 'openai',
192
+ baseURL: 'http://127.0.0.1:1234/v1',
193
+ auth: { type: 'apikey', apiKey: '' },
194
+ models: {
195
+ 'gpt-oss-20b-mlx': { supportsStreaming: true }
196
+ }
168
197
  },
169
- {
198
+ defaultModel: 'gpt-oss-20b-mlx'
199
+ },
200
+ {
201
+ id: 'qwen',
202
+ label: 'Qwen (OAuth)',
203
+ description: 'Qwen Chat (OAuth token file), OpenAI-compatible wire',
204
+ sdkBinding: { family: 'openai-compatible', supported: true },
205
+ capabilities: {
206
+ supportsCoding: true,
207
+ supportsLongContext: true,
208
+ supportsMultimodal: true,
209
+ supportsTools: true
210
+ },
211
+ webSearch: {
212
+ engineId: 'qwen:web_search',
213
+ providerKey: 'qwen.qwen3.5-plus',
214
+ routeTarget: 'qwen.qwen3.5-plus',
215
+ modelId: 'qwen3.5-plus',
216
+ description: 'Qwen native web_search backend',
217
+ executionMode: 'servertool'
218
+ },
219
+ provider: {
170
220
  id: 'qwen',
171
- label: 'Qwen (OAuth)',
172
- description: 'Qwen Chat (OAuth token file), OpenAI-compatible wire',
173
- provider: {
174
- id: 'qwen',
175
- enabled: true,
176
- type: 'openai',
177
- baseURL: 'https://portal.qwen.ai/v1',
178
- compatibilityProfile: 'chat:qwen',
179
- auth: {
180
- type: 'qwen-oauth',
181
- tokenFile: 'default'
182
- },
183
- models: {
184
- 'qwen3-coder-plus': { supportsStreaming: true, maxContext: 1000000 },
185
- 'qwen3.5-plus': { supportsStreaming: true, maxContext: 1000000 },
186
- 'qwen3-vl-plus': { supportsStreaming: true }
187
- }
221
+ enabled: true,
222
+ type: 'openai',
223
+ baseURL: 'https://portal.qwen.ai/v1',
224
+ compatibilityProfile: 'chat:qwen',
225
+ auth: {
226
+ type: 'qwen-oauth',
227
+ tokenFile: 'default'
188
228
  },
189
- defaultModel: 'qwen3-coder-plus'
229
+ models: {
230
+ 'qwen3-coder-plus': { supportsStreaming: true, maxContext: 1000000 },
231
+ 'qwen3.5-plus': { supportsStreaming: true, maxContext: 1000000 },
232
+ 'qwen3-vl-plus': { supportsStreaming: true }
233
+ }
190
234
  },
191
- {
235
+ defaultModel: 'qwen3-coder-plus'
236
+ },
237
+ {
238
+ id: 'iflow',
239
+ label: 'iFlow (Cookie)',
240
+ description: 'iFlow OpenAI-compatible wire with cookie auth',
241
+ sdkBinding: {
242
+ family: 'custom-runtime',
243
+ supported: false,
244
+ notes: 'Requires cookie/HMAC auth handled by the existing RouteCodex runtime.'
245
+ },
246
+ capabilities: {
247
+ supportsCoding: true,
248
+ supportsLongContext: true,
249
+ supportsMultimodal: true,
250
+ supportsReasoning: true,
251
+ supportsTools: true
252
+ },
253
+ webSearch: {
254
+ engineId: 'iflow:web_search',
255
+ providerKey: 'iflow',
256
+ routeTarget: 'iflow.qwen3-coder-plus',
257
+ description: 'iFlow web_search backend',
258
+ executionMode: 'servertool'
259
+ },
260
+ provider: {
192
261
  id: 'iflow',
193
- label: 'iFlow (Cookie)',
194
- description: 'iFlow OpenAI-compatible wire with cookie auth',
195
- provider: {
196
- id: 'iflow',
197
- enabled: true,
198
- type: 'iflow',
199
- baseURL: 'https://apis.iflow.cn/v1',
200
- compatibilityProfile: 'chat:iflow',
201
- auth: {
202
- type: 'iflow-cookie',
203
- cookieFile: '~/.routecodex/auth/iflow-work.cookie'
204
- },
205
- models: {
206
- 'qwen3-coder-plus': { supportsStreaming: true, maxContext: 1000000 },
207
- 'qwen3-coder-next': { supportsStreaming: true, maxContext: 262144 },
208
- 'qwen3-max-2026-01-23': { supportsStreaming: true, maxContext: 262144 },
209
- 'qwen3-vl-plus': { supportsStreaming: true },
210
- 'kimi-k2.5': { supportsStreaming: true, maxContext: 262144 },
211
- 'glm-4.7': { supportsStreaming: true, maxContext: 202752 },
212
- 'glm-5': { supportsStreaming: true, maxContext: 202752 },
213
- 'minimax-m2.5': { supportsStreaming: true, maxContext: 204800 }
214
- }
262
+ enabled: true,
263
+ type: 'iflow',
264
+ baseURL: 'https://apis.iflow.cn/v1',
265
+ compatibilityProfile: 'chat:iflow',
266
+ auth: {
267
+ type: 'iflow-cookie',
268
+ cookieFile: '~/.routecodex/auth/iflow-work.cookie'
215
269
  },
216
- defaultModel: 'qwen3-coder-plus'
270
+ models: {
271
+ 'qwen3-coder-plus': { supportsStreaming: true, maxContext: 1000000 },
272
+ 'qwen3-coder-next': { supportsStreaming: true, maxContext: 262144 },
273
+ 'qwen3-max-2026-01-23': { supportsStreaming: true, maxContext: 262144 },
274
+ 'qwen3-vl-plus': { supportsStreaming: true },
275
+ 'kimi-k2.5': { supportsStreaming: true, maxContext: 262144 },
276
+ 'glm-4.7': { supportsStreaming: true, maxContext: 202752 },
277
+ 'glm-5': { supportsStreaming: true, maxContext: 202752 },
278
+ 'minimax-m2.5': { supportsStreaming: true, maxContext: 204800 }
279
+ }
217
280
  },
218
- {
281
+ defaultModel: 'qwen3-coder-plus'
282
+ },
283
+ {
284
+ id: 'mimo',
285
+ label: 'MiMo (OpenAI-compatible)',
286
+ description: 'Xiaomi MiMo OpenAI-compatible endpoint',
287
+ sdkBinding: { family: 'openai-compatible', supported: true },
288
+ provider: {
219
289
  id: 'mimo',
220
- label: 'MiMo (OpenAI-compatible)',
221
- description: 'Xiaomi MiMo OpenAI-compatible endpoint',
222
- provider: {
223
- id: 'mimo',
224
- enabled: true,
225
- type: 'openai',
226
- baseURL: 'https://api.xiaomimimo.com/v1',
227
- auth: apikeyAuthEnv('MIMO_API_KEY'),
228
- models: {
229
- 'mimo-v2-flash': { supportsStreaming: true }
230
- }
231
- },
232
- defaultModel: 'mimo-v2-flash'
290
+ enabled: true,
291
+ type: 'openai',
292
+ baseURL: 'https://api.xiaomimimo.com/v1',
293
+ auth: apikeyAuthEnv('MIMO_API_KEY'),
294
+ models: {
295
+ 'mimo-v2-flash': { supportsStreaming: true }
296
+ }
233
297
  },
234
- {
298
+ defaultModel: 'mimo-v2-flash'
299
+ },
300
+ {
301
+ id: 'gemini-cli',
302
+ label: 'Gemini CLI (Cloud Code Assist)',
303
+ description: 'Google Cloud Code Assist v1internal endpoints (Sandbox-first)',
304
+ sdkBinding: {
305
+ family: 'custom-runtime',
306
+ supported: false,
307
+ notes: 'Uses the existing gemini-cli runtime path rather than direct Vercel AI SDK transport.'
308
+ },
309
+ provider: {
235
310
  id: 'gemini-cli',
236
- label: 'Gemini CLI (Cloud Code Assist)',
237
- description: 'Google Cloud Code Assist v1internal endpoints (Sandbox-first)',
238
- provider: {
239
- id: 'gemini-cli',
240
- enabled: true,
241
- type: 'gemini-cli-http-provider',
242
- providerType: 'gemini',
243
- compatibilityProfile: 'chat:gemini',
244
- baseURL: 'https://daily-cloudcode-pa.sandbox.googleapis.com',
245
- auth: {
246
- type: 'gemini-cli-oauth',
247
- entries: [
248
- {
249
- alias: 'YOUR_ALIAS_HERE',
250
- type: 'gemini-cli-oauth',
251
- tokenFile: '~/.routecodex/auth/gemini-oauth-1-YOUR_ALIAS_HERE.json'
252
- }
253
- ]
254
- },
255
- models: {
256
- 'gemini-2.5-pro': { supportsStreaming: true },
257
- 'gemini-2.5-flash': { supportsStreaming: true },
258
- 'gemini-2.5-flash-lite': { supportsStreaming: true }
259
- }
311
+ enabled: true,
312
+ type: 'gemini-cli-http-provider',
313
+ providerType: 'gemini',
314
+ compatibilityProfile: 'chat:gemini',
315
+ baseURL: 'https://daily-cloudcode-pa.sandbox.googleapis.com',
316
+ auth: {
317
+ type: 'gemini-cli-oauth',
318
+ entries: [
319
+ {
320
+ alias: 'YOUR_ALIAS_HERE',
321
+ type: 'gemini-cli-oauth',
322
+ tokenFile: '~/.routecodex/auth/gemini-oauth-1-YOUR_ALIAS_HERE.json'
323
+ }
324
+ ]
260
325
  },
261
- defaultModel: 'gemini-2.5-flash'
326
+ models: {
327
+ 'gemini-2.5-pro': { supportsStreaming: true },
328
+ 'gemini-2.5-flash': { supportsStreaming: true },
329
+ 'gemini-2.5-flash-lite': { supportsStreaming: true }
330
+ }
262
331
  },
263
- {
332
+ defaultModel: 'gemini-2.5-flash'
333
+ },
334
+ {
335
+ id: 'antigravity',
336
+ label: 'Antigravity (Cloud Code Assist)',
337
+ description: 'Antigravity/Code Assist routing via v1internal endpoints (Sandbox-first)',
338
+ sdkBinding: {
339
+ family: 'custom-runtime',
340
+ supported: false,
341
+ notes: 'Uses the existing antigravity runtime path rather than direct Vercel AI SDK transport.'
342
+ },
343
+ capabilities: { supportsCoding: true, supportsReasoning: true, supportsTools: true },
344
+ provider: {
264
345
  id: 'antigravity',
265
- label: 'Antigravity (Cloud Code Assist)',
266
- description: 'Antigravity/Code Assist routing via v1internal endpoints (Sandbox-first)',
267
- provider: {
268
- id: 'antigravity',
269
- enabled: true,
270
- type: 'gemini-cli-http-provider',
271
- providerType: 'gemini',
272
- compatibilityProfile: 'chat:gemini-cli',
273
- baseURL: 'https://daily-cloudcode-pa.sandbox.googleapis.com',
274
- auth: {
275
- type: 'antigravity-oauth',
276
- entries: [
277
- {
278
- alias: 'YOUR_ALIAS_HERE',
279
- type: 'antigravity-oauth',
280
- tokenFile: '~/.routecodex/auth/antigravity-oauth-1-YOUR_ALIAS_HERE.json'
281
- }
282
- ]
283
- },
284
- models: {
285
- 'gemini-2.5-pro': { supportsStreaming: true },
286
- 'gemini-2.5-flash': { supportsStreaming: true },
287
- 'gemini-2.5-flash-lite': { supportsStreaming: true },
288
- 'gemini-3-pro-high': { supportsStreaming: true },
289
- // gemini-3-pro-low has a smaller context window than the high tier.
290
- 'gemini-3-pro-low': { supportsStreaming: true, maxContext: 256000 },
291
- 'gemini-3-flash-preview': { supportsStreaming: true },
292
- 'claude-sonnet-4-6': { supportsStreaming: true },
293
- 'claude-sonnet-4-6-thinking': { supportsStreaming: true },
294
- 'claude-opus-4-6-thinking': { supportsStreaming: true },
295
- // Keep legacy aliases for compatibility with existing local routes.
296
- 'claude-sonnet-4-5': { supportsStreaming: true },
297
- 'claude-sonnet-4-5-thinking': { supportsStreaming: true },
298
- 'claude-opus-4-5-thinking': { supportsStreaming: true }
299
- }
346
+ enabled: true,
347
+ type: 'gemini-cli-http-provider',
348
+ providerType: 'gemini',
349
+ compatibilityProfile: 'chat:gemini-cli',
350
+ baseURL: 'https://daily-cloudcode-pa.sandbox.googleapis.com',
351
+ auth: {
352
+ type: 'antigravity-oauth',
353
+ entries: [
354
+ {
355
+ alias: 'YOUR_ALIAS_HERE',
356
+ type: 'antigravity-oauth',
357
+ tokenFile: '~/.routecodex/auth/antigravity-oauth-1-YOUR_ALIAS_HERE.json'
358
+ }
359
+ ]
300
360
  },
301
- defaultModel: 'claude-sonnet-4-6-thinking'
361
+ models: {
362
+ 'gemini-2.5-pro': { supportsStreaming: true },
363
+ 'gemini-2.5-flash': { supportsStreaming: true },
364
+ 'gemini-2.5-flash-lite': { supportsStreaming: true },
365
+ 'gemini-3-pro-high': { supportsStreaming: true },
366
+ 'gemini-3-pro-low': { supportsStreaming: true, maxContext: 256000 },
367
+ 'gemini-3-flash-preview': { supportsStreaming: true },
368
+ 'claude-sonnet-4-6': { supportsStreaming: true },
369
+ 'claude-sonnet-4-6-thinking': { supportsStreaming: true },
370
+ 'claude-opus-4-6-thinking': { supportsStreaming: true },
371
+ 'claude-sonnet-4-5': { supportsStreaming: true },
372
+ 'claude-sonnet-4-5-thinking': { supportsStreaming: true },
373
+ 'claude-opus-4-5-thinking': { supportsStreaming: true }
374
+ }
375
+ },
376
+ defaultModel: 'claude-sonnet-4-6-thinking'
377
+ }
378
+ ];
379
+ function dedupeTargets(targets) {
380
+ return Array.from(new Set(targets.filter((target) => typeof target === 'string' && target.trim()).map((target) => target.trim())));
381
+ }
382
+ export function getInitProviderCatalog() {
383
+ return CATALOG.map((entry) => ({ ...entry }));
384
+ }
385
+ export function getInitProviderCatalogEntry(providerId) {
386
+ const normalized = providerId.trim();
387
+ return CATALOG.find((entry) => entry.id === normalized);
388
+ }
389
+ export function buildCatalogWebSearchDefaults(providers) {
390
+ const bindings = providers
391
+ .map((provider) => ({ provider, binding: provider.webSearch }))
392
+ .filter((entry) => Boolean(entry.binding));
393
+ if (!bindings.length) {
394
+ return null;
395
+ }
396
+ const defaultEngineId = bindings.find((entry) => entry.binding.default)?.binding.engineId ?? bindings[0].binding.engineId;
397
+ const routeTargets = dedupeTargets(bindings.map(({ provider, binding }) => binding.routeTarget || binding.providerKey || `${provider.id}.${binding.modelId || provider.defaultModel}`));
398
+ const engines = bindings.map(({ provider, binding }) => ({
399
+ id: binding.engineId,
400
+ providerKey: binding.providerKey || `${provider.id}.${binding.modelId || provider.defaultModel}`,
401
+ ...(binding.modelId ? { modelId: binding.modelId } : {}),
402
+ description: binding.description,
403
+ executionMode: binding.executionMode,
404
+ ...(binding.directActivation ? { directActivation: binding.directActivation } : {}),
405
+ ...(binding.engineId === defaultEngineId ? { default: true } : {})
406
+ }));
407
+ const search = Object.fromEntries(bindings.map(({ provider, binding }) => [
408
+ binding.engineId,
409
+ {
410
+ providerKey: binding.providerKey || `${provider.id}.${binding.modelId || provider.defaultModel}`
411
+ }
412
+ ]));
413
+ return {
414
+ routeTargets,
415
+ webSearch: {
416
+ engines,
417
+ search
302
418
  }
303
- ];
419
+ };
304
420
  }
305
421
  //# sourceMappingURL=init-provider-catalog.js.map