--- base_model: Qwen/Qwen3.6-35B-A3B license: other license_name: nace-ai-open-rail-m license_link: LICENSE tags: - decision-model - system-one - kev - drex - moe - typed-decisions - decision-index - classification - zero-shot - qwen3_5 - calibrated-probabilities - decisionbench - recommendation --- # 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](https://www.nace.ai/), a decision model that answers typed questions about a given context. Pass the context as `state` ([request format](https://github.com/nace-ai/drex-decision-models/blob/main/docs/request-format.md)) 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](https://huggingface.co/Qwen/Qwen3.6-35B-A3B), a mixture of experts with 35B parameters and about 3B active per token, with a [Kev](https://github.com/jaredpalmer/kev) pointer head, and is released under the Nace.AI Open RAIL-M license. [Drex repository](https://github.com/nace-ai/drex-decision-models) · [Q8_0 GGUF](https://huggingface.co/nace-ai/drex-v2.0-Q8_0) · [Drex v1.5](https://huggingface.co/nace-ai/drex-v1.5) · [llama.cpp fork](https://github.com/nace-ai/llama.cpp) (branch `drex-v2.0`) · [Ollama fork](https://github.com/nace-ai/ollama) (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](https://github.com/nace-ai/drex-decision-models/blob/main/docs/context-length.md)). 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](https://huggingface.co/spaces/multimodalart/jev-decision-index).
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`. ```bash 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](https://github.com/nace-ai/drex-decision-models/blob/main/docs/context-length.md). ## llama.cpp Runs on Apple silicon (Metal) and on the CPU. Run these from the repository root: ```bash 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](https://huggingface.co/nace-ai/drex-v2.0-Q8_0) 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](https://github.com/nace-ai/drex-decision-models/blob/main/docs/context-length.md)).
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: ```bash 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: ```bash 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: ```bash 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: ```bash 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](LICENSE).