Instructions to use mlx-community/Ornith-1.0-9B-OptiQ-6bit with libraries, inference providers, notebooks, and local apps. Follow these links to get started.
- Libraries
- MLX
How to use mlx-community/Ornith-1.0-9B-OptiQ-6bit 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("mlx-community/Ornith-1.0-9B-OptiQ-6bit") config = load_config("mlx-community/Ornith-1.0-9B-OptiQ-6bit") # 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 mlx-community/Ornith-1.0-9B-OptiQ-6bit with Pi:
Start the MLX server
# Install MLX LM: uv tool install mlx-lm # Start a local OpenAI-compatible server: mlx_lm.server --model "mlx-community/Ornith-1.0-9B-OptiQ-6bit"
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": "mlx-community/Ornith-1.0-9B-OptiQ-6bit" } ] } } }Run Pi
# Start Pi in your project directory: pi
- OpenClaw new
How to use mlx-community/Ornith-1.0-9B-OptiQ-6bit with OpenClaw:
Start the MLX server
# Install MLX LM: uv tool install mlx-lm # Start a local OpenAI-compatible server: mlx_lm.server --model "mlx-community/Ornith-1.0-9B-OptiQ-6bit"
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 "mlx-community/Ornith-1.0-9B-OptiQ-6bit" \ --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"
- Hermes Agent
How to use mlx-community/Ornith-1.0-9B-OptiQ-6bit 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 "mlx-community/Ornith-1.0-9B-OptiQ-6bit"
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 mlx-community/Ornith-1.0-9B-OptiQ-6bit
Run Hermes
hermes
mlx-community/Ornith-1.0-9B-OptiQ-6bit
A 6-bit mixed-precision MLX quant of ornith-ai/Ornith-1.0-9B, built on the Qwen3.5-9B architecture. Sensitive layers are kept at 8-bit and robust ones at 6-bit.
18.8 GB of bf16 weights become 9.06 GB, of which 8.15 GB is the quantized language tower and 0.91 GB the bf16 vision tower.
Built at the request of a discussion on the 4-bit card asking for a quality-first variant. If you are choosing between the two, this one costs 1.0 GB more on disk and puts every layer at least two bits above the 4-bit variant's floor.
Sizes here are decimal GB, matching what the Hub sidebar reports.
Image input works. The vision tower is kept at bf16 in a sidecar, so this quant takes images as well as text.
Quantization details
| Property | Value |
|---|---|
| Predominant precision | 6-bit |
| Layers at 8-bit (sensitive) | 117 |
| Layers at 6-bit (robust) | 133 |
| Total quantized layers | 250 |
| Weighted mean bits per weight, quantized tensors | 6.626 |
| Effective bpw, language tower on disk | 7.284 |
| Effective bpw, whole artifact incl. vision | 8.099 |
| Group size | 64 |
| Mode | affine |
| Quantized params | 8,952,741,888 |
| Vision tower | bf16, 333 tensors, in optiq/optiq_vision.safetensors |
| Size on disk | 9.06 GB, from an 18.8 GB bf16 base |
Following the naming convention llama.cpp uses for Q4_K_M and similar mixed
quants, the "6-bit" label is the predominant precision, not the weighted
average.
The three bpw figures differ for two separate reasons, both worth being explicit about. 6.626 is the weighted mean over the quantized tensors themselves. 7.284 adds what the packed format costs on disk: per-group scales and biases, plus 177 bf16 tensors (norms and biases, 1.06 M params) that are never quantized. 8.099 adds the bf16 vision tower, which is not quantized at all, by design, as in every OptiQ VLM.
Verified: 250 quantized tensors, U32 elements * (32 / bits) summing to exactly
8,952,741,888 params.
How the bit-widths were chosen
By structural rules (--method static), not by measurement. mlx-optiq
assigns bits from architectural position: embeddings and output head, first and
last block, attention over dense MLP. Same method as
Qwen3.5-122B-A10B-OptiQ-2bit
and Mistral-Small-4-119B-2603-OptiQ-2bit.
This differs from the 4-bit variant, which transferred a KL-divergence sensitivity map from Qwen3.5-9B. Neither is a sensitivity sweep measured on Ornith's own weights. We started one and abandoned it, for a reason worth stating:
At candidate bits 6 and 8, the measured per-layer KL gap between the two is
3-5%, against roughly an order of magnitude for 4 vs 8. Worse, the sweep on
32 GB of RAM has to run in uniform_4bit reference mode (mlx-optiq requires the
bf16 checkpoint to fit in 70% of available RAM, so 18.8 GB of weights needs
~26.9 GB free), so KL is measured against a 4-bit
baseline that is worse than both candidates. That works when one candidate is
the baseline and you are measuring the gain from upgrading; at 6 vs 8 the
difference sinks into calibration noise. An 8-hour sweep would have produced a
layer ranking driven by noise, and a card claiming it was measured. Structural
rules with an honest label are the better artifact.
If you want the measurement, it needs a machine that fits the bf16 reference.
Fidelity
Weight-level, measured by dequantizing every quantized tensor out of this artifact and comparing against the bf16 source tensor by tensor. No prompts, no sampling, hardware-independent.
| Group | Tensors | Params | rel L2 | SNR |
|---|---|---|---|---|
| 8-bit layers | 117 | 3.50 B | 0.742% | 42.59 dB |
| 6-bit layers | 133 | 5.45 B | 2.266% | 32.89 dB |
| All | 250 | 8.95 B | 1.771% | 35.04 dB |
Worst single-element error across all 250 tensors: 0.0117.
The 8-bit figure is the sanity check. Affine 8-bit at group size 64 lands at 42.6-42.7 dB across every architecture we have measured, and 42.59 dB here says the conversion is sound. The 0.742% relative error also matches the 0.7% the 4-bit card reports for its own 8-bit layers.
Throughput
M-series, 32 GB unified memory, mlx-lm text path:
| Metric | Value |
|---|---|
| Decode | 23.1 tok/s |
| Prompt | 12.2 tok/s |
| Time to first token | 1.62 s |
| Peak memory, text | 8.30 GB |
| Peak memory, image + text | 20.93 GB |
| Load time | 4.1 s |
The image path's 20.93 GB peak is on a 760x240 screenshot. Larger images cost more. Text-only fits comfortably in 16 GB; image work on 16 GB will be tight.
Verification
Run on the finished artifact, after conversion:
- Arithmetic.
17*24gives 408, with correct intermediate steps. - Instruction following. "List exactly three primary colors, one per line, no other text" gives three lines, no extra text.
- Code. Correct Python string reversal.
- Multilingual. Spanish prompt answered in Spanish, correctly.
- Image. A synthetic UI screenshot with two buttons and a total: names "SubmitOrder", "Cancel" and "Total: 42.50 USD", all three correct.
- Vision sidecar. Checked tensor by tensor against the sidecar published in the 4-bit repo: 333/333 tensors, identical names, identical shapes, all BF16.
What was not measured
- No task benchmarks. No MMLU, GSM8K, or any harness score. Nothing here claims this quant scores within N% of the source on any benchmark.
- No perplexity or top-1 agreement against bf16. The bf16 control does not fit alongside this model in 32 GB, and our aggregate-perplexity harness has a known defect where one out-of-domain passage dominates the total. Weight-level fidelity above is exact and prompt-independent; it answers a different question than behavioural quality, and does not substitute for it.
- No sensitivity measurement on Ornith's own weights. See above.
- No comparison against the 4-bit variant on the failure the requester reported (skipped instructions, shallower reasoning). Higher bit-widths and a 2.3x lower reconstruction error make it plausible this helps, but we did not measure that specific behaviour, and the fidelity table is not evidence for it.
- Long context untested. All checks were short prompts.
Usage
Text
The sidecar lives in an optiq/ subfolder, so a stock *.safetensors glob
ignores it and mlx-lm sees a clean language model.
pip install mlx-lm
from mlx_lm import load, generate
model, tokenizer = load("mlx-community/Ornith-1.0-9B-OptiQ-6bit")
prompt = tokenizer.apply_chat_template(
[{"role": "user", "content": "Explain the difference between TCP and UDP."}],
add_generation_prompt=True, tokenize=False)
print(generate(model, tokenizer, prompt=prompt, max_tokens=512))
This is a reasoning model: it thinks inside <think>...</think> before
answering, so give it enough max_tokens to finish.
Images
Image input needs mlx-optiq, which loads the bf16
vision sidecar and feeds the merged embeddings to the quantized language tower.
Use 0.4.17 or newer. Versions up to 0.2.18 look for the sidecar only in the
repo root, so they will not find it in optiq/, and their vision-tower prefix
list has no visual. entry, which this architecture needs. Note that a bare
pip install mlx-optiq may resolve to an older version depending on your other
pins, so check optiq.__version__.
pip install "mlx-optiq>=0.4.17"
from PIL import Image
from optiq.runtime.engine import OptiqEngine
engine = OptiqEngine("mlx-community/Ornith-1.0-9B-OptiQ-6bit")
answer = engine.generate("What is in this image?",
images=[Image.open("photo.jpg")], max_tokens=512)
print(answer.text)
The base model ships no MTP head, so this quant has no speculative-decoding
sidecar. OptiqEngine prints MTP weights not found on load and falls back to
autoregressive decoding; that line is expected, not an error.
Sibling variants
Weight sizes, read from the Hub API (.safetensors only, decimal GB):
| Repo | Bits | Weights | Vision |
|---|---|---|---|
| Ornith-1.0-9B-4bit | uniform 4 | 5.95 GB | no |
| Ornith-1.0-9B-OptiQ-4bit | mixed 4/8, 5.209 bpw | 8.01 GB | yes |
| Ornith-1.0-9B-6bit | uniform 6 | 8.19 GB | no |
| this one | mixed 6/8, 6.626 bpw | 9.06 GB | yes |
| Ornith-1.0-9B-8bit | uniform 8 | 10.43 GB | no |
| Ornith-1.0-9B-bf16 | none | 18.82 GB | no |
The two OptiQ rows include an identical 0.91 GB bf16 vision tower, so on the language tower alone this quant is 8.15 GB against the 4-bit's 7.10 GB. That 1.05 GB is the whole cost of moving the 4-bit floor up to 6.
The uniform variants do not carry a vision sidecar. If you need image input, use one of the two OptiQ quants.
Quantization does not change the behaviour or alignment of the base model. Use it under the same terms as the original.
- Downloads last month
- -
4-bit
Model tree for mlx-community/Ornith-1.0-9B-OptiQ-6bit
Base model
ornith-ai/Ornith-1.0-9B