Skip to main content

dsh-web-network/packages/dsh-web-network

20Stars1Forks1Issues0Watchers

Manages network requests and connectivity for the browser-only build of DeepSeek Harness, handling API calls and data transfer.

Evidence4/5methodologySourceInstallMaintenanceDSH versionSecurity scan
Machine-auditedInstall commandRepo verifieddsh-plugin topicLicenseREADMEAI wiki

ⓘ This plugin is a sub-package of the futrime/webdsh monorepo — stars and activity count the whole repository.

Language
TypeScript
License
Apache-2.0
Branch
main
deepseekdeepseek-harnessdshdsh-plugin

Install

cmdweb profile
$ dsh plugin --profile web add github:futrime/webdsh#path:packages/dsh-web-network

Run the command above in your terminal to install this plugin via the dsh CLI. You can switch Profile in the top-right corner. New to dsh? Read the beginner tutorial

Install via your agent

Install the DeepSeek Harness plugin futrime/webdsh/packages/dsh-web-network for me: review the repository at https://github.com/futrime/webdsh first, then run the install command and verify the plugin loads successfully.

Paste this instruction to the DSH Web GUI assistant — it will install and verify for you.

一句话定位

webdsh 是把 DeepSeek Harness 跑在浏览器里的纯静态发布版。本条目描述它自带的 Network 设置面板子包 @dsh-web/network:在 webdsh 的 Settings 里插一个 "Network" 面板,让你选/测/关页面的 CORS 兜底代理——浏览器直接请求被拒时,自动改走这个代理再试一次。

核心能力

  • 在 Settings 里渲染一个独立的 "Network" 面板(顺序排在 Models=10 与 Plugins=15 之间,order=12),含启用开关、代理 URL 输入框、Save/Test/Reset 按钮,以及本次会话被代理过的 origin 列表(client.tsx:246-252)。
  • 把代理配置存到 localStorage 的 dsh-web:network 键;键里只有 enabled 与 template 两项,默认 { enabled: true, template: 'https://proxy.cors.sh/{url}' }(cors-proxy.ts:75-78)。
  • 提供一个 Test 按钮:对候选代理做一次 GET https://api.openai.com/v1/models,401 视为成功("到了 OpenAI,没带 key"),429 报被限流,其他 4xx 报被拒,15 秒无应答报超时;被测代理在测试期间临时进 excluded,不会被配置的代理"救回来"误报可用(cors-proxy.ts:292-347,client.tsx:99-110)。
  • 每 2 秒拉一次"本次会话已代理过哪些 origin",只有非空才显示;这就是"代理有没有真用上"的可信答案(client.tsx:79-82,206-214)。
  • 在面板下方写明:代理看得到完整请求(URL、头、body,含模型请求里的 API key),并提示可填自己的代理或干脆关掉(client.tsx:198-204)。

技术实现

  • 语言: TypeScript + React (.tsx),跑在浏览器 webdsh 内
  • 关键依赖: @deepseek-ai/cordis(ctx.get('slots') 拿注册入口);React 18 hooks(useState / useEffect / useCallback);宿主由 @deepseek-ai/dsh-client-runtime 与 @deepseek-ai/dsh-client-ui-settings 提供注入点(见 package.json dsh.client.inject);实际代理执行在 src/net/cors-proxy.ts,由 @deepseek-ai/dsh-web-app 在启动时 publishNetworkBridge() 挂到 globalThis.__DSH_WEB_NETWORK__ 上(bridges.ts:303-314,main.ts:89)
  • 架构模式: cordis bundle 子包,profile bundle 层。cordis.patch.yml 用 - insert 把 id: web-network、name: '@dsh-web/network' 写进 host profile 的 composition。分两半:src/index.ts 是 host 半区(故意空——只为了把 dsh.client 声明挂在 composition 里;代理策略本身在 app 侧,早于任何 plugin 加载);src/client.tsx 是 browser 半区,等 slots 服务后,把 React 组件注册成 settings.section slot(order 12,label "Network")
  • 入口文件: packages/dsh-web-network/src/index.ts(host,空壳)、packages/dsh-web-network/src/client.tsx(browser,面板)、packages/dsh-web-network/cordis.patch.yml、packages/dsh-web-network/package.json

适用场景

当用户通过浏览器跑 webdsh,想用对浏览器不开 CORS 的 provider(OpenAI、NVIDIA、Cerebras、Vercel AI gateway、codeload.github.com,以及默认的 opencode.ai/zen 免费通道)却发现请求一直 Failed to fetch 时,打开这个面板:勾选启用、把代理 URL 改成自己跑的或公共代理,Save 后下一次跨域失败就会自动重试一次,且面板下方会把"哪些 host 真的走了代理"列出来供你判断。

前置依赖与兼容性

依赖最低版本说明
DSH / Harness0.1.0-rc.7+与同仓锁定的 @deepseek-ai/dsh-* 同代,子包 package.json 未单独声明 peer
webdsh profile必须安装浏览器端 webdsh,仅 platform: "web" 的 profile 有效
构建侧 Node>=22跑 webdsh 仓库自身的 npm run build 等脚本需要,但插件运行(浏览器)不依赖 Node
平台跨平台仅在浏览器执行,无 host OS 限制
原生模块无全部走浏览器标准 API,无 Node 原生依赖
持久化localStorage dsh-web:network配置只活在浏览器本地,清掉浏览数据即重置

安装方式

dsh plugin --profile web add github:futrime/webdsh/packages/dsh-web-network

配置项

本插件没有独立的 Schema 字段。它呈现的是 webdsh 内置 CORS 代理策略的设置界面;实际读写由 src/net/cors-proxy.ts 完成,持久化在 localStorage 的 dsh-web:network 键。

配置类型说明默认值
启用代理(enabled)布尔控制是否允许把浏览器直接拒收的跨域请求重试一次走代理;关掉后直接失败,不再兜底true
代理 URL 模板(template)字符串占位符 {url} 替换为目标地址原文,{encoded} 替换为 percent-encoded 形式;同时支持前缀式(https://host/{url})与 query 参数式(https://host/?url={encoded})https://proxy.cors.sh/{url}

常见问题

Q: 安装后从哪里打开 Network 面板?

A: 进入 webdsh 的 Settings,Network 一节排在 Models(顺序 10)与 Plugins(顺序 15)之间,标着 "Network";点开就是本子包渲染的面板。

Q: 这个面板在改什么?

A: 改的是页面里所有跨域请求的兜底代理:勾选开关 / 输入代理 URL(支持 {url} 与 {encoded} 占位符) / 点 Test 实际试一次 / 点 Reset 回到默认。代理执行在 src/net/cors-proxy.ts,本插件只管设置页。

Q: 默认代理是什么?能换吗?

A: 默认是 https://proxy.cors.sh/{url},备选是 https://cors.eu.org/{url}——这两个都从该页面实测过能用(带 authorization 头与 JSON body 的 POST 通过,并返回 access-control-allow-origin: *);文本框接受任何带 {url} 或 {encoded} 占位符的前缀或 query 参数代理,Reset 一键还原默认。

Q: 代理什么时候会被用?所有请求都过它吗?

A: 不是。所有请求都先直发,只有浏览器以 TypeError(就是 CORS / DNS / 连接失败那一类)拒收时才用代理重试一次;一旦该 origin 走代理成功,就被记入 memo,下次直接走代理;若代理本身又失败,memo 立刻被清,重新测量。代理本身被排除,不会自递归。

Q: WebContainer 里 agent 跑的命令也会过这个代理吗?

A: 不会。WebContainer 的请求从 StackBlitz 的 worker 出去,sw.js 与本代理都碰不到;src/host/jsh-tool.ts 读的是同一份配置,把可用 host 列出来告诉 model。因此改完面板后需要刷新页面让 shell 工具读到新值。

Q: Test 按钮在测什么?

A: 对候选代理做一次 GET https://api.openai.com/v1/models,被测代理在测试期间临时加进 excluded(防止它被配置的代理"救回来"误报可用),15 秒超时;返回 401 = 到了 OpenAI 但没带 key,正是预期;<400 也算通;429 报被限流;其他 4xx 报被拒;超时专门报。

Q: 面板里那个 "Proxied this session" 列表是什么?

A: 本次会话里"必须靠代理才答得上"的 origin 列表,每 2 秒从 __DSH_WEB_NETWORK__.proxied() 拉一次,只有非空才显示;它就是"代理有没有真用上"的可信答案,而不是估算。

Q: 关掉代理有什么副作用?

A: 关掉后,直接请求被浏览器拒收的 origin(OpenAI、NVIDIA、Cerebras、Vercel AI gateway、codeload.github.com,以及默认用的 opencode.ai/zen 免费通道)会一直失败,直到你在 Models 里改用对浏览器开 CORS 的 provider。面板在关闭状态下会显式提示这件事。

上手难度

入门——装上即在 Settings 多一个 "Network" 项,默认开着就能用,改不改 URL 都不影响普通使用;想自托管代理或临时关掉,看一眼面板上的提示即可。

已知问题与限制

  • 公共代理(proxy.cors.sh、cors.eu.org)会缓冲响应:流式模型回复会整段一次性返回,期间页面看起来"什么都没发生",只有回复完整了才一次性出现;想避免只能跑自己的代理(client.tsx:190-195)。
  • WebContainer 里 agent 跑的命令(jsh、python3、git 等)走的是 StackBlitz worker 的出栈,本页面的代理碰不到,所以"代理帮得了浏览器请求,帮不了容器里的命令"(cors-proxy.ts:28-32,jsh-tool.ts:70)。
  • 配置生效需要刷新页面:agent 的 shell 工具是在页面加载时读的 proxy 配置,改完保存后,下一次刷新才会让模型知道新的可用 host 列表(README.md:103-104 与 client.tsx:135-139)。
  • 已代理 origin 列表每 2 秒拉一次,不实时;若你刚保存了一个新代理、立刻发起了一个被拒请求,列表可能要等到下一次轮询才更新(client.tsx:79-82)。

Read the usage guide →

Install steps, key points, FAQ and compatibility for this plugin — auto-derived from indexed fields.

Listing badge

Listed on deepseek-plugin.org
[![Listed on deepseek-plugin.org](https://img.shields.io/badge/listed_on-deepseek--plugin.org-007EC6)](https://deepseek-plugin.org/plugins/futrime/webdsh/packages/dsh-web-network)

Paste this markdown into your GitHub README to link back to this listing. The badge only states the listing — not a security endorsement.

← Back to plugin directory