决策模型
一个决策模型会针对事件回答带类型的问题,而不是生成文本。在触发器匹配之后、运行开始之前,SOP 可以提出其中一个问题:
- 关卡: 该事件是否应当启动此 SOP?
- **模式:**作者列出的执行模式中,哪一种适合本次运行?
这使得一个触发器(Webhook 路径、频道或 MQTT 主题)可以驱动多个 SOP,由模型判断该事件实际适用于哪个 SOP,以及每次运行需要多少人工监督。
ZeroClaw 通过 “System One” 类型化决策 API(POST <base_url>/v1/systemone)进行通信。两种模型都实现了该接口:
| Model | 运行位置 | 备注 |
|---|---|---|
| TypeSafe Jev | 托管 API,API 密钥 | 事件内容将发送至 TypeSafe。 |
| Laya | 自托管(laya-serve) | 开放权重;无需密钥;事件内容保留在本地。 |
配置模型
在 config.toml 中为每个模型声明一个别名,并选择其 provider:
provider | 服务 | base_url 默认值 | model 默认值 | 键 |
|---|---|---|---|---|
jev(默认) | TypeSafe Jev,托管 | https://api.typesafe.ai | jev-latest | api_key 为必填项 |
laya | Laya 通过 laya-serve | http://127.0.0.1:8000 | laya | 无 |
custom | 任何其他与 System One 兼容的端点 | 必需 | jev-latest | 可选 |
[decision_models.jev]
provider = "jev"
# api_key 是机密信息;请使用 `zeroclaw config` 或
# ZEROCLAW_decision_models__jev__api_key 进行设置。
[decision_models.laya]
provider = "laya"
[decision_models.gpu_box]
provider = "custom"
base_url = "http://10.0.0.5:8000"
model = "laya"
base_url 和 model 会覆盖提供商的默认值。未设置 base_url 的 custom 条目会被忽略,选择该条目的 SOP 将回退到其最严格的模式。这些别名也可以在仪表板的配置页面中管理。
在 SOP 中选择模型
在 Web 控制台的 SOP 编辑器中,于执行模式下勾选 决策模型,然后从下拉列表中选择一个已配置的模型;门控、模式和阈值在同一面板中编辑。保存时若 [decision] 表无效,将拒绝保存并说明原因。
在基于文件的 SOP 中,于 SOP.toml 中添加一个 [decision] 表,并为其命名别名:
[decision]
model = "jev"
gate = "客户是否在要求退款?"
gate_threshold = 0.7
modes = ["auto", "supervised", "step_by_step"]
mode_instructions = "auto:金额低于 50 美元且属于常规处理。step_by_step:金额超过 500 美元、涉及法律威胁,或任何异常情况。"
min_confidence = 0.7
| 字段 | 默认 | 效果 |
|---|---|---|
model | 必需 | 来自 [decision_models] 的别名。 |
gate | unset | 是/否问题。只有当模型输出“是“的概率达到 gate_threshold 时,运行才会开始;否则该事件在本 SOP 中被记录为已跳过。 |
gate_threshold | 0.7 | 启动所需的最小 “yes” 概率 |
gate_on_error | run_strict | 当模型无法作答时:run_strict 会以其失败即关闭(fail-closed)模式启动运行,skip 则不启动运行。 |
modes | 空 | 模型在本次运行中可选择的模式。仅限 auto、supervised 和 step_by_step。留空则保留编写时设定的 execution_mode。 |
mode_instructions | 通用 | Mode 选择指南 |
min_confidence | 0.7 | 低于此置信度的模式选择将使用 fail-closed 模式。 |
part_threshold | 0.5 | 最低运行步骤的“是”概率,适用于 decide 问题。参见条件步骤。 |
A [decision] 表需要包含 gate、modes 或带有 decide 的步骤。确定性 SOP 不能使用 modes。
条件步骤
一个步骤可以附带自己的是/否问题。模型会在与门控和模式判断相同的请求中回答该问题,因此一次调用即可决定运行包含哪些步骤。这种方式将一个 SOP 由多个部分组合而成,而不是拆分为多个 SOP,每个 SOP 各自询问模型是否应当启动。
## Steps
1. **Hold for a maintainer** - Draft a comment that tags a maintainer to decide on scope.
- decide: Does this PR add a new feature outside the roadmap and existing features?
2. **Security review** - Review the auth, secret, and sandbox changes.
- decide: Does this PR touch authentication, secrets, or sandboxing?
- unless_decided: 1
3. **Test review** - Check that the changed behavior is tested.
- decide: Does this PR change runtime behavior?
- unless_decided: 1
4. **Compose the review** - Combine the findings into one review comment.
- unless_decided: 1
- decide: <question>仅在答案为“是“的概率达到part_threshold时才运行该步骤。unless_decided: N在步骤 N 的问题回答为“是“时跳过该步骤。步骤 N 必须包含一个decide问题。- 被跳过的步骤会以
skipped状态及其原因记录,运行随后继续执行下一个步骤。下一个步骤接收的输入与被跳过的步骤本应接收的输入相同。 - 当模型无法作答,或对某个步骤的问题给出格式错误的值时,该步骤仍会执行。跳过绝不是安全的兜底方式。
- Routing 守卫可以读取答案:在
when:条件中,$.decisions.2表示第 2 步的“yes”概率。 - 另一个步骤不能
depends_on条件步骤,因为被跳过的步骤不会产生任何输出。请改为在when:条件中读取$.steps.N。 - 一个步骤在其审批关卡之前被跳过,因此被跳过的步骤永远不会请求审批。
安全
-
模型只能在作者已写明的选项中做选择。它不能添加触发条件,不能选择未列出的模式,也不能选择
priority_based或deterministic。 -
选定的模式仅适用于该次运行,并与该次运行一同存储,因此重启后依然有效。步骤级的
requires_confirmation和检查点无论所选模式如何都会继续进行拦截。 -
失效即关闭(Fail-closed): 未配置的别名、网络或 HTTP 错误、格式错误的回答,或置信度低的回答,都不会降低监督级别。运行时采用其列出的模式、其编写的
execution_mode以及supervised中最严格的一种。 -
Here’s the translation:
事件负载以不可信内容的形式发送给模型,并限制在 8,000 个字符以内。如果事件内容不得离开主机,请选择自托管模型。
每项决策都会记录 SOP 名称、结果、所选模式、每个条件步骤的答案以及输入 token 数。