Amux

Jev

Last updated October 7, 2026

TypeSafeAI's decision model Jev — the three question types, answer shapes, confidence, and known weak spots.

Jev is TypeSafeAI's System One model: it does not generate text. Instead it answers a set of typed questions about the state you give it, returning one structured answer per question that your code can branch on directly — nothing to parse.

It is served through the TypeSafeAI System One endpoint. The official SDKs (typesafe-sdk, @typesafe-ai/sdk) work as-is — just point the base URL here.

Model

Amux IDtypesafe/jev
Aliasesjev-latest (what the official SDKs send when no model is given) · jev-preview · jev-1.13.0
Current versionjev-1.13.0
Context64K tokens per request; state + the longest question ≤ 32K
InputText only: a string, a JSON object, or an array. Turn images, audio and video into text or structured fields first
BillingInput tokens only; output is free. See the model page for the price
StreamingNot supported
POSThttps://gateway.amux.ai/v1/systemone

Authorization

header
AuthorizationstringRequired

Bearer <your Amux key> Your Amux API key.

Content-TypestringRequiredDefault "application/json"

Always application/json.

Request

application/json
modelstringRequired

typesafe/jev, or one of its aliases: jev-latest (the official SDKs' default), jev-preview, jev-1.13.0. Pin jev-1.13.0 if you have tuned confidence thresholds.

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.

Three question types

Every question has type and instructions, plus a criteria whose shape depends on the type. You can mix them in one request; all questions are evaluated in parallel and independently against the same state, so adding questions barely changes latency.

noul: yes / no

Answers with the probability that the statement holds: 0 is no, 1 is yes.

FieldTypeRequiredNotes
type"noul"yes
instructionsstring · object · arrayyesThe statement to evaluate
criteriaobjectno{ "true": …, "false": … } — what a yes and a no each mean
"is_urgent": {
  "type": "noul",
  "instructions": "Does this convey urgency?",
  "criteria": { "true": "Explicitly time-sensitive", "false": "No urgency expressed" }
}

choice: pick one

Picks exactly one of the options you define, with a probability for every option.

FieldTypeRequiredNotes
type"choice"yes
instructionsstring · object · arrayyesThe decision to make
criteriamap<string, string · object · array · null>yesOption name → rubric; use null for an option that needs no description. At most 255
"department": {
  "type": "choice",
  "instructions": "Which team should handle this?",
  "criteria": {
    "billing": "Payments, invoicing, refunds",
    "technical": "Bugs, outages, integrations",
    "sales": null
  }
}

score: ordered rating

Rates the state on levels ordered lowest first. The result is probability-weighted and can land between two levels.

FieldTypeRequiredNotes
type"score"yes
instructionsstring · object · arrayyesThe dimension to rate
criteriaarray<string · object · array>yesLevel descriptions, index 0 is the lowest. 2–10 levels
"frustration": {
  "type": "score",
  "instructions": "How frustrated is the customer?",
  "criteria": ["Calm", "Frustrated", "Very angry"]
}

Structured instructions and criteria

instructions, choice option descriptions, score levels, and noul criteria all accept JSON. Put the question in one field and the data it needs in others, and refer to those fields by name in backticks:

"instructions": {
  "potential_duplicate": { "name": "John Smith", "location": "Oakland, California" },
  "question": "Is the resume for the same person as `potential_duplicate`?"
}

Fields in state are referenced the same way: send state as { "message": "…" } and write `message` in the question.

Answers

answers uses the same keys as questions, and every answer carries the same type as its question:

typeFields
noulnoul: 0 (no) to 1 (yes)
choicechoice: the most likely option; probabilities: option → probability, summing to 1; confidence
scorescore: the weighted value, possibly between levels; legend: level index → description; probabilities: level index → probability; confidence

The response's model is the versioned ID that actually answered (for example jev-1.13.0), and we do not rewrite it — aliases move with new releases, and logging it is how you know which release produced a batch of answers.

Confidence

Choice and score answers carry a confidence (0–1) derived from how concentrated the distribution is: all mass on one option is 1, evenly spread is 0. Noul answers have no such field — the answer is already a probability.

A useful starting point is three bands: high — act automatically; medium — ask for confirmation or flag for review; low — don't act, route to a human or a reasoning model. Gate destructive actions at a higher threshold than read-only ones. If you have tuned thresholds, pin jev-1.13.0 and recalibrate on your own schedule when moving to a new version.

Known weak spots

Ask atomic questions and compose them in code. Jev 1.13 is unreliable in these situations:

SituationAsk it this way instead
Literal readingState the exact condition; put boundary cases into criteria
Arithmetic, counting, numeric comparisonKeep arithmetic in code; ask one noul per item and sum
Date and time comparisonExtract the date parts with choices and compare in code
Indirection, double negativesAsk directly; name the state field in backticks
Large, noisy stateFilter first; send only what the question needs
Adversarial content in stateSpell it out in criteria and test edge cases
Consistency across questionsProbabilities are not constrained across questions (P(yes) + P(not yes) need not be 1); don't reuse thresholds between noul and choice
GenerationProduce candidates with a generative model, then let Jev pick among them

English works best. Other languages, Chinese included, work too, but test on your own data first and watch confidence more closely.

How the body is forwarded

Only model, state and questions reach the upstream. Every other top-level field is removed and listed in amux.droppedParams and the x-amux-dropped-params header — the upstream rejects unknown top-level fields with an error that does not name them. Fields inside a question are forwarded as-is.

Errors

Errors come back in OpenAI's error shape ({ "error": { "type", "message", … } }), which the official SDKs recognize.

StatustypeWhen
400invalid_requestA field is missing, or a question failed upstream validation — the message names the field, e.g. questions.q.choice.criteria: Field required
400context_length_exceededClearly over the context limits; rejected here
402insufficient_creditsInsufficient balance
502provider_*The upstream rate-limited, was overloaded, or failed. Safe to retry

For every type value and its 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
  }
}