dsh-model-endpoint:把 Harness 当前模型发布成 OpenAI 兼容 HTTP 端点

前言

DeepSeek Harness(DSH)在聊天和「模型」设置里已经接好了各提供方的凭据与路由,但 Harness 本身并不对外提供入站 HTTP API。若你想用 openai SDK、LangChain、Cline、shell 脚本或另一台 Harness 实例去调用「此刻 profile 正在用的那个模型」,常见做法是再配一套网关或重复维护密钥。下面介绍的 dsh-model-endpoint 由社区维护者 Xxsttb 发布,分类为模型推理;它在本机(或你指定的绑定地址)单独起一个监听器,把当前 profile 的模型暴露成 OpenAI 兼容端点,客户端通常只需改 base_url。

这是什么

dsh-model-endpoint 是 DSH 插件(npm 包名 dsh-model-endpoint,当前版本 1.0.0,MIT 许可证)。它把 DeepSeek Harness profile 当前正在使用的模型发布成一个 OpenAI 兼容的 HTTP 端点;监听器由插件自行创建,不占用 Harness 的 Web 服务器。任意 OpenAI 兼容客户端指向插件打印出的 base URL 即可作答,一般不需要第二份模型凭据——客户端侧除 base URL 外无额外配置(若你启用了 API key,则需 Bearer 鉴权)。

核心功能

HTTP 端点(独立监听器)

默认示例端口为 8787(可在设置中修改)。主要路由如下:

方法 / 路径 作用
GET /v1/models 列出本 profile 可路由的模型(含 provider/model 与裸 id)
GET /v1/models/<id> 单个模型对象,否则 404 model_not_found
POST /v1/chat/completions 对话补全,支持流式(SSE)与非流式
GET /health、GET / 绑定状态、可达性、鉴权模式、当前模型

绑定地址由你决定:127.0.0.1 仅本机,0.0.0.0 面向局域网;同一端口经路由器或 NAT 转发后可从公网访问,请求路径与上述三种拓扑无关。

模型解析顺序

端点按优先级选择实际服务的模型:

  1. 请求体里的 model(须可路由;接受 provider/model 或裸 id)
  2. profile 当前选择(与聊天选择器、「模型」设置页一致;在聊天里换模型,端点跟着换)
  3. 插件设置页上的备用提供方与模型
  4. 无论 followSelection 是否关闭,仍作为最后手段使用,避免无模型可路由时直接 503

若仍无法解析,返回 503 model_unavailable,报文会列出各失败候选及原因。客户端可用 model: "auto"、"default" 或省略该字段,表示使用 profile 当前选中项。

流式、推理强度与工具

  • 流式:"stream": true 时以 SSE 返回;文本在 delta.content,推理在 delta.reasoning_content;工具调用为带索引的 delta.tool_calls;思考期间有保活注释;用量在最后一个 chunk 与 finish_reason 一并给出。
  • 推理强度:仅当被服务模型声明了 reasoning_effort 时才生效,否则用模型默认;设置页为省略该字段的请求提供默认值。
  • 调用方自带工具:请求中的 tools 会转发给模型,端点不执行这些工具,结果以 finish_reason: "tool_calls" 交还调用方。
  • 借出的工具(默认关闭):可把本 Harness 已注册且你在设置里逐个打开的工具借给模型,由端点经 Harness 工具运行时执行并回填,单请求内完成往返,上限为 Max tool rounds(默认 8),超限返回 409 tool_round_limit。

另有几条路由挂在 Harness Web 服务器上(非独立监听器),供设置页读取状态、模型目录、推理强度与工具开关,例如 GET /plugins/model-endpoint 等。

设置页与安全

安装后在 设置 → Model endpoint 配置。字段包括:是否运行端点、绑定地址、端口、API key、是否跟随当前模型、备用模型、推理强度、额外 system prompt、默认 max_tokens、请求超时、CORS 允许的浏览器来源、是否借出工具及逐工具开关等。修改后监听器会重新绑定;状态块显示实际绑定端口与本机可达地址。

安全要点(README 原文):仅绑定 127.0.0.1 时可不填 API key;绑定到本机以外且无密钥时,任何能连到该端口的人都可能消耗本 profile 的模型额度。端点本身无 TLS,公网暴露应在反向代理处终结 TLS或走隧道。

安装与启用

README 要求用 dsh plugin add 安装,不要手工改 profile 清单;也不要先 link: 再换 tarball(Windows 上可能清空链接指向的源码目录)。

从检出目录或打包 tarball 安装:

dsh plugin --profile desktop add /absolute/path/to/dsh-model-endpoint
# 或者
pnpm pack --pack-destination dist
dsh plugin --profile desktop add /absolute/path/to/dist/dsh-model-endpoint-1.0.0.tgz

插件会自行挂载、启动监听器,并在「设置」下添加 Model endpoint 页面。

验证:

curl http://127.0.0.1:8787/health
curl http://127.0.0.1:8787/v1/models

卸载:

dsh plugin --profile desktop remove dsh-model-endpoint

典型用法

OpenAI Python SDK

鉴权关闭时,api_key 可为任意非空字符串(例如 "unused"):

from openai import OpenAI

client = OpenAI(base_url="http://127.0.0.1:8787/v1", api_key="unused")
client.chat.completions.create(
    model="auto",
    messages=[{"role": "user", "content": "hello"}],
)

curl(含流式)

curl http://127.0.0.1:8787/v1/chat/completions \
  -H 'content-type: application/json' \
  -d '{"model":"auto","messages":[{"role":"user","content":"hello"}],"stream":true}'

局域网或公网

  1. 将 Bind address 设为 0.0.0.0,并设置 API key。
  2. 从设置页状态块读取 Local network URL。
  3. 公网访问时在路由器上转发该端口到本机,客户端使用公网地址即可;端点无需感知转发。

适用场景与注意

适合谁:已在 DSH 里配好模型路由,希望用现有 OpenAI 生态工具或远程机器调用同一 profile 的模型;需要 SSE 流式、可选 Bearer 鉴权与 CORS 的本地或 LAN 网关场景。

运行权限:插件与当前 DSH 进程同权;若开启「借出的工具」,模型可能触发本机已注册工具(含读写文件、执行代码、访问网络等),请只打开你愿意替潜在未鉴权调用方执行的开关,并在非本机绑定时务必使用 API key。

安装前:社区目录 SkillHub 与 DeepSeek / 幻方无官方从属关系;安装前应自行审阅 GitHub 仓库 源码与 MIT 许可证。README 含免责声明:功能经作者对运行中 profile 与测试台验证,但不保证与后续 Harness 版本兼容。

错误响应遵循 OpenAI 信封格式;常见状态码包括 401 invalid_api_key、404 model_not_found、409 tool_round_limit、503 model_unavailable 等,上游失败会保留 Harness 侧分类(如限流、额度、上下文超长)。

结尾

经过上面的步骤,你可以把 DSH 里已选中的模型变成标准 OpenAI 兼容 HTTP 服务,而无需为每个客户端重复配置提供方密钥。更多细节见仓库中文 README;插件条目见 SkillHub 目录页,源码见 GitHub — Xxsttb/dsh-model-endpoint。

羽毛球分组比赛记分
小程序二维码

欢迎使用《羽毛球分组比赛记分》微信小程序

Xiaoye