Matilda Decision v1

Matilda Decision is a 27B multimodal decision model from Maincode. You give it an input (text or JSON, optionally with images) and the questions you need answered: pick one of several options, say yes or no, or rate on a scale. It answers them all in one call and returns a probability for every answer, without generating text.

Parameters 26.1B, including the vision encoder
Inputs Text or JSON, plus images (several per request, up to 1.6 MP each)
Decision types Choice (up to 255 options) · Yes / No · Score
License Apache-2.0

Evaluation

These are results on the public sets only, for now.

Text: Jev Decision Index 0.3, public suite

All 140,178 public requests answered, none unsupported.

Model Public index ↑ Knowledge & Reasoning Language Retrieval & Classification Tools & Automation Arts & Taste
Matilda Decision v1 (27B) 65.38 51.1 71.3 67.6 84.6 47.4
Torchcast Decision 27B 65.10 46.7 72.0 67.5 84.6 54.4
Perplexity Decider v1.1 (27B) 62.25 52.0 67.5 61.3 78.9 47.0
Jev 57.96 53.9 59.2 55.4 75.1 39.1

Matilda Decision: our run with the official 0.3 kit. Others: Decision Index 0.3 board, public results (area scores computed from the board's per-benchmark results with the kit's own scoring).

Quickstart

pip install "transformers==5.17.0" torch torchvision pillow safetensors
pip install flash-linear-attention  # optional: fast GPU kernels for the linear-attention layers
import json

from transformers import AutoModel

model = AutoModel.from_pretrained("Maincode/matilda-decision-v1", trust_remote_code=True)

# Text
result = model.system_one(
    state="The order arrived damaged yesterday. The customer has a receipt and asks for a replacement today.",
    questions={
        "route": {
            "type": "choice",
            "instructions": "Which team should handle this request?",
            "criteria": {
                "returns": "Refunds, replacements and damaged deliveries",
                "billing": "Payments, invoices and charges",
                "technical": "Product setup and faults",
            },
        },
        "receipt": {"type": "noul", "instructions": "Does the customer have a receipt?"},
        "urgency": {
            "type": "score",
            "instructions": "How urgent is this request?",
            "criteria": ["Routine", "Soon", "Today"],
        },
    },
)
print(json.dumps(result["answers"], indent=2))

# Text and images
result = model.system_one(
    state="The customer says the blender arrived cracked and attached the receipt.",
    images=["receipt.png"],  # local paths, http(s) URLs, PIL images or base64 data URLs
    questions={
        "on_receipt": {"type": "noul", "instructions": "Does the receipt list the blender?"},
        "payment": {
            "type": "choice",
            "instructions": "How was the order paid?",
            "criteria": {"card": None, "cash": None, "gift card": None},
        },
    },
)
print(json.dumps(result["answers"], indent=2))

from_pretrained takes device (default cuda:0 when a GPU is visible) and max_image_pixels (see Images).

Requests and answers

system_one(state=..., questions={id: question, ...}, images=[...]) returns {"model", "answers": {id: answer}, "usage"}. Every question sees the same state and images.

type criteria answer
choice {option: description or None}, 1–255 options choice, probabilities per option, confidence
noul optional {"true": ..., "false": ...} descriptions noul: the probability of yes / true
score level descriptions, lowest first score (expected level), probabilities, legend, confidence

instructions is the question text. state can be a string or any JSON value. It is read as data, not as instructions. Inputs are never truncated: a request over 131,072 tokens raises an error.

Images

  • Size: each image is resized, keeping its aspect ratio, to at most 1,638,400 pixels (1.6 MP, about 1280 × 1280) and at least 65,536. All the results above were measured at this setting, which is the default in the runtime and in processor_config.json.
  • Tokens: one input token per 32 × 32 pixel patch, so about 1,600 for a 1.6 MP image and about 260 for 512 × 512.
  • Order: images go before the text, in the order given.
  • Lower cap: for speed or memory, use AutoModel.from_pretrained(..., max_image_pixels=...). Expect lower accuracy on fine detail such as charts, documents and small text. Caps above 1.6 MP are not validated.

Architecture

Qwen3.8-27B vision-language backbone with a 255-option decision readout. Each question takes one forward pass, and its answer is read from the final prompt position.

Training: post-trained from Qwen3.8-27B in several stages: supervised fine-tuning on decisions across text and images, then reinforcement learning.

The model was trained with bidirectional attention: its full-attention layers see the whole prompt at once, rather than only the tokens before each position. It must be served the same way. trust_remote_code=True loads the bundled runtime (matilda_decision_runtime.py), which sets this up. Loading the weights as a plain causal backbone, or serving them in a causal engine, gives different and worse answers.

License

Apache-2.0 (LICENSE). Built on Qwen/Qwen3.8-27B (Apache-2.0).

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

Model tree for Maincode/matilda-decision-v1

Base model

Qwen/Qwen3.8-27B
Finetuned
(559)
this model

Collection including Maincode/matilda-decision-v1