Skip to content

DocsGet started

3 min read · updated

Get started

Run decisio and get your first answer in about five minutes. A text and questions go in; a probability for every option comes out, in one call.

Four steps: pick your machine, start a server, ask a question and read the answer.

Figure · Request flow

The text is read once; every question is answered from that one read.

One request, three questions, 79.1 ms on the server. Each bar is the likeliest option's probability.

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 probabilities are rounded to two places.

Your machineIts guide
Linux with an NVIDIA cardOn a cloud GPU
Linux with an NVIDIA card and DockerWith Docker
Mac with Apple siliconOn a Mac
Mac, Linux or Windows with Ollama 0.35.1 to 0.40.3With Ollama
Any machine, for developmentFor development

The memory and card each machine needs are on Requirements and limits. The steps below use the CPU stand-in, which runs on any machine. On any other machine, start the server as its guide says and go on from step 3.

You need Python 3.12, uv and git. The first start downloads a small model from Hugging Face.

git clone --branch v0.35.0 https://github.com/aminry/decisio
cd decisio
uv sync --extra dev --frozen
uv run python -m decisio.serve.vllm_engine --backend hf --model Qwen/Qwen3-0.6B-Base

Run against the CPU stand-in at v0.35.0 on 2026-10-26: the clone is the pinned release, as the check has it; the install and the server start.

The server listens on http://127.0.0.1:8000. It is ready when /health answers:

curl -s http://127.0.0.1:8000/health

Run against the CPU stand-in at v0.35.0 on 2026-10-26. It printed, trimmed to the fields this page uses:

{
 "ok": true,
 "base": "qwen3.6-35b-a3b"
}

This small model is for development, so its probabilities are not the default model’s. The answer in step 4 is the default model’s, Gemma 4 31B.

One POST to /v1/systemone: the text goes in state, and each question has a name you choose, a type and instructions.

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.

  • noul is a yes or no question; its answer is the probability of yes.
  • choice picks among named options, up to 255; the options are its criteria.
  • score picks a level on a scale, listed lowest first.

Each question comes back under its own name. A choice gives its likeliest option and the probability of every option, so you see how sure it is as well as what it picked.

Figure · The request and its response

Every question gets its own answer, with a probability for every option.

Request

{
  "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"
      ]
    }
  }
}

Response (abridged)

{
  "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
      }
    }
  }
}

Hover or focus a line: its partner on the other side lights up, and what it is appears here.

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.

Good to know:

  • A request the server cannot read gets status 422, with a detail that names what is wrong.
  • The model field does not choose a model: a server serves the one model it was started with.
  • Call it from your code: the same request from Python, JavaScript and TypeScript, and the frameworks.
  • On a cloud GPU: run the default model, Gemma 4 31B, on your own card.
  • Teach a task: teach a question you ask again and again, and certify its answers.