endpoint
Decider
POST /v1/systemone. The path follows the System One schema that Decider 1 speaks, which is why the typesafe-sdk works against it unchanged.
Send one state and any number of typed questions about it. Decider 1 answers all of them in a single call, and every answer is a probability distribution rather than a bare label, so your code decides how sure it needs to be before acting.
Nothing is generated: each answer is read from the model’s scores for the options you offered, so it can only ever be one of them, and output is never billed. Input costs $0.04 / 1M tokens.
Request
curl https://meragpt.com/v1/systemone \
-H "Authorization: Bearer $MERAGPT_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"model": "decider-1",
"state": {
"channel": "email",
"messages": [
{ "from": "customer", "text": "I was charged twice for September. Refund the duplicate, today please." }
]
},
"questions": {
"refund_requested": {
"type": "noul",
"instructions": "Is the customer asking for money back?"
},
"team": {
"type": "choice",
"instructions": "Which team should handle this?",
"criteria": {
"billing": "Charges, invoices, payments and refunds.",
"technical": "The product is not working as expected.",
"account": "Login, plan changes and access."
}
},
"urgency": {
"type": "score",
"instructions": "How urgent is this?",
"criteria": ["Can wait a week", "Within a few days", "Today", "Immediately"]
}
}
}'| field | type | notes |
|---|---|---|
model | string | decider-1. Optional: omitted, or the typesafe-sdk’s default model name, means Decider 1. |
state | any JSON | Required. What the questions are about: a conversation, an alert, an invoice, an agent trace. |
questions | object | Required. A name for each question, mapped to the question. Up to 64 per request. |
Question types
| type | criteria | answer |
|---|---|---|
noul( boolean also accepted) | Optional: {"true": "...", "false": "..."} describing each side. | The probability of yes. |
choice | Required: each label mapped to a description. 2 to 10 labels. | A probability per label, the most likely label, and its probability. |
score | Required: the levels as an ordered list, lowest first. 2 to 10 levels. | A probability per level, the expected level, and the top level’s probability. |
Every question needs instructions: the question itself, in plain words. Write labels and levels the way you would explain them to a new colleague; the descriptions are part of what the model reads.
Response
{
"id": "req_4f1c9a0b2e7d6c5a3b8e9f01",
"object": "systemone",
"model": "decider-1",
"answers": {
"refund_requested": { "type": "noul", "noul": 0.9034 },
"team": {
"type": "choice",
"choice": "billing",
"confidence": 0.9657,
"probabilities": { "billing": 0.9657, "technical": 0.007, "account": 0.0273 }
},
"urgency": {
"type": "score",
"score": 2.0973,
"confidence": 0.3847,
"legend": { "0": "Can wait a week", "1": "Within a few days", "2": "Today", "3": "Immediately" },
"probabilities": { "0": 0.018, "1": 0.2513, "2": 0.3459, "3": 0.3847 }
}
},
"usage": { "input_tokens": 295, "output_tokens": 0, "cost_usd": "$0.0000118" },
"balance_usd": "$9.99"
}A noul answer is the bare probability of yes, with no separate confidence. A score’s legend and probabilities are keyed by level index. The score is the expected level; the distribution tells you when that average hides a genuine split, as it does above between “today” and “immediately”.
Using the typesafe-sdk
The endpoint speaks the System One schema, so the typesafe-sdk works against it without code changes. Point it here and give it your meraGPT key:
export TYPESAFE_BASE_URL=https://meragpt.com
export TYPESAFE_API_KEY=$MERAGPT_API_KEYRequests the SDK sends with its default model name are answered by Decider 1. To be explicit, pass model="decider-1". Two differences from other System One providers to check before you switch: a request, state and questions together, can hold up to 4,096 tokens, and a choice offers at most 10 labels. For a larger label set, split it into groups with a “none of these” label and ask in two steps.
Speed
One call answers every question over the state together, so twenty questions cost little more than one. A request larger than the context returns 400 input_too_long, never a retryable error. When we are out of capacity for a moment you get 429 with a Retry-After header, which the typesafe-sdk honours on its own; see errors.
One state, or one item per state
Every question reads the whole state. That is the point when the questions are about one thing — a ticket, an alert, a trace — and each answer draws on all of it. It is a trap when they are not: batch several independent items into one state and a question about the first is answered in the light of the others. Measured on a moderation batch, a message scored 0.08 on a trait alone and 0.74 with a different, unrelated offending message beside it.
So batch questions, not items. Ask twenty questions about one conversation in a single call, and send separate calls for separate items you want judged independently. Sharply worded, single-trait questions also separate better than broad ones: “does this contain a lookalike link?” discriminates where “is this harmful?” bunches answers in the middle.
Size limits through a library
A request — the state and every question together — must fit 4,096 tokens. Over that you get 400 input_too_long, never a retryable error, so a caller knows to send less rather than to try again.
Worth checking if you reach us through a library that assembles the state for you. LiteLLM’s relevance guardrail, for example, packs up to 4,000 characters per tool result into one request, which can exceed the context on its own — and when the call fails it forwards the original request unchanged, so the guardrail quietly does nothing. Cap what it packs, or split the state across calls.
Every response carries the request id twice, as X-Request-Id and as X-TypeSafe-Request-Id, so whichever of the two your client reads, you have an id to quote. Look it up at GET /v1/requests/{id} — see errors.
What it is not for
- Open-ended answers. It picks between the options you give it and cannot write anything else.
- Facts it would need to look up. It decides from the state you send and knows nothing beyond it.
- Questions with more than ten options. Split a large label set into groups with a "none of these" option.
Limitations
- The reference answers on this benchmark come from an ensemble of teacher models, so a score here measures agreement with that ensemble, not ground truth.
- Every number comes from a single evaluation run.
- Text state only — no images, audio or video — and at most ten options per choice question.
Benchmarks and the full comparison are on the model page.
Worked examples
The cookbooks have runnable recipes with real output, including routing a support email, confidence-gated actions, RAG passage filtering and output guardrails. Start with this one.