Replaces the single "Studio boots, loads a GGUF, answers a chat
completion" job with three parallel jobs that each pick the smallest
model that exercises the surface under test. All three jobs share the
install.sh --local --no-torch bootstrap and prime HF_HOME via
actions/cache so cold-cache runs are bounded and warm runs are quick.
1. Studio GGUF CI / OpenAI, Anthropic API tests
- Model: gemma-3-270m-it UD-Q4_K_XL (~254 MiB).
- Password rotation: login with bootstrap pw, change to a fresh
random pw, assert old pw is rejected with 401, assert new pw
succeeds. Uses the same JWT downstream as a Bearer token against
/v1/* (the OpenAI/Anthropic compat surface accepts JWTs and
sk-unsloth- keys interchangeably).
- OpenAI SDK + Anthropic SDK each run a four-turn conversation
("What is 1+1?" / "What did I ask before?" / "What is the capital
of France?" / "Repeat the city name") with temperature=0.0 and
seed=3407. Run twice and assert run1 == run2 turn-by-turn so
non-determinism in the conversation-history wiring is caught.
2. Studio GGUF CI / tool calling tests
- Model: Qwen3.5-2B UD-IQ3_XXS (~890 MiB).
- Standard OpenAI function calling with tool_choice=required.
- Server-side python tool: assert "56088" appears in the answer to
"What is 123 * 456? Use code to compute it.".
- Server-side terminal (bash) tool: assert "hello-bash-tool" is
echoed back.
- Server-side web_search tool: non-blocking probe (DuckDuckGo
flakes from CI runners). Asserts the request shape is accepted.
- enable_thinking=true vs false: assert <think> markers vanish
when thinking is disabled.
3. Studio GGUF CI / JSON, images
- Model: gemma-4-E2B-it UD-IQ3_XXS (~2.4 GiB) + mmproj-F16
(~986 MiB) auto-detected via the HF repo path.
- response_format = json_schema (strict): asserts the answer parses
as JSON matching the {city, country} schema.
- OpenAI image_url (data URI base64): assert non-empty response on
a 4x4 PNG. Loose on content because small VL quants are weak at
colour names; the vision path is the part under test.
- Anthropic source/base64 image: same non-empty assertion against
the Anthropic Messages endpoint.
Boot strategy:
- Job 1 keeps `UNSLOTH_API_ONLY=1 unsloth studio` because the
password-rotation flow only exists in the UI-mode bootstrap.
- Jobs 2 and 3 use `unsloth studio run --model REPO --gguf-variant V`,
the one-liner that loads the model and prints the API key on the
banner. Health is probed by waiting for `sk-unsloth-` to appear in
the log; the one-liner only prints the banner after load completes.
|
||
|---|---|---|
| .. | ||
| ISSUE_TEMPLATE | ||
| workflows | ||
| CODEOWNERS | ||
| dependabot.yml | ||
| FUNDING.yml | ||