前言¶
在 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 进程权限下运行,代理策略为进程级,会影响该会话内的联网行为。
为什么需要单独插件¶
资料中的说明可概括为两点:
web_fetch不自行决定代理,而是调用@deepseek-ai/dsh-http-proxy的proxyRouteFor(url),读的是模块内的进程级状态。- 启动后设置的
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 片段。
典型用法¶
- 安装并重启 DSH 桌面版。
- 确保本机代理已监听(例如
127.0.0.1:7897)。 - 在 Composer 执行:
/proxy 7897
- 需要确认时用
/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 为准。