dsh-decision-review
主模型继续拍板,第二个模型只提供复核意见。
把“独立复核”做成 DeepSeek Harness 里的一个工具,而不是替模型做决定。
简体中文 · English
> [!NOTE]
> 这是一个 DSH bundle,安装后默认 `mode: off`,不会产生任何调用。要真正启用,需要一个兼容 `POST /v1/decision` 的复核服务,并显式配置 `model` 与 `baseUrl`。
## 为什么做这个插件
让同一个模型先产出结论再自我复核,往往只是重复一遍它的理由。独立复核的价值在于“第二意见”:复核方只看到问题、主模型的预选、证据与约束,不参与原始推理,也不掌握工具权限。
主模型必须先形成 `primaryChoice`,插件才发起复核。复核返回的建议会连同置信度一起回到主模型手里,采纳、保留还是询问用户,仍由主模型决定。
```mermaid
flowchart LR
A[主模型形成 primaryChoice] --> B[__decision_review 工具]
B --> C[POST /v1/decision]
C --> D[choice + confidence]
D --> E{confidence 阈值}
E -->|>= minConfidence| F[ok:可采纳]
E -->|>= abstainBelow| G[not_adoptable:保留但不推荐]
E -->|< abstainBelow| H[abstained:证据不足]
F --> I[主模型决定采纳或保留]
G --> I
H --> I
```
## 核心能力
| 能力 | 使用体验 |
| --- | --- |
| 三种模式 | `off` 不注册;`shadow` 只记录不回灌;`advisory` 返回结构化建议 |
| 不替模型决策 | 复核只给建议与置信度,最终选择仍在主模型 |
| 结构化产出 | 固定返回 `status`、`recommendation.choice`、`confidence`、`reasonCode` |
| 置信度分层 | 达标可采纳、未达标保留、过低视为弃权 |
| 失败不重试 | 复核失败立即返回原因,主模型按原判断继续 |
| 日志脱敏 | 只记录点位、状态、原因码、模型、HTTP 状态、请求 id、输入指纹与耗时 |
| 可观测性 | 每次复核写一行 stderr,带 traceparent 追踪;失败区分「未拿到响应头 / 读响应体」两段 |
| 权限隔离 | 权限、审批、写操作、网络目标、工具白名单永不交给复核方 |
## 复核协议
复核端点是结构化决策接口,不是 OpenAI 兼容的聊天接口:
```text
POST {baseUrl}/v1/decision
Authorization: Bearer {DECISION_API_KEY}
```
请求体只有三个顶层字段:`{ model, state, questions }`。
| 字段 | 来源 |
| --- | --- |
| `state.question` | 工具入参 `question` |
| `state.primaryChoice` | 工具入参 `primaryChoice` |
| `state.evidence` | 工具入参 `evidence` |
| `state.constraints` | 工具入参 `constraints` |
| `questions.recommendation.criteria` | 工具入参 `options` |
| 返回值 | `answers.recommendation.choice` 与 `confidence` |
`probabilities` 只透传给主模型参考,不参与判定。`baseUrl` 是网关根地址,插件自己拼接路径;已经以 `/v1` 或端点路径结尾的地址会在启动时被拒绝。
## 安装
```sh
dsh plugin --profile