deepseek-harness
deepseek-ai
DeepSeek Harness: Everything is a Plugin.
PROJECT TOPICS
PROJECT README
中文 | English
DeepSeek Harness 插件:在会话输入框(发送栏)旁提供一个「优化」按钮(✨ 图标),一键分析并优化当前输入的提示词草稿,结果经 SSE 流式逐段上屏。优化调用默认复用当前会话的模型路由(每次点击实时读取,会话里切换模型立即生效)。
POST /dsh-prompt-optimizer/optimize(SSE 流式)与 POST /dsh-prompt-optimizer/test-model(连通性探活)两条路由,调用 ctx.llm 完成「分析 + 改写」。conversation.input.right 槽位注入按钮,向 conversation.input.dock 注入结果面板(输入卡上方整行、与 TodoDock 同族,新会话界面也渲染,且不遮挡输入框),向 settings.plugin.item 注入可折叠的设置卡片(设置页自动获得配置界面,无需单独开发页面)。--dsw-alias-*),明暗主题自动跟随。<<< ANALYSIS >>>)能正确解析;实在不遵守格式时降级展示并给出提示。前提:已安装 dsh CLI(npx @deepseek-ai/dsh web 可用的环境)。
# 下载 dsh-prompt-optimizer.tgz(始终指向最新版),再安装本地文件
dsh plugin --profile web add ./dsh-prompt-optimizer.tgz
下载地址:https://github.com/Y1X1n/dsh-prompt-optimizer/releases/latest/download/dsh-prompt-optimizer.tgz
cd dsh-prompt-optimizer
npm install --legacy-peer-deps # prepare 钩子会自动构建 lib/
npm pack # 产出 dsh-prompt-optimizer-<version>.tgz
dsh plugin --profile web add ./dsh-prompt-optimizer-<version>.tgz
然后(重新)启动 dsh web,打开 Web UI 即可在发送栏旁看到按钮。
Windows 注意:
dsh plugin add ./目录走 pnpm 的link:,目前会把盘符冒号错解析成协议分隔符,生成失效符号链接(node_modules/<pkg>指向不存在的路径),表现为插件不加载。本地安装请用上面的 tarball 形式;目录链接形式在 macOS/Linux 正常。
dsh plugin --profile web add github:Y1X1n/dsh-prompt-optimizer
Git 安装拉取的是源码,本包通过 prepare 脚本在安装时自包含构建(只需 Node,不依赖 monorepo 环境)。pnpm ≥10 首次会拒绝运行构建脚本,按终端提示把包名加入该 profile 的 pnpm-workspace.yaml 的 allowBuilds 后重试即可。建议锁定 commit:github:Y1X1n/dsh-prompt-optimizer#<sha>。
dsh plugin --profile web remove dsh-prompt-optimizer
@deepseek-ai/* 0.1.0-rc.7(与 npx @deepseek-ai/dsh@0.1.0-rc.7 内置包一致),最后验证日期 2026-08-19(Windows,真实 profile 安装 + Web 路由/客户端 bundle/端到端 LLM 调用)。httpServer,0.1.0-rc.x 运行时叫 webServer):本插件用 ctx.inject 同时等待两个名字,且不做静态硬依赖——即使服务名再次变化,也只会使本插件的路由不注册(10 秒后日志告警),不会拖垮整个 Harness 启动。dsh web 并刷新浏览器页面。[dsh-prompt-optimizer] 开头的日志;常见原因是未配置任何模型(先在 设置 → 模型 里配好提供方),或面板所需的上游槽位尚未就绪(刷新页面)。会话模型查询失败 的警告(此时会用第一个可用路由兜底)。注意:设置卡里固定了模型时会话选择不生效。dsh web 才生效;刷新页面不够。已在真实环境验证(dsh 0.1.0-rc.7,Windows):
--dump-config 出现 # == dsh-prompt-optimizer 层;[dsh-prompt-optimizer] loaded,优化路由与测试路由的 400/405/409/413 各路径行为正确,SSE 流式输出实测正常;window.__DSH_BOOT__,/plugins/dsh-prompt-optimizer/client.js 可访问;ctx.llm(DeepSeek 路由)完成「分析 + 优化」,标记解析正确(wellFormed: true)。npm test,共 55 例):test/smoke.mjs:27 项 Host 冒烟用例(真实 cordis Context + mock 服务,覆盖路由解析优先级、空字符串/畸形配置、400/405/409/413、SSE 事件流、max-tokens 截断、超时、快速模式、推理钳档、旧版设置文档归一化、连接测试、回退链、tool-calls 防御、输出上限自适应、上下文注入与硬开关、策略选择、记忆链注入与截断);test/prompt.test.mjs:12 项元提示词解析用例(标记空白变体、降级路径、流式实况解析、token 估算、上下文载荷与预算收敛、策略分叉、保真纪律与示例、记忆链载荷);test/controller.test.mjs:16 项客户端纯逻辑用例(SSE 帧解析、合帧节流、连接中断、跳过会话查询、撤回流转、retry、close 中止、历史提取过滤与失败降级、斜杠前缀拆分、记忆链传递与门槛、发送即关闭判定、耗时记录)。点击「优化」
→ Client 拆分斜杠命令前缀(/goal 等只优化正文),并行拉取当前会话模型选择
(session.models RPC,每次点击实时查询;设置里固定了模型时跳过,Host 固定值优先)
与会话近期对话(session.history RPC,最近 8 条/1600 字符封顶,可在设置卡关闭)
→ POST /dsh-prompt-optimizer/optimize { text, provider, model, reasoningEffort, context?, previous? }
(previous = 轻量记忆链:在优化稿上修改后再优化时携带的上轮结果)
→ Host 以系统元提示词调用 ctx.llm.stream()
(路由解析:设置固定值 → 会话选择 → 第一个可用路由;可配回退路由,零产出失败自动 failover;
策略分叉:有上下文走「提炼目的+润色」,无上下文走「结构模板」;
输出上限默认按输入 token 估算抬升;默认推理钳最低档/低温度)
→ text-delta 经 SSE 逐段推送,面板实时显示「分析诊断 / 优化结果」两段
(按 <<<ANALYSIS>>> / <<<OPTIMIZED>>> 标记增量解析,容忍标记空白变体)
→ done 事件携带最终解析结果;max-tokens 结束带 truncated 标记
→ 一键替换输入框(可撤回,自动拼回斜杠前缀)/ 复制 / 重新优化;发送消息后面板自动关闭
npm install --legacy-peer-deps # 安装依赖并触发构建
npm run sync:types # 同步客户端类型包(见下)
npm run typecheck # tsc --noEmit
npm run build # 产出 lib/{index,client,prompt,controller}.js
npm test # smoke + prompt + controller 三套测试
sync:types上游 monorepo 只发布了部分 @deepseek-ai/* 包(其余 publishConfig: restricted),客户端类型包的传递依赖无法直接从 npm 安装。scripts/sync-types.mjs 的处理方式:
npm pack 后直接解压进 node_modules(绕开 npm 依赖树解析);dsh-type-meta),扫描全部 .d.ts 引用并生成最小占位包(skipLibCheck 下仅要求模块可解析)。这些包只参与类型检查;运行时一律由 Harness 页面/进程提供(react、@deepseek-ai/* 均为外部依赖)。
dsh-prompt-optimizer/
├── package.json # dsh.bundle + dsh.client 双 manifest
├── cordis.patch.yml # 组合层:插入 Host 插件行
├── src/
│ ├── index.ts # Host 插件:设置命名空间 + 两条 HTTP 路由 + llm 调用(含回退链)
│ ├── prompt.ts # 元提示词、标记解析、token 估算(纯函数)
│ └── client/
│ ├── index.tsx # Client 入口:槽位注册
│ ├── controller.ts # 按钮/面板共享的状态机与 SSE 消费(独立产物,可单测)
│ ├── OptimizeButton.tsx # 发送栏按钮
│ ├── ResultDock.tsx # 输入卡上方的结果面板(流式实况 + 撤回)
│ ├── SettingsCard.tsx # 设置页折叠卡片
│ └── SparkleIcon.tsx # 手绘 ✨ 图标
├── scripts/build.mjs # esbuild:Host ESM + Client lazy-CJS factory + 两个测试用产物
├── scripts/sync-types.mjs
└── test/ # smoke.mjs(Host)/ prompt.test.mjs / controller.test.mjs
127.0.0.1;若把 dsh 暴露到局域网(0.0.0.0),本插件的优化接口同样可被局域网调用——它会消耗你配置的模型额度,请知悉。ctx.llm 路由。MIT
CLASSIFICATION EVIDENCE
系统优先读取 GitHub Topics,再与站内分类词典和词根规则比对。当前命中: 无有效分类标签。