1. Data source
  2. Decision schema
  3. Model inference
  4. Structured result
2 Decision schema 3 typed questions
  • teamchoicebillingtechnicalsecuritysales
  • is_angrynoulprobability 0–1
  • urgencyscorelowmediumhigh

3 Model inference typesafe/jev-1.13

Waiting for a run.

4 Structured result

Run the demo to see the JSON answers, the highlighted pick and the final action.

Call Jev yourselfSame data and schema, straight to Flatkey. Set FLATKEY_API_KEY and run.
curl -sS https://router.flatkey.ai/api/alpha/decisions \
  -H "Authorization: Bearer $FLATKEY_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
  "model": "typesafe/jev-1.13",
  "state": "Table: support_tickets  id: 48213  plan: Business  mrr: $1,200\nSubject: Charged twice AND someone logged in from Brazil??\nBody: This is the third time I'\''ve written. We were billed twice this month, and today I got a login alert from São Paulo that wasn'\''t us. If this isn'\''t sorted by Friday we'\''re moving to another vendor.\nTask: team (billing/technical/security/sales), is_angry, urgency.",
  "questions": {
    "team": {
      "type": "choice",
      "instructions": "Which team should own this support ticket? Pick the single best queue based on what the customer actually needs.",
      "criteria": {
        "billing": "Charges, invoices, refunds, plan changes, payment failures",
        "technical": "Bugs, errors, outages, integrations, how-to questions about the product",
        "security": "Account takeover, suspicious access, leaked credentials, data exposure or vulnerability reports",
        "sales": "New purchases, upgrades, quotes, pricing questions from prospects or expanding customers"
      }
    },
    "is_angry": {
      "type": "noul",
      "instructions": "The customer is angry or seriously frustrated, including polite but clear threats to cancel or escalate."
    },
    "urgency": {
      "type": "score",
      "instructions": "How urgent is this ticket for the business, considering customer impact, money at risk and security exposure.",
      "criteria": [
        "low",
        "medium",
        "high"
      ]
    }
  }
}'

No Flatkey key yet? Get one for Jev 1.13 →

Run with real Jev

Sign in and connect a key

  1. Sign in with Google.
  2. Connect your Flatkey or OpenRouter key on the next screen. Get a Flatkey key for Jev 1.13.
  3. Come straight back here and press Run again.

This site is for researching, sharing and cataloguing Jev use cases. Your key is only there to make trying Jev convenient: it is stored encrypted, used only for runs you trigger, never used for anything else, and you can delete it anytime.

About this use case

Use Jev as semantic SQL filters: incoming state, Jev decision, routed outcome

Who / when

Audience

  • data and analytics engineers who query support tickets, reviews or notes in DuckDB, Postgres or a warehouse
  • support ops teams who want triage columns (team, urgency, sentiment) without a labeling project
  • builders adding natural-language filters to an internal tool or dashboard

Triggers

  • a query needs a condition that lives in free text, like "angry customers" or "security-related tickets"
  • keyword LIKE filters miss sarcasm, polite threats to churn, or tickets written in another language
  • you want to GROUP BY or ORDER BY a meaning-level property such as urgency or product tier
  • calling a chat model per row returns prose that breaks the column type

The workflow

  1. 01
    Row textTicket body + metadataInput
  2. 02
    Route to teambilling / technical / security / salesJev
  3. 03
    Angry + urgencyNoul filter, Score rankJev
  4. 04
    SQL columnsWHERE, ENUM, ORDER BYYour code

Question shape

{
  "team": {
    "type": "choice",
    "instructions": "Which team should own this support ticket? Pick the single best queue based on what the customer actually needs.",
    "criteria": {
      "billing": "Charges, invoices, refunds, plan changes, payment failures",
      "technical": "Bugs, errors, outages, integrations, how-to questions about the product",
      "security": "Account takeover, suspicious access, leaked credentials, data exposure or vulnerability reports",
      "sales": "New purchases, upgrades, quotes, pricing questions from prospects or expanding customers"
    }
  },
  "is_angry": {
    "type": "noul",
    "instructions": "The customer is angry or seriously frustrated, including polite but clear threats to cancel or escalate."
  },
  "urgency": {
    "type": "score",
    "instructions": "How urgent is this ticket for the business, considering customer impact, money at risk and security exposure.",
    "criteria": [
      "low",
      "medium",
      "high"
    ]
  }
}

Gate policy

≥ 0.90

Write the answer straight into the column: team as an ENUM, is_angry as a BOOLEAN predicate, urgency as a sortable value.

0.65–0.90

Store the value plus its probability column so queries can filter on confidence (e.g. WHERE is_angry_p > 0.8).

< 0.65

Store NULL with the probabilities and send the row to a review queue instead of guessing a category.

Failure modes

Pre-launch checks before you trust auto-routing:

  • WHERE body ILIKE '%angry%' and missing every customer who is furious but polite;
  • Letting a chat model invent new team names, so the ENUM cast fails or a fifth category appears;
  • Storing only the top label and losing the probability you need to filter by confidence;
  • Routing a ticket that mixes billing and account takeover to billing because it was mentioned first;
  • Re-asking the model on every query instead of materializing the answers once as columns;
Keep exact work in code: Keep exact work in SQL: ids, dates, plan, MRR, joins, counts and the final WHERE / GROUP BY / ORDER BY stay deterministic. Use Jev once per row for the meaning-level properties text alone carries—who should own it, is the customer angry, how urgent is it—materialize them as typed columns with probabilities, and let your thresholds decide what is trusted.

FAQ

How do Jev answers map to SQL types?

A Noul (yes/no) answer becomes a BOOLEAN predicate or a probability you can compare in WHERE. A Choice answer becomes an ENUM or a constrained text column. A Score answer becomes an ordered level you can ORDER BY. Keep the probabilities in companion columns so you can filter by confidence.

Do I call Jev inside every query?

Usually not. Run Jev once per new or changed row (as a batch job or a DuckDB UDF that calls the API) and write the typed answers into columns. Your dashboards then query those columns at normal SQL speed and cost.

Why not a keyword or sentiment model?

Keywords miss meaning and a generic sentiment score doesn't know your teams. With Jev you write the question and the allowed options in plain English for your own schema, and get calibrated probabilities over exactly those options.

Can I bring my own API key?

Yes. Try the free demo above without signing in. To run it live on your own text, sign in with Google and connect a Flatkey or OpenRouter key (a quick test call runs when you save it). Manage or delete it anytime under Dashboard → BYOK. Keys are stored encrypted on the server, used only for runs you trigger, and never sent back to the browser. Need a Flatkey key? Get one for Jev 1.13 on Flatkey.

Is this the official TypeSafe Jev product page?

No. jev-llm.com is an independent research and practice site. Verify pricing, models and terms at the original TypeSafe sources.

Sources

Seen on X
Independent-site note: jev-llm.com is an independent research and practice site. It is not the TypeSafe AI official site. Verify models, pricing and terms at the original source.