dsh-prompt-hub
提示词仓库 (Prompt Hub) for DeepSeek Harness:在输入框「完全权限」chip 旁加入口,存储/检索/插入提示词,支持草稿提示词优化(本地结构化 + AI 改写),带设置页管理面板几何、优化模型与数据。
- Stars
- 1
- Language
- JavaScript
- Created
- Oct 1, 2026
- Updated
- Oct 1, 2026
Introduction
dsh-prompt-hub — 提示词仓库(含提示词优化)
在 DeepSeek Harness 的对话框工具行里、紧挨着「完全权限」右侧增加一个「提示词」入口, 点开是提示词仓库面板:保存 / 搜索 / 标签 / 收藏 / 插入提示词,外加提示词优化(AI 优化 + 本地整理)。 **设置 →「提示词仓库」**另有一页管理界面,用来调浮层边框尺寸、换优化模型和做数据管理。
[ + ] [ 完全权限 v ] [ 📖 提示词 ] [ 模型 v ] [ 🎤 ] [ ↑ ]
^^^^^^^^^^
本插件入口(conversation.input.left,order 90)
为什么是这个位置
dsh-client-ui-conversation 的 InputBar 渲染顺序是:
<div class="leading">
[+ 附件按钮]
<div class="modes">
renderSlot("conversation.input.permission") ← 完全权限
renderSlot("conversation.input.plan") ← 计划模式
</div>
renderSlot("conversation.input.left") ← 本插件注册在这里(list,order 90)
</div>
conversation.input.left 是紧跟权限 chip 之后的列表槽,因此注册进去就天然躺在「完全权限」旁边。
order 取 90,排在语音输入(order 100)之前,保证提示词入口是最贴近「完全权限」的那一个。
功能
仓库(对话框浮层 · 仓库 tab)
| 能力 | 说明 |
|---|---|
| 收录当前 | 把输入框里正在写的草稿一键存为提示词 |
| 新建 / 编辑 | 标题、标签(最多 8 个)、正文;删除前是否确认可在设置里关掉 |
| 搜索 | 匹配标题 / 正文 / 标签 |
| 标签筛选 | 按使用频次排序的标签 chips,另有「★ 收藏」视图 |
| 插入 | 按设置里的「插入方式」写入输入框,并累计使用次数 |
| 持久化 | $DSH_HOME/prompt-hub/prompts.json,原子写入(临时文件 + rename) |
优化(对话框浮层 · 优化 tab)
| 模式 | 作用 |
|---|---|
| 结构化 | 拆成 角色 / 任务 / 要求 / 输出格式 |
| 精简 | 去重、删寒暄,保留全部关键约束 |
| 扩写补全 | 补输入、边界条件、异常处理、验收标准 |
| 角色化 | 加专家身份与工作方法、自查清单 |
| 纠错润色 | 修错别字、语病、标点、中英文间距 |
| 自定义 | 按用户自己写的改写要求处理 |
两种执行方式:
- AI 优化 — 走宿主
ctx.llm.stream(),模型路由取「设置里的覆盖值 → 宿主agentDefaultModel」; 面板底部显示当前使用的模型。结果只输出提示词正文,不夹解释、不套代码块。 - 本地整理 — 纯前端确定性重写,不联网、不花钱,随时可用;AI 不可用时自动成为唯一选项。
优化结果可替换输入框 / 追加 / 复制 / 存为提示词。
设置页(设置 →「提示词仓库」)
| 分区 | 项目 |
|---|---|
| 面板外观 | 宽度 300–900px、最大高度 260–1200px、圆角 0–28px、字号 11–17px(滑块,带 40% 缩略实时预览);触发按钮是否显示「提示词」文字 |
| 提示词优化 | 服务商(跟随宿主默认 / 任选已注册路由)、模型(随服务商懒加载)、默认优化方向、最大输出 tokens、追加系统提示 |
| 行为 | 插入方式(智能 / 总是替换 / 总是追加)、打开优化页时是否自动读取输入框、删除是否二次确认、提示词数量上限 |
| 数据管理 | 当前条数与上限、数据目录路径、导出 JSON、导入 JSON(按 id 去重,冲突自动改 id)、打开数据目录、清空仓库 |
| 其他 | 恢复默认设置 |
几何参数用滑块即时预览、松手 320ms 后落盘,一次拖动只写一次。 设置改动通过共享 store 广播,浮层下次打开即生效,不需要刷新页面。
架构
dsh-prompt-hub/
├── package.json dsh.bundle.patch + dsh.client(platform: web)
├── cordis.patch.yml profile 层的 insert 行
├── tsdown.config.mjs 两个产物:host(ESM) / client(__ModuleLoader__ 封装 CJS)
├── src/
│ ├── index.ts 宿主半:提示词库 + 设置 + 路由 + LLM 调用
│ └── client/
│ ├── index.ts apply():注册 conversation.input.left 与 settings.section
│ ├── PromptHub.tsx 入口按钮 + 浮层面板
│ ├── SettingsPage.tsx 设置页
│ ├── settings.ts 共享的、可订阅的设置快照
│ ├── api.ts 路由客户端
│ ├── optimize.ts 本地整理算法(离线)
│ └── styles.ts CSS,全部走 --dsw-alias-* 主题变量
└── scripts/
├── verify.mjs 离线验证:假 ctx + 真 HTTP + React SSR(不需要运行中的 DSH)
└── smoke.mjs 端到端验证:对着正在运行的 GUI 打真实接口
三条硬约束
- 宿主半只 import Node 内置模块。 本地
link:安装的插件按自身目录做 bare specifier 解析, 而@deepseek-ai/*在 harness 包体(asar)里 —— 所以src/index.ts里不能出现@deepseek-ai/dsh-llm之类的 import。LLM 通过ctx.get('llm')拿到, message 按文档结构{ id, role, content, source }手写(等价于createUserMessage)。 - 客户端半只把
react/react/jsx-runtime留作 external,其余全部内联, 产物用window.__ModuleLoader__.load({ id, factory })封装,id 必须等于包名。 - 改了宿主半必须重启 DSH。 Node 的 ESM 模块缓存没有失效机制(harness 不带 cache-busting 的 import),插件重载只会重新执行同一份已缓存的模块。客户端半只要重新加载页面即可换新。
接口
| 方法 | 路径 | 说明 |
|---|---|---|
| GET | /api/prompt-hub/prompts | 全量提示词 + 当前模型路由 |
| POST | /api/prompt-hub/prompts | action: upsert / delete / favorite / touch / import / clear |
| POST | /api/prompt-hub/optimize | { text, mode, instruction?, provider?, model? } → { result, model, routeSource } |
| GET | /api/prompt-hub/settings | 生效设置 + 出厂默认 + 数据目录 |
| POST | /api/prompt-hub/settings | { settings: {...} } 局部更新,或 { reset: true } |
| GET | /api/prompt-hub/models | 服务商目录;带 ?provider= 时列出该服务商的模型 |
| POST | /api/prompt-hub/reveal | 用系统文件管理器打开数据目录 |
| GET | /api/prompt-hub/meta | 版本、条数、上限、模型路由、LLM 可用性、模式表 |
请求体上限 4 MiB;优化输入上限 40000 字符;提示词总量上限 2000 条(可设,最大 20000)。 所有设置值都在宿主侧夹取,非法枚举回落为上一个有效值。
安装
从 GitHub 安装(推荐)
让 DSH 的插件管理器把它作为 profile bundle 装进来(会自动写 profile 的
dependencies 与 dsh.profile.bundles):
plugin_manager { action: "install_bundle", target: "github:tang-coder-hub/dsh-prompt-hub" }
装完后重启 DSH(宿主半是 Node ESM 模块,进程内没有缓存失效机制), 再打开设置即可看到「提示词仓库」页。
从本地源码安装(开发用)
plugin_manager { action: "install_bundle", target: "link:D:/path/to/dsh-prompt-hub" }
无论哪种方式,宿主半都需要重启 DSH 才生效,客户端半重新加载页面即可。
lib/ 已随仓库提交,使用者不需要安装任何构建工具。
从源码构建
改源码时才需要(使用者可以直接跳过这一节):
npm install # 只装 devDependencies:tsdown / react / react-dom
npm run build # 产出 lib/index.js(宿主)+ lib/client.js(浏览器)
npm run verify # 离线 61 项检查,不需要 DSH 在运行
npm run smoke # 对着运行中的 GUI 打真实接口(会花 token)
PH_SKIP_AI=1 npm run smoke # 跳过会花钱的模型调用
PowerShell 里设环境变量写 $env:PH_SKIP_AI=1。
构建是逐字节可复现的:同样的源码跑两次 npm run build,lib/ 的 SHA256 完全一致。
卸载
plugin_manager { action: "remove_bundle", target: "dsh-prompt-hub" }
数据留在 $DSH_HOME/prompt-hub/(prompts.json + settings.json),需要时手动删除。
已验证
scripts/verify.mjs:61 项全绿,覆盖
meta / 设置默认值与局部更新 / 越界夹取 / 非法枚举回落 / 未知字段保持 / 落盘 /
服务商目录与单服务商模型列表 / 优化路由三种来源(默认、整体覆盖、仅覆盖模型、单次请求覆盖)/
追加系统提示与输出上限透传 / 提示词增删改查与清空 / 404 与 400 分支 /
客户端注册两个槽位 / 设置页与入口按钮的 React SSR 渲染。
scripts/smoke.mjs:对着运行中的 GUI 验证真实接口与真实模型调用。
界面侧已实机走通:入口位置、仓库面板、优化 tab、模式切换与条件字段、
粘贴 129 字符、本地整理产出结果面板与状态提示。