Spaces:
Running
on
CPU Upgrade
Running
on
CPU Upgrade
| import type { InferenceTask, Options, RequestArgs } from "../types"; | |
| import { HF_HUB_URL } from "./getDefaultTask"; | |
| import { isUrl } from "./isUrl"; | |
| const HF_INFERENCE_API_BASE_URL = "https://api-inference.huggingface.co"; | |
| /** | |
| * Loaded from huggingface.co/api/tasks if needed | |
| */ | |
| let tasks: Record<string, { models: { id: string }[] }> | null = null; | |
| /** | |
| * Helper that prepares request arguments | |
| */ | |
| export async function makeRequestOptions( | |
| args: RequestArgs & { | |
| data?: Blob | ArrayBuffer; | |
| stream?: boolean; | |
| }, | |
| options?: Options & { | |
| /** When a model can be used for multiple tasks, and we want to run a non-default task */ | |
| forceTask?: string | InferenceTask; | |
| /** To load default model if needed */ | |
| taskHint?: InferenceTask; | |
| } | |
| ): Promise<{ url: string; info: RequestInit }> { | |
| // eslint-disable-next-line @typescript-eslint/no-unused-vars | |
| const { accessToken, model: _model, ...otherArgs } = args; | |
| let { model } = args; | |
| const { | |
| forceTask: task, | |
| includeCredentials, | |
| taskHint, | |
| wait_for_model, | |
| use_cache, | |
| dont_load_model, | |
| ...otherOptions | |
| } = options ?? {}; | |
| const headers: Record<string, string> = {}; | |
| if (accessToken) { | |
| headers["Authorization"] = `Bearer ${accessToken}`; | |
| } | |
| if (!model && !tasks && taskHint) { | |
| const res = await fetch(`${HF_HUB_URL}/api/tasks`); | |
| if (res.ok) { | |
| tasks = await res.json(); | |
| } | |
| } | |
| if (!model && tasks && taskHint) { | |
| const taskInfo = tasks[taskHint]; | |
| if (taskInfo) { | |
| model = taskInfo.models[0].id; | |
| } | |
| } | |
| if (!model) { | |
| throw new Error("No model provided, and no default model found for this task"); | |
| } | |
| const binary = "data" in args && !!args.data; | |
| if (!binary) { | |
| headers["Content-Type"] = "application/json"; | |
| } | |
| if (wait_for_model) { | |
| headers["X-Wait-For-Model"] = "true"; | |
| } | |
| if (use_cache === false) { | |
| headers["X-Use-Cache"] = "false"; | |
| } | |
| if (dont_load_model) { | |
| headers["X-Load-Model"] = "0"; | |
| } | |
| const url = (() => { | |
| if (isUrl(model)) { | |
| return model; | |
| } | |
| if (task) { | |
| return `${HF_INFERENCE_API_BASE_URL}/pipeline/${task}/${model}`; | |
| } | |
| return `${HF_INFERENCE_API_BASE_URL}/models/${model}`; | |
| })(); | |
| /** | |
| * For edge runtimes, leave 'credentials' undefined, otherwise cloudflare workers will error | |
| */ | |
| let credentials: RequestCredentials | undefined; | |
| if (typeof includeCredentials === "string") { | |
| credentials = includeCredentials as RequestCredentials; | |
| } else if (includeCredentials === true) { | |
| credentials = "include"; | |
| } | |
| const info: RequestInit = { | |
| headers, | |
| method: "POST", | |
| body: binary | |
| ? args.data | |
| : JSON.stringify({ | |
| ...otherArgs, | |
| options: options && otherOptions, | |
| }), | |
| ...(credentials && { credentials }), | |
| signal: options?.signal, | |
| }; | |
| return { url, info }; | |
| } | |