🎯一句话判断:CLI 回路上的判定原语,不是回路的大脑

核心判断:docs.typesafe.ai 的 Jev with coding agents 页把边界说得很直白——Jev 不是 Claude Code、opencode、Codex 这类 CLI 背后 LLM 的替代品,也不存在把 agent 主模型换成 jev-latest 的开关。Jev 的正确位置在回路的分叉点:路由去哪、要不要加载某个 skill、这个参数取枚举里的哪个值、这条命令能不能放行、这一步结果算不算数。这些位置原来靠 LLM「返回 JSON」加正则解析撑着,换成 Jev 后变成类型化答案——按构造就带类型、带概率分布、带置信度,代码据此分支执行。判定与执行由此解耦:Jev 只回答「是什么」,代码决定「怎么办」。
1 次 POST一个 state + 任意多问题并行评估,答案同 id 返回
~64k tok单次 state 容量上限(jev-1.13)
16.8%→7.3%182-skill 名册下 agent 加载错误技能的比例(Hermes 实测)
54 问/命令function-calling 调度器把一句自然语言展开成的问题数

📡交互契约:一次 POST = 一个 state + 一组并行问题

整个交互方案只有一个端点:POST https://api.typesafe.ai/v1/systemone,携带 Authorization: Bearer $TYPESAFE_API_KEY。请求体三个字段:state(字符串、JSON 对象或文本数组,约 64k token)、model(如 jev-latest)、questions——一个 id → 类型化问题的映射。响应把答案按相同 id 放回 answers,外加 usage.input_tokens / output_tokens。

{
  "state": "客户三天的 Stripe 集成一直失败,正在丢单,请尽快处理",
  "model": "jev-latest",
  "questions": {
    "department": {"type": "choice", "instructions": "哪个团队处理",
                   "criteria": {"billing": "支付订阅问题", "technical": "bug 与集成问题",
                                "sales": "价格与账户问题"}},
    "frustration": {"type": "score", "instructions": "客户的挫败程度",
                    "criteria": ["平静陈述", "不满但克制", "强烈愤怒"]},
    "is_urgent":   {"type": "noul", "instructions": "消息是否传达紧迫性"}
  }
}
→ answers: department={choice:"technical", confidence:0.78, probabilities:{…}},
           frustration={score:1.0, confidence:1.0, probabilities:{…}},
           is_urgent={noul:1.0}   + usage{input:392, output:65}

两个交互设计决定了它在 CLI 回路里的形态:

🧱判定原语速查:三种类型化答案与置信度

问题类型问什么返回字段典型 CLI 挂载点
choice在封闭选项集里选一个(≤255 项,每项配描述)choice + 每项 probabilities + confidence意图路由、技能选择、枚举参数填充
score在有序 rubric(2–10 级)上打分score(按概率加权)+ legend + probabilities + confidence风险分级、结果质量评估、证据强度
noul「这个判断是否为真」noul:校准过的 0–1 概率,无 confidence 字段护栏放行、前置条件检查、相关性过滤

置信度不是「另一个概率」:choice/score 的 confidence 由概率分布的形状坍缩而来——质量全压在一个选项上趋近 1.0,摊平则趋低。这是第二根决策轴:答案告诉你「是什么」,置信度告诉你「敢不敢执行」。官方推荐三档:高置信自动执行、中置信确认或补证据、低置信路由给人或回退默认路径——阈值随出错代价升降。Noul 没有这个字段,0.5 附近就是真正的不确定,代码要自己设阈值。

🔀分层架构:判定归 Jev,决策执行归代码,生成归 LLM

把 Jev 装进 llmcli 的本质是一次职责重排。原回路里 LLM 身兼三职:读懂语义、做判断、生成动作;这导致判断不可归因、解析易碎、置信度无从谈起。嵌入 Jev 后三层各司其职:

⚖️ 判定层 · Jev

对每个分叉点回答类型化问题:走哪条分支(choice)、这一步有多险(score)、前置条件成不成立(noul)。输出带概率分布与置信度,判定本身可被逐条记录、回放、归因。不做任何执行。

🎛️ 决策执行层 · 代码

拥有全部控制流:置信度阈值、分支与回退、参数组装、命令放行、循环终止。把多因子判断拆成原子问题再按权重合成——Jev 从不被允许替代码权衡。错了知道是阈值错了,不是模型黑箱。

✍️ 生成层 · LLM

只做真正需要生成的事:写代码、写报告、组织回复语言、调用开放参数的工具。判定从 prompt 里搬走后,主模型的系统提示词变薄、context rot 减轻,「请返回 JSON」式脆性指令整体消失。

这个三层分工也是官方四个架构模式的自然组合:speculative fan-out(一次扇出多问)、confidence-gated routing(置信度作第二轴)、composite scoring(原子分按代码权重合成)、intent routing(分类后分派给确定性逻辑 / 专家 LLM / 人)。四种模式在 CLI 上各对应一个挂载点,见下节。

🪝llmcli 回路上的六个挂载点

Jev 在单轮 agent 回路上的判定位置

① 意图路由choice:本请求走哪个 handler——确定性逻辑、工具链、子代理还是直接对话;低置信走默认或澄清
→
② 技能选择choice + noul 门:名册扇出排序取 top-k,再问「这一轮真需要 skill 吗」——不需要就不加载
→
③ 参数绑定choice 填封闭枚举参数(Literal),noul 判参数是否被提及——未提及走函数默认值
→
④ 生成/执行LLM 写代码或组织语言;确定性代码跑工具命令。此层不属 Jev
⑤ 输入/输出护栏(noul + score 筛查每条进出消息)→ ⑥ 动作后验证(choice/noul:结果是否达成、是否需升级级联)→ 回路收敛或下一轮

三个挂载点值得展开,因为官方 cookbook 给出了可直接复用的结构:

技能选择(progressive disclosure 版)。问题域很现实:CLI 把 skill 名册截成一行一条塞进系统提示词(Hermes 默认截到 60 字符),「编辑 pptx」和「撰写 pptx」看起来一样,agent 常加载错技能或在无匹配时硬猜。方案是两次请求:第一次用 choice 对全部 182 条索引扇出排序、并挂几个 noul 问「这一轮是否需要 skill」;第二次只把 top-3 技能换完整描述再选一次,仍可全部否决。胜出者只占系统提示词里一行建议位,名册本身不动、前缀缓存不破。

函数参数绑定。CLI 的工具大多是普通函数,签名里的 Literal 参数天然是封闭集:每个枚举参数一个 choice,每个布尔一个 noul,set 型参数对每成员一个 noul,开放参数(int、自由文本)根本不问、留默认值。官方 10 个交易函数展开成每条命令 54 个问题、一次请求完成;stated 型 noul(「用户提到了这个维度吗」)让未提及参数落回函数默认值。由此得到的是对签名天然合法的工具调用——没有 JSON schema 解析失败这回事。

级联升级(SDE cascade 模式)。小模型先做,Jev 判定结果是否可信,可信即返、不可信升级大推理模型——拿大部分质量只付小部分成本。这正是「判定与执行解耦」的经济学含义:判定层便宜且校准,才谈得上按置信度分配昂贵的生成预算。

📊实测证据:官方 cookbook 的四组数字

场景判定层设计实测结果对 llmcli 的意义
技能选择(Hermes 182-skill,488 请求,claude-haiku-4-5 + jev-1.12)2 次请求/轮:索引扇出 + top-3 精读复核,noul 门 0.30 阈值加载错技能 16.8%→7.3%;无匹配仍加载 9.8%→4.0%(天花板 2.5%/1.2%)技能/工具加载是大多数 CLI 的隐性成本与错误源,判定层直接砍掉一半错误
函数调用(10 个交易函数)封闭枚举参数 → choice,bool → flag noul,每参数加 stated? 检查54 问/命令单次请求;置信度取调用内所有判定的最小值,14 条命令全部分派成功自然语言 → 天然合法的工具调用,无解析失败模式
并行问题(13 问监管简报)全部问题打进一次请求12.2× 便宜、10.0× 快,答案不变扇出多问 = 免费旁路审计,每个分叉点可附带日志特征
检索重排(40 条 CLERC 法律查询 × 30 候选段)每 query-候选对一个 noul 相关性判定top-1 5%→18%,top-10 38%→62%CLI 的 RAG/文件检索环节可原地换成判定层排序

另两个值得记下的 cookbook:实体对齐(450 个候选对,一个 score 加三个伴生 noul 标出分歧字段);层级分类(用 choice 概率做 beam search 走深专利/生物医学层级,正是并行判定的一个变体)。

💻决策执行层的代码骨架

判定层在回路里的调用点收敛成一个薄封装——构造 state、扇出问题、按置信度分派。示意骨架:

class DecisionGate:
    def __init__(self, ts: TypeSafeClient):
        self.ts = ts

    def route(self, state, questions, act_threshold=0.5,
              review_threshold=0.25, default="web_search"):
        """判定 → 置信度分级 → 执行映射,全部在代码里。"""
        ans = self.ts.system_one(state=state, questions=questions).answers

        route = ans["route"]                      # Choice 答案
        if route.confidence >= act_threshold:
            return route.choice                   # 高置信:直接执行
        if route.confidence >= review_threshold:
            return self.confirm_or_gather(state, route)  # 中置信:确认/补证据
        return default                            # 低置信:回退默认路径

# 单轮回路 = 判定点串联,生成只在真正需要处发生
def agent_turn(req):
    gate.route(state=req, questions={
        "route":   Choice("该请求适合哪条处理路径", criteria=ROUTES),
        "skill?":  Noul("本轮是否需要加载某个技能"),
        "harmful": Noul("该请求是否要求破坏性操作"),
    })
    # harmful.noul > 0.3 → 走人工确认;skill? → 触发二次精读;route → 分派

三条工程纪律从官方文档直接推出:原子问题——一问一次直觉判断,多因子拆成多问题由代码加权;criteria 承担语义——每个选项/层级/真假判定都写描述,裸标签表现显著更差;置信度门槛随代价分层——不可逆动作(删库、发邮件、跑湿实验队列)用最高档阈值。

🔬AI4Science 应用:科学智能体的判定层

上篇已经论证过 Jev 在 AI4Science 的定位是「判断层而非生成层」。结合本篇的 CLI 嵌入视角,判定层对科学智能体的价值集中在回路的可控性上——科学管线的每步都有「该不该继续」的门:

回路挂载点AI4Science 实例类型化问题设计
意图路由蛋白设计 CLI 收到请求,分派到结构预测 / 序列生成 / 文献综述 / 实验排期子流程choice 对子流程封闭集 + noul「是否需要湿实验介入」
参数绑定docking 工具的枚举参数(采样算法、质子化方案、力场)由自然语言填充每参数 choice;stated? noul 决定是否覆盖默认值
输入护栏进入蛋白设计队列前的元数据检查:序列是否超出表达宿主约束、SMILES 是否含禁用骨架(语义层描述)noul 逐条前置条件;score 分级风险
动作后验证文献综述 agent 的引用核对:引文上下文是否支撑论断(官方 citation-check cookbook 的直接迁移)choice:引文支撑/不支撑/仅背景提及
级联升级批量文献初筛用小模型 + Jev 判定,低置信样本才进大模型精读——三级漏斗的计算层预筛noul「该段落是否含实测分母」+ score 报告完整性
路由/QC候选分子按元数据分桶:assay-ready / 需重新预测 / 需人工审阅choice 三分桶 + confidence 门控
边界声明(同 skill 文档的硬性约束):Jev 判定的是对世界的描述,不是世界本身。「这段序列会折叠吗」「这个分子会结合吗」这类问题要求物理量测量或预测器,交给 Jev 是范畴错误——会把语言模型的判读膨胀成证据。序列→结构/活性的结论必须来自结构预测器、生成模型或湿实验;Jev 的位置是这些预测器外围的决策与证据层:完整性审计、声明-证据匹配、候选路由、报告一致性核对。AI4Science 管线里「计算成功」与「实验/转化验证」的界线,同样适用于判定层的每一条 gate。

⚠️jev-1.13 锯齿边界与 CLI 侧对策

失效模式(官方 jev-1.13 jaggedness)表现llmcli 侧对策
字面理解按写下的指令作答而非意图;否定与隐含条件按字面值instruction 写精确条件;解释不清就拆两个直述问题在代码里组合
数学与计数不可靠数数;score 层级间不可内插数值计数/算术全部留在代码:逐条 noul 扇出再求和
日期比较把日期当文本读,不当时序量月份/日/年拆成封闭集 choice 抽取,比较留给代码
间接推理双重否定、多级「的属性的属性」准确率低减跳数,点名 state 字段
大噪声 state无关细节稀释判定代码先检索过滤,只发问题需要的字段
对抗内容state 被视为数据而非敌意输入criteria 写死边界;上线前测注入案例
无结构不变量正/反问两个 noul 不保证互补(0.72+0.47=1.19)每个决策只问一种方向;不把 noul 阈值搬去 choice
不能生成链式 choice 拼文本慢且差生成一律回 LLM 层

共同主题一句话:判定给 Jev、算术与生成给代码和 LLM、阈值随代价分层——这既是官方建议,也是把这层嵌进 CLI 后仍可控的原因。

🔗与 RRSI 的连接:判定层是可演化 harness 的组件

把本文与上一篇 RRSI 报告放在一起看,关系很直接:RRSI 的组件词表里 client_tool 与 control_flow 两类正好对应 Jev 判定的两个挂载方式——作为可调用的判定 API 工具,和作为控制流分叉的守门逻辑。类型化判定对演化 harness 还有个隐性好处:可归因性。harness 分叉依赖「LLM 返回 JSON」时,一次错误路由无法归因是模型判错还是解析出错;换成带概率分布的类型化判定后,每个分叉点都有可回放、可统计的数字证据——演化器的分析师模块可以直接消费这些日志特征。判定的确定性本身就是 harness 可演化性的前提之一。

📚来源与核验说明