dsh-intent-suggest
这是 DeepSeek Harness(下面简称 dsh)的一个插件。你在输入框里字还没打完,它就猜出你接下来想让 agent 干什么,给出三条候选任务。三条方向各不相同,都可以直接发送。
点一下候选,这句话就填回输入框。发送键还是你自己按,插件不会替你发。
举个例子:输入框里只打了“果蝇”两个字,它给出了下面三条候选。这是本机的一次真实输出。
- 找出最近开源的果蝇全脑神经模型,给出仓库地址和本地跑通成本。
- 把果蝇连接组仿真模型在本地跑起来,给出依赖安装和最小复现步骤。
- 对比几个果蝇神经仿真框架,按可跑性、数据齐全度和上手成本排序。
它不太花 token
停笔 0.55 秒才发一次请求。你还在敲字的时候它不动,同一句话也不会重复发。
一次大约 200 个~800 个输入 token、150 个~200 个输出 token,差不多是一句话的长度。
不需要猜的时候它不发请求。输入是纯标点、乱码,或者你已经把任务写完整了,它就什么都不显示。
自定义画像只生成一次。你写一句“自己是干什么的”,它生成一套提示词存进浏览器,以后每次都用这套。改一句话才重新生成一次。
安装
需要先装 pnpm,dsh plugin 只是把参数转发给它。
# 1. 建一个自己的 profile,别改官方 web profile
# 2. 把这个仓库 link 进去
dsh plugin --profile web-intent add link:"$(pwd)"
# 3. 起服务
dsh web-intent --no-open
如果界面上没有出现候选,检查 profile 的 package.json,看 dsh.profile.bundles 里有没有 dsh-intent-suggest。
使用
输入框上方会出现一行“你可能想让它做 · 编程”,后面跟着候选。点这行标签可以换一档,也就是换它对“你是谁”的假设。
- 编程:候选是改代码、跑测试和定位文件这类任务。
- 调研:候选是检索论文、找数据集和复现开源实现。
- 自定义:弹出一个输入框,写一句“你是谁、平时让 agent 干什么”,它照这句话现生成一套提示词和方向表。
选择存在浏览器里,下次打开还是这一档。
实现细节
这一节讲它怎么做到的,只想用的话可以跳过。
五条需求和对应代码
| 需求 | 做法 | 位置 |
|---|
| 边输入边更新 | 订阅 composer 的 draft,停笔 550 ms 触发。请求排队串行,不会攒出一串并发 | client.src.js |
| 猜意图,不续写 | 提示词要求三条方向互不相同,方向标签参与去重 | engine/prompt.js |
| 利用对话上下文 | 宿主用 Session.deriveMessages() 取最近 6 轮喂进去,指代由提示词还原 | lib/index.js |
| 显示要稳定 | 候选按槽位编号渲染,语义没变的留在原位。与最新输入矛盾的候选直接丢弃。旧候选降到 0.45 亮度,不会消失再出现 | engine/stability.js |
| 决定权在用户 | 只调 inputActions.setDraft(),从不调 submit() | client.src.js |
流式与延迟
宿主把 text-delta 转成 SSE(Server-Sent Events,服务器推送事件)。客户端对半截 JSON 做花括号配对扫描,第一条候选不用等全文到齐就能上屏。
实测用的模型是 DeepSeek V41 Flash,思考关闭。首条候选 600 ms~1000 ms,三条全部上屏 1.0 秒~1.4 秒。延迟大头在 550 ms 的停笔判定上,模型响应只占一小部分。
开发
npm test # = node build.js && node --test test/engine.test.js
engine/ 是不依赖框架的 ESM(ECMAScript Module,JS 模块),可以直接在 Node 里跑测试。build.js 把四个 engine 文件内联进 client.js。dsh 只服务 <pkg>/client.js 这一个文件,浏览器没有第二个可 import 的入口,所以生成产物一起提交。
改 client.src.js 或 engine/:跑 npm run build,刷新浏览器就生效。
改 lib/index.js(宿主侧):要重启 dsh,重启会换一个新的 token URL。
画像与去重
自定义画像的方向表是模型现造的,所以 parseItem 按当前画像的方向列表校验标签。不在表里的方向会归一成“选型对比”,同一个方向只留第一条。少了这一步校验,三条候选会被压成两条。
凭据与网络
插件不配 API key。宿主侧用 ctx.llm.stream() 复用 dsh 自己注册的 provider 和凭据。
宿主额外开三个同源 HTTP 接口:/intent-suggest/suggest、/intent-suggest/context、/intent-suggest/providers。请求要过 Sec-Fetch-Site 和 Origin 的跨源拦截。/providers 是调试口,只列 provider 和模型 id,不输出密钥。这三个口只挡跨源、不鉴权,所以不要把 dsh 的端口反向代理到公网。
许可
MIT