state (the
text or record to evaluate) and a map of typed questions, and the answer is a
calibrated probability per question. Kev
is a family of small open-weight models that implement the same API, so one
jev provider type covers both.
There are three question types:
GoModel serves
jev models two ways:
- OpenAI’s Decisions API at
POST /v1/decisions, which asks the same three kinds of question (predicatefornoul). GoModel translates the request to System One and the answer back, so OpenAI SDKs and clients written forgpt-6-lunawork with Jev and Kev unchanged. - System One itself at
POST /v1/systemone, forwarded natively without translation, for the TypeSafe SDKs; it is also available with only anopenrouterprovider. Passthrough at/p/jev/...reaches every other upstream route.
/responses, and /v1/embeddings return invalid_request_error for
jev models, pointing at both decision endpoints.
Configure
For the hosted API, the key is the whole setup:The default base URL is
https://api.typesafe.ai, the origin TypeSafe’s SDKs
use; a trailing /v1 is accepted and trimmed, so both spellings address the
same server. To run the hosted API and a local Kev side by side, register the
second under a suffixed name: JEV_KEV_BASE_URL=... creates provider
jev-kev, reached at /p/jev-kev/.... In config.yaml, any name works,
such as kev: {type: jev, base_url: ...}, and that name is what logs,
usage, and model prefixes show.Verify
kev-latest as the model on a Kev server; it also answers to
jev-latest. The same request works at /p/jev/v1/systemone, but that
passthrough route skips virtual models and guardrails; see
the native endpoint.
The same question through the Decisions API, with an OpenAI SDK or curl:
Using the TypeSafe SDKs
The SDKs sendPOST {base_url}/v1/systemone, so point them at the gateway
itself and authenticate with your GoModel key:
TYPESAFE_BASE_URL=http://localhost:8080 and
TYPESAFE_API_KEY=change-me in the environment. With several System One
providers, name the model with its provider (kev/kev-latest) or a
virtual model.
The SDKs’ model listing expects TypeSafe’s shape, while the gateway’s
/v1/models is OpenAI-shaped; list upstream models at /p/jev/v1/models.
System One API
POST /v1/systemone is a gateway endpoint, not a raw proxy: it applies
virtual models, guardrails on state, the response cache, failover, audit,
and usage, and it forwards the request natively without translating it. Kev’s
/v1/systemone/permute and /v1/systemone/separate work the same way. See
System One API for the full behavior, including
OpenRouter, which serves Jev natively too.
Every other upstream route is reachable through
passthrough, without virtual models, guardrails,
or caching:
Upstream errors keep their status code, with the provider’s body carried in
the gateway error message: a malformed question comes back as TypeSafe’s
422
naming the offending field, and 429 or 529 mean back off and retry.
Models, access control, and cost
GET /v1/models lists what the upstream reports, as jev/jev-latest and so
on. TypeSafe lists its aliases (jev-latest, jev-preview); a Kev server
lists its checkpoint (kev-latest) and the aliases it answers to. Versioned
IDs such as jev-1.13.0 are accepted by the model field whether or not they
are listed. The models are categorized as utility models with no generation
mode: they answer /v1/decisions and /v1/systemone, not chat. A provider
whose base URL is TypeSafe’s hosted API reports the vision capability for
its models; any other base URL is taken to be a Kev server, whose models
report vision: false, and GoModel refuses image requests to them.
Every System One request names its model, so both /v1/systemone and the
passthrough surface apply the caller’s model allowlist to
it like any other request.
A pinned version such as jev-1.13.0 works without being declared; see
Models for how unlisted names are routed.
The response’s usage.input_tokens and usage.output_tokens are recorded, so
System One calls appear in the usage API and dashboard under the model that
answered (jev-1.13.0, or the Kev checkpoint). Jev is priced per input token
and is not in the upstream model catalog; declare its pricing on the provider
to have those rows costed, or set it in the
pricing override editor: