jevbooks

Jev 上手

Jev 1.14 实践:图片、Box 与模型版本

用同一张界面图,一次问「保存按钮在不在」和「它在哪里」。下载示例后可直接查看请求结构,再在服务可用的环境中运行。

jevbooks 独立教程 · 更新于

Jev 1.14 于 2026-10-14 发布,官方强调包括多语言在内的质量改进。图片输入同时开放给 1.13 和 1.14;Box 定位题型需要 1.14。Images / Box 仍是实验能力,格式、限制和准确率可能变化。

实测状态(2026-10-22):本站在开始复测时,官方 API 的首个纯文本探测返回 HTTP 451,提示当前地区不可用,因此没有继续发送图片。下面是已检查请求结构的可复现示例,没有成功的图片响应、耗时或准确率成绩;图片中的已知位置也不冒充模型输出。

1. 先固定模型,再记录实际版本

本例明确使用 jev-1.14.0。10 月 22 日抓取的官方模型文档仍写 jev-latest → 1.13、jev-preview → 1.14;别名可变化,不能按发布日期推断当前指向。保存每次响应的 model、题目、输入和 usage,之后才能公平比较。

本站旧实验的 p50 约 375 ms 和 Top 10 重合 5/10 来自 2026 年 9 月的 1.13,不能改标为 1.14 成绩。官方多语言改进也不等于中文已追平英语。

2. 下载 PNG 与请求,先确认目标

人工制作的设置界面:右下角有 Save changes 按钮,没有 Delete account 按钮。
人工制作的 640 × 400 PNG,不含用户资料。Save changes 存在,Delete account 不存在,用来检查「不存在也会返回框」的处理逻辑。

把文件保存在同一目录。Node 脚本需要 Node 22+,不需要安装包;Python 脚本需要 requests。设置环境变量 TYPESAFE_API_KEY 后,运行 node request.mjs 或 python3 request.py。两份脚本读取同一个 request.json,并把成功响应保存为 response.json。

使用 Python 前,先在你的 Python 环境中安装请求依赖:

python3 -m pip install requests

3. 图片进入 assets,不是普通文本

这份请求把唯一图片引用放进 state.screenshot,assets 把引用关联到文件上传字段 screenshot-file。四道题共享同一张图,各自读取 screenshot;不用在每道题中重复放图片引用。

{
  "model": "jev-1.14.0",
  "state": {
    "screenshot": "739c0c20-5636-4ed4-856c-a44ee83f5d20"
  },
  "assets": {
    "739c0c20-5636-4ed4-856c-a44ee83f5d20": {
      "type": "image",
      "part": "screenshot-file"
    }
  },
  "questions": {
    "save_visible": {
      "type": "noul",
      "instructions": "Is a button labeled Save changes visible in `screenshot`?"
    },
    "save_button": {
      "type": "box",
      "instructions": "The entire button labeled Save changes in `screenshot`, including its colored background."
    },
    "delete_visible": {
      "type": "noul",
      "instructions": "Is a button labeled Delete account visible in `screenshot`?"
    },
    "delete_button": {
      "type": "box",
      "instructions": "The entire button labeled Delete account in `screenshot`."
    }
  }
}

也可以直接用 curl。request 必须是 multipart 的第一部分;不要手动写 multipart 的 Content-Type,curl 会生成正确 boundary。每个含图片或 Box 的请求都要携带实验头。

curl --fail-with-body https://api.typesafe.ai/v1/systemone \
  -H "Authorization: Bearer $TYPESAFE_API_KEY" \
  -H "TypeSafe-Danger-Zone-Images: true" \
  -F 'request=@request.json;type=application/json' \
  -F 'screenshot-file=@settings-demo.png;type=image/png' \
  -o response.json

若只能发送 JSON,将资产改为 {"type":"image","format":"png","data_base64":"…"},不要带 data: 前缀,也不要只把 base64 塞进 state。引用会按字符串匹配,使用 UUID 避免误匹配;assets 中每个资产都必须被引用。

官方 SDK 也能创建引用和上传:JavaScript @typesafe-ai/sdk 0.7.0(Node ≥22)、Python typesafe-sdk 0.7.5。新版本默认压缩可能与第三方网关不兼容;本页示例直接访问官方 API。

4. 先看存在概率,再使用 Box 坐标

Noul 与 Box 在同一批并行回答。Box 没有 not-found;即使 Delete account 不存在,也会返回四个边。应用必须先检查 delete_visible.noul,概率不足时丢弃 delete_button.box。Box confidence 不能充当对象存在概率,也不是 IoU。

四边都是 0–1 的相对坐标:left/right 乘图像宽度,top/bottom 乘高度,原点在左上角。下面的代码仅在存在性和定位都通过示例阈值时裁图;阈值需要你自己的样本校准。

裁图代码使用 Pillow(导入名为 PIL),先安装:

python3 -m pip install Pillow
import json
from PIL import Image

response = json.load(open("response.json"))
answers = response["answers"]
visible = answers["save_visible"]["noul"]
answer = answers["save_button"]

# Example thresholds only: calibrate them on your own images.
if visible < 0.8:
    print("No reliable presence signal; ignore the box.")
elif answer["confidence"] < 0.6:
    print("Review or retry on a better crop before using the box.")
else:
    img = Image.open("settings-demo.png")
    width, height = img.size
    b = answer["box"]
    clamp = lambda value: max(0, min(1, value))
    pixels = (
        round(clamp(b["left"]) * width),
        round(clamp(b["top"]) * height),
        round(clamp(b["right"]) * width),
        round(clamp(b["bottom"]) * height),
    )
    if pixels[0] >= pixels[2] or pixels[1] >= pixels[3]:
        raise ValueError("Invalid pixel box after rounding")
    img.crop(pixels).save("save-button.png")

print("served model:", response["model"])
print("input tokens:", response["usage"]["input_tokens"])

一题只找一个目标;多个目标要分题,或先确认 none / one / several,再分区寻找。小目标可先定位大区域,再用更清晰的裁图重问。低 confidence 时可人工复核或适当扩大裁切边界。裁出的图若要再次上传,也必须满足每边至少 280 px。

相关模式:问卷(同一 state 多题) · 盲审(独立复核)

5. 图片、上下文与成本的边界

项目当前规则
文件仅静态 PNG / JPEG,每张 ≤16 MiB;每边 280–1568 px。
预处理自行缩放、补边并把像素旋转到正向。API 不自动缩放,也不应用 EXIF 方向。视频需先抽帧。
体积限制请求体、处理后的图片总量、引用展开后的完整请求分别受 32 MiB 限制;重复引用会重复计入展开量。
默认上下文state + 全部问题 ≤64k token;state + 任意单题 ≤32k。图片 token 也计入。
实验长上下文TypeSafe-Danger-Zone-Long-Context: true — 1.13 / 1.14 两个上限都升至 262k。官方说明更慢、准确率更低;不替代图片实验头。
价格每百万输入 token $0.042,输出免费;图片与文本同单价。响应 usage.input_tokens 含图片。

一次成功请求的输入费用 = usage.input_tokens ÷ 1,000,000 × $0.042。官方尚未给图片 token 估算公式,不承诺固定每图费用。长上下文开关也不会取消 32 MiB 大小限制;先缩小 state、分块,再考虑扩上下文。

下一步与一手来源