dsh-input-assist
输入框 ghost 补全:停笔后 FIM 建议内联流式渐显(SSE,首 token 即上屏),Tab 逐词采纳、Shift+Tab 全量,重新输入或 Esc 会真正取消在途请求;错别字双层检查:浏览器本地词典扫描(中文错词、英文错拼与专名大小写、本浏览器自定义词条)叠加防抖 LLM 上下文校对,文中红波浪线标注、逐条导航、点击修正。
安装
dsh plugin --profile web add dsh-input-assist
沙箱测试结果
| 阶段 | 结果 |
|---|---|
| 1 安装 | ✓ |
| 2 列装 | ✓ |
| 3 挂载 | ✓ |
| 4 启动 | — |
四阶段在隔离沙箱里跑:安装(有网)→ 列装 → 挂载 → 启动(后三步断网)。
README
dsh-input-assist
[English](./README.en.md) | 中文
DeepSeek Harness(dsh)输入助手插件:
- 输入补全(ghost text) — 打字停顿后调用 DeepSeek FIM 接口(
/beta/completions),灰色建议内联在光标后(NovAI 同款:镜像层透明占位 + 灰字),SSE 流式逐字渐显(首 token 到即上屏,边生成边变长),Tab逐词采纳(流中采纳不断流)、Shift+Tab全量采纳、Esc关闭 - 错别字检查 — 双层检测:词典层在浏览器本地运行(228 条中文错词 + 211 条英文错拼/专名大小写 + 8 条上下文规则,词库数据在
data/下纯文本维护,可叠加浏览器本地自定义词库;200ms 即时标红、离线零成本)+ LLM 上下文校对(中英混排:在/再、的/得/地及英文拼写,800ms 防抖与补全同节奏)。文中红字标注(红色波浪线,当前项高亮,点红字选中),导航条逐条修正,绝不全量替换
补全快捷键(建议灰字出现时生效)
动作 · 快捷键
采纳一词(中文按词切分) · Tab
全量采纳 · Shift+Tab
关闭建议 · Esc
快捷键说明会在建议出现时显示在输入框外侧的 dock 行(与错别字导航条同位),输入框内无任何浮层。
错别字快捷键(仅输入框聚焦且有检出时生效)
动作 · 快捷键
下一个 / 上一个错字 · Ctrl+Shift+. / Ctrl+Shift+,
修正当前选中项 · Ctrl+Shift+F
标记该处为正确输入(不替换) · Ctrl+Shift+G
本次输入不再提醒 · Esc
快速开始
要求 dsh ≥ 0.2.1-rc.2(engines.dsh 声明,宿主安装/启动时自动拦截不满足的版本;0.1.x 用户请继续用本插件 0.7.x)。
dsh plugin --profile web add dsh-input-assist # 或 @honlnk/dsh-input-assist,内容完全相同 dsh --profile web # 启动,打开 http://127.0.0.1:3080
本地开发(从源码装):
git clone https://github.com/honlnk/dsh-input-assist && cd dsh-input-assist npm install && npm run build dsh plugin --profile web add "$PWD"
官网(功能演示 + 安装指引):https://honlnk.github.io/dsh-input-assist/
API key 三选一(补全与 LLM 检查层需要;词典层无需任何配置):
1. 什么都不做——插件自动复用 dsh 已保存的 DEEPSEEK_API_KEY(.credentials.yaml)或环境变量
2. 插件详情页填:侧边栏 Plugins → dsh-input-assist → 配置区的 Input Assist 卡片(推荐,全部配置图形化)
3. 环境变量 DEEPSEEK_API_KEY=sk-… dsh web(旧版 ~/.dsh/settings.yaml 写 input-assist.* 的方式在 0.2.x 已废止)
设置卡(插件详情页)
所有配置都可在插件管理页图形化修改:侧边栏 Plugins → 点开 dsh-input-assist 详情页,「配置」区展开 Input Assist 卡片即可。交互与官方卡片同构:暂存编辑 → 统一「保存 / 放弃修改」,数字与必填文本本地校验,字段行带「未保存」蓝点与单项撤销(×)。卡片注册走官方 plugins.bundle.config 插槽(keyed by bundle 包名;0.2.x 起插件设置统一收纳进插件管理页,旧 settings.plugin.item 插座已删除),无需新增任何服务依赖;配置持久化进 profile 的插件 entry(profiles/<name>/cordis.patch.yml),外部修改仍会热同步进卡片。
模型字段支持从 API 拉取目录:点字段旁的 ▾ 方块按钮打开自定义下拉面板,每次打开都自动拉取最新目录,点选即填入;输入框始终是自由文本,任何 OpenAI 兼容端点的自定义模型名都可手填。拉取失败(未配 key、端点不可达)自动退回手填。默认模型已跟随官方迁移:deepseek-chat 于 2026-07-24 停用,现为 deepseek-flash(V4.1 Flash)。
自定义词库(仅本浏览器)
设置卡底部「自定义词库(仅本浏览器)」区块是一张成对词条列表:左列错词、右列正词,中英文皆可。点「+ 添加词条」在末尾追加一对输入框,× 删除该行,拖拽行首把手调整顺序(或聚焦后 ↑/↓ 移动),增删与移动都有平滑动画:
- 与内置词库合并参与词典层本地扫描:同名错词覆盖内置项;错词与正词写成同一个词(自映射)= 不再检查该词(禁用内置词);英文词条自动走词边界匹配(驼峰、snake_case、点号连接的标识符不会误报)
- 仅存本浏览器 localStorage(key
dsh-input-assist:user-dict:v1,存储格式仍为错词 => 正词一行一条),不随插件配置同步 - 标题行有「导入 / 导出 / 复制」:导入选
.txt文件(一行一条错词 => 正词,与内置词库同格式、#注释),同错词就地更新、其余追加进暂存列表,过目后仍要点保存;导出把当前列表(含未保存修改)下载为同格式.txt,复制走剪贴板——换浏览器/换机器搬运全靠它们 - 上限 2000 条、单条错词 ≤ 16 字;校验问题(空词、连续空白、超长、重复)逐行内联提示,有问题不能保存;与其他设置的修改共用卡片底部的「放弃修改 / 保存」,保存成功后立即按新词库重新标红
配置(插件详情页图形化修改;持久化进 profile 的插件 entry config)
键 · 默认 · 说明
completionEnabled · true · 输入补全开关(输入框「补」按钮同效)
completionBaseUrl · https://api.deepseek.com/beta · FIM 端点(OpenAI 兼容可换)
completionApiKey · '' · 留空则走凭证回退
completionModel · deepseek-flash · 补全模型(输入框可下拉选择,⟳ 从 API 拉取目录)
completionDebounceMs · 800 · 停笔多久后请求建议(与 LLM 校对同节奏)
completionMaxTokens · 64 · 建议长度上限
completionStream · true · 补全走 SSE 流式逐字渐显;接口不支持流式时关闭改整段返回
proofreadEnabled · true · 错别字检查开关(「校」按钮同效)
proofreadUseLlm · true · 是否叠加 LLM 检查层(关掉则完全不花钱)
proofreadModel · deepseek-flash · LLM 检查模型(同上,下拉选择)
proofreadDebounceMs · 800 · LLM 层防抖(与补全同节奏,两路同时返回)
proofreadDictDebounceMs · 200 · 词典层防抖(浏览器本地扫描,零成本)
开发与测试
源码在 src/*.ts(TypeScript strict 模式),构建用 tsdown 双入口:
src/index.ts→lib/index.js(ESM +.d.ts,host 半边,cordis loader 直接 import)src/client.ts→lib/client.js(CJS,banner/footer 自动包window.__ModuleLoader__.load壳,react / dsh-client-runtime 保持外部依赖,词典等本地模块打包进 bundle)
npm install npm run build # tsdown 双入口构建,产物落 lib/(不含 tsc 严格检查) npm test # build → tsc --noEmit → node --test(类型错在本地即拦截)
词库数据在 data/ 下纯文本维护(zh-wrong-phrases.txt + en-wrong-spellings.txt + en-proper-nouns.txt 行式词库 + zh-context-rules.json 上下文规则),构建前由 scripts/gen-dict.mjs 解析校验并生成 src/proofread-dict-data.generated.ts(提交进 git,CI 用 gendict + git diff 守卫同步)——更新词库只改 data/ 文件,npm run build 自动生效。test/client-bundle.test.js 用假 ModuleLoader 真正执行 bundle 产物,验证 data → bundle 全链路;用户自定义词库(localStorage)在浏览器侧与内置词库合并扫描。
文档
- [docs/01-立项调研与技术方案.md](./docs/01-立项调研与技术方案.md) — 立项文档:调研结论、架构、插槽契约、里程碑
- [docs/02-首版实施-补全与错别字双层.md](./docs/02-首版实施-补全与错别字双层.md) — 首版实施记录、验证结果、踩坑清单(RPC 错误码枚举、IAB 点击问题等)
- [docs/03-错别字改版-文中红字与逐条导航.md](./docs/03-错别字改版-文中红字与逐条导航.md) — 错别字改版:红字镜像层、导航交互、快捷键冲突排查与验证状态
- [docs/04-内联补全改版-ghost-text与词典下沉.md](./docs/04-内联补全改版-ghost-text与词典下沉.md) — NovAI 化改版:ghost text、逐词采纳、词典层下沉浏览器、双层防抖拆分
- [docs/05-TypeScript重构与tsdown构建.md](./docs/05-TypeScript重构与tsdown构建.md) — TypeScript 重构:tsdown 双入口构建、词典单源化、产物守卫测试
- [docs/06-设置页卡片-插件配置图形化.md](./docs/06-设置页卡片-插件配置图形化.md) — 设置页卡片:settings.plugin.item 插槽调研与实现、暂存表单、守卫测试
- [docs/07-模型目录拉取与默认模型迁移.md](./docs/07-模型目录拉取与默认模型迁移.md) — 模型目录拉取:models.list RPC、datalist 组合框、默认模型迁移 deepseek-flash
- [docs/08-词库外置与自定义词库-开发计划.md](./docs/08-词库外置与自定义词库-开发计划.md) — 词库数据外置 + 用户自定义词库(localStorage)开发计划
- [docs/09-词库外置与自定义词库-实施记录.md](./docs/09-词库外置与自定义词库-实施记录.md) — 词库外置实施记录:data/ + gen-dict 生成器、合并扫描语义、设置卡片词库区块
- [docs/10-英文拼写检查-实施记录.md](./docs/10-英文拼写检查-实施记录.md) — 英文拼写检查实施记录:错拼/专名词典、词边界扫描、LLM 层中英混排
- [docs/11-自定义词库列表编辑器-实施记录.md](./docs/11-自定义词库列表编辑器-实施记录.md) — 自定义词库列表编辑器实施记录:pairs 编辑视图、拖拽 + FLIP 动画、按钮对合并
- [docs/12-在途请求取消-实施记录.md](./docs/12-在途请求取消-实施记录.md) — 在途请求取消实施记录:requestId + cancel 端点、cancelled 错误码、触发点与兼容性
- [docs/13-自定义词库导入导出-实施记录.md](./docs/13-自定义词库导入导出-实施记录.md) — 自定义词库导入/导出实施记录:.txt 同格式互导、合并语义、纯浏览器侧实现
- [docs/14-流式渐进渲染-实施记录.md](./docs/14-流式渐进渲染-实施记录.md) — 流式渐进渲染实施记录:fetch 流式路由传输层调研、SSE 帧协议、Tab 流中采纳、降级矩阵
- [docs/16-dsh-0.1.5-适配.md](./docs/16-dsh-0.1.5-适配.md) — dsh 0.1.5-rc.2 适配
…(truncated)
以上内容来自 npm 上的 README,我们只做格式化,不改内容。
版本
npm 上共发布:10,最后更新 2026-10-23