Drex v2.0
Nace's flagship decision model: 61.25 on the public Decision Index 0.3.1, 3.3 points ahead of Jev 1.13.0 and 3.2 ahead of Drex v1.5.
We introduce Drex v2.0 from Nace.AI, a decision model that answers typed questions about a given context. Pass the context as state (request format) with one or more named questions, and get a probability for every option back in one forward pass. Nothing is generated. Drex v2.0 beats Jev head to head in the eight-game arena (60.9%) and on email classification (AUC 0.984 against 0.981), and it runs on your own hardware with Python, llama.cpp or Ollama. It is built on Qwen3.6-35B-A3B, a mixture of experts with 35B parameters and about 3B active per token, with a Kev pointer head, and is released under the Nace.AI Open RAIL-M license.
Drex repository Β· Q8_0 GGUF Β· Drex v1.5 Β· llama.cpp fork (branch drex-v2.0) Β· Ollama fork (branch drex-v2.0)
It runs with Python, llama.cpp or Ollama. The default limit is 16,384 tokens per request and it can be raised to 131,072 (Context length). The bf16 weights take about 70 GB and the Q8_0 GGUF about 37 GB.
How it works
The backbone is a mixture-of-experts Qwen3_5MoeForConditionalGeneration with 40 layers, 256 experts and 8 active per token: 35B parameters in total, about 3B active per token. Only its language model is used; the vision tower is dropped on load. Each question is scored in one forward pass over the state plus that question, and the pointer head in head.pt turns the result into probabilities. Nothing is generated, so the sampling values in generation_config.json do not apply.
Performance
Decision Index 0.3.1 (public only)
| Model | Public index | Raw | Knowledge & Reasoning | Language | Retrieval | Tools | Arts |
|---|---|---|---|---|---|---|---|
| Drex v2.0 (35B) | 61.25 | 70.55 | 47.9 | 65.3 | 63.0 | 76.5 | 53.9 |
| Drex v1.5 (9B) | 58.08 | 68.08 | 44.6 | 60.4 | 61.7 | 75.0 | 48.8 |
| Jev 1.13.0 | 57.96 | 68.55 | 53.9 | 59.2 | 55.4 | 75.1 | 39.1 |
| Bespoke Nimble 9B v3 | 57.19 | 68.38 | 41.0 | 60.7 | 55.5 | 84.2 | 44.0 |
| Cloudflare clef-flash | 56.15 | 66.53 | 53.0 | 47.2 | 52.2 | 81.9 | 48.4 |
| ezjev 4B s2 | 50.82 | 63.16 | 31.0 | 60.5 | 56.3 | 69.9 | 31.1 |
Public index only: the 37 public benchmarks in five areas, without the private tests. Area columns are chance-corrected skill Γ 100. The Drex rows are from our own runs of the official kit on the full public suite; the other rows are from the leaderboard.
JevBench (231 public items)
| Model | Accuracy | Easy | Standard | Hard |
|---|---|---|---|---|
| Jev 1.13.0 | 86.6% (200/231) | 100.0% | 98.6% | 73.0% |
| Drex v2.0 | 85.7% (198/231) | 100.0% | 95.8% | 73.0% |
Choice = top option, yes/no = noul β₯ 0.5, ordinal = top level.
DecideBench v1.1 (400 contrastive decisions)
Published decision models only (chat LLMs omitted). Few-shot uses the benchmark's examples-in-instructions protocol. Not an official leaderboard submission.
| Entry | Accuracy | Pair accuracy |
|---|---|---|
| Jev (AI Space) | 98.0% | 96.0% |
| Drex v2.0 (few-shot) | 96.5% | 93.5% |
| Drex v2.0 (zero-shot) | 96.3% | 92.5% |
| imajev-4b | 95.0% | 90.5% |
| Clef 27B | 94.8% | 89.5% |
| yev0-4b | 94.3% | 88.5% |
| Bespoke-Nimble-9B | 94.0% | 88.0% |
| TEV | 92.8% | 86.0% |
| Drex v1.5 | 90.0% | 80.5% |
| JevK5 v0.3 | 88.8% | 78.5% |
Email classification
Held-out addresses. Score is AUC; caught @ 5% is recall at a 5% false-positive rate.
| Drex v2.0 | Jev 1.13.0 | Drex v1.5 | |
|---|---|---|---|
| AUC | 0.984 | 0.981 | 0.972 |
| Caught @ 5% FP | 89.4% | 86.4% | 80.3% |
Game arena against Jev
Eight OpenSpiel games, 32 matches each (16 openings Γ both colours). Score = (wins + Β½ draws) Γ· matches.
| W β D β L | Score | |
|---|---|---|
| Drex v2.0 vs Jev | 132 β 48 β 76 | 60.9% |
| Drex v1.5 vs Jev | 122 β 47 β 87 | 56.8% |
| Game | Drex v2.0 vs Jev | Drex v1.5 vs Jev |
|---|---|---|
| Chess | 13 β 19 β 0 (70.3%) | 9 β 21 β 2 (60.9%) |
| Four in a Row | 11 β 0 β 21 (34.4%) | 11 β 0 β 21 (34.4%) |
| Reversi | 17 β 0 β 15 (53.1%) | 15 β 1 β 16 (48.4%) |
| Checkers | 20 β 5 β 7 (70.3%) | 21 β 3 β 8 (70.3%) |
| Clobber | 20 β 0 β 12 (62.5%) | 17 β 0 β 15 (53.1%) |
| Lines of Action | 21 β 11 β 0 (82.8%) | 26 β 3 β 3 (85.9%) |
| Dots and Boxes | 15 β 0 β 17 (46.9%) | 18 β 0 β 14 (56.3%) |
| Nine Men's Morris | 15 β 13 β 4 (67.2%) | 5 β 19 β 8 (45.3%) |
Python
Needs a CUDA GPU; memory use grows with document length. The server answers POST /v1/systemone.
hf download nace-ai/drex-v2.0 --local-dir drex-v2.0
pip install -r drex-v2.0/requirements.txt
python drex-v2.0/inference.py --request drex-v2.0/examples/request.json
python drex-v2.0/serve.py --port 8000
To accept requests longer than 16,384 tokens, set KEV_CONTEXT (up to 131,072); see Context length.
llama.cpp
Runs on Apple silicon (Metal) and on the CPU. Run these from the repository root:
git clone --branch drex-v2.0 --single-branch https://github.com/nace-ai/llama.cpp.git
cmake -S llama.cpp -B llama.cpp/build
cmake --build llama.cpp/build -j --target llama-server
python llama.cpp/convert_hf_to_gguf.py drex-v2.0 --no-mtp --outtype q8_0 \
--outfile drex-v2.0/drex-v2.0-Q8_0.gguf
llama.cpp/build/bin/llama-server -m drex-v2.0/drex-v2.0-Q8_0.gguf \
--embedding --pooling none -np 2 -c 32768 -b 16384 -ub 2048 -ngl 28 --port 8000
The server answers POST /v1/systemone with the same request and response as the Python server. The Q8_0 GGUF is 36.9 GB, so on a 48 GB Mac -ngl 28 offloads 28 layers to Metal and runs the rest on the CPU; -ngl 0 runs entirely on the CPU. The conversion needs the bf16 weights, about 70 GB, on disk. To skip it, download the ready-made Q8_0 GGUF instead (hf download nace-ai/drex-v2.0-Q8_0 drex-v2.0-Q8_0.gguf --local-dir drex-v2.0-Q8_0) and pass its path to llama-server.
-np 2 encodes the state once and shares it across questions. -c is split across the two slots, so this command accepts requests up to 16,384 tokens. For up to 131,072 tokens, set SYSTEMONE_CONTEXT=131072 and use -c 262144 (Context length).
Tested hardware
Apple M5 Pro (18-core CPU, 20-core GPU, 48 GB unified memory, macOS 26.5.2): the Q8_0 GGUF gives the same answers on Metal with -ngl 28 and on the CPU, with probabilities within 0.03 of each other.
Ollama
Use the Nace fork of Ollama with a llama-server built from the drex-v2.0 branch above. Convert the GGUF first, as in the llama.cpp steps.
Build the fork
From the repository root:
git clone --branch drex-v2.0 --single-branch https://github.com/nace-ai/ollama.git
cd ollama
export OLLAMA_LLAMA_CPP_SOURCE="$PWD/../llama.cpp"
cmake -S llama/server --preset darwin
cmake --build build/llama-server-darwin --target llama-server --parallel 8
GOTOOLCHAIN=auto go build -trimpath -o ollama .
cd ..
For the CPU use the cpu preset and build/llama-server-cpu in place of darwin and build/llama-server-darwin here and below.
Write a Modelfile next to the GGUF:
cat > drex-v2.0/Modelfile <<'EOF'
FROM ./drex-v2.0-Q8_0.gguf
CAPABILITY decision
PARAMETER num_ctx 16384
PARAMETER num_gpu 28
EOF
Start the daemon with the fork's binary and leave it running:
OLLAMA_HOST=127.0.0.1:11434 \
OLLAMA_LLAMA_SERVER="$PWD/ollama/build/llama-server-darwin/bin/llama-server" ollama/ollama serve
In another terminal, import and call the model:
OLLAMA_HOST=127.0.0.1:11434 ollama/ollama create drex-v2.0 -f drex-v2.0/Modelfile
jq '. + {model: "drex-v2.0"}' req.json | curl http://127.0.0.1:11434/v1/systemone \
-H 'Content-Type: application/json' -d @-
Ollama needs "model" in the request, which the jq filter adds. num_gpu 28 offloads 28 layers to Metal on a 48 GB Mac; use PARAMETER num_gpu 0 for the CPU. The default is 16,384 tokens; for up to 131,072, set PARAMETER num_ctx 131072, import again, and start the daemon with SYSTEMONE_CONTEXT=131072.
Tested hardware
Through Ollama on the Apple M5 Pro above, the Q8_0 GGUF with num_gpu 28 gives the same answers as llama-server.
License
Nace.AI Open RAIL-M license, see LICENSE.
- Downloads last month
- 55