dsh-web
zhu1090093659/dsh-webDeepSeek Harness(DSH)Web 插件聚合生态包 · 一切皆插件,创意工坊分发(dsh-market.com)
Holds each DSH final answer before delivery, has an independent minimal-context model call verify it, and releases only the verified text.
English summary. Holds the model's final answer before it reaches the browser, sends it to one
independent, minimal-context model call for a second pass, and releases only the verified text —
the draft is never shown. The review request carries the question, the draft and (optionally) a
short digest of this turn's tool calls; the main conversation is not replayed. Any failure, timeout
or unexpected reviewer output releases the draft unchanged. Costs one extra model request per
reviewed answer and a few seconds before the text appears. Verified only against dsh 0.2.1-rc.2(engines.dsh pins it).把模型的最终回答先扣住,交给一次独立的二次调用复核,只把校验后的文本送到前端。 用户看不到草稿,也不需要把「问题 + 回答」重新塞回主上下文。
dsh plugin --profile web add dsh-self-review,然后刷新页面。dsh plugin --profile web remove dsh-self-review。@deepseek-ai/schemastery(纯 JS、无构建步骤,安装不需要构建授权);package.json 里 engines.dsh 是 `=0.2.1-rc.2`,也就是只在当前这个 dsh 版本上测过:
plugin_manager 拒绝安装并给出明确提示;在别的 dsh 版本上实测通过后再放宽,改法见 PUBLISHING.md。 放宽前请重跑 node test.mjs、node test-client.mjs,并人工确认「自检中」提示仍出现。
digestChars 个字符的工具调用摘要发给同一个模型服务商(或 reviewModel 指定的那个)。它和正常对话走同一条链路, 但也确实是把“回答正文”又发了一次。不想这样就把 enabled 关掉。
只有十几 token,真发现缺陷时才 ≈ 回答长度(要求复核模型给出完整修正稿)。
GET /dsh-self-review/state 只返回 {reviewing, startedAt, draftChars},仅接受本机回环 + 同源请求,不包含任何回答正文。
agent/turn-stopping网上(包括豆包给的方案)常见的说法是监听 agent/turn-stopping 并改写 turn.modelOutput。 在 DSH 里这两个东西都不存在:
agent/turn-stopping 的载荷只有 { agent, turn, signal },拿不到本轮草稿,也没有 modelOutput 字段;assistant/message 已经提交并通过 agent/assistant-stream 实时推给了前端,改不动已经显示的内容。真正能在「送达之前」截住字节的是 `llm/stream` 瀑布:模型流式调用的每一个 chunk 都要经过它, 而消费者(agent-loop / Web UI)只看到经过它之后的流。本插件就在这一层缓冲文本。
模型流 ──► llm/stream 瀑布(本插件)
│ reasoning / tool-call / 其它块:直接放行
│ text 块:扣住
├─ 出现 tool-call ──► 立刻放行已扣文本,本步转为透传(不是最终回答)
└─ finish=stop ────► 二次调用复核
├ ok ──► 放行原草稿
└ fix ──► 放行修正稿(草稿从未发出)finish.reason = stop、没有 tool-call、只有一个文本块、长度在minChars~maxChars 之间。工具步骤在第一个 tool-call-delta 到达时就解冻,不额外等待。
reasoning。这正是省 token 的关键:草稿不重生成,只被扣住;复核的输入约等于「问题 + 回答」。
fix,并要求保持原结构、措辞与细节;拿不准时返回 ok。任何异常、超时、协议不符都按 ok 处理(fail-open),草稿原样放行。
sessionId/toolHistory,插件的过滤器直接放行。Host 半维护一张「当前被扣住的会话」表,并注册上面那条只读状态路由。
Client 半(client.js)注册在 conversation.input.activity(输入框工具行、模型选择器右侧), 在会话 running 期间每 350ms 轮询一次;一旦 Host 说正在复核,就显示一个旋转环 +「自检中」, 复核结束、回答放出后自动消失。会话不运行时完全不轮询。
九个字段声明在插件的 schemastery Config 里:Host 校验配置、填默认值,并把它投影成可编辑的 表单数据。表单本身由本包的客户端卡片渲染(plugins.row.config,key dsh-self-review#self-review,基于 @deepseek-ai/dsh-client-ui-primitives 的 SettingsFormModel / SettingsForm / SettingsValueField)——DSH 不提供 schema 直出表单的渲染器。
入口:Plugins 页 → `dsh-self-review` 包,表单直接显示在描述下方(plugins.bundle.config, key 为包名),不再需要点进子组件。每个字段都是 volatile,因此:
cordis.patch.yml;cordis.patch.yml 不再复制一份配置)。字段标签跟随界面语言(中/英);Host 投影的 schema 描述只有英文。
键 · 默认 · 含义 enabled · true · 总开关 minChars · 120 · 短于此的回答不复核 maxChars · 30000 · 长于此的回答原样放行(整段重写不可靠) reviewModel · '' · "provider/model";空 = 与回答同路由 digestChars · 4000 · 工具调用证据的字符预算,0 关闭 timeoutMs · 60000 · 复核超时,超时放行草稿 subagents · false · 是否也复核子代理的最终回答 debug · false · 每次复核写一行 JSON 日志 debugFile · 系统临时目录 dsh-self-review.log · 日志路径
没有表单的宿主(headless 等)照样读取同一份 schema,只是改配置要手写 profile patch。
「思考 → 停顿几秒 → 整段回答」。这是「用户看不到草稿」的必然代价。
需要跑代码/查外部资料才能确认的错误,它只能提出怀疑。
verdict=fix 才会替换,且提示词要求最小改动;如果观察到退化,把 reviewModel 换强一点,或调高 minChars 只复核长回答。
以下脚本在仓库里,不在 npm 包内(files 只打包运行所需文件):
# 协议级单测(不需要模型)
node test.mjs
# 客户端半注册冒烟测试(不需要浏览器)
node test-client.mjs
# 真实模型端到端:在 headless 测试 profile 里跑
dsh plugin --profile headless add .
dsh headless --patch ./test-llm-patch.yml "解释一下哈希表"
Get-Content "$env:TEMP\dsh-self-review.log"test-llm-patch.yml 只是临时覆盖层:重新启用 headless 里默认关闭的凭据服务、插入本插件。
仓库根目录的 PUBLISHING.md(发布与市场收录步骤)和 market-entry.yml(条目模板)同样不随 npm 包分发。