前言¶
DeepSeek Harness(dsh)默认把 Web UI 开在 http://127.0.0.1:3080。本机浏览器里一切正常:会话列表能出来,模型也能选。一旦换成手机、平板,或者同一网段里另一台电脑去打开 http://192.168.x.x:3080,常见现象是页面壳能加载,侧边栏却是空的,控制台里出现 TypeError: crypto.randomUUID is not a function。
这件事不是「端口没通」。官方仓库讨论区 #2396 已经把链路拆开了:服务端在绑定 0.0.0.0 之后,会把本机局域网 IPv4 加进 /api 信任围栏,用 curl 打 session.list 也能返回数据;真正卡住的是浏览器前端。Web UI 在 RPC id、消息 id、草稿附件这几条启动路径上直接调用了 crypto.randomUUID(),而这个 Web API 只存在于安全上下文(HTTPS,或者 http://localhost / http://127.0.0.1)。局域网纯 HTTP 地址不算安全上下文,API 是 undefined,后续 RPC 全部抛错,会话和模型自然渲染不出来。
新版 harness 还在命令行上硬性拒绝 --host 0.0.0.0,本意是避免把无鉴权的 agent 接口暴露到整张网。配置层的 webserver 仍然接受这个值,所以「绑到全接口」这条路并没有被堵死,只是前端缺了一块补丁。社区插件 dsh-web-lan-access 做的就是这件事:不改产品源码,把局域网访问补完整。
插件定位¶
dsh-web-lan-access 是一款界面增强插件,由 AcidGr 维护,MIT 许可证,主要语言是 JavaScript。npm 当前版本为 1.1.0(2026-08-16 发布)。GitHub 仓库为 AcidGr/dsh-web-lan-access,截至 2026-08-18,仓库有 18 个 star。社区目录把它归在「界面增强」,收录日期是 2026-08-14。
它解决的问题可以压成一句话:让 DeepSeek Harness 的网页界面在局域网 IP、Tailscale IP 或普通主机名这类非回环、纯 HTTP 来源下,也能把会话和模型正常画出来。
DeepSeek Harness 本身是 DeepSeek AI 的开源智能体运行时,架构口号是「一切皆插件」。本文介绍的目录站点 DeepSeek Harness 插件库 是独立的社区目录,与 DeepSeek / 幻方没有从属或背书关系,不托管插件代码。安装前请直接看维护者仓库。
它具体做了两件事¶
仓库 README 和 package.json 把能力写得很明确,插件是自包含的,包含两层:
1、注入 crypto.randomUUID polyfill。宿主端插件挂在 webserver 的官方扩展点 webServer.tapIndex 上,每次下发 index.html 时,在 <head> 最前面插入一小段脚本,位置在启动清单和 shell 入口之前。polyfill 按 RFC 4122 v4 用 crypto.getRandomValues 生成 UUID——这个 API 在非安全上下文里仍然可用。如果当前页面已经有 crypto.randomUUID(HTTPS 或 localhost),这段脚本直接 return,等于空操作。卸载插件后 tap 会随行一起拆除,页面恢复原样。
2、把 webserver 绑定到 0.0.0.0。bundle 自带的 cordis.patch.yml 直接改 webserver 配置里的 host,端口仍走 CLI 的 --port(默认 3080)。这样不需要改 harness 源码,也不需要被拒绝的 --host 参数。绑定全接口后,harness 会通过 resolveLanTrust 把本机所有非内部 IPv4 自动加入 /api 信任围栏,局域网用 IP 访问通常不用再配 trustedHosts。
README 还强调三点实现约束:不修改产品源码、只转换下发的 HTML 因而与 harness 版本解耦、跨 Linux / macOS / Windows / Android。
安装¶
目录页给出的安装命令如下,在 DeepSeek Harness 终端里运行即可:
dsh plugin add github:AcidGr/dsh-web-lan-access
维护者 README 更推荐写到 web profile 上,避免装进默认配置却启动了别的 profile:
dsh plugin --profile web add github:AcidGr/dsh-web-lan-access
如果环境能直接解析 npm 包名,也可以:
dsh plugin --profile web add dsh-web-lan-access
装完后重启 dsh web,浏览器做一次硬刷新(绕过缓存)。
目录页同时提醒:如需可复现安装,把 commit 哈希钉死:
dsh plugin add github:AcidGr/dsh-web-lan-access#<commit>
把 <commit> 换成仓库里实际的提交哈希。插件以当前 dsh 进程的权限运行,安装时可能执行代码,装之前应检查源码仓库和许可证。
离线或没有 pnpm 时,README 提供了手动拷贝到 $DSH_HOME/profiles/web/plugins 并在 cordis.patch.yml 里插入 lan-access 行的做法。日常使用走上面的 bundle 安装即可。
启动与访问¶
安装之后正常启动,不要再加 --host:
dsh --profile web --port 3080
本机仍可用 http://127.0.0.1:3080。同一局域网里的其他设备,用这台机器的局域网 IP 加端口打开,例如 http://192.168.1.66:3080。多网卡时选真实局域网地址,不要用仅本机可达的虚拟网卡。
如果走 Tailscale、MagicDNS 或自定义域名,需要把访问时浏览器实际带上的 Host 头写进 trustedHosts。围栏是逐字比对,短名和完整域名不是一回事。README 里的示例结构如下:
- id: web-runtime
config:
trustedHosts:
- myhost
- myhost.tailXXXX.ts.net
- 100.x.x.x
漏写短名时,典型症状是页面壳能开,所有 /api 调用返回 403,会话和模型仍然是空的。这和 crypto.randomUUID 缺失长得很像,但原因是信任围栏,不是 polyfill。
不想让插件接管绑定地址时,README 建议去掉 patch 里的 webserver 覆盖,保持监听 127.0.0.1,再用 socat、rinetd 或 Tailscale serve 做端口转发,并把转发入口手动加入 trustedHosts。
怎么确认已经生效¶
本机执行:
curl http://127.0.0.1:3080/ | grep lan-access-polyfill
有输出说明 index 注入已经挂上。然后再用另一台设备打开 http://<服务器IP>:3080,会话列表和模型选择应能加载。若本机 curl 能 grep 到标记、对端浏览器控制台仍报 crypto.randomUUID is not a function,先硬刷新,排除旧 HTML 缓存。
卸载:
dsh plugin --profile web remove dsh-web-lan-access
手动安装则删除 cordis.patch.yml 里的 lan-access 插入块。patch 是分层的,去掉之后 webserver 会回到默认的回环绑定。
已知限制¶
未修改的 harness 构建里,一部分敏感 API(settings.*、credentials.*、llm.discoverModels)被钉在仅回环可调用,与 trustedHosts 无关。远程来源访问这些接口会得到 403:聊天、会话、模型列表仍然可用,但设置页(包括插件配置卡片)和凭据界面会空白或报错。这是产品侧策略,polyfill 改不了。这类操作请回到 http://127.0.0.1:3080 上做。
适用场景与注意事项¶
适合已经在用 dsh Web UI、希望同一局域网里用手机或另一台电脑盯任务、改提示词、看会话的人;也适合经 Tailscale 等组网访问家里那台跑 harness 的机器,但要把实际 Host 写进 trustedHosts。
不适合把 dsh 直接暴露在公网 IP 上。绑定 0.0.0.0 之后,同一网络里任何设备都能无登录操作这个 agent——/api 只是来源围栏,不是账号体系。机器如果有公网地址,等于对整个互联网开放。请只在可信网络使用,或用防火墙限制来源网段,例如:
ufw allow from 192.168.0.0/16
更稳妥的做法是走 Tailscale,或前面加一层带鉴权的反向代理。若反代已经提供 HTTPS,浏览器处于安全上下文,crypto.randomUUID 本身就在,这个 polyfill 不再是刚需;那时要解决的是信任围栏和鉴权,而不是 UUID。
再重复一次安装安全:插件与当前 dsh 进程同权,安装即可能执行代码。社区目录不是官方应用商店,装之前打开 GitHub 仓库 看 README、lib/index.js 和 MIT 许可证。
小结¶
dsh-web-lan-access 并不增加新的聊天能力,它补的是 Web UI 在非安全上下文里缺的那一截:一段可逆的 randomUUID polyfill,外加把监听地址放到 0.0.0.0。装好之后,局域网设备才能真正用上已经跑起来的 DeepSeek Harness 界面。使用时把安全边界看清楚:无鉴权、设置页仍限本机、公网不要裸绑。
目录页:https://deepseek-harness-plugin.com/zh-CN/plugins/dsh-web-lan-access/
GitHub:https://github.com/AcidGr/dsh-web-lan-access