Instructions to use studioburnside/Tess-4-27B-MLX-Q4 with libraries, inference providers, notebooks, and local apps. Follow these links to get started.
- Libraries
- MLX
How to use studioburnside/Tess-4-27B-MLX-Q4 with MLX:
# Make sure mlx-vlm is installed # pip install --upgrade mlx-vlm from mlx_vlm import load, generate from mlx_vlm.prompt_utils import apply_chat_template from mlx_vlm.utils import load_config # Load the model model, processor = load("studioburnside/Tess-4-27B-MLX-Q4") config = load_config("studioburnside/Tess-4-27B-MLX-Q4") # Prepare input image = ["http://images.cocodataset.org/val2017/000000039769.jpg"] prompt = "Describe this image." # Apply chat template formatted_prompt = apply_chat_template( processor, config, prompt, num_images=1 ) # Generate output output = generate(model, processor, formatted_prompt, image) print(output) - Notebooks
- Google Colab
- Kaggle
- Local Apps Settings
- LM Studio
- Pi
How to use studioburnside/Tess-4-27B-MLX-Q4 with Pi:
Start the MLX server
# Install MLX LM: uv tool install mlx-lm # Start a local OpenAI-compatible server: mlx_lm.server --model "studioburnside/Tess-4-27B-MLX-Q4"
Configure the model in Pi
# Install Pi: npm install -g @mariozechner/pi-coding-agent # Add to ~/.pi/agent/models.json: { "providers": { "mlx-lm": { "baseUrl": "http://localhost:8080/v1", "api": "openai-completions", "apiKey": "none", "models": [ { "id": "studioburnside/Tess-4-27B-MLX-Q4" } ] } } }Run Pi
# Start Pi in your project directory: pi
- Hermes Agent new
How to use studioburnside/Tess-4-27B-MLX-Q4 with Hermes Agent:
Start the MLX server
# Install MLX LM: uv tool install mlx-lm # Start a local OpenAI-compatible server: mlx_lm.server --model "studioburnside/Tess-4-27B-MLX-Q4"
Configure Hermes
# Install Hermes: curl -fsSL https://hermes-agent.nousresearch.com/install.sh | bash hermes setup # Point Hermes at the local server: hermes config set model.provider custom hermes config set model.base_url http://127.0.0.1:8080/v1 hermes config set model.default studioburnside/Tess-4-27B-MLX-Q4
Run Hermes
hermes
- OpenClaw new
How to use studioburnside/Tess-4-27B-MLX-Q4 with OpenClaw:
Start the MLX server
# Install MLX LM: uv tool install mlx-lm # Start a local OpenAI-compatible server: mlx_lm.server --model "studioburnside/Tess-4-27B-MLX-Q4"
Configure OpenClaw
# Install OpenClaw: npm install -g openclaw@latest # Register the local server and set it as the default model: openclaw onboard --non-interactive --mode local \ --auth-choice custom-api-key \ --custom-base-url http://127.0.0.1:8080/v1 \ --custom-model-id "studioburnside/Tess-4-27B-MLX-Q4" \ --custom-provider-id mlx-lm \ --custom-compatibility openai \ --custom-text-input \ --accept-risk \ --skip-health
Run OpenClaw
openclaw agent --local --agent main --message "Hello from Hugging Face"
Tess-4-27B — MLX 4-bit, with a working MTP head
A 4-bit MLX conversion of migtissera/Tess-4-27B (Qwen3.6-27B base, dense, vision-capable) — group size 64, affine, 4.695 bits per weight, 16.1 GB — with the native multi-token-prediction head restored as a BF16 sidecar.
Built from the original BF16 release, not by re-quantizing an 8-bit checkpoint, so there is no compounded quantization error.
Sized for a 32 GB Mac. The 8-bit build is at Tess-4-27B-MLX-Q8 (30.4 GB).
What 4-bit actually costs (measured, not guessed)
Same harness, same 3500-token budget, same machine (M5 Max):
| Axis | Q8 | Q4 | Δ |
|---|---|---|---|
| HumanEval+ pass@1 (50-problem subset) | 0.90 | 0.82 | −0.08 |
| MMLU-Pro-style reasoning (40q, 10 options) | 0.80 | 0.85 | +0.05 |
| Tool-calling (20 scenarios) | 0.85 | 0.85 | — |
| Browser action-selection (20 simulated pages) | 0.95 | 0.95 | — |
| RULER-style long-context (8k/16k/32k) | 0.80 | 0.73 | −0.07 |
| Deterministic VQA (10 items) | 1.00 | 1.00 | — |
| My hard screenshot test | 2/2 | 2/2 | — |
| Decode, single stream | 17.3 tok/s | 28.3 tok/s | +64% |
The honest summary: reasoning, tool-use, browser action-selection and vision survive 4-bit intact. Coding loses ~8 points and long-context loses ~7 — the latter is the consistent casualty of quantization in this family, because error compounds across a long attention span and short tasks hide it entirely. In exchange you get 1.64× the decode speed and half the memory.
If your workload is agentic (tool calls, short-to-medium turns, vision), Q4 is close to free. If it leans on long-context recall, pay for Q8.
⚠️ A warning for anyone benchmarking this. My first Q4 run scored 0.36 on code and looked like a catastrophic quantization cliff. It was a 768-token generation cap. For a reasoning model that does not truncate the answer — it truncates the thinking, so the model never emits code at all. The longest generation ended mid-sentence: "Or simply:
return string.swapcase()I'll". Re-run with a 3500-token budget: 0.82. If a quantization result looks like a cliff, check your token budget before you believe it.
The MTP sidecar
mlx-lm's qwen3_5 sanitize() drops mtp.* tensors during conversion, so every
community MLX checkpoint of this family declares mtp_num_hidden_layers: 1 while
containing zero MTP weights. Check model.safetensors.index.json, not the
config.
This repo re-extracts the head from the original BF16 release and ships it at
mtp/weights.safetensors (15 tensors, kept BF16 — quantizing the head collapses
draft acceptance to ~0%, so it stays BF16 even in a 4-bit build).
Acceptance on a 4-bit base is lower than on 8-bit (the head was fitted against BF16 weights), and MTP is worth less than it sounds regardless: on the same model, omlx decodes at 18.4 tok/s with no speculative decoding versus vllm-mlx's 19.4 with it. Take the head because it is free; do not architect around it.
Usage
# omlx (recommended — faster engine, and the only one I trust with large images)
omlx serve --model-dir <dir-containing-this-model>
# vllm-mlx (if you want the MTP head to engage)
vllm-mlx serve <this-repo> --mllm --enable-mtp --mtp-num-draft-tokens 1
# MTP engages only on exactly-greedy requests: temperature=0, top_p=1, top_k=0, min_p=0
Known ecosystem traps
- Do not load MLX-format Qwen3.6 checkpoints with mlx-vlm 0.6.4 — it re-applies
a
+1.0RMSNorm shift to already-converted weights and produces deterministic garbage, silently. Use ≥0.6.5 or ≤0.6.3. - Do not serve large images through vllm-mlx 0.4.0's batched MLLM path — it drops image context and answers anyway, with fabricated detail. Use omlx, or disable continuous batching.
- Do not benchmark with a short generation cap. See the warning above.
Provenance & credits
- Base model: migtissera/Tess-4-27B by Migel Tissera, post-trained atop Qwen/Qwen3.6-27B. All model capabilities are theirs; this repo is packaging.
- Conversion:
mlx_vlm convert(4-bit, gs64) from the BF16 source + BF16 MTP re-attachment. - License: Apache-2.0, inherited from the base model.
Converted and benchmarked as part of a local inference stack for a personal Automated Agentic Software Factory — something I'm building solo and will make publicly available after its limited-alpha phase. Full benchmark data, harnesses and the conversion recipe: https://huggingface.co/datasets/studioburnside/mlx-local-inference-benchmarks.
Questions, results and corrections all welcome in Discussions.
- Downloads last month
- -
4-bit