Your first Jev call
Jev has no chat endpoint, no system prompt and no streaming. You send a blob of state and a map of typed questions, and you get a map of typed answers. This is the whole loop, end to end, in about five minutes.
By the end you'll be able to
- Authenticate against the TypeSafe API
- Send a request with one Noul question
- Read the answer without parsing a string
- Understand what the response's usage block is charging you for
On this page
Before you start#
Jev shipped on 15 September 2026 in waitlisted early access. You need an account at console.typesafe.ai and a key from Settings → Keys. If you are still on the waitlist, you can follow every example on this site by reading — the requests and responses here are the ones in TypeSafe's own documentation.
Set your key#
export TYPESAFE_API_KEY="sk-..."Both official SDKs read TYPESAFE_API_KEY from the environment, so you almost never pass a key in code. The Python SDK also honours TYPESAFE_BASE_URL, TYPESAFE_DEFAULT_MODEL and TYPESAFE_LOG_LEVEL.
The smallest possible request#
Every request carries three things: state (what to look at), model (which model looks at it) and questions (a map of judgments to make). Here is the smallest useful one — a single Noul, which is TypeSafe's name for a yes/no question that returns a probability.
curl -X POST https://api.typesafe.ai/v1/systemone \
-H "Authorization: Bearer $TYPESAFE_API_KEY" \
-H "Content-Type: application/json" \
-d @- <<'EOF'
{
"state": "Hi, I've been trying to connect my Stripe account for 3 days and it keeps failing. I'm losing sales. Please help ASAP.",
"model": "jev-latest",
"questions": {
"urgency": {
"type": "noul",
"instructions": "Does this message express urgency?"
}
}
}
EOFThe key urgency is yours. TypeSafe's docs are explicit that it is not sent to the model and plays no part in inference — it is only the label your answer comes back under. Write the real question in instructions, even when the key looks self-explanatory.
What comes back#
{
"model": "jev-latest",
"answers": {
"urgency": {
"type": "noul",
"noul": 0.999
}
},
"usage": { "input_tokens": 312, "output_tokens": 48 }
}That is the entire response. No prose, no JSON-in-a-string, nothing to try/except around a parse. The value 0.999 is a probability, not a score out of one — Jev is saying the answer to your question is yes with 99.9% probability. The envelope shape is from TypeSafe's API reference; the value is the one LangChain published for this exact message. Token counts are illustrative.
Noul answers carry no confidence field. The probability itself is the signal.
The same call from Python#
pip install typesafe-sdk
# or: uv add typesafe-sdkThe Python SDK needs 3.10 or newer. It exposes Choice, Noul and Score as classes and a TypeSafeClient that picks up your key from the environment.
from typesafe_sdk import Noul, TypeSafeClient
client = TypeSafeClient()
ticket = (
"Hi, I've been trying to connect my Stripe account for 3 days "
"and it keeps failing. I'm losing sales. Please help ASAP."
)
response = client.system_one(
state=ticket,
questions={
"urgency": Noul(
instructions="Does this message express urgency?",
),
},
)
print(response.answers["urgency"].noul) # 0.999And from TypeScript#
npm install @typesafe-ai/sdkThe JavaScript SDK needs Node 20 or newer and ships ESM, CommonJS and type declarations. Note the shape differences from Python: one options object instead of keyword arguments, systemOne instead of system_one, and lowercase factory functions instead of classes.
import { noul, TypeSafeClient } from "@typesafe-ai/sdk";
const client = new TypeSafeClient();
const response = await client.systemOne({
state:
"Hi, I've been trying to connect my Stripe account for 3 days " +
"and it keeps failing. I'm losing sales. Please help ASAP.",
questions: {
urgency: noul("Does this message express urgency?"),
},
});
console.log(response.answers.urgency.noul);Answer types are inferred from the questions you passed, so response.answers.urgency.noul type-checks and response.answers.urgency.choice does not. That inference is most of the reason to use the SDK over raw fetch.
Reading the usage block#
Jev bills input tokens only, at $0.042 per million. Output tokens are reported in usage but are not charged — TypeSafe's launch post describes them as "too cheap to meter". That single fact drives most of the design advice on this site: once output is free and questions run in parallel, asking an extra question is close to free, and the instinct to ask one thing at a time becomes actively expensive.
Which model answered#
The response's model field reports the versioned ID that actually served the request. jev-latest is an alias, currently resolving to jev-1.13.0. Log the versioned ID from day one — the moment you tune a confidence threshold, you have coupled your code to one model's probability distribution, and you want to know when that moves underneath you.
client = TypeSafeClient(model="jev-1.13.0") # pin it once thresholds matterNext#
You have made one judgment. The next step is choosing the right shape of judgment — Jev has exactly three, and picking the wrong one is the most common early mistake. Continue to Noul, Choice and Score.
Sources for this page
- TypeSafe — Quickstart
- TypeSafe — HTTP API reference
- TypeSafe — Models, pricing and limits
- TypeSafe — Python SDK
- TypeSafe — JavaScript SDK
- TypeSafe — Introducing System One Models & Jev
Last reviewed 2026-09-18. Jev is days old and moving — where a claim is TypeSafe's own rather than independently verified, this page says so in the sentence that carries it.