Jev Decisions
Decisions on CompanyFabric. POST /v1/decisions, the endpoint for decision models, TypeSafe's Jev, Perplexity's Decider 27B and Microsoft-Decision-1: send a state and typed questions (noul, choice, score), get calibrated probabilities back. Same key and balance as chat.
What a decision model is
A chat model writes text you then parse. A decision model never writes: you hand it the situation (a ticket, a brief, a transcript, a JSON record) and a set of typed questions, and it returns one typed answer per question with a probability attached, all in one parallel pass. There is no JSON to validate, no free text to misread, and nothing it can invent outside the options you gave it.
The catalog has three decision models with the same contract, so the same request runs on any of them by changing `model`: typesafe/jev-latest (Jev, by TypeSafe, $0.042 per million input tokens, the default when you omit `model`), perplexity/decider-27b (Decider 27B, by Perplexity, $0.04 per million input tokens, also reads images in `state`) and microsoft/microsoft-decision-1 (Microsoft-Decision-1, by Microsoft, $0.042 per million input tokens). Output is free on all three, so a typical call is a few thousandths of a cent. Try the starter examples in the playground before writing code: it is on each model's own page, /jev-decisions, /perplexity-decider and /microsoft-decision-1, and each one switches between all three.
Make a call
Not OpenAI-compatible, on purpose: no chat shape means "answer these questions about this state". Ask several questions in one request; that is the intended use.
curl https://api.companyfabric.com/v1/decisions \
-H "Authorization: Bearer $COMPANYFABRIC_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"model": "typesafe/jev-latest",
"state": "Second time this month my card was charged twice. Refund me or I cancel.",
"questions": {
"category": {
"type": "choice",
"instructions": "What is this ticket about?",
"criteria": { "billing": "Charges, refunds", "technical": "Bugs, errors", "other": null }
},
"urgent": { "type": "noul", "instructions": "Does this need a reply within the hour?" },
"churn_risk": {
"type": "score",
"instructions": "How likely is this customer to leave?",
"criteria": ["No signal", "Frustrated", "Threatens to cancel"]
}
}
}'The three question types
- noul: a yes/no probability from 0 to 1. Optional criteria { true, false } describe what each side means. No separate confidence field; the probability is the answer.
- choice: one label from criteria, a map of label to description (a description may be null). Returns the chosen label, a confidence, and the full distribution. Up to 255 labels.
- score: a position on an ordered rubric, criteria is a list of 2 to 10 level descriptions indexed from zero. Returns an expected score (which may fall between levels), a confidence, the distribution, and the legend.
Thresholds, and failing closed
The output is a number, so the policy is yours: act above a threshold, hand to a human below it. A noul near 0.5 means the model is unsure, and the safe default is to treat unsure as no. Ship thresholds as configuration, log every decision with its probability, and tune from the log.
Cost, keys and BYOK
Billed to the same prepaid balance as chat, metered on input tokens, and the exact figure comes back in usage.cost_usd. The welcome credit covers decisions, so a new account can try them without topping up.
Have your own TypeSafe account? Add the key under TypeSafe in the BYOK vault and /v1/decisions routes on it at 0% fee. Keys come from console.typesafe.ai; early access is waitlisted.
Where it fits
- Support triage: category, urgency and escalate-to-human before a chat model drafts the reply.
- Agent gates: should this step call a tool, escalate to a frontier model, or stop and ask.
- Moderation and claim checks: is this a health or income claim, is this content a threat.
- Routing: which queue, which model tier, which template.
- The MCP server exposes the same call as the decide tool, so an agent on companyfabric.com/api/mcp can gate its own expensive steps.