前言¶
用 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 与图标用于插件页展示名称与说明。
典型用法¶
- 在已挂载 Web GUI 且安装了本插件的 profile 下启动 DSH。
- 在 Agent 会话中调用工具
gui_auth_url(无参数)。 - 使用返回的
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 / 幻方无官方从属关系。