🎁 福利专区全网大模型免费应用 + 新用户福利 + 注册活动入口,低成本玩转 AI

话匣子 Astepluver/dsh-chatterbox

DeepSeek Harness
Astepluver17 天前有提交已提供中文文档扫描:含敏感能力

让模型边做边说、卡住就开口,把提问讲清楚

30/100
综合分
0
GitHub 星标
—
npm 周下载
—/5
用户评分

数据截至 2026/10/19 · 周下载取自 npm 全网(含 CI / 镜像),非本站安装数;综合分由星标、活跃度与兼容性检查合成。

安装命令 · 需先装 dsh CLI 引擎
dsh plugin --profile web add Astepluver/dsh-chatterbox
该包不可直接 npm 安装,改从 GitHub 源安装(明细见下方安装检查)

状态速览

判定依据:实装验证 · 静态安装检查 · 自动扫描 · 仓库维护状态
信任档位:已验证
是什么[目录]—
dsh 原生插件 · market
暂无时间戳·判据 →
装得上吗[实装验证]✓
本站已在 dsh 0.2.1-rc.5 下真实安装成功
非静态推断
L4 · 真实安装等级说明 →
数据截至 2026/11/03·判据 →
安全吗[自动扫描]—
本站尚未对该插件做风险分级
暂未覆盖,不等同于无风险
数据截至 2026/11/03·判据 →
还在维护吗[仓库]✓
活跃:最近一次提交在 17 天前
暂无时间戳·判据 →
图例:✓ 通过! 需注意— 未判定 / 无数据· 「未判定」= 本站尚无数据,不代表插件有问题
档位由哪些信号合成

本站实装验证(真实安装 L4 覆盖全站;L5 为运行时冒烟或实机截图,覆盖范围小于 L4) · 验证所用 dsh 版本 · 静态安装检查 · 风险分级 · 仓库维护状态。 下方各区块是它的证据明细。

验证判据与等级说明 →

可信度证据

安全扫描自动 · 静态分析源码
v2.7.0
🔵 扫描:含敏感能力尚无人工评估
展开查看扫描说明与证据 ↓

静态扫描发现插件具备触达本地系统的能力:执行外部命令、读写/删除本地文件、读取剪贴板或密钥类环境变量(至少其一)。这是能力清单,不是危险判定——具体能力项与证据见下方,安装前请自行判断是否需要。

读写/删除本地文件
查看扫描证据(共 4 处,展示前 4 条)
  • 写入本地文件
    lib/index.js:143
    mkdirSync(dirname(path), { recursive: true })
  • 写入本地文件
    lib/index.js:145
    appendFileSync(path, line, 'utf8')
  • 读取本地文件
    lib/index.js:146
    const content = readFileSync(path, 'utf8')
  • 写入本地文件
    lib/index.js:149
    writeFileSync(path, `${lines.slice(Math.floor(lines.length / 2)).join('\n')}\n`, 'utf8')
扫描于 2026/11/3(1 天前) · 范围 入口闭包 + 发布文件清单 · 来源 GitHub 仓库

静态扫描只反映源码中出现的调用,不构成安全背书;人工评估与自动扫描相互独立、互不覆盖。

社区实装还没有人打卡 · 装过的第一个就是你
给这个插件打分还没有人投票↓
用户评分
还没有人投票,来当第一个

DSH 话匣子:让模型边做边说、卡住了就开口、把提问讲清楚,而不是闷头自己扛。

README

由 DeepSeek 最新模型翻译生成
dsh-chatterbox(话匣子) 往系统提示里注入一段常驻互动协议的 DSH 插件:让「话少、爱自己扛、爱反复自查」的模型回到 边说边做的默认节奏。 - 边做边说:动手前先说要做什么,做完一小段就聊两句,不把话攒到最后。 - 卡住了就开口:需要人类的东西直接说;换目标、缩范围、弱化结论,都是他的决定,不必一个人扛。 - 把提问讲清楚:默认在对话里问,先给背景和推荐;只有「挑一个」本身替人省力时才给选项。 - 验证有预算:一次独立核查通常就够,把「已核对 / 待核对 / 已知风险」分开写。 - 说人话:中文、短句、先说事实再给判断。 默认对所有模型生效(modelPattern: '' = 普适模式);陪伴模式默认不注入(skipPresets)。 插件的语言刻意是邀请式的,不是纠错式:协议里不出现「失误」「悄悄」「废话」这类把人当小孩的词(node --test 里有一条用例专门守这件事)。要求模型「说人话、别表演」,它自己先得是那个语气。
展开完整文档(README 剩余 1 节)
dsh-chatterbox(话匣子)

往系统提示里注入一段常驻互动协议的 DSH 插件:让「话少、爱自己扛、爱反复自查」的模型回到 边说边做的默认节奏。

- 边做边说:动手前先说要做什么,做完一小段就聊两句,不把话攒到最后。
- 卡住了就开口:需要人类的东西直接说;换目标、缩范围、弱化结论,都是他的决定,不必一个人扛。
- 把提问讲清楚:默认在对话里问,先给背景和推荐;只有「挑一个」本身替人省力时才给选项。
- 验证有预算:一次独立核查通常就够,把「已核对 / 待核对 / 已知风险」分开写。
- 说人话:中文、短句、先说事实再给判断。

默认对所有模型生效(modelPattern: '' = 普适模式);陪伴模式默认不注入(skipPresets)。

插件的语言刻意是邀请式的,不是纠错式:协议里不出现「失误」「悄悄」「废话」这类把人当小孩的词(node --test 里有一条用例专门守这件事)。要求模型「说人话、别表演」,它自己先得是那个语气。

安装(本地目录):plugin_manager action: install_bundle target: "C:\Users\29411\dsh\插件\dsh-chatterbox" 安装(npm): dsh-chatterbox 安装(Release): https://github.com/Astepluver/dsh-chatterbox/releases/latest/download/dsh-chatterbox.tgz

它解决什么(诊断结论,不是猜测)

「新模型话变少了、爱自己扛、爱反复自查」这三个现象,在本机逐条查过:

| 事实 | 证据 |
| 宿主里没有任何按 model id 分支的提示词、工具或 loop 逻辑 | @deepseek-ai/dsh-agent/lib/index.js 的 system-prompt/assemble 监听器只把 provider/model 当变量塞进装配结果,没有 if (model === …) |
| 两份 shipped 预设的人设逐字相同 | dsh-web-app/presets/{standard,ptc}.patch.yml:14 都是 You are a coding agent powered by the {{model}} model. |
| 「1017」是界面徽章,不是 model id | @deepseek-ai/dsh-client-ui-deepseek-model-label-1017:lib/client.js 只在 provider ∈ {deepseek-account, deepseek-official} && model.id === 'deepseek-flash' && model.name === 'DeepSeek-V4.1-Flash' 时加徽章;它的 host 半边是空的 function apply() {}。整个 app.asar(1.8 亿字节)字节扫描 flash-1017 命中 0 |
| 本机两条 DeepSeek 路由的 model id | 官方 deepseek-account/deepseek-flash(界面挂 1017 徽章的那条)与网关 opencode-go/deepseek-v4.1-flash——都不含 1017 |
| shipped 提示词里没有一条要求「工具调用之间叙述进展」 | 全仓最接近的只有 dsh-tool-todo/lib/index.js:21 的 … to plan multi-step work and show progress |

结论:没有一条现成文本把「边做边说」拉住,模型自己的默认脾气一变,行为就直接变了;而把白名单钉在发布日期上(1017)必然过时。所以默认人人有份,modelPattern 只留作排除某个模型的旋钮。

另外,「反复自查」有一部分来自用户自己的预设而不是模型:本 profile 的「分析模式」人设(profiles/desktop/cordis.patch.yml)写着「反复检验分析过程」「能对拍就必须对拍」「报告之前回头对一遍」。本插件不动别人的预设,只是把「验证要有预算」放回系统提示,让两种力量互相平衡。

机制

apply(ctx, config)
└─ ctx.effect(() => ctx.systemPrompt.section({
name: 'plugin:chatterbox', // 全局唯一 order: 720, // dsh-methodology 700 · PTC_ONLY 800 interpolate: false, // 关键:见下
text: (context) => sectionText(...) // 每个模型步骤前重新求值
}))

- interpolate: false 是必需的:section 默认会做 {{变量}} 插值,宿主在渲染期严格解析,未知/畸形引用直接 throw;那个 throw 发生在 agent-loop 的 renderPrompt() 里,插件的 try/catch 拦不到,会让每一轮根会话以 error 收尾(2026-10-17 实测复现)。
关掉之后,extra 里写 {{ 也只是字面量。
- 段落文本为空串时宿主直接丢掉这一段(关掉分条不会留下空壳)。
- 每次 assemble() 重新求值(在 agent/pre-step、agent/request 之前),按会话/preset/模型逐步生效。
- 与 dsh-methodology 用同一个注册点、同一种零依赖写法(裸 config,不 import 任何 @deepseek-ai/* 包,也不导出 Config),order 排在其后,两者不冲突。
- 所有异常路径都兜底:段落求值、模型读取、诊断写入都不可能影响 prompt 装配;求值真的失败时会在诊断文件里留一条 kind: "error",而不是静默消失。

配置(在 cordis.patch.yml 的插件行里覆盖)

| 字段 | 默认 | 含义 |
| enabled | true | 总开关;false 时不注册任何东西 |
| order | 720 | 段落排序值 |
| modelPattern | '' | 空 = 所有模型;填子串(如 deepseek)或 /正则/ 即收窄 |
| matchProvider | true | 收窄时是否连 provider 一起匹配(provider/model 整体) |
| whenModelUnknown | 'apply' | 收窄时拿不到模型身份的兜底 |
| scope | 'root' | root 只给根会话;all 连子代理一起给 |
| skipPresets | ['companion'] | 这些 preset 不注入(按会话 header 的 agentPreset 精确匹配),比 scope 更强 |
| narrate / askInConversation / questionBox / verificationBudget / plainSpeech | true | 五条分条的开关 |
| extra | '' | 追加到协议末尾的文本(字面量注入,不插值) |
| reassertAfterSilentSteps | 6 | 连续多少步没出一句文字就重申一次(0 = 关)。长会话对抗稀释的主力 |
| reassertOnCompaction | true | 每次压缩之后重申一次 |
| reassertEveryTurns | 0 | 另外按轮重申:每 N 轮一次(0 = 关;默认关,上面那条更准) |
| reminder | 见 cordis.patch.yml | 重申文本(两三行,落在历史末尾) |
| diagnostics | true | 每次求值记一行 JSON |
| diagnosticsPath | '' | 留空 = 插件目录下 .state/diagnostics.jsonl(相对路径按进程 cwd 解析) |
| diagnosticsMaxLines | 500 | 超过就丢掉前一半;硬上限 5000 |

模型身份按三来源取,先拿到先用:assemble 瀑布观测到的 provider/model → agent.options → agentDefaultModel.currentSelection()。普适模式下完全不查模型身份。

长会话里为什么会「变淡」,以及重申

朋友反馈「聊久了 chatterbox 就失效,模型重新变沉默」。逐条查过,结论分两半:

一、不是提示词没送到。 循环自己的投影函数保证「线上最新一条非空 system 消息 = 当前渲染出来的提示词」:提示词与线上不一致时,要么原地重写 node 0,要么追加一条新的(dsh-agent-loop/lib/index.js:264-282;压缩的范围永远从 index ≥ 1 开始,node 0 不受遮蔽)。
唯一能挡住已注册段落的机制是 complete: true 段(dsh-system-prompt 收尾只保留那一段),本机没有任何插件用它。而且 in-history 路由的真实故障模式是抛错(UNSUPPORTED_CONTENT),不是变冷淡。⇒ 「压缩把段落吞掉了」这个解释被证伪。

二、是模型侧遵守度在衰减。 本机实测同一台机器上两条装了本插件的会话,助手「带文字」的比例:

消息区间 带文字比例 1- 20 80% 21- 40 50% 41- 60 75% 61- 80 40% 81-100 35% 101-120 50% 121-140 45% 141-160 65% 161-180 15% ← 长取证过程 181-189 11%

关键细节:掉到 11% 的那一整段沉默发生在同一个 user turn 里(约 60 步)。所以修法不是「每 N 轮再说一遍」(那一轮里一次都不会触发),而是按「连续多少步没说话」触发: reassertAfterSilentSteps。触发时插件会把一行极短的提醒,作为 runtime-context 快照 追加到历史末尾——也就是离模型最近的位置。

代价:每条重申约 110 字;模型只要正常说话就不会触发。

怎么确认它真的生效

看诊断文件(默认 <插件目录>/.state/diagnostics.jsonl),每次求值一行。本机实测:

{"time":"…","kind":"section","sessionId":"session-4aa0a2f4-…","origin":null,"model":"deepseek-flash","provider":"deepseek-account","apply":true,"reason":"no-pattern(普适模式)"} {"time":"…","kind":"section","sessionId":"e14f9dcf-…","origin":"subagent","model":"deepseek-v4.1-flash","provider":"opencode-go","apply":false,"reason":"scope=root 且本会话是子代理"}
{"time":"…","kind":"reassert","sessionId":"session-…","count":1,"trigger":"silent:6"} {"time":"…","kind":"prompt-missing","sessionId":"session-…","seq":699,"len":10414,"turns":4}

- kind:"section":装配层拿到(或没拿到)文本,附理由。
- kind:"reassert":重申了一次,trigger 是 silent:N / compaction / turns:N。
- kind:"prompt-missing":某个系统提示里没有本段落。这是「模型没看到」与「模型看到了但不照做」唯一客观的分界——朋友那边再出现变淡时,先看有没有这一行。

更强的证据:真实会话日志里,根会话那一步的 system message 依次是
identity(0) → persona(50) → methodology(1969) → chatterbox(3133) → sci-viz(750)——
段落确实进了模型看到的内容,不是「注册了但没生效」。

已验证 / 未验证

已验证:node --test 23 例全绿(门控/语气/诊断/异常路径,含「纠错腔词表」、「注册必须带 interpolate:false」两条守卫);node --check;安装结果 application: applied 且 Config.listConfigs 能查到行;apply: true/false 两条分支在真实会话里各跑出过;段落文本在真实 prompt 中的位置已核对;npm pack --dry-run 产物齐全;命名声明过 validate-names.mjs;query-registry.mjs 查过中央索引(未被登记)。

重申链路已在真机跑通(2026-10-18,0.2.0),四段证据闭合:

1) 诊断 {"kind":"loaded","reassertAfterSilentSteps":6,…} ← 新版被加载
2) 诊断 {"kind":"reassert","count":1,"trigger":"silent:6"} ← 连续 6 步没说话触发
3) 会话日志 seq=1670 user/message source=runtime-context 894 字 ← 提醒被追加到历史末尾
4) 模型侧:那一轮运行时上下文里确实出现了「(提醒 · 互动习惯)」两行提醒 ← 送到了

另外用真实事件流回放新代码:748 个装配点、首次重申落在历史里那段沉默的起点。

未验证:让模型更愿意说话这件事本身。机制(段落 + 重申 + 触发)可证、「模型因此变得更好聊」不可证。DSH 自带的市场索引校验器在 app.asar 内,Node 无法 import,market/index.json 是按校验器源码逐条实现 + 本地 --check 保持一致,尚未被官方校验器实跑过。

已知限制

- 软引导,不是硬约束:本插件不拦任何工具调用。需要机器强制的地方(例如子代理只读)应该用 ctx.tools.guard 另写。
- 不改变 ask_user_question 的存在:工作区里明确要求用提问框的流程照旧可用。
- 只给根会话(scope: 'root'):子代理与 Agent Teams 队友拿不到(他们对面不是人;队友与一次性子代理共用 origin: 'subagent')。想让队友也有,把 scope 改成 'all'。
- 同一层里段落名必须唯一:把本 bundle 同时挂进 profile 和某个 preset 会同步抛错(不是静默覆盖)。
- token 成本:默认配置下段落约 1.1k 字(中文),随每次请求常驻,属于系统提示里的稳定前缀。
- 改 scope / 开关会让系统提示前缀变化,从而失效一次提示缓存复用。
- 诊断文件只按行数上限截断,不做轮转;每步一次读+写(实测 ~0.3 ms/次)。

发布与收录

本机已有一套跑通过的流程(桌面 插件发布,dsh-sci-viz 用过),本仓库配套一份同样的工具包:

| 步骤 | 做什么 |
| 1 | 在 GitHub 建 Public 仓库 Astepluver/dsh-chatterbox(三个勾都不勾) |
| 2 | 把「上传用」文件夹里的东西全选拖进仓库(网页上传,绕开本机 Git 凭据问题) |
| 3 | About → ⚙️ → Topics 填这 6 个:dsh-plugin、dsh-plugins、dsh-plugin-desktop、dsh-desktop、dsh-plugin-market、deepseek-harness |
| 4 | 发 Release:tag v0.1.0,附件名必须正好是 dsh-chatterbox.tgz |
| 5 | (可选)双击 ❹ 发布到 npm.cmd,别人就能用一行包名安装 |

「收录的 tag 要求」就在这里:第三方采集程序(插件\dsh-plugin-mesh\backend\dsh_mesh\config.py:42-49)只看两条——topic 命中白名单,或仓库名以 dsh- 开头(build.py:295-299);无 topic 且描述短于 10 字会被丢弃(build.py:287-289)。0 星也能收录。

另外有一套与上面无关的机制:DSH 的实验性「自定义插件市场」(Plugins → Discover),它读的是用户自己加的 index URL,格式为 format 1,硬规则见 market/README.md——其中 category / labels[] 必须在索引自己的 metadata 里声明过,那是另一层"tag 要求"。

版本

见 CHANGELOG.md。MIT。
预览分享卡片长什么样 ↓Astepluver/dsh-chatterbox
分享 · DeepSeek Harness Hub
Astepluver/dsh-chatterbox

让模型边做边说、卡住就开口,把提问讲清楚

这个插件是你维护的吗?
作者本人可认领并核对本条目;认领通过后,详情页会显示「作者已认领」标记。
认领条目 →
回到顶部