# DSH Second Opinion [English](README.md) `dsh-second-opinion` 为 DeepSeek Harness 增加异步的第二模型审阅。主模型回答会立即提交;审阅模型随后检查完整的 assistant 消息,记录带原文引用的意见,并可选择要求主模型重新决策。 ![带原文引用的第二意见](https://raw.githubusercontent.com/scwlkq/dsh-second-opinion/main/docs/assets/review-comments.png) ## 功能 - 审阅每条已提交的 assistant 消息,不延迟主模型,也不让审阅失败影响主流程。 - 同一 Session 内串行审阅,不同 Session 之间并行执行。 - 支持人工复议和有次数上限的自动复议。 - 将意见锚定到精确原文;没有适用引用时保留为通用意见。 - 使用 Storage Domain sidecar 持久化 pending、completed 和 failed 状态。 - 在 Web 界面提供重试、按单条意见复议和按全部意见复议。 - 不向审阅模型提供主 Agent 的工具,因此审阅本身不能产生工具副作用。 ## 环境要求 - DeepSeek Harness `0.1.2-rc.1`,这是当前已验证版本 - Node.js `^22.19.0 || >=24.0.0` - `dsh plugin` 可调用 `pnpm` ## 安装 从 npm 安装到 Web profile: ```bash dsh plugin --profile web add dsh-second-opinion ``` 也可以安装 GitHub 当前源码: ```bash dsh plugin --profile web add github:scwlkq/dsh-second-opinion ``` 安装后重启 DSH Web 进程。组合包会同时启用 Host 插件和浏览器模块。 ## 使用 默认 `advisory` 模式不需要额外配置。启动 DSH 并发送提示词后,点击已完成 assistant 消息下方的对话气泡操作。弹层会先显示“审阅中”,随后显示审阅结论和意见。你可以把单条意见或完整审阅提交给主模型重新决策。 ```bash dsh --profile web ``` 审阅路由默认沿用生成目标消息的 provider 和 model。设置下面两个变量可以指定独立的 B 模型: ```bash export DSH_REVIEW_PROVIDER='' export DSH_REVIEW_MODEL='' dsh --profile web ``` ## 模式 | 模式 | 行为 | | --- | --- | | `advisory` | 保存并展示审阅结果,由人决定按单条意见或全部意见重新决策。默认使用此模式。 | | `auto` | 当结论为 `concern` 或 `disagree` 时,自动要求主 Agent 重新决策;原回答仍保留在会话记录中。 | 通过组合包环境变量启用自动复议: ```bash export DSH_REVIEW_MODE=auto dsh --profile web ``` 自动复议受 `autoRevisionsPerTurn` 限制,并跳过插件建议产生的消息链,避免无限审阅循环。 如果 B 模型较慢、Session 已经进入后续任务,旧审阅仍可查看,但不会自动注入新任务。 ## 配置 组合包在 profile 启动时读取以下环境变量: | 环境变量 | 默认值 | 含义 | | --- | --- | --- | | `DSH_REVIEW_MODE` | `advisory` | 选择 `advisory` 或 `auto`。 | | `DSH_REVIEW_PROVIDER` | 未设置 | 审阅 provider ID,必须与 `DSH_REVIEW_MODEL` 同时设置。 | | `DSH_REVIEW_MODEL` | 未设置 | 审阅 model ID,必须与 `DSH_REVIEW_PROVIDER` 同时设置。 | 如需配置全部选项,在 profile 的 `cordis.patch.yml` 中增加按 ID 覆盖的配置: ```yaml - id: second-opinion config: mode: advisory provider: '' model: '' reasoningEffort: high maxTokens: 900 maxContextMessages: 20 autoRevisionsPerTurn: 1 reviewToolCalls: true ``` | 配置项 | 默认值 | 含义 | | --- | --- | --- | | `mode` | `advisory` | 仅审阅或自动复议。 | | `provider` | 目标消息路由 | 独立审阅 provider ID,需与 `model` 一起配置。 | | `model` | 目标消息路由 | 独立审阅 model ID,需与 `provider` 一起配置。 | | `reasoningEffort` | 未设置 | 可选的审阅模型推理强度。 | | `maxTokens` | `900` | 审阅输出 token 上限。 | | `maxContextMessages` | `20` | 连同目标回答发送给 B 模型的最近会话消息上限。 | | `autoRevisionsPerTurn` | `1` | 每个主模型 turn 的自动复议次数上限。 | | `reviewToolCalls` | `true` | 是否审阅没有非空文本的 assistant 消息,包括仅含工具调用的消息。 | `provider` 和 `model` 必须同时提供或同时省略。插件会在加载时拒绝可立即判定的无效配置。 ## 隐私、成本与失败行为 - B 模型会收到目标回答以及最多 `maxContextMessages` 条最近的可见会话消息。内容可能包括提示词、工具调用参数、工具结果标记和图片标记,但不包含隐藏推理。 - 每条被审阅的 assistant 消息会增加一次模型请求;`auto` 模式遇到非 `agree` 结论时,还可能增加一次主模型请求。 - B 模型失败不会阻塞、延迟或替换 A 模型回答。无效结构化输出会显示为审阅失败,并允许重试。 - B 模型只得到结构化的 `submit_review` 响应工具,不会得到主 Agent 可执行的工具。 ## 当前限制 - 精确引用只在审阅弹层中展示;`0.1.0` 不会装饰或选中原会话 DOM。 - 审阅在 assistant 消息提交后启动,不会对流式输出中的半成品逐 token 审阅。 - 自动复议会追加一条新决策,不会覆盖原回答。 - 首个版本以 DSH Web profile 的交互审阅为主要目标。 ## 卸载 ```bash dsh plugin --profile web remove dsh-second-opinion ``` 卸载后重启 DSH Web 进程。 ## 开发与验证 ```bash pnpm install pnpm test pnpm run typecheck pnpm run lint pnpm run build ``` 使用本地 DeepSeek Harness 仓库验证真实打包安装: ```bash DSH_SOURCE_ROOT=/path/to/deepseek-harness pnpm run smoke:install ``` 完整中文教程见 [`docs/使用指南.md`](docs/使用指南.md)。 ## 许可证 MIT