@juspay/neurolink 12.25.0 → 12.25.2

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.
@@ -207,7 +207,7 @@ export const PROVIDER_CONFIGS = [
207
207
  {
208
208
  id: AIProviderName.DEEPSEEK,
209
209
  name: "DeepSeek",
210
- description: "Cost-efficient frontier models (deepseek-chat V3, deepseek-reasoner R1)",
210
+ description: "Cost-efficient frontier models (deepseek-flash V4.1, deepseek-v4-pro)",
211
211
  envVars: [
212
212
  {
213
213
  key: "DEEPSEEK_API_KEY",
@@ -46,11 +46,6 @@ export const DEFAULT_OUTPUT_RESERVE_RATIO = 0.35;
46
46
  * The "_default" key is the fallback for unknown models within a provider.
47
47
  */
48
48
  export const MODEL_CONTEXT_WINDOWS = {
49
- deepseek: {
50
- _default: 64_000,
51
- "deepseek-chat": 64_000,
52
- "deepseek-reasoner": 64_000,
53
- },
54
49
  "nvidia-nim": {
55
50
  _default: 128_000,
56
51
  "meta/llama-3.3-70b-instruct": 128_000,
@@ -796,7 +796,9 @@ export declare enum CloudflareModels {
796
796
  }
797
797
  export declare enum DeepSeekModels {
798
798
  DEEPSEEK_CHAT = "deepseek-chat",
799
- DEEPSEEK_REASONER = "deepseek-reasoner"
799
+ DEEPSEEK_REASONER = "deepseek-reasoner",
800
+ DEEPSEEK_FLASH = "deepseek-flash",
801
+ DEEPSEEK_V4_PRO = "deepseek-v4-pro"
800
802
  }
801
803
  export declare enum FireworksModels {
802
804
  KIMI_K2P6 = "accounts/fireworks/models/kimi-k2p6",
@@ -1029,6 +1029,8 @@ export var DeepSeekModels;
1029
1029
  (function (DeepSeekModels) {
1030
1030
  DeepSeekModels["DEEPSEEK_CHAT"] = "deepseek-chat";
1031
1031
  DeepSeekModels["DEEPSEEK_REASONER"] = "deepseek-reasoner";
1032
+ DeepSeekModels["DEEPSEEK_FLASH"] = "deepseek-flash";
1033
+ DeepSeekModels["DEEPSEEK_V4_PRO"] = "deepseek-v4-pro";
1032
1034
  })(DeepSeekModels || (DeepSeekModels = {}));
1033
1035
  export var FireworksModels;
1034
1036
  (function (FireworksModels) {
@@ -5,12 +5,12 @@
5
5
  * metadata consolidation plan.
6
6
  */
7
7
  export const deepseekManifest = {
8
- defaultContextWindow: 64000,
8
+ defaultContextWindow: 1048576,
9
9
  models: {
10
10
  _default: {
11
11
  aliases: [],
12
- contextWindow: 64000,
13
- maxOutputTokens: 64000,
12
+ contextWindow: 1048576,
13
+ maxOutputTokens: 393216,
14
14
  vision: false,
15
15
  functionCalling: false,
16
16
  },
@@ -10,23 +10,37 @@
10
10
  },
11
11
  "models": {
12
12
  "default": "deepseek-chat",
13
- "fallbacks": ["deepseek-chat", "deepseek-reasoner"],
14
- "defaultContextWindow": 64000,
15
- "defaultMaxOutputTokens": 64000,
13
+ "fallbacks": ["deepseek-chat", "deepseek-reasoner", "deepseek-v4-pro"],
14
+ "defaultContextWindow": 1048576,
15
+ "defaultMaxOutputTokens": 393216,
16
16
  "catalog": {
17
17
  "deepseek-chat": {
18
- "contextWindow": 64000,
19
- "maxOutputTokens": 64000,
20
- "vision": false,
18
+ "contextWindow": 1048576,
19
+ "maxOutputTokens": 393216,
20
+ "vision": true,
21
21
  "status": "production",
22
- "description": "DeepSeek-V3 general chat"
22
+ "description": "Alias of deepseek-flash with thinking off (DeepSeek-V4.1-Flash)"
23
23
  },
24
24
  "deepseek-reasoner": {
25
- "contextWindow": 64000,
26
- "maxOutputTokens": 64000,
25
+ "contextWindow": 1048576,
26
+ "maxOutputTokens": 393216,
27
+ "vision": true,
28
+ "status": "production",
29
+ "description": "Alias of deepseek-flash with thinking on (DeepSeek-V4.1-Flash)"
30
+ },
31
+ "deepseek-flash": {
32
+ "contextWindow": 1048576,
33
+ "maxOutputTokens": 393216,
34
+ "vision": true,
35
+ "status": "production",
36
+ "description": "DeepSeek-V4.1-Flash — thinking on by default, image input"
37
+ },
38
+ "deepseek-v4-pro": {
39
+ "contextWindow": 1048576,
40
+ "maxOutputTokens": 393216,
27
41
  "vision": false,
28
42
  "status": "production",
29
- "description": "DeepSeek-R1 reasoning (slower, deeper)"
43
+ "description": "DeepSeek-V4-Pro-0813 — thinking on by default, text only"
30
44
  }
31
45
  }
32
46
  },
@@ -54,9 +68,9 @@
54
68
  "message": "DeepSeek account has insufficient balance. Top up at https://platform.deepseek.com/usage"
55
69
  },
56
70
  {
57
- "pattern": "model_not_found",
71
+ "pattern": "supported API model names|model_not_found",
58
72
  "class": "invalid-model",
59
- "message": "DeepSeek model '{model}' not found. Use 'deepseek-chat' or 'deepseek-reasoner'."
73
+ "message": "DeepSeek model '{model}' not found. Use 'deepseek-flash' or 'deepseek-v4-pro'."
60
74
  }
61
75
  ],
62
76
  "quirks": {
@@ -75,8 +89,8 @@
75
89
  },
76
90
  "evidence": {
77
91
  "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."
92
+ "date": "2026-09-24",
93
+ "method": "Live against api.deepseek.com on 2026-09-24. GET /models lists only deepseek-flash and deepseek-v4-pro, with context_window 1048576 and max_output_tokens 393216 (the pricing page's 1M / 384K). deepseek-chat and deepseek-reasoner still answer 200 but report model deepseek-flash — deepseek-chat without reasoning_content, deepseek-reasoner with it — so both stay production as aliases rather than being marked retired. Vision was probed with a solid-blue PNG: deepseek-flash, deepseek-chat and deepseek-reasoner all named the colour; deepseek-v4-pro answered 200 but described a scene that was not in the image, so it keeps vision false, matching the pricing page. An unknown model id returns 400 'The supported API model names are …' with code invalid_request_error — never 'model_not_found' — so the invalid-model rule now matches that text. tools plus response_format json_object in one request returned 200 with tool_calls, confirming structuredOutputWithTools. billingPolicy is not re-verified."
80
94
  },
81
95
  "liveMatrix": null,
82
96
  "addedInPR": "TBD — integration-tested in a worktree before a PR was opened"
@@ -17,7 +17,7 @@
17
17
  "testModel": "meta-llama/Llama-3.1-8B-Instruct",
18
18
  "topModels": [
19
19
  "meta-llama/Llama-3.3-70B-Instruct",
20
- "mistralai/Mistral-Large-3-675B-Instruct-2512",
20
+ "zai-org/GLM-5",
21
21
  "deepseek-ai/DeepSeek-R1",
22
22
  "Qwen/Qwen2.5-72B-Instruct",
23
23
  "microsoft/phi-4",
@@ -34,20 +34,20 @@
34
34
  },
35
35
  "meta-llama/Llama-3.2-1B": {
36
36
  "vision": false,
37
- "status": "production",
38
- "description": "Meta Llama 3.2 — Llama-3.2-1B",
37
+ "status": "retired",
38
+ "description": "Retired 2026-09 — absent from the router's roster and rejected by a live call",
39
39
  "enumMember": "LLAMA_3_2_1B"
40
40
  },
41
41
  "meta-llama/Llama-3.2-3B-Instruct": {
42
42
  "vision": false,
43
- "status": "production",
44
- "description": "Meta Llama 3.2 — Llama-3.2-3B-Instruct",
43
+ "status": "retired",
44
+ "description": "Retired 2026-09 — absent from the router's roster and rejected by a live call",
45
45
  "enumMember": "LLAMA_3_2_3B_INSTRUCT"
46
46
  },
47
47
  "meta-llama/Llama-3.1-8B": {
48
48
  "vision": false,
49
- "status": "production",
50
- "description": "Meta Llama 3.1 — Llama-3.1-8B",
49
+ "status": "retired",
50
+ "description": "Retired 2026-09 — absent from the router's roster and rejected by a live call",
51
51
  "enumMember": "LLAMA_3_1_8B"
52
52
  },
53
53
  "meta-llama/Llama-3.1-8B-Instruct": {
@@ -58,74 +58,74 @@
58
58
  },
59
59
  "meta-llama/Llama-3.1-70B-Instruct": {
60
60
  "vision": false,
61
- "status": "production",
62
- "description": "Meta Llama 3.1 — Llama-3.1-70B-Instruct",
61
+ "status": "retired",
62
+ "description": "Retired 2026-09 — absent from the router's roster and rejected by a live call",
63
63
  "enumMember": "LLAMA_3_1_70B_INSTRUCT"
64
64
  },
65
65
  "meta-llama/Llama-3.1-405B-Instruct": {
66
66
  "vision": false,
67
- "status": "production",
68
- "description": "Meta Llama 3.1 — Llama-3.1-405B-Instruct",
67
+ "status": "retired",
68
+ "description": "Retired 2026-09 — absent from the router's roster and rejected by a live call",
69
69
  "enumMember": "LLAMA_3_1_405B_INSTRUCT"
70
70
  },
71
71
  "meta-llama/Meta-Llama-3-8B-Instruct": {
72
72
  "vision": false,
73
- "status": "production",
74
- "description": "Meta Llama 3.0 — Meta-Llama-3-8B-Instruct",
73
+ "status": "retired",
74
+ "description": "Retired 2026-09 — absent from the router's roster and rejected by a live call",
75
75
  "enumMember": "LLAMA_3_8B_INSTRUCT"
76
76
  },
77
77
  "meta-llama/Meta-Llama-3-70B-Instruct": {
78
78
  "vision": false,
79
- "status": "production",
80
- "description": "Meta Llama 3.0 — Meta-Llama-3-70B-Instruct",
79
+ "status": "retired",
80
+ "description": "Retired 2026-09 — absent from the router's roster and rejected by a live call",
81
81
  "enumMember": "LLAMA_3_70B_INSTRUCT"
82
82
  },
83
83
  "mistralai/Mistral-Large-3-675B-Instruct-2512": {
84
84
  "vision": false,
85
- "status": "production",
86
- "description": "Mistral Large",
85
+ "status": "retired",
86
+ "description": "Retired 2026-09 — absent from the router's roster and rejected by a live call",
87
87
  "enumMember": "MISTRAL_LARGE_3_675B"
88
88
  },
89
89
  "mistralai/Mistral-Small-3.1-24B-Instruct-2503": {
90
90
  "vision": false,
91
- "status": "production",
92
- "description": "Mistral Small — Mistral-Small-3.1-24B-Instruct-2503",
91
+ "status": "retired",
92
+ "description": "Retired 2026-09 — absent from the router's roster and rejected by a live call",
93
93
  "enumMember": "MISTRAL_SMALL_3_1_24B"
94
94
  },
95
95
  "mistralai/Mistral-Small-24B-Instruct-2501": {
96
96
  "vision": false,
97
- "status": "production",
98
- "description": "Mistral Small — Mistral-Small-24B-Instruct-2501",
97
+ "status": "retired",
98
+ "description": "Retired 2026-09 — absent from the router's roster and rejected by a live call",
99
99
  "enumMember": "MISTRAL_SMALL_24B"
100
100
  },
101
101
  "mistralai/Mistral-7B-Instruct-v0.2": {
102
102
  "vision": false,
103
- "status": "production",
104
- "description": "Mistral — Mistral-7B-Instruct-v0.2",
103
+ "status": "retired",
104
+ "description": "Retired 2026-09 — absent from the router's roster and rejected by a live call",
105
105
  "enumMember": "MISTRAL_7B_INSTRUCT"
106
106
  },
107
107
  "mistralai/Mixtral-8x7B-Instruct-v0.1": {
108
108
  "vision": false,
109
- "status": "production",
110
- "description": "Mistral — Mixtral-8x7B-Instruct-v0.1",
109
+ "status": "retired",
110
+ "description": "Retired 2026-09 — absent from the router's roster and rejected by a live call",
111
111
  "enumMember": "MIXTRAL_8X7B_INSTRUCT"
112
112
  },
113
113
  "mistralai/Devstral-2": {
114
114
  "vision": false,
115
- "status": "production",
116
- "description": "Mistral Devstral — Devstral-2",
115
+ "status": "retired",
116
+ "description": "Retired 2026-09 — absent from the router's roster and rejected by a live call",
117
117
  "enumMember": "DEVSTRAL_2"
118
118
  },
119
119
  "Qwen/Qwen2.5-7B": {
120
120
  "vision": false,
121
- "status": "production",
122
- "description": "Qwen 2.5 — Qwen2.5-7B",
121
+ "status": "retired",
122
+ "description": "Retired 2026-09 — absent from the router's roster and rejected by a live call",
123
123
  "enumMember": "QWEN_2_5_7B"
124
124
  },
125
125
  "Qwen/Qwen2.5-32B": {
126
126
  "vision": false,
127
- "status": "production",
128
- "description": "Qwen 2.5 — Qwen2.5-32B",
127
+ "status": "retired",
128
+ "description": "Retired 2026-09 — absent from the router's roster and rejected by a live call",
129
129
  "enumMember": "QWEN_2_5_32B"
130
130
  },
131
131
  "Qwen/Qwen2.5-72B-Instruct": {
@@ -136,8 +136,8 @@
136
136
  },
137
137
  "Qwen/Qwen2.5-Coder-7B": {
138
138
  "vision": false,
139
- "status": "production",
140
- "description": "Qwen 2.5 Coder — Qwen2.5-Coder-7B",
139
+ "status": "retired",
140
+ "description": "Retired 2026-09 — absent from the router's roster and rejected by a live call",
141
141
  "enumMember": "QWEN_2_5_CODER_7B"
142
142
  },
143
143
  "Qwen/Qwen2.5-Coder-32B-Instruct": {
@@ -148,14 +148,14 @@
148
148
  },
149
149
  "Qwen/QwQ-32B": {
150
150
  "vision": false,
151
- "status": "production",
152
- "description": "Qwen QwQ — QwQ-32B",
151
+ "status": "retired",
152
+ "description": "Retired 2026-09 — absent from the router's roster and rejected by a live call",
153
153
  "enumMember": "QWQ_32B"
154
154
  },
155
155
  "Qwen/Qwen2.5-VL-32B-Instruct": {
156
156
  "vision": false,
157
- "status": "production",
158
- "description": "Qwen 2.5 VL (Multimodal) — Qwen2.5-VL-32B-Instruct",
157
+ "status": "retired",
158
+ "description": "Retired 2026-09 — absent from the router's roster and rejected by a live call",
159
159
  "enumMember": "QWEN_2_5_VL_32B"
160
160
  },
161
161
  "deepseek-ai/DeepSeek-R1": {
@@ -190,44 +190,44 @@
190
190
  },
191
191
  "microsoft/Phi-4-reasoning": {
192
192
  "vision": false,
193
- "status": "production",
194
- "description": "Microsoft Phi — Phi-4-reasoning",
193
+ "status": "retired",
194
+ "description": "Retired 2026-09 — absent from the router's roster and rejected by a live call",
195
195
  "enumMember": "PHI_4_REASONING"
196
196
  },
197
197
  "microsoft/Phi-4-mini-instruct": {
198
198
  "vision": false,
199
- "status": "production",
200
- "description": "Microsoft Phi — Phi-4-mini-instruct",
199
+ "status": "retired",
200
+ "description": "Retired 2026-09 — absent from the router's roster and rejected by a live call",
201
201
  "enumMember": "PHI_4_MINI_INSTRUCT"
202
202
  },
203
203
  "microsoft/Phi-4-mini-reasoning": {
204
204
  "vision": false,
205
- "status": "production",
206
- "description": "Microsoft Phi — Phi-4-mini-reasoning",
205
+ "status": "retired",
206
+ "description": "Retired 2026-09 — absent from the router's roster and rejected by a live call",
207
207
  "enumMember": "PHI_4_MINI_REASONING"
208
208
  },
209
209
  "microsoft/Phi-3-mini-128k-instruct": {
210
210
  "vision": false,
211
- "status": "production",
212
- "description": "Microsoft Phi — Phi-3-mini-128k-instruct",
211
+ "status": "retired",
212
+ "description": "Retired 2026-09 — absent from the router's roster and rejected by a live call",
213
213
  "enumMember": "PHI_3_MINI_128K_INSTRUCT"
214
214
  },
215
215
  "microsoft/Phi-3-vision-128k-instruct": {
216
216
  "vision": false,
217
- "status": "production",
218
- "description": "Microsoft Phi — Phi-3-vision-128k-instruct",
217
+ "status": "retired",
218
+ "description": "Retired 2026-09 — absent from the router's roster and rejected by a live call",
219
219
  "enumMember": "PHI_3_VISION_128K_INSTRUCT"
220
220
  },
221
221
  "google/gemma-3-270m": {
222
222
  "vision": false,
223
- "status": "production",
224
- "description": "Google Gemma 3 — gemma-3-270m",
223
+ "status": "retired",
224
+ "description": "Retired 2026-09 — absent from the router's roster and rejected by a live call",
225
225
  "enumMember": "GEMMA_3_270M"
226
226
  },
227
227
  "google/gemma-3-1b-it": {
228
228
  "vision": false,
229
- "status": "production",
230
- "description": "Google Gemma 3 — gemma-3-1b-it",
229
+ "status": "retired",
230
+ "description": "Retired 2026-09 — absent from the router's roster and rejected by a live call",
231
231
  "enumMember": "GEMMA_3_1B_IT"
232
232
  },
233
233
  "google/gemma-3-4b-it": {
@@ -250,62 +250,62 @@
250
250
  },
251
251
  "google/gemma-2-9b": {
252
252
  "vision": false,
253
- "status": "production",
254
- "description": "Google Gemma 2 — gemma-2-9b",
253
+ "status": "retired",
254
+ "description": "Retired 2026-09 — absent from the router's roster and rejected by a live call",
255
255
  "enumMember": "GEMMA_2_9B"
256
256
  },
257
257
  "google/gemma-2-27b": {
258
258
  "vision": false,
259
- "status": "production",
260
- "description": "Google Gemma 2 — gemma-2-27b",
259
+ "status": "retired",
260
+ "description": "Retired 2026-09 — absent from the router's roster and rejected by a live call",
261
261
  "enumMember": "GEMMA_2_27B"
262
262
  },
263
263
  "google/gemma-2b": {
264
264
  "vision": false,
265
- "status": "production",
266
- "description": "Google Gemma 1 — gemma-2b",
265
+ "status": "retired",
266
+ "description": "Retired 2026-09 — absent from the router's roster and rejected by a live call",
267
267
  "enumMember": "GEMMA_2B"
268
268
  },
269
269
  "google/gemma-7b": {
270
270
  "vision": false,
271
- "status": "production",
272
- "description": "Google Gemma 1 — gemma-7b",
271
+ "status": "retired",
272
+ "description": "Retired 2026-09 — absent from the router's roster and rejected by a live call",
273
273
  "enumMember": "GEMMA_7B"
274
274
  },
275
275
  "tiiuae/falcon-40b-instruct": {
276
276
  "vision": false,
277
- "status": "production",
278
- "description": "Falcon — falcon-40b-instruct",
277
+ "status": "retired",
278
+ "description": "Retired 2026-09 — absent from the router's roster and rejected by a live call",
279
279
  "enumMember": "FALCON_40B_INSTRUCT"
280
280
  },
281
281
  "tiiuae/falcon-180B-chat": {
282
282
  "vision": false,
283
- "status": "production",
284
- "description": "Falcon — falcon-180B-chat",
283
+ "status": "retired",
284
+ "description": "Retired 2026-09 — absent from the router's roster and rejected by a live call",
285
285
  "enumMember": "FALCON_180B_CHAT"
286
286
  },
287
287
  "bigcode/starcoder2-15b": {
288
288
  "vision": false,
289
- "status": "production",
290
- "description": "Code Models — starcoder2-15b",
289
+ "status": "retired",
290
+ "description": "Retired 2026-09 — absent from the router's roster and rejected by a live call",
291
291
  "enumMember": "STARCODER2_15B"
292
292
  },
293
293
  "codellama/CodeLlama-34b-Instruct-hf": {
294
294
  "vision": false,
295
- "status": "production",
296
- "description": "Code Models — CodeLlama-34b-Instruct-hf",
295
+ "status": "retired",
296
+ "description": "Retired 2026-09 — absent from the router's roster and rejected by a live call",
297
297
  "enumMember": "CODELLAMA_34B_INSTRUCT"
298
298
  },
299
299
  "bigscience/bloom-7b1": {
300
300
  "vision": false,
301
- "status": "production",
302
- "description": "BLOOM — bloom-7b1",
301
+ "status": "retired",
302
+ "description": "Retired 2026-09 — absent from the router's roster and rejected by a live call",
303
303
  "enumMember": "BLOOM_7B1"
304
304
  },
305
305
  "bigscience/bloom-1b3": {
306
306
  "vision": false,
307
- "status": "production",
308
- "description": "BLOOM — bloom-1b3",
307
+ "status": "retired",
308
+ "description": "Retired 2026-09 — absent from the router's roster and rejected by a live call",
309
309
  "enumMember": "BLOOM_1B3"
310
310
  },
311
311
  "zai-org/GLM-5": {
@@ -322,26 +322,26 @@
322
322
  },
323
323
  "nvidia/NVIDIA-Nemotron-3-Nano-30B-A3B-BF16": {
324
324
  "vision": false,
325
- "status": "production",
326
- "description": "NVIDIA Nemotron 3 Nano — NVIDIA-Nemotron-3-Nano-30B-A3B-BF16",
325
+ "status": "retired",
326
+ "description": "Retired 2026-09 — absent from the router's roster and rejected by a live call",
327
327
  "enumMember": "NEMOTRON_3_NANO_30B"
328
328
  },
329
329
  "HuggingFaceTB/SmolLM3-3B": {
330
330
  "vision": false,
331
- "status": "production",
332
- "description": "HuggingFace SmolLM3 — SmolLM3-3B",
331
+ "status": "retired",
332
+ "description": "Retired 2026-09 — absent from the router's roster and rejected by a live call",
333
333
  "enumMember": "SMOLLM3_3B"
334
334
  },
335
335
  "tiiuae/Falcon3-7B-Instruct": {
336
336
  "vision": false,
337
- "status": "production",
338
- "description": "Falcon 3 Series — Falcon3-7B-Instruct",
337
+ "status": "retired",
338
+ "description": "Retired 2026-09 — absent from the router's roster and rejected by a live call",
339
339
  "enumMember": "FALCON_3_7B_INSTRUCT"
340
340
  },
341
341
  "tiiuae/Falcon3-10B-Instruct": {
342
342
  "vision": false,
343
- "status": "production",
344
- "description": "Falcon 3 Series — Falcon3-10B-Instruct",
343
+ "status": "retired",
344
+ "description": "Retired 2026-09 — absent from the router's roster and rejected by a live call",
345
345
  "enumMember": "FALCON_3_10B_INSTRUCT"
346
346
  }
347
347
  }
@@ -370,12 +370,12 @@
370
370
  {
371
371
  "pattern": "model.*not found|not found.*model",
372
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"
373
+ "message": "HuggingFace model '{model}' not found.\n\nSuggestions:\n1. Check model name spelling\n2. Ensure an Inference Provider serves the model (https://huggingface.co/inference/models)\n3. For tool calling, use: meta-llama/Llama-3.3-70B-Instruct, zai-org/GLM-5 or Qwen/Qwen3.5-397B-A17B"
374
374
  },
375
375
  {
376
376
  "pattern": "function|tool",
377
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"
378
+ "message": "HuggingFace tool calling error: {message}\n\nNotes:\n1. Ensure you're using a tool-capable model, e.g. meta-llama/Llama-3.3-70B-Instruct, zai-org/GLM-5 or Qwen/Qwen3.5-397B-A17B\n2. Check that your model supports function calling\n3. Verify tool schema format is correct"
379
379
  }
380
380
  ],
381
381
  "timeouts": {
@@ -385,8 +385,8 @@
385
385
  "autoSelectPriority": 10,
386
386
  "setup": {
387
387
  "url": "https://huggingface.co/settings/tokens",
388
- "apiKeyFormat": "^hf_[A-Za-z0-9]{37}$",
389
- "billingPolicy": "free-with-card",
388
+ "apiKeyFormat": "^hf_[A-Za-z0-9]{34,}$",
389
+ "billingPolicy": "free-tier",
390
390
  "instructions": [
391
391
  "1. Visit: https://huggingface.co/settings/tokens",
392
392
  "2. Create or sign in to your HuggingFace account",
@@ -396,8 +396,8 @@
396
396
  },
397
397
  "evidence": {
398
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."
399
+ "date": "2026-09-24",
400
+ "method": "Live against router.huggingface.co on 2026-09-24. GET /v1/models returned 138 models; each of the 53 catalog ids was also sent a real chat call. 39 ids are absent from the roster AND rejected with 400 ('does not exist' / 'not supported by any provider'), so they are marked retired and keep their enumMember; the other 14 are on the roster and answered 402 (the test account's monthly credits are spent), which is a billing block, not a rejection, so they stay production. No id had the two signals disagree. topModels swaps the retired Mistral-Large-3 for zai-org/GLM-5, which is on the roster. billingPolicy is free-tier per https://huggingface.co/docs/inference-providers/pricing (free users get monthly credits, no card). apiKeyFormat accepts the hf_ + 34 characters a real token has; the previous hf_ + 37 pattern rejected it. structuredOutput, toolsWithStreaming and per-model vision are left unchanged: /v1/models reports them per serving provider, and the 402 prevented a live round trip that would prove them."
401
401
  },
402
402
  "liveMatrix": null,
403
403
  "addedInPR": "TBD — integration-tested in a worktree before a PR was opened"
@@ -289,8 +289,10 @@ function drainAccountAdmissionWaiters(accountKey, state) {
289
289
  * removed the waiter's cap — and uncapped arrivals count toward `active`, so
290
290
  * that waiter would otherwise never drain. An uncapped request from an older
291
291
  * snapshot (one that predates a reload adding the cap) or from the same one
292
- * leaves waiters queued: their cap is still current. With no generation there
293
- * is no runtime config store, the cap cannot change, and nothing is admitted.
292
+ * leaves waiters queued: their cap is still current. With no generation,
293
+ * which only direct callers such as test hooks pass (the route passes 0 from
294
+ * its fallback snapshot when no runtime config store is attached), there is
295
+ * nothing to compare against and nothing is admitted.
294
296
  */
295
297
  function admitWaitersOfRemovedCap(accountKey, state, generation) {
296
298
  if (generation === undefined) {
@@ -7068,8 +7070,8 @@ async function handleAnthropicRoutedClaudeRequest(args) {
7068
7070
  });
7069
7071
  }
7070
7072
  const { accounts, enabledAccounts, orderedAccounts, bodyStr, requestStart, toolCount, url, clientHeaders, isClaudeClientRequest, sessionId, } = loadedAccounts;
7071
- // Accounts this request sent an upstream attempt to; one skipped only for
7072
- // its admission cap is not among them.
7073
+ // Accounts this request sent an upstream attempt to or whose token refresh
7074
+ // failed; one skipped only for its admission cap is not among them.
7073
7075
  const attemptedAccountKeys = new Set();
7074
7076
  // Only fill-first over more than one account reads a binding (see
7075
7077
  // selectClaudeProxyAccountOrder), so nothing else records one.
@@ -7233,6 +7235,9 @@ async function handleAnthropicRoutedClaudeRequest(args) {
7233
7235
  !preparedAttempt.finalBodyStr ||
7234
7236
  !preparedAttempt.preparedContext ||
7235
7237
  preparedAttempt.fetchStartMs === undefined) {
7238
+ // A failed token refresh is this account failing the request, so a
7239
+ // session bound to it must not stay there when another one serves.
7240
+ attemptedAccountKeys.add(account.key);
7236
7241
  if (transportPermit.probe) {
7237
7242
  providerTransportCoordinator.reportProbeAbandoned(transportPermit);
7238
7243
  }
@@ -1143,8 +1143,10 @@ export type QueuedAccountAdmission = {
1143
1143
  /** One queued request waiting for per-account admission capacity. */
1144
1144
  export type AccountAdmissionWaiter = {
1145
1145
  capacity: number;
1146
- /** Runtime-config generation of the snapshot the request queued under;
1147
- * absent when no runtime config store publishes one. */
1146
+ /** Runtime-config generation of the snapshot the request queued under.
1147
+ * The route always passes one (0 from its fallback snapshot when no
1148
+ * runtime config store is attached); only direct callers such as test
1149
+ * hooks leave it absent. */
1148
1150
  generation?: number;
1149
1151
  resolve: (lease: AccountAdmissionLease) => void;
1150
1152
  };