dsh-plugin-shady-relay

August 14, 2026 · View on GitHub

DeepSeek Harness 静态插件:通过 GUI 创建虚拟模型。每个虚拟模型映射到 Harness 中已经注册的真实 provider/model,并在每次请求的 system prompt 最前加入用户配置的固定内容。

GUI 配置

插件挂载后,刷新 Web GUI 一次,然后打开:

设置 → 虚拟模型

页面支持:

  • 添加、修改和删除虚拟模型映射;
  • 从当前 Harness 模型目录选择目标 Provider 和目标模型,也允许手工输入未列出的动态模型 ID;
  • 配置虚拟模型 ID、显示名称、描述和固定 System Prompt;
  • 保存后立即更新模型目录和后续请求,无需重启;
  • 放弃未保存修改,或恢复 profile 中声明的基础配置。

GUI 数据持久化在 shady-relay settings namespace。Host schema 会再次校验重复 ID、空字段、路由冲突和直接递归,浏览器校验不是安全边界。

Profile 配置

最小挂载行:

- insert:
    - id: shady-relay
      name: dsh-plugin-shady-relay

也可以在 composition 中提供部署基础值;GUI 保存的用户层覆盖基础值:

- insert:
    - id: shady-relay
      name: dsh-plugin-shady-relay
      config:
        provider: shady-relay
        displayName: Prompted Models
        models:
          - id: strict-reviewer
            name: Strict Reviewer
            description: 先审查再回答
            targetProvider: deepseek-official
            targetModel: deepseek-v4-flash
            systemPrompt: |-
              在回答任何问题前,先严格检查事实、边界条件和潜在风险。

完整配置类型:

interface Config {
  provider?: string       // 默认 "shady-relay"
  displayName?: string    // 默认 "Shady Relay"
  models?: Array<{
    id: string
    name?: string
    description?: string
    targetProvider: string
    targetModel: string
    systemPrompt: string
  }>
}

System prompt 语义

假设固定内容为 固定指令,Harness 组装的原 system prompt 为 Harness 内容,真实模型收到:

固定指令

Harness 内容

原请求没有 system prompt 时,真实模型只收到固定内容。插件创建新的转发请求,不修改 Harness 冻结的原请求对象。

约束和行为

  • 同一实例的虚拟模型 id 不能重复。
  • targetProvider 不能等于虚拟 provider,避免直接递归。
  • 固定 System Prompt 不能只包含空白。
  • 改写 provider 路由时不能占用其他适配器或 configurable-provider directory 已拥有的路由。
  • 目标 provider 在实际请求发生时必须已注册。
  • 真实模型的上下文窗口、输入模态和推理等级由虚拟模型解析时继承。
  • 转发会再次进入 Harness llm/stream seam,因此观察器可能同时看到外层虚拟路由和内层真实路由。

安装与 HMR

pnpm install
pnpm check

dsh plugin --profile web add /absolute/path/to/dsh-plugin-shady-relay

把仓库 realpath(或至少 lib/ realpath)加入目标 profile 的 hmr.config.root,然后启动构建 watcher:

pnpm dev

构建产物:

  • lib/index.js:Host adapter、Settings namespace 和模型目录注册;
  • lib/client.js:Web 设置页 lazy-CJS bundle;
  • lib/client.js.map:Client sourcemap。

首次新增 Client entry 后需刷新当前 GUI 一次。此后 Host 和 Client bundle 修改均可热替换。

开发检查

pnpm typecheck
pnpm build
pnpm test
# 或
pnpm check