Jev can see now. Version 1.14 takes images and adds Box, a fourth question type that answers where something is. One rule makes it safe to use: a Box always returns a box, so ask whether the thing is there first.
Until October, every Jev request was text: a string, a JSON object or an array of strings. Jev 1.14, released on 14 October 2026, changes two things. It accepts PNG and JPEG images in the request, so Choice, Score and Noul questions can be asked about a photo or a screenshot. And it adds a fourth question type, Box, which answers a new kind of question: where is it?
jev-latest now points to jev-1.14.0, and OpenRouter lists typesafe/jev-1.14 next to typesafe/jev-1.13. Price and context limits did not change: $0.042 per million input tokens with free output, 64k tokens per request and 32k per question.
Images go in as assets
An image is not pasted into state. It is attached to the request as an asset and referenced from state by name, which keeps the JSON readable and lets several questions point at the same picture. In TypeSafe's Box example the request is multipart: a request part holding the JSON and a file part holding the photo.
json
{"model":"jev-latest","state":{"photo":"6e1d0b7c-kitchen"},"assets":{"6e1d0b7c-kitchen":{"type":"image","part":"kitchen-photo"}},"questions":{"mug":{"type":"box","instructions":"the coffee mug in `photo`"}}}
The file itself travels as the form part named kitchen-photo. TypeSafe also documents a base64 form for JSON-only clients on its images page.
Every request that contains an image or a Box question needs this header:
http
TypeSafe-Danger-Zone-Images: true
The header is a deliberate speed bump. TypeSafe files image input and Box under its "dreamer-ready" tier, not production-ready: the request format, answers and limits can change between releases, and accuracy will move as the models update. Pin jev-1.14.0 rather than jev-latest if you build on it now, so a release does not shift your thresholds underneath you.
What a Box returns
A Box question has a type of "box" and instructions that name the target and the image. It takes no criteria, because there are no options to pick from. The answer is four edges and a confidence:
Edges are fractions of the image, measured from the top-left corner: left and right are fractions of width, top and bottom fractions of height. To get pixels, multiply. On a 1920 by 1080 photo the mug above runs from x 845 to 1613 and y 270 to 886. Because the edges are fractions, the same answer works on a thumbnail and on the original.
A Box always returns a box
This is the one rule to internalize. TypeSafe's docs say it plainly: there is no "not found" answer. Ask for a cat in a picture of a desk and you get a box around something, with some confidence. Try it:
Interactive · simulated answersFind it with a Box
Noul gate
Image
Pixels: x 1171 to 1402, y 605 to 832 on a 1920×1080 image.
questions
{
"target": {
"type": "box",
"instructions": "the coffee mug in `photo`"
}
}
The scene is drawn, and the confidences and Noul values are made up to show the behavior TypeSafe documents. The edge math is real: edges are fractions of width and height from the top-left corner, and pixels are edge times image size. Box is in TypeSafe's “dreamer-ready” tier and needs the TypeSafe-Danger-Zone-Images: true header.
The fix is the pattern TypeSafe recommends and the one we use: gate the Box with a Noul. Ask "Is there a cat in photo?" in the same request. Questions run in parallel against the same state, so the extra question costs a few tokens and no extra round trip. When the Noul is low, code throws the box away.
Two neighboring situations need the same care:
Several matches. One Box question returns one box. If the photo has three mugs, describe the one you want ("the mug nearest the laptop"), or add a Choice with the options none, one and several and branch on it.
Small targets in big images. A target that is small relative to a very large image can be missed. Find the region first, for example with a Choice over tiles of the image, then run the Box on that tile and convert its edges back to full-image fractions.
TypeSafe does not yet recommend a confidence threshold for Box. Pick one from labelled examples of your own. Below it, retry on a larger crop, or pad the box before cropping so the target is not cut off.
Images with the other primitives
The bigger change may be the quieter one: Choice, Score and Noul now work on images too. A few uses we expect to matter more than bounding boxes:
Screenshot triage. A support ticket arrives with a screenshot. One request asks which product area it shows (Choice), whether an error message is visible (Noul) and how broken the page looks (Score).
Document checks. Is this upload a receipt, an invoice or something else? Is a signature present? Is the total legible?
Agent guardrails. Before a browsing agent clicks, ask whether the screen shows a payment form or a login prompt, and route to a person if so. This extends the guardrail pattern we already use on text.
All of it costs input tokens only. An image costs what its tokens cost, which the response's usage reports, so log it per call while you learn what your typical photo costs.
Jev and OpenAI both see now
Jev is no longer alone with typed decisions, and as of 1.14 the "text only" gap with OpenAI's Decisions API has closed. OpenAI's endpoint takes images as data URLs or public URLs, inside the input and inside question instructions. It has no Box equivalent. For the full comparison, see OpenAI's Decisions API vs Jev.
Yes, from Jev 1.14 (14 October 2026). It accepts PNG and JPEG images as assets referenced from state, and every request with an image needs the TypeSafe-Danger-Zone-Images: true header. TypeSafe classes image support as dreamer-ready, not production-ready.
What is the Jev Box primitive?
A question type that finds where something is in an image. It returns a bounding box as four edges (top, bottom, left, right), each a fraction from 0 to 1 of the image size, plus a confidence.
What does a Box question return if the object is not in the image?
Still a box. A Box answer is always a box, so pair it with a Noul question such as "Is there a cat in photo?" and ignore the box when the Noul is low.
Did Jev 1.14 change the price?
No. Jev 1.14 costs $0.042 per million input tokens, the same as Jev 1.13, and output tokens remain free.