DeepSeek Harness Hub
← 返回列表

studyzy/dsh-suggest-prompt

DeepSeek Harnessspec-screened在 GitHub 查看 ↗
⚠ 装前注意

dsh-plugin 根据AI回复给出建议的下一个提示词

基本兼容但装前注意:未发布到 npm registry,仅可从源码安装 · 最近上游提交 2026/8/21 · 已提供中文文档
综合分
33.5
GitHub 分
33.5
用户评分
★ Stars
5
周下载量
安装插件(需先安装 dsh CLI 引擎:npm install -g @deepseek-ai/dsh)
dsh plugin --profile web add studyzy/dsh-suggest-prompt
未发布到 npm registry,仅可从源码安装,改用 GitHub 源安装
数据截至 2026/9/19(元数据每日更新 · 实装验证按队列轮转,单条结论的验证时间见上方)
安装兼容性检查⚠ 装前注意

以下结论由程序自动检查 npm 包、engines 声明与入口文件得出,未做人工实机验证——能装不等于用着没问题。

npm 包@studyzy/dsh-suggest-prompt(未发布到 npm,仅可源码安装)
Node 引擎要求 ^22.19 || >=24 · 基线 Node 22.19 满足
dsh CLI 依赖未声明 dsh 版本约束
入口文件main/exports/bin 已声明

未发布到 npm registry,仅可从源码安装

验证方式:npm registry 存在性 + package.json 静态校验 · 最后验证 2026/9/19 21:00:20

依赖的 DSH / Cordis 模块
@deepseek-ai/schemastery@deepseek-ai/cordis@deepseek-ai/cordis-plugin-include@deepseek-ai/cordis-plugin-loader@deepseek-ai/dsh-client-locale@deepseek-ai/dsh-client-runtime@deepseek-ai/dsh-client-test-runtime@deepseek-ai/dsh-client-ui-conversation@deepseek-ai/dsh-client-ui-primitives@deepseek-ai/dsh-client-ui-settings@deepseek-ai/dsh-client-ui-settings-plugins@deepseek-ai/dsh-client-ui-slots
用户评分
还没有人投票,来当第一个
订阅周报,不错过优质插件更新
每周一封 · 高评分插件 + 新用户活动

README

dsh-suggest-prompt

MIT License
npm version

为 DeepSeek Harness 开发的「建议提示词」插件:每个 agent 回合完成后,通过一次有界的辅助 LLM 调用,在会话日志中写入一条建议的下一条提示词;Web 端把它渲染成输入框内部的浅色幽灵占位文字,按 Tab(默认)即可采纳进草稿(与 Claude Code 一致)。

想快速上手?直接看 使用说明(面向终端用户的操作指南)。

Read this in English · 中文文档

对于开发者 / 维护者:本仓库是单个 bundle 包(@studyzy/dsh-suggest-prompt)的权威源码,把宿主生成与浏览器渲染合并为一个可一键安装的 bundle:

| 包 | 作用 |
|---|---|
| @studyzy/dsh-suggest-prompt | 宿主插件(., ./invariant, ./types):在 turn/end(reason=completed)时生成建议,发布 suggestPrompt 会话投影。浏览器插件(./client):读取投影,渲染为输入框内部的浅色幽灵占位文字(inputActions.setDraft),按配置的快捷键填入草稿。 |

特性

一个自动「接话」助手:AI 答完后,它替你预测下一句该说什么——既省去反复输入,又不会打断你的思路。

- 默认轻量:不配置 provider / model 时继承主请求最近一次记录的路由,无需为建议单独选模型;需要时也可显式指定任意路由(例如本地 OpenAI 兼容网关)。
- 免思考、快速便宜:建议生成默认携带 reasoningEffort: off(DeepSeek 序列化为 thinking: disabled),不消耗推理预算;模型不支持该参数时自动去掉并重试一次。
- 界面配置模型路由:日常只需在 WebUI「设置 → 插件」的「建议提示词」卡片里选择建议生成的 provider / model(或跟随会话路由),保存后下一完成回合生效,无需手动改配置文件;~/.dsh/settings.yaml 由界面代写。
- 只发最后一轮:默认只把最后一轮的用户输入与 AI 最终回答发给建议模型(maxRecentTurns 默认为 1),中间的工具调用 / 推理过程一律不发送。
- 有界调用:字节 / 令牌 / 超时上限、转录长度预算、建议可见字符上限,全部可配置。
- 安全:转录在发送前脱敏(密钥形状被掩蔽);输出净化(控制序列、围栏、引号剥离、单行化)并做语义过滤(元文本、评价套话、助手口吻等被当作「无建议」丢弃)。
- 无建议是常态:模型回复为空或不合格时静默跳过,不报错、不写事件、不打扰。
- 免调用重显:删回空草稿会重新显示已持久化的建议,不再发新的模型请求。
- 快捷键可配:采纳快捷键默认 Tab,可在「建议提示词」设置卡片里按实际按键录制(如 Alt+Slash、Ctrl+Enter)。

效果预览

每个 agent 回合完成后,建议模型会在输入框里以浅色幽灵占位文字的形式显示一条预测,按 Tab 即可采纳进草稿:

输入框中的幽灵建议

安装

前置条件

- Node.js ^22.19 或 >=24、pnpm。
- 一个基于 deepseek-harness 的 dsh 部署(web profile),dsh ≥ 0.1.1-rc.1(0.1.1 变更了会话投影注册契约,本插件的宿主端按该契约适配;在 0.1.0 下投影不会同步到 Web 端)。浏览器端需要 conversation.input.overlay 槽位与 inputActions.setDraft(deepseek-harness 的标准 web 输入机均已提供)。

从 GitHub 安装(默认方式,一行命令)

本插件是一个单包 bundle:仓库根 @studyzy/dsh-suggest-prompt 声明了 dsh.bundle(自带 cordis.patch.yml),因此用 dsh plugin add 指向 GitHub 仓库即可安装,装完自动成为 profile 的一个 bundle 层,无需手动改配置文件。

从 GitHub 安装(推荐)
dsh plugin --profile web add git@github.com:studyzy/dsh-suggest-prompt.git

或 HTTPS
dsh plugin --profile web add https://github.com/studyzy/dsh-suggest-prompt.git

装完后重启正在运行的 dsh web 服务即可。安装后 profile 层叠顺序变为 dsh-base → dsh-web-app → @studyzy/dsh-suggest-prompt。

卸载:

dsh plugin --profile web remove @studyzy/dsh-suggest-prompt

git 安装的 pnpm ≥10 提示:git 托管的插件在安装时通过 prepare 脚本构建,pnpm ≥10 会拦截该脚本直到放行。若 add 报错,把 pnpm 打印的包键加进 ~/.dsh/profiles/web/pnpm-workspace.yaml 的 allowBuilds,再重跑 add。

本地源码安装(开发用)

dsh plugin --profile web add /path/to/dsh-suggest-prompt

通过 npm 安装(发布后)

dsh plugin --profile web add @studyzy/dsh-suggest-prompt
说明:无论哪种来源,装完都是同一个 bundle 层。日常建议模型的 provider / model 通过 WebUI 设置卡片配置(见下「配置」),不需要在安装时手动指定。

配置

配置分两层:日常的路由配置走界面,一次性的资源上限在 bundle 自带的补丁层提供(可在 profile 补丁层覆盖)。

通过 WebUI 界面配置建议模型(日常)

「设置 → 插件」会出现「建议提示词」卡片。这是日常配置建议模型的主入口,无需手动改配置文件:

- Provider / Model:从已安装的 provider 目录(内置 DeepSeek 与 pi-ai 各 provider)中选择建议生成使用的路由;选择「跟随会话路由」则不覆盖,继承主请求路由。
- Accept shortcut:点击输入框获得焦点后,直接按下想用的按键或组合键,按键即录制显示(先按 Alt 再按 Slash → Alt+Slash,Ctrl+Alt+X 显示为三个键),无需手动打字;保存后写入 ~/.dsh/settings.yaml。
- 编辑是暂存式的(带「未保存」标记与「放弃 / 保存」按钮),保存会由界面写入 ~/.dsh/settings.yaml 的 suggest-prompt 小节;保存后下一个完成回合生效,无需重启。
- 下拉只会列出目录中显式声明的模型;某 provider 未声明模型列表时,模型字段退化为自由文本输入。
- 依赖 dsh-settings 的设置能力:没有挂载设置服务的组装(如 headless)不显示此卡片,此时仍可在补丁层配置 provider / model / acceptKey。

建议提示词设置卡片

补丁层字段(安装即带默认,可覆盖)

以下字段由 bundle 自带的 cordis.patch.yml 提供默认值,通常无需改动;需要自定义时,在 profile 补丁层(~/.dsh/profiles/web/cordis.patch.yml)用 - insert: 覆盖同名 entry 的 config。provider / model / acceptKey 可在 WebUI 设置卡片中配置;其余字段不在 WebUI 设置卡片中:

| 字段 | 含义 | 默认值 |
|---|---|---|
| maxInputBytes | 最终框架化用户提示的最大 UTF-8 字节数 | 4096 |
| maxOutputTokens | 建议生成输出令牌上限 | 512 |
| timeoutMs | 辅助请求端到端截止时间(毫秒) | 60000 |
| maxRecentTurns | 转录尾部保留的最近完成回合数 | 1(只取最后一轮的用户输入 + AI 最终回答) |
| maxTranscriptChars | 转录字符预算 | 12000 |
| maxSuggestionChars | 建议的可见字符上限 | 240 |
| provider / model | 各自独立覆盖主请求路由的对应字段;省略的字段自动继承主请求路由 | 继承(也可经界面配置) |
| acceptKey | 采纳建议的输入框快捷键 | Tab(界面可录制为 Alt+Slash、Ctrl+Enter 等) |

maxOutputTokens 提示:建议生成默认关闭思考(reasoningEffort: off),推理不消耗输出预算;但对无法关闭思考的模型(如部分 pi-ai 路由)会降级重试,此时思考仍会消耗预算——maxOutputTokens 偏小时,流会在输出建议文本之前就以 max-tokens 结束。这类模型请留足预算(例如 512)。

工作方式

- 宿主在 turn/end(reason=completed)时触发生成;按会话 + 回合去重,下一个完成回合会中止上一个在途生成。
- 建议写入会话日志的 suggest-prompt/suggested 事件,suggestPrompt 投影把它暴露给 Web 端。
- 幽灵文字只在满足以下条件时显示:建议对应最新完成回合、agent 空闲、草稿为空;键入即隐藏,删回空草稿重新显示。
- 按 acceptKey(默认 Tab)把建议填入草稿(可编辑后再发送);焦点不在输入框或处于 IME 组合输入时不触发,Tab 也只在显示幽灵文字时才被拦截(否则保持默认焦点行为)。

模型体验

- 系统提示词:把模型限定为「以用户口吻预测下一条提示词」,禁止生成内容或元文本,给出具体正反例;回复语言跟随会话(最后一条用户消息含 CJK → 简体中文,否则 English)。
- 模型看到的输入:默认只有最后一轮的 [User Message] / [Assistant Response] 带标签块(已脱敏、受 maxTranscriptChars 约束)。
- 请求前记录:确切的框架化输入与系统提示在派发前写入 suggest-prompt/request 事件,满足「模型可见 ⟺ 日志可重建」。
- 免思考:辅助请求默认携带 reasoningEffort: off(DeepSeek 序列化为 thinking: disabled),追求快速与低成本;模型不支持时自动去掉该字段重试一次(拒绝发生在任何网络 I/O 之前,几乎无额外开销)。
- 成本:每个完成回合至多一次辅助请求,受 maxInputBytes / maxOutputTokens 约束;主 agent 请求不增加任何 token。

安全

- 转录脱敏:AWS AKIA…、OpenAI sk-…、GitHub ghp_/gho_/ghu_、Slack xox-…、JWT、Stripe rk_… 等密钥形状在发送前被掩蔽为占位标签。
- 输出净化:ANSI/OSC/CSI/DCS 序列、C0/C1 控制符、双向覆盖符、孤立代理项被剥离;引号与代码围栏被去除;压缩为单行并截断到 maxSuggestionChars。
- 语义过滤:元文本("no suggestion"、"stay silent")、错误回显、评价套话("thanks"、"looks good"、谢谢、不错)、助手口吻("Let me…"、"I'll…"、我来、我帮你)、多句 / 过长回复、孤立单词会被当作「无建议」丢弃,而不是显示。

已知限制

- 每个完成回合都会生成(与输入框是否已有内容无关),幽灵文字只在草稿为空时显示。
- 被中止(取代)的生成不会为较早回合留下建议。
- 空回复或被过滤的回复 = 该回合无建议:不写 suggest-prompt/suggested 事件,投影保持 null,也不记录警告。
- 投影保留最后一条建议:重新打开旧会话会显示其最终建议,且不发起新的模型调用。
- 建议模型的路由与预算由部署配置决定;无法关闭思考的模型(如部分 pi-ai 路由)会回退为模型默认的推理行为,想获得最快的建议体验,建议选支持关闭思考的路由(如内置 DeepSeek)。

开发

pnpm install
pnpm build      # host tsc + client tsdown bundle
pnpm test       # vitest
pnpm typecheck
pnpm test:e2e       # browser e2e against an isolated dsh web (needs DEEPSEEK_API_KEY)
pnpm test:e2e:local # local e2e against your real ~/.dsh (macOS: visible browser)

E2E(CI):pnpm test:e2e 会起一个隔离 $DSH_HOME,用 dsh plugin add 安装本插件、dsh web 起服务,再用 Playwright 走 WebUI(配置 DeepSeek Key、把建议模型设为 DeepSeek Flash),输入一道数学题后断言输入框出现下一条建议的幽灵文字。需要环境变量 DEEPSEEK_API_KEY(无则跳过)与全局 dsh;CI 里由 DEEPSEEK_API_KEY secret 注入。默认 pnpm test 不含 e2e。

E2E(本地):pnpm test:e2e:local 复用你的真实 ~/.dsh(不装 dsh、不跑 onboarding、不连工作区——本机已就绪),把当前源码 link 进本地 web profile(dsh plugin add),起 dsh web 后用 Playwright 把「建议提示词」模型设为 DeepSeek Flash(ccr / hai/DeepSeek-V4-Flash),输入「出一道小学数学题给我」并断言幽灵建议出现。macOS 下弹出可见浏览器,Linux 下 headless。会写真实 ~/.dsh(suggest-prompt 模型与 profile 依赖来源)——仅限本地开发验证,不入 CI。

安装说明:本仓库依赖已发布的 @deepseek-ai/ 包(deepseek-harness 工作区)。上游少数内部包(@deepseek-ai/dsh-compact、@deepseek-ai/dsh-type-meta、@deepseek-ai/dsh-environment)尚未出现在 npm registry,本仓库通过根 package.json 的 pnpm.overrides 把它们映射到本地 stubs/ 空包;同时用一条 @deepseek-ai/dsh-: 0.1.1-rc.1 override 把整个 dsh 依赖集统一到当前插件所适配的 0.1.1-rc.1(与本仓库针对 0.1.1 投影契约的适配保持一致),因此 pnpm install 可直接成功;等 registry 补齐、上游稳定后,这两处 overrides 与 stubs/ 均可清理。完整测试矩阵在 harness monorepo 内运行;本仓库是单 bundle 包的权威源码副本。pnpm build 产出宿主 ESM(lib/{index,invariant}.js)、浏览器 bundle(lib/client.js)与 lib/types/ 声明。

prepare 脚本:package.json 的 prepare 脚本会在 pnpm install(含 dsh plugin add  的安装流程)时自动运行 pnpm build 现场构建 lib/,产物不入库。因此源码改动后无需手动构建即可被本地 dsh 加载;从 Git 安装也总能拿到完整产物(含类型声明)。

许可

MIT

dsh-suggest-prompt

阅读中文版 · English

Suggested-next-prompt plugin for the DeepSeek Harness. After every completed agent turn, a bounded auxiliary LLM call writes one suggested next prompt into the session log; the web side renders it as ghost placeholder text inside the composer — press Tab (default) to adopt it into the draft (the Claude Code behavior).

For developers / maintainers: this repository is the authoritative source of record for a single bundle package (@studyzy/dsh-suggest-prompt) that merges the host generation and the browser rendering into one one-command-installable bundle:

| Package | Role |
|---|---|
| @studyzy/dsh-suggest-prompt | 宿主插件(.、./invariant、./types):在 turn/end(原因 completed)时生成建议,并发布 suggestPrompt 会话投影。浏览器插件(./client):读取该投影,将建议渲染为输入框内的幽灵占位文本(inputActions.setDraft),并在配置的快捷键下填充草稿。 |

功能特性

一个自动的“下一句”伴侣:在 AI 回答之后,它会预测你接下来会说什么——省去重复输入,同时不打断你的流程。

- 默认轻量:在没有 provider / model 的情况下,建议会继承最近一次记录的主请求的路由——无需仅为建议而选择模型;显式设置它们即可路由到任意位置(例如本地 OpenAI 兼容网关)。
- 无思考,快速且低成本:辅助调用默认携带 reasoningEffort: off(DeepSeek 将其序列化为 thinking: disabled),因此不会在思维链上消耗预算;拒绝 off 的模型会在不带该字段的情况下重试一次。
- 在 WebUI 中配置路由:日常使用中,可在 设置 → 插件 下的“建议提示词”卡片中选择建议的提供商/模型(或保持“跟随会话路由”);保存后会在下一个完成的回合生效——无需手动编辑配置文件。~/.dsh/settings.yaml 由 UI 为你写入。
- 仅最后一轮:默认情况下,只有最后一个已完成回合的用户输入和助手最终回答会发送给建议模型(maxRecentTurns 默认为 1);中间的工具调用 / 推理永远不会包含在内。
- 有界:字节 / token / 超时上限、转录预算,以及对建议的可见字符数上限——均可配置。
- 安全:转录内容在构建提示前会进行敏感信息脱敏;输出会经过清理(控制序列、围栏、引号被剥离,单行)和语义过滤(元文本、评价性填充语、助手口吻的措辞会被丢弃为“无建议”)。
- 静默无建议:空或被拒绝的模型回复会被安静地跳过——没有错误、没有事件、没有噪音。
- 无需调用即可重新武装:删除内容回到空草稿时,会重新显示已持久化的建议,而不会发起新的模型请求。
- 可配置快捷键:采纳快捷键通过 acceptKey 设置(默认 Tab),并可从“建议提示词”设置卡片中录制(例如 Alt+Slash、Ctrl+Enter)。

预览

在每个已完成的代理回合之后,建议模型会将预测的下一句提示渲染为输入框内的浅色幽灵占位文本。按 Tab 将其采纳到草稿中:

输入框中的幽灵建议

安装

前置条件

- Node.js ^22.19 或 >=24,pnpm。
- 基于 DeepSeek Harness(web profile)构建的 dsh 部署,dsh ≥ 0.1.1-rc.1(0.1.1 更改了 session-projection 注册契约;本插件的宿主端已适配——在 0.1.0 上投影不会同步到 web 侧)。浏览器端需要 conversation.input.overlay 插槽和 inputActions.setDraft——两者都是 deepseek-harness web 输入机中的标准配置。

从 GitHub 安装(默认,一条命令)

这是一个单包 bundle:仓库根目录 @studyzy/dsh-suggest-prompt 声明了 dsh.bundle(自带 cordis.patch.yml),因此指向该 GitHub 仓库的 dsh plugin add 会将其作为 profile 的一个 bundle 层安装——无需手动编辑配置文件。

从 GitHub 安装(推荐)
dsh plugin --profile web add git@github.com:studyzy/dsh-suggest-prompt.git

或使用 HTTPS
dsh plugin --profile web add https://github.com:studyzy/dsh-suggest-prompt.git

然后重启正在运行的 dsh web 服务。安装后 profile 分层变为 dsh-base → dsh-web-app → @studyzy/dsh-suggest-prompt。

卸载:

dsh plugin --profile web remove @studyzy/dsh-suggest-prompt

pnpm ≥10 git 注意事项:git 托管的插件在安装时通过其 prepare 脚本构建,pnpm 会阻止该脚本直到被允许。如果 add 失败,请将 pnpm 打印的确切键添加到 ~/.dsh/profiles/web/pnpm-workspace.yaml 中的 allowBuilds,然后重新运行 add。

本地源码(开发)

dsh plugin --profile web add /path/to/dsh-suggest-prompt

从 npm 安装(发布后)

dsh plugin --profile web add @studyzy/dsh-suggest-prompt

注意:每种来源最终都会成为同一个 bundle 层。日常使用的建议 provider/model 通过 WebUI 设置卡片配置(见下方配置)——安装时无需设置任何内容。

配置

配置分为两部分:日常路由在 UI 中设置,而一次性资源上限随 bundle 的 patch 层附带合理默认值(可在你的 profile patch 层中覆盖)。

在 WebUI 中配置建议模型(日常)

设置 → 插件下会出现一个“建议提示词”卡片。这是选择建议路由的主要入口——无需手动编辑配置文件:

- Provider / Model:从已安装的 provider 目录(内置 DeepSeek + pi-ai 路由)中选择辅助调用使用的路由;选择“跟随会话路由”则保持主请求路由。
- 接受快捷键:聚焦该字段,然后按下你想要的按键或组合键——按下的键会被记录并显示(先按 Alt 再按 Slash → Alt+Slash;像 Ctrl+Alt+X 这样的三键组合会显示为三个键),无需手动输入。
- 编辑会被暂存(带有“未保存”标记以及放弃 / 保存按钮);保存会为你写入 ~/.dsh/settings.yaml 的 suggest-prompt 部分,并在下一个完成的回合生效——无需重启。
- 下拉菜单只列出显式声明的模型;未声明模型列表的提供方会将模型字段降级为自由文本输入。
- 这依赖于 dsh-settings 能力:没有设置服务的程序集(例如无头模式)不会显示该卡片,并继续在补丁层中使用 provider / model / acceptKey。

建议提示设置卡片

补丁层字段(默认值随 bundle 提供,可覆盖)

以下字段由 bundle 自带的 cordis.patch.yml 提供默认值,通常无需更改;如需自定义,请通过你的 profile 补丁层(~/.dsh/profiles/web/cordis.patch.yml)中的 - insert: 覆盖同一条目的 config。provider / model / acceptKey 可从 WebUI 卡片编辑;其余字段不在 WebUI 设置卡片中:

| 字段 | 含义 | 默认值 |
|---|---|---|
| maxInputBytes | 最终成帧的用户提示中的最大 UTF-8 字节数 | 4096 |
| maxOutputTokens | 建议输出 token 上限 | 512 |
| timeoutMs | 端到端辅助请求截止时间(毫秒) | 60000 |
| maxRecentTurns | 转录尾部最多保留这么多最近完成的轮次 | 1(仅最后一轮的用户输入 + 助手最终回答) |
| maxTranscriptChars | 转录字符预算 | 12000 |
| maxSuggestionChars | 建议的可见字符上限 | 240 |
| provider / model | 各自独立覆盖主请求路由中对应的成员;省略的成员继承主路由 | 继承(也可从 WebUI 编辑) |
| acceptKey | 采纳已显示建议的编辑器快捷键 | Tab(可在 UI 中录制为 Alt+Slash、Ctrl+Enter 等) |

关于 maxOutputTokens:建议生成默认禁用思考(reasoningEffort: off),因此推理不会消耗输出预算;但无法关闭思考的模型(某些 pi-ai 路由)会回退到重试,此时思考仍会消耗预算——较小的 maxOutputTokens 会在产生任何建议文本之前就以 max-tokens 结束流。对于此类模型,请留出充裕的预算(例如 512)。

工作原理

- 宿主在 turn/end(原因 completed)时触发生成,按会话和轮次去重;下一个完成的轮次会中止进行中的生成。
- 建议作为 suggest-prompt/suggested 事件追加到会话日志中,suggestPrompt 投影将其暴露给 Web 端。
- 仅当建议回答的是最新完成的轮次、代理处于空闲状态且草稿为空时,才会显示幽灵文本;输入会隐藏它,删除回到空草稿会重新显示它。
- 按下 acceptKey(默认 Tab)会填充草稿(可编辑,不发送)。当焦点在编辑器之外或处于输入法组合状态时会被忽略;仅在显示幽灵文本时才会拦截 Tab(否则它保持默认的焦点行为)。

模型体验
- 系统提示词:将模型约束为以用户自己的语气预测用户的下一条提示词,禁止生成内容或元文本,并给出具体示例和反例;回复语言跟随对话(当最后一条用户消息包含中日韩字符时为 简体中文,否则为 English)。
- 模型看到的内容:默认仅最后一轮,以带标签的 [User Message] / [Assistant Response] 块形式呈现(已脱敏,受 maxTranscriptChars 限制)。
- 派发前日志记录:确切的框架化输入和系统提示词在派发前记录到 suggest-prompt/request 事件中,满足“模型可见 ⟺ 已记录”的不变量。
- 无思考:辅助请求默认携带 reasoningEffort: off(DeepSeek 将其序列化为 thinking: disabled)以提升速度并降低成本;拒绝 off 的模型会在不带该字段的情况下重试一次(拒绝发生在任何网络 I/O 之前,因此重试几乎无成本)。
- 成本:每个完成的轮次最多一个辅助请求,受 maxInputBytes / maxOutputTokens 限制;主 agent 请求增加零 token。

安全

- 对话记录脱敏:AWS AKIA…、OpenAI sk-…、GitHub ghp_/gho_/ghu_、Slack xox-…、JWT 以及 Stripe rk_… 密钥形态在对话记录到达模型之前被掩码。
- 输出净化:ANSI/OSC/CSI/DCS 序列、C0/C1 控制字符、双向覆盖字符以及孤立代理项被剥离;引号和代码围栏被移除;文本被折叠为一行并截断至 maxSuggestionChars。
- 语义过滤:元文本(“无建议”、“保持沉默”)、错误回显、评价性填充语(“谢谢”、“看起来不错”)、助手语气措辞(“让我……”、“我会……”)、多句或过长的回复,以及零散单词会被丢弃为“无建议”,而不是显示出来。

已知限制

- 每个完成的轮次后都会运行生成,无论输入框是否已有文本;幽灵文本仅在草稿为空时显示。
- 被取代(中止)的生成不会为较早的轮次留下建议。
- 空回复或被过滤的回复意味着该轮次“无建议”:不会写入 suggest-prompt/suggested 事件,投影保持为 null,也不会记录警告。
- 投影会持久化最后一条建议,因此重新打开旧会话时会显示其最终建议,而无需新的模型调用。
- 建议路由和预算是部署配置;无法关闭思考的模型(某些 pi-ai 路由)会回退到其默认推理行为——为了获得最快的建议,请选择支持 off 的路由(例如内置的 DeepSeek)。

开发

pnpm install
pnpm build      # host tsc + client tsdown bundle
pnpm test       # vitest
pnpm typecheck
pnpm test:e2e       # browser e2e against an isolated dsh web (needs DEEPSEEK_API_KEY)
pnpm test:e2e:local # local e2e against your real ~/.dsh (macOS: visible browser)
E2E(CI):pnpm test:e2e 会启动一个隔离的 $DSH_HOME,通过 dsh plugin add 安装此 bundle,启动 dsh web,并用 Playwright 驱动 WebUI(存储 DeepSeek key,将建议模型设置为 DeepSeek Flash,发送一个数学问题,然后断言出现幽灵下一提示建议)。它需要 DEEPSEEK_API_KEY(否则跳过)以及全局安装的 dsh;CI 以 secret 形式注入该 key。默认的 pnpm test 不包含 e2e。

E2E(本地):pnpm test:e2e:local 复用你真实的 ~/.dsh(无需安装 dsh,无需 onboarding,无需选择 workspace——你的机器已经配置好了)。它通过 dsh plugin add 将当前源码链接到本地 web profile,启动 dsh web,然后驱动 Playwright 将“建议提示词”建议模型设置为 DeepSeek Flash(ccr / hai/DeepSeek-V4-Flash),发送“出一道小学数学题给我”,并断言出现幽灵建议。在 macOS 上浏览器以有头模式运行(可观察其驱动 UI);其他平台为无头模式。它会写入你真实的 ~/.dsh(建议提示词模型以及 profile 的依赖源)——仅用于本地开发,不属于 CI。

安装注意事项:此仓库依赖已发布的 @deepseek-ai/ 包(DeepSeek Harness workspace)。已发布的 dsh- 版本所引用的少量内部包尚未在 npm registry 上(@deepseek-ai/dsh-compact、@deepseek-ai/dsh-type-meta、@deepseek-ai/dsh-environment);根 package.json 的 pnpm.overrides 将它们映射到本地空的 stubs/ 包。第二个 override(@deepseek-ai/dsh-*: 0.1.1-rc.1)将整个 dsh 依赖集固定到此插件所针对的 0.1.1-rc.1 版本(与其 projection-contract 适配保持一致),因此 pnpm install 开箱即用——待 registry 补全且上游稳定后,移除这两个 override 和 stubs/。完整的测试矩阵在 harness monorepo 内运行;此仓库是单个 bundle 包的 source-of-record 副本。pnpm build 会生成宿主 ESM(lib/{index,invariant}.js)、浏览器 bundle(lib/client.js)以及 lib/types/ 声明。

prepare 脚本:package.json 的 prepare 会在 pnpm install 时(包括 dsh plugin add )运行 pnpm build,当场构建 lib/。构建产物从不提交,因此源码编辑无需手动构建即可对本地 dsh 加载生效,且 Git 安装始终会收到完整的产物集(包括类型)。

License

MIT

上游仓库有新提交时邮件通知你(每天最多一封,无更新不打扰),随时一键退订。

同作者(studyzy)的其他插件

💬 加入 DPharness 群聊

插件用法、部署报错、新插件第一时间同步——群里问,比一个人翻文档快。

点击加入 QQ 群
DPharness 群聊二维码,手机 QQ 扫码进群
扫码进群