e93507a09c
Lockfile supply-chain audit / lockfile supply-chain audit (push) Has been cancelled
Windows Studio GGUF CI / GPU prebuilt resolves without Visual Studio (push) Has been cancelled
Windows Studio GGUF CI / setup.ps1 unit tests (VS 2026 / CMake guard) (push) Has been cancelled
Windows Studio GGUF CI / real-VS detection (VS 2022) (push) Has been cancelled
Windows Studio GGUF CI / real-VS detection (VS 2026) (push) Has been cancelled
Windows Studio GGUF CI / VC++ runtime detect + install round-trip (windows-2025-vs2026) (push) Has been cancelled
Windows Studio GGUF CI / VC++ runtime detect + install round-trip (windows-latest) (push) Has been cancelled
Windows Studio Update CI / Studio Updating Tests (push) Has been cancelled
Wheel CI / Wheel build + content sanity + import smoke (push) Has been cancelled
Lint CI / Source lint (Python + shell + YAML + JSON + safety nets) (push) Has been cancelled
MLX CI on Mac M1 / dispatch (push) Has been cancelled
Security audit / advisory audit (pip + npm + cargo) (push) Has been cancelled
Security audit / pip scan-packages :: extras (push) Has been cancelled
Security audit / pip scan-packages :: studio (push) Has been cancelled
Security audit / pip scan-packages :: hf-stack (push) Has been cancelled
Security audit / npm scan-packages (Studio frontend tarballs) (push) Has been cancelled
Security audit / workflow-trigger lint (pull_request_target / cache-poisoning) (push) Has been cancelled
Security audit / pytest tests/security (push) Has been cancelled
Security audit / npm provenance + new install-script diff (push) Has been cancelled
Studio API CI / Studio API & Auth Tests (push) Has been cancelled
Backend CI / (Python 3.10) (push) Has been cancelled
Backend CI / (Python 3.11) (push) Has been cancelled
Backend CI / (Python 3.12) (push) Has been cancelled
Backend CI / (Python 3.13) (push) Has been cancelled
Backend CI / Repo tests (CPU) (push) Has been cancelled
Frontend CI / Frontend build + bundle sanity (push) Has been cancelled
Studio GGUF CI / OpenAI, Anthropic API tests (push) Has been cancelled
Studio GGUF CI / Tool calling Tests (push) Has been cancelled
Studio GGUF CI / JSON, images (push) Has been cancelled
Mac Studio GGUF CI / OpenAI, Anthropic API tests (push) Has been cancelled
Mac Studio GGUF CI / Tool calling Tests (push) Has been cancelled
Mac Studio GGUF CI / JSON, images (push) Has been cancelled
Mac Studio Install Matrix CI / Install + load (macos-14) (push) Has been cancelled
Mac Studio Install Matrix CI / Install + load (macos-15) (push) Has been cancelled
Mac Studio Install Matrix CI / Install + load (macos-26) (push) Has been cancelled
Mac Studio Install Matrix CI / Install + load (macos-15-intel) (push) Has been cancelled
Mac Studio API CI / Studio API & Auth Tests (push) Has been cancelled
Mac Studio Install Matrix CI / Install + load (macos-26-intel) (push) Has been cancelled
Mac Studio UI CI / Chat UI Tests (push) Has been cancelled
Studio Tauri CI / Tauri Linux debug build (no codesign) (push) Has been cancelled
Mac Studio Update CI / Studio Updating Tests (push) Has been cancelled
Studio UI CI / Chat UI Tests (push) Has been cancelled
Windows Studio API CI / Studio API & Auth Tests (push) Has been cancelled
Windows Studio UI CI / Chat UI Tests (push) Has been cancelled
Studio Update CI / Studio Updating Tests (push) Has been cancelled
Core / Core (HF=default + TRL=default) (push) Has been cancelled
Core / Core (HF=4.57.6 + TRL<1) (push) Has been cancelled
Core / Core (HF=latest + TRL=latest) (push) Has been cancelled
Core / llama.cpp build + smoke (push) Has been cancelled
Windows Studio GGUF CI / OpenAI, Anthropic API tests (push) Has been cancelled
Windows Studio GGUF CI / Tool calling Tests (push) Has been cancelled
Windows Studio GGUF CI / JSON, images (push) Has been cancelled
Windows Studio GGUF CI / Studio install + inference without Visual Studio (push) Has been cancelled
Studio export capability / capability (macos-latest) (push) Has been cancelled
Studio export capability / capability (ubuntu-latest) (push) Has been cancelled
Studio export capability / capability (windows-latest) (push) Has been cancelled
Cross-platform parity / parity (macos-latest) (push) Has been cancelled
Cross-platform parity / parity (windows-latest) (push) Has been cancelled
Scorecard supply-chain security / Scorecard analysis (push) Has been cancelled
Studio load-orchestrator CI / test (push) Has been cancelled
139 lines
4.8 KiB
Python
139 lines
4.8 KiB
Python
# SPDX-License-Identifier: AGPL-3.0-only
|
|
# Copyright 2026-present the Unsloth AI Inc. team. All rights reserved. See /studio/LICENSE.AGPL-3.0
|
|
|
|
"""Endpoints mounted at /api/hub/datasets/*."""
|
|
|
|
from __future__ import annotations
|
|
|
|
from typing import Optional
|
|
|
|
from fastapi import APIRouter, Body, Depends, Query, UploadFile
|
|
|
|
from auth.authentication import get_current_subject
|
|
from hub.dependencies import get_hf_token
|
|
from hub.schemas.datasets import (
|
|
AiAssistMappingRequest,
|
|
AiAssistMappingResponse,
|
|
CachedDatasetsResponse,
|
|
CheckFormatRequest,
|
|
CheckFormatResponse,
|
|
DeleteCachedDatasetResponse,
|
|
LocalDatasetsResponse,
|
|
UploadDatasetResponse,
|
|
)
|
|
from hub.schemas.downloads import (
|
|
ActiveDownloadsResponse,
|
|
CancelDatasetDownloadRequest,
|
|
CancelDatasetDownloadResponse,
|
|
DatasetDownloadJobStatus,
|
|
DatasetDownloadStartResponse,
|
|
DownloadProgressResponse,
|
|
DownloadDatasetRequest,
|
|
TransportStatusResponse,
|
|
)
|
|
from hub.services.datasets import cache_inventory, downloads, formatting, local
|
|
|
|
router = APIRouter()
|
|
|
|
|
|
@router.post("/upload", response_model = UploadDatasetResponse)
|
|
async def upload_dataset(
|
|
file: UploadFile, current_subject: str = Depends(get_current_subject)
|
|
) -> UploadDatasetResponse:
|
|
return await local.upload_dataset_response(file)
|
|
|
|
|
|
@router.get("/local", response_model = LocalDatasetsResponse)
|
|
def list_local_datasets(
|
|
current_subject: str = Depends(get_current_subject),
|
|
) -> LocalDatasetsResponse:
|
|
return local.list_local_datasets_response()
|
|
|
|
|
|
@router.get(
|
|
"/cached",
|
|
response_model = CachedDatasetsResponse,
|
|
response_model_exclude_unset = True,
|
|
)
|
|
async def list_cached_datasets(current_subject: str = Depends(get_current_subject)):
|
|
return await cache_inventory.list_cached_datasets_response()
|
|
|
|
|
|
@router.delete("/cached", response_model = DeleteCachedDatasetResponse)
|
|
async def delete_cached_dataset(
|
|
repo_id: str = Body(..., embed = True), current_subject: str = Depends(get_current_subject)
|
|
):
|
|
return await cache_inventory.delete_cached_dataset_response(repo_id)
|
|
|
|
|
|
@router.get("/download-progress", response_model = DownloadProgressResponse)
|
|
async def get_dataset_download_progress(
|
|
repo_id: str = Query(..., description = "HuggingFace dataset repo ID, e.g. 'unsloth/LaTeX_OCR'"),
|
|
expected_bytes: int = Query(0, description = "Expected total download size in bytes"),
|
|
hf_token: Optional[str] = Depends(get_hf_token),
|
|
current_subject: str = Depends(get_current_subject),
|
|
):
|
|
return await downloads.get_dataset_download_progress_response(
|
|
repo_id,
|
|
expected_bytes = expected_bytes,
|
|
hf_token = hf_token,
|
|
)
|
|
|
|
|
|
@router.post("/download", response_model = DatasetDownloadStartResponse, status_code = 202)
|
|
async def download_dataset(
|
|
body: DownloadDatasetRequest,
|
|
hf_token: Optional[str] = Depends(get_hf_token),
|
|
current_subject: str = Depends(get_current_subject),
|
|
):
|
|
return await downloads.download_dataset_response(body, hf_token)
|
|
|
|
|
|
@router.post("/download/cancel", response_model = CancelDatasetDownloadResponse, status_code = 202)
|
|
async def cancel_dataset_download(
|
|
body: CancelDatasetDownloadRequest, current_subject: str = Depends(get_current_subject)
|
|
):
|
|
return await downloads.cancel_dataset_download_response(body)
|
|
|
|
|
|
@router.get("/download-status", response_model = DatasetDownloadJobStatus)
|
|
async def get_dataset_download_status(
|
|
repo_id: str = Query(..., description = "HuggingFace dataset repo ID"),
|
|
current_subject: str = Depends(get_current_subject),
|
|
):
|
|
return await downloads.get_dataset_download_status_response(repo_id)
|
|
|
|
|
|
@router.get("/active-downloads", response_model = ActiveDownloadsResponse)
|
|
async def get_active_dataset_downloads(
|
|
repo_id: str = Query("", description = "HuggingFace dataset repo ID"),
|
|
current_subject: str = Depends(get_current_subject),
|
|
):
|
|
return await downloads.get_active_dataset_downloads_response(repo_id)
|
|
|
|
|
|
@router.get("/transport-status", response_model = TransportStatusResponse)
|
|
async def get_dataset_transport_status(
|
|
repo_id: str = Query(..., description = "HuggingFace dataset repo ID"),
|
|
current_subject: str = Depends(get_current_subject),
|
|
):
|
|
return await downloads.get_dataset_transport_status_response(repo_id)
|
|
|
|
|
|
@router.post("/check-format", response_model = CheckFormatResponse)
|
|
def check_format(
|
|
request: CheckFormatRequest,
|
|
hf_token: Optional[str] = Depends(get_hf_token),
|
|
current_subject: str = Depends(get_current_subject),
|
|
):
|
|
return formatting.check_format_response(request, hf_token)
|
|
|
|
|
|
@router.post("/ai-assist-mapping", response_model = AiAssistMappingResponse)
|
|
def ai_assist_mapping(
|
|
request: AiAssistMappingRequest,
|
|
hf_token: Optional[str] = Depends(get_hf_token),
|
|
current_subject: str = Depends(get_current_subject),
|
|
):
|
|
return formatting.ai_assist_mapping_response(request, hf_token)
|