@huggingface/inference
Version:
Typescript client for the Hugging Face Inference Providers and Inference Endpoints
224 lines (223 loc) • 8.67 kB
JavaScript
;
/**
* See the registered mapping of HF model ID => DeepInfra model ID here:
*
* https://huggingface.co/api/partners/deepinfra/models
*
* This is a publicly available mapping.
*
* If you want to try to run inference for a new model locally before
it's registered on huggingface.co,
* you can add it to the dictionary "HARDCODED_MODEL_ID_MAPPING" in
consts.ts, for dev purposes.
*
* - If you work at DeepInfra and want to update this mapping, please
use the model mapping API we provide on huggingface.co
* - If you're a community member and want to add a new supported HF
model to DeepInfra, please open an issue on the present repo
* and we will tag DeepInfra team members.
*
* Thanks!
*/
Object.defineProperty(exports, "__esModule", { value: true });
exports.DeepInfraFeatureExtractionTask = exports.DeepInfraTextToSpeechTask = exports.DeepInfraAutomaticSpeechRecognitionTask = exports.DeepInfraTextGenerationTask = exports.DeepInfraConversationalTask = void 0;
const errors_js_1 = require("../errors.js");
const omit_js_1 = require("../utils/omit.js");
const providerHelper_js_1 = require("./providerHelper.js");
/**
* DeepInfra exposes OpenAI-compatible endpoints under the /v1/openai namespace.
*/
const DEEPINFRA_API_BASE_URL = "https://api.deepinfra.com";
const AUDIO_MIME_TO_EXT = {
"audio/wav": "wav",
"audio/x-wav": "wav",
"audio/wave": "wav",
"audio/mpeg": "mp3",
"audio/mp3": "mp3",
"audio/mp4": "mp4",
"audio/m4a": "m4a",
"audio/x-m4a": "m4a",
"audio/flac": "flac",
"audio/x-flac": "flac",
"audio/ogg": "ogg",
"audio/webm": "webm",
};
function mimeTypeToExtension(mimeType) {
if (!mimeType) {
return "wav";
}
// Strip MIME parameters (e.g. `audio/webm;codecs=opus`) before lookup.
const baseType = mimeType.split(";")[0].trim().toLowerCase();
return AUDIO_MIME_TO_EXT[baseType] ?? "wav";
}
class DeepInfraConversationalTask extends providerHelper_js_1.BaseConversationalTask {
constructor() {
super("deepinfra", DEEPINFRA_API_BASE_URL);
}
makeRoute() {
return "v1/openai/chat/completions";
}
}
exports.DeepInfraConversationalTask = DeepInfraConversationalTask;
class DeepInfraTextGenerationTask extends providerHelper_js_1.BaseTextGenerationTask {
constructor() {
super("deepinfra", DEEPINFRA_API_BASE_URL);
}
makeRoute() {
return "v1/openai/completions";
}
preparePayload(params) {
const parameters = params.args.parameters;
const res = {
model: params.model,
prompt: params.args.inputs,
...(0, omit_js_1.omit)(params.args, ["inputs", "parameters"]),
...(parameters
? {
max_tokens: parameters.max_new_tokens,
...(0, omit_js_1.omit)(parameters, ["max_new_tokens"]),
}
: undefined),
};
return res;
}
async getResponse(response) {
if (typeof response === "object" &&
response !== null &&
Array.isArray(response.choices) &&
response.choices.length > 0) {
const completion = response.choices[0].text;
if (typeof completion === "string") {
return { generated_text: completion };
}
}
throw new errors_js_1.InferenceClientProviderOutputError("Received malformed response from DeepInfra text-generation API: expected OpenAI completion payload");
}
}
exports.DeepInfraTextGenerationTask = DeepInfraTextGenerationTask;
class DeepInfraAutomaticSpeechRecognitionTask extends providerHelper_js_1.TaskProviderHelper {
constructor() {
super("deepinfra", DEEPINFRA_API_BASE_URL);
}
makeRoute() {
return "v1/openai/audio/transcriptions";
}
preparePayload(params) {
return {
...(0, omit_js_1.omit)(params.args, ["inputs", "parameters", "data"]),
...params.args.parameters,
model: params.model,
};
}
makeBody(params) {
const audio = params.args.data;
const formData = new FormData();
if (audio instanceof Blob) {
formData.append("file", audio, `audio.${mimeTypeToExtension(audio.type)}`);
}
else {
throw new errors_js_1.InferenceClientInputError("DeepInfra automatic-speech-recognition expects a Blob audio input.");
}
const fields = this.preparePayload(params);
for (const [key, value] of Object.entries(fields)) {
if (value === undefined || value === null) {
continue;
}
if (typeof value === "string") {
formData.append(key, value);
}
else if (typeof value === "number" || typeof value === "boolean") {
formData.append(key, String(value));
}
else {
formData.append(key, JSON.stringify(value));
}
}
return formData;
}
async preparePayloadAsync(args) {
const audio = "data" in args ? args.data : args.inputs;
let data;
if (audio instanceof Blob) {
data = audio;
}
else if (audio instanceof ArrayBuffer) {
data = new Blob([audio]);
}
else {
throw new errors_js_1.InferenceClientInputError("DeepInfra automatic-speech-recognition expects a Blob or ArrayBuffer audio input.");
}
return {
...("data" in args ? (0, omit_js_1.omit)(args, "data") : (0, omit_js_1.omit)(args, "inputs")),
data,
};
}
async getResponse(response) {
if (typeof response === "object" && response !== null && typeof response.text === "string") {
const out = { text: response.text };
if (Array.isArray(response.segments)) {
out.chunks = response.segments.map((seg) => ({
text: seg.text,
timestamp: [seg.start, seg.end],
}));
}
return out;
}
throw new errors_js_1.InferenceClientProviderOutputError(`Received malformed response from DeepInfra automatic-speech-recognition API: ${JSON.stringify(response)}`);
}
}
exports.DeepInfraAutomaticSpeechRecognitionTask = DeepInfraAutomaticSpeechRecognitionTask;
class DeepInfraTextToSpeechTask extends providerHelper_js_1.TaskProviderHelper {
constructor() {
super("deepinfra", DEEPINFRA_API_BASE_URL);
}
makeRoute() {
return "v1/openai/audio/speech";
}
preparePayload(params) {
// `model` is applied last so caller parameters cannot override the mapped provider model.
// `voice` is model-specific and optional; we pass it through untouched and let the API
// surface a clear error when a model requires one.
return {
...(0, omit_js_1.omit)(params.args, ["inputs", "parameters"]),
...params.args.parameters,
input: params.args.inputs,
model: params.model,
};
}
async getResponse(response) {
if (response instanceof Blob) {
return response;
}
throw new errors_js_1.InferenceClientProviderOutputError(`Received malformed response from DeepInfra text-to-speech API: ${JSON.stringify(response)}`);
}
}
exports.DeepInfraTextToSpeechTask = DeepInfraTextToSpeechTask;
class DeepInfraFeatureExtractionTask extends providerHelper_js_1.TaskProviderHelper {
constructor() {
super("deepinfra", DEEPINFRA_API_BASE_URL);
}
makeRoute() {
return "v1/openai/embeddings";
}
preparePayload(params) {
// `model` is applied last so caller parameters cannot override the mapped provider model.
return {
...(0, omit_js_1.omit)(params.args, ["inputs", "parameters"]),
...params.args.parameters,
input: params.args.inputs,
model: params.model,
};
}
async getResponse(response) {
if (typeof response === "object" &&
response !== null &&
"data" in response &&
Array.isArray(response.data) &&
response.data.every((item) => typeof item === "object" && !!item && Array.isArray(item.embedding))) {
return response.data.map((item) => item.embedding);
}
throw new errors_js_1.InferenceClientProviderOutputError(`Received malformed response from DeepInfra feature-extraction (embeddings) API: ${JSON.stringify(response)}`);
}
}
exports.DeepInfraFeatureExtractionTask = DeepInfraFeatureExtractionTask;