// HACKER NEWS — CYBERSECURITY
Show HN: Jevper – the Jev interface on top of any OpenAI-compatible model
The Jev interface — state in, typed questions (noul, choice, score) out,
answers carrying probabilities and confidence — on top of any OpenAI-compatible model.
Same call as typesafe-sdk, different backend: point jevper at a hosted LLM or a self-hosted llama.cpp
server and code written for Jev keeps working, unchanged.
It does not call the hosted TypeSafe API and does not depend on typesafe-sdk or openai at runtime — the
client object is duck-typed. Any object exposing responses.create or chat.completions.create works,
including a self-hosted llama.cpp server.
jevper is an independent implementation of the documented System One wire format. It is not affiliated
with, endorsed by, or supported by TypeSafe AI — questions about the API itself belong in
their docs.
Python 3.10+. The only runtime dependency is pydantic>=2.7.
Each question becomes its own provider call, so questions are independent and run concurrently
(max_concurrency, default 8). Answers come back keyed by your question ids, in insertion order.
Three types, mirroring the Jev API — Noul answers yes/no with one probability, Choice picks one of your
labelled options, Score rates on an ordered scale:
Score.score is the probability-weighted level index (Σ i·pᵢ, levels zero-based), as in the Jev API.
Choice takes up to 255 options, the Jev API limit. The two methods that read a label token —
logprobs and grammar — stop at 26, because the first token of "AA" is "A"; past 26 options they
raise InvalidQuestionError pointing at structured and discrete, which answer in JSON and use
two-letter labels. The default method="auto" never hits that error: it answers a wide Choice in JSON.
Questions can also be passed as raw mappings ({"type": "choice", "criteria": {...}}) and are validated the
same way.
method= decides how the decision is elicited. All four share the same label→option mapping, so switching
methods does not change your types; only the label alphabet differs (logprobs and grammar need
single-letter labels, so they cap at 26 options).