← 返回学习中心 · Skills 与决策OiOi Academy
JEV 决策模型 · 01

Jev 在代理循环中:决策层自动化完全指南

主课 · 把机制讲透:Jev 是什么、三种原语、决策层定位、价格、校准与失败模式。来自 @N01ennn 的超长实战指南。

原作者 @N01ennn 来源 X 发布 2026-09-26
🧭

开篇:你的 agent 在为"没人要看的答案"付钱

你的 agent 在跑一个循环:模型决定下一步做什么、工具执行、评估结果、循环继续,直到任务完成。

数一数,一次循环迭代里有多少模型调用产生的文本没人会看:下一个该哪个 worker 上?这条消息急不急?证据够不够下笔?要不要叫人来拍板?

这些答案都不是文本——它们是从列表里挑一个、是刻度上的一个数、是一个 yes 或 no。你却在租历史上最贵的推理引擎,回来一个"billing(账单)"这样的词。

这门课讲的就是 @N01ennn 的观点:这不是迁移,是减法——把本不属于大模型的决策工作,从它身上减下来,交给为决策而生的 Jev。

记住:一句话结论:生成归 LLM、决策归 Jev、精确规则归代码;Jev 不进入对话、不生成 token,只做判断。
🧠

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 的活。
记住:作者原话:"Jev 不能生成,所以不能是 agent,只能是 agent 里做选择的那部分。"
🧰

三种原语:Choice、Score、Noul

Jev 的全部 API 就是三种原语,对应循环里的三类决策:

原语 用在哪 返回什么
Choice 分发、路由、动作选择(最多 255 个选项) 胜出的 key、每个选项的概率分布、confidence
Score 相关度、紧急度、风险、进展(2–10 级 rubric) 数值 score、概率分布、confidence
Noul 门禁与守卫,一个 yes/no 命题 [0, 1] 区间的一个概率(无独立 confidence 字段,这个数字本身就是信念)
原文配图:三种原语与 agent 循环的对应关系(来自 j01)
原文配图:三种原语与 agent 循环的对应关系(来自 j01)

超大候选集的实战套路(官方也在用):代码先过滤掉明显不匹配的,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 重排。

记住:状态设计三戒:证据>结论、指令写进 criteria 而非字段名、并行问题之间无依赖。
高中生类比
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 是主导项,定价页上看不见"。

原文配图:路由经济学与缓存税示意(来自 j01 篇)
原文配图:路由经济学与缓存税示意(来自 j01 篇)

但作者强调:真正该衡量的指标是 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。

记住:从哪开始:Playground 先试真实 state → chief.py 独立路由脚本 → 再交给 coding agent 接 worker。
词

术语翻卡:点卡片看解释

System One
System One
Jev 的产品定位:快思考系统,只做判断不做生成。
state(状态)
state
你喂给 Jev 的证据材料;设计原则是给证据不给结论。
Choice
Choice
三种原语之一:从最多 255 个选项里选,返回胜出 key、概率分布与 confidence。
Score
Score
三种原语之一:在 2–10 级 rubric 上打分,返回数值、概率分布与 confidence。
Noul
Noul
三种原语之一:对一个 yes/no 命题返回 [0,1] 概率,没有独立 confidence 字段。
confidence(校准)
confidence
校准过的确定性信号:聚合层面越高越准,不认证单次答案;阈值由你的代码定。
KV 缓存税
KV cache tax
大模型做路由决策要重载上下文、重建 KV cache 的隐性成本;Jev 不进对话故免税。
cost per completed task
cost per completed task
每个完成任务的成本:作者认为真正该衡量的指标,而非单次决策成本。
测

自测一下:点问题展开参考答案

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)。