Jais-3-7B (MLX, bf16)
bf16 MLX conversion of IFM/Jais-3-7B, converted from revision edc2801. 18.0 GB on disk. For Apple silicon.
Jais-3-7B is a medium dense Jais-3 model: a 7B decoder-only model with a 512K (524,288-token) context window.
Requirements
mlx-lm doesn't support the k2_horizon architecture (used by Jais-3) yet. Until support lands, this repo ships the MLX model code (k2_horizon.py), which mlx-lm loads through the model_file entry in config.json. So the released mlx-lm works as-is:
pip install -U mlx-lm
Pass --trust-remote-code (or trust_remote_code=True). The file runs on your machine, so read it first if you like; its comments describe how it differs from the PyTorch code.
How it was converted
No quantization: the original bf16 weights in MLX format.
Memory
Peak 18.2 GB for a short prompt. The KV cache grows with the context, so long contexts need more memory; --max-kv-size and KV-cache quantization (--kv-bits 8, where available) reduce it.
Conversion check
Checked against the PyTorch code (modeling_k2_horizon.py) in fp32 on the real weights of this model, on English, code, Arabic and math prompts: the logits match to a relative error of 6e-6 or better, the next-token predictions agree at every position, and greedy decoding with the KV cache gives the same tokens as PyTorch (64/64 on every prompt).
Smoke-tested after conversion with released mlx-lm 0.32.0 on English and Arabic chat prompts: answers end normally (the chat template and stop tokens work).
Benchmarks (all Jais-3-7B MLX variants)
Perplexity on 128 × 512 tokens (WikiText-2 test, and the first articles of the Arabic Wikipedia dump 20231101.ar; lower is better) and generation speed on an Apple M4 Max, all measured the same way:
| bf16 | 8-bit | 4-bit | |
|---|---|---|---|
| Bits/weight | 16.0 | 8.5 | 6.4 |
| Disk | 18.0 GB | 9.6 GB | 7.2 GB |
| Peak memory | 18.2 GB | 9.8 GB | 7.4 GB |
| WikiText-2 perplexity (English) | 12.829 | 12.858 (+0.2%) | 13.372 (+4.2%) |
| Arabic Wikipedia perplexity | 17.332 | 17.350 (+0.1%) | 18.129 (+4.6%) |
| Generation | 28.5 tok/s | 52.7 tok/s | 70.4 tok/s |
Perplexity is a coarse signal. Test the versions on your own workload before picking one.
Usage
mlx_lm.generate --model IFM/Jais-3-7B-MLX-bf16 --trust-remote-code --prompt "ما هي عاصمة الإمارات؟" --max-tokens 2048
from mlx_lm import load, generate
model, tokenizer = load("IFM/Jais-3-7B-MLX-bf16", trust_remote_code=True)
messages = [{"role": "user", "content": "Explain mixture-of-experts in two sentences."}]
prompt = tokenizer.apply_chat_template(messages, add_generation_prompt=True)
print(generate(model, tokenizer, prompt, max_tokens=2048))
mlx_lm.chat and mlx_lm.server take the same --trust-remote-code flag.
The model thinks before it answers, inside <ifm|think> … </ifm|think>. Leave room for that in max_tokens. The effort level is set with reasoning_effort in the chat template: "high" (default), "medium" or "low", e.g. apply_chat_template(messages, add_generation_prompt=True, reasoning_effort="low").
Notes:
- Server output: mlx-lm doesn't recognize the
<ifm|think>tags yet, somlx_lm.serverreturns the thinking text insidecontentrather than in a separatereasoningfield. The tool-call format isn't parsed yet either. - Chat template change: the original template raises an error when an earlier assistant message has no thinking field, which is what OpenAI-style clients send. The template here renders empty thinking for those messages instead. Nothing else was changed.
License
Apache-2.0, inherited from the base model. Refer to the original model card for architecture, benchmarks and intended use.
Citation
@misc{jais3_2026,
title = {Jais 3: Introducing Arabic-centric Agentic AI},
author = {{IFM Team, Inception42 Team, and Cerebras Team}},
year = {2026},
url = {https://ifm.ai/blog/jais3/},
}