决策模型¶
决策模型 对照评分标准评估提供的证据,并返回带类型的回答:一个选择、一个分数,或一个布尔概率。将其用于有界判断,例如路由请求、评估其紧急程度,或检查其是否满足某个条件。
decisionModel 是一个具有共享 API 的模型角色。其提供商可以使用不同的模型架构和推理后端。共享接口并不意味着它们的推理能力或概率可以互换。
该角色和 TypeSafe AI 适配器是在已发布的 OpenClaw 2026.9.5 之后添加的。这些说明适用于包含这些功能的开发检出,以及包含这些功能的后续版本。有关其主机要求,请参阅各提供商的设置页面。
| 角色 | 典型工作 | 结果 |
|---|---|---|
| 主模型 | 对话和代理工作 | 消息和工具调用 |
utilityModel |
标题和摘要等短语言任务 | 生成的文本 |
decisionModel |
分类、按评分标准评分和谓词评估 | 带类型的回答和概率估计 |
决策模型在 Control UI 中有一个独立的 Decision 选择器。选择会为显式评估和受支持的消费者选择提供商。核心 decision_evaluate 工具遵循该选择以及普通工具策略。选择不会启动后台工作,也不会替换聊天模型。自动实验性消费者还需要显式决策辅助选择加入。该 Labs 条目目前仅提供门控基础,没有连接自动消费者;显式 decision_evaluate 仍独立于 Labs。
选择提供商和模型¶
在选择其模型之前,先配置提供商插件:
- ONNX 在持久子进程中运行本地 CPU 分类器。按照其开发检出或兼容软件包设置进行操作,然后显式下载模型或准备本地导出。推理不需要托管 API 凭据。
- TypeSafe AI 连接到托管 Jev 或本地 System One 服务器(例如 Kev)。安装并启用外部插件,然后配置受保护的托管凭据或显式回环
baseUrl。托管评估会将所选证据发送到 TypeSafe,并产生其正常使用费用。
当前插件声明了以下模型引用:
| 模型引用 | 模型 | 准备 |
|---|---|---|
onnx/deberta-v3-base-zeroshot-v2.0 |
DeBERTa Zero-shot v2 | 下载固定版本的 ONNX 工件 |
onnx/gliclass-base-v3.0 |
GLiClass Base v3 | 下载固定版本的 ONNX 工件 |
onnx/gliclass-edge-v3.0 |
GLiClass Edge v3 | 下载固定版本的 ONNX 工件 |
onnx/gliclass-instruct-base-v1.0 |
GLiClass Instruct Base | 本地导出 |
onnx/gliclass-instruct-edge-v1.0 |
GLiClass Instruct Edge | 本地导出 |
onnx/gliner2.5-base-v1 |
GLiNER 2.5 Base | 下载固定版本的 ONNX 工件 |
onnx/gliner2.5-small-v1 |
GLiNER 2.5 Small | 下载固定版本的 ONNX 工件 |
typesafe/jev-1.13.0 |
Jev 1.13.0 | TypeSafe 凭据 |
typesafe/jev-latest |
Jev | TypeSafe 凭据;遵循供应商的最新模型 |
typesafe/kev-latest |
Kev(本地服务器) | 运行中的 System One 服务器和显式回环 URL |
这两个插件目前均为未发布的候选项。它们的设置页面说明了源码检出用法和打包主机最低要求。该表描述的是插件声明的模型,而不是您机器上哪些工件或凭据已就绪。
完成提供商设置后,将角色选择合并到您的配置中:
{
agents: {
ownership: "explicit",
defaults: { decisionModel: "onnx/gliclass-edge-v3.0" },
entries: {
support: { decisionModel: "typesafe/jev-latest" },
quiet: { decisionModel: "" },
},
},
}
未设置的代理覆盖会继承全局默认值。空的代理覆盖会禁用该代理的决策。未设置或为空的全局默认值会使该角色保持关闭。没有自动回退到对话模型。
用于本地设置验证,openclaw onnx models 会列出预设,openclaw onnx probe gliclass-edge-v3.0 会在模型下载后运行 Choice、Score 和 Boolean 冒烟评估。
定义决策¶
每个请求都包含共享的 state 和一个 questions 映射。State 接受文本、JSON 对象或数组,或 null。问题键用于标识答案;instructions 和 criteria 定义判断。评分标准随每个请求一起传递,因此没有单独的评分标准注册步骤。
| 问题类型 | 标准 | 答案 |
|---|---|---|
choice |
将标签映射到描述的对象 | choice 和一个具有相同标签的 probabilities 对象 |
score |
评分标准描述的有序数组 | 小数 score 和按索引对齐的 probabilities |
boolean |
true 和 false 下的描述 |
probabilityTrue,从 0 到 1 |
| 问题类型 | 标准 | 答案 |
|---|---|---|
使用描述性替代项和可观察的分数锚点。当目标为 ONNX 时,为布尔问题提供两种描述。让证据聚焦于问题本身;ONNX 的 token 预算包括 state、instructions 和 rubric。
代理评估工具¶
decision_evaluate 是核心工具。当某个代理具有有效的 decisionModel 时,该代理会收到此工具,但需遵循常规工具策略、显式拒绝以及当前 harness 的能力。未配置的代理,或具有空 per-agent 覆盖的代理,不会收到该工具。无论其他实验性消费者是否使用 Decision 模型,该工具都保持可用。Provider 插件仍需要它们自己的常规配置。
使用显式的共享 state 和一个 questions 映射来调用它:
{
"state": { "message": "Checkout is failing for all customers." },
"questions": {
"escalate": {
"type": "boolean",
"instructions": "Does this need incident response?",
"criteria": {
"true": { "includes": ["Widespread service outages"] },
"false": "A routine request can follow normal handling"
}
},
"route": {
"type": "choice",
"criteria": { "support": "Service failures", "billing": "Payment questions" }
},
"urgency": {
"type": "score",
"criteria": ["No disruption", "One workflow blocked", "Widespread outage"]
}
}
}
状态、指令和标准描述接受文本、JSON 对象或数组,或 null。每个问题看到相同的 state,并且无法看到批次中的其他答案。当一个问题依赖于较早的答案时,请使用后续调用。该工具不会收集环境对话。其受信任的调用代理绑定会选择 provider 和 model;输入无法覆盖该身份或选择。
结果保留布尔概率、基于零的小数分数、原始分布和舍入、可选的置信度和用量,以及 provider/model 来源信息。它们不会生成解释,也不会授予执行操作的权限。证据会发送到所选 provider 的已配置端点或本地运行时;仅发送已授权发送到该目的地的数据。Provider 插件负责凭据、模型加载、传输和特定于 wire 的验证。
Provider 能力随其模型元数据声明,并通过 models.list.decisionModels 暴露。不支持的问题和边界会生成可操作且范围有限的指导。请求会被拒绝,而不是被静默截断或拆分。当已配置的 provider 不可用时,不要改用 shell 或 HTTP 调用,不要在聊天中请求凭据,也不要将失败视为否定答案。
缺少凭据、速率限制、过载和临时 provider 错误会使已配置的工具保持可用,并返回不可用结果。配置更改遵循现有的工具/上下文刷新生命周期;执行时会重新检查有效选择和权限。取消会传播到共享的 Decision 运行时,并且不得启动回退工作。
从插件调用¶
从实时工具、hook 或其他自有操作中进行调用。此处 api 是插件 API,agentId 标识拥有该工作的代理,signal 是该操作的取消信号。消费者无需 provider SDK 或 API key。
const outcome = await api.runtime.decisions.evaluate(
{
state: { message: "Checkout is failing for all customers." },
questions: {
route: {
type: "choice",
instructions: "Which team should handle this?",
criteria: {
support: "Technical problems and service outages",
billing: "Invoices, refunds, and incorrect charges",
sales: "Pricing and purchasing questions",
},
},
urgency: {
type: "score",
instructions: "Assess the operational impact.",
criteria: [
"No service disruption",
"Minor inconvenience with a workaround",
"An important workflow is blocked",
"A widespread production outage",
],
},
escalate: {
type: "boolean",
instructions: "Does this require human incident response?",
criteria: {
true: "A serious service incident needs human attention",
false: "A routine request can follow normal handling",
},
},
},
},
{
agentId,
purpose: "support.triage",
rubricVersion: "1",
timeoutMs: 30000,
signal,
},
);
宿主从拥有该工作的代理配置中选择 provider 和 model。purpose 标识消费者操作;rubricVersion 在结果来源信息中标识其 rubric。它们不会替代问题指令。当 rubric 的含义发生变化时,更改 rubric 版本。仅在有意使用全局默认选择时省略 agentId。
ok 结果包含 outcome.result.answers,以提交的问题 ID 为键,外加 provider 报告的 model、可选用量以及 provider/rubric/runtime 来源信息。报告的别名(例如 kev-latest)不会标识某个特定已加载的 checkpoint。缺失的用量或置信度将保持缺失。例如,这些是示例答案,而非承诺的模型响应:
{
"route": {
"type": "choice",
"choice": "support",
"probabilities": { "support": 0.97, "billing": 0.02, "sales": 0.01 }
},
"urgency": {
"type": "score",
"score": 2.85,
"probabilities": [0, 0, 0.15, 0.85]
},
"escalate": { "type": "boolean", "probabilityTrue": 0.96 }
}
宿主在返回任何答案之前会验证完整批次。在 TypeScript 中访问类型特定字段之前,先根据其 type 对答案进行类型收窄。
解释分数和概率¶
分数是基于零的 rubric 位置。上述四个 urgency 描述定义了从 0 到 3 的刻度,包括小数。分数 2.85 位于最高影响锚点附近。显示可以重新缩放该位置:
if (outcome.status === "ok") {
const urgency = outcome.result.answers.urgency;
if (urgency?.type === "score") {
const scoreOutOf100 = (100 * urgency.score) / 3;
}
}
除数是最后一个评分标准索引:criteria.length - 1。显示值是量表上的一个位置,而不是置信百分比或正确的概率。评分标准的措辞决定了该量表所表示的含义。
ONNX 使用 softmax 对实际标签 logits 进行归一化。Choice 使用最大值;Score 是概率加权的评分标准索引。TypeSafe 保留 Jev 报告的标签、得分和概率估计。经过四舍五入的供应商概率不必精确相加为 1,其报告的得分也不必等于根据这些四舍五入值计算出的期望值。
较低的布尔概率偏向 false;接近 0.5 的值对两种结果赋予相近的权重。证据缺失并不保证值接近 0.5。如果该结果很重要,请包含一个明确的“证据不足”Choice 替代项。Choice 替代项会相互竞争;对于独立标签,请使用单独的布尔问题。
你的消费方会选择一种行动策略,例如当 probabilityTrue 至少为 0.9 时进行升级。请在具有代表性的示例上验证该阈值。概率和可选的供应商特定 confidence 值都是估计值,并非已证实的准确性保证。答案并不授予发送消息或执行其他效果的权限。
限制与不可用结果¶
对于可移植的评分标准,最多使用 32 个问题、2–64 个 Choice 替代项、2–10 个有意义的 Score 锚点、明确的 true/false 描述和简洁的证据。提供方限制有所不同:
| 提供方 | Choice 替代项 | Score 等级 | 其他限制 |
|---|---|---|---|
| ONNX | 2–64 | 2–64 | 最多 32 个问题;每个编码输入 512 个 token;编译后批次输入 1 MiB |
| TypeSafe AI | 2–255 | 2–10 | 受宿主批次限制和供应商输入契约约束 |
宿主将请求限制为 1 MiB、20,000 个 JSON 节点、深度 32 和 256 个问题。每个提供方最多允许四个请求,并将每个截止时间限制在 30 秒内。提供方特定限制可能更严格。不支持的输入会被拒绝,而不是被静默截断。
unavailable 结果包含一个原因,例如 disabled、not-configured、unsupported-input、overloaded 或 deadline。消费方决定是跳过、推迟还是使用其现有的回退。调用方取消、已关闭的消费方权限和契约错误都会导致拒绝;不要将取消变成回退工作。完整的生命周期和错误行为请参见 SDK 契约。
消费方应构建有界且有用的证据,只评估一次,并在提供方返回 unsupported-input(包括上下文溢出)时保持其正常行为。运行时不会估算模型 token、截断证据、重试,或选择另一个提供方/模型。输入被拒绝不会触发提供方的熔断器;取消和已关闭的权限保持终态。
decisions 记录器会记录 DEBUG 结果、调度状态、经过时间、问题数量、提供的 JSON 字节数,以及可用的实际提供方使用情况。JSON 字节不是模型 token。用途/提供方/模型标识符会经过哈希处理;现有的环境追踪关联保持不变。它不记录提交的文本、评分标准、凭据或提供方错误响应体,并且在 DEBUG 禁用时不进行额外的输入序列化。通用的输入拒绝警告会被限流。日志将提供方结果与调用方效果区分开来,后者在此处仍不可观测。
对于 ONNX,在较慢的机器上冷加载大型模型可能会超过截止时间。在内存允许时保持活动模型为热状态,或选择更小的模型。有关缓存设置和主动取消的影响,请参阅 ONNX 生命周期与运行时。若缺少 TypeSafe 凭据,请遵循其 设置说明。
从插件提供模型¶
提供方插件实现来自 openclaw/plugin-sdk/decisions 的 DecisionProviderV1,并通过 api.registerDecisionProvider(provider) 注册它。其 id 和 contractVersion: 1 标识该契约;evaluate(batch, context) 返回验证后的类型化答案或受支持的不可用原因。上下文包含所选模型、可选的代理 ID、组合出的取消信号以及单调的截止时间。
在插件清单中声明提供方所有权和静态模型元数据:
{
"contracts": { "decisionProviders": ["example-decisions"] },
"decisionModels": [{ "provider": "example-decisions", "id": "fast", "name": "Fast decisions" }]
}
此清单片段在单独的决策目录中暴露选择器 example-decisions/fast。消费方对每个提供方使用相同的评估 API。它本身不注册提供方。
提供方负责模型特定的输入转换、传输或本地推理、在需要时准备好的凭据,以及取消时的物理清理。注册和可选的 isReady() 必须是同步且无网络的;isReady() 检查已准备凭据的可用性,而不是模型预热。返回真实的模型估计,而不是仅根据标签响应制造确定性。
提供方契约 涵盖完整的 SDK 规则;清单参考 涵盖发现字段。对于现有集成,请使用 ONNX 或 TypeSafe AI 的设置页面。
本页原文 Markdown:在 AtomGit 查看·内容源自开源项目 cl/openclaw