Hub documentation
Nhà xuất bản được tin cậy
Nhà xuất bản được tin cậy
Đẩy lên Hub từ CI mà không cần lưu bí mật HF_TOKEN.
Công việc CI của bạn xác minh danh tính với Hugging Face bằng cách sử dụng token OpenID Connect (OIDC) có thời hạn ngắn từ nhà cung cấp CI của bạn, và nhận lại một token Hugging Face có thời hạn ngắn để đổi lại. Không cần lưu trữ token HF như một bí mật hay xoay vòng token.
| Token truy cập cá nhân | Nhà xuất bản được tin cậy | |
|---|---|---|
| Tuổi thọ | Cho đến khi bị thu hồi | 1 giờ |
| Lưu trữ | Bí mật CI | Không có gì để lưu trữ |
| Xoay | Thủ công | Tự động, mỗi lần chạy |
| Nếu bị rò rỉ | Có hiệu lực cho đến khi bạn thu hồi | Tối đa khoảng 1 giờ, và chỉ giới hạn trong một kho |
Trusted Publishers có cùng ý tưởng với Trusted Publishers của PyPI và Trusted Publishing của npm.
Ví dụ nhanh: phát hành một mô hình từ GitHub Actions
Bạn đang duy trì acme/awesome-model trên HF Hub và muốn CI trong kho acme/awesome-model-training được lưu trữ bên ngoài (trên GitHub, GitLab, hoặc bất kỳ nhà cung cấp nào tuân thủ OIDC) đẩy các checkpoint mới — không cần bí mật HF_TOKEN.
1. Cấu hình nhà xuất bản đáng tin cậy trên Hub
Trên https://huggingface.co/acme/awesome-model/settings, mở Trusted Publishers và thêm:
- Nhà cung cấp: GitHub Actions
- Claims (tất cả phải khớp để quá trình trao đổi thành công):
repository=acme/awesome-model-trainingbranch=mainworkflow=publish.yml
repositoryđơn lẻ chỉ giới hạn nhà phát hành trong một repo GitHub. Thêmbranchvà/hoặcworkflowđể cố định nó vào một nhánh hoặc tệp workflow — được khuyến nghị.
2. Thêm workflow vào kho GitHub của bạn
.github/workflows/publish.yml:
name: Publish to Hugging Face
on:
push:
branches: [main]
workflow_dispatch:
jobs:
publish:
runs-on: ubuntu-latest
permissions:
id-token: write # required so the job can request an OIDC token
contents: read
steps:
- uses: actions/checkout@v4
- name: Install the hf CLI
run: |
curl -LsSf https://hf.co/cli/install.sh | bash
echo "$HOME/.local/bin" >> "$GITHUB_PATH"
- name: Upload checkpoint
env:
# The HF repo to publish to. For non-model repos, prefix accordingly:
# datasets/acme/awesome-dataset, spaces/acme/awesome-space, kernels/acme/awesome-kernel
HF_OIDC_RESOURCE: acme/awesome-model
run: hf upload acme/awesome-model ./checkpoint . --commit-message "Publish from ${GITHUB_SHA::7}"Đó là tất cả. Trên GitHub Actions, CLI hf (huggingface_hub>=1.19.0) sẽ phát hiện nhà cung cấp, thực hiện trao đổi và tự động sử dụng token kết quả. Bạn chỉ cần đặt HF_OIDC_RESOURCE.
Xuất bản lên nhiều kho trong một lần chạy (ví dụ: một mô hình và một tập dữ liệu)? Đặt
HF_OIDC_RESOURCEcho từng bước để mỗi token được giới hạn phạm vi theo kho mà bước đó đẩy lên.
Các nhà cung cấp CI khác
CLI hf hiện chỉ tạo ID token một cách bản địa trên GitHub Actions. Trên GitLab, CircleCI, Bitbucket hoặc bất kỳ nhà cung cấp nào khác, bạn hãy tự tạo ID token (xem Các nhà cung cấp CI được hỗ trợ) và truyền nó qua HF_OIDC_ID_TOKEN — CLI sẽ trao đổi nó trực tiếp:
# GitLab CI (.gitlab-ci.yml)
publish:
id_tokens:
HF_ID_TOKEN:
aud: https://huggingface.co
script:
- curl -LsSf https://hf.co/cli/install.sh | bash
- export PATH="$HOME/.local/bin:$PATH"
- HF_OIDC_ID_TOKEN="$HF_ID_TOKEN" HF_OIDC_RESOURCE="acme/awesome-model" hf upload acme/awesome-model ./checkpoint .Các ví dụ hoạt động hoàn chỉnh:
- GitHub Actions —
github.com/coyotte508/publish-to-hf - GitLab CI —
gitlab.com/coyotte508/publish-to-hf
Hai loại: nhà xuất bản kho và danh tính CI/CD
| Hương vị | Được cấu hình trên | Những gì bạn nhận được | Sử dụng để… |
|---|---|---|---|
| Người phát hành đáng tin cậy của kho | Cài đặt → Nhà xuất bản được tin cậy của một kho | Một token có quyền ghi cho kho đó (hoặc quyền chỉ đọc) | Công bố một mô hình, bộ dữ liệu, Space, kernel hoặc bucket từ CI, hoặc kéo một tài nguyên riêng |
| Định danh CI/CD của tài khoản | Cài đặt xác thực → Truy cập CI/CD của tài khoản bạn | Một token chỉ đọc với phạm vi gated-repos, cùng với inference-api nếu bạn chọn tham gia | Đọc các kho có cổng mà bạn có quyền truy cập, sử dụng giới hạn tần suất của bạn và tùy chọn gọi Inference Providers từ CI |
Cả hai token đều hết hạn sau 60 phút. Bạn cần vai trò Write trên một kho Hub để quản lý các nhà xuất bản được tin cậy của nó.
Truy cập các kho có kiểm soát từ CI
Nếu bạn chỉ cần đọc các repo có kiểm soát (ví dụ: tải xuống một model từ một job), hãy thêm một danh tính CI/CD trên tài khoản của bạn tại Authentication settings → CI/CD Access thay vì trên một repo cụ thể, sau đó sử dụng username của bạn làm resource.
Trên GitHub Actions, CLI hf sẽ thực hiện quá trình trao đổi cho bạn, chỉ cần đặt HF_OIDC_RESOURCE:
- name: Download a gated model
env:
HF_OIDC_RESOURCE: your-hf-username
run: hf download acme/gated-modelTrên các nhà cung cấp khác, bạn tự tạo token ID (xem Các nhà cung cấp CI khác) và truyền nó qua HF_OIDC_ID_TOKEN:
# $ID_TOKEN is the OIDC token your provider minted (e.g. $HF_ID_TOKEN on GitLab)
HF_OIDC_ID_TOKEN="$ID_TOKEN" HF_OIDC_RESOURCE="your-hf-username" hf download acme/gated-modelToken kết quả có thể đọc các repo được bảo vệ mà bạn có quyền truy cập và sử dụng giới hạn tần suất (rate limits) của tài khoản bạn. Nó không thể ghi bất kỳ nội dung nào và không thể đọc các repo riêng tư của bạn. Để kéo (pull) một repo riêng tư từ CI, hãy sử dụng repo publisher chỉ đọc thay thế.
Bạn cần chính token (cho
curl,git clone, hoặc công cụ đọcHF_TOKEN)?hf auth tokenthực hiện việc trao đổi và in token có thời hạn ngắn ra stdout:- name: Get a short-lived HF token env: HF_OIDC_RESOURCE: your-hf-username # or a repo, e.g. acme/awesome-model run: echo "HF_TOKEN=$(hf auth token)" >> "$GITHUB_ENV"Cách này hoạt động với cả danh tính CI/CD và nhà xuất bản kho — token được giới hạn phạm vi theo thứ mà
HF_OIDC_RESOURCEtrỏ đến.
Nhà xuất bản kho chỉ đọc
Mặc định, một trusted publisher của repo sẽ tạo ra các token có thể push vào repo. Nếu workload chỉ cần pull một repo (ví dụ, để tải xuống một model hoặc dataset riêng tư từ một CI job hoặc một nền tảng bên ngoài phát hành token OIDC của riêng nó), hãy đánh dấu Read-only khi thêm publisher. Khi đó, các token được trao đổi sẽ có thể đọc nội dung của repo nhưng không thể ghi vào, và mục nhập sẽ hiển thị huy hiệu Read-only trong danh sách. Cách này hoạt động với models, datasets, Spaces, kernels và buckets.
Bản thân quá trình trao đổi không thay đổi. Chỉ định HF_OIDC_RESOURCE (hoặc resource) đến kho.
permissions:
id-token: write # required so the job can request an OIDC token
steps:
- name: Download a private model
env:
HF_OIDC_RESOURCE: acme/private-model
run: hf download acme/private-modelGiống như các cài đặt nhà xuất bản khác, quyền này được cố định khi tạo. Để thay đổi, hãy xóa nhà xuất bản và thêm lại.
Gọi các nhà cung cấp suy luận từ CI
Token từ một danh tính CI/CD mặc định chỉ có quyền đọc. Để cho phép chúng cũng gọi Inference Providers, hãy đánh dấu Allow Inference Providers calls khi thêm danh tính — token được trao đổi sau đó sẽ mang phạm vi inference-api bên cạnh gated-repos, và mục nhập sẽ hiển thị huy hiệu Inference trong danh sách.
Việc sử dụng suy luận sẽ được tính phí vào tài khoản của bạn, giống hệt như khi bạn tự thực hiện các yêu cầu — vì vậy hãy cố định chặt chẽ các yêu sách (repository và branch và/hoặc workflow) trước khi bật tính năng này.
- name: Run inference from CI
env:
HF_OIDC_RESOURCE: your-hf-username
run: |
export HF_TOKEN="$(hf auth token)"
python inference_script.pyNhà xuất bản kho (Repo publishers) không đủ điều kiện — token của họ có phạm vi kho (repo-scoped) và không thể gọi Inference Providers. Khả năng này được cố định khi tạo; để thay đổi, hãy xóa danh tính và thêm lại.
Nhà cung cấp CI được hỗ trợ
Giao diện cài đặt được cung cấp kèm theo các cấu hình mẫu cho các nhà cung cấp bên dưới, nhưng bất kỳ nhà cung cấp nào tuân thủ OIDC đều hoạt động (AWS, GCP, Buildkite, IdP của bạn, …).
| Nhà cung cấp | Nhà phát hành | Cách lấy token ID |
|---|---|---|
| GitHub Actions | https://token.actions.githubusercontent.com | Đặt permissions: id-token: write, sau đó gọi endpoint metadata với audience=https://huggingface.co. Tài liệu. |
| GitLab CI | https://gitlab.com (hoặc URL tự lưu trữ của bạn) | Khai báo id_tokens: { HF_ID_TOKEN: { aud: https://huggingface.co } } trên job; đọc $HF_ID_TOKEN. Tài liệu. |
| CircleCI | https://oidc.circleci.com/org/<org-uuid> | Sử dụng $CIRCLE_OIDC_TOKEN_V2 (v2 cho phép bạn thiết lập audience trong cài đặt dự án). Tài liệu. |
| Bitbucket Pipelines | https://api.bitbucket.org/2.0/workspaces/<workspace>/pipelines-config/identity/oidc | Đặt oidc: true cho bước; đọc $BITBUCKET_STEP_OIDC_TOKEN. Tài liệu. |
Khi bạn đã có token ID, lệnh gọi trao đổi là giống nhau giữa các nhà cung cấp — chỉ có các claims bạn cấu hình trên phía Hub là khác nhau.
Cách hoạt động
- Nhà cung cấp CI của bạn tạo ra một OIDC ID token có thời hạn ngắn mô tả công việc (kho nào, nhánh nào, workflow nào, …).
- Quy trình làm việc của bạn
POSTtoken đó đếnhttps://huggingface.co/oauth/token, cùng với mộtresource(kho hoặc tên người dùng mà nó muốn truy cập). - Hub kiểm tra chữ ký và các yêu sách của token đối với các nhà xuất bản mà bạn đã cấu hình cho tài nguyên đó, sau đó trả về một token Hugging Face.
┌──────────┐ 1. mint ID token ┌──────────┐ 2. exchange ┌────────────┐
│ CI job │ ─────────────────▶ │ CI OIDC │ ──────────────▶│ huggingface│
│ │ │ issuer │ │ /oauth/ │
│ │ ◀──────────────────────────────────────────────│ token │
└──────────┘ 3. short-lived HF token (valid 1 h) └────────────┘Tham khảo API
Endpoint, request, and response
Điểm cuối: POST https://huggingface.co/oauth/token với Content-Type: application/json.
Không cần xác thực phía client — token ID OIDC sẽ xác thực yêu cầu. Quá trình trao đổi tuân theo RFC 8693 — OAuth 2.0 Token Exchange.
Thân yêu cầu:
| Trường | Bắt buộc | Giá trị |
|---|---|---|
grant_type | yes | urn:ietf:params:oauth:grant-type:token-exchange |
subject_token_type | yes | urn:ietf:params:oauth:token-type:id_token |
subject_token | yes | Token OIDC ID thô (JWT) từ nhà cung cấp CI của bạn. Trường aud của nó phải là https://huggingface.co. |
resource | yes | Một kho Hub (namespace/name, datasets/namespace/name, spaces/namespace/name, kernels/namespace/name, buckets/namespace/name) hoặc username của Hub (không có dấu gạch chéo) cho token có phạm vi người dùng. |
Phản hồi thành công:
{
"access_token": "hf_jwt_…", // "hf_oauth_…" for user resources
"token_type": "bearer",
"expires_in": 3600,
"issued_token_type": "urn:ietf:params:oauth:token-type:access_token"
}Lỗi — 400 Bad Request với thân theo kiểu OAuth:
error | Tại sao |
|---|---|
invalid_request | Thiếu/tham số không đúng định dạng, hoặc định dạng resource không hợp lệ. |
invalid_grant | Không tìm thấy kho hoặc người dùng; không có nhà xuất bản nào khớp với nhà phát hành này; các tuyên bố được cấu hình không khớp; kiểm tra chữ ký hoặc đối tượng nhận thất bại; tài khoản bị khóa. |
Khi CLI hf thực hiện trao đổi, một sự cố sẽ hiển thị mã error cùng với (Request ID: …) — hãy bao gồm Request ID đó khi báo cáo sự cố để chúng tôi có thể truy vết trao đổi trong nhật ký của mình.
Mô hình bảo mật
- Tokens có thời hạn ngắn. 60 phút kể từ thời điểm trao đổi — đồng hồ chỉ bắt đầu chạy khi bạn gọi endpoint, không phải khi workflow bắt đầu. Không có refresh token; các tác vụ dài nên trao đổi lại.
- Token của repo có phạm vi áp dụng cho từng repo. Token cho
acme/awesome-modelkhông thể tác động đếnacme/anything-else. Các thao tác push được gán cho một người dùng hệ thống tổng hợp[OIDC], kèm theo tham chiếu đến issuer và subject ban đầu. Token từ một publisher chỉ đọc chỉ có thể đọc repo đó. - Token người dùng chỉ có quyền đọc. Phạm vi
gated-reposmặc định — không ghi, không truy cập kho riêng tư, không quản lý tài khoản. Phạm vi tùy chọninference-apithêm các cuộc gọi Inference Providers (được tính phí vào tài khoản của bạn), nhưng vẫn không có quyền ghi hay truy cập kho riêng tư. - Các yêu cầu được khớp chính xác, hoặc theo tiền tố khi một cấu hình sẵn có của nhà cung cấp cần đến (cụ thể là
workflow_refcủa GitHub). Không dùng regex. - Nhật ký kiểm toán. Việc thêm hoặc xóa một nhà xuất bản sẽ được ghi lại, và các phiên trao đổi thành công sẽ cập nhật thời gian sử dụng gần nhất.
Xem thêm
- Token truy cập người dùng — lựa chọn phù hợp cho con người và các script chạy một lần
- OAuth / Đăng nhập bằng HF — cùng một điểm cuối
/oauth/token, được sử dụng cho các luồng tương tác - Quản lý Spaces bằng GitHub Actions
- Tích hợp GitHub Actions cho Hub