inference-server
Version:
Libraries and server to build AI applications. Adapters to various native bindings allowing local inference. Integrate it with your application, or use as a microservice.
58 lines • 2.2 kB
JavaScript
import { downloadFile as createFileDownload } from 'ipull';
import fs from 'node:fs';
import path from 'node:path';
import { resolveModelFileLocation } from '../lib/resolveModelFileLocation.js';
export async function downloadModelFile({ url, filePath, modelsCachePath, onProgress, signal }) {
let downloadUrl = url;
const parsedUrl = new URL(url);
if (parsedUrl.hostname === 'huggingface.co') {
// TODO support auth headers
// https://ido-pluto.github.io/ipull/#md:custom-headers
const pathnameParts = parsedUrl.pathname.split('/');
if (pathnameParts.length > 3 && pathnameParts[3] === 'blob') {
const newUrl = new URL(url);
pathnameParts[3] = 'resolve';
newUrl.pathname = pathnameParts.join('/');
if (newUrl.searchParams.get('download') !== 'true') {
newUrl.searchParams.set('download', 'true');
}
downloadUrl = newUrl.href;
}
}
const destinationFile = resolveModelFileLocation({
url: downloadUrl,
filePath,
modelsCachePath,
});
fs.mkdirSync(path.dirname(destinationFile), { recursive: true });
// TODO split gguf file support, could regex filename and download the rest
// see https://ido-pluto.github.io/ipull/#md:download-file-from-parts
const controller = await createFileDownload({
url: downloadUrl,
savePath: destinationFile,
skipExisting: true,
});
let partialBytes = 0;
if (fs.existsSync(destinationFile)) {
partialBytes = fs.statSync(destinationFile).size;
}
const progressInterval = setInterval(() => {
if (onProgress) {
onProgress({
file: destinationFile,
loadedBytes: controller.status.transferredBytes + partialBytes,
totalBytes: controller.status.totalBytes,
});
}
}, 3000);
if (signal) {
signal.addEventListener('abort', () => {
controller.close();
});
}
await controller.download();
if (progressInterval) {
clearInterval(progressInterval);
}
}
//# sourceMappingURL=downloadModelFile.js.map