Decision Models
POST /v1/systemone answers typed questions about a piece of text: which of these options applies, or how far along a scale something sits. It is compatible with TypeSafe's System One API, and it runs the same decision model behind reranking, tuned for agent memory.
Use it where you would otherwise prompt an LLM for a one-word judgement and parse the reply: classifying a message, picking the best of several candidates, or grading how much of a list is relevant. You get a structured answer with probabilities, at a fraction of the cost and latency.
Model: hs-decide-1-flash
Quick Start
curl https://inference.hindsight.vectorize.io/v1/systemone \
-H "Authorization: Bearer $HINDSIGHT_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"model": "hs-decide-1-flash",
"state": "Question: When is the offsite?",
"questions": {
"answer": {
"type": "choice",
"instructions": "Which note answers the question?",
"criteria": {
"c0": "The offsite moved to April 17.",
"c1": "Priya prefers window seats."
}
}
}
}'
{
"model": "hs-decide-1-flash",
"answers": {
"answer": {
"type": "choice",
"choice": "c0",
"confidence": 0.9,
"probabilities": { "c0": 0.95, "c1": 0.05 }
}
},
"usage": { "input_tokens": 120, "output_tokens": 0 }
}
A client already written against TypeSafe's System One API works by changing its base URL to https://inference.hindsight.vectorize.io and using a Hindsight API key.
Request
| Field | Type | Required | Description |
|---|---|---|---|
state | string | Yes | The text the questions are about: a conversation, a document, a question with candidate answers |
questions | object | Yes | Question name → question. Answers come back under the same names |
model | string | No | hs-decide-1-flash (the default) |
Each question:
| Field | Type | Description |
|---|---|---|
type | string | choice or score |
instructions | string | What to decide, in plain words |
criteria | object or array | For choice, an object of label → option text (at least two). For score, an array of levels, lowest first |
The request body can be up to 2 MB.
Question Types
choice: which option applies
The model picks one of the labelled options and reports a probability for each. The probabilities sum to 1, so they also rank the options against each other.
"intent": {
"type": "choice",
"instructions": "What does the user want?",
"criteria": {
"book": "To book a meeting",
"cancel": "To cancel a meeting",
"other": "Something else"
}
}
Answer:
| Field | Description |
|---|---|
choice | The label picked |
confidence | How sure the model is of that pick |
probabilities | Label → probability, for every option |
score: where on a scale
The model places the state on an ordered scale you describe, lowest level first.
"depth": {
"type": "score",
"instructions": "How far down this ranked list does genuine relevance to the question extend?",
"criteria": [
"Only the first candidate is relevant",
"The first two are relevant",
"The first five are relevant",
"All of the listed candidates are relevant"
]
}
Answer: score, the position on the scale counting from 0 for the first level. It can fall between two levels, so round it to pick one.
Response
| Field | Description |
|---|---|
model | The model that answered |
answers | Question name → answer, as described above. Each answer also repeats its type |
usage.input_tokens | The tokens billed |
usage.output_tokens | Not billed |
Errors
Besides the common errors:
| Status | Meaning |
|---|---|
400 | The model can't answer this request as asked. The body gives its reason |
413 | The body is over 2 MB |
422 | The request is malformed: a missing or mistyped field. The body says which |
429 | The model is busy. Retry after the Retry-After header (seconds) |
Billing
Decision requests cost $0.02 per 1M input tokens, the same rate as reranking. Output is free. usage.input_tokens reports exactly what was billed. See Pricing & billing.