dsh-bridge-llm-plugin
Verifieddsh-bridge-llm-plugin · v0.1.2 · MIT
DeepSeek Harness LLM adapter: use your logged-in DeepSeek web chat (deepseek.com) as a model provider through the local dsh-bridge browser bridge. Streaming is single-shot (the whole reply arrives as text deltas); the web UI exposes no structured tool cal
Install
dsh plugin add dsh-bridge-llm-plugin Confirm the layer applied with dsh --profile default --dump-config — see the install guide.
Source
Tags
Readme
dsh-bridge-llm-plugin
把你已登录的 DeepSeek 网页会话,注册成 DeepSeek Harness 的模型 provider。
本插件注册一个 LLM provider(deepseek-web):它通过你真实、已登录的 deepseek.com
浏览器会话回答 —— 由 dsh-bridge 驱动网页 UI,
而不是调用付费 API。
⚠️ 先读这条 ——
deepseek-web只能纯对话DeepSeek 网页 UI 不提供结构化的工具调用输出,所以经它提供的模型无法调用任何工具。 它适合对话、起草、要第二意见 —— 不适合需要工具能力的 Agent 工作。
flowchart LR
A["DSH 模型选择器"] -->|provider: deepseek-web| B["dsh-bridge-llm-plugin<br/>本包"]
B -->|MCP over stdio| C["dsh-bridge<br/>Python + Playwright"]
C -->|驱动| D["deepseek.com<br/>已登录网页会话"]
D -.->|回复流式回传| B
特性
| 🆓 不花 API 钱 | 消耗网页版额度,而不是 API token |
| 🔐 用你自己的会话 | 复用你已登录的浏览器 profile |
| 🌊 类流式输出 | 整段回复切成 text-delta 分块吐出,UI 有流式观感 |
| 🛡️ 前置频控闸门 | 站点冻结时在触网之前拒绝发送 |
| 🪶 零依赖 | 纯 ESM JavaScript;不 import dsh-llm 也实现了 adapter 契约 |
| 🔌 fiber 隔离 | 它出问题不会影响你其他插件 |
前置条件
| 条件 | 说明 |
|---|---|
| DeepSeek Harness | 桌面版 0.2.0-rc.2 实测通过 |
| Node.js ≥ 20 | DSH 宿主自带 |
| dsh-bridge | Python 项目,且已跑过 uv run dsh-login deepseek |
| DeepSeek 登录态 | dsh-bridge 使用的浏览器 profile 必须有有效会话 |
安装
方式 1 — npm(最简单)
DSH → 设置 → 插件 → 添加插件,粘贴:
dsh-bridge-llm-plugin
或命令行:
dsh plugin add dsh-bridge-llm-plugin
方式 2 — 本地目录
# 一次装两个 dsh-bridge 插件(工具 + LLM),并做安装后校验:
powershell -ExecutionPolicy Bypass -File install-all-plugins.ps1
# 卸载:
powershell -ExecutionPolicy Bypass -File install-all-plugins.ps1 -Uninstall
方式 3 — GitHub
https://github.com/elysiamsia/dsh-bridge-llm-plugin
装完要完全退出并重启 DSH Desktop(关窗口可能只是最小化到托盘)。重启后 模型选择器里会出现
deepseek-web。
配置
本包不含机器专属路径,默认假定 dsh-bridge 已在 PATH 上。若你从源码目录跑,
请把你的路径写进你的 profile(~/.dsh/profiles/<profile>/cordis.patch.yml):
# 换成你自己机器上 dsh-bridge 检出目录的绝对路径
- id: dsh-bridge-llm-plugin
config:
command: uv
args: [run, --directory, /absolute/path/to/dsh-bridge, dsh-bridge]
provider: deepseek-web
modelId: deepseek-web
toolCallTimeoutMs: 180000
想把它设为默认模型,再覆盖 agent 的模型行:
- id: agent-default-model
config:
provider: deepseek-web
model: deepseek-web
全部配置字段
| 字段 | 默认 | 作用 |
|---|---|---|
command |
dsh-bridge |
启动桥接的可执行文件 |
args |
[] |
传给 command 的参数 |
cwd |
"" |
工作目录(空则继承) |
env |
{} |
追加环境变量 |
provider |
deepseek-web |
provider 路由名([A-Za-z0-9_-]{1,32}) |
modelId |
deepseek-web |
模型选择器里的模型 id |
displayName |
DeepSeek (web chat login) |
选择器里的显示名 |
toolCallTimeoutMs |
180000 |
单次调用超时;每次 ask 都要驱动浏览器 |
bootstrapProbe |
false |
启动时记录一次 adapter 契约自检 |
使用
在模型选择器里选 deepseek-web,然后正常对话。
第一次真实请求前先续期站点会话 —— 冻结状态下每条消息都会报频控错:
uv run --no-sync dsh-login deepseek
为什么我的请求被频控拒了?
本项目围绕一条硬规则:每跑 1 次真站冒烟 = 4 个站点账号同时吊销。
桥接的 ask 路径本身不检查这一点,所以 adapter 加了一道前置闸门 ——
用桥接里纯逻辑的 route_task(不起浏览器、不触网)读一次 verify 状态,
站点冻结就拒绝。若前置检查本身失败,选择"保守拒绝"。
解法:跑 uv run --no-sync dsh-login deepseek,然后重试。
排障
打开诊断日志
日志默认关闭:
$env:DSH_BRIDGE_LLM_PLUGIN_DIAG = "$env:TEMP\dsh-bridge-llm-plugin.log"
它会记录模块导入、apply 入口(含 ctx 的真实形状,例如 ctx.llm.registerAdapter
是否存在)、每一步、以及完整异常栈。
provider 一直不出现
| 现象 | 检查 |
|---|---|
选择器里没有 deepseek-web |
DSH 没有完全重启,或该行加载失败 |
| 插件行显示「异常」 | 打开 DSH_BRIDGE_LLM_PLUGIN_DIAG,日志会指出失败在哪一步 |
| provider 在,但每次回复都报错 | 站点冻结了 —— 跑 dsh-login deepseek |
实现说明:adapter 是鸭子类型
ctx.llm.registerAdapter() 不做 instanceof 检查,所以本插件不 import
@deepseek-ai/dsh-llm(该包在 profile 里可能解析不到)。它直接实现基类全部 7 个方法:
providerInfo · providerRetryPolicy · imageRequestPricing · listModels ·
resolveModel · prepareCall · stream
缺任何一个都会在调用时变成 TypeError。
开发
node probe/verify-llm-plugin.mjs # 自检:全用 stub,绝不碰真站
node probe/check-npm-compat.mjs <包名> # 装第三方插件前先判它会不会被跳过
| 脚本 | 用途 |
|---|---|
probe/verify-llm-plugin.mjs |
自检:配置、提示词拼装、adapter 契约、频控闸门、stream |
probe/check-npm-compat.mjs |
复现 DSH 的兼容性闸门,装任何 npm 包前预判是否会被 skip |
发版
发版由 .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-bridge —— 每次调用背后的 Python 浏览器桥接
- DeepSeek Harness —— 宿主及其 LLM adapter 契约