System One
POST /v1/systemone evaluates a piece of content against a set of typed
questions and returns a structured answer for each one, with a calibrated
probability attached. It is not a chat endpoint: there is no prompt, no
message history, and no generated prose. You describe what you want decided,
and the model returns values your code can branch on.
This suits the decisions that sit in the middle of an automation — is this
ticket a refund request, which queue does it belong in, how severe is it —
where a chat model would return a sentence you then have to parse, and where
the confidence behind the answer matters as much as the answer itself.
Quick start
curl -X POST "https://api.llmapi.ai/v1/systemone" \
-H "Authorization: Bearer $LLM_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"model": "jev-latest",
"state": "My order never arrived and I want my money back.",
"questions": {
"is_refund": {
"type": "noul",
"instructions": "Is the customer asking for a refund?",
"criteria": {
"true": "The customer wants money returned",
"false": "The customer wants something else"
}
}
}
}'
{
"model": "jev-1.13.0",
"answers": {
"is_refund": { "type": "noul", "noul": 0.97 }
},
"usage": { "input_tokens": 296, "output_tokens": 20 }
}
Each key in questions appears under the same key in answers, so you choose
the names your code reads.
Request fields
| Field |
Required |
Description |
model |
Yes |
Decision model ID. Check the model catalog for availability and pricing. |
state |
Yes |
The content to evaluate. A string, a JSON object, or an array of text values. Text only. |
questions |
Yes |
A map of your own question IDs to question objects. Each question is answered independently. |
Question types
Every question object carries a type, free-text instructions, and a
criteria value whose shape depends on the type.
noul — yes or no
criteria is an object defining what true and false mean. The answer is a
single probability between 0 and 1.
{
"type": "noul",
"instructions": "Does this message contain personal data?",
"criteria": { "true": "It contains personal data", "false": "It does not" }
}
{ "type": "noul", "noul": 0.12 }
choice — pick one option
criteria is an object mapping each option to a description, up to 255
options. The answer names the chosen option, the probability of every option,
and a confidence score.
{
"type": "choice",
"instructions": "Which team should handle this ticket?",
"criteria": {
"billing": "Payments, invoices, refunds",
"technical": "Bugs, outages, integration problems",
"sales": "Pricing questions and upgrades"
}
}
{
"type": "choice",
"choice": "billing",
"probabilities": { "billing": 0.88, "technical": 0.09, "sales": 0.03 },
"confidence": 0.88
}
score — grade against a rubric
criteria is an ordered array of 2 to 10 levels, lowest first. The answer is a
probability-weighted score, so it can land between levels, along with the
legend, the per-level probabilities, and a confidence score.
{
"type": "score",
"instructions": "How urgent is this ticket?",
"criteria": ["Not urgent", "Answer this week", "Answer today", "Page someone now"]
}
{
"type": "score",
"score": 2.15,
"legend": {
"0": "Not urgent",
"1": "Answer this week",
"2": "Answer today",
"3": "Page someone now"
},
"probabilities": { "0": 0.02, "1": 0.15, "2": 0.49, "3": 0.34 },
"confidence": 0.49
}
Acting on confidence
The probabilities are calibrated, which is what makes a threshold meaningful:
route automatically above it, and send the rest to a human.
answer = response["answers"]["team"]
if answer["confidence"] >= 0.85:
assign(answer["choice"])
else:
send_to_triage()
Pick the threshold from your own tolerance for a wrong automatic decision, and
measure it against real traffic rather than guessing.
Notes
- Ask several questions in one request. They share the same
state, so one call is cheaper and faster than one call per question.
- Responses arrive in one piece. There is no streaming and no batch submission.
state is text only — no image, audio, or video input.
state plus the longest single question must fit the model's context window; see the model catalog for the limit.
- The gateway validates question shapes before forwarding, so a malformed rubric or an over-long option list returns
400 naming the offending field.
- A request can fail for an unknown model, a malformed question, insufficient credits, a rate limit, or a provider error.
API operation: POST /v1/systemone