@rigelbuild/omp-catalog 18.0.3

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 (117) hide show
  1. package/CHANGELOG.md +1204 -0
  2. package/LICENSE +22 -0
  3. package/README.md +43 -0
  4. package/THIRD-PARTY-NOTICES.txt +22909 -0
  5. package/dist/types/build.d.ts +19 -0
  6. package/dist/types/compat/anthropic.d.ts +18 -0
  7. package/dist/types/compat/apply.d.ts +7 -0
  8. package/dist/types/compat/bedrock.d.ts +3 -0
  9. package/dist/types/compat/devin.d.ts +9 -0
  10. package/dist/types/compat/openai.d.ts +28 -0
  11. package/dist/types/discovery/antigravity.d.ts +70 -0
  12. package/dist/types/discovery/codex.d.ts +36 -0
  13. package/dist/types/discovery/cursor-proto.d.ts +5368 -0
  14. package/dist/types/discovery/cursor.d.ts +23 -0
  15. package/dist/types/discovery/devin-proto.d.ts +1549 -0
  16. package/dist/types/discovery/devin.d.ts +24 -0
  17. package/dist/types/discovery/gemini-cli.d.ts +33 -0
  18. package/dist/types/discovery/gemini.d.ts +25 -0
  19. package/dist/types/discovery/gitlab-duo-workflow.d.ts +30 -0
  20. package/dist/types/discovery/index.d.ts +7 -0
  21. package/dist/types/discovery/openai-compatible.d.ts +89 -0
  22. package/dist/types/discovery/protobuf.d.ts +102 -0
  23. package/dist/types/effort.d.ts +10 -0
  24. package/dist/types/fireworks-model-id.d.ts +23 -0
  25. package/dist/types/hosts.d.ts +169 -0
  26. package/dist/types/identity/bundled.d.ts +3 -0
  27. package/dist/types/identity/classify.d.ts +69 -0
  28. package/dist/types/identity/dialect.d.ts +3 -0
  29. package/dist/types/identity/family.d.ts +239 -0
  30. package/dist/types/identity/id.d.ts +12 -0
  31. package/dist/types/identity/index.d.ts +8 -0
  32. package/dist/types/identity/markers.d.ts +4 -0
  33. package/dist/types/identity/priority.d.ts +1 -0
  34. package/dist/types/identity/reference.d.ts +29 -0
  35. package/dist/types/index.d.ts +19 -0
  36. package/dist/types/model-cache.d.ts +23 -0
  37. package/dist/types/model-manager.d.ts +77 -0
  38. package/dist/types/model-thinking.d.ts +70 -0
  39. package/dist/types/model-tokenizer.d.ts +8 -0
  40. package/dist/types/models.d.ts +14 -0
  41. package/dist/types/openai-pricing.d.ts +17 -0
  42. package/dist/types/provider-models/bundled-references.d.ts +13 -0
  43. package/dist/types/provider-models/cache-provider-id.d.ts +11 -0
  44. package/dist/types/provider-models/descriptor-types.d.ts +76 -0
  45. package/dist/types/provider-models/descriptors.d.ts +505 -0
  46. package/dist/types/provider-models/google.d.ts +29 -0
  47. package/dist/types/provider-models/index.d.ts +7 -0
  48. package/dist/types/provider-models/ollama.d.ts +22 -0
  49. package/dist/types/provider-models/openai-compat.d.ts +646 -0
  50. package/dist/types/provider-models/special.d.ts +53 -0
  51. package/dist/types/types.d.ts +876 -0
  52. package/dist/types/utils.d.ts +20 -0
  53. package/dist/types/variant-collapse.d.ts +137 -0
  54. package/dist/types/wire/alibaba-token-plan.d.ts +22 -0
  55. package/dist/types/wire/codex.d.ts +66 -0
  56. package/dist/types/wire/coreweave.d.ts +12 -0
  57. package/dist/types/wire/gemini-headers.d.ts +62 -0
  58. package/dist/types/wire/github-copilot.d.ts +47 -0
  59. package/dist/types/wire/image-fetchers.d.ts +76 -0
  60. package/package.json +102 -0
  61. package/src/build.ts +103 -0
  62. package/src/compat/anthropic.ts +179 -0
  63. package/src/compat/apply.ts +15 -0
  64. package/src/compat/bedrock.ts +153 -0
  65. package/src/compat/devin.ts +12 -0
  66. package/src/compat/openai.ts +864 -0
  67. package/src/discovery/antigravity.ts +257 -0
  68. package/src/discovery/codex.ts +456 -0
  69. package/src/discovery/cursor-proto.ts +8329 -0
  70. package/src/discovery/cursor.ts +409 -0
  71. package/src/discovery/devin-proto.ts +2037 -0
  72. package/src/discovery/devin.ts +152 -0
  73. package/src/discovery/gemini-cli.ts +198 -0
  74. package/src/discovery/gemini.ts +260 -0
  75. package/src/discovery/gitlab-duo-workflow.ts +859 -0
  76. package/src/discovery/index.ts +7 -0
  77. package/src/discovery/openai-compatible.ts +266 -0
  78. package/src/discovery/protobuf.ts +1073 -0
  79. package/src/effort.ts +18 -0
  80. package/src/fireworks-model-id.ts +50 -0
  81. package/src/hosts.ts +178 -0
  82. package/src/identity/bundled.ts +28 -0
  83. package/src/identity/classify.ts +242 -0
  84. package/src/identity/dialect.ts +42 -0
  85. package/src/identity/family.ts +477 -0
  86. package/src/identity/id.ts +81 -0
  87. package/src/identity/index.ts +8 -0
  88. package/src/identity/markers.ts +49 -0
  89. package/src/identity/priority.ts +59 -0
  90. package/src/identity/reference.ts +167 -0
  91. package/src/index.ts +19 -0
  92. package/src/model-cache.ts +346 -0
  93. package/src/model-manager.ts +683 -0
  94. package/src/model-thinking.ts +925 -0
  95. package/src/model-tokenizer.ts +75 -0
  96. package/src/models.json +304657 -0
  97. package/src/models.json.d.ts +9 -0
  98. package/src/models.ts +108 -0
  99. package/src/openai-pricing.ts +29 -0
  100. package/src/provider-models/bundled-references.ts +87 -0
  101. package/src/provider-models/cache-provider-id.ts +97 -0
  102. package/src/provider-models/descriptor-types.ts +85 -0
  103. package/src/provider-models/descriptors.ts +585 -0
  104. package/src/provider-models/google.ts +117 -0
  105. package/src/provider-models/index.ts +7 -0
  106. package/src/provider-models/ollama.ts +204 -0
  107. package/src/provider-models/openai-compat.ts +6405 -0
  108. package/src/provider-models/special.ts +213 -0
  109. package/src/types.ts +1032 -0
  110. package/src/utils.ts +69 -0
  111. package/src/variant-collapse.ts +1555 -0
  112. package/src/wire/alibaba-token-plan.ts +54 -0
  113. package/src/wire/codex.ts +117 -0
  114. package/src/wire/coreweave.ts +51 -0
  115. package/src/wire/gemini-headers.ts +135 -0
  116. package/src/wire/github-copilot.ts +147 -0
  117. package/src/wire/image-fetchers.ts +159 -0
@@ -0,0 +1,585 @@
1
+ /**
2
+ * The provider catalog table: one entry per chat-model provider, carrying the
3
+ * catalog half of what used to live in `@oh-my-pi/pi-ai`'s registry definitions
4
+ * (default model, runtime model-manager factory, discovery wiring). The auth
5
+ * half (env keys, OAuth login/refresh) stays in the pi-ai registry, which
6
+ * type-checks itself against `KnownProvider` from this table.
7
+ */
8
+ import type { ModelManagerConfig, ProviderCatalogEntry, ProviderDescriptor } from "./descriptor-types";
9
+ import { googleModelManagerOptions, googleVertexModelManagerOptions } from "./google";
10
+ import { ollamaCloudModelManagerOptions } from "./ollama";
11
+ import {
12
+ aiandModelManagerOptions,
13
+ aimlApiModelManagerOptions,
14
+ alibabaCodingPlanModelManagerOptions,
15
+ alibabaTokenPlanModelManagerOptions,
16
+ anthropicModelManagerOptions,
17
+ basetenModelManagerOptions,
18
+ bedrockMantleModelManagerOptions,
19
+ cerebrasModelManagerOptions,
20
+ cloudflareAiGatewayModelManagerOptions,
21
+ coreWeaveModelManagerOptions,
22
+ deepseekModelManagerOptions,
23
+ firepassModelManagerOptions,
24
+ fireworksModelManagerOptions,
25
+ githubCopilotModelManagerOptions,
26
+ gmiCloudModelManagerOptions,
27
+ groqModelManagerOptions,
28
+ huggingfaceModelManagerOptions,
29
+ kiloModelManagerOptions,
30
+ kimiCodeModelManagerOptions,
31
+ litellmModelManagerOptions,
32
+ lmStudioModelManagerOptions,
33
+ metaModelManagerOptions,
34
+ mistralModelManagerOptions,
35
+ moonshotModelManagerOptions,
36
+ nanoGptModelManagerOptions,
37
+ novitaModelManagerOptions,
38
+ nvidiaModelManagerOptions,
39
+ ollamaModelManagerOptions,
40
+ openaiModelManagerOptions,
41
+ opencodeGoModelManagerOptions,
42
+ opencodeZenModelManagerOptions,
43
+ openrouterModelManagerOptions,
44
+ qianfanModelManagerOptions,
45
+ qwenPortalModelManagerOptions,
46
+ sakanaModelManagerOptions,
47
+ siliconflowCnModelManagerOptions,
48
+ siliconflowModelManagerOptions,
49
+ syntheticModelManagerOptions,
50
+ togetherModelManagerOptions,
51
+ umansModelManagerOptions,
52
+ veniceModelManagerOptions,
53
+ vercelAiGatewayModelManagerOptions,
54
+ vllmModelManagerOptions,
55
+ waferServerlessModelManagerOptions,
56
+ xaiModelManagerOptions,
57
+ xaiOAuthModelManagerOptions,
58
+ xiaomiModelManagerOptions,
59
+ zenmuxModelManagerOptions,
60
+ zhipuCodingPlanModelManagerOptions,
61
+ } from "./openai-compat";
62
+ import {
63
+ cursorModelManagerOptions,
64
+ devinModelManagerOptions,
65
+ gitLabDuoWorkflowModelManagerOptions,
66
+ zaiModelManagerOptions,
67
+ } from "./special";
68
+
69
+ export const CATALOG_PROVIDERS = [
70
+ {
71
+ id: "aiand",
72
+ defaultModel: "moonshotai/kimi-k2.7-code",
73
+ envVars: ["AIAND_API_KEY"],
74
+ createModelManagerOptions: (config: ModelManagerConfig) => aiandModelManagerOptions(config),
75
+ dynamicModelsAuthoritative: true,
76
+ catalogDiscovery: { label: "ai&" },
77
+ },
78
+ {
79
+ id: "aimlapi",
80
+ defaultModel: "gpt-5.5-2026-04-23",
81
+ envVars: ["AIMLAPI_API_KEY"],
82
+ createModelManagerOptions: (config: ModelManagerConfig) => aimlApiModelManagerOptions(config),
83
+ dynamicModelsAuthoritative: true,
84
+ catalogDiscovery: { label: "AIML API" },
85
+ },
86
+ {
87
+ id: "alibaba-coding-plan",
88
+ defaultModel: "qwen3.7-plus",
89
+ envVars: ["ALIBABA_CODING_PLAN_API_KEY"],
90
+ createModelManagerOptions: (config: ModelManagerConfig) => alibabaCodingPlanModelManagerOptions(config),
91
+ catalogDiscovery: { label: "Alibaba Coding Plan" },
92
+ },
93
+ {
94
+ id: "alibaba-token-plan",
95
+ defaultModel: "qwen3.7-plus",
96
+ envVars: ["ALIBABA_TOKEN_PLAN_API_KEY", "BAILIAN_TOKEN_PLAN_API_KEY"],
97
+ createModelManagerOptions: (config: ModelManagerConfig) => alibabaTokenPlanModelManagerOptions(config),
98
+ dynamicModelsAuthoritative: true,
99
+ catalogDiscovery: { label: "QwenCloud Token Plan" },
100
+ },
101
+ {
102
+ id: "baseten",
103
+ defaultModel: "moonshotai/Kimi-K2.7-Code",
104
+ envVars: ["BASETEN_API_KEY"],
105
+ createModelManagerOptions: (config: ModelManagerConfig) => basetenModelManagerOptions(config),
106
+ dynamicModelsAuthoritative: true,
107
+ catalogDiscovery: { label: "Baseten" },
108
+ },
109
+ {
110
+ id: "amazon-bedrock",
111
+ defaultModel: "us.anthropic.claude-opus-4-8",
112
+ },
113
+ {
114
+ id: "bedrock-mantle",
115
+ defaultModel: "openai.gpt-5.6-terra",
116
+ envVars: ["AWS_BEARER_TOKEN_BEDROCK"],
117
+ createModelManagerOptions: (config: ModelManagerConfig) => bedrockMantleModelManagerOptions(config),
118
+ dynamicModelsAuthoritative: true,
119
+ },
120
+ {
121
+ id: "anthropic",
122
+ defaultModel: "claude-opus-4-8",
123
+ envVars: ["ANTHROPIC_API_KEY"],
124
+ createModelManagerOptions: (config: ModelManagerConfig) => anthropicModelManagerOptions(config),
125
+ catalogDiscovery: { label: "Anthropic" },
126
+ },
127
+ {
128
+ id: "azure",
129
+ defaultModel: "gpt-5.5",
130
+ envVars: ["AZURE_OPENAI_API_KEY"],
131
+ },
132
+ {
133
+ id: "cerebras",
134
+ defaultModel: "zai-glm-4.7",
135
+ envVars: ["CEREBRAS_API_KEY"],
136
+ createModelManagerOptions: (config: ModelManagerConfig) => cerebrasModelManagerOptions(config),
137
+ catalogDiscovery: { label: "Cerebras" },
138
+ },
139
+ {
140
+ id: "cloudflare-ai-gateway",
141
+ defaultModel: "anthropic/claude-opus-4-8",
142
+ envVars: ["CLOUDFLARE_AI_GATEWAY_API_KEY"],
143
+ createModelManagerOptions: (config: ModelManagerConfig) => cloudflareAiGatewayModelManagerOptions(config),
144
+ catalogDiscovery: { label: "Cloudflare AI Gateway" },
145
+ },
146
+ {
147
+ id: "cursor",
148
+ defaultModel: "claude-4.6-opus-high",
149
+ envVars: ["CURSOR_ACCESS_TOKEN"],
150
+ createModelManagerOptions: (config: ModelManagerConfig) => cursorModelManagerOptions(config),
151
+ catalogDiscovery: { label: "Cursor", envVars: ["CURSOR_API_KEY"], oauthProvider: "cursor" },
152
+ },
153
+ {
154
+ id: "deepseek",
155
+ defaultModel: "deepseek-v4-pro",
156
+ envVars: ["DEEPSEEK_API_KEY"],
157
+ createModelManagerOptions: (config: ModelManagerConfig) => deepseekModelManagerOptions(config),
158
+ catalogDiscovery: { label: "DeepSeek" },
159
+ },
160
+ {
161
+ id: "devin",
162
+ defaultModel: "swe-1-6",
163
+ envVars: ["DEVIN_API_KEY"],
164
+ createModelManagerOptions: (config: ModelManagerConfig) => devinModelManagerOptions(config),
165
+ dynamicModelsAuthoritative: true,
166
+ catalogDiscovery: { label: "Devin", envVars: ["DEVIN_API_KEY"], oauthProvider: "devin" },
167
+ },
168
+ {
169
+ id: "firepass",
170
+ defaultModel: "kimi-k2.6-turbo",
171
+ envVars: ["FIREPASS_API_KEY"],
172
+ createModelManagerOptions: (config: ModelManagerConfig) => firepassModelManagerOptions(config),
173
+ },
174
+ {
175
+ id: "fireworks",
176
+ defaultModel: "kimi-k2.7-code",
177
+ envVars: ["FIREWORKS_API_KEY"],
178
+ createModelManagerOptions: (config: ModelManagerConfig) => fireworksModelManagerOptions(config),
179
+ catalogDiscovery: { label: "Fireworks" },
180
+ },
181
+ {
182
+ id: "github-copilot",
183
+ defaultModel: "gpt-5.5",
184
+ envVars: ["COPILOT_GITHUB_TOKEN"],
185
+ createModelManagerOptions: (config: ModelManagerConfig) => githubCopilotModelManagerOptions(config),
186
+ },
187
+ {
188
+ id: "gitlab-duo",
189
+ defaultModel: "duo-chat-opus-4-6",
190
+ envVars: ["GITLAB_TOKEN"],
191
+ },
192
+ {
193
+ id: "gitlab-duo-agent",
194
+ defaultModel: "claude_sonnet_4_6_vertex",
195
+ envVars: ["GITLAB_TOKEN"],
196
+ createModelManagerOptions: (config: ModelManagerConfig) => gitLabDuoWorkflowModelManagerOptions(config),
197
+ dynamicModelsAuthoritative: true,
198
+ },
199
+ {
200
+ id: "gmi-cloud",
201
+ defaultModel: "deepseek-ai/DeepSeek-V4-Flash",
202
+ envVars: ["GMI_API_KEY"],
203
+ createModelManagerOptions: (config: ModelManagerConfig) => gmiCloudModelManagerOptions(config),
204
+ dynamicModelsAuthoritative: true,
205
+ catalogDiscovery: { label: "GMI Cloud" },
206
+ },
207
+ {
208
+ id: "google",
209
+ defaultModel: "gemini-3.1-pro-preview",
210
+ envVars: ["GEMINI_API_KEY"],
211
+ createModelManagerOptions: (config: ModelManagerConfig) => googleModelManagerOptions(config),
212
+ },
213
+ {
214
+ id: "google-antigravity",
215
+ defaultModel: "gemini-3.1-pro",
216
+ specialModelManager: true,
217
+ },
218
+ {
219
+ id: "google-gemini-cli",
220
+ defaultModel: "gemini-3.1-pro-preview",
221
+ specialModelManager: true,
222
+ },
223
+ {
224
+ id: "google-vertex",
225
+ defaultModel: "gemini-3.1-pro-preview",
226
+ createModelManagerOptions: (config: ModelManagerConfig) => googleVertexModelManagerOptions(config),
227
+ allowUnauthenticated: true,
228
+ },
229
+ {
230
+ id: "groq",
231
+ defaultModel: "openai/gpt-oss-120b",
232
+ envVars: ["GROQ_API_KEY"],
233
+ createModelManagerOptions: (config: ModelManagerConfig) => groqModelManagerOptions(config),
234
+ },
235
+ {
236
+ id: "huggingface",
237
+ defaultModel: "deepseek-ai/DeepSeek-R1",
238
+ envVars: ["HUGGINGFACE_HUB_TOKEN", "HF_TOKEN"],
239
+ createModelManagerOptions: (config: ModelManagerConfig) => huggingfaceModelManagerOptions(config),
240
+ catalogDiscovery: { label: "Hugging Face" },
241
+ },
242
+ {
243
+ id: "kilo",
244
+ defaultModel: "anthropic/claude-opus-4.8",
245
+ envVars: ["KILO_API_KEY"],
246
+ createModelManagerOptions: (config: ModelManagerConfig) => kiloModelManagerOptions(config),
247
+ catalogDiscovery: { label: "Kilo Gateway", allowUnauthenticated: true },
248
+ },
249
+ {
250
+ id: "kimi-code",
251
+ defaultModel: "kimi-for-coding",
252
+ createModelManagerOptions: (config: ModelManagerConfig) => kimiCodeModelManagerOptions(config),
253
+ catalogDiscovery: { label: "Kimi Code", envVars: ["KIMI_API_KEY"] },
254
+ },
255
+ {
256
+ id: "litellm",
257
+ defaultModel: "claude-opus-4-8",
258
+ envVars: ["LITELLM_API_KEY"],
259
+ createModelManagerOptions: (config: ModelManagerConfig) => litellmModelManagerOptions(config),
260
+ catalogDiscovery: { label: "LiteLLM", allowUnauthenticated: true },
261
+ },
262
+ {
263
+ id: "lm-studio",
264
+ defaultModel: "llama-3-8b",
265
+ envVars: ["LM_STUDIO_API_KEY"],
266
+ createModelManagerOptions: (config: ModelManagerConfig) => lmStudioModelManagerOptions(config),
267
+ allowUnauthenticated: true,
268
+ },
269
+ {
270
+ id: "minimax",
271
+ defaultModel: "MiniMax-M3",
272
+ envVars: ["MINIMAX_API_KEY"],
273
+ },
274
+ {
275
+ id: "minimax-code",
276
+ defaultModel: "MiniMax-M3",
277
+ envVars: ["MINIMAX_CODE_API_KEY"],
278
+ },
279
+ {
280
+ id: "minimax-code-cn",
281
+ defaultModel: "MiniMax-M3",
282
+ envVars: ["MINIMAX_CODE_CN_API_KEY"],
283
+ },
284
+ {
285
+ id: "mistral",
286
+ defaultModel: "devstral-medium-latest",
287
+ envVars: ["MISTRAL_API_KEY"],
288
+ createModelManagerOptions: (config: ModelManagerConfig) => mistralModelManagerOptions(config),
289
+ },
290
+ {
291
+ id: "meta",
292
+ defaultModel: "muse-spark-1.1",
293
+ envVars: ["MODEL_API_KEY", "META_API_KEY"],
294
+ createModelManagerOptions: (config: ModelManagerConfig) => metaModelManagerOptions(config),
295
+ catalogDiscovery: { label: "Meta Model API" },
296
+ },
297
+ {
298
+ id: "moonshot",
299
+ defaultModel: "kimi-k2.7-code",
300
+ // KIMI_API_KEY is the most intuitive name for a Kimi/Moonshot key; accept it
301
+ // as a fallback so China users need not learn MOONSHOT_API_KEY. (#2883)
302
+ envVars: ["MOONSHOT_API_KEY", "KIMI_API_KEY"],
303
+ createModelManagerOptions: (config: ModelManagerConfig) => moonshotModelManagerOptions(config),
304
+ catalogDiscovery: { label: "Moonshot" },
305
+ },
306
+ {
307
+ id: "nanogpt",
308
+ defaultModel: "openai/gpt-5.5",
309
+ envVars: ["NANO_GPT_API_KEY"],
310
+ createModelManagerOptions: (config: ModelManagerConfig) => nanoGptModelManagerOptions(config),
311
+ catalogDiscovery: { label: "NanoGPT" },
312
+ },
313
+ {
314
+ id: "nvidia",
315
+ defaultModel: "nvidia/llama-3.1-nemotron-70b-instruct",
316
+ envVars: ["NVIDIA_API_KEY"],
317
+ createModelManagerOptions: (config: ModelManagerConfig) => nvidiaModelManagerOptions(config),
318
+ catalogDiscovery: { label: "NVIDIA" },
319
+ },
320
+ {
321
+ id: "novita",
322
+ defaultModel: "moonshotai/kimi-k2.7-code",
323
+ envVars: ["NOVITA_API_KEY"],
324
+ createModelManagerOptions: (config: ModelManagerConfig) => novitaModelManagerOptions(config),
325
+ dynamicModelsAuthoritative: true,
326
+ catalogDiscovery: { label: "Novita", allowUnauthenticated: true },
327
+ },
328
+ {
329
+ id: "ollama",
330
+ defaultModel: "gpt-oss:20b",
331
+ envVars: ["OLLAMA_API_KEY"],
332
+ createModelManagerOptions: (config: ModelManagerConfig) => ollamaModelManagerOptions(config),
333
+ allowUnauthenticated: true,
334
+ },
335
+ {
336
+ id: "ollama-cloud",
337
+ defaultModel: "gpt-oss:120b",
338
+ envVars: ["OLLAMA_CLOUD_API_KEY"],
339
+ createModelManagerOptions: (config: ModelManagerConfig) => ollamaCloudModelManagerOptions(config),
340
+ catalogDiscovery: { label: "Ollama Cloud", oauthProvider: "ollama-cloud" },
341
+ },
342
+ {
343
+ id: "openai",
344
+ defaultModel: "gpt-5.5",
345
+ envVars: ["OPENAI_API_KEY"],
346
+ createModelManagerOptions: (config: ModelManagerConfig) => openaiModelManagerOptions(config),
347
+ },
348
+ {
349
+ id: "openai-codex",
350
+ defaultModel: "gpt-5.5",
351
+ envVars: ["OPENAI_CODEX_OAUTH_TOKEN"],
352
+ specialModelManager: true,
353
+ },
354
+ {
355
+ id: "opencode-go",
356
+ defaultModel: "kimi-k2.7-code",
357
+ envVars: ["OPENCODE_API_KEY"],
358
+ createModelManagerOptions: (config: ModelManagerConfig) => opencodeGoModelManagerOptions(config),
359
+ dynamicModelsAuthoritative: true,
360
+ },
361
+ {
362
+ id: "opencode-zen",
363
+ defaultModel: "claude-opus-4-8",
364
+ envVars: ["OPENCODE_API_KEY"],
365
+ createModelManagerOptions: (config: ModelManagerConfig) => opencodeZenModelManagerOptions(config),
366
+ dynamicModelsAuthoritative: true,
367
+ },
368
+ {
369
+ id: "openrouter",
370
+ defaultModel: "openai/gpt-5.5",
371
+ envVars: ["OPENROUTER_API_KEY"],
372
+ createModelManagerOptions: (config: ModelManagerConfig) => openrouterModelManagerOptions(config),
373
+ catalogDiscovery: { label: "OpenRouter", allowUnauthenticated: true },
374
+ },
375
+ {
376
+ id: "qianfan",
377
+ defaultModel: "deepseek-v3.2",
378
+ envVars: ["QIANFAN_API_KEY"],
379
+ createModelManagerOptions: (config: ModelManagerConfig) => qianfanModelManagerOptions(config),
380
+ catalogDiscovery: { label: "Qianfan" },
381
+ },
382
+ {
383
+ id: "qwen-portal",
384
+ defaultModel: "coder-model",
385
+ envVars: ["QWEN_OAUTH_TOKEN", "QWEN_PORTAL_API_KEY"],
386
+ createModelManagerOptions: (config: ModelManagerConfig) => qwenPortalModelManagerOptions(config),
387
+ catalogDiscovery: {
388
+ label: "Qwen Portal",
389
+ oauthProvider: "qwen-portal",
390
+ },
391
+ },
392
+ {
393
+ id: "sakana",
394
+ defaultModel: "fugu",
395
+ envVars: ["SAKANA_API_KEY", "FUGU_API_KEY"],
396
+ createModelManagerOptions: (config: ModelManagerConfig) => sakanaModelManagerOptions(config),
397
+ dynamicModelsAuthoritative: true,
398
+ catalogDiscovery: { label: "Sakana AI" },
399
+ },
400
+ {
401
+ id: "siliconflow",
402
+ defaultModel: "zai-org/GLM-5.1",
403
+ envVars: ["SILICONFLOW_API_KEY"],
404
+ createModelManagerOptions: (config: ModelManagerConfig) => siliconflowModelManagerOptions(config),
405
+ dynamicModelsAuthoritative: true,
406
+ },
407
+ {
408
+ id: "siliconflow-cn",
409
+ defaultModel: "deepseek-ai/DeepSeek-V4-Pro",
410
+ envVars: ["SILICONFLOW_CN_API_KEY"],
411
+ createModelManagerOptions: (config: ModelManagerConfig) => siliconflowCnModelManagerOptions(config),
412
+ dynamicModelsAuthoritative: true,
413
+ },
414
+ {
415
+ id: "synthetic",
416
+ defaultModel: "hf:zai-org/GLM-5.1",
417
+ envVars: ["SYNTHETIC_API_KEY"],
418
+ createModelManagerOptions: (config: ModelManagerConfig) => syntheticModelManagerOptions(config),
419
+ dynamicModelsAuthoritative: true,
420
+ catalogDiscovery: { label: "Synthetic" },
421
+ },
422
+ {
423
+ id: "together",
424
+ defaultModel: "moonshotai/Kimi-K2.7-Code",
425
+ envVars: ["TOGETHER_API_KEY"],
426
+ createModelManagerOptions: (config: ModelManagerConfig) => togetherModelManagerOptions(config),
427
+ catalogDiscovery: { label: "Together" },
428
+ },
429
+ {
430
+ id: "umans",
431
+ defaultModel: "umans-coder",
432
+ envVars: ["UMANS_AI_CODING_PLAN_API_KEY"],
433
+ createModelManagerOptions: (config: ModelManagerConfig) => umansModelManagerOptions(config),
434
+ dynamicModelsAuthoritative: true,
435
+ catalogDiscovery: { label: "Umans AI Coding Plan", allowUnauthenticated: true },
436
+ },
437
+ {
438
+ id: "venice",
439
+ defaultModel: "llama-3.3-70b",
440
+ envVars: ["VENICE_API_KEY"],
441
+ createModelManagerOptions: (config: ModelManagerConfig) => veniceModelManagerOptions(config),
442
+ catalogDiscovery: { label: "Venice", allowUnauthenticated: true },
443
+ },
444
+ {
445
+ id: "vercel-ai-gateway",
446
+ defaultModel: "anthropic/claude-opus-4.8",
447
+ envVars: ["AI_GATEWAY_API_KEY"],
448
+ createModelManagerOptions: (config: ModelManagerConfig) => vercelAiGatewayModelManagerOptions(config),
449
+ catalogDiscovery: {
450
+ label: "Vercel AI Gateway",
451
+ envVars: ["VERCEL_AI_GATEWAY_API_KEY"],
452
+ allowUnauthenticated: true,
453
+ },
454
+ },
455
+ {
456
+ id: "vllm",
457
+ defaultModel: "gpt-oss-20b",
458
+ envVars: ["VLLM_API_KEY"],
459
+ createModelManagerOptions: (config: ModelManagerConfig) => vllmModelManagerOptions(config),
460
+ catalogDiscovery: { label: "vLLM", allowUnauthenticated: true },
461
+ },
462
+ {
463
+ id: "wafer-serverless",
464
+ defaultModel: "GLM-5.1",
465
+ envVars: ["WAFER_SERVERLESS_API_KEY"],
466
+ createModelManagerOptions: (config: ModelManagerConfig) => waferServerlessModelManagerOptions(config),
467
+ catalogDiscovery: {
468
+ label: "Wafer Serverless",
469
+ oauthProvider: "wafer-serverless",
470
+ },
471
+ },
472
+ {
473
+ id: "coreweave",
474
+ defaultModel: "openai/gpt-oss-120b",
475
+ envVars: ["COREWEAVE_API_KEY", "WANDB_API_KEY"],
476
+ createModelManagerOptions: (config: ModelManagerConfig) => coreWeaveModelManagerOptions(config),
477
+ dynamicModelsAuthoritative: true,
478
+ catalogDiscovery: { label: "CoreWeave Serverless Inference" },
479
+ },
480
+ {
481
+ id: "xai",
482
+ defaultModel: "grok-4.6",
483
+ envVars: ["XAI_API_KEY"],
484
+ createModelManagerOptions: (config: ModelManagerConfig) => xaiModelManagerOptions(config),
485
+ },
486
+ {
487
+ id: "xai-oauth",
488
+ defaultModel: "grok-4.6",
489
+ envVars: ["XAI_OAUTH_TOKEN", "XAI_API_KEY"],
490
+ createModelManagerOptions: (config: ModelManagerConfig) => xaiOAuthModelManagerOptions(config),
491
+ catalogDiscovery: {
492
+ label: "xAI Grok OAuth (SuperGrok)",
493
+ oauthProvider: "xai-oauth",
494
+ },
495
+ },
496
+ {
497
+ id: "xiaomi",
498
+ defaultModel: "mimo-v2.5",
499
+ envVars: ["XIAOMI_API_KEY"],
500
+ createModelManagerOptions: (config: ModelManagerConfig) => xiaomiModelManagerOptions(config),
501
+ catalogDiscovery: { label: "Xiaomi" },
502
+ },
503
+ {
504
+ id: "xiaomi-token-plan-ams",
505
+ defaultModel: "mimo-v2.5",
506
+ envVars: ["XIAOMI_TOKEN_PLAN_AMS_API_KEY"],
507
+ createModelManagerOptions: (config: ModelManagerConfig) =>
508
+ xiaomiModelManagerOptions({ ...config, providerId: "xiaomi-token-plan-ams", tokenPlanRegion: "ams" }),
509
+ },
510
+ {
511
+ id: "xiaomi-token-plan-cn",
512
+ defaultModel: "mimo-v2.5",
513
+ envVars: ["XIAOMI_TOKEN_PLAN_CN_API_KEY"],
514
+ createModelManagerOptions: (config: ModelManagerConfig) =>
515
+ xiaomiModelManagerOptions({ ...config, providerId: "xiaomi-token-plan-cn", tokenPlanRegion: "cn" }),
516
+ },
517
+ {
518
+ id: "xiaomi-token-plan-sgp",
519
+ defaultModel: "mimo-v2.5",
520
+ envVars: ["XIAOMI_TOKEN_PLAN_SGP_API_KEY"],
521
+ createModelManagerOptions: (config: ModelManagerConfig) =>
522
+ xiaomiModelManagerOptions({ ...config, providerId: "xiaomi-token-plan-sgp", tokenPlanRegion: "sgp" }),
523
+ },
524
+ {
525
+ id: "zai",
526
+ defaultModel: "glm-5.3",
527
+ envVars: ["ZAI_API_KEY"],
528
+ createModelManagerOptions: (config: ModelManagerConfig) => zaiModelManagerOptions(config),
529
+ catalogDiscovery: { label: "zAI" },
530
+ },
531
+ {
532
+ id: "zenmux",
533
+ defaultModel: "anthropic/claude-opus-4.8",
534
+ envVars: ["ZENMUX_API_KEY"],
535
+ createModelManagerOptions: (config: ModelManagerConfig) => zenmuxModelManagerOptions(config),
536
+ allowUnauthenticated: true,
537
+ catalogDiscovery: { label: "ZenMux", allowUnauthenticated: true },
538
+ },
539
+ {
540
+ id: "zhipu-coding-plan",
541
+ defaultModel: "glm-5.1",
542
+ envVars: ["ZHIPU_API_KEY"],
543
+ createModelManagerOptions: (config: ModelManagerConfig) => zhipuCodingPlanModelManagerOptions(config),
544
+ dynamicModelsAuthoritative: true,
545
+ catalogDiscovery: { label: "Zhipu Coding Plan" },
546
+ },
547
+ ] as const satisfies readonly ProviderCatalogEntry[];
548
+
549
+ /** Chat-model providers — every entry in the catalog table. */
550
+ export type KnownProvider = (typeof CATALOG_PROVIDERS)[number]["id"];
551
+
552
+ /**
553
+ * Runtime model-discovery descriptors: every catalog provider that exposes a
554
+ * standard model-manager factory. Special-managed providers
555
+ * (`google-antigravity`/`google-gemini-cli`/`openai-codex`) are built bespoke in
556
+ * the coding-agent runtime and are excluded here.
557
+ */
558
+ const CATALOG_ENTRY_LIST: readonly ProviderCatalogEntry[] = CATALOG_PROVIDERS;
559
+
560
+ export const PROVIDER_DESCRIPTORS: readonly ProviderDescriptor[] = CATALOG_ENTRY_LIST.flatMap(provider => {
561
+ if (!provider.createModelManagerOptions || provider.specialModelManager) {
562
+ return [];
563
+ }
564
+ return [
565
+ {
566
+ providerId: provider.id,
567
+ defaultModel: provider.defaultModel,
568
+ createModelManagerOptions: provider.createModelManagerOptions,
569
+ allowUnauthenticated: provider.allowUnauthenticated,
570
+ dynamicModelsAuthoritative: provider.dynamicModelsAuthoritative,
571
+ catalogDiscovery: provider.catalogDiscovery
572
+ ? { ...provider.catalogDiscovery, envVars: provider.catalogDiscovery.envVars ?? provider.envVars ?? [] }
573
+ : undefined,
574
+ },
575
+ ];
576
+ });
577
+
578
+ /** Default model IDs for all known providers, derived from the catalog table. */
579
+ export const DEFAULT_MODEL_PER_PROVIDER: Record<KnownProvider, string> = Object.fromEntries(
580
+ CATALOG_PROVIDERS.map(provider => [provider.id, provider.defaultModel] as [string, string]),
581
+ ) as Record<KnownProvider, string>;
582
+
583
+ export function getCatalogProviderEntry(id: string): ProviderCatalogEntry | undefined {
584
+ return CATALOG_PROVIDERS.find(provider => provider.id === id);
585
+ }
@@ -0,0 +1,117 @@
1
+ import { fetchAntigravityDiscoveryModels } from "../discovery/antigravity";
2
+ import { fetchGeminiModels } from "../discovery/gemini";
3
+ import { fetchGeminiCliQuotaModels } from "../discovery/gemini-cli";
4
+ import { isGeminiModelId } from "../identity/family";
5
+ import type { ModelManagerOptions } from "../model-manager";
6
+ import type { FetchImpl } from "../types";
7
+ import { GEMINI_CLI_VARIANT_COLLAPSE_TABLE } from "../variant-collapse";
8
+
9
+ export interface GoogleModelManagerConfig {
10
+ apiKey?: string;
11
+ fetch?: FetchImpl;
12
+ }
13
+
14
+ export interface GoogleVertexModelManagerConfig {
15
+ apiKey?: string;
16
+ project?: string;
17
+ location?: string;
18
+ signal?: AbortSignal;
19
+ fetch?: FetchImpl;
20
+ }
21
+
22
+ export interface GoogleAntigravityModelManagerConfig {
23
+ oauthToken?: string;
24
+ endpoint?: string;
25
+ fetch?: FetchImpl;
26
+ }
27
+
28
+ export interface GoogleGeminiCliModelManagerConfig {
29
+ oauthToken?: string;
30
+ /** GCP project id required by Workspace/Standard credentials for quota discovery. */
31
+ projectId?: string;
32
+ endpoint?: string;
33
+ fetch?: FetchImpl;
34
+ }
35
+
36
+ const CLOUD_CODE_ASSIST_ENDPOINT = "https://cloudcode-pa.googleapis.com";
37
+
38
+ function toDiscoveryFetch(fetchImpl: FetchImpl | undefined): typeof fetch | undefined {
39
+ if (!fetchImpl) {
40
+ return undefined;
41
+ }
42
+ return Object.assign(
43
+ (input: Parameters<typeof fetch>[0], init?: Parameters<typeof fetch>[1]) => fetchImpl(input, init),
44
+ { preconnect: fetchImpl.preconnect ?? fetch.preconnect },
45
+ );
46
+ }
47
+
48
+ export function googleModelManagerOptions(
49
+ config?: GoogleModelManagerConfig,
50
+ ): ModelManagerOptions<"google-generative-ai"> {
51
+ const apiKey = config?.apiKey;
52
+ return {
53
+ providerId: "google",
54
+ ...(apiKey
55
+ ? { fetchDynamicModels: () => fetchGeminiModels({ apiKey, fetch: toDiscoveryFetch(config?.fetch) }) }
56
+ : undefined),
57
+ };
58
+ }
59
+
60
+ export function googleVertexModelManagerOptions(_config?: GoogleVertexModelManagerConfig): ModelManagerOptions {
61
+ return { providerId: "google-vertex" };
62
+ }
63
+
64
+ export function googleAntigravityModelManagerOptions(
65
+ config?: GoogleAntigravityModelManagerConfig,
66
+ ): ModelManagerOptions<"google-gemini-cli"> {
67
+ const token = config?.oauthToken;
68
+ return {
69
+ providerId: "google-antigravity",
70
+ ...(token
71
+ ? {
72
+ fetchDynamicModels: () =>
73
+ fetchAntigravityDiscoveryModels({
74
+ token,
75
+ endpoint: config?.endpoint,
76
+ fetcher: toDiscoveryFetch(config?.fetch),
77
+ }),
78
+ }
79
+ : undefined),
80
+ };
81
+ }
82
+
83
+ export function googleGeminiCliModelManagerOptions(
84
+ config?: GoogleGeminiCliModelManagerConfig,
85
+ ): ModelManagerOptions<"google-gemini-cli"> {
86
+ const token = config?.oauthToken;
87
+ const endpoint = config?.endpoint ?? CLOUD_CODE_ASSIST_ENDPOINT;
88
+ return {
89
+ providerId: "google-gemini-cli",
90
+ ...(token
91
+ ? {
92
+ fetchDynamicModels: async () => {
93
+ const fetcher = toDiscoveryFetch(config?.fetch);
94
+ const models = await fetchAntigravityDiscoveryModels({
95
+ token,
96
+ fetcher,
97
+ collapseTable: GEMINI_CLI_VARIANT_COLLAPSE_TABLE,
98
+ });
99
+ // Antigravity's fetchAvailableModels is unreachable for
100
+ // credentials without Antigravity entitlement (Code Assist
101
+ // Standard returns HTTP 403). Fall back to the account's own
102
+ // retrieveUserQuota list on Cloud Code Assist.
103
+ if (models === null) {
104
+ return fetchGeminiCliQuotaModels({ token, projectId: config?.projectId, endpoint, fetcher });
105
+ }
106
+ return models
107
+ .filter(m => isGeminiModelId(m.id))
108
+ .map(m => ({
109
+ ...m,
110
+ provider: "google-gemini-cli" as const,
111
+ baseUrl: endpoint,
112
+ }));
113
+ },
114
+ }
115
+ : undefined),
116
+ };
117
+ }