{"_id":"@asyouwish/dsh-verifier","_rev":"3-2424d4a5b66969206d3e9cae818584c2","name":"@asyouwish/dsh-verifier","dist-tags":{"latest":"0.1.2"},"versions":{"0.1.0":{"name":"@asyouwish/dsh-verifier","version":"0.1.0","license":"MIT","_id":"@asyouwish/dsh-verifier@0.1.0","maintainers":[{"name":"asyouwish","email":"drinkwish@163.com"}],"homepage":"https://github.com/ayouwish/dsh-verifier#readme","bugs":{"url":"https://github.com/ayouwish/dsh-verifier/issues"},"dist":{"shasum":"467e41739d8d0bedaf9d2563a93f664d8ee4457d","tarball":"https://registry.npmjs.org/@asyouwish/dsh-verifier/-/dsh-verifier-0.1.0.tgz","fileCount":22,"integrity":"sha512-zKm7FZ+FcUdThKAZSNeNTStGJSohrnIUDxUl+MKxGWxHvQinN+4DGOKElyuaTbZEF8h974parTqiNBXlQKMSuA==","signatures":[{"sig":"MEQCIAx8q1HnPBVViO92I/P14hHiqupO1BZ6LcuEAaO46+zSAiAOeixjQ8CNRq1VcxiezUpjD5KO7H8UJ2zoqp88PGKn4A==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":70991},"main":"lib/index.js","type":"module","_from":"file:asyouwish-dsh-verifier-0.1.0.tgz","types":"lib/types/index.d.ts","exports":{".":{"types":"./lib/types/index.d.ts","default":"./lib/index.js"},"./invariant":{"types":"./lib/types/invariant.d.ts","default":"./lib/invariant.js"},"./package.json":"./package.json"},"scripts":{"test":"vitest run","build":"tsc -p tsconfig.json","typecheck":"tsc -p tsconfig.json --noEmit"},"_npmUser":{"name":"asyouwish","email":"drinkwish@163.com"},"_resolved":"/tmp/99c19d6fbea3af601c2faf755eb59483/asyouwish-dsh-verifier-0.1.0.tgz","_integrity":"sha512-zKm7FZ+FcUdThKAZSNeNTStGJSohrnIUDxUl+MKxGWxHvQinN+4DGOKElyuaTbZEF8h974parTqiNBXlQKMSuA==","repository":{"url":"git+https://github.com/ayouwish/dsh-verifier.git","type":"git"},"_npmVersion":"11.12.1","description":"LLM-as-a-verifier plugin: parallel candidate generation with verifier selection","directories":{},"_nodeVersion":"24.15.0","dependencies":{"@deepseek-ai/schemastery":"^3.18.1"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"vitest":"^4.1.8","typescript":"^6.0.3","@types/node":"^22.20.0","@deepseek-ai/cordis":"^4.0.1","@deepseek-ai/dsh-llm":"^0.1.1-rc.2","@deepseek-ai/dsh-agent":"^0.1.1-rc.2","@deepseek-ai/dsh-scope":"^0.1.1-rc.2","@deepseek-ai/dsh-tools":"^0.1.1-rc.2","@deepseek-ai/dsh-session":"^0.1.1-rc.2","@deepseek-ai/dsh-timeout":"^0.1.1-rc.2","@deepseek-ai/schemastery":"^3.18.1","@deepseek-ai/dsh-settings":"^0.1.1-rc.2","@deepseek-ai/dsh-subagent":"^0.1.1-rc.2","@deepseek-ai/dsh-agent-loop":"^0.1.1-rc.2","@deepseek-ai/dsh-invariants":"^0.1.1-rc.2","@deepseek-ai/dsh-system-prompt":"^0.1.1-rc.2","@deepseek-ai/cordis-plugin-loader":"^1.0.2","@deepseek-ai/cordis-plugin-include":"^1.0.6"},"peerDependencies":{"@deepseek-ai/cordis":"^4.0.1","@deepseek-ai/dsh-llm":"^0.1.1-rc.2","@deepseek-ai/dsh-agent":"^0.1.1-rc.2","@deepseek-ai/dsh-scope":"^0.1.1-rc.2","@deepseek-ai/dsh-tools":"^0.1.1-rc.2","@deepseek-ai/dsh-session":"^0.1.1-rc.2","@deepseek-ai/dsh-timeout":"^0.1.1-rc.2","@deepseek-ai/dsh-settings":"^0.1.1-rc.2","@deepseek-ai/dsh-subagent":"^0.1.1-rc.2","@deepseek-ai/dsh-invariants":"^0.1.1-rc.2"},"_npmOperationalInternal":{"tmp":"tmp/dsh-verifier_0.1.0_1787850749811_0.9258522955694093","host":"s3://npm-registry-packages-npm-production"}},"0.1.1":{"name":"@asyouwish/dsh-verifier","version":"0.1.1","license":"MIT","_id":"@asyouwish/dsh-verifier@0.1.1","maintainers":[{"name":"asyouwish","email":"drinkwish@163.com"}],"homepage":"https://github.com/ayouwish/dsh-verifier#readme","bugs":{"url":"https://github.com/ayouwish/dsh-verifier/issues"},"dist":{"shasum":"e0dc2c8d206c3bf43d5c48607c0ad89d1bc86093","tarball":"https://registry.npmjs.org/@asyouwish/dsh-verifier/-/dsh-verifier-0.1.1.tgz","fileCount":22,"integrity":"sha512-tGZXltaUnXwbCKrTEK04y70xPD7j5OGdWV/0by6cz8CSXsl7dCKa3PGFi07iAqaxzM5+GyXqEXzF2HiFNIP9hA==","signatures":[{"sig":"MEYCIQCmyo1wzC/PBEGh27k2PYQ0jh5py3cnfLxqtBqjts75BwIhAOZENEDL0UJZD/ZpGwh15fP3ekUsRp64YYQCW3JRE5xd","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":71758},"main":"lib/index.js","type":"module","_from":"file:asyouwish-dsh-verifier-0.1.1.tgz","types":"lib/types/index.d.ts","exports":{".":{"types":"./lib/types/index.d.ts","default":"./lib/index.js"},"./invariant":{"types":"./lib/types/invariant.d.ts","default":"./lib/invariant.js"},"./package.json":"./package.json"},"scripts":{"test":"vitest run","build":"tsc -p tsconfig.json","typecheck":"tsc -p tsconfig.json --noEmit"},"_npmUser":{"name":"asyouwish","email":"drinkwish@163.com"},"_resolved":"/tmp/8afbd0c9ea9ef446532288b4c7fe57ed/asyouwish-dsh-verifier-0.1.1.tgz","_integrity":"sha512-tGZXltaUnXwbCKrTEK04y70xPD7j5OGdWV/0by6cz8CSXsl7dCKa3PGFi07iAqaxzM5+GyXqEXzF2HiFNIP9hA==","repository":{"url":"git+https://github.com/ayouwish/dsh-verifier.git","type":"git"},"_npmVersion":"11.12.1","description":"LLM-as-a-verifier plugin: parallel candidate generation with verifier selection","directories":{},"_nodeVersion":"24.15.0","dependencies":{"@deepseek-ai/schemastery":"^3.18.1"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"vitest":"^4.1.8","typescript":"^6.0.3","@types/node":"^22.20.0","@deepseek-ai/cordis":"^4.0.1","@deepseek-ai/dsh-llm":"^0.1.1-rc.2","@deepseek-ai/dsh-agent":"^0.1.1-rc.2","@deepseek-ai/dsh-scope":"^0.1.1-rc.2","@deepseek-ai/dsh-tools":"^0.1.1-rc.2","@deepseek-ai/dsh-session":"^0.1.1-rc.2","@deepseek-ai/dsh-timeout":"^0.1.1-rc.2","@deepseek-ai/schemastery":"^3.18.1","@deepseek-ai/dsh-settings":"^0.1.1-rc.2","@deepseek-ai/dsh-subagent":"^0.1.1-rc.2","@deepseek-ai/dsh-agent-loop":"^0.1.1-rc.2","@deepseek-ai/dsh-invariants":"^0.1.1-rc.2","@deepseek-ai/dsh-system-prompt":"^0.1.1-rc.2","@deepseek-ai/cordis-plugin-loader":"^1.0.2","@deepseek-ai/cordis-plugin-include":"^1.0.6"},"peerDependencies":{"@deepseek-ai/cordis":"^4.0.1","@deepseek-ai/dsh-llm":"^0.1.1-rc.2","@deepseek-ai/dsh-agent":"^0.1.1-rc.2","@deepseek-ai/dsh-scope":"^0.1.1-rc.2","@deepseek-ai/dsh-tools":"^0.1.1-rc.2","@deepseek-ai/dsh-session":"^0.1.1-rc.2","@deepseek-ai/dsh-timeout":"^0.1.1-rc.2","@deepseek-ai/dsh-settings":"^0.1.1-rc.2","@deepseek-ai/dsh-subagent":"^0.1.1-rc.2","@deepseek-ai/dsh-invariants":"^0.1.1-rc.2"},"_npmOperationalInternal":{"tmp":"tmp/dsh-verifier_0.1.1_1787855428654_0.04765580748948728","host":"s3://npm-registry-packages-npm-production"}},"0.1.2":{"name":"@asyouwish/dsh-verifier","description":"LLM-as-a-verifier plugin: parallel candidate generation with verifier selection","version":"0.1.2","repository":{"type":"git","url":"git+https://github.com/ayouwish/dsh-verifier.git"},"publishConfig":{"access":"public"},"type":"module","main":"lib/index.js","types":"lib/types/index.d.ts","exports":{".":{"types":"./lib/types/index.d.ts","default":"./lib/index.js"},"./invariant":{"types":"./lib/types/invariant.d.ts","default":"./lib/invariant.js"},"./package.json":"./package.json"},"license":"MIT","peerDependencies":{"@deepseek-ai/cordis":"^4.0.1","@deepseek-ai/dsh-agent":"^0.1.1-rc.2","@deepseek-ai/dsh-invariants":"^0.1.1-rc.2","@deepseek-ai/dsh-llm":"^0.1.1-rc.2","@deepseek-ai/dsh-scope":"^0.1.1-rc.2","@deepseek-ai/dsh-session":"^0.1.1-rc.2","@deepseek-ai/dsh-settings":"^0.1.1-rc.2","@deepseek-ai/dsh-subagent":"^0.1.1-rc.2","@deepseek-ai/dsh-timeout":"^0.1.1-rc.2","@deepseek-ai/dsh-tools":"^0.1.1-rc.2"},"dependencies":{"@deepseek-ai/schemastery":"^3.18.1"},"devDependencies":{"@deepseek-ai/cordis":"^4.0.1","@deepseek-ai/cordis-plugin-include":"^1.0.6","@deepseek-ai/cordis-plugin-loader":"^1.0.2","@deepseek-ai/dsh-agent":"^0.1.1-rc.2","@deepseek-ai/dsh-agent-loop":"^0.1.1-rc.2","@deepseek-ai/dsh-invariants":"^0.1.1-rc.2","@deepseek-ai/dsh-llm":"^0.1.1-rc.2","@deepseek-ai/dsh-scope":"^0.1.1-rc.2","@deepseek-ai/dsh-session":"^0.1.1-rc.2","@deepseek-ai/dsh-settings":"^0.1.1-rc.2","@deepseek-ai/dsh-subagent":"^0.1.1-rc.2","@deepseek-ai/dsh-system-prompt":"^0.1.1-rc.2","@deepseek-ai/dsh-timeout":"^0.1.1-rc.2","@deepseek-ai/dsh-tools":"^0.1.1-rc.2","@deepseek-ai/schemastery":"^3.18.1","@types/node":"^22.20.0","typescript":"^6.0.3","vitest":"^4.1.8"},"scripts":{"build":"tsc -p tsconfig.json","typecheck":"tsc -p tsconfig.json --noEmit","test":"vitest run"},"_id":"@asyouwish/dsh-verifier@0.1.2","bugs":{"url":"https://github.com/ayouwish/dsh-verifier/issues"},"homepage":"https://github.com/ayouwish/dsh-verifier#readme","_integrity":"sha512-ZmGK+v4dB/60Zs4HwrB5wz2SUaWcExVY/X0V0Laa4UgyFjvL4bRGzKi30thJEbQeIlVvn8ozVLuhl5dzsUM0Mw==","_resolved":"/tmp/879a906e6f31572f4676478e34b55fdd/asyouwish-dsh-verifier-0.1.2.tgz","_from":"file:asyouwish-dsh-verifier-0.1.2.tgz","_nodeVersion":"24.15.0","_npmVersion":"11.12.1","dist":{"integrity":"sha512-ZmGK+v4dB/60Zs4HwrB5wz2SUaWcExVY/X0V0Laa4UgyFjvL4bRGzKi30thJEbQeIlVvn8ozVLuhl5dzsUM0Mw==","shasum":"5ba5b1b629696c801bb5ce5f60155b73eee8e6ae","tarball":"https://registry.npmjs.org/@asyouwish/dsh-verifier/-/dsh-verifier-0.1.2.tgz","fileCount":22,"unpackedSize":73452,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEUCIBZRZ1F6kEJXv0bEjOS+uu1GtxU/NnE4Ngk3FY4Kf61QAiEAuYYxiJO+HFOd4rWWsFlFJccMHcy7/L9jmN5QcARd1h4="}]},"_npmUser":{"name":"asyouwish","email":"drinkwish@163.com"},"directories":{},"maintainers":[{"name":"asyouwish","email":"drinkwish@163.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/dsh-verifier_0.1.2_1788063050022_0.2984420550096163"},"_hasShrinkwrap":false}},"time":{"created":"2026-08-27T17:12:29.582Z","modified":"2026-08-30T04:10:50.320Z","0.1.0":"2026-08-27T17:12:29.958Z","0.1.1":"2026-08-27T18:30:28.995Z","0.1.2":"2026-08-30T04:10:50.174Z"},"bugs":{"url":"https://github.com/ayouwish/dsh-verifier/issues"},"license":"MIT","homepage":"https://github.com/ayouwish/dsh-verifier#readme","repository":{"type":"git","url":"git+https://github.com/ayouwish/dsh-verifier.git"},"description":"LLM-as-a-verifier plugin: parallel candidate generation with verifier selection","maintainers":[{"name":"asyouwish","email":"drinkwish@163.com"}],"readme":"# @asyouwish/dsh-verifier\n\n[English](README.md) | 中文\n\nDeepSeek Harness 的 LLM-as-a-verifier（LLM 作为验证器）插件。启用验证模式后，它注册 `ctx.verifier` 服务和面向模型的 `verify_answer` 工具，实现\"先生成、后验证\"的范式：\n\n1. **并行生成** —— 对同一个问题，通过并发的模型调用独立生成 `n` 个候选答案（扇出是一次覆盖 `ctx.llm.stream` 的 `Promise.all`）。\n2. **验证并选择** —— 由独立的 verifier 模型调用选出最合适的一个候选，并给出理由。提供两种选择策略：`score`（一次打分所有候选并返回最佳下标）和 `tournament`（两两淘汰比较）。\n\n这与 LLM-as-a-verifier 系列工作（生成多个候选，再由 verifier LLM 裁决，例如 self-verification / 带验证器选择的 best-of-N）一脉相承，只是被打包成可插拔的 harness 能力，而不是塞进 agent 循环里的提示词技巧。\n\n设置 `autoVerify` 可在每个 agent 最终答案上自动运行该流水线（即\"自动验证模式\"）。该标志持久化为 `verifier.autoVerify` 设置；Web GUI 的 **通用**（General）设置面板把它暴露为 **验证模式** 开关（由 `@deepseek-ai/dsh-client-ui-verifier` 提供），也可以直接写入该设置字段。\n\n## 配置\n\n| 键 | 类型 | 说明 |\n| --- | --- | --- |\n| `n` | 整数 `[1,8]` | 每次验证并行生成的候选数量。 |\n| `strategy` | `'score' \\| 'tournament'` | verifier 选择最佳候选的方式。 |\n| `generation` | `'raw' \\| 'subagent'` | 候选的生成方式：`raw`（并发模型调用，默认）或 `subagent`（并行子 agent，见下文）。 |\n| `subagentProvider` | 字符串（可选） | `generation: 'subagent'` 时使用的 `ctx.subagents` provider 名称，默认 `spawn`。 |\n| `subagentTools` | 布尔（可选） | 候选子 agent 能否调用组合工具作用域内的工具（默认 `true` = 继承；`false` 对候选隐藏全局工具）。 |\n| `maxOutputTokens` | 整数 `>= 1` | 每次生成/验证调用的输出 token 上限。 |\n| `timeoutMs` | 整数 `>= 1` | 每个辅助模型请求的截止时间。 |\n| `enabled` | 布尔 | 是否开启验证模式（注册 `verify_answer` 工具）。 |\n| `autoVerify` | 布尔 | 为 `true` 时，每个 agent 最终答案都会在回合结束前被自动验证（见下文）。 |\n| `provider` | 字符串（可选） | 显式 provider 路由；必须与 `model` 成对出现。 |\n| `model` | 字符串（可选） | 显式模型 id；必须与 `provider` 成对出现。 |\n\n当省略 `provider`/`model` 时，工具继承调用方 agent 当前记录的请求路由；编程调用方可以在 `VerifyRequest` 中传入显式 `route`。\n\n## 接线\n\n把插件加入 cordis 组合（例如某个 profile 的 patch）：\n\n```yaml\n- insert:\n    - id: verifier\n      name: '@asyouwish/dsh-verifier'\n      config:\n        n: 3\n        strategy: score\n        maxOutputTokens: 1024\n        timeoutMs: 60000\n        enabled: true\n```\n\ninvariant 伴生插件注册在 `@asyouwish/dsh-verifier/invariant`。\n\n使用 `generation: 'subagent'` 时，还需组合 `spawn` 后端，使默认的 `subagentProvider: 'spawn'` 能解析：\n\n```yaml\n- id: subagent\n  name: '@deepseek-ai/dsh-subagent'\n- id: subagent-spawn-in-process\n  name: '@deepseek-ai/dsh-subagent-spawn-in-process'\n```\n\n## 模型体验\n\n### `verify_answer` 工具\n\n#### 模型所见\n\n模型用 `question`（可选 `context` / `n`）调用 `verify_answer`。工具执行完整流水线并返回 `best`（被选中的候选文本）、`index` / `score`（verifier 的选择及 0..1 置信度）、`reason`（一句话理由）和 `candidates`（按批次顺序排列的所有并行生成答案）。编程调用方使用 `ctx.verifier.verify({ question, n, strategy })`。\n\n#### Token 开销\n\n一次运行消耗 `n` 次辅助生成调用，加上 `n - 1`（tournament）或 `1`（score）次验证调用，每次受 `maxOutputTokens` 约束。主 agent 请求不增加 token。辅助调用标记为 `purpose: 'verifier'`，便于 provider 与遥测区分。\n\n#### KV 缓存影响\n\n在工具定义与可见性不变时，`verify_answer` 的 schema 是前缀稳定的。辅助的生成与验证调用携带各自不同的 system 提示词，因此不会复用会话的 KV 缓存前缀。\n\n### 自动验证模式\n\n#### 模型所见\n\n当 `autoVerify` 开启时，每个干净、无工具调用的最终答案都会被原位替换为 `n` 个并行候选中由 verifier 选出的最佳答案；模型自己的草稿不会被再次展示，只有替换后的文本进入会话。验证失败会回退到模型的原始答案。\n\n#### Token 开销\n\n与一次工具调用相同的每次运行开销（`n` 次生成 + 选择调用），在模式开启期间会于每个最终答案上自动产生。\n\n#### KV 缓存影响\n\n辅助调用使用不同的 verifier 提示词，从不共享会话前缀；替换后的最终答案只追加一次，之后是前缀稳定的。\n\n### 基于子 agent 的生成（`generation: 'subagent'`）\n\n默认的 `raw` 生成扇出的是裸模型调用。使用 `generation: 'subagent'` 时，每个候选改由通过 `ctx.subagents` 服务启动的一个并行子 agent 产生：`n` 个子 agent 并发启动，每个以\"生成器角色 + 问题\"作为初始提示，宿主收集每个子 agent 的最终输出作为一个候选，再由 verifier 调用照常选出最佳——主 agent 只拿到一个经过验证的答案，而不是 `n` 份原始草稿。\n\n#### 模型所见\n\n工具与服务面完全不变：`verify_answer` / `ctx.verifier.verify` 接受同样的输入。`VerifyRequest.parent`（调用方 agent）是必需的：subagent 接缝从其会话派生工作区、血缘与委派深度。`verify_answer` 工具与自动验证模式会自动提供它。\n\n#### 依赖要求\n\n- 必须能访问 `@deepseek-ai/dsh-subagent` 运行时（peer 依赖），且部署中必须组合一个提供 `ctx.subagents` 的 provider 插件，注册名即 `subagentProvider`（默认 `spawn`）。\n- `spawn` 后端随运行时一同发布，包名 `@deepseek-ai/dsh-subagent-spawn-in-process`（默认注册为 `spawn`），因此默认的 `subagentProvider: 'spawn'` 只要宿主组合了该后端即可直接使用。其他后端（`fork`、`acp`、`codex`、`claude-code`）注册的是不同名字——把 `subagentProvider` 设成你部署实际组合的那个即可。\n- 缺失项会在调用时响亮失败：没有组合 provider、或没有调用方 agent，都会给出清晰错误而不是静默降级。\n\n#### Token 开销\n\n每个候选现在是一次完整的子 agent 回合（系统提示组装、会话、子 agent 可选调用的工具），而不是一次有上限的补全，因此该模式每个候选的代价与延迟都严格高于 `raw`。换来的是候选能思考、能用工具、能携带上下文——适合需要多步骤推理的难题，此时浅层并行草稿不够用。verifier 选择阶段本身不变。\n\n#### KV 缓存影响\n\n子 agent 携带各自全新的上下文，从不复用父会话前缀；verifier 调用与 raw 模式一样使用自己的 system 提示词。\n\n## 已知限制与后续工作\n\n- 候选文本仅从最终文本块组装：候选子 agent 可以使用工具（`subagentTools`，默认开启），但工具的影响留在子回合内部，不会重放入候选答案；没有产出任何最终文本就结束回合的候选会响亮失败（\"returned no text\"）。\n- `tournament` 串行执行（每次比较等待上一次），用延迟换取选择保真度；并行淘汰赛是后续工作。\n- 自动验证模式需要上游 `@deepseek-ai/dsh-agent-loop` 发布支持分发 `agent/verify-answer` 事件的版本；已发布的 `0.1.1-rc.2` 尚不支持，因此在该版本发布前此钩子不会触发。`verify_answer` 工具和流水线不受该事件影响。\n- 基于子 agent 的生成需要宿主组合一个 `ctx.subagents` 后端；`spawn` 后端（`@deepseek-ai/dsh-subagent-spawn-in-process`）已发布且与默认 `subagentProvider` 匹配，部署只需挂载它即可。\n","readmeFilename":"README.zh.md"}