Models
jev-1.13 and jev-latest, the difference between a pinned build and a rolling alias, and the limits both share.
Two decision models are available. They share a context window, a price and a request shape; they differ only in whether the build behind the id can change.
| Model | Build | Use it when |
|---|---|---|
jev-1.13 | Pinned | You are evaluating, caching, or comparing runs over time and need the answer distribution to stay put. |
jev-latest | Rolling | You want improvements automatically and can tolerate a distribution that shifts when a new build ships. |
model is optional. Leaving it out selects jev-1.13.
Which Build Answered
Every response carries model_version — the exact build, with its date suffix:
{
"model": "jev-latest",
"model_version": "jev-1.13-20260917"
}
Log it. On a rolling alias it is the only way to explain why yesterday's answer and today's differ; on the pinned id it is what lets you prove they did not.
Migrating an existing integration
The upstream model ids (typesafe/jev-1.13, ~typesafe/jev-latest) are
accepted as aliases, so an integration that already speaks this API only has
to change its base URL and key. New code should use the short ids.
Listing Models
curl https://jev-ai.org/api/v1/models/ \
-H "Authorization: Bearer $JEV_API_KEY"
Every entry is a Jev decision model, marked "type": "decision". Each one
carries its limits and billing rules inline:
{
"id": "jev-1.13",
"object": "model",
"owned_by": "jev-ai",
"type": "decision",
"endpoint": "/api/v1/systemone",
"rolling": false,
"context_length": 32000,
"question_types": ["noul", "choice", "score"],
"limits": {
"context_tokens": 32000,
"max_state_chars": 100000,
"max_questions": 20,
"max_instructions_chars": 1000,
"min_choice_labels": 2,
"max_choice_labels": 24,
"min_score_tiers": 2,
"max_score_tiers": 10,
"daily_decisions_per_key": 10000
},
"billing": {
"unit": "input_token",
"output_tokens_billed": false,
"credits_per_call_without_tokens": 1,
"failed_requests_billed": false
}
}
A client that only understands the standard OpenAI model object sees id,
object, created and owned_by and can ignore the rest.
GET /models does not run a model and is never charged.
Shared Limits
state is also capped at 100,000 characters. That is a cheap guard against an
accidentally pasted book, not the real limit — the real limit is the 32,000
token context, and input that exceeds it comes back as a
422 without being charged.