Model comparison · 2026-10-17
Jev 1.14 or Jev 1.13? Differences, pricing and migration
Jev 1.14 vs Jev 1.13: typesafe/jev-1.14.0 and typesafe/jev share price and limits; they differ in Box questions and the release label. Migration steps.
Short answer: Jev 1.14 for new work, Jev 1.13 for work tuned to 1.13
LLMTR (llmtr.com) is a gateway that gives access to language models from different providers through one OpenAI-compatible API. Two versions of Jev, TypeSafe's decision model, sit there under two separate model ids: typesafe/jev-1.14.0 for Jev 1.14 and typesafe/jev for Jev 1.13. Both are called on the POST /v1/systemone endpoint with the base address https://llmtr.com/v1, and both accept the same request body.
A new integration can start on typesafe/jev-1.14.0; the Box question, which finds where an object is in an image, exists only on this version. An integration whose thresholds are tuned to the probabilities Jev 1.13 returns can stay on typesafe/jev: that id is pinned to Jev 1.13 and does not move to a new version on its own. Price, context limits and the three question types for text are the same on both versions.
Jev 1.14 or Jev 1.13?
Three questions settle the choice. Do you need Box questions? If so, the only option is Jev 1.14; a Box question sent to typesafe/jev returns 400 invalid_request before it reaches the model, and nothing is charged. Do you have existing thresholds? If so, send the same samples to both versions before you move, because the two versions can return slightly different probabilities for the same question. Does the release label matter to you? TypeSafe describes jev-latest, the alias on 1.13, as the most recent stable, official release, and jev-preview, the alias on 1.14, as the most recent release, official or not.
The table below puts the facts about the two rows on LLMTR side by side. The difference comes down to one question type and the release label; price, limits, experimental features and the response shape are the same.
| Property | Jev 1.14 | Jev 1.13 |
|---|---|---|
| Model id | typesafe/jev-1.14.0 | typesafe/jev |
| TypeSafe version id | jev-1.14.0 (alias jev-preview) | jev-1.13.0 (alias jev-latest) |
| Input price | $0.042 per 1M tokens | $0.042 per 1M tokens |
| Output price | $0 per 1M tokens | $0 per 1M tokens |
| Context in the catalog | 32,000 tokens | 32,000 tokens |
| TypeSafe context limits | 32K tokens per question, 64K per request; 262K tokens with the long-context header | 32K tokens per question, 64K per request; 262K tokens with the long-context header |
| Question types | noul, choice, score, box | noul, choice, score |
| Images (experimental, with header) | yes | yes |
| Long context (experimental, with header) | yes | yes |
What is the same on both versions
Both rows cost $0.042 per 1M input tokens and $0 for output. output_tokens in the usage field can still be above zero; what is $0 is the price of output, not its count. Jev counts the state once per request, so combine the questions you want to ask about one state into one request. According to TypeSafe, the default limits are 32K tokens per question (the state plus one question) and 64K tokens per request (the state plus every question). The catalog shows the context as 32,000 tokens because every question is read with the whole state.
The noul, choice and score question types and the shape of the answers are the same on both versions. Images and long context exist on both versions too; TypeSafe offers them as experimental and says the request format, answers and limits can change between releases. Each is switched on per request with a header: TypeSafe-Danger-Zone-Images: true turns images on, and TypeSafe-Danger-Zone-Long-Context: true raises both limits to 262K tokens without changing the token price. LLMTR forwards these headers to the provider on both Jev rows; a request without the header is unchanged.
The differences: Box questions and the release label
Jev 1.14 is the only version that answers the Box question type, which returns where something is in an image as four edges. Box needs an image and the TypeSafe-Danger-Zone-Images: true header. The image must be in the state or in the Box question's own instructions; a Box question with no image it can see also returns 400 invalid_request. A Box answer carries no probability distribution, only the box and a confidence value.
The second difference is in the label, not the behaviour. TypeSafe lists Jev 1.14 as available from 14 October 2026 and ties it to the jev-preview alias; Jev 1.13 is the stable release the jev-latest alias points to. TypeSafe notes that an alias can move to a new release and change answers without a code change, and recommends sending that version's id if you have tuned thresholds against one version. The two ids on LLMTR are already pinned: typesafe/jev stays on Jev 1.13 and typesafe/jev-1.14.0 on Jev 1.14. The model field in the response returns the LLMTR id you used in the request.
Moving from Jev 1.13 to Jev 1.14: send the same samples to both versions
In code, the move is a change to one field: set model to typesafe/jev-1.14.0 instead of typesafe/jev. If you have thresholds, first pick a labelled set of samples from the past and send the same requests to both ids. The script below prints, for each sample, the team each version picks and its confidence value side by side.
In the output, look at the samples where the choice changed or where the confidence crossed to the other side of your threshold, and retune the threshold to Jev 1.14's distribution. The cost is small: sending 200 samples of about 600 input tokens each to both versions comes to 240,000 tokens, that is 240,000 x $0.042 / 1,000,000 = $0.01008. If you want to move gradually, send part of your traffic to the new id and watch the results for a while; typesafe/jev keeps working unchanged in the meantime.
A Python requests script that sends the same samples to typesafe/jev and typesafe/jev-1.14.0 and prints the choice and confidence side by side.
import os
import requests
API_KEY = os.environ["LLMTR_API_KEY"]
MODELS = ["typesafe/jev", "typesafe/jev-1.14.0"]
# Replace with labelled samples from your own traffic.
SAMPLES = [
"I was charged twice for my October invoice. Please refund the second charge.",
"The export button returns an error since this morning and our reports are stuck.",
]
QUESTIONS = {
"team": {
"type": "choice",
"instructions": "Which team should handle this message?",
"criteria": {
"billing": "Payments, invoices, refunds",
"technical": "Errors, outages, integrations",
"other": None,
},
},
}
for state in SAMPLES:
row = []
for model in MODELS:
response = requests.post(
"https://llmtr.com/v1/systemone",
headers={"Authorization": f"Bearer {API_KEY}"},
json={"model": model, "state": state, "questions": QUESTIONS},
timeout=60,
)
response.raise_for_status()
team = response.json()["answers"]["team"]
row.append(f"{model}: {team['choice']} ({team['confidence']:.2f})")
print(" | ".join(row))
Error cases and limits both versions share
If you send an image and forget the TypeSafe-Danger-Zone-Images: true header, you get 400 provider_error and the message names the missing header. A request over the context limit also returns 400 provider_error; shorten the request or send the long-context header. LLMTR accepts images only in a JSON body, as data_base64 in the assets map; multipart uploads are not accepted, and the request body is limited to 24 MB in total.
If the key's request limit is exceeded you get 429 rate_limit_error, if your credit balance does not cover the request 402 insufficient_credits, and if the model cannot answer for a while 503 model_unavailable. Neither version streams, so the response arrives in one piece; neither appears in the Playground or on the chat endpoints, and both answer only on /v1/systemone.
Move from Jev 1.13 to Jev 1.14
Send labelled samples to both versions, tune the threshold to Jev 1.14 and set model to typesafe/jev-1.14.0.
- Samples. Pick a few hundred samples from your past traffic whose right answer you know, and keep the questions you use exactly as they are.
- Both versions. Send the same requests to https://llmtr.com/v1/systemone with the typesafe/jev and typesafe/jev-1.14.0 ids; mark the samples whose choice or threshold side changes.
- Move. Tune the threshold to Jev 1.14's results and set model to typesafe/jev-1.14.0; move traffic gradually if you prefer.
Frequently asked questions
Do Jev 1.14 and Jev 1.13 cost different amounts?
No. On LLMTR both rows cost $0.042 per 1M input tokens and $0 for output. The long-context header does not change the token price either.
Does typesafe/jev move to Jev 1.14 on its own?
No. The typesafe/jev id is pinned to Jev 1.13. To use Jev 1.14, set model to typesafe/jev-1.14.0, and check your thresholds again with the same samples before you move.
Can I use Box questions on Jev 1.13?
No. Box works only on typesafe/jev-1.14.0. A Box question sent to typesafe/jev returns 400 invalid_request before it reaches the model, and nothing is charged.