@huggingface/inference 3.6.1 → 3.6.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.
Files changed (38) hide show
  1. package/dist/index.cjs +125 -44
  2. package/dist/index.js +125 -44
  3. package/dist/src/lib/makeRequestOptions.d.ts.map +1 -1
  4. package/dist/src/providers/black-forest-labs.d.ts.map +1 -1
  5. package/dist/src/providers/cerebras.d.ts.map +1 -1
  6. package/dist/src/providers/cohere.d.ts.map +1 -1
  7. package/dist/src/providers/fal-ai.d.ts +6 -16
  8. package/dist/src/providers/fal-ai.d.ts.map +1 -1
  9. package/dist/src/providers/fireworks-ai.d.ts.map +1 -1
  10. package/dist/src/providers/hf-inference.d.ts.map +1 -1
  11. package/dist/src/providers/hyperbolic.d.ts.map +1 -1
  12. package/dist/src/providers/nebius.d.ts.map +1 -1
  13. package/dist/src/providers/novita.d.ts.map +1 -1
  14. package/dist/src/providers/openai.d.ts.map +1 -1
  15. package/dist/src/providers/replicate.d.ts.map +1 -1
  16. package/dist/src/providers/sambanova.d.ts.map +1 -1
  17. package/dist/src/providers/together.d.ts.map +1 -1
  18. package/dist/src/tasks/cv/textToVideo.d.ts.map +1 -1
  19. package/dist/src/types.d.ts +4 -2
  20. package/dist/src/types.d.ts.map +1 -1
  21. package/dist/test/InferenceClient.spec.d.ts.map +1 -1
  22. package/package.json +2 -2
  23. package/src/lib/makeRequestOptions.ts +3 -1
  24. package/src/providers/black-forest-labs.ts +6 -2
  25. package/src/providers/cerebras.ts +6 -2
  26. package/src/providers/cohere.ts +6 -2
  27. package/src/providers/fal-ai.ts +85 -3
  28. package/src/providers/fireworks-ai.ts +6 -2
  29. package/src/providers/hf-inference.ts +6 -2
  30. package/src/providers/hyperbolic.ts +6 -2
  31. package/src/providers/nebius.ts +6 -2
  32. package/src/providers/novita.ts +5 -2
  33. package/src/providers/openai.ts +6 -2
  34. package/src/providers/replicate.ts +6 -2
  35. package/src/providers/sambanova.ts +6 -2
  36. package/src/providers/together.ts +6 -2
  37. package/src/tasks/cv/textToVideo.ts +5 -21
  38. package/src/types.ts +5 -2
package/dist/index.cjs CHANGED
@@ -104,6 +104,9 @@ var HF_ROUTER_URL = "https://router.huggingface.co";
104
104
 
105
105
  // src/providers/black-forest-labs.ts
106
106
  var BLACK_FOREST_LABS_AI_API_BASE_URL = "https://api.us1.bfl.ai";
107
+ var makeBaseUrl = () => {
108
+ return BLACK_FOREST_LABS_AI_API_BASE_URL;
109
+ };
107
110
  var makeBody = (params) => {
108
111
  return params.args;
109
112
  };
@@ -118,7 +121,7 @@ var makeUrl = (params) => {
118
121
  return `${params.baseUrl}/v1/${params.model}`;
119
122
  };
120
123
  var BLACK_FOREST_LABS_CONFIG = {
121
- baseUrl: BLACK_FOREST_LABS_AI_API_BASE_URL,
124
+ makeBaseUrl,
122
125
  makeBody,
123
126
  makeHeaders,
124
127
  makeUrl
@@ -126,6 +129,9 @@ var BLACK_FOREST_LABS_CONFIG = {
126
129
 
127
130
  // src/providers/cerebras.ts
128
131
  var CEREBRAS_API_BASE_URL = "https://api.cerebras.ai";
132
+ var makeBaseUrl2 = () => {
133
+ return CEREBRAS_API_BASE_URL;
134
+ };
129
135
  var makeBody2 = (params) => {
130
136
  return {
131
137
  ...params.args,
@@ -139,7 +145,7 @@ var makeUrl2 = (params) => {
139
145
  return `${params.baseUrl}/v1/chat/completions`;
140
146
  };
141
147
  var CEREBRAS_CONFIG = {
142
- baseUrl: CEREBRAS_API_BASE_URL,
148
+ makeBaseUrl: makeBaseUrl2,
143
149
  makeBody: makeBody2,
144
150
  makeHeaders: makeHeaders2,
145
151
  makeUrl: makeUrl2
@@ -147,6 +153,9 @@ var CEREBRAS_CONFIG = {
147
153
 
148
154
  // src/providers/cohere.ts
149
155
  var COHERE_API_BASE_URL = "https://api.cohere.com";
156
+ var makeBaseUrl3 = () => {
157
+ return COHERE_API_BASE_URL;
158
+ };
150
159
  var makeBody3 = (params) => {
151
160
  return {
152
161
  ...params.args,
@@ -160,14 +169,40 @@ var makeUrl3 = (params) => {
160
169
  return `${params.baseUrl}/compatibility/v1/chat/completions`;
161
170
  };
162
171
  var COHERE_CONFIG = {
163
- baseUrl: COHERE_API_BASE_URL,
172
+ makeBaseUrl: makeBaseUrl3,
164
173
  makeBody: makeBody3,
165
174
  makeHeaders: makeHeaders3,
166
175
  makeUrl: makeUrl3
167
176
  };
168
177
 
178
+ // src/lib/InferenceOutputError.ts
179
+ var InferenceOutputError = class extends TypeError {
180
+ constructor(message) {
181
+ super(
182
+ `Invalid inference output: ${message}. Use the 'request' method with the same parameters to do a custom call with no type checking.`
183
+ );
184
+ this.name = "InferenceOutputError";
185
+ }
186
+ };
187
+
188
+ // src/lib/isUrl.ts
189
+ function isUrl(modelOrUrl) {
190
+ return /^http(s?):/.test(modelOrUrl) || modelOrUrl.startsWith("/");
191
+ }
192
+
193
+ // src/utils/delay.ts
194
+ function delay(ms) {
195
+ return new Promise((resolve) => {
196
+ setTimeout(() => resolve(), ms);
197
+ });
198
+ }
199
+
169
200
  // src/providers/fal-ai.ts
170
201
  var FAL_AI_API_BASE_URL = "https://fal.run";
202
+ var FAL_AI_API_BASE_URL_QUEUE = "https://queue.fal.run";
203
+ var makeBaseUrl4 = (task) => {
204
+ return task === "text-to-video" ? FAL_AI_API_BASE_URL_QUEUE : FAL_AI_API_BASE_URL;
205
+ };
171
206
  var makeBody4 = (params) => {
172
207
  return params.args;
173
208
  };
@@ -177,17 +212,64 @@ var makeHeaders4 = (params) => {
177
212
  };
178
213
  };
179
214
  var makeUrl4 = (params) => {
180
- return `${params.baseUrl}/${params.model}`;
215
+ const baseUrl = `${params.baseUrl}/${params.model}`;
216
+ if (params.authMethod !== "provider-key" && params.task === "text-to-video") {
217
+ return `${baseUrl}?_subdomain=queue`;
218
+ }
219
+ return baseUrl;
181
220
  };
182
221
  var FAL_AI_CONFIG = {
183
- baseUrl: FAL_AI_API_BASE_URL,
222
+ makeBaseUrl: makeBaseUrl4,
184
223
  makeBody: makeBody4,
185
224
  makeHeaders: makeHeaders4,
186
225
  makeUrl: makeUrl4
187
226
  };
227
+ async function pollFalResponse(res, url, headers) {
228
+ const requestId = res.request_id;
229
+ if (!requestId) {
230
+ throw new InferenceOutputError("No request ID found in the response");
231
+ }
232
+ let status = res.status;
233
+ const parsedUrl = new URL(url);
234
+ const baseUrl = `${parsedUrl.protocol}//${parsedUrl.host}${parsedUrl.host === "router.huggingface.co" ? "/fal-ai" : ""}`;
235
+ const modelId = new URL(res.response_url).pathname;
236
+ const queryParams = parsedUrl.search;
237
+ const statusUrl = `${baseUrl}${modelId}/status${queryParams}`;
238
+ const resultUrl = `${baseUrl}${modelId}${queryParams}`;
239
+ while (status !== "COMPLETED") {
240
+ await delay(500);
241
+ const statusResponse = await fetch(statusUrl, { headers });
242
+ if (!statusResponse.ok) {
243
+ throw new InferenceOutputError("Failed to fetch response status from fal-ai API");
244
+ }
245
+ try {
246
+ status = (await statusResponse.json()).status;
247
+ } catch (error) {
248
+ throw new InferenceOutputError("Failed to parse status response from fal-ai API");
249
+ }
250
+ }
251
+ const resultResponse = await fetch(resultUrl, { headers });
252
+ let result;
253
+ try {
254
+ result = await resultResponse.json();
255
+ } catch (error) {
256
+ throw new InferenceOutputError("Failed to parse result response from fal-ai API");
257
+ }
258
+ if (typeof result === "object" && !!result && "video" in result && typeof result.video === "object" && !!result.video && "url" in result.video && typeof result.video.url === "string" && isUrl(result.video.url)) {
259
+ const urlResponse = await fetch(result.video.url);
260
+ return await urlResponse.blob();
261
+ } else {
262
+ throw new InferenceOutputError(
263
+ "Expected { video: { url: string } } result format, got instead: " + JSON.stringify(result)
264
+ );
265
+ }
266
+ }
188
267
 
189
268
  // src/providers/fireworks-ai.ts
190
269
  var FIREWORKS_AI_API_BASE_URL = "https://api.fireworks.ai";
270
+ var makeBaseUrl5 = () => {
271
+ return FIREWORKS_AI_API_BASE_URL;
272
+ };
191
273
  var makeBody5 = (params) => {
192
274
  return {
193
275
  ...params.args,
@@ -204,13 +286,16 @@ var makeUrl5 = (params) => {
204
286
  return `${params.baseUrl}/inference`;
205
287
  };
206
288
  var FIREWORKS_AI_CONFIG = {
207
- baseUrl: FIREWORKS_AI_API_BASE_URL,
289
+ makeBaseUrl: makeBaseUrl5,
208
290
  makeBody: makeBody5,
209
291
  makeHeaders: makeHeaders5,
210
292
  makeUrl: makeUrl5
211
293
  };
212
294
 
213
295
  // src/providers/hf-inference.ts
296
+ var makeBaseUrl6 = () => {
297
+ return `${HF_ROUTER_URL}/hf-inference`;
298
+ };
214
299
  var makeBody6 = (params) => {
215
300
  return {
216
301
  ...params.args,
@@ -230,7 +315,7 @@ var makeUrl6 = (params) => {
230
315
  return `${params.baseUrl}/models/${params.model}`;
231
316
  };
232
317
  var HF_INFERENCE_CONFIG = {
233
- baseUrl: `${HF_ROUTER_URL}/hf-inference`,
318
+ makeBaseUrl: makeBaseUrl6,
234
319
  makeBody: makeBody6,
235
320
  makeHeaders: makeHeaders6,
236
321
  makeUrl: makeUrl6
@@ -238,6 +323,9 @@ var HF_INFERENCE_CONFIG = {
238
323
 
239
324
  // src/providers/hyperbolic.ts
240
325
  var HYPERBOLIC_API_BASE_URL = "https://api.hyperbolic.xyz";
326
+ var makeBaseUrl7 = () => {
327
+ return HYPERBOLIC_API_BASE_URL;
328
+ };
241
329
  var makeBody7 = (params) => {
242
330
  return {
243
331
  ...params.args,
@@ -254,7 +342,7 @@ var makeUrl7 = (params) => {
254
342
  return `${params.baseUrl}/v1/chat/completions`;
255
343
  };
256
344
  var HYPERBOLIC_CONFIG = {
257
- baseUrl: HYPERBOLIC_API_BASE_URL,
345
+ makeBaseUrl: makeBaseUrl7,
258
346
  makeBody: makeBody7,
259
347
  makeHeaders: makeHeaders7,
260
348
  makeUrl: makeUrl7
@@ -262,6 +350,9 @@ var HYPERBOLIC_CONFIG = {
262
350
 
263
351
  // src/providers/nebius.ts
264
352
  var NEBIUS_API_BASE_URL = "https://api.studio.nebius.ai";
353
+ var makeBaseUrl8 = () => {
354
+ return NEBIUS_API_BASE_URL;
355
+ };
265
356
  var makeBody8 = (params) => {
266
357
  return {
267
358
  ...params.args,
@@ -284,7 +375,7 @@ var makeUrl8 = (params) => {
284
375
  return params.baseUrl;
285
376
  };
286
377
  var NEBIUS_CONFIG = {
287
- baseUrl: NEBIUS_API_BASE_URL,
378
+ makeBaseUrl: makeBaseUrl8,
288
379
  makeBody: makeBody8,
289
380
  makeHeaders: makeHeaders8,
290
381
  makeUrl: makeUrl8
@@ -292,6 +383,9 @@ var NEBIUS_CONFIG = {
292
383
 
293
384
  // src/providers/novita.ts
294
385
  var NOVITA_API_BASE_URL = "https://api.novita.ai";
386
+ var makeBaseUrl9 = () => {
387
+ return NOVITA_API_BASE_URL;
388
+ };
295
389
  var makeBody9 = (params) => {
296
390
  return {
297
391
  ...params.args,
@@ -312,7 +406,7 @@ var makeUrl9 = (params) => {
312
406
  return params.baseUrl;
313
407
  };
314
408
  var NOVITA_CONFIG = {
315
- baseUrl: NOVITA_API_BASE_URL,
409
+ makeBaseUrl: makeBaseUrl9,
316
410
  makeBody: makeBody9,
317
411
  makeHeaders: makeHeaders9,
318
412
  makeUrl: makeUrl9
@@ -320,6 +414,9 @@ var NOVITA_CONFIG = {
320
414
 
321
415
  // src/providers/replicate.ts
322
416
  var REPLICATE_API_BASE_URL = "https://api.replicate.com";
417
+ var makeBaseUrl10 = () => {
418
+ return REPLICATE_API_BASE_URL;
419
+ };
323
420
  var makeBody10 = (params) => {
324
421
  return {
325
422
  input: params.args,
@@ -336,7 +433,7 @@ var makeUrl10 = (params) => {
336
433
  return `${params.baseUrl}/v1/models/${params.model}/predictions`;
337
434
  };
338
435
  var REPLICATE_CONFIG = {
339
- baseUrl: REPLICATE_API_BASE_URL,
436
+ makeBaseUrl: makeBaseUrl10,
340
437
  makeBody: makeBody10,
341
438
  makeHeaders: makeHeaders10,
342
439
  makeUrl: makeUrl10
@@ -344,6 +441,9 @@ var REPLICATE_CONFIG = {
344
441
 
345
442
  // src/providers/sambanova.ts
346
443
  var SAMBANOVA_API_BASE_URL = "https://api.sambanova.ai";
444
+ var makeBaseUrl11 = () => {
445
+ return SAMBANOVA_API_BASE_URL;
446
+ };
347
447
  var makeBody11 = (params) => {
348
448
  return {
349
449
  ...params.args,
@@ -360,7 +460,7 @@ var makeUrl11 = (params) => {
360
460
  return params.baseUrl;
361
461
  };
362
462
  var SAMBANOVA_CONFIG = {
363
- baseUrl: SAMBANOVA_API_BASE_URL,
463
+ makeBaseUrl: makeBaseUrl11,
364
464
  makeBody: makeBody11,
365
465
  makeHeaders: makeHeaders11,
366
466
  makeUrl: makeUrl11
@@ -368,6 +468,9 @@ var SAMBANOVA_CONFIG = {
368
468
 
369
469
  // src/providers/together.ts
370
470
  var TOGETHER_API_BASE_URL = "https://api.together.xyz";
471
+ var makeBaseUrl12 = () => {
472
+ return TOGETHER_API_BASE_URL;
473
+ };
371
474
  var makeBody12 = (params) => {
372
475
  return {
373
476
  ...params.args,
@@ -390,7 +493,7 @@ var makeUrl12 = (params) => {
390
493
  return params.baseUrl;
391
494
  };
392
495
  var TOGETHER_CONFIG = {
393
- baseUrl: TOGETHER_API_BASE_URL,
496
+ makeBaseUrl: makeBaseUrl12,
394
497
  makeBody: makeBody12,
395
498
  makeHeaders: makeHeaders12,
396
499
  makeUrl: makeUrl12
@@ -398,6 +501,9 @@ var TOGETHER_CONFIG = {
398
501
 
399
502
  // src/providers/openai.ts
400
503
  var OPENAI_API_BASE_URL = "https://api.openai.com";
504
+ var makeBaseUrl13 = () => {
505
+ return OPENAI_API_BASE_URL;
506
+ };
401
507
  var makeBody13 = (params) => {
402
508
  if (!params.chatCompletion) {
403
509
  throw new Error("OpenAI only supports chat completions.");
@@ -417,21 +523,16 @@ var makeUrl13 = (params) => {
417
523
  return `${params.baseUrl}/v1/chat/completions`;
418
524
  };
419
525
  var OPENAI_CONFIG = {
420
- baseUrl: OPENAI_API_BASE_URL,
526
+ makeBaseUrl: makeBaseUrl13,
421
527
  makeBody: makeBody13,
422
528
  makeHeaders: makeHeaders13,
423
529
  makeUrl: makeUrl13,
424
530
  clientSideRoutingOnly: true
425
531
  };
426
532
 
427
- // src/lib/isUrl.ts
428
- function isUrl(modelOrUrl) {
429
- return /^http(s?):/.test(modelOrUrl) || modelOrUrl.startsWith("/");
430
- }
431
-
432
533
  // package.json
433
534
  var name = "@huggingface/inference";
434
- var version = "3.6.1";
535
+ var version = "3.6.2";
435
536
 
436
537
  // src/providers/consts.ts
437
538
  var HARDCODED_MODEL_ID_MAPPING = {
@@ -570,7 +671,8 @@ function makeRequestOptionsFromResolvedModel(resolvedModel, args, options) {
570
671
  return "none";
571
672
  })();
572
673
  const url = endpointUrl ? chatCompletion2 ? endpointUrl + `/v1/chat/completions` : endpointUrl : providerConfig.makeUrl({
573
- baseUrl: authMethod !== "provider-key" ? HF_HUB_INFERENCE_PROXY_TEMPLATE.replace("{{PROVIDER}}", provider) : providerConfig.baseUrl,
674
+ authMethod,
675
+ baseUrl: authMethod !== "provider-key" ? HF_HUB_INFERENCE_PROXY_TEMPLATE.replace("{{PROVIDER}}", provider) : providerConfig.makeBaseUrl(task),
574
676
  model: resolvedModel,
575
677
  chatCompletion: chatCompletion2,
576
678
  task
@@ -834,16 +936,6 @@ async function* streamingRequest(args, options) {
834
936
  }
835
937
  }
836
938
 
837
- // src/lib/InferenceOutputError.ts
838
- var InferenceOutputError = class extends TypeError {
839
- constructor(message) {
840
- super(
841
- `Invalid inference output: ${message}. Use the 'request' method with the same parameters to do a custom call with no type checking.`
842
- );
843
- this.name = "InferenceOutputError";
844
- }
845
- };
846
-
847
939
  // src/utils/pick.ts
848
940
  function pick(o, props) {
849
941
  return Object.assign(
@@ -1058,13 +1150,6 @@ async function objectDetection(args, options) {
1058
1150
  return res;
1059
1151
  }
1060
1152
 
1061
- // src/utils/delay.ts
1062
- function delay(ms) {
1063
- return new Promise((resolve) => {
1064
- setTimeout(() => resolve(), ms);
1065
- });
1066
- }
1067
-
1068
1153
  // src/tasks/cv/textToImage.ts
1069
1154
  function getResponseFormatArg(provider) {
1070
1155
  switch (provider) {
@@ -1236,12 +1321,8 @@ async function textToVideo(args, options) {
1236
1321
  task: "text-to-video"
1237
1322
  });
1238
1323
  if (args.provider === "fal-ai") {
1239
- const isValidOutput = typeof res === "object" && !!res && "video" in res && typeof res.video === "object" && !!res.video && "url" in res.video && typeof res.video.url === "string" && isUrl(res.video.url);
1240
- if (!isValidOutput) {
1241
- throw new InferenceOutputError("Expected { video: { url: string } }");
1242
- }
1243
- const urlResponse = await fetch(res.video.url);
1244
- return await urlResponse.blob();
1324
+ const { url, info } = await makeRequestOptions(args, { ...options, task: "text-to-video" });
1325
+ return await pollFalResponse(res, url, info.headers);
1245
1326
  } else if (args.provider === "novita") {
1246
1327
  const isValidOutput = typeof res === "object" && !!res && "video" in res && typeof res.video === "object" && !!res.video && "video_url" in res.video && typeof res.video.video_url === "string" && isUrl(res.video.video_url);
1247
1328
  if (!isValidOutput) {