Evaluate Questions
Last updated October 7, 2026
The decision endpoint for the TypeSafeAI System One protocol — compatible with the official SDKs, for decision models such as Jev.
This endpoint is compatible with TypeSafeAI's System One API and works with the official SDKs (typesafe-sdk, @typesafe-ai/sdk) as-is — just point the base URL here.
Authenticate with a bearer token: Authorization: Bearer <your Amux key>.
This page covers the protocol: the request and response shapes every decision model shares. A model's aliases, context limits and known weak spots live on its own page — for example Jev.
https://gateway.amux.ai/v1/systemoneAuthorization
headerAuthorizationstringRequiredBearer <your Amux key> An Amux key created in the console. If you lose it, you can view it again on the keys page.
Content-TypestringRequiredDefault "application/json"Always application/json.
Request
application/jsonmodelstringRequiredCanonical ID, or an alias such as jev-latest (the default the official SDKs send). Aliases move when a new release ships; the response's model reports the versioned ID that answered.
statestring | object | arrayRequiredThe content to evaluate: a string, or a JSON object/array (chat logs, records, application state). Prefer an object with descriptive field names, and refer to the fields from questions in backticks, e.g. ` message `. Text only — no images, audio or video.
questionsmap<string, Question>RequiredThe questions, keyed by an id you choose. Answers come back under the same ids. The ids are not sent to the model and do not affect inference. All questions are evaluated in parallel against the same state, so adding questions barely changes latency.
›questionsmap<string, Question>
‹question id›QuestionA typed question. Its type picks one of the three shapes below; all three share type and instructions, and each adds its own criteria.
›‹question id›Question
noulobjectA yes/no question. The answer is the probability (0–1) that the statement holds.
›noulobject
type"noul"RequiredAlways noul.
instructionsstring | object | arrayRequiredThe yes/no statement to evaluate. A string, or an object/array that puts the question in one field and the data it needs in others (refer to them by name in backticks).
criteriaobjectOptional. What a yes (near 1) and a no (near 0) mean. Put boundary cases here.
›criteriaobject
truestring | object | arrayWhat a yes means.
falsestring | object | arrayWhat a no means.
choiceobjectPicks exactly one option from a set you define. The answer carries the top option, a probability for every option, and a confidence.
›choiceobject
type"choice"RequiredAlways choice.
instructionsstring | object | arrayRequiredWhat the model should decide. String, object or array — see noul.
criteriaobjectRequiredOption name → rubric description. Use null when an option needs no detail. At most 255 options. The option names come back as keys of probabilities.
scoreobjectRates the state on an ordered rubric. The answer is a probability-weighted value that can land between two levels.
›scoreobject
type"score"RequiredAlways score.
instructionsstring | object | arrayRequiredWhat the model should rate. String, object or array — see noul.
criteriaarray<string>RequiredLevel descriptions, lowest first: index 0 is the bottom of the scale. At least 2, at most 10 levels.
Response
200responseOne answer per question, under the same ids.
400responseMalformed body; a question failed upstream validation (the message names the field); or the request is clearly over the context limits.
402responseInsufficient balance.
It is not a chat model
Decision models do not generate text. You give one a state and a set of typed questions, and it returns a structured answer for each:
noul: the probability (0–1) that a yes/no statement holds;choice: picks one of the options you defined, with a probability for each option and aconfidence;score: rates the state on the ordered levels you defined, and can land between two levels.
So it cannot be called from chat endpoints such as /v1/chat/completions or /v1/messages, and it is not in the playground.
Errors
Errors come back in OpenAI's error shape. Question contents are validated by the upstream, which returns 400 naming the offending field.
For type values and retry semantics, see Errors and retries.
curl https://gateway.amux.ai/v1/systemone \
-H "Authorization: Bearer $AMUX_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"model": "typesafe/jev",
"state": {
"message": "Hi, my Stripe integration has been failing for 3 days. Please help ASAP."
},
"questions": {
"department": {
"type": "choice",
"instructions": "Which team should handle `message`?",
"criteria": {
"billing": "Payment or subscription issues",
"technical": "Bugs or integration problems",
"sales": null
}
},
"frustration": {
"type": "score",
"instructions": "How frustrated does the customer appear?",
"criteria": [
"Calm",
"Frustrated but civil",
"Very angry"
]
},
"is_urgent": {
"type": "noul",
"instructions": "`message` conveys urgency or time-sensitivity"
}
}
}'{
"model": "jev-1.13.0",
"answers": {
"department": {
"type": "choice",
"choice": "technical",
"confidence": 0.95,
"probabilities": {
"billing": 0.03,
"sales": 0,
"technical": 0.97
}
},
"frustration": {
"type": "score",
"score": 1,
"confidence": 1,
"legend": {
"0": "Calm",
"1": "Frustrated but civil",
"2": "Very angry"
},
"probabilities": {
"0": 0,
"1": 1,
"2": 0
}
},
"is_urgent": {
"type": "noul",
"noul": 1
}
},
"usage": {
"input_tokens": 407,
"output_tokens": 73
}
}