← Back to home@tang-coder-hub

dsh-prompt-hub

提示词仓库 (Prompt Hub) for DeepSeek Harness:在输入框「完全权限」chip 旁加入口,存储/检索/插入提示词,支持草稿提示词优化(本地结构化 + AI 改写),带设置页管理面板几何、优化模型与数据。

Stars
1
Language
JavaScript
Created
Oct 1, 2026
Updated
Oct 1, 2026
GitHub repo

Introduction

dsh-prompt-hub — 提示词仓库(含提示词优化)

CI License: MIT Node

在 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 打真实接口

三条硬约束

  1. 宿主半只 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)。
  2. 客户端半只把 react / react/jsx-runtime 留作 external,其余全部内联, 产物用 window.__ModuleLoader__.load({ id, factory }) 封装,id 必须等于包名。
  3. 改了宿主半必须重启 DSH。 Node 的 ESM 模块缓存没有失效机制(harness 不带 cache-busting 的 import),插件重载只会重新执行同一份已缓存的模块。客户端半只要重新加载页面即可换新。

接口

方法路径说明
GET/api/prompt-hub/prompts全量提示词 + 当前模型路由
POST/api/prompt-hub/promptsaction: 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 字符、本地整理产出结果面板与状态提示。