前言¶
在 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;早期「逐次轮换」已废弃):
- 强制走代理的域名(及子域名):永远走代理,不探测、不换道。
- 回环 / 内网 / LAN(如
localhost、127.0.0.0/8、10/8、172.16/12、192.168/16、.local等):永远直连,任何配置改不动。 - 其它域名:第一次请求先直连,在 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@<版本号> 形式安装。
典型用法¶
- 在「HTTP 代理 → 连接」填写
http/https/socks4/socks4a/socks5/socks5h代理地址,或勾选「使用系统代理」。 - 若某站点直连极慢但代理正常,把域名写入「强制走代理的域名」(逗号分隔,支持域名、端口、URL、
.后缀)。 - 需要排查选路时,临时打开日志或
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 目录页。