Jev 在代理循环中:决策层自动化完全指南
主课 · 把机制讲透:Jev 是什么、三种原语、决策层定位、价格、校准与失败模式。来自 @N01ennn 的超长实战指南。
开篇:你的 agent 在为"没人要看的答案"付钱
你的 agent 在跑一个循环:模型决定下一步做什么、工具执行、评估结果、循环继续,直到任务完成。
数一数,一次循环迭代里有多少模型调用产生的文本没人会看:下一个该哪个 worker 上?这条消息急不急?证据够不够下笔?要不要叫人来拍板?
这些答案都不是文本——它们是从列表里挑一个、是刻度上的一个数、是一个 yes 或 no。你却在租历史上最贵的推理引擎,回来一个"billing(账单)"这样的词。
这门课讲的就是 @N01ennn 的观点:这不是迁移,是减法——把本不属于大模型的决策工作,从它身上减下来,交给为决策而生的 Jev。
Jev 是什么:System One,只做决策
Jev 是 TypeSafe AI 公司出的一个 System One 模型,专为"这类调用"而造。你给它 state(状态/证据) 和 类型化问题(typed questions),它返回带校准概率的类型化答案。
关键事实,一次记住:
- 不生成文本:没有字符串、没有解析、没有类型错误——答案形状由类型保证。
- 70–500ms 端到端,$0.042 / 百万输入 token,输出免费。
- 当前模型版本 jev-1.13.0(jev-latest 即指向它);单端点 POST https://api.typesafe.ai/v1/systemone;Python SDK 是 typesafe-sdk,JS/TS SDK 是 @typesafe-ai/sdk,都读 TYPESAFE_API_KEY 环境变量;也可走 Vercel AI Gateway 或 OpenRouter。
- 上下文 64k 总量,其中 state 加最长单个问题占 32k;纯文本输入。
把 Jev 想成球场边的裁判:他不下场踢球、不进球,只负责在每一次犯规/越位发生时吹哨判罚。生成文本是大模型在场上踢,吹哨判罚是 Jev 的活。
三种原语:Choice、Score、Noul
Jev 的全部 API 就是三种原语,对应循环里的三类决策:
| 原语 | 用在哪 | 返回什么 |
|---|---|---|
| Choice | 分发、路由、动作选择(最多 255 个选项) | 胜出的 key、每个选项的概率分布、confidence |
| Score | 相关度、紧急度、风险、进展(2–10 级 rubric) | 数值 score、概率分布、confidence |
| Noul | 门禁与守卫,一个 yes/no 命题 | [0, 1] 区间的一个概率(无独立 confidence 字段,这个数字本身就是信念) |
超大候选集的实战套路(官方也在用):代码先过滤掉明显不匹配的,Score 给幸存者打分,再 Choice 从短名单里选。Choice 支持最多 255 个选项。
三种原语就像三种裁判手势:Choice 是"把球判给 A 队还是 B 队";Score 是"这次犯规恶劣程度 1–10 打几分";Noul 是"这是不是点球——是或否,附带把握度"。
决策层定位:[G] 生成、[D] 决策、[C] 规则
作者给 agent 循环里的每一步打上标签:[G] 生成归 LLM(写文本、做规划),[D] 决策归 Jev(选路、打分、拍板),[C] 精确规则归代码(计数、算术、日期、断言检查)。
注意这不是"把活儿从一个模型搬到另一个模型",而是从本不适合它的模型上做减法。数数、算钱、比较日期——Jev 也做不好,这些就该留在代码里。
作者列了 11 个该搬到 Jev 上的决策点(Part III,全文带代码),核心几个:
- 模型路由:LangChain 中间件 ModelRouterMiddleware,按任务把请求分给便宜的 luna 或强的 sol;
- 工具调用门禁:AutoModeMiddleware(tools=["bash"]) 一行中间件;自己手写 JS 版时,destructive 的 noul > 0.4 就转人工确认;
- 上下文压缩:不做摘要重写,改用 Score 三档 rubric 给 chunk 打相关度分,阈值 >= 1.5 才保留;
- stuck 检测:repeating > 0.7 或 progressing < 0.3 就升级处理;
- next-worker 分发:默认走 review,只有 confidence >= 0.85 才改道;
- 完成检查:Jev 判完之后,代码还要独立 assert 文件存在且 > 500 字节——决定归 Jev,验证归代码;
- 人工升级四问:reversible(可逆吗)/ touches_money(动钱吗)/ external_reach(触达外部吗)/ risk Score(风险打分);
- 另有 live action 菜单选择、检索重排、在线评估(failure_mode 含 none / wrong_tool / stuck / premature / overreach)、全流程分类。
模型路由的完整代码(原文 Part III,LangChain 中间件):
from langchain.agents import create_agent
from langchain_typesafe.experimental.middleware import (
ModelChoice, ModelRouterMiddleware,
)
router = ModelRouterMiddleware(
choices={
"fast": ModelChoice(
model="openai:luna",
criteria="Direct lookups, extraction, localized changes.",
),
"powerful": ModelChoice(
model="openai:sol",
criteria="Architecture and high-stakes decisions.",
),
},
instructions="Choose the least costly model that can complete the task.",
)
agent = create_agent("openai:gpt-5.6-luna", middleware=[router])
工具门禁自己手写的 JS 版(两次提问、一次往返、约 100ms,安全路径上零生成 token):
import { TypeSafe } from "@typesafe-ai/sdk";
const jev = new TypeSafe();
const { answers } = await jev.systemOne({
model: "jev-latest",
state: "Agent is about to run: " + command,
questions: {
destructive: {
type: "noul",
instructions: "Is this destructive or irreversible?",
},
action: {
type: "choice",
instructions: "Gate this command.",
criteria: {
allow: "safe, run it",
confirm: "ask the human first",
block: "never run",
},
},
},
});
if (answers.action.choice === "block") throw new Error("blocked by policy");
if (answers.action.choice === "confirm" || answers.destructive.noul > 0.4) {
await askHuman(command);
}
状态设计:给证据,不给结论
作者说,state 设计决定成败,大部分输赢都在这里:
- 给证据,不给结论:把原始材料放进 state,让 Jev 自己判断,别替它下结论。
- Jev 看不到你的问题字段名:字段名叫什么它根本不在乎,真正的指令必须写在 instructions / criteria 里。
- 同一 state 的多个问题可以并行批量问:一次调用问十个问题,第十个问题只花 token、几乎不花时间;但问题之间不能互相读取对方的答案——有依赖的问题要分开问。
检索也分两层(Part VII):小语料直接拿 Jev 当相似度度量——对每对 query-doc 打分排序;大数据量先用 embeddings 召回 top-k,再让 Jev 重排。
state 就像递给裁判的证据袋:里面装的是录像和照片(证据),不是你写好的判决书(结论);证据袋上的标签怎么写(字段名)裁判不看,他只看你附的那张纸条——"请判断这是否为点球"(instructions)。
价格与经济学:便宜 40–400 倍,但别只看单价
定价:$0.042 / 百万输入 token,输出免费。换算一下:每次决策按 1000 输入 token 计,1 万次决策 = 42 美分。
作者做了个完整推演(11 个决策点 × 每轮 5 次决策 × 每任务 20 轮 × 每天 100 个任务):
5 * 20 * 100 = 10,000 decisions/day
10,000 * 1,000 tok = 10M input tokens/day
10M @ $0.042/MTok = $0.42/day
同样的 1 万次决策放在 frontier 模型上(输入按便宜的 $1/MTok、加一点输出),要贵 2–3 个数量级,而且每次多花的是秒不是毫秒。
KV 缓存税(Part IV,路由过去两年"悄悄失败"的原因):大模型做路由决策时,要重载整个对话上下文、重建 KV cache,这项看不见的成本才是大头。Jev 不进入对话、不生成 token,消除了这项"缓存税",路由这件事现在才成立。
Opus→Sonnet→Opus 路由数学(原文推导):Opus $5/$25、Sonnet $3/$15,当 X=0.65 / Y=0.12 / Z=0.23 时,纯 Opus 路径的成本约为路由路径的 2/3——"重建 KV cache 是主导项,定价页上看不见"。
但作者强调:真正该衡量的指标是 cost per completed task(每个完成任务的成本),而不是单次决策成本——一个便宜但指错路的决策,比决策本身贵得多。
实测数字(各带适用范围声明):Browser Use 找机票 7 秒、$0.0039(90,558 个 Jev 输入 token,不含浏览器基建,只找不订);1,018 篇论文分类 $0.08、256ms 中位数;500 封邮件分类 3.5 美分;Claude 会话 1 秒从约 1M 压到 86K token;Vercel fx 团队安全分类比 GPT-5.6 Luna 快 5–18 倍且准确率更高。
官网 193.6x 更快、444.6x 更便宜来自 TypeSafe 自家 workflow evals:方法论好于多数(所有模型同一 workflow、不许做 harness 工程),但 workflow 是自家能力团队搭的、参考答案取 GPT-6 Astra 与 Fable 5.1 的平均,偏向 OpenAI/Anthropic。作者提醒按"现实增益的高端"理解。
校准与阈值:confidence 不是准确率
"confidence 不是准确率百分比",它是校准过的确定性信号。阈值属于你的代码,Jev 只报告信念与确定性。
- 校准是分布属性:在大量调用上,confidence 越高准确率越高;但它不认证任何单次答案。
- 阈值必须用自己的标注样本实证调优:按动作风险设"一动作一阈值"——只读操作低门槛,动钱/不可逆操作高门槛加人工确认(next-worker 分发的 0.85、destructive 门禁的 0.4 都是这种思路)。
- 批量多问题一次调用:questions 并行,第十个问题只花 token 几乎不花时间。
五步安装流程(Part V):① 先去 console.typesafe.ai/playground 用真实 state 试你的 fork;② pip install typesafe-sdk(需 Python 3.12+),Claude Code 里 claude plugin marketplace add typesafe-ai/skills / claude plugin install typesafe@typesafe-ai,或 npx skills add typesafe-ai/skills --skill typesafe-ai;③ 先写独立的 chief.py 路由脚本(示例把任务按 research/write/review 写入本地 JSON 队列文件);④ 交给 coding agent 去接 worker;⑤ 故障表:401 换 key、422 查字段名、429/529 退避重试。
confidence 像天气预报的"降水概率 80%":它说的是"历史上这种情况 10 次里 8 次下雨",不是"今天这场雨有 80% 会下"。带伞的阈值(要不要带伞)是你自己定的,天气预报只负责报数字。
失败模式:先重写 criteria,再怪模型
作者的失败模式清单(Part X),条条是坑:
- 它按字面执行 criteria:它做的是 criteria 写的话,不是你心里想的话——先重写 criteria,再怪模型。
- 计数、算术、日期数学很弱:放代码里做,这不是 prompt 能调好的。
- 重度间接引用和巨大噪声 state 会拖垮它:答案要绕三跳才能连上证据,就重构 state 或拆分问题。
- prompt injection 仍然有效:类型安全只保证答案的形状,不保证推理的完整性;state 里有不可信内容,它能移动裁决。
- 校准是分布属性,不认证单次答案。
- 纯文本输入:没图像、音频、视频,截图驱动的 agent 要注意。
- 64k 上下文(state + 最长问题 32k):大 trace 先过滤再进 state——而过滤本身也是个 Jev 活。
现实配对案例(作者注):Browser Use 配小 LLM 做打字;论文分类配 DeepSeek V4 Flash 做摘要;欺诈检测配 Kimi K3 处理不确定尾部;LangChain 中间件配 GPT-5.6 Luna 和 Sol。
术语翻卡:点卡片看解释
自测一下:点问题展开参考答案
Choice 返回胜出的 key、每个选项的概率分布和 confidence;Score 返回数值 score、概率分布和 confidence;Noul 只返回 [0,1] 的单个概率,没有独立 confidence 字段。
因为决策本就不该由生成模型来做——把 [D] 决策从大模型上减下来交给 Jev,[G] 生成仍归 LLM、[C] 精确规则归代码,三桶各归其位。
confidence 是校准过的确定性信号:它是分布属性,在大量调用上越高越准,但不认证任何单次答案;阈值必须用自己的标注样本实证调优,且阈值属于你的代码。
给证据不给结论;Jev 看不到问题字段名,指令必须写在 instructions/criteria 里;同一 state 的问题可并行批量问,但问题之间不能互相读取对方答案。
按字面执行 criteria;计数/算术/日期数学弱(放代码里);prompt injection 仍有效;纯文本输入;64k 上下文(state+最长问题 32k)。