Huggingface.js documentation

đŸ€— API du Hugging Face Hub

Hugging Face's logo
Join the Hugging Face community

and get access to the augmented documentation experience

to get started

đŸ€— API du Hugging Face Hub

Utilitaires officiels pour utiliser l’API du Hugging Face Hub.

Installer

pnpm add @huggingface/hub

npm add @huggingface/hub

yarn add @huggingface/hub

Deno

// esm.sh
import { uploadFiles, listModels } from "https://esm.sh/@huggingface/hub"
// or npm:
import { uploadFiles, listModels } from "npm:@huggingface/hub"

Utilisation

Pour certains appels, vous devez créer un compte et générer un jeton d'accÚs.

Apprenez Ă  trouver des modĂšles gratuits Ă  l'aide du package hub dans ce tutoriel interactif.

import * as hub from "@huggingface/hub";
import type { RepoDesignation } from "@huggingface/hub";

const repo: RepoDesignation = { type: "model", name: "myname/some-model" };

const {name: username} = await hub.whoAmI({accessToken: "hf_..."});

for await (const model of hub.listModels({search: {owner: username}, accessToken: "hf_..."})) {
  console.log("My model:", model);
}

const specificModel = await hub.modelInfo({name: "openai-community/gpt2"});
await hub.checkRepoAccess({repo, accessToken: "hf_..."});

await hub.createRepo({ repo, accessToken: "hf_...", license: "mit" });

await hub.uploadFiles({
  repo,
  accessToken: "hf_...",
  files: [
    // path + blob content
    {
      path: "file.txt",
      content: new Blob(["Hello World"]),
    },
    // Local file URL
    pathToFileURL("./pytorch-model.bin"),
    // Local folder URL
    pathToFileURL("./models"),
    // Web URL
    new URL("https://huggingface.co/xlm-roberta-base/resolve/main/tokenizer.json"),
    // Path + Web URL
    {
      path: "myfile.bin",
      content: new URL("https://huggingface.co/bert-base-uncased/resolve/main/pytorch_model.bin")
    }
    // Can also work with native File in browsers
  ],
});

// or

for await (const progressEvent of await hub.uploadFilesWithProgress({
  repo,
  accessToken: "hf_...",
  files: [
    ...
  ],
})) {
  console.log(progressEvent);
}

// Edit a file in place, without downloading/uploading its unchanged data
const file = await hub.downloadFile({ repo, path: "myfile.bin", accessToken: "hf_..." });
await hub.uploadFile({
  repo,
  accessToken: "hf_...",
  file: {
    path: "myfile.bin",
    originalContent: file,
    edits: [{
      // Replace bytes [0, 4)
      start: 0,
      end: 4,
      content: new Blob(["new prefix"])
    }, {
      // Append at the end
      start: file.size,
      end: file.size,
      content: new Blob(["suffix"])
    }]
  }
});

await hub.deleteFile({repo, accessToken: "hf_...", path: "myfile.bin"});

await (await hub.downloadFile({ repo, path: "README.md" })).text();

for await (const fileInfo of hub.listFiles({repo})) {
  console.log(fileInfo);
}

await hub.deleteRepo({ repo, accessToken: "hf_..." });

Buckets

Les buckets de stockage sont des espaces de stockage mutables et non versionnĂ©s sur le Hub. Utilisez un prĂ©fixe buckets/ (ou { type: "bucket", name }) avec les mĂȘmes fonctions :

const bucket = "buckets/myname/my-bucket";

await hub.createRepo({ repo: bucket, accessToken: "hf_..." });

await hub.uploadFiles({ repo: bucket, accessToken: "hf_...", files: [pathToFileURL("./checkpoints")] });

for await (const fileInfo of hub.listFiles({ repo: bucket, recursive: true, accessToken: "hf_..." })) {
  console.log(fileInfo.path, fileInfo.uploadedAt);
}

// Copy files from a model or dataset repo into a bucket server-side, without downloading them
await hub.copyFolder({
  source: { repo: { type: "dataset", name: "myname/my-dataset" }, path: "data" },
  destination: { repo: bucket, path: "data" },
  accessToken: "hf_...",
});

Utilisation de l'interface en ligne de commande

Vous pouvez utiliser @huggingface/hub en mode CLI pour téléverser et télécharger des fichiers et des dossiers vers/depuis votre dépÎt.

npx @huggingface/hub upload coyotte508/test-model .
npx @huggingface/hub upload datasets/coyotte508/test-dataset .
# Same thing
npx @huggingface/hub upload --repo-type dataset coyotte508/test-dataset .
# Upload new data with 0 history in a separate branch
npx @huggingface/hub branch create coyotte508/test-model release --empty
npx @huggingface/hub upload coyotte508/test-model . --revision release

# Download files to the current directory (or --local-dir)
npx @huggingface/hub download coyotte508/test-model config.json
npx @huggingface/hub download coyotte508/test-model config.json README.md --local-dir ./test-model
# Download an entire repo, optionally filtered with --include / --exclude
npx @huggingface/hub download coyotte508/test-model --local-dir ./test-model
npx @huggingface/hub download --repo-type dataset coyotte508/test-dataset --include "*.json"

npx @huggingface/hub --help
npx @huggingface/hub upload --help
npx @huggingface/hub download --help

Vous pouvez également l'installer globalement avec npm install -g @huggingface/hub. Vous pouvez ensuite faire :

hfjs upload coyotte508/test-model .

hfjs branch create --repo-type dataset coyotte508/test-dataset release --empty
hfjs upload --repo-type dataset coyotte508/test-dataset . --revision release

hfjs download coyotte508/test-model config.json
hfjs download coyotte508/test-model --local-dir ./test-model

hfjs --help
hfjs  upload --help

hfjs help jobs
hfjs download --help

Connexion OAuth

Il est possible de se connecter en utilisant OAuth (« Se connecter avec HF »).

Cela vous permettra d’obtenir un jeton d’accĂšs pour utiliser certaines parties de l’API, en fonction des Ă©tendues dĂ©finies dans l’espace ou l’application OAuth.

import { oauthLoginUrl, oauthHandleRedirectIfPresent } from "@huggingface/hub";

const oauthResult = await oauthHandleRedirectIfPresent();

if (!oauthResult) {
  // If the user is not logged in, redirect to the login page
  window.location.href = await oauthLoginUrl();
}

// You can use oauthResult.accessToken, oauthResult.accessTokenExpiresAt and oauthResult.userInfo
console.log(oauthResult);

Consultez la démo : https://huggingface.co/spaces/huggingfacejs/client-side-oauth

Cache Hugging Face

Le package @huggingface/hub fournit des fonctionnalités de base pour analyser le répertoire de cache. En savoir plus sur Manage huggingface_hub cache-system.

scanCacheDir

Vous pouvez obtenir la liste des dépÎts en cache à l'aide de la fonction scanCacheDir.

import { scanCacheDir } from "@huggingface/hub";

const result = await scanCacheDir();

console.log(result);

Note : cela ne fonctionne pas dans le navigateur

downloadFileToCacheDir

Vous pouvez mettre en cache un fichier d'un dépÎt à l'aide de la fonction downloadFileToCacheDir.

import { downloadFileToCacheDir } from "@huggingface/hub";

const file = await downloadFileToCacheDir({
  repo: 'foo/bar',
  path: 'README.md'
});

console.log(file);

Note : cela ne fonctionne pas dans le navigateur

snapshotDownload

Vous pouvez télécharger un dépÎt entier à une révision donnée dans le répertoire de cache à l'aide de la fonction snapshotDownload.

import { snapshotDownload } from "@huggingface/hub";

const directory = await snapshotDownload({
  repo: 'foo/bar',
});

console.log(directory);

Le code utilise en interne la fonction downloadFileToCacheDir.

Note : cela ne fonctionne pas dans le navigateur

Considérations relatives aux performances

Lors de la téléversement de fichiers volumineux, vous pouvez exécuter les appels commit dans un worker afin de déléguer les calculs sha256.

Les ressources distantes et les fichiers locaux doivent ĂȘtre passĂ©s sous forme de URL chaque fois que c’est possible, afin qu’ils puissent ĂȘtre chargĂ©s paresseusement par morceaux pour rĂ©duire l’utilisation de la RAM. Passer un File dans le contexte du navigateur est acceptable, car il se comporte nativement comme un Blob.

En interne, @huggingface/hub utilise une implémentation de blob paresseuse pour charger le fichier.

Pour modifier un fichier existant, privilĂ©giez une opĂ©ration de commit edit en utilisant le blob renvoyĂ© par downloadFile comme originalContent : seules les rĂ©gions modifiĂ©es sont tĂ©lĂ©chargĂ©es, re-chunkĂ©es et hachĂ©es. Pour des ajouts rĂ©pĂ©tĂ©s au mĂȘme fichier, passez un rangeEditCache: new Map() partagĂ© aux appels commit afin d’éviter Ă©galement les allers-retours de mĂ©tadonnĂ©es de stockage.

Dépendances

  • @huggingface/tasks : Typages uniquement
Update on GitHub