@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
@@ -14,9 +14,17 @@
14
14
  *
15
15
  * Thanks!
16
16
  */
17
- import type { ProviderConfig, UrlParams, HeaderParams, BodyParams } from "../types";
17
+ import { InferenceOutputError } from "../lib/InferenceOutputError";
18
+ import { isUrl } from "../lib/isUrl";
19
+ import type { BodyParams, HeaderParams, InferenceTask, ProviderConfig, UrlParams } from "../types";
20
+ import { delay } from "../utils/delay";
18
21
 
19
22
  const FAL_AI_API_BASE_URL = "https://fal.run";
23
+ const FAL_AI_API_BASE_URL_QUEUE = "https://queue.fal.run";
24
+
25
+ const makeBaseUrl = (task?: InferenceTask): string => {
26
+ return task === "text-to-video" ? FAL_AI_API_BASE_URL_QUEUE : FAL_AI_API_BASE_URL;
27
+ };
20
28
 
21
29
  const makeBody = (params: BodyParams): Record<string, unknown> => {
22
30
  return params.args;
@@ -29,12 +37,86 @@ const makeHeaders = (params: HeaderParams): Record<string, string> => {
29
37
  };
30
38
 
31
39
  const makeUrl = (params: UrlParams): string => {
32
- return `${params.baseUrl}/${params.model}`;
40
+ const baseUrl = `${params.baseUrl}/${params.model}`;
41
+ if (params.authMethod !== "provider-key" && params.task === "text-to-video") {
42
+ return `${baseUrl}?_subdomain=queue`;
43
+ }
44
+ return baseUrl;
33
45
  };
34
46
 
35
47
  export const FAL_AI_CONFIG: ProviderConfig = {
36
- baseUrl: FAL_AI_API_BASE_URL,
48
+ makeBaseUrl,
37
49
  makeBody,
38
50
  makeHeaders,
39
51
  makeUrl,
40
52
  };
53
+
54
+ export interface FalAiQueueOutput {
55
+ request_id: string;
56
+ status: string;
57
+ response_url: string;
58
+ }
59
+
60
+ export async function pollFalResponse(
61
+ res: FalAiQueueOutput,
62
+ url: string,
63
+ headers: Record<string, string>
64
+ ): Promise<Blob> {
65
+ const requestId = res.request_id;
66
+ if (!requestId) {
67
+ throw new InferenceOutputError("No request ID found in the response");
68
+ }
69
+ let status = res.status;
70
+
71
+ const parsedUrl = new URL(url);
72
+ const baseUrl = `${parsedUrl.protocol}//${parsedUrl.host}${
73
+ parsedUrl.host === "router.huggingface.co" ? "/fal-ai" : ""
74
+ }`;
75
+
76
+ // extracting the provider model id for status and result urls
77
+ // from the response as it might be different from the mapped model in `url`
78
+ const modelId = new URL(res.response_url).pathname;
79
+ const queryParams = parsedUrl.search;
80
+
81
+ const statusUrl = `${baseUrl}${modelId}/status${queryParams}`;
82
+ const resultUrl = `${baseUrl}${modelId}${queryParams}`;
83
+
84
+ while (status !== "COMPLETED") {
85
+ await delay(500);
86
+ const statusResponse = await fetch(statusUrl, { headers });
87
+
88
+ if (!statusResponse.ok) {
89
+ throw new InferenceOutputError("Failed to fetch response status from fal-ai API");
90
+ }
91
+ try {
92
+ status = (await statusResponse.json()).status;
93
+ } catch (error) {
94
+ throw new InferenceOutputError("Failed to parse status response from fal-ai API");
95
+ }
96
+ }
97
+
98
+ const resultResponse = await fetch(resultUrl, { headers });
99
+ let result: unknown;
100
+ try {
101
+ result = await resultResponse.json();
102
+ } catch (error) {
103
+ throw new InferenceOutputError("Failed to parse result response from fal-ai API");
104
+ }
105
+ if (
106
+ typeof result === "object" &&
107
+ !!result &&
108
+ "video" in result &&
109
+ typeof result.video === "object" &&
110
+ !!result.video &&
111
+ "url" in result.video &&
112
+ typeof result.video.url === "string" &&
113
+ isUrl(result.video.url)
114
+ ) {
115
+ const urlResponse = await fetch(result.video.url);
116
+ return await urlResponse.blob();
117
+ } else {
118
+ throw new InferenceOutputError(
119
+ "Expected { video: { url: string } } result format, got instead: " + JSON.stringify(result)
120
+ );
121
+ }
122
+ }
@@ -14,10 +14,14 @@
14
14
  *
15
15
  * Thanks!
16
16
  */
17
- import type { ProviderConfig, UrlParams, HeaderParams, BodyParams } from "../types";
17
+ import type { BodyParams, HeaderParams, ProviderConfig, UrlParams } from "../types";
18
18
 
19
19
  const FIREWORKS_AI_API_BASE_URL = "https://api.fireworks.ai";
20
20
 
21
+ const makeBaseUrl = (): string => {
22
+ return FIREWORKS_AI_API_BASE_URL;
23
+ };
24
+
21
25
  const makeBody = (params: BodyParams): Record<string, unknown> => {
22
26
  return {
23
27
  ...params.args,
@@ -37,7 +41,7 @@ const makeUrl = (params: UrlParams): string => {
37
41
  };
38
42
 
39
43
  export const FIREWORKS_AI_CONFIG: ProviderConfig = {
40
- baseUrl: FIREWORKS_AI_API_BASE_URL,
44
+ makeBaseUrl,
41
45
  makeBody,
42
46
  makeHeaders,
43
47
  makeUrl,
@@ -11,7 +11,11 @@
11
11
  * Thanks!
12
12
  */
13
13
  import { HF_ROUTER_URL } from "../config";
14
- import type { ProviderConfig, UrlParams, HeaderParams, BodyParams } from "../types";
14
+ import type { BodyParams, HeaderParams, ProviderConfig, UrlParams } from "../types";
15
+
16
+ const makeBaseUrl = (): string => {
17
+ return `${HF_ROUTER_URL}/hf-inference`;
18
+ };
15
19
 
16
20
  const makeBody = (params: BodyParams): Record<string, unknown> => {
17
21
  return {
@@ -36,7 +40,7 @@ const makeUrl = (params: UrlParams): string => {
36
40
  };
37
41
 
38
42
  export const HF_INFERENCE_CONFIG: ProviderConfig = {
39
- baseUrl: `${HF_ROUTER_URL}/hf-inference`,
43
+ makeBaseUrl,
40
44
  makeBody,
41
45
  makeHeaders,
42
46
  makeUrl,
@@ -14,10 +14,14 @@
14
14
  *
15
15
  * Thanks!
16
16
  */
17
- import type { ProviderConfig, UrlParams, HeaderParams, BodyParams } from "../types";
17
+ import type { BodyParams, HeaderParams, ProviderConfig, UrlParams } from "../types";
18
18
 
19
19
  const HYPERBOLIC_API_BASE_URL = "https://api.hyperbolic.xyz";
20
20
 
21
+ const makeBaseUrl = (): string => {
22
+ return HYPERBOLIC_API_BASE_URL;
23
+ };
24
+
21
25
  const makeBody = (params: BodyParams): Record<string, unknown> => {
22
26
  return {
23
27
  ...params.args,
@@ -37,7 +41,7 @@ const makeUrl = (params: UrlParams): string => {
37
41
  };
38
42
 
39
43
  export const HYPERBOLIC_CONFIG: ProviderConfig = {
40
- baseUrl: HYPERBOLIC_API_BASE_URL,
44
+ makeBaseUrl,
41
45
  makeBody,
42
46
  makeHeaders,
43
47
  makeUrl,
@@ -14,10 +14,14 @@
14
14
  *
15
15
  * Thanks!
16
16
  */
17
- import type { ProviderConfig, UrlParams, HeaderParams, BodyParams } from "../types";
17
+ import type { BodyParams, HeaderParams, ProviderConfig, UrlParams } from "../types";
18
18
 
19
19
  const NEBIUS_API_BASE_URL = "https://api.studio.nebius.ai";
20
20
 
21
+ const makeBaseUrl = (): string => {
22
+ return NEBIUS_API_BASE_URL;
23
+ };
24
+
21
25
  const makeBody = (params: BodyParams): Record<string, unknown> => {
22
26
  return {
23
27
  ...params.args,
@@ -43,7 +47,7 @@ const makeUrl = (params: UrlParams): string => {
43
47
  };
44
48
 
45
49
  export const NEBIUS_CONFIG: ProviderConfig = {
46
- baseUrl: NEBIUS_API_BASE_URL,
50
+ makeBaseUrl,
47
51
  makeBody,
48
52
  makeHeaders,
49
53
  makeUrl,
@@ -14,10 +14,13 @@
14
14
  *
15
15
  * Thanks!
16
16
  */
17
- import type { ProviderConfig, UrlParams, HeaderParams, BodyParams } from "../types";
17
+ import type { BodyParams, HeaderParams, ProviderConfig, UrlParams } from "../types";
18
18
 
19
19
  const NOVITA_API_BASE_URL = "https://api.novita.ai";
20
20
 
21
+ const makeBaseUrl = (): string => {
22
+ return NOVITA_API_BASE_URL;
23
+ };
21
24
  const makeBody = (params: BodyParams): Record<string, unknown> => {
22
25
  return {
23
26
  ...params.args,
@@ -41,7 +44,7 @@ const makeUrl = (params: UrlParams): string => {
41
44
  };
42
45
 
43
46
  export const NOVITA_CONFIG: ProviderConfig = {
44
- baseUrl: NOVITA_API_BASE_URL,
47
+ makeBaseUrl,
45
48
  makeBody,
46
49
  makeHeaders,
47
50
  makeUrl,
@@ -1,10 +1,14 @@
1
1
  /**
2
2
  * Special case: provider configuration for a private models provider (OpenAI in this case).
3
3
  */
4
- import type { ProviderConfig, UrlParams, HeaderParams, BodyParams } from "../types";
4
+ import type { BodyParams, HeaderParams, ProviderConfig, UrlParams } from "../types";
5
5
 
6
6
  const OPENAI_API_BASE_URL = "https://api.openai.com";
7
7
 
8
+ const makeBaseUrl = (): string => {
9
+ return OPENAI_API_BASE_URL;
10
+ };
11
+
8
12
  const makeBody = (params: BodyParams): Record<string, unknown> => {
9
13
  if (!params.chatCompletion) {
10
14
  throw new Error("OpenAI only supports chat completions.");
@@ -27,7 +31,7 @@ const makeUrl = (params: UrlParams): string => {
27
31
  };
28
32
 
29
33
  export const OPENAI_CONFIG: ProviderConfig = {
30
- baseUrl: OPENAI_API_BASE_URL,
34
+ makeBaseUrl,
31
35
  makeBody,
32
36
  makeHeaders,
33
37
  makeUrl,
@@ -14,10 +14,14 @@
14
14
  *
15
15
  * Thanks!
16
16
  */
17
- import type { ProviderConfig, UrlParams, HeaderParams, BodyParams } from "../types";
17
+ import type { BodyParams, HeaderParams, ProviderConfig, UrlParams } from "../types";
18
18
 
19
19
  export const REPLICATE_API_BASE_URL = "https://api.replicate.com";
20
20
 
21
+ const makeBaseUrl = (): string => {
22
+ return REPLICATE_API_BASE_URL;
23
+ };
24
+
21
25
  const makeBody = (params: BodyParams): Record<string, unknown> => {
22
26
  return {
23
27
  input: params.args,
@@ -39,7 +43,7 @@ const makeUrl = (params: UrlParams): string => {
39
43
  };
40
44
 
41
45
  export const REPLICATE_CONFIG: ProviderConfig = {
42
- baseUrl: REPLICATE_API_BASE_URL,
46
+ makeBaseUrl,
43
47
  makeBody,
44
48
  makeHeaders,
45
49
  makeUrl,
@@ -14,10 +14,14 @@
14
14
  *
15
15
  * Thanks!
16
16
  */
17
- import type { ProviderConfig, UrlParams, HeaderParams, BodyParams } from "../types";
17
+ import type { BodyParams, HeaderParams, ProviderConfig, UrlParams } from "../types";
18
18
 
19
19
  const SAMBANOVA_API_BASE_URL = "https://api.sambanova.ai";
20
20
 
21
+ const makeBaseUrl = (): string => {
22
+ return SAMBANOVA_API_BASE_URL;
23
+ };
24
+
21
25
  const makeBody = (params: BodyParams): Record<string, unknown> => {
22
26
  return {
23
27
  ...params.args,
@@ -37,7 +41,7 @@ const makeUrl = (params: UrlParams): string => {
37
41
  };
38
42
 
39
43
  export const SAMBANOVA_CONFIG: ProviderConfig = {
40
- baseUrl: SAMBANOVA_API_BASE_URL,
44
+ makeBaseUrl,
41
45
  makeBody,
42
46
  makeHeaders,
43
47
  makeUrl,
@@ -14,10 +14,14 @@
14
14
  *
15
15
  * Thanks!
16
16
  */
17
- import type { ProviderConfig, UrlParams, HeaderParams, BodyParams } from "../types";
17
+ import type { BodyParams, HeaderParams, ProviderConfig, UrlParams } from "../types";
18
18
 
19
19
  const TOGETHER_API_BASE_URL = "https://api.together.xyz";
20
20
 
21
+ const makeBaseUrl = (): string => {
22
+ return TOGETHER_API_BASE_URL;
23
+ };
24
+
21
25
  const makeBody = (params: BodyParams): Record<string, unknown> => {
22
26
  return {
23
27
  ...params.args,
@@ -43,7 +47,7 @@ const makeUrl = (params: UrlParams): string => {
43
47
  };
44
48
 
45
49
  export const TOGETHER_CONFIG: ProviderConfig = {
46
- baseUrl: TOGETHER_API_BASE_URL,
50
+ makeBaseUrl,
47
51
  makeBody,
48
52
  makeHeaders,
49
53
  makeUrl,
@@ -5,17 +5,13 @@ import { omit } from "../../utils/omit";
5
5
  import { isUrl } from "../../lib/isUrl";
6
6
  import { InferenceOutputError } from "../../lib/InferenceOutputError";
7
7
  import { typedInclude } from "../../utils/typedInclude";
8
+ import { makeRequestOptions } from "../../lib/makeRequestOptions";
9
+ import { pollFalResponse, type FalAiQueueOutput } from "../../providers/fal-ai";
8
10
 
9
11
  export type TextToVideoArgs = BaseArgs & TextToVideoInput;
10
12
 
11
13
  export type TextToVideoOutput = Blob;
12
14
 
13
- interface FalAiOutput {
14
- video: {
15
- url: string;
16
- };
17
- }
18
-
19
15
  interface ReplicateOutput {
20
16
  output: string;
21
17
  }
@@ -39,25 +35,13 @@ export async function textToVideo(args: TextToVideoArgs, options?: Options): Pro
39
35
  args.provider === "fal-ai" || args.provider === "replicate" || args.provider === "novita"
40
36
  ? { ...omit(args, ["inputs", "parameters"]), ...args.parameters, prompt: args.inputs }
41
37
  : args;
42
- const res = await request<FalAiOutput | ReplicateOutput | NovitaOutput>(payload, {
38
+ const res = await request<FalAiQueueOutput | ReplicateOutput | NovitaOutput>(payload, {
43
39
  ...options,
44
40
  task: "text-to-video",
45
41
  });
46
42
  if (args.provider === "fal-ai") {
47
- const isValidOutput =
48
- typeof res === "object" &&
49
- !!res &&
50
- "video" in res &&
51
- typeof res.video === "object" &&
52
- !!res.video &&
53
- "url" in res.video &&
54
- typeof res.video.url === "string" &&
55
- isUrl(res.video.url);
56
- if (!isValidOutput) {
57
- throw new InferenceOutputError("Expected { video: { url: string } }");
58
- }
59
- const urlResponse = await fetch((res as FalAiOutput).video.url);
60
- return await urlResponse.blob();
43
+ const { url, info } = await makeRequestOptions(args, { ...options, task: "text-to-video" });
44
+ return await pollFalResponse(res as FalAiQueueOutput, url, info.headers as Record<string, string>);
61
45
  } else if (args.provider === "novita") {
62
46
  const isValidOutput =
63
47
  typeof res === "object" &&
package/src/types.ts CHANGED
@@ -94,19 +94,22 @@ export type RequestArgs = BaseArgs &
94
94
  };
95
95
 
96
96
  export interface ProviderConfig {
97
- baseUrl: string;
97
+ makeBaseUrl: ((task?: InferenceTask) => string) | (() => string);
98
98
  makeBody: (params: BodyParams) => Record<string, unknown>;
99
99
  makeHeaders: (params: HeaderParams) => Record<string, string>;
100
100
  makeUrl: (params: UrlParams) => string;
101
101
  clientSideRoutingOnly?: boolean;
102
102
  }
103
103
 
104
+ export type AuthMethod = "none" | "hf-token" | "credentials-include" | "provider-key";
105
+
104
106
  export interface HeaderParams {
105
107
  accessToken?: string;
106
- authMethod: "none" | "hf-token" | "credentials-include" | "provider-key";
108
+ authMethod: AuthMethod;
107
109
  }
108
110
 
109
111
  export interface UrlParams {
112
+ authMethod: AuthMethod;
110
113
  baseUrl: string;
111
114
  model: string;
112
115
  task?: InferenceTask;