Typed decisions on /v1/systemone
System One models do not write text. You send a state — the situation to decide about — and a set of typed questions; the model answers every question in a single forward pass with calibrated probabilities. No prompt engineering to force a label, no free text to parse, no JSON to repair. Same API key and prepaid balance as every other QuickSilver Pro model.
When to use it
- Routing — send a request to the right model, queue or team, and fall back when the top probability is low.
- Classification and triage — tickets, emails, leads, documents.
- Scoring — rate content against a scale you describe.
- Guardrails and moderation — policy checks as probabilities you can threshold, not a yes/no you have to trust.
- Agent next-step selection — pick the next tool or action from a fixed set.
For anything generative — answers, summaries, code, tool calls — use a chat model. A Chat Completions call to a System One model is rejected, and a System One request to a chat model is too.
Models
jev-1.13— Jev 1.13 by TypeSafe. 32K context. $0.042 per 1M input tokens; output tokens free.
Typical end-to-end latency is around 2–3 seconds per call. Responses are not streamed.
Request
POST https://api.quicksilverpro.io/v1/systemone with Authorization: Bearer <your QSP key> and a JSON body:
model— a System One model ID, e.g.jev-1.13.state— the situation to decide about. Any JSON: a string or an object (arrays work too).questions— an object mapping your question IDs to questions, up to 64 per call. IDs must match^[A-Za-z0-9_-]{1,64}$. Each question has atype(choice,scoreornoul), aninstructionsstring, and — depending on the type — acriteria.
No other fields are accepted: there is no stream (only false is allowed), metadata or user. The body is capped at 256 KiB.
The three question types
choice — pick one of your options
criteria is an object mapping each option to a description. The answer carries the picked choice, a probability per option and a confidence.
"greeting": {
"type": "choice",
"instructions": "Is the state a greeting?",
"criteria": {"yes": "it is a greeting", "no": "it is not a greeting"}
}
// answer
"greeting": {"type": "choice", "choice": "yes",
"probabilities": {"no": 0.07, "yes": 0.93}, "confidence": 0.87}score — place the state on your scale
criteria is a list of scale anchors, in order. The answer's score is the 0-based index of the chosen anchor, with a probability per index and a legend mapping each index back to its anchor. (An object here instead of a list is rejected with Invalid request at questions.<id>.criteria.)
"urgency": {
"type": "score",
"instructions": "How urgent is this ticket?",
"criteria": ["not urgent", "somewhat urgent", "very urgent"]
}
// answer (state: "Customer: my payment failed twice and I need this fixed today")
"urgency": {"type": "score", "score": 2,
"probabilities": {"0": 0, "1": 0, "2": 1}, "confidence": 1,
"legend": {"0": "not urgent", "1": "somewhat urgent", "2": "very urgent"}}noul — a yes-leaning probability
No criteria needed. The answer is a single probability-like number between 0 and 1 in noul.
"urgent": {
"type": "noul",
"instructions": "Does this ticket need a reply within the hour?"
}
// answer
"urgent": {"type": "noul", "noul": 0.69}Every requested question is answered, keyed by the ID you chose. Answers may also carry probabilities, confidence and legend where the model provides them.
curl
curl https://api.quicksilverpro.io/v1/systemone \
-H "Authorization: Bearer $QSP_KEY" \
-H "Content-Type: application/json" \
-d '{
"model": "jev-1.13",
"state": "hi",
"questions": {
"greeting": {
"type": "choice",
"instructions": "Is the state a greeting?",
"criteria": {"yes": "it is a greeting", "no": "it is not a greeting"}
}
}
}'A production response to that request. usage.costis the call's price in USD — input tokens at the published rate, output free.
{
"id": "so-45a870bb532d4a72b41404cc8911c72e",
"model": "jev-1.13",
"answers": {
"greeting": {
"type": "choice",
"choice": "yes",
"probabilities": {"no": 0.07, "yes": 0.93},
"confidence": 0.87
}
},
"usage": {
"input_tokens": 314,
"output_tokens": 33,
"cost": 0.000013188,
"currency": "USD"
}
}Python
It is a plain HTTPS JSON endpoint — use requests or httpx, not the OpenAI SDK's chat client.
import os, requests
resp = requests.post(
"https://api.quicksilverpro.io/v1/systemone",
headers={"Authorization": f"Bearer {os.environ['QSP_KEY']}"},
json={
"model": "jev-1.13",
"state": {
"ticket": "I was charged twice for my subscription this month.",
"customer_plan": "pro",
},
"questions": {
"queue": {
"type": "choice",
"instructions": "Which team should handle this ticket?",
"criteria": {
"billing": "payments, charges, refunds, invoices",
"technical": "bugs, errors, integrations",
"account": "login, email, profile changes",
},
},
"severity": {
"type": "score",
"instructions": "How severe is the problem for the customer?",
"criteria": ["cosmetic", "annoying", "blocks some work", "blocks all work"],
},
"urgent": {
"type": "noul",
"instructions": "Does this ticket need a reply within the hour?",
},
},
},
timeout=30,
)
resp.raise_for_status()
data = resp.json()
queue = data["answers"]["queue"]
if queue["probabilities"][queue["choice"]] < 0.6:
queue_name = "human-review" # low confidence: escalate
else:
queue_name = queue["choice"]
print(queue_name, data["answers"]["severity"]["score"], data["answers"]["urgent"]["noul"])
print(data["usage"]) # input_tokens, output_tokens, cost, currencyWith httpx the call is the same shape: httpx.post(url, headers=..., json=..., timeout=30).
Billing
- Input tokens only.The state and the questions are billed at the model's input rate; output tokens are free.
- Every successful response carries
usage.cost(USD, withusage.currency) computed frominput_tokensat the published rate — the 314-token example above cost $0.000013188. Reconcile it against /pricing.json. - Spend comes out of the same prepaid balance as chat and image calls — one key, one bill. A call that returns an error is not billed.
- Put several questions about the same state into one call: the state is billed once per call, not once per question.
Errors
Errors use the same shape as the rest of the API: {"error": {"message", "type", "code"}}.
| Status | Meaning | What to do |
|---|---|---|
| 400 | Invalid request | The body is not a JSON object, is missing state or questions, carries a field the endpoint does not accept (metadata, user, anything else), asks for streaming, or names a model that is not a System One model. When the model rejects a question the message names the exact path, e.g. "Invalid request at questions.greeting.criteria." — usually criteria of the wrong shape for the question type. |
| 400 | too_long | "Input exceeds this model's 32,000-token context." The state plus all questions did not fit the context window. Trim the state or split the questions across calls. |
| 401 | Authentication failed | Missing or invalid API key. Send Authorization: Bearer <your QSP key> — the same key you use for every other model. |
| 402 | Insufficient balance | Your prepaid balance cannot cover the call. Top up in the dashboard; System One calls draw on the same balance as the rest of the catalog. |
| 405 | Method not allowed | Only POST (and CORS preflight OPTIONS) is accepted on /v1/systemone. |
| 413 | Body too large | The request body exceeds 256 KiB. Send a smaller state or fewer questions per call. |
| 429 | Rate limited | Too many requests on your key, or the model is briefly rate limited. Back off and retry; honor Retry-After when present. |
| 503 | Unavailable | "The model is temporarily unavailable." Nothing is billed for a call that did not return a complete answer. Retry shortly and check /status. |