@juspay/neurolink 12.23.3 → 12.24.0

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 (48) hide show
  1. package/CHANGELOG.md +3 -4
  2. package/dist/browser/neurolink.min.js +367 -367
  3. package/dist/constants/enums.d.ts +61 -69
  4. package/dist/constants/enums.js +63 -96
  5. package/dist/factories/providerDescriptors.d.ts +1 -1
  6. package/dist/factories/providerDescriptors.js +50 -83
  7. package/dist/factories/providerRegistry.js +9 -16
  8. package/dist/models/manifestRegistry.js +11 -2
  9. package/dist/providers/catalog/deepseek.json +84 -0
  10. package/dist/providers/catalog/huggingface.json +405 -0
  11. package/dist/providers/catalog/index.generated.d.ts +1 -1
  12. package/dist/providers/catalog/index.generated.js +6 -0
  13. package/dist/providers/catalog/loader.js +20 -5
  14. package/dist/providers/catalog/mistral.json +8 -3
  15. package/dist/providers/catalog/provider-catalog.schema.json +31 -1
  16. package/dist/providers/catalog/schema.d.ts +8 -1
  17. package/dist/providers/catalog/schema.js +9 -1
  18. package/dist/providers/configuredOpenAICompat.d.ts +14 -5
  19. package/dist/providers/configuredOpenAICompat.js +19 -4
  20. package/dist/providers/embeddingResponseParsing.d.ts +1 -0
  21. package/dist/providers/embeddingResponseParsing.js +47 -0
  22. package/dist/providers/ideogram.js +7 -1
  23. package/dist/providers/jina.js +6 -15
  24. package/dist/providers/llamaCpp.js +4 -15
  25. package/dist/providers/lmStudio.js +4 -15
  26. package/dist/providers/localRuntimeOpenAICompat.d.ts +16 -0
  27. package/dist/providers/localRuntimeOpenAICompat.js +26 -0
  28. package/dist/providers/ollama/client.js +3 -9
  29. package/dist/providers/openaiChatCompletionsBase.d.ts +3 -3
  30. package/dist/providers/openaiChatCompletionsBase.js +3 -3
  31. package/dist/providers/openaiCompatCatalog.d.ts +16 -12
  32. package/dist/providers/openaiCompatCatalog.js +16 -12
  33. package/dist/providers/voyage.js +5 -18
  34. package/dist/types/providerCatalog.d.ts +46 -1
  35. package/dist/types/providerCatalog.generated.d.ts +2 -2
  36. package/dist/types/providers.d.ts +12 -8
  37. package/dist/utils/modelChoices.d.ts +2 -2
  38. package/dist/utils/modelChoices.js +10 -38
  39. package/dist/utils/sizeGuard.d.ts +8 -5
  40. package/dist/utils/sizeGuard.js +32 -9
  41. package/docs-site/static/search-index.json +1 -1
  42. package/package.json +1 -1
  43. package/dist/providers/deepseek.d.ts +0 -47
  44. package/dist/providers/deepseek.js +0 -120
  45. package/dist/providers/huggingFace/client.d.ts +0 -54
  46. package/dist/providers/huggingFace/client.js +0 -120
  47. package/dist/providers/huggingFace/index.d.ts +0 -1
  48. package/dist/providers/huggingFace/index.js +0 -1
@@ -1,6 +1,6 @@
1
1
  import { ProviderFactory } from "./providerFactory.js";
2
2
  import { logger } from "../utils/logger.js";
3
- import { AIProviderName, GoogleAIModels, OpenAIModels, AnthropicModels, VertexModels, OllamaModels, LiteLLMModels, HuggingFaceModels, DeepSeekModels, NvidiaNimModels, OpenRouterModels, CohereModels, VoyageModels, JinaModels, StabilityModels, IdeogramModels, RecraftModels, TypeSafeModels, ReplicateModels, } from "../constants/enums.js";
3
+ import { AIProviderName, GoogleAIModels, OpenAIModels, AnthropicModels, VertexModels, OllamaModels, LiteLLMModels, NvidiaNimModels, OpenRouterModels, CohereModels, VoyageModels, JinaModels, StabilityModels, IdeogramModels, RecraftModels, TypeSafeModels, ReplicateModels, } from "../constants/enums.js";
4
4
  import { PROVIDER_DESCRIPTORS_BY_NAME } from "./providerDescriptors.js";
5
5
  import { OPENAI_COMPAT_CATALOG } from "../providers/openaiCompatCatalog.js";
6
6
  import { providerChoicesFor } from "./mediaHandlerCatalog.js";
@@ -106,17 +106,13 @@ export class ProviderRegistry {
106
106
  const { GoogleVertexProvider } = await import("../providers/googleVertex/index.js");
107
107
  return new GoogleVertexProvider(modelName, providerName, sdk, region, vertexCreds);
108
108
  }, VertexModels.CLAUDE_4_6_SONNET, ["vertex", "googleVertex"], PROVIDER_DESCRIPTORS_BY_NAME.get(AIProviderName.VERTEX));
109
- // Register Hugging Face provider (Unified Router implementation)
110
- ProviderFactory.registerProvider(AIProviderName.HUGGINGFACE, async (modelName, _providerName, sdk, region, credentials) => {
111
- const hfCreds = credentials;
112
- const { HuggingFaceProvider } = await import("../providers/huggingFace/index.js");
113
- return new HuggingFaceProvider(modelName, sdk, region, hfCreds);
114
- }, process.env.HUGGINGFACE_MODEL ||
115
- HuggingFaceModels.QWEN_2_5_72B_INSTRUCT, ["huggingface", "hf"], PROVIDER_DESCRIPTORS_BY_NAME.get(AIProviderName.HUGGINGFACE));
109
+ // HuggingFace migrated to the JSON catalog (catalog/huggingface.json)
110
+ // — it is now registered by the "config-driven OpenAI-compatible
111
+ // catalog providers" loop below, not a dedicated block here.
116
112
  // Register the config-driven OpenAI-compatible catalog providers
117
113
  // (cerebras, groq, xai, together-ai, fireworks, perplexity, mistral,
118
- // cloudflare).
119
- // To add a new zero-quirk OpenAI-compatible provider, add one entry to
114
+ // cloudflare, deepseek, huggingface).
115
+ // To add a new OpenAI-compatible provider, add one entry to
120
116
  // OPENAI_COMPAT_CATALOG (openaiCompatCatalog.ts) — not a new block here.
121
117
  for (const entry of OPENAI_COMPAT_CATALOG) {
122
118
  ProviderFactory.registerProvider(entry.providerName, async (modelName, _providerName, sdk, _region, credentials) => {
@@ -163,12 +159,9 @@ export class ProviderRegistry {
163
159
  const { AmazonSageMakerProvider } = await import("../providers/amazonSagemaker.js");
164
160
  return new AmazonSageMakerProvider(modelName, undefined, region, undefined, sagemakerCreds);
165
161
  }, process.env.SAGEMAKER_MODEL || "sagemaker-model", ["sagemaker", "aws-sagemaker"], PROVIDER_DESCRIPTORS_BY_NAME.get(AIProviderName.SAGEMAKER));
166
- // Register DeepSeek provider
167
- ProviderFactory.registerProvider(AIProviderName.DEEPSEEK, async (modelName, _providerName, sdk, _region, credentials) => {
168
- const deepseekCreds = credentials;
169
- const { DeepSeekProvider } = await import("../providers/deepseek.js");
170
- return new DeepSeekProvider(modelName, sdk, undefined, deepseekCreds);
171
- }, process.env.DEEPSEEK_MODEL || DeepSeekModels.DEEPSEEK_CHAT, ["deepseek", "ds"], PROVIDER_DESCRIPTORS_BY_NAME.get(AIProviderName.DEEPSEEK));
162
+ // DeepSeek migrated to the JSON catalog (catalog/deepseek.json) — it is
163
+ // now registered by the "config-driven OpenAI-compatible catalog
164
+ // providers" loop above, not a dedicated block here.
172
165
  // Register NVIDIA NIM provider
173
166
  ProviderFactory.registerProvider(AIProviderName.NVIDIA_NIM, async (modelName, _providerName, sdk, _region, credentials) => {
174
167
  const nimCreds = credentials;
@@ -50,6 +50,15 @@ import { recraftManifest } from "./manifests/recraft.js";
50
50
  * no alias field.
51
51
  */
52
52
  function buildCatalogManifest(entry) {
53
+ // capabilities.tools is "model-dependent" for huggingface, but
54
+ // huggingface uses its own hand-written manifest (see MANIFEST_REGISTRY
55
+ // below), never this generic path — cerebras/sambanova, the only two
56
+ // providers actually routed through buildCatalogManifest() today, both
57
+ // have a plain boolean here. Narrowed rather than widening
58
+ // ProviderModelManifestEntry.functionCalling itself: a provider entering
59
+ // this generic (non-hand-curated) path with "model-dependent" tools gets
60
+ // the conservative false, not an unearned optimistic true.
61
+ const functionCalling = entry.capabilities.tools === true;
53
62
  const namedModels = Object.fromEntries(Object.entries(entry.models.catalog).map(([modelId, spec]) => [
54
63
  modelId,
55
64
  {
@@ -57,7 +66,7 @@ function buildCatalogManifest(entry) {
57
66
  contextWindow: spec.contextWindow ?? entry.models.defaultContextWindow,
58
67
  maxOutputTokens: entry.models.defaultMaxOutputTokens,
59
68
  vision: spec.vision,
60
- functionCalling: entry.capabilities.tools,
69
+ functionCalling,
61
70
  },
62
71
  ]));
63
72
  return {
@@ -68,7 +77,7 @@ function buildCatalogManifest(entry) {
68
77
  contextWindow: entry.models.defaultContextWindow,
69
78
  maxOutputTokens: entry.models.defaultMaxOutputTokens,
70
79
  vision: false,
71
- functionCalling: entry.capabilities.tools,
80
+ functionCalling,
72
81
  },
73
82
  ...namedModels,
74
83
  },
@@ -0,0 +1,84 @@
1
+ {
2
+ "$schema": "./provider-catalog.schema.json",
3
+ "id": "deepseek",
4
+ "displayName": "DeepSeek",
5
+ "enumTypeName": "DeepSeekModels",
6
+ "aliases": ["ds"],
7
+ "tier": 2,
8
+ "wire": {
9
+ "baseURL": "https://api.deepseek.com"
10
+ },
11
+ "models": {
12
+ "default": "deepseek-chat",
13
+ "fallbacks": ["deepseek-chat", "deepseek-reasoner"],
14
+ "defaultContextWindow": 64000,
15
+ "defaultMaxOutputTokens": 64000,
16
+ "catalog": {
17
+ "deepseek-chat": {
18
+ "contextWindow": 64000,
19
+ "maxOutputTokens": 64000,
20
+ "vision": false,
21
+ "status": "production",
22
+ "description": "DeepSeek-V3 general chat"
23
+ },
24
+ "deepseek-reasoner": {
25
+ "contextWindow": 64000,
26
+ "maxOutputTokens": 64000,
27
+ "vision": false,
28
+ "status": "production",
29
+ "description": "DeepSeek-R1 reasoning (slower, deeper)"
30
+ }
31
+ }
32
+ },
33
+ "capabilities": {
34
+ "text": true,
35
+ "streaming": true,
36
+ "tools": true,
37
+ "toolsWithStreaming": true,
38
+ "structuredOutput": true,
39
+ "structuredOutputWithTools": true,
40
+ "embeddings": false,
41
+ "thinking": true
42
+ },
43
+ "errorRules": [
44
+ {
45
+ "status": 401,
46
+ "pattern": "Invalid API key|Authentication",
47
+ "class": "authentication",
48
+ "message": "Invalid DeepSeek API key. Please check your {apiKeyEnvVar} environment variable."
49
+ },
50
+ {
51
+ "status": 402,
52
+ "pattern": "Insufficient Balance|insufficient_balance",
53
+ "class": "provider",
54
+ "message": "DeepSeek account has insufficient balance. Top up at https://platform.deepseek.com/usage"
55
+ },
56
+ {
57
+ "pattern": "model_not_found",
58
+ "class": "invalid-model",
59
+ "message": "DeepSeek model '{model}' not found. Use 'deepseek-chat' or 'deepseek-reasoner'."
60
+ }
61
+ ],
62
+ "quirks": {
63
+ "responseFormatDowngrade": "json-schema-to-json-object"
64
+ },
65
+ "setup": {
66
+ "url": "https://platform.deepseek.com/api_keys",
67
+ "apiKeyFormat": null,
68
+ "billingPolicy": "no-free-tier",
69
+ "instructions": [
70
+ "1. Visit: https://platform.deepseek.com/api_keys",
71
+ "2. Create or sign in to your DeepSeek account",
72
+ "3. Generate a new API key",
73
+ "4. Set {apiKeyEnvVar} in your .env file"
74
+ ]
75
+ },
76
+ "evidence": {
77
+ "rosterVerified": {
78
+ "date": "2026-09-22",
79
+ "method": "Ported from already-committed repo data (DeepSeekModels enum, deepseekManifest.ts, deepseek.ts's own error-rule and quirk comments) on origin/release @ a7fd9bf04 — no live vendor probe performed, per this migration's no-vendor-call constraint. billingPolicy is carried over from general knowledge, not independently re-verified live; flagged for confirmation before merge. The capability flags mirror the hand-written live-matrix row this entry replaces (test/helpers/providerMatrix.ts on origin/release), so the migration leaves the set of live-matrix cells unchanged."
80
+ },
81
+ "liveMatrix": null,
82
+ "addedInPR": "TBD — integration-tested in a worktree before a PR was opened"
83
+ }
84
+ }
@@ -0,0 +1,405 @@
1
+ {
2
+ "$schema": "./provider-catalog.schema.json",
3
+ "id": "huggingface",
4
+ "displayName": "HuggingFace",
5
+ "enumTypeName": "HuggingFaceModels",
6
+ "aliases": ["hf"],
7
+ "credentialsKey": "huggingFace",
8
+ "tier": 2,
9
+ "wire": {
10
+ "baseURL": "https://router.huggingface.co/v1",
11
+ "apiKeyFallbackEnvVars": ["HF_TOKEN"]
12
+ },
13
+ "models": {
14
+ "default": "Qwen/Qwen2.5-72B-Instruct",
15
+ "fallbackModelName": "meta-llama/Llama-3.1-8B-Instruct",
16
+ "fallbacks": ["meta-llama/Llama-3.1-8B-Instruct"],
17
+ "testModel": "meta-llama/Llama-3.1-8B-Instruct",
18
+ "topModels": [
19
+ "meta-llama/Llama-3.3-70B-Instruct",
20
+ "mistralai/Mistral-Large-3-675B-Instruct-2512",
21
+ "deepseek-ai/DeepSeek-R1",
22
+ "Qwen/Qwen2.5-72B-Instruct",
23
+ "microsoft/phi-4",
24
+ "google/gemma-3-27b-it"
25
+ ],
26
+ "defaultContextWindow": 32000,
27
+ "defaultMaxOutputTokens": 32000,
28
+ "catalog": {
29
+ "meta-llama/Llama-3.3-70B-Instruct": {
30
+ "vision": false,
31
+ "status": "production",
32
+ "description": "Recommended - Latest Llama",
33
+ "enumMember": "LLAMA_3_3_70B_INSTRUCT"
34
+ },
35
+ "meta-llama/Llama-3.2-1B": {
36
+ "vision": false,
37
+ "status": "production",
38
+ "description": "Meta Llama 3.2 — Llama-3.2-1B",
39
+ "enumMember": "LLAMA_3_2_1B"
40
+ },
41
+ "meta-llama/Llama-3.2-3B-Instruct": {
42
+ "vision": false,
43
+ "status": "production",
44
+ "description": "Meta Llama 3.2 — Llama-3.2-3B-Instruct",
45
+ "enumMember": "LLAMA_3_2_3B_INSTRUCT"
46
+ },
47
+ "meta-llama/Llama-3.1-8B": {
48
+ "vision": false,
49
+ "status": "production",
50
+ "description": "Meta Llama 3.1 — Llama-3.1-8B",
51
+ "enumMember": "LLAMA_3_1_8B"
52
+ },
53
+ "meta-llama/Llama-3.1-8B-Instruct": {
54
+ "vision": false,
55
+ "status": "production",
56
+ "description": "Llama 3.1 8B, tool-calling capable",
57
+ "enumMember": "LLAMA_3_1_8B_INSTRUCT"
58
+ },
59
+ "meta-llama/Llama-3.1-70B-Instruct": {
60
+ "vision": false,
61
+ "status": "production",
62
+ "description": "Meta Llama 3.1 — Llama-3.1-70B-Instruct",
63
+ "enumMember": "LLAMA_3_1_70B_INSTRUCT"
64
+ },
65
+ "meta-llama/Llama-3.1-405B-Instruct": {
66
+ "vision": false,
67
+ "status": "production",
68
+ "description": "Meta Llama 3.1 — Llama-3.1-405B-Instruct",
69
+ "enumMember": "LLAMA_3_1_405B_INSTRUCT"
70
+ },
71
+ "meta-llama/Meta-Llama-3-8B-Instruct": {
72
+ "vision": false,
73
+ "status": "production",
74
+ "description": "Meta Llama 3.0 — Meta-Llama-3-8B-Instruct",
75
+ "enumMember": "LLAMA_3_8B_INSTRUCT"
76
+ },
77
+ "meta-llama/Meta-Llama-3-70B-Instruct": {
78
+ "vision": false,
79
+ "status": "production",
80
+ "description": "Meta Llama 3.0 — Meta-Llama-3-70B-Instruct",
81
+ "enumMember": "LLAMA_3_70B_INSTRUCT"
82
+ },
83
+ "mistralai/Mistral-Large-3-675B-Instruct-2512": {
84
+ "vision": false,
85
+ "status": "production",
86
+ "description": "Mistral Large",
87
+ "enumMember": "MISTRAL_LARGE_3_675B"
88
+ },
89
+ "mistralai/Mistral-Small-3.1-24B-Instruct-2503": {
90
+ "vision": false,
91
+ "status": "production",
92
+ "description": "Mistral Small — Mistral-Small-3.1-24B-Instruct-2503",
93
+ "enumMember": "MISTRAL_SMALL_3_1_24B"
94
+ },
95
+ "mistralai/Mistral-Small-24B-Instruct-2501": {
96
+ "vision": false,
97
+ "status": "production",
98
+ "description": "Mistral Small — Mistral-Small-24B-Instruct-2501",
99
+ "enumMember": "MISTRAL_SMALL_24B"
100
+ },
101
+ "mistralai/Mistral-7B-Instruct-v0.2": {
102
+ "vision": false,
103
+ "status": "production",
104
+ "description": "Mistral — Mistral-7B-Instruct-v0.2",
105
+ "enumMember": "MISTRAL_7B_INSTRUCT"
106
+ },
107
+ "mistralai/Mixtral-8x7B-Instruct-v0.1": {
108
+ "vision": false,
109
+ "status": "production",
110
+ "description": "Mistral — Mixtral-8x7B-Instruct-v0.1",
111
+ "enumMember": "MIXTRAL_8X7B_INSTRUCT"
112
+ },
113
+ "mistralai/Devstral-2": {
114
+ "vision": false,
115
+ "status": "production",
116
+ "description": "Mistral Devstral — Devstral-2",
117
+ "enumMember": "DEVSTRAL_2"
118
+ },
119
+ "Qwen/Qwen2.5-7B": {
120
+ "vision": false,
121
+ "status": "production",
122
+ "description": "Qwen 2.5 — Qwen2.5-7B",
123
+ "enumMember": "QWEN_2_5_7B"
124
+ },
125
+ "Qwen/Qwen2.5-32B": {
126
+ "vision": false,
127
+ "status": "production",
128
+ "description": "Qwen 2.5 — Qwen2.5-32B",
129
+ "enumMember": "QWEN_2_5_32B"
130
+ },
131
+ "Qwen/Qwen2.5-72B-Instruct": {
132
+ "vision": false,
133
+ "status": "production",
134
+ "description": "Qwen flagship",
135
+ "enumMember": "QWEN_2_5_72B_INSTRUCT"
136
+ },
137
+ "Qwen/Qwen2.5-Coder-7B": {
138
+ "vision": false,
139
+ "status": "production",
140
+ "description": "Qwen 2.5 Coder — Qwen2.5-Coder-7B",
141
+ "enumMember": "QWEN_2_5_CODER_7B"
142
+ },
143
+ "Qwen/Qwen2.5-Coder-32B-Instruct": {
144
+ "vision": false,
145
+ "status": "production",
146
+ "description": "Qwen 2.5 Coder — Qwen2.5-Coder-32B-Instruct",
147
+ "enumMember": "QWEN_2_5_CODER_32B_INSTRUCT"
148
+ },
149
+ "Qwen/QwQ-32B": {
150
+ "vision": false,
151
+ "status": "production",
152
+ "description": "Qwen QwQ — QwQ-32B",
153
+ "enumMember": "QWQ_32B"
154
+ },
155
+ "Qwen/Qwen2.5-VL-32B-Instruct": {
156
+ "vision": false,
157
+ "status": "production",
158
+ "description": "Qwen 2.5 VL (Multimodal) — Qwen2.5-VL-32B-Instruct",
159
+ "enumMember": "QWEN_2_5_VL_32B"
160
+ },
161
+ "deepseek-ai/DeepSeek-R1": {
162
+ "vision": false,
163
+ "status": "production",
164
+ "description": "Advanced reasoning",
165
+ "enumMember": "DEEPSEEK_R1"
166
+ },
167
+ "deepseek-ai/DeepSeek-V3": {
168
+ "vision": false,
169
+ "status": "production",
170
+ "description": "DeepSeek — DeepSeek-V3",
171
+ "enumMember": "DEEPSEEK_V3"
172
+ },
173
+ "deepseek-ai/DeepSeek-V3.1": {
174
+ "vision": false,
175
+ "status": "production",
176
+ "description": "DeepSeek — DeepSeek-V3.1",
177
+ "enumMember": "DEEPSEEK_V3_1"
178
+ },
179
+ "deepseek-ai/DeepSeek-V3.2-Exp": {
180
+ "vision": false,
181
+ "status": "production",
182
+ "description": "DeepSeek — DeepSeek-V3.2-Exp",
183
+ "enumMember": "DEEPSEEK_V3_2_EXP"
184
+ },
185
+ "microsoft/phi-4": {
186
+ "vision": false,
187
+ "status": "production",
188
+ "description": "Microsoft Phi-4",
189
+ "enumMember": "PHI_4"
190
+ },
191
+ "microsoft/Phi-4-reasoning": {
192
+ "vision": false,
193
+ "status": "production",
194
+ "description": "Microsoft Phi — Phi-4-reasoning",
195
+ "enumMember": "PHI_4_REASONING"
196
+ },
197
+ "microsoft/Phi-4-mini-instruct": {
198
+ "vision": false,
199
+ "status": "production",
200
+ "description": "Microsoft Phi — Phi-4-mini-instruct",
201
+ "enumMember": "PHI_4_MINI_INSTRUCT"
202
+ },
203
+ "microsoft/Phi-4-mini-reasoning": {
204
+ "vision": false,
205
+ "status": "production",
206
+ "description": "Microsoft Phi — Phi-4-mini-reasoning",
207
+ "enumMember": "PHI_4_MINI_REASONING"
208
+ },
209
+ "microsoft/Phi-3-mini-128k-instruct": {
210
+ "vision": false,
211
+ "status": "production",
212
+ "description": "Microsoft Phi — Phi-3-mini-128k-instruct",
213
+ "enumMember": "PHI_3_MINI_128K_INSTRUCT"
214
+ },
215
+ "microsoft/Phi-3-vision-128k-instruct": {
216
+ "vision": false,
217
+ "status": "production",
218
+ "description": "Microsoft Phi — Phi-3-vision-128k-instruct",
219
+ "enumMember": "PHI_3_VISION_128K_INSTRUCT"
220
+ },
221
+ "google/gemma-3-270m": {
222
+ "vision": false,
223
+ "status": "production",
224
+ "description": "Google Gemma 3 — gemma-3-270m",
225
+ "enumMember": "GEMMA_3_270M"
226
+ },
227
+ "google/gemma-3-1b-it": {
228
+ "vision": false,
229
+ "status": "production",
230
+ "description": "Google Gemma 3 — gemma-3-1b-it",
231
+ "enumMember": "GEMMA_3_1B_IT"
232
+ },
233
+ "google/gemma-3-4b-it": {
234
+ "vision": false,
235
+ "status": "production",
236
+ "description": "Google Gemma 3 — gemma-3-4b-it",
237
+ "enumMember": "GEMMA_3_4B_IT"
238
+ },
239
+ "google/gemma-3-12b-it": {
240
+ "vision": false,
241
+ "status": "production",
242
+ "description": "Google Gemma 3 — gemma-3-12b-it",
243
+ "enumMember": "GEMMA_3_12B_IT"
244
+ },
245
+ "google/gemma-3-27b-it": {
246
+ "vision": false,
247
+ "status": "production",
248
+ "description": "Google Gemma 3",
249
+ "enumMember": "GEMMA_3_27B_IT"
250
+ },
251
+ "google/gemma-2-9b": {
252
+ "vision": false,
253
+ "status": "production",
254
+ "description": "Google Gemma 2 — gemma-2-9b",
255
+ "enumMember": "GEMMA_2_9B"
256
+ },
257
+ "google/gemma-2-27b": {
258
+ "vision": false,
259
+ "status": "production",
260
+ "description": "Google Gemma 2 — gemma-2-27b",
261
+ "enumMember": "GEMMA_2_27B"
262
+ },
263
+ "google/gemma-2b": {
264
+ "vision": false,
265
+ "status": "production",
266
+ "description": "Google Gemma 1 — gemma-2b",
267
+ "enumMember": "GEMMA_2B"
268
+ },
269
+ "google/gemma-7b": {
270
+ "vision": false,
271
+ "status": "production",
272
+ "description": "Google Gemma 1 — gemma-7b",
273
+ "enumMember": "GEMMA_7B"
274
+ },
275
+ "tiiuae/falcon-40b-instruct": {
276
+ "vision": false,
277
+ "status": "production",
278
+ "description": "Falcon — falcon-40b-instruct",
279
+ "enumMember": "FALCON_40B_INSTRUCT"
280
+ },
281
+ "tiiuae/falcon-180B-chat": {
282
+ "vision": false,
283
+ "status": "production",
284
+ "description": "Falcon — falcon-180B-chat",
285
+ "enumMember": "FALCON_180B_CHAT"
286
+ },
287
+ "bigcode/starcoder2-15b": {
288
+ "vision": false,
289
+ "status": "production",
290
+ "description": "Code Models — starcoder2-15b",
291
+ "enumMember": "STARCODER2_15B"
292
+ },
293
+ "codellama/CodeLlama-34b-Instruct-hf": {
294
+ "vision": false,
295
+ "status": "production",
296
+ "description": "Code Models — CodeLlama-34b-Instruct-hf",
297
+ "enumMember": "CODELLAMA_34B_INSTRUCT"
298
+ },
299
+ "bigscience/bloom-7b1": {
300
+ "vision": false,
301
+ "status": "production",
302
+ "description": "BLOOM — bloom-7b1",
303
+ "enumMember": "BLOOM_7B1"
304
+ },
305
+ "bigscience/bloom-1b3": {
306
+ "vision": false,
307
+ "status": "production",
308
+ "description": "BLOOM — bloom-1b3",
309
+ "enumMember": "BLOOM_1B3"
310
+ },
311
+ "zai-org/GLM-5": {
312
+ "vision": false,
313
+ "status": "production",
314
+ "description": "Z.AI GLM-5 (February 2026) — GLM-5",
315
+ "enumMember": "GLM_5"
316
+ },
317
+ "Qwen/Qwen3.5-397B-A17B": {
318
+ "vision": false,
319
+ "status": "production",
320
+ "description": "Qwen 3.5 Multimodal (February 2026) — Qwen3.5-397B-A17B",
321
+ "enumMember": "QWEN_3_5_397B_A17B"
322
+ },
323
+ "nvidia/NVIDIA-Nemotron-3-Nano-30B-A3B-BF16": {
324
+ "vision": false,
325
+ "status": "production",
326
+ "description": "NVIDIA Nemotron 3 Nano — NVIDIA-Nemotron-3-Nano-30B-A3B-BF16",
327
+ "enumMember": "NEMOTRON_3_NANO_30B"
328
+ },
329
+ "HuggingFaceTB/SmolLM3-3B": {
330
+ "vision": false,
331
+ "status": "production",
332
+ "description": "HuggingFace SmolLM3 — SmolLM3-3B",
333
+ "enumMember": "SMOLLM3_3B"
334
+ },
335
+ "tiiuae/Falcon3-7B-Instruct": {
336
+ "vision": false,
337
+ "status": "production",
338
+ "description": "Falcon 3 Series — Falcon3-7B-Instruct",
339
+ "enumMember": "FALCON_3_7B_INSTRUCT"
340
+ },
341
+ "tiiuae/Falcon3-10B-Instruct": {
342
+ "vision": false,
343
+ "status": "production",
344
+ "description": "Falcon 3 Series — Falcon3-10B-Instruct",
345
+ "enumMember": "FALCON_3_10B_INSTRUCT"
346
+ }
347
+ }
348
+ },
349
+ "capabilities": {
350
+ "text": true,
351
+ "streaming": true,
352
+ "tools": "model-dependent",
353
+ "toolsWithStreaming": false,
354
+ "structuredOutput": false,
355
+ "structuredOutputWithTools": false,
356
+ "embeddings": false,
357
+ "thinking": false
358
+ },
359
+ "errorRules": [
360
+ {
361
+ "pattern": "API_TOKEN_INVALID|Invalid token",
362
+ "class": "authentication",
363
+ "message": "Invalid HuggingFace API token. Please check your {apiKeyEnvVar} environment variable."
364
+ },
365
+ {
366
+ "pattern": "rate limit",
367
+ "class": "rate-limit",
368
+ "message": "HuggingFace rate limit exceeded. Consider using a paid plan or try again later."
369
+ },
370
+ {
371
+ "pattern": "model.*not found|not found.*model",
372
+ "class": "invalid-model",
373
+ "message": "HuggingFace model '{model}' not found.\n\nSuggestions:\n1. Check model name spelling\n2. Ensure model exists on HuggingFace Hub\n3. For tool calling, use: Llama-3.1-8B-Instruct, Hermes-3-Llama-3.2-3B, or CodeLlama-34b-Instruct-hf"
374
+ },
375
+ {
376
+ "pattern": "function|tool",
377
+ "class": "provider",
378
+ "message": "HuggingFace tool calling error: {message}\n\nNotes:\n1. Ensure you're using a tool-capable model (Llama-3.1+, Hermes-3+, CodeLlama)\n2. Check that your model supports function calling\n3. Verify tool schema format is correct"
379
+ }
380
+ ],
381
+ "timeouts": {
382
+ "generateMs": 120000,
383
+ "streamMs": 120000
384
+ },
385
+ "autoSelectPriority": 10,
386
+ "setup": {
387
+ "url": "https://huggingface.co/settings/tokens",
388
+ "apiKeyFormat": "^hf_[A-Za-z0-9]{37}$",
389
+ "billingPolicy": "free-with-card",
390
+ "instructions": [
391
+ "1. Visit: https://huggingface.co/settings/tokens",
392
+ "2. Create or sign in to your HuggingFace account",
393
+ "3. Generate a new access token",
394
+ "4. Set {apiKeyEnvVar} in your .env file (HF_TOKEN also accepted)"
395
+ ]
396
+ },
397
+ "evidence": {
398
+ "rosterVerified": {
399
+ "date": "2026-09-22",
400
+ "method": "Ported from already-committed repo data (HuggingFaceModels enum, huggingfaceManifest.ts, the hand ProviderDescriptor, and huggingFace/client.ts's own error-rule/model comments) on this worktree's current state — no live vendor probe performed, per this migration's no-vendor-call constraint. models.catalog carries every member of the HuggingFaceModels enum it replaces, with the same enumMember names, plus the Llama-3.1-8B-Instruct fallback; topModels restores the previous picker order and text. Per-model vision is false to mirror huggingfaceManifest, which declares no HuggingFace vision support — it is not a vendor capability claim; billingPolicy is carried over from general knowledge, not independently re-verified live. testModel and the capability flags mirror the hand-written live-matrix row this entry replaces (test/helpers/providerMatrix.ts on origin/release), so the migration leaves the set of live-matrix cells unchanged."
401
+ },
402
+ "liveMatrix": null,
403
+ "addedInPR": "TBD — integration-tested in a worktree before a PR was opened"
404
+ }
405
+ }
@@ -1,3 +1,3 @@
1
1
  import type { ProviderCatalogJson } from "../../types/index.js";
2
2
  export declare const CATALOG_JSON_ENTRIES: ProviderCatalogJson[];
3
- export declare const CATALOG_PROVIDER_IDS: readonly ["api-route", "baseten", "cerebras", "cloudflare", "fireworks", "friendli", "gmicloud", "groq", "inception-labs", "io-intelligence", "mancer", "mistral", "perplexity", "sambanova", "together-ai", "upstage", "xai"];
3
+ export declare const CATALOG_PROVIDER_IDS: readonly ["api-route", "baseten", "cerebras", "cloudflare", "deepseek", "fireworks", "friendli", "gmicloud", "groq", "huggingface", "inception-labs", "io-intelligence", "mancer", "mistral", "perplexity", "sambanova", "together-ai", "upstage", "xai"];
@@ -4,10 +4,12 @@ import apiRouteJson from "./api-route.json" with { type: "json" };
4
4
  import basetenJson from "./baseten.json" with { type: "json" };
5
5
  import cerebrasJson from "./cerebras.json" with { type: "json" };
6
6
  import cloudflareJson from "./cloudflare.json" with { type: "json" };
7
+ import deepseekJson from "./deepseek.json" with { type: "json" };
7
8
  import fireworksJson from "./fireworks.json" with { type: "json" };
8
9
  import friendliJson from "./friendli.json" with { type: "json" };
9
10
  import gmicloudJson from "./gmicloud.json" with { type: "json" };
10
11
  import groqJson from "./groq.json" with { type: "json" };
12
+ import huggingfaceJson from "./huggingface.json" with { type: "json" };
11
13
  import inceptionLabsJson from "./inception-labs.json" with { type: "json" };
12
14
  import ioIntelligenceJson from "./io-intelligence.json" with { type: "json" };
13
15
  import mancerJson from "./mancer.json" with { type: "json" };
@@ -22,10 +24,12 @@ export const CATALOG_JSON_ENTRIES = [
22
24
  basetenJson,
23
25
  cerebrasJson,
24
26
  cloudflareJson,
27
+ deepseekJson,
25
28
  fireworksJson,
26
29
  friendliJson,
27
30
  gmicloudJson,
28
31
  groqJson,
32
+ huggingfaceJson,
29
33
  inceptionLabsJson,
30
34
  ioIntelligenceJson,
31
35
  mancerJson,
@@ -41,10 +45,12 @@ export const CATALOG_PROVIDER_IDS = [
41
45
  "baseten",
42
46
  "cerebras",
43
47
  "cloudflare",
48
+ "deepseek",
44
49
  "fireworks",
45
50
  "friendli",
46
51
  "gmicloud",
47
52
  "groq",
53
+ "huggingface",
48
54
  "inception-labs",
49
55
  "io-intelligence",
50
56
  "mancer",