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

classify111 ms
  • urgenttrue0.92
  • teambilling0.54
  • severity20.85
reviewleast certain first
Locked outbillingsupport
replay
v1v2
84.2%91.0%

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.

  1. 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.id
    inbox · support@example.comticket #1042

    Maya Ruiz <maya@northwind.co>

    9:41 AM

    to 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.54
      Review the team. Billing is the least certain answer, at 54% confidence.
    • severity1.7 / 20.85
  2. 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 first
    • Maya 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 #1042
    reviewer note

    “Payment cleared. Support needs to restore access.”

    team
    billingmodel · 0.54
    supportreviewer
    sales 
    Saved as the expected answer. The next prompt is measured against support on this ticket.
  3. 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
    1. Payment questions go to billing.
    2. Paid but locked out? Route to support.
    3. Ticket: {ticket.text}
    ticket #1042replayed

    Maya Ruiz

    Paid, but still locked out

    team
    originalbilling
    revisedsupport
    expectedsupport
    Matches 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.

input
messagestring
screenshotreceipt.png
read
Vision modelreads the receipt

“Invoice #4471, paid in full at 9:12 AM.”

decide
Jevdecides from the message and what was read
  • urgenttrue0.92
  • teamsupport0.91
  • wants_refundfalse0.88
write
Text modelwrites only what the decisions call for
summary
Payment cleared; the account is still locked. Support restores access.
refund_reason
skipped · wants_refund is false
output
Triage · one response, confidence on every Jev field

Close the loop on the classifier you already run.

One decide call, one feedback call in the handler you already have, one replay.