Full Code of unslothai/unsloth for AI

main d0e5a1d61e5c cached
759 files
5.8 MB
1.6M tokens
3574 symbols
2 requests
Download .txt
Showing preview only (6,224K chars total). Download the full file or copy to clipboard to get everything.
Repository: unslothai/unsloth
Branch: main
Commit: d0e5a1d61e5c
Files: 759
Total size: 5.8 MB

Directory structure:
gitextract_mbg5_5ju/

├── .gitattributes
├── .github/
│   ├── CODEOWNERS
│   ├── FUNDING.yml
│   ├── ISSUE_TEMPLATE/
│   │   ├── bug---issue.md
│   │   └── feature-request.md
│   └── workflows/
│       └── stale.yml
├── .gitignore
├── .pre-commit-ci.yaml
├── .pre-commit-config.yaml
├── CODE_OF_CONDUCT.md
├── CONTRIBUTING.md
├── COPYING
├── LICENSE
├── README.md
├── build.sh
├── cli.py
├── install.ps1
├── install.sh
├── pyproject.toml
├── scripts/
│   ├── enforce_kwargs_spacing.py
│   └── run_ruff_format.py
├── studio/
│   ├── LICENSE.AGPL-3.0
│   ├── Unsloth_Studio_Colab.ipynb
│   ├── __init__.py
│   ├── backend/
│   │   ├── __init__.py
│   │   ├── assets/
│   │   │   ├── __init__.py
│   │   │   └── configs/
│   │   │       ├── __init__.py
│   │   │       ├── full_finetune.yaml
│   │   │       ├── inference_defaults.json
│   │   │       ├── lora_text.yaml
│   │   │       ├── model_defaults/
│   │   │       │   ├── default.yaml
│   │   │       │   ├── embedding/
│   │   │       │   │   ├── unsloth_Qwen3-Embedding-0.6B.yaml
│   │   │       │   │   ├── unsloth_all-MiniLM-L6-v2.yaml
│   │   │       │   │   ├── unsloth_bge-m3.yaml
│   │   │       │   │   ├── unsloth_embeddinggemma-300m.yaml
│   │   │       │   │   └── unsloth_gte-modernbert-base.yaml
│   │   │       │   ├── ernie/
│   │   │       │   │   ├── unsloth_ERNIE-4.5-21B-A3B-PT.yaml
│   │   │       │   │   └── unsloth_ERNIE-4.5-VL-28B-A3B-PT.yaml
│   │   │       │   ├── falcon/
│   │   │       │   │   └── tiiuae_Falcon-H1-0.5B-Instruct.yaml
│   │   │       │   ├── gemma/
│   │   │       │   │   ├── unsloth_codegemma-7b-bnb-4bit.yaml
│   │   │       │   │   ├── unsloth_functiongemma-270m-it.yaml
│   │   │       │   │   ├── unsloth_gemma-2-27b-bnb-4bit.yaml
│   │   │       │   │   ├── unsloth_gemma-2-2b.yaml
│   │   │       │   │   ├── unsloth_gemma-3-270m-it.yaml
│   │   │       │   │   ├── unsloth_gemma-3-27b-it.yaml
│   │   │       │   │   ├── unsloth_gemma-3-4b-it.yaml
│   │   │       │   │   ├── unsloth_gemma-3-4b-pt.yaml
│   │   │       │   │   ├── unsloth_gemma-3n-E4B-it.yaml
│   │   │       │   │   └── unsloth_gemma-3n-E4B.yaml
│   │   │       │   ├── gpt-oss/
│   │   │       │   │   ├── unsloth_gpt-oss-120b.yaml
│   │   │       │   │   └── unsloth_gpt-oss-20b.yaml
│   │   │       │   ├── granite/
│   │   │       │   │   ├── unsloth_granite-4.0-350m-unsloth-bnb-4bit.yaml
│   │   │       │   │   └── unsloth_granite-4.0-h-micro.yaml
│   │   │       │   ├── llama/
│   │   │       │   │   ├── unsloth_Llama-3.2-11B-Vision-Instruct.yaml
│   │   │       │   │   ├── unsloth_Llama-3.2-1B-Instruct.yaml
│   │   │       │   │   ├── unsloth_Llama-3.2-3B-Instruct.yaml
│   │   │       │   │   ├── unsloth_Llama-3.3-70B-Instruct.yaml
│   │   │       │   │   ├── unsloth_Meta-Llama-3.1-70B-bnb-4bit.yaml
│   │   │       │   │   ├── unsloth_Meta-Llama-3.1-8B-Instruct-bnb-4bit.yaml
│   │   │       │   │   ├── unsloth_llama-3-8b-Instruct-bnb-4bit.yaml
│   │   │       │   │   └── unsloth_llama-3-8b-bnb-4bit.yaml
│   │   │       │   ├── llasa/
│   │   │       │   │   └── unsloth_Llasa-3B.yaml
│   │   │       │   ├── mistral/
│   │   │       │   │   ├── unsloth_Magistral-Small-2509-unsloth-bnb-4bit.yaml
│   │   │       │   │   ├── unsloth_Ministral-3-3B-Instruct-2512.yaml
│   │   │       │   │   ├── unsloth_Mistral-Nemo-Base-2407-bnb-4bit.yaml
│   │   │       │   │   ├── unsloth_Mistral-Small-Instruct-2409.yaml
│   │   │       │   │   ├── unsloth_Pixtral-12B-2409.yaml
│   │   │       │   │   ├── unsloth_mistral-7b-instruct-v0.3-bnb-4bit.yaml
│   │   │       │   │   └── unsloth_mistral-7b-v0.3-bnb-4bit.yaml
│   │   │       │   ├── other/
│   │   │       │   │   ├── OuteAI_Llama-OuteTTS-1.0-1B.yaml
│   │   │       │   │   ├── Spark-TTS-0.5B_LLM.yaml
│   │   │       │   │   ├── sesame_csm-1b.yaml
│   │   │       │   │   ├── unsloth_GLM-4.7-Flash.yaml
│   │   │       │   │   ├── unsloth_LFM2-1.2B.yaml
│   │   │       │   │   ├── unsloth_Nemotron-3-Nano-30B-A3B.yaml
│   │   │       │   │   ├── unsloth_PaddleOCR-VL.yaml
│   │   │       │   │   ├── unsloth_answerdotai_ModernBERT-large.yaml
│   │   │       │   │   ├── unsloth_orpheus-3b-0.1-ft.yaml
│   │   │       │   │   ├── unsloth_tinyllama-bnb-4bit.yaml
│   │   │       │   │   └── unsloth_whisper-large-v3.yaml
│   │   │       │   ├── phi/
│   │   │       │   │   ├── unsloth_Phi-3-medium-4k-instruct.yaml
│   │   │       │   │   ├── unsloth_Phi-3.5-mini-instruct.yaml
│   │   │       │   │   └── unsloth_Phi-4.yaml
│   │   │       │   └── qwen/
│   │   │       │       ├── imdatta0_tiny_qwen3_moe_2.8B_0.7B.yaml
│   │   │       │       ├── unsloth_Qwen2-7B.yaml
│   │   │       │       ├── unsloth_Qwen2-VL-7B-Instruct.yaml
│   │   │       │       ├── unsloth_Qwen2.5-1.5B-Instruct.yaml
│   │   │       │       ├── unsloth_Qwen2.5-7B.yaml
│   │   │       │       ├── unsloth_Qwen2.5-Coder-1.5B-Instruct.yaml
│   │   │       │       ├── unsloth_Qwen2.5-Coder-14B-Instruct.yaml
│   │   │       │       ├── unsloth_Qwen2.5-Coder-7B-Instruct-bnb-4bit.yaml
│   │   │       │       ├── unsloth_Qwen2.5-VL-7B-Instruct-bnb-4bit.yaml
│   │   │       │       ├── unsloth_Qwen3-0.6B.yaml
│   │   │       │       ├── unsloth_Qwen3-14B-Base-unsloth-bnb-4bit.yaml
│   │   │       │       ├── unsloth_Qwen3-14B.yaml
│   │   │       │       ├── unsloth_Qwen3-30B-A3B-Instruct-2507.yaml
│   │   │       │       ├── unsloth_Qwen3-32B.yaml
│   │   │       │       ├── unsloth_Qwen3-4B-Instruct-2507.yaml
│   │   │       │       ├── unsloth_Qwen3-4B-Thinking-2507.yaml
│   │   │       │       └── unsloth_Qwen3-VL-8B-Instruct-unsloth-bnb-4bit.yaml
│   │   │       └── vision_lora.yaml
│   │   ├── auth/
│   │   │   ├── .gitkeep
│   │   │   ├── __init__.py
│   │   │   ├── authentication.py
│   │   │   ├── hashing.py
│   │   │   └── storage.py
│   │   ├── colab.py
│   │   ├── core/
│   │   │   ├── __init__.py
│   │   │   ├── data_recipe/
│   │   │   │   ├── __init__.py
│   │   │   │   ├── huggingface.py
│   │   │   │   ├── jobs/
│   │   │   │   │   ├── __init__.py
│   │   │   │   │   ├── constants.py
│   │   │   │   │   ├── manager.py
│   │   │   │   │   ├── parse.py
│   │   │   │   │   ├── types.py
│   │   │   │   │   └── worker.py
│   │   │   │   ├── jsonable.py
│   │   │   │   ├── local_callable_validators.py
│   │   │   │   ├── oxc-validator/
│   │   │   │   │   ├── package.json
│   │   │   │   │   └── validate.mjs
│   │   │   │   └── service.py
│   │   │   ├── export/
│   │   │   │   ├── __init__.py
│   │   │   │   ├── export.py
│   │   │   │   ├── orchestrator.py
│   │   │   │   └── worker.py
│   │   │   ├── inference/
│   │   │   │   ├── __init__.py
│   │   │   │   ├── audio_codecs.py
│   │   │   │   ├── defaults.py
│   │   │   │   ├── inference.py
│   │   │   │   ├── llama_cpp.py
│   │   │   │   ├── orchestrator.py
│   │   │   │   ├── tools.py
│   │   │   │   └── worker.py
│   │   │   └── training/
│   │   │       ├── __init__.py
│   │   │       ├── trainer.py
│   │   │       ├── training.py
│   │   │       └── worker.py
│   │   ├── loggers/
│   │   │   ├── .gitkeep
│   │   │   ├── __init__.py
│   │   │   ├── config.py
│   │   │   └── handlers.py
│   │   ├── main.py
│   │   ├── models/
│   │   │   ├── .gitkeep
│   │   │   ├── __init__.py
│   │   │   ├── auth.py
│   │   │   ├── data_recipe.py
│   │   │   ├── datasets.py
│   │   │   ├── export.py
│   │   │   ├── inference.py
│   │   │   ├── models.py
│   │   │   ├── responses.py
│   │   │   ├── training.py
│   │   │   └── users.py
│   │   ├── plugins/
│   │   │   ├── __init__.py
│   │   │   └── data-designer-unstructured-seed/
│   │   │       ├── __init__.py
│   │   │       ├── pyproject.toml
│   │   │       └── src/
│   │   │           └── data_designer_unstructured_seed/
│   │   │               ├── __init__.py
│   │   │               ├── chunking.py
│   │   │               ├── config.py
│   │   │               ├── impl.py
│   │   │               └── plugin.py
│   │   ├── requirements/
│   │   │   ├── __init__.py
│   │   │   ├── base.txt
│   │   │   ├── extras-no-deps.txt
│   │   │   ├── extras.txt
│   │   │   ├── overrides.txt
│   │   │   ├── single-env/
│   │   │   │   ├── constraints.txt
│   │   │   │   ├── data-designer-deps.txt
│   │   │   │   ├── data-designer.txt
│   │   │   │   └── patch_metadata.py
│   │   │   ├── studio.txt
│   │   │   └── triton-kernels.txt
│   │   ├── routes/
│   │   │   ├── .gitkeep
│   │   │   ├── __init__.py
│   │   │   ├── auth.py
│   │   │   ├── data_recipe/
│   │   │   │   ├── __init__.py
│   │   │   │   ├── jobs.py
│   │   │   │   ├── mcp.py
│   │   │   │   ├── seed.py
│   │   │   │   └── validate.py
│   │   │   ├── datasets.py
│   │   │   ├── export.py
│   │   │   ├── inference.py
│   │   │   ├── models.py
│   │   │   └── training.py
│   │   ├── run.py
│   │   ├── state/
│   │   │   ├── .gitkeep
│   │   │   └── __init__.py
│   │   ├── tests/
│   │   │   ├── __init__.py
│   │   │   ├── conftest.py
│   │   │   ├── test_data_recipe_seed.py
│   │   │   └── test_utils.py
│   │   └── utils/
│   │       ├── .gitkeep
│   │       ├── __init__.py
│   │       ├── cache_cleanup.py
│   │       ├── datasets/
│   │       │   ├── __init__.py
│   │       │   ├── chat_templates.py
│   │       │   ├── data_collators.py
│   │       │   ├── dataset_utils.py
│   │       │   ├── format_conversion.py
│   │       │   ├── format_detection.py
│   │       │   ├── llm_assist.py
│   │       │   ├── model_mappings.py
│   │       │   └── vlm_processing.py
│   │       ├── hardware/
│   │       │   ├── __init__.py
│   │       │   └── hardware.py
│   │       ├── inference/
│   │       │   ├── __init__.py
│   │       │   └── inference_config.py
│   │       ├── models/
│   │       │   ├── __init__.py
│   │       │   ├── checkpoints.py
│   │       │   └── model_config.py
│   │       ├── paths/
│   │       │   ├── __init__.py
│   │       │   ├── path_utils.py
│   │       │   └── storage_roots.py
│   │       ├── transformers_version.py
│   │       └── utils.py
│   ├── frontend/
│   │   ├── .gitignore
│   │   ├── .gitkeep
│   │   ├── biome.json
│   │   ├── components.json
│   │   ├── data-designer.openapi (1).yaml
│   │   ├── eslint.config.js
│   │   ├── index.html
│   │   ├── package.json
│   │   ├── public/
│   │   │   └── Hellix font official/
│   │   │       └── OTF/
│   │   │           └── Hellix-SemiBold.otf
│   │   ├── src/
│   │   │   ├── app/
│   │   │   │   ├── app.tsx
│   │   │   │   ├── auth-guards.ts
│   │   │   │   ├── provider.tsx
│   │   │   │   ├── router.tsx
│   │   │   │   └── routes/
│   │   │   │       ├── __root.tsx
│   │   │   │       ├── change-password.tsx
│   │   │   │       ├── chat.tsx
│   │   │   │       ├── data-recipes.$recipeId.tsx
│   │   │   │       ├── data-recipes.tsx
│   │   │   │       ├── export.tsx
│   │   │   │       ├── grid-test.tsx
│   │   │   │       ├── index.tsx
│   │   │   │       ├── login.tsx
│   │   │   │       ├── onboarding.tsx
│   │   │   │       └── studio.tsx
│   │   │   ├── components/
│   │   │   │   ├── assistant-ui/
│   │   │   │   │   ├── attachment.tsx
│   │   │   │   │   ├── audio-player.tsx
│   │   │   │   │   ├── badge.tsx
│   │   │   │   │   ├── markdown-text.tsx
│   │   │   │   │   ├── message-timing.tsx
│   │   │   │   │   ├── model-selector/
│   │   │   │   │   │   ├── pickers.tsx
│   │   │   │   │   │   └── types.ts
│   │   │   │   │   ├── model-selector.tsx
│   │   │   │   │   ├── reasoning.tsx
│   │   │   │   │   ├── sources.tsx
│   │   │   │   │   ├── thread.tsx
│   │   │   │   │   ├── tool-fallback.tsx
│   │   │   │   │   ├── tool-group.tsx
│   │   │   │   │   ├── tool-ui-python.tsx
│   │   │   │   │   ├── tool-ui-terminal.tsx
│   │   │   │   │   ├── tool-ui-web-search.tsx
│   │   │   │   │   └── tooltip-icon-button.tsx
│   │   │   │   ├── example.tsx
│   │   │   │   ├── layout/
│   │   │   │   │   ├── dashboard-grid.tsx
│   │   │   │   │   ├── dashboard-layout.tsx
│   │   │   │   │   └── index.ts
│   │   │   │   ├── markdown/
│   │   │   │   │   ├── markdown-preview.tsx
│   │   │   │   │   └── mermaid-error.tsx
│   │   │   │   ├── navbar.tsx
│   │   │   │   ├── section-card.tsx
│   │   │   │   └── ui/
│   │   │   │       ├── accordion.tsx
│   │   │   │       ├── alert-dialog.tsx
│   │   │   │       ├── alert.tsx
│   │   │   │       ├── animated-shiny-text.tsx
│   │   │   │       ├── animated-theme-toggler.tsx
│   │   │   │       ├── aspect-ratio.tsx
│   │   │   │       ├── avatar.tsx
│   │   │   │       ├── badge.tsx
│   │   │   │       ├── breadcrumb.tsx
│   │   │   │       ├── button.tsx
│   │   │   │       ├── calendar.tsx
│   │   │   │       ├── card.tsx
│   │   │   │       ├── chart.tsx
│   │   │   │       ├── checkbox.tsx
│   │   │   │       ├── collapsible.tsx
│   │   │   │       ├── combobox.tsx
│   │   │   │       ├── command.tsx
│   │   │   │       ├── confetti.tsx
│   │   │   │       ├── context-menu.tsx
│   │   │   │       ├── data-table.tsx
│   │   │   │       ├── dialog.tsx
│   │   │   │       ├── dropdown-menu.tsx
│   │   │   │       ├── empty.tsx
│   │   │   │       ├── field.tsx
│   │   │   │       ├── hover-card.tsx
│   │   │   │       ├── input-group.tsx
│   │   │   │       ├── input.tsx
│   │   │   │       ├── label.tsx
│   │   │   │       ├── light-rays.tsx
│   │   │   │       ├── menubar.tsx
│   │   │   │       ├── navigation-menu.tsx
│   │   │   │       ├── pagination.tsx
│   │   │   │       ├── popover.tsx
│   │   │   │       ├── progress.tsx
│   │   │   │       ├── radio-group.tsx
│   │   │   │       ├── resizable.tsx
│   │   │   │       ├── scroll-area.tsx
│   │   │   │       ├── select.tsx
│   │   │   │       ├── separator.tsx
│   │   │   │       ├── sheet.tsx
│   │   │   │       ├── shine-border.tsx
│   │   │   │       ├── sidebar.tsx
│   │   │   │       ├── skeleton.tsx
│   │   │   │       ├── slider.tsx
│   │   │   │       ├── sonner.tsx
│   │   │   │       ├── sparkles-text.tsx
│   │   │   │       ├── spinner.tsx
│   │   │   │       ├── switch.tsx
│   │   │   │       ├── table.tsx
│   │   │   │       ├── tabs.tsx
│   │   │   │       ├── terminal.tsx
│   │   │   │       ├── textarea.tsx
│   │   │   │       ├── toggle-group.tsx
│   │   │   │       ├── toggle.tsx
│   │   │   │       └── tooltip.tsx
│   │   │   ├── config/
│   │   │   │   ├── env.ts
│   │   │   │   └── training.ts
│   │   │   ├── features/
│   │   │   │   ├── auth/
│   │   │   │   │   ├── api.ts
│   │   │   │   │   ├── change-password-page.tsx
│   │   │   │   │   ├── components/
│   │   │   │   │   │   └── auth-form.tsx
│   │   │   │   │   ├── index.ts
│   │   │   │   │   ├── login-page.tsx
│   │   │   │   │   └── session.ts
│   │   │   │   ├── chat/
│   │   │   │   │   ├── api/
│   │   │   │   │   │   ├── chat-adapter.ts
│   │   │   │   │   │   └── chat-api.ts
│   │   │   │   │   ├── chat-page.tsx
│   │   │   │   │   ├── chat-settings-sheet.tsx
│   │   │   │   │   ├── components/
│   │   │   │   │   │   └── model-load-status.tsx
│   │   │   │   │   ├── db.ts
│   │   │   │   │   ├── hooks/
│   │   │   │   │   │   └── use-chat-model-runtime.ts
│   │   │   │   │   ├── index.ts
│   │   │   │   │   ├── runtime-provider.tsx
│   │   │   │   │   ├── shared-composer.tsx
│   │   │   │   │   ├── stores/
│   │   │   │   │   │   └── chat-runtime-store.ts
│   │   │   │   │   ├── thread-sidebar.tsx
│   │   │   │   │   ├── tour/
│   │   │   │   │   │   ├── index.ts
│   │   │   │   │   │   └── steps.tsx
│   │   │   │   │   ├── types/
│   │   │   │   │   │   ├── api.ts
│   │   │   │   │   │   └── runtime.ts
│   │   │   │   │   ├── types.ts
│   │   │   │   │   └── utils/
│   │   │   │   │       └── parse-assistant-content.ts
│   │   │   │   ├── data-recipes/
│   │   │   │   │   ├── data/
│   │   │   │   │   │   └── recipes-db.ts
│   │   │   │   │   ├── index.ts
│   │   │   │   │   ├── learning-recipes/
│   │   │   │   │   │   ├── conversation.json
│   │   │   │   │   │   ├── index.ts
│   │   │   │   │   │   ├── instruction-from-answer.json
│   │   │   │   │   │   ├── ocr-document-extraction.json
│   │   │   │   │   │   ├── pdf-grounded-qa.json
│   │   │   │   │   │   ├── structured-outputs-jinja.json
│   │   │   │   │   │   ├── text-to-python.json
│   │   │   │   │   │   └── text-to-sql.json
│   │   │   │   │   ├── pages/
│   │   │   │   │   │   ├── data-recipes-page.tsx
│   │   │   │   │   │   └── edit-recipe-page.tsx
│   │   │   │   │   └── types.ts
│   │   │   │   ├── export/
│   │   │   │   │   ├── anim.ts
│   │   │   │   │   ├── api/
│   │   │   │   │   │   └── export-api.ts
│   │   │   │   │   ├── components/
│   │   │   │   │   │   ├── export-dialog.tsx
│   │   │   │   │   │   ├── method-picker.tsx
│   │   │   │   │   │   └── quant-picker.tsx
│   │   │   │   │   ├── constants.ts
│   │   │   │   │   ├── export-page.tsx
│   │   │   │   │   ├── index.ts
│   │   │   │   │   └── tour/
│   │   │   │   │       ├── index.ts
│   │   │   │   │       └── steps.tsx
│   │   │   │   ├── onboarding/
│   │   │   │   │   ├── components/
│   │   │   │   │   │   ├── splash-screen.tsx
│   │   │   │   │   │   ├── steps/
│   │   │   │   │   │   │   ├── dataset-step.tsx
│   │   │   │   │   │   │   ├── hyperparameters-step.tsx
│   │   │   │   │   │   │   ├── model-selection-step.tsx
│   │   │   │   │   │   │   ├── model-type-step.tsx
│   │   │   │   │   │   │   └── summary-step.tsx
│   │   │   │   │   │   ├── wizard-content.tsx
│   │   │   │   │   │   ├── wizard-footer.tsx
│   │   │   │   │   │   ├── wizard-layout.tsx
│   │   │   │   │   │   ├── wizard-sidebar.tsx
│   │   │   │   │   │   └── wizard-step-item.tsx
│   │   │   │   │   └── index.ts
│   │   │   │   ├── recipe-studio/
│   │   │   │   │   ├── api/
│   │   │   │   │   │   └── index.ts
│   │   │   │   │   ├── blocks/
│   │   │   │   │   │   ├── definitions.ts
│   │   │   │   │   │   ├── registry.ts
│   │   │   │   │   │   └── render-dialog.tsx
│   │   │   │   │   ├── components/
│   │   │   │   │   │   ├── block-sheet.tsx
│   │   │   │   │   │   ├── chip-input.tsx
│   │   │   │   │   │   ├── controls/
│   │   │   │   │   │   │   ├── layout-controls.tsx
│   │   │   │   │   │   │   ├── run-validate-floating-controls.tsx
│   │   │   │   │   │   │   └── viewport-controls.tsx
│   │   │   │   │   │   ├── executions/
│   │   │   │   │   │   │   ├── execution-columns-tab.tsx
│   │   │   │   │   │   │   ├── execution-data-tab.tsx
│   │   │   │   │   │   │   ├── execution-overview-tab.tsx
│   │   │   │   │   │   │   ├── execution-raw-tab.tsx
│   │   │   │   │   │   │   ├── execution-sidebar.tsx
│   │   │   │   │   │   │   ├── executions-view-helpers.ts
│   │   │   │   │   │   │   ├── executions-view.tsx
│   │   │   │   │   │   │   └── publish-execution-dialog.tsx
│   │   │   │   │   │   ├── graph/
│   │   │   │   │   │   │   └── internals-sync.tsx
│   │   │   │   │   │   ├── inline/
│   │   │   │   │   │   │   ├── inline-category-badges.tsx
│   │   │   │   │   │   │   ├── inline-expression.tsx
│   │   │   │   │   │   │   ├── inline-field.tsx
│   │   │   │   │   │   │   ├── inline-llm.tsx
│   │   │   │   │   │   │   ├── inline-model.tsx
│   │   │   │   │   │   │   ├── inline-policy.ts
│   │   │   │   │   │   │   ├── inline-sampler.tsx
│   │   │   │   │   │   │   └── inline-seed.tsx
│   │   │   │   │   │   ├── recipe-floating-icon-button-class.ts
│   │   │   │   │   │   ├── recipe-graph-aux-node.tsx
│   │   │   │   │   │   ├── recipe-graph-node.tsx
│   │   │   │   │   │   ├── recipe-graph-semantic-edge.tsx
│   │   │   │   │   │   ├── recipe-studio-header.tsx
│   │   │   │   │   │   ├── rf-ui/
│   │   │   │   │   │   │   ├── base-handle.tsx
│   │   │   │   │   │   │   ├── base-node.tsx
│   │   │   │   │   │   │   ├── data-edge.tsx
│   │   │   │   │   │   │   └── labeled-handle.tsx
│   │   │   │   │   │   ├── runtime/
│   │   │   │   │   │   │   └── execution-progress-island.tsx
│   │   │   │   │   │   └── shared/
│   │   │   │   │   │       ├── available-references-inline.tsx
│   │   │   │   │   │       └── hf-dataset-combobox.tsx
│   │   │   │   │   ├── constants.ts
│   │   │   │   │   ├── data/
│   │   │   │   │   │   └── executions-db.ts
│   │   │   │   │   ├── dialogs/
│   │   │   │   │   │   ├── config-dialog.tsx
│   │   │   │   │   │   ├── expression/
│   │   │   │   │   │   │   └── expression-dialog.tsx
│   │   │   │   │   │   ├── import-dialog.tsx
│   │   │   │   │   │   ├── llm/
│   │   │   │   │   │   │   ├── general-tab.tsx
│   │   │   │   │   │   │   ├── llm-dialog.tsx
│   │   │   │   │   │   │   └── scores-tab.tsx
│   │   │   │   │   │   ├── markdown-note/
│   │   │   │   │   │   │   └── markdown-note-dialog.tsx
│   │   │   │   │   │   ├── models/
│   │   │   │   │   │   │   ├── model-config-dialog.tsx
│   │   │   │   │   │   │   └── model-provider-dialog.tsx
│   │   │   │   │   │   ├── preview-dialog.tsx
│   │   │   │   │   │   ├── processors-dialog.tsx
│   │   │   │   │   │   ├── samplers/
│   │   │   │   │   │   │   ├── bernoulli-dialog.tsx
│   │   │   │   │   │   │   ├── category-dialog.tsx
│   │   │   │   │   │   │   ├── datetime-dialog.tsx
│   │   │   │   │   │   │   ├── gaussian-dialog.tsx
│   │   │   │   │   │   │   ├── person-dialog.tsx
│   │   │   │   │   │   │   ├── subcategory-dialog.tsx
│   │   │   │   │   │   │   ├── timedelta-dialog.tsx
│   │   │   │   │   │   │   ├── uniform-dialog.tsx
│   │   │   │   │   │   │   └── uuid-dialog.tsx
│   │   │   │   │   │   ├── seed/
│   │   │   │   │   │   │   └── seed-dialog.tsx
│   │   │   │   │   │   ├── shared/
│   │   │   │   │   │   │   ├── available-variables.tsx
│   │   │   │   │   │   │   ├── collapsible-section-trigger.tsx
│   │   │   │   │   │   │   ├── dialog-shell.tsx
│   │   │   │   │   │   │   ├── field-label.tsx
│   │   │   │   │   │   │   ├── name-field.tsx
│   │   │   │   │   │   │   └── validation-banner.tsx
│   │   │   │   │   │   ├── tool-profile/
│   │   │   │   │   │   │   ├── helpers.ts
│   │   │   │   │   │   │   └── tool-profile-dialog.tsx
│   │   │   │   │   │   └── validators/
│   │   │   │   │   │       └── validator-dialog.tsx
│   │   │   │   │   ├── execution-types.ts
│   │   │   │   │   ├── executions/
│   │   │   │   │   │   ├── execution-helpers.ts
│   │   │   │   │   │   ├── hydration.ts
│   │   │   │   │   │   ├── run-settings.ts
│   │   │   │   │   │   ├── runtime.ts
│   │   │   │   │   │   └── tracker.ts
│   │   │   │   │   ├── hooks/
│   │   │   │   │   │   ├── use-node-connection-status.ts
│   │   │   │   │   │   ├── use-recipe-editor-graph.ts
│   │   │   │   │   │   ├── use-recipe-executions.ts
│   │   │   │   │   │   ├── use-recipe-persistence.ts
│   │   │   │   │   │   ├── use-recipe-runtime-visuals.ts
│   │   │   │   │   │   └── use-recipe-studio-actions.ts
│   │   │   │   │   ├── index.ts
│   │   │   │   │   ├── recipe-studio-page.tsx
│   │   │   │   │   ├── stores/
│   │   │   │   │   │   ├── helpers/
│   │   │   │   │   │   │   ├── edge-sync.ts
│   │   │   │   │   │   │   ├── model-infra-layout.ts
│   │   │   │   │   │   │   ├── node-updates.ts
│   │   │   │   │   │   │   ├── reference-sync.ts
│   │   │   │   │   │   │   └── removals.ts
│   │   │   │   │   │   ├── recipe-executions.ts
│   │   │   │   │   │   ├── recipe-studio-helpers.ts
│   │   │   │   │   │   └── recipe-studio.ts
│   │   │   │   │   ├── types/
│   │   │   │   │   │   └── index.ts
│   │   │   │   │   └── utils/
│   │   │   │   │       ├── config-factories.ts
│   │   │   │   │       ├── config-labels.ts
│   │   │   │   │       ├── config-type-guards.ts
│   │   │   │   │       ├── graph/
│   │   │   │   │       │   ├── derive-display-graph.ts
│   │   │   │   │       │   ├── fit-view.ts
│   │   │   │   │       │   ├── recipe-graph-connection.ts
│   │   │   │   │       │   ├── relations.ts
│   │   │   │   │       │   └── runtime-visual-state.ts
│   │   │   │   │       ├── graph-warnings.ts
│   │   │   │   │       ├── graph.ts
│   │   │   │   │       ├── handle-layout.ts
│   │   │   │   │       ├── handles.ts
│   │   │   │   │       ├── image-preview.ts
│   │   │   │   │       ├── import/
│   │   │   │   │       │   ├── edges.ts
│   │   │   │   │       │   ├── helpers.ts
│   │   │   │   │       │   ├── importer.ts
│   │   │   │   │       │   ├── index.ts
│   │   │   │   │       │   ├── parsers/
│   │   │   │   │       │   │   ├── expression-parser.ts
│   │   │   │   │       │   │   ├── llm-parser.ts
│   │   │   │   │       │   │   ├── model-parser.ts
│   │   │   │   │       │   │   ├── sampler-parser.ts
│   │   │   │   │       │   │   ├── seed-config-parser.ts
│   │   │   │   │       │   │   └── validator-parser.ts
│   │   │   │   │       │   ├── parsers.ts
│   │   │   │   │       │   ├── types.ts
│   │   │   │   │       │   └── ui.ts
│   │   │   │   │       ├── index.ts
│   │   │   │   │       ├── layout.ts
│   │   │   │   │       ├── naming.ts
│   │   │   │   │       ├── node-data.ts
│   │   │   │   │       ├── parse.ts
│   │   │   │   │       ├── payload/
│   │   │   │   │       │   ├── build-payload.ts
│   │   │   │   │       │   ├── builders-llm.ts
│   │   │   │   │       │   ├── builders-model.ts
│   │   │   │   │       │   ├── builders-processors.ts
│   │   │   │   │       │   ├── builders-sampler.ts
│   │   │   │   │       │   ├── builders-seed.ts
│   │   │   │   │       │   ├── builders-validator.ts
│   │   │   │   │       │   ├── builders.ts
│   │   │   │   │       │   ├── empty.ts
│   │   │   │   │       │   ├── index.ts
│   │   │   │   │       │   ├── parse.ts
│   │   │   │   │       │   ├── types.ts
│   │   │   │   │       │   └── validate.ts
│   │   │   │   │       ├── processors.ts
│   │   │   │   │       ├── reactflow-changes.ts
│   │   │   │   │       ├── recipe-studio-view.ts
│   │   │   │   │       ├── refs.ts
│   │   │   │   │       ├── rf-node-dimensions.ts
│   │   │   │   │       ├── ui-tones.ts
│   │   │   │   │       ├── validation.ts
│   │   │   │   │       ├── validators/
│   │   │   │   │       │   ├── code-lang.ts
│   │   │   │   │       │   ├── oxc-code-shape.ts
│   │   │   │   │       │   └── oxc-mode.ts
│   │   │   │   │       └── variables.ts
│   │   │   │   ├── studio/
│   │   │   │   │   ├── index.ts
│   │   │   │   │   ├── sections/
│   │   │   │   │   │   ├── charts/
│   │   │   │   │   │   │   ├── chart-preferences-store.ts
│   │   │   │   │   │   │   ├── chart-settings-sheet.tsx
│   │   │   │   │   │   │   ├── eval-loss-chart-card.tsx
│   │   │   │   │   │   │   ├── grad-norm-chart-card.tsx
│   │   │   │   │   │   │   ├── learning-rate-chart-card.tsx
│   │   │   │   │   │   │   ├── training-loss-chart-card.tsx
│   │   │   │   │   │   │   ├── types.ts
│   │   │   │   │   │   │   └── utils.ts
│   │   │   │   │   │   ├── charts-content.tsx
│   │   │   │   │   │   ├── charts-section.tsx
│   │   │   │   │   │   ├── dataset-preview-dialog-mapping.tsx
│   │   │   │   │   │   ├── dataset-preview-dialog-utils.ts
│   │   │   │   │   │   ├── dataset-preview-dialog.tsx
│   │   │   │   │   │   ├── dataset-section.tsx
│   │   │   │   │   │   ├── document-upload-redirect-dialog.tsx
│   │   │   │   │   │   ├── model-section.tsx
│   │   │   │   │   │   ├── params-section.tsx
│   │   │   │   │   │   ├── progress-section-lib.ts
│   │   │   │   │   │   ├── progress-section.tsx
│   │   │   │   │   │   └── training-section.tsx
│   │   │   │   │   ├── studio-page.tsx
│   │   │   │   │   ├── tour/
│   │   │   │   │   │   ├── index.ts
│   │   │   │   │   │   ├── steps/
│   │   │   │   │   │   │   ├── base-model.tsx
│   │   │   │   │   │   │   ├── dataset.tsx
│   │   │   │   │   │   │   ├── index.tsx
│   │   │   │   │   │   │   ├── local-model.tsx
│   │   │   │   │   │   │   ├── method.tsx
│   │   │   │   │   │   │   ├── nav.tsx
│   │   │   │   │   │   │   ├── params.tsx
│   │   │   │   │   │   │   ├── save.tsx
│   │   │   │   │   │   │   └── start.tsx
│   │   │   │   │   │   └── training/
│   │   │   │   │   │       ├── index.ts
│   │   │   │   │   │       └── steps.tsx
│   │   │   │   │   ├── training-start-overlay.tsx
│   │   │   │   │   └── training-view.tsx
│   │   │   │   ├── tour/
│   │   │   │   │   ├── components/
│   │   │   │   │   │   ├── guided-tour.tsx
│   │   │   │   │   │   ├── read-more.tsx
│   │   │   │   │   │   └── spotlight-overlay.tsx
│   │   │   │   │   ├── hooks/
│   │   │   │   │   │   └── use-guided-tour-controller.ts
│   │   │   │   │   ├── index.ts
│   │   │   │   │   └── types.ts
│   │   │   │   └── training/
│   │   │   │       ├── api/
│   │   │   │       │   ├── datasets-api.ts
│   │   │   │       │   ├── mappers.ts
│   │   │   │       │   ├── models-api.ts
│   │   │   │       │   └── train-api.ts
│   │   │   │       ├── components/
│   │   │   │       │   └── hf-dataset-subset-split-selectors.tsx
│   │   │   │       ├── hooks/
│   │   │   │       │   ├── use-max-steps-epochs-toggle.ts
│   │   │   │       │   ├── use-training-actions.ts
│   │   │   │       │   └── use-training-runtime-lifecycle.ts
│   │   │   │       ├── index.ts
│   │   │   │       ├── stores/
│   │   │   │       │   ├── dataset-preview-dialog-store.ts
│   │   │   │       │   ├── training-config-store.ts
│   │   │   │       │   └── training-runtime-store.ts
│   │   │   │       └── types/
│   │   │   │           ├── api.ts
│   │   │   │           ├── config.ts
│   │   │   │           ├── datasets.ts
│   │   │   │           └── runtime.ts
│   │   │   ├── hooks/
│   │   │   │   ├── index.ts
│   │   │   │   ├── use-debounced-value.ts
│   │   │   │   ├── use-gpu-info.ts
│   │   │   │   ├── use-gpu-utilization.ts
│   │   │   │   ├── use-hardware-info.ts
│   │   │   │   ├── use-hf-dataset-search.ts
│   │   │   │   ├── use-hf-dataset-splits.ts
│   │   │   │   ├── use-hf-model-search.ts
│   │   │   │   ├── use-hf-paginated-search.ts
│   │   │   │   ├── use-hf-token-validation.ts
│   │   │   │   ├── use-infinite-scroll.ts
│   │   │   │   ├── use-mobile.ts
│   │   │   │   └── use-recommended-model-vram.ts
│   │   │   ├── index.css
│   │   │   ├── main.tsx
│   │   │   ├── shared/
│   │   │   │   └── toast.ts
│   │   │   ├── speech-recognition.d.ts
│   │   │   ├── stores/
│   │   │   │   ├── index.ts
│   │   │   │   └── training.ts
│   │   │   ├── types/
│   │   │   │   ├── index.ts
│   │   │   │   └── training.ts
│   │   │   └── utils/
│   │   │       ├── index.ts
│   │   │       └── strings.ts
│   │   ├── tsconfig.app.json
│   │   ├── tsconfig.json
│   │   ├── tsconfig.node.json
│   │   └── vite.config.ts
│   ├── install_python_stack.py
│   ├── setup.bat
│   ├── setup.ps1
│   └── setup.sh
├── tests/
│   ├── __init__.py
│   ├── qlora/
│   │   ├── README.md
│   │   ├── test_hf_qlora_train_and_merge.py
│   │   └── test_unsloth_qlora_train_and_merge.py
│   ├── saving/
│   │   ├── gpt-oss-merge/
│   │   │   ├── run_test.sh
│   │   │   ├── test_merged_model.py
│   │   │   └── train_and_merge.py
│   │   ├── language_models/
│   │   │   ├── test_merge_4bit_validation.py
│   │   │   ├── test_merge_model_perplexity_llama-3.2.py
│   │   │   ├── test_merge_model_perplexity_mistral.py
│   │   │   ├── test_merge_model_perplexity_phi_4.py
│   │   │   ├── test_merged_model_perplexity_llama-3.1-8b.py
│   │   │   ├── test_merged_model_perplexity_qwen_2.5.py
│   │   │   ├── test_push_to_hub_merged.py
│   │   │   ├── test_push_to_hub_merged_sharded_index_file.py
│   │   │   └── test_save_merged_grpo_model.py
│   │   ├── non_peft/
│   │   │   ├── test_mistral_non_peft.py
│   │   │   └── test_whisper_non_peft.py
│   │   ├── test_unsloth_save.py
│   │   ├── text_to_speech_models/
│   │   │   ├── test_csm.py
│   │   │   ├── test_lasa.py
│   │   │   ├── test_orpheus.py
│   │   │   └── test_whisper.py
│   │   └── vision_models/
│   │       ├── test_index_file_sharded_model.py
│   │       ├── test_push_to_hub_merged.py
│   │       ├── test_save_merge_qwen2.5vl32B_model_ocr_benchmark.py
│   │       └── test_save_merge_vision_model_ocr_benchmark.py
│   ├── test_get_model_name.py
│   ├── test_model_registry.py
│   ├── test_raw_text.py
│   └── utils/
│       ├── __init__.py
│       ├── aime_eval.md
│       ├── aime_eval.py
│       ├── cleanup_utils.py
│       ├── data_utils.py
│       ├── hf_utils.py
│       ├── ocr_eval.md
│       ├── ocr_eval.py
│       ├── os_utils.py
│       ├── perplexity_eval.md
│       ├── perplexity_eval.py
│       ├── test_attention_masks.py
│       ├── test_packing.py
│       ├── test_qat.py
│       └── test_trunc_normal_patch.py
├── unsloth/
│   ├── __init__.py
│   ├── _auto_install.py
│   ├── chat_templates.py
│   ├── dataprep/
│   │   ├── __init__.py
│   │   ├── raw_text.py
│   │   ├── synthetic.py
│   │   └── synthetic_configs.py
│   ├── device_type.py
│   ├── import_fixes.py
│   ├── kernels/
│   │   ├── __init__.py
│   │   ├── cross_entropy_loss.py
│   │   ├── fast_lora.py
│   │   ├── flex_attention.py
│   │   ├── fp8.py
│   │   ├── geglu.py
│   │   ├── layernorm.py
│   │   ├── moe/
│   │   │   ├── LICENSE
│   │   │   ├── README.md
│   │   │   ├── __init__.py
│   │   │   ├── autotune_cache.py
│   │   │   ├── benchmark/
│   │   │   │   ├── benchmark_fused_moe.py
│   │   │   │   └── utils.py
│   │   │   ├── grouped_gemm/
│   │   │   │   ├── LICENSE
│   │   │   │   ├── __init__.py
│   │   │   │   ├── interface.py
│   │   │   │   ├── kernels/
│   │   │   │   │   ├── __init__.py
│   │   │   │   │   ├── autotuning.py
│   │   │   │   │   ├── backward.py
│   │   │   │   │   ├── forward.py
│   │   │   │   │   └── tuning.py
│   │   │   │   └── reference/
│   │   │   │       ├── __init__.py
│   │   │   │       ├── layers/
│   │   │   │       │   ├── llama4_moe.py
│   │   │   │       │   └── qwen3_moe.py
│   │   │   │       ├── moe_block.py
│   │   │   │       └── moe_ops.py
│   │   │   ├── requirements.txt
│   │   │   └── tests/
│   │   │       ├── __init__.py
│   │   │       ├── common.py
│   │   │       ├── moe_utils.py
│   │   │       ├── run_qwen3_moe_tests.sh
│   │   │       ├── test_grouped_gemm.py
│   │   │       ├── test_llama4_moe.py
│   │   │       └── test_qwen3_moe.py
│   │   ├── rms_layernorm.py
│   │   ├── rope_embedding.py
│   │   ├── swiglu.py
│   │   └── utils.py
│   ├── models/
│   │   ├── __init__.py
│   │   ├── _utils.py
│   │   ├── cohere.py
│   │   ├── dpo.py
│   │   ├── falcon_h1.py
│   │   ├── gemma.py
│   │   ├── gemma2.py
│   │   ├── glm4_moe.py
│   │   ├── granite.py
│   │   ├── llama.py
│   │   ├── llama4.py
│   │   ├── loader.py
│   │   ├── loader_utils.py
│   │   ├── mapper.py
│   │   ├── mistral.py
│   │   ├── qwen2.py
│   │   ├── qwen3.py
│   │   ├── qwen3_moe.py
│   │   ├── rl.py
│   │   ├── rl_replacements.py
│   │   ├── sentence_transformer.py
│   │   └── vision.py
│   ├── ollama_template_mappers.py
│   ├── registry/
│   │   ├── REGISTRY.md
│   │   ├── __init__.py
│   │   ├── _deepseek.py
│   │   ├── _gemma.py
│   │   ├── _llama.py
│   │   ├── _mistral.py
│   │   ├── _phi.py
│   │   ├── _qwen.py
│   │   └── registry.py
│   ├── save.py
│   ├── tokenizer_utils.py
│   ├── trainer.py
│   └── utils/
│       ├── __init__.py
│       ├── attention_dispatch.py
│       ├── hf_hub.py
│       └── packing.py
├── unsloth-cli.py
└── unsloth_cli/
    ├── __init__.py
    ├── commands/
    │   ├── __init__.py
    │   ├── export.py
    │   ├── inference.py
    │   ├── studio.py
    │   ├── train.py
    │   └── ui.py
    ├── config.py
    └── options.py

================================================
FILE CONTENTS
================================================

================================================
FILE: .gitattributes
================================================
# Normalize Python files to LF line endings
*.py text eol=lf


================================================
FILE: .github/CODEOWNERS
================================================
# Inspired from https://github.com/vllm-project/vllm/blob/main/.github/CODEOWNERS

/unsloth/models/loader.py @danielhanchen @mmathew23
/unsloth/models/llama.py @Datta0 @danielhanchen @mmathew23
/unsloth/models/rl.py @Datta0 @pluesclues @danielhanchen
/unsloth/models/rl_replacements.py @Datta0 @pluesclues @danielhanchen
/unsloth/trainer.py @danielhanchen
/unsloth/models/sentence_transformer.py @Etherll @danielhanchen
/unsloth/save.py @rolandtannous @danielhanchen
/unsloth/tokenizer_utils.py @mmathew23 @danielhanchen
/unsloth/chat_templates.py @rolandtannous @danielhanchen
/unsloth/ollama_template_mappers.py @rolandtannous @danielhanchen
/unsloth/kernels/moe/*.py @Datta0
/unsloth/import_fixes.py @danielhanchen
/unsloth/device_type.py @danielhanchen
/unsloth/_auto_install.py @danielhanchen
/unsloth/dataprep/*.py @danielhanchen
/unsloth/kernels/cross_entropy_loss.py @danielhanchen
/unsloth/kernels/fast_lora.py @danielhanchen
/unsloth/kernels/flex_attention.py @danielhanchen
/unsloth/kernels/fp8.py @Datta0
/unsloth/kernels/geglu.py @danielhanchen
/unsloth/kernels/layernorm.py @danielhanchen
/unsloth/kernels/rms_layernorm.py @danielhanchen
/unsloth/kernels/rope_embedding.py @danielhanchen
/unsloth/kernels/swiglu.py @danielhanchen
/unsloth/kernels/utils.py @danielhanchen @Datta0
/unsloth/models/_utils.py @danielhanchen @mmathew23
/unsloth/models/cohere.py @danielhanchen
/unsloth/models/dpo.py @danielhanchen
/unsloth/models/falcon_h1.py @danielhanchen
/unsloth/models/gemma.py @danielhanchen
/unsloth/models/gemma2.py @danielhanchen
/unsloth/models/glm4_moe.py @Datta0
/unsloth/models/granite.py @danielhanchen
/unsloth/models/llama4.py @danielhanchen
/unsloth/models/loader_utils.py @Datta0 @danielhanchen
/unsloth/models/mapper.py @danielhanchen
/unsloth/models/mistral.py @danielhanchen
/unsloth/models/qwen2.py @danielhanchen
/unsloth/models/qwen3.py @Datta0
/unsloth/models/qwen3_moe.py @Datta0
/unsloth/models/vision.py @mmathew23 @danielhanchen
/unsloth/utils/attention_dispatch.py @mmathew23
/unsloth/utils/hf_hub.py @mmathew23
/unsloth/utils/packing.py @mmathew23

/cli/ @rolandtannous @Manan17
/studio/frontend/ @Shine1i @rolandtannous @Manan17
/studio/frontend/public/ @Shine1i
/studio/backend/ @rolandtannous
/studio/backend/core/data_recipe/ @rolandtannous
/studio/backend/tests/ @rolandtannous @danielhanchen
/tests/ @rolandtannous @danielhanchen
/scripts/ @rolandtannous @danielhanchen


================================================
FILE: .github/FUNDING.yml
================================================
# These are supported funding model platforms

github: unslothai
patreon: # Replace with a single Patreon username
open_collective: # Replace with a single Open Collective username
ko_fi: # unsloth
tidelift: # Replace with a single Tidelift platform-name/package-name e.g., npm/babel
community_bridge: # Replace with a single Community Bridge project-name e.g., cloud-foundry
liberapay: # Replace with a single Liberapay username
issuehunt: # Replace with a single IssueHunt username
otechie: # Replace with a single Otechie username
lfx_crowdfunding: # Replace with a single LFX Crowdfunding project-name e.g., cloud-foundry
custom: # Replace with up to 4 custom sponsorship URLs e.g., ['link1', 'link2']


================================================
FILE: .github/ISSUE_TEMPLATE/bug---issue.md
================================================
---
name: Bug / Issue
about: Bug / Issue
title: "[Bug] Please fill in your issue title here."
labels: bug
assignees: ''

---

1. Did you update? `pip install --upgrade unsloth unsloth_zoo`
2. `Colab` or `Kaggle` or local / cloud
3. Number GPUs used, use `nvidia-smi`
4. Which notebook? Please link!
5. Which Unsloth version, TRL version, transformers version, PyTorch version?
6. Which trainer? `SFTTrainer`, `GRPOTrainer` etc

```python
Put Minimal code to reproduce error here ###Remove Hugging Face token###
```

🦥 You can also ask via our Reddit page: https://reddit.com/r/unsloth/


================================================
FILE: .github/ISSUE_TEMPLATE/feature-request.md
================================================
---
name: Feature Request
about: New features, model support, ideas
title: "[Feature]"
labels: feature request
assignees: ''

---

For new models, have you tried:
```python
from unsloth import FastModel
model, tokenizer = FastModel.from_pretrained(
    "microsoft/Phi-4-multimodal-instruct",
    trust_remote_code = True,
)
from transformers import AutoModelForSequenceClassification
model, tokenizer = FastModel.from_pretrained(
    auto_model = AutoModelForSequenceClassification,
)
```


================================================
FILE: .github/workflows/stale.yml
================================================
name: 'Inactive Issue Pinger'

on:
  schedule:
    - cron: '30 5 * * *' # Runs at 5:30 UTC every day

jobs:
  stale:
    runs-on: ubuntu-latest
    permissions:
      issues: write

    steps:
      - uses: actions/stale@v10
        with:
          # The message to post on stale issues.
          # This message will ping the issue author.
          # Note: The stale bot action does not currently support a direct placeholder for the last commenter.
          # As a workaround, this message encourages any participant to reply.
          stale-issue-message: >
            Is this issue still important to you?
            Apologies in advance we might have missed this issue as well.
            For faster response times, please post on our Reddit server - https://www.reddit.com/r/unsloth or our Discord - https://discord.com/invite/unsloth 

          # The number of days of inactivity before an issue is considered stale.
          days-before-issue-stale: 9999

          # Set to -1 to never close stale issues.
          days-before-issue-close: -1

          # A label to apply to stale issues.
          stale-issue-label: 'inactive'

          # The number of operations to perform per run to avoid rate limiting.
          operations-per-run: 500

          enable-statistics: false


================================================
FILE: .gitignore
================================================
# Byte-compiled / optimized / DLL files
__pycache__/
*.py[cod]
*.class
unsloth_compiled_cache/
# ML artifacts (large files)
feature/
outputs/
exports/
/datasets/
studio/backend/assets/datasets/
unsloth_training_checkpoints/
*.gguf
*.safetensors

# C extensions
*.so

# Distribution / packaging
.Python
build/
develop-eggs/
dist/
downloads/
eggs/
.eggs/
lib/
lib64/
parts/
sdist/
var/
wheels/
share/python-wheels/
*.egg-info/
.installed.cfg
*.egg
MANIFEST

# PyInstaller
#  Usually these files are written by a python script from a template
#  before PyInstaller builds the exe, so as to inject date/other infos into it.
*.manifest
*.spec

# Installer logs
pip-log.txt
pip-delete-this-directory.txt

# Unit test / coverage reports
htmlcov/
.tox/
.nox/
.coverage
.coverage.*
.cache
nosetests.xml
coverage.xml
*.cover
*.py,cover
.hypothesis/
.pytest_cache/
cover/

# Translations
*.mo
*.pot

# Django stuff:
*.log
local_settings.py
db.sqlite3
db.sqlite3-journal

# Flask stuff:
instance/
.webassets-cache

# Scrapy stuff:
.scrapy

# Sphinx documentation
docs/_build/

# PyBuilder
.pybuilder/
target/

# Jupyter Notebook
.ipynb_checkpoints

# IPython
profile_default/
ipython_config.py

# pyenv
#   For a library or package, you might want to ignore these files since the code is
#   intended to run in multiple environments; otherwise, check them in:
# .python-version

# pipenv
#   According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control.
#   However, in case of collaboration, if having platform-specific dependencies or dependencies
#   having no cross-platform support, pipenv may install dependencies that don't work, or not
#   install all needed dependencies.
#Pipfile.lock

# UV
#   Similar to Pipfile.lock, it is generally recommended to include uv.lock in version control.
#   This is especially recommended for binary packages to ensure reproducibility, and is more
#   commonly ignored for libraries.
#uv.lock

# poetry
#   Similar to Pipfile.lock, it is generally recommended to include poetry.lock in version control.
#   This is especially recommended for binary packages to ensure reproducibility, and is more
#   commonly ignored for libraries.
#   https://python-poetry.org/docs/basic-usage/#commit-your-poetrylock-file-to-version-control
#poetry.lock

# pdm
#   Similar to Pipfile.lock, it is generally recommended to include pdm.lock in version control.
#pdm.lock
#   pdm stores project-wide configurations in .pdm.toml, but it is recommended to not include it
#   in version control.
#   https://pdm.fming.dev/latest/usage/project/#working-with-version-control
.pdm.toml
.pdm-python
.pdm-build/

# PEP 582; used by e.g. github.com/David-OConnor/pyflow and github.com/pdm-project/pdm
__pypackages__/

# Celery stuff
celerybeat-schedule
celerybeat.pid

# SageMath parsed files
*.sage.py

# Environments
.env
.venv
env/
venv/
ENV/
env.bak/
venv.bak/
.venv_overlay/
.venv_t5/
environment.yaml

# Spyder project settings
.spyderproject
.spyproject

# Rope project settings
.ropeproject

# mkdocs documentation
/site

# mypy
.mypy_cache/
.dmypy.json
dmypy.json

# Pyre type checker
.pyre/

# pytype static type analyzer
.pytype/

# Cython debug symbols
cython_debug/

# PyCharm
#  JetBrains specific template is maintained in a separate JetBrains.gitignore that can
#  be found at https://github.com/github/gitignore/blob/main/Global/JetBrains.gitignore
#  and can be added to the global gitignore or merged into this file.  For a more nuclear
#  option (not recommended) you can uncomment the following to ignore the entire idea folder.
#.idea/

# Ruff stuff:
.ruff_cache/
.pre-commit-cache/

# PyPI configuration file and IDE/Editors
.pypirc
.vscode
.idea/
.claude/
*.swp
*.swo

# oh-my-codex
.omx/

# Firebase
firebase-debug.log

# Other
resources/
tmp/
**/node_modules/
auth.db

# Local working docs
**/CLAUDE.md
**/claude.md
**/AGENT.md
**/agent.md
docs/canvas-lab-architecture.md
log_rtx.txt
log.txt
setup_leo.sh
server.pid
*.log
package-lock.json


================================================
FILE: .pre-commit-ci.yaml
================================================
ci:
  autofix_prs: true
  autofix_prs_limit: 5
  autoupdate_schedule: monthly
  autoupdate_commit_msg: "chore: pre-commit autoupdate"
  skip: []


================================================
FILE: .pre-commit-config.yaml
================================================
repos:
  - repo: https://github.com/astral-sh/ruff-pre-commit
    rev: v0.15.6
    hooks:
      - id: ruff
        args:
          - --fix
          - --exit-non-zero-on-fix
  - repo: local
    hooks:
      - id: ruff-format-with-kwargs
        name: Ruff format with kwarg spacing
        entry: scripts/run_ruff_format.py
        language: python
        types: [python]
        additional_dependencies:
          - ruff==0.6.9


================================================
FILE: CODE_OF_CONDUCT.md
================================================

# Contributor Covenant Code of Conduct

## Our Pledge

We as members, contributors, and leaders pledge to make participation in our
community a harassment-free experience for everyone, regardless of age, body
size, visible or invisible disability, ethnicity, sex characteristics, gender
identity and expression, level of experience, education, socio-economic status,
nationality, personal appearance, race, caste, color, religion, or sexual
identity and orientation.

We pledge to act and interact in ways that contribute to an open, welcoming,
diverse, inclusive, and healthy community.

## Our Standards

Examples of behavior that contributes to a positive environment for our
community include:

* Demonstrating empathy and kindness toward other people
* Being respectful of differing opinions, viewpoints, and experiences
* Giving and gracefully accepting constructive feedback
* Accepting responsibility and apologizing to those affected by our mistakes,
  and learning from the experience
* Focusing on what is best not just for us as individuals, but for the overall
  community

Examples of unacceptable behavior include:

* The use of sexualized language or imagery, and sexual attention or advances of
  any kind
* Trolling, insulting or derogatory comments, and personal or political attacks
* Public or private harassment
* Publishing others' private information, such as a physical or email address,
  without their explicit permission
* Other conduct which could reasonably be considered inappropriate in a
  professional setting

## Enforcement Responsibilities

Community leaders are responsible for clarifying and enforcing our standards of
acceptable behavior and will take appropriate and fair corrective action in
response to any behavior that they deem inappropriate, threatening, offensive,
or harmful.

Community leaders have the right and responsibility to remove, edit, or reject
comments, commits, code, wiki edits, issues, and other contributions that are
not aligned to this Code of Conduct, and will communicate reasons for moderation
decisions when appropriate.

## Scope

This Code of Conduct applies within all community spaces, and also applies when
an individual is officially representing the community in public spaces.
Examples of representing our community include using an official e-mail address,
posting via an official social media account, or acting as an appointed
representative at an online or offline event.

## Enforcement

Instances of abusive, harassing, or otherwise unacceptable behavior may be
reported to the community leaders responsible for enforcement at support@unsloth.ai.
All complaints will be reviewed and investigated promptly and fairly.

All community leaders are obligated to respect the privacy and security of the
reporter of any incident.

## Enforcement Guidelines

Community leaders will follow these Community Impact Guidelines in determining
the consequences for any action they deem in violation of this Code of Conduct:

### 1. Correction

**Community Impact**: Use of inappropriate language or other behavior deemed
unprofessional or unwelcome in the community.

**Consequence**: A private, written warning from community leaders, providing
clarity around the nature of the violation and an explanation of why the
behavior was inappropriate. A public apology may be requested.

### 2. Warning

**Community Impact**: A violation through a single incident or series of
actions.

**Consequence**: A warning with consequences for continued behavior. No
interaction with the people involved, including unsolicited interaction with
those enforcing the Code of Conduct, for a specified period of time. This
includes avoiding interactions in community spaces as well as external channels
like social media. Violating these terms may lead to a temporary or permanent
ban.

### 3. Temporary Ban

**Community Impact**: A serious violation of community standards, including
sustained inappropriate behavior.

**Consequence**: A temporary ban from any sort of interaction or public
communication with the community for a specified period of time. No public or
private interaction with the people involved, including unsolicited interaction
with those enforcing the Code of Conduct, is allowed during this period.
Violating these terms may lead to a permanent ban.

### 4. Permanent Ban

**Community Impact**: Demonstrating a pattern of violation of community
standards, including sustained inappropriate behavior, harassment of an
individual, or aggression toward or disparagement of classes of individuals.

**Consequence**: A permanent ban from any sort of public interaction within the
community.

## Attribution

This Code of Conduct is adapted from the [Contributor Covenant][homepage],
version 2.1, available at
[https://www.contributor-covenant.org/version/2/1/code_of_conduct.html][v2.1].

Community Impact Guidelines were inspired by
[Mozilla's code of conduct enforcement ladder][Mozilla CoC].

For answers to common questions about this code of conduct, see the FAQ at
[https://www.contributor-covenant.org/faq][FAQ]. Translations are available at
[https://www.contributor-covenant.org/translations][translations].

[homepage]: https://www.contributor-covenant.org
[v2.1]: https://www.contributor-covenant.org/version/2/1/code_of_conduct.html
[Mozilla CoC]: https://github.com/mozilla/diversity
[FAQ]: https://www.contributor-covenant.org/faq
[translations]: https://www.contributor-covenant.org/translations


================================================
FILE: CONTRIBUTING.md
================================================
# 🦥 Contributing to Unsloth

Thank you for not only using Unsloth but also for being interested in helping out! We value all contributions, whether they come in the form of code, ideas, support for others or just by simply spreading the word of Unsloth! 💕

- **[Support the Community](https://github.com/unslothai/unsloth/issues)**: Answer questions, review pull requests, or assist others in discussions.
- **Fix Bugs**: Identify and resolve issues with the existing codebase.
- **Submit Ideas**: Request new features or share enhancements you'd like to see.
- **Develop Features**: Implement new functionality or improve existing tools which can be done via PRs.
- **[Improve Documentation](https://docs.unsloth.ai/)**: Help by creating guides, FAQs, or enhancing clarity.

One of the best ways to support us is by spreading the word about Unsloth! Share how it’s powering your amazing projects in blog posts or social media, and inspire others to explore its potential. Even a simple star on our repo goes a long way in showing your support and helping the community grow. 🌟

## Submitting Issues
If you find a bug or have a feature idea, we’d love to hear from you! Here’s how to make your submission stand out:

### Reporting Bugs
1. **Search First**: Check if the issue has already been reported using GitHub’s search bar under Issues.
2. **Details Matter**: Is this on Google Colab, Kaggle, or on another platform service? Are you using Unsloth's official notebook? Include your OS, Python version, and other relevant details. For bugs, a concise code snippet that reproduces the issue is incredibly helpful.
3. **Be Thorough**: Attach screenshots, traceback logs, or any additional information that might speed up resolution.

## Spread the Word
Your support extends beyond code:
- Spread the word by writing about Unsloth in blogs or social media.
- Share how Unsloth powers your projects.
- Star our repository to show your appreciation.

Finally, please be mindful of our [Code of Conduct](https://github.com/unslothai/unsloth/blob/main/CODE_OF_CONDUCT.md) to ensure a welcoming and inclusive environment for everyone.

Thank you so much for reading and we hope you have lots of fun using Unsloth! 🦥


================================================
FILE: COPYING
================================================
                    GNU AFFERO GENERAL PUBLIC LICENSE
                       Version 3, 19 November 2007

 Copyright (C) 2007 Free Software Foundation, Inc. <https://fsf.org/>
 Everyone is permitted to copy and distribute verbatim copies
 of this license document, but changing it is not allowed.

                            Preamble

  The GNU Affero General Public License is a free, copyleft license for
software and other kinds of works, specifically designed to ensure
cooperation with the community in the case of network server software.

  The licenses for most software and other practical works are designed
to take away your freedom to share and change the works.  By contrast,
our General Public Licenses are intended to guarantee your freedom to
share and change all versions of a program--to make sure it remains free
software for all its users.

  When we speak of free software, we are referring to freedom, not
price.  Our General Public Licenses are designed to make sure that you
have the freedom to distribute copies of free software (and charge for
them if you wish), that you receive source code or can get it if you
want it, that you can change the software or use pieces of it in new
free programs, and that you know you can do these things.

  Developers that use our General Public Licenses protect your rights
with two steps: (1) assert copyright on the software, and (2) offer
you this License which gives you legal permission to copy, distribute
and/or modify the software.

  A secondary benefit of defending all users' freedom is that
improvements made in alternate versions of the program, if they
receive widespread use, become available for other developers to
incorporate.  Many developers of free software are heartened and
encouraged by the resulting cooperation.  However, in the case of
software used on network servers, this result may fail to come about.
The GNU General Public License permits making a modified version and
letting the public access it on a server without ever releasing its
source code to the public.

  The GNU Affero General Public License is designed specifically to
ensure that, in such cases, the modified source code becomes available
to the community.  It requires the operator of a network server to
provide the source code of the modified version running there to the
users of that server.  Therefore, public use of a modified version, on
a publicly accessible server, gives the public access to the source
code of the modified version.

  An older license, called the Affero General Public License and
published by Affero, was designed to accomplish similar goals.  This is
a different license, not a version of the Affero GPL, but Affero has
released a new version of the Affero GPL which permits relicensing under
this license.

  The precise terms and conditions for copying, distribution and
modification follow.

                       TERMS AND CONDITIONS

  0. Definitions.

  "This License" refers to version 3 of the GNU Affero General Public License.

  "Copyright" also means copyright-like laws that apply to other kinds of
works, such as semiconductor masks.

  "The Program" refers to any copyrightable work licensed under this
License.  Each licensee is addressed as "you".  "Licensees" and
"recipients" may be individuals or organizations.

  To "modify" a work means to copy from or adapt all or part of the work
in a fashion requiring copyright permission, other than the making of an
exact copy.  The resulting work is called a "modified version" of the
earlier work or a work "based on" the earlier work.

  A "covered work" means either the unmodified Program or a work based
on the Program.

  To "propagate" a work means to do anything with it that, without
permission, would make you directly or secondarily liable for
infringement under applicable copyright law, except executing it on a
computer or modifying a private copy.  Propagation includes copying,
distribution (with or without modification), making available to the
public, and in some countries other activities as well.

  To "convey" a work means any kind of propagation that enables other
parties to make or receive copies.  Mere interaction with a user through
a computer network, with no transfer of a copy, is not conveying.

  An interactive user interface displays "Appropriate Legal Notices"
to the extent that it includes a convenient and prominently visible
feature that (1) displays an appropriate copyright notice, and (2)
tells the user that there is no warranty for the work (except to the
extent that warranties are provided), that licensees may convey the
work under this License, and how to view a copy of this License.  If
the interface presents a list of user commands or options, such as a
menu, a prominent item in the list meets this criterion.

  1. Source Code.

  The "source code" for a work means the preferred form of the work
for making modifications to it.  "Object code" means any non-source
form of a work.

  A "Standard Interface" means an interface that either is an official
standard defined by a recognized standards body, or, in the case of
interfaces specified for a particular programming language, one that
is widely used among developers working in that language.

  The "System Libraries" of an executable work include anything, other
than the work as a whole, that (a) is included in the normal form of
packaging a Major Component, but which is not part of that Major
Component, and (b) serves only to enable use of the work with that
Major Component, or to implement a Standard Interface for which an
implementation is available to the public in source code form.  A
"Major Component", in this context, means a major essential component
(kernel, window system, and so on) of the specific operating system
(if any) on which the executable work runs, or a compiler used to
produce the work, or an object code interpreter used to run it.

  The "Corresponding Source" for a work in object code form means all
the source code needed to generate, install, and (for an executable
work) run the object code and to modify the work, including scripts to
control those activities.  However, it does not include the work's
System Libraries, or general-purpose tools or generally available free
programs which are used unmodified in performing those activities but
which are not part of the work.  For example, Corresponding Source
includes interface definition files associated with source files for
the work, and the source code for shared libraries and dynamically
linked subprograms that the work is specifically designed to require,
such as by intimate data communication or control flow between those
subprograms and other parts of the work.

  The Corresponding Source need not include anything that users
can regenerate automatically from other parts of the Corresponding
Source.

  The Corresponding Source for a work in source code form is that
same work.

  2. Basic Permissions.

  All rights granted under this License are granted for the term of
copyright on the Program, and are irrevocable provided the stated
conditions are met.  This License explicitly affirms your unlimited
permission to run the unmodified Program.  The output from running a
covered work is covered by this License only if the output, given its
content, constitutes a covered work.  This License acknowledges your
rights of fair use or other equivalent, as provided by copyright law.

  You may make, run and propagate covered works that you do not
convey, without conditions so long as your license otherwise remains
in force.  You may convey covered works to others for the sole purpose
of having them make modifications exclusively for you, or provide you
with facilities for running those works, provided that you comply with
the terms of this License in conveying all material for which you do
not control copyright.  Those thus making or running the covered works
for you must do so exclusively on your behalf, under your direction
and control, on terms that prohibit them from making any copies of
your copyrighted material outside their relationship with you.

  Conveying under any other circumstances is permitted solely under
the conditions stated below.  Sublicensing is not allowed; section 10
makes it unnecessary.

  3. Protecting Users' Legal Rights From Anti-Circumvention Law.

  No covered work shall be deemed part of an effective technological
measure under any applicable law fulfilling obligations under article
11 of the WIPO copyright treaty adopted on 20 December 1996, or
similar laws prohibiting or restricting circumvention of such
measures.

  When you convey a covered work, you waive any legal power to forbid
circumvention of technological measures to the extent such circumvention
is effected by exercising rights under this License with respect to
the covered work, and you disclaim any intention to limit operation or
modification of the work as a means of enforcing, against the work's
users, your or third parties' legal rights to forbid circumvention of
technological measures.

  4. Conveying Verbatim Copies.

  You may convey verbatim copies of the Program's source code as you
receive it, in any medium, provided that you conspicuously and
appropriately publish on each copy an appropriate copyright notice;
keep intact all notices stating that this License and any
non-permissive terms added in accord with section 7 apply to the code;
keep intact all notices of the absence of any warranty; and give all
recipients a copy of this License along with the Program.

  You may charge any price or no price for each copy that you convey,
and you may offer support or warranty protection for a fee.

  5. Conveying Modified Source Versions.

  You may convey a work based on the Program, or the modifications to
produce it from the Program, in the form of source code under the
terms of section 4, provided that you also meet all of these conditions:

    a) The work must carry prominent notices stating that you modified
    it, and giving a relevant date.

    b) The work must carry prominent notices stating that it is
    released under this License and any conditions added under section
    7.  This requirement modifies the requirement in section 4 to
    "keep intact all notices".

    c) You must license the entire work, as a whole, under this
    License to anyone who comes into possession of a copy.  This
    License will therefore apply, along with any applicable section 7
    additional terms, to the whole of the work, and all its parts,
    regardless of how they are packaged.  This License gives no
    permission to license the work in any other way, but it does not
    invalidate such permission if you have separately received it.

    d) If the work has interactive user interfaces, each must display
    Appropriate Legal Notices; however, if the Program has interactive
    interfaces that do not display Appropriate Legal Notices, your
    work need not make them do so.

  A compilation of a covered work with other separate and independent
works, which are not by their nature extensions of the covered work,
and which are not combined with it such as to form a larger program,
in or on a volume of a storage or distribution medium, is called an
"aggregate" if the compilation and its resulting copyright are not
used to limit the access or legal rights of the compilation's users
beyond what the individual works permit.  Inclusion of a covered work
in an aggregate does not cause this License to apply to the other
parts of the aggregate.

  6. Conveying Non-Source Forms.

  You may convey a covered work in object code form under the terms
of sections 4 and 5, provided that you also convey the
machine-readable Corresponding Source under the terms of this License,
in one of these ways:

    a) Convey the object code in, or embodied in, a physical product
    (including a physical distribution medium), accompanied by the
    Corresponding Source fixed on a durable physical medium
    customarily used for software interchange.

    b) Convey the object code in, or embodied in, a physical product
    (including a physical distribution medium), accompanied by a
    written offer, valid for at least three years and valid for as
    long as you offer spare parts or customer support for that product
    model, to give anyone who possesses the object code either (1) a
    copy of the Corresponding Source for all the software in the
    product that is covered by this License, on a durable physical
    medium customarily used for software interchange, for a price no
    more than your reasonable cost of physically performing this
    conveying of source, or (2) access to copy the
    Corresponding Source from a network server at no charge.

    c) Convey individual copies of the object code with a copy of the
    written offer to provide the Corresponding Source.  This
    alternative is allowed only occasionally and noncommercially, and
    only if you received the object code with such an offer, in accord
    with subsection 6b.

    d) Convey the object code by offering access from a designated
    place (gratis or for a charge), and offer equivalent access to the
    Corresponding Source in the same way through the same place at no
    further charge.  You need not require recipients to copy the
    Corresponding Source along with the object code.  If the place to
    copy the object code is a network server, the Corresponding Source
    may be on a different server (operated by you or a third party)
    that supports equivalent copying facilities, provided you maintain
    clear directions next to the object code saying where to find the
    Corresponding Source.  Regardless of what server hosts the
    Corresponding Source, you remain obligated to ensure that it is
    available for as long as needed to satisfy these requirements.

    e) Convey the object code using peer-to-peer transmission, provided
    you inform other peers where the object code and Corresponding
    Source of the work are being offered to the general public at no
    charge under subsection 6d.

  A separable portion of the object code, whose source code is excluded
from the Corresponding Source as a System Library, need not be
included in conveying the object code work.

  A "User Product" is either (1) a "consumer product", which means any
tangible personal property which is normally used for personal, family,
or household purposes, or (2) anything designed or sold for incorporation
into a dwelling.  In determining whether a product is a consumer product,
doubtful cases shall be resolved in favor of coverage.  For a particular
product received by a particular user, "normally used" refers to a
typical or common use of that class of product, regardless of the status
of the particular user or of the way in which the particular user
actually uses, or expects or is expected to use, the product.  A product
is a consumer product regardless of whether the product has substantial
commercial, industrial or non-consumer uses, unless such uses represent
the only significant mode of use of the product.

  "Installation Information" for a User Product means any methods,
procedures, authorization keys, or other information required to install
and execute modified versions of a covered work in that User Product from
a modified version of its Corresponding Source.  The information must
suffice to ensure that the continued functioning of the modified object
code is in no case prevented or interfered with solely because
modification has been made.

  If you convey an object code work under this section in, or with, or
specifically for use in, a User Product, and the conveying occurs as
part of a transaction in which the right of possession and use of the
User Product is transferred to the recipient in perpetuity or for a
fixed term (regardless of how the transaction is characterized), the
Corresponding Source conveyed under this section must be accompanied
by the Installation Information.  But this requirement does not apply
if neither you nor any third party retains the ability to install
modified object code on the User Product (for example, the work has
been installed in ROM).

  The requirement to provide Installation Information does not include a
requirement to continue to provide support service, warranty, or updates
for a work that has been modified or installed by the recipient, or for
the User Product in which it has been modified or installed.  Access to a
network may be denied when the modification itself materially and
adversely affects the operation of the network or violates the rules and
protocols for communication across the network.

  Corresponding Source conveyed, and Installation Information provided,
in accord with this section must be in a format that is publicly
documented (and with an implementation available to the public in
source code form), and must require no special password or key for
unpacking, reading or copying.

  7. Additional Terms.

  "Additional permissions" are terms that supplement the terms of this
License by making exceptions from one or more of its conditions.
Additional permissions that are applicable to the entire Program shall
be treated as though they were included in this License, to the extent
that they are valid under applicable law.  If additional permissions
apply only to part of the Program, that part may be used separately
under those permissions, but the entire Program remains governed by
this License without regard to the additional permissions.

  When you convey a copy of a covered work, you may at your option
remove any additional permissions from that copy, or from any part of
it.  (Additional permissions may be written to require their own
removal in certain cases when you modify the work.)  You may place
additional permissions on material, added by you to a covered work,
for which you have or can give appropriate copyright permission.

  Notwithstanding any other provision of this License, for material you
add to a covered work, you may (if authorized by the copyright holders of
that material) supplement the terms of this License with terms:

    a) Disclaiming warranty or limiting liability differently from the
    terms of sections 15 and 16 of this License; or

    b) Requiring preservation of specified reasonable legal notices or
    author attributions in that material or in the Appropriate Legal
    Notices displayed by works containing it; or

    c) Prohibiting misrepresentation of the origin of that material, or
    requiring that modified versions of such material be marked in
    reasonable ways as different from the original version; or

    d) Limiting the use for publicity purposes of names of licensors or
    authors of the material; or

    e) Declining to grant rights under trademark law for use of some
    trade names, trademarks, or service marks; or

    f) Requiring indemnification of licensors and authors of that
    material by anyone who conveys the material (or modified versions of
    it) with contractual assumptions of liability to the recipient, for
    any liability that these contractual assumptions directly impose on
    those licensors and authors.

  All other non-permissive additional terms are considered "further
restrictions" within the meaning of section 10.  If the Program as you
received it, or any part of it, contains a notice stating that it is
governed by this License along with a term that is a further
restriction, you may remove that term.  If a license document contains
a further restriction but permits relicensing or conveying under this
License, you may add to a covered work material governed by the terms
of that license document, provided that the further restriction does
not survive such relicensing or conveying.

  If you add terms to a covered work in accord with this section, you
must place, in the relevant source files, a statement of the
additional terms that apply to those files, or a notice indicating
where to find the applicable terms.

  Additional terms, permissive or non-permissive, may be stated in the
form of a separately written license, or stated as exceptions;
the above requirements apply either way.

  8. Termination.

  You may not propagate or modify a covered work except as expressly
provided under this License.  Any attempt otherwise to propagate or
modify it is void, and will automatically terminate your rights under
this License (including any patent licenses granted under the third
paragraph of section 11).

  However, if you cease all violation of this License, then your
license from a particular copyright holder is reinstated (a)
provisionally, unless and until the copyright holder explicitly and
finally terminates your license, and (b) permanently, if the copyright
holder fails to notify you of the violation by some reasonable means
prior to 60 days after the cessation.

  Moreover, your license from a particular copyright holder is
reinstated permanently if the copyright holder notifies you of the
violation by some reasonable means, this is the first time you have
received notice of violation of this License (for any work) from that
copyright holder, and you cure the violation prior to 30 days after
your receipt of the notice.

  Termination of your rights under this section does not terminate the
licenses of parties who have received copies or rights from you under
this License.  If your rights have been terminated and not permanently
reinstated, you do not qualify to receive new licenses for the same
material under section 10.

  9. Acceptance Not Required for Having Copies.

  You are not required to accept this License in order to receive or
run a copy of the Program.  Ancillary propagation of a covered work
occurring solely as a consequence of using peer-to-peer transmission
to receive a copy likewise does not require acceptance.  However,
nothing other than this License grants you permission to propagate or
modify any covered work.  These actions infringe copyright if you do
not accept this License.  Therefore, by modifying or propagating a
covered work, you indicate your acceptance of this License to do so.

  10. Automatic Licensing of Downstream Recipients.

  Each time you convey a covered work, the recipient automatically
receives a license from the original licensors, to run, modify and
propagate that work, subject to this License.  You are not responsible
for enforcing compliance by third parties with this License.

  An "entity transaction" is a transaction transferring control of an
organization, or substantially all assets of one, or subdividing an
organization, or merging organizations.  If propagation of a covered
work results from an entity transaction, each party to that
transaction who receives a copy of the work also receives whatever
licenses to the work the party's predecessor in interest had or could
give under the previous paragraph, plus a right to possession of the
Corresponding Source of the work from the predecessor in interest, if
the predecessor has it or can get it with reasonable efforts.

  You may not impose any further restrictions on the exercise of the
rights granted or affirmed under this License.  For example, you may
not impose a license fee, royalty, or other charge for exercise of
rights granted under this License, and you may not initiate litigation
(including a cross-claim or counterclaim in a lawsuit) alleging that
any patent claim is infringed by making, using, selling, offering for
sale, or importing the Program or any portion of it.

  11. Patents.

  A "contributor" is a copyright holder who authorizes use under this
License of the Program or a work on which the Program is based.  The
work thus licensed is called the contributor's "contributor version".

  A contributor's "essential patent claims" are all patent claims
owned or controlled by the contributor, whether already acquired or
hereafter acquired, that would be infringed by some manner, permitted
by this License, of making, using, or selling its contributor version,
but do not include claims that would be infringed only as a
consequence of further modification of the contributor version.  For
purposes of this definition, "control" includes the right to grant
patent sublicenses in a manner consistent with the requirements of
this License.

  Each contributor grants you a non-exclusive, worldwide, royalty-free
patent license under the contributor's essential patent claims, to
make, use, sell, offer for sale, import and otherwise run, modify and
propagate the contents of its contributor version.

  In the following three paragraphs, a "patent license" is any express
agreement or commitment, however denominated, not to enforce a patent
(such as an express permission to practice a patent or covenant not to
sue for patent infringement).  To "grant" such a patent license to a
party means to make such an agreement or commitment not to enforce a
patent against the party.

  If you convey a covered work, knowingly relying on a patent license,
and the Corresponding Source of the work is not available for anyone
to copy, free of charge and under the terms of this License, through a
publicly available network server or other readily accessible means,
then you must either (1) cause the Corresponding Source to be so
available, or (2) arrange to deprive yourself of the benefit of the
patent license for this particular work, or (3) arrange, in a manner
consistent with the requirements of this License, to extend the patent
license to downstream recipients.  "Knowingly relying" means you have
actual knowledge that, but for the patent license, your conveying the
covered work in a country, or your recipient's use of the covered work
in a country, would infringe one or more identifiable patents in that
country that you have reason to believe are valid.

  If, pursuant to or in connection with a single transaction or
arrangement, you convey, or propagate by procuring conveyance of, a
covered work, and grant a patent license to some of the parties
receiving the covered work authorizing them to use, propagate, modify
or convey a specific copy of the covered work, then the patent license
you grant is automatically extended to all recipients of the covered
work and works based on it.

  A patent license is "discriminatory" if it does not include within
the scope of its coverage, prohibits the exercise of, or is
conditioned on the non-exercise of one or more of the rights that are
specifically granted under this License.  You may not convey a covered
work if you are a party to an arrangement with a third party that is
in the business of distributing software, under which you make payment
to the third party based on the extent of your activity of conveying
the work, and under which the third party grants, to any of the
parties who would receive the covered work from you, a discriminatory
patent license (a) in connection with copies of the covered work
conveyed by you (or copies made from those copies), or (b) primarily
for and in connection with specific products or compilations that
contain the covered work, unless you entered into that arrangement,
or that patent license was granted, prior to 28 March 2007.

  Nothing in this License shall be construed as excluding or limiting
any implied license or other defenses to infringement that may
otherwise be available to you under applicable patent law.

  12. No Surrender of Others' Freedom.

  If conditions are imposed on you (whether by court order, agreement or
otherwise) that contradict the conditions of this License, they do not
excuse you from the conditions of this License.  If you cannot convey a
covered work so as to satisfy simultaneously your obligations under this
License and any other pertinent obligations, then as a consequence you may
not convey it at all.  For example, if you agree to terms that obligate you
to collect a royalty for further conveying from those to whom you convey
the Program, the only way you could satisfy both those terms and this
License would be to refrain entirely from conveying the Program.

  13. Remote Network Interaction; Use with the GNU General Public License.

  Notwithstanding any other provision of this License, if you modify the
Program, your modified version must prominently offer all users
interacting with it remotely through a computer network (if your version
supports such interaction) an opportunity to receive the Corresponding
Source of your version by providing access to the Corresponding Source
from a network server at no charge, through some standard or customary
means of facilitating copying of software.  This Corresponding Source
shall include the Corresponding Source for any work covered by version 3
of the GNU General Public License that is incorporated pursuant to the
following paragraph.

  Notwithstanding any other provision of this License, you have
permission to link or combine any covered work with a work licensed
under version 3 of the GNU General Public License into a single
combined work, and to convey the resulting work.  The terms of this
License will continue to apply to the part which is the covered work,
but the work with which it is combined will remain governed by version
3 of the GNU General Public License.

  14. Revised Versions of this License.

  The Free Software Foundation may publish revised and/or new versions of
the GNU Affero General Public License from time to time.  Such new versions
will be similar in spirit to the present version, but may differ in detail to
address new problems or concerns.

  Each version is given a distinguishing version number.  If the
Program specifies that a certain numbered version of the GNU Affero General
Public License "or any later version" applies to it, you have the
option of following the terms and conditions either of that numbered
version or of any later version published by the Free Software
Foundation.  If the Program does not specify a version number of the
GNU Affero General Public License, you may choose any version ever published
by the Free Software Foundation.

  If the Program specifies that a proxy can decide which future
versions of the GNU Affero General Public License can be used, that proxy's
public statement of acceptance of a version permanently authorizes you
to choose that version for the Program.

  Later license versions may give you additional or different
permissions.  However, no additional obligations are imposed on any
author or copyright holder as a result of your choosing to follow a
later version.

  15. Disclaimer of Warranty.

  THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY
APPLICABLE LAW.  EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT
HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY
OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,
THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
PURPOSE.  THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM
IS WITH YOU.  SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF
ALL NECESSARY SERVICING, REPAIR OR CORRECTION.

  16. Limitation of Liability.

  IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS
THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY
GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE
USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF
DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD
PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),
EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF
SUCH DAMAGES.

  17. Interpretation of Sections 15 and 16.

  If the disclaimer of warranty and limitation of liability provided
above cannot be given local legal effect according to their terms,
reviewing courts shall apply local law that most closely approximates
an absolute waiver of all civil liability in connection with the
Program, unless a warranty or assumption of liability accompanies a
copy of the Program in return for a fee.

                     END OF TERMS AND CONDITIONS

            How to Apply These Terms to Your New Programs

  If you develop a new program, and you want it to be of the greatest
possible use to the public, the best way to achieve this is to make it
free software which everyone can redistribute and change under these terms.

  To do so, attach the following notices to the program.  It is safest
to attach them to the start of each source file to most effectively
state the exclusion of warranty; and each file should have at least
the "copyright" line and a pointer to where the full notice is found.

    <one line to give the program's name and a brief idea of what it does.>
    Copyright (C) <year>  <name of author>

    This program is free software: you can redistribute it and/or modify
    it under the terms of the GNU Affero General Public License as published
    by the Free Software Foundation, either version 3 of the License, or
    (at your option) any later version.

    This program is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    GNU Affero General Public License for more details.

    You should have received a copy of the GNU Affero General Public License
    along with this program.  If not, see <https://www.gnu.org/licenses/>.

Also add information on how to contact you by electronic and paper mail.

  If your software can interact with users remotely through a computer
network, you should also make sure that it provides a way for users to
get its source.  For example, if your program is a web application, its
interface could display a "Source" link that leads users to an archive
of the code.  There are many ways you could offer source, and different
solutions will be better for different programs; see section 13 for the
specific requirements.

  You should also get your employer (if you work as a programmer) or school,
if any, to sign a "copyright disclaimer" for the program, if necessary.
For more information on this, and how to apply and follow the GNU AGPL, see
<https://www.gnu.org/licenses/>.

Files under unsloth/*, tests/*, scripts/* are Apache 2.0 licensed.
Files under studio/*, unsloth_cli/* which is optional to install are AGPLv3 licensed.

================================================
FILE: LICENSE
================================================
                                 Apache License
                           Version 2.0, January 2004
                        http://www.apache.org/licenses/

   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION

   1. Definitions.

      "License" shall mean the terms and conditions for use, reproduction,
      and distribution as defined by Sections 1 through 9 of this document.

      "Licensor" shall mean the copyright owner or entity authorized by
      the copyright owner that is granting the License.

      "Legal Entity" shall mean the union of the acting entity and all
      other entities that control, are controlled by, or are under common
      control with that entity. For the purposes of this definition,
      "control" means (i) the power, direct or indirect, to cause the
      direction or management of such entity, whether by contract or
      otherwise, or (ii) ownership of fifty percent (50%) or more of the
      outstanding shares, or (iii) beneficial ownership of such entity.

      "You" (or "Your") shall mean an individual or Legal Entity
      exercising permissions granted by this License.

      "Source" form shall mean the preferred form for making modifications,
      including but not limited to software source code, documentation
      source, and configuration files.

      "Object" form shall mean any form resulting from mechanical
      transformation or translation of a Source form, including but
      not limited to compiled object code, generated documentation,
      and conversions to other media types.

      "Work" shall mean the work of authorship, whether in Source or
      Object form, made available under the License, as indicated by a
      copyright notice that is included in or attached to the work
      (an example is provided in the Appendix below).

      "Derivative Works" shall mean any work, whether in Source or Object
      form, that is based on (or derived from) the Work and for which the
      editorial revisions, annotations, elaborations, or other modifications
      represent, as a whole, an original work of authorship. For the purposes
      of this License, Derivative Works shall not include works that remain
      separable from, or merely link (or bind by name) to the interfaces of,
      the Work and Derivative Works thereof.

      "Contribution" shall mean any work of authorship, including
      the original version of the Work and any modifications or additions
      to that Work or Derivative Works thereof, that is intentionally
      submitted to Licensor for inclusion in the Work by the copyright owner
      or by an individual or Legal Entity authorized to submit on behalf of
      the copyright owner. For the purposes of this definition, "submitted"
      means any form of electronic, verbal, or written communication sent
      to the Licensor or its representatives, including but not limited to
      communication on electronic mailing lists, source code control systems,
      and issue tracking systems that are managed by, or on behalf of, the
      Licensor for the purpose of discussing and improving the Work, but
      excluding communication that is conspicuously marked or otherwise
      designated in writing by the copyright owner as "Not a Contribution."

      "Contributor" shall mean Licensor and any individual or Legal Entity
      on behalf of whom a Contribution has been received by Licensor and
      subsequently incorporated within the Work.

   2. Grant of Copyright License. Subject to the terms and conditions of
      this License, each Contributor hereby grants to You a perpetual,
      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
      copyright license to reproduce, prepare Derivative Works of,
      publicly display, publicly perform, sublicense, and distribute the
      Work and such Derivative Works in Source or Object form.

   3. Grant of Patent License. Subject to the terms and conditions of
      this License, each Contributor hereby grants to You a perpetual,
      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
      (except as stated in this section) patent license to make, have made,
      use, offer to sell, sell, import, and otherwise transfer the Work,
      where such license applies only to those patent claims licensable
      by such Contributor that are necessarily infringed by their
      Contribution(s) alone or by combination of their Contribution(s)
      with the Work to which such Contribution(s) was submitted. If You
      institute patent litigation against any entity (including a
      cross-claim or counterclaim in a lawsuit) alleging that the Work
      or a Contribution incorporated within the Work constitutes direct
      or contributory patent infringement, then any patent licenses
      granted to You under this License for that Work shall terminate
      as of the date such litigation is filed.

   4. Redistribution. You may reproduce and distribute copies of the
      Work or Derivative Works thereof in any medium, with or without
      modifications, and in Source or Object form, provided that You
      meet the following conditions:

      (a) You must give any other recipients of the Work or
          Derivative Works a copy of this License; and

      (b) You must cause any modified files to carry prominent notices
          stating that You changed the files; and

      (c) You must retain, in the Source form of any Derivative Works
          that You distribute, all copyright, patent, trademark, and
          attribution notices from the Source form of the Work,
          excluding those notices that do not pertain to any part of
          the Derivative Works; and

      (d) If the Work includes a "NOTICE" text file as part of its
          distribution, then any Derivative Works that You distribute must
          include a readable copy of the attribution notices contained
          within such NOTICE file, excluding those notices that do not
          pertain to any part of the Derivative Works, in at least one
          of the following places: within a NOTICE text file distributed
          as part of the Derivative Works; within the Source form or
          documentation, if provided along with the Derivative Works; or,
          within a display generated by the Derivative Works, if and
          wherever such third-party notices normally appear. The contents
          of the NOTICE file are for informational purposes only and
          do not modify the License. You may add Your own attribution
          notices within Derivative Works that You distribute, alongside
          or as an addendum to the NOTICE text from the Work, provided
          that such additional attribution notices cannot be construed
          as modifying the License.

      You may add Your own copyright statement to Your modifications and
      may provide additional or different license terms and conditions
      for use, reproduction, or distribution of Your modifications, or
      for any such Derivative Works as a whole, provided Your use,
      reproduction, and distribution of the Work otherwise complies with
      the conditions stated in this License.

   5. Submission of Contributions. Unless You explicitly state otherwise,
      any Contribution intentionally submitted for inclusion in the Work
      by You to the Licensor shall be under the terms and conditions of
      this License, without any additional terms or conditions.
      Notwithstanding the above, nothing herein shall supersede or modify
      the terms of any separate license agreement you may have executed
      with Licensor regarding such Contributions.

   6. Trademarks. This License does not grant permission to use the trade
      names, trademarks, service marks, or product names of the Licensor,
      except as required for reasonable and customary use in describing the
      origin of the Work and reproducing the content of the NOTICE file.

   7. Disclaimer of Warranty. Unless required by applicable law or
      agreed to in writing, Licensor provides the Work (and each
      Contributor provides its Contributions) on an "AS IS" BASIS,
      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
      implied, including, without limitation, any warranties or conditions
      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
      PARTICULAR PURPOSE. You are solely responsible for determining the
      appropriateness of using or redistributing the Work and assume any
      risks associated with Your exercise of permissions under this License.

   8. Limitation of Liability. In no event and under no legal theory,
      whether in tort (including negligence), contract, or otherwise,
      unless required by applicable law (such as deliberate and grossly
      negligent acts) or agreed to in writing, shall any Contributor be
      liable to You for damages, including any direct, indirect, special,
      incidental, or consequential damages of any character arising as a
      result of this License or out of the use or inability to use the
      Work (including but not limited to damages for loss of goodwill,
      work stoppage, computer failure or malfunction, or any and all
      other commercial damages or losses), even if such Contributor
      has been advised of the possibility of such damages.

   9. Accepting Warranty or Additional Liability. While redistributing
      the Work or Derivative Works thereof, You may choose to offer,
      and charge a fee for, acceptance of support, warranty, indemnity,
      or other liability obligations and/or rights consistent with this
      License. However, in accepting such obligations, You may act only
      on Your own behalf and on Your sole responsibility, not on behalf
      of any other Contributor, and only if You agree to indemnify,
      defend, and hold each Contributor harmless for any liability
      incurred by, or claims asserted against, such Contributor by reason
      of your accepting any such warranty or additional liability.

   END OF TERMS AND CONDITIONS

   APPENDIX: How to apply the Apache License to your work.

      To apply the Apache License to your work, attach the following
      boilerplate notice, with the fields enclosed by brackets "[]"
      replaced with your own identifying information. (Don't include
      the brackets!)  The text should be enclosed in the appropriate
      comment syntax for the file format. We also recommend that a
      file or class name and description of purpose be included on the
      same "printed page" as the copyright notice for easier
      identification within third-party archives.

   Copyright [2024-] [Unsloth AI. Inc team, Daniel Han-Chen & Michael Han-Chen]
   Files under unsloth/*, tests/*, scripts/* are Apache 2.0 licensed.
   Files under studio/*, unsloth_cli/* which is optional to install are AGPLv3 licensed.

   Licensed under the Apache License, Version 2.0 (the "License");
   you may not use this file except in compliance with the License.
   You may obtain a copy of the License at

       http://www.apache.org/licenses/LICENSE-2.0

   Unless required by applicable law or agreed to in writing, software
   distributed under the License is distributed on an "AS IS" BASIS,
   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
   See the License for the specific language governing permissions and
   limitations under the License.


================================================
FILE: README.md
================================================
<h1 align="center" style="margin:0;">
  <a href="https://unsloth.ai/docs"><picture>
    <source media="(prefers-color-scheme: dark)" srcset="https://raw.githubusercontent.com/unslothai/unsloth/main/images/STUDIO%20WHITE%20LOGO.png">
    <source media="(prefers-color-scheme: light)" srcset="https://raw.githubusercontent.com/unslothai/unsloth/main/images/STUDIO%20BLACK%20LOGO.png">
    <img alt="Unsloth logo" src="https://raw.githubusercontent.com/unslothai/unsloth/main/images/STUDIO%20BLACK%20LOGO.png" height="60" style="max-width:100%;">
  </picture></a>
</h1>
<h3 align="center" style="margin: 0; margin-top: 0;">
Run and train AI models with a unified local interface.
</h3>

<p align="center">
  <a href="#-features">Features</a> •
  <a href="#-quickstart">Quickstart</a> •
  <a href="#-free-notebooks">Notebooks</a> •
  <a href="https://unsloth.ai/docs">Documentation</a> •
  <a href="https://discord.com/invite/unsloth">Discord</a>
</p>
 <a href="https://unsloth.ai/docs/new/studio">
<img alt="unsloth studio ui homepage" src="https://raw.githubusercontent.com/unslothai/unsloth/main/studio/frontend/public/studio%20github%20landscape%20colab%20display.png" style="max-width: 100%; margin-bottom: 0;"></a>

Unsloth Studio (Beta) lets you run and train text, [audio](https://unsloth.ai/docs/basics/text-to-speech-tts-fine-tuning), [embedding](https://unsloth.ai/docs/new/embedding-finetuning), [vision](https://unsloth.ai/docs/basics/vision-fine-tuning) models on Windows, Linux and macOS.

## ⭐ Features
Unsloth provides several key features for both inference and training:
### Inference
* **Search + download + run models** including GGUF, LoRA adapters, safetensors
* **Export models**: [Save or export](https://unsloth.ai/docs/new/studio/export) models to GGUF, 16-bit safetensors and other formats.
* **Tool calling**: Support for [self-healing tool calling](https://unsloth.ai/docs/new/studio/chat#auto-healing-tool-calling) and web search
* **[Code execution](https://unsloth.ai/docs/new/studio/chat#code-execution)**: lets LLMs test code in Claude artifacts and sandbox environments
* [Auto-tune inference parameters](https://unsloth.ai/docs/new/studio/chat#auto-parameter-tuning) and customize chat templates.
* Upload images, audio, PDFs, code, DOCX and more file types to chat with.
### Training
* Train **500+ models** up to **2x faster** with up to **70% less VRAM**, with no accuracy loss.
* Supports full fine-tuning, pretraining, 4-bit, 16-bit and, FP8 training.
* **Observability**: Monitor training live, track loss and GPU usage and customize graphs.
* **Data Recipes**: [Auto-create datasets](https://unsloth.ai/docs/new/studio/data-recipe) from **PDF, CSV, DOCX** etc. Edit data in a visual-node workflow.
* **Reinforcement Learning**: The most efficient [RL](https://unsloth.ai/docs/get-started/reinforcement-learning-rl-guide) library, using **80% less VRAM** for GRPO, [FP8](https://unsloth.ai/docs/get-started/reinforcement-learning-rl-guide/fp8-reinforcement-learning) etc.
* [Multi-GPU](https://unsloth.ai/docs/basics/multi-gpu-training-with-unsloth) training is supported, with major improvements coming soon.

## ⚡ Quickstart
Unsloth can be used in two ways: through **[Unsloth Studio](https://unsloth.ai/docs/new/studio/)**, the web UI, or through **Unsloth Core**, the code-based version. Each has different requirements.

### Unsloth Studio (web UI)
Unsloth Studio (Beta) works on **Windows, Linux, WSL** and **macOS**.

* **CPU:** Supported for Chat and Data Recipes currently
* **NVIDIA:** Training works on RTX 30/40/50, Blackwell, DGX Spark, Station and more
* **macOS:** Currently supports chat and Data Recipes. **MLX training** is coming very soon
* **AMD:** Chat works. Train with [Unsloth Core](#unsloth-core-code-based). Studio support is coming soon.
* **Coming soon:** Training support for Apple MLX, AMD, and Intel.
* **Multi-GPU:** Available now, with a major upgrade on the way

#### MacOS, Linux, WSL Setup:
```bash
curl -fsSL https://raw.githubusercontent.com/unslothai/unsloth/main/install.sh | sh
```
If you don't have `curl`, use `wget`. Then to launch after setup:
```bash
source unsloth_studio/bin/activate
unsloth studio -H 0.0.0.0 -p 8888
```

#### Windows PowerShell Setup:
```powershell
irm https://raw.githubusercontent.com/unslothai/unsloth/main/install.ps1 | iex
```
Then to launch after setup:
```powershell
& .\unsloth_studio\Scripts\unsloth.exe studio -H 0.0.0.0 -p 8888
```

#### MacOS, Linux, WSL developer installs:
```bash
curl -LsSf https://astral.sh/uv/install.sh | sh
uv venv unsloth_studio --python 3.13
source unsloth_studio/bin/activate
uv pip install unsloth --torch-backend=auto
unsloth studio setup
unsloth studio -H 0.0.0.0 -p 8888
```

#### Windows PowerShell developer installs:
```powershell
winget install -e --id Python.Python.3.13
winget install --id=astral-sh.uv  -e
uv venv unsloth_studio --python 3.13
.\unsloth_studio\Scripts\activate
uv pip install unsloth --torch-backend=auto
unsloth studio setup
unsloth studio -H 0.0.0.0 -p 8888
```

#### Docker
Use our [Docker image](https://hub.docker.com/r/unsloth/unsloth) ```unsloth/unsloth``` container. Run:
```bash
docker run -d -e JUPYTER_PASSWORD="mypassword" \
  -p 8888:8888 -p 8000:8000 -p 2222:22 \
  -v $(pwd)/work:/workspace/work \
  --gpus all \
  unsloth/unsloth
  ```

#### Nightly Install - MacOS, Linux, WSL:
```bash
curl -LsSf https://astral.sh/uv/install.sh | sh
git clone --filter=blob:none https://github.com/unslothai/unsloth.git unsloth_studio
cd unsloth_studio
uv venv --python 3.13
source .venv/bin/activate
uv pip install -e . --torch-backend=auto
unsloth studio setup
unsloth studio -H 0.0.0.0 -p 8888
```
Then to launch every time:
```bash
cd unsloth_studio
source .venv/bin/activate
unsloth studio -H 0.0.0.0 -p 8888
```

#### Nightly Install - Windows:
Run in Windows Powershell:
```bash
winget install -e --id Python.Python.3.13
winget install --id=astral-sh.uv  -e
git clone --filter=blob:none https://github.com/unslothai/unsloth.git unsloth_studio
cd unsloth_studio
uv venv --python 3.13
.\.venv\Scripts\activate
uv pip install -e . --torch-backend=auto
unsloth studio setup
unsloth studio -H 0.0.0.0 -p 8888
```
Then to launch every time:
```bash
cd unsloth_studio
.\.venv\Scripts\activate
unsloth studio -H 0.0.0.0 -p 8888
```

### Unsloth Core (code-based)
#### Linux, WSL
```bash
curl -LsSf https://astral.sh/uv/install.sh | sh
uv venv unsloth_env --python 3.13
source unsloth_env/bin/activate
uv pip install unsloth --torch-backend=auto
```
#### Windows Powershell
```bash
winget install -e --id Python.Python.3.13
winget install --id=astral-sh.uv  -e
uv venv unsloth_env --python 3.13
.\unsloth_env\Scripts\activate
uv pip install unsloth --torch-backend=auto
```
For Windows, `pip install unsloth` works only if you have Pytorch installed. Read our [Windows Guide](https://unsloth.ai/docs/get-started/install/windows-installation).
You can use the same Docker image as Unsloth Studio.

#### AMD, Intel
For RTX 50x, B200, 6000 GPUs: `uv pip install unsloth --torch-backend=auto`. Read our guides for: [Blackwell](https://unsloth.ai/docs/blog/fine-tuning-llms-with-blackwell-rtx-50-series-and-unsloth) and [DGX Spark](https://unsloth.ai/docs/blog/fine-tuning-llms-with-nvidia-dgx-spark-and-unsloth). <br>
To install Unsloth on **AMD** and **Intel** GPUs, follow our [AMD Guide](https://unsloth.ai/docs/get-started/install/amd) and [Intel Guide](https://unsloth.ai/docs/get-started/install/intel).

## ✨ Free Notebooks

Train for free with our notebooks. Read our [guide](https://unsloth.ai/docs/get-started/fine-tuning-llms-guide). Add dataset, run, then deploy your trained model.

| Model | Free Notebooks | Performance | Memory use |
|-----------|---------|--------|----------|
| **Qwen3.5 (4B)**      | [▶️ Start for free](https://colab.research.google.com/github/unslothai/notebooks/blob/main/nb/Qwen3_5_(4B)_Vision.ipynb)               | 1.5x faster | 60% less |
| **gpt-oss (20B)**      | [▶️ Start for free](https://colab.research.google.com/github/unslothai/notebooks/blob/main/nb/gpt-oss-(20B)-Fine-tuning.ipynb)               | 2x faster | 70% less |
| **gpt-oss (20B): GRPO**      | [▶️ Start for free](https://colab.research.google.com/github/unslothai/notebooks/blob/main/nb/gpt-oss-(20B)-GRPO.ipynb)               | 2x faster | 80% less |
| **Qwen3: Advanced GRPO**      | [▶️ Start for free](https://colab.research.google.com/github/unslothai/notebooks/blob/main/nb/Qwen3_(4B)-GRPO.ipynb)               | 2x faster | 50% less |
| **Gemma 3 (4B) Vision** | [▶️ Start for free](https://colab.research.google.com/github/unslothai/notebooks/blob/main/nb/Gemma3_(4B)-Vision.ipynb)               | 1.7x faster | 60% less |
| **embeddinggemma (300M)**    | [▶️ Start for free](https://colab.research.google.com/github/unslothai/notebooks/blob/main/nb/EmbeddingGemma_(300M).ipynb)               | 2x faster | 20% less |
| **Mistral Ministral 3 (3B)**      | [▶️ Start for free](https://colab.research.google.com/github/unslothai/notebooks/blob/main/nb/Ministral_3_VL_(3B)_Vision.ipynb)               | 1.5x faster | 60% less |
| **Llama 3.1 (8B) Alpaca**      | [▶️ Start for free](https://colab.research.google.com/github/unslothai/notebooks/blob/main/nb/Llama3.1_(8B)-Alpaca.ipynb)               | 2x faster | 70% less |
| **Llama 3.2 Conversational**      | [▶️ Start for free](https://colab.research.google.com/github/unslothai/notebooks/blob/main/nb/Llama3.2_(1B_and_3B)-Conversational.ipynb)               | 2x faster | 70% less |
| **Orpheus-TTS (3B)**     | [▶️ Start for free](https://colab.research.google.com/github/unslothai/notebooks/blob/main/nb/Orpheus_(3B)-TTS.ipynb)               | 1.5x faster | 50% less |

- See all our notebooks for: [Kaggle](https://github.com/unslothai/notebooks?tab=readme-ov-file#-kaggle-notebooks), [GRPO](https://unsloth.ai/docs/get-started/unsloth-notebooks#grpo-reasoning-rl-notebooks), [TTS](https://unsloth.ai/docs/get-started/unsloth-notebooks#text-to-speech-tts-notebooks), [embedding](https://unsloth.ai/docs/new/embedding-finetuning) & [Vision](https://unsloth.ai/docs/get-started/unsloth-notebooks#vision-multimodal-notebooks)
- See [all our models](https://unsloth.ai/docs/get-started/unsloth-model-catalog) and [all our notebooks](https://unsloth.ai/docs/get-started/unsloth-notebooks)
- See detailed documentation for Unsloth [here](https://unsloth.ai/docs)

## 🦥 Unsloth News
- **Introducing Unsloth Studio**: our new web UI for running and training LLMs. [Blog](https://unsloth.ai/docs/new/studio)
- **Qwen3.5** - 0.8B, 2B, 4B, 9B, 27B, 35-A3B, 112B-A10B are now supported. [Guide + notebooks](https://unsloth.ai/docs/models/qwen3.5/fine-tune)
- Train **MoE LLMs 12x faster** with 35% less VRAM - DeepSeek, GLM, Qwen and gpt-oss. [Blog](https://unsloth.ai/docs/new/faster-moe)
- **Embedding models**: Unsloth now supports ~1.8-3.3x faster embedding fine-tuning. [Blog](https://unsloth.ai/docs/new/embedding-finetuning) • [Notebooks](https://unsloth.ai/docs/get-started/unsloth-notebooks#embedding-models)
- New **7x longer context RL** vs. all other setups, via our new batching algorithms. [Blog](https://unsloth.ai/docs/new/grpo-long-context)
- New RoPE & MLP **Triton Kernels** & **Padding Free + Packing**: 3x faster training & 30% less VRAM. [Blog](https://unsloth.ai/docs/new/3x-faster-training-packing)
- **500K Context**: Training a 20B model with >500K context is now possible on an 80GB GPU. [Blog](https://unsloth.ai/docs/blog/500k-context-length-fine-tuning)
- **FP8 & Vision RL**: You can now do FP8 & VLM GRPO on consumer GPUs. [FP8 Blog](https://unsloth.ai/docs/get-started/reinforcement-learning-rl-guide/fp8-reinforcement-learning) • [Vision RL](https://unsloth.ai/docs/get-started/reinforcement-learning-rl-guide/vision-reinforcement-learning-vlm-rl)
- **gpt-oss** by OpenAI: Read our [RL blog](https://unsloth.ai/docs/models/gpt-oss-how-to-run-and-fine-tune/gpt-oss-reinforcement-learning), [Flex Attention](https://unsloth.ai/docs/models/gpt-oss-how-to-run-and-fine-tune/long-context-gpt-oss-training) blog and [Guide](https://unsloth.ai/docs/models/gpt-oss-how-to-run-and-fine-tune).

## 🔗 Links and Resources
| Type                                                                                                                                      | Links                                                                          |
| ----------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------ |
| <img width="15" src="https://redditinc.com/hs-fs/hubfs/Reddit%20Inc/Brand/Reddit_Logo.png" />  **r/unsloth Reddit**                       | [Join Reddit community](https://reddit.com/r/unsloth)                          |
| 📚 **Documentation & Wiki**                                                                                                               | [Read Our Docs](https://unsloth.ai/docs)                                       |
| <img width="13" src="https://upload.wikimedia.org/wikipedia/commons/0/09/X_(formerly_Twitter)_logo_late_2025.svg" />  **Twitter (aka X)** | [Follow us on X](https://twitter.com/unslothai)                                |
| 💾 **Installation**                                                                                                                       | [Pip & Docker Install](https://unsloth.ai/docs/get-started/install) |
| 🔮 **Our Models**                                                                                                                         | [Unsloth Catalog](https://unsloth.ai/docs/get-started/unsloth-model-catalog)   |
| ✍️ **Blog**                                                                                                                               | [Read our Blogs](https://unsloth.ai/blog)                                      |

### Citation

You can cite the Unsloth repo as follows:
```bibtex
@software{unsloth,
  author = {Daniel Han, Michael Han and Unsloth team},
  title = {Unsloth},
  url = {https://github.com/unslothai/unsloth},
  year = {2023}
}
```
If you trained a model with 🦥Unsloth, you can use this cool sticker!   <img src="https://raw.githubusercontent.com/unslothai/unsloth/main/images/made with unsloth.png" width="200" align="center" />

### License
Unsloth uses a dual-licensing model of Apache 2.0 and AGPL-3.0. The core Unsloth package remains licensed under **[Apache 2.0](https://github.com/unslothai/unsloth?tab=Apache-2.0-1-ov-file)**, while certain optional components, such as the Unsloth Studio UI are licensed under the open-source license **[AGPL-3.0](https://github.com/unslothai/unsloth?tab=AGPL-3.0-2-ov-file)**.

This structure helps support ongoing Unsloth development while keeping the project open source and enabling the broader ecosystem to continue growing.

### Thank You to
- The [llama.cpp library](https://github.com/ggml-org/llama.cpp) that lets users run and save models with Unsloth
- The Hugging Face team and their libraries: [transformers](https://github.com/huggingface/transformers) and [TRL](https://github.com/huggingface/trl)
- The Pytorch and [Torch AO](https://github.com/unslothai/unsloth/pull/3391) team for their contributions
- And of course for every single person who has contributed or has used Unsloth!


================================================
FILE: build.sh
================================================
#!/usr/bin/env bash

set -euo pipefail

# 1. Build frontend (Vite outputs to dist/)
cd studio/frontend

# Clean stale dist to force a full rebuild
rm -rf dist

# Tailwind v4's oxide scanner respects .gitignore in parent directories.
# Python venvs create a .gitignore with "*" (ignore everything), which
# prevents Tailwind from scanning .tsx source files for class names.
# Temporarily hide any such .gitignore during the build, then restore it.
_HIDDEN_GITIGNORES=()
_dir="$(pwd)"
while [ "$_dir" != "/" ]; do
    _dir="$(dirname "$_dir")"
    if [ -f "$_dir/.gitignore" ] && grep -qx '\*' "$_dir/.gitignore" 2>/dev/null; then
        mv "$_dir/.gitignore" "$_dir/.gitignore._twbuild"
        _HIDDEN_GITIGNORES+=("$_dir/.gitignore")
    fi
done

_restore_gitignores() {
    for _gi in "${_HIDDEN_GITIGNORES[@]+"${_HIDDEN_GITIGNORES[@]}"}"; do
        mv "${_gi}._twbuild" "$_gi" 2>/dev/null || true
    done
}
trap _restore_gitignores EXIT

npm install
npm run build       # outputs to studio/frontend/dist/

_restore_gitignores
trap - EXIT

# Validate CSS output -- catch truncated Tailwind builds before packaging
MAX_CSS_SIZE=$(find dist/assets -name '*.css' -exec wc -c {} + 2>/dev/null | sort -n | tail -1 | awk '{print $1}')
if [ -z "$MAX_CSS_SIZE" ]; then
    echo "❌ ERROR: No CSS files were emitted into dist/assets."
    echo "   The frontend build may have failed silently."
    exit 1
fi
if [ "$MAX_CSS_SIZE" -lt 100000 ]; then
    echo "❌ ERROR: Largest CSS file is only $((MAX_CSS_SIZE / 1024))KB (expected >100KB)."
    echo "   Tailwind may not have scanned all source files."
    echo "   Check for .gitignore files blocking the Tailwind oxide scanner."
    exit 1
fi
echo "✅ Frontend CSS validated (${MAX_CSS_SIZE} bytes)"

cd ../..

# 2. Clean old artifacts
rm -rf build dist *.egg-info

# 3. Build wheel
python -m build

# 4. Optionally publish
if [ "${1:-}" = "publish" ]; then
    python -m twine upload dist/*
fi


================================================
FILE: cli.py
================================================
# SPDX-License-Identifier: AGPL-3.0-only
# Copyright 2026-present the Unsloth AI Inc. team. All rights reserved. See /studio/LICENSE.AGPL-3.0

from unsloth_cli import app

if __name__ == "__main__":
    app()


================================================
FILE: install.ps1
================================================
# Unsloth Studio Installer for Windows PowerShell
# Usage:  irm https://raw.githubusercontent.com/unslothai/unsloth/main/install.ps1 | iex
# Local:  Set-ExecutionPolicy -Scope Process -ExecutionPolicy Bypass; .\install.ps1

function Install-UnslothStudio {
    $ErrorActionPreference = "Stop"

    $VenvName = "unsloth_studio"
    $PythonVersion = "3.13"

    Write-Host ""
    Write-Host "========================================="
    Write-Host "   Unsloth Studio Installer (Windows)"
    Write-Host "========================================="
    Write-Host ""

    # ── Helper: refresh PATH from registry (preserving current session entries) ──
    function Refresh-SessionPath {
        $machine = [System.Environment]::GetEnvironmentVariable("Path", "Machine")
        $user    = [System.Environment]::GetEnvironmentVariable("Path", "User")
        $env:Path = "$machine;$user;$env:Path"
    }

    # ── Check winget ──
    if (-not (Get-Command winget -ErrorAction SilentlyContinue)) {
        Write-Host "Error: winget is not available." -ForegroundColor Red
        Write-Host "       Install it from https://aka.ms/getwinget" -ForegroundColor Yellow
        Write-Host "       or install Python $PythonVersion and uv manually, then re-run." -ForegroundColor Yellow
        return
    }

    # ── Install Python if no compatible version (3.11-3.13) found ──
    $DetectedPythonVersion = ""
    if (Get-Command python -ErrorAction SilentlyContinue) {
        $pyVer = python --version 2>&1
        if ($pyVer -match "Python (3\.1[1-3])\.\d+") {
            Write-Host "==> Python already installed: $pyVer"
            $DetectedPythonVersion = $Matches[1]
        }
    }
    if (-not $DetectedPythonVersion) {
        Write-Host "==> Installing Python ${PythonVersion}..."
        winget install -e --id Python.Python.3.13 --accept-package-agreements --accept-source-agreements
        Refresh-SessionPath
        if ($LASTEXITCODE -ne 0) {
            # winget returns non-zero for "already installed" -- only fail if python is truly missing
            if (-not (Get-Command python -ErrorAction SilentlyContinue)) {
                Write-Host "[ERROR] Python installation failed (exit code $LASTEXITCODE)" -ForegroundColor Red
                return
            }
        }
        $DetectedPythonVersion = $PythonVersion
    }

    # ── Install uv if not present ──
    if (-not (Get-Command uv -ErrorAction SilentlyContinue)) {
        Write-Host "==> Installing uv package manager..."
        winget install --id=astral-sh.uv -e --accept-package-agreements --accept-source-agreements
        Refresh-SessionPath
        # Fallback: if winget didn't put uv on PATH, try the PowerShell installer
        if (-not (Get-Command uv -ErrorAction SilentlyContinue)) {
            Write-Host "    Trying alternative uv installer..."
            powershell -ExecutionPolicy ByPass -c "irm https://astral.sh/uv/install.ps1 | iex"
            Refresh-SessionPath
        }
    }

    if (-not (Get-Command uv -ErrorAction SilentlyContinue)) {
        Write-Host "Error: uv could not be installed." -ForegroundColor Red
        Write-Host "       Install it from https://docs.astral.sh/uv/" -ForegroundColor Yellow
        return
    }

    # ── Create venv (skip if it already exists and has a valid interpreter) ──
    $VenvPython = Join-Path $VenvName "Scripts\python.exe"
    if (-not (Test-Path $VenvPython)) {
        if (Test-Path $VenvName) { Remove-Item -Recurse -Force $VenvName }
        Write-Host "==> Creating Python ${DetectedPythonVersion} virtual environment (${VenvName})..."
        uv venv $VenvName --python $DetectedPythonVersion
        if ($LASTEXITCODE -ne 0) {
            Write-Host "[ERROR] Failed to create virtual environment (exit code $LASTEXITCODE)" -ForegroundColor Red
            return
        }
    } else {
        Write-Host "==> Virtual environment ${VenvName} already exists, skipping creation."
    }

    # ── Install unsloth directly into the venv (no activation needed) ──
    Write-Host "==> Installing unsloth (this may take a few minutes)..."
    uv pip install --python $VenvPython unsloth --torch-backend=auto
    if ($LASTEXITCODE -ne 0) {
        Write-Host "[ERROR] Failed to install unsloth (exit code $LASTEXITCODE)" -ForegroundColor Red
        return
    }

    # ── Run studio setup ──
    # setup.ps1 will handle installing Git, CMake, Visual Studio Build Tools,
    # CUDA Toolkit, Node.js, and other dependencies automatically via winget.
    Write-Host "==> Running unsloth studio setup..."
    $UnslothExe = Join-Path $VenvName "Scripts\unsloth.exe"
    & $UnslothExe studio setup
    if ($LASTEXITCODE -ne 0) {
        Write-Host "[ERROR] unsloth studio setup failed (exit code $LASTEXITCODE)" -ForegroundColor Red
        return
    }

    Write-Host ""
    Write-Host "========================================="
    Write-Host "   Unsloth Studio installed!"
    Write-Host "========================================="
    Write-Host ""
    Write-Host "  To launch, run:"
    Write-Host ""
    Write-Host "    .\${VenvName}\Scripts\activate"
    Write-Host "    unsloth studio -H 0.0.0.0 -p 8888"
    Write-Host ""
}

Install-UnslothStudio


================================================
FILE: install.sh
================================================
#!/bin/sh
# Unsloth Studio Installer
# Usage (curl): curl -fsSL https://raw.githubusercontent.com/unslothai/unsloth/main/install.sh | sh
# Usage (wget): wget -qO- https://raw.githubusercontent.com/unslothai/unsloth/main/install.sh | sh
set -e

VENV_NAME="unsloth_studio"
PYTHON_VERSION="3.13"

# ── Helper: download a URL to a file (supports curl and wget) ──
download() {
    if command -v curl >/dev/null 2>&1; then
        curl -LsSf "$1" -o "$2"
    elif command -v wget >/dev/null 2>&1; then
        wget -qO "$2" "$1"
    else
        echo "Error: neither curl nor wget found. Install one and re-run."
        exit 1
    fi
}

# ── Helper: check if a single package is available on the system ──
_is_pkg_installed() {
    case "$1" in
        build-essential) command -v gcc >/dev/null 2>&1 ;;
        libcurl4-openssl-dev)
            command -v dpkg >/dev/null 2>&1 && dpkg -s "$1" >/dev/null 2>&1 ;;
        pciutils)
            command -v lspci >/dev/null 2>&1 ;;
        *) command -v "$1" >/dev/null 2>&1 ;;
    esac
}

# ── Helper: install packages via apt, escalating to sudo only if needed ──
# Usage: _smart_apt_install pkg1 pkg2 pkg3 ...
_smart_apt_install() {
    _PKGS="$*"

    # Step 1: Try installing without sudo (works when already root)
    apt-get update -y </dev/null >/dev/null 2>&1 || true
    apt-get install -y $_PKGS </dev/null >/dev/null 2>&1 || true

    # Step 2: Check which packages are still missing
    _STILL_MISSING=""
    for _pkg in $_PKGS; do
        if ! _is_pkg_installed "$_pkg"; then
            _STILL_MISSING="$_STILL_MISSING $_pkg"
        fi
    done
    _STILL_MISSING=$(echo "$_STILL_MISSING" | sed 's/^ *//')

    if [ -z "$_STILL_MISSING" ]; then
        return 0
    fi

    # Step 3: Escalate -- need elevated permissions for remaining packages
    if command -v sudo >/dev/null 2>&1; then
        echo ""
        echo "    !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"
        echo "    WARNING: We require sudo elevated permissions to install:"
        echo "    $_STILL_MISSING"
        echo "    If you accept, we'll run sudo now, and it'll prompt your password."
        echo "    !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"
        echo ""
        printf "    Accept? [Y/n] "
        if [ -r /dev/tty ]; then
            read -r REPLY </dev/tty || REPLY="y"
        else
            REPLY="y"
        fi
        case "$REPLY" in
            [nN]*)
                echo ""
                echo "    Please install these packages first, then re-run Unsloth Studio setup:"
                echo "    sudo apt-get update -y && sudo apt-get install -y $_STILL_MISSING"
                exit 1
                ;;
            *)
                sudo apt-get update -y </dev/null
                sudo apt-get install -y $_STILL_MISSING </dev/null
                ;;
        esac
    else
        echo ""
        echo "    sudo is not available on this system."
        echo "    Please install these packages as root, then re-run Unsloth Studio setup:"
        echo "    apt-get update -y && apt-get install -y $_STILL_MISSING"
        exit 1
    fi
}

echo ""
echo "========================================="
echo "   Unsloth Studio Installer"
echo "========================================="
echo ""

# ── Detect platform ──
OS="linux"
if [ "$(uname)" = "Darwin" ]; then
    OS="macos"
elif grep -qi microsoft /proc/version 2>/dev/null; then
    OS="wsl"
fi
echo "==> Platform: $OS"

# ── Check system dependencies ──
# cmake and git are needed by unsloth studio setup to build the GGUF inference
# engine (llama.cpp). build-essential and libcurl-dev are also needed on Linux.
MISSING=""

command -v cmake >/dev/null 2>&1 || MISSING="$MISSING cmake"
command -v git   >/dev/null 2>&1 || MISSING="$MISSING git"

case "$OS" in
    macos)
        # Xcode Command Line Tools provide the C/C++ compiler
        if ! xcode-select -p >/dev/null 2>&1; then
            echo ""
            echo "==> Xcode Command Line Tools are required."
            echo "    Installing (a system dialog will appear)..."
            xcode-select --install </dev/null 2>/dev/null || true
            echo "    After the installation completes, please re-run this script."
            exit 1
        fi
        ;;
    linux|wsl)
        # curl or wget is needed for downloads; check both
        if ! command -v curl >/dev/null 2>&1 && ! command -v wget >/dev/null 2>&1; then
            MISSING="$MISSING curl"
        fi
        command -v gcc  >/dev/null 2>&1 || MISSING="$MISSING build-essential"
        # libcurl dev headers for llama.cpp HTTPS support
        if command -v dpkg >/dev/null 2>&1; then
            dpkg -s libcurl4-openssl-dev >/dev/null 2>&1 || MISSING="$MISSING libcurl4-openssl-dev"
        fi
        ;;
esac

MISSING=$(echo "$MISSING" | sed 's/^ *//')

if [ -n "$MISSING" ]; then
    echo ""
    echo "==> Unsloth Studio needs these packages: $MISSING"
    echo "    These are needed to build the GGUF inference engine."

    case "$OS" in
        macos)
            if ! command -v brew >/dev/null 2>&1; then
                echo ""
                echo "    Homebrew is required to install them."
                echo "    Install Homebrew from https://brew.sh then re-run this script."
                exit 1
            fi
            brew install $MISSING </dev/null
            ;;
        linux|wsl)
            if command -v apt-get >/dev/null 2>&1; then
                _smart_apt_install $MISSING
            else
                echo "    apt-get is not available. Please install with your package manager:"
                echo "    $MISSING"
                echo "    Then re-run Unsloth Studio setup."
                exit 1
            fi
            ;;
    esac
    echo ""
else
    echo "==> All system dependencies found."
fi

# ── Install uv ──
if ! command -v uv >/dev/null 2>&1; then
    echo "==> Installing uv package manager..."
    _uv_tmp=$(mktemp)
    download "https://astral.sh/uv/install.sh" "$_uv_tmp"
    sh "$_uv_tmp" </dev/null
    rm -f "$_uv_tmp"
    if [ -f "$HOME/.local/bin/env" ]; then
        . "$HOME/.local/bin/env"
    fi
    export PATH="$HOME/.local/bin:$PATH"
fi

# ── Create venv (skip if it already exists and has a valid interpreter) ──
if [ ! -x "$VENV_NAME/bin/python" ]; then
    [ -e "$VENV_NAME" ] && rm -rf "$VENV_NAME"
    echo "==> Creating Python ${PYTHON_VERSION} virtual environment (${VENV_NAME})..."
    uv venv "$VENV_NAME" --python "$PYTHON_VERSION"
else
    echo "==> Virtual environment ${VENV_NAME} already exists, skipping creation."
fi

# ── Install unsloth directly into the venv (no activation needed) ──
echo "==> Installing unsloth (this may take a few minutes)..."
uv pip install --python "$VENV_NAME/bin/python" unsloth --torch-backend=auto

# ── Run studio setup ──
# Ensure the venv's Python is on PATH for setup.sh's Python discovery.
# On macOS the system Python may be outside the 3.11-3.13 range that
# setup.sh requires, but uv already installed a compatible interpreter
# inside the venv.
VENV_ABS_BIN="$(cd "$VENV_NAME/bin" && pwd)"
if [ -n "$VENV_ABS_BIN" ]; then
    export PATH="$VENV_ABS_BIN:$PATH"
fi

echo "==> Running unsloth studio setup..."
"$VENV_NAME/bin/unsloth" studio setup </dev/null

echo ""
echo "========================================="
echo "   Unsloth Studio installed!"
echo "========================================="
echo ""
echo "  To launch, run:"
echo ""
echo "    source ${VENV_NAME}/bin/activate"
echo "    unsloth studio -H 0.0.0.0 -p 8888"
echo ""


================================================
FILE: pyproject.toml
================================================
[build-system]
requires = ["setuptools==80.9.0", "setuptools-scm==9.2.0"]
build-backend = "setuptools.build_meta"

[project]
name = "unsloth"
dynamic = ["version"]
description = "2-5X faster training, reinforcement learning & finetuning"
readme = "README.md"
requires-python = ">=3.9,<3.15"
license = "Apache-2.0"
keywords = ["ai", "llm", "reinforcement learning", "machine learning", "artificial intelligence", "pytorch"]
authors = [
    {email = "info@unsloth.ai"},
    {name = "Unsloth AI team"},
]
maintainers = [
    {name = "Daniel Han", email = "daniel@unsloth.ai"},
    {name = "Michael Han", email = "info@unsloth.ai"},
]
classifiers = [
    "Programming Language :: Python",
    "Environment :: GPU",
    "Environment :: GPU :: NVIDIA CUDA",
    "Topic :: Scientific/Engineering :: Artificial Intelligence",
]
dependencies = [
    "typer",
    "pydantic",
    "pyyaml",
    "nest-asyncio",
]

[project.scripts]
unsloth = "unsloth_cli:app"

[tool.setuptools.dynamic]
version = {attr = "unsloth.models._utils.__version__"}

[tool.setuptools]
include-package-data = true

[tool.setuptools.package-data]
studio = [
    "*.sh",
    "*.ps1",
    "*.bat",
    "frontend/dist/**/*",
    "frontend/public/**/*",
    "frontend/src/**/*",
    "frontend/*.json",
    "frontend/*.ts",
    "frontend/*.js",
    "frontend/*.lock",
    "frontend/*.html",
    "frontend/*.yaml",
    "frontend/.git*",
    "backend/requirements/**/*",
    "backend/core/data_recipe/oxc-validator/*.json",
    "backend/core/data_recipe/oxc-validator/*.mjs",
]

[tool.setuptools.packages.find]
exclude = ["images*", "tests*", "kernels/moe*"]

[project.optional-dependencies]
triton = [
    "triton>=3.0.0 ; ('linux' in sys_platform)",
    "triton-windows ; (sys_platform == 'win32') and (platform_machine == 'AMD64' or platform_machine == 'x86_64')",
]

huggingfacenotorch = [
    "wheel>=0.42.0",
    "packaging",
    "numpy",
    "tqdm",
    "psutil",
    "tyro",
    "protobuf",
    "sentencepiece>=0.2.0",
    "datasets>=3.4.1,!=4.0.*,!=4.1.0,<4.4.0",
    "accelerate>=0.34.1",
    "peft>=0.18.0,!=0.11.0",
    "huggingface_hub>=0.34.0",
    "hf_transfer",
    "diffusers",
    "transformers>=4.51.3,!=4.52.0,!=4.52.1,!=4.52.2,!=4.52.3,!=4.53.0,!=4.54.0,!=4.55.0,!=4.55.1,!=4.57.0,!=4.57.4,!=4.57.5,!=5.0.0,!=5.1.0,<=5.3.0",
    "trl>=0.18.2,!=0.19.0,<=0.24.0",
    "sentence-transformers",
]
huggingface = [
    "unsloth[huggingfacenotorch]",
    "unsloth_zoo>=2026.3.4",
    "torchvision",
    "unsloth[triton]",
]
windows = [
    "unsloth[huggingface]",
    "bitsandbytes>=0.45.5,!=0.46.0,!=0.48.0 ; (sys_platform == 'win32')",
    "xformers>=0.0.22.post7 ; (sys_platform == 'win32')",
]
base = [
    "unsloth[huggingface]",
]
cu118only = [
    "xformers @ https://download.pytorch.org/whl/cu118/xformers-0.0.22.post7%2Bcu118-cp39-cp39-manylinux2014_x86_64.whl ; python_version=='3.9' and ('linux' in sys_platform)",
    "xformers @ https://download.pytorch.org/whl/cu118/xformers-0.0.22.post7%2Bcu118-cp310-cp310-manylinux2014_x86_64.whl ; python_version=='3.10' and ('linux' in sys_platform)",
    "xformers @ https://download.pytorch.org/whl/cu118/xformers-0.0.22.post7%2Bcu118-cp311-cp311-manylinux2014_x86_64.whl ; python_version=='3.11' and ('linux' in sys_platform)",
]
cu121only = [
    "xformers @ https://download.pytorch.org/whl/cu121/xformers-0.0.22.post7-cp39-cp39-manylinux2014_x86_64.whl ; python_version=='3.9' and ('linux' in sys_platform)",
    "xformers @ https://download.pytorch.org/whl/cu121/xformers-0.0.22.post7-cp310-cp310-manylinux2014_x86_64.whl ; python_version=='3.10' and ('linux' in sys_platform)",
    "xformers @ https://download.pytorch.org/whl/cu121/xformers-0.0.22.post7-cp311-cp311-manylinux2014_x86_64.whl ; python_version=='3.11' and ('linux' in sys_platform)",
]
cu118onlytorch211 = [
    "xformers @ https://download.pytorch.org/whl/cu118/xformers-0.0.23%2Bcu118-cp39-cp39-manylinux2014_x86_64.whl ; python_version=='3.9' and ('linux' in sys_platform)",
    "xformers @ https://download.pytorch.org/whl/cu118/xformers-0.0.23%2Bcu118-cp310-cp310-manylinux2014_x86_64.whl ; python_version=='3.10' and ('linux' in sys_platform)",
    "xformers @ https://download.pytorch.org/whl/cu118/xformers-0.0.23%2Bcu118-cp311-cp311-manylinux2014_x86_64.whl ; python_version=='3.11' and ('linux' in sys_platform)",
]
cu121onlytorch211 = [
    "xformers @ https://download.pytorch.org/whl/cu121/xformers-0.0.23-cp39-cp39-manylinux2014_x86_64.whl ; python_version=='3.9' and ('linux' in sys_platform)",
    "xformers @ https://download.pytorch.org/whl/cu121/xformers-0.0.23-cp310-cp310-manylinux2014_x86_64.whl ; python_version=='3.10' and ('linux' in sys_platform)",
    "xformers @ https://download.pytorch.org/whl/cu121/xformers-0.0.23-cp311-cp311-manylinux2014_x86_64.whl ; python_version=='3.11' and ('linux' in sys_platform)",
]
cu118onlytorch212 = [
    "xformers @ https://download.pytorch.org/whl/cu118/xformers-0.0.23.post1%2Bcu118-cp39-cp39-manylinux2014_x86_64.whl ; python_version=='3.9' and ('linux' in sys_platform)",
    "xformers @ https://download.pytorch.org/whl/cu118/xformers-0.0.23.post1%2Bcu118-cp310-cp310-manylinux2014_x86_64.whl ; python_version=='3.10' and ('linux' in sys_platform)",
    "xformers @ https://download.pytorch.org/whl/cu118/xformers-0.0.23.post1%2Bcu118-cp311-cp311-manylinux2014_x86_64.whl ; python_version=='3.11' and ('linux' in sys_platform)",
]
cu121onlytorch212 = [
    "xformers @ https://download.pytorch.org/whl/cu121/xformers-0.0.23.post1-cp39-cp39-manylinux2014_x86_64.whl ; python_version=='3.9' and ('linux' in sys_platform)",
    "xformers @ https://download.pytorch.org/whl/cu121/xformers-0.0.23.post1-cp310-cp310-manylinux2014_x86_64.whl ; python_version=='3.10' and ('linux' in sys_platform)",
    "xformers @ https://download.pytorch.org/whl/cu121/xformers-0.0.23.post1-cp311-cp311-manylinux2014_x86_64.whl ; python_version=='3.11' and ('linux' in sys_platform)",
]
cu118onlytorch220 = [
    "xformers @ https://download.pytorch.org/whl/cu118/xformers-0.0.24%2Bcu118-cp39-cp39-manylinux2014_x86_64.whl ; python_version=='3.9' and ('linux' in sys_platform)",
    "xformers @ https://download.pytorch.org/whl/cu118/xformers-0.0.24%2Bcu118-cp310-cp310-manylinux2014_x86_64.whl ; python_version=='3.10' and ('linux' in sys_platform)",
    "xformers @ https://download.pytorch.org/whl/cu118/xformers-0.0.24%2Bcu118-cp311-cp311-manylinux2014_x86_64.whl ; python_version=='3.11' and ('linux' in sys_platform)",
]
cu121onlytorch220 = [
    "xformers @ https://download.pytorch.org/whl/cu121/xformers-0.0.24-cp39-cp39-manylinux2014_x86_64.whl ; python_version=='3.9' and ('linux' in sys_platform)",
    "xformers @ https://download.pytorch.org/whl/cu121/xformers-0.0.24-cp310-cp310-manylinux2014_x86_64.whl ; python_version=='3.10' and ('linux' in sys_platform)",
    "xformers @ https://download.pytorch.org/whl/cu121/xformers-0.0.24-cp311-cp311-manylinux2014_x86_64.whl ; python_version=='3.11' and ('linux' in sys_platform)",
]
cu118onlytorch230 = [
    "xformers @ https://download.pytorch.org/whl/cu118/xformers-0.0.27%2Bcu118-cp39-cp39-manylinux2014_x86_64.whl ; python_version=='3.9' and ('linux' in sys_platform)",
    "xformers @ https://download.pytorch.org/whl/cu118/xformers-0.0.27%2Bcu118-cp310-cp310-manylinux2014_x86_64.whl ; python_version=='3.10' and ('linux' in sys_platform)",
    "xformers @ https://download.pytorch.org/whl/cu118/xformers-0.0.27%2Bcu118-cp311-cp311-manylinux2014_x86_64.whl ; python_version=='3.11' and ('linux' in sys_platform)",
    "xformers @ https://download.pytorch.org/whl/cu118/xformers-0.0.27%2Bcu118-cp312-cp312-manylinux2014_x86_64.whl ; python_version=='3.12' and ('linux' in sys_platform)",
]
cu121onlytorch230 = [
    "xformers @ https://download.pytorch.org/whl/cu121/xformers-0.0.27-cp39-cp39-manylinux2014_x86_64.whl ; python_version=='3.9' and ('linux' in sys_platform)",
    "xformers @ https://download.pytorch.org/whl/cu121/xformers-0.0.27-cp310-cp310-manylinux2014_x86_64.whl ; python_version=='3.10' and ('linux' in sys_platform)",
    "xformers @ https://download.pytorch.org/whl/cu121/xformers-0.0.27-cp311-cp311-manylinux2014_x86_64.whl ; python_version=='3.11' and ('linux' in sys_platform)",
    "xformers @ https://download.pytorch.org/whl/cu121/xformers-0.0.27-cp312-cp312-manylinux2014_x86_64.whl ; python_version=='3.12' and ('linux' in sys_platform)",
]
cu118onlytorch240 = [
    "xformers @ https://download.pytorch.org/whl/cu118/xformers-0.0.27.post2%2Bcu118-cp39-cp39-manylinux2014_x86_64.whl ; python_version=='3.9' and ('linux' in sys_platform)",
    "xformers @ https://download.pytorch.org/whl/cu118/xformers-0.0.27.post2%2Bcu118-cp310-cp310-manylinux2014_x86_64.whl ; python_version=='3.10' and ('linux' in sys_platform)",
    "xformers @ https://download.pytorch.org/whl/cu118/xformers-0.0.27.post2%2Bcu118-cp311-cp311-manylinux2014_x86_64.whl ; python_version=='3.11' and ('linux' in sys_platform)",
    "xformers @ https://download.pytorch.org/whl/cu118/xformers-0.0.27.post2%2Bcu118-cp312-cp312-manylinux2014_x86_64.whl ; python_version=='3.12' and ('linux' in sys_platform)",
]
cu121onlytorch240 = [
    "xformers @ https://download.pytorch.org/whl/cu121/xformers-0.0.28.post1-cp39-cp39-manylinux_2_28_x86_64.whl ; python_version=='3.9' and ('linux' in sys_platform)",
    "xformers @ https://download.pytorch.org/whl/cu121/xformers-0.0.28.post1-cp310-cp310-manylinux_2_28_x86_64.whl ; python_version=='3.10' and ('linux' in sys_platform)",
    "xformers @ https://download.pytorch.org/whl/cu121/xformers-0.0.28.post1-cp311-cp311-manylinux_2_28_x86_64.whl ; python_version=='3.11' and ('linux' in sys_platform)",
    "xformers @ https://download.pytorch.org/whl/cu121/xformers-0.0.28.post1-cp312-cp312-manylinux_2_28_x86_64.whl ; python_version=='3.12' and ('linux' in sys_platform)",
]
cu124onlytorch240 = [
    "xformers @ https://download.pytorch.org/whl/cu124/xformers-0.0.28.post1-cp39-cp39-manylinux_2_28_x86_64.whl ; python_version=='3.9' and ('linux' in sys_platform)",
    "xformers @ https://download.pytorch.org/whl/cu124/xformers-0.0.28.post1-cp310-cp310-manylinux_2_28_x86_64.whl ; python_version=='3.10' and ('linux' in sys_platform)",
    "xformers @ https://download.pytorch.org/whl/cu124/xformers-0.0.28.post1-cp311-cp311-manylinux_2_28_x86_64.whl ; python_version=='3.11' and ('linux' in sys_platform)",
    "xformers @ https://download.pytorch.org/whl/cu124/xformers-0.0.28.post1-cp312-cp312-manylinux_2_28_x86_64.whl ; python_version=='3.12' and ('linux' in sys_platform)",
    "xformers @ https://download.pytorch.org/whl/cu124/xformers-0.0.28.post1-cp39-cp39-win_amd64.whl ; python_version=='3.9' and (sys_platform == 'win32')",
    "xformers @ https://download.pytorch.org/whl/cu124/xformers-0.0.28.post1-cp310-cp310-win_amd64.whl ; python_version=='3.10' and (sys_platform == 'win32')",
    "xformers @ https://download.pytorch.org/whl/cu124/xformers-0.0.28.post1-cp311-cp311-win_amd64.whl ; python_version=='3.11' and (sys_platform == 'win32')",
    "xformers @ https://download.pytorch.org/whl/cu124/xformers-0.0.28.post1-cp312-cp312-win_amd64.whl ; python_version=='3.12' and (sys_platform == 'win32')",
]
cu118onlytorch250 = [
    "xformers @ https://download.pytorch.org/whl/cu118/xformers-0.0.28.post2-cp39-cp39-manylinux_2_28_x86_64.whl ; python_version=='3.9' and ('linux' in sys_platform)",
    "xformers @ https://download.pytorch.org/whl/cu118/xformers-0.0.28.post2-cp310-cp310-manylinux_2_28_x86_64.whl ; python_version=='3.10' and ('linux' in sys_platform)",
    "xformers @ https://download.pytorch.org/whl/cu118/xformers-0.0.28.post2-cp311-cp311-manylinux_2_28_x86_64.whl ; python_version=='3.11' and ('linux' in sys_platform)",
    "xformers @ https://download.pytorch.org/whl/cu118/xformers-0.0.28.post2-cp312-cp312-manylinux_2_28_x86_64.whl ; python_version=='3.12' and ('linux' in sys_platform)",
]
cu121onlytorch250 = [
    "xformers @ https://download.pytorch.org/whl/cu121/xformers-0.0.28.post2-cp39-cp39-manylinux_2_28_x86_64.whl ; python_version=='3.9' and ('linux' in sys_platform)",
    "xformers @ https://download.pytorch.org/whl/cu121/xformers-0.0.28.post2-cp310-cp310-manylinux_2_28_x86_64.whl ; python_version=='3.10' and ('linux' in sys_platform)",
    "xformers @ https://download.pytorch.org/whl/cu121/xformers-0.0.28.post2-cp311-cp311-manylinux_2_28_x86_64.whl ; python_version=='3.11' and ('linux' in sys_platform)",
    "xformers @ https://download.pytorch.org/whl/cu121/xformers-0.0.28.post2-cp312-cp312-manylinux_2_28_x86_64.whl ; python_version=='3.12' and ('linux' in sys_platform)",
]
cu124onlytorch250 = [
    "xformers @ https://download.pytorch.org/whl/cu124/xformers-0.0.28.post2-cp39-cp39-manylinux_2_28_x86_64.whl ; python_version=='3.9' and ('linux' in sys_platform)",
    "xformers @ https://download.pytorch.org/whl/cu124/xformers-0.0.28.post2-cp310-cp310-manylinux_2_28_x86_64.whl ; python_version=='3.10' and ('linux' in sys_platform)",
    "xformers @ https://download.pytorch.org/whl/cu124/xformers-0.0.28.post2-cp311-cp311-manylinux_2_28_x86_64.whl ; python_version=='3.11' and ('linux' in sys_platform)",
    "xformers @ https://download.pytorch.org/whl/cu124/xformers-0.0.28.post2-cp312-cp312-manylinux_2_28_x86_64.whl ; python_version=='3.12' and ('linux' in sys_platform)",
    "xformers @ https://download.pytorch.org/whl/cu124/xformers-0.0.28.post2-cp39-cp39-win_amd64.whl ; python_version=='3.9' and (sys_platform == 'win32')",
    "xformers @ https://download.pytorch.org/whl/cu124/xformers-0.0.28.post2-cp310-cp310-win_amd64.whl ; python_version=='3.10' and (sys_platform == 'win32')",
    "xformers @ https://download.pytorch.org/whl/cu124/xformers-0.0.28.post2-cp311-cp311-win_amd64.whl ; python_version=='3.11' and (sys_platform == 'win32')",
    "xformers @ https://download.pytorch.org/whl/cu124/xformers-0.0.28.post2-cp312-cp312-win_amd64.whl ; python_version=='3.12' and (sys_platform == 'win32')",
]
cu118onlytorch251 = [
    "xformers @ https://download.pytorch.org/whl/cu118/xformers-0.0.29.post1-cp39-cp39-manylinux_2_28_x86_64.whl ; python_version=='3.9' and ('linux' in sys_platform)",
    "xformers @ https://download.pytorch.org/whl/cu118/xformers-0.0.29.post1-cp310-cp310-manylinux_2_28_x86_64.whl ; python_version=='3.10' and ('linux' in sys_platform)",
    "xformers @ https://download.pytorch.org/whl/cu118/xformers-0.0.29.post1-cp311-cp311-manylinux_2_28_x86_64.whl ; python_version=='3.11' and ('linux' in sys_platform)",
    "xformers @ https://download.pytorch.org/whl/cu118/xformers-0.0.29.post1-cp312-cp312-manylinux_2_28_x86_64.whl ; python_version=='3.12' and ('linux' in sys_platform)",
]
cu121onlytorch251 = [
    "xformers @ https://download.pytorch.org/whl/cu121/xformers-0.0.29.post1-cp39-cp39-manylinux_2_28_x86_64.whl ; python_version=='3.9' and ('linux' in sys_platform)",
    "xformers @ https://download.pytorch.org/whl/cu121/xformers-0.0.29.post1-cp310-cp310-manylinux_2_28_x86_64.whl ; python_version=='3.10' and ('linux' in sys_platform)",
    "xformers @ https://download.pytorch.org/whl/cu121/xformers-0.0.29.post1-cp311-cp311-manylinux_2_28_x86_64.whl ; python_version=='3.11' and ('linux' in sys_platform)",
    "xformers @ https://download.pytorch.org/whl/cu121/xformers-0.0.29.post1-cp312-cp312-manylinux_2_28_x86_64.whl ; python_version=='3.12' and ('linux' in sys_platform)",
]
cu124onlytorch251 = [
    "xformers @ https://download.pytorch.org/whl/cu124/xformers-0.0.29.post1-cp39-cp39-manylinux_2_28_x86_64.whl ; python_version=='3.9' and ('linux' in sys_platform)",
    "xformers @ https://download.pytorch.org/whl/cu124/xformers-0.0.29.post1-cp310-cp310-manylinux_2_28_x86_64.whl ; python_version=='3.10' and ('linux' in sys_platform)",
    "xformers @ https://download.pytorch.org/whl/cu124/xformers-0.0.29.post1-cp311-cp311-manylinux_2_28_x86_64.whl ; python_version=='3.11' and ('linux' in sys_platform)",
    "xformers @ https://download.pytorch.org/whl/cu124/xformers-0.0.29.post1-cp312-cp312-manylinux_2_28_x86_64.whl ; python_version=='3.12' and ('linux' in sys_platform)",
    "xformers @ https://download.pytorch.org/whl/cu124/xformers-0.0.29.post1-cp39-cp39-win_amd64.whl ; python_version=='3.9' and (sys_platform == 'win32')",
    "xformers @ https://download.pytorch.org/whl/cu124/xformers-0.0.29.post1-cp310-cp310-win_amd64.whl ; python_version=='3.10' and (sys_platform == 'win32')",
    "xformers @ https://download.pytorch.org/whl/cu124/xformers-0.0.29.post1-cp311-cp311-win_amd64.whl ; python_version=='3.11' and (sys_platform == 'win32')",
    "xformers @ https://download.pytorch.org/whl/cu124/xformers-0.0.29.post1-cp312-cp312-win_amd64.whl ; python_version=='3.12' and (sys_platform == 'win32')",
]
cu118onlytorch260 = [
    "xformers @ https://download.pytorch.org/whl/cu118/xformers-0.0.29.post3-cp39-cp39-manylinux_2_28_x86_64.whl ; python_version=='3.9' and ('linux' in sys_platform)",
    "xformers @ https://download.pytorch.org/whl/cu118/xformers-0.0.29.post3-cp310-cp310-manylinux_2_28_x86_64.whl ; python_version=='3.10' and ('linux' in sys_platform)",
    "xformers @ https://download.pytorch.org/whl/cu118/xformers-0.0.29.post3-cp311-cp311-manylinux_2_28_x86_64.whl ; python_version=='3.11' and ('linux' in sys_platform)",
    "xformers @ https://download.pytorch.org/whl/cu118/xformers-0.0.29.post3-cp312-cp312-manylinux_2_28_x86_64.whl ; python_version=='3.12' and ('linux' in sys_platform)",
]
cu124onlytorch260 = [
    "xformers @ https://download.pytorch.org/whl/cu124/xformers-0.0.29.post3-cp39-cp39-manylinux_2_28_x86_64.whl ; python_version=='3.9' and ('linux' in sys_platform)",
    "xformers @ https://download.pytorch.org/whl/cu124/xformers-0.0.29.post3-cp310-cp310-manylinux_2_28_x86_64.whl ; python_version=='3.10' and ('linux' in sys_platform)",
    "xformers @ https://download.pytorch.org/whl/cu124/xformers-0.0.29.post3-cp311-cp311-manylinux_2_28_x86_64.whl ; python_version=='3.11' and ('linux' in sys_platform)",
    "xformers @ https://download.pytorch.org/whl/cu124/xformers-0.0.29.post3-cp312-cp312-manylinux_2_28_x86_64.whl ; python_version=='3.12' and ('linux' in sys_platform)",
    "xformers @ https://download.pytorch.org/whl/cu124/xformers-0.0.29.post3-cp39-cp39-win_amd64.whl ; python_version=='3.9' and (sys_platform == 'win32')",
    "xformers @ https://download.pytorch.org/whl/cu124/xformers-0.0.29.post3-cp310-cp310-win_amd64.whl ; python_version=='3.10' and (sys_platform == 'win32')",
    "xformers @ https://download.pytorch.org/whl/cu124/xformers-0.0.29.post3-cp311-cp311-win_amd64.whl ; python_version=='3.11' and (sys_platform == 'win32')",
    "xformers @ https://download.pytorch.org/whl/cu124/xformers-0.0.29.post3-cp312-cp312-win_amd64.whl ; python_version=='3.12' and (sys_platform == 'win32')",
]
cu126onlytorch260 = [
    "xformers @ https://download.pytorch.org/whl/cu126/xformers-0.0.29.post3-cp39-cp39-manylinux_2_28_x86_64.whl ; python_version=='3.9' and ('linux' in sys_platform)",
    "xformers @ https://download.pytorch.org/whl/cu126/xformers-0.0.29.post3-cp310-cp310-manylinux_2_28_x86_64.whl ; python_version=='3.10' and ('linux' in sys_platform)",
    "xformers @ https://download.pytorch.org/whl/cu126/xformers-0.0.29.post3-cp311-cp311-manylinux_2_28_x86_64.whl ; python_version=='3.11' and ('linux' in sys_platform)",
    "xformers @ https://download.pytorch.org/whl/cu126/xformers-0.0.29.post3-cp312-cp312-manylinux_2_28_x86_64.whl ; python_version=='3.12' and ('linux' in sys_platform)",
    "xformers @ https://download.pytorch.org/whl/cu126/xformers-0.0.29.post3-cp39-cp39-win_amd64.whl ; python_version=='3.9' and (sys_platform == 'win32')",
    "xformers @ https://download.pytorch.org/whl/cu126/xformers-0.0.29.post3-cp310-cp310-win_amd64.whl ; python_version=='3.10' and (sys_platform == 'win32')",
    "xformers @ https://download.pytorch.org/whl/cu126/xformers-0.0.29.post3-cp311-cp311-win_amd64.whl ; python_version=='3.11' and (sys_platform == 'win32')",
    "xformers @ https://download.pytorch.org/whl/cu126/xformers-0.0.29.post3-cp312-cp312-win_amd64.whl ; python_version=='3.12' and (sys_platform == 'win32')",
]
cu118onlytorch270 = [
    "xformers @ https://download.pytorch.org/whl/cu118/xformers-0.0.30-cp39-cp39-manylinux_2_28_x86_64.whl ; python_version=='3.9' and ('linux' in sys_platform)",
    "xformers @ https://download.pytorch.org/whl/cu118/xformers-0.0.30-cp310-cp310-manylinux_2_28_x86_64.whl ; python_version=='3.10' and ('linux' in sys_platform)",
    "xformers @ https://download.pytorch.org/whl/cu118/xformers-0.0.30-cp311-cp311-manylinux_2_28_x86_64.whl ; python_version=='3.11' and ('linux' in sys_platform)",
    "xformers @ https://download.pytorch.org/whl/cu118/xformers-0.0.30-cp312-cp312-manylinux_2_28_x86_64.whl ; python_version=='3.12' and ('linux' in sys_platform)",
    "xformers @ https://download.pytorch.org/whl/cu118/xformers-0.0.30-cp39-cp39-win_amd64.whl ; python_version=='3.9' and (sys_platform == 'win32')",
    "xformers @ https://download.pytorch.org/whl/cu118/xformers-0.0.30-cp310-cp310-win_amd64.whl ; python_version=='3.10' and (sys_platform == 'win32')",
    "xformers @ https://download.pytorch.org/whl/cu118/xformers-0.0.30-cp311-cp311-win_amd64.whl ; python_version=='3.11' and (sys_platform == 'win32')",
    "xformers @ https://download.pytorch.org/whl/cu118/xformers-0.0.30-cp312-cp312-win_amd64.whl ; python_version=='3.12' and (sys_platform == 'win32')",
]
cu126onlytorch270 = [
    "xformers @ https://download.pytorch.org/whl/cu126/xformers-0.0.30-cp39-cp39-manylinux_2_28_x86_64.whl ; python_version=='3.9' and ('linux' in sys_platform)",
    "xformers @ https://download.pytorch.org/whl/cu126/xformers-0.0.30-cp310-cp310-manylinux_2_28_x86_64.whl ; python_version=='3.10' and ('linux' in sys_platform)",
    "xformers @ https://download.pytorch.org/whl/cu126/xformers-0.0.30-cp311-cp311-manylinux_2_28_x86_64.whl ; python_version=='3.11' and ('linux' in sys_platform)",
    "xformers @ https://download.pytorch.org/whl/cu126/xformers-0.0.30-cp312-cp312-manylinux_2_28_x86_64.whl ; python_version=='3.12' and ('linux' in sys_platform)",
    "xformers @ https://download.pytorch.org/whl/cu126/xformers-0.0.30-cp39-cp39-win_amd64.whl ; python_version=='3.9' and (sys_platform == 'win32')",
    "xformers @ https://download.pytorch.org/whl/cu126/xformers-0.0.30-cp310-cp310-win_amd64.whl ; python_version=='3.10' and (sys_platform == 'win32')",
    "xformers @ https://download.pytorch.org/whl/cu126/xformers-0.0.30-cp311-cp311-win_amd64.whl ; python_version=='3.11' and (sys_platform == 'win32')",
    "xformers @ https://download.pytorch.org/whl/cu126/xformers-0.0.30-cp312-cp312-win_amd64.whl ; python_version=='3.12' and (sys_platform == 'win32')",
]
cu128onlytorch270 = [
    "xformers @ https://download.pytorch.org/whl/cu128/xformers-0.0.30-cp39-cp39-manylinux_2_28_x86_64.whl ; python_version=='3.9' and ('linux' in sys_platform)",
    "xformers @ https://download.pytorch.org/whl/cu128/xformers-0.0.30-cp310-cp310-manylinux_2_28_x86_64.whl ; python_version=='3.10' and ('linux' in sys_platform)",
    "xformers @ https://download.pytorch.org/whl/cu128/xformers-0.0.30-cp311-cp311-manylinux_2_28_x86_64.whl ; python_version=='3.11' and ('linux' in sys_platform)",
    "xformers @ https://download.pytorch.org/whl/cu128/xformers-0.0.30-cp312-cp312-manylinux_2_28_x86_64.whl ; python_version=='3.12' and ('linux' in sys_platform)",
    "xformers @ https://download.pytorch.org/whl/cu128/xformers-0.0.30-cp39-cp39-win_amd64.whl ; python_version=='3.9' and (sys_platform == 'win32')",
    "xformers @ https://download.pytorch.org/whl/cu128/xformers-0.0.30-cp310-cp310-win_amd64.whl ; python_version=='3.10' and (sys_platform == 'win32')",
    "xformers @ https://download.pytorch.org/whl/cu128/xformers-0.0.30-cp311-cp311-win_amd64.whl ; python_version=='3.11' and (sys_platform == 'win32')",
    "xformers @ https://download.pytorch.org/whl/cu128/xformers-0.0.30-cp312-cp312-win_amd64.whl ; python_version=='3.12' and (sys_platform == 'win32')",
]
cu118onlytorch271 = [
    "xformers @ https://download.pytorch.org/whl/cu118/xformers-0.0.31.post1-cp39-abi3-manylinux_2_28_x86_64.whl ; ('linux' in sys_platform)",
    "xformers @ https://download.pytorch.org/whl/cu118/xformers-0.0.31.post1-cp39-abi3-win_amd64.whl ; (sys_platform == 'win32')",
]
cu126onlytorch271 = [
    "xformers @ https://download.pytorch.org/whl/cu126/xformers-0.0.31.post1-cp39-abi3-manylinux_2_28_x86_64.whl ; ('linux' in sys_platform)",
    "xformers @ https://download.pytorch.org/whl/cu126/xformers-0.0.31.post1-cp39-abi3-win_amd64.whl ; (sys_platform == 'win32')",
]
cu128onlytorch271 = [
    "xformers @ https://download.pytorch.org/whl/cu128/xformers-0.0.31.post1-cp39-abi3-manylinux_2_28_x86_64.whl ; ('linux' in sys_platform)",
    "xformers @ https://download.pytorch.org/whl/cu128/xformers-0.0.31.post1-cp39-abi3-win_amd64.whl ; (sys_platform == 'win32')",
]
cu118onlytorch280 = [
    "xformers @ https://download.pytorch.org/whl/cu126/xformers-0.0.32.post2-cp39-abi3-manylinux_2_28_x86_64.whl ; ('linux' in sys_platform)",
    "xformers @ https://download.pytorch.org/whl/cu126/xformers-0.0.32.post2-cp39-abi3-win_amd64.whl ; (sys_platform == 'win32')",
]
cu126onlytorch280 = [
    "xformers @ https://download.pytorch.org/whl/cu128/xformers-0.0.32.post2-cp39-abi3-manylinux_2_28_x86_64.whl ; ('linux' in sys_platform)",
    "xformers @ https://download.pytorch.org/whl/cu128/xformers-0.0.32.post2-cp39-abi3-win_amd64.whl ; (sys_platform == 'win32')",
]
cu128onlytorch280 = [
    "xformers @ https://download.pytorch.org/whl/cu129/xformers-0.0.32.post2-cp39-abi3-manylinux_2_28_x86_64.whl ; ('linux' in sys_platform)",
    "xformers @ https://download.pytorch.org/whl/cu129/xformers-0.0.32.post2-cp39-abi3-win_amd64.whl ; (sys_platform == 'win32')",
]
cu130onlytorch280 = [
]
cu126onlytorch290 = [
    "xformers @ https://download.pytorch.org/whl/cu126/xformers-0.0.33.post1-cp39-abi3-manylinux_2_28_x86_64.whl ; ('linux' in sys_platform)",
    "xformers @ https://download.pytorch.org/whl/cu126/xformers-0.0.33.post1-cp39-abi3-win_amd64.whl ; (sys_platform == 'win32')",
]
cu128onlytorch290 = [
    "xformers @ https://download.pytorch.org/whl/cu128/xformers-0.0.33.post1-cp39-abi3-manylinux_2_28_x86_64.whl ; ('linux' in sys_platform)",
    "xformers @ https://download.pytorch.org/whl/cu128/xformers-0.0.33.post1-cp39-abi3-win_amd64.whl ; (sys_platform == 'win32')",
]
cu130onlytorch290 = [
    "xformers @ https://download.pytorch.org/whl/cu130/xformers-0.0.33.post1-cp39-abi3-manylinux_2_28_x86_64.whl ; ('linux' in sys_platform)",
    "xformers @ https://download.pytorch.org/whl/cu130/xformers-0.0.33.post1-cp39-abi3-win_amd64.whl ; (sys_platform == 'win32')",
]
cu126onlytorch291 = [
    "xformers @ https://download.pytorch.org/whl/cu126/xformers-0.0.33.post2-cp39-abi3-manylinux_2_28_x86_64.whl ; ('linux' in sys_platform)",
    "xformers @ https://download.pytorch.org/whl/cu126/xformers-0.0.33.post2-cp39-abi3-win_amd64.whl ; (sys_platform == 'win32')",
]
cu128onlytorch291 = [
    "xformers @ https://download.pytorch.org/whl/cu128/xformers-0.0.33.post2-cp39-abi3-manylinux_2_28_x86_64.whl ; ('linux' in sys_platform)",
    "xformers @ https://download.pytorch.org/whl/cu128/xformers-0.0.33.post2-cp39-abi3-win_amd64.whl ; (sys_platform == 'win32')",
]
cu130onlytorch291 = [
    "xformers @ https://download.pytorch.org/whl/cu130/xformers-0.0.33.post2-cp39-abi3-manylinux_2_28_x86_64.whl ; ('linux' in sys_platform)",
    "xformers @ https://download.pytorch.org/whl/cu130/xformers-0.0.33.post2-cp39-abi3-win_amd64.whl ; (sys_platform == 'win32')",
]
cu126onlytorch2100 = [
    "xformers @ https://download.pytorch.org/whl/cu126/xformers-0.0.34-cp39-abi3-manylinux_2_28_x86_64.whl ; ('linux' in sys_platform)",
    "xformers @ https://download.pytorch.org/whl/cu126/xformers-0.0.34-cp39-abi3-win_amd64.whl ; (sys_platform == 'win32')",
]
cu128onlytorch2100 = [
    "xformers @ https://download.pytorch.org/whl/cu128/xformers-0.0.34-cp39-abi3-manylinux_2_28_x86_64.whl ; ('linux' in sys_platform)",
    "xformers @ https://download.pytorch.org/whl/cu128/xformers-0.0.34-cp39-abi3-win_amd64.whl ; (sys_platform == 'win32')",
]
cu130onlytorch2100 = [
    "xformers @ https://download.pytorch.org/whl/cu130/xformers-0.0.34-cp39-abi3-manylinux_2_28_x86_64.whl ; ('linux' in sys_platform)",
    "xformers @ https://download.pytorch.org/whl/cu130/xformers-0.0.34-cp39-abi3-win_amd64.whl ; (sys_platform == 'win32')",
]
cu118 = [
    "unsloth[huggingface]",
    "bitsandbytes>=0.45.5,!=0.46.0,!=0.48.0",
    "unsloth[cu118only]",
]
cu121 = [
    "unsloth[huggingface]",
    "bitsandbytes>=0.45.5,!=0.46.0,!=0.48.0",
    "unsloth[cu121only]",
]
cu118-torch211 = [
    "unsloth[huggingface]",
    "bitsandbytes==0.45.5",
    "unsloth[cu118onlytorch211]",
]
cu121-torch211 = [
    "unsloth[huggingface]",
    "bitsandbytes==0.45.5",
    "unsloth[cu121onlytorch211]",
]
cu118-torch212 = [
    "unsloth[huggingface]",
    "bitsandbytes==0.45.5",
    "unsloth[cu118onlytorch212]",
]
cu121-torch212 = [
    "unsloth[huggingface]",
    "bitsandbytes==0.45.5",
    "unsloth[cu121onlytorch212]",
]
cu118-torch220 = [
    "unsloth[huggingface]",
    "bitsandbytes>=0.45.5,!=0.46.0,!=0.48.0",
    "unsloth[cu118onlytorch220]",
]
cu121-torch220 = [
    "unsloth[huggingface]",
    "bitsandbytes>=0.45.5,!=0.46.0,!=0.48.0",
    "unsloth[cu121onlytorch220]",
]
cu118-torch230 = [
    "unsloth[huggingface]",
    "bitsandbytes>=0.45.5,!=0.46.0,!=0.48.0",
    "unsloth[cu118onlytorch230]",
]
cu121-torch230 = [
    "unsloth[huggingface]",
    "bitsandbytes>=0.45.5,!=0.46.0,!=0.48.0",
    "unsloth[cu121onlytorch230]",
]
cu118-torch240 = [
    "unsloth[huggingface]",
    "bitsandbytes>=0.45.5,!=0.46.0,!=0.48.0",
    "unsloth[cu118onlytorch240]",
]
cu121-torch240 = [
    "unsloth[huggingface]",
    "bitsandbytes>=0.45.5,!=0.46.0,!=0.48.0",
    "unsloth[cu121onlytorch240]",
]
cu124-torch240 = [
    "unsloth[huggingface]",
    "bitsandbytes>=0.45.5,!=0.46.0,!=0.48.0",
    "unsloth[cu124onlytorch240]",
]
cu118-torch250 = [
    "unsloth[huggingface]",
    "bitsandbytes>=0.45.5,!=0.46.0,!=0.48.0",
    "unsloth[cu118onlytorch250]",
]
cu121-torch250 = [
    "unsloth[huggingface]",
    "bitsandbytes>=0.45.5,!=0.46.0,!=0.48.0",
    "unsloth[cu121onlytorch250]",
]
cu124-torch250 = [
    "unsloth[huggingface]",
    "bitsandbytes>=0.45.5,!=0.46.0,!=0.48.0",
    "unsloth[cu124onlytorch250]",
]
cu118-torch251 = [
    "unsloth[huggingface]",
    "bitsandbytes>=0.45.5,!=0.46.0,!=0.48.0",
    "unsloth[cu118onlytorch251]",
]
cu121-torch251 = [
    "unsloth[huggingface]",
    "bitsandbytes>=0.45.5,!=0.46.0,!=0.48.0",
    "unsloth[cu121onlytorch251]",
]
cu124-torch251 = [
    "unsloth[huggingface]",
    "bitsandbytes>=0.45.5,!=0.46.0,!=0.48.0",
    "unsloth[cu124onlytorch251]",
]
cu118-torch260 = [
    "unsloth[huggingface]",
    "bitsandbytes>=0.45.5,!=0.46.0,!=0.48.0",
    "unsloth[cu118onlytorch260]",
]
cu124-torch260 = [
    "unsloth[huggingface]",
    "bitsandbytes>=0.45.5,!=0.46.0,!=0.48.0",
    "unsloth[cu124onlytorch260]",
]
cu126-torch260 = [
    "unsloth[huggingface]",
    "bitsandbytes>=0.45.5,!=0.46.0,!=0.48.0",
    "unsloth[cu126onlytorch260]",
]
cu118-torch270 = [
    "unsloth[huggingface]",
    "bitsandbytes>=0.45.5,!=0.46.0,!=0.48.0",
    "unsloth[cu118onlytorch270]",
]
cu126-torch270 = [
    "unsloth[huggingface]",
    "bitsandbytes>=0.45.5,!=0.46.0,!=0.48.0",
    "unsloth[cu126onlytorch270]",
]
cu128-torch270 = [
    "unsloth[huggingface]",
    "bitsandbytes>=0.45.5,!=0.46.0,!=0.48.0",
    "unsloth[cu128onlytorch270]",
]
cu118-torch271 = [
    "unsloth[huggingface]",
    "bitsandbytes>=0.45.5,!=0.46.0,!=0.48.0",
    "unsloth[cu118onlytorch271]",
]
cu126-torch271 = [
    "unsloth[huggingface]",
    "bitsandbytes>=0.45.5,!=0.46.0,!=0.48.0",
    "unsloth[cu126onlytorch271]",
]
cu128-torch271 = [
    "unsloth[huggingface]",
    "bitsandbytes>=0.45.5,!=0.46.0,!=0.48.0",
    "unsloth[cu128onlytorch271]",
]
cu118-torch280 = [
    "unsloth[huggingface]",
    "bitsandbytes>=0.45.5,!=0.46.0,!=0.48.0",
    "unsloth[cu118onlytorch280]",
]
cu126-torch280 = [
    "unsloth[huggingface]",
    "bitsandbytes>=0.45.5,!=0.46.0,!=0.48.0",
    "unsloth[cu126onlytorch280]",
]
cu128-torch280 = [
    "unsloth[huggingface]",
    "bitsandbytes>=0.45.5,!=0.46.0,!=0.48.0",
    "unsloth[cu128onlytorch280]",
]
cu130-torch280 = [
    "unsloth[huggingface]",
    "bitsandbytes>=0.45.5,!=0.46.0,!=0.48.0",
    "unsloth[cu130onlytorch280]",
]
cu126-torch290 = [
    "unsloth[huggingface]",
    "bitsandbytes>=0.45.5,!=0.46.0,!=0.48.0",
    "unsloth[cu126onlytorch290]",
]
cu128-torch290 = [
    "unsloth[huggingface]",
    "bitsandbytes>=0.45.5,!=0.46.0,!=0.48.0",
    "unsloth[cu128onlytorch290]",
]
cu130-torch290 = [
    "unsloth[huggingface]",
    "bitsandbytes>=0.45.5,!=0.46.0,!=0.48.0",
    "unsloth[cu130onlytorch290]",
]
cu126-torch291 = [
    "unsloth[huggingface]",
    "bitsandbytes>=0.45.5,!=0.46.0,!=0.48.0",
    "unsloth[cu126onlytorch291]",
]
cu128-torch291 = [
    "unsloth[huggingface]",
    "bitsandbytes>=0.45.5,!=0.46.0,!=0.48.0",
    "unsloth[cu128onlytorch291]",
]
cu130-torch291 = [
    "unsloth[huggingface]",
    "bitsandbytes>=0.45.5,!=0.46.0,!=0.48.0",
    "unsloth[cu130onlytorch291]",
]
cu126-torch2100 = [
    "unsloth[huggingface]",
    "bitsandbytes>=0.45.5,!=0.46.0,!=0.48.0",
    "unsloth[cu126onlytorch2100]",
]
cu128-torch2100 = [
    "unsloth[huggingface]",
    "bitsandbytes>=0.45.5,!=0.46.0,!=0.48.0",
    "unsloth[cu128onlytorch2100]",
]
cu130-torch2100 = [
    "unsloth[huggingface]",
    "bitsandbytes>=0.45.5,!=0.46.0,!=0.48.0",
    "unsloth[cu130onlytorch2100]",
]
kaggle = [
    "unsloth[huggingface]",
]
kaggle-new = [
    "unsloth[huggingface]",
    "bitsandbytes>=0.45.5,!=0.46.0,!=0.48.0",
]
conda = [
    "unsloth[huggingface]",
]
colab-torch211 = [
    "unsloth[huggingface]",
    "bitsandbytes==0.45.5",
    "unsloth[cu121onlytorch211]",
]
colab-ampere-torch211 = [
    "unsloth[huggingface]",
    "bitsandbytes==0.45.5",
    "unsloth[cu121onlytorch211]",
    "packaging",
    "ninja",
    "flash-attn>=2.6.3 ; ('linux' in sys_platform)",
]
colab-torch220 = [
    "unsloth[huggingface]",
    "bitsandbytes>=0.45.5,!=0.46.0,!=0.48.0",
    "unsloth[cu121onlytorch220]",
]
colab-ampere-torch220 = [
    "unsloth[huggingface]",
    "bitsandbytes>=0.45.5,!=0.46.0,!=0.48.0",
    "unsloth[cu121onlytorch220]",
    "packaging",
    "ninja",
    "flash-attn>=2.6.3 ; ('linux' in sys_platform)",
]
colab-new = [
    "unsloth_zoo>=2026.3.4",
    "packaging",
    "tyro",
    "transformers>=4.51.3,!=4.52.0,!=4.52.1,!=4.52.2,!=4.52.3,!=4.53.0,!=4.54.0,!=4.55.0,!=4.55.1,!=4.57.0,!=4.57.4,!=4.57.5,!=5.0.0,!=5.1.0,<=5.3.0",
    "datasets>=3.4.1,!=4.0.*,!=4.1.0,<4.4.0",
    "sentencepiece>=0.2.0",
    "tqdm",
    "psutil",
    "wheel>=0.42.0",
    "numpy",
    "protobuf",
    "huggingface_hub>=0.34.0",
    "hf_transfer",
    "bitsandbytes>=0.45.5,!=0.46.0,!=0.48.0",
    "unsloth[triton]",
    "sentence-transformers",
]
colab-no-deps = [
    "accelerate>=0.34.1",
    "trl>=0.18.2,!=0.19.0,<=0.24.0",
    "peft>=0.18.0",
    "xformers ; ('linux' in sys_platform or sys_platform == 'win32') and (platform_machine == 'AMD64' or platform_machine == 'x86_64')",
    "bitsandbytes>=0.45.5,!=0.46.0,!=0.48.0",
    "protobuf",
]
colab = [
    "unsloth[cu121]",
]
flashattention = [
    "packaging ; ('linux' in sys_platform)",
    "ninja ; ('linux' in sys_platform)",
    "flash-attn>=2.6.3 ; ('linux' in sys_platform)",
]
colab-ampere = [
    "unsloth[colab-ampere-torch220]",
    "unsloth[flashattention]",
]
cu118-ampere = [
    "unsloth[huggingface]",
    "bitsandbytes>=0.45.5,!=0.46.0,!=0.48.0",
    "unsloth[cu118only]",
    "unsloth[flashattention]",
]
cu121-ampere = [
    "unsloth[huggingface]",
    "bitsandbytes>=0.45.5,!=0.46.0,!=0.48.0",
    "unsloth[cu121only]",
    "unsloth[flashattention]",
]
cu118-ampere-torch211 = [
    "unsloth[huggingface]",
    "bitsandbytes==0.45.5",
    "unsloth[cu118onlytorch211]",
    "unsloth[flashattention]",
]
cu121-ampere-torch211 = [
    "unsloth[huggingface]",
    "bitsandbytes==0.45.5",
    "unsloth[cu121onlytorch211]",
    "unsloth[flashattention]",
]
cu118-ampere-torch220 = [
    "unsloth[huggingface]",
    "bitsandbytes>=0.45.5,!=0.46.0,!=0.48.0",
    "unsloth[cu118onlytorch220]",
    "unsloth[flashattention]",
]
cu121-ampere-torch220 = [
    "unsloth[huggingface]",
    "bitsandbytes>=0.45.5,!=0.46.0,!=0.48.0",
    "unsloth[cu121onlytorch220]",
    "unsloth[flashattention]",
]
cu118-ampere-torch230 = [
    "unsloth[huggingface]",
    "bitsandbytes>=0.45.5,!=0.46.0,!=0.48.0",
    "unsloth[cu118onlytorch230]",
    "unsloth[flashattention]",
]
cu121-ampere-torch230 = [
    "unsloth[huggingface]",
    "bitsandbytes>=0.45.5,!=0.46.0,!=0.48.0",
    "unsloth[cu121onlytorch230]",
    "unsloth[flashattention]",
]
cu118-ampere-torch240 = [
    "unsloth[huggingface]",
    "bitsandbytes>=0.45.5,!=0.46.0,!=0.48.0",
    "unsloth[cu118onlytorch240]",
    "unsloth[flashattention]",
]
cu121-ampere-torch240 = [
    "unsloth[huggingface]",
    "bitsandbytes>=0.45.5,!=0.46.0,!=0.48.0",
    "unsloth[cu121onlytorch240]",
    "unsloth[flashattention]",
]
cu124-ampere-torch240 = [
    "unsloth[huggingface]",
    "bitsandbytes>=0.45.5,!=0.46.0,!=0.48.0",
    "unsloth[cu124onlytorch240]",
    "unsloth[flashattention]",
]
cu118-ampere-torch250 = [
    "unsloth[huggingface]",
    "bitsandbytes>=0.45.5,!=0.46.0,!=0.48.0",
    "unsloth[cu118onlytorch250]",
    "unsloth[flashattention]",
]
cu121-ampere-torch250 = [
    "unsloth[huggingface]",
    "bitsandbytes>=0.45.5,!=0.46.0,!=0.48.0",
    "unsloth[cu121onlytorch250]",
    "unsloth[flashattention]",
]
cu124-ampere-torch250 = [
    "unsloth[huggingface]",
    "bitsandbytes>=0.45.5,!=0.46.0,!=0.48.0",
    "unsloth[cu124onlytorch250]",
    "unsloth[flashattention]",
]
cu118-ampere-torch251 = [
    "unsloth[huggingface]",
    "bitsandbytes>=0.45.5,!=0.46.0,!=0.48.0",
    "unsloth[cu118onlytorch251]",
    "unsloth[flashattention]",
]
cu121-ampere-torch251 = [
    "unsloth[huggingface]",
    "bitsandbytes>=0.45.5,!=0.46.0,!=0.48.0",
    "unsloth[cu121onlytorch251]",
    "unsloth[flashattention]",
]
cu124-ampere-torch251 = [
    "unsloth[huggingface]",
    "bitsandbytes>=0.45.5,!=0.46.0,!=0.48.0",
    "unsloth[cu124onlytorch251]",
    "unsloth[flashattention]",
]
cu118-ampere-torch260 = [
    "unsloth[huggingface]",
    "bitsandbytes>=0.45.5,!=0.46.0,!=0.48.0",
    "unsloth[cu118onlytorch260]",
    "unsloth[flashattention]",
]
cu124-ampere-torch260 = [
    "unsloth[huggingface]",
    "bitsandbytes>=0.45.5,!=0.46.0,!=0.48.0",
    "unsloth[cu124onlytorch260]",
    "unsloth[flashattention]",
]
cu126-ampere-torch260 = [
    "unsloth[huggingface]",
    "bitsandbytes>=0.45.5,!=0.46.0,!=0.48.0",
    "unsloth[cu126onlytorch260]",
    "unsloth[flashattention]",
]
cu118-ampere-torch270 = [
    "unsloth[huggingface]",
    "bitsandbytes>=0.45.5,!=0.46.0,!=0.48.0",
    "unsloth[cu118onlytorch270]",
    "unsloth[flashattention]",
]
cu126-ampere-torch270 = [
    "unsloth[huggingface]",
    "bitsandbytes>=0.45.5,!=0.46.0,!=0.48.0",
    "unsloth[cu126onlytorch270]",
    "unsloth[flashattention]",
]
cu128-ampere-torch270 = [
    "unsloth[huggingface]",
    "bitsandbytes>=0.45.5,!=0.46.0,!=0.48.0",
    "unsloth[cu128onlytorch270]",
    "unsloth[flashattention]",
]
cu118-ampere-torch271 = [
    "unsloth[huggingface]",
    "bitsandbytes>=0.45.5,!=0.46.0,!=0.48.0",
    "unsloth[cu118onlytorch271]",
    "unsloth[flashattention]",
]
cu126-ampere-torch271 = [
    "unsloth[huggingface]",
    "bitsandbytes>=0.45.5,!=0.46.0,!=0.48.0",
    "unsloth[cu126onlytorch271]",
    "unsloth[flashattention]",
]
cu128-ampere-torch271 = [
    "unsloth[huggingface]",
    "bitsandbytes>=0.45.5,!=0.46.0,!=0.48.0",
    "unsloth[cu128onlytorch271]",
    "unsloth[flashattention]",
]
cu118-ampere-torch280 = [
    "unsloth[huggingface]",
    "bitsandbytes>=0.45.5,!=0.46.0,!=0.48.0",
    "unsloth[cu118onlytorch280]",
    "unsloth[flashattention]",
]
cu126-ampere-torch280 = [
    "unsloth[huggingface]",
    "bitsandbytes>=0.45.5,!=0.46.0,!=0.48.0",
    "unsloth[cu126onlytorch280]",
    "unsloth[flashattention]",
]
cu128-ampere-torch280 = [
    "unsloth[huggingface]",
    "bitsandbytes>=0.45.5,!=0.46.0,!=0.48.0",
    "unsloth[cu128onlytorch280]",
    "unsloth[flashattention]",
]
cu130-ampere-torch280 = [
    "unsloth[huggingface]",
    "bitsandbytes>=0.45.5,!=0.46.0,!=0.48.0",
    "unsloth[cu130onlytorch280]",
    "unsloth[flashattention]",
]
cu126-ampere-torch290 = [
    "unsloth[huggingface]",
    "bitsandbytes>=0.45.5,!=0.46.0,!=0.48.0",
    "unsloth[cu126onlytorch290]",
]
cu128-ampere-torch290 = [
    "unsloth[huggingface]",
    "bitsandbytes>=0.45.5,!=0.46.0,!=0.48.0",
    "unsloth[cu128onlytorch290]",
]
cu130-ampere-torch290 = [
    "unsloth[huggingface]",
    "bitsandbytes>=0.45.5,!=0.46.0,!=0.48.0",
    "unsloth[cu130onlytorch290]",
]
cu126-ampere-torch291 = [
    "unsloth[huggingface]",
    "bitsandbytes>=0.45.5,!=0.46.0,!=0.48.0",
    "unsloth[cu126onlytorch291]",
]
cu128-ampere-torch291 = [
    "unsloth[huggingface]",
    "bitsandbytes>=0.45.5,!=0.46.0,!=0.48.0",
    "unsloth[cu128onlytorch291]",
]
cu130-ampere-torch291 = [
    "unsloth[huggingface]",
    "bitsandbytes>=0.45.5,!=0.46.0,!=0.48.0",
    "unsloth[cu130onlytorch291]",
]
cu126-ampere-torch2100 = [
    "unsloth[huggingface]",
    "bitsandbytes>=0.45.5,!=0.46.0,!=0.48.0",
    "unsloth[cu126onlytorch2100]",
]
cu128-ampere-torch2100 = [
    "unsloth[huggingface]",
    "bitsandbytes>=0.45.5,!=0.46.0,!=0.48.0",
    "unsloth[cu128onlytorch2100]",
]
cu130-ampere-torch2100 = [
    "unsloth[huggingface]",
    "bitsandbytes>=0.45.5,!=0.46.0,!=0.48.0",
    "unsloth[cu130onlytorch2100]",
]
flashattentiontorch260abiFALSEcu12x = [
    "flash-attn @ https://github.com/Dao-AILab/flash-attention/releases/download/v2.7.4.post1/flash_attn-2.7.4.post1+cu12torch2.6cxx11abiFALSE-cp39-cp39-linux_x86_64.whl ; ('linux' in sys_platform) and python_version == '3.9'",
    "flash-attn @ https://github.com/Dao-AILab/flash-attention/releases/download/v2.7.4.post1/flash_attn-2.7.4.post1+cu12torch2.6cxx11abiFALSE-cp310-cp310-linux_x86_64.whl ; ('linux' in sys_platform) and python_version == '3.10'",
    "flash-attn @ https://github.com/Dao-AILab/flash-attention/releases/download/v2.7.4.post1/flash_attn-2.7.4.post1+cu12torch2.6cxx11abiFALSE-cp311-cp311-linux_x86_64.whl ; ('linux' in sys_platform) and python_version == '3.11'",
    "flash-attn @ https://github.com/Dao-AILab/flash-attention/releases/download/v2.7.4.post1/flash_attn-2.7.4.post1+cu12torch2.6cxx11abiFALSE-cp312-cp312-linux_x86_64.whl ; ('linux' in sys_platform) and python_version == '3.12'",
    "flash-attn @ https://github.com/Dao-AILab/flash-attention/releases/download/v2.7.4.post1/flash_attn-2.7.4.post1+cu12torch2.6cxx11abiFALSE-cp313-cp313-linux_x86_64.whl ; ('linux' in sys_platform) and python_version == '3.13'",
]
flashattentiontorch260abiTRUEcu12x = [
    "flash-attn @ https://github.com/Dao-AILab/flash-attention/releases/download/v2.7.4.post1/flash_attn-2.7.4.post1+cu12torch2.6cxx11abiTRUE-cp39-cp39-linux_x86_64.whl ; ('linux' in sys_platform) and python_version == '3.9'",
    "flash-attn @ https://github.com/Dao-AILab/flash-attention/releases/download/v2.7.4.post1/flash_attn-2.7.4.post1+cu12torch2.6cxx11abiTRUE-cp310-cp310-linux_x86_64.whl ; ('linux' in sys_platform) and python_version == '3.10'",
    "flash-attn @ https://github.com/Dao-AILab/flash-attention/releases/download/v2.7.4.post1/flash_attn-2.7.4.post1+cu12torch2.6cxx11abiTRUE-cp311-cp311-linux_x86_64.whl ; ('linux' in sys_platform) and python_version == '3.11'",
    "flash-attn @ https://github.com/Dao-AILab/flash-attention/releases/download/v2.7.4.post1/flash_attn-2.7.4.post1+cu12torch2.6cxx11abiTRUE-cp312-cp312-linux_x86_64.whl ; ('linux' in sys_platform) and python_version == '3.12'",
    "flash-attn @ https://github.com/Dao-AILab/flash-attention/releases/download/v2.7.4.post1/flash_attn-2.7.4.post1+cu12torch2.6cxx11abiTRUE-cp313-cp313-linux_x86_64.whl ; ('linux' in sys_platform) and python_version == '3.13'",
]
flashattentiontorch250abiFALSEcu12x = [
    "flash-attn @ https://github.com/Dao-AILab/flash-attention/releases/download/v2.7.4.post1/flash_attn-2.7.4.post1+cu12torch2.5cxx11abiFALSE-cp39-cp39-linux_x86_64.whl ; ('linux' in sys_platform) and python_version == '3.9'",
    "flash-attn @ https://github.com/Dao-AILab/flash-attention/releases/download/v2.7.4.post1/flash_attn-2.7.4.post1+cu12torch2.5cxx11abiFALSE-cp310-cp310-linux_x86_64.whl ; ('linux' in sys_platform) and python_version == '3.10'",
    "flash-attn @ https://github.com/Dao-AILab/flash-attention/releases/download/v2.7.4.post1/flash_attn-2.7.4.post1+cu12torch2.5cxx11abiFALSE-cp311-cp311-linux_x86_64.whl ; ('linux' in sys_platform) and python_version == '3.11'",
    "flash-attn @ https://github.com/Dao-AILab/flash-attention/releases/download/v2.7.4.post1/flash_attn-2.7.4.post1+cu12torch2.5cxx11abiFALSE-cp312-cp312-linux_x86_64.whl ; ('linux' in sys_platform) and python_version == '3.12'",
    "flash-attn @ https://github.com/Dao-AILab/flash-attention/releases/download/v2.7.4.post1/flash_attn-2.7.4.post1+cu12torch2.5cxx11abiFALSE-cp313-cp313-linux_x86_64.whl ; ('linux' in sys_platform) and python_version == '3.13'",
]
flashattentiontorch250abiTRUEcu12x = [
    "flash-attn @ https://github.com/Dao-AILab/flash-attention/releases/download/v2.7.4.post1/flash_attn-2.7.4.post1+cu12torch2.5cxx11abiTRUE-cp39-cp39-linux_x86_64.whl ; ('linux' in sys_platform) and python_version == '3.9'",
    "flash-attn @ https://github.com/Dao-AILab/flash-attention/releases/download/v2.7.4.post1/flash_attn-2.7.4.post1+cu12torch2.5cxx11abiTRUE-cp310-cp310-linux_x86_64.whl ; ('linux' in sys_platform) and python_version == '3.10'",
    "flash-attn @ https://github.com/Dao-AILab/flash-attention/releases/download/v2.7.4.post1/flash_attn-2.7.4.post1+cu12torch2.5cxx11abiTRUE-cp311-cp311-linux_x86_64.whl ; ('linux' in sys_platform) and python_version == '3.11'",
    "flash-attn @ https://github.com/Dao-AILab/flash-attention/releases/download/v2.7.4.post1/flash_attn-2.7.4.post1+cu12torch2.5cxx11abiTRUE-cp312-cp312-linux_x86_64.whl ; ('linux' in sys_platform) and python_version == '3.12'",
    "flash-attn @ https://github.com/Dao-AILab/flash-attention/releases/download/v2.7.4.post1/flash_attn-2.7.4.post1+cu12torch2.5cxx11abiTRUE-cp313-cp313-linux_x86_64.whl ; ('linux' in sys_platform) and python_version == '3.13'",
]
flashattentiontorch240abiFALSEcu12x = [
    "flash-attn @ https://github.com/Dao-AILab/flash-attention/releases/download/v2.7.4.post1/flash_attn-2.7.4.post1+cu12torch2.4cxx11abiFALSE-cp39-cp39-linux_x86_64.whl ; ('linux' in sys_platform) and python_version == '3.9'",
    "flash-attn @ https://github.com/Dao-AILab/flash-attention/releases/download/v2.7.4.post1/flash_attn-2.7.4.post1+cu12torch2.4cxx11abiFALSE-cp310-cp310-linux_x86_64.whl ; ('linux' in sys_platform) and python_version == '3.10'",
    "flash-attn @ https://github.com/Dao-AILab/flash-attention/releases/download/v2.7.4.post1/flash_attn-2.7.4.post1+cu12torch2.4cxx11abiFALSE-cp311-cp311-linux_x86_64.whl ; ('linux' in sys_platform) and python_version == '3.11'",
    "flash-attn @ https://github.com/Dao-AILab/flash-attention/releases/download/v2.7.4.post1/flash_attn-2.7.4.post1+cu12torch2.4cxx11abiFALSE-cp312-cp312-linux_x86_64.whl ; ('linux' in sys_platform) and python_version == '3.12'",
    "flash-attn @ https://github.com/Dao-AILab/flash-attention/releases/download/v2.7.4.post1/flash_attn-2.7.4.post1+cu12torch2.4cxx11abiFALSE-cp313-cp313-linux_x86_64.whl ; ('linux' in sys_platform) and python_version == '3.13'",
]
flashattentiontorch240abiTRUEcu12x = [
    "flash-attn @ https://github.com/Dao-AILab/flash-attention/releases/download/v2.7.4.post1/flash_attn-2.7.4.post1+cu12torch2.4cxx11abiTRUE-cp39-cp39-linux_x86_64.whl ; ('linux' in sys_platform) and python_version == '3.9'",
    "flash-attn @ https://github.com/Dao-AILab/flash-attention/releases/download/v2.7.4.post1/flash_attn-2.7.4.post1+cu12torch2.4cxx11abiTRUE-cp310-cp310-linux_x86_64.whl ; ('linux' in sys_platform) and python_version == '3.10'",
    "flash-attn @ https://github.com/Dao-AILab/flash-attention/releases/download/v2.7.4.post1/flash_attn-2.7.4.post1+cu12torch2.4cxx11abiTRUE-cp311-cp311-linux_x86_64.whl ; ('linux' in sys_platform) and python_version == '3.11'",
    "flash-attn @ https://github.com/Dao-AILab/flash-attention/releases/download/v2.7.4.post1/flash_attn-2.7.4.post1+cu12torch2.4cxx11abiTRUE-cp312-cp312-linux_x86_64.whl ; ('linux' in sys_platform) and python_version == '3.12'",
    "flash-attn @ https://github.com/Dao-AILab/flash-attention/releases/download/v2.7.4.post1/flash_attn-2.7.4.post1+cu12torch2.4cxx11abiTRUE-cp313-cp313-linux_x86_64.whl ; ('linux' in sys_platform) and python_version == '3.13'",
]
intelgputorch260 = [
    "unsloth_zoo[intelgpu]",
    "unsloth[huggingfacenotorch]",

    "pytorch_triton_xpu @ https://download.pytorch.org/whl/pytorch_triton_xpu-3.2.0-cp39-cp39-linux_x86_64.whl#sha256=147607f190a7d7aa24ba454def5977fbbfec792fdae18e4ed278cfec29b69271 ; ('linux' in sys_platform) and python_version == '3.9' and (platform_machine == 'AMD64' or platform_machine == 'x86_64')",
    "pytorch_triton_xpu @ https://download.pytorch.org/whl/pytorch_triton_xpu-3.2.0-cp310-cp310-linux_x86_64.whl#sha256=23aa423fa1542afc34f67eb3ba8ef20060f6d1b3a4697eaeab22b11c92b30f2b ; ('linux' in sys_platform) and python_version == '3.10' and (platform_machine == 'AMD64' or platform_machine == 'x86_64')",
    "pytorch_triton_xpu @ https://download.pytorch.org/whl/pytorch_triton_xpu-3.2.0-cp311-cp311-linux_x86_64.whl#sha256=bcfa995229bbfd9ffd8d6c8d9f6428d393e876fa6e23ee3c20e3c0d73ca75ca5 ; ('linux' in sys_platform) and python_version == '3.11' and (platform_machine == 'AMD64' or platform_machine == 'x86_64')",
    "pytorch_triton_xpu @ https://download.pytorch.org/whl/pytorch_triton_xpu-3.2.0-cp312-cp312-linux_x86_64.whl#sha256=bd340903d03470708df3442438acb8b7e08087ab9e61fbe349b2872bf9257ab0 ; ('linux' in sys_platform) and python_version == '3.12' and (platform_machine == 'AMD64' or platform_machine == 'x86_64')",
    "pytorch_triton_xpu @ https://download.pytorch.org/whl/pytorch_triton_xpu-3.2.0-cp313-cp313-linux_x86_64.whl#sha256=814dccc8a07159e6eca74bed70091bc8fea2d9dd87b0d91845f9f38cde62f01c ; ('linux' in sys_platform) and python_version == '3.13' and (platform_machine == 'AMD64' or platform_machine == 'x86_64')",

    "bitsandbytes @ https://github.com/bitsandbytes-foundation/bitsandbytes/releases/download/continuous-release_main/bitsandbytes-1.33.7.preview-py3-none-manylinux_2_24_x86_64.whl ; ('linux' in sys_platform) and (platform_machine == 'AMD64' or platform_machine == 'x86_64')",
    "bitsandbytes @ https://github.com/bitsandbytes-foundation/bitsandbytes/releases/download/continuous-release_main/bitsandbytes-1.33.7.preview-py3-none-win_amd64.whl ; (sys_platform == 'win32') and (platform_machine == 'AMD64' or platform_machine == 'x86_64')",

    "torch @ https://download.pytorch.org/whl/xpu/torch-2.6.0%2Bxpu-cp39-cp39-linux_x86_64.whl#sha256=6a8adf6dc4c089406e8b3a7e58ab57a463bddf9b07130d2576e76eced43e92af ; ('linux' in sys_platform) and python_version == '3.9' and (platform_machine == 'AMD64' or platform_machine == 'x86_64')",
    "torch @ https://download.pytorch.org/whl/xpu/torch-2.6.0%2Bxpu-cp310-cp310-linux_x86_64.whl#sha256=ff4561cbf07c83bbccaa0f6e9bb0e6dcf721bacd53c9c43c4eb0e7331b4792f9 ; ('linux' in sys_platform) and python_version == '3.10' and (platform_machine == 'AMD64' or platform_machine == 'x86_64')",
    "torch @ https://download.pytorch.org/whl/xpu/torch-2.6.0%2Bxpu-cp311-cp311-linux_x86_64.whl#sha256=12005f66b810ddd3ab93f86c4522bcfdd412cbd27fc9d189b661ff7509bc5e8a ; ('linux' in sys_platform) and python_version == '3.11' and (platform_machine == 'AMD64' or platform_machine == 'x86_64')",
    "torch @ https://download.pytorch.org/whl/xpu/torch-2.6.0%2Bxpu-cp312-cp312-linux_x86_64.whl#sha256=c4c5c67625cdacf35765c2b94e61fe166e3c3f4a14521b1212a59ad1b3eb0f2e ; ('linux' in sys_platform) and python_version == '3.12' and (platform_machine == 'AMD64' or platform_machine == 'x86_64')",
    "torch @ https://download.pytorch.org/whl/xpu/torch-2.6.0%2Bxpu-cp313-cp313-linux_x86_64.whl#sha256=e6864f7a60a5ecc43d5d38f59a16e5dd132384f73dfd3a697f74944026038f7b ; ('linux' in sys_platform) and python_version == '3.13' and (platform_machine == 'AMD64' or platform_machine == 'x86_64')",
]
intel-gpu-torch260 = [
    "unsloth[intelgputorch260]"
]
intelgputorch270 = [
    "unsloth_zoo[intelgpu]",
    "unsloth[huggingfacenotorch]",

    "pytorch_triton_xpu @ https://download.pytorch.org/whl/pytorch_triton_xpu-3.3.0-cp39-cp39-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl#sha256=749a7098492c6a27b356c97149a4a62973b953eae60bc1b6259260974f344913 ; ('linux' in sys_platform) and python_version == '3.9' and (platform_machine == 'AMD64' or platform_machine == 'x86_64')",
    "pytorch_triton_xpu @ https://download.pytorch.org/whl/pytorch_triton_xpu-3.3.0-cp310-cp310-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl#sha256=44362e80abd752471a08341093321955b066daa2cfb4810e73b8e3b240850f93 ; ('linux' in sys_platform) and python_version == '3.10' and (platform_machine == 'AMD64' or platform_machine == 'x86_64')",
    "pytorch_triton_xpu @ https://download.pytorch.org/whl/pytorch_triton_xpu-3.3.0-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl#sha256=faa6b8c945a837a080f641bc8ccc77a98fa66980dcd7e62e715fd853737343fd ; ('linux' in sys_platform) and python_version == '3.11' and (platform_machine == 'AMD64' or platform_machine == 'x86_64')",
    "pytorch_triton_xpu @ https://download.pytorch.org/whl/pytorch_triton_xpu-3.3.0-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl#sha256=40f6fb65b345dc9a61813abe7ac9a585f2c9808f414d140cc2a5f11f53ee063c ; ('linux' in sys_platform) and python_version == '3.12' and (platform_machine == 'AMD64' or platform_machine == 'x86_64')",
    "pytorch_triton_xpu @ https://download.pytorch.org/whl/pytorch_triton_xpu-3.3.0-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl#sha256=b22b4c02ec71b4bfc862ae3cdfd2871dc0b05d2b1802f5db2196e0f897d581e9 ; ('linux' in sys_platform) and python_version == '3.13' and (platform_machine == 'AMD64' or platform_machine == 'x86_64')",
    "pytorch_triton_xpu @ https://download.pytorch.org/whl/pytorch_triton_xpu-3.3.0-cp39-cp39-win_amd64.whl#sha256=d4b738d7fa5100c1bd766f91614962828a4810eb57b4df92cd5214a83505a752 ; sys_platform == 'win32' and python_version == '3.9' and (platform_machine == 'AMD64' or platform_machine == 'x86_64')",
    "pytorch_triton_xpu @ https://download.pytorch.org/whl/pytorch_triton_xpu-3.3.0-cp310-cp310-win_amd64.whl#sha256=143fe8a64d807bcdb7d81bbc062816add325570aa160448454ab6ded4a0a17a1 ; sys_platform == 'win32' and python_version == '3.10' and (platform_machine == 'AMD64' or platform_machine == 'x86_64')",
    "pytorch_triton_xpu @ https://download.pytorch.org/whl/pytorch_triton_xpu-3.3.0-cp311-cp311-win_amd64.whl#sha256=a8025459ff325d6e3532eb5cf72519db1b178155e7d60aff6c56beb5968fc758 ; sys_platform == 'win32' and python_version == '3.11' and (platform_machine == 'AMD64' or platform_machine == 'x86_64')",
    "pytorch_triton_xpu @ https://download.pytorch.org/whl/pytorch_triton_xpu-3.3.0-cp312-cp312-win_amd64.whl#sha256=0dd07e6d5b872e42e48f5ee140e609d4554ca3cc509d5bf509ac232267cf358e ; sys_platform == 'win32' and python_version == '3.12' and (platform_machine == 'AMD64' or platform_machine == 'x86_64')",
    "pytorch_triton_xpu @ https://download.pytorch.org/whl/pytorch_triton_xpu-3.3.0-cp313-cp313-win_amd64.whl#sha256=a936a18182d8e065a9933afc9a3ebbffadd38604969f87c493831214539fc027 ; sys_platform == 'win32' and python_version == '3.13' and (platform_machine == 'AMD64' or platform_machine == 'x86_64')",

    "bitsandbytes @ https://github.com/bitsandbytes-foundation/bitsandbytes/releases/download/continuous-release_main/bitsandbytes-1.33.7.preview-py3-none-manylinux_2_24_x86_64.whl ; ('linux' in sys_platform) and (platform_machine == 'AMD64' or platform_machine == 'x86_64')",
    "bitsandbytes @ https://github.com/bitsandbytes-foundation/bitsandbytes/releases/download/continuous-release_main/bitsandbytes-1.33.7.preview-py3-none-win_amd64.whl ; (sys_platform == 'win32') and (platform_machine == 'AMD64' or platform_machine == 'x86_64')",

    "torch @ https://download.pytorch.org/whl/xpu/torch-2.7.0%2Bxpu-cp39-cp39-linux_x86_64.whl#sha256=f8ee75e50fcbb37ed5b498299ca2264da99ab278a93fae2358e921e4a6e28273 ; ('linux' in sys_platform) and python_version == '3.9' and (platform_machine == 'AMD64' or platform_machine == 'x86_64')",
    "torch @ https://download.pytorch.org/whl/xpu/torch-2.7.0%2Bxpu-cp310-cp310-linux_x86_64.whl#sha256=d6fdc342961d98fdcd9d03dfd491a3208bb5f7fbb435841f8f72ce9fdcd2d026 ; ('linux' in sys_platform) and python_version == '3.10' and (platform_machine == 'AMD64' or platform_machine == 'x86_64')",
    "torch @ https://download.pytorch.org/whl/xpu/torch-2.7.0%2Bxpu-cp311-cp311-linux_x86_64.whl#sha256=74d07f9357df5cf2bf223ad3c84de16346bfaa0504f988fdd5590d3e177e5e86 ; ('linux' in sys_platform) and python_version == '3.11' and (platform_machine == 'AMD64' or platform_machine == 'x86_64')",
    "torch @ https://download.pytorch.org/whl/xpu/torch-2.7.0%2Bxpu-cp312-cp312-linux_x86_64.whl#sha256=c806d44aa2ca5d225629f6fbc6c994d5deaac2d2cde449195bc8e3522ddd219a ; ('linux' in sys_platform) and python_version == '3.12' and (platform_machine == 'AMD64' or platform_machine == 'x86_64')",
    "torch @ https://download.pytorch.org/whl/xpu/torch-2.7.0%2Bxpu-cp313-cp313-linux_x86_64.whl#sha256=25d8277b7f01d42e2e014ccbab57a2692b6ec4eff8dcf894eda1b297407cf97a ; ('linux' in sys_platform) and python_version == '3.13' and (platform_machine == 'AMD64' or platform_machine == 'x86_64')",
    "torch @ https://download.pytorch.org/whl/xpu/torch-2.7.0%2Bxpu-cp39-cp39-win_amd64.whl#sha256=046e85125266ae69c1a0d083e6c092f947ab4b6b41532c16bafe40dbced845df ; sys_platform == 'win32' and python_version == '3.9' and (platform_machine == 'AMD64' or platform_machine == 'x86_64')",
    "torch @ https://download.pytorch.org/whl/xpu/torch-2.7.0%2Bxpu-cp310-cp310-win_amd64.whl#sha256=9ebaeffb82b0b3e39b6030927d3ebe0eb62a0e9045a3b2d7b0a9e7b15222c0db ; sys_platform == 'win32' and python_version == '3.10' and (platform_machine == 'AMD64' or platform_machine == 'x86_64')",
    "torch @ https://download.pytorch.org/whl/xpu/torch-2.7.0%2Bxpu-cp311-cp311-win_amd64.whl#sha256=356ba66cee127e7e2c942880bd50e03768306a4ea08d358a0f29c6eebfc4bc81 ; sys_platform == 'win32' and python_version == '3.11' and (platform_machine == 'AMD64' or platform_machine == 'x86_64')",
    "torch @ https://download.pytorch.org/whl/xpu/torch-2.7.0%2Bxpu-cp312-cp312-win_amd64.whl#sha256=94739e665d9b4d5cd7af5f517cb6103f6f9fb421c095184609653a24524040f5 ; sys_platform == 'win32' and python_version == '3.12' and (platform_machine == 'AMD64' or platform_machine == 'x86_64')",
    "torch @ https://download.pytorch.org/whl/xpu/torch-2.7.0%2Bxpu-cp313-cp313-win_amd64.whl#sha256=31df3cb674918e89bc8c532baa331dc84f4430e1f9c0ec379232db44cba78355 ; sys_platform == 'win32' and python_version == '3.13' and (platform_machine == 'AMD64' or platform_machine == 'x86_64')",
]
intel-gpu-torch270 = [
    "unsloth[intelgputorch270]"
]
intelgputorch280 = [
    "unsloth_zoo[intelgpu]",
    "unsloth[huggingfacenotorch]",

    "pytorch_triton_xpu @ https://download.pytorch.org/whl/pytorch_triton_xpu-3.4.0-cp39-cp39-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl#sha256=ac4d8e33986b1c3c5e48151640539272b2187e83016985853111b46fb82c3c94 ; 'linux' in sys_platform and python_version == '3.9' and (platform_machine == 'AMD64' or platform_machine == 'x86_64')",
    "pytorch_triton_xpu @ https://download.pytorch.org/whl/pytorch_triton_xpu-3.4.0-cp310-cp310-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl#sha256=999fef4c1f711092b9d3086525920545df490de476ecebe899ffc777019ae17f ; 'linux' in sys_platform and python_version == '3.10' and (platform_machine == 'AMD64' or platform_machine == 'x86_64')",
    "pytorch_triton_xpu @ https://download.pytorch.org/whl/pytorch_triton_xpu-3.4.0-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl#sha256=57b09c8c492985ff6a27cd3a22b08e8f7b96b407bd8030967b6efbb9f63b80cf ; 'linux' in sys_platform and python_version == '3.11' and (platform_machine == 'AMD64' or platform_machine == 'x86_64')",
    "pytorch_triton_xpu @ https://download.pytorch.org/whl/pytorch_triton_xpu-3.4.0-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl#sha256=df4bb3282bac9a3b90231700077110d8680b338416de03c2b7c6133c9b602649 ; 'linux' in sys_platform and python_version == '3.12' and (platform_machine == 'AMD64' or platform_machine == 'x86_64')",
    "pytorch_triton_xpu @ https://download.pytorch.org/whl/pytorch_triton_xpu-3.4.0-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl#sha256=60da63c99ca827bdcb0df28e0298bf7d066dc607454c6d6176783cb4e79d838b ; 'linux' in sys_platform and python_version == '3.13' and (platform_machine == 'AMD64' or platform_machine == 'x86_64')",
    "pytorch_triton_xpu @ https://download.pytorch.org/whl/pytorch_triton_xpu-3.4.0-cp39-cp39-win_amd64.whl#sha256=64aea8de349f3e2e0ebf4c24b011a8122531fdffda5776edaef45829cc241cf8 ; sys_platform == 'win32' and python_version == '3.9' and (platform_machine == 'AMD64' or platform_machine == 'x86_64')",
    "pytorch_triton_xpu @ https://download.pytorch.org/whl/pytorch_triton_xpu-3.4.0-cp310-cp310-win_amd64.whl#sha256=ae573d255b257fdbed319a3440dc9d0a721e31160ab7f6eba1b2226e6a409a1d ; sys_platform == 'win32' and python_version == '3.10' and (platform_machine == 'AMD64' or platform_machine == 'x86_64')",
    "pytorch_triton_xpu @ https://download.pytorch.org/whl/pytorch_triton_xpu-3.4.0-cp311-cp311-win_amd64.whl#sha256=8e0ea4558e5776d8ddab0264310be9b26aee5641bcac0da023537556d4317b86 ; sys_platform == 'win32' and python_version == '3.11' and (platform_machine == 'AMD64' or platform_machine == 'x86_64')",
    "pytorch_triton_xpu @ https://download.pytorch.org/whl/pytorch_triton_xpu-3.4.0-cp312-cp312-win_amd64.whl#sha256=4090dde07a4fffc34aaf855701a9db28e9fccb57b368ade520f1a0f8e811c878 ; sys_platform == 'win32' and python_version == '3.12' and (platform_machine == 'AMD64' or platform_machine == 'x86_64')",
    "pytorch_triton_xpu @ https://download.pytorch.org/whl/pytorch_triton_xpu-3.4.0-cp313-cp313-win_amd64.whl#sha256=a33d0888f3c8df028a2d028842715837d0049524d6c06b9bb11869890a13601a ; sys_platform == 'win32' and python_version == '3.13' and (platform_machine == 'AMD64' or platform_machine == 'x86_64')",

    "torch @ https://download.pytorch.org/whl/xpu/torch-2.8.0%2Bxpu-cp39-cp39-linux_x86_64.whl ; 'linux' in sys_platform and python_version == '3.9' and (platform_machine == 'AMD64' or platform_machine == 'x86_64')",
    "torch @ https://download.pytorch.org/whl/xpu/torch-2.8.0%2Bxpu-cp310-cp310-linux_x86_64.whl ; 'linux' in sys_platform and python_version == '3.10' and (platform_machine == 'AMD64' or platform_machine == 'x86_64')",
    "torch @ https://download.pytorch.org/whl/xpu/torch-2.8.0%2Bxpu-cp311-cp311-linux_x86_64.whl ; 'linux' in sys_platform and python_version == '3.11' and (platform_machine == 'AMD64' or platform_machine == 'x86_64')",
    "torch @ https://download.pytorch.org/whl/xpu/torch-2.8.0%2Bxpu-cp312-cp312-linux_x86_64.whl ; 'linux' in sys_platform and python_version == '3.12' and (platform_machine == 'AMD64' or platform_machine == 'x86_64')",
    "torch @ https://download.pytorch.org/whl/xpu/torch-2.8.0%2Bxpu-cp313-cp313-linux_x86_64.whl ; 'linux' in sys_platform and python_version == '3.13' and (platform_machine == 'AMD64' or platform_machine == 'x86_64')",
    "torch @ https://download.pytorch.org/whl/xpu/torch-2.8.0%2Bxpu-cp39-cp39-win_amd64.whl#sha256=f2f401276892428e4875cf1d8717c5cbab704b16fc594ccf23795e7b16549a99 ; sys_platform == 'win32' and python_version == '3.9' and (platform_machine == 'AMD64' or platform_machine == 'x86_64')",
    "torch @ https://download.pytorch.org/whl/xpu/torch-2.8.0%2Bxpu-cp310-cp310-win_amd64.whl#sha256=125c60cd59d51b39581a7e9afcd4679bc3a6b8c1f9440b1bb502a23fdd60571e ; sys_platform == 'win32' and python_version == '3.10' and (platform_machine == 'AMD64' or platform_machine == 'x86_64')",
    "torch @ https://download.pytorch.org/whl/xpu/torch-2.8.0%2Bxpu-cp311-cp311-win_amd64.whl#sha256=47f1a57258cd460e80b38b2ed6744e31587ab77a96b4215bf59546cb4bab5cc0 ; sys_platform == 'win32' and python_version == '3.11' and (platform_machine == 'AMD64' or platform_machine == 'x86_64')",
    "torch @ https://download.pytorch.org/whl/xpu/torch-2.8.0%2Bxpu-cp312-cp312-win_amd64.whl#sha256=0937d8943c145a83d9bafc6f80ef28971167817f9eda26066d33f72caf8a6646 ; sys_platform == 'win32' and python_version == '3.12' and (platform_machine == 'AMD64' or platform_machine == 'x86_64')",
    "torch @ https://download.pytorch.org/whl/xpu/torch-2.8.0%2Bxpu-cp313-cp313-win_amd64.whl#sha256=e034aab1d71760dc80a731531be43673ffe15e99033b82d24e40d2e6d41bd8bf ; sys_platform == 'win32' and python_version == '3.13' and (platform_machine == 'AMD64' or platform_machine == 'x86_64')",

    "bitsandbytes @ https://github.com/bitsandbytes-foundation/bitsandbytes/releases/download/continuous-release_main/bitsandbytes-1.33.7.preview-py3-none-manylinux_2_24_x86_64.whl ; ('linux' in sys_platform) and (platform_machine == 'AMD64' or platform_machine == 'x86_64')",
    "bitsandbytes @ https://github.com/bitsandbytes-foundation/bitsandbytes/releases/download/continuous-release_main/bitsandbytes-1.33.7.preview-py3-none-win_amd64.whl ; (sys_platform == 'win32') and (platform_machine == 'AMD64' or platform_machine == 'x86_64')",

    "torchvision @ https://download.pytorch.org/whl/xpu/torchvision-0.23.0%2Bxpu-cp39-cp39-manylinux_2_28_x86_64.whl#sha256=6e981c192045fc249c008441179ff237bb00174d818b875b0475730b63f0eaca ; 'linux' in sys_platform and python_version == '3.9' and (platform_machine == 'AMD64' or platform_machine == 'x86_64')",
    "torchvision @ https://download.pytorch.org/whl/xpu/torchvision-0.23.0%2Bxpu-cp310-cp310-manylinux_2_28_x86_64.whl#sha256=e5ba4805969277175ebfd59cc717093528cc6e3ada89ac2725fc7a3c1fee6169 ; 'linux' in sys_platform and python_version == '3.10' and (platform_machine == 'AMD64' or platform_machine == 'x86_64')",
    "torchvision @ https://download.pytorch.org/whl/xpu/torchvision-0.23.0%2Bxpu-cp311-cp311-manylinux_2_28_x86_64.whl#sha256=74c39c144104416bc4c5ad8c26ab0c169dc5cc6be58059e01bc3665dd0ef676f ; 'linux' in sys_platform and python_version == '3.11' and (platform_machine == 'AMD64' or platform_machine == 'x86_64')",
    "torchvision @ https://download.pytorch.org/whl/xpu/torchvision-0.23.0%2Bxpu-cp312-cp312-manylinux_2_28_x86_64.whl#sha256=0acec355b80c3899841184084f365df336c508602812e34a44007b8b60d53af4 ; 'linux' in sys_platform and python_version == '3.12' and (platform_machine == 'AMD64' or platform_machine == 'x86_64')",
    "torchvision @ https://download.pytorch.org/whl/xpu/torchvision-0.23.0%2Bxpu-cp313-cp313-manylinux_2_28_x86_64.whl#sha256=e2109ae773dad27b98ca17681044b4f876563c37f2382b75de3a371399edcff8 ; 'linux' in sys_platform and python_version == '3.13' and (platform_machine == 'AMD64' or platform_machine == 'x86_64')",
    "torchvision @ https://download.pytorch.org/whl/xpu/torchvision-0.23.0%2Bxpu-cp39-cp39-win_amd64.whl#sha256=5f7904e7048d414379bc8c1167260f1e84204f105db2d0a2f9c89e87ce1cf205 ; sys_platform == 'win32' and python_version == '3.9' and (platform_machine == 'AMD64' or platform_machine == 'x86_64')",
    "torchvision @ https://download.pytorch.org/whl/xpu/torchvision-0.23.0%2Bxpu-cp310-cp310-win_amd64.whl#sha256=005fca5e658ca8e37adb63c1a021c84f5e56dfa6cf0d601d89cfe40b9473f79f ; sys_platform == 'win32' and python_version == '3.10' and (platform_machine == 'AMD64' or platform_machine == 'x86_64')",
    "torchvision @ https://download.pytorch.org/whl/xpu/torchvision-0.23.0%2Bxpu-cp311-cp311-win_amd64.whl#sha256=c6d030f5361461550c0ff1339b5bca8585fc1e84fda2e64b6184e65a581e4f98 ; sys_platform == 'win32' and python_version == '3.11' and (platform_machine == 'AMD64' or platform_machine == 'x86_64')",
    "torchvision @ https://download.pytorch.org/whl/xpu/torchvision-0.23.0%2Bxpu-cp312-cp312-win_amd64.whl#sha256=91aafd61864cdce27461cbec13ddbf28c1bc6494265a1e4b80131c64a3b7d18f ; sys_platform == 'win32' and python_version == '3.12' and (platform_machine == 'AMD64' or platform_machine == 'x86_64')",
    "torchvision @ https://download.pytorch.org/whl/xpu/torchvision-0.23.0%2Bxpu-cp313-cp313-win_amd64.whl#sha256=71dc4a6421742ed1e7f585b04a100ad53615c341fbccfbc255aefb38ea9091da ; sys_platform == 'win32' and python_version == '3.13' and (platform_machine == 'AMD64' or platform_machine == 'x86_64')",
]
intel-gpu-torch280 = [
    "unsloth[intelgputorch280]"
]
intelgputorch290 = [
    "unsloth_zoo[intelgpu]",
    "unsloth[huggingfacenotorch]",

    "pytorch_triton_xpu @ https://download.pytorch.org/whl/pytorch_triton_xpu-3.5.0-cp310-cp310-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl#sha256=c169a1de14c19673b17c751290d467fa282fc90fa5da4314b2e5cdab1f553146 ; platform_system == 'Linux' and python_version == '3.10' and platform_machine == 'x86_64'",
    "pytorch_triton_xpu @ https://download.pytorch.org/whl/pytorch_triton_xpu-3.5.0-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl#sha256=013d9dd5d6479bd22983161f462e61c8dbe1d82e6730624a7a8d5945507eaa61 ; platform_system == 'Linux' and python_version == '3.11' and platform_machine == 'x86_64'",
    "pytorch_triton_xpu @ https://download.pytorch.org/whl/pytorch_triton_xpu-3.5.0-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl#sha256=afc8cabfbf7ed51fd278d1e0f88d6afc157b0201bad4b99d681e4d542f9e66d4 ; platform_system == 'Linux' and python_version == '3.12' and platform_machine == 'x86_64'",
    "pytorch_triton_xpu @ https://download.pytorch.org/whl/pytorch_triton_xpu-3.5.0-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl#sha256=0d24c1716088f2764d0d24c64227732195b6a42706c3c5fc89eeb4904bfa0818 ; platform_system == 'Linux' and python_version == '3.13' and platform_machine == 'x86_64'",
    "pytorch_triton_xpu @ https://download.pytorch.org/whl/pytorch_triton_xpu-3.5.0-cp310-cp310-win_amd64.whl#sha256=c83ab007311d9cfb6e809ee5a4587d99a9eef4be720b90da4f1aaa68b45139a0 ; sys_platform == 'win32' and python_version == '3.10' and (platform_machine == 'AMD64' or platform_machine == 'x86_64')",
    "pytorch_triton_xpu @ https://download.pytorch.org/whl/pytorch_triton_xpu-3.5.0-cp311-cp311-win_amd64.whl#sha256=debf75348da8e8c7166b4d4a9b91d1508bb8d6581e339f79f7604b2e6746bacd ; sys_platform == 'win32' and python_version == '3.11' and (platform_machine == 'AMD64' or platform_machine == 'x86_64')",
    "pytorch_triton_xpu @ https://download.pytorch.org/whl/pytorch_triton_xpu-3.5.0-cp312-cp312-win_amd64.whl#sha256=97337a47425f1963a723475bd61037460e84ba01db4f87a1d662c3718ff6c47e ; sys_platform == 'win32' and python_version == '3.12' and (platform_machine == 'AMD64' or platform_machine == 'x86_64')",
    "pytorch_triton_xpu @ https://download.pytorch.org/whl/pytorch_triton_xpu-3.5.0-cp313-cp313-win_amd64.whl#sha256=2caf8138695f6abb023ecd02031a2611ba1bf8fff2f19802567cb2fadefe9e87 ; sys_platform == 'win32' and python_version == '3.13' and (platform_machine == 'AMD64' or platform_machine == 'x86_64')",

    "torch @ https://download.pytorch.org/whl/xpu/torch-2.9.0%2Bxpu-cp310-cp310-linux_x86_64.whl#sha256=5afbe860ce991825a36b75706a523601087e414b77598ef0d9d3d565741c277d ; platform_system == 'Linux' and python_version == '3.10' and platform_machine == 'x86_64'",
    "torch @ https://download.pytorch.org/whl/xpu/torch-2.9.0%2Bxpu-cp311-cp311-linux_x86_64.whl#sha256=607fe419c32d6e8e0556f745742e7cff1d0babce51f54be890e0c1422359c442 ; platform_system == 'Linux' and python_version == '3.11' and platform_machine == 'x86_64'",
    "torch @ https://download.pytorch.org/whl/xpu/torch-2.9.0%2Bxpu-cp312-cp312-linux_x86_64.whl#sha256=376bae584d89980b8e59934d248c38d5fa3b7d4687a4df1a19f4bc1d23dcc8c1 ; platform_system == 'Linux' and python_version == '3.12' and platform_machine == 'x86_64'",
    "torch @ https://download.pytorch.org/whl/xpu/torch-2.9.0%2Bxpu-cp313-cp313-linux_x86_64.whl#sha256=98d6a06dd7fb185874367b18bd609f05f16fdce4142a5980ca94461949965cd2 ; platform_system == 'Linux' and python_version == '3.13' and platform_machine == 'x86_64'",
    "torch @ https://download.pytorch.org/whl/xpu/torch-2.9.0%2Bxpu-cp310-cp310-win_amd64.whl#sha256=47cc68f631f65bd9c84924d052cd04dec7531023caa85e80345e9c94611c887d ; sys_platform == 'win32' and python_version == '3.10' and (platform_machine == 'AMD64' or platform_machine == 'x86_64')",
    "torch @ https://download.pytorch.org/whl/xpu/torch-2.9.0%2Bxpu-cp311-cp311-win_amd64.whl#sha256=d56c44ab4818aba57e5c7b628f422d014e0d507427170a771c5be85e308b0bc6 ; sys_platform == 'win32' and python_version == '3.11' and (platform_machine == 'AMD64' or platform_machine == 'x86_64')",
    "torch @ https://download.pytorch.org/whl/xpu/torch-2.9.0%2Bxpu-cp312-cp312-win_amd64.whl#sha256=18cad93aaff76a01ce73aef6935ece7cfc03344b905592ec731446c44d44592b ; sys_platform == 'win32' and python_version == '3.12' and (platform_machine == 'AMD64' or platform_machine == 'x86_64')",
    "torch @ https://download.pytorch.org/whl/xpu/torch-2.9.0%2Bxpu-cp313-cp313-win_amd64.whl#sha256=579929cdc10a76800ead41289cac191ea36d1b16f5f501d3fc25607d4375cd83 ; sys_platform == 'win32' and python_version == '3.13' and (platform_machine == 'AMD64' or platform_machine == 'x86_64')",

    "bitsandbytes @ https://github.com/bitsandbytes-foundation/bitsandbytes/releases/download/continuous-release_main/bitsandbytes-1.33.7.preview-py3-none-manylinux_2_24_x86_64.whl ; ('linux' in sys_platform) and (platform_machine == 'AMD64' or platform_machine == 'x86_64')",
    "bitsandbytes @ https://github.com/bitsandbytes-foundation/bitsandbytes/releases/download/continuous-release_main/bitsandbytes-1.33.7.preview-py3-none-win_amd64.whl ; (sys_platform == 'win32') and (platform_machine == 'AMD64' or platform_machine == 'x86_64')",

    "torchvision @ https://download.pytorch.org/whl/xpu/torchvision-0.24.0%2Bxpu-cp310-cp310-manylinux_2_28_x86_64.whl#sha256=cbfae2b79b7549fd368c2462fc8e94f8f26cc450782ee72138e908077c09a519 ; platform_system == 'Linux' and python_version == '3.10' and platform_machine == 'x86_64'",
    "torchvision @ https://download.pytorch.org/whl/xpu/torchvision-0.24.0%2Bxpu-cp311-cp311-manylinux_2_28_x86_64.whl#sha256=044fa36ef4b6b43edcd490b75c853fa4b3eb033c2bded29f8fbcf27734713c67 ; platform_system == 'Linux' and python_version == '3.11' and platform_machine == 'x86_64'",
    "torchvision @ https://download.pytorch.org/whl/xpu/torchvision-0.24.0%2Bxpu-cp312-cp312-manylinux_2_28_x86_64.whl#sha256=4b91e4bec1d740a6211f02578a79888550b73f3a4e1383035f8f6d72f587212c ; platform_system == 'Linux' and python_version == '3.12' and platform_machine == 'x86_64'",
    "torchvision @ https://download.pytorch.org/whl/xpu/torchvision-0.24.0%2Bxpu-cp313-cp313-manylinux_2_28_x86_64.whl#sha256=88239e73ca37254bec84f29cd5887e10ff712de7edbbda3fbb3609cd6190d99e ; platform_system == 'Linux' and python_version == '3.13' and platform_machine == 'x86_64'",
    "torchvision @ https://download.pytorch.org/whl/xpu/torchvision-0.24.0%2Bxpu-cp310-cp310-win_amd64.whl#sha256=19c7da8ca767d593e13a88a12bb08d06e34a673f6f26c2f9c191d60e81c02953 ; sys_platform == 'win32' and python_version == '3.10' and (platform_machine == 'AMD64' or platform_machine == 'x86_64')",
    "torchvision @ https://download.pytorch.org/whl/xpu/torchvision-0.24.0%2Bxpu-cp311-cp311-win_amd64.whl#sha256=9bb0d1421c544ac8e2eca5b47daacaf54706dc9139c003aa5e77ee5f355c5931 ; sys_platform == 'win32' and python_version == '3.11' and (platform_machine == 'AMD64' or platform_machine == 'x86_64')",
    "torchvision @ https://download.pytorch.org/whl/xpu/torchvision-0.24.0%2Bxpu-cp312-cp312-win_amd64.whl#sha256=6a5194bc736089606342d48a3f6822829b167617e9495d91d753dd1bd46fda18 ; sys_platform == 'win32' and python_version == '3.12' and (platform_machine == 'AMD64' or platform_machine == 'x86_64')",
    "torchvision @ https://download.pytorch.org/whl/xpu/torchvision-0.24.0%2Bxpu-cp313-cp313-win_amd64.whl#sha256=da47a3ce2bb7f0301a31124668b5908f9b9e92d6241443de15a310ef9632fd83 ; sys_platform == 'win32' and python_version == '3.13' and (platform_machine == 'AMD64' or platform_machine == 'x86_64')",
]
intel-gpu-torch290 = [
    "unsloth[intelgputorch290]"
]
intelgputorch210 = [
    "unsloth_zoo[intelgpu]",
    "unsloth[huggingfacenotorch]",

    "pytorch_triton_xpu @ https://download.pytorch.org/whl/pytorch_triton_xpu-3.5.0-cp310-cp310-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl#sha256=c169a1de14c19673b17c751290d467fa282fc90fa5da4314b2e5cdab1f553146 ; platform_system == 'Linux' and python_version == '3.10' and platform_machine == 'x86_64'",
    "pytorch_triton_xpu @ https://download.pytorch.org/whl/pytorch_triton_xpu-3.5.0-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl#sha256=013d9dd5d6479bd22983161f462e61c8dbe1d82e6730624a7a8d5945507eaa61 ; platform_system == 'Linux' and python_version == '3.11' and platform_machine == 'x86_64'",
    "pytorch_triton_xpu @ https://download.pytorch.org/whl/pytorch_triton_xpu-3.5.0-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl#sha256=afc8cabfbf7ed51fd278d1e0f88d6afc157b0201bad4b99d681e4d542f9e66d4 ; platform_system == 'Linux' and python_version == '3.12' and platform_machine == 'x86_64'",
    "pytorch_triton_xpu @ https://download.pytorch.org/whl/pytorch_triton_xpu-3.5.0-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl#sha256=0d24c1716088f2764d0d24c64227732195b6a42706c3c5fc89eeb4904bfa0818 ; platform_system == 'Linux' and python_version == '3.13' and platform_machine == 'x86_64'",
    "pytorch_triton_xpu @ https://download.pytorch.org/whl/pytorch_triton_xpu-3.5.0-cp310-cp310-win_amd64.whl#sha256=c83ab007311d9cfb6e809ee5a4587d99a9eef4be720b90da4f1aaa68b45139a0 ; sys_platform == 'win32' and python_version == '3.10' and (platform_machine == 'AMD64' or platform_machine == 'x86_64')",
    "pytorch_triton_xpu @ https://download.pytorch.org/whl/pytorch_triton_xpu-3.5.0-cp311-cp311-win_amd64.whl#sha256=debf75348da8e8c7166b4d4a9b91d1508bb8d6581e339f79f7604b2e6746bacd ; sys_platform == 'win32' and python_version == '3.11' and (platform_machine == 'AMD64' or platform_machine == 'x86_64')",
    "pytorch_triton_xpu @ https://download.pytorch.org/whl/pytorch_triton_xpu-3.5.0-cp312-cp312-win_amd64.whl#sha256=97337a47425f1963a723475bd61037460e84ba01db4f87a1d662c3718ff6c47e ; sys_platform == 'win32' and python_version == '3.12' and (platform_machine == 'AMD64' or platform_machine == 'x86_64')",
    "pytorch_triton_xpu @ https://download.pytorch.org/whl/pytorch_triton_xpu-3.5.0-cp313-cp313-win_amd64.whl#sha256=2caf8138695f6abb023ecd02031a2611ba1bf8fff2f19802567cb2fadefe9e87 ; sys_platform == 'win32' and python_version == '3.13' and (platform_machine == 'AMD64' or platform_machine == 'x86_64')",

    "torch @ https://download.pytorch.org/whl/xpu/torch-2.10.0%2Bxpu-cp310-cp310-linux_x86_64.whl#sha256=abb1d1ec1ac672bac0ff35420c965f2df0c636ef9d94e2a830e34578489d0a57 ; platform_system == 'Linux' and python_version == '3.10' and platform_machine == 'x86_64'",
    "torch @ https://download.pytorch.org/whl/xpu/torch-2.10.0%2Bxpu-cp311-cp311-linux_x86_64.whl#sha256=71ad2f82da0f41eaec159f39fc85854e27c2391efa91b373e550648a6f4aaad3 ; platform_system == 'Linux' and python_version == '3.11' and platform_machine == 'x86_64'",
    "torch @ https://download.pytorch.org/whl/xpu/torch-2.10.0%2Bxpu-cp312-cp312-linux_x86_64.whl#sha256=b473571d478912f92881cc13f15fa18f8463fb0fb8a068c96ed47a7d45a4da0a ; platform_system == 'Linux' and python_version == '3.12' and platform_machine == 'x86_64'",
    "torch @ https://download.pytorch.org/whl/xpu/torch-2.10.0%2Bxpu-cp313-cp313-linux_x86_64.whl#sha256=3bc64a746ff25a93de140902c60c9e819d7413f5cea1e88d80999c27a5901e9c ; platform_system == 'Linux' and python_version == '3.13' and platform_machine == 'x86_64'",
    "torch @ https://download.pytorch.org/whl/xpu/torch-2.10.0%2Bxpu-cp310-cp310-win_amd64.whl#sha256=ce50691ab3fb6301d9b7bb8b3834cf5fa7152a2b5f91fd24c5efdc601a25b780 ; sys_platform == 'win32' and python_version == '3.10' and (platform_machine == 'AMD64' or platform_machine == 'x86_64')",
    "torch @ https://download.pytorch.org/whl/xpu/torch-2.10.0%2Bxpu-cp311-cp311-win_amd64.whl#sha256=cb9d37f21cb9fb7df67d62863f021c3144e8d8832b9ea8e8523ac308bc620ea1 ; sys_platform == 'win32' and python_version == '3.11' and (platform_machine == 'AMD64' or platform_machine == 'x86_64')",
    "torch @ https://download.pytorch.org/whl/xpu/torch-2.10.0%2Bxpu-cp312-cp312-win_amd64.whl#sha256=3ad605be4728b6d3a28a44d07dd794b1a9e45551b0057815bf25eb2a6d6a56a7 ; sys_platform == 'win32' and python_version == '3.12' and (platform_machine == 'AMD64' or platform_machine == 'x86_64')",
    "torch @ https://download.pytorch.org/whl/xpu/torch-2.10.0%2Bxpu-cp313-cp313-win_amd64.whl#sha256=2b4b56dd6c792aef82006904fa888692e3782e4ae5da27526801bad4898f05a5 ; sys_platform == 'win32' and python_version == '3.13' and (platform_machine == 'AMD64' or platform_machine == 'x86_64')",

    "bitsandbytes @ https://github.com/bitsandbytes-foundation/bitsandbytes/releases/download/continuous-release_main/bitsandbytes-1.33.7.preview-py3-none-manylinux_2_24_x86_64.whl ; ('linux' in sys_platform) and (platform_machine == 'AMD64' or platform_machine == 'x86_64')",
    "bitsandbytes @ https://github.com/bitsandbytes-foundation/bitsandbytes/releases/download/continuous-release_main/bitsandbytes-1.33.7.preview-py3-none-win_amd64.whl ; (sys_platform == 'win32') and (platform_machine == 'AMD64' or platform_machine == 'x86_64')",

    "torchvision @ https://download.pytorch.org/whl/xpu/torchvision-0.25.0%2Bxpu-cp310-cp310-manylinux_2_28_x86_64.whl#sha256=7e1e7b170fcf7161c8499b67156c5a05462243626dc0974010791a0bab4378d3 ; platform_system == 'Linux' and python_version == '3.10' and platform_machine == 'x86_64'",
    "torchvision @ https://download.pytorch.org/whl/xpu/torchvision-0.25.0%2Bxpu-cp311-cp311-manylinux_2_28_x86_64.whl#sha256=bd6add201bd7628af70437292e1447abb368e0b5f4ff9abd334ae435efd44792 ; platform_system == 'Linux' and python_version == '3.11' and platform_machine == 'x86_64'",
    "torchvision @ https://download.pytorch.org/whl/xpu/torchvision-0.25.0%2Bxpu-cp312-cp312-manylinux_2_28_x86_64.whl#sha256=6ad2543496bc29e59d3dd614a94d09aa9870318aedb66045344fffddfedd2cf8 ; platform_system == 'Linux' and python_version == '3.12' and platform_machine == 'x86_64'",
    "torchvision @ https://download.pytorch.org/whl/xpu/torchvision-0.25.0%2Bxpu-cp313-cp313-manylinux_2_28_x86_64.whl#sha256=80269f37865fcd8b57f20e4786efae2200bfa2b2727926c3c7acc82f0e7d3548 ; platform_system == 'Linux' and python_version == '3.13' and platform_machine == 'x86_64'",
    "torchvision @ https://download.pytorch.org/whl/xpu/torchvision-0.25.0%2Bxpu-cp310-cp310-win_amd64.whl#sha256=6b9485ba85dcba4d196d6134d9c3332fb228fb2556416bf0450a64e8a472fcba ; sys_platform == 'win32' and python_version == '3.10' and (platform_machine == 'AMD64' or platform_machine == 'x86_64')",
    "torchvision @ https://download.pytorch.org/whl/xpu/torchvision-0.25.0%2Bxpu-cp311-cp311-win_amd64.whl#sha256=36cbaedf10f6412af5c89afd9aeea474e6a56a0050348ada8fabe1ecaf6b879e ; sys_platform == 'win32' and python_version == '3.11' and (platform_machine == 'AMD64' or platform_machine == 'x86_64')",
    "torchvision @ https://download.pytorch.org/whl/xpu/torchvision-0.25.0%2Bxpu-cp312-cp312-win_amd64.whl#sha256=738357d97468d75fe3d510ac37e65130f2787f81d9bbc1518898f7396dc3403f ; sys_platform == 'win32' and python_version == '3.12' and (platform_machine == 'AMD64' or platform_machine == 'x86_64')",
    "torchvision @ https://download.pytorch.org/whl/xpu/torchvision-0.25.0%2Bxpu-cp313-cp313-win_amd64.whl#sha256=1c4b44b36a557f7381e3076fb8843366742238648441d607c8d049c6da0f8886 ; sys_platform == 'win32' and python_version == '3.13' and (platform_machine == 'AMD64' or platform_machine == 'x86_64')",
]
intel-gpu-torch210 = [
    "unsloth[intelgputorch210]"
]
intel = [
    "unsloth[intelgputorch280]",
]
amd = [
    "unsloth[huggingfacenotorch]",
    "bitsandbytes>=0.49.1 ; ('linux' in sys_platform) and (platform_machine == 'AMD64' or platform_machine == 'x86_64' or platform_machine == 'aarch64')",
    "bitsandbytes>=0.49.1 ; (sys_platform == 'win32') and (platform_machine == 'AMD64' or platform_machine == 'x86_64')",
]
rocm702-torch280 = [
    "unsloth[amd]",

    "triton @ https://repo.radeon.com/rocm/manylinux/rocm-rel-7.0.2/triton-3.4.0%2Brocm7.0.2.gitf9e5bf54-cp311-cp311-linux_x86_64.whl ; platform_system == 'Linux' and python_version == '3.11' and platform_machine == 'x86_64'",
    "triton @ https://repo.radeon.com/rocm/manylinux/rocm-rel-7.0.2/triton-3.4.0%2Brocm7.0.2.gitf9e5bf54-cp312-cp312-linux_x86_64.whl ; platform_system == 'Linux' and python_version == '3.12' and platform_machine == 'x86_64'",
    "triton @ https://repo.radeon.com/rocm/manylinux/rocm-rel-7.0.2/triton-3.4.0%2Brocm7.0.2.gitf9e5bf54-cp313-cp313-linux_x86_64.whl ; platform_system == 'Linux' and python_version == '3.13' and platform_machine == 'x86_64'",

    "torch @ https://repo.radeon.com/rocm/manylinux/rocm-rel-7.0.2/torch-2.8.0%2Brocm7.0.2.lw.git245bf6ed-cp311-cp311-linux_x86_64.whl ; platform_system == 'Linux' and python_version == '3.11' and platform_machine == 'x86_64'",
    "torch @ https://repo.radeon.com/rocm/manylinux/rocm-rel-7.0.2/torch-2.8.0%2Brocm7.0.2.lw.git245bf6ed-cp312-cp312-linux_x86_64.whl ; platform_system == 'Linux' and python_version == '3.12' and platform_machine == 'x86_64'",
    "torch @ https://repo.radeon.com/rocm/manylinux/rocm-rel-7.0.2/torch-2.8.0%2Brocm7.0.2.lw.git245bf6ed-cp313-cp313-linux_x86_64.whl ; platform_system == 'Linux' and python_version == '3.13' and platform_machine == 'x86_64'",

    "torchvision @ https://repo.radeon.com/rocm/manylinux/rocm-rel-7.0.2/torchvision-0.23.0%2Brocm7.0.2.git824e8c87-cp311-cp311-linux_x86_64.whl ; platform_system == 'Linux' and python_version == '3.11' and platform_machine == 'x86_64'",
    "torchvision @ https://repo.radeon.com/rocm/manylinux/rocm-rel-7.0.2/torchvision-0.23.0%2Brocm7.0.2.git824e8c87-cp312-cp312-linux_x86_64.whl ; platform_system == 'Linux' and python_version == '3.12' and platform_machine == 'x86_64'",
    "torchvision @ https://repo.radeon.com/rocm/manylinux/rocm-rel-7.0.2/torchvision-0.23.0%2Brocm7.0.2.git824e8c87-cp313-cp313-linux_x86_64.whl ; platform_system == 'Linux' and python_version == '3.13' and platform_machine == 'x86_64'",
]
rocm72-torch291 = [
    "unsloth[amd]",

    "triton @ https://repo.radeon.com/rocm/manylinux/rocm-rel-7.2/triton-3.5.1%2Brocm7.2.0.gita272dfa8-cp310-cp310-linux_x86_64.whl ; platform_system == 'Linux' and python_version == '3.10' and platform_machine == 'x86_64'",
    "triton @ https://repo.radeon.com/rocm/manylinux/rocm-rel-7.2/triton-3.5.1%2Brocm7.2.0.gita272dfa8-cp311-cp311-linux_x86_64.whl ; platform_system == 'Linux' and python_version == '3.11' and platform_machine == 'x86_64'",
    "triton @ https://repo.radeon.com/rocm/manylinux/rocm-rel-7.2/triton-3.5.1%2Brocm7.2.0.gita272dfa8-cp312-cp312-linux_x86_64.whl ; platform_system == 'Linux' and python_version == '3.12' and platform_machine == 'x86_64'",
    "triton @ https://repo.radeon.com/rocm/manylinux/rocm-rel-7.2/triton-3.5.1%2Brocm7.2.0.gita272dfa8-cp313-cp313-linux_x86_64.whl ; platform_system == 'Linux' and python_version == '3.13' and platform_machine == 'x86_64'",

    "torch @ https://repo.radeon.com/rocm/manylinux/rocm-rel-7.2/torch-2.9.1%2Brocm7.2.0.lw.git7e1940d4-cp310-cp310-linux_x86_64.whl ; platform_system == 'Linux' and python_version == '3.10' and platform_machine == 'x86_64'",
    "torch @ https://repo.radeon.com/rocm/manylinux/rocm-rel-7.2/torch-2.9.1%2Brocm7.2.0.lw.git7e1940d4-cp311-cp311-linux_x86_64.whl ; platform_system == 'Linux' and python_version == '3.11' and platform_machine == 'x86_64'",
    "torch @ https://repo.radeon.com/rocm/manylinux/rocm-rel-7.2/torch-2.9.1%2Brocm7.2.0.lw.git7e1940d4-cp312-cp312-linux_x86_64.whl ; platform_system == 'Linux' and python_version == '3.12' and platform_machine == 'x86_64'",
    "torch @ https://repo.radeon.com/rocm/manylinux/rocm-rel-7.2/torch-2.9.1%2Brocm7.2.0.lw.git7e1940d4-cp313-cp313-linux_x86_64.whl ; platform_system == 'Linux' and python_version == '3.13' and platform_machine == 'x86_64'",
    "torch @ https://repo.radeon.com/rocm/windows/rocm-rel-7.2/torch-2.9.1%2Brocmsdk20260116-cp312-cp312-win_amd64.whl ; sys_platform == 'win32' and python_version == '3.12'",

    "torchvision @ https://repo.radeon.com/rocm/manylinux/rocm-rel-7.2/torchvision-0.24.0%2Brocm7.2.0.gitb919bd0c-cp310-cp310-linux_x86_64.whl ; platform_system == 'Linux' and python_version == '3.10' and platform_machine == 'x86_64'",
    "torchvision @ https://repo.radeon.com/rocm/manylinux/rocm-rel-7.2/torchvision-0.24.0%2Brocm7.2.0.gitb919bd0c-cp311-cp311-linux_x86_64.whl ; platform_system == 'Linux' and python_version == '3.11' and platform_machine == 'x86_64'",
    "torchvision @ https://repo.radeon.com/rocm/manylinux/rocm-rel-7.2/torchvision-0.24.0%2Brocm7.2.0.gitb919bd0c-cp312-cp312-linux_x86_64.whl ; platform_system == 'Linux' and python_version == '3.12' and platform_machine == 'x86_64'",
    "torchvision @ https://repo.radeon.com/rocm/manylinux/rocm-rel-7.2/torchvision-0.24.0%2Brocm7.2.0.gitb919bd0c-cp313-cp313-linux_x86_64.whl ; platform_system == 'Linux' and python_version == '3.13' and platform_machine == 'x86_64'",
    "torchvision @ https://repo.radeon.com/rocm/windows/rocm-rel-7.2/torchvision-0.24.1%2Brocmsdk20260116-cp312-cp312-win_amd64.whl ; sys_platform == 'win32' and python_version == '3.12'",
]
rocm711-torch291 = [
    "unsloth[amd]",

    "triton @ https://repo.radeon.com/rocm/manylinux/rocm-rel-7.1.1/triton-3.5.1%2Brocm7.1.1.gita272dfa8-cp310-cp310-linux_x86_64.whl ; platform_system == 'Linux' and python_version == '3.10' and platform_machine == 'x86_64'",
    "triton @ https://repo.radeon.com/rocm/manylinux/rocm-rel-7.1.1/triton-3.5.1%2Brocm7.1.1.gita272dfa8-cp311-cp311-linux_x86_64.whl ; platform_system == 'Linux' and python_version == '3.11' and platform_machine == 'x86_64'",
    "triton @ https://repo.radeon.com/rocm/manylinux/rocm-rel-7.1.1/triton-3.5.1%2Brocm7.1.1.gita272dfa8-cp312-cp312-linux_x86_64.whl ; platform_system == 'Linux' and python_version == '3.12' and platform_machine == 'x86_64'",
    "triton @ https://repo.radeon.com/rocm/manylinux/rocm-rel-7.1.1/triton-3.5.1%2Brocm7.1.1.gita272dfa8-cp313-cp313-linux_x86_64.whl ; platform_system == 'Linux' and python_version == '3.13' and platform_machine == 'x86_64'",

    "torch @ https://repo.radeon.com/rocm/manylinux/rocm-rel-7.1.1/torch-2.9.1%2Brocm7.1.1.lw.git351ff442-cp310-cp310-linux_x86_64.whl ; platform_system == 'Linux' and python_version == '3.10' and platform_machine == 'x86_64'",
    "torch @ https://repo.radeon.com/rocm/manylinux/rocm-rel-7.1.1/torch-2.9.1%2Brocm7.1.1.lw.git351ff442-cp311-cp311-linux_x86_64.whl ; platform_system == 'Linux' and python_version == '3.11' and platform_machine == 'x86_64'",
    "torch @ https://repo.radeon.com/rocm/manylinux/rocm-rel-7.1.1/torch-2.9.1%2Brocm7.1.1.lw.git351ff442-cp312-cp312-linux_x86_64.whl ; platform_system == 'Linux' and python_version == '3.12' and platform_machine == 'x86_64'",
    "torch @ https://repo.radeon.com/rocm/manylinux/rocm-rel-7.1.1/torch-2.9.1%2Brocm7.1.1.lw.git351ff442-cp313-cp313-linux_x86_64.whl ; platform_system == 'Linux' and python_version == '3.13' and platform_machine == 'x86_64'",

    "torchvision @ https://repo.radeon.com/rocm/manylinux/rocm-rel-7.1.1/torchvision-0.24.0%2Brocm7.1.1.gitb919bd0c-cp310-cp310-linux_x86_64.whl ; platform_system == 'Linux' and python_version == '3.10' and platform_machine == 'x86_64'",
    "torchvision @ https://repo.radeon.com/rocm/manylinux/rocm-rel-7.1.1/torchvision-0.24.0%2Brocm7.1.1.gitb919bd0c-cp311-cp311-linux_x86_64.whl ; platform_system == 'Linux' and python_version == '3.11' and platform_machine == 'x86_64'",
    "torchvision @ https://repo.radeon.com/rocm/manylinux/rocm-rel-7.1.1/torchvision-0.24.0%2Brocm7.1.1.gitb919bd0c-cp312-cp312-linux_x86_64.whl ; platform_system == 'Linux' and python_version == '3.12' and platform_machine == 'x86_64'",
    "torchvision @ https://repo.radeon.com/rocm/manylinux/rocm-rel-7.1.1/torchvision-0.24.0%2Brocm7.1.1.gitb919bd0c-cp313-cp313-linux_x86_64.whl ; platform_system == 'Linux' and python_version == '3.13' and platform_machine == 'x86_64'",
]
rocm72-torch2100 = [
    "unsloth[amd]",

    "triton @ https://repo.radeon.com/rocm/manylinux/rocm-rel-7.2/triton-3.6.0%2Brocm7.2.0.gitba5c1517-cp310-cp310-linux_x86_64.whl ; platform_system == 'Linux' and python_version == '3.10' and platform_machine == 'x86_64'",
    "triton @ https://repo.radeon.com/rocm/manylinux/rocm-rel-7.2/triton-3.6.0%2Brocm7.2.0.gitba5c1517-cp311-cp311-linux_x86_64.whl ; platform_system == 'Linux' and python_version == '3.11' and platform_machine == 'x86_64'",
    "triton @ https://repo.radeon.com/rocm/manylinux/rocm-rel-7.2/triton-3.6.0%2Brocm7.2.0.gitba5c1517-cp312-cp312-linux_x86_64.whl ; platform_system == 'Linux' and python_version == '3.12' and platform_machine == 'x86_64'",
    "triton @ https://repo.radeon.com/rocm/manylinux/rocm-rel-7.2/triton-3.6.0%2Brocm7.2.0.gitba5c1517-cp313-cp313-linux_x86_64.whl ; platform_system == 'Linux' and python_version == '3.13' and platform_machine == 'x86_64'",

    "torch @ https://repo.radeon.com/rocm/manylinux/rocm-rel-7.2/torch-2.10.0%2Brocm7.2.0.lw.gitb6ee5fde-cp310-cp310-linux_x86_64.whl ; platform_system == 'Linux' and python_version == '3.10' and platform_machine == 'x86_64'",
    "torch @ https://repo.radeon.com/rocm/manylinux/rocm-rel-7.2/torch-2.10.0%2Brocm7.2.0.lw.gitb6ee5fde-cp311-cp311-linux_x86_64.whl ; platform_system == 'Linux' and python_version == '3.11' and platform_machine == 'x86_64'",
    "torch @ https://repo.radeon.com/rocm/manylinux/rocm-rel-7.2/torch-2.10.0%2Brocm7.2.0.lw.gitb6ee5fde-cp312-cp312-linux_x86_64.whl ; platform_system == 'Linux' and python_version == '3.12' and platform_machine == 'x86_64'",
    "torch @ https://repo.radeon.com/rocm/manylinux/rocm-rel-7.2/torch-2.10.0%2Brocm7.2.0.lw.gitb6ee5fde-cp313-cp313-linux_x86_64.whl ; platform_system == 'Linux' and python_version == '3.13' and platform_machine == 'x86_64'",

    "torchvision @ https://repo.radeon.com/rocm/manylinux/rocm-rel-7.2/torchvision-0.25.0%2Brocm7.2.0.git82df5f59-cp310-cp310-linux_x86_64.whl ; platform_system == 'Linux' and python_version == '3.10' and platform_machine == 'x86_64'",
    "torchvision @ https://repo.radeon.com/rocm/manylinux/rocm-rel-7.2/torchvision-0.25.0%2Brocm7.2.0.git82df5f59-cp311-cp311-linux_x86_64.whl ; platform_system == 'Linux' and python_version == '3.11' and platform_machine == 'x86_64'",
    "torchvision @ https://repo.radeon.com/rocm/manylinux/rocm-rel-7.2/torchvision-0.25.0%2Brocm7.2.0.git82df5f59-cp312-cp312-linux_x86_64.whl ; platform_system == 'Linux' and python_version == '3.12' and platform_machine == 'x86_64'",
    "torchvision @ https://repo.radeon.com/rocm/manylinux/rocm-rel-7.2/torchvision-0.25.0%2Brocm7.2.0.git82df5f59-cp313-cp313-linux_x86_64.whl ; platform_system == 'Linux' and python_version == '3.13' and platform_machine == 'x86_64'",
]
rocm711-torch2100 = [
    "unsloth[amd]",

    "triton @ https://repo.radeon.com/rocm/manylinux/rocm-rel-7.1.1/triton-3.6.0%2Brocm7.1.1.gitba5c1517-cp310-cp310-linux_x86_64.whl ; platform_system == 'Linux' and python_version == '3.10' and platform_machine == 'x86_64'",
    "triton @ https://repo.radeon.com/rocm/manylinux/rocm-rel-7.1.1/triton-3.6.0%2Brocm7.1.1.gitba5c1517-cp311-cp311-linux_x86_64.whl ; platform_system == 'Linux' and python_version == '3.11' and platform_machine == 'x86_64'",
    "triton @ https://repo.radeon.com/rocm/manylinux/rocm-rel-7.1.1/triton-3.6.0%2Brocm7.1.1.gitba5c1517-cp312-cp312-linux_x86_64.whl ; platform_system == 'Linux' and python_version == '3.12' and platform_machine == 'x86_64'",
    "triton @ https://repo.radeon.com/rocm/manylinux/rocm-rel-7.1.1/triton-3.6.0%2Brocm7.1.1.gitba5c1517-cp313-cp313-linux_x86_64.whl ; platform_system == 'Linux' and python_version == '3.13' and platform_machine == 'x86_64'",

    "torch @ https://repo.radeon.com/rocm/manylinux/rocm-rel-7.1.1/torch-2.10.0%2Brocm7.1.1.lw.gitd9556b05-cp310-cp310-linux_x86_64.whl ; platform_system == 'Linux' and python_version == '3.10' and platform_machine == 'x86_64'",
    "torch @ https://repo.radeon.com/rocm/manylinux/rocm-rel-7.1.1/torch-2.10.0%2Brocm7.1.1.lw.gitd9556b05-cp311-cp311-linux_x86_64.whl ; platform_system == 'Linux' and python_version == '3.11' and platform_machine == 'x86_64'",
    "torch @ https://repo.radeon.com/rocm/manylinux/rocm-rel-7.1.1/torch-2.10.0%2Brocm7.1.1.lw.gitd9556b05-cp312-cp312-linux_x86_64.whl ; platform_system == 'Linux' and python_version == '3.12' and platform_machine == 'x86_64'",
    "torch @ https://repo.radeon.com/rocm/manylinux/rocm-rel-7.1.1/torch-2.10.0%2Brocm7.1.1.lw.gitd9556b05-cp313-cp313-linux_x86_64.whl ; platform_system == 'Linux' and python_version == '3.13' and platform_machine == 'x86_64'",

    "torchvision @ https://repo.radeon.com/rocm/manylinux/rocm-rel-7.1.1/torchvision-0.25.0%2Brocm7.1.1.git82df5f59-cp310-cp310-linux_x86_64.whl ; platform_system == 'Linux' and python_version == '3.10' and platform_machine == 'x86_64'",
    "torchvision @ https://repo.radeon.com/rocm/manylinux/rocm-rel-7.1.1/torchvision-0.25.0%2Brocm7.1.1.git82df5f59-cp311-cp311-linux_x86_64.whl ; platform_system == 'Linux' and python_version == '3.11' and platform_machine == 'x86_64'",
    "torchvision @ https://repo.radeon.com/rocm/manylinux/rocm-rel-7.1.1/torchvision-0.25.0%2Brocm7.1.1.git82df5f59-cp312-cp312-linux_x86_64.whl ; platform_system == 'Linux' and python_version == '3.12' and platform_machine == 'x86_64'",
    "torchvision @ https://repo.radeon.com/rocm/manylinux/rocm-rel-7.1.1/torchvision-0.25.0%2Brocm7.1.1.git82df5f59-cp313-cp313-linux_x86_64.whl ; platform_system == 'Linux' and python_version == '3.13' and platform_machine == 'x86_64'",
]

[project.urls]
homepage = "https://unsloth.ai"
documentation = "https://unsloth.ai/docs"
repository = "https://github.com/unslothai/unsloth"

[tool.ruff]
target-version = "py311"
force-exclude = true
extend-exclude = [
    "*chat_templates.py",
    "*ollama_template_mappers.py",
    "*_auto_install.py",
    "*mapper.py",
]

[tool.ruff.lint]
select = ["E9", "F63", "F7", "F82"]
ignore = [
    "E402",
    "E722",
    "F403",
    "F405",
    "F811",
    "F821",
    "F841",
    "F401",
    "E731",
    "E741",
    "F601",
    "E712",
]

[tool.ruff.format]


================================================
FILE: scripts/enforce_kwargs_spacing.py
================================================
#!/usr/bin/env python3
"""Ensure keyword arguments use spaces around '=', prune redundant pass statements."""

from __future__ import annotations

import ast
import argparse
import io
import sys
import tokenize
from collections import defaultdict
from pathlib import Path


def enforce_spacing(text: str) -> tuple[str, bool]:
    """Return updated text with keyword '=' padded by spaces, plus change flag."""
    lines = text.splitlines(keepends=True)
    if not lines:
        return text, False

    offsets: dict[int, int] = defaultdict(int)
    changed = False

    reader = io.StringIO(text).readline
    for token in tokenize.generate_tokens(reader):
        if token.type != tokenize.OP or token.string != "=":
            continue

        line_index = token.start[0] - 1
        col = token.start[1] + offsets[line_index]

        if line_index < 0 or line_index >= len(lines):
            continue

        line = lines[line_index]
        if col >= len(line) or line[col] != "=":
            continue

        line_changed = False

        # Insert a space before '=' when missing and not preceded by whitespace.
        if col > 0 and line[col - 1] not in {" ", "\t"}:
            line = f"{line[:col]} {line[col:]}"
            offsets[line_index] += 1
            col += 1
            line_changed = True
            changed = True

        # Insert a space after '=' when missing and not followed by whitespace or newline.
        next_index = col + 1
        if next_index < len(line) and line[next_index] not in {" ", "\t", "\n", "\r"}:
            line = f"{line[:next_index]} {line[next_index:]}"
            offsets[line_index] += 1
            line_changed = True
            changed = True

        if line_changed:
            lines[line_index] = line

    if not changed:
        return text, False

    return "".join(lines), True


def remove_redundant_passes(text: str) -> tuple[str, bool]:
    """Drop pass statements that share a block with other executable code."""

    try:
        tree = ast.parse(text)
    except SyntaxError:
        return text, False

    redundant: list[ast.Pass] = []

    def visit(node: ast.AST) -> None:
        for attr in ("body", "orelse", "finalbody"):
            value = getattr(node, attr, None)
            if not isinstance(value, list) or len(value) <= 1:
                continue
            for stmt in value:
                if isinstance(stmt, ast.Pass):
                    redundant.append(stmt)
            for stmt in value:
                if isinstance(stmt, ast.AST):
                    visit(stmt)
        handlers = getattr(node, "handlers", None)
        if handlers:
            for handler in handlers:
                visit(handler)

    visit(tree)

    if not redundant:
        return text, False

    lines = text.splitlines(keepends=True)
    changed = False

    for node in sorted(
        redundant, key=lambda item: (item.lineno, item.col_offset), reverse=True
    ):
        start = node.lineno - 1
        end = (node.end_lineno or node.lineno) - 1
        if start >= len(lines):
            continue
        changed = True
        if start == end:
            line = lines[start]
            col_start = node.col_offset
            col_end = node.end_col_offset or (col_start + 4)
            segment = line[:col_start] + line[col_end:]
            lines[start] = segment if segment.strip() else ""
            continue

        # Defensive fall-back for unexpected multi-line 'pass'.
        prefix = lines[start][: node.col_offset]
        lines[start] = prefix if prefix.strip() else ""
        for idx in range(start + 1, end):
            lines[idx] = ""
        suffix = lines[end][(node.end_col_offset or 0) :]
        lines[end] = suffix

    # Normalise to ensure lines end with newlines except at EOF.
    result_lines: list[str] = []
    for index, line in enumerate(lines):
        if not line:
            continue
        if index < len(lines) - 1 and not line.endswith("\n"):
            result_lines.append(f"{line}\n")
        else:
            result_lines.append(line)

    return "".join(result_lines), changed


def process_file(path: Path) -> bool:
Download .txt
gitextract_mbg5_5ju/

├── .gitattributes
├── .github/
│   ├── CODEOWNERS
│   ├── FUNDING.yml
│   ├── ISSUE_TEMPLATE/
│   │   ├── bug---issue.md
│   │   └── feature-request.md
│   └── workflows/
│       └── stale.yml
├── .gitignore
├── .pre-commit-ci.yaml
├── .pre-commit-config.yaml
├── CODE_OF_CONDUCT.md
├── CONTRIBUTING.md
├── COPYING
├── LICENSE
├── README.md
├── build.sh
├── cli.py
├── install.ps1
├── install.sh
├── pyproject.toml
├── scripts/
│   ├── enforce_kwargs_spacing.py
│   └── run_ruff_format.py
├── studio/
│   ├── LICENSE.AGPL-3.0
│   ├── Unsloth_Studio_Colab.ipynb
│   ├── __init__.py
│   ├── backend/
│   │   ├── __init__.py
│   │   ├── assets/
│   │   │   ├── __init__.py
│   │   │   └── configs/
│   │   │       ├── __init__.py
│   │   │       ├── full_finetune.yaml
│   │   │       ├── inference_defaults.json
│   │   │       ├── lora_text.yaml
│   │   │       ├── model_defaults/
│   │   │       │   ├── default.yaml
│   │   │       │   ├── embedding/
│   │   │       │   │   ├── unsloth_Qwen3-Embedding-0.6B.yaml
│   │   │       │   │   ├── unsloth_all-MiniLM-L6-v2.yaml
│   │   │       │   │   ├── unsloth_bge-m3.yaml
│   │   │       │   │   ├── unsloth_embeddinggemma-300m.yaml
│   │   │       │   │   └── unsloth_gte-modernbert-base.yaml
│   │   │       │   ├── ernie/
│   │   │       │   │   ├── unsloth_ERNIE-4.5-21B-A3B-PT.yaml
│   │   │       │   │   └── unsloth_ERNIE-4.5-VL-28B-A3B-PT.yaml
│   │   │       │   ├── falcon/
│   │   │       │   │   └── tiiuae_Falcon-H1-0.5B-Instruct.yaml
│   │   │       │   ├── gemma/
│   │   │       │   │   ├── unsloth_codegemma-7b-bnb-4bit.yaml
│   │   │       │   │   ├── unsloth_functiongemma-270m-it.yaml
│   │   │       │   │   ├── unsloth_gemma-2-27b-bnb-4bit.yaml
│   │   │       │   │   ├── unsloth_gemma-2-2b.yaml
│   │   │       │   │   ├── unsloth_gemma-3-270m-it.yaml
│   │   │       │   │   ├── unsloth_gemma-3-27b-it.yaml
│   │   │       │   │   ├── unsloth_gemma-3-4b-it.yaml
│   │   │       │   │   ├── unsloth_gemma-3-4b-pt.yaml
│   │   │       │   │   ├── unsloth_gemma-3n-E4B-it.yaml
│   │   │       │   │   └── unsloth_gemma-3n-E4B.yaml
│   │   │       │   ├── gpt-oss/
│   │   │       │   │   ├── unsloth_gpt-oss-120b.yaml
│   │   │       │   │   └── unsloth_gpt-oss-20b.yaml
│   │   │       │   ├── granite/
│   │   │       │   │   ├── unsloth_granite-4.0-350m-unsloth-bnb-4bit.yaml
│   │   │       │   │   └── unsloth_granite-4.0-h-micro.yaml
│   │   │       │   ├── llama/
│   │   │       │   │   ├── unsloth_Llama-3.2-11B-Vision-Instruct.yaml
│   │   │       │   │   ├── unsloth_Llama-3.2-1B-Instruct.yaml
│   │   │       │   │   ├── unsloth_Llama-3.2-3B-Instruct.yaml
│   │   │       │   │   ├── unsloth_Llama-3.3-70B-Instruct.yaml
│   │   │       │   │   ├── unsloth_Meta-Llama-3.1-70B-bnb-4bit.yaml
│   │   │       │   │   ├── unsloth_Meta-Llama-3.1-8B-Instruct-bnb-4bit.yaml
│   │   │       │   │   ├── unsloth_llama-3-8b-Instruct-bnb-4bit.yaml
│   │   │       │   │   └── unsloth_llama-3-8b-bnb-4bit.yaml
│   │   │       │   ├── llasa/
│   │   │       │   │   └── unsloth_Llasa-3B.yaml
│   │   │       │   ├── mistral/
│   │   │       │   │   ├── unsloth_Magistral-Small-2509-unsloth-bnb-4bit.yaml
│   │   │       │   │   ├── unsloth_Ministral-3-3B-Instruct-2512.yaml
│   │   │       │   │   ├── unsloth_Mistral-Nemo-Base-2407-bnb-4bit.yaml
│   │   │       │   │   ├── unsloth_Mistral-Small-Instruct-2409.yaml
│   │   │       │   │   ├── unsloth_Pixtral-12B-2409.yaml
│   │   │       │   │   ├── unsloth_mistral-7b-instruct-v0.3-bnb-4bit.yaml
│   │   │       │   │   └── unsloth_mistral-7b-v0.3-bnb-4bit.yaml
│   │   │       │   ├── other/
│   │   │       │   │   ├── OuteAI_Llama-OuteTTS-1.0-1B.yaml
│   │   │       │   │   ├── Spark-TTS-0.5B_LLM.yaml
│   │   │       │   │   ├── sesame_csm-1b.yaml
│   │   │       │   │   ├── unsloth_GLM-4.7-Flash.yaml
│   │   │       │   │   ├── unsloth_LFM2-1.2B.yaml
│   │   │       │   │   ├── unsloth_Nemotron-3-Nano-30B-A3B.yaml
│   │   │       │   │   ├── unsloth_PaddleOCR-VL.yaml
│   │   │       │   │   ├── unsloth_answerdotai_ModernBERT-large.yaml
│   │   │       │   │   ├── unsloth_orpheus-3b-0.1-ft.yaml
│   │   │       │   │   ├── unsloth_tinyllama-bnb-4bit.yaml
│   │   │       │   │   └── unsloth_whisper-large-v3.yaml
│   │   │       │   ├── phi/
│   │   │       │   │   ├── unsloth_Phi-3-medium-4k-instruct.yaml
│   │   │       │   │   ├── unsloth_Phi-3.5-mini-instruct.yaml
│   │   │       │   │   └── unsloth_Phi-4.yaml
│   │   │       │   └── qwen/
│   │   │       │       ├── imdatta0_tiny_qwen3_moe_2.8B_0.7B.yaml
│   │   │       │       ├── unsloth_Qwen2-7B.yaml
│   │   │       │       ├── unsloth_Qwen2-VL-7B-Instruct.yaml
│   │   │       │       ├── unsloth_Qwen2.5-1.5B-Instruct.yaml
│   │   │       │       ├── unsloth_Qwen2.5-7B.yaml
│   │   │       │       ├── unsloth_Qwen2.5-Coder-1.5B-Instruct.yaml
│   │   │       │       ├── unsloth_Qwen2.5-Coder-14B-Instruct.yaml
│   │   │       │       ├── unsloth_Qwen2.5-Coder-7B-Instruct-bnb-4bit.yaml
│   │   │       │       ├── unsloth_Qwen2.5-VL-7B-Instruct-bnb-4bit.yaml
│   │   │       │       ├── unsloth_Qwen3-0.6B.yaml
│   │   │       │       ├── unsloth_Qwen3-14B-Base-unsloth-bnb-4bit.yaml
│   │   │       │       ├── unsloth_Qwen3-14B.yaml
│   │   │       │       ├── unsloth_Qwen3-30B-A3B-Instruct-2507.yaml
│   │   │       │       ├── unsloth_Qwen3-32B.yaml
│   │   │       │       ├── unsloth_Qwen3-4B-Instruct-2507.yaml
│   │   │       │       ├── unsloth_Qwen3-4B-Thinking-2507.yaml
│   │   │       │       └── unsloth_Qwen3-VL-8B-Instruct-unsloth-bnb-4bit.yaml
│   │   │       └── vision_lora.yaml
│   │   ├── auth/
│   │   │   ├── .gitkeep
│   │   │   ├── __init__.py
│   │   │   ├── authentication.py
│   │   │   ├── hashing.py
│   │   │   └── storage.py
│   │   ├── colab.py
│   │   ├── core/
│   │   │   ├── __init__.py
│   │   │   ├── data_recipe/
│   │   │   │   ├── __init__.py
│   │   │   │   ├── huggingface.py
│   │   │   │   ├── jobs/
│   │   │   │   │   ├── __init__.py
│   │   │   │   │   ├── constants.py
│   │   │   │   │   ├── manager.py
│   │   │   │   │   ├── parse.py
│   │   │   │   │   ├── types.py
│   │   │   │   │   └── worker.py
│   │   │   │   ├── jsonable.py
│   │   │   │   ├── local_callable_validators.py
│   │   │   │   ├── oxc-validator/
│   │   │   │   │   ├── package.json
│   │   │   │   │   └── validate.mjs
│   │   │   │   └── service.py
│   │   │   ├── export/
│   │   │   │   ├── __init__.py
│   │   │   │   ├── export.py
│   │   │   │   ├── orchestrator.py
│   │   │   │   └── worker.py
│   │   │   ├── inference/
│   │   │   │   ├── __init__.py
│   │   │   │   ├── audio_codecs.py
│   │   │   │   ├── defaults.py
│   │   │   │   ├── inference.py
│   │   │   │   ├── llama_cpp.py
│   │   │   │   ├── orchestrator.py
│   │   │   │   ├── tools.py
│   │   │   │   └── worker.py
│   │   │   └── training/
│   │   │       ├── __init__.py
│   │   │       ├── trainer.py
│   │   │       ├── training.py
│   │   │       └── worker.py
│   │   ├── loggers/
│   │   │   ├── .gitkeep
│   │   │   ├── __init__.py
│   │   │   ├── config.py
│   │   │   └── handlers.py
│   │   ├── main.py
│   │   ├── models/
│   │   │   ├── .gitkeep
│   │   │   ├── __init__.py
│   │   │   ├── auth.py
│   │   │   ├── data_recipe.py
│   │   │   ├── datasets.py
│   │   │   ├── export.py
│   │   │   ├── inference.py
│   │   │   ├── models.py
│   │   │   ├── responses.py
│   │   │   ├── training.py
│   │   │   └── users.py
│   │   ├── plugins/
│   │   │   ├── __init__.py
│   │   │   └── data-designer-unstructured-seed/
│   │   │       ├── __init__.py
│   │   │       ├── pyproject.toml
│   │   │       └── src/
│   │   │           └── data_designer_unstructured_seed/
│   │   │               ├── __init__.py
│   │   │               ├── chunking.py
│   │   │               ├── config.py
│   │   │               ├── impl.py
│   │   │               └── plugin.py
│   │   ├── requirements/
│   │   │   ├── __init__.py
│   │   │   ├── base.txt
│   │   │   ├── extras-no-deps.txt
│   │   │   ├── extras.txt
│   │   │   ├── overrides.txt
│   │   │   ├── single-env/
│   │   │   │   ├── constraints.txt
│   │   │   │   ├── data-designer-deps.txt
│   │   │   │   ├── data-designer.txt
│   │   │   │   └── patch_metadata.py
│   │   │   ├── studio.txt
│   │   │   └── triton-kernels.txt
│   │   ├── routes/
│   │   │   ├── .gitkeep
│   │   │   ├── __init__.py
│   │   │   ├── auth.py
│   │   │   ├── data_recipe/
│   │   │   │   ├── __init__.py
│   │   │   │   ├── jobs.py
│   │   │   │   ├── mcp.py
│   │   │   │   ├── seed.py
│   │   │   │   └── validate.py
│   │   │   ├── datasets.py
│   │   │   ├── export.py
│   │   │   ├── inference.py
│   │   │   ├── models.py
│   │   │   └── training.py
│   │   ├── run.py
│   │   ├── state/
│   │   │   ├── .gitkeep
│   │   │   └── __init__.py
│   │   ├── tests/
│   │   │   ├── __init__.py
│   │   │   ├── conftest.py
│   │   │   ├── test_data_recipe_seed.py
│   │   │   └── test_utils.py
│   │   └── utils/
│   │       ├── .gitkeep
│   │       ├── __init__.py
│   │       ├── cache_cleanup.py
│   │       ├── datasets/
│   │       │   ├── __init__.py
│   │       │   ├── chat_templates.py
│   │       │   ├── data_collators.py
│   │       │   ├── dataset_utils.py
│   │       │   ├── format_conversion.py
│   │       │   ├── format_detection.py
│   │       │   ├── llm_assist.py
│   │       │   ├── model_mappings.py
│   │       │   └── vlm_processing.py
│   │       ├── hardware/
│   │       │   ├── __init__.py
│   │       │   └── hardware.py
│   │       ├── inference/
│   │       │   ├── __init__.py
│   │       │   └── inference_config.py
│   │       ├── models/
│   │       │   ├── __init__.py
│   │       │   ├── checkpoints.py
│   │       │   └── model_config.py
│   │       ├── paths/
│   │       │   ├── __init__.py
│   │       │   ├── path_utils.py
│   │       │   └── storage_roots.py
│   │       ├── transformers_version.py
│   │       └── utils.py
│   ├── frontend/
│   │   ├── .gitignore
│   │   ├── .gitkeep
│   │   ├── biome.json
│   │   ├── components.json
│   │   ├── data-designer.openapi (1).yaml
│   │   ├── eslint.config.js
│   │   ├── index.html
│   │   ├── package.json
│   │   ├── public/
│   │   │   └── Hellix font official/
│   │   │       └── OTF/
│   │   │           └── Hellix-SemiBold.otf
│   │   ├── src/
│   │   │   ├── app/
│   │   │   │   ├── app.tsx
│   │   │   │   ├── auth-guards.ts
│   │   │   │   ├── provider.tsx
│   │   │   │   ├── router.tsx
│   │   │   │   └── routes/
│   │   │   │       ├── __root.tsx
│   │   │   │       ├── change-password.tsx
│   │   │   │       ├── chat.tsx
│   │   │   │       ├── data-recipes.$recipeId.tsx
│   │   │   │       ├── data-recipes.tsx
│   │   │   │       ├── export.tsx
│   │   │   │       ├── grid-test.tsx
│   │   │   │       ├── index.tsx
│   │   │   │       ├── login.tsx
│   │   │   │       ├── onboarding.tsx
│   │   │   │       └── studio.tsx
│   │   │   ├── components/
│   │   │   │   ├── assistant-ui/
│   │   │   │   │   ├── attachment.tsx
│   │   │   │   │   ├── audio-player.tsx
│   │   │   │   │   ├── badge.tsx
│   │   │   │   │   ├── markdown-text.tsx
│   │   │   │   │   ├── message-timing.tsx
│   │   │   │   │   ├── model-selector/
│   │   │   │   │   │   ├── pickers.tsx
│   │   │   │   │   │   └── types.ts
│   │   │   │   │   ├── model-selector.tsx
│   │   │   │   │   ├── reasoning.tsx
│   │   │   │   │   ├── sources.tsx
│   │   │   │   │   ├── thread.tsx
│   │   │   │   │   ├── tool-fallback.tsx
│   │   │   │   │   ├── tool-group.tsx
│   │   │   │   │   ├── tool-ui-python.tsx
│   │   │   │   │   ├── tool-ui-terminal.tsx
│   │   │   │   │   ├── tool-ui-web-search.tsx
│   │   │   │   │   └── tooltip-icon-button.tsx
│   │   │   │   ├── example.tsx
│   │   │   │   ├── layout/
│   │   │   │   │   ├── dashboard-grid.tsx
│   │   │   │   │   ├── dashboard-layout.tsx
│   │   │   │   │   └── index.ts
│   │   │   │   ├── markdown/
│   │   │   │   │   ├── markdown-preview.tsx
│   │   │   │   │   └── mermaid-error.tsx
│   │   │   │   ├── navbar.tsx
│   │   │   │   ├── section-card.tsx
│   │   │   │   └── ui/
│   │   │   │       ├── accordion.tsx
│   │   │   │       ├── alert-dialog.tsx
│   │   │   │       ├── alert.tsx
│   │   │   │       ├── animated-shiny-text.tsx
│   │   │   │       ├── animated-theme-toggler.tsx
│   │   │   │       ├── aspect-ratio.tsx
│   │   │   │       ├── avatar.tsx
│   │   │   │       ├── badge.tsx
│   │   │   │       ├── breadcrumb.tsx
│   │   │   │       ├── button.tsx
│   │   │   │       ├── calendar.tsx
│   │   │   │       ├── card.tsx
│   │   │   │       ├── chart.tsx
│   │   │   │       ├── checkbox.tsx
│   │   │   │       ├── collapsible.tsx
│   │   │   │       ├── combobox.tsx
│   │   │   │       ├── command.tsx
│   │   │   │       ├── confetti.tsx
│   │   │   │       ├── context-menu.tsx
│   │   │   │       ├── data-table.tsx
│   │   │   │       ├── dialog.tsx
│   │   │   │       ├── dropdown-menu.tsx
│   │   │   │       ├── empty.tsx
│   │   │   │       ├── field.tsx
│   │   │   │       ├── hover-card.tsx
│   │   │   │       ├── input-group.tsx
│   │   │   │       ├── input.tsx
│   │   │   │       ├── label.tsx
│   │   │   │       ├── light-rays.tsx
│   │   │   │       ├── menubar.tsx
│   │   │   │       ├── navigation-menu.tsx
│   │   │   │       ├── pagination.tsx
│   │   │   │       ├── popover.tsx
│   │   │   │       ├── progress.tsx
│   │   │   │       ├── radio-group.tsx
│   │   │   │       ├── resizable.tsx
│   │   │   │       ├── scroll-area.tsx
│   │   │   │       ├── select.tsx
│   │   │   │       ├── separator.tsx
│   │   │   │       ├── sheet.tsx
│   │   │   │       ├── shine-border.tsx
│   │   │   │       ├── sidebar.tsx
│   │   │   │       ├── skeleton.tsx
│   │   │   │       ├── slider.tsx
│   │   │   │       ├── sonner.tsx
│   │   │   │       ├── sparkles-text.tsx
│   │   │   │       ├── spinner.tsx
│   │   │   │       ├── switch.tsx
│   │   │   │       ├── table.tsx
│   │   │   │       ├── tabs.tsx
│   │   │   │       ├── terminal.tsx
│   │   │   │       ├── textarea.tsx
│   │   │   │       ├── toggle-group.tsx
│   │   │   │       ├── toggle.tsx
│   │   │   │       └── tooltip.tsx
│   │   │   ├── config/
│   │   │   │   ├── env.ts
│   │   │   │   └── training.ts
│   │   │   ├── features/
│   │   │   │   ├── auth/
│   │   │   │   │   ├── api.ts
│   │   │   │   │   ├── change-password-page.tsx
│   │   │   │   │   ├── components/
│   │   │   │   │   │   └── auth-form.tsx
│   │   │   │   │   ├── index.ts
│   │   │   │   │   ├── login-page.tsx
│   │   │   │   │   └── session.ts
│   │   │   │   ├── chat/
│   │   │   │   │   ├── api/
│   │   │   │   │   │   ├── chat-adapter.ts
│   │   │   │   │   │   └── chat-api.ts
│   │   │   │   │   ├── chat-page.tsx
│   │   │   │   │   ├── chat-settings-sheet.tsx
│   │   │   │   │   ├── components/
│   │   │   │   │   │   └── model-load-status.tsx
│   │   │   │   │   ├── db.ts
│   │   │   │   │   ├── hooks/
│   │   │   │   │   │   └── use-chat-model-runtime.ts
│   │   │   │   │   ├── index.ts
│   │   │   │   │   ├── runtime-provider.tsx
│   │   │   │   │   ├── shared-composer.tsx
│   │   │   │   │   ├── stores/
│   │   │   │   │   │   └── chat-runtime-store.ts
│   │   │   │   │   ├── thread-sidebar.tsx
│   │   │   │   │   ├── tour/
│   │   │   │   │   │   ├── index.ts
│   │   │   │   │   │   └── steps.tsx
│   │   │   │   │   ├── types/
│   │   │   │   │   │   ├── api.ts
│   │   │   │   │   │   └── runtime.ts
│   │   │   │   │   ├── types.ts
│   │   │   │   │   └── utils/
│   │   │   │   │       └── parse-assistant-content.ts
│   │   │   │   ├── data-recipes/
│   │   │   │   │   ├── data/
│   │   │   │   │   │   └── recipes-db.ts
│   │   │   │   │   ├── index.ts
│   │   │   │   │   ├── learning-recipes/
│   │   │   │   │   │   ├── conversation.json
│   │   │   │   │   │   ├── index.ts
│   │   │   │   │   │   ├── instruction-from-answer.json
│   │   │   │   │   │   ├── ocr-document-extraction.json
│   │   │   │   │   │   ├── pdf-grounded-qa.json
│   │   │   │   │   │   ├── structured-outputs-jinja.json
│   │   │   │   │   │   ├── text-to-python.json
│   │   │   │   │   │   └── text-to-sql.json
│   │   │   │   │   ├── pages/
│   │   │   │   │   │   ├── data-recipes-page.tsx
│   │   │   │   │   │   └── edit-recipe-page.tsx
│   │   │   │   │   └── types.ts
│   │   │   │   ├── export/
│   │   │   │   │   ├── anim.ts
│   │   │   │   │   ├── api/
│   │   │   │   │   │   └── export-api.ts
│   │   │   │   │   ├── components/
│   │   │   │   │   │   ├── export-dialog.tsx
│   │   │   │   │   │   ├── method-picker.tsx
│   │   │   │   │   │   └── quant-picker.tsx
│   │   │   │   │   ├── constants.ts
│   │   │   │   │   ├── export-page.tsx
│   │   │   │   │   ├── index.ts
│   │   │   │   │   └── tour/
│   │   │   │   │       ├── index.ts
│   │   │   │   │       └── steps.tsx
│   │   │   │   ├── onboarding/
│   │   │   │   │   ├── components/
│   │   │   │   │   │   ├── splash-screen.tsx
│   │   │   │   │   │   ├── steps/
│   │   │   │   │   │   │   ├── dataset-step.tsx
│   │   │   │   │   │   │   ├── hyperparameters-step.tsx
│   │   │   │   │   │   │   ├── model-selection-step.tsx
│   │   │   │   │   │   │   ├── model-type-step.tsx
│   │   │   │   │   │   │   └── summary-step.tsx
│   │   │   │   │   │   ├── wizard-content.tsx
│   │   │   │   │   │   ├── wizard-footer.tsx
│   │   │   │   │   │   ├── wizard-layout.tsx
│   │   │   │   │   │   ├── wizard-sidebar.tsx
│   │   │   │   │   │   └── wizard-step-item.tsx
│   │   │   │   │   └── index.ts
│   │   │   │   ├── recipe-studio/
│   │   │   │   │   ├── api/
│   │   │   │   │   │   └── index.ts
│   │   │   │   │   ├── blocks/
│   │   │   │   │   │   ├── definitions.ts
│   │   │   │   │   │   ├── registry.ts
│   │   │   │   │   │   └── render-dialog.tsx
│   │   │   │   │   ├── components/
│   │   │   │   │   │   ├── block-sheet.tsx
│   │   │   │   │   │   ├── chip-input.tsx
│   │   │   │   │   │   ├── controls/
│   │   │   │   │   │   │   ├── layout-controls.tsx
│   │   │   │   │   │   │   ├── run-validate-floating-controls.tsx
│   │   │   │   │   │   │   └── viewport-controls.tsx
│   │   │   │   │   │   ├── executions/
│   │   │   │   │   │   │   ├── execution-columns-tab.tsx
│   │   │   │   │   │   │   ├── execution-data-tab.tsx
│   │   │   │   │   │   │   ├── execution-overview-tab.tsx
│   │   │   │   │   │   │   ├── execution-raw-tab.tsx
│   │   │   │   │   │   │   ├── execution-sidebar.tsx
│   │   │   │   │   │   │   ├── executions-view-helpers.ts
│   │   │   │   │   │   │   ├── executions-view.tsx
│   │   │   │   │   │   │   └── publish-execution-dialog.tsx
│   │   │   │   │   │   ├── graph/
│   │   │   │   │   │   │   └── internals-sync.tsx
│   │   │   │   │   │   ├── inline/
│   │   │   │   │   │   │   ├── inline-category-badges.tsx
│   │   │   │   │   │   │   ├── inline-expression.tsx
│   │   │   │   │   │   │   ├── inline-field.tsx
│   │   │   │   │   │   │   ├── inline-llm.tsx
│   │   │   │   │   │   │   ├── inline-model.tsx
│   │   │   │   │   │   │   ├── inline-policy.ts
│   │   │   │   │   │   │   ├── inline-sampler.tsx
│   │   │   │   │   │   │   └── inline-seed.tsx
│   │   │   │   │   │   ├── recipe-floating-icon-button-class.ts
│   │   │   │   │   │   ├── recipe-graph-aux-node.tsx
│   │   │   │   │   │   ├── recipe-graph-node.tsx
│   │   │   │   │   │   ├── recipe-graph-semantic-edge.tsx
│   │   │   │   │   │   ├── recipe-studio-header.tsx
│   │   │   │   │   │   ├── rf-ui/
│   │   │   │   │   │   │   ├── base-handle.tsx
│   │   │   │   │   │   │   ├── base-node.tsx
│   │   │   │   │   │   │   ├── data-edge.tsx
│   │   │   │   │   │   │   └── labeled-handle.tsx
│   │   │   │   │   │   ├── runtime/
│   │   │   │   │   │   │   └── execution-progress-island.tsx
│   │   │   │   │   │   └── shared/
│   │   │   │   │   │       ├── available-references-inline.tsx
│   │   │   │   │   │       └── hf-dataset-combobox.tsx
│   │   │   │   │   ├── constants.ts
│   │   │   │   │   ├── data/
│   │   │   │   │   │   └── executions-db.ts
│   │   │   │   │   ├── dialogs/
│   │   │   │   │   │   ├── config-dialog.tsx
│   │   │   │   │   │   ├── expression/
│   │   │   │   │   │   │   └── expression-dialog.tsx
│   │   │   │   │   │   ├── import-dialog.tsx
│   │   │   │   │   │   ├── llm/
│   │   │   │   │   │   │   ├── general-tab.tsx
│   │   │   │   │   │   │   ├── llm-dialog.tsx
│   │   │   │   │   │   │   └── scores-tab.tsx
│   │   │   │   │   │   ├── markdown-note/
│   │   │   │   │   │   │   └── markdown-note-dialog.tsx
│   │   │   │   │   │   ├── models/
│   │   │   │   │   │   │   ├── model-config-dialog.tsx
│   │   │   │   │   │   │   └── model-provider-dialog.tsx
│   │   │   │   │   │   ├── preview-dialog.tsx
│   │   │   │   │   │   ├── processors-dialog.tsx
│   │   │   │   │   │   ├── samplers/
│   │   │   │   │   │   │   ├── bernoulli-dialog.tsx
│   │   │   │   │   │   │   ├── category-dialog.tsx
│   │   │   │   │   │   │   ├── datetime-dialog.tsx
│   │   │   │   │   │   │   ├── gaussian-dialog.tsx
│   │   │   │   │   │   │   ├── person-dialog.tsx
│   │   │   │   │   │   │   ├── subcategory-dialog.tsx
│   │   │   │   │   │   │   ├── timedelta-dialog.tsx
│   │   │   │   │   │   │   ├── uniform-dialog.tsx
│   │   │   │   │   │   │   └── uuid-dialog.tsx
│   │   │   │   │   │   ├── seed/
│   │   │   │   │   │   │   └── seed-dialog.tsx
│   │   │   │   │   │   ├── shared/
│   │   │   │   │   │   │   ├── available-variables.tsx
│   │   │   │   │   │   │   ├── collapsible-section-trigger.tsx
│   │   │   │   │   │   │   ├── dialog-shell.tsx
│   │   │   │   │   │   │   ├── field-label.tsx
│   │   │   │   │   │   │   ├── name-field.tsx
│   │   │   │   │   │   │   └── validation-banner.tsx
│   │   │   │   │   │   ├── tool-profile/
│   │   │   │   │   │   │   ├── helpers.ts
│   │   │   │   │   │   │   └── tool-profile-dialog.tsx
│   │   │   │   │   │   └── validators/
│   │   │   │   │   │       └── validator-dialog.tsx
│   │   │   │   │   ├── execution-types.ts
│   │   │   │   │   ├── executions/
│   │   │   │   │   │   ├── execution-helpers.ts
│   │   │   │   │   │   ├── hydration.ts
│   │   │   │   │   │   ├── run-settings.ts
│   │   │   │   │   │   ├── runtime.ts
│   │   │   │   │   │   └── tracker.ts
│   │   │   │   │   ├── hooks/
│   │   │   │   │   │   ├── use-node-connection-status.ts
│   │   │   │   │   │   ├── use-recipe-editor-graph.ts
│   │   │   │   │   │   ├── use-recipe-executions.ts
│   │   │   │   │   │   ├── use-recipe-persistence.ts
│   │   │   │   │   │   ├── use-recipe-runtime-visuals.ts
│   │   │   │   │   │   └── use-recipe-studio-actions.ts
│   │   │   │   │   ├── index.ts
│   │   │   │   │   ├── recipe-studio-page.tsx
│   │   │   │   │   ├── stores/
│   │   │   │   │   │   ├── helpers/
│   │   │   │   │   │   │   ├── edge-sync.ts
│   │   │   │   │   │   │   ├── model-infra-layout.ts
│   │   │   │   │   │   │   ├── node-updates.ts
│   │   │   │   │   │   │   ├── reference-sync.ts
│   │   │   │   │   │   │   └── removals.ts
│   │   │   │   │   │   ├── recipe-executions.ts
│   │   │   │   │   │   ├── recipe-studio-helpers.ts
│   │   │   │   │   │   └── recipe-studio.ts
│   │   │   │   │   ├── types/
│   │   │   │   │   │   └── index.ts
│   │   │   │   │   └── utils/
│   │   │   │   │       ├── config-factories.ts
│   │   │   │   │       ├── config-labels.ts
│   │   │   │   │       ├── config-type-guards.ts
│   │   │   │   │       ├── graph/
│   │   │   │   │       │   ├── derive-display-graph.ts
│   │   │   │   │       │   ├── fit-view.ts
│   │   │   │   │       │   ├── recipe-graph-connection.ts
│   │   │   │   │       │   ├── relations.ts
│   │   │   │   │       │   └── runtime-visual-state.ts
│   │   │   │   │       ├── graph-warnings.ts
│   │   │   │   │       ├── graph.ts
│   │   │   │   │       ├── handle-layout.ts
│   │   │   │   │       ├── handles.ts
│   │   │   │   │       ├── image-preview.ts
│   │   │   │   │       ├── import/
│   │   │   │   │       │   ├── edges.ts
│   │   │   │   │       │   ├── helpers.ts
│   │   │   │   │       │   ├── importer.ts
│   │   │   │   │       │   ├── index.ts
│   │   │   │   │       │   ├── parsers/
│   │   │   │   │       │   │   ├── expression-parser.ts
│   │   │   │   │       │   │   ├── llm-parser.ts
│   │   │   │   │       │   │   ├── model-parser.ts
│   │   │   │   │       │   │   ├── sampler-parser.ts
│   │   │   │   │       │   │   ├── seed-config-parser.ts
│   │   │   │   │       │   │   └── validator-parser.ts
│   │   │   │   │       │   ├── parsers.ts
│   │   │   │   │       │   ├── types.ts
│   │   │   │   │       │   └── ui.ts
│   │   │   │   │       ├── index.ts
│   │   │   │   │       ├── layout.ts
│   │   │   │   │       ├── naming.ts
│   │   │   │   │       ├── node-data.ts
│   │   │   │   │       ├── parse.ts
│   │   │   │   │       ├── payload/
│   │   │   │   │       │   ├── build-payload.ts
│   │   │   │   │       │   ├── builders-llm.ts
│   │   │   │   │       │   ├── builders-model.ts
│   │   │   │   │       │   ├── builders-processors.ts
│   │   │   │   │       │   ├── builders-sampler.ts
│   │   │   │   │       │   ├── builders-seed.ts
│   │   │   │   │       │   ├── builders-validator.ts
│   │   │   │   │       │   ├── builders.ts
│   │   │   │   │       │   ├── empty.ts
│   │   │   │   │       │   ├── index.ts
│   │   │   │   │       │   ├── parse.ts
│   │   │   │   │       │   ├── types.ts
│   │   │   │   │       │   └── validate.ts
│   │   │   │   │       ├── processors.ts
│   │   │   │   │       ├── reactflow-changes.ts
│   │   │   │   │       ├── recipe-studio-view.ts
│   │   │   │   │       ├── refs.ts
│   │   │   │   │       ├── rf-node-dimensions.ts
│   │   │   │   │       ├── ui-tones.ts
│   │   │   │   │       ├── validation.ts
│   │   │   │   │       ├── validators/
│   │   │   │   │       │   ├── code-lang.ts
│   │   │   │   │       │   ├── oxc-code-shape.ts
│   │   │   │   │       │   └── oxc-mode.ts
│   │   │   │   │       └── variables.ts
│   │   │   │   ├── studio/
│   │   │   │   │   ├── index.ts
│   │   │   │   │   ├── sections/
│   │   │   │   │   │   ├── charts/
│   │   │   │   │   │   │   ├── chart-preferences-store.ts
│   │   │   │   │   │   │   ├── chart-settings-sheet.tsx
│   │   │   │   │   │   │   ├── eval-loss-chart-card.tsx
│   │   │   │   │   │   │   ├── grad-norm-chart-card.tsx
│   │   │   │   │   │   │   ├── learning-rate-chart-card.tsx
│   │   │   │   │   │   │   ├── training-loss-chart-card.tsx
│   │   │   │   │   │   │   ├── types.ts
│   │   │   │   │   │   │   └── utils.ts
│   │   │   │   │   │   ├── charts-content.tsx
│   │   │   │   │   │   ├── charts-section.tsx
│   │   │   │   │   │   ├── dataset-preview-dialog-mapping.tsx
│   │   │   │   │   │   ├── dataset-preview-dialog-utils.ts
│   │   │   │   │   │   ├── dataset-preview-dialog.tsx
│   │   │   │   │   │   ├── dataset-section.tsx
│   │   │   │   │   │   ├── document-upload-redirect-dialog.tsx
│   │   │   │   │   │   ├── model-section.tsx
│   │   │   │   │   │   ├── params-section.tsx
│   │   │   │   │   │   ├── progress-section-lib.ts
│   │   │   │   │   │   ├── progress-section.tsx
│   │   │   │   │   │   └── training-section.tsx
│   │   │   │   │   ├── studio-page.tsx
│   │   │   │   │   ├── tour/
│   │   │   │   │   │   ├── index.ts
│   │   │   │   │   │   ├── steps/
│   │   │   │   │   │   │   ├── base-model.tsx
│   │   │   │   │   │   │   ├── dataset.tsx
│   │   │   │   │   │   │   ├── index.tsx
│   │   │   │   │   │   │   ├── local-model.tsx
│   │   │   │   │   │   │   ├── method.tsx
│   │   │   │   │   │   │   ├── nav.tsx
│   │   │   │   │   │   │   ├── params.tsx
│   │   │   │   │   │   │   ├── save.tsx
│   │   │   │   │   │   │   └── start.tsx
│   │   │   │   │   │   └── training/
│   │   │   │   │   │       ├── index.ts
│   │   │   │   │   │       └── steps.tsx
│   │   │   │   │   ├── training-start-overlay.tsx
│   │   │   │   │   └── training-view.tsx
│   │   │   │   ├── tour/
│   │   │   │   │   ├── components/
│   │   │   │   │   │   ├── guided-tour.tsx
│   │   │   │   │   │   ├── read-more.tsx
│   │   │   │   │   │   └── spotlight-overlay.tsx
│   │   │   │   │   ├── hooks/
│   │   │   │   │   │   └── use-guided-tour-controller.ts
│   │   │   │   │   ├── index.ts
│   │   │   │   │   └── types.ts
│   │   │   │   └── training/
│   │   │   │       ├── api/
│   │   │   │       │   ├── datasets-api.ts
│   │   │   │       │   ├── mappers.ts
│   │   │   │       │   ├── models-api.ts
│   │   │   │       │   └── train-api.ts
│   │   │   │       ├── components/
│   │   │   │       │   └── hf-dataset-subset-split-selectors.tsx
│   │   │   │       ├── hooks/
│   │   │   │       │   ├── use-max-steps-epochs-toggle.ts
│   │   │   │       │   ├── use-training-actions.ts
│   │   │   │       │   └── use-training-runtime-lifecycle.ts
│   │   │   │       ├── index.ts
│   │   │   │       ├── stores/
│   │   │   │       │   ├── dataset-preview-dialog-store.ts
│   │   │   │       │   ├── training-config-store.ts
│   │   │   │       │   └── training-runtime-store.ts
│   │   │   │       └── types/
│   │   │   │           ├── api.ts
│   │   │   │           ├── config.ts
│   │   │   │           ├── datasets.ts
│   │   │   │           └── runtime.ts
│   │   │   ├── hooks/
│   │   │   │   ├── index.ts
│   │   │   │   ├── use-debounced-value.ts
│   │   │   │   ├── use-gpu-info.ts
│   │   │   │   ├── use-gpu-utilization.ts
│   │   │   │   ├── use-hardware-info.ts
│   │   │   │   ├── use-hf-dataset-search.ts
│   │   │   │   ├── use-hf-dataset-splits.ts
│   │   │   │   ├── use-hf-model-search.ts
│   │   │   │   ├── use-hf-paginated-search.ts
│   │   │   │   ├── use-hf-token-validation.ts
│   │   │   │   ├── use-infinite-scroll.ts
│   │   │   │   ├── use-mobile.ts
│   │   │   │   └── use-recommended-model-vram.ts
│   │   │   ├── index.css
│   │   │   ├── main.tsx
│   │   │   ├── shared/
│   │   │   │   └── toast.ts
│   │   │   ├── speech-recognition.d.ts
│   │   │   ├── stores/
│   │   │   │   ├── index.ts
│   │   │   │   └── training.ts
│   │   │   ├── types/
│   │   │   │   ├── index.ts
│   │   │   │   └── training.ts
│   │   │   └── utils/
│   │   │       ├── index.ts
│   │   │       └── strings.ts
│   │   ├── tsconfig.app.json
│   │   ├── tsconfig.json
│   │   ├── tsconfig.node.json
│   │   └── vite.config.ts
│   ├── install_python_stack.py
│   ├── setup.bat
│   ├── setup.ps1
│   └── setup.sh
├── tests/
│   ├── __init__.py
│   ├── qlora/
│   │   ├── README.md
│   │   ├── test_hf_qlora_train_and_merge.py
│   │   └── test_unsloth_qlora_train_and_merge.py
│   ├── saving/
│   │   ├── gpt-oss-merge/
│   │   │   ├── run_test.sh
│   │   │   ├── test_merged_model.py
│   │   │   └── train_and_merge.py
│   │   ├── language_models/
│   │   │   ├── test_merge_4bit_validation.py
│   │   │   ├── test_merge_model_perplexity_llama-3.2.py
│   │   │   ├── test_merge_model_perplexity_mistral.py
│   │   │   ├── test_merge_model_perplexity_phi_4.py
│   │   │   ├── test_merged_model_perplexity_llama-3.1-8b.py
│   │   │   ├── test_merged_model_perplexity_qwen_2.5.py
│   │   │   ├── test_push_to_hub_merged.py
│   │   │   ├── test_push_to_hub_merged_sharded_index_file.py
│   │   │   └── test_save_merged_grpo_model.py
│   │   ├── non_peft/
│   │   │   ├── test_mistral_non_peft.py
│   │   │   └── test_whisper_non_peft.py
│   │   ├── test_unsloth_save.py
│   │   ├── text_to_speech_models/
│   │   │   ├── test_csm.py
│   │   │   ├── test_lasa.py
│   │   │   ├── test_orpheus.py
│   │   │   └── test_whisper.py
│   │   └── vision_models/
│   │       ├── test_index_file_sharded_model.py
│   │       ├── test_push_to_hub_merged.py
│   │       ├── test_save_merge_qwen2.5vl32B_model_ocr_benchmark.py
│   │       └── test_save_merge_vision_model_ocr_benchmark.py
│   ├── test_get_model_name.py
│   ├── test_model_registry.py
│   ├── test_raw_text.py
│   └── utils/
│       ├── __init__.py
│       ├── aime_eval.md
│       ├── aime_eval.py
│       ├── cleanup_utils.py
│       ├── data_utils.py
│       ├── hf_utils.py
│       ├── ocr_eval.md
│       ├── ocr_eval.py
│       ├── os_utils.py
│       ├── perplexity_eval.md
│       ├── perplexity_eval.py
│       ├── test_attention_masks.py
│       ├── test_packing.py
│       ├── test_qat.py
│       └── test_trunc_normal_patch.py
├── unsloth/
│   ├── __init__.py
│   ├── _auto_install.py
│   ├── chat_templates.py
│   ├── dataprep/
│   │   ├── __init__.py
│   │   ├── raw_text.py
│   │   ├── synthetic.py
│   │   └── synthetic_configs.py
│   ├── device_type.py
│   ├── import_fixes.py
│   ├── kernels/
│   │   ├── __init__.py
│   │   ├── cross_entropy_loss.py
│   │   ├── fast_lora.py
│   │   ├── flex_attention.py
│   │   ├── fp8.py
│   │   ├── geglu.py
│   │   ├── layernorm.py
│   │   ├── moe/
│   │   │   ├── LICENSE
│   │   │   ├── README.md
│   │   │   ├── __init__.py
│   │   │   ├── autotune_cache.py
│   │   │   ├── benchmark/
│   │   │   │   ├── benchmark_fused_moe.py
│   │   │   │   └── utils.py
│   │   │   ├── grouped_gemm/
│   │   │   │   ├── LICENSE
│   │   │   │   ├── __init__.py
│   │   │   │   ├── interface.py
│   │   │   │   ├── kernels/
│   │   │   │   │   ├── __init__.py
│   │   │   │   │   ├── autotuning.py
│   │   │   │   │   ├── backward.py
│   │   │   │   │   ├── forward.py
│   │   │   │   │   └── tuning.py
│   │   │   │   └── reference/
│   │   │   │       ├── __init__.py
│   │   │   │       ├── layers/
│   │   │   │       │   ├── llama4_moe.py
│   │   │   │       │   └── qwen3_moe.py
│   │   │   │       ├── moe_block.py
│   │   │   │       └── moe_ops.py
│   │   │   ├── requirements.txt
│   │   │   └── tests/
│   │   │       ├── __init__.py
│   │   │       ├── common.py
│   │   │       ├── moe_utils.py
│   │   │       ├── run_qwen3_moe_tests.sh
│   │   │       ├── test_grouped_gemm.py
│   │   │       ├── test_llama4_moe.py
│   │   │       └── test_qwen3_moe.py
│   │   ├── rms_layernorm.py
│   │   ├── rope_embedding.py
│   │   ├── swiglu.py
│   │   └── utils.py
│   ├── models/
│   │   ├── __init__.py
│   │   ├── _utils.py
│   │   ├── cohere.py
│   │   ├── dpo.py
│   │   ├── falcon_h1.py
│   │   ├── gemma.py
│   │   ├── gemma2.py
│   │   ├── glm4_moe.py
│   │   ├── granite.py
│   │   ├── llama.py
│   │   ├── llama4.py
│   │   ├── loader.py
│   │   ├── loader_utils.py
│   │   ├── mapper.py
│   │   ├── mistral.py
│   │   ├── qwen2.py
│   │   ├── qwen3.py
│   │   ├── qwen3_moe.py
│   │   ├── rl.py
│   │   ├── rl_replacements.py
│   │   ├── sentence_transformer.py
│   │   └── vision.py
│   ├── ollama_template_mappers.py
│   ├── registry/
│   │   ├── REGISTRY.md
│   │   ├── __init__.py
│   │   ├── _deepseek.py
│   │   ├── _gemma.py
│   │   ├── _llama.py
│   │   ├── _mistral.py
│   │   ├── _phi.py
│   │   ├── _qwen.py
│   │   └── registry.py
│   ├── save.py
│   ├── tokenizer_utils.py
│   ├── trainer.py
│   └── utils/
│       ├── __init__.py
│       ├── attention_dispatch.py
│       ├── hf_hub.py
│       └── packing.py
├── unsloth-cli.py
└── unsloth_cli/
    ├── __init__.py
    ├── commands/
    │   ├── __init__.py
    │   ├── export.py
    │   ├── inference.py
    │   ├── studio.py
    │   ├── train.py
    │   └── ui.py
    ├── config.py
    └── options.py
Download .txt
Showing preview only (325K chars total). Download the full file or copy to clipboard to get everything.
SYMBOL INDEX (3574 symbols across 513 files)

FILE: scripts/enforce_kwargs_spacing.py
  function enforce_spacing (line 15) | def enforce_spacing(text: str) -> tuple[str, bool]:
  function remove_redundant_passes (line 66) | def remove_redundant_passes(text: str) -> tuple[str, bool]:
  function process_file (line 137) | def process_file(path: Path) -> bool:
  function main (line 154) | def main(argv: list[str]) -> int:

FILE: scripts/run_ruff_format.py
  function main (line 13) | def main(argv: list[str]) -> int:

FILE: studio/backend/auth/authentication.py
  function _get_secret_for_subject (line 27) | def _get_secret_for_subject(subject: str) -> str:
  function _decode_subject_without_verification (line 37) | def _decode_subject_without_verification(token: str) -> Optional[str]:
  function create_access_token (line 50) | def create_access_token(
  function create_refresh_token (line 71) | def create_refresh_token(subject: str) -> str:
  function refresh_access_token (line 83) | def refresh_access_token(refresh_token: str) -> Tuple[Optional[str], Opt...
  function reload_secret (line 96) | def reload_secret() -> None:
  function get_current_subject (line 105) | async def get_current_subject(
  function get_current_subject_allow_password_change (line 115) | async def get_current_subject_allow_password_change(
  function _get_current_subject (line 125) | async def _get_current_subject(

FILE: studio/backend/auth/hashing.py
  function hash_password (line 14) | def hash_password(password: str, salt: str | None = None) -> Tuple[str, ...
  function verify_password (line 31) | def verify_password(password: str, salt: str, hashed: str) -> bool:

FILE: studio/backend/auth/storage.py
  function generate_bootstrap_password (line 27) | def generate_bootstrap_password() -> str:
  function get_bootstrap_password (line 61) | def get_bootstrap_password() -> Optional[str]:
  function clear_bootstrap_password (line 66) | def clear_bootstrap_password() -> None:
  function _hash_token (line 74) | def _hash_token(token: str) -> str:
  function get_connection (line 79) | def get_connection() -> sqlite3.Connection:
  function is_initialized (line 115) | def is_initialized() -> bool:
  function create_initial_user (line 124) | def create_initial_user(
  function delete_user (line 159) | def delete_user(username: str) -> None:
  function get_user_and_secret (line 173) | def get_user_and_secret(username: str) -> Optional[Tuple[str, str, str, ...
  function get_jwt_secret (line 203) | def get_jwt_secret(username: str) -> Optional[str]:
  function requires_password_change (line 217) | def requires_password_change(username: str) -> bool:
  function load_jwt_secret (line 231) | def load_jwt_secret() -> str:
  function ensure_default_admin (line 250) | def ensure_default_admin() -> bool:
  function update_password (line 269) | def update_password(username: str, new_password: str) -> bool:
  function save_refresh_token (line 293) | def save_refresh_token(token: str, username: str, expires_at: str) -> None:
  function verify_refresh_token (line 312) | def verify_refresh_token(token: str) -> Optional[str]:
  function revoke_user_refresh_tokens (line 352) | def revoke_user_refresh_tokens(username: str) -> None:

FILE: studio/backend/colab.py
  function _bootstrap_studio_venv (line 13) | def _bootstrap_studio_venv() -> None:
  function get_colab_url (line 48) | def get_colab_url(port: int = 8888) -> str:
  function show_link (line 63) | def show_link(port: int = 8888):
  function start (line 99) | def start(port: int = 8888):

FILE: studio/backend/core/__init__.py
  function __getattr__ (line 53) | def __getattr__(name):

FILE: studio/backend/core/data_recipe/huggingface.py
  class RecipeDatasetPublishError (line 20) | class RecipeDatasetPublishError(ValueError):
  function _resolve_recipe_artifact_path (line 24) | def _resolve_recipe_artifact_path(artifact_path: str) -> Path:
  function publish_recipe_dataset (line 46) | def publish_recipe_dataset(

FILE: studio/backend/core/data_recipe/jobs/manager.py
  class Subscription (line 37) | class Subscription:
    method next_event (line 42) | async def next_event(self, *, timeout_sec: float) -> dict | None:
    method format_sse (line 49) | def format_sse(self, event: dict) -> bytes:
  class JobManager (line 62) | class JobManager:
    method __init__ (line 63) | def __init__(self) -> None:
    method start (line 74) | def start(self, *, recipe: dict, run: dict) -> str:
    method cancel (line 118) | def cancel(self, job_id: str) -> bool:
    method get_status (line 135) | def get_status(self, job_id: str) -> dict | None:
    method get_current_status (line 195) | def get_current_status(self) -> dict | None:
    method get_current_job_id (line 202) | def get_current_job_id(self) -> str | None:
    method get_analysis (line 207) | def get_analysis(self, job_id: str) -> dict | None:
    method get_dataset (line 214) | def get_dataset(
    method _load_dataset_page (line 251) | def _load_dataset_page(
    method _load_dataset_page_with_duckdb (line 271) | def _load_dataset_page_with_duckdb(
    method _load_dataset_page_with_data_designer (line 313) | def _load_dataset_page_with_data_designer(
    method subscribe (line 326) | def subscribe(
    method unsubscribe (line 341) | def unsubscribe(self, sub: Subscription) -> None:
    method _emit (line 346) | def _emit(self, event: dict) -> None:
    method _snapshot (line 360) | def _snapshot(self) -> tuple[Job, mp.Process, Any] | None:
    method _read_queue_with_timeout (line 368) | def _read_queue_with_timeout(q: Any, *, timeout_sec: float) -> dict | ...
    method _drain_queue (line 378) | def _drain_queue(q: Any) -> list[dict]:
    method _pump_loop (line 389) | def _pump_loop(self) -> None:
    method _handle_event (line 434) | def _handle_event(self, job: Job, event: dict) -> None:
  function get_job_manager (line 471) | def get_job_manager() -> JobManager:

FILE: studio/backend/core/data_recipe/jobs/parse.py
  class ParsedUpdate (line 26) | class ParsedUpdate:
  function parse_log_message (line 66) | def parse_log_message(msg: str) -> ParsedUpdate | None:
  function apply_update (line 145) | def apply_update(job: Job, update: ParsedUpdate) -> None:
  function _compute_overall_progress (line 219) | def _compute_overall_progress(job: Job, column_progress: Progress) -> Pr...
  function coerce_event (line 260) | def coerce_event(obj: Any) -> dict:

FILE: studio/backend/core/data_recipe/jobs/types.py
  class Progress (line 22) | class Progress:
  class BatchProgress (line 33) | class BatchProgress:
  class ModelUsage (line 39) | class ModelUsage:
  class Job (line 52) | class Job:

FILE: studio/backend/core/data_recipe/jobs/worker.py
  class _QueueLogHandler (line 26) | class _QueueLogHandler(logging.Handler):
    method __init__ (line 27) | def __init__(self, event_queue):
    method emit (line 31) | def emit(self, record: logging.LogRecord) -> None:
  function _slugify_run_name (line 45) | def _slugify_run_name(value: str) -> str:
  function _build_dataset_name (line 54) | def _build_dataset_name(
  function run_job_process (line 68) | def run_job_process(
  function _merge_batches_to_single_parquet (line 189) | def _merge_batches_to_single_parquet(base_dataset_path: Path) -> None:
  function _rewrite_merged_metadata (line 211) | def _rewrite_merged_metadata(*, base_dataset_path: Path, parquet_file: P...

FILE: studio/backend/core/data_recipe/jsonable.py
  function _pil_to_preview_payload (line 12) | def _pil_to_preview_payload(image: Any) -> dict[str, Any]:
  function _open_pil_image_from_bytes (line 24) | def _open_pil_image_from_bytes(raw_bytes: bytes):
  function _to_pil_from_hf_image_dict (line 31) | def _to_pil_from_hf_image_dict(value: Any) -> Any | None:
  function to_jsonable (line 64) | def to_jsonable(value: Any) -> Any:
  function _to_preview_image_payload (line 91) | def _to_preview_image_payload(value: Any) -> dict[str, Any] | None:
  function to_preview_jsonable (line 106) | def to_preview_jsonable(value: Any) -> Any:

FILE: studio/backend/core/data_recipe/local_callable_validators.py
  class OxcLocalCallableValidatorSpec (line 37) | class OxcLocalCallableValidatorSpec:
  function split_oxc_local_callable_validators (line 47) | def split_oxc_local_callable_validators(
  function register_oxc_local_callable_validators (line 77) | def register_oxc_local_callable_validators(
  function _parse_oxc_spec (line 111) | def _parse_oxc_spec(
  function _parse_batch_size (line 161) | def _parse_batch_size(value: Any) -> int:
  function _parse_oxc_validation_marker (line 169) | def _parse_oxc_validation_marker(fn_name: str) -> tuple[str, str, str]:
  function _build_oxc_validation_function (line 186) | def _build_oxc_validation_function(lang: str, validation_mode: str, code...
  function _run_oxc_batch (line 225) | def _run_oxc_batch(
  function _fallback_results (line 327) | def _fallback_results(row_count: int, message: str) -> list[dict[str, An...

FILE: studio/backend/core/data_recipe/oxc-validator/validate.mjs
  constant LANG_TO_EXT (line 11) | const LANG_TO_EXT = {
  constant VALIDATION_MODES (line 18) | const VALIDATION_MODES = new Set(["syntax", "lint", "syntax+lint"]);
  constant CODE_SHAPES (line 19) | const CODE_SHAPES = new Set(["auto", "module", "snippet"]);
  constant SNIPPET_PREFIX (line 20) | const SNIPPET_PREFIX = "(() => {\n";
  constant SNIPPET_SUFFIX (line 21) | const SNIPPET_SUFFIX = "\n})();\nexport {};\n";
  constant OXLINT_SUPPRESSED_RULES (line 22) | const OXLINT_SUPPRESSED_RULES = ["no-unused-vars", "no-new-array"];
  constant TOOL_DIR (line 23) | const TOOL_DIR = dirname(fileURLToPath(import.meta.url));
  function mapLang (line 25) | function mapLang(value) {
  function mapMode (line 42) | function mapMode(value) {
  function mapCodeShape (line 50) | function mapCodeShape(value) {
  function parseFileIndex (line 58) | function parseFileIndex(filePath) {
  function toCodeString (line 70) | function toCodeString(code) {
  function makeValidationEntry (line 74) | function makeValidationEntry({ code, index, lang, codeShape }) {
  function shiftOffset (line 92) | function shiftOffset(value, offset) {
  function remapDiagnosticOffsets (line 100) | function remapDiagnosticOffsets(diagnostic, offset) {
  function normalizeParserError (line 116) | function normalizeParserError(error) {
  function normalizeLintDiagnostic (line 164) | function normalizeLintDiagnostic(diagnostic) {
  function makeResult (line 209) | function makeResult({
  function syntaxResultFromErrors (line 231) | function syntaxResultFromErrors(errors) {
  function runSyntaxParse (line 245) | function runSyntaxParse(entry) {
  function pickPreferredErrorList (line 271) | function pickPreferredErrorList(firstErrors, secondErrors) {
  function validateSyntaxOne (line 278) | function validateSyntaxOne({ code, lang, index, codeShape }) {
  function resolveLintEntry (line 329) | function resolveLintEntry({ code, lang, index, codeShape }) {
  function fallbackLintResults (line 362) | function fallbackLintResults(entries, message) {
  function runLintBatch (line 377) | function runLintBatch(entries) {
  function readStdin (line 487) | function readStdin() {
  function runValidation (line 499) | function runValidation({ codes, lang, mode, codeShape }) {
  function main (line 545) | async function main() {

FILE: studio/backend/core/data_recipe/service.py
  function _encode_bytes_to_base64 (line 21) | def _encode_bytes_to_base64(value: bytes | bytearray) -> str:
  function _load_image_file_to_base64 (line 25) | def _load_image_file_to_base64(
  function _pil_image_to_base64 (line 48) | def _pil_image_to_base64(value: Any) -> str | None:
  function _normalize_image_context_value (line 63) | def _normalize_image_context_value(value: Any, *, base_path: str | None ...
  function _apply_data_designer_image_context_patch (line 106) | def _apply_data_designer_image_context_patch() -> None:
  function build_model_providers (line 133) | def build_model_providers(recipe: dict[str, Any]):
  function _recipe_has_llm_columns (line 156) | def _recipe_has_llm_columns(recipe: dict[str, Any]) -> bool:
  function _validate_recipe_runtime_support (line 166) | def _validate_recipe_runtime_support(
  function build_mcp_providers (line 179) | def build_mcp_providers(
  function build_config_builder (line 222) | def build_config_builder(recipe: dict[str, Any]):
  function create_data_designer (line 258) | def create_data_designer(
  function validate_recipe (line 276) | def validate_recipe(recipe: dict[str, Any]) -> None:
  function preview_recipe (line 282) | def preview_recipe(

FILE: studio/backend/core/export/export.py
  function _is_wsl (line 32) | def _is_wsl():
  function _apply_wsl_sudo_patch (line 40) | def _apply_wsl_sudo_patch():
  class ExportBackend (line 95) | class ExportBackend:
    method __init__ (line 98) | def __init__(self):
    method cleanup_memory (line 107) | def cleanup_memory(self):
    method scan_checkpoints (line 133) | def scan_checkpoints(
    method load_checkpoint (line 146) | def load_checkpoint(
    method _write_export_metadata (line 289) | def _write_export_metadata(self, save_directory: str):
    method export_merged_model (line 305) | def export_merged_model(
    method export_base_model (line 390) | def export_base_model(
    method export_gguf (line 486) | def export_gguf(
    method export_lora_adapter (line 611) | def export_lora_adapter(
  function get_export_backend (line 672) | def get_export_backend() -> ExportBackend:

FILE: studio/backend/core/export/orchestrator.py
  class ExportOrchestrator (line 33) | class ExportOrchestrator:
    method __init__ (line 42) | def __init__(self):
    method _spawn_subprocess (line 61) | def _spawn_subprocess(self, config: dict) -> None:
    method _shutdown_subprocess (line 80) | def _shutdown_subprocess(self, timeout: float = 10.0) -> None:
    method _cleanup (line 122) | def _cleanup(self):
    method _ensure_subprocess_alive (line 126) | def _ensure_subprocess_alive(self) -> bool:
    method _send_cmd (line 134) | def _send_cmd(self, cmd: dict) -> None:
    method _read_resp (line 143) | def _read_resp(self, timeout: float = 1.0) -> Optional[dict]:
    method _wait_response (line 154) | def _wait_response(self, expected_type: str, timeout: float = 3600.0) ...
    method _drain_queue (line 197) | def _drain_queue(self) -> list:
    method load_checkpoint (line 214) | def load_checkpoint(
    method export_merged_model (line 264) | def export_merged_model(
    method export_base_model (line 286) | def export_base_model(
    method export_gguf (line 308) | def export_gguf(
    method export_lora_adapter (line 328) | def export_lora_adapter(
    method _run_export (line 348) | def _run_export(self, export_type: str, params: dict) -> Tuple[bool, s...
    method cleanup_memory (line 365) | def cleanup_memory(self) -> bool:
    method scan_checkpoints (line 389) | def scan_checkpoints(
  function get_export_backend (line 402) | def get_export_backend() -> ExportOrchestrator:

FILE: studio/backend/core/export/worker.py
  function _activate_transformers_version (line 32) | def _activate_transformers_version(model_name: str) -> None:
  function _send_response (line 66) | def _send_response(resp_queue: Any, response: dict) -> None:
  function _handle_load (line 74) | def _handle_load(backend, cmd: dict, resp_queue: Any) -> None:
  function _handle_export (line 124) | def _handle_export(backend, cmd: dict, resp_queue: Any) -> None:
  function _handle_cleanup (line 190) | def _handle_cleanup(backend, resp_queue: Any) -> None:
  function run_export_process (line 214) | def run_export_process(

FILE: studio/backend/core/inference/audio_codecs.py
  function _numpy_to_wav_bytes (line 22) | def _numpy_to_wav_bytes(waveform: np.ndarray, sample_rate: int) -> bytes:
  class AudioCodecManager (line 40) | class AudioCodecManager:
    method __init__ (line 43) | def __init__(self):
    method load_codec (line 49) | def load_codec(
    method _load_snac (line 69) | def _load_snac(self, device: str) -> None:
    method _load_bicodec (line 79) | def _load_bicodec(self, device: str, model_repo_path: Optional[str] = ...
    method _load_dac (line 117) | def _load_dac(self, device: str) -> None:
    method decode_snac (line 172) | def decode_snac(
    method decode_csm (line 228) | def decode_csm(self, audio_values: torch.Tensor) -> Tuple[bytes, int]:
    method decode_bicodec (line 236) | def decode_bicodec(self, generated_text: str, device: str) -> Tuple[by...
    method decode_dac (line 282) | def decode_dac(self, generated_text: str, device: str) -> Tuple[bytes,...
    method decode (line 305) | def decode(
    method unload (line 329) | def unload(self) -> None:

FILE: studio/backend/core/inference/defaults.py
  function get_default_models (line 27) | def get_default_models() -> list[str]:

FILE: studio/backend/core/inference/inference.py
  class HarmonyTextStreamer (line 31) | class HarmonyTextStreamer:
    method __init__ (line 64) | def __init__(self, tokenizer, *, skip_prompt: bool = True, timeout: fl...
    method put (line 87) | def put(self, value):
    method end (line 113) | def end(self):
    method __iter__ (line 133) | def __iter__(self):
    method __next__ (line 136) | def __next__(self):
    method _process_incremental (line 154) | def _process_incremental(self, raw: str) -> None:
  class InferenceBackend (line 205) | class InferenceBackend:
    method __init__ (line 208) | def __init__(self):
    method _normalize_top_k (line 232) | def _normalize_top_k(top_k: int) -> int:
    method load_model (line 236) | def load_model(
    method unload_model (line 531) | def unload_model(self, model_name: str) -> bool:
    method revert_to_base_model (line 568) | def revert_to_base_model(self, base_model_name: str) -> bool:
    method load_for_eval (line 603) | def load_for_eval(
    method load_adapter (line 663) | def load_adapter(
    method set_active_adapter (line 698) | def set_active_adapter(self, base_model_name: str, adapter_name: str) ...
    method _apply_adapter_state (line 713) | def _apply_adapter_state(self, use_adapter: Optional[Union[bool, str]]...
    method generate_with_adapter_control (line 773) | def generate_with_adapter_control(
    method generate_chat_response (line 795) | def generate_chat_response(
    method _generate_chat_response_inner (line 825) | def _generate_chat_response_inner(
    method _generate_vision_response (line 953) | def _generate_vision_response(
    method generate_audio_input_response (line 1093) | def generate_audio_input_response(
    method generate_whisper_response (line 1222) | def generate_whisper_response(
    method _is_gpt_oss_model (line 1246) | def _is_gpt_oss_model(self, model_name: str = None) -> bool:
    method generate_stream (line 1263) | def generate_stream(
    method generate_audio_response (line 1421) | def generate_audio_response(
    method _generate_snac (line 1486) | def _generate_snac(
    method _generate_csm (line 1519) | def _generate_csm(self, model, processor, text, max_new_tokens):
    method _generate_bicodec (line 1530) | def _generate_bicodec(
    method _generate_dac (line 1553) | def _generate_dac(
    method _patch_repetition_penalty_processor (line 1593) | def _patch_repetition_penalty_processor(cls):
    method format_chat_prompt (line 1644) | def format_chat_prompt(self, messages: list, system_prompt: str = None...
    method _format_chat_manual (line 1737) | def _format_chat_manual(
    method _format_llama3_template (line 1762) | def _format_llama3_template(self, messages: list, special_tokens: dict...
    method _format_mistral_template (line 1777) | def _format_mistral_template(self, messages: list, special_tokens: dic...
    method _format_chatml_template (line 1815) | def _format_chatml_template(self, messages: list, special_tokens: dict...
    method _format_alpaca_template (line 1827) | def _format_alpaca_template(self, messages: list, special_tokens: dict...
    method _format_generic_template (line 1846) | def _format_generic_template(self, messages: list, special_tokens: dic...
    method check_vision_model_compatibility (line 1858) | def check_vision_model_compatibility(self) -> bool:
    method _reset_model_generation_state (line 1870) | def _reset_model_generation_state(self, model_name: str):
    method reset_generation_state (line 1891) | def reset_generation_state(self):
    method resize_image (line 1909) | def resize_image(self, img, max_size: int = 800):
    method _clean_generated_text (line 1921) | def _clean_generated_text(self, text: str) -> str:
    method _load_chat_template_info (line 1939) | def _load_chat_template_info(self, model_name: str):
    method get_current_model (line 2037) | def get_current_model(self) -> Optional[str]:
    method is_model_loading (line 2041) | def is_model_loading(self) -> bool:
    method get_loading_model (line 2045) | def get_loading_model(self) -> Optional[str]:
    method load_model_simple (line 2049) | def load_model_simple(
  function get_inference_backend (line 2095) | def get_inference_backend() -> InferenceBackend:

FILE: studio/backend/core/inference/llama_cpp.py
  class LlamaCppBackend (line 31) | class LlamaCppBackend:
    method __init__ (line 41) | def __init__(self):
    method is_loaded (line 67) | def is_loaded(self) -> bool:
    method is_active (line 71) | def is_active(self) -> bool:
    method base_url (line 76) | def base_url(self) -> str:
    method model_identifier (line 80) | def model_identifier(self) -> Optional[str]:
    method is_vision (line 84) | def is_vision(self) -> bool:
    method hf_variant (line 88) | def hf_variant(self) -> Optional[str]:
    method context_length (line 92) | def context_length(self) -> Optional[int]:
    method chat_template (line 96) | def chat_template(self) -> Optional[str]:
    method supports_reasoning (line 100) | def supports_reasoning(self) -> bool:
    method reasoning_default (line 104) | def reasoning_default(self) -> bool:
    method supports_tools (line 108) | def supports_tools(self) -> bool:
    method cache_type_kv (line 112) | def cache_type_kv(self) -> Optional[str]:
    method _find_llama_server_binary (line 118) | def _find_llama_server_binary() -> Optional[str]:
    method _get_gguf_size_bytes (line 210) | def _get_gguf_size_bytes(model_path: str) -> int:
    method _get_gpu_free_memory (line 236) | def _get_gpu_free_memory() -> list[tuple[int, int]]:
    method _select_gpus (line 282) | def _select_gpus(
    method _find_smallest_fitting_variant (line 324) | def _find_smallest_fitting_variant(
    method _find_free_port (line 380) | def _find_free_port() -> int:
    method _drain_stdout (line 388) | def _drain_stdout(self):
    method _gguf_skip_value (line 422) | def _gguf_skip_value(f, vtype: int) -> None:
    method _read_gguf_metadata (line 444) | def _read_gguf_metadata(self, gguf_path: str) -> None:
    method _download_gguf (line 535) | def _download_gguf(
    method _download_mmproj (line 702) | def _download_mmproj(
    method load_model (line 745) | def load_model(
    method unload_model (line 1029) | def unload_model(self) -> bool:
    method _kill_process (line 1068) | def _kill_process(self):
    method _kill_orphaned_servers (line 1088) | def _kill_orphaned_servers():
    method _cleanup (line 1128) | def _cleanup(self):
    method _wait_for_health (line 1132) | def _wait_for_health(self, timeout: float = 120.0, interval: float = 0...
    method _parse_tool_calls_from_text (line 1169) | def _parse_tool_calls_from_text(content: str) -> list[dict]:
    method _build_openai_messages (line 1296) | def _build_openai_messages(
    method _iter_text_cancellable (line 1333) | def _iter_text_cancellable(
    method _stream_with_retry (line 1362) | def _stream_with_retry(
    method generate_chat_completion (line 1448) | def generate_chat_completion(
    method generate_chat_completion_with_tools (line 1583) | def generate_chat_completion_with_tools(
    method detect_audio_type (line 1947) | def detect_audio_type(self) -> Optional[str]:
    method init_audio_codec (line 2009) | def init_audio_codec(self, audio_type: str) -> None:
    method generate_audio_response (line 2035) | def generate_audio_response(

FILE: studio/backend/core/inference/orchestrator.py
  class InferenceOrchestrator (line 43) | class InferenceOrchestrator:
    method __init__ (line 52) | def __init__(self):
    method default_models (line 100) | def default_models(self) -> list[str]:
    method _fetch_top_models (line 116) | def _fetch_top_models(self) -> None:
    method _spawn_subprocess (line 159) | def _spawn_subprocess(self, config: dict) -> None:
    method _cancel_generation (line 180) | def _cancel_generation(self) -> None:
    method _shutdown_subprocess (line 185) | def _shutdown_subprocess(self, timeout: float = 10.0) -> None:
    method _cleanup (line 233) | def _cleanup(self):
    method _ensure_subprocess_alive (line 237) | def _ensure_subprocess_alive(self) -> bool:
    method _send_cmd (line 245) | def _send_cmd(self, cmd: dict) -> None:
    method _read_resp (line 254) | def _read_resp(self, timeout: float = 1.0) -> Optional[dict]:
    method _wait_response (line 265) | def _wait_response(self, expected_type: str, timeout: float = 120.0) -...
    method _drain_queue (line 308) | def _drain_queue(self) -> list:
    method _drain_until_gen_done (line 321) | def _drain_until_gen_done(self, timeout: float = 5.0) -> None:
    method _start_dispatcher (line 343) | def _start_dispatcher(self) -> None:
    method _stop_dispatcher (line 363) | def _stop_dispatcher(self) -> None:
    method _dispatcher_loop (line 372) | def _dispatcher_loop(self) -> None:
    method _generate_dispatched (line 411) | def _generate_dispatched(
    method _drain_mailbox (line 516) | def _drain_mailbox(self, mailbox: queue.Queue, timeout: float = 5.0) -...
    method _wait_dispatcher_idle (line 531) | def _wait_dispatcher_idle(self) -> None:
    method load_model (line 566) | def load_model(
    method unload_model (line 648) | def unload_model(self, model_name: str) -> bool:
    method generate_chat_response (line 682) | def generate_chat_response(
    method generate_with_adapter_control (line 710) | def generate_with_adapter_control(
    method _generate_inner (line 728) | def _generate_inner(
    method _generate_locked (line 779) | def _generate_locked(
    method reset_generation_state (line 866) | def reset_generation_state(self):
    method generate_audio_response (line 880) | def generate_audio_response(
    method generate_whisper_response (line 951) | def generate_whisper_response(
    method generate_audio_input_response (line 965) | def generate_audio_input_response(
    method _generate_audio_input_inner (line 993) | def _generate_audio_input_inner(
    method resize_image (line 1085) | def resize_image(self, img, max_size: int = 800):
    method _pil_to_base64 (line 1100) | def _pil_to_base64(img) -> str:
    method get_current_model (line 1106) | def get_current_model(self) -> Optional[str]:
    method is_model_loading (line 1110) | def is_model_loading(self) -> bool:
    method get_loading_model (line 1114) | def get_loading_model(self) -> Optional[str]:
    method check_vision_model_compatibility (line 1118) | def check_vision_model_compatibility(self) -> bool:
  function get_inference_backend (line 1129) | def get_inference_backend() -> InferenceOrchestrator:

FILE: studio/backend/core/inference/tools.py
  function _get_workdir (line 33) | def _get_workdir(session_id: str | None = None) -> str:
  function execute_tool (line 116) | def execute_tool(
  function _web_search (line 146) | def _web_search(query: str, max_results: int = 5, timeout: int = _EXEC_T...
  function _check_signal_escape_patterns (line 168) | def _check_signal_escape_patterns(code: str):
  function _check_code_safety (line 349) | def _check_code_safety(code: str) -> str | None:
  function _cancel_watcher (line 367) | def _cancel_watcher(proc, cancel_event, poll_interval = 0.2):
  function _truncate (line 376) | def _truncate(text: str, limit: int = _MAX_OUTPUT_CHARS) -> str:
  function _python_exec (line 382) | def _python_exec(
  function _bash_exec (line 446) | def _bash_exec(

FILE: studio/backend/core/inference/worker.py
  function _activate_transformers_version (line 34) | def _activate_transformers_version(model_name: str) -> None:
  function _decode_image (line 68) | def _decode_image(image_base64: str):
  function _resize_image (line 76) | def _resize_image(img, max_size: int = 800):
  function _send_response (line 89) | def _send_response(resp_queue: Any, response: dict) -> None:
  function _build_model_config (line 97) | def _build_model_config(config: dict):
  function _handle_load (line 116) | def _handle_load(backend, config: dict, resp_queue: Any) -> None:
  function _handle_generate (line 212) | def _handle_generate(
  function _handle_generate_audio (line 301) | def _handle_generate_audio(
  function _handle_generate_audio_input (line 348) | def _handle_generate_audio_input(
  function _handle_unload (line 427) | def _handle_unload(backend, cmd: dict, resp_queue: Any) -> None:
  function run_inference_process (line 457) | def run_inference_process(

FILE: studio/backend/core/training/trainer.py
  function _build_report_targets (line 48) | def _build_report_targets(training_args) -> list[str] | str:
  class TrainingProgress (line 58) | class TrainingProgress:
  class UnslothTrainer (line 77) | class UnslothTrainer:
    method __init__ (line 82) | def __init__(self):
    method pre_detect_and_load_tokenizer (line 125) | def pre_detect_and_load_tokenizer(
    method add_progress_callback (line 199) | def add_progress_callback(self, callback: Callable[[TrainingProgress],...
    method _update_progress (line 203) | def _update_progress(self, **kwargs):
    method _create_progress_callback (line 217) | def _create_progress_callback(self):
    method _calculate_total_steps (line 271) | def _calculate_total_steps(
    method _build_audio_training_args (line 283) | def _build_audio_training_args(self, training_args, output_dir, *, ext...
    method _finalize_training (line 340) | def _finalize_training(self, output_dir, label = ""):
    method _cleanup_audio_artifacts (line 370) | def _cleanup_audio_artifacts(self):
    method _resolve_audio_columns (line 410) | def _resolve_audio_columns(self, dataset, custom_format_mapping: dict ...
    method load_model (line 460) | def load_model(
    method prepare_model_for_training (line 850) | def prepare_model_for_training(
    method _apply_csm_forward_fix (line 1109) | def _apply_csm_forward_fix(self):
    method _preprocess_csm_dataset (line 1293) | def _preprocess_csm_dataset(self, dataset, custom_format_mapping = None):
    method _format_audio_vlm_dataset (line 1417) | def _format_audio_vlm_dataset(self, dataset, custom_format_mapping = N...
    method _preprocess_snac_dataset (line 1473) | def _preprocess_snac_dataset(self, dataset, custom_format_mapping = No...
    method _preprocess_bicodec_dataset (line 1676) | def _preprocess_bicodec_dataset(self, dataset, custom_format_mapping =...
    method _preprocess_dac_dataset (line 1908) | def _preprocess_dac_dataset(self, dataset, custom_format_mapping = None):
    method _preprocess_whisper_dataset (line 2119) | def _preprocess_whisper_dataset(
    method _resolve_local_files (line 2219) | def _resolve_local_files(file_paths: list) -> list[str]:
    method _loader_for_files (line 2254) | def _loader_for_files(files: list[str]) -> str:
    method load_and_format_dataset (line 2265) | def load_and_format_dataset(
    method _auto_detect_eval_split_from_hf (line 2543) | def _auto_detect_eval_split_from_hf(
    method _resolve_eval_split_from_dataset (line 2579) | def _resolve_eval_split_from_dataset(self, dataset) -> Optional[tuple]:
    method start_training (line 2604) | def start_training(
    method _train_worker (line 2695) | def _train_worker(self, dataset: Dataset, **training_args):
    method _patch_adapter_config (line 3351) | def _patch_adapter_config(self, output_dir: str) -> None:
    method stop_training (line 3383) | def stop_training(self, save: bool = True):
    method get_training_progress (line 3403) | def get_training_progress(self) -> TrainingProgress:
    method cleanup (line 3408) | def cleanup(self):
  function _ensure_deepseek_ocr_installed (line 3421) | def _ensure_deepseek_ocr_installed():
  function get_trainer (line 3480) | def get_trainer() -> UnslothTrainer:

FILE: studio/backend/core/training/training.py
  class TrainingProgress (line 40) | class TrainingProgress:
  class TrainingBackend (line 60) | class TrainingBackend:
    method __init__ (line 66) | def __init__(self):
    method start_training (line 100) | def start_training(self, **kwargs) -> bool:
    method stop_training (line 220) | def stop_training(self, save: bool = True) -> bool:
    method force_terminate (line 239) | def force_terminate(self) -> None:
    method is_training_active (line 255) | def is_training_active(self) -> bool:
    method get_training_status (line 302) | def get_training_status(self, theme: str = "light") -> Tuple:
    method refresh_plot_for_theme (line 313) | def refresh_plot_for_theme(self, theme: str) -> Optional[plt.Figure]:
    class _TrainerShim (line 327) | class _TrainerShim:
      method __init__ (line 330) | def __init__(self, backend: "TrainingBackend"):
      method training_progress (line 335) | def training_progress(self):
      method training_progress (line 339) | def training_progress(self, value):
      method get_training_progress (line 342) | def get_training_progress(self):
      method _update_progress (line 345) | def _update_progress(self, **kwargs):
    method trainer (line 352) | def trainer(self):
    method _pump_loop (line 360) | def _pump_loop(self) -> None:
    method _handle_event (line 394) | def _handle_event(self, event: dict) -> None:
    method _read_queue (line 467) | def _read_queue(q: Any, timeout_sec: float) -> Optional[dict]:
    method _drain_queue (line 476) | def _drain_queue(q: Any) -> list:
    method _create_loss_plot (line 490) | def _create_loss_plot(
    method _transfer_to_inference_backend (line 605) | def _transfer_to_inference_backend(self) -> bool:
  function get_training_backend (line 624) | def get_training_backend() -> TrainingBackend:

FILE: studio/backend/core/training/worker.py
  function _activate_transformers_version (line 28) | def _activate_transformers_version(model_name: str) -> None:
  function run_training_process (line 62) | def run_training_process(
  function _send_status (line 586) | def _send_status(event_queue: Any, message: str) -> None:
  function _run_embedding_training (line 597) | def _run_embedding_training(event_queue: Any, stop_queue: Any, config: d...

FILE: studio/backend/loggers/config.py
  class LogConfig (line 26) | class LogConfig:
    method setup_logging (line 34) | def setup_logging(

FILE: studio/backend/loggers/handlers.py
  class LoggingMiddleware (line 28) | class LoggingMiddleware(BaseHTTPMiddleware):
    method dispatch (line 29) | async def dispatch(self, request: Request, call_next: Callable) -> Res...
  function filter_sensitive_data (line 74) | def filter_sensitive_data(logger, method_name, event_dict):
  function get_logger (line 94) | def get_logger(name: str) -> structlog.BoundLogger:

FILE: studio/backend/main.py
  function lifespan (line 50) | async def lifespan(app: FastAPI):
  function health_check (line 146) | async def health_check():
  function get_system_info (line 161) | async def get_system_info():
  function get_hardware_info (line 246) | async def get_hardware_info():
  function _strip_crossorigin (line 259) | def _strip_crossorigin(html_bytes: bytes) -> bytes:
  function _inject_bootstrap (line 275) | def _inject_bootstrap(html_bytes: bytes, app: FastAPI) -> bytes:
  function setup_frontend (line 303) | def setup_frontend(app: FastAPI, build_path: Path):

FILE: studio/backend/models/auth.py
  class AuthLoginRequest (line 11) | class AuthLoginRequest(BaseModel):
  class RefreshTokenRequest (line 18) | class RefreshTokenRequest(BaseModel):
  class AuthStatusResponse (line 26) | class AuthStatusResponse(BaseModel):
  class ChangePasswordRequest (line 39) | class ChangePasswordRequest(BaseModel):

FILE: studio/backend/models/data_recipe.py
  class RecipePayload (line 15) | class RecipePayload(BaseModel):
  class PreviewResponse (line 21) | class PreviewResponse(BaseModel):
  class ValidateError (line 27) | class ValidateError(BaseModel):
  class ValidateResponse (line 33) | class ValidateResponse(BaseModel):
  class JobCreateResponse (line 39) | class JobCreateResponse(BaseModel):
  class PublishDatasetRequest (line 43) | class PublishDatasetRequest(BaseModel):
  class PublishDatasetResponse (line 64) | class PublishDatasetResponse(BaseModel):
  class SeedInspectRequest (line 70) | class SeedInspectRequest(BaseModel):
  class SeedInspectUploadRequest (line 78) | class SeedInspectUploadRequest(BaseModel):
  class SeedInspectResponse (line 87) | class SeedInspectResponse(BaseModel):
  class McpToolsListRequest (line 96) | class McpToolsListRequest(BaseModel):
  class McpToolsProviderResult (line 101) | class McpToolsProviderResult(BaseModel):
  class McpToolsListResponse (line 107) | class McpToolsListResponse(BaseModel):

FILE: studio/backend/models/datasets.py
  class CheckFormatRequest (line 13) | class CheckFormatRequest(BaseModel):
    method _compat_split (line 24) | def _compat_split(cls, values: Any) -> Any:
  class CheckFormatResponse (line 31) | class CheckFormatResponse(BaseModel):
  class AiAssistMappingRequest (line 50) | class AiAssistMappingRequest(BaseModel):
  class AiAssistMappingResponse (line 61) | class AiAssistMappingResponse(BaseModel):
  class UploadDatasetResponse (line 75) | class UploadDatasetResponse(BaseModel):
  class LocalDatasetItem (line 82) | class LocalDatasetItem(BaseModel):
    class Metadata (line 83) | class Metadata(BaseModel):
  class LocalDatasetsResponse (line 98) | class LocalDatasetsResponse(BaseModel):

FILE: studio/backend/models/export.py
  class LoadCheckpointRequest (line 12) | class LoadCheckpointRequest(BaseModel):
  class ExportStatusResponse (line 32) | class ExportStatusResponse(BaseModel):
  class ExportOperationResponse (line 49) | class ExportOperationResponse(BaseModel):
  class ExportCommonOptions (line 60) | class ExportCommonOptions(BaseModel):
  class ExportMergedModelRequest (line 89) | class ExportMergedModelRequest(ExportCommonOptions):
  class ExportBaseModelRequest (line 98) | class ExportBaseModelRequest(ExportCommonOptions):
  class ExportGGUFRequest (line 104) | class ExportGGUFRequest(BaseModel):
  class ExportLoRAAdapterRequest (line 129) | class ExportLoRAAdapterRequest(ExportCommonOptions):

FILE: studio/backend/models/inference.py
  class LoadRequest (line 17) | class LoadRequest(BaseModel):
  class UnloadRequest (line 46) | class UnloadRequest(BaseModel):
  class ValidateModelRequest (line 52) | class ValidateModelRequest(BaseModel):
  class ValidateModelResponse (line 69) | class ValidateModelResponse(BaseModel):
  class GenerateRequest (line 88) | class GenerateRequest(BaseModel):
  class LoadResponse (line 108) | class LoadResponse(BaseModel):
  class UnloadResponse (line 150) | class UnloadResponse(BaseModel):
  class InferenceStatusResponse (line 157) | class InferenceStatusResponse(BaseModel):
  class TextContentPart (line 209) | class TextContentPart(BaseModel):
  class ImageUrl (line 216) | class ImageUrl(BaseModel):
  class ImageContentPart (line 223) | class ImageContentPart(BaseModel):
  function _content_part_discriminator (line 230) | def _content_part_discriminator(v):
  class ChatMessage (line 249) | class ChatMessage(BaseModel):
  class ChatCompletionRequest (line 265) | class ChatCompletionRequest(BaseModel):
  class ChoiceDelta (line 344) | class ChoiceDelta(BaseModel):
  class ChunkChoice (line 351) | class ChunkChoice(BaseModel):
  class ChatCompletionChunk (line 359) | class ChatCompletionChunk(BaseModel):
  class CompletionMessage (line 372) | class CompletionMessage(BaseModel):
  class CompletionChoice (line 379) | class CompletionChoice(BaseModel):
  class CompletionUsage (line 387) | class CompletionUsage(BaseModel):
  class ChatCompletion (line 395) | class ChatCompletion(BaseModel):

FILE: studio/backend/models/models.py
  class CheckpointInfo (line 14) | class CheckpointInfo(BaseModel):
  class ModelCheckpoints (line 24) | class ModelCheckpoints(BaseModel):
  class CheckpointListResponse (line 46) | class CheckpointListResponse(BaseModel):
  class ModelDetails (line 56) | class ModelDetails(BaseModel):
  class LoRAInfo (line 96) | class LoRAInfo(BaseModel):
  class LoRAScanResponse (line 110) | class LoRAScanResponse(BaseModel):
  class ModelListResponse (line 119) | class ModelListResponse(BaseModel):
  class GgufVariantDetail (line 130) | class GgufVariantDetail(BaseModel):
  class GgufVariantsResponse (line 143) | class GgufVariantsResponse(BaseModel):
  class LocalModelInfo (line 158) | class LocalModelInfo(BaseModel):
  class LocalModelListResponse (line 178) | class LocalModelListResponse(BaseModel):

FILE: studio/backend/models/responses.py
  class TrainingStopResponse (line 16) | class TrainingStopResponse(BaseModel):
  class TrainingMetricsResponse (line 23) | class TrainingMetricsResponse(BaseModel):
  class LoRABaseModelResponse (line 47) | class LoRABaseModelResponse(BaseModel):
  class VisionCheckResponse (line 54) | class VisionCheckResponse(BaseModel):
  class EmbeddingCheckResponse (line 61) | class EmbeddingCheckResponse(BaseModel):

FILE: studio/backend/models/training.py
  class TrainingStartRequest (line 12) | class TrainingStartRequest(BaseModel):
    method _compat_split (line 58) | def _compat_split(cls, values: Any) -> Any:
  class TrainingJobResponse (line 132) | class TrainingJobResponse(BaseModel):
  class TrainingStatus (line 141) | class TrainingStatus(BaseModel):
  class TrainingProgress (line 174) | class TrainingProgress(BaseModel):

FILE: studio/backend/models/users.py
  class Token (line 12) | class Token(BaseModel):

FILE: studio/backend/plugins/data-designer-unstructured-seed/src/data_designer_unstructured_seed/chunking.py
  function resolve_chunking (line 20) | def resolve_chunking(
  function build_unstructured_preview_rows (line 31) | def build_unstructured_preview_rows(
  function materialize_unstructured_seed_dataset (line 62) | def materialize_unstructured_seed_dataset(
  function load_unstructured_text_file (line 106) | def load_unstructured_text_file(path: Path) -> str:
  function normalize_unstructured_text (line 115) | def normalize_unstructured_text(text: str) -> str:
  function split_text_into_chunks (line 120) | def split_text_into_chunks(
  function _find_break_index (line 160) | def _find_break_index(window: str, min_index: int) -> int | None:
  function _to_int (line 169) | def _to_int(value: Any, fallback: int) -> int:
  function _compute_cache_key (line 179) | def _compute_cache_key(

FILE: studio/backend/plugins/data-designer-unstructured-seed/src/data_designer_unstructured_seed/config.py
  class UnstructuredSeedSource (line 16) | class UnstructuredSeedSource(SeedSource):
    method _validate_path (line 24) | def _validate_path(cls, value: str) -> str:
    method _validate_chunk_size (line 32) | def _validate_chunk_size(cls, value: int) -> int:
    method _validate_chunk_overlap (line 38) | def _validate_chunk_overlap(cls, value: int, info) -> int:

FILE: studio/backend/plugins/data-designer-unstructured-seed/src/data_designer_unstructured_seed/impl.py
  class UnstructuredSeedReader (line 15) | class UnstructuredSeedReader(SeedReader[UnstructuredSeedSource]):
    method create_duckdb_connection (line 16) | def create_duckdb_connection(self):
    method get_dataset_uri (line 19) | def get_dataset_uri(self) -> str:

FILE: studio/backend/requirements/single-env/patch_metadata.py
  function metadata_path (line 39) | def metadata_path(dist_name: str) -> Path | None:
  function patch_file (line 51) | def patch_file(path: Path) -> bool:
  function main (line 62) | def main() -> int:

FILE: studio/backend/routes/auth.py
  function auth_status (line 30) | async def auth_status() -> AuthStatusResponse:
  function login (line 49) | async def login(payload: AuthLoginRequest) -> Token:
  function refresh (line 78) | async def refresh(payload: RefreshTokenRequest) -> Token:
  function change_password (line 100) | async def change_password(

FILE: studio/backend/routes/data_recipe/jobs.py
  function _normalize_run_name (line 29) | def _normalize_run_name(value: Any) -> str | None:
  function create_job (line 43) | def create_job(payload: RecipePayload):
  function job_status (line 82) | def job_status(job_id: str):
  function current_job (line 91) | def current_job():
  function cancel_job (line 100) | def cancel_job(job_id: str):
  function job_analysis (line 109) | def job_analysis(job_id: str):
  function job_dataset (line 118) | def job_dataset(
  function publish_job_dataset (line 142) | def publish_job_dataset(job_id: str, payload: PublishDatasetRequest):
  function job_events (line 199) | async def job_events(request: Request, job_id: str):

FILE: studio/backend/routes/data_recipe/mcp.py
  function list_mcp_tools (line 23) | def list_mcp_tools(payload: McpToolsListRequest) -> McpToolsListResponse:

FILE: studio/backend/routes/data_recipe/seed.py
  function _serialize_preview_value (line 38) | def _serialize_preview_value(value: Any) -> Any:
  function _serialize_preview_rows (line 42) | def _serialize_preview_rows(rows: list[dict[str, Any]]) -> list[dict[str...
  function _normalize_optional_text (line 49) | def _normalize_optional_text(value: str | None) -> str | None:
  function _list_hf_data_files (line 56) | def _list_hf_data_files(*, dataset_name: str, token: str | None) -> list...
  function _select_best_file (line 70) | def _select_best_file(data_files: list[str], split: str = DEFAULT_SPLIT)...
  function _resolve_seed_hf_path (line 92) | def _resolve_seed_hf_path(
  function _build_stream_load_kwargs (line 109) | def _build_stream_load_kwargs(
  function _load_preview_rows (line 132) | def _load_preview_rows(
  function _extract_columns (line 142) | def _extract_columns(rows: list[dict[str, Any]]) -> list[str]:
  function _sanitize_filename (line 150) | def _sanitize_filename(filename: str) -> str:
  function _decode_base64_payload (line 157) | def _decode_base64_payload(content_base64: str) -> bytes:
  function _read_preview_rows_from_local_file (line 167) | def _read_preview_rows_from_local_file(
  function _read_preview_rows_from_unstructured_file (line 201) | def _read_preview_rows_from_unstructured_file(
  function inspect_seed_dataset (line 224) | def inspect_seed_dataset(payload: SeedInspectRequest) -> SeedInspectResp...
  function inspect_seed_upload (line 310) | def inspect_seed_upload(payload: SeedInspectUploadRequest) -> SeedInspec...

FILE: studio/backend/routes/data_recipe/validate.py
  function _collect_validation_errors (line 22) | def _collect_validation_errors(recipe: dict[str, Any]) -> list[ValidateE...
  function validate (line 72) | def validate(payload: RecipePayload) -> ValidateResponse:

FILE: studio/backend/routes/datasets.py
  function _serialize_preview_value (line 48) | def _serialize_preview_value(value):
  function _serialize_preview_rows (line 78) | def _serialize_preview_rows(rows):
  function _safe_read_metadata (line 100) | def _safe_read_metadata(path: Path) -> dict | None:
  function _safe_read_rows_from_metadata (line 110) | def _safe_read_rows_from_metadata(payload: dict | None) -> int | None:
  function _safe_read_metadata_summary (line 120) | def _safe_read_metadata_summary(payload: dict | None) -> dict | None:
  function _build_local_dataset_items (line 176) | def _build_local_dataset_items() -> list[LocalDatasetItem]:
  function _load_local_preview_slice (line 216) | def _load_local_preview_slice(
  function _sanitize_filename (line 266) | def _sanitize_filename(filename: str) -> str:
  function upload_dataset (line 274) | async def upload_dataset(
  function list_local_datasets (line 305) | def list_local_datasets(
  function check_format (line 312) | def check_format(
  function ai_assist_mapping (line 505) | def ai_assist_mapping(

FILE: studio/backend/routes/export.py
  function load_checkpoint (line 47) | async def load_checkpoint(
  function cleanup_export_memory (line 122) | async def cleanup_export_memory(
  function get_export_status (line 155) | async def get_export_status(
  function export_merged_model (line 177) | async def export_merged_model(
  function export_base_model (line 212) | async def export_base_model(
  function export_gguf (line 247) | async def export_gguf(
  function export_lora_adapter (line 281) | async def export_lora_adapter(

FILE: studio/backend/routes/inference.py
  function get_llama_cpp_backend (line 76) | def get_llama_cpp_backend() -> LlamaCppBackend:
  function load_model (line 81) | async def load_model(
  function validate_model (line 413) | async def validate_model(
  function unload_model (line 460) | async def unload_model(
  function generate_stream (line 491) | async def generate_stream(
  function get_status (line 565) | async def get_status(
  function generate_audio (line 636) | async def generate_audio(
  function _decode_audio_base64 (line 728) | def _decode_audio_base64(b64: str) -> np.ndarray:
  function _extract_content_parts (line 763) | def _extract_content_parts(
  function openai_chat_completions (line 819) | async def openai_chat_completions(
  function openai_list_models (line 1483) | async def openai_list_models(

FILE: studio/backend/routes/models.py
  function _is_valid_repo_id (line 21) | def _is_valid_repo_id(repo_id: str) -> bool:
  function derive_model_type (line 108) | def derive_model_type(
  function _resolve_hf_cache_dir (line 121) | def _resolve_hf_cache_dir() -> Path:
  function _scan_models_dir (line 131) | def _scan_models_dir(models_dir: Path) -> List[LocalModelInfo]:
  function _scan_hf_cache (line 181) | def _scan_hf_cache(cache_dir: Path) -> List[LocalModelInfo]:
  function list_local_models (line 214) | async def list_local_models(
  function list_models (line 276) | async def list_models(
  function _get_max_position_embeddings (line 351) | def _get_max_position_embeddings(config) -> Optional[int]:
  function _get_model_size_bytes (line 362) | def _get_model_size_bytes(
  function get_model_config (line 390) | async def get_model_config(
  function scan_loras (line 469) | async def scan_loras(
  function get_lora_base_model (line 525) | async def get_lora_base_model(
  function check_vision_model (line 558) | async def check_vision_model(
  function check_embedding_model (line 585) | async def check_embedding_model(
  function get_gguf_variants (line 615) | async def get_gguf_variants(
  function get_gguf_download_progress (line 701) | async def get_gguf_download_progress(
  function get_download_progress (line 761) | async def get_download_progress(
  function _get_repo_size_cached (line 834) | def _get_repo_size_cached(repo_id: str) -> int:
  function list_cached_gguf (line 850) | async def list_cached_gguf(
  function list_cached_models (line 897) | async def list_cached_models(
  function delete_cached_model (line 946) | async def delete_cached_model(
  function list_checkpoints (line 1069) | async def list_checkpoints(

FILE: studio/backend/routes/training.py
  class TrainingStopRequest (line 51) | class TrainingStopRequest(PydanticBaseModel):
  function _validate_local_dataset_paths (line 59) | def _validate_local_dataset_paths(
  function get_hardware_utilization (line 83) | async def get_hardware_utilization(
  function start_training (line 99) | async def start_training(
  function stop_training (line 278) | async def stop_training(
  function reset_training (line 314) | async def reset_training(
  function get_training_status (line 369) | async def get_training_status(
  function get_training_metrics (line 458) | async def get_training_metrics(
  function stream_training_progress (line 498) | async def stream_training_progress(

FILE: studio/backend/run.py
  function _resolve_external_ip (line 27) | def _resolve_external_ip() -> str:
  function _is_port_free (line 72) | def _is_port_free(host: str, port: int) -> bool:
  function _find_free_port (line 85) | def _find_free_port(host: str, start: int, max_attempts: int = 20) -> int:
  function _graceful_shutdown (line 96) | def _graceful_shutdown(server = None):
  function run_server (line 156) | def run_server(
  function _signal_handler (line 267) | def _signal_handler(signum, frame):

FILE: studio/backend/tests/test_data_recipe_seed.py
  function test_seed_inspect_load_kwargs_disables_remote_code_execution (line 7) | def test_seed_inspect_load_kwargs_disables_remote_code_execution():

FILE: studio/backend/tests/test_utils.py
  function _actual_device (line 59) | def _actual_device() -> str:
  function _reset_and_detect (line 68) | def _reset_and_detect():
  class TestGetDevice (line 77) | class TestGetDevice:
    method setup_method (line 80) | def setup_method(self):
    method teardown_method (line 83) | def teardown_method(self):
    method test_returns_valid_device_type (line 86) | def test_returns_valid_device_type(self):
    method test_matches_actual_hardware (line 90) | def test_matches_actual_hardware(self):
    method test_returns_cuda_when_cuda_available (line 96) | def test_returns_cuda_when_cuda_available(self):
    method test_returns_mlx_when_on_apple_silicon_with_mlx (line 104) | def test_returns_mlx_when_on_apple_silicon_with_mlx(self):
    method test_returns_cpu_when_nothing_available (line 112) | def test_returns_cpu_when_nothing_available(self):
  class TestIsAppleSilicon (line 124) | class TestIsAppleSilicon:
    method test_returns_bool (line 125) | def test_returns_bool(self):
    method test_true_on_darwin_arm64 (line 128) | def test_true_on_darwin_arm64(self):
    method test_false_on_linux_x86 (line 134) | def test_false_on_linux_x86(self):
    method test_false_on_darwin_x86 (line 140) | def test_false_on_darwin_x86(self):
  class TestClearGpuCache (line 151) | class TestClearGpuCache:
    method test_does_not_raise (line 154) | def test_does_not_raise(self):
    method test_calls_cuda_cache_when_cuda (line 158) | def test_calls_cuda_cache_when_cuda(self):
    method test_mlx_does_not_raise (line 169) | def test_mlx_does_not_raise(self):
    method test_noop_on_cpu (line 174) | def test_noop_on_cpu(self):
  class TestGetGpuMemoryInfo (line 182) | class TestGetGpuMemoryInfo:
    method test_returns_dict (line 183) | def test_returns_dict(self):
    method test_has_available_key (line 187) | def test_has_available_key(self):
    method test_has_backend_key (line 190) | def test_has_backend_key(self):
    method test_backend_matches_device (line 193) | def test_backend_matches_device(self):
    method test_gpu_available_fields (line 202) | def test_gpu_available_fields(self):
    method test_cuda_path_returns_correct_fields (line 214) | def test_cuda_path_returns_correct_fields(self):
    method test_mlx_path_returns_correct_fields (line 239) | def test_mlx_path_returns_correct_fields(self):
    method test_cpu_path_returns_unavailable (line 259) | def test_cpu_path_returns_unavailable(self):
    method test_cuda_error_returns_unavailable (line 268) | def test_cuda_error_returns_unavailable(self):
  class TestLogGpuMemory (line 284) | class TestLogGpuMemory:
    method test_does_not_raise (line 285) | def test_does_not_raise(self):
    method test_logs_gpu_info_when_available (line 288) | def test_logs_gpu_info_when_available(self, caplog):
    method test_logs_cpu_fallback_when_no_gpu (line 313) | def test_logs_cpu_fallback_when_no_gpu(self, caplog):
  class TestFormatErrorMessage (line 332) | class TestFormatErrorMessage:
    method test_not_found (line 333) | def test_not_found(self):
    method test_unauthorized (line 339) | def test_unauthorized(self):
    method test_gated_model (line 344) | def test_gated_model(self):
    method test_invalid_token (line 349) | def test_invalid_token(self):
    method test_cuda_oom (line 357) | def test_cuda_oom(self):
    method test_mlx_oom (line 368) | def test_mlx_oom(self):
    method test_cpu_oom (line 376) | def test_cpu_oom(self):
    method test_generic_error (line 384) | def test_generic_error(self):

FILE: studio/backend/utils/cache_cleanup.py
  function clear_unsloth_compiled_cache (line 30) | def clear_unsloth_compiled_cache() -> None:

FILE: studio/backend/utils/datasets/chat_templates.py
  function get_tokenizer_chat_template (line 33) | def get_tokenizer_chat_template(tokenizer, model_name):
  function get_dataset_info_summary (line 92) | def get_dataset_info_summary(dataset_info):
  function apply_chat_template_to_dataset (line 119) | def apply_chat_template_to_dataset(

FILE: studio/backend/utils/datasets/data_collators.py
  class DataCollatorSpeechSeq2SeqWithPadding (line 20) | class DataCollatorSpeechSeq2SeqWithPadding:
    method __call__ (line 31) | def __call__(self, features: List[dict]) -> dict:
  class DeepSeekOCRDataCollator (line 54) | class DeepSeekOCRDataCollator:
    method __call__ (line 68) | def __call__(self, batch: List[dict]) -> dict:
  class VLMDataCollator (line 135) | class VLMDataCollator:
    method __call__ (line 150) | def __call__(self, batch: List[dict]) -> dict:

FILE: studio/backend/utils/datasets/dataset_utils.py
  function check_dataset_format (line 52) | def check_dataset_format(dataset, is_vlm: bool = False) -> dict:
  function _apply_user_mapping (line 204) | def _apply_user_mapping(dataset, mapping: dict, batch_size: int = 1000):
  function _extract_column_value (line 258) | def _extract_column_value(val, col: str, label_mapping: dict) -> str:
  function _apply_template_mapping (line 280) | def _apply_template_mapping(
  function _apply_user_mapping_alpaca (line 353) | def _apply_user_mapping_alpaca(dataset, mapping: dict, batch_size: int =...
  function format_dataset (line 400) | def format_dataset(
  function format_and_template_dataset (line 811) | def format_and_template_dataset(

FILE: studio/backend/utils/datasets/format_conversion.py
  function standardize_chat_format (line 19) | def standardize_chat_format(
  function convert_chatml_to_alpaca (line 143) | def convert_chatml_to_alpaca(dataset, batch_size = 1000, num_proc = None):
  function convert_alpaca_to_chatml (line 213) | def convert_alpaca_to_chatml(dataset, batch_size = 1000, num_proc = None):
  function _format_eta (line 263) | def _format_eta(seconds):
  function convert_to_vlm_format (line 276) | def convert_to_vlm_format(
  function convert_sharegpt_with_images_to_vlm_format (line 651) | def convert_sharegpt_with_images_to_vlm_format(
  function convert_llava_to_vlm_format (line 827) | def convert_llava_to_vlm_format(dataset):

FILE: studio/backend/utils/datasets/format_detection.py
  function _keyword_in_column (line 14) | def _keyword_in_column(keyword: str, col_name: str) -> bool:
  function detect_dataset_format (line 22) | def detect_dataset_format(dataset):
  function detect_custom_format_heuristic (line 109) | def detect_custom_format_heuristic(dataset):
  function detect_multimodal_dataset (line 386) | def detect_multimodal_dataset(dataset):
  function _is_image_value (line 513) | def _is_image_value(value) -> bool:
  function _is_audio_value (line 575) | def _is_audio_value(value) -> bool:
  function _has_image_header (line 595) | def _has_image_header(data: bytes) -> bool:
  function detect_vlm_dataset_structure (line 617) | def detect_vlm_dataset_structure(dataset):

FILE: studio/backend/utils/datasets/llm_assist.py
  function _strip_think_tags (line 35) | def _strip_think_tags(text: str) -> str:
  function precache_helper_gguf (line 59) | def precache_helper_gguf():
  function _run_with_helper (line 112) | def _run_with_helper(prompt: str, max_tokens: int = 256) -> Optional[str]:
  function llm_generate_vlm_instruction (line 182) | def llm_generate_vlm_instruction(
  function llm_classify_columns (line 241) | def llm_classify_columns(
  function llm_generate_dataset_warning (line 334) | def llm_generate_dataset_warning(
  function _parse_json_response (line 387) | def _parse_json_response(text: str) -> Optional[dict]:
  function _generate_with_backend (line 421) | def _generate_with_backend(backend, messages: list[dict], max_tokens: in...
  function fetch_hf_dataset_card (line 440) | def fetch_hf_dataset_card(
  function _run_multi_pass_advisor (line 489) | def _run_multi_pass_advisor(
  function llm_conversion_advisor (line 850) | def llm_conversion_advisor(

FILE: studio/backend/utils/datasets/vlm_processing.py
  function generate_smart_vlm_instruction (line 15) | def generate_smart_vlm_instruction(

FILE: studio/backend/utils/hardware/hardware.py
  class DeviceType (line 31) | class DeviceType(str, Enum):
  function is_apple_silicon (line 48) | def is_apple_silicon() -> bool:
  function _has_torch (line 53) | def _has_torch() -> bool:
  function _has_mlx (line 63) | def _has_mlx() -> bool:
  function detect_hardware (line 73) | def detect_hardware() -> DeviceType:
  function get_device (line 115) | def get_device() -> DeviceType:
  function clear_gpu_cache (line 126) | def clear_gpu_cache():
  function get_gpu_memory_info (line 149) | def get_gpu_memory_info() -> Dict[str, Any]:
  function log_gpu_memory (line 213) | def log_gpu_memory(context: str):
  function get_gpu_summary (line 233) | def get_gpu_summary() -> Dict[str, Any]:
  function get_package_versions (line 251) | def get_package_versions() -> Dict[str, Optional[str]]:
  function get_gpu_utilization (line 286) | def get_gpu_utilization() -> Dict[str, Any]:
  function get_physical_gpu_count (line 420) | def get_physical_gpu_count() -> int:
  function get_visible_gpu_count (line 451) | def get_visible_gpu_count() -> int:
  function safe_num_proc (line 486) | def safe_num_proc(desired: Optional[int] = None) -> int:

FILE: studio/backend/utils/inference/inference_config.py
  function _load_family_defaults (line 29) | def _load_family_defaults():
  function get_family_inference_params (line 52) | def get_family_inference_params(model_id: str) -> Dict[str, Any]:
  function _has_specific_yaml (line 85) | def _has_specific_yaml(model_identifier: str) -> bool:
  function load_inference_config (line 105) | def load_inference_config(model_identifier: str) -> Dict[str, Any]:

FILE: studio/backend/utils/models/checkpoints.py
  function _read_checkpoint_loss (line 18) | def _read_checkpoint_loss(checkpoint_path: Path) -> Optional[float]:
  function scan_checkpoints (line 38) | def scan_checkpoints(

FILE: studio/backend/utils/models/model_config.py
  function load_model_config (line 385) | def load_model_config(
  function _is_vision_model_subprocess (line 484) | def _is_vision_model_subprocess(
  function is_vision_model (line 548) | def is_vision_model(model_name: str, hf_token: Optional[str] = None) -> ...
  function detect_audio_type (line 642) | def detect_audio_type(model_name: str, hf_token: Optional[str] = None) -...
  function _detect_audio_from_tokenizer (line 662) | def _detect_audio_from_tokenizer(
  function is_audio_input_type (line 736) | def is_audio_input_type(audio_type: Optional[str]) -> bool:
  function _is_mmproj (line 744) | def _is_mmproj(filename: str) -> bool:
  function detect_mmproj_file (line 749) | def detect_mmproj_file(path: str) -> Optional[str]:
  function detect_gguf_model (line 770) | def detect_gguf_model(path: str) -> Optional[str]:
  function _pick_best_gguf (line 853) | def _pick_best_gguf(filenames: list[str]) -> Optional[str]:
  class GgufVariantInfo (line 875) | class GgufVariantInfo:
  function _extract_quant_label (line 883) | def _extract_quant_label(filename: str) -> str:
  function list_gguf_variants (line 921) | def list_gguf_variants(
  function detect_gguf_model_remote (line 976) | def detect_gguf_model_remote(
  function download_gguf_file (line 996) | def download_gguf_file(
  function is_embedding_model (line 1020) | def is_embedding_model(model_name: str, hf_token: Optional[str] = None) ...
  function scan_trained_loras (line 1080) | def scan_trained_loras(outputs_dir: str = str(outputs_root())) -> List[T...
  function scan_exported_models (line 1126) | def scan_exported_models(
  function get_base_model_from_lora (line 1252) | def get_base_model_from_lora(lora_path: str) -> Optional[str]:
  function load_model_defaults (line 1323) | def load_model_defaults(model_name: str) -> Dict[str, Any]:
  class ModelConfig (line 1403) | class ModelConfig:
    method from_lora_path (line 1430) | def from_lora_path(
    method from_identifier (line 1486) | def from_identifier(
    method from_ui_selection (line 1699) | def from_ui_selection(

FILE: studio/backend/utils/paths/path_utils.py
  function normalize_path (line 17) | def normalize_path(path: str) -> str:
  function is_local_path (line 38) | def is_local_path(path: str) -> bool:
  function get_cache_path (line 69) | def get_cache_path(model_name: str) -> Optional[Path]:
  function is_model_cached (line 78) | def is_model_cached(model_name: str) -> bool:

FILE: studio/backend/utils/paths/storage_roots.py
  function studio_root (line 11) | def studio_root() -> Path:
  function cache_root (line 15) | def cache_root() -> Path:
  function assets_root (line 20) | def assets_root() -> Path:
  function datasets_root (line 24) | def datasets_root() -> Path:
  function dataset_uploads_root (line 28) | def dataset_uploads_root() -> Path:
  function recipe_datasets_root (line 32) | def recipe_datasets_root() -> Path:
  function outputs_root (line 36) | def outputs_root() -> Path:
  function exports_root (line 40) | def exports_root() -> Path:
  function auth_root (line 44) | def auth_root() -> Path:
  function auth_db_path (line 48) | def auth_db_path() -> Path:
  function tmp_root (line 52) | def tmp_root() -> Path:
  function seed_uploads_root (line 56) | def seed_uploads_root() -> Path:
  function unstructured_seed_cache_root (line 60) | def unstructured_seed_cache_root() -> Path:
  function oxc_validator_tmp_root (line 64) | def oxc_validator_tmp_root() -> Path:
  function tensorboard_root (line 68) | def tensorboard_root() -> Path:
  function ensure_dir (line 72) | def ensure_dir(path: Path) -> Path:
  function _setup_cache_env (line 77) | def _setup_cache_env() -> None:
  function ensure_studio_directories (line 99) | def ensure_studio_directories() -> None:
  function _clean_relative_path (line 116) | def _clean_relative_path(
  function resolve_under_root (line 126) | def resolve_under_root(
  function resolve_output_dir (line 143) | def resolve_output_dir(path_value: str | None = None) -> Path:
  function resolve_export_dir (line 151) | def resolve_export_dir(path_value: str | None = None) -> Path:
  function resolve_tensorboard_dir (line 159) | def resolve_tensorboard_dir(path_value: str | None = None) -> Path:
  function resolve_dataset_path (line 167) | def resolve_dataset_path(path_value: str) -> Path:

FILE: studio/backend/utils/transformers_version.py
  function _resolve_base_model (line 68) | def _resolve_base_model(model_name: str) -> str:
  function _check_tokenizer_config_needs_v5 (line 119) | def _check_tokenizer_config_needs_v5(model_name: str) -> bool:
  function needs_transformers_5 (line 154) | def needs_transformers_5(model_name: str) -> bool:
  function _get_in_memory_version (line 173) | def _get_in_memory_version() -> str | None:
  function _purge_modules (line 204) | def _purge_modules() -> int:
  function _venv_t5_is_valid (line 228) | def _venv_t5_is_valid() -> bool:
  function _install_to_venv_t5 (line 273) | def _install_to_venv_t5(pkg: str) -> bool:
  function _ensure_venv_t5_exists (line 321) | def _ensure_venv_t5_exists() -> bool:
  function _activate_5x (line 338) | def _activate_5x() -> None:
  function _deactivate_5x (line 357) | def _deactivate_5x() -> None:
  function ensure_transformers_version (line 371) | def ensure_transformers_version(model_name: str) -> None:

FILE: studio/backend/utils/utils.py
  function without_hf_auth (line 21) | def without_hf_auth():
  function format_error_message (line 77) | def format_error_message(error: Exception, model_name: str) -> str:

FILE: studio/frontend/src/app/app.tsx
  function App (line 7) | function App() {

FILE: studio/frontend/src/app/auth-guards.ts
  function hasActiveSession (line 13) | async function hasActiveSession(): Promise<boolean> {
  function checkAuthInitialized (line 19) | async function checkAuthInitialized(): Promise<boolean> {
  function checkPasswordChangeRequired (line 30) | async function checkPasswordChangeRequired(): Promise<boolean> {
  function requireAuth (line 41) | async function requireAuth(): Promise<void> {
  function requireGuest (line 54) | async function requireGuest(): Promise<void> {
  function requirePasswordChangeFlow (line 59) | async function requirePasswordChangeFlow(): Promise<void> {

FILE: studio/frontend/src/app/provider.tsx
  type AppProviderProps (line 8) | interface AppProviderProps {
  function AppProvider (line 12) | function AppProvider({ children }: AppProviderProps) {

FILE: studio/frontend/src/app/router.tsx
  type Register (line 33) | interface Register {

FILE: studio/frontend/src/app/routes/__root.tsx
  constant CHAT_ONLY_ALLOWED (line 16) | const CHAT_ONLY_ALLOWED = new Set(["/", "/chat", "/login", "/signup", "/...
  function isChatOnlyAllowed (line 18) | function isChatOnlyAllowed(pathname: string): boolean {
  constant HIDDEN_NAVBAR_ROUTES (line 34) | const HIDDEN_NAVBAR_ROUTES = ["/onboarding", "/login", "/change-password"];
  function RootLayout (line 36) | function RootLayout() {

FILE: studio/frontend/src/app/routes/data-recipes.$recipeId.tsx
  function DataRecipeEditorRoute (line 23) | function DataRecipeEditorRoute(): ReactElement {

FILE: studio/frontend/src/app/routes/grid-test.tsx
  function GridTestPage (line 23) | function GridTestPage() {

FILE: studio/frontend/src/components/assistant-ui/attachment.tsx
  type AttachmentPreviewProps (line 73) | type AttachmentPreviewProps = {

FILE: studio/frontend/src/components/assistant-ui/audio-player.tsx
  type AudioPlayerProps (line 10) | interface AudioPlayerProps {

FILE: studio/frontend/src/components/assistant-ui/badge.tsx
  type BadgeProps (line 42) | type BadgeProps = ComponentProps<"span"> &
  function Badge (line 47) | function Badge({

FILE: studio/frontend/src/components/assistant-ui/markdown-text.tsx
  constant COPY_RESET_MS (line 20) | const COPY_RESET_MS = 2000;
  constant MERMAID_SOURCE_RE (line 21) | const MERMAID_SOURCE_RE = /```mermaid\s*([\s\S]*?)```/i;
  constant CODE_FENCE_RE (line 22) | const CODE_FENCE_RE = /^```([^\r\n`]*)\r?\n([\s\S]*?)\r?\n?```$/;
  constant ACTION_PANEL_CLASS (line 23) | const ACTION_PANEL_CLASS =
  constant ACTION_BUTTON_CLASS (line 25) | const ACTION_BUTTON_CLASS =
  type CodeFence (line 28) | type CodeFence = {
  function getMermaidSource (line 33) | function getMermaidSource(blockContent: string): string | null {
  function getCodeFence (line 38) | function getCodeFence(blockContent: string): CodeFence | null {
  function getCodeFilename (line 50) | function getCodeFilename(language: string | null) {
  function isSvgFence (line 80) | function isSvgFence(codeFence: CodeFence): boolean {
  function isHtmlFence (line 87) | function isHtmlFence(codeFence: CodeFence): boolean {
  constant UNSAFE_SVG_RE (line 92) | const UNSAFE_SVG_RE = /<script[\s>]|on\w+\s*=|javascript:|<foreignObject...
  function sanitizeSvg (line 94) | function sanitizeSvg(source: string): string | null {
  function SvgPreview (line 99) | function SvgPreview({ source }: { source: string }) {
  constant HTML_PREVIEW_DEFAULT_HEIGHT (line 112) | const HTML_PREVIEW_DEFAULT_HEIGHT = 400;
  constant HTML_PREVIEW_MAX_HEIGHT (line 113) | const HTML_PREVIEW_MAX_HEIGHT = 800;
  function HtmlPreview (line 115) | function HtmlPreview({ source }: { source: string }) {
  function downloadTextFile (line 202) | function downloadTextFile(filename: string, text: string): void {
  function useCopiedState (line 214) | function useCopiedState() {
  function MermaidCopyButton (line 240) | function MermaidCopyButton({ source }: { source: string }) {
  function CodeBlockActions (line 263) | function CodeBlockActions({
  function StreamdownBlock (line 310) | function StreamdownBlock(props: BlockProps) {
  constant AUDIO_PLAYER_RE (line 374) | const AUDIO_PLAYER_RE = /<audio-player\s+src="([^"]+)"\s*\/>/;

FILE: studio/frontend/src/components/assistant-ui/model-selector.tsx
  type ModelSelectorProps (line 29) | interface ModelSelectorProps {
  function ModelSelectorTrigger (line 47) | function ModelSelectorTrigger({
  function ModelSelectorContent (line 97) | function ModelSelectorContent({
  function ModelSelector (line 166) | function ModelSelector({

FILE: studio/frontend/src/components/assistant-ui/model-selector/pickers.tsx
  function dedupe (line 46) | function dedupe(values: string[]): string[] {
  function ListLabel (line 50) | function ListLabel({ children }: { children: ReactNode }) {
  function formatBytes (line 59) | function formatBytes(bytes: number): string {
  function ModelRow (line 67) | function ModelRow({
  function GgufVariantExpander (line 157) | function GgufVariantExpander({
  function isGgufRepo (line 363) | function isGgufRepo(id: string): boolean {
  function extractParamLabel (line 368) | function extractParamLabel(id: string): string | undefined {
  function HubModelPicker (line 381) | function HubModelPicker({
  function LoraModelPicker (line 780) | function LoraModelPicker({

FILE: studio/frontend/src/components/assistant-ui/model-selector/types.ts
  type ModelOption (line 6) | interface ModelOption {
  type LoraModelOption (line 13) | interface LoraModelOption extends ModelOption {
  type ModelSelectorChangeMeta (line 20) | interface ModelSelectorChangeMeta {

FILE: studio/frontend/src/components/assistant-ui/reasoning.tsx
  constant ANIMATION_DURATION (line 36) | const ANIMATION_DURATION = 200;
  type ReasoningRootProps (line 51) | type ReasoningRootProps = Omit<
  function ReasoningRoot (line 61) | function ReasoningRoot({
  function ReasoningFade (line 113) | function ReasoningFade({ className, ...props }: ComponentProps<"div">) {
  function ReasoningFadeTop (line 127) | function ReasoningFadeTop({ className, ...props }: ComponentProps<"div">) {
  function ReasoningTrigger (line 141) | function ReasoningTrigger({
  function ReasoningContent (line 186) | function ReasoningContent({
  function ReasoningText (line 215) | function ReasoningText({
  constant COPY_RESET_MS (line 267) | const COPY_RESET_MS = 2000;
  function ReasoningCopyButton (line 269) | function ReasoningCopyButton({ startIndex, endIndex }: { startIndex: num...

FILE: studio/frontend/src/components/assistant-ui/sources.tsx
  function SourceIcon (line 21) | function SourceIcon({
  function SourceTitle (line 56) | function SourceTitle({ className, ...props }: ComponentProps<"span">) {
  type SourceProps (line 66) | type SourceProps = Omit<BadgeProps, "asChild"> &
  function Source (line 71) | function Source({

FILE: studio/frontend/src/components/assistant-ui/thread.tsx
  function applyQwenThinkingParams (line 292) | function applyQwenThinkingParams(thinkingOn: boolean): void {
  constant COPY_RESET_MS (line 531) | const COPY_RESET_MS = 2000;

FILE: studio/frontend/src/components/assistant-ui/tool-fallback.tsx
  constant ANIMATION_DURATION (line 34) | const ANIMATION_DURATION = 200;
  type ToolFallbackRootProps (line 36) | type ToolFallbackRootProps = Omit<
  function ToolFallbackRoot (line 45) | function ToolFallbackRoot({
  type ToolStatus (line 95) | type ToolStatus = ToolCallMessagePartStatus["type"];
  function ToolFallbackTrigger (line 104) | function ToolFallbackTrigger({
  function ToolFallbackContent (line 189) | function ToolFallbackContent({
  function ToolFallbackArgs (line 215) | function ToolFallbackArgs({
  function ToolFallbackResult (line 239) | function ToolFallbackResult({
  function ToolFallbackError (line 267) | function ToolFallbackError({

FILE: studio/frontend/src/components/assistant-ui/tool-group.tsx
  constant ANIMATION_DURATION (line 21) | const ANIMATION_DURATION = 200;
  type ToolGroupRootProps (line 34) | type ToolGroupRootProps = Omit<
  function ToolGroupRoot (line 44) | function ToolGroupRoot({
  function ToolGroupTrigger (line 97) | function ToolGroupTrigger({
  function ToolGroupContent (line 157) | function ToolGroupContent({
  type ToolGroupComponent (line 191) | type ToolGroupComponent = FC<

FILE: studio/frontend/src/components/assistant-ui/tool-ui-python.tsx
  constant MAX_DISPLAY (line 18) | const MAX_DISPLAY = 10_000;
  constant COPY_RESET_MS (line 19) | const COPY_RESET_MS = 2000;
  constant SHIKI_THEME (line 20) | const SHIKI_THEME = ["github-light", "github-dark"] as ["github-light", ...
  function truncate (line 22) | function truncate(text: string): string {
  function CopyBtn (line 28) | function CopyBtn({ text }: { text: string }) {
  function HighlightedCode (line 59) | function HighlightedCode({ code: source, language }: { code: string; lan...

FILE: studio/frontend/src/components/assistant-ui/tool-ui-terminal.tsx
  constant MAX_DISPLAY (line 16) | const MAX_DISPLAY = 10_000;
  constant COPY_RESET_MS (line 17) | const COPY_RESET_MS = 2000;
  function truncate (line 19) | function truncate(text: string): string {
  function CopyBtn (line 25) | function CopyBtn({ text }: { text: string }) {

FILE: studio/frontend/src/components/assistant-ui/tool-ui-web-search.tsx
  type ParsedSource (line 16) | interface ParsedSource {
  constant RE_BLOCK_SEP (line 22) | const RE_BLOCK_SEP = /\n---\n/;
  constant RE_TITLE (line 23) | const RE_TITLE = /Title:\s*(.+)/;
  constant RE_URL (line 24) | const RE_URL = /URL:\s*(.+)/;
  constant RE_SNIPPET (line 25) | const RE_SNIPPET = /Snippet:\s*(.+)/s;
  function parseSearchResults (line 28) | function parseSearchResults(raw: string): ParsedSource[] {

FILE: studio/frontend/src/components/assistant-ui/tooltip-icon-button.tsx
  type TooltipIconButtonProps (line 17) | type TooltipIconButtonProps = ComponentPropsWithRef<typeof Button> & {

FILE: studio/frontend/src/components/example.tsx
  function ExampleWrapper (line 7) | function ExampleWrapper({ className, ...props }: ComponentProps<"div">) {
  function Example (line 22) | function Example({

FILE: studio/frontend/src/components/layout/dashboard-grid.tsx
  function DashboardGrid (line 13) | function DashboardGrid({

FILE: studio/frontend/src/components/layout/dashboard-layout.tsx
  function DashboardLayout (line 8) | function DashboardLayout({

FILE: studio/frontend/src/components/markdown/markdown-preview.tsx
  constant MARKDOWN_PLUGINS (line 12) | const MARKDOWN_PLUGINS = { code, math, mermaid } as const;
  type MarkdownPreviewProps (line 14) | type MarkdownPreviewProps = {
  function MarkdownPreviewImpl (line 20) | function MarkdownPreviewImpl({

FILE: studio/frontend/src/components/markdown/mermaid-error.tsx
  function hasSlashComment (line 6) | function hasSlashComment(chart: string): boolean {
  function MermaidError (line 10) | function MermaidError({

FILE: studio/frontend/src/components/navbar.tsx
  constant NAV_ITEMS (line 35) | const NAV_ITEMS = [
  function getTourId (line 42) | function getTourId(pathname: string): "studio" | "chat" | "export" | null {
  function Navbar (line 49) | function Navbar() {

FILE: studio/frontend/src/components/section-card.tsx
  type SectionCardProps (line 7) | interface SectionCardProps {
  function SectionCard (line 42) | function SectionCard({

FILE: studio/frontend/src/components/ui/accordion.tsx
  function Accordion (line 13) | function Accordion({
  function AccordionItem (line 29) | function AccordionItem({
  function AccordionTrigger (line 42) | function AccordionTrigger({
  function AccordionContent (line 75) | function AccordionContent({

FILE: studio/frontend/src/components/ui/alert-dialog.tsx
  function AlertDialog (line 10) | function AlertDialog({
  function AlertDialogTrigger (line 16) | function AlertDialogTrigger({
  function AlertDialogPortal (line 24) | function AlertDialogPortal({
  function AlertDialogOverlay (line 32) | function AlertDialogOverlay({
  function AlertDialogContent (line 48) | function AlertDialogContent({
  function AlertDialogHeader (line 73) | function AlertDialogHeader({
  function AlertDialogFooter (line 89) | function AlertDialogFooter({
  function AlertDialogMedia (line 105) | function AlertDialogMedia({
  function AlertDialogTitle (line 121) | function AlertDialogTitle({
  function AlertDialogDescription (line 137) | function AlertDialogDescription({
  function AlertDialogAction (line 153) | function AlertDialogAction({
  function AlertDialogCancel (line 171) | function AlertDialogCancel({

FILE: studio/frontend/src/components/ui/alert.tsx
  function Alert (line 25) | function Alert({
  function AlertTitle (line 40) | function AlertTitle({ className, ...props }: React.ComponentProps<"div">) {
  function AlertDescription (line 53) | function AlertDescription({
  function AlertAction (line 69) | function AlertAction({ className, ...props }: React.ComponentProps<"div"...

FILE: studio/frontend/src/components/ui/animated-shiny-text.tsx
  type AnimatedShinyTextProps (line 8) | interface AnimatedShinyTextProps extends ComponentPropsWithoutRef<"span"> {

FILE: studio/frontend/src/components/ui/animated-theme-toggler.tsx
  type AnimatedThemeTogglerProps (line 10) | interface AnimatedThemeTogglerProps extends React.ComponentPropsWithoutR...

FILE: studio/frontend/src/components/ui/aspect-ratio.tsx
  function AspectRatio (line 6) | function AspectRatio({

FILE: studio/frontend/src/components/ui/avatar.tsx
  function Avatar (line 9) | function Avatar({
  function AvatarImage (line 29) | function AvatarImage({
  function AvatarFallback (line 45) | function AvatarFallback({
  function AvatarBadge (line 61) | function AvatarBadge({ className, ...props }: React.ComponentProps<"span...
  function AvatarGroup (line 77) | function AvatarGroup({ className, ...props }: React.ComponentProps<"div"...
  function AvatarGroupCount (line 90) | function AvatarGroupCount({

FILE: studio/frontend/src/components/ui/badge.tsx
  function Badge (line 35) | function Badge({

FILE: studio/frontend/src/components/ui/breadcrumb.tsx
  function Breadcrumb (line 14) | function Breadcrumb({ className, ...props }: React.ComponentProps<"nav">) {
  function BreadcrumbList (line 25) | function BreadcrumbList({ className, ...props }: React.ComponentProps<"o...
  function BreadcrumbItem (line 38) | function BreadcrumbItem({ className, ...props }: React.ComponentProps<"l...
  function BreadcrumbLink (line 48) | function BreadcrumbLink({
  function BreadcrumbPage (line 66) | function BreadcrumbPage({ className, ...props }: React.ComponentProps<"s...
  function BreadcrumbSeparator (line 79) | function BreadcrumbSeparator({
  function BreadcrumbEllipsis (line 97) | function BreadcrumbEllipsis({

FILE: studio/frontend/src/components/ui/button.tsx
  function Button (line 48) | function Button({

FILE: studio/frontend/src/components/ui/calendar.tsx
  function Calendar (line 20) | function Calendar({
  function CalendarDayButton (line 199) | function CalendarDayButton({

FILE: studio/frontend/src/components/ui/card.tsx
  function Card (line 8) | function Card({
  function CardHeader (line 26) | function CardHeader({ className, ...props }: React.ComponentProps<"div">) {
  function CardTitle (line 39) | function CardTitle({ className, ...props }: React.ComponentProps<"div">) {
  function CardDescription (line 49) | function CardDescription({ className, ...props }: React.ComponentProps<"...
  function CardAction (line 59) | function CardAction({ className, ...props }: React.ComponentProps<"div">) {
  function CardContent (line 72) | function CardContent({ className, ...props }: React.ComponentProps<"div"...
  function CardFooter (line 82) | function CardFooter({ className, ...props }: React.ComponentProps<"div">) {

FILE: studio/frontend/src/components/ui/chart.tsx
  constant THEMES (line 10) | const THEMES = { light: "", dark: ".dark" } as const;
  type ChartConfig (line 12) | type ChartConfig = {
  type ChartContextProps (line 22) | type ChartContextProps = {
  function useChart (line 28) | function useChart() {
  function ChartContainer (line 38) | function ChartContainer({
  function ChartTooltipContent (line 180) | function ChartTooltipContent({
  function ChartLegendContent (line 347) | function ChartLegendContent({
  function getPayloadConfigFromPayload (line 403) | function getPayloadConfigFromPayload(

FILE: studio/frontend/src/components/ui/checkbox.tsx
  function Checkbox (line 11) | function Checkbox({

FILE: studio/frontend/src/components/ui/collapsible.tsx
  function Collapsible (line 7) | function Collapsible({
  function CollapsibleTrigger (line 13) | function CollapsibleTrigger({
  function CollapsibleContent (line 24) | function CollapsibleContent({

FILE: studio/frontend/src/components/ui/combobox.tsx
  type ComboboxRootProps (line 29) | type ComboboxRootProps = ComboboxPrimitive.Root.Props<string, false>;
  function Combobox (line 31) | function Combobox({
  function ComboboxValue (line 52) | function ComboboxValue({
  function ComboboxTrigger (line 58) | function ComboboxTrigger({
  function ComboboxClear (line 79) | function ComboboxClear({
  function ComboboxInput (line 99) | function ComboboxInput({
  function ComboboxContent (line 146) | function ComboboxContent({
  function ComboboxList (line 187) | function ComboboxList({
  function ComboboxItem (line 203) | function ComboboxItem({
  function ComboboxGroup (line 233) | function ComboboxGroup({
  function ComboboxLabel (line 246) | function ComboboxLabel({
  function ComboboxCollection (line 259) | function ComboboxCollection({
  function ComboboxEmpty (line 267) | function ComboboxEmpty({
  function ComboboxSeparator (line 283) | function ComboboxSeparator({
  function ComboboxChips (line 296) | function ComboboxChips({
  function ComboboxChip (line 313) | function ComboboxChip({
  function ComboboxChipsInput (line 348) | function ComboboxChipsInput({
  function useComboboxAnchor (line 361) | function useComboboxAnchor(): React.MutableRefObject<HTMLDivElement | nu...

FILE: studio/frontend/src/components/ui/command.tsx
  function Command (line 21) | function Command({
  function CommandDialog (line 37) | function CommandDialog({
  function CommandInput (line 69) | function CommandInput({
  function CommandList (line 96) | function CommandList({
  function CommandEmpty (line 112) | function CommandEmpty({
  function CommandGroup (line 125) | function CommandGroup({
  function CommandSeparator (line 141) | function CommandSeparator({
  function CommandItem (line 154) | function CommandItem({
  function CommandShortcut (line 178) | function CommandShortcut({

FILE: studio/frontend/src/components/ui/confetti.tsx
  type Api (line 24) | type Api = {
  type Props (line 28) | type Props = React.ComponentPropsWithRef<"canvas"> & {
  type ConfettiRef (line 35) | type ConfettiRef = Api | null;
  type ConfettiButtonProps (line 114) | interface ConfettiButtonProps extends React.ComponentProps<"button"> {

FILE: studio/frontend/src/components/ui/context-menu.tsx
  function ContextMenu (line 13) | function ContextMenu({
  function ContextMenuTrigger (line 19) | function ContextMenuTrigger({
  function ContextMenuGroup (line 32) | function ContextMenuGroup({
  function ContextMenuPortal (line 40) | function ContextMenuPortal({
  function ContextMenuSub (line 48) | function ContextMenuSub({
  function ContextMenuRadioGroup (line 54) | function ContextMenuRadioGroup({
  function ContextMenuContent (line 65) | function ContextMenuContent({
  function ContextMenuItem (line 85) | function ContextMenuItem({
  function ContextMenuSubTrigger (line 108) | function ContextMenuSubTrigger({
  function ContextMenuSubContent (line 136) | function ContextMenuSubContent({
  function ContextMenuCheckboxItem (line 152) | function ContextMenuCheckboxItem({
  function ContextMenuRadioItem (line 178) | function ContextMenuRadioItem({
  function ContextMenuLabel (line 202) | function ContextMenuLabel({
  function ContextMenuSeparator (line 222) | function ContextMenuSeparator({
  function ContextMenuShortcut (line 235) | function ContextMenuShortcut({

FILE: studio/frontend/src/components/ui/data-table.tsx
  type DataTableProps (line 24) | interface DataTableProps<TData, TValue> {
  function DataTable (line 36) | function DataTable<TData, TValue>({

FILE: studio/frontend/src/components/ui/dialog.tsx
  function useDialogPortalContainer (line 17) | function useDialogPortalContainer(): HTMLElement | null {
  function Dialog (line 21) | function Dialog({
  function DialogTrigger (line 27) | function DialogTrigger({
  function DialogPortal (line 33) | function DialogPortal({
  function DialogClose (line 39) | function DialogClose({
  function DialogOverlay (line 45) | function DialogOverlay({
  function DialogContent (line 65) | function DialogContent({
  function DialogHeader (line 117) | function DialogHeader({ className, ...props }: React.ComponentProps<"div...
  function DialogFooter (line 127) | function DialogFooter({
  function DialogTitle (line 154) | function DialogTitle({
  function DialogDescription (line 167) | function DialogDescription({

FILE: studio/frontend/src/components/ui/dropdown-menu.tsx
  function DropdownMenu (line 11) | function DropdownMenu({
  function DropdownMenuPortal (line 17) | function DropdownMenuPortal({
  function DropdownMenuTrigger (line 25) | function DropdownMenuTrigger({
  function DropdownMenuContent (line 36) | function DropdownMenuContent({
  function DropdownMenuGroup (line 58) | function DropdownMenuGroup({
  function DropdownMenuItem (line 66) | function DropdownMenuItem({
  function DropdownMenuCheckboxItem (line 89) | function DropdownMenuCheckboxItem({
  function DropdownMenuRadioGroup (line 118) | function DropdownMenuRadioGroup({
  function DropdownMenuRadioItem (line 129) | function DropdownMenuRadioItem({
  function DropdownMenuLabel (line 156) | function DropdownMenuLabel({
  function DropdownMenuSeparator (line 176) | function DropdownMenuSeparator({
  function DropdownMenuShortcut (line 189) | function DropdownMenuShortcut({
  function DropdownMenuSub (line 205) | function DropdownMenuSub({
  function DropdownMenuSubTrigger (line 211) | function DropdownMenuSubTrigger({
  function DropdownMenuSubContent (line 239) | function DropdownMenuSubContent({

FILE: studio/frontend/src/components/ui/empty.tsx
  function Empty (line 8) | function Empty({ className, ...props }: React.ComponentProps<"div">) {
  function EmptyHeader (line 21) | function EmptyHeader({ className, ...props }: React.ComponentProps<"div"...
  function EmptyMedia (line 49) | function EmptyMedia({
  function EmptyTitle (line 64) | function EmptyTitle({ className, ...props }: React.ComponentProps<"div">) {
  function EmptyDescription (line 74) | function EmptyDescription({ className, ...props }: React.ComponentProps<...
  function EmptyContent (line 87) | function EmptyContent({ className, ...props }: React.ComponentProps<"div...

FILE: studio/frontend/src/components/ui/field.tsx
  function FieldSet (line 11) | function FieldSet({ className, ...props }: React.ComponentProps<"fieldse...
  function FieldLegend (line 24) | function FieldLegend({
  function FieldGroup (line 42) | function FieldGroup({ className, ...props }: React.ComponentProps<"div">) {
  function Field (line 73) | function Field({
  function FieldContent (line 89) | function FieldContent({ className, ...props }: React.ComponentProps<"div...
  function FieldLabel (line 102) | function FieldLabel({
  function FieldTitle (line 119) | function FieldTitle({ className, ...props }: React.ComponentProps<"div">) {
  function FieldDescription (line 132) | function FieldDescription({ className, ...props }: React.ComponentProps<...
  function FieldSeparator (line 147) | function FieldSeparator({
  function FieldError (line 177) | function FieldError({

FILE: studio/frontend/src/components/ui/hover-card.tsx
  function HoverCard (line 9) | function HoverCard({
  function HoverCardTrigger (line 15) | function HoverCardTrigger({
  function HoverCardContent (line 23) | function HoverCardContent({

FILE: studio/frontend/src/components/ui/input-group.tsx
  function InputGroup (line 12) | function InputGroup({ className, ...props }: React.ComponentProps<"div">) {
  function InputGroupAddon (line 47) | function InputGroupAddon({
  function InputGroupButton (line 86) | function InputGroupButton({
  function InputGroupText (line 105) | function InputGroupText({ className, ...props }: React.ComponentProps<"s...
  function InputGroupInput (line 117) | function InputGroupInput({
  function InputGroupTextarea (line 133) | function InputGroupTextarea({

FILE: studio/frontend/src/components/ui/input.tsx
  function Input (line 8) | function Input({ className, type, ...props }: React.ComponentProps<"inpu...

FILE: studio/frontend/src/components/ui/label.tsx
  function Label (line 11) | function Label({

FILE: studio/frontend/src/components/ui/light-rays.tsx
  type LightRaysProps (line 9) | interface LightRaysProps extends React.HTMLAttributes<HTMLDivElement> {
  type LightRay (line 18) | type LightRay = {
  function LightRays (line 88) | function LightRays({

FILE: studio/frontend/src/components/ui/menubar.tsx
  function Menubar (line 13) | function Menubar({
  function MenubarMenu (line 29) | function MenubarMenu({
  function MenubarGroup (line 35) | function MenubarGroup({
  function MenubarPortal (line 41) | function MenubarPortal({
  function MenubarRadioGroup (line 47) | function MenubarRadioGroup({
  function MenubarTrigger (line 55) | function MenubarTrigger({
  function MenubarContent (line 71) | function MenubarContent({
  function MenubarItem (line 95) | function MenubarItem({
  function MenubarCheckboxItem (line 118) | function MenubarCheckboxItem({
  function MenubarRadioItem (line 144) | function MenubarRadioItem({
  function MenubarLabel (line 168) | function MenubarLabel({
  function MenubarSeparator (line 188) | function MenubarSeparator({
  function MenubarShortcut (line 201) | function MenubarShortcut({
  function MenubarSub (line 217) | function MenubarSub({
  function MenubarSubTrigger (line 223) | function MenubarSubTrigger({
  function MenubarSubContent (line 251) | function MenubarSubContent({

FILE: studio/frontend/src/components/ui/navigation-menu.tsx
  function NavigationMenu (line 14) | function NavigationMenu({
  function NavigationMenuList (line 38) | function NavigationMenuList({
  function NavigationMenuItem (line 56) | function NavigationMenuItem({
  function NavigationMenuTrigger (line 75) | function NavigationMenuTrigger({
  function NavigationMenuContent (line 99) | function NavigationMenuContent({
  function NavigationMenuViewport (line 117) | function NavigationMenuViewport({
  function NavigationMenuLink (line 141) | function NavigationMenuLink({
  function NavigationMenuIndicator (line 159) | function NavigationMenuIndicator({

FILE: studio/frontend/src/components/ui/pagination.tsx
  function Pagination (line 15) | function Pagination({ className, ...props }: React.ComponentProps<"nav">) {
  function PaginationContent (line 26) | function PaginationContent({
  function PaginationItem (line 39) | function PaginationItem({ ...props }: React.ComponentProps<"li">) {
  type PaginationLinkProps (line 43) | type PaginationLinkProps = {
  function PaginationLink (line 48) | function PaginationLink({
  function PaginationPrevious (line 71) | function PaginationPrevious({
  function PaginationNext (line 92) | function PaginationNext({
  function PaginationEllipsis (line 113) | function PaginationEllipsis({

FILE: studio/frontend/src/components/ui/popover.tsx
  function Popover (line 11) | function Popover({
  function PopoverTrigger (line 17) | function PopoverTrigger({
  function PopoverContent (line 23) | function PopoverContent({
  function PopoverAnchor (line 45) | function PopoverAnchor({
  function PopoverHeader (line 51) | function PopoverHeader({ className, ...props }: React.ComponentProps<"di...
  function PopoverTitle (line 61) | function PopoverTitle({ className, ...props }: React.ComponentProps<"h2"...
  function PopoverDescription (line 71) | function PopoverDescription({

FILE: studio/frontend/src/components/ui/progress.tsx
  function Progress (line 11) | function Progress({

FILE: studio/frontend/src/components/ui/radio-group.tsx
  function RadioGroup (line 11) | function RadioGroup({
  function RadioGroupItem (line 24) | function RadioGroupItem({

FILE: studio/frontend/src/components/ui/resizable.tsx
  function ResizablePanelGroup (line 9) | function ResizablePanelGroup({
  function ResizablePanel (line 25) | function ResizablePanel({
  function ResizableHandle (line 31) | function ResizableHandle({

FILE: studio/frontend/src/components/ui/scroll-area.tsx
  function ScrollArea (line 11) | function ScrollArea({
  function ScrollBar (line 34) | function ScrollBar({

FILE: studio/frontend/src/components/ui/select.tsx
  function Select (line 22) | function Select({
  function SelectGroup (line 41) | function SelectGroup({
  function SelectValue (line 54) | function SelectValue({
  function SelectTrigger (line 60) | function SelectTrigger({
  function SelectContent (line 98) | function SelectContent({
  function SelectLabel (line 140) | function SelectLabel({
  function SelectItem (line 153) | function SelectItem({
  function SelectSeparator (line 181) | function SelectSeparator({
  function SelectScrollUpButton (line 197) | function SelectScrollUpButton({
  function SelectScrollDownButton (line 215) | function SelectScrollDownButton({

FILE: studio/frontend/src/components/ui/separator.tsx
  function Separator (line 9) | function Separator({

FILE: studio/frontend/src/components/ui/sheet.tsx
  function Sheet (line 14) | function Sheet({ ...props }: React.ComponentProps<typeof SheetPrimitive....
  function SheetTrigger (line 18) | function SheetTrigger({
  function SheetClose (line 24) | function SheetClose({
  function SheetPortal (line 30) | function SheetPortal({
  function SheetOverlay (line 36) | function SheetOverlay({
  function SheetContent (line 56) | function SheetContent({
  function SheetHeader (line 112) | function SheetHeader({ className, ...props }: React.ComponentProps<"div"...
  function SheetFooter (line 122) | function SheetFooter({ className, ...props }: React.ComponentProps<"div"...
  function SheetTitle (line 132) | function SheetTitle({
  function SheetDescription (line 145) | function SheetDescription({

FILE: studio/frontend/src/components/ui/shine-border.tsx
  type ShineBorderProps (line 8) | interface ShineBorderProps extends React.HTMLAttributes<HTMLDivElement> {
  function ShineBorder (line 31) | function ShineBorder({

FILE: studio/frontend/src/components/ui/sidebar.tsx
  constant SIDEBAR_COOKIE_NAME (line 31) | const SIDEBAR_COOKIE_NAME = "sidebar_state"
  constant SIDEBAR_COOKIE_MAX_AGE (line 32) | const SIDEBAR_COOKIE_MAX_AGE = 60 * 60 * 24 * 7
  constant SIDEBAR_WIDTH (line 33) | const SIDEBAR_WIDTH = "16rem"
  constant SIDEBAR_WIDTH_MOBILE (line 34) | const SIDEBAR_WIDTH_MOBILE = "18rem"
  constant SIDEBAR_WIDTH_ICON (line 35) | const SIDEBAR_WIDTH_ICON = "3rem"
  constant SIDEBAR_KEYBOARD_SHORTCUT (line 36) | const SIDEBAR_KEYBOARD_SHORTCUT = "b"
  type SidebarContextProps (line 38) | type SidebarContextProps = {
  function useSidebar (line 50) | function useSidebar() {
  function SidebarProvider (line 59) | function SidebarProvider({
  function Sidebar (line 155) | function Sidebar({
  function SidebarTrigger (line 257) | function SidebarTrigger({
  function SidebarRail (line 283) | function SidebarRail({ className, ...props }: React.ComponentProps<"butt...
  function SidebarInset (line 308) | function SidebarInset({ className, ...props }: React.ComponentProps<"mai...
  function SidebarInput (line 321) | function SidebarInput({
  function SidebarHeader (line 335) | function SidebarHeader({ className, ...props }: React.ComponentProps<"di...
  function SidebarFooter (line 346) | function SidebarFooter({ className, ...props }: React.ComponentProps<"di...
  function SidebarSeparator (line 357) | function SidebarSeparator({
  function SidebarContent (line 371) | function SidebarContent({ className, ...props }: React.ComponentProps<"d...
  function SidebarGroup (line 385) | function SidebarGroup({ className, ...props }: React.ComponentProps<"div...
  function SidebarGroupLabel (line 399) | function SidebarGroupLabel({
  function SidebarGroupAction (line 419) | function SidebarGroupAction({
  function SidebarGroupContent (line 439) | function SidebarGroupContent({
  function SidebarMenu (line 453) | function SidebarMenu({ className, ...props }: React.ComponentProps<"ul">) {
  function SidebarMenuItem (line 464) | function SidebarMenuItem({ className, ...props }: React.ComponentProps<"...
  function SidebarMenuButton (line 496) | function SidebarMenuButton({
  function SidebarMenuAction (line 546) | function SidebarMenuAction({
  function SidebarMenuBadge (line 572) | function SidebarMenuBadge({
  function SidebarMenuSkeleton (line 589) | function SidebarMenuSkeleton({
  function SidebarMenuSub (line 627) | function SidebarMenuSub({ className, ...props }: React.ComponentProps<"u...
  function SidebarMenuSubItem (line 638) | function SidebarMenuSubItem({
  function SidebarMenuSubButton (line 652) | function SidebarMenuSubButton({

FILE: studio/frontend/src/components/ui/skeleton.tsx
  function Skeleton (line 6) | function Skeleton({ className, ...props }: React.ComponentProps<"div">) {

FILE: studio/frontend/src/components/ui/slider.tsx
  constant THUMB_SIZE_PX (line 9) | const THUMB_SIZE_PX = 16;
  function getThumbInBoundsOffset (line 11) | function getThumbInBoundsOffset(width: number, percent: number) {
  function Slider (line 21) | function Slider({

FILE: studio/frontend/src/components/ui/sparkles-text.tsx
  type SparkleItem (line 15) | type SparkleItem = {
  function Sparkle (line 25) | function Sparkle({ id, x, y, color, delay, scale }: SparkleItem): ReactE...
  type SparklesTextProps (line 50) | interface SparklesTextProps {
  function SparklesText (line 95) | function SparklesText({

FILE: studio/frontend/src/components/ui/spinner.tsx
  function Spinner (line 8) | function Spinner({ className }: { className?: string }) {

FILE: studio/frontend/src/components/ui/switch.tsx
  function Switch (line 9) | function Switch({

FILE: studio/frontend/src/components/ui/table.tsx
  function Table (line 8) | function Table({ className, ...props }: React.ComponentProps<"table">) {
  function TableHeader (line 23) | function TableHeader({ className, ...props }: React.ComponentProps<"thea...
  function TableBody (line 33) | function TableBody({ className, ...props }: React.ComponentProps<"tbody"...
  function TableFooter (line 43) | function TableFooter({ className, ...props }: React.ComponentProps<"tfoo...
  function TableRow (line 56) | function TableRow({ className, ...props }: React.ComponentProps<"tr">) {
  function TableHead (line 69) | function TableHead({ className, ...props }: React.ComponentProps<"th">) {
  function TableCell (line 82) | function TableCell({ className, ...props }: React.ComponentProps<"td">) {
  function TableCaption (line 95) | function TableCaption({

FILE: studio/frontend/src/components/ui/tabs.tsx
  function Tabs (line 19) | function Tabs({
  function TabsList (line 66) | function TabsList({
  function TabsTrigger (line 82) | function TabsTrigger({
  function TabsContent (line 121) | function TabsContent({

FILE: studio/frontend/src/components/ui/terminal.tsx
  type TerminalProps (line 15) | type TerminalProps = {
  type InternalLineProps (line 22) | type InternalLineProps = {
  function useStartOnView (line 28) | function useStartOnView(enabled: boolean): {
  function Terminal (line 63) | function Terminal({
  type AnimatedSpanProps (line 111) | type AnimatedSpanProps = InternalLineProps & {
  function AnimatedSpan (line 118) | function AnimatedSpan({
  type TypingAnimationProps (line 165) | type TypingAnimationProps = InternalLineProps & {
  function TypingAnimation (line 174) | function TypingAnimation({

FILE: studio/frontend/src/components/ui/textarea.tsx
  function Textarea (line 8) | function Textarea({ className, ...props }: React.ComponentProps<"textare...

FILE: studio/frontend/src/components/ui/toggle-group.tsx
  function ToggleGroup (line 25) | function ToggleGroup({
  function ToggleGroupItem (line 61) | function ToggleGroupItem({

FILE: studio/frontend/src/components/ui/toggle.tsx
  function Toggle (line 35) | function Toggle({

FILE: studio/frontend/src/components/ui/tooltip.tsx
  type ToggleFn (line 10) | type ToggleFn = () => void;
  function TooltipProvider (line 13) | function TooltipProvider({
  function Tooltip (line 26) | function Tooltip({
  function TooltipTrigger (line 60) | function TooltipTrigger({
  function TooltipContent (line 84) | function TooltipContent({

FILE: studio/frontend/src/config/env.ts
  type DeviceType (line 15) | type DeviceType = "mac" | "windows" | "linux" | string;
  type PlatformState (line 17) | interface PlatformState {
  function fetchDeviceType (line 31) | async function fetchDeviceType(): Promise<DeviceType> {

FILE: studio/frontend/src/config/training.ts
  constant STEPS (line 7) | const STEPS: StepConfig[] = [
  constant MODEL_TYPES (line 40) | const MODEL_TYPES: ReadonlyArray<{
  constant CONTEXT_LENGTHS (line 67) | const CONTEXT_LENGTHS = [512, 1024, 2048, 4096, 8192, 16384, 32768, 6553...
  constant TARGET_MODULES (line 69) | const TARGET_MODULES = [
  constant OPTIMIZER_OPTIONS (line 79) | const OPTIMIZER_OPTIONS: ReadonlyArray<{ value: string; label: string }>...
  constant LR_SCHEDULER_OPTIONS (line 88) | const LR_SCHEDULER_OPTIONS: ReadonlyArray<{ value: string; label: string...
  constant DEFAULT_HYPERPARAMS (line 93) | const DEFAULT_HYPERPARAMS = {
  constant MODEL_TYPE_TO_HF_TASK (line 128) | const MODEL_TYPE_TO_HF_TASK: Record<ModelType, PipelineType> = {
  constant PRIORITY_TRAINING_MODELS (line 136) | const PRIORITY_TRAINING_MODELS: readonly string[] = [
  function applyPriorityOrdering (line 150) | function applyPriorityOrdering(ids: string[]): string[] {

FILE: studio/frontend/src/features/auth/api.ts
  type RefreshResponse (line 12) | type RefreshResponse = {
  function isPasswordChangeRequiredResponse (line 20) | async function isPasswordChangeRequiredResponse(response: Response): Pro...
  function redirectToAuth (line 31) | async function redirectToAuth(): Promise<void> {
  function refreshSession (line 49) | async function refreshSession(): Promise<boolean> {
  function authFetch (line 77) | async function authFetch(
  function logout (line 125) | function logout(): void {

FILE: studio/frontend/src/features/auth/change-password-page.tsx
  function ChangePasswordPage (line 8) | function ChangePasswordPage() {

FILE: studio/frontend/src/features/auth/components/auth-form.tsx
  type Window (line 17) | interface Window {
  type AuthMode (line 34) | type AuthMode = "login" | "change-password";
  type AuthStatusResponse (line 36) | type AuthStatusResponse = {
  type TokenResponse (line 41) | type TokenResponse = {
  function loginWithPassword (line 47) | async function loginWithPassword(
  type AuthFormProps (line 70) | type AuthFormProps = {
  constant HIDDEN_LOGIN_USERNAME (line 74) | const HIDDEN_LOGIN_USERNAME = "unsloth";
  function AuthForm (line 76) | function AuthForm({ mode }: AuthFormProps): ReactElement | null {

FILE: studio/frontend/src/features/auth/login-page.tsx
  function LoginPage (line 8) | function LoginPage() {

FILE: studio/frontend/src/features/auth/session.ts
  constant AUTH_TOKEN_KEY (line 6) | const AUTH_TOKEN_KEY = "unsloth_auth_token";
  constant AUTH_REFRESH_TOKEN_KEY (line 7) | const AUTH_REFRESH_TOKEN_KEY = "unsloth_auth_refresh_token";
  constant ONBOARDING_DONE_KEY (line 8) | const ONBOARDING_DONE_KEY = "unsloth_onboarding_done";
  constant AUTH_MUST_CHANGE_PASSWORD_KEY (line 9) | const AUTH_MUST_CHANGE_PASSWORD_KEY = "unsloth_auth_must_change_password";
  type PostAuthRoute (line 11) | type PostAuthRoute = "/onboarding" | "/studio" | "/change-password" | "/...
  function canUseStorage (line 13) | function canUseStorage(): boolean {
  function hasAuthToken (line 17) | function hasAuthToken(): boolean {
  function hasRefreshToken (line 22) | function hasRefreshToken(): boolean {
  function getAuthToken (line 27) | function getAuthToken(): string | null {
  function getRefreshToken (line 32) | function getRefreshToken(): string | null {
  function storeAuthTokens (line 37) | function storeAuthTokens(
  function clearAuthTokens (line 48) | function clearAuthTokens(): void {
  function mustChangePassword (line 55) | function mustChangePassword(): boolean {
  function setMustChangePassword (line 60) | function setMustChangePassword(required: boolean): void {
  function isOnboardingDone (line 65) | function isOnboardingDone(): boolean {
  function markOnboardingDone (line 70) | function markOnboardingDone(): void {
  function resetOnboardingDone (line 75) | function resetOnboardingDone(): void {
  function getPostAuthRoute (line 80) | function getPostAuthRoute(): PostAuthRoute {

FILE: studio/frontend/src/features/chat/api/chat-adapter.ts
  type RunMessages (line 23) | type RunMessages = Parameters<ChatModelAdapter["run"]>[0]["messages"];
  type RunMessage (line 24) | type RunMessage = RunMessages[number];
  function parseSourcesFromResult (line 30) | function parseSourcesFromResult(raw: string): { type: "source"; sourceTy...
  function estimateTokenCount (line 51) | function estimateTokenCount(text: string): number | undefined {
  function buildTiming (line 59) | function buildTiming(
  function collectTextParts (line 83) | function collectTextParts(message: RunMessage): string[] {
  function toOpenAIMessage (line 101) | function toOpenAIMessage(message: RunMessage): {
  function extractImageBase64 (line 126) | function extractImageBase64(input: string): string | undefined {
  function findLatestUserImageBase64 (line 137) | function findLatestUserImageBase64(messages: RunMessages): string | unde...
  function findLatestUserAudioBase64 (line 171) | function findLatestUserAudioBase64(messages: RunMessages): string | unde...
  function resolveUseAdapter (line 191) | async function resolveUseAdapter(
  function waitForModelReady (line 214) | function waitForModelReady(abortSignal?: AbortSignal): Promise<void> {
  function autoLoadSmallestModel (line 230) | async function autoLoadSmallestModel(): Promise<boolean> {
  function createOpenAIStreamAdapter (line 385) | function createOpenAIStreamAdapter(): ChatModelAdapter {

FILE: studio/frontend/src/features/chat/api/chat-api.ts
  function parseErrorText (line 19) | function parseErrorText(status: number, body: unknown): string {
  function parseJsonOrThrow (line 39) | async function parseJsonOrThrow<T>(response: Response): Promise<T> {
  function listModels (line 47) | async function listModels(): Promise<ListModelsResponse> {
  function listLoras (line 52) | async function listLoras(outputsDir?: string): Promise<ListLorasResponse> {
  function getInferenceStatus (line 60) | async function getInferenceStatus(): Promise<InferenceStatusResponse> {
  function loadModel (line 65) | async function loadModel(
  function validateModel (line 76) | async function validateModel(
  function unloadModel (line 91) | async function unloadModel(payload: UnloadModelRequest): Promise<void> {
  type CachedGgufRepo (line 100) | interface CachedGgufRepo {
  function getGgufDownloadProgress (line 106) | async function getGgufDownloadProgress(
  function getDownloadProgress (line 120) | async function getDownloadProgress(
  function listCachedGguf (line 128) | async function listCachedGguf(): Promise<CachedGgufRepo[]> {
  type CachedModelRepo (line 134) | interface CachedModelRepo {
  function listCachedModels (line 139) | async function listCachedModels(): Promise<CachedModelRepo[]> {
  function deleteCachedModel (line 145) | async function deleteCachedModel(repoId: string, variant?: string): Prom...
  function listGgufVariants (line 156) | async function listGgufVariants(
  function parseSseEvent (line 166) | function parseSseEvent(rawEvent: string): string[] {
  function generateAudio (line 249) | async function generateAudio(

FILE: studio/frontend/src/features/chat/chat-page.tsx
  type LoraCandidate (line 60) | type LoraCandidate = {
  function normalizeModelRef (line 66) | function normalizeModelRef(value: string | null | undefined): string {
  function pickBestLoraForBase (line 70) | function pickBestLoraForBase(
  function messageHasImage (line 97) | function messageHasImage(message: MessageRecord): boolean {
  type CompareModelSelection (line 131) | type CompareModelSelection = {
  function useIsLoraCompare (line 142) | function useIsLoraCompare(): boolean {
  function InlineSidebar (line 330) | function InlineSidebar({
  function TopBarActions (line 378) | function TopBarActions({
  function ChatPage (line 411) | function ChatPage(): ReactElement {

FILE: studio/frontend/src/features/chat/chat-settings-sheet.tsx
  type Preset (line 44) | interface Preset {
  constant BUILTIN_PRESETS (line 49) | const BUILTIN_PRESETS: Preset[] = [
  function ParamSlider (line 75) | function ParamSlider({
  function CollapsibleSection (line 111) | function CollapsibleSection({
  type ChatSettingsPanelProps (line 160) | interface ChatSettingsPanelProps {
  function ChatSettingsPanel (line 170) | function ChatSettingsPanel({
  function MaxToolCallsSlider (line 471) | function MaxToolCallsSlider() {
  function ToolCallTimeoutSlider (line 491) | function ToolCallTimeoutSlider() {
  function AutoHealToolCallsToggle (line 518) | function AutoHealToolCallsToggle() {
  function ChatTemplateSection (line 538) | function ChatTemplateSection({

FILE: studio/frontend/src/features/chat/components/model-load-status.tsx
  type ModelLoadDescriptionProps (line 8) | type ModelLoadDescriptionProps = {
  function clampProgress (line 16) | function clampProgress(value: number): number {
  function ModelLoadDescription (line 20) | function ModelLoadDescription({
  type ModelLoadInlineStatusProps (line 64) | type ModelLoadInlineStatusProps = {
  function ModelLoadInlineStatus (line 72) | function ModelLoadInlineStatus({

FILE: studio/frontend/src/features/chat/db.ts
  function useLiveQuery (line 41) | function useLiveQuery<T>(

FILE: studio/frontend/src/features/chat/hooks/use-chat-model-runtime.ts
  type SelectedModelInput (line 25) | type SelectedModelInput = {
  constant MODEL_LOAD_TOAST_CLASSNAMES (line 35) | const MODEL_LOAD_TOAST_CLASSNAMES = {
  constant LORA_SUFFIX_RE (line 42) | const LORA_SUFFIX_RE = /_(\d{9,})$/;
  function parseTrailingEpoch (line 44) | function parseTrailingEpoch(input: string): number | undefined {
  function stripTrailingEpoch (line 53) | function stripTrailingEpoch(input: string): string {
  function describeModel (line 58) | function describeModel(model: {
  function toChatModelSummary (line 76) | function toChatModelSummary(model: {
  function toLoraSummary (line 99) | function toLoraSummary(lora: {
  function toFiniteNumber (line 120) | function toFiniteNumber(value: unknown): number | undefined {
  function mergeRecommendedInference (line 127) | function mergeRecommendedInference(
  function useChatModelRuntime (line 156) | function useChatModelRuntime() {

FILE: studio/frontend/src/features/chat/runtime-provider.tsx
  constant DEFAULT_SUGGESTIONS (line 33) | const DEFAULT_SUGGESTIONS = [
  type TitleResponse (line 40) | type TitleResponse = {
  class VisionImageAdapter (line 48) | class VisionImageAdapter implements AttachmentAdapter {
    method add (line 51) | async add({ file }: { file: File }): Promise<PendingAttachment> {
    method send (line 67) | async send(attachment: PendingAttachment): Promise<CompleteAttachment> {
    method remove (line 83) | async remove(): Promise<void> {
    method fileToBase64DataURL (line 87) | private async fileToBase64DataURL(file: File): Promise<string> {
  class PDFAttachmentAdapter (line 97) | class PDFAttachmentAdapter implements AttachmentAdapter {
    method add (line 100) | add({ file }: { file: File }): Promise<PendingAttachment> {
    method send (line 111) | async send(attachment: PendingAttachment): Promise<CompleteAttachment> {
    method remove (line 125) | remove(): Promise<void> {
  class TextAttachmentAdapter (line 130) | class TextAttachmentAdapter implements AttachmentAdapter {
    method add (line 133) | async add({ file }: { file: File }): Promise<PendingAttachment> {
    method send (line 144) | async send(attachment: PendingAttachment): Promise<CompleteAttachment> {
    method remove (line 158) | remove(): Promise<void> {
  class HtmlAttachmentAdapter (line 163) | class HtmlAttachmentAdapter implements AttachmentAdapter {
    method add (line 166) | async add({ file }: { file: File }): Promise<PendingAttachment> {
    method send (line 177) | async send(attachment: PendingAttachment): Promise<CompleteAttachment> {
    method remove (line 196) | remove(): Promise<void> {
  class DocxAttachmentAdapter (line 201) | class DocxAttachmentAdapter implements AttachmentAdapter {
    method add (line 205) | add({ file }: { file: File }): Promise<PendingAttachment> {
    method send (line 216) | async send(attachment: PendingAttachment): Promise<CompleteAttachment> {
    method remove (line 229) | remove(): Promise<void> {
  function clip (line 234) | function clip(input: string, maxLen: number): string {
  function extractTextParts (line 240) | function extractTextParts(m: ThreadMessage | undefined): string {
  function generateTitleWithModel (line 250) | async function generateTitleWithModel(payload: {
  function fallbackTitleFromUserText (line 309) | function fallbackTitleFromUserText(userText: string): string {
  function cloneContent (line 317) | function cloneContent(content: ThreadMessage["content"]): ThreadMessage[...
  function cloneAttachments (line 323) | function cloneAttachments(
  function toThreadMessage (line 332) | function toThreadMessage(m: MessageRecord): ThreadMessage {
  function createDexieAdapter (line 364) | function createDexieAdapter(
  function ThreadHistoryProvider (line 512) | function ThreadHistoryProvider({
  function useRuntimeHook (line 598) | function useRuntimeHook(): ReturnType<typeof useLocalRuntime> {
  function ThreadAutoSwitch (line 602) | function ThreadAutoSwitch({
  function ThreadNewChatSwitch (line 618) | function ThreadNewChatSwitch({
  function ActiveThreadSync (line 633) | function ActiveThreadSync({
  function ChatRuntimeProvider (line 649) | function ChatRuntimeProvider({

FILE: studio/frontend/src/features/chat/shared-composer.tsx
  type CompareMessagePart (line 26) | type CompareMessagePart =
  type CompareHandle (line 31) | interface CompareHandle {
  constant IMAGE_ACCEPT (line 43) | const IMAGE_ACCEPT = "image/jpeg,image/png,image/webp,image/gif";
  constant MAX_IMAGE_SIZE (line 44) | const MAX_IMAGE_SIZE = 20 * 1024 * 1024;
  function fileToBase64DataURL (line 46) | function fileToBase64DataURL(file: File): Promise<string> {
  function useDictation (line 55) | function useDictation(
  type CompareHandles (line 115) | type CompareHandles = MutableRefObject<Record<string, CompareHandle>>;
  function CompareHandlesProvider (line 119) | function CompareHandlesProvider({
  function RegisterCompareHandle (line 133) | function RegisterCompareHandle({
  type PendingImage (line 180) | type PendingImage = { id: string; file: File };
  function PendingImageThumb (line 182) | function PendingImageThumb({
  type CompareModelSelection (line 211) | type CompareModelSelection = {
  function SharedComposer (line 217) | function SharedComposer({

FILE: studio/frontend/src/features/chat/stores/chat-runtime-store.ts
  constant AUTO_TITLE_KEY (line 12) | const AUTO_TITLE_KEY = "unsloth_chat_auto_title";
  constant AUTO_HEAL_TOOL_CALLS_KEY (line 13) | const AUTO_HEAL_TOOL_CALLS_KEY = "unsloth_auto_heal_tool_calls";
  constant MAX_TOOL_CALLS_KEY (line 14) | const MAX_TOOL_CALLS_KEY = "unsloth_max_tool_calls_per_message";
  constant TOOL_CALL_TIMEOUT_KEY (line 15) | const TOOL_CALL_TIMEOUT_KEY = "unsloth_tool_call_timeout";
  function canUseStorage (line 17) | function canUseStorage(): boolean {
  function loadBool (line 21) | function loadBool(key: string, fallback: boolean): boolean {
  function saveBool (line 32) | function saveBool(key: string, value: boolean): void {
  function loadInt (line 41) | function loadInt(key: string, fallback: number): number {
  function saveInt (line 53) | function saveInt(key: string, value: number): void {
  type ChatRuntimeStore (line 62) | type ChatRuntimeStore = {

FILE: studio/frontend/src/features/chat/thread-sidebar.tsx
  type SidebarItem (line 24) | interface SidebarItem {
  function groupThreads (line 31) | function groupThreads(threads: ThreadRecord[]): SidebarItem[] {
  function ThreadSidebar (line 63) | function ThreadSidebar({

FILE: studio/frontend/src/features/chat/tour/steps.tsx
  function buildChatTourSteps (line 6) | function buildChatTourSteps({

FILE: studio/frontend/src/features/chat/types.ts
  type ModelType (line 4) | type ModelType = "base" | "lora" | "model1" | "model2";
  type ChatView (line 6) | type ChatView =
  type ThreadRecord (line 10) | interface ThreadRecord {
  type MessageRecord (line 20) | interface MessageRecord {

FILE: studio/frontend/src/features/chat/types/api.ts
  type BackendModelDetails (line 4) | interface BackendModelDetails {
  type ListModelsResponse (line 15) | interface ListModelsResponse {
  type BackendLoraInfo (line 20) | interface BackendLoraInfo {
  type ListLorasResponse (line 28) | interface ListLorasResponse {
  type LoadModelRequest (line 33) | interface LoadModelRequest {
  type ValidateModelResponse (line 46) | interface ValidateModelResponse {
  type GgufVariantDetail (line 56) | interface GgufVariantDetail {
  type GgufVariantsResponse (line 63) | interface GgufVariantsResponse {
  type LoadModelResponse (line 70) | interface LoadModelResponse {
  type UnloadModelRequest (line 95) | interface UnloadModelRequest {
  type InferenceStatusResponse (line 99) | interface InferenceStatusResponse {
  type AudioGenerationResponse (line 122) | interface AudioGenerationResponse {
  type OpenAIChatMessage (line 138) | interface OpenAIChatMessage {
  type OpenAIChatCompletionsRequest (line 143) | interface OpenAIChatCompletionsRequest {
  type OpenAIChatDelta (line 166) | interface OpenAIChatDelta {
  type OpenAIChatChunkChoice (line 171) | interface OpenAIChatChunkChoice {
  type OpenAIChatChunk (line 176) | interface OpenAIChatChunk {

FILE: studio/frontend/src/features/chat/types/runtime.ts
  type InferenceParams (line 4) | interface InferenceParams {
  constant DEFAULT_INFERENCE_PARAMS (line 19) | const DEFAULT_INFERENCE_PARAMS: InferenceParams = {
  type ChatModelSummary (line 33) | interface ChatModelSummary {
  type ChatLoraSummary (line 45) | interface ChatLoraSummary {

FILE: studio/frontend/src/features/chat/utils/parse-assistant-content.ts
  type ContentPart (line 6) | type ContentPart = NonNullable<ChatModelRunResult["content"]>[number];
  constant THINK_OPEN_TAG (line 8) | const THINK_OPEN_TAG = "<think>";
  constant THINK_CLOSE_TAG (line 9) | const THINK_CLOSE_TAG = "</think>";
  function appendTextPart (line 11) | function appendTextPart(parts: ContentPart[], text: string): void {
  function appendReasoningPart (line 17) | function appendReasoningPart(parts: ContentPart[], text: string): void {
  function parseAssistantContent (line 23) | function parseAssistantContent(
  function hasClosedThinkTag (line 55) | function hasClosedThinkTag(raw: string): boolean {

FILE: studio/frontend/src/features/data-recipes/data/recipes-db.ts
  function listRecipes (line 20) | function listRecipes(): Promise<RecipeRecord[]> {
  function getRecipe (line 24) | function getRecipe(id: string): Promise<RecipeRecord | undefined> {
  function writeRecipeCache (line 28) | function writeRecipeCache(record: RecipeRecord): void {
  function getCachedRecipe (line 32) | function getCachedRecipe(id: string): RecipeRecord | null {
  function primeRecipeCache (line 36) | function primeRecipeCache(record: RecipeRecord): void {
  function saveRecipe (line 40) | async function saveRecipe(
  function deleteRecipe (line 61) | async function deleteRecipe(id: string): Promise<void> {
  function createRecipeDraft (line 66) | function createRecipeDraft(): Promise<RecipeRecord> {
  function createRecipeFromLearningRecipe (line 73) | function createRecipeFromLearningRecipe(input: {
  function useRecipes (line 86) | function useRecipes(): {

FILE: studio/frontend/src/features/data-recipes/learning-recipes/index.ts
  function isRecord (line 23) | function isRecord(value: unknown): value is Record<string, unknown> {
  function toRecordArray (line 27) | function toRecordArray(value: unknown): Record<string, unknown>[] {
  function coerceRecipePayload (line 36) | function coerceRecipePayload(value: unknown): RecipePayload {
  function loadPayloadFromUrl (line 82) | async function loadPayloadFromUrl(url: string): Promise<RecipePayload> {
  type LearningRecipeDef (line 91) | type LearningRecipeDef = {
  constant LEARNING_RECIPES (line 98) | const LEARNING_RECIPES: LearningRecipeDef[] = [

FILE: studio/frontend/src/features/data-recipes/pages/data-recipes-page.tsx
  constant OPEN_LEARNING_RECIPES_ON_ARRIVAL_KEY (line 54) | const OPEN_LEARNING_RECIPES_ON_ARRIVAL_KEY =
  type TemplateCard (line 57) | type TemplateCard = {
  constant TEMPLATE_CARDS (line 68) | const TEMPLATE_CARDS: TemplateCard[] = [
  constant LEARNING_RECIPE_BY_ID (line 167) | const LEARNING_RECIPE_BY_ID = new Map(
  function formatRelativeTime (line 171) | function formatRelativeTime(value: number): string {
  function LearningRecipeCards (line 198) | function LearningRecipeCards({
  function DataRecipesPage (line 298) | function DataRecipesPage(): ReactElement {

FILE: studio/frontend/src/features/data-recipes/pages/edit-recipe-page.tsx
  type EditRecipePageProps (line 12) | type EditRecipePageProps = {
  type LoadState (line 16) | type LoadState =
  function RecipeLoadState (line 21) | function RecipeLoadState({
  function EditRecipePage (line 45) | function EditRecipePage({ recipeId }: EditRecipePageProps): ReactElement {

FILE: studio/frontend/src/features/data-recipes/types.ts
  type RecipeRecord (line 6) | type RecipeRecord = {
  type SaveRecipeInput (line 16) | type SaveRecipeInput = {

FILE: studio/frontend/src/features/export/api/export-api.ts
  function readError (line 6) | async function readError(response: Response): Promise<string> {
  function parseJson (line 15) | async function parseJson<T>(response: Response): Promise<T> {
  type CheckpointInfo (line 22) | interface CheckpointInfo {
  type ModelCheckpoints (line 28) | interface ModelCheckpoints {
  type CheckpointListResponse (line 36) | interface CheckpointListResponse {
  type ExportOperationResponse (line 41) | interface ExportOperationResponse {
  function fetchCheckpoints (line 47) | async function fetchCheckpoints(): Promise<CheckpointListResponse> {
  function loadCheckpoint (line 52) | async function loadCheckpoint(params: {
  function exportMerged (line 67) | async function exportMerged(params: {
  function exportBase (line 83) | async function exportBase(params: {
  function exportGGUF (line 99) | async function exportGGUF(params: {
  function exportLoRA (line 114) | async function exportLoRA(params: {
  function cleanupExport (line 129) | async function cleanupExport(): Promise<ExportOperationResponse> {

FILE: studio/frontend/src/features/export/components/export-dialog.tsx
  type Destination (line 27) | type Destination = "local" | "hub";
  type ExportDialogProps (line 29) | interface ExportDialogProps {
  function ExportDialog (line 54) | function ExportDialog({

FILE: studio/frontend/src/features/export/components/method-picker.tsx
  type MethodPickerProps (line 18) | interface MethodPickerProps {
  function MethodPicker (line 23) | function MethodPicker({ value, onChange }: MethodPickerProps) {

FILE: studio/frontend/src/features/export/components/quant-picker.tsx
  type QuantPickerProps (line 18) | interface QuantPickerProps {
  function QuantPicker (line 23) | function QuantPicker({ value, onChange }: QuantPickerProps) {

FILE: studio/frontend/src/features/export/constants.ts
  type ExportMethod (line 6) | type ExportMethod = "merged" | "lora" | "gguf";
  constant EXPORT_METHODS (line 8) | const EXPORT_METHODS: {
  constant QUANT_OPTIONS (line 38) | const QUANT_OPTIONS = [
  function getEstimatedSize (line 49) | function getEstimatedSize(
  constant METHOD_LABELS (line 73) | const METHOD_LABELS: Record<TrainingMethod, string> = {
  constant GUIDE_STEPS (line 79) | const GUIDE_STEPS = [

FILE: studio/frontend/src/features/export/export-page.tsx
  function ExportPage (line 48) | function ExportPage() {

FILE: studio/frontend/src/features/onboarding/components/splash-screen.tsx
  type SplashScreenProps (line 8) | interface SplashScreenProps {
  function SplashScreen (line 13) | function SplashScreen({

FILE: studio/frontend/src/features/onboarding/components/steps/dataset-step.tsx
  constant FORMAT_OPTIONS (line 61) | const FORMAT_OPTIONS: { value: DatasetFormat; label: string }[] = [
  function DatasetStep (line 68) | function DatasetStep() {

FILE: studio/frontend/src/features/onboarding/components/steps/hyperparameters-step.tsx
  function formatLR (line 32) | function formatLR(value: number): string {
  function stepLR (line 46) | function stepLR(value: number, direction: 1 | -1): number {
  function HyperparametersStep (line 62) | function HyperparametersStep() {

FILE: studio/frontend/src/features/onboarding/components/steps/model-selection-step.tsx
  function ModelSelectionStep (line 61) | function ModelSelectionStep() {

FILE: studio/frontend/src/features/onboarding/components/steps/model-type-step.tsx
  constant TYPE_ICONS (line 28) | const TYPE_ICONS: Record<ModelType, typeof ImageIcon> = {
  constant TYPE_TOOLTIPS (line 35) | const TYPE_TOOLTIPS: Record<ModelType, string> = {
  constant COMING_SOON (line 42) | const COMING_SOON: ModelType[] = [];
  function ModelTypeStep (line 44) | function ModelTypeStep(): ReactElement {

FILE: studio/frontend/src/features/onboarding/components/steps/summary-step.tsx
  function Row (line 14) | function Row({
  function SummaryStep (line 47) | function SummaryStep() {

FILE: studio/frontend/src/features/onboarding/components/wizard-content.tsx
  constant STEP_COMPONENTS (line 13) | const STEP_COMPONENTS = {
  constant STEP_MASCOTS (line 21) | const STEP_MASCOTS: Record<StepNumber, string> = {
  function WizardContent (line 29) | function WizardContent() {

FILE: studio/frontend/src/features/onboarding/components/wizard-footer.tsx
  function WizardFooter (line 13) | function WizardFooter({ onBackToSplash }: { onBackToSplash: () => void }) {

FILE: studio/frontend/src/features/onboarding/components/wizard-layout.tsx
  function WizardLayout (line 22) | function WizardLayout() {

FILE: studio/frontend/src/features/onboarding/components/wizard-sidebar.tsx
  function WizardSidebar (line 13) | function WizardSidebar() {

FILE: studio/frontend/src/features/onboarding/components/wizard-step-item.tsx
  type WizardStepItemProps (line 9) | interface WizardStepItemProps {
  function WizardStepItem (line 13) | function WizardStepItem({ step }: WizardStepItemProps) {

FILE: studio/frontend/src/features/recipe-studio/api/index.ts
  constant DEFAULT_BASE (line 6) | const DEFAULT_BASE = "/api/data-recipe";
  constant DATA_DESIGNER_API_BASE (line 8) | const DATA_DESIGNER_API_BASE =
  type JobCreateResponse (line 11) | type JobCreateResponse = {
  type PublishRecipeJobRequest (line 16) | type PublishRecipeJobRequest = {
  type PublishRecipeJobResponse (line 24) | type PublishRecipeJobResponse = {
  type JobStatusResponse (line 30) | type JobStatusResponse = {
  type JobDatasetResponse (line 81) | type JobDatasetResponse = {
  type JobEvent (line 88) | type JobEvent = {
  type SeedInspectRequest (line 94) | type SeedInspectRequest = {
  type SeedInspectUploadRequest (line 105) | type SeedInspectUploadRequest = {
  type SeedInspectResponse (line 119) | type SeedInspectResponse = {
  type ValidateError (line 131) | type ValidateError = {
  type ValidateResponse (line 137) | type ValidateResponse = {
  type McpToolsListRequest (line 144) | type McpToolsListRequest = {
  type McpToolsProviderResult (line 151) | type McpToolsProviderResult = {
  type McpToolsListResponse (line 157) | type McpToolsListResponse = {
  function parseErrorResponse (line 163) | async function parseErrorResponse(response: Response): Promise<string> {
  function postJson (line 186) | async function postJson<T>(path: string, payload: unknown): Promise<T> {
  function getJson (line 202) | async function getJson<T>(path: string): Promise<T> {
  function parseJobEvent (line 210) | function parseJobEvent(rawEvent: string): JobEvent | null {
  function validateRecipe (line 250) | async function validateRecipe(
  function createRecipeJob (line 256) | async function createRecipeJob(payload: unknown): Promise<JobCreateRespo...
  function getRecipeJobStatus (line 260) | async function getRecipeJobStatus(jobId: string): Promise<JobStatusRespo...
  function getRecipeJobAnalysis (line 264) | async function getRecipeJobAnalysis(
  function getRecipeJobDataset (line 270) | async function getRecipeJobDataset(
  function cancelRecipeJob (line 284) | async function cancelRecipeJob(jobId: string): Promise<JobStatusResponse> {
  function publishRecipeJob (line 288) | async function publishRecipeJob(
  function inspectSeedDataset (line 295) | async function inspectSeedDataset(
  function inspectSeedUpload (line 301) | async function inspectSeedUpload(
  function listMcpTools (line 307) | async function listMcpTools(
  function streamRecipeJobEvents (line 313) | async function streamRecipeJobEvents(options: {

FILE: studio/frontend/src/features/recipe-studio/blocks/definitions.ts
  type BlockKind (line 42) | type BlockKind =
  type BlockType (line 49) | type BlockType =
  type SeedBlockType (line 65) | type SeedBlockType = "seed_hf" | "seed_local" | "seed_unstructured";
  type IconType (line 67) | type IconType = typeof CodeIcon;
  type BlockGroup (line 69) | type BlockGroup = {
  type BlockDialogKey (line 76) | type BlockDialogKey =
  type BlockDefinition (line 95) | type BlockDefinition = {
  constant BLOCK_GROUPS (line 105) | const BLOCK_GROUPS: BlockGroup[] = [
  constant BLOCK_DEFINITIONS (line 144) | const BLOCK_DEFINITIONS: BlockDefinition[] = [
  function getBlocksForKind (line 366) | function getBlocksForKind(kind: BlockKind): BlockDefinition[] {
  function getBlockDefinition (line 370) | function getBlockDefinition(
  function getBlockDefinitionForConfig (line 380) | function getBlockDefinitionForConfig(

FILE: studio/frontend/src/features/recipe-studio/blocks/render-dialog.tsx
  function renderBlockDialog (line 25) | function renderBlockDialog(

FILE: studio/frontend/src/features/recipe-studio/components/block-sheet.tsx
  type SheetView (line 48) | type SheetView =
  type SheetKind (line 57) | type SheetKind =
  type RootSheetView (line 64) | type RootSheetView = Exclude<SheetView, "root">;
  type RootGroup (line 65) | type RootGroup = {
  type BlockSheetProps (line 72) | type BlockSheetProps = {
  constant RECIPE_BLOCK_DND_MIME (line 95) | const RECIPE_BLOCK_DND_MIME = "application/x-recipe-studio-block";
  type RecipeBlockDragPayload (line 96) | type RecipeBlockDragPayload = {
  function getSheetTitle (line 101) | function getSheetTitle(sheetView: SheetView): string {
  constant VIEW_KIND (line 126) | const VIEW_KIND: Record<SheetView, SheetKind | null> = {
  constant ROOT_GROUPS (line 137) | const ROOT_GROUPS: RootGroup[] = [...BLOCK_GROUPS];
  constant ROOT_GROUPS_WITH_SEED_FIRST (line 138) | const ROOT_GROUPS_WITH_SEED_FIRST: RootGroup[] = [
  constant SEARCHABLE_KINDS (line 142) | const SEARCHABLE_KINDS: SheetKind[] = [
  constant PROCESSOR_TITLE (line 150) | const PROCESSOR_TITLE = "Final dataset shape";
  constant PROCESSOR_DESCRIPTION (line 151) | const PROCESSOR_DESCRIPTION = "Rename, reorder, or reshape the final dat...
  constant SHOW_PROCESSOR_IN_BLOCK_SHEET (line 152) | const SHOW_PROCESSOR_IN_BLOCK_SHEET = false;
  constant LLM_SETUP_TYPES (line 153) | const LLM_SETUP_TYPES = new Set<BlockType>([
  function BlockSheetButton (line 159) | function BlockSheetButton({
  function BlockSheet (line 233) | function BlockSheet({

FILE: studio/frontend/src/features/recipe-studio/components/chip-input.tsx
  type ChipInputProps (line 17) | type ChipInputProps = {
  function ChipInput (line 25) | function ChipInput({

FILE: studio/frontend/src/features/recipe-studio/components/controls/layout-controls.tsx
  type LayoutControlsProps (line 13) | type LayoutControlsProps = {
  function LayoutControls (line 19) | function LayoutControls({

FILE: studio/frontend/src/features/recipe-studio/components/controls/run-validate-floating-controls.tsx
  type RunValidateFloatingControlsProps (line 10) | type RunValidateFloatingControlsProps = {
  function RunValidateFloatingControls (line 19) | function RunValidateFloatingControls({

FILE: studio/frontend/src/features/recipe-studio/components/controls/viewport-controls.tsx
  type ViewportControlsProps (line 11) | type ViewportControlsProps = {
  function ViewportControls (line 17) | function ViewportControls({

FILE: studio/frontend/src/features/recipe-studio/components/executions/execution-columns-tab.tsx
  type ExecutionColumnsTabProps (line 15) | type ExecutionColumnsTabProps = {
  function ExecutionColumnsTab (line 19) | function ExecutionColumnsTab({

FILE: studio/frontend/src/features/recipe-studio/components/executions/execution-data-tab.tsx
  type ExecutionDataTabProps (line 20) | type ExecutionDataTabProps = {
  function ExecutionDataTab (line 38) | function ExecutionDataTab({

FILE: studio/frontend/src/features/recipe-studio/components/executions/execution-overview-tab.tsx
  type ExecutionOverviewTabProps (line 26) | type ExecutionOverviewTabProps = {
  function ExecutionOverviewTab (line 45) | function ExecutionOverviewTab({

FILE: studio/frontend/src/features/recipe-studio/components/executions/execution-raw-tab.tsx
  type ExecutionRawTabProps (line 6) | type ExecutionRawTabProps = {
  function ExecutionRawTab (line 10) | function ExecutionRawTab({

FILE: studio/frontend/src/features/recipe-studio/components/executions/execution-sidebar.tsx
  type ExecutionSidebarProps (line 20) | type ExecutionSidebarProps = {
  function ExecutionSidebar (line 26) | function ExecutionSidebar({

FILE: studio/frontend/src/features/recipe-studio/components/executions/executions-view-helpers.ts
  type AnalysisColumnStat (line 11) | type AnalysisColumnStat = {
  type ModelUsageRow (line 21) | type ModelUsageRow = {
  constant PREVIEW_DATASET_PAGE_SIZE (line 27) | const PREVIEW_DATASET_PAGE_SIZE = 20;
  constant TERMINAL_STICKY_BOTTOM_THRESHOLD_PX (line 28) | const TERMINAL_STICKY_BOTTOM_THRESHOLD_PX = 24;
  function formatTimestamp (line 30) | function formatTimestamp(value: number): string {
  function formatCellValue (line 34) | function formatCellValue(value: unknown): string {
  function isExpandableCellValue (line 51) | function isExpandableCellValue(value: string): boolean {
  function truncateCellValue (line 55) | function truncateCellValue(value: string): string {
  function hasExpandableTextCell (line 62) | function hasExpandableTextCell(
  function parseNumber (line 74) | function parseNumber(value: unknown): number | null {
  function parseString (line 78) | function parseString(value: unknown): string {
  function parseAnalysisColumns (line 82) | function parseAnalysisColumns(
  function statusTone (line 107) | function statusTone(status: RecipeExecutionStatus): string {
  function statusRightBorder (line 120) | function statusRightBorder(status: RecipeExecutionStatus): string {
  function formatStatus (line 133) | function formatStatus(status: RecipeExecutionStatus): string {
  function formatPercent (line 140) | function formatPercent(value: number | null | undefined): string {
  function formatDuration (line 147) | function formatDuration(startedAt: number, finishedAt: number | null): s...
  function formatMetricValue (line 155) | function formatMetricValue(value: number | null | undefined): string {
  function parseModelUsageRows (line 162) | function parseModelUsageRows(

FILE: studio/frontend/src/features/recipe-studio/components/executions/executions-view.tsx
  type ExecutionsViewProps (line 41) | type ExecutionsViewProps = {
  function ExecutionsView (line 50) | function ExecutionsView({

FILE: studio/frontend/src/features/recipe-studio/components/executions/publish-execution-dialog.tsx
  type PublishExecutionDialogProps (line 23) | type PublishExecutionDialogProps = {
  function getExecutionRecordCount (line 36) | function getExecutionRecordCount(execution: RecipeExecutionRecord | null...
  function buildDefaultDescription (line 52) | function buildDefaultDescription(execution: RecipeExecutionRecord | null...
  function PublishExecutionDialog (line 65) | function PublishExecutionDialog({

FILE: studio/frontend/src/features/recipe-studio/components/graph/internals-sync.tsx
  type InternalsSyncProps (line 7) | type InternalsSyncProps = {
  function InternalsSync (line 11) | function InternalsSync({ nodeIds }: InternalsSyncProps): null {

FILE: studio/frontend/src/features/recipe-studio/components/inline/inline-category-badges.tsx
  type InlineCategoryBadgesProps (line 7) | type InlineCategoryBadgesProps = {
  function InlineCategoryBadges (line 11) | function InlineCategoryBadges({

FILE: studio/frontend/src/features/recipe-studio/components/inline/inline-expression.tsx
  type InlineExpressionProps (line 20) | type InlineExpressionProps = {
  constant DTYPE_OPTIONS (line 25) | const DTYPE_OPTIONS: ExpressionDtype[] = ["str", "int", "float", "bool"];
  function InlineExpression (line 27) | function InlineExpression({

FILE: studio/frontend/src/features/recipe-studio/components/inline/inline-field.tsx
  type InlineFieldProps (line 7) | type InlineFieldProps = {
  function InlineField (line 13) | function InlineField({

FILE: studio/frontend/src/features/recipe-studio/components/inline/inline-llm.tsx
  type InlineLlmProps (line 24) | type InlineLlmProps = {
  constant CODE_LANG_OPTIONS (line 29) | const CODE_LANG_OPTIONS = [
  function InlineLlm (line 48) | function InlineLlm({ config, onUpdate }: InlineLlmProps): ReactElement {

FILE: studio/frontend/src/features/recipe-studio/components/inline/inline-model.tsx
  type InlineModelPatch (line 9) | type InlineModelPatch = Partial<ModelProviderConfig> | Partial<ModelConf...
  type InlineModelProps (line 11) | type InlineModelProps = {
  function InlineModel (line 16) | function InlineModel(props: InlineModelProps): ReactElement {

FILE: studio/frontend/src/features/recipe-studio/components/inline/inline-policy.ts
  type ConfigUiMode (line 6) | type ConfigUiMode = "inline" | "dialog";
  constant INLINE_SAMPLERS (line 8) | const INLINE_SAMPLERS = new Set<SamplerType>([
  function getConfigUiMode (line 15) | function getConfigUiMode(
  function isInlineConfig (line 45) | function isInlineConfig(

FILE: studio/frontend/src/features/recipe-studio/components/inline/inline-sampler.tsx
  type InlineSamplerProps (line 16) | type InlineSamplerProps = {
  type ConvertTo (line 21) | type ConvertTo = "int" | "float" | "str";
  function ConvertToField (line 23) | function ConvertToField({
  function InlineSampler (line 50) | function InlineSampler({

FILE: studio/frontend/src/features/recipe-studio/components/inline/inline-seed.tsx
  type InlineSeedProps (line 11) | type InlineSeedProps = {
  function InlineSeed (line 16) | function InlineSeed({ config, onUpdate }: InlineSeedProps): ReactElement {

FILE: studio/frontend/src/features/recipe-studio/components/recipe-floating-icon-button-class.ts
  constant RECIPE_FLOATING_ICON_BUTTON_CLASS (line 4) | const RECIPE_FLOATING_ICON_BUTTON_CLASS =

FILE: studio/frontend/src/features/recipe-studio/components/recipe-graph-aux-node.tsx
  type PromptField (line 24) | type PromptField = "prompt" | "system_prompt";
  type PromptInputNodeData (line 26) | type PromptInputNodeData = {
  type JudgeScoreNodeData (line 34) | type JudgeScoreNodeData = {
  type RecipeGraphAuxNodeData (line 41) | type RecipeGraphAuxNodeData = PromptInputNodeData | JudgeScoreNodeData;
  type RecipeGraphAuxNodeType (line 42) | type RecipeGraphAuxNodeType = Node<RecipeGraphAuxNodeData, "aux">;
  function updateScoreAt (line 44) | function updateScoreAt(
  function updateOptionAt (line 55) | function updateOptionAt(
  function AuxVariableBadges (line 65) | function AuxVariableBadges({
  function AuxNodeBase (line 73) | function AuxNodeBase({

FILE: studio/frontend/src/features/recipe-studio/components/recipe-graph-node.tsx
  type IconType (line 68) | type IconType = typeof CodeIcon;
  function hexToRgb (line 70) | function hexToRgb(hex: string): { r: number; g: number; b: number } | nu...
  function parseNoteOpacity (line 83) | function parseNoteOpacity(value: string | undefined): number {
  constant NODE_META (line 91) | const NODE_META = {
  constant SAMPLER_ICONS (line 120) | const SAMPLER_ICONS: Record<SamplerType, IconType> = {
  constant LLM_ICONS (line 133) | const LLM_ICONS: Record<LlmType, IconType> = {
  function resolveNodeIcon (line 140) | function resolveNodeIcon(
  function getConfigSummary (line 174) | function getConfigSummary(config: NodeConfig | undefined): string {
  function renderNodeBody (line 285) | function renderNodeBody(
  function RecipeGraphNodeBase (line 346) | function RecipeGraphNodeBase({

FILE: studio/frontend/src/features/recipe-studio/components/recipe-studio-header.tsx
  type StatusTone (line 28) | type StatusTone = "success" | "error";
  type RecipeStudioHeaderProps (line 30) | type RecipeStudioHeaderProps = {
  constant STATUS_MESSAGE_CLASS (line 42) | const STATUS_MESSAGE_CLASS: Record<StatusTone, string> = {
  function RecipeStudioHeader (line 47) | function RecipeStudioHeader({

FILE: studio/frontend/src/features/recipe-studio/components/rf-ui/base-handle.tsx
  type BaseHandleProps (line 9) | type BaseHandleProps = HandleProps;
  function BaseHandle (line 11) | function BaseHandle({

FILE: studio/frontend/src/features/recipe-studio/components/rf-ui/base-node.tsx
  function BaseNode (line 8) | function BaseNode({
  function BaseNodeHeader (line 28) | function BaseNodeHeader({
  function BaseNodeHeaderTitle (line 43) | function BaseNodeHeaderTitle({
  function BaseNodeContent (line 56) | function BaseNodeContent({
  function BaseNodeFooter (line 69) | function BaseNodeFooter({

FILE: studio/frontend/src/features/recipe-studio/components/rf-ui/data-edge.tsx
  type DataEdge (line 15) | type DataEdge = Edge<{
  function DataEdge (line 20) | function DataEdge({
  function getPath (line 65) | function getPath({
  function resolvePathType (line 121) | function resolvePathType({

FILE: studio/frontend/src/features/recipe-studio/components/rf-ui/labeled-handle.tsx
  function LabeledHandle (line 17) | function LabeledHandle({

FILE: studio/frontend/src/features/recipe-studio/components/runtime/execution-progress-island.tsx
  type ExecutionProgressIslandProps (line 23) | type ExecutionProgressIslandProps = {
  function formatEta (line 31) | function formatEta(value: number | null | undefined): string {
  function statusLabel (line 39) | function statusLabel(input: {
  function ExecutionProgressIsland (line 52) | function ExecutionProgressIsland({

FILE: studio/frontend/src/features/recipe-studio/components/shared/available-references-inline.tsx
  type AvailableReferencesInlineProps (line 8) | type AvailableReferencesInlineProps = {
  constant MAX_ROWS (line 12) | const MAX_ROWS = 2;
  function AvailableReferencesInline (line 14) | function AvailableReferencesInline({

FILE: studio/frontend/src/features/recipe-studio/components/shared/hf-dataset-combobox.tsx
  type HfDatasetComboboxProps (line 16) | type HfDatasetComboboxProps = {
  function HfDatasetCombobox (line 25) | function HfDatasetCombobox({

FILE: studio/frontend/src/features/recipe-studio/constants.ts
  constant DEFAULT_NODE_WIDTH (line 4) | const DEFAULT_NODE_WIDTH = 400;
  constant DEFAULT_NODE_HEIGHT (line 5) | const DEFAULT_NODE_HEIGHT = 120;
  constant MIN_NODE_WIDTH (line 6) | const MIN_NODE_WIDTH = 260;
  constant MAX_NODE_WIDTH (line 7) | const MAX_NODE_WIDTH = 900;
  constant MAX_NOTE_NODE_WIDTH (line 8) | const MAX_NOTE_NODE_WIDTH = 600;

FILE: studio/frontend/src/features/recipe-studio/data/executions-db.ts
  function listRecipeExecutions (line 19) | async function listRecipeExecutions(
  function saveRecipeExecution (line 26) | async function saveRecipeExecution(

FILE: studio/frontend/src/features/recipe-studio/dialogs/config-dialog.tsx
  type ConfigDialogProps (line 14) | type ConfigDialogProps = {
  function ConfigDialog (line 28) | function ConfigDialog({

FILE: studio/frontend/src/features/recipe-studio/dialogs/expression/expression-dialog.tsx
  constant DTYPE_OPTIONS (line 22) | const DTYPE_OPTIONS: ExpressionDtype[] = ["str", "int", "float", "bool"];
  type ExpressionDialogProps (line 24) | type ExpressionDialogProps = {
  function ExpressionDialog (line 29) | function ExpressionDialog({

FILE: studio/frontend/src/features/recipe-studio/dialogs/import-dialog.tsx
  type ImportDialogProps (line 16) | type ImportDialogProps = {
  function ImportDialog (line 23) | function ImportDialog({

FILE: studio/frontend/src/features/recipe-studio/dialogs/llm/general-tab.tsx
  constant CODE_LANG_OPTIONS (line 39) | const CODE_LANG_OPTIONS = [
  constant TRACE_MODE_OPTIONS (line 58) | const TRACE_MODE_OPTIONS = ["none", "last_message", "all_messages"] as c...
  function normalizeTraceMode (line 60) | function normalizeTraceMode(value: string): LlmConfig["with_trace"] {
  type LlmGeneralTabProps (line 67) | type LlmGeneralTabProps = {
  function LlmGeneralTab (line 76) | function LlmGeneralTab({

FILE: studio/frontend/src/features/recipe-studio/dialogs/llm/llm-dialog.tsx
  type LlmDialogProps (line 15) | type LlmDialogProps = {
  function LlmDialog (line 23) | function LlmDialog({

FILE: studio/frontend/src/features/recipe-studio/dialogs/llm/scores-tab.tsx
  type LlmScoresTabProps (line 18) | type LlmScoresTabProps = {
  function LlmScoresTab (line 23) | function LlmScoresTab({

FILE: studio/frontend/src/features/recipe-studio/dialogs/markdown-note/markdown-note-dialog.tsx
  type MarkdownNoteDialogProps (line 11) | type MarkdownNoteDialogProps = {
  function MarkdownNoteDialog (line 16) | function MarkdownNoteDialog({

FILE: studio/frontend/src/features/recipe-studio/dialogs/models/model-config-dialog.tsx
  type ModelConfigDialogProps (line 26) | type ModelConfigDialogProps = {
  function ModelConfigDialog (line 32) | function ModelConfigDialog({

FILE: studio/frontend/src/features/recipe-studio/dialogs/models/model-provider-dialog.tsx
  type ModelProviderDialogProps (line 17) | type ModelProviderDialogProps = {
  function ModelProviderDialog (line 22) | function ModelProviderDialog({

FILE: studio/frontend/src/features/recipe-studio/dialogs/preview-dialog.tsx
  type RunDialogProps (line 34) | type RunDialogProps = {
  type ValidationResult (line 58) | type ValidationResult = RunDialogProps["validateResult"];
  constant MAX_RECORDS (line 60) | const MAX_RECORDS = 200_000;
  constant MAX_WORKERS (line 61) | const MAX_WORKERS = 2_048;
  constant MAX_SHUTDOWN_WINDOW (line 62) | const MAX_SHUTDOWN_WINDOW = 10_000;
  constant MAX_RETRY_STEPS (line 63) | const MAX_RETRY_STEPS = 100;
  function clampInt (line 65) | function clampInt(value: number, min: number, max: number): number {
  function clampFloat (line 79) | function clampFloat(value: number, min: number, max: number): number {
  function commitInt (line 92) | function commitInt(
  function commitFloat (line 115) | function commitFloat(
  type DraftInputFieldProps (line 138) | type DraftInputFieldProps = {
  function DraftInputField (line 149) | function DraftInputField({
  function AdvancedSettingsSection (line 175) | function AdvancedSettingsSection({
  function ValidationResultPanel (line 195) | function ValidationResultPanel({
  type RunDialogBodyProps (line 265) | type RunDialogBodyProps = Omit<
  function RunDialogBody (line 272) | function RunDialogBody({
  function RunDialog (line 697) | function RunDialog({

FILE: studio/frontend/src/features/recipe-studio/dialogs/processors-dialog.tsx
  type ProcessorsDialogProps (line 15) | type ProcessorsDialogProps = {
  function ProcessorsDialog (line 23) | function ProcessorsDialog({

FILE: studio/frontend/src/features/recipe-studio/dialogs/samplers/bernoulli-dialog.tsx
  type BernoulliDialogProps (line 10) | type BernoulliDialogProps = {
  function BernoulliDialog (line 15) | function BernoulliDialog({

FILE: studio/frontend/src/features/recipe-studio/dialogs/samplers/category-dialog.tsx
  type CategoryDialogProps (line 18) | type CategoryDialogProps = {
  function addChipWithWeight (line 23) | function addChipWithWeight(
  function removeChipWithWeight (line 34) | function removeChipWithWeight(
  function CategoryDialog (line 46) | function CategoryDialog({

FILE: studio/frontend/src/features/recipe-studio/dialogs/samplers/datetime-dialog.tsx
  constant DATETIME_UNITS (line 17) | const DATETIME_UNITS = [
  type DatetimeDialogProps (line 27) | type DatetimeDialogProps = {
  function DatetimeDialog (line 32) | function DatetimeDialog({

FILE: studio/frontend/src/features/recipe-studio/dialogs/samplers/gaussian-dialog.tsx
  type GaussianDialogProps (line 17) | type GaussianDialogProps = {
  function GaussianDialog (line 22) | function GaussianDialog({

FILE: studio/frontend/src/features/recipe-studio/dialogs/samplers/person-dialog.tsx
  type PersonDialogProps (line 17) | type PersonDialogProps = {
  function PersonDialog (line 22) | function PersonDialog({

FILE: studio/frontend/src/features/recipe-studio/dialogs/samplers/subcategory-dialog.tsx
  type SubcategoryDialogProps (line 17) | type SubcategoryDialogProps = {
  function SubcategoryDialog (line 23) | function SubcategoryDialog({

FILE: studio/frontend/src/features/recipe-studio/dialogs/samplers/timedelta-dialog.tsx
  constant TIMEDELTA_UNITS (line 17) | const TIMEDELTA_UNITS: Array<"D" | "h" | "m" | "s"> = ["D", "h", "m", "s"];
  constant NONE_VALUE (line 18) | const NONE_VALUE = "__none";
  type TimedeltaDialogProps (line 20) | type TimedeltaDialogProps = {
  function TimedeltaDialog (line 26) | function TimedeltaDialog({

FILE: studio/frontend/src/features/recipe-studio/dialogs/samplers/uniform-dialog.tsx
  type UniformDialogProps (line 17) | type UniformDialogProps = {
  function UniformDialog (line 22) | function UniformDialog({

FILE: studio/frontend/src/features/recipe-studio/dialogs/samplers/uuid-dialog.tsx
  type UuidDialogProps (line 10) | type UuidDialogProps = {
  function UuidDialog (line 15) | function UuidDialog({

FILE: studio/frontend/src/features/recipe-studio/dialogs/seed/seed-dialog.tsx
  constant SAMPLING_OPTIONS (line 55) | const SAMPLING_OPTIONS: Array<{ value: SeedSamplingStrategy; label: stri...
  constant SELECTION_OPTIONS (line 60) | const SELECTION_OPTIONS: Array<{ value: SeedSelectionType; label: string...
  constant LOCAL_ACCEPT (line 66) | const LOCAL_ACCEPT = ".csv,.json,.jsonl";
  constant UNSTRUCTURED_ACCEPT (line 67) | const UNSTRUCTURED_ACCEPT = ".txt,.pdf,.docx";
  constant MAX_UPLOAD_BYTES (line 68) | const MAX_UPLOAD_BYTES = 50 * 1024 * 1024;
  constant DEFAULT_CHUNK_SIZE (line 69) | const DEFAULT_CHUNK_SIZE = 1200;
  constant DEFAULT_CHUNK_OVERLAP (line 70) | const DEFAULT_CHUNK_OVERLAP = 200;
  constant MAX_CHUNK_SIZE (line 71) | const MAX_CHUNK_SIZE = 20000;
  constant PREVIEW_TRUNCATE_AT (line 72) | const PREVIEW_TRUNCATE_AT = 320;
  type SeedDialogProps (line 74) | type SeedDialogProps = {
  function getErrorMessage (line 80) | function getErrorMessage(error: unknown, fallback: string): string {
  function stringifyCell (line 87) | function stringifyCell(value: unknown): string {
  function isExpandablePreviewValue (line 98) | function isExpandablePreviewValue(value: string): boolean {
  function truncatePreviewValue (line 102) | function truncatePreviewValue(value: string): string {
  function getPreviewEmptyStateCopy (line 109) | function getPreviewEmptyStateCopy(mode: SeedConfig["seed_source_type"]): {
  function parseChunkNumber (line 132) | function parseChunkNumber(
  function resolveChunking (line 148) | function resolveChunking(config: SeedConfig): {
  function fileToBase64Payload (line 167) | async function fileToBase64Payload(file: File): Promise<string> {
  function extractUnstructuredText (line 180) | async function extractUnstructuredText(file: File): Promise<string> {
  function toUnstructuredUploadFile (line 199) | async function toUnstructuredUploadFile(file: File): Promise<File> {
  function SeedDialog (line 216) | function SeedDialog({ config, onUpdate, open }: SeedDialogProps): ReactE...

FILE: studio/frontend/src/features/recipe-studio/dialogs/shared/available-variables.tsx
  type AvailableVariablesProps (line 12) | type AvailableVariablesProps = {
  constant USER_EXPANDED_FIELDS (line 16) | const USER_EXPANDED_FIELDS = [
  function AvailableVariables (line 24) | function AvailableVariables({

FILE: studio/frontend/src/features/recipe-studio/dialogs/shared/collapsible-section-trigger.tsx
  type CollapsibleSectionTriggerProps (line 13) | type CollapsibleSectionTriggerProps = {

FILE: studio/frontend/src/features/recipe-studio/dialogs/shared/dialog-shell.tsx
  type DialogShellProps (line 11) | type DialogShellProps = {
  function DialogShell (line 16) | function DialogShell({

FILE: studio/frontend/src/features/recipe-studio/dialogs/shared/field-label.tsx
  type FieldLabelProps (line 9) | type FieldLabelProps = {
  function FieldLabel (line 15) | function FieldLabel({

FILE: studio/frontend/src/features/recipe-studio/dialogs/shared/name-field.tsx
  type NameFieldProps (line 8) | type NameFieldProps = {
  function NameField (line 16) | function NameField({

FILE: studio/frontend/src/features/recipe-studio/dialogs/shared/validation-banner.tsx
  function ValidationBanner (line 8) | function ValidationBanner({

FILE: studio/frontend/src/features/recipe-studio/dialogs/tool-profile/helpers.ts
  function createMcpProviderId (line 6) | function createMcpProviderId(prefix: string, index: number): string {
  function addUnique (line 10) | function addUnique(items: string[], value: string): string[] {
  function collectToolSuggestions (line 18) | function collectToolSuggestions(
  function isProviderReadyForToolFetch (line 31) | function isProviderReadyForToolFetch(
  function toApiProvider (line 44) | function toApiProvider(

FILE: studio/frontend/src/features/recipe-studio/dialogs/tool-profile/tool-profile-dialog.tsx
  type ToolProfileDialogProps (line 35) | type ToolProfileDialogProps = {
  function EmptyState (line 40) | function EmptyState({
  function isProviderConfigured (line 55) | function isProviderConfigured(provider: LlmMcpProviderConfig): boolean {
  function McpServerCard (line 66) | function McpServerCard({
  function ToolProfileDialog (line 351) | function ToolProfileDialog({

FILE: studio/frontend/src/features/recipe-studio/dialogs/validators/validator-dialog.tsx
  type ValidatorDialogProps (line 45) | type ValidatorDialogProps = {
  constant NONE_VALUE (line 50) | const NONE_VALUE = "__none__";
  function ValidatorDialog (line 52) | function ValidatorDialog({

FILE: studio/frontend/src/features/recipe-studio/execution-types.ts
  type RecipeStudioView (line 4) | type RecipeStudioView = "editor" | "executions";
  type RecipeExecutionKind (line 6) | type RecipeExecutionKind = "preview" | "full";
  type RecipeExecutionStatus (line 8) | type RecipeExecutionStatus =
  type RecipeExecutionProgress (line 17) | type RecipeExecutionProgress = {
  type RecipeExecutionBatch (line 28) | type RecipeExecutionBatch = {
  type RecipeExecutionAnalysis (line 33) | type RecipeExecutionAnalysis = {
  type RecipeExecutionRecord (line 44) | type RecipeExecutionRecord = {

FILE: studio/frontend/src/features/recipe-studio/executions/execution-helpers.ts
  constant DATASET_PAGE_SIZE (line 11) | const DATASET_PAGE_SIZE = 20;
  function buildSignature (line 13) | function buildSignature(name: string, payload: RecipePayload): string {
  function formatSavedLabel (line 17) | function formatSavedLabel(savedAt: number | null): string {
  function toErrorMessage (line 28) | function toErrorMessage(error: unknown, fallback: string): string {
  function normalizeDatasetRows (line 35) | function normalizeDatasetRows(value: unknown): Record<string, unknown>[] {
  function normalizeObject (line 45) | function normalizeObject(value: unknown): Record<string, unknown> | null {
  function normalizeAnalysis (line 52) | function normalizeAnalysis(value: unknown): RecipeExecutionAnalysis | nu...
  function mapJobStatus (line 60) | function mapJobStatus(status: string): RecipeExecutionStatus {
  function isExecutionInProgress (line 82) | function isExecutionInProgress(status: RecipeExecutionStatus): boolean {
  function executionLabel (line 91) | function executionLabel(kind: "preview" | "full"): string {
  function normalizeRunName (line 95) | function normalizeRunName(value: unknown): string | null {
  function executionSortWeight (line 103) | function executionSortWeight(status: RecipeExecutionStatus): number {
  function sortExecutions (line 113) | function sortExecutions(records: RecipeExecutionRecord[]): RecipeExecuti...
  function withExecutionDefaults (line 125) | function withExecutionDefaults(
  function delay (line 163) | function delay(ms: number): Promise<void> {
  function copyTextToClipboard (line 169) | async function copyTextToClipboard(text: string): Promise<boolean> {

FILE: studio/frontend/src/features/recipe-studio/executions/hydration.ts
  function loadSortedRecipeExecutions (line 12) | async function loadSortedRecipeExecutions(
  function findResumableExecution (line 19) | function findResumableExecution(

FILE: studio/frontend/src/features/recipe-studio/executions/run-settings.ts
  function toPositiveInt (line 8) | function toPositiveInt(
  function toNonNegativeInt (line 27) | function toNonNegativeInt(
  function toRatio (line 45) | function toRatio(value: number, fallback: number): number {
  function sanitizeExecutionRows (line 58) | function sanitizeExecutionRows(
  function normalizeRunSettings (line 65) | function normalizeRunSettings(settings: RecipeRunSettings): RecipeRunSet...
  function buildRunConfigPayload (line 96) | function buildRunConfigPayload(
  function applyGlobalParallelismOverride (line 120) | function applyGlobalParallelismOverride(
  function buildExecutionPayload (line 154) | function buildExecutionPayload(input: {

FILE: studio/frontend/src/features/recipe-studio/executions/runtime.ts
  constant MAX_LOG_LINES (line 16) | const MAX_LOG_LINES = 1500;
  function formatEventTime (line 18) | function formatEventTime(ts: unknown): string {
  function appendExecutionLogLine (line 26) | function appendExecutionLogLine(lines: string[], nextLine: string): stri...
  function toExecutionLogLine (line 34) | function toExecutionLogLine(event: JobEvent): string | null {
  function applyExecutionStatusSnapshot (line 75) | function applyExecutionStatusSnapshot(
  function createBaseExecutionRecord (line 115) | function createBaseExecutionRecord(input: {

FILE: studio/frontend/src/features/recipe-studio/executions/tracker.ts
  type TrackRecipeExecutionParams (line 31) | type TrackRecipeExecutionParams = {
  function isTerminalStatus (line 43) | function isTerminalStatus(status: RecipeExecutionStatus): boolean {
  function normalizeCompletedProgress (line 47) | function normalizeCompletedProgress(input: {
  function trackRecipeExecution (line 85) | async function trackRecipeExecution({

FILE: studio/frontend/src/features/recipe-studio/hooks/use-node-connection-status.ts
  type ConnectionStatus (line 8) | type ConnectionStatus = {
  function useNodeConnectionStatus (line 15) | function useNodeConnectionStatus(

FILE: studio/frontend/src/features/recipe-studio/hooks/use-recipe-editor-graph.ts
  constant SUPPORTED_DRAG_KINDS (line 30) | const SUPPORTED_DRAG_KINDS: RecipeBlockDragPayload["kind"][] = [
  function parseRecipeBlockDragPayload (line 39) | function parseRecipeBlockDragPayload(raw: string): RecipeBlockDragPayloa...
  type UseRecipeEditorGraphArgs (line 57) | type UseRecipeEditorGraphArgs = {
  type UseRecipeEditorGraphResult (line 83) | type UseRecipeEditorGraphResult = {
  function useRecipeEditorGraph (line 105) | function useRecipeEditorGraph({

FILE: studio/frontend/src/features/recipe-studio/hooks/use-recipe-executions.ts
  type UseRecipeExecutionsParams (line 42) | type UseRecipeExecutionsParams = {
  type UseRecipeExecutionsResult (line 50) | type UseRecipeExecutionsResult = {
  function formatValidationMessages (line 84) | function formatValidationMessages(input: {
  function useRecipeExecutions (line 100) | function useRecipeExecutions({

FILE: studio/frontend/src/features/recipe-studio/hooks/use-recipe-persistence.ts
  type SaveTone (line 15) | type SaveTone = "success" | "error";
  type PersistRecipeFn (line 17) | type PersistRecipeFn = (input: {
  type UseRecipePersistenceParams (line 26) | type UseRecipePersistenceParams = {
  type UseRecipePersistenceResult (line 38) | type UseRecipePersistenceResult = {
  function stripApiKeys (line 54) | function stripApiKeys(value: unknown): unknown {
  function inferHfRepoIdFromPath (line 81) | function inferHfRepoIdFromPath(pathValue: unknown): string {
  function sanitizeSeedForShare (line 98) | function sanitizeSeedForShare(payload: unknown): unknown {
  function useRecipePersistence (line 167) | function useRecipePersistence({

FILE: studio/frontend/src/features/recipe-studio/hooks/use-recipe-runtime-visuals.ts
  type IconType (line 38) | type IconType = typeof CodeIcon;
  constant SAMPLER_ICONS (line 40) | const SAMPLER_ICONS: Record<SamplerType, IconType> = {
  constant LLM_ICONS (line 53) | const LLM_ICONS: Record<LlmType, IconType> = {
  function resolveExecutionColumnIcon (line 60) | function resolveExecutionColumnIcon(config: NodeConfig | null): IconType {
  type UseRecipeRuntimeVisualsArgs (line 91) | type UseRecipeRuntimeVisualsArgs = {
  type UseRecipeRuntimeVisualsResult (line 101) | type UseRecipeRuntimeVisualsResult = {
  function useRecipeRuntimeVisuals (line 109) | function useRecipeRuntimeVisuals({

FILE: studio/frontend/src/features/recipe-studio/hooks/use-recipe-studio-actions.ts
  type SaveTone (line 14) | type SaveTone = "success" | "error";
  type PersistRecipeFn (line 16) | type PersistRecipeFn = (input: {
  type UseRecipeStudioActionsParams (line 25) | type UseRecipeStudioActionsParams = {
  type UseRecipeStudioActionsResult (line 39) | type UseRecipeStudioActionsResult = {
  function useRecipeStudioActions (line 86) | function useRecipeStudioActions({

FILE: studio/frontend/src/features/recipe-studio/recipe-studio-page.tsx
  constant NODE_TYPES (line 67) | const NODE_TYPES: NodeTypes = { builder: RecipeNode, aux: RecipeGraphAux...
  constant EDGE_TYPES (line 68) | const EDGE_TYPES: EdgeTypes = {
  constant COMPLETE_ISLAND_VISIBLE_MS (line 72) | const COMPLETE_ISLAND_VISIBLE_MS = 7_000;
  constant TAB_SWITCH_FIT_DELAY_MS (line 73) | const TAB_SWITCH_FIT_DELAY_MS = 110;
  constant FIT_ANIMATION_MS (line 74) | const FIT_ANIMATION_MS = 340;
  type PersistRecipeInput (line 76) | type PersistRecipeInput = {
  type PersistRecipeResult (line 82) | type PersistRecipeResult = {
  type RecipeStudioPageProps (line 87) | type RecipeStudioPageProps = {
  function RecipeStudioPage (line 95) | function RecipeStudioPage({

FILE: studio/frontend/src/features/recipe-studio/stores/helpers/edge-sync.ts
  function findNodeIdByName (line 16) | function findNodeIdByName(
  function addRecipeEdge (line 26) | function addRecipeEdge(edges: Edge[], source: string, target: string): E...
  function addValidatorSemanticEdge (line 39) | function addValidatorSemanticEdge(
  function removeTargetEdges (line 56) | function removeTargetEdges(edges: Edge[], targetId: string): Edge[] {
  function removeTargetEdgesBySource (line 60) | function removeTargetEdgesBySource(
  function syncEdgesForConfigPatch (line 74) | function syncEdgesForConfigPatch(
  function syncSubcategoryConfigsForCategoryUpdate (line 275) | function syncSubcategoryConfigsForCategoryUpdate(

FILE: studio/frontend/src/features/recipe-studio/stores/helpers/model-infra-layout.ts
  type Rect (line 10) | type Rect = {
  type Bounds (line 17) | type Bounds = {
  function toRect (line 24) | function toRect(node: RecipeNode): Rect {
  function intersects (line 33) | function intersects(a: Rect, b: Rect, pad = 18): boolean {
  function findNonOverlappingPosition (line 42) | function findNonOverlappingPosition(
  function isProviderToConfigEdge (line 74) | function isProviderToConfigEdge(
  function isConfigToLlmEdge (line 83) | function isConfigToLlmEdge(
  function isToolConfigToLlmEdge (line 92) | function isToolConfigToLlmEdge(
  function usageKey (line 101) | function usageKey(nodeId: string, handleId: string): string {
  function incrementUsage (line 105) | function incrementUsage(
  function decrementUsage (line 114) | function decrementUsage(
  function getUsage (line 123) | function getUsage(
  function pickHandleByUsage (line 131) | function pickHandleByUsage(
  function applyEdgeWithHandles (line 154) | function applyEdgeWithHandles(
  function getNodeCenter (line 166) | function getNodeCenter(node: RecipeNode): { x: number; y: number } {
  function collectBounds (line 175) | function collectBounds(
  function sortPreferredLlmTargetHandles (line 201) | function sortPreferredLlmTargetHandles(
  function getProviderSourceHandleCandidates (line 224) | function getProviderSourceHandleCandidates(
  function getProviderTargetHandleCandidates (line 232) | function getProviderTargetHandleCandidates(
  function getConfigSourceHandleCandidates (line 240) | function getConfigSourceHandleCandidates(direction: LayoutDirection): st...
  function optimizeModelInfraEdgeHandles (line 246) | function optimizeModelInfraEdgeHandles(
  function centerModelInfraNodes (line 349) | function centerModelInfraNodes(

FILE: studio/frontend/src/features/recipe-studio/stores/helpers/node-updates.ts
  type NodeUpdateState (line 14) | type NodeUpdateState = {
  type NodeUpdateResult (line 21) | type NodeUpdateResult = {
  function updateNodeData (line 30) | function updateNodeData(
  function buildNodeUpdate (line 43) | function buildNodeUpdate(
  function applyLayoutDirectionToNodes (line 69) | function applyLayoutDirectionToNodes(

FILE: studio/frontend/src/features/recipe-studio/stores/helpers/reference-sync.ts
  function updateTemplateFields (line 12) | function updateTemplateFields(
  function applyRenameToConfig (line 49) | function applyRenameToConfig(
  function applyRemovalToConfig (line 107) | function applyRemovalToConfig(
  function applyConfigTransform (line 164) | function applyConfigTransform(
  function applyRenameToConfigs (line 181) | function applyRenameToConfigs(
  function applyRemovalToConfigs (line 194) | function applyRemovalToConfigs(

FILE: studio/frontend/src/features/recipe-studio/stores/helpers/removals.ts
  function applyNodeRemovals (line 9) | function applyNodeRemovals(
  function applyEdgeRemovals (line 57) | function applyEdgeRemovals(

FILE: studio/frontend/src/features/recipe-studio/stores/recipe-executions.ts
  type RecipeRunSettings (line 9) | type RecipeRunSettings = {
  constant DEFAULT_RUN_SETTINGS (line 22) | const DEFAULT_RUN_SETTINGS: RecipeRunSettings = {
  type RecipeExecutionsState (line 35) | type RecipeExecutionsState = {
  constant INITIAL_STATE (line 62) | const INITIAL_STATE = {

FILE: studio/frontend/src/features/recipe-studio/stores/recipe-studio.ts
  type SheetView (line 53) | type SheetView =
  type RecipeStudioState (line 63) | type RecipeStudioState = {
  constant INITIAL_STATE (line 120) | const INITIAL_STATE = {
  function buildAddedNodeState (line 155) | function buildAddedNodeState(
  function getAddedNodeContext (line 178) | function getAddedNodeContext(
  function placeNodeNear (line 194) | function placeNodeNear(
  function connectSemantic (line 229) | function connectSemantic(
  function isModelSemanticEdge (line 253) | function isModelSemanticEdge(edge: Edge, configs: Record<string, NodeCon...

FILE: studio/frontend/src/features/recipe-studio/types/index.ts
  type SamplerType (line 6) | type SamplerType =
  type LlmType (line 18) | type LlmType = "text" | "structured" | "code" | "judge";
  type ValidatorCodeLang (line 19) | type ValidatorCodeLang =
  type ValidatorType (line 31) | type ValidatorType = "code" | "oxc";
  type OxcValidationMode (line 32) | type OxcValidationMode = "syntax" | "lint" | "syntax+lint";
  type OxcCodeShape (line 33) | type OxcCodeShape = "auto" | "module" | "snippet";
  type ExpressionDtype (line 35) | type ExpressionDtype = "str" | "int" | "float" | "bool";
  type LayoutDirection (line 37) | type LayoutDirection = "LR" | "TB";
  type SeedSamplingStrategy (line 39) | type SeedSamplingStrategy = "ordered" | "shuffle";
  type SeedSelectionType (line 40) | type SeedSelectionType = "none" | "index_range" | "partition_block";
  type SeedSourceType (line 41) | type SeedSourceType = "hf" | "local" | "unstructured";
  constant INFRA_NODE_KINDS (line 42) | const INFRA_NODE_KINDS = new Set([
  type RecipeNodeData (line 48) | type RecipeNodeData = {
  type RecipeNode (line 79) | type RecipeNode = Node<RecipeNodeData, "builder">;
  type CategoryConditionalParams (line 81) | type CategoryConditionalParams = {
  type SamplerConfig (line 88) | type SamplerConfig = {
  type ScoreOption (line 140) | type ScoreOption = {
  type Score (line 145) | type Score = {
  type McpProviderType (line 151) | type McpProviderType = "stdio" | "streamable_http";
  type McpEnvVar (line 153) | type McpEnvVar = {
  type LlmMcpProviderConfig (line 158) | type LlmMcpProviderConfig = {
  type LlmToolConfig (line 173) | type LlmToolConfig = {
  type ToolProfileConfig (line 186) | type ToolProfileConfig = {
  type LlmImageContextConfig (line 202) | type LlmImageContextConfig = {
  type LlmTraceType (line 208) | type LlmTraceType = "none" | "last_message" | "all_messages";
  type LlmConfig (line 210) | type LlmConfig = {
  type ModelProviderConfig (line 240) | type ModelProviderConfig = {
  type ModelConfig (line 257) | type ModelConfig = {
  type ExpressionConfig (line 277) | type ExpressionConfig = {
  type ValidatorConfig (line 286) | type ValidatorConfig = {
  type MarkdownNoteConfig (line 307) | type MarkdownNoteConfig = {
  type SeedConfig (line 318) | type SeedConfig = {
  type SchemaTransformProcessorConfig (line 356) | type SchemaTransformProcessorConfig = {
  type RecipeProcessorConfig (line 364) | type RecipeProcessorConfig = SchemaTransformProcessorConfig;
  type NodeConfig (line 366) | type NodeConfig =

FILE: studio/frontend/src/features/recipe-studio/utils/config-factories.ts
  function makeSamplerConfig (line 23) | function makeSamplerConfig(
  function makeLlmConfig (line 174) | function makeLlmConfig(
  function makeModelProviderConfig (line 224) | function makeModelProviderConfig(
  function makeModelConfig (line 246) | function makeModelConfig(
  function makeToolProfileConfig (line 271) | function makeToolProfileConfig(
  function makeExpressionConfig (line 292) | function makeExpressionConfig(
  function makeValidatorConfig (line 306) | function makeValidatorConfig(
  function makeMarkdownNoteConfig (line 336) | function makeMarkdownNoteConfig(
  function makeSeedConfig (line 350) | function makeSeedConfig(

FILE: studio/frontend/src/features/recipe-studio/utils/config-labels.ts
  constant SAMPLER_LABELS (line 10) | const SAMPLER_LABELS: Record<SamplerType, string> = {
  constant LLM_LABELS (line 23) | const LLM_LABELS: Record<LlmType, string> = {
  constant EXPRESSION_LABELS (line 30) | const EXPRESSION_LABELS: Record<ExpressionDtype, string> = {
  function labelForSampler (line 37) | function labelForSampler(type: SamplerType): string {
  function labelForLlm (line 41) | function labelForLlm(type: LlmType): string {
  function labelForExpression (line 45) | function labelForExpression(type: ExpressionDtype): string {

FILE: studio/frontend/src/features/recipe-studio/utils/config-type-guards.ts
  function isSamplerConfig (line 12) | function isSamplerConfig(
  function isCategoryConfig (line 18) | function isCategoryConfig(
  function isSubcategoryConfig (line 26) | function isSubcategoryConfig(
  function isLlmConfig (line 36) | function isLlmConfig(
  function isExpressionConfig (line 42) | function isExpressionConfig(
  function isValidatorConfig (line 48) | function isValidatorConfig(

FILE: studio/frontend/src/features/recipe-studio/utils/graph-warnings.ts
  type GraphWarning (line 7) | type GraphWarning = {
  function checkDataSourceRequired (line 15) | function checkDataSourceRequired(allConfigs: NodeConfig[]): GraphWarning...
  function checkLlmModelAlias (line 33) | function checkLlmModelAlias(allConfigs: NodeConfig[]): GraphWarning[] {
  function checkModelConfigProvider (line 48) | function checkModelConfigProvider(allConfigs: NodeConfig[]): GraphWarnin...
  function checkSubcategoryParent (line 63) | function checkSubcategoryParent(allConfigs: NodeConfig[]): GraphWarning[] {
  function checkValidatorTargets (line 93) | function checkValidatorTargets(allConfigs: NodeConfig[]): GraphWarning[] {
  function checkDisconnectedNodes (line 111) | function checkDisconnectedNodes(
  function checkLlmMissingDataInput (line 140) | function checkLlmMissingDataInput(
  function getGraphWarnings (line 194) | function getGraphWarnings(

FILE: studio/frontend/src/features/recipe-studio/utils/graph/derive-display-graph.ts
  type DisplayGraphInput (line 23) | type DisplayGraphInput = {
  type DisplayGraph (line 38) | type DisplayGraph = {
  function isAuxEdge (line 43) | function isAuxEdge(edge: Edge): boolean {
  function normalizeEdge (line 47) | function normalizeEdge(
  type AuxNodeItem (line 142) | type AuxNodeItem = {
  type Rect (line 147) | type Rect = {
  function toRect (line 154) | function toRect(
  function intersects (line 167) | function intersects(a: Rect, b: Rect, pad = 18): boolean {
  function findNonOverlappingPosition (line 176) | function findNonOverlappingPosition(
  type HandleSide (line 203) | type HandleSide = "left" | "right" | "top" | "bottom";
  constant SIDE_TO_TARGET_HANDLE (line 205) | const SIDE_TO_TARGET_HANDLE: Record<HandleSide, string> = {
  function getTargetSide (line 212) | function getTargetSide(
  function getSourceSide (line 241) | function getSourceSide(
  function pickAuxTargetHandle (line 270) | function pickAuxTargetHandle(
  function getHandleSideFromTargetHandle (line 302) | function getHandleSideFromTargetHandle(targetHandle: string): HandleSide {
  function pickAuxSourceHandle (line 315) | function pickAuxSourceHandle(
  type AppendAuxNodeAndEdgeInput (line 340) | type AppendAuxNodeAndEdgeInput = {
  function appendAuxNodeAndEdge (line 356) | function appendAuxNodeAndEdge({
  function deriveDisplayGraph (line 403) | function deriveDisplayGraph({

FILE: studio/frontend/src/features/recipe-studio/utils/graph/fit-view.ts
  function isMarkdownNoteNode (line 6) | function isMarkdownNoteNode(node: Node): boolean {
  function getFitNodeIdsIgnoringNotes (line 16) | function getFitNodeIdsIgnoringNotes(nodes: Node[]): Array<{ id: string }> {

FILE: studio/frontend/src/features/recipe-studio/utils/graph/recipe-graph-connection.ts
  function buildTemplateWithRef (line 25) | function buildTemplateWithRef(template: string, ref: string): string {
  function syncSubcategoryMapping (line 35) | function syncSubcategoryMapping(
  function isModelInfraNode (line 63) | function isModelInfraNode(config: NodeConfig): boolean {
  function isSemanticLane (line 71) | function isSemanticLane(connection: Connection): boolean {
  function isDataLane (line 80) | function isDataLane(connection: Connection): boolean {
  type SingleRefRelation (line 87) | type SingleRefRelation =
  function getSingleRefRelation (line 95) | function getSingleRefRelation(
  function isCompetingIncomingEdge (line 129) | function isCompetingIncomingEdge(
  function isModelSemanticRelation (line 160) | function isModelSemanticRelation(source: NodeConfig, target: NodeConfig)...
  function canApplyCodeLangToValidator (line 168) | function canApplyCodeLangToValidator(
  function countHandleUsage (line 187) | function countHandleUsage(
  function pickLeastUsedHandle (line 206) | function pickLeastUsedHandle(
  function chooseModelSemanticHandles (line 232) | function chooseModelSemanticHandles(
  function normalizeValidatorSemanticConnection (line 281) | function normalizeValidatorSemanticConnection(
  function isValidRecipeConnection (line 302) | function isValidRecipeConnection(
  function applyRecipeConnection (line 327) | function applyRecipeConnection(

FILE: studio/frontend/src/features/recipe-studio/utils/graph/relations.ts
  function isSemanticRelation (line 6) | function isSemanticRelation(

FILE: studio/frontend/src/features/recipe-studio/utils/graph/runtime-visual-state.ts
  constant ACTIVE_STATUSES (line 13) | const ACTIVE_STATUSES: ReadonlySet<RecipeExecutionStatus> = new Set([
  constant FRESH_PENDING_WINDOW_MS (line 19) | const FRESH_PENDING_WINDOW_MS = 60_000;
  constant DONE_UPSTREAM_KINDS (line 21) | const DONE_UPSTREAM_KINDS: ReadonlySet<NodeConfig["kind"]> = new Set([
  type GraphRuntimeVisualState (line 31) | type GraphRuntimeVisualState = {
  function isAuxEdge (line 39) | function isAuxEdge(edge: Edge): boolean {
  function collectTemplateRefs (line 43) | function collectTemplateRefs(config: NodeConfig | null): Set<string> {
  function isReversedRuntimeReferenceEdge (line 70) | function isReversedRuntimeReferenceEdge(input: {
  function hasLiveExecutionSignal (line 84) | function hasLiveExecutionSignal(execution: RecipeExecutionRecord): boole...
  function pickLatestActiveExecution (line 97) | function pickLatestActiveExecution(
  function deriveGraphRuntimeVisualState (line 128) | function deriveGraphRuntimeVisualState(input: {
  function collectUpstreamDoneNodeIds (line 222) | function collectUpstreamDoneNodeIds(input: {

FILE: studio/frontend/src/features/recipe-studio/utils/handle-layout.ts
  constant NODE_HANDLE_CLASS (line 4) | const NODE_HANDLE_CLASS =
  constant AUX_HANDLE_CLASS (line 7) | const AUX_HANDLE_CLASS =

FILE: studio/frontend/src/features/recipe-studio/utils/handles.ts
  constant HANDLE_IDS (line 7) | const HANDLE_IDS = {
  type RecipeHandleId (line 35) | type RecipeHandleId = (typeof HANDLE_IDS)[keyof typeof HANDLE_IDS];
  constant LEGACY_HANDLE_ALIAS_MAP (line 37) | const LEGACY_HANDLE_ALIAS_MAP: Record<string, string> = {
  constant DATA_TARGET_HANDLES (line 42) | const DATA_TARGET_HANDLES = new Set<string>([
  constant DATA_SOURCE_HANDLES (line 49) | const DATA_SOURCE_HANDLES = new Set<string>([
  constant SEMANTIC_TARGET_HANDLES (line 56) | const SEMANTIC_TARGET_HANDLES = new Set<string>([
  constant SEMANTIC_SOURCE_HANDLES (line 64) | const SEMANTIC_SOURCE_HANDLES = new Set<string>([
  constant DATA_TARGET_HORIZONTAL_HANDLES (line 72) | const DATA_TARGET_HORIZONTAL_HANDLES = new Set<string>([
  constant DATA_TARGET_VERTICAL_HANDLES (line 77) | const DATA_TARGET_VERTICAL_HANDLES = new Set<string>([
  constant DATA_SOURCE_HORIZONTAL_HANDLES (line 82) | const DATA_SOURCE_HORIZONTAL_HANDLES = new Set<string>([
  constant DATA_SOURCE_VERTICAL_HANDLES (line 87) | const DATA_SOURCE_VERTICAL_HANDLES = new Set<string>([
  constant SEMANTIC_TARGET_HORIZONTAL_HANDLES (line 92) | const SEMANTIC_TARGET_HORIZONTAL_HANDLES = new Set<string>([
  constant SEMANTIC_TARGET_VERTICAL_HANDLES (line 98) | const SEMANTIC_TARGET_VERTICAL_HANDLES = new Set<string>([
  constant SEMANTIC_SOURCE_HORIZONTAL_HANDLES (line 103) | const SEMANTIC_SOURCE_HORIZONTAL_HANDLES = new Set<string>([
  constant SEMANTIC_SOURCE_VERTICAL_HANDLES (line 109) | const SEMANTIC_SOURCE_VERTICAL_HANDLES = new Set<string>([
  function normalizeRecipeHandleId (line 114) | function normalizeRecipeHandleId(
  function normalizeRecipeConnectionHandles (line 123) | function normalizeRecipeConnectionHandles(
  function isKnownHandle (line 133) | function isKnownHandle(
  function remapHandleForDirection (line 143) | function remapHandleForDirection(
  function isDataTargetHandle (line 166) | function isDataTargetHandle(
  function isDataSourceHandle (line 172) | function isDataSourceHandle(
  function isSemanticTargetHandle (line 178) | function isSemanticTargetHandle(
  function isSemanticSourceHandle (line 184) | function isSemanticSourceHandle(
  function getDefaultDataTargetHandle (line 190) | function getDefaultDataTargetHandle(direction: LayoutDirection): string {
  function getDefaultDataSourceHandle (line 194) | function getDefaultDataSourceHandle(direction: LayoutDirection): string {
  function getDefaultSemanticTargetHandle (line 198) | function getDefaultSemanticTargetHandle(
  function getDefaultSemanticSourceHandle (line 204) | function getDefaultSemanticSourceHandle(
  type RecipeEdgeHandles (line 210) | type RecipeEdgeHandles = {
  function remapRecipeEdgeHandlesForLayout (line 216) | function remapRecipeEdgeHandlesForLayout(

FILE: studio/frontend/src/features/recipe-studio/utils/image-preview.ts
  constant MAX_IMAGE_PREVIEW_BYTES (line 4) | const MAX_IMAGE_PREVIEW_BYTES = 200 * 1024;
  type PreviewImagePayload (line 6) | type PreviewImagePayload = {
  type UnknownRecord (line 12) | type UnknownRecord = Record<string, unknown>;
  type ImagePreviewResult (line 14) | type ImagePreviewResult =
  function normalizeBase64 (line 18) | function normalizeBase64(value: string): string {
  function estimateBase64Bytes (line 22) | function estimateBase64Bytes(base64: string): number {
  function inferMimeFromBase64 (line 32) | function inferMimeFromBase64(base64: string): string | null {
  function isLikelyRawBase64Image (line 49) | function isLikelyRawBase64Image(value: string): boolean {
  function toDataUrlFromBase64 (line 60) | function toDataUrlFromBase64(base64: string, mime: string): string {
  function isRecord (line 64) | function isRecord(value: unknown): value is UnknownRecord {
  function isByteArray (line 68) | function isByteArray(value: unknown): value is number[] {
  function byteArrayToBase64 (line 77) | function byteArrayToBase64(bytes: number[]): string {
  function resolveStringCandidate (line 87) | function resolveStringCandidate(
  function resolveImagePreviewFromString (line 97) | function resolveImagePreviewFromString(
  function resolveImagePayloadObject (line 132) | function resolveImagePayloadObject(value: unknown, maxBytes: number): Im...
  function resolveImagePreview (line 191) | function resolveImagePreview(
  function isLikelyImageValue (line 206) | function isLikelyImageValue(value: unknown): boolean {

FILE: studio/frontend/src/features/recipe-studio/utils/import/edges.ts
  function isSemanticConnection (line 19) | function isSemanticConnection(source: NodeConfig, target: NodeConfig): b...
  function buildEdges (line 43) | function buildEdges(

FILE: studio/frontend/src/features/recipe-studio/utils/import/helpers.ts
  function isRecord (line 6) | function isRecord(value: unknown): value is Record<string, unknown> {
  function readString (line 10) | function readString(value: unknown): string | null {
  function readNumberString (line 14) | function readNumberString(value: unknown): string {
  function parseJson (line 24) | function parseJson(
  function normalizeOutputFormat (line 37) | function normalizeOutputFormat(value: unknown): string {
  function extractRefs (line 47) | function extractRefs(template: string): string[] {

FILE: studio/frontend/src/features/recipe-studio/utils/import/importer.ts
  type RecipeInput (line 28) | type RecipeInput = {
  type UiInput (line 38) | type UiInput = {
  type UiMarkdownNoteNode (line 52) | type UiMarkdownNoteNode = {
  function readStringNumber (line 59) | function readStringNumber(value: unknown): string | undefined {
  function parseProcessors (line 69) | function parseProcessors(input: unknown): RecipeProcessorConfig[] {
  function parseSeedDropColumns (line 103) | function parseSeedDropColumns(input: unknown): string[] {
  function parseMcpProviders (line 136) | function parseMcpProviders(
  function parseToolConfigs (line 182) | function parseToolConfigs(input: unknown): Map<string, LlmToolConfig> {
  function cloneMcpProvider (line 223) | function cloneMcpProvider(config: LlmMcpProviderConfig): LlmMcpProviderC...
  function parseUiMarkdownNoteNodes (line 231) | function parseUiMarkdownNoteNodes(input: unknown): UiMarkdownNoteNode[] {
  function parseUiToolProfileNodes (line 258) | function parseUiToolProfileNodes(input: unknown): Map<string, Record<str...
  function parseAdvancedOpenByNode (line 298) | function parseAdvancedOpenByNode(input: unknown): Record<string, boolean> {
  type AdvancedOpenConfig (line 313) | type AdvancedOpenConfig = LlmConfig | SamplerConfig | SeedConfig | Valid...
  function isAdvancedOpenConfig (line 315) | function isAdvancedOpenConfig(config: NodeConfig): config is AdvancedOpe...
  function applyAdvancedOpen (line 324) | function applyAdvancedOpen(
  function buildToolProfileConfig (line 334) | function buildToolProfileConfig(
  function importRecipePayload (line 361) | function importRecipePayload(input: string): ImportResult {

FILE: studio/frontend/src/features/recipe-studio/utils/import/parsers.ts
  type ColumnParser (line 12) | type ColumnParser = (
  constant COLUMN_PARSERS (line 19) | const COLUMN_PARSERS: Record<string, ColumnParser> = {
  function parseColumn (line 30) | function parseColumn(

FILE: studio/frontend/src/features/recipe-studio/utils/import/parsers/expression-parser.ts
  constant EXPRESSION_DTYPES (line 10) | const EXPRESSION_DTYPES: ExpressionDtype[] = ["str", "int", "float", "bo...
  function parseExpression (line 12) | function parseExpression(

FILE: studio/frontend/src/features/recipe-studio/utils/import/parsers/llm-parser.ts
  function parseTraceMode (line 15) | function parseTraceMode(value: unknown): LlmConfig["with_trace"] {
  function parseLlm (line 23) | function parseLlm(

FILE: studio/frontend/src/features/recipe-studio/utils/import/parsers/model-parser.ts
  function parseModelProvider (line 14) | function parseModelProvider(
  function parseModelConfig (line 41) | function parseModelConfig(

FILE: studio/frontend/src/features/recipe-studio/utils/import/parsers/sampler-parser.ts
  constant SAMPLER_TYPES (line 14) | const SAMPLER_TYPES: SamplerType[] = [
  constant TIMEDELTA_UNITS (line 27) | const TIMEDELTA_UNITS = new Set(["D", "h", "m", "s"]);
  function parseCategoryConditionalParams (line 29) | function parseCategoryConditionalParams(
  function parseSampler (line 62) | function parseSampler(

FILE: studio/frontend/src/features/recipe-studio/utils/import/parsers/seed-config-parser.ts
  function normalizeSampling (line 12) | function normalizeSampling(value: unknown): SeedSamplingStrategy {
  function makeDefaultSeedConfig (line 18) | function makeDefaultSeedConfig(id: string): SeedConfig {
  function inferRepoIdFromSeedPath (line 49) | function inferRepoIdFromSeedPath(path: string): string {
  function parseSeedSettings (line 62) | function parseSeedSettings(seedConfigRaw: unknown): Partial<SeedConfig> {
  function parseSeedConfig (line 144) | function parseSeedConfig(

FILE: studio/frontend/src/features/recipe-studio/utils/import/parsers/validator-parser.ts
  constant OXC_VALIDATION_FN_MARKER (line 10) | const OXC_VALIDATION_FN_MARKER = "unsloth_oxc_validator";
  function parseOxcValidationMarker (line 12) | function parseOxcValidationMarker(
  function parseValidator (line 34) | function parseValidator(

FILE: studio/frontend/src/features/recipe-studio/utils/import/types.ts
  type RecipeSnapshot (line 12) | type RecipeSnapshot = {
  type ImportResult (line 23) | type ImportResult = {

FILE: studio/frontend/src/features/recipe-studio/utils/import/ui.ts
  type UiInput (line 10) | type UiInput = {
  type ParsedAuxNode (line 18) | type ParsedAuxNode = {
  function parseUi (line 25) | function parseUi(
  function buildNodes (line 120) | function buildNodes(

FILE: studio/frontend/src/features/recipe-studio/utils/layout.ts
  type LayoutOptions (line 10) | type LayoutOptions = {
  function getPipelineRank (line 24) | function getPipelineRank(config: NodeConfig | undefined): number {
  function isInfraNode (line 44) | function isInfraNode(
  function isAuxNode (line 52) | function isAuxNode(nodeId: string): boolean {
  function getEdgeWeight (line 56) | function getEdgeWeight(edgeType: string | undefined): number {
  function buildPhantomEdges (line 73) | function buildPhantomEdges(
  function getLayoutedElements (line 117) | function getLayoutedElements<TNode extends Node>(

FILE: studio/frontend/src/features/recipe-studio/utils/naming.ts
  function nextName (line 6) | function nextName(existing: NodeConfig[], prefix: string): string {

FILE: studio/frontend/src/features/recipe-studio/utils/node-data.ts
  function nodeDataFromConfig (line 11) | function nodeDataFromConfig(

FILE: studio/frontend/src/features/recipe-studio/utils/parse.ts
  function parseNumber (line 4) | function parseNumber(value?: string): number | null {
  function parseIntNumber (line 12) | function parseIntNumber(value?: string): number | null {
  function parseAgeRange (line 20) | function parseAgeRange(value?: string): [number, number] | null {
  function parseJsonObject (line 36) | function parseJsonObject(
  function isValidSex (line 57) | function isValidSex(value?: string): value is "Male" | "Female" {

FILE: studio/frontend/src/features/recipe-studio/utils/payload/build-payload.ts
  function pushUniqueJson (line 51) | function pushUniqueJson(
  function collectAdvancedOpenByNode (line 71) | function collectAdvancedOpenByNode(
  function buildRecipePayload (line 95) | function buildRecipePayload(

FILE: studio/frontend/src/features/recipe-studio/utils/payload/builders-llm.ts
  function buildImageContext (line 11) | function buildImageContext(
  function buildLlmColumn (line 33) | function buildLlmColumn(
  function buildLlmMcpProvider (line 121) | function buildLlmMcpProvider(
  function buildLlmToolConfig (line 170) | function buildLlmToolConfig(
  function buildToolProfilePayload (line 212) | function buildToolProfilePayload(

FILE: studio/frontend/src/features/recipe-studio/utils/payload/builders-model.ts
  function buildModelProvider (line 7) | function buildModelProvider(
  function buildModelConfig (line 37) | function buildModelConfig(

FILE: studio/frontend/src/features/recipe-studio/utils/payload/builders-processors.ts
  function buildExpressionColumn (line 7) | function buildExpressionColumn(
  function buildProcessors (line 24) | function buildProcessors(

FILE: studio/frontend/src/features/recipe-studio/utils/payload/builders-sampler.ts
  constant DATETIME_UNIT_MAP (line 7) | const DATETIME_UNIT_MAP: Record<string, "Y" | "M" | "D" | "h" | "m" | "s...
  function buildCategoryConditionalParams (line 16) | function buildCategoryConditionalParams(
  function buildSamplerParams (line 57) | function buildSamplerParams(
  function buildSamplerColumn (line 181) | function buildSamplerColumn(

FILE: studio/frontend/src/features/recipe-studio/utils/payload/builders-seed.ts
  constant DEFAULT_CHUNK_SIZE (line 6) | const DEFAULT_CHUNK_SIZE = 1200;
  constant DEFAULT_CHUNK_OVERLAP (line 7) | const DEFAULT_CHUNK_OVERLAP = 200;
  constant MAX_CHUNK_SIZE (line 8) | const MAX_CHUNK_SIZE = 20000;
  function parseIntStrict (line 10) | function parseIntStrict(value: string | undefined): number | null {
  function resolveChunking (line 18) | function resolveChunking(config: SeedConfig): { chunkSize: number; chunk...
  function buildSeedConfig (line 29) | function buildSeedConfig(
  function pickFirstSeedConfig (line 96) | function pickFirstSeedConfig(
  function buildSeedDropProcessor (line 107) | function buildSeedDropProcessor(

FILE: studio/frontend/src/features/recipe-studio/utils/payload/builders-validator.ts
  constant OXC_VALIDATION_FN_MARKER (line 7) | const OXC_VALIDATION_FN_MARKER = "unsloth_oxc_validator";
  function parseBatchSize (line 9) | function parseBatchSize(value: string): number {
  function buildValidatorColumn (line 17) | function buildValidatorColumn(

FILE: studio/frontend/src/features/recipe-studio/utils/payload/empty.ts
  function createEmptyRecipePayload (line 6) | function createEmptyRecipePayload(): RecipePayload {

FILE: studio/frontend/src/features/recipe-studio/utils/payload/types.ts
  type RecipePayload (line 4) | type RecipePayload = {
  type RecipePayloadResult (line 81) | type RecipePayloadResult = {

FILE: studio/frontend/src/features/recipe-studio/utils/payload/validate.ts
  function validateSubcategoryConfigs (line 15) | function validateSubcategoryConfigs(
  function validateTimedeltaConfigs (line 46) | function validateTimedeltaConfigs(
  function validateModelAliasLinks (line 71) | function validateModelAliasLinks(
  function validateModelConfigProviders (line 83) | function validateModelConfigProviders(
  function validateUsedProviders (line 101) | function validateUsedProviders(
  function validateValidatorConfigs (line 122) | function validateValidatorConfigs(

FILE: studio/frontend/src/features/recipe-studio/utils/processors.ts
  function buildDefaultSchemaTransform (line 6) | function buildDefaultSchemaTransform(): RecipeProcessorConfig {

FILE: studio/frontend/src/features/recipe-studio/utils/reactflow-changes.ts
  function applyAuxNodeChanges (line 12) | function applyAuxNodeChanges<T extends Node>(
  function filterNodeChangesByIds (line 33) | function filterNodeChangesByIds<T extends Node>(
  function filterEdgeChangesByIds (line 42) | function filterEdgeChangesByIds(

FILE: studio/frontend/src/features/recipe-studio/utils/recipe-studio-view.ts
  type DialogOptions (line 6) | type DialogOptions = {
  function buildDialogOptions (line 14) | function buildDialogOptions(configList: NodeConfig[]): DialogOptions {

FILE: studio/frontend/src/features/recipe-studio/utils/refs.ts
  constant JINJA_REF_RE (line 4) | const JINJA_REF_RE = /{{\s*([a-zA-Z_][a-zA-Z0-9_]*)\s*}}/g;
  constant JINJA_EXPR_RE (line 5) | const JINJA_EXPR_RE = /{{\s*([^{}]+?)\s*}}/g;
  constant SIMPLE_JINJA_EXPR_RE (line 6) | const SIMPLE_JINJA_EXPR_RE = /^[a-zA-Z_][a-zA-Z0-9_.]*$/;
  constant PLAIN_JINJA_EXPR_RE (line 7) | const PLAIN_JINJA_EXPR_RE = /^[a-zA-Z0-9_.\s-]+$/;
  constant NESTED_REFERENCE_ROOTS (line 8) | const NESTED_REFERENCE_ROOTS = new Set(["user"]);
  function isValidNestedReference (line 10) | function isValidNestedReference(expr: string, validSet: Set<string>): bo...
  
Condensed preview — 759 files, each showing path, character count, and a content snippet. Download the .json file or copy for the full structured content (6,402K chars).
[
  {
    "path": ".gitattributes",
    "chars": 61,
    "preview": "# Normalize Python files to LF line endings\n*.py text eol=lf\n"
  },
  {
    "path": ".github/CODEOWNERS",
    "chars": 2417,
    "preview": "# Inspired from https://github.com/vllm-project/vllm/blob/main/.github/CODEOWNERS\n\n/unsloth/models/loader.py @danielhanc"
  },
  {
    "path": ".github/FUNDING.yml",
    "chars": 706,
    "preview": "# These are supported funding model platforms\n\ngithub: unslothai\npatreon: # Replace with a single Patreon username\nopen_"
  },
  {
    "path": ".github/ISSUE_TEMPLATE/bug---issue.md",
    "chars": 586,
    "preview": "---\nname: Bug / Issue\nabout: Bug / Issue\ntitle: \"[Bug] Please fill in your issue title here.\"\nlabels: bug\nassignees: ''\n"
  },
  {
    "path": ".github/ISSUE_TEMPLATE/feature-request.md",
    "chars": 489,
    "preview": "---\nname: Feature Request\nabout: New features, model support, ideas\ntitle: \"[Feature]\"\nlabels: feature request\nassignees"
  },
  {
    "path": ".github/workflows/stale.yml",
    "chars": 1299,
    "preview": "name: 'Inactive Issue Pinger'\n\non:\n  schedule:\n    - cron: '30 5 * * *' # Runs at 5:30 UTC every day\n\njobs:\n  stale:\n   "
  },
  {
    "path": ".gitignore",
    "chars": 4001,
    "preview": "# Byte-compiled / optimized / DLL files\n__pycache__/\n*.py[cod]\n*.class\nunsloth_compiled_cache/\n# ML artifacts (large fil"
  },
  {
    "path": ".pre-commit-ci.yaml",
    "chars": 145,
    "preview": "ci:\n  autofix_prs: true\n  autofix_prs_limit: 5\n  autoupdate_schedule: monthly\n  autoupdate_commit_msg: \"chore: pre-commi"
  },
  {
    "path": ".pre-commit-config.yaml",
    "chars": 430,
    "preview": "repos:\n  - repo: https://github.com/astral-sh/ruff-pre-commit\n    rev: v0.15.6\n    hooks:\n      - id: ruff\n        args:"
  },
  {
    "path": "CODE_OF_CONDUCT.md",
    "chars": 5484,
    "preview": "\n# Contributor Covenant Code of Conduct\n\n## Our Pledge\n\nWe as members, contributors, and leaders pledge to make particip"
  },
  {
    "path": "CONTRIBUTING.md",
    "chars": 2211,
    "preview": "# 🦥 Contributing to Unsloth\n\nThank you for not only using Unsloth but also for being interested in helping out! We value"
  },
  {
    "path": "COPYING",
    "chars": 34676,
    "preview": "                    GNU AFFERO GENERAL PUBLIC LICENSE\n                       Version 3, 19 November 2007\n\n Copyright (C)"
  },
  {
    "path": "LICENSE",
    "chars": 11550,
    "preview": "                                 Apache License\n                           Version 2.0, January 2004\n                   "
  },
  {
    "path": "README.md",
    "chars": 15391,
    "preview": "<h1 align=\"center\" style=\"margin:0;\">\n  <a href=\"https://unsloth.ai/docs\"><picture>\n    <source media=\"(prefers-color-sc"
  },
  {
    "path": "build.sh",
    "chars": 1939,
    "preview": "#!/usr/bin/env bash\n\nset -euo pipefail\n\n# 1. Build frontend (Vite outputs to dist/)\ncd studio/frontend\n\n# Clean stale di"
  },
  {
    "path": "cli.py",
    "chars": 209,
    "preview": "# SPDX-License-Identifier: AGPL-3.0-only\n# Copyright 2026-present the Unsloth AI Inc. team. All rights reserved. See /st"
  },
  {
    "path": "install.ps1",
    "chars": 5208,
    "preview": "# Unsloth Studio Installer for Windows PowerShell\n# Usage:  irm https://raw.githubusercontent.com/unslothai/unsloth/main"
  },
  {
    "path": "install.sh",
    "chars": 7558,
    "preview": "#!/bin/sh\n# Unsloth Studio Installer\n# Usage (curl): curl -fsSL https://raw.githubusercontent.com/unslothai/unsloth/main"
  },
  {
    "path": "pyproject.toml",
    "chars": 98985,
    "preview": "[build-system]\nrequires = [\"setuptools==80.9.0\", \"setuptools-scm==9.2.0\"]\nbuild-backend = \"setuptools.build_meta\"\n\n[proj"
  },
  {
    "path": "scripts/enforce_kwargs_spacing.py",
    "chars": 5457,
    "preview": "#!/usr/bin/env python3\n\"\"\"Ensure keyword arguments use spaces around '=', prune redundant pass statements.\"\"\"\n\nfrom __fu"
  },
  {
    "path": "scripts/run_ruff_format.py",
    "chars": 793,
    "preview": "#!/usr/bin/env python3\n\"\"\"Run `ruff format` followed by kwarg spacing enforcement.\"\"\"\n\nfrom __future__ import annotation"
  },
  {
    "path": "studio/LICENSE.AGPL-3.0",
    "chars": 34523,
    "preview": "                    GNU AFFERO GENERAL PUBLIC LICENSE\n                       Version 3, 19 November 2007\n\n Copyright (C)"
  },
  {
    "path": "studio/Unsloth_Studio_Colab.ipynb",
    "chars": 5414,
    "preview": "{\n \"cells\": [\n  {\n   \"cell_type\": \"markdown\",\n   \"id\": \"6b87de59\",\n   \"metadata\": {},\n   \"source\": [\n    \"To run this, p"
  },
  {
    "path": "studio/__init__.py",
    "chars": 142,
    "preview": "# SPDX-License-Identifier: AGPL-3.0-only\n# Copyright 2026-present the Unsloth AI Inc. team. All rights reserved. See /st"
  },
  {
    "path": "studio/backend/__init__.py",
    "chars": 142,
    "preview": "# SPDX-License-Identifier: AGPL-3.0-only\n# Copyright 2026-present the Unsloth AI Inc. team. All rights reserved. See /st"
  },
  {
    "path": "studio/backend/assets/__init__.py",
    "chars": 142,
    "preview": "# SPDX-License-Identifier: AGPL-3.0-only\n# Copyright 2026-present the Unsloth AI Inc. team. All rights reserved. See /st"
  },
  {
    "path": "studio/backend/assets/configs/__init__.py",
    "chars": 142,
    "preview": "# SPDX-License-Identifier: AGPL-3.0-only\n# Copyright 2026-present the Unsloth AI Inc. team. All rights reserved. See /st"
  },
  {
    "path": "studio/backend/assets/configs/full_finetune.yaml",
    "chars": 835,
    "preview": "model: unsloth/Qwen2.5-0.5B\n\ndata:\n  dataset: tatsu-lab/alpaca\n  format_type: auto\n\ntraining:\n  training_type: full\n  ma"
  },
  {
    "path": "studio/backend/assets/configs/inference_defaults.json",
    "chars": 8220,
    "preview": "{\n  \"_comment\": \"Per-model-family inference parameter defaults. Sources: (1) Ollama params blobs, (2) Existing Unsloth S"
  },
  {
    "path": "studio/backend/assets/configs/lora_text.yaml",
    "chars": 889,
    "preview": "model: unsloth/Qwen2.5-0.5B\n\ndata:\n  dataset: tatsu-lab/alpaca\n  format_type: auto\n\ntraining:\n  training_type: lora\n  ma"
  },
  {
    "path": "studio/backend/assets/configs/model_defaults/default.yaml",
    "chars": 1074,
    "preview": "# Default model training parameters\n# Used for models without specific configurations\n\ntraining:\n  trust_remote_code: fa"
  },
  {
    "path": "studio/backend/assets/configs/model_defaults/embedding/unsloth_Qwen3-Embedding-0.6B.yaml",
    "chars": 904,
    "preview": "# Model defaults for unsloth/Qwen3-Embedding-0.6B\n# Based on Qwen3_Embedding_(0_6B).py embedding notebook\n# Also applies"
  },
  {
    "path": "studio/backend/assets/configs/model_defaults/embedding/unsloth_all-MiniLM-L6-v2.yaml",
    "chars": 777,
    "preview": "# Model defaults for unsloth/all-MiniLM-L6-v2\n# Based on All_MiniLM_L6_v2.py embedding notebook\n\ntraining:\n  max_seq_len"
  },
  {
    "path": "studio/backend/assets/configs/model_defaults/embedding/unsloth_bge-m3.yaml",
    "chars": 770,
    "preview": "# Model defaults for unsloth/bge-m3\n# Based on BGE_M3.py embedding notebook\n\ntraining:\n  max_seq_length: 512\n  # num_epo"
  },
  {
    "path": "studio/backend/assets/configs/model_defaults/embedding/unsloth_embeddinggemma-300m.yaml",
    "chars": 845,
    "preview": "# Model defaults for unsloth/embeddinggemma-300m\n# Based on EmbeddingGemma_(300M).py embedding notebook\n\ntraining:\n  max"
  },
  {
    "path": "studio/backend/assets/configs/model_defaults/embedding/unsloth_gte-modernbert-base.yaml",
    "chars": 773,
    "preview": "# Model defaults for unsloth/gte-modernbert-base\n# Based on ModernBert.py embedding notebook\n\ntraining:\n  max_seq_length"
  },
  {
    "path": "studio/backend/assets/configs/model_defaults/ernie/unsloth_ERNIE-4.5-21B-A3B-PT.yaml",
    "chars": 948,
    "preview": "# Model defaults for unsloth/ERNIE-4.5-21B-A3B-PT\n# Based on ERNIE_4_5_21B_A3B_PT-Conversational.ipynb\n# Also applies to"
  },
  {
    "path": "studio/backend/assets/configs/model_defaults/ernie/unsloth_ERNIE-4.5-VL-28B-A3B-PT.yaml",
    "chars": 1159,
    "preview": "# Model defaults for unsloth/ERNIE-4.5-VL-28B-A3B-PT\n# Based on ERNIE_4_5_VL_28B_A3B_PT_Vision.ipynb\n# Also applies to: "
  },
  {
    "path": "studio/backend/assets/configs/model_defaults/falcon/tiiuae_Falcon-H1-0.5B-Instruct.yaml",
    "chars": 969,
    "preview": "# Model defaults for tiiuae/Falcon-H1-0.5B-Instruct\n# Based on Falcon_H1_(0.5B)-Alpaca.ipynb\n# Also applies to: tiiuae/F"
  },
  {
    "path": "studio/backend/assets/configs/model_defaults/gemma/unsloth_codegemma-7b-bnb-4bit.yaml",
    "chars": 1028,
    "preview": "# Model defaults for unsloth/codegemma-7b-bnb-4bit\n# Based on CodeGemma_(7B)-Conversational.ipynb\n# Also applies to: uns"
  },
  {
    "path": "studio/backend/assets/configs/model_defaults/gemma/unsloth_functiongemma-270m-it.yaml",
    "chars": 1142,
    "preview": "# Model defaults for unsloth/functiongemma-270m-it\n# Based on FunctionGemma_(270M).ipynb\n# Also applies to: unsloth/func"
  },
  {
    "path": "studio/backend/assets/configs/model_defaults/gemma/unsloth_gemma-2-27b-bnb-4bit.yaml",
    "chars": 918,
    "preview": "# Model defaults for unsloth/gemma-2-27b-bnb-4bit\n# Based on Gemma2_(9B)-Alpaca.ipynb (same defaults for larger models)\n"
  },
  {
    "path": "studio/backend/assets/configs/model_defaults/gemma/unsloth_gemma-2-2b.yaml",
    "chars": 939,
    "preview": "# Model defaults for unsloth/gemma-2-2b\n# Based on Gemma2_(2B)-Alpaca.ipynb\n# Also applies to: unsloth/gemma-2-2b-bnb-4b"
  },
  {
    "path": "studio/backend/assets/configs/model_defaults/gemma/unsloth_gemma-3-270m-it.yaml",
    "chars": 1102,
    "preview": "# Model defaults for unsloth/gemma-3-270m-it\n# Based on Gemma3_(270M).ipynb\n# Also applies to: unsloth/gemma-3-270m-it-u"
  },
  {
    "path": "studio/backend/assets/configs/model_defaults/gemma/unsloth_gemma-3-27b-it.yaml",
    "chars": 1148,
    "preview": "# Model defaults for unsloth/gemma-3-27b-it\n# Based on Gemma3_(27B)_A100-Conversational.ipynb\n# Also applies to: unsloth"
  },
  {
    "path": "studio/backend/assets/configs/model_defaults/gemma/unsloth_gemma-3-4b-it.yaml",
    "chars": 1123,
    "preview": "# Model defaults for unsloth/gemma-3-4b-it\n# Based on Gemma3_(4B).ipynb\n# Also applies to: unsloth/gemma-3-4b-it-unsloth"
  },
  {
    "path": "studio/backend/assets/configs/model_defaults/gemma/unsloth_gemma-3-4b-pt.yaml",
    "chars": 1137,
    "preview": "# Model defaults for unsloth/gemma-3-4b-pt\n# Based on Gemma3_(4B)-Vision.ipynb\n# Also applies to: unsloth/gemma-3-4b-pt-"
  },
  {
    "path": "studio/backend/assets/configs/model_defaults/gemma/unsloth_gemma-3n-E4B-it.yaml",
    "chars": 1174,
    "preview": "# Model defaults for unsloth/gemma-3n-E4B-it\n# Based on Gemma3N_(4B)-Conversational.ipynb\n# Also applies to: unsloth/gem"
  },
  {
    "path": "studio/backend/assets/configs/model_defaults/gemma/unsloth_gemma-3n-E4B.yaml",
    "chars": 1122,
    "preview": "# Model defaults for unsloth/gemma-3n-E4B\n# Based on Gemma3N_(4B)-Vision.ipynb\n# Also applies to: unsloth/gemma-3n-E4B-u"
  },
  {
    "path": "studio/backend/assets/configs/model_defaults/gpt-oss/unsloth_gpt-oss-120b.yaml",
    "chars": 1060,
    "preview": "# Model defaults for unsloth/gpt-oss-120b\n# Based on gpt-oss-(120B)_A100-Fine-tuning.ipynb\n# Also applies to: openai/gpt"
  },
  {
    "path": "studio/backend/assets/configs/model_defaults/gpt-oss/unsloth_gpt-oss-20b.yaml",
    "chars": 1076,
    "preview": "# Model defaults for unsloth/gpt-oss-20b\n# Based on gpt-oss-(20B)-Fine-tuning.ipynb\n# Also applies to: openai/gpt-oss-20"
  },
  {
    "path": "studio/backend/assets/configs/model_defaults/granite/unsloth_granite-4.0-350m-unsloth-bnb-4bit.yaml",
    "chars": 1118,
    "preview": "# Model defaults for unsloth/granite-4.0-350m\n# Based on Granite4.0_350M.ipynb\n# Also applies to: ibm-granite/granite-4."
  },
  {
    "path": "studio/backend/assets/configs/model_defaults/granite/unsloth_granite-4.0-h-micro.yaml",
    "chars": 1168,
    "preview": "# Model defaults for unsloth/granite-4.0-h-micro\n# Based on Granite4.0.ipynb\n# Also applies to: ibm-granite/granite-4.0-"
  },
  {
    "path": "studio/backend/assets/configs/model_defaults/llama/unsloth_Llama-3.2-11B-Vision-Instruct.yaml",
    "chars": 1179,
    "preview": "# Model defaults for unsloth/Llama-3.2-11B-Vision-Instruct\n# Based on Llama3.2_(11B)-Vision.ipynb\n# Also applies to: uns"
  },
  {
    "path": "studio/backend/assets/configs/model_defaults/llama/unsloth_Llama-3.2-1B-Instruct.yaml",
    "chars": 1140,
    "preview": "# Model defaults for unsloth/Llama-3.2-1B-Instruct\n# Based on Llama3.2_(1B)-RAFT.ipynb\n# Also applies to: unsloth/Llama-"
  },
  {
    "path": "studio/backend/assets/configs/model_defaults/llama/unsloth_Llama-3.2-3B-Instruct.yaml",
    "chars": 1246,
    "preview": "# Model defaults for unsloth/Llama-3.2-3B-Instruct\n# Based on Llama3.2_(1B_and_3B)-Conversational.ipynb\n# Also applies t"
  },
  {
    "path": "studio/backend/assets/configs/model_defaults/llama/unsloth_Llama-3.3-70B-Instruct.yaml",
    "chars": 1252,
    "preview": "# Model defaults for unsloth/Llama-3.3-70B-Instruct\n# Based on Llama3.3_(70B)_A100-Conversational.ipynb\n# Also applies t"
  },
  {
    "path": "studio/backend/assets/configs/model_defaults/llama/unsloth_Meta-Llama-3.1-70B-bnb-4bit.yaml",
    "chars": 1177,
    "preview": "# Model defaults for unsloth/Meta-Llama-3.1-70B-bnb-4bit\n# Based on Llama3.1_(8B)-Alpaca.ipynb\n# Also applies to: unslot"
  },
  {
    "path": "studio/backend/assets/configs/model_defaults/llama/unsloth_Meta-Llama-3.1-8B-Instruct-bnb-4bit.yaml",
    "chars": 1179,
    "preview": "# Model defaults for unsloth/Meta-Llama-3.1-8B-Instruct-bnb-4bit\n# Based on Llama3.1_(8B)-Inference.ipynb\n# Also applies"
  },
  {
    "path": "studio/backend/assets/configs/model_defaults/llama/unsloth_llama-3-8b-Instruct-bnb-4bit.yaml",
    "chars": 984,
    "preview": "# Model defaults for unsloth/llama-3-8b-Instruct-bnb-4bit\n# Based on Llama3_(8B)-Conversational.ipynb\n# Also applies to:"
  },
  {
    "path": "studio/backend/assets/configs/model_defaults/llama/unsloth_llama-3-8b-bnb-4bit.yaml",
    "chars": 949,
    "preview": "# Model defaults for unsloth/llama-3-8b-bnb-4bit\n# Based on Llama3_(8B)-Alpaca.ipynb\n# Also applies to: unsloth/llama-3-"
  },
  {
    "path": "studio/backend/assets/configs/model_defaults/llasa/unsloth_Llasa-3B.yaml",
    "chars": 936,
    "preview": "# Model defaults for unsloth/Llasa-3B\n# Based on Llasa_TTS_(3B).ipynb and Llasa_TTS_(1B).ipynb\n# Also applies to: HKUSTA"
  },
  {
    "path": "studio/backend/assets/configs/model_defaults/mistral/unsloth_Magistral-Small-2509-unsloth-bnb-4bit.yaml",
    "chars": 1220,
    "preview": "# Model defaults for unsloth/Magistral-Small-2509\n# Based on Magistral_(24B)-Reasoning-Conversational.ipynb\n# Also appli"
  },
  {
    "path": "studio/backend/assets/configs/model_defaults/mistral/unsloth_Ministral-3-3B-Instruct-2512.yaml",
    "chars": 1168,
    "preview": "# Model defaults for unsloth/Ministral-3-3B-Instruct-2512\n# Based on Ministral_3_VL_(3B)_Vision.ipynb\n# Also applies to:"
  },
  {
    "path": "studio/backend/assets/configs/model_defaults/mistral/unsloth_Mistral-Nemo-Base-2407-bnb-4bit.yaml",
    "chars": 1118,
    "preview": "# Model defaults for unsloth/Mistral-Nemo-Base-2407-bnb-4bit\n# Based on Mistral_Nemo_(12B)-Alpaca.ipynb\n# Also applies t"
  },
  {
    "path": "studio/backend/assets/configs/model_defaults/mistral/unsloth_Mistral-Small-Instruct-2409.yaml",
    "chars": 1003,
    "preview": "# Model defaults for unsloth/Mistral-Small-Instruct-2409\n# Based on Mistral_Small_(22B)-Alpaca.ipynb \n# Also applies to:"
  },
  {
    "path": "studio/backend/assets/configs/model_defaults/mistral/unsloth_Pixtral-12B-2409.yaml",
    "chars": 1130,
    "preview": "# Model defaults for unsloth/Pixtral-12B-2409\n# Based on Pixtral_(12B)-Vision.ipynb\n# Also applies to: unsloth/Pixtral-1"
  },
  {
    "path": "studio/backend/assets/configs/model_defaults/mistral/unsloth_mistral-7b-instruct-v0.3-bnb-4bit.yaml",
    "chars": 999,
    "preview": "# Model defaults for unsloth/mistral-7b-instruct-v0.3-bnb-4bit\n# Based on Mistral_v0.3_(7B)-Conversational.ipynb\n# Also "
  },
  {
    "path": "studio/backend/assets/configs/model_defaults/mistral/unsloth_mistral-7b-v0.3-bnb-4bit.yaml",
    "chars": 968,
    "preview": "# Model defaults for unsloth/mistral-7b-v0.3-bnb-4bit\n# Based on Mistral_v0.3_(7B)-Alpaca.ipynb\n# Also applies to: \"unsl"
  },
  {
    "path": "studio/backend/assets/configs/model_defaults/other/OuteAI_Llama-OuteTTS-1.0-1B.yaml",
    "chars": 988,
    "preview": "# Model defaults for OuteAI/Llama-OuteTTS-1.0-1B\n# Based on Oute_TTS_(1B).ipynb\n# Also applies to: OuteAI/Llama-OuteTTS-"
  },
  {
    "path": "studio/backend/assets/configs/model_defaults/other/Spark-TTS-0.5B_LLM.yaml",
    "chars": 1045,
    "preview": "# Model defaults for Spark-TTS-0.5B/LLM\n# Based on Spark_TTS_(0_5B).ipynb\n# Also applies to: Spark-TTS-0.5B/LLM\n# added "
  },
  {
    "path": "studio/backend/assets/configs/model_defaults/other/sesame_csm-1b.yaml",
    "chars": 936,
    "preview": "# Model defaults for sesame/csm-1b\n# Based on Sesame_CSM_(1B)-TTS.ipynb\n# Also applies to: sesame/csm-1b\n\naudio_type: cs"
  },
  {
    "path": "studio/backend/assets/configs/model_defaults/other/unsloth_GLM-4.7-Flash.yaml",
    "chars": 1046,
    "preview": "# Model defaults for unsloth/GLM-4.7-Flash\n# Based on GLM_Flash_A100(80GB).py\n# Also applies to: unsloth/GLM-4.7-Flash-u"
  },
  {
    "path": "studio/backend/assets/configs/model_defaults/other/unsloth_LFM2-1.2B.yaml",
    "chars": 917,
    "preview": "# Model defaults for unsloth/LFM2-1.2B\n# Based on Liquid_LFM2_(1.2B)-Conversational.ipynb\n# Also applies to: unsloth/LFM"
  },
  {
    "path": "studio/backend/assets/configs/model_defaults/other/unsloth_Nemotron-3-Nano-30B-A3B.yaml",
    "chars": 1060,
    "preview": "# Model defaults for unsloth/Nemotron-3-Nano-30B-A3B\n# Based on Nemotron-3-Nano-30B-A3B_A100.ipynb\n# Also applies to: un"
  },
  {
    "path": "studio/backend/assets/configs/model_defaults/other/unsloth_PaddleOCR-VL.yaml",
    "chars": 1130,
    "preview": "# Model defaults for unsloth/PaddleOCR-VL\n# Based on Paddle_OCR_(1B)_Vision.ipynb\n# Also applies to: unsloth/PaddleOCR-V"
  },
  {
    "path": "studio/backend/assets/configs/model_defaults/other/unsloth_answerdotai_ModernBERT-large.yaml",
    "chars": 886,
    "preview": "# Model defaults for answerdotai/ModernBERT-large\n# Based on bert_classification.ipynb\n\ntraining:\n  trust_remote_code: f"
  },
  {
    "path": "studio/backend/assets/configs/model_defaults/other/unsloth_orpheus-3b-0.1-ft.yaml",
    "chars": 1126,
    "preview": "# Model defaults for unsloth/orpheus-3b-0.1-ft\n# Based on Orpheus_(3B)-TTS.ipynb\n# Also applies to: unsloth/orpheus-3b-0"
  },
  {
    "path": "studio/backend/assets/configs/model_defaults/other/unsloth_tinyllama-bnb-4bit.yaml",
    "chars": 948,
    "preview": "# Model defaults for unsloth/tinyllama\n# Based on TinyLlama_(1.1B)-Alpaca.ipynb\n# Also applies to: TinyLlama/TinyLlama-1"
  },
  {
    "path": "studio/backend/assets/configs/model_defaults/other/unsloth_whisper-large-v3.yaml",
    "chars": 910,
    "preview": "# Model defaults for unsloth/whisper-large-v3\n# Based on Whisper.ipynb\n# Also applies to: unsloth/whisper-large-v3, open"
  },
  {
    "path": "studio/backend/assets/configs/model_defaults/phi/unsloth_Phi-3-medium-4k-instruct.yaml",
    "chars": 999,
    "preview": "# Model defaults for unsloth/Phi-3-medium-4k-instruct\n# Based on Phi_3_Medium-Conversational.ipynb\n# Also applies to: \"u"
  },
  {
    "path": "studio/backend/assets/configs/model_defaults/phi/unsloth_Phi-3.5-mini-instruct.yaml",
    "chars": 989,
    "preview": "# Model defaults for unsloth/Phi-3.5-mini-instruct\n# Based on Phi_3.5_Mini-Conversational.ipynb\n# Also applies to: \"unsl"
  },
  {
    "path": "studio/backend/assets/configs/model_defaults/phi/unsloth_Phi-4.yaml",
    "chars": 1045,
    "preview": "# Model defaults for unsloth/Phi-4\n# Based on Phi_4-Conversational.ipynb\n# Also applies to: unsloth/phi-4-unsloth-bnb-4b"
  },
  {
    "path": "studio/backend/assets/configs/model_defaults/qwen/imdatta0_tiny_qwen3_moe_2.8B_0.7B.yaml",
    "chars": 1059,
    "preview": "# Model defaults for imdatta0/tiny_qwen3_moe_2.8B_0.7B\n# Based on TinyQwen3_MoE.py\n# Dummy model of qwen3moe architectur"
  },
  {
    "path": "studio/backend/assets/configs/model_defaults/qwen/unsloth_Qwen2-7B.yaml",
    "chars": 931,
    "preview": "# Model defaults for unsloth/Qwen2-7B\n# Based on Qwen2_(7B)-Alpaca.ipynb\n# Also applies to: unsloth/Qwen2-7B-bnb-4bit, Q"
  },
  {
    "path": "studio/backend/assets/configs/model_defaults/qwen/unsloth_Qwen2-VL-7B-Instruct.yaml",
    "chars": 1137,
    "preview": "# Model defaults for unsloth/Qwen2-VL-7B-Instruct\n# Based on Qwen2_VL_(7B)-Vision.ipynb \n# Also applies to: unsloth/Qwen"
  },
  {
    "path": "studio/backend/assets/configs/model_defaults/qwen/unsloth_Qwen2.5-1.5B-Instruct.yaml",
    "chars": 1015,
    "preview": "# Model defaults for unsloth/Qwen2.5-1.5B-Instruct\n# Based on nemo_gym_sudoku.ipynb\n# Also applies to: unsloth/Qwen2.5-1"
  },
  {
    "path": "studio/backend/assets/configs/model_defaults/qwen/unsloth_Qwen2.5-7B.yaml",
    "chars": 976,
    "preview": "# Model defaults for unsloth/Qwen2.5-7B\n# Based on Qwen2.5_(7B)-Alpaca.ipynb\n# Also applies to: unsloth/Qwen2.5-7B-unslo"
  },
  {
    "path": "studio/backend/assets/configs/model_defaults/qwen/unsloth_Qwen2.5-Coder-1.5B-Instruct.yaml",
    "chars": 1004,
    "preview": "# Model defaults for unsloth/Qwen2.5-Coder-1.5B-Instruct\n# Based on Qwen2.5_Coder_(1.5B)-Tool_Calling.ipynb\n# Also appli"
  },
  {
    "path": "studio/backend/assets/configs/model_defaults/qwen/unsloth_Qwen2.5-Coder-14B-Instruct.yaml",
    "chars": 1092,
    "preview": "# Model defaults for unsloth/Qwen2.5-Coder-14B-Instruct\n# Based on Qwen2.5_Coder_(14B)-Conversational.ipynb\n# Also appli"
  },
  {
    "path": "studio/backend/assets/configs/model_defaults/qwen/unsloth_Qwen2.5-Coder-7B-Instruct-bnb-4bit.yaml",
    "chars": 1017,
    "preview": "# Model defaults for unsloth/Qwen2.5-Coder-7B-Instruct-bnb-4bit\n# Based on CodeForces-cot-Finetune_for_Reasoning_on_Code"
  },
  {
    "path": "studio/backend/assets/configs/model_defaults/qwen/unsloth_Qwen2.5-VL-7B-Instruct-bnb-4bit.yaml",
    "chars": 1146,
    "preview": "# Model defaults for unsloth/Qwen2.5-VL-7B-Instruct-bnb-4bit\n# Based on Qwen2.5_VL_(7B)-Vision.ipynb\n# Also applies to: "
  },
  {
    "path": "studio/backend/assets/configs/model_defaults/qwen/unsloth_Qwen3-0.6B.yaml",
    "chars": 1118,
    "preview": "# Model defaults for unsloth/Qwen3-0.6B\n# Based on Qwen3_(0_6B)-Phone_Deployment.ipynb\n# Also applies to: unsloth/Qwen3-"
  },
  {
    "path": "studio/backend/assets/configs/model_defaults/qwen/unsloth_Qwen3-14B-Base-unsloth-bnb-4bit.yaml",
    "chars": 1060,
    "preview": "# Model defaults for unsloth/Qwen3-14B-Base\n# Based on Qwen3_(14B)-Alpaca.ipynb\n# Also applies to: unsloth/Qwen3-14B-Bas"
  },
  {
    "path": "studio/backend/assets/configs/model_defaults/qwen/unsloth_Qwen3-14B.yaml",
    "chars": 1094,
    "preview": "# Model defaults for unsloth/Qwen3-14B\n# Based on Qwen3_(14B).ipynb\n# Also applies to: unsloth/Qwen3-14B-unsloth-bnb-4bi"
  },
  {
    "path": "studio/backend/assets/configs/model_defaults/qwen/unsloth_Qwen3-30B-A3B-Instruct-2507.yaml",
    "chars": 1095,
    "preview": "# Model defaults for unsloth/Qwen3-30B-A3B-Instruct-2507\n# Based on Qwen3_MoE.py\n# Also applies to: Qwen/Qwen3-30B-A3B-I"
  },
  {
    "path": "studio/backend/assets/configs/model_defaults/qwen/unsloth_Qwen3-32B.yaml",
    "chars": 1124,
    "preview": "# Model defaults for unsloth/Qwen3-32B\n# Based on Qwen3_(32B)_A100-Reasoning-Conversational.ipynb\n# Also applies to: uns"
  },
  {
    "path": "studio/backend/assets/configs/model_defaults/qwen/unsloth_Qwen3-4B-Instruct-2507.yaml",
    "chars": 1202,
    "preview": "# Model defaults for unsloth/Qwen3-4B-Instruct-2507\n# Based on Qwen3_(4B)-Instruct.ipynb\n# Also applies to: unsloth/Qwen"
  },
  {
    "path": "studio/backend/assets/configs/model_defaults/qwen/unsloth_Qwen3-4B-Thinking-2507.yaml",
    "chars": 1202,
    "preview": "# Model defaults for unsloth/Qwen3-4B-Thinking-2507\n# Based on Qwen3_(4B)-Thinking.ipynb\n# Also applies to: unsloth/Qwen"
  },
  {
    "path": "studio/backend/assets/configs/model_defaults/qwen/unsloth_Qwen3-VL-8B-Instruct-unsloth-bnb-4bit.yaml",
    "chars": 1194,
    "preview": "# Model defaults for unsloth/Qwen3-VL-8B-Instruct\n# Based on Qwen3_VL_(8B)-Vision.ipynb\n# Also applies to: Qwen/Qwen3-VL"
  },
  {
    "path": "studio/backend/assets/configs/vision_lora.yaml",
    "chars": 921,
    "preview": "model: unsloth/Qwen2-VL-2B-Instruct-bnb-4bit\n\ndata:\n  dataset: philschmid/amazon-product-descriptions-vlm\n  format_type:"
  },
  {
    "path": "studio/backend/auth/.gitkeep",
    "chars": 0,
    "preview": ""
  },
  {
    "path": "studio/backend/auth/__init__.py",
    "chars": 1538,
    "preview": "# SPDX-License-Identifier: AGPL-3.0-only\n# Copyright 2026-present the Unsloth AI Inc. team. All rights reserved. See /st"
  },
  {
    "path": "studio/backend/auth/authentication.py",
    "chars": 5275,
    "preview": "# SPDX-License-Identifier: AGPL-3.0-only\n# Copyright 2026-present the Unsloth AI Inc. team. All rights reserved. See /st"
  },
  {
    "path": "studio/backend/auth/hashing.py",
    "chars": 1063,
    "preview": "# SPDX-License-Identifier: AGPL-3.0-only\n# Copyright 2026-present the Unsloth AI Inc. team. All rights reserved. See /st"
  },
  {
    "path": "studio/backend/auth/storage.py",
    "chars": 10577,
    "preview": "# SPDX-License-Identifier: AGPL-3.0-only\n# Copyright 2026-present the Unsloth AI Inc. team. All rights reserved. See /st"
  },
  {
    "path": "studio/backend/colab.py",
    "chars": 4378,
    "preview": "# SPDX-License-Identifier: AGPL-3.0-only\n# Copyright 2026-present the Unsloth AI Inc. team. All rights reserved. See /st"
  },
  {
    "path": "studio/backend/core/__init__.py",
    "chars": 4609,
    "preview": "# SPDX-License-Identifier: AGPL-3.0-only\n# Copyright 2026-present the Unsloth AI Inc. team. All rights reserved. See /st"
  },
  {
    "path": "studio/backend/core/data_recipe/__init__.py",
    "chars": 297,
    "preview": "# SPDX-License-Identifier: AGPL-3.0-only\n# Copyright 2026-present the Unsloth AI Inc. team. All rights reserved. See /st"
  },
  {
    "path": "studio/backend/core/data_recipe/huggingface.py",
    "chars": 4366,
    "preview": "# SPDX-License-Identifier: AGPL-3.0-only\n# Copyright 2026-present the Unsloth AI Inc. team. All rights reserved. See /st"
  },
  {
    "path": "studio/backend/core/data_recipe/jobs/__init__.py",
    "chars": 237,
    "preview": "# SPDX-License-Identifier: AGPL-3.0-only\n# Copyright 2026-present the Unsloth AI Inc. team. All rights reserved. See /st"
  },
  {
    "path": "studio/backend/core/data_recipe/jobs/constants.py",
    "chars": 896,
    "preview": "# SPDX-License-Identifier: AGPL-3.0-only\n# Copyright 2026-present the Unsloth AI Inc. team. All rights reserved. See /st"
  },
  {
    "path": "studio/backend/core/data_recipe/jobs/manager.py",
    "chars": 17455,
    "preview": "# SPDX-License-Identifier: AGPL-3.0-only\n# Copyright 2026-present the Unsloth AI Inc. team. All rights reserved. See /st"
  },
  {
    "path": "studio/backend/core/data_recipe/jobs/parse.py",
    "chars": 9149,
    "preview": "# SPDX-License-Identifier: AGPL-3.0-only\n# Copyright 2026-present the Unsloth AI Inc. team. All rights reserved. See /st"
  },
  {
    "path": "studio/backend/core/data_recipe/jobs/types.py",
    "chars": 2154,
    "preview": "# SPDX-License-Identifier: AGPL-3.0-only\n# Copyright 2026-present the Unsloth AI Inc. team. All rights reserved. See /st"
  },
  {
    "path": "studio/backend/core/data_recipe/jobs/worker.py",
    "chars": 7844,
    "preview": "# SPDX-License-Identifier: AGPL-3.0-only\n# Copyright 2026-present the Unsloth AI Inc. team. All rights reserved. See /st"
  },
  {
    "path": "studio/backend/core/data_recipe/jsonable.py",
    "chars": 3752,
    "preview": "# SPDX-License-Identifier: AGPL-3.0-only\n# Copyright 2026-present the Unsloth AI Inc. team. All rights reserved. See /st"
  },
  {
    "path": "studio/backend/core/data_recipe/local_callable_validators.py",
    "chars": 10659,
    "preview": "# SPDX-License-Identifier: AGPL-3.0-only\n# Copyright 2026-present the Unsloth AI Inc. team. All rights reserved. See /st"
  },
  {
    "path": "studio/backend/core/data_recipe/oxc-validator/package.json",
    "chars": 186,
    "preview": "{\n  \"name\": \"unsloth-oxc-validator-runtime\",\n  \"private\": true,\n  \"version\": \"0.0.1\",\n  \"type\": \"module\",\n  \"dependencie"
  },
  {
    "path": "studio/backend/core/data_recipe/oxc-validator/validate.mjs",
    "chars": 15098,
    "preview": "// SPDX-License-Identifier: AGPL-3.0-only\n// Copyright 2026-present the Unsloth AI Inc. team. All rights reserved. See /"
  },
  {
    "path": "studio/backend/core/data_recipe/service.py",
    "chars": 10010,
    "preview": "# SPDX-License-Identifier: AGPL-3.0-only\n# Copyright 2026-present the Unsloth AI Inc. team. All rights reserved. See /st"
  },
  {
    "path": "studio/backend/core/export/__init__.py",
    "chars": 654,
    "preview": "# SPDX-License-Identifier: AGPL-3.0-only\n# Copyright 2026-present the Unsloth AI Inc. team. All rights reserved. See /st"
  },
  {
    "path": "studio/backend/core/export/export.py",
    "chars": 25740,
    "preview": "# SPDX-License-Identifier: AGPL-3.0-only\n# Copyright 2026-present the Unsloth AI Inc. team. All rights reserved. See /st"
  },
  {
    "path": "studio/backend/core/export/orchestrator.py",
    "chars": 13746,
    "preview": "# SPDX-License-Identifier: AGPL-3.0-only\n# Copyright 2026-present the Unsloth AI Inc. team. All rights reserved. See /st"
  },
  {
    "path": "studio/backend/core/export/worker.py",
    "chars": 13270,
    "preview": "# SPDX-License-Identifier: AGPL-3.0-only\n# Copyright 2026-present the Unsloth AI Inc. team. All rights reserved. See /st"
  },
  {
    "path": "studio/backend/core/inference/__init__.py",
    "chars": 785,
    "preview": "# SPDX-License-Identifier: AGPL-3.0-only\n# Copyright 2026-present the Unsloth AI Inc. team. All rights reserved. See /st"
  },
  {
    "path": "studio/backend/core/inference/audio_codecs.py",
    "chars": 12718,
    "preview": "# SPDX-License-Identifier: AGPL-3.0-only\n# Copyright 2026-present the Unsloth AI Inc. team. All rights reserved. See /st"
  },
  {
    "path": "studio/backend/core/inference/defaults.py",
    "chars": 973,
    "preview": "# SPDX-License-Identifier: AGPL-3.0-only\n# Copyright 2026-present the Unsloth AI Inc. team. All rights reserved. See /st"
  },
  {
    "path": "studio/backend/core/inference/inference.py",
    "chars": 83069,
    "preview": "# SPDX-License-Identifier: AGPL-3.0-only\n# Copyright 2026-present the Unsloth AI Inc. team. All rights reserved. See /st"
  },
  {
    "path": "studio/backend/core/inference/llama_cpp.py",
    "chars": 83857,
    "preview": "# SPDX-License-Identifier: AGPL-3.0-only\n# Copyright 2026-present the Unsloth AI Inc. team. All rights reserved. See /st"
  },
  {
    "path": "studio/backend/core/inference/orchestrator.py",
    "chars": 41191,
    "preview": "# SPDX-License-Identifier: AGPL-3.0-only\n# Copyright 2026-present the Unsloth AI Inc. team. All rights reserved. See /st"
  },
  {
    "path": "studio/backend/core/inference/tools.py",
    "chars": 16965,
    "preview": "# SPDX-License-Identifier: AGPL-3.0-only\n# Copyright 2026-present the Unsloth AI Inc. team. All rights reserved. See /st"
  },
  {
    "path": "studio/backend/core/inference/worker.py",
    "chars": 23233,
    "preview": "# SPDX-License-Identifier: AGPL-3.0-only\n# Copyright 2026-present the Unsloth AI Inc. team. All rights reserved. See /st"
  },
  {
    "path": "studio/backend/core/training/__init__.py",
    "chars": 379,
    "preview": "# SPDX-License-Identifier: AGPL-3.0-only\n# Copyright 2026-present the Unsloth AI Inc. team. All rights reserved. See /st"
  },
  {
    "path": "studio/backend/core/training/trainer.py",
    "chars": 147116,
    "preview": "# SPDX-License-Identifier: AGPL-3.0-only\n# Copyright 2026-present the Unsloth AI Inc. team. All rights reserved. See /st"
  },
  {
    "path": "studio/backend/core/training/training.py",
    "chars": 23824,
    "preview": "# SPDX-License-Identifier: AGPL-3.0-only\n# Copyright 2026-present the Unsloth AI Inc. team. All rights reserved. See /st"
  },
  {
    "path": "studio/backend/core/training/worker.py",
    "chars": 38988,
    "preview": "# SPDX-License-Identifier: AGPL-3.0-only\n# Copyright 2026-present the Unsloth AI Inc. team. All rights reserved. See /st"
  },
  {
    "path": "studio/backend/loggers/.gitkeep",
    "chars": 0,
    "preview": ""
  },
  {
    "path": "studio/backend/loggers/__init__.py",
    "chars": 202,
    "preview": "# SPDX-License-Identifier: AGPL-3.0-only\n# Copyright 2026-present the Unsloth AI Inc. team. All rights reserved. See /st"
  },
  {
    "path": "studio/backend/loggers/config.py",
    "chars": 3004,
    "preview": "# SPDX-License-Identifier: AGPL-3.0-only\n# Copyright 2026-present the Unsloth AI Inc. team. All rights reserved. See /st"
  },
  {
    "path": "studio/backend/loggers/handlers.py",
    "chars": 3177,
    "preview": "# SPDX-License-Identifier: AGPL-3.0-only\n# Copyright 2026-present the Unsloth AI Inc. team. All rights reserved. See /st"
  },
  {
    "path": "studio/backend/main.py",
    "chars": 11793,
    "preview": "# SPDX-License-Identifier: AGPL-3.0-only\n# Copyright 2026-present the Unsloth AI Inc. team. All rights reserved. See /st"
  },
  {
    "path": "studio/backend/models/.gitkeep",
    "chars": 0,
    "preview": ""
  },
  {
    "path": "studio/backend/models/__init__.py",
    "chars": 2706,
    "preview": "# SPDX-License-Identifier: AGPL-3.0-only\n# Copyright 2026-present the Unsloth AI Inc. team. All rights reserved. See /st"
  },
  {
    "path": "studio/backend/models/auth.py",
    "chars": 1496,
    "preview": "# SPDX-License-Identifier: AGPL-3.0-only\n# Copyright 2026-present the Unsloth AI Inc. team. All rights reserved. See /st"
  },
  {
    "path": "studio/backend/models/data_recipe.py",
    "chars": 3227,
    "preview": "# SPDX-License-Identifier: AGPL-3.0-only\n# Copyright 2026-present the Unsloth AI Inc. team. All rights reserved. See /st"
  },
  {
    "path": "studio/backend/models/datasets.py",
    "chars": 3295,
    "preview": "# SPDX-License-Identifier: AGPL-3.0-only\n# Copyright 2026-present the Unsloth AI Inc. team. All rights reserved. See /st"
  },
  {
    "path": "studio/backend/models/export.py",
    "chars": 4115,
    "preview": "# SPDX-License-Identifier: AGPL-3.0-only\n# Copyright 2026-present the Unsloth AI Inc. team. All rights reserved. See /st"
  },
  {
    "path": "studio/backend/models/inference.py",
    "chars": 14168,
    "preview": "# SPDX-License-Identifier: AGPL-3.0-only\n# Copyright 2026-present the Unsloth AI Inc. team. All rights reserved. See /st"
  },
  {
    "path": "studio/backend/models/models.py",
    "chars": 6920,
    "preview": "# SPDX-License-Identifier: AGPL-3.0-only\n# Copyright 2026-present the Unsloth AI Inc. team. All rights reserved. See /st"
  },
  {
    "path": "studio/backend/models/responses.py",
    "chars": 2448,
    "preview": "# SPDX-License-Identifier: AGPL-3.0-only\n# Copyright 2026-present the Unsloth AI Inc. team. All rights reserved. See /st"
  },
  {
    "path": "studio/backend/models/training.py",
    "chars": 8711,
    "preview": "# SPDX-License-Identifier: AGPL-3.0-only\n# Copyright 2026-present the Unsloth AI Inc. team. All rights reserved. See /st"
  },
  {
    "path": "studio/backend/models/users.py",
    "chars": 925,
    "preview": "# SPDX-License-Identifier: AGPL-3.0-only\n# Copyright 2026-present the Unsloth AI Inc. team. All rights reserved. See /st"
  },
  {
    "path": "studio/backend/plugins/__init__.py",
    "chars": 0,
    "preview": ""
  },
  {
    "path": "studio/backend/plugins/data-designer-unstructured-seed/__init__.py",
    "chars": 142,
    "preview": "# SPDX-License-Identifier: AGPL-3.0-only\n# Copyright 2026-present the Unsloth AI Inc. team. All rights reserved. See /st"
  },
  {
    "path": "studio/backend/plugins/data-designer-unstructured-seed/pyproject.toml",
    "chars": 701,
    "preview": "# SPDX-License-Identifier: AGPL-3.0-only\n# Copyright 2026-present the Unsloth AI Inc. team. All rights reserved. See /st"
  },
  {
    "path": "studio/backend/plugins/data-designer-unstructured-seed/src/data_designer_unstructured_seed/__init__.py",
    "chars": 721,
    "preview": "# SPDX-License-Identifier: AGPL-3.0-only\n# Copyright 2026-present the Unsloth AI Inc. team. All rights reserved. See /st"
  },
  {
    "path": "studio/backend/plugins/data-designer-unstructured-seed/src/data_designer_unstructured_seed/chunking.py",
    "chars": 5371,
    "preview": "# SPDX-License-Identifier: AGPL-3.0-only\n# Copyright 2026-present the Unsloth AI Inc. team. All rights reserved. See /st"
  },
  {
    "path": "studio/backend/plugins/data-designer-unstructured-seed/src/data_designer_unstructured_seed/config.py",
    "chars": 1408,
    "preview": "# SPDX-License-Identifier: AGPL-3.0-only\n# Copyright 2026-present the Unsloth AI Inc. team. All rights reserved. See /st"
  },
  {
    "path": "studio/backend/plugins/data-designer-unstructured-seed/src/data_designer_unstructured_seed/impl.py",
    "chars": 853,
    "preview": "# SPDX-License-Identifier: AGPL-3.0-only\n# Copyright 2026-present the Unsloth AI Inc. team. All rights reserved. See /st"
  },
  {
    "path": "studio/backend/plugins/data-designer-unstructured-seed/src/data_designer_unstructured_seed/plugin.py",
    "chars": 465,
    "preview": "# SPDX-License-Identifier: AGPL-3.0-only\n# Copyright 2026-present the Unsloth AI Inc. team. All rights reserved. See /st"
  },
  {
    "path": "studio/backend/requirements/__init__.py",
    "chars": 142,
    "preview": "# SPDX-License-Identifier: AGPL-3.0-only\n# Copyright 2026-present the Unsloth AI Inc. team. All rights reserved. See /st"
  },
  {
    "path": "studio/backend/requirements/base.txt",
    "chars": 44,
    "preview": "# Core unsloth packages\nunsloth-zoo\nunsloth\n"
  },
  {
    "path": "studio/backend/requirements/extras-no-deps.txt",
    "chars": 357,
    "preview": "# Audio extras (installed with --no-deps --no-cache-dir)\ndescript-audio-codec\ndescript-audiotools\njulius\ntorchcodec\nsnac"
  },
  {
    "path": "studio/backend/requirements/extras.txt",
    "chars": 960,
    "preview": "# OpenEnv dependencies\ntomli\ntomli-w\n\n# ExecuTorch dependencies\nruamel.yaml\n# coremltools                    # 10.2 MB -"
  },
  {
    "path": "studio/backend/requirements/overrides.txt",
    "chars": 133,
    "preview": "# Torch AO overrides (installed with --force-reinstall --no-cache-dir)\ntorchao==0.14.0\npytorch_tokenizers\n\n# Kernel pack"
  },
  {
    "path": "studio/backend/requirements/single-env/constraints.txt",
    "chars": 300,
    "preview": "# Single-env pins for unsloth + studio + data-designer\n# Keep compatible with unsloth transformers bounds.\ntransformers="
  },
  {
    "path": "studio/backend/requirements/single-env/data-designer-deps.txt",
    "chars": 497,
    "preview": "# Data Designer runtime deps installed explicitly (single-env mode).\n# DuckDB 1.5 removed Relation.record_batch(); keep "
  },
  {
    "path": "studio/backend/requirements/single-env/data-designer.txt",
    "chars": 146,
    "preview": "# Install Data Designer in same env as Unsloth.\ndata-designer==0.5.2\ndata-designer-config==0.5.2\ndata-designer-engine==0"
  },
  {
    "path": "studio/backend/requirements/single-env/patch_metadata.py",
    "chars": 2014,
    "preview": "#!/usr/bin/env python3\n# SPDX-License-Identifier: AGPL-3.0-only\n# Copyright 2026-present the Unsloth AI Inc. team. All r"
  },
  {
    "path": "studio/backend/requirements/studio.txt",
    "chars": 273,
    "preview": "# Studio UI backend dependencies\ntyper\nfastapi\nuvicorn\npydantic\nmatplotlib\npandas\nnest_asyncio\ndatasets==4.3.0\npyjwt\neas"
  },
  {
    "path": "studio/backend/requirements/triton-kernels.txt",
    "chars": 169,
    "preview": "# Triton kernels (installed with --no-deps, from source)\ntriton_kernels @ git+https://github.com/triton-lang/triton.git@"
  },
  {
    "path": "studio/backend/routes/.gitkeep",
    "chars": 0,
    "preview": ""
  },
  {
    "path": "studio/backend/routes/__init__.py",
    "chars": 705,
    "preview": "# SPDX-License-Identifier: AGPL-3.0-only\n# Copyright 2026-present the Unsloth AI Inc. team. All rights reserved. See /st"
  },
  {
    "path": "studio/backend/routes/auth.py",
    "chars": 4662,
    "preview": "# SPDX-License-Identifier: AGPL-3.0-only\n# Copyright 2026-present the Unsloth AI Inc. team. All rights reserved. See /st"
  },
  {
    "path": "studio/backend/routes/data_recipe/__init__.py",
    "chars": 873,
    "preview": "# SPDX-License-Identifier: AGPL-3.0-only\n# Copyright 2026-present the Unsloth AI Inc. team. All rights reserved. See /st"
  },
  {
    "path": "studio/backend/routes/data_recipe/jobs.py",
    "chars": 7409,
    "preview": "# SPDX-License-Identifier: AGPL-3.0-only\n# Copyright 2026-present the Unsloth AI Inc. team. All rights reserved. See /st"
  },
  {
    "path": "studio/backend/routes/data_recipe/mcp.py",
    "chars": 2632,
    "preview": "# SPDX-License-Identifier: AGPL-3.0-only\n# Copyright 2026-present the Unsloth AI Inc. team. All rights reserved. See /st"
  },
  {
    "path": "studio/backend/routes/data_recipe/seed.py",
    "chars": 11829,
    "preview": "# SPDX-License-Identifier: AGPL-3.0-only\n# Copyright 2026-present the Unsloth AI Inc. team. All rights reserved. See /st"
  },
  {
    "path": "studio/backend/routes/data_recipe/validate.py",
    "chars": 3058,
    "preview": "# SPDX-License-Identifier: AGPL-3.0-only\n# Copyright 2026-present the Unsloth AI Inc. team. All rights reserved. See /st"
  },
  {
    "path": "studio/backend/routes/datasets.py",
    "chars": 20537,
    "preview": "# SPDX-License-Identifier: AGPL-3.0-only\n# Copyright 2026-present the Unsloth AI Inc. team. All rights reserved. See /st"
  },
  {
    "path": "studio/backend/routes/export.py",
    "chars": 10308,
    "preview": "# SPDX-License-Identifier: AGPL-3.0-only\n# Copyright 2026-present the Unsloth AI Inc. team. All rights reserved. See /st"
  },
  {
    "path": "studio/backend/routes/inference.py",
    "chars": 60456,
    "preview": "# SPDX-License-Identifier: AGPL-3.0-only\n# Copyright 2026-present the Unsloth AI Inc. team. All rights reserved. See /st"
  },
  {
    "path": "studio/backend/routes/models.py",
    "chars": 39406,
    "preview": "# SPDX-License-Identifier: AGPL-3.0-only\n# Copyright 2026-present the Unsloth AI Inc. team. All rights reserved. See /st"
  },
  {
    "path": "studio/backend/routes/training.py",
    "chars": 33011,
    "preview": "# SPDX-License-Identifier: AGPL-3.0-only\n# Copyright 2026-present the Unsloth AI Inc. team. All rights reserved. See /st"
  },
  {
    "path": "studio/backend/run.py",
    "chars": 9227,
    "preview": "# SPDX-License-Identifier: AGPL-3.0-only\n# Copyright 2026-present the Unsloth AI Inc. team. All rights reserved. See /st"
  },
  {
    "path": "studio/backend/state/.gitkeep",
    "chars": 0,
    "preview": ""
  },
  {
    "path": "studio/backend/state/__init__.py",
    "chars": 142,
    "preview": "# SPDX-License-Identifier: AGPL-3.0-only\n# Copyright 2026-present the Unsloth AI Inc. team. All rights reserved. See /st"
  },
  {
    "path": "studio/backend/tests/__init__.py",
    "chars": 142,
    "preview": "# SPDX-License-Identifier: AGPL-3.0-only\n# Copyright 2026-present the Unsloth AI Inc. team. All rights reserved. See /st"
  },
  {
    "path": "studio/backend/tests/conftest.py",
    "chars": 574,
    "preview": "# SPDX-License-Identifier: AGPL-3.0-only\n# Copyright 2026-present the Unsloth AI Inc. team. All rights reserved. See /st"
  },
  {
    "path": "studio/backend/tests/test_data_recipe_seed.py",
    "chars": 416,
    "preview": "# SPDX-License-Identifier: AGPL-3.0-only\n# Copyright 2026-present the Unsloth AI Inc. team. All rights reserved. See /st"
  },
  {
    "path": "studio/backend/tests/test_utils.py",
    "chars": 12448,
    "preview": "# SPDX-License-Identifier: AGPL-3.0-only\n# Copyright 2026-present the Unsloth AI Inc. team. All rights reserved. See /st"
  },
  {
    "path": "studio/backend/utils/.gitkeep",
    "chars": 0,
    "preview": ""
  },
  {
    "path": "studio/backend/utils/__init__.py",
    "chars": 142,
    "preview": "# SPDX-License-Identifier: AGPL-3.0-only\n# Copyright 2026-present the Unsloth AI Inc. team. All rights reserved. See /st"
  },
  {
    "path": "studio/backend/utils/cache_cleanup.py",
    "chars": 1240,
    "preview": "# SPDX-License-Identifier: AGPL-3.0-only\n# Copyright 2026-present the Unsloth AI Inc. team. All rights reserved. See /st"
  },
  {
    "path": "studio/backend/utils/datasets/__init__.py",
    "chars": 2859,
    "preview": "# SPDX-License-Identifier: AGPL-3.0-only\n# Copyright 2026-present the Unsloth AI Inc. team. All rights reserved. See /st"
  },
  {
    "path": "studio/backend/utils/datasets/chat_templates.py",
    "chars": 16501,
    "preview": "# SPDX-License-Identifier: AGPL-3.0-only\n# Copyright 2026-present the Unsloth AI Inc. team. All rights reserved. See /st"
  },
  {
    "path": "studio/backend/utils/datasets/data_collators.py",
    "chars": 6077,
    "preview": "# SPDX-License-Identifier: AGPL-3.0-only\n# Copyright 2026-present the Unsloth AI Inc. team. All rights reserved. See /st"
  },
  {
    "path": "studio/backend/utils/datasets/dataset_utils.py",
    "chars": 45180,
    "preview": "# SPDX-License-Identifier: AGPL-3.0-only\n# Copyright 2026-present the Unsloth AI Inc. team. All rights reserved. See /st"
  },
  {
    "path": "studio/backend/utils/datasets/format_conversion.py",
    "chars": 32756,
    "preview": "# SPDX-License-Identifier: AGPL-3.0-only\n# Copyright 2026-present the Unsloth AI Inc. team. All rights reserved. See /st"
  }
]

// ... and 559 more files (download for full content)

About this extraction

This page contains the full source code of the unslothai/unsloth GitHub repository, extracted and formatted as plain text for AI agents and large language models (LLMs). The extraction includes 759 files (5.8 MB), approximately 1.6M tokens, and a symbol index with 3574 extracted functions, classes, methods, constants, and types. Use this with OpenClaw, Claude, ChatGPT, Cursor, Windsurf, or any other AI tool that accepts text input. You can copy the full output to your clipboard or download it as a .txt file.

Extracted by GitExtract — free GitHub repo to text converter for AI. Built by Nikandr Surkov.

Copied to clipboard!