dsh-proxy:按域名选路的 DSH 网络代理插件

前言

在 DeepSeek Harness(DSH)里跑智能体,模型 API 往往要跨公网访问。常见做法是整机设 HTTP_PROXY,或指望 DSH 自带的环境变量代理——请求要么全走代理,要么全直连,首字延迟里还常常夹着每次新建的 CONNECT 隧道与 TLS 握手。下面介绍的 dsh-proxy(维护者 ycm50)是社区插件,目标不是「把流量塞进代理」,而是按域名决定每条请求走代理还是直连,并在会话内定格通道、复用连接,且不修改 DSH 官方源码。插件目录页:skillhub.cn/plugins/ycm50/dsh-proxy;源码与说明:github.com/ycm50/dsh-proxy(当前版本 0.7.0,MIT 许可证)。

这是什么

dsh-proxy 在 DSH host 进程里安装进程级 undici dispatcher,并包装 globalThis.fetch,用两条自建通道(代理与直连)接管模型相关出站请求。卸载时会还原 dispatcher 与 fetch,并优雅关闭连接池。设置入口在 DSH 客户端:设置面板 → 左侧「HTTP 代理」,保存后下一次请求生效,一般无需重启(「记录尝试日志到文件」等同理)。

核心功能

强制名单 + 先直连、1 秒探测、通就定格

除内置豁免外,所有域名共用一套规则(0.7.0;早期「逐次轮换」已废弃):

  1. 强制走代理的域名(及子域名):永远走代理,不探测、不换道。
  2. 回环 / 内网 / LAN(如 localhost、127.0.0.0/8、10/8、172.16/12、192.168/16、.local 等):永远直连,任何配置改不动。
  3. 其它域名:第一次请求先直连,在 1000 ms(PROBE_TIMEOUT_MS)内拿到响应头则本会话定格直连;超时则试代理(同样 1 秒预算);代理仍不通则直连兜底一次;哪条通道先答上,该域名在本会话就定格在哪条通道。已定格通道之后若失败,才给另一条通道一次机会;慢不算失败,不会因慢而轮换。

每个新会话(session/created)会清空按域名的记忆,因此每个会话的第一条外网请求仍会先走直连(强制名单除外)。

连接复用与超时

连接池空闲窗口为 120 秒(POOLED_IDLE_WINDOW_MS),同一会话多轮对话可复用同一条(代理)隧道,减轻首字前的握手成本。README 中记录的本机实测:新建代理隧道约 1.3–1.9 s,复用约 0.2–0.3 s。

设置里可调建连超时(默认 60000 ms,不建议低于 30000)、响应头超时、流空闲超时、连接重试次数与退避等;代理地址留空则插件不生效。

系统代理与子进程

可勾选「使用系统代理」,从 Windows / macOS / Linux 读取本机代理并填入地址。开启「插件安装/更新也走代理」时,会把代理写入子进程环境,让 pnpm / git 等在安装插件时也走代理;仅当代理地址为 http/https 时生效。

诊断

  • 环境变量 DSH_PROXY_DEBUG=1:每次请求记录通道、新建/复用连接、响应头与首个 SSE 分片耗时。
  • 设置中打开「记录尝试日志到文件」:尝试与挂载/卸载事件追加到 <DSH_HOME>/dsh-proxy.log。

也可仅用环境变量指定代理地址(选路仍由名单与规则决定):

$env:DSH_HTTP_PROXY = 'socks5://127.0.0.1:7890'

变量名保持 DSH_HTTP_PROXY,与 DSH 自带的 HTTP_PROXY / HTTPS_PROXY 互不影响。

兼容性

插件版本 需要的 DSH
0.7.0 ≥ 0.2.0-rc.1

更早版本策略与字段有差异;从 0.2.x(包名 dsh-http-proxy)升级需装 dsh-proxy 并移除旧包,profile bundles 中的 id 改为 dsh-proxy,设置需重新填写。

安装与启用

官方安装命令(lib/ 已提交,无需构建;装完重启一次 DSH):

dsh plugin --profile <profile名> add dsh-proxy@github:ycm50/dsh-proxy

本地 tarball 示例:

dsh plugin --profile <profile名> add dsh-proxy@file:/绝对路径/dsh-proxy-0.3.0.tgz

README 注明尚未发布到 npm;发布后可用 dsh-proxy@<版本号> 形式安装。

典型用法

  1. 在「HTTP 代理 → 连接」填写 http / https / socks4 / socks4a / socks5 / socks5h 代理地址,或勾选「使用系统代理」。
  2. 若某站点直连极慢但代理正常,把域名写入「强制走代理的域名」(逗号分隔,支持域名、端口、URL、.后缀)。
  3. 需要排查选路时,临时打开日志或 DSH_PROXY_DEBUG=1,对照 dsh-proxy.log 或控制台中的 attempt N via direct/proxy 行。

延迟对比可用仓库内脚本(需网络与代理,不参与默认测试):

node test/latency-bench.mjs --url https://api.opencode.ai/v1/models --proxy http://127.0.0.1:10808 --runs 3 --gap 15000

适用场景与注意

适合:需要在 DSH 内按域名分流、减少会话内重复握手、且希望不改官方代码的开发者。

注意:

  • 插件以当前 dsh 进程权限运行,安装前请自行审阅 源码与许可证。
  • 1 秒探测以「拿到响应头」为准,超时 abort 后可能已在服务端产生请求;对可能重复计费的接口宜写入强制名单,或关闭「可能已送达也重试」。
  • 请求体不可重放时不会设 1 秒预算也不会换道重发。
  • SkillHub 等为社区目录,与 DeepSeek / 幻方无官方从属关系。

结尾

dsh-proxy 用「强制名单 + 直连/代理探测 + 会话定格 + 120 秒连接复用」把出站网络从「全站一种走法」拆成可观测、可配置的 per-host 策略,并保留完整卸载还原。进一步了解请查看 GitHub README 与 SkillHub 目录页。

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

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

小夜