# How it works

> Send a text and your questions; decisio reads the text once and gives a probability for every option, in one call, with no text generated.

Source: https://opendecisio.com/docs/how-it-works/

A support ticket and three [questions](https://opendecisio.com/docs/glossary/#question) about it:

 

```
curl http://127.0.0.1:8000/v1/systemone \
  -H 'Content-Type: application/json' \
  -d '{
  "state": "I was charged twice for October. Both charges are 49.00 EUR, same day. Please refund one.",
  "questions": {
    "urgent": {
      "type": "noul",
      "instructions": "Does this ticket need a response within the hour?"
    },
    "queue": {
      "type": "choice",
      "instructions": "Which team should handle this ticket?",
      "criteria": {
        "billing": "Invoices, payments, refunds, prices, VAT",
        "access": "Login, passwords, two-factor, SSO, permissions, invitations, account security",
        "bug": "The product behaves wrongly: errors, crashes, wrong numbers, lost data",
        "feature": "A request for something the product does not do yet",
        "cancellation": "Cancelling, pausing or closing an account, deleting data",
        "other": "Press, partners, jobs, sales pitches, wrong address, thanks, general questions"
      }
    },
    "impact": {
      "type": "score",
      "instructions": "Rate the business impact using only the reported facts.",
      "criteria": [
        "No function impaired",
        "One user impaired, with a workaround",
        "Many users blocked from a core function",
        "Data loss or legal exposure"
      ]
    }
  }
}'
```

 

Run against the CPU stand-in at v0.35.0 on 2026-10-26: the answers are the stand-in's, not the default model's.

 

```
{
  "answers": {
    "urgent": {
      "type": "noul",
      "noul": 0.159
    },
    "queue": {
      "type": "choice",
      "choice": "billing",
      "probabilities": {
        "billing": 0.962,
        "access": 0.011,
        "bug": 0.016,
        "feature": 0.004,
        "cancellation": 0.005,
        "other": 0.003
      }
    },
    "impact": {
      "type": "score",
      "probabilities": {
        "0": 0.256,
        "1": 0.648,
        "2": 0.053,
        "3": 0.042
      }
    }
  }
}
```

 

Recorded output.

 

Recorded decision: Gemma 4 31B, decisio 0.17.0, RTX PRO 6000 at 600 W, 2026-10-19, on the plain layout; record 1 of 60 of decisio-examples' support-routing run, sent again on that release; the response is abridged and its probabilities are rounded to three places.

 

## 1 The request flow

  

- The text is read once per request, and every question is answered from that read.
- On the default model the questions are answered together; on the other two, one after another. Either way they pick the same [options](https://opendecisio.com/docs/glossary/#option) on every item measured.
- A later request about the same text starts from what was read, so it is quick, when it asks the same questions; under the [plain layout](https://opendecisio.com/docs/glossary/#prompt-layout), any question does.

 

## 2 One decision and its probabilities

 

[Figure: A question is one prompt; its answer is read at one position, with no text generated. One support-ticket question with 6 lettered options becomes one prompt. The model's distribution over the letters at the answer position is the answer: A billing 0.96, B access 0.01, C bug 0.02, D feature 0.00, E cancellation 0.01, F other 0.00.]

 

Each question becomes one prompt that ends where the answer goes, and decisio reads the model’s [probability](https://opendecisio.com/docs/glossary/#probability) for each option at that point. On the Gemma models the prompt first lists every question of the request, then the text, then the question; the figure shows the plain layout, the text then the question, that it was recorded on ([Choose the prompt layout](https://opendecisio.com/docs/layout/)). The probabilities add up to 1, and three things shape them:

  

| What | Where it comes from |
| --- | --- |
| The model’s own setting | fitted once per model; it never changes which option is likeliest |
| Your [task](https://opendecisio.com/docs/glossary/#task)’s correction | learned from your labelled examples, and kept only when it helps |
| The certified [threshold](https://opendecisio.com/docs/glossary/#threshold) | set when you certify a task: answers at or above it are certified |

 

A task’s correction makes the probabilities more honest: on six held-out tasks, 20 labelled examples each lowered the [calibration error](https://opendecisio.com/docs/glossary/#calibration-error) from 0.058 to 0.037 (the Qwen model, 900 test items, 2026-09-29).

 

## 3 Teach, then certify, then route

 

[Figure: Teach the question, certify its answers, route on the certificate, and let the server watch. Three steps and a watch. 1, teach: your labelled examples fit a correction to your question. 2, certify: examples held back set a threshold with an error target. 3, route: certified answers act on their own and the rest go to a person. The server watches the traffic and suspends certificates when it shifts. Teach a task, Certify answers and Watch for drift each take one of these.]

 

On the support inbox, 43.3% of the messages were answered on their own at a 5% [error target](https://opendecisio.com/docs/glossary/#error-target) (BANKING77, Gemma 4 31B; [Certify answers](https://opendecisio.com/docs/tasks/certify/)).

 

Measured on decisio 0.14.0, Gemma 4 31B on one RTX PRO 6000 Blackwell, 2026-10-16 to 2026-10-18.

 

- After upgrading decisio, certify your tasks again.
- A certificate covers one task on one [serving setup](https://opendecisio.com/docs/glossary/#serving-setup). Certify again when you change either.

 

## 4 Where it runs

 

[Figure: The same server and the same routes everywhere; only the engine under it changes. The same decisio server and routes on four engines: One NVIDIA card, stock vLLM with decisio's plugin; Docker, vLLM's release image with decisio inside; A Mac, MLX, from an MLX build of the model; Any machine, for development, a small model on the CPU. Each links to its deploy guide.]

 

## What repeats

  

| Model | Asked again, on the same server | Many questions in one request | After a restart |
| --- | --- | --- | --- |
| Gemma 4 31B | exactly, on a freshly started server; on one that has already answered, 5 of 200 moved, by at most 0.031, with no top answer changed | the same choice on every item measured; probabilities within 0.0073 | not promised |
| Gemma 4 12B | a first read and a cached read can differ, by up to 0.113 | the same choice; probabilities within 0.035 | not promised |
| Qwen3.6-35B-A3B | the same probabilities every time | the same probabilities as each question on its own | an earlier record matched in most starts measured |

 

The top answer rarely moves: on the 12B, one choice of 60 changed between a first and a cached read. Exact numbers repeat only on one running server.

 

## Under the hood

 

- decisio runs on stock vLLM 0.31.0: a plugin registers its model classes, and no patch is needed.
- Every model is an official checkpoint, frozen: no training, no fine-tuning, no adapter unless you serve one with `--adapter`.
- A taught task’s [intent head](https://opendecisio.com/docs/glossary/#intent-head) reads the model’s internal representation of the text at the answer position.
- On a Mac, the MLX engine answers each question on its own from one shared read of the text.

 

## What next

 

- [Teach a task](https://opendecisio.com/docs/tasks/): teach decisio your question from labelled examples.
- [Certify answers](https://opendecisio.com/docs/tasks/certify/): the promise behind a [certified answer](https://opendecisio.com/docs/glossary/#certified-answer).
- [Choosing a model](https://opendecisio.com/docs/bases/): which of the three models to serve.
