huggingface/hf-hub
GitHub: huggingface/hf-hub
Stars: 304 | Forks: 113
# hf-hub
Rust client for the [Hugging Face Hub API](https://huggingface.co/docs/hub/api).
`hf-hub` provides a typed, ergonomic interface for interacting with the Hugging Face Hub from Rust. It is the Rust equivalent of the Python [`huggingface_hub`](https://github.com/huggingface/huggingface_hub) library.
Both an **async** interface (`HFClient`, on by default) and a **synchronous** interface (`HFClientSync`, enabled via the `blocking` feature) are provided. The two mirror each other method-for-method.
## Features
- **Repository operations** — query model, dataset, and space metadata; create, delete, update, and move repositories
- **File operations** — upload files and folders, download files, list repository trees, check file existence
- **Commit operations** — create commits with multiple file operations, list commit history, view diffs between revisions
- **Branch and tag management** — create and delete branches and tags, list refs
- **User and organization info** — whoami, user profiles, organization details, followers
- **Streaming pagination** — async list endpoints return `impl Stream- >` for lazy, memory-efficient iteration; blocking counterparts collect into `Vec
`
- **Bucket operations** — create, delete, list, and move buckets; upload, download, and delete files within buckets
- **Xet high-performance transfers** — support for Hugging Face's Xet storage backend
- **Async or blocking** — use `HFClient` with your own tokio runtime, or `HFClientSync` for synchronous callers (requires the `blocking` feature)
## Installation
Add to your `Cargo.toml`:
[dependencies]
hf-hub = "1.0.0"
To use the synchronous interface, enable the `blocking` feature:
[dependencies]
hf-hub = { version = "1.0.0", features = ["blocking"] }
## CLI Installation
The `hfrs` command-line tool provides a terminal interface to the Hub. Install it with:
cargo install --git https://github.com/huggingface/hf-hub.git hfrs
This builds in release mode by default. Once installed, run `hfrs --help` to see available commands.
## Quick Start
### Async
use hf_hub::HFClient;
use hf_hub::repository::RepoInfo;
#[tokio::main]
async fn main() -> hf_hub::HFResult<()> {
let client = HFClient::new()?;
// Get model info
let RepoInfo::Model(info) = client
.model("openai-community", "gpt2")
.info()
.send()
.await?
else {
unreachable!("handle type guarantees the Model variant");
};
println!("Model: {} (downloads: {:?})", info.id, info.downloads);
Ok(())
}
### Blocking
Requires the `blocking` feature. `HFClientSync` manages a dedicated tokio runtime internally, so callers do not need their own.
use hf_hub::HFClientSync;
use hf_hub::repository::RepoInfo;
fn main() -> hf_hub::HFResult<()> {
let client = HFClientSync::new()?;
let RepoInfo::Model(info) = client
.model("openai-community", "gpt2")
.info()
.send()?
else {
unreachable!("handle type guarantees the Model variant");
};
println!("Model: {} (downloads: {:?})", info.id, info.downloads);
Ok(())
}
The blocking handles (`HFClientSync`, `HFRepositorySync`, `HFSpaceSync`, `HFBucketSync`) mirror their async counterparts method-for-method. See the `blocking_*` examples in `examples/` for runnable programs.
## Usage Examples
### List models by author
use futures::StreamExt;
use hf_hub::HFClient;
#[tokio::main]
async fn main() -> hf_hub::HFResult<()> {
let client = HFClient::new()?;
let stream = client
.list_models()
.author("meta-llama")
.limit(5_usize)
.send()?;
futures::pin_mut!(stream);
while let Some(model) = stream.next().await {
let model = model?;
println!("{}", model.id);
}
Ok(())
}
### Work with a repository handle
use hf_hub::HFClient;
use hf_hub::repository::RepoInfo;
#[tokio::main]
async fn main() -> hf_hub::HFResult<()> {
let client = HFClient::new()?;
let repo = client.model("openai-community", "gpt2");
let RepoInfo::Model(model_info) = repo.info().send().await? else {
println!("error, not a model");
return Ok(());
};
println!("Model: {}", model_info.id);
let exists = repo
.file_exists()
.filename("config.json")
.send()
.await?;
println!("config.json exists: {exists}");
Ok(())
}
### Download a file
use std::path::PathBuf;
use hf_hub::HFClient;
#[tokio::main]
async fn main() -> hf_hub::HFResult<()> {
let client = HFClient::new()?;
let repo = client.model("openai-community", "gpt2");
let path = repo
.download_file()
.filename("config.json")
.local_dir(PathBuf::from("/tmp/hf-downloads"))
.send()
.await?;
println!("Downloaded to: {}", path.display());
Ok(())
}
### Upload a file
use hf_hub::HFClient;
use hf_hub::repository::AddSource;
#[tokio::main]
async fn main() -> hf_hub::HFResult<()> {
let client = HFClient::new()?;
let repo = client.model("your-username", "your-repo");
let commit = repo
.upload_file()
.source(AddSource::Bytes(b"Hello, world!".to_vec()))
.path_in_repo("greeting.txt")
.commit_message("Add greeting file")
.send()
.await?;
println!("Committed: {:?}", commit.oid);
Ok(())
}
### Create a repository
use hf_hub::HFClient;
#[tokio::main]
async fn main() -> hf_hub::HFResult<()> {
let client = HFClient::new()?;
let url = client
.create_repo()
.repo_id("your-username/new-model")
.private(true)
.exist_ok(true)
.send()
.await?;
println!("Repository URL: {}", url.url);
Ok(())
}
## Authentication
The client resolves authentication tokens in this order:
1. Explicit token via `HFClientBuilder::token()`
2. `HF_TOKEN` environment variable
3. Token file at the path specified by `HF_TOKEN_PATH`
4. Default token file at `~/.cache/huggingface/token`
Set `HF_HUB_DISABLE_IMPLICIT_TOKEN` to any non-empty value to disable automatic token resolution.
## Configuration
| Environment Variable | Description |
|---------------------------------|--------------------------------------------------------|
| `HF_ENDPOINT` | Hub API endpoint (default: `https://huggingface.co`) |
| `HF_TOKEN` | Authentication token |
| `HF_TOKEN_PATH` | Path to token file |
| `HF_HOME` | Cache directory root (default: `~/.cache/huggingface`) |
| `HF_HUB_DISABLE_IMPLICIT_TOKEN` | Disable automatic token loading |
| `HF_HUB_USER_AGENT_ORIGIN` | Custom User-Agent origin string |
## Error Handling
All fallible operations return `Result`. The `HFError` enum provides structured variants for common failure modes:
- `HFError::AuthRequired` — 401 response, token is missing or invalid
- `HFError::RepoNotFound` — repository does not exist or is inaccessible
- `HFError::BucketNotFound` — bucket does not exist or is inaccessible
- `HFError::EntryNotFound` — file or path does not exist in the repository or bucket
- `HFError::RevisionNotFound` — branch, tag, or commit does not exist
- `HFError::Forbidden` — 403 response, insufficient permissions
- `HFError::Conflict` — 409 response, resource already exists or conflicts
- `HFError::RateLimited` — 429 response, too many requests
- `HFError::Http` — other HTTP errors with status code, URL, and response body
## License
Apache-2.0
标签:通知系统