Request format
The state, the three question types, and the rules for options that every adapter shares.
Every request names a model (jeff-latest for the base model, or an adapter's name), a state (the situation) and one or more questions. Jeff answers every question with a
probability per option. The server's address is POST /v1/systemone.
{
"model": "jeff-latest",
"state": {"company": "An online furniture shop.", "channel": "email", "message": "…"},
"questions": {
"route": {"type": "choice", "instructions": "Which team should handle this message?",
"criteria": {"other": "Not for any of these teams", "k1": "Deliveries", "k2": "Refunds"}},
"needs_human": {"type": "noul", "instructions": "Does this need a person to act on it now?"}
}
}The state
The state can be text, a JSON object or a list. Adapters are trained on objects with named fields in a fixed order, listed on each adapter's page. Keep that order.
The one field that changes on every request goes last. A ticket's text, a voice transcript or the text to check is the last field; everything that stays the same for your deployment (the company, the team list, the screen) comes first. The server can then prepare the unchanging start of the request in advance. See preparing requests in advance.
Questions
| Type | Asks | Answer |
|---|---|---|
choice |
Pick one of the options in criteria |
The chosen key, a probability per option, a confidence |
noul |
Yes or no | The probability of yes |
score |
A point on a scale of 2 to 10 levels, lowest first | The expected level, a probability per level |
instructions says what is being decided, in plain words. Each adapter was trained mostly on one wording per
question; use that wording, shown on its page, word for word.
Several questions about the same state go in one request. They are answered together, which is faster than asking them one by one.
Options
criteriamaps a short key to a description, for example"k1": "Deliveries: late, lost or damaged deliveries". A description may benullwhen the key says it all. A list of descriptions gets the keyso1,o2, and so on.- Option keys are never bare numbers. JavaScript moves number-like keys (
"1","2") ahead of all other keys, which silently changes the order of the options. Both clients refuse such keys. Useo1,k1,p1or short words. - Describe what each option means or leads to, not which one is right. Jeff picks the option that best fits the state.
- Options that never change go first, word for word, before the ones that do (for example
other, then your teams;ask_questionandnone_of_these, then the buttons on the current screen). - The Jeff-Qwen3.5 models (v1.2, both the 0.8B and the 2B) take up to 254 options per question. For longer lists, shortlist first.
The answer
{
"answers": {
"route": {"type": "choice", "choice": "k1", "probabilities": {"other": 0.02, "k1": 0.91, "k2": 0.07}, "confidence": 0.82},
"needs_human": {"type": "noul", "noul": 0.64}
},
"usage": {"input_tokens": 212, "output_tokens": 0, "orders": 1},
"model": "jeff-latest"
}The numbers above are an illustration of the shape, not a measured answer.
Errors
Nothing is retried and nothing is guessed. The server answers 401 when an API key is required and missing, 422 for a
malformed request, an unknown model (UnknownModel) or too many options (TooManyOptions), 503 while the model is
loading, and 529 when it is busy (with a Retry-After header).
