TopxAI 上线 Jev 1.14:能看图、能框位置,图片怎么计费
· typesafe, jev, system-one, images, api, topxai
Jev 1.14 替换 1.13,价格不变,开始支持图片。我们实测了 Box 的定位精度、各尺寸图片的 token 数,以及实际的尺寸下限。
TypeSafe 在 10 月 14 日发布了 Jev 1.14,TopxAI 从今天起用 jev-1.14.0 替换 jev-1.13.0。价格不变:每百万输入 token 0.04494 美元,是 TypeSafe 牌价 0.042 美元的 107%,输出仍然免费。新东西是 Jev 能看图了,另外多了第四种问题 Box,用来回答「某样东西在图里哪个位置」。
TypeSafe 把图片和 Box 标为 "Dreamer-ready":做原型够用,还没达到 TypeSafe 自己的生产标准,版本之间可能会变。下面的数字都是 10 月 16 日经 TopxAI 调用线上 API 测出来的,只代表当天的情况。
老用户要改什么
请求里写 jev-1.14.0。jev-latest 和 jev-preview 照常能用,作答的都是 jev-1.14.0,所以不管发哪个名字,响应里的 model 都是 jev-1.14.0。这一点和 TypeSafe 官方 API 不一样,当天官方的 jev-latest 还指向 1.13。TopxAI 向上游发送的是目录里的版本号,这样请求不会落到我们没在卖的版本上。jev-1.13.0 已经下线,请求它会收到 403。阈值是在 1.13 上调出来的,最好把测试集重新跑一遍:我们同一道 noul 题,1.13 答 0.95,1.14 答 0.96,接近,但不完全一样。
怎么发图
每张图在顶层 assets 里登记一次,键是一个引用字符串,然后在需要这张图的地方写上这个字符串,可以是 state,也可以是某个问题的 instructions 或 criteria。在 TopxAI 上不用自己加 TypeSafe 要求的 TypeSafe-Danger-Zone-Images 请求头,请求里只要有图片或 Box 问题,中转服务会自动加上。
{
"model": "jev-1.14.0",
"state": { "photo": "8d2f4c1e-shapes" },
"assets": {
"8d2f4c1e-shapes": { "type": "image", "format": "png", "data_base64": "iVBORw0KGgo..." }
},
"questions": {
"red": { "type": "noul", "instructions": "Is there a red rectangle in `photo`?" },
"where": { "type": "box", "instructions": "the red rectangle in `photo`" }
}
}
测试图是 800 × 600 像素,红色矩形横向从 480 到 680、纵向从 150 到 400,蓝色圆形横向从 80 到 260、纵向从 300 到 480。换成比例,矩形横向占 0.60 到 0.85,纵向占 0.25 到 0.67。Jev 几次回答都是 left 0.59, right 0.85, top 0.25, bottom 0.69 左右,confidence 在 0.5 到 0.6 之间。圆形的真实位置是横向 0.10 到 0.33、纵向 0.50 到 0.80,Jev 答 left 0.10, right 0.33, top 0.48, bottom 0.82,confidence 0.88。问「图里有没有红色矩形」的 noul 得 0.94;同一道题,state 里不放图,得 0.03。
Box 永远会返回一个框。拿一张厨房照片问 "the giraffe in photo",照样会返回四条边,所以上面的例子同时问了一道 noul。noul 很低的时候,框就别用了。
官方 SDK 不用改
TypeSafe 的 Python SDK 0.7.5 和 JavaScript SDK 0.7.0 用 multipart/form-data 上传图片(JSON 请求体放在名为 request 的段里,每张图单独一段),并用 zstd 压缩较大的请求体,Python SDK 把我们 6 KB 的测试请求压到了 97 字节。两个 SDK 把 TYPESAFE_BASE_URL 设成 https://ai.topxea.com 都能直接用:我们用两个 SDK 各发了一张图,带 noul、choice 和 Box 三道题,也发了那个压缩过的文字请求。JavaScript SDK 需要 Node.js 22 或更高版本。
from pathlib import Path
from typesafe_sdk import Box, Image, Noul, TypeSafeClient
with TypeSafeClient() as client: # 读取 TYPESAFE_BASE_URL 和 TYPESAFE_API_KEY
result = client.system_one(
state={"photo": Image(Path("shelf.jpg"))},
questions={
"has_mug": Noul(instructions="Is there a coffee mug in `photo`?"),
"mug": Box(instructions="the coffee mug in `photo`"),
},
)
print(result.model, result.answers, result.usage)
一张图要多少钱
图片不单独定价,按输入 token 计,算在 usage.input_tokens 里。TypeSafe 还没公布怎么数图片 token,我们用同一道题配不同尺寸的图各发一次,减去纯文字请求的基线:
| 图片尺寸(像素) | 实测 token | ⌈宽/28⌉ × ⌈高/28⌉ × 2 | 按每百万 0.04494 美元计 |
|---|---|---|---|
| 512 × 512 | 723 | 722 | $0.000032 |
| 1000 × 300 | 791 | 792 | $0.000036 |
| 300 × 1200 | 944 | 946 | $0.000043 |
| 1024 × 768 | 2,074 | 2,072 | $0.000093 |
| 1568 × 600 | 2,464 | 2,464 | $0.000111 |
| 1568 × 1568 | 6,272 | 6,272 | $0.000282 |
公式和实测最多差两个 token,差的那点来自引用字符串:图片替换掉了这个字符串本身的 token。引用每出现一次,图片就多算一份,同一张图写进三道题的 instructions,就付三份钱。几道题共用的图,放进 state 一次,再按路径引用。图片的 token 也占上下文:单次请求 64k,state 加任意一道题不超过 32k,所以一个 state 里最多放五张左右的满尺寸图。
尺寸下限是 280 像素,不是 256
TypeSafe 文档写每条边 256 到 1568 像素。实际上,任何一条边不到 280 像素都会被拒,报 "Invalid image dimensions":279 × 400 和 400 × 279 失败,280 × 400、1568 × 280、280 × 280 都通过。上限这头和文档一致,1600 × 1200 失败。API 不会替你缩放,一张图不合格,整个请求返回 400。TopxAI 会把 TypeSafe 的原始说明转给你,不收费。发送前把最长边缩到 1568 以内,最短边保持 280 以上,并把像素本身转正,因为 API 会丢掉 EXIF 里的方向信息。
适合拿来做什么
需要代码拿到一个裁切区域或位置、而原本要靠人去画框的场景,Box 用得上:扫描件上的签名栏,商品图里的商品,门口摄像头画面里的人。便宜的做法是先用 noul 确认目标在不在,再用 Box 找位置,需要看细节时把裁出来的小图带着第二个问题再发一次。要求每次都对的流程,低 confidence 的结果仍然交给人或者更强的视觉模型处理。TypeSafe 还没给出 Box 的推荐阈值,我们这次的数字来自合成图形,不是你的图片。
请求格式、multipart 规则和错误码,都整理在 Jev 文档 里。
模型:jev-1.14.0 · 模型与价格
相关
- Jev(TypeSafe System One)
- TypeSafe Jev:只给判断、不写文字的 System One 模型
- Jev 1.14.0 API pricing
- 请求怎么计费
- 在 TopxAI 升级到 Claude Sonnet 5.5
- 在 TopxAI 升级到 GPT-6.1 Sol
其他语言:English