Skip to content

System One

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.

On this page
  1. When to use it
  2. Models
  3. Request
  4. The three question types
  5. curl
  6. Python
  7. Billing
  8. Errors

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.
  • trio-spark-v1.3 — Trio-Spark v1.3 by TypeSafe. 1K 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 a type (choice, score or noul), an instructions string, and — depending on the type — a criteria.

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.

json
"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.)

json
"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.

json
"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

shell
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.

json
{
  "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.

python
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, currency

With 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, with usage.currency) computed from input_tokens at 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"}}.

StatusMeaningWhat to do
400Invalid requestThe 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.
400too_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.
401Authentication failedMissing or invalid API key. Send Authorization: Bearer <your QSP key> — the same key you use for every other model.
402Insufficient balanceYour 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.
405Method not allowedOnly POST (and CORS preflight OPTIONS) is accepted on /v1/systemone.
413Body too largeThe request body exceeds 256 KiB. Send a smaller state or fewer questions per call.
429Rate limitedToo many requests on your key, or the model is briefly rate limited. Back off and retry; honor Retry-After when present.
503Unavailable"The model is temporarily unavailable." Nothing is billed for a call that did not return a complete answer. Retry shortly and check /status.