UNPKG

@huggingface/inference

Version:

Typescript client for the Hugging Face Inference Providers and Inference Endpoints

224 lines (223 loc) 8.67 kB
"use strict"; /** * 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;