mirror of
https://github.com/KohakuBlueleaf/KohakuHub.git
synced 2026-07-16 02:33:10 -05:00
271 lines
5.9 KiB
Markdown
271 lines
5.9 KiB
Markdown
---
|
|
title: External Source Fallback
|
|
description: Browse HuggingFace or other KohakuHub instances when repositories aren't found locally
|
|
icon: i-carbon-connect
|
|
---
|
|
|
|
# External Source Fallback
|
|
|
|
Browse HuggingFace or other KohakuHub instances when repositories aren't found locally.
|
|
|
|
---
|
|
|
|
## Overview
|
|
|
|
The fallback system allows transparent access to external repositories:
|
|
|
|
**When a repo isn't found locally:**
|
|
1. Check configured fallback sources (by priority)
|
|
2. If found externally, return with `_source` tag
|
|
3. Cache the repo→source mapping (5min TTL)
|
|
4. Downloads redirect to external source
|
|
|
|
**Supported sources:**
|
|
- HuggingFace (huggingface.co)
|
|
- Other KohakuHub instances
|
|
|
|
---
|
|
|
|
## Setup via Admin Portal
|
|
|
|
1. Navigate to: **Admin Portal → Fallback Sources**
|
|
2. Click **Add Source**
|
|
3. Configure:
|
|
```
|
|
Name: HuggingFace
|
|
URL: https://huggingface.co
|
|
Source Type: huggingface
|
|
Priority: 1
|
|
Token: (optional - for private repos)
|
|
Namespace: (empty = global, or specify user/org)
|
|
Enabled: ✓
|
|
```
|
|
4. Click **Create**
|
|
|
|
---
|
|
|
|
## Configuration
|
|
|
|
### Environment Variables
|
|
|
|
```yaml
|
|
KOHAKU_HUB_FALLBACK_ENABLED: true
|
|
KOHAKU_HUB_FALLBACK_CACHE_TTL: 300 # 5 minutes
|
|
KOHAKU_HUB_FALLBACK_TIMEOUT: 10 # Request timeout
|
|
KOHAKU_HUB_FALLBACK_MAX_CONCURRENT: 5
|
|
|
|
KOHAKU_HUB_FALLBACK_SOURCES: |
|
|
[
|
|
{
|
|
"url": "https://huggingface.co",
|
|
"token": "",
|
|
"priority": 1,
|
|
"name": "HuggingFace",
|
|
"source_type": "huggingface"
|
|
}
|
|
]
|
|
```
|
|
|
|
### Multiple Sources
|
|
|
|
Lower priority = checked first:
|
|
|
|
```json
|
|
[
|
|
{"url": "https://internal-hub.company.com", "priority": 1, "source_type": "kohakuhub"},
|
|
{"url": "https://huggingface.co", "priority": 2, "source_type": "huggingface"}
|
|
]
|
|
```
|
|
|
|
### Per-Namespace Sources
|
|
|
|
Only active for specific user/org:
|
|
|
|
```json
|
|
{
|
|
"namespace": "ml-team",
|
|
"url": "https://team-hub.company.com",
|
|
"priority": 1,
|
|
"source_type": "kohakuhub"
|
|
}
|
|
```
|
|
|
|
---
|
|
|
|
## Supported Operations
|
|
|
|
### Repository Operations
|
|
|
|
✅ **File Download** - `GET /{type}s/{ns}/{name}/resolve/{rev}/{path}`
|
|
✅ **File Tree** - `GET /api/{type}s/{ns}/{name}/tree/{rev}`
|
|
✅ **Repo Info** - `GET /api/{type}s/{ns}/{name}`
|
|
✅ **Revision Info** - `GET /api/{type}s/{ns}/{name}/revision/{rev}`
|
|
|
|
### User/Org Operations
|
|
|
|
✅ **User Profile** - `GET /api/users/{username}/profile`
|
|
- HuggingFace: `/api/users/{name}/overview`
|
|
- Detects user vs org via member list
|
|
|
|
✅ **User Repos** - `GET /api/users/{username}/repos`
|
|
- HuggingFace: Aggregates `/api/models`, `/api/datasets`, `/api/spaces`
|
|
|
|
### List Aggregation
|
|
|
|
✅ **Repository Lists** - `GET /api/models?author={name}`
|
|
- Merges local + external with `_source` tags
|
|
- Disabled on homepage (`?fallback=false`)
|
|
|
|
---
|
|
|
|
## URL Mapping (HuggingFace)
|
|
|
|
HuggingFace has asymmetric URLs:
|
|
|
|
| Operation | KohakuHub | HuggingFace |
|
|
|-----------|-----------|-------------|
|
|
| Models download | `/models/{ns}/{name}/resolve/...` | `/{ns}/{name}/resolve/...` |
|
|
| Datasets download | `/datasets/{ns}/{name}/resolve/...` | `/datasets/{ns}/{name}/resolve/...` |
|
|
| API endpoints | `/api/{type}s/...` | `/api/{type}s/...` |
|
|
|
|
Automatic transformation by fallback client!
|
|
|
|
---
|
|
|
|
## User Experience
|
|
|
|
### External Repository Pages
|
|
|
|
**Indicators:**
|
|
- Badge in header: `[☁️ External: https://huggingface.co]`
|
|
- Disabled commits tab (not available)
|
|
- Metadata tab works (YAML frontmatter parsed)
|
|
|
|
### External User/Org Pages
|
|
|
|
**Shows:**
|
|
- Badge in profile: `[☁️ HuggingFace]`
|
|
- "Limited profile" note (bio/website may be missing)
|
|
- All repos with source tags
|
|
- Avatar from HuggingFace (if available)
|
|
|
|
### Cache System
|
|
|
|
**What's cached:** Repo→source mapping (NOT content)
|
|
**Cache key:** `fallback:repo:{type}:{namespace}/{name}`
|
|
**TTL:** 300 seconds (configurable)
|
|
**Hit rate:** >80% expected
|
|
|
|
---
|
|
|
|
## Query Parameters
|
|
|
|
Disable fallback per-request:
|
|
|
|
```
|
|
GET /api/models?fallback=false # Local only
|
|
GET /api/models?fallback=true # With external (default)
|
|
```
|
|
|
|
Used on:
|
|
- Homepage trending (local only)
|
|
- Main browse pages (local only)
|
|
- User/org pages (with external)
|
|
|
|
---
|
|
|
|
## Security
|
|
|
|
**User credentials are NEVER sent to external sources:**
|
|
- ❌ No user token passthrough
|
|
- ✅ Only admin-configured tokens
|
|
- ✅ Public repos work without tokens
|
|
|
|
**Private repo access:**
|
|
- Admin configures HuggingFace token once
|
|
- Used for all external requests
|
|
- Can access HF private repos (if token permits)
|
|
|
|
---
|
|
|
|
## Performance
|
|
|
|
**Response times:**
|
|
- Cache hit: <100ms
|
|
- Cache miss: <2s (external API call)
|
|
- Download: 302 redirect (full speed)
|
|
|
|
**Cache management:**
|
|
- Auto-expires after TTL
|
|
- Manual clear: Admin Portal → Cache Stats → Clear
|
|
- View stats: Size, usage%, hit rate
|
|
|
|
---
|
|
|
|
## Admin Interface
|
|
|
|
**Fallback Sources page:**
|
|
|
|
**Features:**
|
|
- Add/edit/delete sources
|
|
- Enable/disable toggle
|
|
- Priority ordering
|
|
- Cache statistics
|
|
- Manual cache clear
|
|
|
|
**Cache stats:**
|
|
- Current size / max size (10,000)
|
|
- TTL seconds
|
|
- Usage percentage
|
|
|
|
---
|
|
|
|
## Troubleshooting
|
|
|
|
**External repos not showing:**
|
|
1. Check sources enabled in admin
|
|
2. Verify source URL correct
|
|
3. Clear cache and retry
|
|
4. Check backend logs for errors
|
|
|
|
**Downloads failing:**
|
|
1. HuggingFace returns 307 redirect (expected)
|
|
2. Verify network access to HF
|
|
3. Check timeout settings
|
|
|
|
**Wrong repos shown:**
|
|
1. Check `author=` parameter passed correctly
|
|
2. Verify HuggingFace API response
|
|
3. Check aggregation logs
|
|
|
|
---
|
|
|
|
## API Reference
|
|
|
|
**Admin endpoints:**
|
|
|
|
```
|
|
POST /admin/api/fallback-sources # Create
|
|
GET /admin/api/fallback-sources # List
|
|
GET /admin/api/fallback-sources/{id} # Get
|
|
PUT /admin/api/fallback-sources/{id} # Update
|
|
DELETE /admin/api/fallback-sources/{id} # Delete
|
|
GET /admin/api/fallback-sources/cache/stats # Stats
|
|
DELETE /admin/api/fallback-sources/cache/clear # Clear
|
|
```
|
|
|
|
**Response fields:**
|
|
|
|
```json
|
|
{
|
|
"id": "repo-id",
|
|
"_source": "HuggingFace",
|
|
"_source_url": "https://huggingface.co",
|
|
"_partial": true // For user profiles with missing fields
|
|
}
|
|
```
|
|
|
|
---
|
|
|
|
See also: [Admin Portal](../api/admin.md), [Configuration Reference](../reference/config.md)
|