@huggingface/hub
Version:
Utilities to interact with the Hugging Face hub
66 lines (61 loc) • 1.8 kB
text/typescript
import { HUB_URL } from "../consts";
import { createApiError } from "../error";
import type { CredentialsParams, RepoDesignation } from "../types/public";
import { checkCredentials } from "../utils/checkCredentials";
import { toRepoId } from "../utils/toRepoId";
/**
* @returns null when the file doesn't exist
*/
export async function downloadFile(
params: {
repo: RepoDesignation;
path: string;
/**
* If true, will download the raw git file.
*
* For example, when calling on a file stored with Git LFS, the pointer file will be downloaded instead.
*/
raw?: boolean;
/**
* An optional Git revision id which can be a branch name, a tag, or a commit hash.
*
* @default "main"
*/
revision?: string;
/**
* Fetch only a specific part of the file
*/
range?: [number, number];
hubUrl?: string;
/**
* Custom fetch function to use instead of the default one, for example to use a proxy or edit headers.
*/
fetch?: typeof fetch;
} & Partial<CredentialsParams>
): Promise<Response | null> {
const accessToken = checkCredentials(params);
const repoId = toRepoId(params.repo);
const url = `${params.hubUrl ?? HUB_URL}/${repoId.type === "model" ? "" : `${repoId.type}s/`}${repoId.name}/${
params.raw ? "raw" : "resolve"
}/${encodeURIComponent(params.revision ?? "main")}/${params.path}`;
const resp = await (params.fetch ?? fetch)(url, {
headers: {
...(accessToken
? {
Authorization: `Bearer ${accessToken}`,
}
: {}),
...(params.range
? {
Range: `bytes=${params.range[0]}-${params.range[1]}`,
}
: {}),
},
});
if (resp.status === 404 && resp.headers.get("X-Error-Code") === "EntryNotFound") {
return null;
} else if (!resp.ok) {
throw await createApiError(resp);
}
return resp;
}