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

输入预测补全 dingchenhui0618-arch/dsh-tab-complete

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

在输入框里预测下一句,按 Tab 一键填入

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

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

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

状态速览

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

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

验证判据与等级说明 →
社区实装还没有人打卡 · 装过的第一个就是你
安全扫描自动 · 静态分析源码
v2.7.0
🔵 扫描:含敏感能力尚无人工评估
展开查看扫描说明与证据 ↓

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

读写/删除本地文件发起外部网络请求
查看扫描证据(共 14 处,展示前 14 条)
  • 读取本地文件
    lib/index.js:57
    const raw = JSON.parse(readFileSync(stylePath, 'utf8'))
  • 写入本地文件
    lib/index.js:175
    writeFileSync(stylePath, JSON.stringify(examples), 'utf8')
  • 读取本地文件
    lib/index.js:276
    entries = readdirSync(cwd, { withFileTypes: true }).filter(function (entry) {
  • 写入本地文件
    lib/index.js:639
    writeFileSync(stylePath, '[]', 'utf8')
  • 发起网络请求
    lib/client.js:38
    fetch(API + '/style', {
  • 发起网络请求
    lib/client.js:248
    fetch(API + '/state', { headers: { accept: 'application/json' } })
  • 发起网络请求
    lib/client.js:332
    fetch(API + '/suggest', {
  • 发起网络请求
    src/client.cjs:32
    fetch(API + '/style', {
  • 发起网络请求
    src/client.cjs:242
    fetch(API + '/state', { headers: { accept: 'application/json' } })
  • 发起网络请求
    src/client.cjs:326
    fetch(API + '/suggest', {
  • 读取本地文件
    src/host.js:57
    const raw = JSON.parse(readFileSync(stylePath, 'utf8'))
  • 写入本地文件
    src/host.js:175
    writeFileSync(stylePath, JSON.stringify(examples), 'utf8')
  • 读取本地文件
    src/host.js:276
    entries = readdirSync(cwd, { withFileTypes: true }).filter(function (entry) {
  • 写入本地文件
    src/host.js:639
    writeFileSync(stylePath, '[]', 'utf8')
扫描于 2026/11/3(1 天前) · 范围 入口闭包 + 发布文件清单 · 来源 GitHub 仓库

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

给这个插件打分还没有人投票↓
用户评分
还没有人投票,来当第一个

Tab 补全:用模型预测你在 DeepSeek Harness 输入框里接下来要打的字,灰色幽灵文本 + Tab 一键填入(Codex Pro 那套输入预测的 DSH 版)

README

由 DeepSeek 最新模型翻译生成
dsh-tab-complete 在 DeepSeek Harness 的输入框里,用当前对话和你已经打的字,预测你接下来要输入的内容:灰色幽灵文本贴在光标后面,按 Tab 一键填入,按 Esc 忽略。 这是 Codex Pro「下一步输入预测」的 DeepSeek Harness 版本。区别只有一处:预测走你自己的模型路由,不吃订阅额度。 用着还行的话,点个 ⭐ 就够了——插件市场的「搜插件」按 GitHub star 排序,star 是这个插件能被人翻到的唯一杠杆。 输入到一半时的幽灵文本 它什么时候会给建议 | 时机 | 行为 | | 你在输入框里打字 | 停手约 0.28 秒后,把这句话补完 | | 你刚发完一条消息、输入框是空的 | 基于这段对话,预测你的下一句(用户口吻,不是助手口吻) | | 候选是助手刚说过的话的复述 | 直接丢弃,不显示 | | 候选是「先查日志,再跑测试」这类执行步骤 | 直接丢弃——那是助手该干的事,不是你会说的话 | | 你在用输入法(IME)拼字 | 不预测,避免和候选栏打架 | | 输入框以 / 开头 | 不预测,那是命令面板 | 给的是整句而不是半句:一次 Tab 就能直接发出去,不需要你接着往下想。对话里的文件、函数、版本号会被沿用;模型编不存在的路径(src/plugins、index.ts 这种)会被提示词按住。
展开完整文档(README 剩余 1 节)
dsh-tab-complete

在 DeepSeek Harness 的输入框里,用当前对话和你已经打的字,预测你接下来要输入的内容:灰色幽灵文本贴在光标后面,按 Tab 一键填入,按 Esc 忽略。

这是 Codex Pro「下一步输入预测」的 DeepSeek Harness 版本。区别只有一处:预测走你自己的模型路由,不吃订阅额度。

用着还行的话,点个 ⭐ 就够了——插件市场的「搜插件」按 GitHub star 排序,star 是这个插件能被人翻到的唯一杠杆。

输入到一半时的幽灵文本

它什么时候会给建议

| 时机 | 行为 |
| 你在输入框里打字 | 停手约 0.28 秒后,把这句话补完 |
| 你刚发完一条消息、输入框是空的 | 基于这段对话,预测你的下一句(用户口吻,不是助手口吻) |
| 候选是助手刚说过的话的复述 | 直接丢弃,不显示 |
| 候选是「先查日志,再跑测试」这类执行步骤 | 直接丢弃——那是助手该干的事,不是你会说的话 |
| 你在用输入法(IME)拼字 | 不预测,避免和候选栏打架 |
| 输入框以 / 开头 | 不预测,那是命令面板 |

给的是整句而不是半句:一次 Tab 就能直接发出去,不需要你接着往下想。对话里的文件、函数、版本号会被沿用;模型编不存在的路径(src/plugins、index.ts 这种)会被提示词按住。

只把「你和助手说过的话」喂给模型——技能目录、运行时上下文这类框架注入会被 isScaffolding() 挡掉。这很关键:它们一旦混进去就会吃光上下文预算,让预测变成对着技能列表瞎猜。

它会越用越像你。 每次你按 Tab 收下建议,那句话就被记进 ~/.dsh/tab-complete-style.json(最多 40 条,只在本机),之后作为「他以前收下过的写法」参与提示词。看不顺眼可以清空:

curl.exe "http://127.0.0.1:3080/dsh-tab-complete/style" # 看记了什么 curl.exe -X POST "http://127.0.0.1:3080/dsh-tab-complete/style" -d '{"clear":true}' # 清空

发完一句话后预测你的下一句

按 Tab 之后:幽灵文本变成真正的文字,光标停在末尾,接着就能改。

按 Tab 后的结果

安装

插件是标准的 DSH bundle:宿主半边注册一条 HTTP 路由,客户端半边挂在 conversation.input.overlay 插槽上。

在 profile 目录(~/.dsh/profiles/<profile>/)里加两处:

// package.json
{
"dependencies": {
"dsh-tab-complete": "link:D:/Projects/dsh-tab-complete" // 或 npm 版本号 },
"dsh": {
"profile": {
"bundles": ["...", "dsh-tab-complete"]
}
}
}

然后安装并重启 Harness:

cd $env:USERPROFILE\.dsh\profiles\desktop
pnpm install

重启后窗口里的输入框就有这个能力;已经在跑的会话不会丢,会话记录是落盘的。

配置

宿主侧配置写在 bundle 的 cordis.patch.yml 对应条目下,全部可省略:

- id: dsh-tab-complete
config:
enabled: true
debounceMs: 280 # 停手多久后请求 maxTokens: 64 # 生成上限(一句话够用;调大只会更慢) maxCompletionChars: 180 contextMessages: 6 # 送给模型的历史消息条数 contextChars: 2200 minDraftChars: 0 # 空输入框也预测,设成 2 就要求先打两个字 suppressSteps: true # 丢弃「先查日志,再跑测试」这类助手口吻的执行步骤 provider: "" # 留空则用当前会话的默认模型路由 model: ""

运行时可查状态、可临时开关(内存态,重启复位):

curl.exe http://127.0.0.1:3080/dsh-tab-complete/state # 需要浏览器同款 cookie curl.exe -X POST http://127.0.0.1:3080/dsh-tab-complete/enabled -d '' curl.exe "http://127.0.0.1:3080/dsh-tab-complete/transcript?sessionId=<id>" # 这次补全真正会发给模型的对话 curl.exe "http://127.0.0.1:3080/dsh-tab-complete/prompt?sessionId=<id>&draft=<草稿>" # 完整 system + user 提示词

速度

一次建议 = 静默时间(默认 280ms)+ 模型首 token 延迟。第二段来自模型本身,插件替不了它;所以补全走流式:第一个 token 到达就把幽灵画出来,之后逐字长出来,而不是等整句生成完再一次性出现。

如果仍然嫌慢,可以给补全单独指定路由(不影响主会话):

- id: dsh-tab-complete
config:
provider: <provider>
model: <model>

别用推理型模型。 它们会先把 token 花在思考上,maxTokens: 64 全部被吃掉,流里一个可显示的字都没有——表现是「一次都不出幽灵」,不是慢。实测 glm-5.3-flash、qwen3.7-plus 就是这样,deepseek-flash 这类直出模型的 p50 约 2.4 秒。要换模型,先跑一次:

curl.exe -X POST "http://127.0.0.1:3080/dsh-tab-complete/replay" -H "content-type: application/json" -d "],\"draft\":\"\",\"provider\":\"<provider>\",\"model\":\"<model>\"}"

返回里 completion 为空就说明这个模型不能用。

同一「会话 + 草稿」在缓存里命中是 0 延迟;GET /dsh-tab-complete/state 里的 lastMs 就是上一次真实耗时。

成本与隐私

- 每次预测是一次独立的小模型调用(maxTokens: 64,一句话),不写进会话记录,也不消耗 Harness 的上下文。
- 只接受来自 loopback 的请求;请求体上限 64 KB。
- 同样的「会话 + 草稿」结果缓存 2 分钟;"模型也没想出来"缓存 20 秒,避免空输入框反复花钱。
- 同一会话同时只保留一个在飞请求,新请求会中断旧的。
- 采纳记忆只写在 ~/.dsh/tab-complete-style.json,不联网、不进 git,{clear:true} 一键清空。

它是怎么被调的

改了提示词或守卫规则,不能靠"感觉好点了"就发版。仓库外面(不提交,含私人对话)有一套离线评测:

node .dev/eval/extract.mjs # 从本机真实会话抽「对话 + 用户真实下一句」
node .dev/eval/judge.mjs --port 3148 --limit 20 --label v2 --prompt v2

/replay 把样本喂进同一条补全链路,另一个模型当评审打 0–10 分。0.3.0 的两个改动(口吻重写 + 步骤守卫)就是靠这组数字定的,不是拍脑袋。

实现要点

- 宿主:ctx.webServer.register 六条路由;llm.stream 边读边转发成 SSE;历史取自 session.deriveMessages()(拿不到就退回事件日志的 user/message / assistant/message)。
- 客户端:conversation.input.overlay 插槽里的一个 0 高度覆盖层,绝对定位到测量出来的光标位置,字体、行高、字间距照抄编辑器,所以看起来就是「接下来要打的字」。
- 落字走 inputActions.insertText(text, span),带 draftRev 的 CAS:请求发出后你要是继续打字,这次补全就作废,不会插到错误的位置;CAS 失败再退回 setDraft。
- Tab 在捕获阶段拦下并 stopImmediatePropagation(),编辑器的缩进逻辑看不到它,也不会误触发。

已知限制

- 依赖编辑器的 data-composer-card / data-composer-input 标记,Harness 大改输入框结构时需要跟着调整。
- 幽灵文本的定位按「光标在草稿末尾」优化;多行草稿且光标在中间时,补全仍贴在最后一行末尾。
- 预测本身是有损的,而且两种场景差得很远(真实会话评审,0–10 分):

| 场景 | 平均分 | 说明 |
| 空输入框,猜你下一句 | ≈3 | 你收到结果后往往直接换话题,模型没有依据,只能给「顺着当前任务的下一步」 |
| 你已经打了几个字 | ≈4.7 | 方向被你限定住了,这才是它真正擅长的 |

所以空输入框里出幽灵时,把它当成「一个可以按 Tab 收下的下一步建议」,不是读心;不对就 Esc,或打两个字让它重算。
- 多候选选优(一次生成 3 条再挑)实测救不了空输入框:最好的那条平均只有 3.33 分,36 个候选里 0 个及格。方向错的问题不是多给几次机会能解决的。
- 守卫会误伤一小部分「先/接着 + 技术词」的合法句子(例如「接着写测试」),属于为减少噪声付的代价,可用 suppressSteps: false 关掉。

开发

node scripts/build.mjs # src/ -> lib/(无依赖打包)
node --test test/*.test.mjs # 16 个用例

src/core.js 是纯函数(提示词、清洗、转录裁剪),src/host.js 是宿主半边,src/client.cjs 是插槽组件,src/client-css.cjs 是样式。lib/ 是构建产物,随仓库一起提交,安装时不用自己构建。

License

MIT
预览分享卡片长什么样 ↓dingchenhui0618-arch/dsh-tab-complete
分享 · DeepSeek Harness Hub
dingchenhui0618-arch/dsh-tab-complete

在输入框里预测下一句,按 Tab 一键填入

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