Introducing decision-machine-1: a language model for decisions, not prose

decision-machine-1 Available now

Sub-second decision intelligence.

A language model for the decisions inside your software. It reads a message, a ticket, or a page and returns a typed answer with a probability attached, and never writes a sentence back.

Typical latency
0.5–1.3 s
End to end, network transit included.
Price
$0.04
Per million input tokens. Output is free.
Capabilities
Eight
One typed decision each, plus an OpenAI-compatible route.
Per request
20,000 chars
Or up to 32 texts in a single batch.

01The business case

decision-machine-1

Deciding stops being the bottleneck.

Most of what slows an operation down is not the work. It is the waiting for someone to decide. This decides, in about a second, for a hundredth of the price.

No queue
Answers in about a second, so decisions happen while the customer is still on the page, not overnight in a batch.
Score everything
$0.04 per million input tokens, and nothing for output. Checking every message costs less than working out which ones to skip.
Doubt, measured
Every answer carries a probability. Clear cases go straight through, close calls go to a person.
Defensible
Same input, same typed answer, with the scores behind it. A decision you can put in front of a regulator.

02The model

decision-machine-1

It's like generative AI. Without the generation.

In software, an answer often decides a branch, a field, or a score. The application needs the value, not the prose around it, so decision-machine-1 stops at the value.

  • Routing a support message
    With an LLM A prompt, a retry when the JSON comes back malformed, and a single label you have to take on faith.
    With decision-machine-1 The label, its probability, and the score of every other label you offered, all in one typed response.
  • Pulling a field off a document
    With an LLM A paragraph you parse, or a schema the model quietly reshapes when it feels like adding a field.
    With decision-machine-1 The object your JSON Schema describes, typed, with the character offsets the values came from.
  • Knowing when it is unsure
    With an LLM Ask for a confidence score and you get a number the model wrote, not a number it measured.
    With decision-machine-1 A probability distribution over the options you gave it. Two labels at 0.5 each is a case for a human, and it says so.
  • What a call costs
    With an LLM You pay for the thinking and for the answer, and both grow with the question.
    With decision-machine-1 $0.04 per million input tokens. The price follows the text you send, not the number of labels, statements, or questions you ask about it.
  • What a call takes
    With an LLM Seconds, and a queue behind it once you need the answer on the request path.
    With decision-machine-1 Half a second to a second and a third, network included. It belongs on the request path.

03Specification

decision-machine-1

Everything it is, on one page.

One hosted model, one base URL, one price. What it will not do is part of the specification, not a caveat.

Model

Name
decision-machine-1
Category
Decision model Part of milliseconds.ai, a family of fast, accurate decision models by CloudRaker.
Task
Typed decisions over text Classification, scoring, span selection and schema filling. No free-form generation.
Runtime
CPU encoder models No GPU in the request path, which is where the latency floor comes from.
Availability
Hosted API

Interface

Native routes
POST /v1/decision-machine-1/{capability} One route per capability, each with its own request and response type.
OpenAI-compatible
POST /v1/chat/completions Extraction and function calling from an OpenAI client you already have.
Authentication
Authorization: Bearer sk-ms-... Required on every /v1 route.

Limits

Input per text
20,000 characters Text over 2,000 characters is chunked automatically.
Batch
32 texts per request Send `text` or `texts`, never both. Results come back in input order.
Response headers
x-input-chars, x-input-tokens, x-inference-ms Every call reports what it read and how long the inference took.
Language
Non-English text, English labels The label text is what the model reads, so keep labels in English.

Price

Input
$0.04 per million tokens The same price on every capability and on the OpenAI-compatible route.
Output
$0 Probability distributions, spans and batch results cost nothing, however large.

Not in scope

Generation
None Every span it returns is a span of your input, with offsets. It does not summarize or rewrite.
Reasoning
Single pass No chain of thought, no multi-step deliberation.
Conversation
Stateless No system prompts, no context between calls, no token streaming.

04Capabilities

decision-machine-1

One model. Eight capabilities.

Each one asks a different question of the same text and answers in its own type. Pick the one that matches the decision your code has to make.

curl -X POST https://api.milliseconds.ai/v1/decision-machine-1/yes-no \
  -H "Content-Type: application/json" \
  -H "authorization: Bearer sk-ms-..." \
  -d '{
    "text": "I need this fixed today, my launch is tomorrow.",
    "statements": [
      "The customer expresses urgency.",
      "The customer is asking about shipping."
    ]
  }'
{
  "results": [
    { "statement": "The customer expresses urgency.", "answer": true, "probability": 1 },
    { "statement": "The customer is asking about shipping.", "answer": false, "probability": 0 }
  ]
}
curl -X POST https://api.milliseconds.ai/v1/decision-machine-1/classify \
  -H 'content-type: application/json' \
  -H 'authorization: Bearer sk-ms-...' \
  -d '{
    "text": "I was charged twice for my subscription this month and support has not replied.",
    "labels": {
      "billing": "payments, invoices, charges, refunds",
      "shipping": "delivery, tracking, returns of physical goods",
      "account": "login, password, profile settings"
    }
  }'
{
  "label": "billing",
  "probability": 0.995,
  "confidence": 0.97,
  "scores": {
    "billing": 0.995,
    "shipping": 0,
    "account": 0.005
  }
}
curl -X POST https://api.milliseconds.ai/v1/decision-machine-1/classify-tree \
  -H 'content-type: application/json' \
  -H 'authorization: Bearer sk-ms-...' \
  -d '{
    "text": "62-year-old man with crushing substernal chest pain radiating to the left arm for 40 minutes, sweating, and ST elevation in leads II, III and aVF.",
    "tree": {
      "cardiovascular": {
        "description": "heart and blood vessels: chest pain, arrhythmia, heart failure, hypertension",
        "labels": {
          "ischemic": {
            "description": "reduced blood flow to the heart: angina, myocardial infarction",
            "labels": {
              "stemi": "ST-elevation myocardial infarction: ST elevation on the ECG",
              "nstemi": "non-ST-elevation myocardial infarction: troponin rise without ST elevation",
              "unstable_angina": "chest pain at rest without a troponin rise"
            }
          },
          "arrhythmia": "abnormal heart rhythm: palpitations, atrial fibrillation, bradycardia",
          "heart_failure": "fluid overload, breathlessness on exertion, swollen legs, reduced ejection fraction"
        }
      },
      "pulmonary": {
        "description": "lungs and airways: cough, breathlessness, wheeze, pneumonia",
        "labels": {
          "infection": "pneumonia or bronchitis: fever with a productive cough",
          "obstructive": "asthma or COPD: wheeze, chronic cough, smoking history",
          "embolism": "pulmonary embolism: sudden breathlessness, pleuritic pain, low oxygen"
        }
      },
      "gastrointestinal": "digestive tract: abdominal pain, nausea, vomiting, bleeding",
      "neurological": "brain and nerves: headache, seizure, weakness, numbness"
    }
  }'
{
  "path": ["cardiovascular", "arrhythmia"],
  "label": "arrhythmia",
  "probability": 0.739,
  "confidence": 0.433,
  "levels": [
    {
      "label": "cardiovascular",
      "probability": 0.982,
      "confidence": 0.93,
      "scores": {
        "cardiovascular": 0.982,
        "pulmonary": 0.001,
        "gastrointestinal": 0.001,
        "neurological": 0.016
      },
      "input_chars": 456,
      "input_tokens": 112,
      "inference_ms": 585
    },
    {
      "label": "arrhythmia",
      "probability": 0.753,
      "confidence": 0.466,
      "scores": {
        "ischemic": 0.241,
        "arrhythmia": 0.753,
        "heart_failure": 0.006
      },
      "input_chars": 401,
      "input_tokens": 98,
      "inference_ms": 578
    }
  ]
}
curl -X POST https://api.milliseconds.ai/v1/decision-machine-1/rate \
  -H "content-type: application/json" \
  -H "authorization: Bearer sk-ms-..." \
  -d '{
    "text": "Our production database is down and every customer request is failing right now.",
    "scale": ["No impact", "Minor inconvenience", "Degraded service", "Major outage"]
  }'
{"score":2.5,"level":2,"label":"Degraded service","confidence":0.5,"scores":[0,0,0.5,0.5]}
curl -X POST https://api.milliseconds.ai/v1/decision-machine-1/answer \
  -H "content-type: application/json" \
  -H "authorization: Bearer sk-ms-..." \
  -d '{
    "text": "Order 88214 shipped on 3 March 2026 from the Berlin warehouse. The customer, Maria Fischer, paid 249.00 EUR by credit card. Delivery is expected within five working days.",
    "question": "Who is the customer?"
  }'
{
  "question": "Who is the customer?",
  "answer": "Maria Fischer",
  "probability": 0.999,
  "start": 77,
  "end": 90
}
curl -X POST https://api.milliseconds.ai/v1/decision-machine-1/extract \
  -H "content-type: application/json" \
  -H "authorization: Bearer sk-ms-..." \
  -d '{
    "text": "INVOICE #4471\nBilled to: Acme Corp\nCurrency: USD\nPaid: yes\nTotal due: $2,676.00\nPayment terms: Net 30",
    "schema": {
      "type": "object",
      "title": "invoice",
      "properties": {
        "invoice_number": { "type": "string", "description": "invoice number" },
        "customer": { "type": "string", "description": "the company billed" },
        "total_due": { "type": "number", "description": "total amount due" },
        "net_terms_days": { "type": "integer", "description": "payment terms in days" },
        "paid": { "type": "boolean", "description": "is the invoice paid" },
        "currency": { "enum": ["USD", "EUR", "GBP"], "description": "currency code" }
      }
    }
  }'
{
  "data": {
    "invoice_number": "4471",
    "customer": "Acme Corp",
    "total_due": 2676,
    "net_terms_days": 30,
    "paid": true,
    "currency": "USD"
  }
}
curl -s -X POST https://api.milliseconds.ai/v1/decision-machine-1/entities \
  -H 'content-type: application/json' \
  -H 'authorization: Bearer sk-ms-...' \
  -d '{
    "text": "Tim Cook announced the iPhone 17 in Cupertino on 9 September.",
    "types": ["person", "product", "location"]
  }'
{
  "entities": [
    {"type": "person", "text": "Tim Cook", "probability": 0.999, "start": 0, "end": 8},
    {"type": "product", "text": "iPhone 17", "probability": 0.993, "start": 23, "end": 32},
    {"type": "location", "text": "Cupertino", "probability": 0.999, "start": 36, "end": 45}
  ]
}
curl -X POST https://api.milliseconds.ai/v1/decision-machine-1/verify \
  -H "content-type: application/json" \
  -H "authorization: Bearer sk-ms-..." \
  -d '{
    "text": "INVOICE #4471 - Acme Corp. Issued 2026-03-02. Net 30. Subtotal $2,500.00. Tax $176.00. Total due $2,676.00.",
    "field": {
      "name": "invoice_number",
      "description": "The invoice number printed on the document"
    },
    "value": "4471"
  }'
{"matches":true,"probability":0.689,"found":["4471"]}

05Beside your LLM

decision-machine-1

Keep your LLM. Call it selectively.

This is not a replacement. It is a first pass. Run the cheap typed decision first, accept the results that clear your threshold, and escalate only the ambiguous ones to a large model or to a person.

The threshold is yours to set, because the model hands you the numbers to set it with: a probability, a confidence, and the score of every option you offered. When two labels come back at 0.5 each, that is not a failure. That is the model telling you the text is genuinely ambiguous, which is exactly the case worth a second look.

  • Route on the numbers. Accept above your threshold, escalate below it.
  • Gate an LLM call, so the expensive model only sees the cases that need it.
  • Verify what a larger model produced against the source it was given.

06Pricing

decision-machine-1

Small decisions. At large scale.

Score every incoming message, check every extracted field, rate every ticket. The price follows the text you send, so the bill scales with your traffic and not with how much you ask about it.

$ 0.04

per million input tokens. Output is free: probability distributions, spans and batch results cost nothing, however large they come back.

Output tokens
$0
Every capability, and the OpenAI-compatible route
same price
Labels, statements and questions you ask about a text
not billed
A brief support message
far under a cent

07Integration

decision-machine-1

Keep the client you already have.

An OpenAI-compatible route accepts JSON Schema extraction and function calling from any OpenAI client. Point the base URL at api.milliseconds.ai and set the model. Plain chat is rejected with a 400, on purpose.

curl -X POST https://api.milliseconds.ai/v1/chat/completions \
  -H "content-type: application/json" \
  -H "authorization: Bearer sk-ms-..." \
  -d '{
    "model": "decision-machine-1",
    "messages": [
      {
        "role": "user",
        "content": "Book me a table for 4 at Nobu on Friday at 8pm"
      }
    ],
    "response_format": {
      "type": "json_schema",
      "json_schema": {
        "name": "booking",
        "schema": {
          "type": "object",
          "properties": {
            "restaurant": { "type": "string" },
            "party_size": { "type": "integer" },
            "day": { "type": "string" },
            "time": { "type": "string" }
          }
        }
      }
    }
  }'
{
  "id": "chatcmpl-7f3a1c2e9b8d4e6f0a1b2c3d",
  "object": "chat.completion",
  "created": 1789000000,
  "model": "decision-machine-1",
  "choices": [
    {
      "index": 0,
      "message": {
        "role": "assistant",
        "content": "{\"restaurant\":\"Nobu\",\"party_size\":4,\"day\":\"Friday\",\"time\":\"8pm\"}"
      },
      "finish_reason": "stop"
    }
  ],
  "usage": {
    "prompt_tokens": 12,
    "completion_tokens": 16,
    "total_tokens": 28
  }
}

08In Paperwork

decision-machine-1

A sub-second decision layer for smarter paperwork.

This is the path a request takes through the Paperwork API. decision-machine-1 is the first thing it touches. It decides where the work goes, and whether a reasoning model needs to be woken up at all.

Every step but the decision already exists on CloudRaker. What it adds is the ability to put a judgement call in the request path without paying a large model to make it.

  1. Intent

    A person or an agent asks for something

    A message, a ticket, an uploaded file, a tool call from an agent.

    • Route

      Agent

      Hand the work to the right agent, with the label already decided.

    • Trigger

      API

      Call the capability the decision selected, and nothing else.

    • Decide

      Workflow

      Branch a playbook, approve, escalate or hold, on a number.

    • No

      Straight to the action

      Most of the traffic. The decision was the whole job, and no large model is woken up.

    • Yes

      Call a reasoning model

      The ambiguous remainder, and only it, which is what keeps the bill flat.

      • rakedoc-nano
      • your LLM
  2. Paperwork capabilities

    The work itself

    Whatever the decision selected, run on the document: one surface, one contract, one audit trail.

    • Parse
    • Classify
    • Split
    • Extract
    • Redact
    • Fill
    • Compose
    • Sign
  3. Output

    A task done, not a paragraph

    Structured fields, a signed document, a webhook into the system of record, with the decision and its probability attached to the run.

09Questions

decision-machine-1

Important questions, fast answers.

Does structured output mean the answer is correct?

No. It means the answer is the right shape and comes with a number you can act on. A typed response removes parsing failures, not model error. That is why every call returns a probability and the full score distribution, so you can set a threshold and route what falls below it.

When should I use an LLM instead?

Whenever you need new text (a summary, a reply, a rewrite), or reasoning across several steps, or world knowledge that is not in the text you sent. decision-machine-1 only ever returns spans of your input and scores over options you defined.

What do probability and confidence tell me?

Probability is the weight on the winning option. Confidence describes how clearly the distribution separates it from the rest. A label at 0.51 with a confidence of 0.02 and a label at 0.51 with a confidence of 0.9 are very different situations, and only the second one is safe to automate.

Can I keep my OpenAI SDK?

Yes, for extraction and function calling. Point your client's base URL at https://api.milliseconds.ai and set the model to decision-machine-1. Plain chat is rejected with a 400. There is no conversation to have.

Does it handle languages other than English?

It reads text in other languages. Keep the labels, statements, questions and field descriptions in English. That wording is what the model actually reads when it scores your options.

How does batching affect price and latency?

Send up to 32 texts in one request and results come back in input order. You are billed on the input tokens of each item, and the overhead of asking several things about one text is small: two statements measured 0.49 s, three questions 0.40 s.

Where to go next

decision-machine-1 is one of three.

Same infrastructure under each one. Pick the model that fits the input you actually have.

rakedoc-nano
An open-weight vision model for document parsing. Clean markdown, structured tables, and a bounding box on every element it emits, down to the table cell.
See rakedoc-nano
rakeaudio-asr
Speech to text with speaker diarization, because a conversation is a document too. Recordings come back in the same shape a page does.
See rakeaudio-asr
Get started

Start with a real task.

Take a classification or extraction you already send to an LLM. Compare the accuracy, the latency and the cost on representative inputs, then keep whichever wins.

milliseconds.ai is a category of fast, accurate decision models by CloudRaker, the paperwork infrastructure for the agentic era.

milliseconds