{"id":"prod_st2VQcLR8FY7V-tCIhTM-","name":"Hub","slug":"hub","orgId":"org_GDdYeYynEgCEBNBwy-m6s","url":null,"description":"Python client for the Hugging Face Hub API","category":"ai","kind":"platform","avatarUrl":null,"createdAt":"2026-04-10T16:07:03.759Z","embeddedAt":"2026-04-15T16:19:41.929Z","deletedAt":null,"sources":[{"id":"src_8CQoUZraeopI0Npl6YcHz","slug":"huggingface-hub","name":"huggingface_hub","type":"github","url":"https://github.com/huggingface/huggingface_hub","metadata":"{\"evaluatedMethod\":\"github\",\"evaluatedAt\":\"2026-04-07T17:19:15.148Z\",\"changelogDetectedAt\":\"2026-04-07T17:28:11.758Z\",\"wellKnownSweptAt\":\"2026-06-16T06:00:58.356Z\"}","kind":"sdk"}],"tags":["python","sdk"],"aliases":[],"notice":null,"releases":[{"id":"rel_oAA0LTWYN4yQR2eiQ83Vi","version":"v1.20.0","type":"feature","title":"[v1.20.0] Browser-based OAuth login, multi-commit folder uploads, and more","summary":"Browser-based OAuth Device Code flow is now the default login method, and hf upload uses a streamed multi-commit pipeline for faster, resumable large folder uploads. Also adds job wait commands, SSH access to running Jobs, and custom-container deployment for Inference Endpoints, with breaking changes around multi-commit uploads and non-detached job exit codes.","titleGenerated":"huggingface_hub v1.20.0 adds browser-based OAuth login and multi-commit folder uploads","titleShort":"Browser-based OAuth login; multi-commit folder uploads revamped","content":"## 🔒 Browser-based OAuth login\r\n\r\n`hf auth login` now defaults to a browser-based OAuth Device Code flow instead of asking you to copy-paste a token. The command prints a URL and a short code, you authorize in the browser, and the CLI retrieves and saves the token for you. The same applies to `login()` in Python. In an interactive terminal you still get a `gh`-style arrow-key menu to pick between browser login and pasting a token, and `--token` works exactly as before.\r\n\r\nOAuth tokens expire after 30 days, but they come with a refresh token: `get_token()` transparently refreshes them when less than a day of validity remains, so long-running setups keep working without re-authenticating. `hf auth list` now shows the expiry date for OAuth tokens.\r\n\r\n```bash\r\n> hf auth login\r\n? How would you like to log in? Log in with your browser\r\n\r\n    Open this URL in your browser:\r\n        https://hf.co/oauth/device\r\n\r\n    And enter the code: 52AT-FLYZ\r\n\r\n    Waiting for authorization.\r\n```\r\n\r\nWhen the command is run by an AI agent, it never prompts. Instead it streams structured events so the agent can surface the URL and code to its user, then blocks until a terminal `auth_success` / `auth_error` event:\r\n\r\n```console\r\n$ hf auth login --format json\r\n{\"event\": \"device_code\", \"verification_uri\": \"https://hf.co/oauth/device\", \"user_code\": \"52AT-FLYZ\", \"verification_uri_complete\": \"https://hf.co/oauth/device\", \"expires_in\": 300, \"interval\": 5}\r\n{\"event\": \"auth_success\", \"user\": \"celinah\", \"token_name\": \"oauth-celinah\"}\r\n```\r\n\r\n`hf auth list` surfaces the new expiry column:\r\n\r\n```console\r\n$ hf auth list\r\n  name          token       expires\r\n- ------------- ----------- -------------------\r\n  my-token      hf_****5678\r\n* oauth-user    hf_****1234 2026-07-09\r\n  oauth-old     hf_****9999 2026-06-09 (expired)\r\n```\r\n\r\nFinally, `notebook_login()` now renders the link and code with plain `IPython.display.HTML`, dropping the `ipywidgets` dependency.\r\n\r\n- [Auth] Browser-based OAuth login by @hanouticelina in #4354\r\n\r\n## ⚡ Faster, more reliable `hf upload` for large folders\r\n\r\n`hf upload` and the underlying `upload_folder` have been revamped to be faster and far more robust on large folders. When `hf_xet` is installed (the default), uploads now run through a streamed, multi-commit pipeline built on the `XetSession` API: the folder is scanned and fed into a background Xet upload while previous batches are committed in parallel, and files are hashed in a single read pass while they are chunked (the old flow read every large file twice). Nothing changes in how you call it:\r\n\r\n```bash\r\nhf upload <repo-id> <path/to/folder>\r\n```\r\n\r\nThis is a drop-in replacement for experimental `hf upload-large-folder` used until today, which will be **deprecated** in a future release.\r\n\r\n> 🚨🚨 **Breaking change:** With the `upload_folder` and `hf upload` revamp, uploading a folder might result in multiple commits. It is also not possible to open a PR against a specific revision while using `upload_folder`. If you pass `create_pr=True`, it will necessarily create a PR against main. It will open the PR no matter if some changes have been committed (previously an empty commit was resulting in no PR opened at all).\r\n\r\nWhat you get on large folders:\r\n\r\n- **More reliable.** Uploads are resumable and stateless. If an upload is interrupted, just re-run the same command: already-committed files are detected and skipped, and already-uploaded chunks are deduplicated by the Xet backend (≈0 bytes re-transferred). There are no local state files to go stale, so resume even works from a different machine.\r\n- **Faster.** Files are hashed while being chunked (single read pass) and batches commit in the background while the next batch is already uploading, so there is no separate hashing phase blocking the upload.\r\n- **Multi-commit by default.** Large folders are automatically split into adaptive commits that scale between 64 and 1024 files based on commit duration. Folders that fit in a single batch still produce exactly one commit, as before; follow-up commits get a ` (part N)` suffix.\r\n- **Live progress bar** tracking the preparing, uploading, and committing stages (with a plain-log fallback when output is not a TTY):\r\n\r\n```\r\nFound 301 files to upload\r\n  Preparing   ████████████████████  301 / 301 ✓\r\n  Uploading   █████████████████░░░  255 / 300 files  25.5MB · 1.86MB/s\r\n  Committing  ░░░░░░░░░░░░░░░░░░░░  0 / 301\r\n```\r\n\r\n> `upload_large_folder` / `hf upload-large-folder` are intentionally left untouched in this release; their deprecation will follow once `hf upload` has fully absorbed the use case.\r\n\r\n\r\n- [Upload] Streamed multi-commit upload_folder powered by Xet by @Wauplin in #4331\r\n\r\n## 💻 Jobs: `wait`, SSH access, and cleaner error messages\r\n\r\nThis release adds three major capabilities to Hugging Face Jobs.\r\n\r\n**Wait for completion.** `HfApi.wait_for_job()` and `hf jobs wait` block until one or more Jobs reach a terminal stage, which makes it easy to chain commands in CI scripts. `wait_for_job` accepts a single id or a list, returns the final `JobInfo` even on failure (check `job.status.stage`), and only raises `TimeoutError` on timeout. The CLI exits `0` only if **all** waited-on Jobs ended `COMPLETED`.\r\n\r\n```bash\r\n# Wait on a single job, then run the next step only if it succeeded\r\nhf jobs wait <job_id> && next-step\r\n\r\n# Wait on a batch, with a timeout\r\nhf jobs wait <id1> <id2> --timeout 10m\r\n```\r\n\r\n> ⚠️ **Breaking change:** non-detached `hf jobs run` / `hf jobs uv run` now exit with the Job's outcome (exit code `1` if the Job errored) instead of always exiting `0`. We consider this a bugfix — scripts relying on the old behavior were being silently misled — but it is called out here in case you depend on the previous exit code.\r\n\r\n**SSH access.** With `--ssh` at launch and an SSH key registered on [huggingface.co/settings/keys](https://huggingface.co/settings/keys), you can connect straight into a running Job's container with `hf jobs ssh <job_id>`. Thanks to `wait_for_job`, `hf jobs ssh` now waits for the Job to reach `RUNNING` before connecting (with a status spinner) instead of failing immediately while it is still scheduling.\r\n\r\n```console\r\n$ hf jobs run --ssh --detach python:3.12 sleep infinity\r\n✓ Job started\r\n  id: 6a33ba2aef9220ea67d98a03\r\n  url: https://huggingface.co/jobs/Wauplin/6a33ba2aef9220ea67d98a03\r\nHint: Use `hf jobs ssh Wauplin/6a33ba2aef9220ea67d98a03` to open an SSH session into the job.\r\n\r\n$ hf jobs ssh Wauplin/6a33ba2aef9220ea67d98a03\r\nJob is running.\r\nRunning `ssh 6a33ba2aef9220ea67d98a03@ssh.hf.jobs`\r\nroot@j-wauplin-6a33ba2aef9220ea67d98a03-do4bduvn-5f153-458k4:/#\r\n```\r\n\r\n**Readable errors.** A new `JobNotFoundError` and the switch from `response.raise_for_status` to `hf_raise_for_status` turn raw `httpx` tracebacks into clean, actionable messages. Per-command `try/except` blocks were removed in favor of the global CLI error handling.\r\n\r\n```console\r\n$ hf jobs inspect 000\r\nError: 404 Client Error. (Request ID: Root=1-6a316470-...)\r\n\r\nJob Not Found for url: https://huggingface.co/api/jobs/Wauplin/000.\r\nPlease make sure you specified the correct job ID and namespace.\r\nSet HF_DEBUG=1 as environment variable for full traceback.\r\n```\r\n\r\n- [Jobs] Add `hf jobs wait` and `HfApi.wait_for_job` by @Wauplin in #4345\r\n- [Jobs] Add SSH support to run a Job and connect to it by @Wauplin in #4352\r\n- [CLI] Make `hf jobs ssh` wait for job to be running by @Wauplin in #4379\r\n- Add new JobNotFound error by @Wauplin in #4367\r\n\r\n## 🖥️ Custom-container deploy for Inference Endpoints\r\n\r\n`hf endpoints deploy` can now deploy custom Docker containers end-to-end, no more hand-writing JSON and POSTing the raw endpoints API. New flags wire up the image and its runtime: `--custom-image`, `--health-route`, `--port`, `--command`, and `--container-args`. Environment variables and secrets can be injected with `--env`/`--env-file` and `--secrets`/`--secrets-file`. On the SDK side, `create_inference_endpoint` gains `container_command` and `container_args` parameters.\r\n\r\n```bash\r\nhf endpoints deploy nex-n2-pro \\\r\n  --repo nex-agi/Nex-N2-Pro \\\r\n  --framework custom \\\r\n  --accelerator gpu --vendor aws --region us-east-1 \\\r\n  --instance-type nvidia-h200 --instance-size x8 \\\r\n  --custom-image nexagi/sglang:v0.5.12 \\\r\n  --health-route /health --port 30000 \\\r\n  --container-args \"--reasoning-parser qwen3 --tool-call-parser qwen3_coder --mamba-scheduler-strategy extra_buffer --tp 8\" \\\r\n  --env MODEL_ID=/repository \\\r\n  --type authenticated\r\n```\r\n\r\nThe `type` parameter now defaults to `authenticated` instead of the deprecated `protected` (passing `protected` emits a `FutureWarning`). The custom-container flags raise a clean error if used without `--custom-image`.\r\n\r\n- [Inference Endpoints] Custom-container deploy CLI + deprecate protected endpoint type by @gary149 in #4329\r\n\r\n## ⏳ Wait for a Space with `wait_for_space` and `hf spaces wait`\r\n\r\nMirroring the new `wait_for_job` primitive, `HfApi.wait_for_space()` and `hf spaces wait` block until a Space leaves an intermediate stage (`BUILDING`, `APP_STARTING`, …) and settles on a final state. The CLI exits `0` if the Space is `RUNNING`, non-zero otherwise. `hf spaces ssh` and `hf spaces dev-mode` were refactored to use `wait_for_space` internally instead of the old CLI-only helper.\r\n\r\n```bash\r\n# Wait after a restart\r\nhf spaces restart username/my-space && hf spaces wait username/my-space\r\n\r\n# With a timeout\r\nhf spaces wait username/my-space --timeout 5m\r\n```\r\n\r\n```python\r\n>>> from huggingface_hub import restart_space, wait_for_space\r\n>>> restart_space(\"username/my-space\")\r\n>>> runtime = wait_for_space(\"username/my-space\")\r\n>>> runtime.stage\r\n'RUNNING'\r\n```\r\n\r\n📚 **Documentation:** [CLI guide — wait for a Space](https://huggingface.co/docs/huggingface_hub/main/en/guides/cli#wait-for-a-space) · [Space runtime reference](https://huggingface.co/docs/huggingface_hub/main/en/package_reference/space_runtime)\r\n\r\n- [Spaces] Add `wait_for_space` API and `hf spaces wait` CLI by @Wauplin in #4380\r\n\r\n## 💔 Breaking Changes\r\n\r\n🚨🚨 With the `upload_folder` and `hf upload` revamp, uploading a folder might result in multiple commits. \r\nIt is also not possible to open a PR against a specific revision while using `upload_folder`. If you pass `create_pr=True`, it will necessarily create a PR against main. It will open the PR no matter if some changes have been committed (previously an empty commit was resulting in no PR opened at all).\r\n\r\n- [Upload] Streamed multi-commit upload_folder powered by Xet in #4331 by @Wauplin \r\n\r\n`RepoUrl` now rejects canonical single-segment repo IDs like `\"gpt2\"` or `\"datasets/squad\"` (use `\"user/gpt2\"` or `\"datasets/user/squad\"` instead). `repo_type_and_id_from_hf_id` is softly deprecated. `parse_hf_uri` gains an `endpoint` argument to parse URLs from self-hosted Hub instances.\r\n\r\n- [URIs] Use `parse_hf_uri` in `RepoUrl` + soft-deprecate `repo_type_and_id_from_hf_id` by @Wauplin in #4324\r\n\r\nNon-detached `hf jobs run` / `hf jobs uv run` now exit with the Job's outcome (exit `1` on Job error) instead of always exiting `0` \r\n\r\n- [Jobs] Add hf jobs wait and HfApi.wait_for_job by @Wauplin in #4345 — see the Jobs highlight above.\r\n\r\n## 🖥️ CLI\r\n\r\n- [CLI] Suggest creating repo/bucket on NotFound errors by @Wauplin in #4372 — when a repo or bucket can't be found, the CLI now hints at the matching `create` command instead of just reporting the 404.\r\n\r\n## 🔧 Other QoL Improvements\r\n\r\n- [HTTP] Retry on HTTP 408 Request Timeout by default by @Wauplin in #4360 — `408 Request Timeout` is now part of the default retry status set, alongside the existing 5xx codes.\r\n\r\n## 📖 Documentation\r\n\r\n- Polish CLI migration wording and collection docstrings by @wunianze666-netizen in #4356\r\n- Polish migration and collection API wording by @wunianze666-netizen in #4358\r\n\r\n## 🐛 Bug and typo fixes\r\n\r\n- OIDC: Include `error_description` in HTTP error messages by @coyotte508 in #4341 — failed OIDC exchanges now surface the server's `error_description`, making misconfigured Trusted Publishers far easier to debug.\r\n- [Download] Retry on `RemoteProtocolError` in `http_get` by @Wauplin in #4351 — transient connection drops mid-download are now retried instead of failing the download.\r\n- Ignore Windows metadata files in cache scan by @Chinmay1220 in #4357 — `desktop.ini` and similar Windows metadata files no longer trip up `scan-cache`.\r\n\r\n## 🏗️ Internal\r\n\r\n- [Tests] Add `inference` pytest marker to filter inference tests by @Wauplin in #4338\r\n- Post-release: bump version to 1.20.0.dev0 by @huggingface-hub-bot[bot] in #4342\r\n- [Tests] Mitigate transient CI failures by @Wauplin in #4343\r\n- [CI] Fix versioned docs not publishing on release by @hanouticelina in #4344\r\n- [Release] Skip `--prerelease=allow` injection for sentence-transformers by @hanouticelina in #4366\r\n- [CI] Do not fail on tmp repo deletion by @Wauplin in #4371\r\n- Bump codecov/codecov-action from 6.0.1 to 7.0.0 in the actions group by @dependabot[bot] in #4373\r\n","publishedAt":"2026-06-18T12:20:07.000Z","url":"https://github.com/huggingface/huggingface_hub/releases/tag/v1.20.0","media":[],"prerelease":false,"source":{"slug":"huggingface-hub","name":"huggingface_hub","type":"github"},"product":{"slug":"hub","name":"Hub"},"groupSlug":"hub","groupName":"Hub","coverageCount":0,"contentChars":13019,"contentTokens":3409,"composition":{"bugs":1,"features":6,"enhancements":4}},{"id":"rel_h9XMLd7o3-86KbEp_I8eG","version":"v1.19.0","type":"feature","title":"[v1.19.0] Trusted Publishers, hf:// URIs, and expose-ports for Jobs","summary":"Keyless CI/CD authentication is now supported via Trusted Publishers, allowing workflows to authenticate without storing an HF_TOKEN secret. The CLI now accepts `hf://` URIs for uploading and downloading, and jobs can expose container ports through the public jobs proxy.","titleGenerated":"Hub v1.19.0 adds trusted publishers for keyless CI/CD auth","titleShort":"Trusted Publishers enable keyless CI/CD auth","content":"## 🔐 Keyless CI/CD auth via OIDC token exchange\r\n\r\nCI workflows can now authenticate to the Hub without storing an `HF_TOKEN` secret, using [Trusted Publishers](https://huggingface.co/docs/hub/trusted-publishers). Set `HF_OIDC_RESOURCE` to the repo (or username) you want to scope the token to, and `huggingface_hub` performs the OIDC exchange under the hood — no token, no setup code. GitHub Actions is supported out of the box (with `permissions: id-token: write`), and other providers can pass a pre-minted ID token via `HF_OIDC_ID_TOKEN`. Exchanged tokens are short-lived (1 hour), repo-scoped, and cached locally with automatic refresh.\r\n\r\n```yaml\r\n# Publish a model without storing any HF_TOKEN secret\r\n- name: Push the model\r\n  env:\r\n    HF_OIDC_RESOURCE: acme/awesome-model\r\n  run: hf upload acme/awesome-model ./model .\r\n```\r\n\r\n- [Auth] Keyless CI/CD auth via OIDC token exchange by @hanouticelina in #4326\r\n\r\n📚 **Documentation:** [Trusted Publishers](https://huggingface.co/docs/hub/trusted-publishers)\r\n\r\n## 🖥️ hf:// URIs for upload and download\r\n\r\n`hf upload` and `hf download` now accept an `hf://` URI in place of the positional repo ID. The URI encodes repo type, revision, and file path in a single string following the grammar `hf://[<TYPE>/]<ID>[@<REVISION>][/<PATH>]`, so you no longer need separate `--repo-type` and `--revision` flags. When a URI is provided, it is the single source of truth — passing `--repo-type` or `--revision` on top of it raises an error, and a path in the URI cannot be combined with positional filenames (download) or `path_in_repo` (upload).\r\n\r\n```bash\r\n# Download a single file from a dataset at a given revision\r\nhf download hf://datasets/HuggingFaceM4/FineVision@refs/pr/1/data/train.parquet\r\n\r\n# Download an entire repo\r\nhf download hf://datasets/google/fleurs\r\n\r\n# Upload a file to a dataset on a specific branch\r\nhf upload hf://datasets/Wauplin/my-cool-dataset@my-branch/data/train.csv ./train.csv\r\n```\r\n\r\n- [CLI] Support hf:// URIs in `hf upload` and `hf download` by @Wauplin in #4297\r\n\r\n📚 **Documentation:** [CLI guide — hf:// URIs](https://huggingface.co/docs/huggingface_hub/main/en/guides/cli#use-an-hf-uri) · [Download guide](https://huggingface.co/docs/huggingface_hub/main/en/guides/download) · [Upload guide](https://huggingface.co/docs/huggingface_hub/main/en/guides/upload)\r\n\r\n## 🚀 Expose job ports through the jobs proxy\r\n\r\nJobs can now expose container ports through the public jobs proxy using `--expose <port>` (CLI) or `expose=[8000]` (Python API). Each exposed port is reachable at `https://<job_id>--<port>.hf.jobs` and requires an HF token with read access to the job's namespace. This works on `hf jobs run`, `hf jobs uv run`, and their scheduled variants. Job responses now surface `expose_urls` on `JobStatus`.\r\n\r\n```bash\r\n# Expose a web server running on port 8000\r\n> hf jobs run --expose 8000 python:3.12 python -m http.server 8000\r\n✓ Job started\r\n  id: 6a2aa7cec4f53f9fc5aa4cff\r\n  url: https://huggingface.co/jobs/Wauplin/6a2aa7cec4f53f9fc5aa4cff\r\nHint: Exposed ports are reachable at (requires an HF token with read access to the job):\r\n  https://6a2aa7cec4f53f9fc5aa4cff--8000.hf.jobs\r\nServing HTTP on 0.0.0.0 port 8000 (http://0.0.0.0:8000/) ...\r\n```\r\n\r\n```python\r\nfrom huggingface_hub import run_job\r\nrun_job(image=\"python:3.12\", command=[\"python\", \"-m\", \"http.server\", \"8000\"], expose=[8000])\r\n```\r\n\r\n- [Jobs] Add --expose <port> option to expose job ports through the jobs proxy by @XciD in #4316\r\n\r\n📚 **Documentation:** [Jobs guide](https://huggingface.co/docs/huggingface_hub/main/en/guides/jobs)\r\n\r\n\r\n## 🖥️ CLI\r\n\r\n- [CLI] Suppress hints in quiet output mode by @davanstrien in #4310\r\n- [CLI] Agent-friendly hints + examples for hf jobs by @davanstrien in #4308\r\n- [CLI] Accept web URLs in bucket CLI commands by @Wauplin in #4315\r\n\r\n\r\n## ⚡ XetSession API migration\r\n\r\nAll Xet upload and download code has been migrated from the old function-based `hf_xet` API to the new session-based `XetSession` API (`hf-xet >= 1.5.0`). A global singleton `get_xet_session()` provides fork-safe, thread-safe, and SIGINT-safe session reuse across all call sites — repo commits, `hf_hub_download`, bucket uploads/downloads, and `snapshot_download` all share the same underlying Tokio runtime. Token refresh is now handled through a centralized `xet_connection_info_refresh_url()` builder, and progress reporting follows the new `(group_report, item_reports)` contract.\r\n\r\n- Use the new XetSession API by @seanses in #4116\r\n\r\n## 🔧 Other QoL Improvements\r\n\r\n- [Auth] Take google colab token from env first by @Wauplin in #4323 — `get_token()` now checks `HF_TOKEN`/`HUGGING_FACE_HUB_TOKEN` and the on-disk token file before the Colab secrets vault, so an explicit `login()` or env variable always wins over the notebook's stored secret.\r\n- [Agent] Dynamic agent harness registry by @Wauplin in #4325 — Agent harness detection now fetches the registry from `GET /api/agent-harnesses` instead of using a hardcoded list, with a 24-hour on-disk cache and in-process caching for hot paths.\r\n\r\n## 🐛 Bug and typo fixes\r\n\r\n- [Fix] Remove private `_MISSING_TYPE` import from dataclasses module by @xsuchy in #4322 — fixes `ImportError` on Python 3.15 where `dataclasses._MISSING_TYPE` was removed upstream.\r\n- Fix ignored-pattern warning grammar in download CLI by @wunianze666-netizen in #4337 — corrects `\"have being\"` to `\"have been\"` in `hf download` warning output.\r\n- [fix] Transient location error due to CDN by @Wauplin in #4339 — fixes flaky `test_get_hf_file_metadata_from_a_lfs_file` by accepting `cdn.hf.co` in addition to `xethub.hf.co` in the redirect URL check.\r\n\r\n## 🏗️ Internal\r\n\r\n- Post-release: bump version to 1.19.0.dev0 by @huggingface-hub-bot[bot] in #4313\r\n- [CI] Run tests on internal workers by @Wauplin in #4321\r\n- [Tests] Add xet/no_xet pytest markers to filter Xet vs non-Xet tests by @Wauplin in #4336\r\n- Bump the actions group with 6 updates by @dependabot[bot] in #4332\r\n- chore: update release.yml by @hf-security-analysis[bot] in #4334\r\n- [CI] Remove .github/workflows/python-prerelease.yml by @Wauplin in #4335","publishedAt":"2026-06-11T10:07:51.000Z","url":"https://github.com/huggingface/huggingface_hub/releases/tag/v1.19.0","media":[],"prerelease":false,"source":{"slug":"huggingface-hub","name":"huggingface_hub","type":"github"},"product":{"slug":"hub","name":"Hub"},"groupSlug":"hub","groupName":"Hub","coverageCount":0,"contentChars":6117,"contentTokens":1708,"composition":{"bugs":3,"features":3,"enhancements":4}},{"id":"rel_HYLTUI0PSsEbV3ucJBBlR","version":"v1.18.0","type":"feature","title":"[v1.18.0] Unified file copying, web URL support, and storage usage","summary":"A new unified `hf cp` command handles all file-copy workflows (upload, download, remote-to-remote) with consistent `hf://` URI syntax and rsync-style semantics. `parse_hf_uri` now accepts Hugging Face web URLs directly. Fixed a data corruption bug where concurrent `hf_hub_download` calls could append to the same `.incomplete` file on Lustre, GPFS, and some NFS mounts where `flock(2)` provides no mutual exclusion; downloads now use fresh temporary files instead of resuming incomplete ones, making the download path safe even when file locking is broken. This is a breaking change: resuming previously failed partial downloads is no longer possible.","titleGenerated":"Hub v1.18.0 unifies file copying with web URL support and fixes concurrent download corruption","titleShort":"Unified hf cp command; concurrent downloads now safe on broken file locks","content":"## 🖥️ Unified `hf cp` command\r\n\r\nA single `hf cp` command now handles all file-copy workflows (upload a local file, download from the Hub, or copy between two remote locations) with consistent `hf://` URI syntax for both repositories and buckets. It is also available as `hf repos cp` and `hf buckets cp`; all three aliases are identical, so you can use whichever reads best for your workflow. You can stream from stdin (`-`) or to stdout (`-`), and a trailing `/` on the source path gives you rsync-style semantics (copy the folder contents, not the folder itself). Note that remote-to-remote copies only work within the same [storage region](https://huggingface.co/docs/hub/storage-regions), and bucket-to-repo is not yet supported.\r\n\r\n```bash\r\n# Upload a local file to a repo\r\nhf cp ./model.safetensors hf://username/my-model/model.safetensors\r\n\r\n# Download a file to stdout\r\nhf cp hf://username/my-model/config.json - | jq .\r\n\r\n# Copy between two Hub repos\r\nhf cp hf://username/source-model/config.json hf://username/dest-model/config.json\r\n```\r\n\r\n📚 **Documentation:** [CLI guide — Copy files](https://huggingface.co/docs/huggingface_hub/main/en/guides/cli#copy-files)\r\n\r\n- [CLI] Add unified `hf cp` command (aliased as `hf repos cp` and `hf buckets cp`) by @Wauplin in #4295\r\n\r\n## :egg: Easter egg:explore your storage usage\r\n\r\n<img width=\"2282\" height=\"832\" alt=\"image\" src=\"https://github.com/user-attachments/assets/fa4047b2-c62e-4e92-b556-ae18db8c98a8\" />\r\n\r\n- [CLI] Easter egg: city skyline in `hf repos ls` by @Wauplin in #4287\r\n\r\n## 🔗 Paste web URLs directly\r\n\r\n`parse_hf_uri` now accepts Hugging Face **web URLs** so you can paste a link straight into the CLI or the library and it \"just works\".\r\n\r\n```bash\r\n# Copy-paste a URL from the website\r\nhf cp https://huggingface.co/nvidia/LocateAnything-3B/blob/main/config.json - | jq '.architectures'\r\n```\r\n\r\n📚 **Documentation:** [HF URIs — Web URLs](https://huggingface.co/docs/huggingface_hub/main/en/package_reference/hf_uris#web-urls)\r\n\r\n- [URIs] Parse web URLs in `parse_hf_uri` + add `HfUri.to_url` by @Wauplin in #4296\r\n\r\n## 🚨 Breaking change\r\n\r\nOn Lustre, GPFS, and some NFS mounts, `flock(2)` silently succeeds for every caller, which means `filelock` provides no mutual exclusion. When multiple `hf_hub_download` calls race for the same file, they can append to the same `.incomplete` file and silently corrupt the blob cache. This release fixes that by always downloading to a fresh temporary file instead of resuming an incomplete one, making the download path safe even when file locking is broken. `filelock` is still used as a \"best-effort\" hint to avoid unnecessary duplicate downloads, but correctness no longer depends on it. **This is a breaking change: resuming a previously failed partial download is no longer possible. However, file resumability was already a niche use case only applicable when `hf_xet` is disabled.**\r\n\r\n- [Fix] Make concurrent downloads safe even when file locking is broken by @Wauplin in #4306\r\n\r\n\r\n## 🖥️ CLI\r\n\r\n- [CLI] inline enum choices in the generated CLI skill by @hanouticelina in #4299\r\n\r\n## 🐛 Bug and typo fixes\r\n\r\n- Fix ~ user home not expanded in local_dir and cache_dir on file download by @Wauplin in #4293\r\n- Do not fail on repo/bucket creation if HTTP 401 and already exists by @Wauplin in #4294\r\n- Fix umask probe writing tmp file outside download dir by @Wauplin in #4305\r\n\r\n## 📖 Documentation\r\n\r\n- [Docs] Document missing endpoint and template_str parameters by @aicayzer in #4298\r\n- [Docs] Document missing parameters in hf_hub_url and preupload_lfs_files by @aicayzer in #4300\r\n- [Docs] Mention storage region limitation for server-side copy by @Wauplin in #4302\r\n\r\n## 🏗️ Internal\r\n\r\n- Post-release: bump version to 1.18.0.dev0 by @huggingface-hub-bot[bot] in #4291\r\n- Bump the actions group with 2 updates by @dependabot[bot] in #4309","publishedAt":"2026-06-05T09:26:33.000Z","url":"https://github.com/huggingface/huggingface_hub/releases/tag/v1.18.0","media":[{"type":"image","url":"https://github.com/user-attachments/assets/fa4047b2-c62e-4e92-b556-ae18db8c98a8","r2Key":"releases/aec4830ff4db271ca06aef56d3879421202ba019f124a646a6d75d4973b2e110.png","r2Url":"https://media.releases.sh/releases/aec4830ff4db271ca06aef56d3879421202ba019f124a646a6d75d4973b2e110.png"}],"prerelease":false,"source":{"slug":"huggingface-hub","name":"huggingface_hub","type":"github"},"product":{"slug":"hub","name":"Hub"},"groupSlug":"hub","groupName":"Hub","coverageCount":0,"contentChars":3866,"contentTokens":1017,"composition":{"bugs":4,"features":3,"enhancements":1}},{"id":"rel_DTLgdaIWeld2DTtu6NUZh","version":"v1.17.0","type":"feature","title":"[v1.17.0] Cross-repo copies, ssh to Spaces, smarter CLI tables","summary":"You can now copy files or entire folders between different repositories without downloading or re-uploading, with LFS blobs deduplicated server-side. Added `hf spaces ssh` to open SSH sessions directly into a Space's Dev Mode container, and `hf repos ls` to list all your repositories with storage size and usage sorting. CLI tables now auto-fit to terminal width with per-column width caps and automatically right-align numeric columns.","titleGenerated":"Hub v1.17.0 adds cross-repo file copies, SSH into Spaces, and smarter CLI tables","titleShort":"Copy files across repos; SSH into Spaces; CLI tables auto-fit terminal width","content":"## 📋 Copy files between repositories\r\n\r\nYou can now copy files or entire folders between different repositories on the Hub — model to model, model to dataset, any combination — without downloading or re-uploading data. `CommitOperationCopy` accepts `src_repo_id` and `src_repo_type` for cross-repo sources, and LFS blobs are deduplicated server-side via the `/lfs-files/duplicate` endpoint. Non-LFS files are fetched from the source repo and committed as regular payloads. `copy_files` and `hf buckets cp` now support repo-to-repo in addition to the existing bucket destinations.\r\n\r\n```python\r\n>>> from huggingface_hub import copy_files\r\n\r\n# Copy an entire folder\r\n>>> copy_files(\r\n...     \"hf://datasets/username/source-dataset/data/\",\r\n...     \"hf://datasets/username/target-dataset/data/\",\r\n... )\r\n```\r\n\r\n- [Copy] Support cross-repo file copies by @Wauplin in #4203\r\n\r\n📚 **Documentation:** [Upload guide — Copy files between repositories](https://huggingface.co/docs/huggingface_hub/main/en/guides/upload#copy-files-between-repositories)\r\n\r\n## 🖥️ SSH into a Space with `hf spaces ssh`\r\n\r\nA new `hf spaces ssh` command opens an SSH session directly into a Space's Dev Mode container. If Dev Mode is not enabled yet, the CLI prompts you to enable it. You can also use `--dry-run` to print the SSH command without running it, or `-i` to forward a specific key. Your SSH public key must be registered in your HF user settings.\r\n\r\n```bash\r\n# SSH into a Space\r\n$ hf spaces ssh username/my-space\r\n\r\n# Print the SSH command without running it\r\n$ hf spaces ssh username/my-space --dry-run\r\n```\r\n\r\n- [CLI] Add `hf spaces ssh` by @gary149 in #4241\r\n\r\n📚 **Documentation:** [CLI guide — SSH into a Space](https://huggingface.co/docs/huggingface_hub/main/en/guides/cli#ssh-into-a-space-dev-mode) | [Spaces guide — SSH into a Space](https://huggingface.co/docs/huggingface_hub/main/en/guides/manage-spaces#ssh-into-a-space-dev-mode)\r\n\r\n## 📂 List all your repos with `hf repos ls`\r\n\r\nA new `hf repos ls` command lists all your repositories — models, datasets, spaces, and buckets — with storage size and percentage of namespace total, sorted by storage usage. It supports `--type`, `--search`, `--namespace`, and `--limit` (default 30, `--limit 0` for all), plus the standard `--format` family.\r\n\r\n```bash\r\n# List all your repos\r\n$ hf repos ls\r\n\r\n# List all datasets under org with JSON output\r\n$ hf repos ls --namespace my-org --type dataset --limit 0 --format json | jq '.[].id'\r\n```\r\n\r\n- [CLI] Add `hf repos ls` command by @Wauplin in #4283\r\n\r\n📚 **Documentation:** [CLI guide — List repos](https://huggingface.co/docs/huggingface_hub/main/en/guides/cli#list-repos) | [Repository guide — List your repositories](https://huggingface.co/docs/huggingface_hub/main/en/guides/repository#list-your-repositories)\r\n\r\n\r\n## 📊 CLI tables auto-fit terminal width and right-align numbers\r\n\r\nHuman-mode CLI tables now use a column-aware algorithm that computes per-column width caps from the actual terminal width, shrinking only the widest columns when needed. Non-TTY output keeps the legacy fixed cap, and `--no-truncate` bypasses truncation entirely. Numeric columns (all `int`/`float` values) are automatically right-aligned.\r\n\r\n```bash\r\n# Tables adapt to your terminal width\r\n$ hf models ls --search qwen3\r\n\r\n# Force full values regardless of width\r\n$ hf models ls --no-truncate\r\n```\r\n\r\n- [CLI] Auto-fit human tables to terminal width by @hanouticelina in #4251\r\n- [CLI] Auto right-align numeric columns in human table output by @Wauplin in #4288\r\n\r\n📚 **Documentation:** [CLI guide — Output formatting](https://huggingface.co/docs/huggingface_hub/main/en/guides/cli#output-formatting)\r\n\r\n\r\n## 🔧 Jobs hardware decoupled from Spaces, auto-synced with Hub API\r\n\r\nJobs now have their own `JobHardware` enum, independent of `SpaceHardware`, so the two catalogs can diverge as needed. The old `JobHardware` dataclass (return type of `list_jobs_hardware()`) has been renamed to `JobHardwareInfo`. CLI `--flavor` / `--hardware` flags use a new `SoftChoice` type that shows known values for autocomplete but accepts any string — older CLI versions won't reject new server-side flavors. A daily CI workflow (`update-hardware-flavors.yaml`) runs `utils/check_hardware_flavors.py` to sync both enums from the live Hub API and opens a bot PR when something changes.\r\n\r\n```bash\r\n# Unknown flavors pass through instead of raising a validation error\r\n$ hf jobs run --flavor future-gpu-x99 python:3.12 echo \"works with unknown flavors\"\r\n```\r\n\r\n- [Jobs] Decouple Job hardware from Spaces, auto-sync enums with Hub API by @Wauplin in #4266\r\n\r\n📚 **Documentation:** [Jobs guide](https://huggingface.co/docs/huggingface_hub/main/en/guides/jobs)\r\n\r\n## 💔 Breaking Change\r\n\r\n- [Inference] Remove Together ASR task to drop urllib3 dependency by @Wauplin in #4248\r\n- [CLI] migrate `hf jobs` to `out` singleton by @hanouticelina in #4254\r\n\r\n> **Note:** The second item changes `hf jobs ps` and `hf jobs scheduled ps` to use `--format auto|human|agent|json|quiet` (removing `--format table` and `-q`). JSON output for `hf jobs ps` now flattens `command` to a string and `status` to a stage string.\r\n\r\n## 🖥️ CLI\r\n\r\n- [CLI] Migrate `extensions`, `lfs-enable-largefiles`, `version` to `out` singleton by @hanouticelina in #4284\r\n- [CLI] Fix parent aliases leaking into subcommand headers in CLI reference by @Wauplin in #4253\r\n\r\n## 📊 Jobs\r\n\r\n- [Jobs] Add update_job_labels and update_scheduled_job_labels by @Wauplin in #4252\r\n- feat: add rtx-pro-6000 hardware flavors by @christophe-rannou in #4259\r\n\r\n📚 **Documentation:** [Jobs guide — Update labels](https://huggingface.co/docs/huggingface_hub/main/en/guides/jobs#update-labels) | [Jobs guide — Hardware](https://huggingface.co/docs/huggingface_hub/main/en/guides/jobs#select-the-hardware)\r\n\r\n## 🔧 Other QoL Improvements\r\n\r\n- Fix failing on read-only file system even if the non-existence of file is already cached by @ydshieh in #4274\r\n- [CLI] Add `click` as an explicit dependency (typer 0.26.0 fix) by @hanouticelina in #4270\r\n\r\n## 📖 Documentation\r\n\r\n- [Docs] Document missing parameters in lfs, hf_file_system, and repocard_data by @kratos0718 in #4289\r\n\r\n## 🐛 Bug and typo fixes\r\n\r\n- fix `local_files_only` grammar by @hunterhogan in #4255\r\n- Fix typos in comments and debug log message by @Sanjays2402 in #4278\r\n\r\n## 🏗️ Internal\r\n\r\n- Post-release: bump version to 1.17.0.dev0 by @huggingface-hub-bot[bot] in #4247\r\n- ci(release): migrate PyPI publish to Trusted Publishing + attestations by @XciD in #4249\r\n- [CI] Add import check with base dependencies only by @Wauplin in #4250\r\n- [Internal] Update style bot permissions by @hanouticelina in #4260\r\n- chore: enable Dependabot weekly GitHub Actions bumps by @hf-dependantbot-rollout[bot] in #4262\r\n- Bump actions in the actions group by @dependabot[bot] in #4263\r\n- chore: update release.yml by @hf-security-analysis[bot] in #4264\r\n- fix(release.yml): restore env: block on 'Detect version' step by @paulinebm in #4267\r\n- [Internal] Cap typer below 0.26.0 (CLI incompatibility) by @hanouticelina in #4272\r\n- [Internal] Run pinact (lock versions in workflow files) by @Wauplin in #4275\r\n- [Internal] Use Comment bot in model card gh action by @Wauplin in #4277\r\n- [CI] fix collection test by making its name unique by @Wauplin in #4279\r\n- Bump astral-sh/setup-uv from 7.6.0 to 8.1.0 in the actions group by @dependabot[bot] in #4281\r\n- [CLI] Drop legacy printing helpers from `_cli_utils.py` by @hanouticelina in #4285","publishedAt":"2026-05-28T15:08:07.000Z","url":"https://github.com/huggingface/huggingface_hub/releases/tag/v1.17.0","media":[],"prerelease":false,"source":{"slug":"huggingface-hub","name":"huggingface_hub","type":"github"},"product":{"slug":"hub","name":"Hub"},"groupSlug":"hub","groupName":"Hub","coverageCount":0,"contentChars":7494,"contentTokens":2003,"composition":{"bugs":3,"features":5,"enhancements":3}},{"id":"rel_5hY3DxdfDCevigc_YprSk","version":"v1.16.4","type":"feature","title":"[v1.16.4] hot fix: Fix `typer>=0.26.0` compatibility ","summary":"Capped typer below 0.26.0 to resolve CLI incompatibility, and added click as an explicit dependency.","titleGenerated":"Hub v1.16.4 fixes CLI incompatibility with typer ≥0.26.0","titleShort":"CLI incompatibility with typer ≥0.26.0 fixed","content":"- [CI] Cap typer below 0.26.0 (CLI incompatibility) #4272\r\n\r\n- [CI] Add click as explicit dependency #4270\r\n\r\n**Full Changelog**: https://github.com/huggingface/huggingface_hub/compare/v1.16.1...v1.16.4","publishedAt":"2026-05-26T17:07:34.000Z","url":"https://github.com/huggingface/huggingface_hub/releases/tag/v1.16.4","media":[],"prerelease":false,"source":{"slug":"huggingface-hub","name":"huggingface_hub","type":"github"},"product":{"slug":"hub","name":"Hub"},"groupSlug":"hub","groupName":"Hub","coverageCount":0,"contentChars":202,"contentTokens":68,"composition":{"bugs":1,"features":0,"enhancements":1}},{"id":"rel_VOW56BLwNcsRyH47sgnm5","version":"v1.16.1","type":"feature","title":"[v1.16.1]  [Hot-fix] [Inference] Remove Together ASR task to drop urllib3 dependency","summary":"The Together ASR task has been removed from the Inference API to eliminate the urllib3 dependency.","titleGenerated":"Hub v1.16.1 removes Together ASR task to drop urllib3 dependency","titleShort":"Together ASR task removed; urllib3 dependency dropped","content":"- [Hot-fix] [Inference] Remove Together ASR task to drop urllib3 dependency by @Wauplin in  #4248\r\n\r\n**Full Changelog**: https://github.com/huggingface/huggingface_hub/compare/v1.16.0...v1.16.1","publishedAt":"2026-05-21T18:43:58.000Z","url":"https://github.com/huggingface/huggingface_hub/releases/tag/v1.16.1","media":[],"prerelease":false,"source":{"slug":"huggingface-hub","name":"huggingface_hub","type":"github"},"product":{"slug":"hub","name":"Hub"},"groupSlug":"hub","groupName":"Hub","coverageCount":0,"contentChars":193,"contentTokens":61,"composition":{"bugs":0,"features":0,"enhancements":1}},{"id":"rel_EGfN5A494FVcwHr07Q3i4","version":"v1.16.0","type":"feature","title":"[v1.16.0] Together goes multimodal on Inference Providers, CLI improvements, and token security","summary":"Token files written by huggingface_hub are now created with secure permissions (0o600 for files, 0o700 for parent directory), matching industry-standard tools like GitHub CLI and AWS CLI. Together Inference Provider now supports embeddings, text-to-speech, automatic speech recognition, image-to-image, and text-to-video tasks. Breaking changes include BucketUrl.handle renamed to BucketUrl.uri, Volume.to_hf_handle() renamed to Volume.to_uri(), and single-segment repo IDs no longer supported in HfFileSystem paths.","titleGenerated":"Hub v1.16.0 hardens token file permissions and adds Together multimodal support","titleShort":"Token files hardened to 0o600; Together adds embeddings, TTS, ASR, video","content":"## :zap: Together goes multimodal on Inference Providers\r\n\r\nTogether now supports five additional task types beyond chat and text-to-image on Inference Providers:\r\n- `feature_extraction`\r\n- `text_to_speech`\r\n- `automatic_speech_recognition`\r\n- `image_to_image`\r\n- `text_to_video`\r\n\r\n```python\r\nfrom huggingface_hub import InferenceClient\r\n\r\nclient = InferenceClient(provider=\"together\")\r\n\r\n# Embeddings\r\nembeddings = client.feature_extraction(\"Hello world\", model=\"intfloat/multilingual-e5-large-instruct\")\r\n\r\n# Text-to-speech\r\naudio = client.text_to_speech(\"Hello world\", model=\"hexgrad/Kokoro-82M\", extra_body={'voice': 'af_heart'})\r\n\r\n# Text-to-video\r\nvideo = client.text_to_video(\"A cat on the moon\", model=\"Wan-AI/Wan2.2-T2V-A14B\")\r\n```\r\n\r\n- [Inference] Add embeddings, TTS, ASR, image-to-image and video tasks for Together by @nbroad1881 in #4164\r\n\r\n📚 **Documentation:** [Inference guide](https://huggingface.co/docs/huggingface_hub/main/en/guides/inference)\r\n\r\n## 🔗 Centralized `hf://` URI parsing\r\n\r\nAll scattered ad-hoc `hf://` URI parsers throughout the codebase have been consolidated onto the new `parse_hf_uri`/`parse_hf_mount` helpers. This brings consistent parsing behavior, a new `is_hf_uri` public helper for validating URIs, and proper handling of `@` in filenames (now treated as literal). The CLI error handler now catches `HfUriError` and displays a clean message instead of a raw traceback.\r\n\r\n### 🚨 Breaking Changes\r\n\r\nThis migration includes several breaking changes: `BucketUrl.handle` has been renamed to `BucketUrl.uri` (type changed from `str` to `HfUri`, use `.to_uri()` for the string form), `Volume.to_hf_handle()` has been renamed to `Volume.to_uri()`, single-segment repo IDs (e.g. `gpt2`) are no longer supported in `HfFileSystem` paths or CLI `-v` flags — you must use the `namespace/name` format instead.\r\n\r\n- [Core] Migrate hf:// URI parsing to centralized parse_hf_uri by @Wauplin in #4189\r\n\r\n📚 **Documentation:** [CLI guide](https://huggingface.co/docs/huggingface_hub/main/en/guides/cli) | [Buckets guide](https://huggingface.co/docs/huggingface_hub/main/en/guides/buckets)\r\n\r\n## 🖥️ CLI\r\n\r\n### Global `--no-truncate` flag for CLI tables\r\n\r\nA new `--no-truncate` global formatting flag disables the `...` shortening of scalar values in human-mode tables, letting you see full IDs, names, and other long text at a glance. List- and dict-valued columns (e.g. `tags`) remain shortened in human mode since they can be arbitrarily long; use `--format json` for those. When any cell is truncated, human tables now print a one-line hint at the bottom pointing you to the right flag.\r\n\r\n```bash\r\n# Show full scalar values in table output\r\nhf models ls --no-truncate\r\n```\r\n\r\n- [CLI] Add global `--no-truncate` flag for human tables by @hanouticelina in #4229\r\n\r\n📚 **Documentation:** [CLI guide](https://huggingface.co/docs/huggingface_hub/main/en/guides/cli)\r\n\r\n### Miscellaneous\r\n\r\n- [CLI] Surface job runtime fields in ps + inspect by @davanstrien in #4211\r\n- [CLI] Parse `initiator` field on jobs API responses by @davanstrien in #4212\r\n- [CLI] Support hf:// URIs in cache rm by @abhinavgautam01 in #4235\r\n- [CLI] Expose linked repos in PaperInfo by @mishig25 in #4240\r\n- [CLI] Raise error when both --local-dir and --cache-dir are provided by @Wauplin in #4245\r\n\r\n## 🔒 Token file permissions hardened\r\n\r\nToken files written by `huggingface_hub` (`~/.cache/huggingface/token` and `~/.cache/huggingface/stored_tokens`) were previously created with Python's default modes, leaving them world-readable on most systems. This PR sets file permissions to `0o600` and parent directory permissions to `0o700` after every write, bringing `huggingface_hub` in line with industry-standard tools like GitHub CLI, AWS CLI, and Google Cloud SDK. Pre-existing installations will converge to safe permissions on the next token save. The `chmod` calls are wrapped in try/except for Windows, which doesn't support POSIX modes.\r\n\r\n- [Auth] Harden HF_TOKEN_PATH and HF_STORED_TOKENS_PATH to 0o600 / 0o700 by @JAE0Y2N in #4234\r\n\r\n## 📊 Jobs\r\n\r\n- Use server-side support to tail job logs by @coyotte508 in #4202\r\n- [Jobs] Add `ephemeral_storage` field to `JobHardware` by @Wauplin in #4233\r\n\r\n## 🐛 Bug and typo fixes\r\n\r\n- [Download] Fix snapshot bar inflation on http_get retry by @popfido in #4209\r\n\r\n## 📖 Documentation\r\n\r\n- [Docs] Refresh contributing guide and README by @Wauplin in #4237\r\n\r\n## 🏗️ Internal\r\n\r\n- Post-release: bump version to 1.16.0.dev0 by @huggingface-hub-bot[bot] in #4230\r\n- Fix catch-all empty string in CI pytest --only-rerun by @albertvillanova in #4239\r\n- [Internal] Silence `ty` `invalid-type-form` on `WebhooksServer` annotations by @hanouticelina in #4242\r\n- [CI] make test_model_info_with_security for robust by @Wauplin in #4246","publishedAt":"2026-05-21T10:38:41.000Z","url":"https://github.com/huggingface/huggingface_hub/releases/tag/v1.16.0","media":[],"prerelease":false,"source":{"slug":"huggingface-hub","name":"huggingface_hub","type":"github"},"product":{"slug":"hub","name":"Hub"},"groupSlug":"hub","groupName":"Hub","coverageCount":0,"contentChars":4782,"contentTokens":1280,"composition":{"bugs":1,"features":6,"enhancements":8}},{"id":"rel_hqO6kL-kGK0TSWqwIAuxO","version":"v1.15.0","type":"feature","title":"[v1.15.0] Region-aware buckets & repos, `hf skills list`, polished CLI help and more","summary":"The `create_bucket` and `create_repo` APIs now accept an optional `region` argument (\"us\" or \"eu\") to pin new resources to a specific cloud region, with matching `--region` flags on the CLI. A new `hf skills list` command lists all available marketplace skills and shows which are already installed across project, global, and Claude locations. Help output now uses ANSI styling with underlined section headings and bold option names for better readability in terminals.","titleGenerated":"Hub v1.15.0 adds region selection for buckets and repos, `hf skills list` command","titleShort":"Pick region when creating buckets/repos; `hf skills list` discovers marketplace skills","content":"## 🌍 Pick a region when creating buckets and repos\r\n\r\n`create_bucket` and `create_repo` now accept an optional `region` argument (`\"us\"` or `\"eu\"`) so you can pin a new bucket or repo to a specific cloud region at creation time. The same option is exposed on the CLI via a `--region` flag on `hf buckets create` and `hf repos create`.\r\n\r\n```python\r\n>>> from huggingface_hub import create_bucket, create_repo\r\n>>> create_bucket(\"my-bucket\", region=\"us\")\r\n>>> create_repo(\"my-model\", region=\"eu\")\r\n```\r\n\r\n```bash\r\n$ hf buckets create my-bucket --region us\r\n$ hf repos create username/my-model --region eu\r\n```\r\n\r\n- [Bucket/Repo] Support 'region' option in create_bucket and create_repo by @Wauplin in #4194\r\n\r\n## 🧩 Discover marketplace skills with `hf skills list`\r\n\r\nA new `hf skills list` (alias `ls`) command lists every skill available in the Hugging Face marketplace and shows whether each one is already installed in the four supported locations (project, global, project Claude, global Claude). Handy when you want to check what's installable and what you've already got before running `hf skills add`.\r\n\r\n```bash\r\n$ hf skills ls\r\nNAME                        DESCRIPTION                         PROJECT PROJECT (CLAUDE) GLOBAL GLOBAL (CLAUDE)\r\n--------------------------- ----------------------------------- ------- ---------------- ------ ---------------\r\nhf-cli                      Execute Hugging Face Hub operati...     yes              yes    yes             yes                                \r\n```\r\n\r\n- [CLI] Add `hf skills list` command by @Wauplin in #4180\r\n\r\n## 🎨 Polished `--help` output with ANSI styling\r\n\r\n`hf --help` and every subcommand now render with underlined section headings and bold option/command names, making the help screens much easier to scan in a terminal. The new styling is automatically disabled when `NO_COLOR` is set or when the CLI detects it's running under an AI agent, so script and agent output stays clean.\r\n\r\n- [CLI] Pretty-print `--help` with ANSI styling by @Wauplin in #4192\r\n\r\n## 🖥️ CLI\r\n\r\n- [CLI] Check Homebrew registry for updates when installed via brew by @Wauplin in #4204 — `hf update` no longer suggests a version that isn't on `brew` yet for Homebrew installs.\r\n- [CLI] No traceback on LocalEntryNotFoundError by @Wauplin in #4190 — offline/cache-miss errors now print a clean message instead of a Python traceback (set `HF_DEBUG=1` for the full stack).\r\n\r\n## 🐛 Bug and typo fixes\r\n\r\n- Make HF_HUB_ENABLE_HF_TRANSFER deprecation warning visible to users by @Adithya191101 in #4220\r\n- Fix hint message to use 'hf skills update' by @Pierrci in #4206\r\n\r\n## 📖 Documentation\r\n\r\n- [docs] Drop duplicated Key Features list from hf jobs CLI section by @davanstrien in #4222\r\n\r\n## 🏗️ Internal\r\n\r\n- [CI] Harden style-bot workflow against TOCTOU by @paulinebm in #4183\r\n- Only sync skill if SKILL.md has changed by @evalstate in #4210\r\n","publishedAt":"2026-05-15T11:19:23.000Z","url":"https://github.com/huggingface/huggingface_hub/releases/tag/v1.15.0","media":[],"prerelease":false,"source":{"slug":"huggingface-hub","name":"huggingface_hub","type":"github"},"product":{"slug":"hub","name":"Hub"},"groupSlug":"hub","groupName":"Hub","coverageCount":0,"contentChars":2893,"contentTokens":689,"composition":null},{"id":"rel_XFpHSob2zjoS-L1aTQa8v","version":"v1.14.0","type":"feature","title":"[v1.14.0] Handle Spaces secrets & variables from CLI and other improvements","summary":"## 🖥️ Manage Space secrets and variables from the CLI\r\n\r\nYou can now manage Space secrets and environment variables directly from the command line wi...","titleGenerated":null,"titleShort":null,"content":"## 🖥️ Manage Space secrets and variables from the CLI\r\n\r\nYou can now manage Space secrets and environment variables directly from the command line with two new `hf spaces` subgroups: `secrets` and `variables`. Use `hf spaces secrets` to add, list, and delete write-only secrets, and `hf spaces variables` to add, list, and delete readable environment variables. Both `add` commands support multiple `-s`/`-e` flags and `--secrets-file`/`-env-file` for loading from dotenv files. On the Python side, `HfApi.get_space_secrets()` returns secret metadata (key, description, updated timestamp) without ever revealing values.\r\n\r\n```bash\r\n# List secrets (values are write-only — only keys and timestamps are shown)\r\n$ hf spaces secrets ls username/my-space\r\n\r\n# Add secrets\r\n$ hf spaces secrets add username/my-space -s OPENAI_API_KEY=sk-...\r\n$ hf spaces secrets add username/my-space --secrets-file .env.secrets\r\n\r\n# Delete a secret (confirmation prompt, use --yes to skip)\r\n$ hf spaces secrets delete username/my-space OPENAI_API_KEY --yes\r\n\r\n# List, add, and delete variables (values are readable)\r\n$ hf spaces variables ls username/my-space\r\n$ hf spaces variables add username/my-space -e MODEL_ID=gpt2 -e MAX_TOKENS=512\r\n$ hf spaces variables delete username/my-space MAX_TOKENS --yes\r\n```\r\n\r\n- [CLI] Add hf spaces secrets and variables subgroups by @davanstrien in #4170\r\n- [CLI] Add get_space_secrets + hf spaces secrets ls by @Wauplin in #4182\r\n\r\n📚 **Documentation:** [CLI guide](https://huggingface.co/docs/huggingface_hub/main/en/guides/cli) · [Manage your Space](https://huggingface.co/docs/huggingface_hub/main/en/guides/manage-spaces)\r\n\r\n## 🪣 Rsync-style trailing slash for bucket folder copies\r\n\r\n`hf buckets cp` now supports rsync-style trailing slash semantics when copying folders. A trailing `/` on the source path copies only the folder's contents to the destination, while omitting it nests the folder itself — matching the behavior you'd expect from `rsync`. This makes it possible to flatten directory structures during copies, which was not possible before. Additionally, `copy_files` now raises an explicit `EntryNotFoundError` when the source path resolves to no files, instead of silently succeeding with zero operations.\r\n\r\n```bash\r\n# Without trailing slash: \"logs\" dir is nested => dst/logs/...\r\n$ hf buckets cp hf://buckets/username/src-bucket/logs hf://buckets/username/dst/\r\n\r\n# With trailing slash: only contents of \"logs\" are copied => dst/...\r\n$ hf buckets cp hf://buckets/username/src-bucket/logs/ hf://buckets/username/dst/\r\n```\r\n\r\n- [Buckets] Support rsync-style trailing slash in copy_files by @Wauplin in #4187\r\n- [CLI] Raise error when copy_files source doesn't exist by @Wauplin in #4186\r\n\r\n📚 **Documentation:** [Buckets guide](https://huggingface.co/docs/huggingface_hub/main/en/guides/buckets) · [CLI guide](https://huggingface.co/docs/huggingface_hub/main/en/guides/cli)\r\n\r\n## 💔 Breaking Change\r\n\r\n- [CLI] Rename `hf skills upgrade` -> `hf skills update` by @hanouticelina in #4176 — `hf skills upgrade` no longer exists; use `hf skills update` instead.\r\n- [CLI] Add `out.status()` by @hanouticelina in #4171 — status updates (spinners/progress) on `hf extensions install` and `hf spaces dev-mode` are now suppressed when using `--format json`, `--quiet`, or `--format agent`.\r\n\r\n## 🖥️ CLI\r\n\r\n- [CLI] Add hints and example to `hf datasets leaderboard` by @Wauplin in #4174\r\n- [CLI] Shortcut `hf update` when already on latest version by @julien-c in #4177\r\n- [CLI] Remove progress bars on skills update by @Wauplin in #4179\r\n- [CLI] Increase default --limit from 10 to 30 for list commands by @Wauplin in #4181\r\n- [CLI] Support hf -v to print version by @Wauplin in #4185\r\n- [CLI] migrate `hf skills` to bucket by @hanouticelina in #4175\r\n\r\n## 🐛 Bug and typo fixes\r\n\r\n- Update typer dependency version in setup.py by @tomaarsen in #4193\r\n\r\n## 🏗️ Internal\r\n\r\n- Post-release: bump version to 1.14.0.dev0 by @huggingface-hub-bot[bot] in #4172\r\n- [Release] Move social drafts to minor-release and archive release notes to bucket by @Wauplin in #4173\r\n- Update unit test warnings check to ignore unrelated deprecation warnings by @seanses in #4188\r\n- [internal] Untrack useless files by @Wauplin in #4191\r\n","publishedAt":"2026-05-06T14:00:14.000Z","url":"https://github.com/huggingface/huggingface_hub/releases/tag/v1.14.0","media":[],"prerelease":false,"source":{"slug":"huggingface-hub","name":"huggingface_hub","type":"github"},"product":{"slug":"hub","name":"Hub"},"groupSlug":"hub","groupName":"Hub","coverageCount":0,"contentChars":null,"contentTokens":null,"composition":null},{"id":"rel_fo9AVy_MzQrWPjdK4T9cP","version":"v1.13.0","type":"feature","title":"[v1.13.0] new CLI commands and formatting, and HF URI parsing","summary":"## 🖥️ New CLI commands: repo cards, file listings, and dataset leaderboards\r\n\r\nThis release adds three new CLI capabilities for exploring Hub content...","titleGenerated":null,"titleShort":null,"content":"## 🖥️ New CLI commands: repo cards, file listings, and dataset leaderboards\r\n\r\nThis release adds three new CLI capabilities for exploring Hub content. `hf models card`, `hf datasets card`, and `hf spaces card` fetch the README of any repo and print it to stdout, with `--metadata` (YAML frontmatter as JSON) and `--text` (prose only) flags for splitting the card into its structured and unstructured parts. Calling `hf models ls <repo_id>`, `hf datasets ls <repo_id>`, or `hf spaces ls <repo_id>` now switches from listing repos to listing files inside that repo, with `--tree`, `-R`, `-h`, and `--revision` options mirroring the existing `hf buckets ls` behavior. And `hf datasets leaderboard <dataset_id>` surfaces model scores submitted to a benchmark dataset, making it easy to compare models by score from the terminal.\r\n\r\n```bash\r\n# Get model card metadata as JSON\r\nhf models card google/gemma-4-31B-it --metadata --format json\r\n\r\n# List files in a model repo (tree view with sizes)\r\nhf models ls meta-llama/Llama-3.2-1B-Instruct --tree -h\r\n\r\n# Show top 5 models on SWE-bench\r\nhf datasets leaderboard SWE-bench/SWE-bench_Verified --limit 5\r\n```\r\n\r\n📚 **Documentation:** [CLI guide](https://huggingface.co/docs/huggingface_hub/main/en/guides/cli)\r\n\r\n- [CLI] Add hf models card and hf datasets card commands by @davanstrien in #4118\r\n- [CLI] Add file listing to models/datasets/spaces ls by @Wauplin in #4166\r\n- [CLI] add `hf datasets leaderboard` by @hanouticelina in #4154\r\n\r\n## :rocket: Manage Spaces from the CLI\r\n\r\nThree new `hf spaces` subcommands bring full lifecycle control to the terminal. `hf spaces pause` and `hf spaces restart` stop or rebuild a Space (with `--factory-reboot` for a clean rebuild), and `hf spaces settings` lets you configure sleep time and hardware in one call. A companion `hf spaces hardware` command lists all available hardware flavors with pricing, so you can discover options before changing settings. Pause and restart include a confirmation prompt (`-y` to skip) since they tear down the running container.\r\n\r\n```bash\r\n# Pause a Space when not in use (not billed while paused)\r\nhf spaces pause username/my-space\r\n\r\n# Restart with a GPU\r\nhf spaces settings username/my-space --hardware t4-medium --sleep-time 3600\r\n\r\n# List available hardware options\r\nhf spaces hardware\r\n```\r\n\r\n📚 **Documentation:** [CLI guide — Spaces](https://huggingface.co/docs/huggingface_hub/main/en/guides/cli#hf-spaces)\r\n\r\n- [CLI] Add spaces lifecycle commands: pause, restart, sleep by @davanstrien in #4155\r\n- [CLI] Add `hf spaces hardware` command by @Wauplin in #4169\r\n- [CLI] Add `--hardware` flag to `hf spaces settings` by @davanstrien in #4163\r\n\r\n## :arrows_clockwise: `hf update` replaces the auto-update prompt\r\n\r\nThe blocking interactive Y/n auto-update prompt at CLI startup is gone. It was catching too many non-interactive contexts (CI runners, Homebrew post-install hooks, Jupyter notebooks) and hanging automation. In its place, a single yellow stderr warning suggests running `hf update` — a new command that detects how `hf` was installed (Homebrew, standalone installer, or pip) and runs the right upgrade command. Set `HF_HUB_DISABLE_UPDATE_CHECK=1` to silence the startup check entirely, for example in offline CI.\r\n\r\n```bash\r\nhf update\r\n```\r\n\r\n📚 **Documentation:** [CLI guide — Updating](https://huggingface.co/docs/huggingface_hub/main/en/guides/cli#updating)\r\n\r\n- [CLI] Add `hf update` + drop interactive update prompt by @Wauplin in #4131\r\n\r\n## :pencil2: Global output formatting for every command\r\n\r\nThe `--format`, `--json`, and `-q` / `--quiet` flags are now handled globally by the CLI framework instead of being declared individually on each command. This means every `hf` command automatically accepts them — no more per-command `--format` boilerplate, and the flags are properly documented in a dedicated \"Formatting options\" section in every `--help` page. `--format auto` (the default) picks `human` for interactive terminals and `agent` when invoked by an AI agent, making CLI output automatically suitable for both people and tools.\r\n\r\n```bash\r\n# JSON output for scripting\r\nhf models ls --search bert --limit 2 --json | jq '.[].id'\r\n\r\n# IDs only, one per line\r\nhf collections ls --owner nvidia -q\r\n```\r\n\r\n📚 **Documentation:** [CLI guide — Output formatting](https://huggingface.co/docs/huggingface_hub/main/en/guides/cli#output-formatting)\r\n\r\n- [CLI] Make --format / --json / -q global by @Wauplin in #4162\r\n\r\n## 🔗 Centralized `hf://` URI parsing\r\n\r\nA new `parse_hf_uri` function and `HfUri` dataclass provide a single source of truth for parsing `hf://...` strings across the library. Whether you reference a model, dataset, space, bucket, or file inside a repo, the parser handles all valid URI shapes — type prefixes, revisions, and paths — and rejects invalid ones with clear error messages. A companion `parse_hf_mount` / `HfMount` handles volume mount specifications (`hf://...:/mnt:ro`). Both are pure string parsers (no network calls) and round-trippable via `.to_uri()`.\r\n\r\n```python\r\nfrom huggingface_hub import parse_hf_uri, parse_hf_mount\r\n\r\nparse_hf_uri(\"hf://datasets/namespace/my-dataset@refs/pr/3/train.json\")\r\n# HfUri(type='dataset', id='namespace/my-dataset', revision='refs/pr/3', path_in_repo='train.json')\r\n\r\nparse_hf_mount(\"hf://buckets/my-org/my-bucket/sub/dir:/mnt:ro\")\r\n# HfMount(source=HfUri(type='bucket', id='my-org/my-bucket', ...), mount_path='/mnt', read_only=True)\r\n```\r\n\r\n📚 **Documentation:** [HF URIs reference](https://huggingface.co/docs/huggingface_hub/main/en/package_reference/hf_uris)\r\n\r\n- Centralize hf:// URI parsing by @Wauplin in #4158\r\n\r\n## 🚀 Bucket transport for Jobs script upload\r\n\r\nLocal scripts uploaded by `hf jobs uv run` are now stored in a `{namespace}/jobs-artifacts` bucket and mounted into the job container at `/data` instead of being base64-encoded into an environment variable. The old `bash -c` + `xargs` + `base64 -d` pipeline was fragile and required manual shell quoting. Bucket transport is simpler, easier to debug, and supports write-back: jobs can persist output artifacts to `/data/` since the mount is read-write. The base64 transport path has been fully removed with no fallback.\r\n\r\n- Add bucket+mount transport for Jobs script upload by @davanstrien in #4025\r\n\r\n## 🖥️ CLI\r\n\r\n- [CLI] Print help when leaf command with required args is called without args by @Wauplin in #4135\r\n\r\n## 🤖 Inference\r\n\r\n- [Inference Providers] Add DeepInfra support by @hanouticelina in #4114\r\n- Support list[str] inputs in feature_extraction by @SJeffZhang in #4115\r\n\r\n## 📖 Documentation\r\n\r\n- [CLI] Add benchmark dataset filter examples by @hanouticelina in #4156\r\n\r\n## 🐛 Bug and typo fixes\r\n\r\n- [BUG FIX]: hf_hub_download crashes when stderr lacks a real file descriptor by @tobocop2 in #4065\r\n- [CLI] Fix datasets list table rendering by @hanouticelina in #4157\r\n- [CLI] Fix installation method detection for curl-installed hf with Homebrew Python by @Wauplin in #4142\r\n- Avoid reuploading preuploaded LFS files in upload-large-folder by @Dev-Jahn in #4165\r\n\r\n## 🏗️ Internal\r\n\r\n- [Release] Make release-notes job fail loudly on bad model/empty output by @Wauplin in #4138\r\n- [Release] Fix bucket URL in social posts Slack notification by @Wauplin in #4139\r\n- Post-release: bump version to 1.13.0.dev0 by @huggingface-hub-bot[bot] in #4140\r\n- [CI] Fix two flaky Windows tests (root causes, not skips) by @Wauplin in #4141\r\n- [Quality] Fix uvx ty check src errors by @Wauplin in #4159\r\n- [Release] Mark minor releases as \"latest\" on GitHub by @Wauplin in #4167","publishedAt":"2026-04-30T11:48:16.000Z","url":"https://github.com/huggingface/huggingface_hub/releases/tag/v1.13.0","media":[],"prerelease":false,"source":{"slug":"huggingface-hub","name":"huggingface_hub","type":"github"},"product":{"slug":"hub","name":"Hub"},"groupSlug":"hub","groupName":"Hub","coverageCount":0,"contentChars":null,"contentTokens":null,"composition":null},{"id":"rel_EQChd3i1u7MCvTm-sIdkn","version":"v1.12.2","type":"feature","title":"[v1.12.2] Add DeepInfra support for Inference Providers","summary":"- [Inference Providers] Add DeepInfra support in https://github.com/huggingface/huggingface_hub/pull/4114 by @hanouticelina \r\n\r\n\r\n**Full Changelog**: ...","titleGenerated":null,"titleShort":null,"content":"- [Inference Providers] Add DeepInfra support in https://github.com/huggingface/huggingface_hub/pull/4114 by @hanouticelina \r\n\r\n\r\n**Full Changelog**: https://github.com/huggingface/huggingface_hub/compare/v1.12.1...v1.12.2","publishedAt":"2026-04-29T09:49:37.000Z","url":"https://github.com/huggingface/huggingface_hub/releases/tag/v1.12.2","media":[],"prerelease":false,"source":{"slug":"huggingface-hub","name":"huggingface_hub","type":"github"},"product":{"slug":"hub","name":"Hub"},"groupSlug":"hub","groupName":"Hub","coverageCount":0,"contentChars":null,"contentTokens":null,"composition":null},{"id":"rel_bSaI975vPRIpWGNPaoP2O","version":"v1.12.0","type":"feature","title":"[v1.12.0] Unified CLI output, bucket search, and more","summary":"## 🖥️ Unified output format for `hf buckets` commands\r\n\r\nAll `hf buckets` commands now use the unified `--format [auto|human|agent|json|quiet]` flag ...","titleGenerated":null,"titleShort":null,"content":"## 🖥️ Unified output format for `hf buckets` commands\r\n\r\nAll `hf buckets` commands now use the unified `--format [auto|human|agent|json|quiet]` flag and the `out` singleton for consistent, scriptable output. The previous `--quiet` and `--format table|json` flags have been replaced by a single `--format` option that works across `create`, `list`, `info`, `delete`, `rm`, `move`, and `cp`. Success messages use `out.result()`, detail views use `out.dict()`, and listings use `out.table()` with proper empty-results handling — making the buckets CLI consistent with the rest of the `hf` command suite.\r\n\r\n```bash\r\n# Quiet mode: print only bucket IDs\r\nhf buckets list --format quiet\r\n\r\n# JSON output for scripting\r\nhf buckets create my-bucket --format json\r\n\r\n# Agent-friendly structured output\r\nhf buckets info username/my-bucket --format agent\r\n```\r\n\r\n- [CLI] Migrate buckets commands to out singleton by @hanouticelina in #4111\r\n\r\n📚 **Documentation:** [Buckets guide](https://huggingface.co/docs/huggingface_hub/main/en/guides/buckets) · [CLI guide](https://huggingface.co/docs/huggingface_hub/main/en/guides/cli)\r\n\r\n## 🪣 Search buckets by name\r\n\r\nYou can now filter buckets by name when listing them, both from the Python API and the CLI. Pass `search=\"checkpoint\"` to `list_buckets()` or `--search \"checkpoint\"` to `hf buckets list` to find buckets matching a name pattern, without having to list and filter client-side.\r\n\r\n```bash\r\n# Filter buckets by name\r\nhf buckets list --search \"checkpoint\"\r\n```\r\n\r\n```py\r\n# Filter buckets by name in Python\r\nfor bucket in list_buckets(search=\"checkpoint\"):\r\n    print(bucket.id)\r\n```\r\n\r\n- [Buckets] Add search param to list_buckets by @alexpouliquen in #4130\r\n\r\n📚 **Documentation:** [Buckets guide](https://huggingface.co/docs/huggingface_hub/main/en/guides/buckets) · [CLI guide](https://huggingface.co/docs/huggingface_hub/main/en/guides/cli)\r\n\r\n## 🖥️ CLI\r\n\r\n- [CLI] spaces hot-reload: misc improvements by @cbensimon in #4049\r\n- [CLI] Detect `pi` agent by @hanouticelina in #4125\r\n\r\n## 🐛 Bug and typo fixes\r\n\r\n- Apply fsspec config in HfFileSystem metaclass by @joaquinhuigomez in #4062\r\n\r\n## 🔧 Other QoL Improvements\r\n\r\n- [Buckets] Skip local walk for download sync without delete by @abidlabs in #4123\r\n- [HfApi] Add `mainSize` to `ExpandDatasetProperty_T` by @Wauplin in #4136\r\n\r\n## 🏗️ Internal\r\n\r\n- [Internal] Fix slack-message draft release permissions + update model by @hanouticelina in #4119\r\n- Post-release: bump version to 1.12.0.dev0 by @huggingface-hub-bot[bot] in #4120\r\n- [Internal] Make RELEASE_NOTES_MODEL configurable via repo variable by @Wauplin in #4126\r\n- [Release] Add social media draft generation to release workflow by @Wauplin in #4132\r\n- chore: bump doc-builder SHA for main doc build workflow by @rtrompier in #4137\r\n- [Release] Make release-notes job fail loudly on bad model/empty output by @Wauplin in #4138\r\n","publishedAt":"2026-04-24T13:16:30.000Z","url":"https://github.com/huggingface/huggingface_hub/releases/tag/v1.12.0","media":[],"prerelease":false,"source":{"slug":"huggingface-hub","name":"huggingface_hub","type":"github"},"product":{"slug":"hub","name":"Hub"},"groupSlug":"hub","groupName":"Hub","coverageCount":0,"contentChars":null,"contentTokens":null,"composition":null},{"id":"rel_yXJaHBJDwmowE6G0P3-bZ","version":"v1.11.0","type":"feature","title":"[v1.11.0] Semantic Spaces search, Space logs, and more","summary":"## 🔍 Semantic search for Spaces\r\n\r\nDiscover Spaces using natural language. The new `search_spaces()` API and `hf spaces search` CLI use embedding-bas...","titleGenerated":null,"titleShort":null,"content":"## 🔍 Semantic search for Spaces\r\n\r\nDiscover Spaces using natural language. The new `search_spaces()` API and `hf spaces search` CLI use embedding-based semantic search to find relevant Spaces based on what they do - not just keyword matching on their name.\r\n\r\n```python\r\n>>> from huggingface_hub import search_spaces\r\n\r\n>>> results = search_spaces(\"remove background from photo\")\r\n>>> for space in results:\r\n...     print(f\"{space.id} (score: {space.score:.2f})\")\r\nbriaai/BRIA-RMBG-1.4 (score: 0.87)\r\n```\r\n\r\nThe same capability is available in the CLI:\r\n\r\n```bash\r\n$ hf spaces search \"remove background from photo\" --limit 3\r\nID                           TITLE                 SDK    LIKES STAGE   CATEGORY           SCORE\r\n---------------------------- --------------------- ------ ----- ------- ------------------ -----\r\nnot-lain/background-removal  Background Removal    gradio 2794  RUNNING Image Editing      0.85 \r\nbriaai/BRIA-RMBG-2.0         BRIA RMBG 2.0         gradio 918   RUNNING Background Removal 0.84 \r\nXenova/remove-background-web Remove Background Web static 739   RUNNING Background Removal 0.81 \r\nHint: Use --description to show AI-generated descriptions.\r\n\r\n# Filter by SDK, get JSON with descriptions\r\n$ hf spaces search \"chatbot\" --sdk gradio --description --json --limit 1 | jq\r\n[\r\n  {\r\n    \"id\": \"BarBar288/Chatbot\",\r\n    \"title\": \"Chatbot\",\r\n    \"sdk\": \"gradio\",\r\n    \"likes\": 4,\r\n    \"stage\": \"RUNNING\",\r\n    \"category\": \"Other\",\r\n    \"score\": 0.5,\r\n    \"description\": \"Perform various AI tasks like chat, image generation, and text-to-speech\"\r\n  }\r\n]\r\n```\r\n\r\n- [Add `hf spaces` command with semantic search](https://github.com/huggingface/huggingface_hub/pull/4094) by @Wauplin in #4094\r\n\r\n## 📜 Programmatic access to Space logs\r\n\r\nWhen a Space fails to build or crashes at runtime, you can now retrieve the logs programmatically — no need to open the browser. This is particularly useful for agentic workflows that need to debug Space failures autonomously.\r\n\r\n```python\r\n>>> from huggingface_hub import fetch_space_logs\r\n\r\n# Run logs (default)\r\n>>> for line in fetch_space_logs(\"username/my-space\"):\r\n...     print(line, end=\"\")\r\n\r\n# Build logs — for BUILD_ERROR debugging\r\n>>> for line in fetch_space_logs(\"username/my-space\", build=True):\r\n...     print(line, end=\"\")\r\n\r\n# Stream in real time\r\n>>> for line in fetch_space_logs(\"username/my-space\", follow=True):\r\n...     print(line, end=\"\")\r\n```\r\n\r\nThe CLI equivalent:\r\n\r\n```bash\r\n$ hf spaces logs username/my-space              # run logs\r\n$ hf spaces logs username/my-space --build      # build logs\r\n$ hf spaces logs username/my-space -f           # stream in real time\r\n$ hf spaces logs username/my-space -n 50        # last 50 lines\r\n```\r\n\r\n\r\n- [Add `fetch_space_logs` + `hf spaces logs` command](https://github.com/huggingface/huggingface_hub/pull/4091) by @davanstrien in #4091\r\n\r\n## 🖥️ CLI output standardization continues\r\n\r\nThis release continues the CLI output migration [started in v1.9](https://github.com/huggingface/huggingface_hub/releases/tag/v1.9.0), bringing 11 more command groups to the unified `--format` flag. The old `--quiet` flags on migrated commands are replaced by `--format quiet`.\r\n\r\n```bash\r\n$ hf cache ls                          # auto-detect (human or agent)\r\n$ hf cache ls --format json            # structured JSON\r\n$ hf cache ls --format quiet           # minimal output, great for piping\r\n$ hf upload my-model . .               # auto-detect (human or agent)\r\n```\r\n\r\nConfirmation prompts (e.g., `hf cache rm`, `hf repos delete`, `hf buckets delete`) are now mode-aware: they prompt in human mode, and require `--yes` in agent/json/quiet modes - no more hanging scripts.\r\n\r\nCommands migrated in this release: `collections`, `discussions`, `extensions`, `endpoints`, `webhooks`, `cache`, `repos`, `repo-files`, `download`, `upload`, and `upload-large-folder`. Remaining commands (`jobs`, `buckets`, `auth login/logout`) will follow in a future release.\r\n\r\n\r\n- [Migrate `collections`, `discussions`, `extensions`, `endpoints` and `webhooks` to `out` singleton](https://github.com/huggingface/huggingface_hub/pull/4057) by @hanouticelina in #4057\r\n- [Migrate `hf cache` to `out` singleton](https://github.com/huggingface/huggingface_hub/pull/4070) by @hanouticelina in #4070\r\n- [Add `out.confirm()` and migrate all confirmation prompts](https://github.com/huggingface/huggingface_hub/pull/4083) by @hanouticelina in #4083\r\n- [Migrate `repos` and `repo-files` to `out` singleton + add confirmation to `hf repos delete`](https://github.com/huggingface/huggingface_hub/pull/4097) by @hanouticelina in #4097\r\n- [Migrate `download`, `upload`, `upload-large-folder` to `out` singleton](https://github.com/huggingface/huggingface_hub/pull/4100) by @hanouticelina in #4100\r\n\r\n## 📦 Space volumes management from the CLI\r\n\r\nA new `hf spaces volumes` command group lets you manage volumes mounted in Spaces directly from the command line — list, set, and delete using the familiar `-v`/`--volume` syntax.\r\n\r\n```bash\r\n# List mounted volumes\r\n$ hf spaces volumes ls username/my-space\r\nTYPE    SOURCE                MOUNT_PATH READ_ONLY\r\n------- --------------------- ---------- ---------\r\nmodel   gpt2                  /data      ✔\r\ndataset badlogicgames/pi-mono /data2     ✔\r\n\r\n# Set volumes\r\n$ hf spaces volumes set username/my-space -v hf://buckets/username/my-bucket:/data\r\n$ hf spaces volumes set username/my-space -v hf://models/username/my-model:/models\r\n\r\n# Delete all volumes\r\n$ hf spaces volumes delete username/my-space\r\n```\r\n\r\n- [Add `hf spaces volumes` commands](https://github.com/huggingface/huggingface_hub/pull/4109) by @Wauplin in #4109\r\n\r\n## 🔧 More CLI improvements\r\n\r\n**`hf auth token`** - Prints the current token to stdout, handy for piping into other commands:\r\n\r\n```bash\r\n$ hf auth token\r\nhf_xxxx\r\nHint: Run `hf auth whoami` to see which account this token belongs to.\r\n\r\n# Use it in a curl call\r\n$ hf auth token | xargs -I {} curl -H \"Authorization: Bearer {}\" https://huggingface.co/api/whoami-v2\r\n```\r\n\r\n- [Add `hf auth token` command](https://github.com/huggingface/huggingface_hub/pull/4104) by @Wauplin in #4104\r\n\r\n## 💔 Breaking change\r\n\r\n**`model_name` deprecated in `list_models`** - Use `search` instead. Both were always equivalent (both map to `?search=...` in the API), but now `model_name` emits a deprecation warning. Removal is planned for 2.0.\r\n\r\n```python\r\n# Before\r\n>>> list_models(model_name=\"gemma\")\r\n\r\n# After\r\n>>> list_models(search=\"gemma\")\r\n```\r\n\r\nThe CLI is not affected - `hf models ls` already uses `--search`.\r\n\r\n- [Deprecate `model_name` in favor of `search` in `list_models`](https://github.com/huggingface/huggingface_hub/pull/4112) by @Wauplin in #4112\r\n\r\n## 🔧 Other improvements\r\n\r\n- [Support kernels in `list_liked_repos`](https://github.com/huggingface/huggingface_hub/pull/4078) by @Wauplin in #4078\r\n\r\n## 🐛 Bug fixes\r\n\r\n- [Fix copy file to folder](https://github.com/huggingface/huggingface_hub/pull/4075) by @Wauplin in #4075\r\n- [Match Unix `cp -r` nesting semantics in `copy_files`](https://github.com/huggingface/huggingface_hub/pull/4081) by @Wauplin in #4081\r\n- [Ignore `.gitattributes` when copying repo files to a bucket](https://github.com/huggingface/huggingface_hub/pull/4082) by @Wauplin in #4082\r\n- [Fix reference cycle in `hf_raise_for_status` causing delayed object destruction](https://github.com/huggingface/huggingface_hub/pull/4092) by @Wauplin in #4092\r\n- [Fix `repo delete` tests missing `--yes` flag](https://github.com/huggingface/huggingface_hub/pull/4101) by @hanouticelina in #4101\r\n\r\n## 📖 Documentation\r\n\r\n- [Update copy files CLI docs](https://github.com/huggingface/huggingface_hub/pull/4095) by @Wauplin in #4095\r\n- [Fix copy files docs](https://github.com/huggingface/huggingface_hub/pull/4096) by @Wauplin in #4096\r\n- [Give manage-spaces walkthrough steps real headings](https://github.com/huggingface/huggingface_hub/pull/4108) by @davanstrien in #4108\r\n- [Clarify that `-v`/`--volume` accepts multiple volumes](https://github.com/huggingface/huggingface_hub/pull/4113) by @davanstrien in #4113\r\n\r\n## 🏗️ Internal\r\n\r\n- [[CI] Fix Opencode checksum validation](https://github.com/huggingface/huggingface_hub/pull/4073) by @Wauplin in #4073\r\n- [Post-release: bump version to 1.11.0.dev0](https://github.com/huggingface/huggingface_hub/pull/4074) by @huggingface-hub-bot[bot] in #4074\r\n- [[Release] Notify PRs included in a release](https://github.com/huggingface/huggingface_hub/pull/4077) by @Wauplin in #4077\r\n- [Update staging CI user](https://github.com/huggingface/huggingface_hub/pull/4093) by @Wauplin in #4093\r\n- [Remove unused inputs from release workflow](https://github.com/huggingface/huggingface_hub/pull/4098) by @Wauplin in #4098\r\n- [Bump doc-builder SHA for PR upload workflow](https://github.com/huggingface/huggingface_hub/pull/4103) by @rtrompier in #4103\r\n- [[Internal] Update AGENTS.md](https://github.com/huggingface/huggingface_hub/pull/4110) by @Wauplin in #4110\r\n","publishedAt":"2026-04-16T12:16:19.000Z","url":"https://github.com/huggingface/huggingface_hub/releases/tag/v1.11.0","media":[],"prerelease":false,"source":{"slug":"huggingface-hub","name":"huggingface_hub","type":"github"},"product":{"slug":"hub","name":"Hub"},"groupSlug":"hub","groupName":"Hub","coverageCount":0,"contentChars":null,"contentTokens":null,"composition":null},{"id":"rel_XbchXL2o88m0ljS-ZzT03","version":"v1.10.2","type":"feature","title":"[v1.10.2] Fix reference cycle in hf_raise_for_status","summary":"- Fix reference cycle in hf_raise_for_status causing delayed object destruction by @Wauplin in #4092\r\n\r\n**Full Changelog**: https://github.com/hugging...","titleGenerated":null,"titleShort":null,"content":"- Fix reference cycle in hf_raise_for_status causing delayed object destruction by @Wauplin in #4092\r\n\r\n**Full Changelog**: https://github.com/huggingface/huggingface_hub/compare/v1.10.1...v1.10.2","publishedAt":"2026-04-14T10:45:28.000Z","url":"https://github.com/huggingface/huggingface_hub/releases/tag/v1.10.2","media":[],"prerelease":false,"source":{"slug":"huggingface-hub","name":"huggingface_hub","type":"github"},"product":{"slug":"hub","name":"Hub"},"groupSlug":"hub","groupName":"Hub","coverageCount":0,"contentChars":null,"contentTokens":null,"composition":null},{"id":"rel_VxDFpT09aEDo7JAtfkM02","version":"v1.10.1","type":"feature","title":"[v1.10.1] Fix copy file to folder","summary":"- Fix copy file to folder (#4075)\r\n- [CLI ]Improving a bit hf CLI discoverability (#4079) \r\n- Support kernels in list_liked_repos (#4078) \r\n\r\n**Full C...","titleGenerated":null,"titleShort":null,"content":"- Fix copy file to folder (#4075)\r\n- [CLI ]Improving a bit hf CLI discoverability (#4079) \r\n- Support kernels in list_liked_repos (#4078) \r\n\r\n**Full Changelog**: https://github.com/huggingface/huggingface_hub/compare/v1.10.0...v1.10.1","publishedAt":"2026-04-09T15:05:52.000Z","url":"https://github.com/huggingface/huggingface_hub/releases/tag/v1.10.1","media":[],"prerelease":false,"source":{"slug":"huggingface-hub","name":"huggingface_hub","type":"github"},"product":{"slug":"hub","name":"Hub"},"groupSlug":"hub","groupName":"Hub","coverageCount":0,"contentChars":null,"contentTokens":null,"composition":null},{"id":"rel_PBYQRojy9DB4rlLzZegvL","version":"v1.10.0","type":"feature","title":"[v1.10.0] Instant file copy and new Kernel repo type","summary":"## 📁 Instant file copy between Buckets and Repositories\r\n\r\nThis release introduces server-side file copy operations that let you move data between Hu...","titleGenerated":null,"titleShort":null,"content":"## 📁 Instant file copy between Buckets and Repositories\r\n\r\nThis release introduces server-side file copy operations that let you move data between Hugging Face storage without downloading and re-uploading. You can now copy files from one Bucket to another, from a repository (model, dataset, or Space) to a Bucket, or between Buckets — all without bandwidth costs. Files tracked with Xet are copied directly by hash (no data transfer), while small text files not tracked with Xet are automatically downloaded and re-uploaded.\r\n\r\n```python\r\n>>> from huggingface_hub import copy_files\r\n\r\n# Bucket to bucket (same or different bucket)\r\n>>> copy_files(\r\n...     \"hf://buckets/username/source-bucket/checkpoints/model.safetensors\",\r\n...     \"hf://buckets/username/destination-bucket/archive/model.safetensors\",\r\n... )\r\n\r\n# Repo to bucket\r\n>>> copy_files(\r\n...     \"hf://datasets/username/my-dataset/processed/\",\r\n...     \"hf://buckets/username/my-bucket/datasets/processed/\",\r\n... )\r\n```\r\n\r\nThe same capability is available in the CLI:\r\n\r\n```bash\r\n# Bucket to bucket\r\n>>> hf buckets cp hf://buckets/username/source-bucket/logs/ hf://buckets/username/archives/logs/\r\n\r\n# Repo to bucket\r\n>>> hf buckets cp hf://datasets/username/my-dataset/data/train/ hf://buckets/username/my-bucket/datasets/train/\r\n```\r\n\r\nNote that copying files from a Bucket to a Repository is not yet supported.\r\n\r\n📚 **Documentation:** [Buckets guide](https://huggingface.co/docs/huggingface_hub/main/en/guides/buckets#copy-files-to-bucket)\r\n\r\n- [`HfApi.copy_files` method to copy files remotely and update 'hf buckets cp'](https://github.com/huggingface/huggingface_hub/pull/3874) by @Wauplin in #3874\r\n- [Add bucket to collection](https://github.com/huggingface/huggingface_hub/pull/4041) by @coyotte508 in #4041\r\n\r\n## ⚛️ Introducing Kernel repositories\r\n\r\n> [!TIP]\r\n> For building, publishing, and using kernel repos, please use the dedicated [`kernels`](https://github.com/huggingface/kernels) package.\r\n\r\nThe Hub now supports a new `kernel` repository type for hosting compute kernels. This release adds first-class (but explicitly limited) support for interacting with kernel repos via the Python API. Only a subset of methods are officially supported: `kernel_info`, `hf_hub_download`, `snapshot_download`, `list_repo_refs`, `list_repo_files`, and `list_repo_tree`. Creation and deletion are also supported but restricted to a small subset of allowed users and organizations on the Hub.\r\n\r\n```python\r\n>>> from huggingface_hub import kernel_info\r\n>>> kernel_info(\"kernels-community/yoso\")\r\nKernelInfo(id='kernels-community/yoso', author='kernels-community', downloads=0, gated=False, last_modified=datetime.datetime(2026, 4, 3, 22, 27, 25, tzinfo=datetime.timezone.utc), likes=0, private=False)\r\n```\r\n\r\n📚 **Documentation:** [Repository guide](https://huggingface.co/docs/huggingface_hub/main/en/guides/repository#kernel-repositories)\r\n\r\n- [[Kernels] Minimal kernel repo type support (create/delete, download files, list refs/files/tree)](https://github.com/huggingface/huggingface_hub/pull/4068) by @drbh in #4068\r\n\r\n## 📖 Documentation\r\n\r\n- [[Docs] Fix outdated docs](https://github.com/huggingface/huggingface_hub/pull/4055) by @hanouticelina in #4055\r\n\r\n## 🐛 Bug and typo fixes\r\n\r\n- [Fix custom `tqdm_class` silently broken in non-TTY environments](https://github.com/huggingface/huggingface_hub/pull/4056) by @hanouticelina in #4056\r\n- [Fix set_space_volumes sending bare array instead of object](https://github.com/huggingface/huggingface_hub/pull/4054) by @davanstrien in #4054\r\n- [Fix set_space_volume / delete_space_volume return types](https://github.com/huggingface/huggingface_hub/pull/4061) by @abidlabs in #4061\r\n\r\n## 🏗️ Internal\r\n\r\n- [[CI] Slack-message reads draft release from GitHub directly](https://github.com/huggingface/huggingface_hub/pull/4044) by @Wauplin in #4044\r\n- [[CI] Fix upgrading release notes to latest release](https://github.com/huggingface/huggingface_hub/pull/4045) by @Wauplin in #4045\r\n- [Add live Slack notifications to release workflow](https://github.com/huggingface/huggingface_hub/pull/4046) by @Wauplin in #4046\r\n- [Post-release: bump version to 1.10.0.dev0](https://github.com/huggingface/huggingface_hub/pull/4047) by @huggingface-hub-bot[bot] in #4047\r\n- [skills publish script run in action to sync up descriptions etc.](https://github.com/huggingface/huggingface_hub/pull/4048) by @evalstate in #4048\r\n- [[CI] Harden release workflow permissions and inputs](https://github.com/huggingface/huggingface_hub/pull/4072) by @Wauplin in #4072\r\n- [[CI] Fix Opencode checksum validation](https://github.com/huggingface/huggingface_hub/pull/4073) by @Wauplin in #4073","publishedAt":"2026-04-09T12:30:35.000Z","url":"https://github.com/huggingface/huggingface_hub/releases/tag/v1.10.0","media":[],"prerelease":false,"source":{"slug":"huggingface-hub","name":"huggingface_hub","type":"github"},"product":{"slug":"hub","name":"Hub"},"groupSlug":"hub","groupName":"Hub","coverageCount":0,"contentChars":null,"contentTokens":null,"composition":null},{"id":"rel_9OTjDzDAmUUy0xuIzOh61","version":"v1.9.2","type":"feature","title":"[v1.9.2] Fix set_space_volume / delete_space_volume return types","summary":"- Fix set_space_volume / delete_space_volume return types #4061 by @abidlabs @Wauplin \r\n\r\n**Full Changelog**: https://github.com/huggingface/huggingfa...","titleGenerated":null,"titleShort":null,"content":"- Fix set_space_volume / delete_space_volume return types #4061 by @abidlabs @Wauplin \r\n\r\n**Full Changelog**: https://github.com/huggingface/huggingface_hub/compare/v1.9.1...v1.9.2","publishedAt":"2026-04-08T08:44:48.000Z","url":"https://github.com/huggingface/huggingface_hub/releases/tag/v1.9.2","media":[],"prerelease":false,"source":{"slug":"huggingface-hub","name":"huggingface_hub","type":"github"},"product":{"slug":"hub","name":"Hub"},"groupSlug":"hub","groupName":"Hub","coverageCount":0,"contentChars":null,"contentTokens":null,"composition":null},{"id":"rel_YWp9eLDoO07f1M_1LUUbC","version":"v1.9.1","type":"feature","title":"[v1.9.1] Fix: `set_space_volumes` sending bare array instead of object","summary":"\r\n- Fix `set_space_volumes` sending bare array instead of object #4054 by @davanstrien \r\n\r\n**Full Changelog**: https://github.com/huggingface/huggingf...","titleGenerated":null,"titleShort":null,"content":"\r\n- Fix `set_space_volumes` sending bare array instead of object #4054 by @davanstrien \r\n\r\n**Full Changelog**: https://github.com/huggingface/huggingface_hub/compare/v1.9.0...v1.9.1","publishedAt":"2026-04-07T13:50:34.000Z","url":"https://github.com/huggingface/huggingface_hub/releases/tag/v1.9.1","media":[],"prerelease":false,"source":{"slug":"huggingface-hub","name":"huggingface_hub","type":"github"},"product":{"slug":"hub","name":"Hub"},"groupSlug":"hub","groupName":"Hub","coverageCount":0,"contentChars":null,"contentTokens":null,"composition":null},{"id":"rel_eDUA4eTugGOL0AW61yhb7","version":"v1.9.0","type":"feature","title":"[v1.9.0] Agent-Aware CLI, Spaces Volumes, and more","summary":"## 🚀 Spaces Volumes: Mount Models, Datasets, and Buckets Directly\r\n\r\nHugging Face Spaces now support mounting volumes, giving your Space direct files...","titleGenerated":null,"titleShort":null,"content":"## 🚀 Spaces Volumes: Mount Models, Datasets, and Buckets Directly\r\n\r\nHugging Face Spaces now support mounting volumes, giving your Space direct filesystem access to models, datasets, and storage buckets. This replaces the deprecated persistent storage feature.\r\n\r\n```python\r\nfrom huggingface_hub import HfApi, Volume\r\n\r\napi = HfApi()\r\napi.set_space_volumes(\r\n    repo_id=\"username/my-space\",\r\n    volumes=[\r\n        Volume(type=\"model\", source=\"username/my-model\", mount_path=\"/models\", read_only=True),\r\n        Volume(type=\"bucket\", source=\"username/my-bucket\", mount_path=\"/data\"),\r\n    ],\r\n)\r\n```\r\n\r\nVolumes can also be set at creation time via `create_repo(space_volumes=...)` and `duplicate_repo(space_volumes=...)`, and from the CLI with the `--volume` / `-v` flag:\r\n\r\n```bash\r\n# Create a Space with volumes mounted\r\nhf repos create my-space --type space --space-sdk gradio \\\r\n    -v hf://gpt2:/models -v hf://buckets/org/b:/data\r\n\r\n# Duplicate a Space with volumes\r\nhf repos duplicate org/my-space my-space --type space \\\r\n    -v hf://gpt2:/models -v hf://buckets/org/b:/data\r\n```\r\n\r\n- Add support for mounted volumes by @Wauplin in #4018\r\n- Support volumes at repo creation and duplication by @Wauplin in #4035\r\n\r\n## 🤖 The `hf` CLI Now Auto-Detects AI Agents and Adapts Its Output\r\n\r\nAI coding agents (Claude Code, Cursor, Codex, Copilot, Gemini, ...) increasingly use the `hf` CLI to interact with the Hub. Until now, the output was designed for humans - ANSI colors, padded tables, emoji booleans, truncated cells - making it hard for agents to parse reliably.\r\n\r\nStarting with v1.9, the CLI **automatically detects when it's running inside an agent** and adapts its output: no ANSI, no truncation, tab-separated tables, compact JSON, full timestamps. No configuration needed - it just works. This is only a first step toward making the `hf` CLI the primary entry point to the Hugging Face Hub for AI agents!\r\n\r\nAgent mode is auto-detected but you can also force a mode explicitly with `--format`:\r\n\r\n```bash\r\nhf models ls --limit 5                  # auto-detect\r\nhf models ls --limit 5 --format agent   # force agent-friendly output\r\nhf models ls --limit 5 --format json    # structured JSON\r\nhf models ls --limit 5 --format quiet   # IDs only, great for piping\r\n```\r\n\r\nHere's what an agent sees compared to a human:\r\n\r\n**`hf auth whoami`**\r\n```\r\n# Human\r\n✓ Logged in\r\n  user: Wauplin\r\n  orgs: huggingface, awesome-org\r\n\r\n# Agent\r\nuser=Wauplin orgs=huggingface,awesome-org\r\n\r\n# JSON\r\n{\"user\": \"Wauplin\", \"orgs\": [\"huggingface\", \"awesome-org\"]}\r\n```\r\n\r\n**`hf models ls --author google --limit 3`**\r\n```\r\n# Human\r\nID                         DOWNLOADS TRENDING_SCORE\r\n-------------------------- --------- --------------\r\ngoogle/embeddinggemma-300m 1213145   17            \r\ngoogle/gemma-3-4b-it       1512637   16            \r\ngoogle/gemma-3-27b-it      988618    12   \r\n\r\n# Agent (TSV, no truncation, no ANSI)\r\nid      downloads       trending_score\r\ngoogle/embeddinggemma-300m      1213145 17\r\ngoogle/gemma-3-4b-it    1512637 16\r\ngoogle/gemma-3-27b-it   988618  12\r\n```\r\n\r\n**`hf models info google/gemma-3-27b-it`**\r\n```\r\n# Human — pretty-printed JSON (indent=2)\r\n{\r\n  \"id\": \"google/gemma-3-27b-it\",\r\n  \"author\": \"google\",\r\n  ...\r\n}\r\n\r\n# Agent — compact JSON (~40% fewer tokens)\r\n{\"id\": \"google/gemma-3-27b-it\", \"author\": \"google\", \"card_data\": ...}\r\n```\r\n\r\nCommands migrated so far: `hf models ls|info`, `hf datasets ls|info|parquet|sql`, `hf spaces ls|info`, `hf papers ls|search|info`, `hf auth whoami`. **More commands will be migrated soon**\r\n\r\n- Add `out` output singleton with agent/human mode rendering by @hanouticelina in #4005\r\n- Migrate `models`, `datasets`, `spaces`, `papers` to `out` singleton by @hanouticelina in #4026\r\n- Add `FormatWithAutoOpt` with callback to auto-set output mode by @hanouticelina in #4028\r\n- Add tests for `out` output singleton by @hanouticelina in #4020\r\n- Add agent detection helpers by @hanouticelina in #4015\r\n- Enrich CLI errors with available options and commands by @hanouticelina in #4034\r\n\r\n## 🧩 Install Agent Skills from the Hugging Face Marketplace\r\n\r\nThe `hf skills add` command now supports installing skills directly from the Hugging Face skills marketplace (https://github.com/huggingface/skills) - pre-built tools that give AI agents new capabilities.\r\n\r\n```bash\r\n# Install a marketplace skill\r\nhf skills add gradio\r\n\r\n# Install with Claude Code integration\r\nhf skills add huggingface-gradio --claude\r\n\r\n# Upgrade all installed skills\r\nhf skills upgrade\r\n```\r\n\r\n- Support skills from hf skills by @burtenshaw in #3956\r\n- Improve `hf` CLI skill description for better agent triggering by @hanouticelina in #3973\r\n\r\n## 🔧 More CLI Improvements\r\n\r\n- Auto-install official HF CLI extensions on first invocation by @hanouticelina in #4007\r\n- Add `summary` field to `hf papers search` CLI output by @Wauplin in #4006\r\n- Interactive CLI autoupdate prompt by @Wauplin in #3983\r\n\r\n## 🔧 Other Improvements\r\n\r\n- Clarify 404 access guidance in errors by @Pierrci in #4010\r\n- Add `HF_HUB_DISABLE_SYMLINKS` env variable to force no-symlink cache by @Wauplin in #4032\r\n- Add CACHEDIR.TAG to cache directories by @Wauplin in #4030\r\n- Support None type in strict dataclass by @Wauplin in #3987\r\n- Reject `bool`/`int` cross-type confusion in `@strict` dataclass validation by @Wauplin in #3992\r\n\r\n\r\n## 🐛 Bug Fixes\r\n\r\n- Fix PyTorchModelHubMixin not calling eval() on safetensors load by @joaquinhuigomez in #3997\r\n- Bump to hf-xet 1.4.3 and add regression test by @Wauplin in #4019\r\n- Validate shard filenames in sharded checkpoint index files by @Wauplin in #4033\r\n- Fix test_create_commit_conflict test by @Wauplin in #3986\r\n- Do not scan CACHEDIR.TAG file in cache by @Wauplin in #4036\r\n- Deduplicate repo folder name generation logic by @cphlipot in #4024\r\n\r\n## 📖 Documentation\r\n\r\n- Add tip about AI agents skill to CLI guide by @gary149 in #3970\r\n- Link to Hub local cache docs from manage-cache guide by @Wauplin in #3989\r\n- Note that environment variables are read at import time by @Wauplin in #3990\r\n- Add DatasetLeaderboardEntry and EvalResultEntry to docs reference by @pcuenca in #3982\r\n- Fix typos and outdated references in CONTRIBUTING.md by @GopalGB in #4009\r\n- no explicit models/ in hf:// protocol by @lhoestq in #3980\r\n- Add `CLAUDE.md` symlink pointing to `AGENTS.md` by @hanouticelina in #4013\r\n\r\n\r\n## 🏗️ Internal\r\n- Bump minimum Python version from 3.9 to 3.10 by @hanouticelina in #4008\r\n- Use `match`/`case` statements where appropriate by @hanouticelina in #4012\r\n- Fix `ty` type-checking errors after latest release by @hanouticelina in #3978\r\n- Prepare for v1.9 release by @Wauplin in #3988\r\n- Update python-release.yml by @hf-security-analysis[bot] in #4011\r\n- Pin GitHub Actions to commit SHAs by @paulinebm in #4029\r\n- Remove claude.yml workflow file by @hf-security-analysis[bot] in #4031\r\n- Generate slack message for prerelease by @Wauplin in #3976\r\n","publishedAt":"2026-04-02T15:59:04.000Z","url":"https://github.com/huggingface/huggingface_hub/releases/tag/v1.9.0","media":[],"prerelease":false,"source":{"slug":"huggingface-hub","name":"huggingface_hub","type":"github"},"product":{"slug":"hub","name":"Hub"},"groupSlug":"hub","groupName":"Hub","coverageCount":0,"contentChars":null,"contentTokens":null,"composition":null},{"id":"rel_THIXnvh0GZxg-pfgTIZSX","version":"v1.8.0","type":"feature","title":"[v1.8.0] Mounted volumes on Jobs, complete papers CLI, and more","summary":"## 🚀 Jobs can now mount volumes\r\n\r\nJobs can now access Hugging Face repositories (models, datasets, Spaces) and Storage Buckets directly as mounted v...","titleGenerated":null,"titleShort":null,"content":"## 🚀 Jobs can now mount volumes\r\n\r\nJobs can now access Hugging Face repositories (models, datasets, Spaces) and Storage Buckets directly as mounted volumes in their containers. This enables powerful workflows like running queries directly against datasets, loading models without explicit downloads, and persisting training checkpoints to buckets.\r\n\r\n```python\r\nfrom huggingface_hub import run_job, Volume\r\n\r\njob = run_job(\r\n    image=\"duckdb/duckdb\",\r\n    command=[\"duckdb\", \"-c\", \"SELECT * FROM '/data/**/*.parquet' LIMIT 5\"],\r\n    volumes=[\r\n        Volume(type=\"dataset\", source=\"HuggingFaceFW/fineweb\", mount_path=\"/data\"),\r\n    ],\r\n)\r\n```\r\n\r\n```bash\r\nhf jobs run -v hf://datasets/HuggingFaceFW/fineweb:/data duckdb/duckdb duckdb -c \"SELECT * FROM '/data/**/*.parquet' LIMIT 5\"\r\n```\r\n\r\n- Add volume mounting support for buckets and repos by @XciD in #3936\r\n\r\n## 📖 Papers CLI is now complete\r\n\r\nThe `hf papers` command now has full functionality: search papers by keyword, get structured JSON metadata, and read the full paper content as markdown. The `ls` command is also enhanced with new filters for week, month, and submitter.\r\n\r\n```bash\r\n# Search papers\r\nhf papers search \"vision language\"\r\n\r\n# Get metadata\r\nhf papers info 2601.15621\r\n\r\n# Read as markdown\r\nhf papers read 2601.15621\r\n```\r\n\r\n- Complete `hf papers` with search, info, read + ls filters by @mishig25 in #3952\r\n\r\n## 🖥️ CLI repo ID shorthand\r\n\r\nYou can now use repo ID prefixes like `spaces/user/repo`, `datasets/user/repo`, and `models/user/repo` as a shorthand for `user/repo --type space`. This works automatically for all CLI commands that accept a `--type` flag.\r\n\r\n```bash\r\n# Before\r\nhf download user/my-space --type space\r\nhf discussions list user/my-dataset --type dataset\r\n\r\n# After\r\nhf download spaces/user/my-space\r\nhf discussions list datasets/user/my-dataset\r\n```\r\n\r\n- Accept `spaces/user/repo` as repo ID prefix shorthand by @Wauplin in #3929\r\n\r\n## 🔧 More repo visibility options\r\n\r\nRepositories can now be created or updated with explicit visibility settings (`--public`, `--protected`) alongside the existing `--private` flag. This adds a `visibility` parameter to `HfApi.create_repo`, `update_repo_settings`, and `duplicate_repo`, with `--protected` available for Spaces only.\r\n\r\nProtected Spaces allow for private code while being publicly accessible.\r\n\r\n- Add `visibility` parameter to `HfApi` repo create/update/duplicate methods by @hanouticelina in #3951\r\n\r\n## 🖥️ CLI\r\n\r\n- Add space-specific options to `hf repos create` and `hf repos duplicate` by @Wauplin in #3888\r\n- Add `--format json` to `hf auth whoami` by @hanouticelina in #3938 — [docs](https://huggingface.co/docs/huggingface_hub/main/en/package_reference/cli)\r\n- Expand nested groups, inline flags & common options glossary in `SKILL.md` by @hanouticelina in #3941\r\n- Include common options inline in generated `SKILL.md` by @hanouticelina in #3955\r\n- Fix `hf extensions install` on uv-managed Python by using uv when available by @hanouticelina in #3957\r\n- Add dataset leaderboard method to HfApi by @davanstrien in #3953\r\n- More explicit spaces hot-reload docs by @cbensimon in #3964\r\n- Update hardware flavors with HF Hub (cpu-performance, sprx8, h200, inf2x6) by @cbensimon in #3965 — [docs](https://huggingface.co/docs/huggingface_hub/main/en/package_reference/cli)\r\n\r\n## 🔧 Other QoL Improvements\r\n\r\n- Rename `.env` to `.venv` in virtual environment instructions by @julien-c in #3939 — [docs](https://huggingface.co/docs/huggingface_hub/main/en/installation)\r\n- Fix typo in `--every` help text by @julien-c in #3950\r\n- More robust stream to stdout in `hf cp` command by @Wauplin in #3968\r\n\r\n## 🐛 Bug and typo fixes\r\n\r\n- Use module logger consistently and narrow bare except clauses by @mango766 in #3924\r\n- Fix HfFileSystem glob in missing subdir by @lhoestq in #3935\r\n\r\n## 🏗️ Internal\r\n\r\n- Remove conda workflow by @Wauplin in #3928\r\n- Replace `huggingface-cli` with `hf` in brew upgrade command by @hanouticelina in #3946\r\n- Fix version check message leaking into generated `SKILL.md` by @hanouticelina in #3949\r\n- Mention `hf-mount` in CLI skill by @hanouticelina in #3966\r\n- Use `huggingface-hub-bot` for post-release PR creation in `release.yml` by @Wauplin in #3967","publishedAt":"2026-03-25T15:46:22.000Z","url":"https://github.com/huggingface/huggingface_hub/releases/tag/v1.8.0","media":[],"prerelease":false,"source":{"slug":"huggingface-hub","name":"huggingface_hub","type":"github"},"product":{"slug":"hub","name":"Hub"},"groupSlug":"hub","groupName":"Hub","coverageCount":0,"contentChars":null,"contentTokens":null,"composition":null}],"pagination":{"nextCursor":"2026-03-25T15:46:22.000Z|2026-04-07T17:28:09.999Z|rel_THIXnvh0GZxg-pfgTIZSX","limit":20}}