Leafyezi233/dsh-model-gateway ↗★ 0

@leaf233/dsh-model-gateway

Model relay station for DeepSeek Harness (模型中转站): serve any registered DSH LLM provider (e.g. @tnnevol/dsh-codebuddy) over an OpenAI-compatible /v1 API, so other projects can call those models with a standard OpenAI client. 适合需要将DSH内部模型暴露给其他标准OpenAI客户端调用的用户。

Package
@leaf233/dsh-model-gateway
Compatibility
Unverified
Harness peer range
0.1.2-rc.1 || ^0.1.5-rc.2 || ^0.1.6-alpha.1 || ^0.1.7-alpha.1
Cordis peer range
^4.0.2
Version
1.0.0
License
NOASSERTION
Last updated
Oct 1, 2026

Install

$npx -p @deepseek-ai/dsh dsh plugin --profile web add github:Leafyezi233/dsh-model-gateway

配置项

字段默认说明
lanPortfalsefalse 关闭;端口号开启独立监听;0 让系统分配一个空闲端口
lanHost0.0.0.0监听地址。只想给某一个网卡用时填该网卡的 IP

lanPort 是整数(0–65535)或 false,其他值会在加载时直接报错,而不是等到运行时才发现。

配置(可选)

在 profiles/web/cordis.patch.yml 里按 id 覆盖:

- id: dsh-model-gateway
  inject:
    - llm
    - webServer
  config:
    # 挂载点,默认 /v1
    path: /v1
    # 固定密钥:配了就校验,没配就放行。支持 Authorization: Bearer 和 x-api-key。
    # 与设置页创建的密钥同时生效;配置里存在固定密钥时,设置页无法关闭鉴权。
    apiKeys:
      - sk-your-key
    # 只暴露这些 provider,默认全部
    # 填 [dsh-model-gateway] 可以让外部只看到分组、看不到底层模型。
    # 这是「对外」的过滤,不影响 DSH 自己能看到什么。
    providers:
      - codebuddy
    # 裸模型名的优先 provider
    defaultProvider: codebuddy
    # 跨域响应头,默认 true
    cors: true
    # 密钥存储路径,默认 /model-relay-keys.json
    keysFile: /path/to/keys.json
    # 分组存储路径,默认 /model-relay-groups.json
    groupsFile: /path/to/groups.json
    # 局域网独立监听端口(详见上文"局域网访问");false 或不写即关闭
    lanPort: 3081
    # 监听地址,默认 0.0.0.0
    lanHost: 0.0.0.0
    # 统计持久化,默认 true;false 恢复 0.4.x 的纯内存行为
    statsPersist: true
    # 统计存储路径,默认 /model-relay-stats.json
    # statsFile: /path/to/stats.json
    # 天级统计保留天数,默认 90(可设 1–365)
    # statsRetentionDays: 90

本插件不 patch connection 那一行。

早期版本曾用 bundle patch 复写 connection 的 inject,想把它补成 webRuntime + webServer。这个做法是错的:loader patch 是整值替换(dsh-app-boot 的 applyEntryPatches 做的是 target[key] = value),不合并,所以它不是"补充"而是"覆盖掉别人写的所有内容"。

在真实组合里那一行还带着其他层的要求:dsh-webgate 会加上 lanAccessHosts 和从 ctx.lanAccessHosts 读的 trustedHosts;connection 自己声明 inject: ["webServer", "credentials"] 并直接读 ctx.credentials 构造 BrowserAuth。覆盖它会同时丢掉 lanAccessHosts 和 credentials,导致 Connection 起不来——整个 /api 通道连同 Web 界面一起挂掉,不只是本插件的设置页。

结论:connection 由 bundle 栈组合,插件只消费它的服务,不去定义它的依赖。需要 connection RPC 的插件各自声明 inject 即可,不需要(也不应该)由本插件代为维护那个并集。