READMESource: main@8e849fd6
输入框查错(dsh-plugin-typo-check)
给 DSH 的输入框加一个「查错」按钮:点一下,把当前草稿交给任意 OpenAI 兼容的模型,只找错别字(错字、别字、多字、漏字、同音/形近误用),在输入框里标黄,并在下方浮动卡片里逐条列出,点「替换」一键改掉。不做润色、不改文风、不动标点风格。
它解决的是最实际的一个问题:写了一大段,发出去之后才发现有错别字。
特性
- 只查错别字,不重写句子;提示词里明确列了「什么不算」(同义替换、语序、口头/书面、繁简、标点风格等)。
- 任意 OpenAI 兼容来源:
…/v1/chat/completions、…/v1/responses(例如 DeepSeek、OpenAI、OpenRouter、各类中转站)都能用;URL 填到/v1会自动补/chat/completions。 - 多来源 + 顺序回退:表格里可以配多行,按顺序尝试,第一个成功的就用它;全失败时按钮左侧显示「api 无效」,每一行的失败原因都能看到。
- 每个来源可单独配置:系统提示词、
max_tokens、思考模式、模型名都可以按行设置。 - 不改动编辑器 DOM:标黄用的是 CSS Custom Highlight API(
::highlight()),不往 Lexical 里塞节点,输入、撤销、引用 chip 都不受影响。 - 浮动结果卡片:悬浮在输入框上方,不影响页面布局;发送消息后卡片和标黄一起自动清掉。
- 密钥不出后端:API Key 只存在本机 JSON 里,页面只看得到前后 4 位的掩码。
安装
DSH 桌面端 → 侧边栏「插件」→ 安装,填入本仓库地址(github:<用户名>/<仓库名>)或本地的 link: 路径。
本地开发时也可以直接把仓库目录链接进 profile 的 node_modules,让 DSH 以 link: 依赖加载。
安装/更新后需要重启 DSH:宿主端(index.js)的改动只有重启才生效;纯前端改动重载页面即可。
配置
插件页 → 找到「输入框查错」这一行 → 打开配置页。表格各列:
| 列 | 说明 |
|---|---|
| 名称 | 自己认得出的名字;留空时用 URL 的域名 |
| URL | 服务商地址。填 https://api.example.com/v1 会自动补 /chat/completions;填完整地址则原样使用 |
| Key | API Key,页面只显示掩码。编辑时留空 = 不修改 |
| 模型 | 例如 deepseek-chat、gpt-4o-mini |
| 系统提示词 | 默认显示内置提示词。保持原样(或清空)= 跟随内置版本,内置提示词日后更新会自动生效;改过则存成你自己的版本 |
| max_tokens | 一次回答的输出上限,64~32000,留空用 2000。太小会把 JSON 截断 |
| 思考模式 | 先想再答,通常更准也更慢。来源不认这个参数(400/422)时会自动退回普通请求 |
| 操作 | 修改 / 删除 |
| 启用 | 关掉的来源不会被尝试 |
| 排序 | 拖动行首的 ⠿ 调整优先级 |
「添加 / 修改」弹窗里还有一个 测试连接 按钮:用内置的示例句(带一个典型同音错别字)当场跑一次,能连上会显示耗时和查到的词,方便区分「key 不对」「模型不对」「模型不听话」。
使用
- 输入框里正常写,写完点工具栏上的「查错」;
- 有错别字时会出现浮动卡片:
原文 → 建议+ 简短原因; - 点「替换」按当前文本重新定位并改掉(位置会随你之前的编辑重新计算);点「忽略」只从列表里去掉;
- 点「重新检查」用当前内容再跑一次;点「收起」清掉结果;
- 直接发送消息时结果会自动清空——那段文字已经不在输入框里了。
超过 6000 字只检查前 6000 字(卡片上会注明),一次最多返回 20 条。
模型第一次答「没有错别字」时,插件会自动换一种问法复查一次(空结果通常是小模型扫漏了,不是文本干净)。所以干净的文本也可能多花一次调用;复查也只接受「真查出东西」的答案,不会把原本的空结果变成报错。
数据与隐私
- API Key 只保存在本机:
$DSH_HOME/plugin-data/dsh-typo-check/settings.json(默认~/.dsh/...),不会写进工作区,也不会回传给页面。 - 请求只发往你自己填的 URL:草稿文本会作为用户消息发给你配置的那个服务商,除此之外不发往任何地方。不想让某段文字离开本机,就别对它点查错。
- 跨站请求会被拒绝:三个本地路由都会校验
Sec-Fetch-Site/Origin,其他网页无法偷偷改写你的来源列表(否则就能把已存的 Key 指向它自己的服务器)。 - 页面拿到的设置里只有
hasKey和掩码,没有明文 Key。 - 没有遥测、没有外部上报。
已知限制
- 高亮依赖 CSS Custom Highlight API(Chromium 内核的 DSH 桌面端可用)。
- 替换时如果目标范围里含有
@引用 chip,会拒绝并提示,避免把引用删掉。 - 模型返回的不是约定 JSON 时,会当作「没查出来」或报解析错误;换更听话的模型或调大
max_tokens通常能解决。 - 同一来源连续两次检查结果可能略有不一致(模型本身有随机性,尽管
temperature已固定为 0)。 - 设置页每次保存都会提交整张表,快速连点两次开关时以最后一次为准。
- 小模型对「拿不准」的处理差异很大;提示词偏「宁可多报一条」,因此偶尔会有过度报错,点「忽略」即可。
目录结构
dsh-plugin-typo-check/
├── package.json # bundle 描述:dsh.bundle.patch + dsh.client
├── cordis.patch.yml # 往 profile 里插入一行 dsh-typo-check
├── index.js # 宿主端:设置存取 + 调模型 + 定位错别字
├── client.js # 前端:工具栏按钮、标黄、结果卡片、设置页
├── locale/zh.json # 插件列表里的标题与描述
├── locale/en.json
├── icon.svg
└── README.md
开发
两端都是纯 ESM/CJS 形态的普通文件,没有构建步骤:
- 宿主端
index.js暴露name/inject/apply; - 前端
client.js通过window.__ModuleLoader__.load({ id, factory })注册插槽。
三个本地路由(同源、JSON):
| 方法 | 路径 | 用途 |
|---|---|---|
| GET / POST | /plugins-local/dsh-typo-check-settings |
读取 / 整体写入来源列表 |
| POST | /plugins-local/dsh-typo-check-check |
检查一段草稿 |
| POST | /plugins-local/dsh-typo-check-test |
用示例句测试单行配置 |
License
MIT
No comments yet. Be the first to write one.