dsh-gui-auth-url:为智能体暴露带认证的 Web GUI 地址

前言

用 DeepSeek Harness(DSH)跑 Web GUI 时,终端里会打印一行带 token 的地址;用浏览器或自动化直接打开裸的 http://127.0.0.1:端口/ 往往会得到 401 dsh web authentication required。桌面版还会在随机端口上起 Host,且不一定再打印那一行,外部脚本更难拿到合法入口。若希望 Agent 在调试 Harness 时自己打开真实 GUI(例如配合 chrome-devtools-mcp 看布局与 RPC),就需要一种在进程内、与 dsh web 同源的方式拿到认证 URL。下面介绍社区插件 dsh-gui-auth-url(维护者 NingYuanLee,分类:联网工具),它把当前运行实例的已认证 GUI 地址注册为工具 gui_auth_url。

这是什么

dsh-gui-auth-url 是面向 DeepSeek Harness 的第三方社区插件(MIT 许可,非 DeepSeek 官方产品)。它在 Host 进程内调用与 dsh web 相同的公开 API connection.authenticatedUrl(baseUrl),把结果作为 Agent 工具返回,不读取 $DSH_HOME/.credentials.yaml 中的 cookie 签名密钥,也不自行签发 cookie,因此返回的是绑定当前进程的一手会话 URL。

背景:为什么会 401

dsh --profile web 会为每个进程生成随机 launch token,并一次性打印:

dsh web: http://127.0.0.1:3080/?token=...

访问 GET /?token=... 会校验 token、设置与 host:port 绑定的签名 cookie,再重定向到 /。若只打开根地址而不带 token,响应为:

401 dsh web authentication required; reopen the URL printed by dsh web.

桌面版在随机端口启动 Host 且通常不打印上述行时,任何外部浏览器或自动化访问 http://127.0.0.1:<port>/ 都会一直 401;当前也没有 --no-browser-auth 一类开关。本插件针对的是「Agent / 脚本需要与 CLI 同等能力的认证 URL」这一缺口。

核心功能

工具 gui_auth_url

插件注册一个无参工具 gui_auth_url。每次调用都会重新解析当前 base URL(优先 webApp.getAdvertisedUrl(),其次 webServer.getOrigin(),再回退到协议加 loopback 端口),再向 connection.authenticatedUrl 取 URL,不缓存,以适应桌面版随机端口与 token 重启。

典型返回结构如下(模型侧主要看到 url 字段,其余字段供程序化调用):

{
  "url": "http://127.0.0.1:3080/?token=...",
  "origin": "http://127.0.0.1:3080",
  "protocol": "http:",
  "host": "127.0.0.1",
  "port": "3080",
  "secure": false
}

将 url 交给 navigate_page、curl 或其它 HTTP 客户端即可进入 GUI。

Base URL 与安全边界

仅在 base 为绝对 http/https、无用户名密码,且(除非配置允许)主机为 loopback(127.0.0.0/8、localhost、::1)时才会附加 token。返回 URL 必须与同一 origin 一致且只带一个 token。不可接受的 base 会在调用 authenticatedUrl 之前被拒绝,错误信息中不会包含 URL。

非 loopback(例如 --public-url、局域网地址或 0.0.0.0)默认拒绝返回 token;若确需信任对外公布的 host,可在 profile patch 中设置(注意后续 patch 会整体替换 config 对象,需保留其它键):

- id: gui-auth-url
  config:
    allowPublic: true

与旧包名的关系

若曾安装过 dsh-gui-session(0.1.x),包名、Cordis 行 id 与工具名均已变更,需先移除再安装新包:

dsh plugin --profile <name> remove dsh-gui-session
dsh plugin --profile <name> add github:NingYuanLee/dsh-gui-auth-url

安装与启用

在需要 Web GUI 的 profile(README 示例为 web)下执行:

dsh plugin --profile web add github:NingYuanLee/dsh-gui-auth-url

包声明了 dsh.bundle.patch,dsh plugin add 会把 bundle 写入该 profile 的 dsh.profile.bundles。安装后需重启 DeepSeek Harness,工具才会出现。npm 上亦发布为 dsh-gui-auth-url,GitHub 为源码仓库。

兼容性(以 README 与 package.json 为准):

项 要求
dsh >=0.2.1-rc.2 <0.3.0-0
Node >=22.19.0
已验证 dsh 0.2.1-rc.2,Windows x64,desktop 与 web profile
Web 组合 需要 connection 服务;无 Web GUI 的 profile 会报明确错误

当前包版本为 0.2.2(package.json)。插件为纯 ESM,无需构建步骤;locale/*.json 与图标用于插件页展示名称与说明。

典型用法

  1. 在已挂载 Web GUI 且安装了本插件的 profile 下启动 DSH。
  2. 在 Agent 会话中调用工具 gui_auth_url(无参数)。
  3. 使用返回的 url 打开浏览器或自动化页面,验证界面、交互或 RPC,而不是仅从代码推测行为。

README 中的典型场景:调试 DeepSeek Harness 本身时,让 Agent 用 chrome-devtools-mcp 打开 live GUI 做真实校验。

适用场景与注意

适合谁: 需要在 Agent 工具链里打开当前 DSH Web GUI、且希望与 dsh web 打印的 URL 同等认证方式的开发者;尤其适合桌面版随机端口、终端未保留 launch URL 的情况。

权限与信任: 插件在当前 dsh 进程权限下运行;安装前应自行查看 GitHub 源码 与 MIT 许可证,确认符合你的安全策略。

凭证处理: 返回 URL 含有本进程的 launch token,等价于已登录会话,仅在 Host 存活期间有效。不要写入日志、提交到仓库或随意粘贴到聊天;需要时可再次调用工具获取,进程重启后旧 token 失效。成功调用后,token 仍会出现在会话 transcript 与后续模型请求中,受众范围大于终端里那一行 dsh web 输出——使用 Agent 暴露 URL 时需自行评估。

故障排查摘要:

  • 安装后看不到工具:检查 profile 的 package.json 是否包含 dsh-gui-auth-url 于 dsh.profile.bundles,重启后用 dsh --profile <name> --dump-config 查找 gui-auth-url 行。
  • 版本不匹配:按 README 使用 dsh plugin ... version-exemptions / allow-version 处理 engines.dsh 检查。
  • Windows EPERM: rename ... node_modules\dsh-gui-auth-url_tmp_*:先停掉占用该 profile 的 DSH 进程,删除残留目录后重试。
  • 「This profile serves no Web GUI」:profile 未挂载 webApp 或 webServer + connection。
  • 「refusing to attach the launch token to a non-loopback host」:按上文设置 allowPublic: true(仅在你信任对外 URL 时使用)。

结尾

dsh-gui-auth-url 把运行中 Harness Web GUI 的认证地址暴露为 gui_auth_url,让浏览器自动化与 Agent 不再卡在 401,同时复用官方 connection.authenticatedUrl 路径、不碰签名密钥。DSH 生态强调「一切皆插件」;社区目录由独立站点维护,与 DeepSeek / 幻方无官方从属关系。

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

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

Xiaoye