scribase
Scribase Decisions

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.

Node / TypeScript (@openjev/sdk)ts
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"
Python (openjev-client, imports as openjev)python
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.

What you get

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.

SDKs

Three packages, one wire contract

From the real package.json / pyproject.toml files in caelum0x/openjev, checked 2026-11-11.

PackageEcosystemVersionLicenseWhat it is
@openjev/sdknpm0.6.1MITFull TypeScript/JavaScript client. Typed Choice, Score and Noul questions, ESM + CommonJS + .d.ts.
@openjev/litenpm0.2.1MITZero-dependency client for the same wire contract, for size-sensitive runtimes (edge, browser, CLIs).
openjev-clientPyPI0.7.2MITPython 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.

Self-host

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.

Self-host the enginesh
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
Or use a hosted Jev-compatible keyenv
# 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.

Questions

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.