Skip to content
Open
Show file tree
Hide file tree
Changes from 183 commits
Commits
Show all changes
187 commits
Select commit Hold shift + click to select a range
f7bd05a
Add a simple --version flag (#5516)
melroy89 May 18, 2026
3ff6204
studio: load cached GGUF models when fully offline (#5505)
shimmyshimmer May 18, 2026
2fbbf8a
studio: expose launcher capability bits on unauth /api/health (#5486)
danielhanchen May 18, 2026
4290ab1
Add files via upload
shimmyshimmer May 18, 2026
4065cb9
Add files via upload
shimmyshimmer May 18, 2026
aab371a
studio: tighten sandbox blocklist precision (bash, hf upload, NOFILE)…
danielhanchen May 18, 2026
d79fd92
studio: scope cancel-cleanup to in-flight tmp dirs; walk back tool_ca…
danielhanchen May 18, 2026
62410bf
studio: proxy-aware login rate-limit; allow google favicons in CSP (#…
danielhanchen May 18, 2026
3dd08c8
studio/frontend: wire logout, singleflight refresh, shared 422 helper…
danielhanchen May 18, 2026
a09e70e
tests/studio: lock in Windows GPU detection fix (#5106) with a synthe…
danielhanchen May 18, 2026
5a6e94d
Studio: auto-enable MTP speculative decoding for MTP GGUFs (#5527)
danielhanchen May 18, 2026
fc04809
Studio: warn when llama.cpp prebuilt is too old for MTP (#5528)
danielhanchen May 18, 2026
c690b28
Studio: warn when llama.cpp prebuilt is at least 3 days behind (#5529)
danielhanchen May 18, 2026
3876c87
studio: extend offline DNS auto-detect to inference parent + training…
danielhanchen May 18, 2026
36107ec
Fix ORPO text-only tokenization with processors (#5501)
alkinun May 18, 2026
2678d17
New unsloth button images
shimmyshimmer May 18, 2026
388ade4
fix(studio/worker): inject --gcc-install-dir for HIP source builds on…
h34v3nzc0dex May 18, 2026
11e5b58
studio: gate image input on effective vision capability (#5492)
Etherll May 18, 2026
4c14038
New buttons
shimmyshimmer May 18, 2026
8c335b8
studio/install: fix mac desktop shortcut spawning and lifecycle (#5496)
shimmyshimmer May 18, 2026
c41ce17
studio: add uninstall.sh and document it in README (#5497)
shimmyshimmer May 18, 2026
9b8ee6c
Studio update CI: round-trip install -> update -> uninstall (#5536)
danielhanchen May 18, 2026
7214f59
studio: fix Connections dialog UX issues surfaced by image-gate probe…
danielhanchen May 18, 2026
dff0163
New Buttons
shimmyshimmer May 18, 2026
4716788
studio: add uninstall.ps1 for Windows (#5513)
danielhanchen May 18, 2026
61878c7
Fix num_logits_to_keep regression on transformers >= 4.52 (#5538)
danielhanchen May 18, 2026
c4575ca
Add files via upload
shimmyshimmer May 18, 2026
8958f80
Change buttons
shimmyshimmer May 18, 2026
1e98945
studio: uninstall script (superseded by #5497 / #5513) (#4611)
PTFOPlayer May 18, 2026
08d5f94
Add OpenDocument chat attachments (#5510)
alkinun May 18, 2026
bf4d3f7
studio/frontend: stop showing Generating spinner on empty welcome vie…
shimmyshimmer May 18, 2026
309af17
studio/frontend: swap Hugeicons spokes spinner for CSS ring (#5531)
shimmyshimmer May 18, 2026
b78fe45
studio/frontend: grow chat composer to 16 rows and inset scrollbar (#…
shimmyshimmer May 18, 2026
84d9d56
studio/frontend: make toast and inline error text selectable and copy…
shimmyshimmer May 18, 2026
eb6b0c6
studio: add dismissable toasts with corner close button (#5509)
shimmyshimmer May 18, 2026
80d5aca
studio: install flash-linear-attention and tilelang for Qwen3.5 famil…
danielhanchen May 18, 2026
fe9932a
studio/frontend: soften toast shadow and tighten vertical padding (#5…
shimmyshimmer May 18, 2026
3ebe17f
fast_generate: unify legacy/new logits kwarg + fix Mistral merge site…
danielhanchen May 18, 2026
2bf39de
studio/frontend: hide Current password input on first boot (#5545)
danielhanchen May 18, 2026
525b3b4
tests/studio: tighten MLX smoke gates (loss + round-trip, _on_step gr…
danielhanchen May 18, 2026
d774af2
tests + CI: callback signature drift detector (#5498)
danielhanchen May 18, 2026
eacf448
images: use narrower Discord button and drop duplicate (#5552)
danielhanchen May 18, 2026
aa37431
Versioning
danielhanchen May 18, 2026
c0cc975
fix(studio): handle expired OpenAI shell-tool containers without surf…
rolandtannous May 18, 2026
361f9f9
studio/chat: release stuck IME flag when compositionend never fires (…
wtfashwin May 18, 2026
a2f3793
install scripts: bump unsloth pin to >=2026.5.3 (#5557)
danielhanchen May 18, 2026
4699c7e
studio: engage draft-mtp on vision MTP GGUFs (drop incorrect vision g…
danielhanchen May 18, 2026
f1fcf00
install scripts: bump unsloth pin to >=2026.5.4 (#5566)
danielhanchen May 18, 2026
b7f63d3
fix: derive Playwright default model expectation (#5589)
Imagineer99 May 19, 2026
27845b1
studio: read Playwright default model from defaults.py without import…
danielhanchen May 19, 2026
ba710a7
[pre-commit.ci] pre-commit autoupdate (#5586)
pre-commit-ci[bot] May 19, 2026
c4908b7
studio: fix toast close-button click and light-mode hover (#5597)
shimmyshimmer May 19, 2026
94026fc
fix(loader): honour HF_HUB_OFFLINE / TRANSFORMERS_OFFLINE in from_pre…
xodn348 May 19, 2026
5ce4ab4
studio: emit one comma-chained --spec-type for CPU/Mac MTP path (#5575)
danielhanchen May 19, 2026
66cfbea
Fix loss function not patched for Qwen3.5 models (#5442)
rycerzes May 19, 2026
b01a1ba
Fix GGUF multi-image chat handling (#5508)
alkinun May 19, 2026
f747108
studio: extract tool-call XML parser into a reusable helper module (#…
alkinun May 19, 2026
e4edd34
studio/frontend: reconcile stale must_change_password localStorage fl…
danielhanchen May 19, 2026
f7e8a85
studio/frontend: cap auto-load cascade attempts (#5578)
danielhanchen May 19, 2026
d1681ea
studio: regenerate desktop launcher on `unsloth studio update` (macOS…
danielhanchen May 19, 2026
dd0b557
ci: advisory lockfile supply-chain audit (no install-script changes) …
danielhanchen May 19, 2026
06526f9
loader: import FORCE_FLOAT32 from unsloth_zoo (single source of truth…
danielhanchen May 19, 2026
b7acc14
fix(peft): expose finetune_last_n_layers for parity with mlx-lm CLI (…
danielhanchen May 19, 2026
27d4ace
studio: add --spec-draft-n-max toggle for MTP speculative decoding (#…
danielhanchen May 19, 2026
bef6da5
studio: reserve VRAM headroom for the MTP draft cache in auto-fit (#5…
danielhanchen May 19, 2026
bb4eb88
Studio: tools, thinking blocks, code execution and web search for saf…
danielhanchen May 19, 2026
8d24405
studio/frontend: widen settings sidebar so 'Connections' label fits (…
danielhanchen May 19, 2026
8059f8d
studio: respect prefers-reduced-motion across animations (#5611)
danielhanchen May 19, 2026
7f3661c
studio/frontend: guard message-timing badge against unphysical tok/s …
danielhanchen May 19, 2026
3b08d4a
studio/web: differentiate offline from backend-down in fetch error (#…
danielhanchen May 19, 2026
0fb86e1
studio/frontend: keep theme classes mutually exclusive on <html> (#5580)
danielhanchen May 19, 2026
7b9fcf8
studio/frontend: show Loading fallback instead of blank pane on lazy …
danielhanchen May 19, 2026
75ee380
studio/frontend: include filename in attachment aria-label + img alt …
danielhanchen May 19, 2026
feadfd5
studio/frontend: compare composer blocks send when no model picked (#…
danielhanchen May 19, 2026
cf53ff6
studio: restore focus to opener when settings dialog closes (#5612)
danielhanchen May 19, 2026
7d84499
studio/frontend: add aria-label to Dictate / Stop dictation buttons (…
danielhanchen May 19, 2026
3dbddc3
studio/frontend: settings dialog fits viewport at tablet widths (#5600)
danielhanchen May 19, 2026
ebed646
studio/frontend: show Generation stopped placeholder when cancelled m…
danielhanchen May 19, 2026
07c0377
Versioning
danielhanchen May 19, 2026
af35ed8
studio: tool calling for Llama-3, Mistral, Gemma 4 on safetensors + M…
danielhanchen May 19, 2026
735d26b
Revert "studio: tool calling for Llama-3, Mistral, Gemma 4 on safeten…
danielhanchen May 19, 2026
63d69ee
install: bump unsloth floor to >=2026.5.5 (#5621)
danielhanchen May 19, 2026
6c52697
Studio: persist chat toggles and preserve custom sampling (#5587)
Imagineer99 May 19, 2026
95a638e
Studio: add connections toggle and order hosted providers (#5588)
Imagineer99 May 20, 2026
db3393f
studio/ci: harden three pre-existing CI flakes (#5627)
danielhanchen May 20, 2026
abeabc7
Studio: expand Connections model picker for local inference server (#…
Imagineer99 May 20, 2026
a74a108
Move uninstall scripts into scripts/ and fix references (#5644)
danielhanchen May 20, 2026
155f6de
Studio: provider model loading controls (#5645)
Imagineer99 May 20, 2026
469dbd6
chore: unify connection copy (#5654)
Imagineer99 May 21, 2026
bad5ff4
Remove dead chat suggestions wiring (#5665)
alkinun May 21, 2026
b180ae7
Adding Connect a Provider README changes
shimmyshimmer May 21, 2026
966d3cd
Studio: Claude Code Anthropic API tool compatibility (#5390)
Imagineer99 May 21, 2026
43beeae
studio/frontend: friendlier 404 fallback for unknown routes (#5664)
danielhanchen May 22, 2026
1a21839
chore(deps): bump the npm-oxc-validator group across 1 directory with…
dependabot[bot] May 22, 2026
549e24e
Fix chat send button (#5647)
harryfrzz May 22, 2026
4c26def
studio/frontend: correct Think pill aria-label before model loads (#5…
danielhanchen May 22, 2026
71232f7
studio/frontend: fix onboarding CSP violations (#5658)
danielhanchen May 22, 2026
ac8973c
studio/frontend: set per-route document.title (#5660)
danielhanchen May 22, 2026
d01fed4
Fix Windows workflow issues(#5694)
wasimysaid May 22, 2026
867fe63
Respect GC for GRPO (#5269)
Datta0 May 22, 2026
7482685
studio: unblock /load event loop on detect_audio_type (#5642, #5635) …
danielhanchen May 22, 2026
2e1d0e2
studio: settle GPU VRAM after killing llama-server before the next re…
danielhanchen May 22, 2026
ba9405b
Studio: surface prompt-cache token counts in /v1/chat/completions usa…
danielhanchen May 22, 2026
f399e3b
Studio: per-model Anthropic server-side tool versions (#5679)
danielhanchen May 22, 2026
b8dde0a
Studio: support Anthropic 1h cache TTL via prompt_cache_ttl (#5685)
danielhanchen May 22, 2026
5b41872
Studio: wire OpenAI image_generation tool (#5688)
danielhanchen May 22, 2026
2201fd6
Studio: per-session cost calculator + /api/providers/pricing endpoint…
danielhanchen May 22, 2026
a2d2b78
Studio: wire Anthropic web_fetch server-side tool (#5671)
danielhanchen May 22, 2026
61ed4ca
Studio: persist chat history in backend storage (#5272)
Imagineer99 May 22, 2026
9a737fa
Studio: wire Anthropic server-side context compaction (#5686)
danielhanchen May 22, 2026
e86f3c5
Studio: wire OpenAI Responses server-side context compaction (#5687)
danielhanchen May 22, 2026
ebe504b
Studio: PDF / document attachments for Anthropic + OpenAI (#5689)
danielhanchen May 22, 2026
a226b7e
Studio: reconcile external providers across browsers after delete (#5…
danielhanchen May 22, 2026
228d1cd
Studio: persist external provider selection across page refresh (#5697)
danielhanchen May 22, 2026
51736a7
Studio: add Anthropic and OpenAI prompt guards for disabled tools (#5…
Imagineer99 May 22, 2026
9d3ad3b
Studio: also persist external checkpoint when picker calls setParams …
danielhanchen May 22, 2026
7e0ee4a
Studio: surface OpenAI image_generation as composer Images pill (#5699)
danielhanchen May 22, 2026
b89e28a
Studio: expose Anthropic 5m vs 1h prompt cache TTL in Configuration (…
danielhanchen May 22, 2026
8b235c7
Fix connected chat model persistence (#5702)
wasimysaid May 22, 2026
e9cf735
Studio: render generated images inline for the Images pill (#5705)
danielhanchen May 22, 2026
df2d31f
Truncate long code execution tool output (#5708)
wasimysaid May 22, 2026
ed1e392
fix(gpt-oss): prefer flex attention over sdpa (#5701)
Datta0 May 22, 2026
18c3001
API fixes + pypi
danielhanchen May 22, 2026
382683e
Bump pinned PyPI floor to unsloth>=2026.5.6 (#5716)
danielhanchen May 22, 2026
83b2097
ci: unblock Studio Windows + Linux + Mac smoke (#5741)
danielhanchen May 23, 2026
dfb3eed
ci: broaden Linux + narrow Windows llama.cpp runtime patterns + trim …
danielhanchen May 24, 2026
56e9046
Lower default weight_decay in RL config from 0.01 to 0.001 (#5747)
danielhanchen May 24, 2026
f7f540a
Studio: strip orphan tool_call XML leaking into visible content (#5735)
danielhanchen May 24, 2026
b2b660f
Studio: add local diffusion image generation page
danielhanchen May 24, 2026
a08686c
[pre-commit.ci] auto fixes from pre-commit.com hooks
pre-commit-ci[bot] May 24, 2026
f8504e3
Studio: fix Images page SectionCard required icon prop
danielhanchen May 24, 2026
bf5c4ac
Fix/adjust diffusion review findings for PR #5754
danielhanchen May 24, 2026
669964f
[pre-commit.ci] auto fixes from pre-commit.com hooks
pre-commit-ci[bot] May 24, 2026
d6f2a23
Fix/adjust diffusion lifecycle + UI for PR #5754
danielhanchen May 24, 2026
faa6822
Fix/adjust diffusion symmetric chat handoff for PR #5754
danielhanchen May 24, 2026
8074a2b
Fix/adjust diffusion: smart base, safetensors, peak VRAM, GGUF guard
danielhanchen May 25, 2026
8c10cf5
[pre-commit.ci] auto fixes from pre-commit.com hooks
pre-commit-ci[bot] May 25, 2026
6089720
Fix/adjust diffusion: export unload + sd3.5 alias for PR #5754
danielhanchen May 25, 2026
1601b78
Fix safetensors chat backend unload for PR #5754
danielhanchen May 25, 2026
0f9b19b
[pre-commit.ci] auto fixes from pre-commit.com hooks
pre-commit-ci[bot] May 25, 2026
65f7a26
Fix/adjust diffusion lifecycle for round 3 findings (PR #5754)
danielhanchen May 25, 2026
fbf06be
[pre-commit.ci] auto fixes from pre-commit.com hooks
pre-commit-ci[bot] May 25, 2026
f44b55c
Fix/adjust diffusion: clear stale metadata on failed swap for PR #5754
danielhanchen May 25, 2026
18b50c1
[pre-commit.ci] auto fixes from pre-commit.com hooks
pre-commit-ci[bot] May 25, 2026
0f3ed08
Fix/adjust diffusion: token leak + cache guard + locked status + seed…
danielhanchen May 25, 2026
ec507c5
[pre-commit.ci] auto fixes from pre-commit.com hooks
pre-commit-ci[bot] May 25, 2026
fb0a31b
Fix/adjust diffusion: forward true_cfg_scale on Qwen/Flux for negativ…
danielhanchen May 25, 2026
f3f3f06
Fix/adjust diffusion: pin requests chain in no-deps runtime for PR #5754
danielhanchen May 25, 2026
f06895b
Fix/adjust diffusion: round 5 lifecycle + validation hardening for PR…
danielhanchen May 25, 2026
8858104
[pre-commit.ci] auto fixes from pre-commit.com hooks
pre-commit-ci[bot] May 25, 2026
04de106
Fix/adjust diffusion: round 6 race-free lifecycle + delete guards for…
danielhanchen May 25, 2026
0fd9e90
[pre-commit.ci] auto fixes from pre-commit.com hooks
pre-commit-ci[bot] May 25, 2026
fa8efaf
Fix/adjust diffusion: round 7 swap-aware guards + race-free generate …
danielhanchen May 25, 2026
92eccc3
[pre-commit.ci] auto fixes from pre-commit.com hooks
pre-commit-ci[bot] May 25, 2026
c1f9aac
Fix/adjust diffusion: round 8 async unloads + tighter handoffs for PR…
danielhanchen May 25, 2026
0ae2055
[pre-commit.ci] auto fixes from pre-commit.com hooks
pre-commit-ci[bot] May 25, 2026
1193c81
Fix/adjust diffusion: round 9 shared release helpers + export-active …
danielhanchen May 25, 2026
b34fc62
[pre-commit.ci] auto fixes from pre-commit.com hooks
pre-commit-ci[bot] May 25, 2026
641cdcc
Fix/adjust diffusion: round 10 fix export-active asymmetry + GGUF cha…
danielhanchen May 25, 2026
1698b66
Fix/adjust diffusion: tolerate ExportBackend without is_export_active…
danielhanchen May 25, 2026
4b1b149
Fix/adjust diffusion: round 11 export-active defense-in-depth + state…
danielhanchen May 25, 2026
921c602
[pre-commit.ci] auto fixes from pre-commit.com hooks
pre-commit-ci[bot] May 25, 2026
8b8980a
Fix/adjust diffusion: round 12 local-path GGUF + per-variant delete +…
danielhanchen May 25, 2026
d8b785a
[pre-commit.ci] auto fixes from pre-commit.com hooks
pre-commit-ci[bot] May 25, 2026
ae41bfd
Fix/adjust diffusion: round 13 P1+P2 batch for PR #5754
danielhanchen May 25, 2026
ff98c6d
[pre-commit.ci] auto fixes from pre-commit.com hooks
pre-commit-ci[bot] May 25, 2026
54adfdf
Fix _resolve_local_gguf_child traversal check for Windows for PR #5754
danielhanchen May 25, 2026
f501ab8
[pre-commit.ci] auto fixes from pre-commit.com hooks
pre-commit-ci[bot] May 25, 2026
e03ed3d
Fix/adjust diffusion: round 14 P1+P2 batch for PR #5754
danielhanchen May 25, 2026
a9b3d1a
[pre-commit.ci] auto fixes from pre-commit.com hooks
pre-commit-ci[bot] May 25, 2026
59aa75b
Fix/adjust diffusion: round 15 P1+P2+P3 batch for PR #5754
danielhanchen May 25, 2026
2f9bb69
[pre-commit.ci] auto fixes from pre-commit.com hooks
pre-commit-ci[bot] May 25, 2026
05184ad
Fix llama_cpp source-inspection tests for split load_model for PR #5754
danielhanchen May 25, 2026
7c8f1eb
[pre-commit.ci] auto fixes from pre-commit.com hooks
pre-commit-ci[bot] May 25, 2026
2ef9b0e
Fix/adjust diffusion: round 16 P1+P2 batch for PR #5754
danielhanchen May 25, 2026
e948a96
[pre-commit.ci] auto fixes from pre-commit.com hooks
pre-commit-ci[bot] May 25, 2026
6ac6757
Fix Windows test failures from round 16 changes for PR #5754
danielhanchen May 25, 2026
b841562
ci: restore diffusion-backend Ubuntu/macOS/Windows workflows for staging
danielhanchen May 25, 2026
c79a656
Fix/adjust diffusion: round 17 P1+P2 batch for PR #5754
danielhanchen May 25, 2026
5d9f697
[pre-commit.ci] auto fixes from pre-commit.com hooks
pre-commit-ci[bot] May 25, 2026
56a9386
Fix/adjust diffusion: round 18 P1+P2 batch for PR #5754
danielhanchen May 25, 2026
347be3a
Fix/adjust diffusion: round 19 P1+P2 batch for PR #5754
danielhanchen May 25, 2026
e6436e8
Fix/adjust diffusion: round 20 P1+P2 batch for PR #5754
danielhanchen May 25, 2026
0411c9a
Fix/adjust diffusion: round 21 P1+P2 batch for PR #5754
danielhanchen May 25, 2026
da65106
Fix/adjust diffusion: round 22 P1+P2 batch for PR #5754
danielhanchen May 25, 2026
bf04dc6
Fix/adjust diffusion: round 23 P1+P2 batch for PR #5754
danielhanchen May 25, 2026
7b0eacc
Fix/adjust diffusion: round 24 P1 batch for PR #5754
danielhanchen May 25, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
26 changes: 25 additions & 1 deletion .github/workflows/consolidated-tests-ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -316,6 +316,22 @@ jobs:
run: |
python -m pytest -v --tb=short tests/test_public_api_surface.py

- name: callback signature drift detector (HARD GATE)
# Catches the MLX-style bug from PR #5498: a producer in
# unsloth_zoo (or unsloth) grows a callback arg, but a consumer
# callback def still declares the old arity. The producer's
# try/except swallows the resulting TypeError and the symptom is
# "callback never fires" -- usually diagnosed downstream as a
# confusing assertion several seconds later. This static AST
# check fails fast at PR time. UNSLOTH_ZOO_SRC points at the
# freshly cloned main so the detector sees platform-specific
# submodules (e.g. unsloth_zoo/mlx/) that the released wheel
# may strip.
env:
UNSLOTH_ZOO_SRC: ${{ runner.temp }}/unsloth-zoo
run: |
python -m pytest -v --tb=short tests/test_callback_signature_drift.py

- name: unsloth Bucket-A — CPU tests not in Repo tests (CPU)
# 16 tests across 5 files. They live inside tests/saving/ and
# tests/utils/, both of which Repo tests (CPU) excludes via --ignore
Expand All @@ -340,11 +356,19 @@ jobs:
# cases below auto-skip on a GPU-less runner; deselect them
# explicitly so the no-CUDA outcome is "deselected", not "skipped",
# making intent visible in the report. Env inherited from job block.
#
# test_get_peft_model_passes_finetune_last_n_layers_through is
# deselected because unsloth_zoo/mlx/loader.py at line 2972 calls
# model.trainable_parameters() on the fake-model fixture, which
# the test never stubbed; this fails on every platform regardless
# of CUDA. Tracked upstream as an unsloth_zoo bug; deselecting
# here unblocks unsloth CI until the loader fixture is fixed.
working-directory: ${{ runner.temp }}/unsloth-zoo
run: |
python -m pytest -q --tb=short tests/ \
--deselect tests/test_unsloth_zoo_lora_merge.py::test_active_merge_device_returns_string_on_cuda_host \
--deselect tests/test_unsloth_zoo_lora_merge.py::test_merge_lora_moves_cpu_inputs_to_active_device
--deselect tests/test_unsloth_zoo_lora_merge.py::test_merge_lora_moves_cpu_inputs_to_active_device \
--deselect tests/test_mlx_finetune_last_n_layers.py::test_get_peft_model_passes_finetune_last_n_layers_through

- name: unsloth_zoo — test_apply_fused_lm_head (lives in compiler.py)
# `test_apply_fused_lm_head` lives at unsloth_zoo/compiler.py:1983,
Expand Down
45 changes: 45 additions & 0 deletions .github/workflows/diffusion-backend-macos.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,45 @@
# SPDX-License-Identifier: AGPL-3.0-only
# Staging-only CI: diffusion backend tests on macOS 14 (Apple Silicon).
# Confirms the Pillow / Pydantic / FastAPI import surface works the
# same on darwin-arm64 as on Linux. No GPU; we stub diffusers.

name: Diffusion backend (macOS)

on:
push:
branches: [studio-diffusion-images-staging]
workflow_dispatch:

concurrency:
group: ${{ github.workflow }}-${{ github.ref }}
cancel-in-progress: true

permissions:
contents: read

jobs:
pytest:
runs-on: macos-14
timeout-minutes: 10
steps:
- uses: actions/checkout@v4
with:
persist-credentials: false
- uses: actions/setup-python@v5
with:
python-version: '3.13'
cache: 'pip'
- name: Install minimal backend test deps
run: |
python -m pip install --upgrade pip
pip install pytest pytest-asyncio httpx fastapi pydantic structlog \
pillow loguru python-multipart aiofiles sqlalchemy \
cryptography pyyaml jinja2 'numpy<3' requests
pip install -r studio/backend/requirements/studio.txt
# PyTorch wheels for macOS-arm64 come from the default PyPI
# index; CPU/MPS is fine since the tests stub the pipeline.
pip install 'torch>=2.4,<2.11'
- name: Run diffusion backend + route tests
working-directory: studio/backend
run: |
python -m pytest tests/test_diffusion_backend.py tests/test_diffusion_routes.py -v --tb=short
51 changes: 51 additions & 0 deletions .github/workflows/diffusion-backend-ubuntu.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,51 @@
# SPDX-License-Identifier: AGPL-3.0-only
# Staging-only CI for the Studio diffusion image generation feature.
# Runs the backend unit tests on Ubuntu (CPU). Imports are exercised
# without the heavy diffusers / torch import; the test suite stubs
# diffusers via sys.modules so this stays under two minutes.

name: Diffusion backend (Ubuntu)

on:
push:
branches: [studio-diffusion-images-staging]
workflow_dispatch:

concurrency:
group: ${{ github.workflow }}-${{ github.ref }}
cancel-in-progress: true

permissions:
contents: read

jobs:
pytest:
runs-on: ubuntu-latest
timeout-minutes: 10
strategy:
fail-fast: false
matrix:
python: ['3.10', '3.11', '3.12', '3.13']
steps:
- uses: actions/checkout@v4
with:
persist-credentials: false
- uses: actions/setup-python@v5
with:
python-version: '${{ matrix.python }}'
cache: 'pip'
- name: Install minimal backend test deps
run: |
python -m pip install --upgrade pip
pip install pytest pytest-asyncio httpx fastapi pydantic structlog \
pillow loguru python-multipart aiofiles sqlalchemy \
cryptography pyyaml jinja2 'numpy<3' requests
pip install -r studio/backend/requirements/studio.txt
# diffusion.py imports torch lazily inside load_model and
# generate_image; CPU build is enough to satisfy the import
# since the tests stub the actual pipeline class.
pip install --index-url https://download.pytorch.org/whl/cpu 'torch>=2.4,<2.11'
- name: Run diffusion backend + route tests
working-directory: studio/backend
run: |
python -m pytest tests/test_diffusion_backend.py tests/test_diffusion_routes.py -v --tb=short
47 changes: 47 additions & 0 deletions .github/workflows/diffusion-backend-windows.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,47 @@
# SPDX-License-Identifier: AGPL-3.0-only
# Staging-only CI: diffusion backend tests on Windows latest.
# Mirrors Linux/macOS jobs; runs on a single Python interpreter to
# stay under the 5-concurrent-Windows-runner cap.

name: Diffusion backend (Windows)

on:
push:
branches: [studio-diffusion-images-staging]
workflow_dispatch:

concurrency:
group: ${{ github.workflow }}-${{ github.ref }}
cancel-in-progress: true

permissions:
contents: read

jobs:
pytest:
runs-on: windows-latest
timeout-minutes: 15
steps:
- uses: actions/checkout@v4
with:
persist-credentials: false
- uses: actions/setup-python@v5
with:
python-version: '3.13'
cache: 'pip'
- name: Install minimal backend test deps
shell: pwsh
run: |
python -m pip install --upgrade pip
pip install pytest pytest-asyncio httpx fastapi pydantic structlog `
pillow loguru python-multipart aiofiles sqlalchemy `
cryptography pyyaml jinja2 'numpy<3' requests
pip install -r studio/backend/requirements/studio.txt
# CPU torch on Windows: diffusion.py imports torch lazily and
# the tests stub the pipeline; the CPU wheel is enough.
pip install --index-url https://download.pytorch.org/whl/cpu 'torch>=2.4,<2.11'
- name: Run diffusion backend + route tests
working-directory: studio/backend
shell: pwsh
run: |
python -m pytest tests/test_diffusion_backend.py tests/test_diffusion_routes.py -v --tb=short
79 changes: 79 additions & 0 deletions .github/workflows/lockfile-audit.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,79 @@
# SPDX-License-Identifier: AGPL-3.0-only
# Copyright 2026-present the Unsloth AI Inc. team. All rights reserved.
#
# Fast, focused supply-chain audit of every checked-in lockfile.
#
# Runs scripts/lockfile_supply_chain_audit.py on PRs that touch any
# npm or cargo lockfile, on push to main, and on a daily schedule so
# newly-published IOCs surface even when no PR opens.
#
# Default behavior is "advisory": only public indicator-of-compromise
# strings, known-malicious pinned versions, and structurally broken
# lockfiles fail the build. Structural anomalies (missing integrity,
# non-default registry, etc.) are emitted as GitHub Actions warnings
# but do not block merges. This deliberately keeps the noise floor
# low while still failing the moment a checked-in lockfile starts
# pointing at known-bad bytes.
#
# This workflow is intentionally separate from security-audit.yml:
# - security-audit.yml is the umbrella job (pip-audit + npm audit +
# cargo audit + OSV + Semgrep + secret scanning + SBOM + ...);
# it takes ~25 minutes and runs only when dep manifests change.
# - lockfile-audit.yml is a ~30 second pure-Python parse + grep on
# the lockfiles themselves; it runs on every PR that even nudges
# a lockfile so reviewers always see the audit result inline.

name: Lockfile supply-chain audit

on:
pull_request:
paths:
- 'studio/frontend/package-lock.json'
- 'studio/backend/core/data_recipe/oxc-validator/package-lock.json'
- 'studio/package-lock.json'
- 'studio/src-tauri/Cargo.lock'
- 'scripts/lockfile_supply_chain_audit.py'
- '.github/workflows/lockfile-audit.yml'
push:
branches: [main]
paths:
- 'studio/frontend/package-lock.json'
- 'studio/backend/core/data_recipe/oxc-validator/package-lock.json'
- 'studio/package-lock.json'
- 'studio/src-tauri/Cargo.lock'
- 'scripts/lockfile_supply_chain_audit.py'
- '.github/workflows/lockfile-audit.yml'
schedule:
- cron: '37 5 * * *'
workflow_dispatch:

concurrency:
group: ${{ github.workflow }}-${{ github.ref }}
cancel-in-progress: true

permissions:
contents: read

jobs:
audit:
name: lockfile supply-chain audit
runs-on: ubuntu-latest
timeout-minutes: 5
steps:
- uses: actions/checkout@v4
with:
persist-credentials: false

- uses: actions/setup-python@v5
with:
python-version: '3.12'

- name: Verify audit script parses
run: python3 -c "import ast; ast.parse(open('scripts/lockfile_supply_chain_audit.py').read())"

- name: Run lockfile supply-chain audit
# Default mode: only known-malicious pinned versions, known IOC
# strings, and structurally broken lockfiles fail the build.
# Missing-integrity and other structural anomalies are emitted
# as ::warning:: annotations and do not gate merges.
run: python3 scripts/lockfile_supply_chain_audit.py
2 changes: 1 addition & 1 deletion .github/workflows/release-desktop.yml
Original file line number Diff line number Diff line change
Expand Up @@ -551,7 +551,7 @@ jobs:
- name: Install trusted-signing-cli
if: matrix.platform == 'windows-latest'
run: |
cargo install trusted-signing-cli --version 0.9.0 --locked
cargo install trusted-signing-cli --version 0.10.0 --locked
echo "$env:USERPROFILE\.cargo\bin" | Out-File -FilePath $env:GITHUB_PATH -Encoding utf8 -Append

# ── Windows: verify signing CLI is accessible ──
Expand Down
Loading
Loading