Skip to content

dsh-bridge-plugin

Verified

dsh-bridge-plugin · v0.1.2 · MIT

DeepSeek Harness plugin: expose the local dsh-bridge browser bridge (Python/Playwright, 4 web AIs) as native DSH tools. PoC registers ask_deepseek; the bridge itself is reused over MCP stdio, not reimplemented.

Install

dsh plugin add dsh-bridge-plugin

Confirm the layer applied with dsh --profile default --dump-config — see the install guide.

Source

Tags

Creators

Readme

dsh-bridge-plugin

npm license

在 DeepSeek Harness 里直接问 4 个网页版 AI —— 不用 API Key,不花 API 钱。

dsh-bridge-plugin 把本地运行的 dsh-bridge 暴露成 DeepSeek Harness 原生工具。它驱动 DeepSeek / 豆包 / 智谱 / 通义千问 的 真实已登录网页会话,消耗网页版免费额度,而不是付费 API token。

业务逻辑(Playwright 自动化、反检测、降级链、质量审查、频控状态机)全部留在 Python 侧的 dsh-bridge;本插件只是一个通过 MCP stdio 复用它的原生外壳,不重写任何逻辑。

English · 为什么要原生插件? · 排障

flowchart LR
    A["DeepSeek Harness<br/>模型 + Agent 循环"] -->|原生工具调用| B["dsh-bridge-plugin<br/>本包"]
    B -->|MCP over stdio| C["dsh-bridge<br/>Python + Playwright"]
    C --> D["DeepSeek"] & E["豆包"] & F["智谱"] & G["通义千问"]

特性

🧩 原生工具 ask_deepseek 直接作为一等 DSH 工具出现,没有 mcp__…__ 前缀
♻️ 共用一份内核 与 MCP 接入用的是同一个 Python 桥接,无重复实现
🛡️ 内置频控闸门 站点冻结时在触网之前就拒绝发送
🪶 零依赖 纯 ESM JavaScript,手写 MCP 客户端,无任何 npm 依赖
🔍 诊断可选 面包屑日志默认关闭,出问题时才打开
🔌 失败隔离 桥接出问题只影响本插件,绝不会拖垮 DSH

为什么要原生插件?

DeepSeek Harness 本身就支持 MCP, 所以走 MCP 零代码。原生插件换来的是 MCP 给不了的部分:

MCP 接入 本插件
工具名 mcp__dshbridge__ask_deepseek ask_deepseek
UI MCP 通用呈现 原生 presentCall 卡片
配置 MCP 的 env/args DSH Config(Standard Schema)
生命周期 由 MCP 客户端管 Cordis fiber,卸载/HMR 自动清理

前置条件

条件 说明
DeepSeek Harness 桌面版 0.2.0-rc.2 实测通过;声明 dsh >= 0.1.7-rc.1
Node.js ≥ 20 DSH 宿主自带
dsh-bridge Python 项目(uv 管理,Python ≥ 3.11)
Playwright 浏览器 在 dsh-bridge 里跑 uv run playwright install chromium
站点登录态 真站调用前先 uv run dsh-login <site>

安装

方式 1 — npm(最简单)

DSH 里打开 设置 → 插件 → 添加插件,粘贴包名:

dsh-bridge-plugin

或命令行:

dsh plugin add dsh-bridge-plugin

方式 2 — 本地目录

克隆本仓库后,在「添加插件」里填该目录路径;或使用自带的离线安装脚本 (等价于 dsh plugin add,并额外做安装后校验):

powershell -ExecutionPolicy Bypass -File install.ps1
# 卸载:
powershell -ExecutionPolicy Bypass -File install.ps1 -Uninstall

方式 3 — GitHub

https://github.com/elysiamsia/dsh-bridge-plugin

装完要完全退出并重启 DSH Desktop。 关窗口可能只是最小化到托盘 —— 请从托盘图标退出,或确认任务管理器里没有 DeepSeek Harness 进程。

配置

本包不含任何机器专属路径 —— 默认假定 dsh-bridge 已在 PATH 上 (例如在 dsh-bridge 目录里执行过 uv tool install .)。

而从源码目录用 uv run 启动才是最常见的情况,那种路径属于你自己的机器、 不该写进发布包。请在 ~/.dsh/profiles/<profile>/cordis.patch.yml 里追加覆盖:

# 换成你自己机器上 dsh-bridge 检出目录的绝对路径
- id: dsh-bridge-plugin
  config:
    command: uv
    args: [run, --no-sync, dsh-bridge]
    cwd: /absolute/path/to/dsh-bridge
    toolCallTimeoutMs: 180000

patch 会整体替换该 id 的 config 对象,所以要把需要的字段写全。

全部配置字段
字段 默认 作用
command dsh-bridge 启动桥接的可执行文件
args [] 传给 command 的参数
cwd "" 工作目录(空则继承)
env {} 追加环境变量
toolCallTimeoutMs 180000 单次调用超时;真站 ask 要驱动浏览器

子进程上始终强制 PYTHONIOENCODING=utf-8 与 PYTHONUTF8=1 —— 桥接会打 emoji,Windows 默认 GBK 控制台会让它崩。

使用

插件加载后,模型可直接调用:

用 ask_deepseek 解释 CAP 定理,再用两句话总结。
工具参考
工具 参数 返回
ask_deepseek prompt(必填)、conversation_id(选填) { reply, conversation_id?, site }
dsh_bridge_probe echo(选填) { ok, plugin, echo? } —— 证明插件已加载

dsh_bridge_probe 是零依赖诊断工具:它能用而 ask_deepseek 不能用, 说明问题在桥接层,不在插件。

⚠️ 频控铁律(用真站前必读)

本项目围绕一条硬规则设计:

每跑 1 次真站冒烟 = 4 个站点账号同时吊销。

规则
允许的站点 仅 deepseek,且仅限冒烟
前置条件 uv run --no-sync dsh-verify readiness 必须报告 hours_left >= 6.0
续期 uv run --no-sync dsh-login deepseek

桥接的 ask 路径本身不检查频控,所以本插件加了一道前置闸门:发送前先用 桥接里纯逻辑的 route_task(不起浏览器、不触网)读一次 verify 状态,站点冻结就 拒绝,并返回可执行的 dsh-login 指引。若前置检查本身失败,插件选择"保守拒绝", 而不是冒着误发的风险继续。

排障

打开诊断日志

日志默认关闭。需要时对一次运行开启:

$env:DSH_BRIDGE_PLUGIN_DIAG = "$env:TEMP\dsh-bridge-plugin.log"

开启后,插件会写入模块导入、apply 入口(含 ctx 的真实形状)、每一步、以及任何异常的 完整栈。"插件能加载但工具不出现"这类问题,就是靠它不用猜解决的。

工具不出现

现象 检查
插件行显示「异常」 打开 DSH_BRIDGE_PLUGIN_DIAG,日志会指出失败在哪一步
插件列表里根本没有 没装上,或 DSH 没有完全重启
DSH 启动即崩 %APPDATA%\@deepseek-ai\dsh-desktop\logs\crash-*-host.log
profile 清单带 UTF-8 BOM 会让 DSH 启动崩溃

DSH 读 profile 的 package.json 时直接 JSON.parse。带 BOM 会抛 SyntaxError: Unexpected token ''(在 readProfileManifest),即启动崩溃。

Windows PowerShell 5.1 的 Set-Content -Encoding UTF8 会写 BOM。务必写无 BOM:

[System.IO.File]::WriteAllText($path, $json, (New-Object System.Text.UTF8Encoding($false)))

install.ps1 已经这样做并会断言结果。注意反向的坑:含非 ASCII 的 PowerShell 脚本本身必须有 BOM,否则 PS 5.1 会按 GBK 解码、直接语法错。

开发

node probe/verify-plugin.mjs                    # 纯函数 + 注册层,不需要浏览器
# 想连真实桥接一起验:
export DSH_BRIDGE_REPO=/path/to/dsh-bridge      # PowerShell: $env:DSH_BRIDGE_REPO="..."
node probe/verify-plugin.mjs
脚本 用途
probe/verify-plugin.mjs 自检:纯函数、工具注册、前置闸门、桥接
probe/verify-loader.mjs 复现宿主 loader 的 6 步,针对已安装 profile
probe/verify-profile.mjs profile 健康检查(逐 bundle,含 BOM 检测)
probe/mcp-probe.mjs 纯 Node → Python 的 MCP 握手 + tools/list
probe/asar-extract.mjs 从 DSH 的 app.asar 抽文件(DSH_ASAR=…)

机器专属路径从不入库:所有脚本都从环境变量取,缺了会明确告诉你该设什么。

发版

发版由 .github/workflows/publish.yml 自动化:推送 v* tag 即发布到 npm。

npm version patch        # 或 minor / major —— 会改 package.json 并创建 tag
git push --follow-tags   # tag 触发 workflow

workflow 会校验 tag 与 package.json 一致、跑一遍离线自检,然后带 provenance 发布。 它需要仓库密钥 NPM_TOKEN —— 一个勾选了「Bypass 2FA」的 Granular Access Token (本 npm 账号开了 2FA;普通 token 会在 CI 里被拒 E403)。也可以在 Actions 页面手动触发, 默认是 --dry-run。

贡献

欢迎提 Issue 与 PR。开 PR 前请先跑上面的自检,并保持零依赖约束 —— 本包必须能通过 dsh plugin add 直接安装,无构建步骤、无传递依赖。

许可

MIT

致谢