Skip to content
learnjev
Tutorial 01/13FoundationsBeginner6 min

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#

Shell
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.

first-call.sh
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?"
      }
    }
  }
EOF

The 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#

response.json
{
  "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.

noulurgencyDoes this message express urgency?
noul0.999
0.0 — no0.5 — no informationyes — 1.0

Noul answers carry no confidence field. The probability itself is the signal.

A Noul is the only answer type with no confidence field. The probability already is the belief — a value near 0.5 is the model telling you it has nothing to go on.

The same call from Python#

Shell
pip install typesafe-sdk
# or: uv add typesafe-sdk

The 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.

first_call.py
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.999

And from TypeScript#

Shell
npm install @typesafe-ai/sdk

The 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.

first-call.ts
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.

Python
client = TypeSafeClient(model="jev-1.13.0")  # pin it once thresholds matter

Next#

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

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.