[Release] Drex Max v1: Open-weight 27B multimodal decision model, 262K context, local inference on Apple Silicon

Reddit r/LocalLLaMA Models

Summary

Nace.AI released Drex Max v1, an open-weight 27B multimodal decision model with a 255-way readout head and 262K-token context that returns probability distributions over options in a single forward pass, scoring 67.52 on the public Decision Index 0.4 and running locally via llama.cpp, Ollama, and MLX on Apple Silicon.

No content available
Original Article
View Cached Full Text

Cached at: 11/01/26, 03:51 PM

nace-ai/drex-max-v1 · Hugging Face

Source: https://huggingface.co/nace-ai/drex-max-v1 67.52 on the public Decision Index 0.4, 73.92 on the public vision index, and 64 on the Artificial Analysis Decision Index.

Drex Max, fromNace.AI, answers typed questions about a given context, in text, JSON and images. Pass the context asstate(request format) with one or more named questions, and get a probability for every option back in one forward pass. Nothing is generated. Drex Max is a dense 27B-parameter model with a 255-way readout head, and is released under the Nace.AI Open RAIL-M license.

Code and docs·Q8_0 GGUF·affine Q4·llama.cpp fork(branchdrex\-max\-v1) ·Ollama fork(branchdrex\-max\-v1) ·Drex v2.0·Drex v1.5

It runs with Python on an NVIDIA GPU. On Apple silicon its text backbone runs on llama.cpp, Ollama, Kapitsa and MLX, and on the CPU with llama.cpp and Ollama. The affine Q4 checkpoint runs on Apple silicon Macs with 24 GB of memory or more (Kapitsa and MLX). The Q8_0 GGUF needs 48 GB. The default limit is 16,384 tokens per request.DREX\_MAX\_CONTEXT=Nor\-\-max\-length Nraises it up to the model’s 262,144-token window (seecontext length). The bf16 weights take about 49 GB, and loading the backbone in 8-bit takes about 26 GB.

How it worksThe backbone has 64 layers: 48 Gated DeltaNet linear-attention layers that stay left to right, and 16 full-attention layers (every fourth) that are non-causal, so every token can attend to the whole sequence. Images go through the native vision tower and are visible to every question on the request. A 255-way readout inreadout\.safetensorsturns the last hidden state into probabilities over up to 255 options. The bundled loader applies the non-causal attention; a plain causal chat run does not reproduce the scores below.

https://huggingface.co/nace-ai/drex-max-v1#performancePerformance

As of 19 Oct 2026. Text scores are from theresults. Decision Index 0.4 uses this same public suite, so the scores are unchanged.

https://huggingface.co/nace-ai/drex-max-v1#decision-index-04-public-textDecision Index 0.4 (public text)

ModelPublic indexRawKnowledge & ReasoningLanguageRetrievalToolsArtsDrex Max(27B)67.5275.457.172.268.881.953.4Drex v2.0 (35B)61.2570.5547.965.363.076.553.9Jev 1.13.057.9668.5553.959.255.475.139.1 The public index averages 37 benchmarks in five areas. All 140,178 scoreable requests were answered (140,620 requests in the run). Unanswered requests count as wrong. Area columns are chance-corrected skill × 100, fromindex\.json. The Drex v2.0 row is from itsresults. The Jev row is the public-board row cited on theDrex v2.0 page, from theleaderboard.

Decision Index 0.4 public index

Area skill on Decision Index 0.4

https://huggingface.co/nace-ai/drex-max-v1#artificial-analysis-decision-indexArtificial Analysis Decision Index

Drex Max scores64on theArtificial AnalysisDecision Index, a weighted average of AA-Omniscience-Decision, HLE-MultiChoice, When2Call and WildGuardTest. It ranks fourth of 18, one point behind the leaders at 65 and ahead of Claude Haiku 5.5 (Low) at 61, Drex 2.0 at 58 and GPT-6 Luna (Low) at 55.

ModelTypeIndexdl-ultraDecision65SubQ Snap 1.1Decision65Elephant 9BDecision65Drex MaxDecision64Claude Haiku 5.5 (Low)Language61Drex 2.0Decision58Jev 1.14Decision57Decider v1.2Decision56GPT-6 Luna (Low)Language55GLIDEDecision54Microsoft-Decision-1Decision54Mercury DecideDecision53Celeris-1 DecisionDecision52d1Decision50Decider Flash v1.2Decision50ClefDecision49GPT-6 Luna (Decisions)Decision48Clef-OmniDecision44 Artificial Analysis Decision Index

https://huggingface.co/nace-ai/drex-max-v1#jevbenchJevBench

Drex Max scores 92.2% (213/231).

https://huggingface.co/nace-ai/drex-max-v1#decision-bench-v4Decision Bench v4

Drex Max scores 94.30% (1010/1071).

https://huggingface.co/nace-ai/drex-max-v1#visionVision

Public vision index73.92on Decision Index 0.4, fromvision\-scores\.json. All 12,210 rows were answered. The column is chance-corrected skill × 100. This run capped images at 1,638,400 pixels. R-Bench-M is weighted 0.5 and MMMU-Pro vision 0.25. The other rows are weighted 1.

BenchmarkRowsSkillCV-Bench2,03877.4BLINK96159.9RealWorldQA58972.3CharXiv53280.5InfographicVQA24497.3Mind2Web97384.2Winoground80085.0KIE (CORD+FUNSD)2,46592.4Moderation (Hateful Memes)1,21340.6R-Bench-M66538.6MMMU-Pro vision1,73047.3 Public vision skill by benchmark

https://huggingface.co/nace-ai/drex-max-v1#pythonPython

Download the weights, install the requirements and run a request. The example isexamples/request\.json.

hfis the Hugging Face CLI (pip install \-U huggingface\_hub).

hf download nace-ai/drex-max-v1 --local-dir weights/drex-max-v1
pip install -r models/drex-max-v1/requirements.txt
python -m drex_max --model weights/drex-max-v1 --request examples/request.json

Add\-\-8bitto load the backbone in 8-bit (CUDA, about 26 GB). Addimageswith file paths ordata:image/URLs to the request to pass images. The loader accepts up to 4,194,304 pixels per image. The command needs Python 3.12 or newer.

From Python:

from drex_max.model import DecisionModel, answer

model = DecisionModel("weights/drex-max-v1")
question = {
    "type": "choice",
    "instructions": "Which team should handle this ticket?",
    "criteria": {"billing": "Payments, charges, and refunds", "technical": "Bugs and outages", "other": "Anything else"},
}
row = {
    "state": {"ticket": "I was charged twice for the same order. Please refund the extra payment."},
    "question": question,
    # "images": ["receipt.jpg"],
}
print(answer(question, model.predict([row])[0]))

Response forexamples/request\.jsonfrom a bf16 run on an NVIDIA H100:

{
  "answers": {
    "team": {
      "type": "choice",
      "choice": "billing",
      "confidence": 0.9982,
      "probabilities": { "billing": 0.9988, "technical": 0.0003, "other": 0.0009 }
    },
    "refund": { "type": "noul", "noul": 0.9974 },
    "urgency": {
      "type": "score",
      "score": 1.6522,
      "legend": { "0": "Routine", "1": "Soon", "2": "Urgent" },
      "probabilities": { "0": 0.0152, "1": 0.3173, "2": 0.6674 },
      "confidence": 0.4783
    }
  }
}

Tested hardwareNVIDIA H100 80 GB with bf16 weights (48.6 GiB loaded), and NVIDIA L40S 48 GB with the backbone in 8-bit (25.9 GiB loaded). Both answeredexamples/request\.jsonand an image request, and the 8-bit probabilities are within 0.03 of bf16 on the example.

https://huggingface.co/nace-ai/drex-max-v1#kapitsaKapitsa

Kapitsa v0.2.25 or later runs the text backbone on Apple silicon.

brew install nace-ai/tap/kapitsa

Import theQ8_0 GGUF, then write the readout head beside it.hfis the Hugging Face CLI (pip install \-U huggingface\_hub).

export KAPITSA_HOME="$HOME/.cache/kapitsa"
hf download nace-ai/drex-max-v1-Q8_0 drex-max-v1-Q8_0.gguf --local-dir weights/drex-max-v1-Q8_0
GGUF=weights/drex-max-v1-Q8_0/drex-max-v1-Q8_0.gguf
kapitsa import "$GGUF" --name drex-max-v1
kapitsa-drex-pointer "$GGUF" "$KAPITSA_HOME/models/drex-max-v1/pointer.bin"
kapitsa-systemone --model "$KAPITSA_HOME/models/drex-max-v1" --port 8000 --context 2048
curl -s localhost:8000/v1/systemone -d '{"state":"The shipment awaits inspection.","questions":{"route":{"type":"choice","instructions":"Which desk?","criteria":{"customs":"hold and inspect","transit":null}},"urgent":{"type":"noul","instructions":"Is the shipment urgent?"},"quality":{"type":"score","instructions":"How clear is the note?","criteria":["unclear","usable","clear"]}}}'

The Q8_0 GGUF needs 48 GB. On a 48 GB Mac, use\-\-context 2048. Images are not in the GGUF.

Theaffine Q4 checkpointruns on Apple silicon Macs with 24 GB of memory or more (Kapitsa and MLX). It is a model folder. From a clone ofdrex-decision-models.hfis the Hugging Face CLI (pip install \-U huggingface\_hub).

brew install nace-ai/tap/kapitsa
hf download nace-ai/drex-max-v1-affine-q4 --local-dir ./drex-max-v1-affine-q4
kapitsa-systemone --model ./drex-max-v1-affine-q4 --port 8000 --context 2048
curl --fail-with-body http://127.0.0.1:8000/v1/systemone \
  -H 'Content-Type: application/json' \
  --data-binary @examples/request.json

Images are not in that file.

https://huggingface.co/nace-ai/drex-max-v1#mlxMLX

MLX runs the affine Q4 checkpoint on Apple silicon. From a clone ofdrex-decision-models.hfis the Hugging Face CLI (pip install \-U huggingface\_hub).

python3 -m venv .venv-mlx
source .venv-mlx/bin/activate
python -m pip install -r requirements-mlx.txt
hf download nace-ai/drex-max-v1-affine-q4 --local-dir ./drex-max-v1-affine-q4
python drex_max_mlx.py --model ./drex-max-v1-affine-q4 --request examples/request.json

The command prints System One JSON withmodel,answers, andusage. Questions supportchoice,noul, andscore. Text only.

https://huggingface.co/nace-ai/drex-max-v1#llamacppllama.cpp

Runs the text backbone on Apple silicon (Metal) and on the CPU; images need the Python path. Run these from the repository root:

git clone --branch drex-max-v1 --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 weights/drex-max-v1 --no-mtp --outtype q8_0 \
  --outfile weights/drex-max-v1/drex-max-v1-Q8_0.gguf

llama.cpp/build/bin/llama-server -m weights/drex-max-v1/drex-max-v1-Q8_0.gguf \
  -np 1 -c 16384 -b 16384 -ub 16384 --no-warmup --port 8000

hfis the Hugging Face CLI (pip install \-U huggingface\_hub). The server answersPOST /v1/systemonewith the same request and response as the Python path, minusimages. The Q8_0 GGUF is 27,250,125,216 bytes. The conversion needs the bf16 weights, about 49 GB, on disk. To skip it, download the ready-madeQ8_0 GGUF(hf download nace\-ai/drex\-max\-v1\-Q8\_0 drex\-max\-v1\-Q8\_0\.gguf \-\-local\-dir weights/drex\-max\-v1\-Q8\_0) and pass its path tollama\-server.

Drex Max reads each question as one whole prompt, so\-band\-ubequal\-cand one request holds up to that many tokens. For longer requests setSYSTEMONE\_CONTEXT=Nand use\-c N \-b N \-ub N(Context length).

Tested hardwareApple M5 Pro (18-core CPU, 20-core GPU, 48 GB unified memory, macOS 26.5.2): the Q8_0 GGUF on Metal answersexamples/request\.jsonwithin 0.02 of the bf16 weights run with Python on an NVIDIA H100.

https://huggingface.co/nace-ai/drex-max-v1#ollamaOllama

Use the Nace fork of Ollama with allama\-serverbuilt from thedrex\-max\-v1branch above. Convert the GGUF first, as in the llama.cpp steps.

Build the forkFrom the repository root:

git clone --branch drex-max-v1 --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 thecpupreset andbuild/llama\-server\-cpuin place ofdarwinandbuild/llama\-server\-darwinhere and below.

Write aModelfilenext to the GGUF:

cat > weights/drex-max-v1/Modelfile <<'EOF'
FROM ./drex-max-v1-Q8_0.gguf
CAPABILITY decision
PARAMETER num_ctx 16384
PARAMETER num_gpu 40
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-max-v1 -f weights/drex-max-v1/Modelfile
jq '. + {model: "drex-max-v1"}' examples/request.json | curl http://127.0.0.1:11434/v1/systemone \
  -H 'Content-Type: application/json' -d @-

Ollama needs"model"in the request, which thejqfilter adds.num\_gpu 40offloads 40 layers to Metal on a 48 GB Mac; usePARAMETER num\_gpu 0for the CPU. The default is 16,384 tokens; for longer requests setPARAMETER num\_ctx N, import again, and start the daemon withSYSTEMONE\_CONTEXT=N.

Tested hardwareThrough Ollama on the Apple M5 Pro above, the Q8_0 GGUF withnum\_gpu 40gives the same answers asllama\-server.

https://huggingface.co/nace-ai/drex-max-v1#filesFiles

model\-\*\.safetensors,config\.jsonThe 27B backbone after the decision fine-tune (bf16)readout\.safetensorsThe 255-way decision headdecision\_config\.jsonOption codes, temperature and the non-causal attention settingcode/drex\_max/The loader: attention mask, readout and imagesinference\.pyScores a request from a checkpoint directory

Similar Articles

New Sota 27B local Decision model: Drex Max 2.0

Reddit r/LocalLLaMA

Nace releases Drex Max 2.0, a 27B multimodal decision model for computer-use agents that scores options in a single forward pass with millisecond latency, priced at $0.06 per million input tokens via the Nace API.