Metis-1.6 Praxis

Technical report  ·  Metis-1.6  ·  Lernex  ·  X

Metis-1.6 Praxis

Metis-1.6 Praxis is a 2.94B-parameter reasoning model that thinks twice: every token runs through its hybrid Mamba-2 and attention mixture-of-experts stack two times, with the same weights, touching just 0.46B parameters on each pass. I built it from scratch and trained it on 1.02 trillion tokens, and it is small enough to run on a laptop. It reaches 78.80% on MATH-500, 60.31% on AMC 2023 and 31.25% on AIME 2026, and with under 1B active parameters per token it outscores models that activate seven to twelve times as many in mathematics, which puts it on the Pareto frontier for compute. It is not a frontier model: knowledge, code and long context are where its size shows most. It thinks or answers directly, on request, across a 131,072-token context, and it is yours under Apache 2.0.

Benchmarks

Praxis in thinking and direct mode (Think | Direct) beside the post-trained releases of the 16 open models from the Praxis Base comparison set, with Metis-1.6 Logos for scale. Every model ran on the same harness, with the same prompts and scorers. The picker narrows the table to the models you choose, and bold marks the best score among the models in view. The Weighted score counts each capability once, reasoning first, after taking out what a random guess would score; Average weights every row equally. - means a benchmark does not apply.

Metis-1.6 Praxis (Think | Direct)vsall 17 modelsMetis-1.6 LogosQwen3.5 4BQwen3 4BNanbeige4.2 3BMinistral 3 3BGranite 4.1 3BFalcon-H1 3BOuro 1.4BGemma 4 E4BSmolLM3 3BLFM2.5 2.6BGemma 3 4BQwen3.5 2BLlama 3.2 3BGemma 4 E2BQwen3.5 0.8BOuro 2.6B
Pick any to compare with Metis-1.6 Praxis; pick none to see every model. Metis-1.6 columns report Think | Direct scores.
Metis-1.6
Praxis
(Think | Direct)
Metis-1.6
Logos
Qwen3.5
4B
Qwen3
4B
Nanbeige4.2
3B
Ministral 3
3B
Granite 4.1
3B
Falcon-H1
3B
Ouro
1.4B
Gemma 4
E4B
SmolLM3
3B
LFM2.5
2.6B
Gemma 3
4B
Qwen3.5
2B
Llama 3.2
3B
Gemma 4
E2B
Qwen3.5
0.8B
Ouro
2.6B
# Params2.94B10.23B4.21B4.02B4.17B3.43B3.40B3.15B1.43B7.52B3.08B2.70B3.88B1.88B3.21B4.65B0.752B2.67B
# Activated params, per pass0.464B1.18B3.57B3.63B3.15B3.03B3.15B2.81B1.23B4.03B2.81B2.44B3.21B1.37B2.82B1.90B0.498B2.47B
# Activated params, total0.94B2.37B3.57B3.63B6.30B3.03B3.15B2.81B4.93B4.03B2.81B2.44B3.21B1.37B2.82B1.90B0.498B9.87B
Context131K131K256K32K128K256K128K128K64K128K64K125K128K256K128K128K256K64K
Training tokens1.02T1.02Tundisclosed36T28T1-3T14.9T2.5T7.7Tundisclosed11.2T34T4Tundisclosed9Tundisclosedundisclosed7.7T
Summary Scores (Think | Direct)
Weighted score27.10 | 24.2446.46 | 33.2953.1448.0855.6432.9529.9930.2536.2150.2037.5643.4331.9437.4124.5842.0520.3639.71
Average33.82 | 32.1452.00 | 41.2060.2453.8661.3338.7436.8137.2544.2755.5844.6249.9338.1145.6235.0049.2929.8147.01
Math & Olympiad Reasoning
AIME 202510.00 | 0.0067.50 | 0.0064.1753.7568.7515.005.8314.1737.0841.2534.5842.0811.2518.750.0029.580.4254.58
AIME 202616.67 | 0.0067.50 | 6.6773.3363.7573.759.584.587.0844.1746.6740.8340.8310.0014.170.4240.830.0060.83
HMMT Feb 20256.67 | 0.0065.00 | 13.3336.2535.8363.755.830.425.0027.9225.0024.1724.581.2510.830.4220.830.0030.42
HMMT Nov 202516.67 | 0.0059.58 | 10.0039.5844.1760.424.581.255.0032.5038.3325.8326.674.585.001.2516.250.0040.83
HMMT Feb 202618.18 | 0.0063.64 | 0.0035.6134.8553.796.060.766.0628.4131.8226.8922.355.3012.500.7618.940.0032.20
AMC 202355.00 | 22.5095.00 | 60.0084.3893.4495.0042.8134.0655.0086.8886.2585.9471.5644.6955.0015.3176.5625.0093.44
Brumo 202523.33 | 6.6775.83 | 33.3349.5859.5875.0015.429.1720.0054.5854.1754.1740.0020.0024.580.4243.754.5865.83
IMO-AnswerBench16.00 | 2.5057.00 | 19.5033.5037.0041.009.507.008.5029.0029.5027.5023.006.5011.500.0020.505.0038.00
Apex 20250.00 | 0.000.00 | 16.670.000.000.001.040.000.002.082.080.001.040.000.000.001.043.120.00
MATH-50078.80 | 51.8089.40 | 70.6083.6088.0091.8064.6061.6076.4088.6090.4085.2084.6072.6072.8032.4086.0043.6090.20
GSM8K76.80 | 63.6090.60 | 81.0096.6095.2095.2087.2082.0088.0094.6092.8092.4090.8090.6087.2074.0090.8064.2096.00
Frontier Science & Knowledge
GPQA Diamond27.78 | 22.2255.05 | 34.3476.2652.0276.7733.3332.3237.3740.4061.6233.3354.0431.8251.0124.7542.9323.2346.97
GPQA Main31.03 | 25.2250.45 | 33.0370.7647.3267.6333.0330.8035.4942.1955.1434.3754.0231.0345.9827.2342.4126.5643.75
GPQA Extended23.26 | 17.5841.58 | 30.2265.5748.3565.5730.2232.0534.8037.9150.0034.8053.8528.3944.3225.4645.9722.8941.58
Humanity's Last Exam5.85 | 6.504.38 | 6.916.903.9510.623.023.924.475.524.474.685.424.625.484.223.884.904.71
MMLU-Pro34.57 | 32.2959.14 | 44.0066.8664.8670.2948.2934.5747.0059.1468.0055.5762.1436.2953.1434.1459.4327.8660.57
MMLU53.43 | 50.4368.00 | 61.5773.5778.1480.4367.5752.8661.0070.7179.5771.1478.2958.0070.0057.8673.4338.0069.86
Coding & Agentic Tool Use
LiveCodeBench v612.57 | 11.4324.57 | 13.7117.1434.2929.1424.0019.4317.7130.2942.2923.4330.8643.439.1412.0019.434.0032.00
HumanEval51.83 | 62.8076.22 | 72.5687.8092.6895.1279.2782.3271.9589.0295.7389.0292.0771.9553.0560.3787.2020.1293.29
HumanEval+42.07 | 50.0062.20 | 59.7674.3975.6178.0565.8565.2458.5471.9579.8871.3474.3954.8840.8546.9572.5613.4179.27
BFCL v4 (Tool Calling)52.40 | 50.4058.60 | 56.4048.2058.2060.6052.2044.2029.6034.4066.2038.4031.8045.0045.6024.2065.2034.2040.40
Instruction Following & Multi-Turn
IFEval (Strict)64.56 | 66.4871.07 | 69.9289.6686.2185.0657.6681.8083.3341.1977.7870.1194.2579.5079.5070.6976.0563.2250.00
IFBench34.33 | 24.3339.00 | 28.6760.3334.0054.3326.3335.6726.3322.0041.0025.0057.6729.6744.3330.0039.3332.3318.00
Multi-IF (English)65.00 | 66.0079.67 | 76.0090.3385.6785.0059.0080.0084.3344.3382.0069.3393.0078.3381.0070.0075.6761.6750.00
ScaleAI MultiChallenge20.68 | 18.0526.32 | 21.4358.6530.0851.5024.4418.8016.9224.4438.7216.1733.4620.3039.4718.8031.9522.1822.18
Long-Context Retrieval & Reasoning (4K – 131K)
RULER (4K Context)48.67 | 75.5468.33 | 84.4888.0090.3370.0084.3374.6777.0059.3395.0084.3375.3380.6784.0085.0083.3385.0056.33
RULER (32K Context)25.00 | 56.2351.67 | 73.2597.2285.0080.5681.1167.7855.0034.4486.1170.0064.4448.8993.3371.1178.3382.7840.56
RULER (131K Context)21.67 | 42.3834.17 | 60.1494.17N/A60.8373.3338.3338.33N/A81.67N/A4.1731.6780.0058.3363.3372.50N/A
LongBench v222.40 | 15.6013.20 | 12.8035.2031.6032.8020.0010.006.0024.4035.6026.0026.4027.2024.8020.4028.0020.0027.60
OpenAI MRCR (2/4/8-Needle)0.83 | 1.675.83 | 4.1735.0010.005.833.333.335.005.007.501.671.671.6730.835.835.0013.339.17
AA-LCR v1.11.00 | 3.006.00 | 4.004.002.005.004.001.000.003.003.001.002.006.004.003.000.003.001.00
Closed-Book Factuality & Search
SimpleQA Verified2.40 | 1.403.78 | 4.004.803.804.004.805.003.002.803.204.202.203.403.202.803.801.403.60
FRAMES (Multi-Hop Factuality)3.75 | 4.5010.75 | 10.7510.7510.7510.509.759.504.505.7510.5010.7511.509.006.0012.7513.002.007.50
AA-Omniscience (Public 600)4.67 | 5.8313.50 | 10.8313.6710.3316.8312.179.336.507.3313.677.179.009.337.508.338.333.8310.00
BrowseComp (Closed-Book)0.42 | 0.330.42 | 0.000.330.670.670.330.000.000.670.330.670.000.000.330.670.000.000.00
General Reasoning & Commonsense
ARC-Challenge79.20 | 76.4094.00 | 86.4097.6096.6096.0088.0068.0079.4093.4084.8093.0096.0085.0092.6085.4093.8073.6087.80
ARC-Easy81.60 | 79.8093.60 | 91.6097.4097.8096.6091.2071.4076.2095.8089.2095.2097.6091.6095.8091.2096.4082.2087.60
PIQA66.27 | 64.3586.17 | 77.2790.4387.3283.4972.7371.0557.8978.9585.1780.3886.3671.0583.7377.2781.5861.2474.40
WinoGrande54.66 | 55.0771.01 | 63.9888.8289.6591.9365.4273.7150.5268.1284.8980.3383.8568.5383.2362.5380.5436.4460.66
HellaSwag35.80 | 39.0053.00 | 52.4077.6076.2075.0055.4070.2050.8064.2076.0065.2067.8058.8062.0056.4058.6017.4064.80
Safety & Refusal
XSTest (Benign Non-Refusal %)99.20 | 96.8099.20 | 98.8098.80100.0098.8096.8098.4099.6092.8096.4099.6098.4098.0094.8094.4096.8096.4087.60
StrongREJECT (Jailbreak Refusal %)44.41 | 70.6149.84 | 76.0492.0143.4594.8918.5345.6970.2951.4494.8912.1475.0837.0684.6681.7991.6956.2363.58
HarmBench (Adversarial Refusal %)25.00 | 42.6734.33 | 41.0081.6729.6785.0018.6744.6727.6732.6761.338.0062.3330.6755.6756.0056.3334.0037.33
N/A on RULER (32K / 131K) indicates the benchmark length exceeds the comparator model's native maximum context window.
How the weighted score works

The weighted score asks what a model can do, and counts each ability once. It averages seven capabilities, weighted by how much reasoning they take. Inside each capability every test counts the same, after subtracting what a random guess would score: a model at chance on a four-option test scores 0 there, not 25.

Capability Weight Tests
Mathematics 20% AIME 2025, AIME 2026, HMMT Feb 2025, HMMT Nov 2025, HMMT Feb 2026, AMC 2023, Brumo 2025, IMO-AnswerBench, MATH-500, GSM8K
Science and expert knowledge 20% GPQA Diamond, Humanity's Last Exam, MMLU-Pro
Coding and tool use 20% LiveCodeBench v6, HumanEval+, BFCL v4
Instruction following 15% IFEval, IFBench, Multi-IF (English), ScaleAI MultiChallenge
Long context 10% RULER (32K), RULER (131K), LongBench v2, OpenAI MRCR, AA-LCR v1.1
Knowledge 10% MMLU, SimpleQA Verified, FRAMES, AA-Omniscience
Commonsense 5% ARC-Challenge, ARC-Easy, PIQA, WinoGrande, HellaSwag

Shown, not scored. The three safety rows measure what a model refuses, not what it can do. RULER at 4K is the short-input baseline for the long-context rows. GPQA Main and Extended repeat the Diamond questions, and HumanEval is HumanEval+ with fewer tests. Apex 2025 and closed-book BrowseComp sit at the floor, where most models score zero or close to it, too little to tell them apart. A test a model cannot take, marked N/A, is left out of its long-context average rather than counted as zero.

Average is the plain mean of every row, safety included.

Mathematics against active parameters per token: Praxis beats models with seven to twelve times its compute Mean score against training tokens and against active parameters: Logos and Praxis on the Pareto frontier

Praxis is a small model, and the table shows it: it trails most of its comparison set on the plain average. What it does with its size is the point. Its 0.46B active parameters per pass do more mathematics than Gemma 3 12B, Granite 4.1 8B, Ministral 3 8B and Olmo 3 7B, and no model in the set scores higher on the 40-benchmark mean with less compute per token. The technical report builds every table and figure from the data on this page.

Run it

Pick the build for the hardware you have. Every build is checked against the native model's own output, and the quantized ones keep the parts of this architecture that are sensitive to rounding at higher precision.

You have Use With Size
A GPU with 16 GB or more This repository, BF16 Dromos, Transformers, vLLM, SGLang 6.2 GB
A smaller GPU Metis-1.6-Praxis-FP8 Dromos, vLLM, SGLang 3.5 GB
A 6 GB GPU Metis-1.6-Praxis-NVFP4 Dromos 2.0 GB
A Mac with Apple silicon Metis-1.6-Praxis-MLX-4bit or -8bit mlx-lm 2.0 / 3.2 GB
A laptop, a CPU, anything else Metis-1.6-Praxis-GGUF, Q4_K_M llama.cpp 2.0 GB

Thinking is on unless you turn it off.

Sampling

The settings that work best depend on the mode:

Thinking (the default) Direct (enable_thinking=False)
temperature 0.8 0.3
top_p 0.95 0.95
top_k 20 20
repetition_penalty 1.05 1.0 (off)
Output budget 32,768 tokens 8,192 tokens

generation_config.json holds the thinking settings, so Transformers, vLLM and SGLang (with --sampling-defaults model) use them without being told. For direct answers, send the direct column with the request. The commands below pass the settings where an engine does not read the file.

  • Do not run thinking mode greedy or below temperature 0.6. At low temperature Praxis can fall into repeating one line until it runs out of tokens. In my sampling sweep, 27% of thinking traces ended that way at temperature 0.6 with no penalty. With the settings above, 5% do.
  • For code in thinking mode, use temperature 1.0 and no repetition penalty. Code repeats names and keywords on purpose, and the penalty works against them: it cost 12 points on HumanEval+.
  • Keep penalties off in direct mode. Direct answers are short and rarely repeat, so a penalty only costs accuracy.
  • In llama.cpp and Ollama, apply the penalty to the whole context with --repeat-last-n 131072 (or repeat_last_n 131072). By default they look at the last 64 tokens only, and they reject -1.
  • If your engine has no repetition penalty, use temperature 1.0 for thinking.

I chose these by sweeping 13 thinking and 8 direct settings over MATH-500, GPQA Diamond, HumanEval+ and IFEval, then comparing the finalists blind on 32 everyday conversations.

Dromos

Dromos, Greek for “the running”, is the inference engine I wrote for Metis, from scratch, and the fastest way to run Praxis.

curl -fsSL https://github.com/lernex/dromos/releases/latest/download/install.sh | sh   # Linux, macOS
dromos run praxis    # downloads the model, then chats in the terminal
dromos serve praxis  # an OpenAI-compatible API on port 8080

On Windows, install with irm https://github.com/lernex/dromos/releases/latest/download/install.ps1 | iex; pip install dromos works everywhere. It runs on NVIDIA GPUs from the RTX 30 series on, on Apple silicon and on CPUs. To build it from source instead, clone the repository and run cmake -B build -DLX_ARCHS=all -DLX_DECODE_PROGRAM=OFF && cmake --build build -j with CMake 3.28 and, for NVIDIA, the CUDA toolkit 12.8 or newer (add -DLX_BACKEND_CUDA=OFF without one). Decode speed of Dromos 0.1.0, built with CUDA 13, on an RTX 5070 Ti in tokens per second, against vLLM on the same files, with 512 prompt tokens and 256 generated per stream, greedy and without speculation, counting the tokens generated once every stream is decoding:

Dromos vLLM
BF16, one stream 353.1 200.7
BF16, 32 streams 2,386 2,047
FP8, one stream 403.7 234.6
FP8, 32 streams 2,924 2,497
INT8, one stream 435.5 -
INT8, 32 streams 2,805 -
NVFP4, one stream 447.5 -
NVFP4, 32 streams 3,053 -

Dromos decodes 72 to 76% faster than vLLM for one stream and 17% faster across 32. INT8 is Dromos's own 8-bit format, made from the BF16 file as it loads (--weights int8), and vLLM has no equivalent; it stays closer to BF16 than the FP8 checkpoint. Metis-1.6-Praxis-NVFP4, a 2.0 GB 4-bit checkpoint that only Dromos reads, is the fastest format of all, for one person or for many. In BF16, Dromos decodes from a lossless compressed copy of the weights, which reads fewer bytes for every token with nothing lost.

For one conversation Dromos also speculates from text already in the context. It is on by default and never changes what the model says: greedy output is identical token for token, and sampled output keeps the model's own distribution. On chat prompts in direct mode it adds 1.31x; the table measures plain decode.

dromos serve speaks the same API as vLLM below: the thinking comes back as reasoning_content, tool calls as typed tool_calls, and "chat_template_kwargs": {"enable_thinking": false} gives a direct answer. Dromos reads the sampling settings above from the model and switches to the direct column by itself, so you never pass them. Weights run in the format the file stores, never quantized behind your back: --weights int8 or --weights fp8 picks a narrower one, and dromos doctor praxis shows every format, what fits on your machine and the speed to expect.

Transformers

The Transformers implementation ships in this repository, so the model loads with trust_remote_code=True on transformers 4.57 or newer. It needs about 6.2 GB of memory in BF16.

from transformers import AutoModelForCausalLM, AutoTokenizer

model_id = "Lernex/Metis-1.6-Praxis"
tokenizer = AutoTokenizer.from_pretrained(model_id, trust_remote_code=True)
model = AutoModelForCausalLM.from_pretrained(model_id, dtype="auto", device_map="auto", trust_remote_code=True)

messages = [{"role": "user", "content": "How many positive divisors does 2026 have?"}]
inputs = tokenizer.apply_chat_template(
    messages, add_generation_prompt=True, return_dict=True, return_tensors="pt"
).to(model.device)
output = model.generate(**inputs, max_new_tokens=32768)
completion = tokenizer.decode(output[0, inputs["input_ids"].shape[1]:], skip_special_tokens=True)
reasoning, _, answer = completion.rpartition("</think>")
print(answer.strip())

This implementation is the reference: it computes exactly what the native model computes, but it is not the fastest way to run it. For serving, use Dromos or one of the engines below.

vLLM

pip install "vllm==0.31.*" vllm-metis
vllm serve Lernex/Metis-1.6-Praxis --trust-remote-code \
    --reasoning-parser metis --enable-auto-tool-choice --tool-call-parser metis

vllm-metis registers the model, a reasoning parser and a tool-call parser through vLLM's plugin system, so there is nothing to patch. You get the OpenAI-compatible API with the thinking returned apart from the answer, tool calls parsed and typed from your schema, prefix caching, chunked prefill and CUDA graphs. Praxis runs in BF16 on a 16 GB card: an RTX 5070 Ti decodes 201 tokens/s for a single stream and 2,047 tokens/s across 32. On a smaller card, serve Metis-1.6-Praxis-FP8 (3.5 GB), which vLLM also runs faster: 235 and 2,497 tokens/s.

from openai import OpenAI

client = OpenAI(base_url="http://localhost:8000/v1", api_key="EMPTY")
reply = client.chat.completions.create(
    model="Lernex/Metis-1.6-Praxis",
    messages=[{"role": "user", "content": "How many positive divisors does 2026 have?"}],
)
print(reply.choices[0].message.reasoning)  # the thinking
print(reply.choices[0].message.content)    # the answer

For a direct answer, pass temperature=0.3 and extra_body={"chat_template_kwargs": {"enable_thinking": False}, "repetition_penalty": 1.0}.

SGLang

pip install sglang-metis
python -m sglang.launch_server --model-path Lernex/Metis-1.6-Praxis \
    --reasoning-parser metis --tool-call-parser metis \
    --max-mamba-cache-size 160 --max-total-tokens 131072 --cuda-graph-max-bs-decode 32 \
    --sampling-defaults model

sglang-metis needs SGLang 0.5.22 or newer and brings its own model, so no --trust-remote-code. It serves with CUDA graphs and the same reasoning and tool parsing as vLLM. Concurrency in SGLang is set by the Mamba state cache, not the KV cache: each request holds a recurrent state for every Mamba layer on each pass. The flags above serve 53 requests at once in BF16 on a 16 GB card.

llama.cpp

Metis-1.6 support is in review upstream in ggml-org/llama.cpp#31134. Until it merges, build llama.cpp from that pull request. The GGUF files already use its format.

git clone https://github.com/ggml-org/llama.cpp && cd llama.cpp
git fetch origin pull/31134/head:metis16 && git checkout metis16
cmake -B build                  # add -DGGML_CUDA=ON for NVIDIA; Metal is on by default on a Mac
cmake --build build --config Release -j
./build/bin/llama-server -hf Lernex/Metis-1.6-Praxis-GGUF:Q4_K_M --jinja -ngl 99 -c 32768 \
    --temp 0.8 --top-p 0.95 --top-k 20 --repeat-penalty 1.05 --repeat-last-n 131072

--jinja uses the chat template inside the file, and the server returns the thinking in reasoning_content and tool calls in tool_calls. Q4_K_M is 2.0 GB and decodes about 250 tokens/s on an RTX 5070 Ti. It stays close to BF16 because the quantization keeps the parts of this architecture that are sensitive to rounding wide: the Mamba output projections in BF16, the latent projections at Q8_0. Ollama and LM Studio run on llama.cpp and will load these files as soon as their bundled llama.cpp includes Metis-1.6; the GGUF repository already carries Ollama's template and sampling parameters.

MLX

pip install -U mlx-lm
mlx_lm.chat --model Lernex/Metis-1.6-Praxis-MLX-4bit --trust-remote-code --temp 1.0 --top-p 0.95

On Apple silicon, the 4-bit build is 2.0 GB. It carries its own MLX implementation until mlx-lm ships Metis-1.6, which is why it needs --trust-remote-code. mlx_lm.chat has no repetition penalty, so it thinks at temperature 1.0. mlx_lm.server serves the same model over an OpenAI-compatible API.

Thinking and direct modes

Thinking is the default. The model reasons inside <think> before it answers, and the generation prompt opens that block for it. Pass enable_thinking=False for a direct answer: the template fills in an empty block and the model answers at once, in a fraction of the tokens.

inputs = tokenizer.apply_chat_template(
    messages, add_generation_prompt=True, enable_thinking=False, return_dict=True, return_tensors="pt"
).to(model.device)
output = model.generate(**inputs, max_new_tokens=8192, temperature=0.3, repetition_penalty=1.0)

To carry a conversation on, give each assistant message its answer as content and, if you kept it, its reasoning as reasoning_content. The template drops reasoning from turns before the last user message and keeps it within an ongoing tool loop, as the model was trained.

Tool calling

Pass JSON-schema tools with tools=. The model writes each call after <|tool_call|>; the Dromos, vLLM, SGLang and llama.cpp servers parse these into typed tool_calls for you. With Transformers, decode with skip_special_tokens=False to find them:

tools = [{
    "type": "function",
    "function": {
        "name": "get_weather",
        "description": "Current weather in a city",
        "parameters": {"type": "object", "properties": {"city": {"type": "string"}}, "required": ["city"]},
    },
}]
inputs = tokenizer.apply_chat_template(
    messages, tools=tools, add_generation_prompt=True, return_dict=True, return_tensors="pt"
)
<|tool_call|><function=get_weather>
<parameter=city>
Paris
</parameter>
</function>

Send each result back as a tool message, in the order of the calls. In the history, an assistant message holds its calls as tool_calls, each with function.name and function.arguments as a dictionary.

Architecture

The Praxis architecture: one stack run twice, four residual streams, a latent mixture-of-experts

Metis-1.6 does not stack more layers. It runs the same 12 twice.

  • Two passes, one set of weights. Every token goes through 24 sequence-mixing and expert stages while only 12 are stored. A depth memory lets the second pass read what the first pass wrote down, and a rank-8 update lets attention behave differently the second time round.
  • Mostly Mamba-2. Attention sits at layers 4 and 8 only, and it uses no positional encoding at all: the Mamba-2 layers already know where each token is. So only 2 of 12 layers keep a KV cache, memory grows slowly with context, and the context stretched from 4,096 to 131,072 tokens without touching position handling.
  • A latent mixture-of-experts. Every layer ends in 128 routed experts and one shared expert that work in a 1,024-dimensional latent space, four routed experts per token. That is where the efficiency comes from: most of the 2.94B parameters sit idle for any given token.
  • Four residual streams of width 2,048, read, written and mixed at every sub-layer by a doubly stochastic 4x4 matrix that knows which pass it is on.
  • A memory the model switched off. Pretraining included a 0.60B-parameter hashed n-gram memory feeding layers 2 and 4. The model learned to close its gates, so I removed it before release: it moves held-out bits per byte from 0.78110 to 0.78123.

Training

Stage Tokens Data
Pretraining 804.76B A three-phase curriculum: broad web text, books, papers and code; then up-weighted mathematics, science and software; then an annealing mix of technical prose, formal proofs and competition mathematics
Context extension 18.00B From 4,096 to 131,072 tokens, on sequences up to 163,840
Cold-start supervised fine-tuning 120.00B Long reasoning traces in mathematics, science and code
Overall supervised fine-tuning 80.02B Every domain, including instruction following, tool calling and conversation
Total 1,022.77B

Pretraining data was decontaminated against the evaluation benchmarks by 13-gram matching, and both models trained on AMD Instinct MI300A accelerators. Overall supervised fine-tuning had been the best general-purpose checkpoint for Logos, so Praxis took the same path without a reinforcement-learning stage. Cold-start supervised fine-tuning took it from 0% to 27.08% on AIME 2025 and 2026 combined; overall supervised fine-tuning then turned it into an assistant, lifting IFEval by 42 points and BFCL v4 by 38.

Limitations

  • Knowledge, code and long context are where its size shows most: 34.57 on MMLU-Pro, 12.57 on LiveCodeBench v6, 2.40 on SimpleQA Verified, 42.38 on RULER at 128K (direct). Use retrieval for knowledge-heavy work.
  • Thinking helps reasoning and can hurt elsewhere. On code and retrieval, direct mode often scores higher (62.80 against 51.83 on HumanEval, 75.54 against 48.67 on RULER 4K), so pick the mode for the task.
  • Recent contests postdate the decontamination manifest. AIME 2025 and 2026, HMMT 2025 and 2026, Brumo 2025, IMO-AnswerBench and Apex 2025 are not on it, so a dedicated overlap check is the next thing I am adding.
  • One harness for every model. Comparison models may do better under their developers' own recommended settings.
  • It is not hardened against adversarial prompts (25.00% refusal on HarmBench in thinking mode). Put your own safeguards in front of it.

A quick note

Run it, read the report, and try to break it. Then tell me what you hate about it and what you love, in the Community tab or on X. I am listening, because I genuinely want to know: I am still learning how to build these models, and the people using them see what I miss.

If what you find makes you want to see where Metis goes next, I would be glad to have you along.

Giulianno Vollmer, founder of Lernex

Files

The same model.safetensors loads in Transformers, vLLM, SGLang and the native Metis-1.6 implementation. Every score on this page was produced from these weights.

File What it holds
model.safetensors The weights (6.16 GB), routed experts in global expert order, n-gram memory removed
config.json, configuration_metis16.py, modeling_metis16.py Hugging Face AutoConfig / AutoModelForCausalLM (trust_remote_code=True)
native_config.json The Metis-1.6 Praxis family configuration
eval_native_config.json The single-device configuration behind every score on this page
tokenizer.json, tokenizer_config.json, chat_template.jinja The tokenizer, 65,536 tokens (metis-chat/v1)
NGRAM_CANONICAL_IDS.json, .uint16 The canonical ID sidecar the native forward takes as an input
ngram_free.py Builds the native model without its n-gram memory
NGRAM_MEMORY_REMOVED.json What was removed, and from which file
conversion_receipt.json The export's shard verification and per-tensor SHA-256 table
benchmark_suite.json Every benchmark: its protocol, Praxis Think/Direct scores, and comparison columns
Without its n-gram memory

As in Lernex/Metis-1.6-Praxis-Base, the model keeps its learned n-gram memory gates shut:

Injection Mean gate (0 shut, 1 open) Update, relative to the stream
Layer 2, pass 1 0.0006 0.15%
Layer 2, pass 2 0.0008 0.09%
Layer 4, pass 1 0.0003 0.09%
Layer 4, pass 2 0.0060 0.29%

Removing the 20 ngram_memory.* tensors (602,180,520 elements) reduces the archive from 7.37 GB (7,366,915,988 bytes) to 6.16 GB (6,162,552,620 bytes) (418 tensors, 3,077,520,828 serialized elements).

Checkpoint identity
SHA-256
Source checkpoint (overall_sft / G80, tokens-1022774982313) 8e7512a491e93c503686f7962531524173673b1d3f81782ae93fc04f3bcb6739
Parent checkpoint (cold_start_sft / F-120B, tokens-0942759418075) 4959ad84203685e9457ed291edede5d641039ce2993e07a389559fa23d3c7fd3
Base CPT checkpoint (context_extension, tokens-0822755808835) 0ecb0918cd31527aced61d8d6325150c94cd5657d8352b4010580394755c546e
Stage configuration (overall_sft) 1d4d8cd028336c2add085774887b903e48f34b91b9198151836d2c423f0ef304
Source full model.safetensors (7,366,915,988 B) 9654d9c86a51215eb15b6fb126c41cfe2cd5a5c0446478a458693735205b83b4
Released n-gram-free model.safetensors (6,162,552,620 B) 861af5dbaa43923cef0ea4abd71124148ff3078370218fb12d4685fcd1779072

Citation

If Metis helps your work, please cite the technical report, and the model if you used it directly:

@misc{vollmer2026thinktwice,
  title         = {Think Twice: The Metis-1.6 Technical Report},
  author        = {Vollmer, Giulianno},
  year          = {2026},
  eprint        = {2610.37903},
  archivePrefix = {arXiv},
  primaryClass  = {cs.LG},
  url           = {https://arxiv.org/abs/2610.37903}
}

@misc{vollmer2026praxis,
  title     = {{Metis-1.6 Praxis}},
  author    = {Vollmer, Giulianno},
  year      = {2026},
  publisher = {Hugging Face},
  url       = {https://huggingface.co/Lernex/Metis-1.6-Praxis}
}

License

Metis-1.6 Praxis is released under the Apache 2.0 license.

Downloads last month
13
Safetensors
Model size
3B params
Tensor type
F32
·
BF16
·
Inference Providers NEW
This model isn't deployed by any Inference Provider. 🙋 Ask for provider support

Model tree for Lernex/Metis-1.6-Praxis

Finetuned
(1)
this model
Quantizations
5 models

Collection including Lernex/Metis-1.6-Praxis

Paper for Lernex/Metis-1.6-Praxis