dsh-prompt-optimizer-button
az-666316/dsh-prompt-optimizer-button
DSH 输入框内的提示词优化器。点一下就用当前选中的模型就地改写草稿:自动识别场景(论文 / 派活 / 日常 / 英文),弹出三自检诊断面板(验收能否机器判定?缺信息还是缺能力?在抬深度还是扩范围?), 并可手动钉住场景。改写结果直接替换输入框草稿,不新增对话轮次。
安装
dsh plugin --profile web add github:az-666316/dsh-prompt-optimizer-buttonREADME
dsh-prompt-optimizer-button
演示
录屏约 8 秒:输入草稿 → 点星星 → 面板弹出(场景 + 三条自检)→ 改写结果直接替换回输入框。
Codex / 其他 agent 用法(skill)
Codex 的输入框没有插件接口,做不到在 composer 里加按钮;但可以用 skill 版:skills/prompt-optimizer/SKILL.md,规则与宿主侧一致(判场景 + 三自检 + 四问 + 长度红线 + 固定输出格式)。
安装 skills/prompt-optimizer/ 到下面任一位置即可:
- Codex:
~/.codex/skills/prompt-optimizer/,或~/.agents/skills/prompt-optimizer/(DSH 与 Codex 共用) - DSH:用户级
~/.dsh/skills/prompt-optimizer/,或项目级.dsh/skills/prompt-optimizer/
调用方式:Codex 里说“优化这个提示词”,或显式 $prompt-optimizer;DSH 里可用 /prompt-optimizer。具体前缀取决于所用客户端的 skill 调用语法。
Codex 里唯一“发送前”的钩子是 UserPromptSubmit hook,但它只能阻断或注入上下文、不能替换输入框内容,所以本插件不依赖它(详见 Codex hooks)。
截图

输入框里:场景徽标 + 优化按钮,位于模型选择器与发送按钮之间

诊断面板:场景 chips、任务类型与支撑决策、三条自检(✓ / !)

优化进行中:按钮呼吸闪烁,面板显示“正在优化…”
给 DSH 输入框加一个「优化提示词」小图标(sparkle)按钮,并在它旁边加一个场景徽标:位置在 模型选择框与发送按钮之间(麦克风/发送按钮左侧)。
点一下图标,插件会把当前草稿发给宿主侧的一小段服务,用当前选中的模型跑一次普通的模型调用,把改写后的提示词直接替换回输入框:
- 不发送、不新增对话轮次,你先看、先改,再按 Enter;
- 使用输入框里当前选的 provider/model(含 reasoning effort),不另配密钥;
- 草稿为空时按钮置灰;请求进行中图标呼吸闪烁、按钮不可再点;失败时图标变红并自动打开面板说明原因;
- 徽标显示模型这次判断出的场景(自动 / 论文 / 派活 / 日常 / 英文),点徽标可打开面板、手动钉住下一次要用的场景。
场景徽标与诊断面板
一次调用同时返回三样东西:改写后的提示词(写回输入框)、判断出的场景、以及结构化诊断。诊断不进输入框,只显示在弹出面板里:
- 面板标题行右侧显示模型识别到的场景,正文依次是:功能提示、场景选择 chips(自动/论文/派活/日常/英文,点一下即钉住;末尾
+可新建自定义场景)、诊断(任务类型、要支撑的决策)与三条自检(✓ 通过 / ! 未通过,各带一句理由)、失败原因(仅失败时); - 自定义场景:点 chips 末尾的
+,填「名称」和「说明/提示词」后保存,会与预设场景并列显示,点一下即可使用;每个自定义场景右侧带✎(编辑,改后点「保存修改」)和×(删除); - 预设场景也能改:论文 / 派活 / 日常 / 英文 四个内置场景同样带
✎(重命名、追加额外说明;内置规则仍然生效,说明叠加在它们之后)和×(暂时隐藏,不删除内置规则);隐藏后 chips 下方会出现「恢复隐藏的预设场景」;预设被改过时名称显示为浅紫色,编辑表单里可点「恢复默认」; - 所有改动存在浏览器
localStorage(键dsh-prompt-optimizer-button:scenario-config,旧版自定义场景会自动迁移),只影响本机这一份界面,刷新后仍在; - 面板用
position: fixed挂在按钮上方(空间不足自动翻到下方),水平居中并夹在视口内;外部点击、Escape、关闭按钮都能收起;role="dialog"; - 视觉为深色半透明 + 背景模糊 + 圆角 14 + 投影,徽标是圆点 + 文字的胶囊;按钮禁用态用
aria-disabled(原生disabled会让 Chromium 不派发指针事件),点击守卫仍在onClick里。
结构
dsh-prompt-optimizer-button/
├─ package.json # dsh.bundle.patch + dsh.client
├─ cordis.patch.yml # 往 profile 组合里插入 host 行
├─ index.js # 宿主侧:POST /prompt-optimizer/rewrite(ctx.llm 一次调用)
├─ client.js # 浏览器侧:__ModuleLoader__ bundle,按钮 + portal 定位 + fetch
├─ assets/ # 图标与截图
├─ skills/prompt-optimizer/SKILL.md # Codex / 其他 agent 的 skill 版
├─ publish/ # 商店上架草稿:awesome-entry.yml、CHECKLIST.md、PR_BODY.md
└─ README.md
-
浏览器侧注册
conversation.input.right单元格,用ReactDOM.createPortal把徽标与按钮插到 composer trailing 行的standardControls(模型选择器块)之后;诊断面板再 portal 到document.body,用按钮矩形算固定定位坐标。 -
宿主侧注册一条同源路由
POST /prompt-optimizer/rewrite:{ text, provider, model, reasoningEffort?, scenario? } → { ok: true, text, scenario, diagnosis }。text是改写后的提示词(唯一写回输入框的内容),scenario/diagnosis只给面板用。 桌面版页面 origin 是dsh-app://app,主进程会把非本地资源的 fetch 转发到宿主 Web 服务器(带认证 cookie),所以相对路径fetch('prompt-optimizer/rewrite')在桌面与网页版都能用。 -
模型答案用行标记解析(
SCENARIO:/DIAGNOSIS:/PROMPT:),长提示词正文不塞进 JSON 字符串,避免换行与引号导致解析失败;解析失败时回退为「整段当提示词」。 -
宿主侧不
import任何@deepseek-ai/*包(profile 里并没有 dsh-llm),只通过ctx.get('llm')/ctx.inject(['webServer'])拿运行时服务,避免插件拖慢或拖垮启动握手。
依赖
- 运行中的 DSH(0.2.2 级别)自带
llm、webServer服务即可,无需额外包。 - 不再依赖
prompt-optimizer技能:优化规则写在index.js的 system prompt 里(技能仍是给对话用的,两者不冲突)。
安装
本机已通过 plugin_manager 的 install_bundle 以 link: 方式装到 desktop profile。手动安装等价于:
- 在 profile(如
%USERPROFILE%\.dsh\profiles\desktop\package.json)的dependencies加"dsh-prompt-optimizer-button": "link:<本目录绝对路径>"; - 把
dsh-prompt-optimizer-button加进dsh.profile.bundles; - 让 profile 重新组装(
plugin_manager的 set/install,或重启 DSH),页面刷新后生效。
卸载
plugin_manager里禁用/移除prompt-optimizer-button行,或dsh plugin --profile desktop remove dsh-prompt-optimizer-button。
已知限制
- DSH 0.2.2 的 composer 内部 DOM 不是公开 API;升级后若
[data-composer-card]/standardControls结构变化,按钮定位会失效(有「发送按钮前」的兜底定位)。 - 按钮只在会话输入框出现(欢迎 hero 态没有该单元格)。
- 宿主路由不做额外鉴权,依赖 Web 服务器本身只在 loopback 暴露;若要对外暴露需自行加策略。
- 单次请求上限:输入 20k 字符、输出 4000 tokens、超时 90 秒;输出被 max tokens 截断时,若已解析出完整提示词则保留并标记,否则提示缩短草稿重试。
- 目前不自动发送;要「点完直接发送」改
client.js的onClick,在setDraft后调用inputActions.submit()。 - 自定义场景与预设改动只存在本机浏览器(
localStorage),换设备/换浏览器不会同步,也不会影响别人的界面。 - 场景判定由模型在当次调用里完成,可能判偏;不认同可以在面板里点 chip 钉住场景后重跑(目前不会跨会话记住你的选择)。
- 重命名预设但不填额外说明时,只改界面显示名,不改模型行为(内置规则不动);要改变行为请在「说明/提示词」里追加要求。
- 英文面板文案已支持(跟随 DSH 语言),但仓库文档目前只有中文 README;Codex 侧是
skills/里的 skill 版,没有 composer 按钮。