最近,Jev 在开发者社区里被反复讨论。看它的演示,第一反应很容易是:它一会儿玩游戏,一会儿在虚拟城市里开车,一会儿又去操作网页,像是一个什么都能接手的智能体。
Jev 有意思的地方,是它把任务收得很窄。程序先整理当前环境,再列出几个合法选项,Jev 只回答一个问题:下一步选哪个?
这种分工很窄,反而方便接入不同系统。社区已经有人把 Jev 放进游戏、浏览器、模拟器、机器人和客服工作流。
先看懂 Jev 是怎么运行的
Jev 的一次调用通常包含两部分:一份 state,以及针对这份状态提出的问题。
例如,浏览器 Agent 可以把当前页面整理成这样的状态:页面上有“搜索”“下一页”“购买”三个按钮,还有一个搜索框。然后提出问题:“下一步应该操作哪个元素?”候选答案可能是 click_search、type_query、next_page 和 done。
Jev 读完这些状态后返回选择、概率和置信度,动作仍由外围代码执行。TypeSafe AI 把这类模型称为 System One Model,返回的是程序能直接读取的 Choice、Score 和 Noul。
Choice 用来从候选集合中选一个,例如下一步调用哪个工具或往哪个方向移动。Score 用来按照有序标准评估风险、紧急程度或质量。Noul 则回答一个命题成立的概率,例如这次操作是否需要人工确认。
一、从网页到无人机
1. Browser Use:把网页变成一张“动作菜单”
Browser Use 的 jev-ultrafast 把这种接入方式讲得很清楚。它先读取网页上的可见控件,把按钮、输入框、链接和滚动区域整理成编号列表,再让 Jev 返回操作类型和目标元素。浏览器执行后,程序还会检查页面是否真的发生了预期变化。
需要填写自然语言时,项目调用小型语言模型生成文字。点击、选择、滚动和结束等动作,都由 Jev 的结构化选择驱动。项目 README 记录了一次 Google Flights 搜索演示,报告用时约 7.1 秒;README 也列出了 iframe、canvas、上传控件等限制。
![]()
2. JevPilot:让程序先生成路线,Jev 再挑一条
JevPilot 是一个 Three.js 驾驶模拟器。程序先采样几条候选路径,计算道路边界、附近车辆、信号灯、目的地和碰撞预测,再把这些信息整理给 Jev;Jev 不需要从零计算方向盘角度。
Jev 从候选路径中选择一条,并给出速度和转向倾向。路径采样、碰撞检查和安全刹车仍由代码完成。模型比较“哪条路线更合适”,确定性代码确认“这条路线能不能执行”。
![]()
3. 无人机模拟器:一次调用回答六个控制问题
Jev Autopilot 让无人机在随机生成的城市中从 A 点飞到 B 点。模拟器负责计算高度、速度、航向、障碍物和目标距离,Jev 则在一次请求中回答油门、偏航、俯仰、横滚、是否降落、是否切断电机等问题。
这些问题彼此独立,却都针对同一份飞行状态。代码拿到每个答案的概率后,把它们转换成摇杆偏移,同时保留硬性的安全限制。这说明,Jev 也可以同时处理几项窄而明确的判断。
![]()
4. RoboJEV:模型决定技能,物理引擎负责碰撞
在 MuJoCo 的 RoboJEV 中,场景会被转换成机械臂姿态、物体位置、夹爪宽度和接触关系等结构化状态。Jev 先判断当前应该执行接近、抓取、抬升还是释放,再判断移动方向;Cartesian controller 和 MuJoCo 负责把决策变成连续运动。
项目明确写道,它没有使用图像输入。模拟器先提供可审计的事实,Jev 再从中选择接近、抓取、抬升或释放等技能;机械臂的连续运动仍由控制器和 MuJoCo 完成。
![]()
二、游戏:最直观的决策
5. Super Mario Bros.:Jev 看到的是 RAM 状态
typesafe-mario 把模拟器遥测和 RAM 解析成结构化数据,包括角色速度、跳跃阶段、附近敌人、地形、剩余生命和关卡进度。Jev 从 noop、向右、跑、跳跃等合法动作中选择一个,模拟器推进几帧后,再把新状态送回来。
相比每帧截图交给视觉模型,这种方式更容易观察决策循环:输入内容明确,动作也能由程序验证。项目本身不包含游戏 ROM,运行者需要自行准备本地环境。
![]()
6. Doom:测试高频决策
TypeSafe 官方发布时展示了 Doom 实时控制。游戏引擎负责产生当前位置、敌人、弹药和可行动作,Jev 在移动、瞄准和开火等选项中快速做决定。
![]()
7. Subway Surfers:同一个判断器,同时跑几十局
社区作者展示过让 Jev 同时控制多局 Subway Surfers。程序需要提供角色所在车道、前方障碍、当前速度和可用动作,Jev 在换道、跳跃和下滑之间选择。
![]()
8. Smash Bros:四个角色各自拥有一个决策循环
在另一个实验里,Jev 同时控制 Smash Bros. 的四个角色,让它们互相对战。每个角色都可以读取自己的位置、生命值、对手状态和当前可用动作,然后独立请求下一步选择。
这里已经有了一个简单的多智能体系统:四个角色各自运行受限的动作选择器,分别读取状态、请求下一步动作。作者报告使用了超过 2200 万 token,成本只有几美分。
![]()
9. Tetris:先把所有合法落点列出来
俄罗斯方块很适合展示“代码和模型如何分工”。代码先计算当前方块的旋转方式、落点和碰撞结果,Jev 不需要自己推演每一格物理过程,只需要在这些合法落点中选择一个。
![]()
10. 2048、贪吃蛇和小恐龙:适合自己动手的入门项目
这些小游戏的状态简单,动作有限,失败也容易复现。2048 可以先由程序模拟四个方向的结果,再让 Jev 选择;贪吃蛇可以把食物、蛇身和危险格转成 JSON;小恐龙则可以把障碍物距离和跳跃窗口变成几个问题。
做这类 Demo 时,不要把“按键”交给模型。让代码维护游戏规则,让 Jev 只返回 up、down、left、right 之一,再由程序执行并记录概率分布。

11. Chess、Shogi 和 Gomoku:只在合法着法里选
棋类项目通常不会让 Jev 直接写棋谱。棋规引擎先生成所有合法着法,Jev 再根据棋盘状态从其中选一个;执行后,棋盘引擎负责验证着法并推进局面。
这样便于做可视化实验:把每个候选着法的概率画出来,或者比较 Jev、传统引擎和其他模型在相同候选集合中的选择。
![]()
12. Slay the Spire 2:把回合策略拆成选择题
卡牌 Roguelike 的每一步都包含手牌、能量、敌人意图、生命值和路线选择。社区实验让 Jev 根据这一整套回合状态选择出牌、结束回合或路线方向。
![]()
三、Jev 也能参与生成,只是方式不同
13. 实时关卡生成:每次只决定下一小段地形
Sprite Fusion 做过一个跑酷游戏实验。程序把玩家位置、速度、当前地形和冲刺状态整理出来,Jev 只负责选择下一段平台、缺口或障碍的组合,游戏引擎随后把选择放进场景。
![]()
14. Jevinci:把概率分布变成像素
Jevinci 的做法很直接:程序把画布拆成像素或颜色位置,询问 Jev 每个位置更可能属于哪种颜色,再把这些概率组合成绘画结果。模型没有输出 PNG,也没有写绘画提示词,只提供大量局部选择。
![]()
15. Wikiracing:从眼前的链接里继续走
Wikiracing 从一个 Wiki 页面开始,只能点击当前页面里已经出现的链接,目标是抵达另一篇指定文章。程序负责抓取页面和生成候选链接,Jev 负责从候选集合中选择下一站。
这个项目把 Choice 的用途表现得很直观:候选数量可能很多,但每个选项都是真实存在、可以被程序执行的链接。
![]()
四、在 Agent 后台处理几个小判断
16. Jev Codex Router:先判断任务,再选择模型
一个 Coding Agent 不需要每个请求都使用最强、最贵的模型。Jev Router 会读取用户任务,判断它是简单修改、普通开发还是复杂调试,再把请求路由到不同模型或不同 Agent 配置。
Jev 只负责路由,主 Agent 仍然接收原始任务、读取文件、运行工具并验收结果。
![]()
17. 工具调用前的安全闸门:允许、确认,还是拦截
Agent 准备执行 Shell、删除文件、发送邮件或修改线上数据时,可以把工具名称、参数、权限范围和当前任务一起交给 Jev,询问这次操作是否安全、是否需要人工确认。
真正执行前,操作还要经过宿主程序的硬规则和权限系统。Jev 只负责判断文本语义,不能替代沙箱、权限、审批和审计。LangChain 的 AutoModeMiddleware 展示了如何把 Jev 放在工具执行之前。
![]()
18. pi-jev:把上下文压缩变成保留判断
长时间运行的 Agent 会积累大量工具调用、网页结果和旧日志。pi-jev 逐条判断某个工具结果是否保留、是否只保留开头,或者是否已经过时,不需要另一个聊天模型重写整段上下文。
判断不确定时,系统可以保守保留,或者回退到原来的压缩策略。每次保留和丢弃都有记录,也方便复查和恢复。
![]()
19. 工单和收件箱分流:一次请求回答多个问题
一封邮件或一张工单,通常不止需要一个标签。系统可能同时关心它属于哪个部门、是否紧急、客户是否要求退款、是否应该升级人工。
![]()
20. Jev-as-a-Judge:评价 Agent 是否完成任务
Agent 评测通常有两种极端:纯规则很稳定,但只能检查事先写死的条件;完整 LLM Judge 很灵活,但成本、延迟和输出格式都更难控制。
LangChain 的 Jev-as-a-Judge 实验把 Agent 轨迹、消息和结果作为 state,再用 Choice、Score 或 Noul 询问“是否完成”“是否泄露隐私”“质量处于哪个等级”。返回值可以直接进入回归测试和 LangSmith 评测流程。
![]()
看完这些项目,Jev 到底应该怎样接入?
先选一个接入入口
如果只是体验,可以打开官方 Playground,用一段文字作为 state,再添加一个 Choice、Score 或 Noul 问题。想做 Python 小工具,可以使用官方 SDK;已有后端、Agent 或模型聚合层,则可以直接调用 HTTP API,或者从 OpenRouter、Vercel AI Gateway 接入。
![]()
把任务翻译成 state 和问题
Jev 不需要知道完整业务,只需要这一次判断所需的状态。接着选择使用 Choice、Score 还是 Noul,并写清楚候选选项的含义。以贪吃蛇为例,程序读取蛇头、蛇身、食物和危险格,再把四个合法方向交给 Jev 选择。
![]()
让程序执行 Jev 的结果
Jev 返回选择、概率和置信度,点击、按键和业务动作仍由程序执行。程序先判断结果是否达到阈值,再决定转队列、点击按钮、推进游戏、调用工具或转人工。答案不确定时,就使用规则策略或人工审核。SDK、HTTP API 和模型聚合平台只是不同入口,执行权仍在你的程序里。
![]()
用一个工单分流例子理解完整接入
一条“订单三天没到,明天要出差,请尽快处理”的消息,可以先整理成一份状态。Jev 判断它属于哪个部门、是否紧急、是否涉及退款,业务代码再根据置信度把它送入物流队列、标记优先级,或者转给人工。和游戏 Agent 一样,变化的只是候选动作:这里是“物流、退款、其他、人工审核”,游戏里则是移动方向。
![]()
如果项目已经使用 OpenRouter,可以调用 ~typesafe/jev-latest;如果是 Vercel AI SDK,可以使用 typesafe-ai/jev 的 evaluate 接口。两者的鉴权、计费和参数形式略有差异,接入时以当前平台文档为准。
如果项目使用 LangChain,也可以使用Classifier,或者把 Jev 放进模型路由和工具安全中间件。
接入 Jev 的工作,就是在系统里增加一次可记录、可验证、可以回退的结构化判断。
写在最后
Jev 适合处理 Agent 工作流里的小判断。这些任务用通用大模型显得太重,完全靠规则又不容易写全。
在网页里,它选择下一个控件;在游戏里,它选择下一个动作;在机器人里,它选择当前技能;在 Agent 里,它可以选择模型、工具或是否继续。
接入前,把当前状态、候选动作和低置信度时的处理规则写清楚。这样,Jev 才能稳定地成为程序中的一个判断环节。
参考资料
-
TypeSafe AI:Introducing System One Models & Jev
-
TypeSafe AI 官方文档:Quick Start
-
Browser Use:jev-ultrafast
-
Made with Jev:Games and real time
-
Awesome Jev
-
Awesome TypeSafe Jev
-
LangChain:Building a Harness with Jev
-
LangChain:Jev is now available in LangSmith Evals
