dsh-plugin-aiquestion
Verifieddsh-plugin-aiquestion · v1.0.1 · MIT
AiQuestion「先问清楚再动手」—— DSH 意图澄清插件:在 AI 花费大 token 开工前,程序化发起澄清提问,并以 AI 自身判断为优先裁决用户回答是否合理、是否有参考意义,直到彻底理解用户意图后再放行主模型
Install
dsh plugin add dsh-plugin-aiquestion Confirm the layer applied with dsh --profile default --dump-config — see the install guide.
Source
Tags
Creators
Readme
AiQuestion「先问清楚再动手」
中文 | English
一个 DSH(DeepSeek Harness)插件:在你把一句含糊的话丢给 AI 之后,它不会立刻开干, 而是先向你提问、逼你说清楚——并且以 AI 自己的判断为优先,判断你的回答是否合理、 是否有参考意义。直到 AI 彻底理解你到底要干什么,它才动手。
项目缘起(作者原话):解决用户意义不明的 vibe code 和 wish code(笑)——在用户提出第一个问题后, AI 会在需要花费较大 token 进行制作时,不断地向用户提问、询问用户的决策;而 AI 比绝大多数用户聪明, 所以 AI 会以自己为优先级,判断用户的回答是否合理且有参考意义。在制作任何内容的过程中,AI 会不断 决策,直到彻底理解用户到底要干什么。
用来治两种病(笑):
- vibe code —— “我也说不清,你先写,我看着改。”
- wish code —— “给我一个超厉害的 app,什么都能干。”
这两种需求的共同结局是:AI 愉快地烧掉不知道多少无用的 token,交付了一个你并不想要的东西,然后你重来一遍,死循环,不是吗,我的某个不知名朋友就是这样。 AiQuestion 的立场很明确:在误解上花的每一个 token,都是浪费。
核心机制
每一轮用户输入,都会在模型请求之前被 agent/pre-step 拦截并走一遍下面的流程:
用户发出指令
├─ 插件停用 / mode=never? ──────────── 直接放行(零消耗)
├─ 正在等待你对上一轮提问的回答?
│ ├─ 旁路请求裁决:你的回答是否“合理且有参考意义”(AI 判断优先)
│ │ ├─ 意图已充分 OR 已达追问上限 → 生成【意图契约】并放行主模型
│ │ └─ 否则 → 写入 AI 的追问(含 AI 的默认决断),拒绝本轮(主模型零调用)
└─ 新一轮请求 → 旁路请求评估:意图是否充分 + 预估工作量
├─ 意图清晰且工作量低于阈值 → 直接放行(零干预)
└─ 否则 → 生成 1-4 个澄清问题,写入会话并拒绝本轮(主模型零调用)
关键点:澄清阶段主模型一次都不调用。所有评估与裁决都由一个极小、不带历史的旁路请求完成, 结果返回给程序判定。主模型只在意图真正清楚后才第一次获得执行权。
AI 优先:不迁就用户的随口回答
裁决提示词对 AI 有明确授权:AI 的判断优先级高于用户的随口回答。
- 你的回答若有技术错误 / 自相矛盾 / 明显不可行 → 判为“不合理”,不采纳;
- 你的回答若只是复述原话,或用 “随便 / 你看着办 / 都行 / 你决定”敷衍 → 判为“无参考意义”,不采纳;
- AI 会按自己认为的最优解继续推进,并把“我替你做的决定”写进意图契约;
- 追问有轮数上限(默认 2 轮)。到顶之后,AI 自行决断并开工,不会没完没了地问。
换句话说:它问,是为了搞懂你;但它不听你的,除非你说的对。
意图契约
当 AI 判定意图已足够清楚,它会产出并写入一条 【意图契约】:目标 / 范围边界 / 关键决策(含 AI 替你做的决定)/ 验收标准。该契约会被注入本轮的模型输入,并被要求原样执行, 避免主模型再重复问一遍已经决定过的事。
真正省 token(对齐 dsh-ops 的理念)
AiQuestion 的省 token 不是“少说话”,而是不在误解上烧钱:
| 手段 | 效果 |
|---|---|
| 评估/裁决全部走无历史的旁路请求 | 澄清阶段主模型 0 调用;旁路请求只有几十~几百 token |
| 一次问清,换来的是不返工 | 省下的是主模型在错误方向上的整段生成,远大于旁路成本 |
| 意图清晰的小请求直接放行 | 闲聊、小改动零干预、零额外开销 |
workloadThreshold 阈值门控 |
只有预估工作量达到阈值(默认 6/10)才触发澄清 |
| 默认不发布任何工具、不注入任何提示词 | 插件对主模型的固定 token 成本为 0 |
插件停用 / mode=never |
完全旁路,零消耗 |
安装
AiQuestion 是一个标准 DSH 插件:package.json 的 dsh.bundle.patch 指向 cordis.patch.yml, bundle entry 的 name 就是 npm 包名。任何标准的 DSH 插件安装入口,填入下面这一行即可安装:
dsh-plugin-aiquestion
方式一:在 DSH / NewMax 里填 npm 包名(推荐)
在宿主的插件安装入口填入 dsh-plugin-aiquestion。安装器会从 npm 拉取本包,并写入当前 profile 的 dsh.profile.bundles,重启后生效——不需要 clone 仓库,也不需要本地路径。
✅ 本包已发布到 npm:
dsh-plugin-aiquestion(MIT) — https://www.npmjs.com/package/dsh-plugin-aiquestion仓库自带发布助手
npm run release(自检 → 登录检查 → 发布),见文末「发布到 npm」。
方式二:命令行
dsh plugin --profile web add dsh-plugin-aiquestion
方式三:本地 link(开发调试用)
dsh plugin --profile web add link:E:/dsh/dsh/AiQuestion
桌面端(NewMax / DeepSeek Harness Desktop)
桌面版若带独立 CLI,通用布局为 <安装目录>/resources/runtime/cli/bin/dsh.cmd:
"<安装目录>/resources/runtime/cli/bin/dsh.cmd" plugin --profile desktop add dsh-plugin-aiquestion
⚠️ 该路径是通用布局,并非所有发行版都带独立 CLI。打包版 NewMax 通常不暴露
dsh可执行文件(作者环境经核对:该路径不存在,~/.newmax/bin下只有claude.exe)。 属于这种情况时,请用「方式一」或下面的「手动安装」。
安装后重启对应的 dsh 进程(插件随 profile 启动加载)。
手动安装(没有 dsh CLI 时)
编辑目标 profile 目录 $DSH_HOME/profiles/<profile>/(Windows 下通常是 C:\Users\<你>\.dsh\profiles\web\ 或 ...\desktop\):
在
package.json中登记依赖与 bundle(正式版,从 npm 取包):{ "dependencies": { "dsh-plugin-aiquestion": "^1.0.0" }, "dsh": { "profile": { "bundles": ["dsh-plugin-aiquestion"] } } }若你在本机开发调试插件本身,改为指向你的仓库目录:
"dsh-plugin-aiquestion": "link:E:/dsh/dsh/AiQuestion"或在同目录的
cordis.patch.yml中直接挂载:- insert: - id: dsh-plugin-aiquestion name: dsh-plugin-aiquestion让 profile 的包管理器安装依赖(目录内自带
pnpm-lock.yaml/pnpm-workspace.yaml, 通常是pnpm install),然后重启宿主应用。
手动安装细节随发行版而异;本项目在打包版 NewMax 上未做端到端加载验证, 上述步骤均按标准 DSH profile 结构给出。
旁路请求需要一个 OpenAI 兼容端点。默认使用
https://api.deepseek.com+deepseek-chat, API key 从 DSH 凭据服务的DEEPSEEK_API_KEY(或同名环境变量)读取;也可在配置里改provider。 若宿主暴露了可用的 LLM 服务,插件会优先复用它。
使用
- 网页右下角有一个可自由拖动的小齿轮,点击打开设置面板。
- 给 AI 一句含糊的话(例如“帮我做个有意思的小工具”),看它先把问题甩回给你。
- 回答它;如果你敷衍,它会照样追问或自己拍板。
设置面板
| 项 | 说明 |
|---|---|
| 启用 AiQuestion | 总开关。关闭后不评估、不拦截,零 token 消耗。 |
| 触发模式 | 智能(默认,仅意图含糊或工作量大时澄清)/ 总是(每轮先澄清)/ 关闭。 |
| 工作量阈值 | 1-10,预估工作量 ≥ 该值才触发澄清。调低更啰嗦,调高更省 token。 |
| 最多追问轮数 | 0-5,超过则 AI 自行决断并开工。 |
| 提问风格 | 冷静工程师 / 毒舌评审 / 耐心导师,点击即切换。 |
| 状态预览 | 显示最近一次动作(放行 / 提问 / 生成契约)与裁决结论。 |
所有设置即时保存,无需重启(配置文件:$DSH_HOME/dsh-plugin-aiquestion/config.json)。
自定义提问话术
话术库位于插件的 talking/ 文件夹:
talking/engineer.txt—— 冷静工程师(一行一条)talking/sassy.txt—— 毒舌评审talking/mentor.txt—— 耐心导师
插件首次启动时会把这些文件自动复制到 $DSH_HOME/talking/(如 C:\Users\<你>\.dsh\talking\)。 之后插件**优先读取该目录下的版本**——直接编辑即可自定义,无需碰 node_modules,改完立刻生效。
⚠️ 会话事件契约(重要)
AiQuestion 与 AIQuit 一样,会在拒绝本轮时向会话写入 一条 assistant/message(AI 的提问)。该事件必须逐字节满足 DSH 的会话事件契约:
assistant/message必须携带数值turn/step、被step/start包裹,且message.content为数组;- 事件
data必须带stream数组(无模型流时写[]); - 拒绝统一返回官方的
{ kind: 'reject' }。
写入前本插件会做完整形状校验,任一不满足即 fail-open 放行——宁可不澄清,也绝不写坏事件。 这些约束来自 AIQuit 作者记录的惨痛教训,特此致谢(见 NOTICE)。
开发与测试
node test/run.mjs # 或 npm test
覆盖配置规范化、会话状态机、提示词渲染、JSON 解析与插件导出形状。
发布到 npm(维护者)
发布走仓库自带的助手 release.mjs:发布前自检 → 检查登录 → 发布到官方源。
npm run release
- 自检校验:包名、
dsh.bundle.patch指向的文件、cordis.patch.yml里 entry 的name是否等于包名(不等会让市场判定「插件没有入口」)、main入口、files清单,并跑一遍单测。 只想自检不动发布:npm run preflight。 - 官方源:本机
~/.npmrc若指向registry.npmmirror.com(只读镜像),发布必然失败; 脚本已固定使用https://registry.npmjs.org/,你不需要改任何配置。 - 未登录时脚本会打印逐步指引(注册 →
npm login→ 重跑),而不是丢一个ENEEDAUTH。
发布完成后,任何人(包括你)都能在 DSH 的插件安装入口填入 dsh-plugin-aiquestion 直接安装。
本包当前已上线(最新版本见顶部徽章,或用
npm view dsh-plugin-aiquestion version核实)。 发新版本时,把package.json的version递增后重跑npm run release即可。
目录结构
AiQuestion/
├── lib/
│ ├── index.js # 插件主体:agent/pre-step 拦截 + 会话状态机 + Web 配置接口
│ ├── intent.js # 意图裁决核心:triageIntent / judgeAnswer
│ ├── prompts.js # 旁路请求系统提示词(AI 优先裁决)
│ ├── mini.js # 极小旁路模型调用 + JSON 解析
│ ├── config.js # 配置读写与规范化
│ ├── session-state.js # 每会话澄清状态机
│ ├── talking.js # 话术库加载
│ └── widget.js # 可拖动齿轮 + 设置面板(前端脚本)
├── talking/ # 提问话术(engineer / sassy / mentor)
├── test/ # node:test 自测
├── cordis.patch.yml # DSH bundle patch(挂载声明,entry name = npm 包名)
├── dsh-plugin.json # T-Auto/dsh-std 谱系清单(本机 DSH 加载器不读它,保留仅为兼容)
├── release.mjs # 发布助手:自检 → 登录检查 → npm publish
└── package.json
致谢与署名
本项目是原创(可能?)实现,在设计上参考了以下两个开源的 DSH 插件,作者与出处如下:
- AIQuit「爷不干了」 — 作者 Jia-HuaWu(MIT)。 借鉴其程序化裁决模式:在
agent/pre-step拦截每轮输入、用极小无历史的旁路请求做决策、 以完全符合契约的事件流拒绝本轮而主模型零调用;其记录的会话事件契约教训与 可拖动齿轮设置面板的可交互形态也直接启发了本项目。 AIQuit 是本项目的反面镜像:它拒绝干活,AiQuestion 则在干活前先问清楚。 - dsh-ops — 作者 T-Auto(MIT AND Apache-2.0)。 借鉴其节约 token 的工程哲学与 DSH 插件打包形态:组件开关、零固定成本的提示词基线、 大量使用廉价的旁路请求,以及“真正省 token(避免返工,而非单纯缩短输出)”的原则。
- 时*民 我的好兄弟,因为他我才意识到许愿编程的严重性,于是我决定给他挂这。
详见 NOTICE。本项目未逐字拷贝上述项目的源码;如二次分发,请保留 NOTICE 以维持对原作者的署名。
License
MIT © 2026 vaseft (AiQuestion contributors)