File size: 12,211 Bytes
c76e32f
f8312ed
 
 
c76e32f
 
 
 
 
 
 
8b59481
c76e32f
 
 
 
8b59481
 
 
 
 
 
 
 
 
79f4f3e
8b59481
 
 
c76e32f
 
 
 
 
221bf1a
c76e32f
 
221bf1a
8b59481
 
 
 
c76e32f
 
87ff6b0
c76e32f
ba0479f
 
79f4f3e
ba0479f
 
 
 
79f4f3e
 
 
8b59481
79f4f3e
8b59481
79f4f3e
8b59481
d69cdd5
 
 
8fbe6f7
 
c76e32f
 
1c934b7
8fbe6f7
 
8b59481
f8312ed
 
 
 
c76e32f
8b59481
c76e32f
8b59481
 
 
 
 
 
79f4f3e
8b59481
79f4f3e
2a08aa6
 
 
8b59481
 
 
79f4f3e
 
8b59481
 
 
 
 
 
 
 
2a08aa6
 
 
 
 
 
 
 
8b59481
d69cdd5
 
 
 
 
 
 
 
 
 
 
 
 
 
 
8b59481
 
 
 
 
 
 
 
 
 
 
 
 
c76e32f
 
 
8b59481
 
 
c76e32f
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
8fbe6f7
c76e32f
 
8b59481
 
c76e32f
 
8b59481
c76e32f
 
8b59481
c76e32f
8b59481
c76e32f
 
8b59481
c76e32f
8b59481
 
c76e32f
 
 
8fbe6f7
 
 
c76e32f
 
 
f8312ed
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
---
license: other
license_name: machinepulse-community
license_link: https://huggingface.co/MachinePulseAI/karpo-decision-31B/blob/main/LICENSE
library_name: transformers
base_model: google/gemma-4-31B-it
base_model_relation: finetune
pipeline_tag: text-classification
tags:
  - decision-model
  - decision-index
  - system-one
  - gemma4
model-index:
  - name: karpo-decision-31B
    results:
      - task:
          type: text-classification
          name: typed decision (choice / noul / score)
        dataset:
          type: mixed
          name: Decision Index 0.4.1, private tests (60% same skills, 40% new domains)
        metrics:
          - type: decision_index_full
            value: 73.86
            name: "Decision Index 0.4.1, Full score (leaderboard, 12 November 2026; rank #1, the highest score)"
        source:
          name: Decision Index leaderboard
          url: https://huggingface.co/spaces/multimodalart/jev-decision-index
      - task:
          type: text-classification
          name: typed decision (choice / noul / score)
        dataset:
          type: mixed
          name: Decision Index 0.3 public suite (140,178 scored requests; the index averages 37 benchmarks)
        metrics:
          - type: decision_index
            value: 75.05
            name: "Decision Index 0.3, public index (chance-corrected; own run of the official kit, same value on the leaderboard)"
        source:
          name: Own run of the official kit
          url: https://huggingface.co/datasets/MachinePulseAI/karpo-decision-31B-decision-index/tree/main/runs/karpo-decision-31B
---

# Karpo Decision 31B

<p>
  <a href="https://github.com/machinepulse-ai/karpo-decision"><img alt="GitHub" src="https://img.shields.io/badge/GitHub-machinepulse--ai%2Fkarpo--decision-181717?style=flat-square&logo=github&logoColor=white"></a>
  <a href="https://huggingface.co/spaces/multimodalart/jev-decision-index"><img alt="Decision Index: #1, Full 73.9" src="https://img.shields.io/badge/Decision_Index-%231_%C2%B7_Full_73.9-FFD21E?style=flat-square"></a>
  <a href="https://huggingface.co/datasets/MachinePulseAI/karpo-decision-31B-decision-index"><img alt="Results" src="https://img.shields.io/badge/Results-Decision_Index_run-0A84FF?style=flat-square&logo=huggingface&logoColor=white"></a>
  <a href="https://huggingface.co/MachinePulseAI/karpo-decision-31B/blob/main/LICENSE"><img alt="License: MachinePulse Community License" src="https://img.shields.io/badge/License-MachinePulse_Community-4b5563?style=flat-square"></a>
</p>

**Ranked #1 on the [Decision Index](https://huggingface.co/spaces/multimodalart/jev-decision-index)**, with the
highest Full score, **73.9**, on the maintainers' private tests (edition 0.4.1, board of 12 November 2026, 300
entries).

<img src="assets/decision-index-full-2026-11-12.png" alt="Decision Index 0.4.1 leaderboard, Full score, 12 November 2026: karpo-decision-31B first with 73.9" width="100%">

*Decision Index leaderboard, Full score, 12 November 2026.*

A multimodal decision model: given a state (a web page and its screenshot, a document, a conversation: text, JSON
and images) and typed questions about it, it returns a probability for every option of every question in one forward
pass, without generating text.
Fine-tuned from [google/gemma-4-31B-it](https://huggingface.co/google/gemma-4-31B-it), with a linear readout over the
options.

- **Parameters:** 31.3B in bf16, plus a 255 × 5,376 readout in fp32
- **Input:** multimodal, text and images (a screenshot at `state.viewport_screenshot`, or data URLs in `images`)
- **Questions:** `choice` (up to 255 options), `noul` (true or false), `score` (a level on a scale)
- **Context:** 32,768 tokens per sequence; a longer request is split by questions, each part with the full state
- **Interfaces:** a Python API and an HTTP server in the System One format (`POST /v1/systemone`)
- **Licence:** [MachinePulse Community License](LICENSE): commercial use is allowed; commercial products and services
  offered to third parties must show "Powered by karpo-decision (MachinePulse)"; production use for commercial
  purposes by an entity whose annual revenue, with its affiliates, exceeds US$10M needs a commercial agreement.
  It applies to the weights in this repository, including the current ones, from November 12, 2026

## Results

### Decision Index leaderboard

The [board](https://huggingface.co/spaces/multimodalart/jev-decision-index) ranks by the Full score, which its
maintainers measure on private tests only: 60% tests of the same skills as the public suite and 40% tasks from new
domains.

| Decision Index 0.4.1, board of 12 November 2026 | karpo-decision-31B |
|---|---|
| **Full score** | **73.9**, rank **#1**, the highest of 300 entries |
| Private tests, same skills (on the public scale) | 70.7 |
| Private tasks, new domains (on the public scale) | 78.6 |
| Public index (our run, adopted by the board) | 75.0 |
| Median latency (one GPU, one request at a time) | 94 ms per request |
| Calibration error | 4.8 points |

The board gives one rank to models within 0.9 points of the first model in a group: karpo-decision-31B (73.9) and
GLiDE 27B (73.4) share #1.

### Decision Index public suite

Our run of the official kit: 140,178 scored requests, 11 unsupported (a question over 32,768 tokens with its state).
Results: [runs/karpo-decision-31B](https://huggingface.co/datasets/MachinePulseAI/karpo-decision-31B-decision-index/tree/main/runs/karpo-decision-31B).

| | score |
|---|---|
| **Public index** (chance-corrected) | **75.0** |
| Raw index | 80.9 |
| Breadth | 74.7 |
| Knowledge & Reasoning | 65.5 |
| Language Understanding | 76.8 |
| Retrieval & Classification | 76.4 |
| Tools & Automation | 88.4 |
| Arts & Human Taste | 68.2 |

## The Karpo Decision family

<img src="assets/karpo-decision-family.png" alt="Score vs. size: Karpo Decision 0.8B to 31B on the Decision Index 0.3 public suite, with the other board models of each size class" width="100%">

*Score vs. size on the Decision Index 0.3 public suite, board of 12 November 2026.*

| Model | Base | Parameters |
|---|---|---|
| **karpo-decision-31B** | Gemma 4 31B | 31.3B |
| [karpo-decision-12B](https://huggingface.co/MachinePulseAI/karpo-decision-12B) | Gemma 4 12B | 12.0B |
| [karpo-decision-9B](https://huggingface.co/MachinePulseAI/karpo-decision-9B) | Qwen3.5 9B | 8.4B |
| [karpo-decision-4B](https://huggingface.co/MachinePulseAI/karpo-decision-4B) | Qwen3.5 4B | 4.5B |
| [karpo-decision-2B](https://huggingface.co/MachinePulseAI/karpo-decision-2B) | Qwen3.5 2B | 2.2B |
| [karpo-decision-0.8B](https://huggingface.co/MachinePulseAI/karpo-decision-0.8B) | Qwen3.5 0.8B | 0.85B |

## How it works

- **A readout, not generation.** Every option is labelled with an option code. At the `Answer: (` slot that ends a
  question's branch, a linear readout scores 255 option codes and a softmax over the question's own options gives the
  probabilities. Nothing is decoded, so the answer is always one of the options.
- **Many questions, one forward pass.** A request is one state and any number of questions, encoded as one sequence:
  the list of questions, the state, then one branch per question with its options.
- **Branch attention.** A branch reads the shared block (questions and state) and itself, never another branch. The
  state is computed once per sequence, and no question sees another question's options.

The question-list-first layout follows [FlexDM](https://github.com/1000luca/FlexDM) and
[jev-brain](https://github.com/wcole3/jev-brain); the shared-block and branch rule follows
[Sieve-31B-v3](https://huggingface.co/sthanika-ai/Sieve-31B-v3).

## Use

Inference code: [github.com/machinepulse-ai/karpo-decision](https://github.com/machinepulse-ai/karpo-decision). Python
3.12 or later and one GPU; the weights take 62.5 GB, long requests more. Loading the checkpoint as a plain chat model
does not reproduce its answers.

```bash
pip install "karpo-decision @ git+https://github.com/machinepulse-ai/karpo-decision"
```

```python
from huggingface_hub import snapshot_download
from karpo_decision.decider import Decider

path = snapshot_download("MachinePulseAI/karpo-decision-31B")
decider = Decider.from_pretrained(path, device="cuda")
response = decider.decide({
    "state": "Order 1182: the customer asks to return a blender bought 45 days ago. Policy: returns within 30 days.",
    "questions": {
        "eligible": {"type": "noul", "instructions": "Is the return eligible under the policy?"},
        "action": {"type": "choice", "instructions": "What should the agent do?",
                   "criteria": {"refund": "Issue a full refund", "decline": "Politely decline the return",
                                "escalate": "Escalate to a supervisor"}},
    },
})
print(response["answers"])
# {"eligible": {"type": "noul", "noul": P(true)},
#  "action": {"type": "choice", "choice": <key>, "probabilities": {<key>: p, ...}, "confidence": c}}
```

HTTP server (`POST /v1/systemone`, `GET /healthz`):

```bash
CKPT=$(python -c 'from huggingface_hub import snapshot_download; print(snapshot_download("MachinePulseAI/karpo-decision-31B"))')
torchrun --standalone --nproc_per_node 1 -m karpo_decision.serve.server --checkpoint "$CKPT" --port 18440
```

[Decision Index](https://github.com/apolinario/decision-index) kit, installed separately:

```bash
pip install "decision-index @ git+https://github.com/apolinario/decision-index"
python -m decision_index run --engine karpo_decision.serve.engine:DecisionIndexEngine \
    --option checkpoint="$CKPT" --out runs/karpo-decision-31B
```

## Lineage

[google/gemma-4-31B](https://huggingface.co/google/gemma-4-31B) → [google/gemma-4-31B-it](https://huggingface.co/google/gemma-4-31B-it)
→ **karpo-decision-31B** (fine-tuned)

## Limitations

- Not a chat or text-generation model; generation was not evaluated.
- A question that does not fit in 32,768 tokens with its state is refused, never truncated.
- It always picks one of the given options.

## Licence

The weights and model files are licensed under the [MachinePulse Community License](LICENSE); this summary is for
convenience and the LICENSE governs. Commercial use is allowed. Commercial products and services offered to third
parties, paid or free, must carry the attribution below; internal use and internal tools, evaluation, testing,
benchmarking, research, and pilots of up to 90 days that serve no paying customers need none. Production use for
commercial purposes by an entity whose annual revenue, with its affiliates, exceeds US$10M needs a separate commercial
agreement: write to contact@machinepulse.ai with the subject line "Karpo Decision licensing: commercial agreement
request". Models fine-tuned, merged, quantized, pruned or distilled from these weights stay under the same licence;
a model trained only on this model's outputs does not.

karpo-decision-31B is a modified version of [google/gemma-4-31B-it](https://huggingface.co/google/gemma-4-31B-it)
([Apache-2.0](https://ai.google.dev/gemma/docs/gemma_4_license)): decoder weights fine-tuned, readout added. Gemma 4
stays under its own licence, a copy of which is in [licenses/Gemma-4-LICENSE](licenses/Gemma-4-LICENSE); see
[NOTICE](NOTICE).

The inference code ([github.com/machinepulse-ai/karpo-decision](https://github.com/machinepulse-ai/karpo-decision))
remains Apache-2.0.

From November 12, 2026, the weights in this repository, including those first published on November 5, 2026, are
distributed under the MachinePulse Community License. Copies obtained before that date under Apache-2.0 keep the rights
that licence granted. Earlier revisions stay in this repository's history so that published results can be
reproduced; copies obtained from them on or after November 12, 2026 are covered by the MachinePulse Community License.

### Attribution

Commercial products and services offered to third parties that use this model or a derivative must show, on a related
website, user interface, about page or product documentation:

> Powered by karpo-decision (MachinePulse)

with a link to <https://huggingface.co/MachinePulseAI/karpo-decision-31B> where the medium allows one.