Jev classifies. Unsure closes the loop.
You can't improve a classifier you don't measure. Jev answers structured questions in milliseconds with a confidence on every field. Unsure records each answer, sends the least certain ones for review, and proves the next prompt is better before it ships.
111 ms median · 162 ms p90
- urgenttrue0.92
- teambilling0.54
- severity20.85
Feedback loops for a better classifier.
You can't improve a classifier without knowing where it goes wrong. Follow one ticket through a Jev decision, a human correction, and a prompt change measured against the reviewed set.
- 01
Classify on Jev
A customer has paid, but their account is still locked. Jev classifies the ticket as urgent and routes it to billing. Its confidence in that team is only 54%.
Three fields round-trip in 111 ms median from a laptop. Unsure records every answer and its confidence under one
decision_id, so this uncertain route can be reviewed.class Triage(BaseModel): urgent: bool team: Literal["billing", "support", "sales"] severity: Annotated[float, Score("Low", "Mid", "High")] decision = client.decide( prompt=( "Payment questions go to billing. " f"Ticket: {ticket.text}" ), schema=Triage, ) ticket.decision_id = decision.idinbox · support@example.comticket #1042Maya Ruiz <maya@northwind.co>
9:41 AMto support@example.com
Paid, but still locked out
Hi there,
I paid the invoice, but my account is still locked. The receipt came through an hour ago and I have a demo at noon.
— Maya
decision3 fields · classified- urgenttrue0.92
- teambilling0.54Review the team. Billing is the least certain answer, at 54% confidence.
- severity1.7 / 20.85
- 02
Correct the route
The review queue brings the least certain decisions to the top. On this ticket, a reviewer sees that payment succeeded: restoring access belongs to support. They correct the team from billing to support.
A reassignment in your own app can supply the same correction. Send it with the original decision ID. Now this ticket has an expected answer to test the next prompt against.
# Same ticket: payment cleared, but access is blocked. # The reviewer moves it from billing to support. client.feedback( decision_id=ticket.decision_id, team="support", )review queueleast certain firstMaya Ruiz
Paid, but still locked out
team
0.54
Jonah Okafor
Invoice shows the wrong plan
team
0.61
Lena Sørensen
Export keeps timing out
urgent
0.66
correctionticket #1042reviewer note“Payment cleared. Support needs to restore access.”
teambillingmodel · 0.54supportreviewersalesSaved as the expected answer. The next prompt is measured against support on this ticket. - 03
Prove the prompt improved
The first prompt sent payment questions to billing. Add the missing rule: if the customer has paid but is locked out, route to support. Replay it on the reviewed set, including this ticket.
This time, the ticket goes to support and matches the saved correction. Compare the original and revised prompts across the same reviewed set to check whether the change helped overall before you ship it.
group = client.group(decision.group_id)["group"] new_template = group["template"] + ( "\nPaid but locked out? Route to support." ) run = client.prototype( decision.group_id, template=new_template, )prompt+1 line- Payment questions go to billing.
- Paid but locked out? Route to support.
- Ticket: {ticket.text}
ticket #1042replayedMaya Ruiz
Paid, but still locked out
teamoriginalbillingrevisedsupportexpectedsupportMatches the reviewer's correction. The revised prompt gets this ticket right without being told the answer.score · same reviewed set84.2%91.0%
Model anything.
Improving a workflow starts with measuring the decisions inside it, even when the input is a screenshot and the output is a reply to a customer.
Jev decides from text: booleans, choices and scores. It can't read a receipt, and it doesn't write prose. A pipeline puts the models that can on either side of it.
Take the same ticket with a receipt attached. A vision model reads the image and hands back text. Jev decides the structured fields from the message and what was read. A text model writes the summary, and skips the refund reason because Jev said no refund was wanted. One call, one output model.
Jev's fields keep their confidence, so the same loop applies: the least certain answers go to review, and a new prompt is replayed against the reviewed set before it ships.
“Invoice #4471, paid in full at 9:12 AM.”
- urgenttrue0.92
- teamsupport0.91
- wants_refundfalse0.88
- summary
- Payment cleared; the account is still locked. Support restores access.
- refund_reason
- skipped · wants_refund is false
Close the loop on the classifier you already run.
One decide call, one feedback call in the handler you already have, one replay.