Amux

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.

POSThttps://gateway.amux.ai/v1/systemone

Authorization

header
AuthorizationstringRequired

Bearer <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/json
modelstringRequired

Canonical 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 | arrayRequired

The 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>Required

The 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›Question

A 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
noulobject

A yes/no question. The answer is the probability (0–1) that the statement holds.

›noulobject
type"noul"Required

Always noul.

instructionsstring | object | arrayRequired

The 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).

criteriaobject

Optional. What a yes (near 1) and a no (near 0) mean. Put boundary cases here.

›criteriaobject
truestring | object | array

What a yes means.

falsestring | object | array

What a no means.

choiceobject

Picks 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"Required

Always choice.

instructionsstring | object | arrayRequired

What the model should decide. String, object or array — see noul.

criteriaobjectRequired

Option name → rubric description. Use null when an option needs no detail. At most 255 options. The option names come back as keys of probabilities.

scoreobject

Rates the state on an ordered rubric. The answer is a probability-weighted value that can land between two levels.

›scoreobject
type"score"Required

Always score.

instructionsstring | object | arrayRequired

What the model should rate. String, object or array — see noul.

criteriaarray<string>Required

Level descriptions, lowest first: index 0 is the bottom of the scale. At least 2, at most 10 levels.

Response

200response

One answer per question, under the same ids.

400response

Malformed body; a question failed upstream validation (the message names the field); or the request is clearly over the context limits.

402response

Insufficient 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 a confidence;
  • 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
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
  }
}