|
|
"use strict"; |
|
|
Object.defineProperty(exports, "__esModule", { value: true }); |
|
|
exports.makeRequestOptions = makeRequestOptions; |
|
|
exports.makeRequestOptionsFromResolvedModel = makeRequestOptionsFromResolvedModel; |
|
|
const config_js_1 = require("../config.js"); |
|
|
const package_js_1 = require("../package.js"); |
|
|
const getInferenceProviderMapping_js_1 = require("./getInferenceProviderMapping.js"); |
|
|
const isUrl_js_1 = require("./isUrl.js"); |
|
|
const errors_js_1 = require("../errors.js"); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
let tasks = null; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
async function makeRequestOptions(args, providerHelper, options) { |
|
|
const { model: maybeModel } = args; |
|
|
const provider = providerHelper.provider; |
|
|
const { task } = options ?? {}; |
|
|
|
|
|
if (args.endpointUrl && provider !== "hf-inference") { |
|
|
throw new errors_js_1.InferenceClientInputError(`Cannot use endpointUrl with a third-party provider.`); |
|
|
} |
|
|
if (maybeModel && (0, isUrl_js_1.isUrl)(maybeModel)) { |
|
|
throw new errors_js_1.InferenceClientInputError(`Model URLs are no longer supported. Use endpointUrl instead.`); |
|
|
} |
|
|
if (args.endpointUrl) { |
|
|
|
|
|
return makeRequestOptionsFromResolvedModel(maybeModel ?? args.endpointUrl, providerHelper, args, undefined, options); |
|
|
} |
|
|
if (!maybeModel && !task) { |
|
|
throw new errors_js_1.InferenceClientInputError("No model provided, and no task has been specified."); |
|
|
} |
|
|
|
|
|
const hfModel = maybeModel ?? (await loadDefaultModel(task)); |
|
|
if (providerHelper.clientSideRoutingOnly && !maybeModel) { |
|
|
throw new errors_js_1.InferenceClientInputError(`Provider ${provider} requires a model ID to be passed directly.`); |
|
|
} |
|
|
const inferenceProviderMapping = providerHelper.clientSideRoutingOnly |
|
|
? { |
|
|
|
|
|
providerId: removeProviderPrefix(maybeModel, provider), |
|
|
|
|
|
hfModelId: maybeModel, |
|
|
status: "live", |
|
|
|
|
|
task: task, |
|
|
} |
|
|
: await (0, getInferenceProviderMapping_js_1.getInferenceProviderMapping)({ |
|
|
modelId: hfModel, |
|
|
|
|
|
task: task, |
|
|
provider, |
|
|
accessToken: args.accessToken, |
|
|
}, { fetch: options?.fetch }); |
|
|
if (!inferenceProviderMapping) { |
|
|
throw new errors_js_1.InferenceClientInputError(`We have not been able to find inference provider information for model ${hfModel}.`); |
|
|
} |
|
|
|
|
|
return makeRequestOptionsFromResolvedModel(inferenceProviderMapping.providerId, providerHelper, args, inferenceProviderMapping, options); |
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
function makeRequestOptionsFromResolvedModel(resolvedModel, providerHelper, args, mapping, options) { |
|
|
const { accessToken, endpointUrl, provider: maybeProvider, model, ...remainingArgs } = args; |
|
|
void model; |
|
|
void maybeProvider; |
|
|
const provider = providerHelper.provider; |
|
|
const { includeCredentials, task, signal, billTo } = options ?? {}; |
|
|
const authMethod = (() => { |
|
|
if (providerHelper.clientSideRoutingOnly) { |
|
|
|
|
|
if (accessToken && accessToken.startsWith("hf_")) { |
|
|
throw new errors_js_1.InferenceClientInputError(`Provider ${provider} is closed-source and does not support HF tokens.`); |
|
|
} |
|
|
} |
|
|
if (accessToken) { |
|
|
return accessToken.startsWith("hf_") ? "hf-token" : "provider-key"; |
|
|
} |
|
|
if (includeCredentials === "include") { |
|
|
|
|
|
return "credentials-include"; |
|
|
} |
|
|
return "none"; |
|
|
})(); |
|
|
|
|
|
const modelId = endpointUrl ?? resolvedModel; |
|
|
const url = providerHelper.makeUrl({ |
|
|
authMethod, |
|
|
model: modelId, |
|
|
task, |
|
|
}); |
|
|
|
|
|
const headers = providerHelper.prepareHeaders({ |
|
|
accessToken, |
|
|
authMethod, |
|
|
}, "data" in args && !!args.data); |
|
|
if (billTo) { |
|
|
headers[config_js_1.HF_HEADER_X_BILL_TO] = billTo; |
|
|
} |
|
|
|
|
|
|
|
|
const ownUserAgent = `${package_js_1.PACKAGE_NAME}/${package_js_1.PACKAGE_VERSION}`; |
|
|
const userAgent = [ownUserAgent, typeof navigator !== "undefined" ? navigator.userAgent : undefined] |
|
|
.filter((x) => x !== undefined) |
|
|
.join(" "); |
|
|
headers["User-Agent"] = userAgent; |
|
|
|
|
|
const body = providerHelper.makeBody({ |
|
|
args: remainingArgs, |
|
|
model: resolvedModel, |
|
|
task, |
|
|
mapping, |
|
|
}); |
|
|
|
|
|
|
|
|
|
|
|
let credentials; |
|
|
if (typeof includeCredentials === "string") { |
|
|
credentials = includeCredentials; |
|
|
} |
|
|
else if (includeCredentials === true) { |
|
|
credentials = "include"; |
|
|
} |
|
|
const info = { |
|
|
headers, |
|
|
method: "POST", |
|
|
body: body, |
|
|
...(credentials ? { credentials } : undefined), |
|
|
signal, |
|
|
}; |
|
|
return { url, info }; |
|
|
} |
|
|
async function loadDefaultModel(task) { |
|
|
if (!tasks) { |
|
|
tasks = await loadTaskInfo(); |
|
|
} |
|
|
const taskInfo = tasks[task]; |
|
|
if ((taskInfo?.models.length ?? 0) <= 0) { |
|
|
throw new errors_js_1.InferenceClientInputError(`No default model defined for task ${task}, please define the model explicitly.`); |
|
|
} |
|
|
return taskInfo.models[0].id; |
|
|
} |
|
|
async function loadTaskInfo() { |
|
|
const url = `${config_js_1.HF_HUB_URL}/api/tasks`; |
|
|
const res = await fetch(url); |
|
|
if (!res.ok) { |
|
|
throw new errors_js_1.InferenceClientHubApiError("Failed to load tasks definitions from Hugging Face Hub.", { url, method: "GET" }, { requestId: res.headers.get("x-request-id") ?? "", status: res.status, body: await res.text() }); |
|
|
} |
|
|
return await res.json(); |
|
|
} |
|
|
function removeProviderPrefix(model, provider) { |
|
|
if (!model.startsWith(`${provider}/`)) { |
|
|
throw new errors_js_1.InferenceClientInputError(`Models from ${provider} must be prefixed by "${provider}/". Got "${model}".`); |
|
|
} |
|
|
return model.slice(provider.length + 1); |
|
|
} |
|
|
|