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.

ModelBuildUse it when
jev-1.13PinnedYou are evaluating, caching, or comparing runs over time and need the answer distribution to stay put.
jev-latestRollingYou 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

Context window32,000 tokensInput plus questions
Questions per call20Answered in one pass
Choice labels2 – 24Per choice question
Score tiers2 – 10Per score question

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.