dsh-prompt-suggestion
给 DSH (DeepSeek Harness) 用的输入预测插件:每轮回复结束后,在输入框里用灰色 ghost 文本提示你下一句可能想说什么。按 Tab 或 → 填入草稿,只填入,不发送。
功能
- 回合结束后预测:不做逐字补全,只在助手回复完成、输入框为空时请求一次。
- 使用真实上下文:读取当前 Session 最近的若干条消息;工具结果只保留缩写,控制成本。
- 可配置:启用开关、预测模型、上下文消息条数、系统提示词。
- 不污染会话:预测只存在于界面,不写入 Session 日志,也不注入模型上下文。
- 键盘优先:
Tab / → 采纳,Esc 忽略;开始输入或输入法组合时自动消失。
环境要求
- DSH Desktop,或
dsh web(旧版本写作 dsh --profile web)
- 从 GitHub 安装时,Host 所在机器需要能访问 GitHub
- 一个可用的模型 provider(默认跟随当前会话)
安装
插件是标准 DSH bundle(dsh.bundle.patch + dsh.client),已经在仓库里带了构建好的 client.js,不需要先发布到 npm,直接在 DSH 里从 GitHub 地址安装即可。
从侧边栏安装(推荐)
-
打开 DSH,在左侧侧边栏点 插件。
-
点 添加插件。
-
在输入框里填仓库地址:
https://github.com/yepyeel/dsh-prompt-suggestion
也可以填 pnpm 的 GitHub 简写:github:yepyeel/dsh-prompt-suggestion。
-
点 安装,等 pnpm 执行完成。
-
按提示点 立即启用。如果安装结果提示需要重启 DSH,重启后再用。
插件安装到当前 profile,安装完成后默认启用。
Git 地址不经过 npm 安装源,需要 Host 直接访问 GitHub(或配置代理)。如果提示「无法访问 GitHub」,先处理网络后重试。这个插件没有发布到 npm,所以不能改填包名。
DSH Desktop
直接按上面的步骤在桌面 App 里安装:
- Desktop 自带 Node.js 和 pnpm,不需要另外装 pnpm。
- 插件由桌面 App 管理,装在 Desktop 的 profile 里。
- Desktop profile 不能用
dsh plugin 命令行管理;安装、卸载和更新都走侧边栏的插件页。
dsh web
在运行 DSH 的机器上启动 Web:
dsh web
打开它输出的地址,然后同样在侧边栏 插件 → 添加插件 里填 GitHub 地址。
- Host 需要能找到
pnpm。先运行 pnpm -v 确认;没有的话先 npm install -g pnpm(或 corepack enable)。
- 安装发生在运行
dsh web 的机器上,不是打开浏览器的机器。远程访问时,pnpm 和 GitHub 网络都要在那台 Host 上可用。
- 插件装在 web profile 里。Desktop 和 web 的 profile 相互独立,两边需要分别安装。
从本地目录安装(开发)
git clone https://github.com/yepyeel/dsh-prompt-suggestion.git
cd dsh-prompt-suggestion
pnpm install
pnpm build
然后在 插件 → 添加插件 里填目录的绝对路径(例如 /path/to/dsh-prompt-suggestion)。本地目录会以 link: 方式挂载;改动文件后,在插件列表里停用再启用即可生效,Host 改动需要重启 DSH。
固定版本
安装时在地址后带上 tag,升级时再显式换掉:
https://github.com/yepyeel/dsh-prompt-suggestion#v0.1.0
或 github:yepyeel/dsh-prompt-suggestion#v0.1.0。当前版本见 Releases。
更新
插件没有内置的自动更新,第三方插件在 DSH 里的升级方式就是「卸载 + 重新安装」。
从 GitHub 安装的用户
- 在 插件 页找到
dsh-prompt-suggestion,卸载它。
- 点 添加插件,重新填同一个 GitHub 地址并安装。
- 如果提示需要重启 DSH,重启后生效。
重新安装会重新解析 Git 地址并拿到最新提交;设置覆盖行按插件 id 记录,不会因为重装丢失。Desktop 和 dsh web 使用各自的 profile,更新时也要分别操作。
本地 link 安装的用户
git pull
pnpm install
pnpm build
然后在插件列表里停用再启用;Host 改动需要重启 DSH。
使用
- 正常发一条消息。
- 助手回复结束、输入框为空时,输入框里会出现灰色预测。
- 按
Tab 或 → 填入草稿,确认后自己按 Enter 发送;Esc 忽略。
设置
设置 → 输入预测:
| 项 | 说明 |
|---|
| 启用输入预测 | 关闭后不再请求预测,输入框不会出现提示 |
| 预测模型 | 默认跟随当前会话;也可以固定一个更便宜、更快的模型 |
| 上下文消息条数 | 送给模型的历史消息条数,2–64,默认 16 |
| 系统提示词 | 决定预测的语气、长度和方向;「恢复默认」会清除自定义 |
设置写入 profile 的 patch 覆盖行。字段声明为 volatile,保存后立即生效,不需要重启。
实现概览
- Host:
POST /prompt-suggestion/suggest 读取 Session、裁剪上下文、调用 ctx.llm.stream();GET /prompt-suggestion/models 汇总可用模型。
- Client:源码按职责拆在
src/client/(ghost/、settings/、dsh/ 等),由 esbuild 打成 DSH 加载的 classic bundle client.js;在 conversation.input.overlay 中渲染 ghost,按输入框原生 placeholder 的矩形与字体对齐;采纳走 inputActions.captureInsertion() + insertText()。
- 回合边界:只接受以
turn/end(completed) 收尾的会话;error / aborted 不预测。
- 失败降级:超时、限流、解析失败一律静默返回空,不影响正常输入。
项目结构
src/
├── host/ # DSH 注册、HTTP、预测规则、模型目录
├── shared/ # 接口契约、设置默认值、超时预算
└── client/
├── ghost/ # 预测状态控制、React hook、展示
├── settings/ # 设置逻辑与 TSX 页面
├── dsh/ # 宿主接口类型与 DOM 兼容适配
├── components/ # 通用界面组件
├── styles/ # 插件 CSS
└── index.ts # slots / locale / configForms 注册
scripts/ # 双端构建、安装包验证
tests/ # 规则、HTTP、异步状态与 DOM 交互测试
index.js # 生成的 Host ESM bundle
client.js # 生成的 Client classic bundle
index.js 和 client.js 都由 src/ 构建生成并提交到 Git。DSH 和从 GitHub 安装的用户直接加载这两个文件,不需要 TypeScript 或开发工具。运行时依赖仍只有 @deepseek-ai/schemastery;React 由 DSH 提供。
当前架构、生命周期和兼容约束见 DESIGN.md。
已知限制
- 一次只给一条候选;不支持点击采纳(点击输入区用于定位光标)。
- ghost 的可见行数取决于输入框可用高度,超长预测会被裁剪。
- 没有埋点,采纳率需要手动观察或自行加日志。
- 每次预测会多消耗一次模型调用(上下文约 3–5k token)。
开发
要求 Node.js 22.12+(推荐 .node-version 的 Node.js 24)和 pnpm 11.25.0。pnpm 版本由 packageManager 固定。
pnpm install --frozen-lockfile
pnpm build
pnpm check
| 命令 | 用途 |
|---|
pnpm dev | 监听 Host / Client 源码并重新生成两个 bundle |
pnpm typecheck | TypeScript 严格类型检查 |
pnpm lint / pnpm lint:fix | Biome 静态检查与格式化 |
pnpm test / pnpm test:watch | Vitest 行为测试与交互测试 |
pnpm build:check | 在内存中重建并核对产物,不改写文件 |
pnpm test:package | 打包、只安装运行时依赖,验证 Host 导出及 Client 加载协议 |
pnpm check | 顺序运行类型、静态检查、测试、产物一致性及安装包验证 |
源码在 src/;不要直接编辑根目录的生成文件。改动后运行 pnpm build 并提交两端产物。GitHub Actions 在 Node.js 22 / 24 上执行冻结安装与 pnpm check。
- Host 改动:构建后重启 DSH,或在插件列表停用再启用。
- Client 改动:构建后重新启用插件;必要时刷新页面。
pnpm dev 负责重建,宿主重载仍由 DSH 管理。
- 单元和 DOM 测试使用受控的模型与宿主接口,不需要 API key;
test:package 需要 npm registry 访问以安装运行时依赖。
- 真实模型预测、宿主界面的明暗主题和视觉对齐仍需在 DSH 中人工验收;DOM 测试不能替代这些检查。
贡献流程与 PR 规范见 CONTRIBUTING.md。
License
MIT