dsh-web-search-ddg
aooyoo
Zero-token DuckDuckGo search provider for the DeepSeek Harness (DSH) web seam — local headless browser, no API key, no m…
PROJECT TOPICS
PROJECT README
让 DeepSeek Harness (DSH) 的模型 API 请求走本地代理端口、并在请求失败命中指定词汇时无限重试的插件,带本地端口探测和设置页。
面向的场景:你的模型 API 需要经过本地代理(Clash、v2rayN、Clash Verge、Privoxy 等)才能访问时,不用在系统层面改环境变量,直接在 DSH 设置里点几下就切过去。
dsh-llm-deepseek)用的是 Node 内置 fetch,走的正是这个 dispatcher,所以模型请求会被真正改走代理。config.json,重启 DSH 后自动恢复。DSH 的模型适配器直接调用全局 fetch(),而 Node 22 的 fetch(undici)默认不理会 HTTP_PROXY/HTTPS_PROXY 环境变量,也没有任何代理挂钩。要拦截它,唯一干净的办法是安装一个 undici ProxyAgent 作为进程全局 dispatcher:
import { ProxyAgent, setGlobalDispatcher } from 'undici'
setGlobalDispatcher(new ProxyAgent('http://127.0.0.1:7890'))
这必须发生在 host 进程里,所以本插件是一个 host 平面的 composition 行(和模型路由同一平面),不是一个 agent preset,也不是临时动态插件。
关键词无限重试的原理:DSH 在每次模型请求失败时触发 agent/request-error waterfall。内置的 dsh-llm-retry 按重试策略(默认有限次)处理,超限后把决策交给后续监听器。本插件注册在它之后,检查失败信息的 message/code/status 是否命中关键词,命中则等待配置的时长后返回 { kind: 'retry' },从而持续重试,直到成功或用户中止(尊重 turn 的 abort signal)。
dsh-model-proxy/
├── package.json # 包清单;dsh.client 声明 + exports["./client"]
├── lib/
│ ├── index.js # host 半边:代理 dispatcher + 端口探测 + /model-proxy/* JSON RPC
│ └── client.js # 浏览器半边:设置页(settings.section)
├── README.md
├── LICENSE
└── .gitignore
环境要求:DSH
>= 0.1.0-rc.6,webprofile(本插件注入webServer并注册设置页)。
把本目录放到 web profile 的 node_modules 下:
<DSH_HOME>/profiles/web/node_modules/dsh-model-proxy/
(DSH_HOME 默认是 ~/.dsh,即 Windows 上 C:\Users\<你>\.dsh。)
进入该目录安装运行依赖:
cd <DSH_HOME>/profiles/web/node_modules/dsh-model-proxy
npm install
编辑 <DSH_HOME>/profiles/web/cordis.patch.yml,加一行 insert:
- insert:
- id: model-proxy
name: dsh-model-proxy
重启 DSH,打开 设置 → 模型请求 (Model)。
发布到 npm:
npm publish
使用方在 profile 目录安装(或先 npm init -y 生成 package.json):
cd <DSH_HOME>/profiles/web
npm install dsh-model-proxy
其余步骤同「方式 A」的第 3、4 步。
已生效 · http://127.0.0.1:7890。lib/index.js 的 PROXY_PORTS),仅 9 个,因此探测很快:GET http://www.baidu.com/,返回 2xx 即视为可用 HTTP 代理。www.baidu.com(纯 HTTP、无需 TLS、国内可达),可用 TEST_HOST 常量替换;预设端口可在 PROXY_PORTS 里增删。运行期状态保存在包内 config.json(已加入 .gitignore):
{
"enabled": true,
"port": 7890,
"type": "http",
"retryKeywords": ["rate limit", "429", "timeout"],
"retryDelayMs": 3000
}
host 插件启动时读取并应用它,因此重启 DSH 会自动恢复。禁用代理时写入 enabled: false 并恢复初始 dispatcher。
undici v6 没有 SOCKS5 dispatcher(Socks5ProxyAgent),所以 SOCKS5 端口只探测展示、不参与路由;应用 SOCKS5 会返回明确错误。要支持 SOCKS5 路由,需升级到带 Socks5ProxyAgent 的 undici 版本或加一个 SOCKS→HTTP 转发层。web profile(依赖 webServer 服务和浏览器设置页)。fetch 的请求(模型、以及任何用 Node fetch 的组件)都会走该代理。| 依赖 | 说明 |
|---|---|
undici ^6 |
唯一运行时依赖,通过 setGlobalDispatcher 接管 Node 内置 fetch |
@deepseek-ai/cordis ^4 |
宿主提供(运行时注入 ctx) |
@deepseek-ai/dsh-host-webserver |
宿主提供 webServer 服务 |
@deepseek-ai/dsh-client-runtime / @deepseek-ai/dsh-client-ui-settings |
浏览器侧提供 slots 服务与 settings.section 槽位 |
CLASSIFICATION EVIDENCE
系统优先读取 GitHub Topics,再与站内分类词典和词根规则比对。