dsh-proxy-port:在 Composer 里用 /proxy 切换本地 HTTP 代理

前言

在 DeepSeek Harness(DSH)里,智能体常通过 web_fetch、全局 fetch() 等路径访问外网。这些请求并不各自读一份「用户刚改的环境变量」:web_fetch 会走宿主进程里 @deepseek-ai/dsh-http-proxy 的全局策略;仅给 undici 挂私有 dispatcher,或启动后再设 HTTP_PROXY,往往会出现工具侧与 fetch() 路由不一致、DNS pinning 仍按直连等问题。

下面介绍的 dsh-proxy-port(维护者 Acr1mony)面向上述机制:在运行时把 DSH 进程内的网络调用(含 web_fetch、fetch()、经 undici 的流量)统一到本地 HTTP 代理,端口用 Composer 命令切换,不必改配置文件重启才能试端口。

这是什么

  • 名称:dsh-proxy-port(仓库 Acr1mony/dsh-proxy-port)
  • 分类:联网工具(社区目录:SkillHub 插件页)
  • 版本(package.json):0.1.0;许可证:MIT
  • 定位:DSH 插件;通过 /proxy 命令与 local_proxy 工具,驱动宿主已加载的 @deepseek-ai/dsh-http-proxy 安装代理策略,并同步 process.env 中的 http_proxy / https_proxy 等,使子进程与库行为一致。回环地址始终绕过代理;该模块不接受 SOCKS / PAC,仅接受 http: / https: 代理。

社区插件目录为独立站点,与 DeepSeek / 幻方无官方从属关系;安装前请自行查看源码与许可证。插件在当前 DSH 进程权限下运行,代理策略为进程级,会影响该会话内的联网行为。

为什么需要单独插件

资料中的说明可概括为两点:

  1. web_fetch 不自行决定代理,而是调用 @deepseek-ai/dsh-http-proxy 的 proxyRouteFor(url),读的是模块内的进程级状态。
  2. 启动后设置的 HTTP_PROXY 不一定生效,因为模块会快照启动环境。

本插件通过 createRequire() 定位 Electron 包内真实的 @deepseek-ai/dsh-http-proxy 入口,再 import 同一模块实例,并用 installProxyFromEnvironment 传入模块能识别的 Map 形态(例如 env.get('http_proxy').value),从而替换全局 undici dispatcher 并发布环境变量。

核心功能

Composer 命令 /proxy

命令在宿主执行,不产生模型消息、不消耗 token。典型输入如下(摘自 README):

输入 效果
/proxy 7897 立即使用 http://127.0.0.1:7897,并在下次启动时保持
/proxy · /proxy status 显示当前地址、web_fetch 是否走代理、绕过列表、状态来源
/proxy off · /proxy on 卸载 / 重新安装策略(off 恢复启用前的路由)
/proxy http://10.0.0.5:3128 完整 URL(含 https: 代理或非本机 host)
/proxy 10.0.0.5:3128 host:port 形式

示例交互(README 摘录):

you:    /proxy 7897
plugin: proxy http://127.0.0.1:7897
        web_fetch and fetch() both use it
        bypass: loopback only
        source: saved state (enabled, host, port, proxyUrl)

持久化写入 profile 下的 local-proxy.json,优先级为:状态文件 → cordis 行配置 → 内置默认值。

工具 local_proxy

供模型侧查看同一状态(偏证据而非便利),支持 status、set(等同 /proxy)、diagnose(代理端口可达性与路由)、test(真实请求并报告路由)。

配置项(cordis 行 config,均可选)

键 默认 含义
enabled true false 时卸载策略,全部直连
host / port 127.0.0.1 / 7890 代理地址;非法 port 会警告并回退 7890
proxyUrl '' 完整 URL,优先于 host/port
noProxy '' 逗号分隔的绕过主机;回环始终绕过
childNodes true 向子进程发布代理变量及 NODE_USE_ENV_PROXY=1
verifyUrl https://example.com/ status / diagnose / test 默认探测 URL

安装与启用

环境要求(README):

  • DeepSeek Harness 桌面版 ^0.2.1-rc.2(Electron 构建;插件需定位 resources/app.asar 以加载宿主模块)。
  • 本地 HTTP 代理,支持 CONNECT(如 Clash、Clash Verge、v2ray、mitmproxy 等)。

package.json 中 engines.dsh 为 ^0.2.1-rc.2,超出范围的宿主会在安装阶段拒绝加载。

从 GitHub 安装(推荐)

插件页安装对话框与 plugin_manager 接受 pnpm git spec;仓库根即包根。请固定 commit,不要只写分支:

github:Acr1mony/dsh-proxy-port#<commit>
git@github.com:Acr1mony/dsh-proxy-port.git#<commit>

无 npm 发布,仓库即分发渠道。若探测 github.com 失败,可改用 SSH 形式;大仓库拉取失败时可先为 git 配置访问 GitHub 的 HTTP 代理(README 示例):

git config --global http.https://github.com.proxy http://127.0.0.1:7890

本地 checkout

file:/path/to/dsh-proxy-port

链接而非复制,修改后下次启动生效。

手动写入 profile

桌面 profile 名为 desktop;不能用 dsh plugin --profile desktop add …(CLI 会拒绝)。需在 ~/.dsh/profiles/<profile>/package.json 声明依赖并在 cordis.patch.yml 增加行覆盖,再用应用内置 pnpm 执行 install 后重启(无 HMR,新 bundle 仅下次启动加载)。行配置示例见仓库 README 中的 cordis.patch.yml 片段。

典型用法

  1. 安装并重启 DSH 桌面版。
  2. 确保本机代理已监听(例如 127.0.0.1:7897)。
  3. 在 Composer 执行:
/proxy 7897
  1. 需要确认时用 /proxy status,或由模型调用 local_proxy 的 status / test。

无命令界面的 headless 宿主仍可挂载工具;插件对 commands 服务为可选依赖,无命令面时会跳过 /proxy 注册而非无法加载。

适用场景与注意

适合:开发者在 DSH 会话中临时切换 Clash / Verge 等本地 HTTP 代理端口;需要 web_fetch 与 fetch()、子进程环境一致走同一代理的场景。

注意:

  • 仅 HTTP(S) 代理;SOCKS、PAC 不被 @deepseek-ai/dsh-http-proxy 接受。
  • 策略为进程级;/proxy off 会恢复插件启用前的路由。
  • 安装前阅读 GitHub 仓库 源码与 MIT 许可证;勿在未审计的情况下在生产敏感环境启用。
  • 仓库 README 提供 node test/smoke.mjs 等测试,需在理解其会发起真实代理流量后再本地运行。

结尾

dsh-proxy-port 把「改代理端口」从改配置、猜环境变量,收成 Composer 里一条 /proxy 命令,并对接 DSH 真实的 HTTP 代理模块与子进程环境。需要安装 spec、配置字段与命令表时,以仓库 README 为准。

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

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

Xiaoye