Try it
Copy the code ↓- Data source
- Decision schema
- Model inference
- Structured result
2 Decision schema 3 typed questions
matchchoicesame_entitydifferent_entityreviewconfidencescorelowmediumhighneeds_humannoulprobability 0–1
3 Model inference typesafe/jev-1.13
Waiting for a run.
4 Structured result
Raw JSON
Run the demo to see the JSON answers, the highlighted pick and the final action.
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": "Record A (CRM contact):\nname: Jordan Lee\nemail: j.lee@acmecorp.io\ncompany: Acme Corp\ncity: Austin, TX\nrole: Account Executive\n\nRecord B (CRM contact):\nname: Jordan Lee\nemail: jordan.lee@acme-holdings.com\ncompany: Acme Holdings LLC\ncity: Seattle, WA\nrole: Software Engineer\nphone: +1-206-555-0142\n\nBlocking key: last_name=Lee + first_token=Jordan\nTask: match (same_entity / different_entity / review), confidence, needs_human.",
"questions": {
"match": {
"type": "choice",
"instructions": "Given these two records (or mentions), do they refer to the same real-world entity? Prefer different_entity when evidence conflicts; use review when key fields are missing or ambiguous.",
"criteria": {
"same_entity": "Strong evidence they are the same person, company, or object—compatible identifiers, addresses, or roles with no hard conflicts",
"different_entity": "Hard conflicts (different IDs, incompatible dates/locations, distinct roles) or only superficial name overlap—keep them separate",
"review": "Ambiguous: sparse fields, nickname/abbreviation risk, or conflicting soft signals that a human or richer context should resolve"
}
},
"confidence": {
"type": "score",
"instructions": "How confident are you in the match decision above, based only on the fields provided.",
"criteria": [
"low",
"medium",
"high"
]
},
"needs_human": {
"type": "noul",
"instructions": "A human reviewer should decide before any merge, link, or delete—because evidence is thin, conflicting, or the write is hard to undo."
}
}
}'// Node.js 18+ (built-in fetch). Run: FLATKEY_API_KEY=... node jev.mjs
const body = {
"model": "typesafe/jev-1.13",
"state": "Record A (CRM contact):\nname: Jordan Lee\nemail: j.lee@acmecorp.io\ncompany: Acme Corp\ncity: Austin, TX\nrole: Account Executive\n\nRecord B (CRM contact):\nname: Jordan Lee\nemail: jordan.lee@acme-holdings.com\ncompany: Acme Holdings LLC\ncity: Seattle, WA\nrole: Software Engineer\nphone: +1-206-555-0142\n\nBlocking key: last_name=Lee + first_token=Jordan\nTask: match (same_entity / different_entity / review), confidence, needs_human.",
"questions": {
"match": {
"type": "choice",
"instructions": "Given these two records (or mentions), do they refer to the same real-world entity? Prefer different_entity when evidence conflicts; use review when key fields are missing or ambiguous.",
"criteria": {
"same_entity": "Strong evidence they are the same person, company, or object—compatible identifiers, addresses, or roles with no hard conflicts",
"different_entity": "Hard conflicts (different IDs, incompatible dates/locations, distinct roles) or only superficial name overlap—keep them separate",
"review": "Ambiguous: sparse fields, nickname/abbreviation risk, or conflicting soft signals that a human or richer context should resolve"
}
},
"confidence": {
"type": "score",
"instructions": "How confident are you in the match decision above, based only on the fields provided.",
"criteria": [
"low",
"medium",
"high"
]
},
"needs_human": {
"type": "noul",
"instructions": "A human reviewer should decide before any merge, link, or delete—because evidence is thin, conflicting, or the write is hard to undo."
}
}
};
const res = await fetch("https://router.flatkey.ai/api/alpha/decisions", {
method: "POST",
headers: {
Authorization: `Bearer ${process.env.FLATKEY_API_KEY}`,
"Content-Type": "application/json",
},
body: JSON.stringify(body),
});
if (!res.ok) throw new Error(`Jev request failed: ${res.status} ${await res.text()}`);
const { answers, usage } = await res.json();
console.log(JSON.stringify(answers, null, 2), usage);# Python 3.8+ (pip install requests). Run: FLATKEY_API_KEY=... python jev.py
import json, os, requests
body = json.loads(r"""{
"model": "typesafe/jev-1.13",
"state": "Record A (CRM contact):\nname: Jordan Lee\nemail: j.lee@acmecorp.io\ncompany: Acme Corp\ncity: Austin, TX\nrole: Account Executive\n\nRecord B (CRM contact):\nname: Jordan Lee\nemail: jordan.lee@acme-holdings.com\ncompany: Acme Holdings LLC\ncity: Seattle, WA\nrole: Software Engineer\nphone: +1-206-555-0142\n\nBlocking key: last_name=Lee + first_token=Jordan\nTask: match (same_entity / different_entity / review), confidence, needs_human.",
"questions": {
"match": {
"type": "choice",
"instructions": "Given these two records (or mentions), do they refer to the same real-world entity? Prefer different_entity when evidence conflicts; use review when key fields are missing or ambiguous.",
"criteria": {
"same_entity": "Strong evidence they are the same person, company, or object—compatible identifiers, addresses, or roles with no hard conflicts",
"different_entity": "Hard conflicts (different IDs, incompatible dates/locations, distinct roles) or only superficial name overlap—keep them separate",
"review": "Ambiguous: sparse fields, nickname/abbreviation risk, or conflicting soft signals that a human or richer context should resolve"
}
},
"confidence": {
"type": "score",
"instructions": "How confident are you in the match decision above, based only on the fields provided.",
"criteria": [
"low",
"medium",
"high"
]
},
"needs_human": {
"type": "noul",
"instructions": "A human reviewer should decide before any merge, link, or delete—because evidence is thin, conflicting, or the write is hard to undo."
}
}
}""")
res = requests.post(
"https://router.flatkey.ai/api/alpha/decisions",
headers={"Authorization": f"Bearer {os.environ['FLATKEY_API_KEY']}"},
json=body,
timeout=60,
)
res.raise_for_status()
data = res.json()
print(json.dumps(data["answers"], indent=2), data.get("usage"))
No Flatkey key yet? Get one for Jev 1.13 →
About this use case

Who / when
Audience
- data engineers running CRM / MDM dedupe who need more than Levenshtein or embedding similarity
- knowledge-graph and search teams linking mentions to canonical entities
- ops teams that escalate ambiguous merges to humans instead of auto-collapsing wrong rows
Triggers
- fuzzy match or embedding neighbors still merge different people or companies
- you need a typed same / different / review decision per candidate pair at batch scale
- string equality fails on nicknames, abbreviations, and formatting noise
- you want calibrated thresholds before an irreversible merge or link write
The workflow
- 01Candidate pairTwo records or mentionsInput
- 02Match decisionsame / different / reviewJev
- 03ConfidenceScore + needs_human flagJev
- 04Code gateMerge, keep separate, or queueYour code
Question shape
{
"match": {
"type": "choice",
"instructions": "Given these two records (or mentions), do they refer to the same real-world entity? Prefer different_entity when evidence conflicts; use review when key fields are missing or ambiguous.",
"criteria": {
"same_entity": "Strong evidence they are the same person, company, or object—compatible identifiers, addresses, or roles with no hard conflicts",
"different_entity": "Hard conflicts (different IDs, incompatible dates/locations, distinct roles) or only superficial name overlap—keep them separate",
"review": "Ambiguous: sparse fields, nickname/abbreviation risk, or conflicting soft signals that a human or richer context should resolve"
}
},
"confidence": {
"type": "score",
"instructions": "How confident are you in the match decision above, based only on the fields provided.",
"criteria": [
"low",
"medium",
"high"
]
},
"needs_human": {
"type": "noul",
"instructions": "A human reviewer should decide before any merge, link, or delete—because evidence is thin, conflicting, or the write is hard to undo."
}
}Gate policy
≥ 0.90
Honor match: merge or link only on same_entity with high confidence; keep separate on different_entity; never auto-merge when needs_human is true.
0.65–0.90
Prefer review over merge; store probabilities and route same_entity mid-confidence pairs to a human queue.
< 0.65
Do not merge or link; mark review or keep separate and log the candidate for later enrichment.
Failure modes
Pre-launch checks before you trust auto-routing:
- Auto-merging on shared name + fuzzy company string and collapsing two different people;
- Treating embedding neighbors as same_entity without checking conflicting emails, cities, or roles;
- Skipping review when confidence is medium because "the names match";
- Asking a chat model for a free-text yes/no and parsing prose that breaks the pipeline type;
- Letting Jev authorize the irreversible merge write instead of only deciding same vs different;
FAQ
How is this different from fuzzy string matching?
Fuzzy match and embeddings rank neighbors; they do not know whether role, city, and email conflicts mean two people. Jev asks atomic same_entity / different_entity / review questions and returns calibrated probabilities you can threshold before a merge.
Should Jev perform the merge itself?
No. Jev should not count, compare dates, perform arithmetic, or authorize irreversible actions by itself. Your code owns blocking, ID equality, and the merge write; Jev only answers the meaning-level match questions.
What does the Flatkey call look like?
POST https://router.flatkey.ai/api/alpha/decisions with Authorization: Bearer …, Content-Type: application/json, and a body of state, model (typesafe/jev-1.13), and questions (choice / score / noul). This is not an OpenAI-compatible /v1 chat endpoint.
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
JEV HAS 6 PRODUCTION PATTERNS… 01 SEMANTIC SQL… 02 TOOL ROUTING… 03 RAG GATES… 04 ENTITY RESOLUTION… 05 TEXT TO FEATURES… 06 CASCADE SAFETY… retrieve narrowly → ask atomic questions → batch… calibrate thresholds… escalate uncertainty… Jev should not count, compare dates, perform arithmetic or authorize irreversible actions by itself.
— @fluixoo View the post on X →
Wire this gate with your own key
Bring your own key through Flatkey / OpenRouter. Keep exact checks in code.