mirror of
https://github.com/KohakuBlueleaf/KohakuHub.git
synced 2026-07-20 21:14:09 -05:00
400 lines
8.4 KiB
Markdown
400 lines
8.4 KiB
Markdown
---
|
|
title: HuggingFace-Compatible API
|
|
description: Endpoints compatible with huggingface_hub library
|
|
icon: i-carbon-cloud-app
|
|
---
|
|
|
|
# HuggingFace-Compatible API
|
|
|
|
KohakuHub implements HuggingFace Hub API for compatibility with `huggingface_hub`, `transformers`, and `diffusers` libraries.
|
|
|
|
---
|
|
|
|
## Repository Info
|
|
|
|
### Get Repository Information
|
|
|
|
**Pattern:** `GET /api/{repo_type}s/{namespace}/{name}`
|
|
|
|
**Examples:**
|
|
- `GET /api/models/username/bert-base`
|
|
- `GET /api/datasets/org/imagenet`
|
|
- `GET /api/spaces/user/gradio-app`
|
|
|
|
**Query Parameters:**
|
|
- None
|
|
|
|
**Request Headers:**
|
|
- `Authorization: Bearer {token}` (optional, for private repos)
|
|
|
|
**Response:**
|
|
```json
|
|
{
|
|
"id": "username/bert-base",
|
|
"author": "username",
|
|
"sha": "abc123def456...",
|
|
"lastModified": "2025-01-20T10:15:32.123Z",
|
|
"createdAt": "2025-01-15T08:00:00.000Z",
|
|
"private": false,
|
|
"disabled": false,
|
|
"gated": false,
|
|
"downloads": 150,
|
|
"likes": 25,
|
|
"tags": [],
|
|
"pipeline_tag": null,
|
|
"library_name": null,
|
|
"siblings": [
|
|
{
|
|
"rfilename": "config.json",
|
|
"size": 1024
|
|
},
|
|
{
|
|
"rfilename": "model.safetensors",
|
|
"size": 5000000000,
|
|
"lfs": {
|
|
"sha256": "def789...",
|
|
"size": 5000000000,
|
|
"pointerSize": 134
|
|
}
|
|
}
|
|
],
|
|
"storage": {
|
|
"quota_bytes": 107374182400,
|
|
"used_bytes": 5000001024,
|
|
"available_bytes": 102374181376,
|
|
"percentage_used": 4.66,
|
|
"effective_quota_bytes": 107374182400,
|
|
"is_inheriting": false
|
|
}
|
|
}
|
|
```
|
|
|
|
**Notes:**
|
|
- `siblings`: Full file list with LFS info
|
|
- `storage`: Only included for authenticated users
|
|
- `sha`: Latest commit hash on main branch
|
|
- Compatible with `transformers.from_pretrained()` and `diffusers`
|
|
|
|
---
|
|
|
|
## Repository Listing
|
|
|
|
### List Repositories by Type
|
|
|
|
**Pattern:** `GET /api/{repo_type}s`
|
|
|
|
**Examples:**
|
|
- `GET /api/models?author=username&limit=50&sort=recent`
|
|
- `GET /api/datasets?sort=trending&limit=20`
|
|
|
|
**Query Parameters:**
|
|
- `author` (optional): Filter by namespace
|
|
- `limit` (optional): Max results (default: 50, max: 100000)
|
|
- `sort` (optional): `recent` | `likes` | `downloads` | `trending` (default: recent)
|
|
- `fallback` (optional): Enable external sources (default: true)
|
|
|
|
**Response:**
|
|
```json
|
|
[
|
|
{
|
|
"id": "username/model-name",
|
|
"author": "username",
|
|
"private": false,
|
|
"sha": "commit_hash",
|
|
"lastModified": "2025-01-20T10:15:32Z",
|
|
"createdAt": "2025-01-15T08:00:00Z",
|
|
"downloads": 150,
|
|
"likes": 25,
|
|
"gated": false,
|
|
"tags": []
|
|
}
|
|
]
|
|
```
|
|
|
|
---
|
|
|
|
### List User Repositories
|
|
|
|
**Pattern:** `GET /api/users/{username}/repos`
|
|
|
|
**Query Parameters:**
|
|
- `limit` (optional): Max per type (default: 100)
|
|
- `sort` (optional): `recent` | `likes` | `downloads`
|
|
|
|
**Response:**
|
|
```json
|
|
{
|
|
"models": [...],
|
|
"datasets": [...],
|
|
"spaces": [...]
|
|
}
|
|
```
|
|
|
|
---
|
|
|
|
## File Operations
|
|
|
|
### File Download/Resolution
|
|
|
|
**Pattern:** `GET /{repo_type}s/{namespace}/{name}/resolve/{revision}/{path}`
|
|
|
|
**Examples:**
|
|
- `GET /models/username/bert/resolve/main/config.json`
|
|
- `GET /datasets/org/data/resolve/v1.0/train.csv`
|
|
|
|
**Path Parameters:**
|
|
- `repo_type`: models | datasets | spaces
|
|
- `namespace`: User or organization name
|
|
- `name`: Repository name
|
|
- `revision`: Branch name or commit hash
|
|
- `path`: File path in repository
|
|
|
|
**Response:**
|
|
- `302 Found` - Redirect to S3 presigned URL
|
|
- `404 Not Found` - File doesn't exist
|
|
|
|
**Response Headers:**
|
|
- `X-Repo-Commit`: Commit hash
|
|
- `X-Linked-Etag`: File SHA256
|
|
- `X-Linked-Size`: File size in bytes
|
|
- `ETag`: File SHA256
|
|
- `Content-Disposition`: attachment; filename="..."
|
|
|
|
**Notes:**
|
|
- No body returned (302 redirect only)
|
|
- Client follows redirect to download from S3
|
|
- Presigned URL valid for 24 hours
|
|
- Download tracking happens in background
|
|
|
|
---
|
|
|
|
### File Metadata (HEAD)
|
|
|
|
**Pattern:** `HEAD /{repo_type}s/{namespace}/{name}/resolve/{revision}/{path}`
|
|
|
|
**Response:**
|
|
- `200 OK` with headers (no body)
|
|
- Same headers as GET endpoint
|
|
|
|
**Use case:** Check file exists and get metadata without downloading
|
|
|
|
---
|
|
|
|
### Preupload Check
|
|
|
|
**Pattern:** `POST /{repo_type}s/{namespace}/{name}/preupload/{revision}`
|
|
|
|
**Purpose:** Check if files should use LFS and if they already exist (deduplication)
|
|
|
|
**Request Body:**
|
|
```json
|
|
{
|
|
"files": [
|
|
{
|
|
"path": "model.safetensors",
|
|
"size": 5000000000,
|
|
"sha256": "abc123...", // Optional but recommended
|
|
"sample": "base64..." // Optional, for small files
|
|
},
|
|
{
|
|
"path": "config.json",
|
|
"size": 512
|
|
}
|
|
]
|
|
}
|
|
```
|
|
|
|
**Response:**
|
|
```json
|
|
{
|
|
"files": [
|
|
{
|
|
"path": "model.safetensors",
|
|
"uploadMode": "lfs",
|
|
"shouldIgnore": false
|
|
},
|
|
{
|
|
"path": "config.json",
|
|
"uploadMode": "regular",
|
|
"shouldIgnore": true
|
|
}
|
|
]
|
|
}
|
|
```
|
|
|
|
**Field Explanations:**
|
|
- `uploadMode`:
|
|
- `lfs`: Use Git LFS (file > threshold OR matches suffix rules)
|
|
- `regular`: Use regular commit (small file)
|
|
- `shouldIgnore`:
|
|
- `true`: File with same content already exists (skip upload)
|
|
- `false`: File is new or changed (upload required)
|
|
|
|
**Deduplication Logic:**
|
|
1. If `sha256` provided: Compare with existing file SHA256
|
|
2. If `sample` provided (small files): Compare sample content
|
|
3. If neither: Always upload
|
|
|
|
---
|
|
|
|
## Revision Info
|
|
|
|
### Get Revision Details
|
|
|
|
**Pattern:** `GET /{repo_type}s/{namespace}/{name}/revision/{revision}`
|
|
|
|
**Examples:**
|
|
- `GET /models/user/bert/revision/main`
|
|
- `GET /datasets/org/data/revision/v2.0`
|
|
|
|
**Query Parameters:**
|
|
- `expand` (optional): Fields to expand (reserved for future use)
|
|
|
|
**Response:**
|
|
```json
|
|
{
|
|
"id": "username/repo",
|
|
"author": "username",
|
|
"sha": "commit_hash",
|
|
"lastModified": "2025-01-20T10:15:32Z",
|
|
"createdAt": "2025-01-15T08:00:00Z",
|
|
"private": false,
|
|
"downloads": 150,
|
|
"likes": 25,
|
|
"gated": false,
|
|
"files": [],
|
|
"type": "model",
|
|
"revision": "main",
|
|
"commit": {
|
|
"oid": "commit_hash",
|
|
"date": 1737360932
|
|
},
|
|
"xetEnabled": false
|
|
}
|
|
```
|
|
|
|
**Notes:**
|
|
- `files` is empty (use `/tree` endpoint for file list)
|
|
- `commit.date`: Unix timestamp
|
|
|
|
---
|
|
|
|
## Privacy & Permissions
|
|
|
|
### Access Control Rules
|
|
|
|
**Public repositories:**
|
|
- ✅ Anyone can read
|
|
- ⚠️ Only owner/org members can write
|
|
|
|
**Private repositories:**
|
|
- ⚠️ Only owner/org members can read
|
|
- ⚠️ Only owner/org members can write
|
|
|
|
**Anonymous requests:**
|
|
- ✅ Can access public repositories
|
|
- ❌ Cannot access private repositories
|
|
|
|
**Authentication:**
|
|
- Session cookie: `session_id` (for browser)
|
|
- Bearer token: `Authorization: Bearer {token}` (for API/CLI)
|
|
|
|
---
|
|
|
|
## Error Responses
|
|
|
|
**Standard HuggingFace error format:**
|
|
|
|
```json
|
|
{
|
|
"error": "Error message",
|
|
"requestId": "optional-request-id"
|
|
}
|
|
```
|
|
|
|
**Common status codes:**
|
|
- `200 OK` - Success
|
|
- `302 Found` - Redirect to S3 (download endpoints)
|
|
- `400 Bad Request` - Invalid input
|
|
- `401 Unauthorized` - Not authenticated
|
|
- `403 Forbidden` - No permission
|
|
- `404 Not Found` - Repository or file not found
|
|
- `413 Payload Too Large` - Quota exceeded
|
|
- `500 Internal Server Error` - Server error
|
|
|
|
**Custom headers:**
|
|
- `X-Error-Code`: Machine-readable error code
|
|
- `X-Request-Id`: Request tracking ID (if available)
|
|
|
|
---
|
|
|
|
## Compatibility Notes
|
|
|
|
### Works with these libraries:
|
|
|
|
✅ **`huggingface_hub`**
|
|
```python
|
|
from huggingface_hub import hf_hub_download
|
|
|
|
file = hf_hub_download(
|
|
repo_id="username/model",
|
|
filename="config.json",
|
|
repo_type="model",
|
|
endpoint="http://localhost:28080"
|
|
)
|
|
```
|
|
|
|
✅ **`transformers`**
|
|
```python
|
|
from transformers import AutoModel
|
|
|
|
model = AutoModel.from_pretrained(
|
|
"username/bert-base",
|
|
trust_remote_code=True,
|
|
use_auth_token="your_token"
|
|
)
|
|
# Set HF_ENDPOINT=http://localhost:28080
|
|
```
|
|
|
|
✅ **`diffusers`**
|
|
```python
|
|
from diffusers import StableDiffusionPipeline
|
|
|
|
pipe = StableDiffusionPipeline.from_pretrained(
|
|
"username/sd-model",
|
|
use_auth_token="your_token"
|
|
)
|
|
# Set HF_ENDPOINT=http://localhost:28080
|
|
```
|
|
|
|
### Differences from HuggingFace Hub:
|
|
|
|
**Not implemented:**
|
|
- Gated repositories (always `gated: false`)
|
|
- Pipeline tags (always `null`)
|
|
- Model cards parsing (use README.md YAML frontmatter)
|
|
- Discussions/Community features
|
|
|
|
**Extensions:**
|
|
- Storage quota information (KohakuHub-specific)
|
|
- Organization support with roles
|
|
- Per-repository LFS settings
|
|
- Fallback to external sources
|
|
|
|
---
|
|
|
|
## Rate Limiting
|
|
|
|
**No rate limits on HuggingFace-compatible endpoints** (by design for library compatibility)
|
|
|
|
**Recommended:** Use reverse proxy (nginx) for rate limiting in production
|
|
|
|
---
|
|
|
|
## Next: See other API docs
|
|
|
|
- [Authentication API](./authentication.md)
|
|
- [Admin API](./admin.md)
|
|
- [Git/LFS API](./git-lfs.md) (TODO)
|
|
- [File Upload API](./file-upload.md) (TODO)
|