Typed AI judgments, next to your database
A yes/no probability, a category choice, or a numeric score — returned as a type your code branches on, not a string you parse. Built on OpenJev: an open-source, Jev-compatible decision engine and SDK set we maintain. Self-host it today; a hosted Decisions API is on the roadmap.
Jev-compatible: the wire contract matches TypeSafe AI's Jev ("System One") API. OpenJev is an independent fork we maintain, not a TypeSafe product and not built by Scribase.
import { choice, OpenJevClient } from "@openjev/sdk";
// Self-hosted: no baseUrl needed if the engine runs on localhost:8080.
// Hosted Jev-compatible key: new OpenJevClient({ baseUrl: "https://api.typesafe.ai/v1", apiKey: process.env.JEV_API_KEY })
const client = new OpenJevClient();
const response = await client.systemOne({
state: { document: "I was charged twice. Please fix this ASAP." },
questions: {
category: choice("What is this support ticket about?", {
billing: null,
technical: null,
other: null,
}),
},
});
console.log(response.answers.category.choice); // "billing"from openjev import Choice, TypeSafeClient
# Self-hosted: defaults to http://localhost:8080
# Hosted Jev-compatible key: TypeSafeClient(base_url="https://api.typesafe.ai/v1", api_key=os.environ["JEV_API_KEY"])
with TypeSafeClient() as client:
response = client.system_one(
state={"document": "I was charged twice. Please fix this ASAP."},
questions={"category": Choice("What is this support ticket about?", ["billing", "technical", "other"])},
)
print(response.answers["category"].choice)Three question shapes: Choice — one of a fixed set of labels; Score — a 0-1 probability or calibrated numeric score; Noul — open-ended, for cases a fixed label set does not fit. Ask for one and get a typed answer back, over POST /v1/systemone.
A decision primitive, not another prompt to maintain
Three typed question shapes
Choice (pick one of a fixed set of labels), Score (a calibrated 0-1 probability or numeric score) and Noul (open-ended) — so a judgment comes back as a type your code can branch on, not a string to parse.
Jev-compatible wire contract
The same request and response shapes as TypeSafe's POST /v1/systemone: model + state + questions-as-a-dictionary. Code written against one backend runs unchanged against the other.
Self-host next to your Scribase project
The engine (otsone) is a normal Node service: clone it, run it, point an SDK at its URL. No API key needed for a self-hosted server unless you configure one.
Or use a hosted Jev-compatible key
Point the same SDK at a hosted Jev-compatible endpoint with an API key instead of running the engine yourself — useful while a project is small or before deciding to self-host.
Calibration and drift tooling built in
The engine ships calibration fitting, drift detection, eval import and a gold-set test harness (npm run gold), so a Score answer is checked against real outcomes, not just returned.
Apache-2.0, fully inspectable
Independent fork, not a wrapper around a closed API: the full engine, cookbooks and SDKs are public source you can read, run and modify.
Three packages, one wire contract
From the real package.json / pyproject.toml files in caelum0x/openjev, checked 2026-11-11.
| Package | Ecosystem | Version | License | What it is |
|---|---|---|---|---|
| @openjev/sdk | npm | 0.6.1 | MIT | Full TypeScript/JavaScript client. Typed Choice, Score and Noul questions, ESM + CommonJS + .d.ts. |
| @openjev/lite | npm | 0.2.1 | MIT | Zero-dependency client for the same wire contract, for size-sensitive runtimes (edge, browser, CLIs). |
| openjev-client | PyPI | 0.7.2 | MIT | Python client (importable as `openjev`). Named openjev-client because the plain `openjev` PyPI name is taken. |
All three carry their own open-source license (MIT for the SDKs, Apache-2.0 for the engine) and are not affiliated with TypeSafe AI.
Run the engine next to your Scribase project
One repository: the otsone decision engine, cookbooks, calibration and drift tooling, and the three SDKs above. No API key needed unless you configure one.
git clone https://github.com/caelum0x/openjev
cd openjev && npm install
npm run dev # serves POST /v1/systemone on :8080
# then point any @openjev SDK or openjev-client at http://localhost:8080# Point the SDK at a hosted Jev-compatible endpoint instead of self-hosting
OPENJEV_BASE_URL=https://api.typesafe.ai/v1
OPENJEV_API_KEY=jev_...Stated honestly
There is no hosted api.scribase.com Decisions endpoint yet — today this page documents the self-host path and the hosted Jev-compatible key path, both of which work right now against the real OpenJev engine. A first-party hosted endpoint is tracked on the Roadmap.
Before you add it
Did Scribase build Jev?
No. Jev ("System One") is TypeSafe AI's product. Scribase Decisions is a quickstart and SDK-naming layer over OpenJev — an independent, Apache-2.0 open-source fork of Jev's engine and SDKs that we maintain. We call the wire contract "Jev-compatible," not "made by Scribase."
Do I need a hosted API key?
No. The engine (otsone) self-hosts: clone the repository, run it, and point an SDK at its URL — no key required unless you configure one. A hosted Jev-compatible API key (from TypeSafe or a compatible host) is an alternative, not a requirement.
Is there a hosted Scribase Decisions API yet?
Not yet. Today this is a self-host-first primitive: the open-source engine plus SDKs. A hosted api.scribase.com endpoint for Decisions is on the roadmap; see the Roadmap page.
What do I get back from a question?
A typed answer matching the question shape you asked: a Choice answer carries one label from your fixed set, a Score answer carries a calibrated number, a Noul answer carries open-ended text — so your code branches on a type, not a parsed string.
Which SDK should I use?
@openjev/sdk for a full-featured TypeScript/JavaScript client, @openjev/lite when you want zero dependencies, or openjev-client (PyPI; imports as `openjev`) for Python. All three speak the same wire contract.