Перейти к основному содержимому
I

dsh-deepseek-web

irerc/dsh-deepseek-web

Adds a browserless deepseek-web provider that drives chat.deepseek.com, with an account pool (rotation, cooldown, auto-failover), in-panel login (browser, or email + password with MFA) and token usage stats.

Установка

dsh plugin --profile web add github:irerc/dsh-deepseek-web

README

dsh-deepseek-web

GitHub stars Release

把 chat.deepseek.com 网页版 包成 OpenAI 兼容接口的 DeepSeek Harness 插件。如果它帮你省下了 API 费用,欢迎点个 Star ⭐

  • 不需要浏览器:Node 直连网页接口(PoW 用站点自带的 wasm 在本地算),因此在 Android/proot 容器里也能跑。
  • 多账号:轮询 + 429 冷却 + 401 自动切换,设置界面可增删;支持邮箱密码、内嵌登录窗口、系统浏览器登录、Apple ID 登录(实验),被站点禁言/封号的账号会自动避让。
  • 内嵌登录窗口(实验):不用再切浏览器 —— 在设置页「添加账号」里点「在插件里登录(内嵌窗口)」,真实的 DeepSeek 登录页直接嵌在设置页里(同机独立端口镜像,cookie 只存在本机),登录成功后 token 自动回填、窗口自动关闭;账号行也保留「内嵌登录 / 浏览器登录」两条路,另有「用系统浏览器打开」兜底。账号行的「打开登录页」也走本机代理(不是 chat.deepseek.com 官网),登录成功后 token 会自动回填到该账号。不喜欢可以一键关掉回到旧方式(见「内嵌登录窗口与回滚」)。
  • 两种请求模式:原始模式 把提示词原样发出去(不加任何额外说明),保险模式 在提示词最前面插一段「使用规范」并把请求放慢、压缩,更不容易被站点风控/禁言 —— 见下文「请求模式」。
  • 账号行布局更清爽:邮箱/状态徽标占第一行,检查、重新登录、浏览器登录、复制账号密码、改密码、禁用、删除这些按钮独占第二行,按钮不会再把「删除」单独挤到下一行。
  • 封号/禁言后可导出账号密码手动登录:站点风控会把插件内的登录一起拦住,这时点账号行的「复制账号密码」,会把保存的完整邮箱和密码复制到剪贴板,拿去 Chrome 里打开 chat.deepseek.com 手动登录,成功后再把 token 贴回「手动添加」即可。
  • 保存密码、失效自动重登:可选把账号密码加密存在本机,token 过期/被踢下线时自动重新登录,不用再手动贴 token;万一被站点判定「设备风控」(RISK_DEVICE_DETECTED)挡住了脚本登录,点「浏览器登录」会在真实网页里自动填好账号密码登一次,token 原地换回来。
  • 选模型即启动:平时只监听一个极轻量的入口,首次调用网页版模型时才拉起引擎,空闲自动休眠。
  • 自带设置界面:DSH 设置 →「DeepSeek 网页版」,可登录、管理账号、调参、看日志。
  • 即装即用:包内自带 cordis.patch.yml,安装后由 DSH 自动应用 provider 配置。

安装(新设备一条命令/粘贴链接即可用)

中国大陆推荐走 gh-proxy 镜像,下面三条任选其一:

① 粘贴到 DSH「插件 → 安装插件」(镜像)

git+https://gh-proxy.com/https://github.com/irerc/dsh-deepseek-web.git

② 发行版压缩包(镜像,最快)

https://gh-proxy.com/https://github.com/irerc/dsh-deepseek-web/releases/download/v1.0.43/dsh-deepseek-web-1.0.43.tgz

③ 仓库页(镜像浏览)

https://gh-proxy.com/https://github.com/irerc/dsh-deepseek-web

镜像不可用时,把上面链接里的 https://gh-proxy.com/ 去掉即可直连 GitHub(官方速度可能较慢):

  • 插件 spec:https://github.com/irerc/dsh-deepseek-web
  • 压缩包:https://github.com/irerc/dsh-deepseek-web/releases/download/v1.0.43/dsh-deepseek-web-1.0.43.tgz

不需要任何 API key:插件自带 provider 配置与本地网关(127.0.0.1:18081),装好即用。

安装后重启 DSH,设置里会出现「DeepSeek 网页版」,模型列表会多出两个模型:

  • DeepSeek-V4(网页版·快速) → deepseek-chat
  • DeepSeek-V4(网页版·深度思考) → deepseek-reasoner

首次使用需要在插件设置里登录一次(见下)。

开发时用本机路径安装
dsh plugin --profile web add link:/root/dsh-deepseek-web

或把目录复制到 ~/.dsh/profiles/<profile>/node_modules/dsh-deepseek-web,并在 package.json 的 dsh.profile.bundles 里加上 dsh-deepseek-web。

登录(需要你在浏览器里完成一次)

  1. 在手机或电脑浏览器打开 https://chat.deepseek.com 并登录(人机验证由你完成)。
  2. 取 localStorage.userToken:
    • 电脑:F12 → Console → JSON.parse(localStorage.userToken).value → 复制结果
    • 手机:地址栏输入 javascript:prompt('token',JSON.parse(localStorage.userToken).value)(需手动敲入,粘贴会被浏览器去掉 javascript: 前缀)
  3. 打开 DSH 设置 →「DeepSeek 网页版」→ 粘贴 token → 「校验并保存」。

也可以命令行:

dsh-deepseek-web login --token <userToken> --label 工作号
dsh-deepseek-web doctor

邮箱验证码登录在无浏览器环境下通常被人机验证拦住,设置界面里保留入口但多为兜底用。

账号与风控

  • 每个账号的请求串行、带最小发送间隔(默认 1200ms,可调),失败会退避。
  • 429 → 该账号冷却 60s 起指数退避(上限 10min)并切下一个账号。
  • 401 → 若该账号保存了密码,先自动重新登录并把新 token 换到原账号(同一账号原地续跑,不打断对话);没存密码或重登失败才标记「登录失效」。
  • 指定账号:模型名写 deepseek-chat@工作号 即可固定到某个账号。

请求模式(原始 / 保险)

设置页「运行设置」里的 请求模式 决定两件事:发给网页模型的提示词长什么样、请求有多急。

两者的提示词确实不一样:

原始模式 raw(默认)保险模式 safe
提示词开头你自己发的 system 消息(原样)先插入一段「【使用规范】不输出违法违规/暴力/仇恨/攻击性内容,遇到就礼貌拒绝……」,再接你的 system 消息
工具清单完整 schema + 完整描述(约 1200 字/工具)描述压缩到 200 字,参数仍在(compact)
末尾约定一行回复格式约定同样的约定 + 「输出前先自检是否符合使用规范」
历史预算约 118k tokens约 48k tokens(更早的历史会被裁掉)
发送节奏按「同账号发送间隔」配置(默认 1200ms)至少 4 秒、抖动更长;同账号并发强制 1

原始模式:最接近真人在网页里提问,模型发挥完整,适合日常写代码、翻译、总结。 保险模式:多一层内容护栏 + 更保守的流量特征,适合把插件当无人值守服务跑、或账号已经被警告/禁言过的情况;代价是长对话更早开始遗忘、工具描述变短(复杂工具偶尔会漏参数)。

两种模式下,被禁言/封号的账号都会被账号池跳过。

设置项

字段默认说明
autoStarttrue选择/调用网页版模型时自动拉起引擎
idleStopMs600000空闲多少毫秒后关停引擎
sendGapMs1200同一账号两次请求的最小间隔
maxConcurrency4全局并发上限(账号池总和)
embedLogintrue在设置页里内嵌登录窗口(实验);关掉即回到「新标签页/系统浏览器打开登录页」的旧行为,也就是内嵌方案的回滚开关
autoRelogintruetoken 失效时用保存的账号密码自动重新登录
requestModeraw请求模式:raw 原始(提示词原样)/ safe 保险(插使用规范 + 更慢更保守)
sectionOrderusage,engine,accounts,addAccount,log设置页卡片顺序,由最下方「页面设置」的 ↑/↓ 调整

设置页卡片从上到下默认是:网页版用量 → 运行设置 → 账号管理 → 添加账号 → 引擎日志 → 页面设置(没有账号时「添加账号」会临时置顶)。 「页面设置」(默认收起)可以调整前五块的先后顺序(自动保存,可「恢复默认顺序」)。

最底部是「关于」卡片:作者 irerc · DeepSeek Harness,显示插件名与版本。

最下方独立的「维护」卡片提供两个操作:

  • 清空 Token 用量记录:删除 state/usage.json,插件内累计用量归零(不影响账号、会话、登录状态)。
  • 重置所有插件设置:把 config 恢复默认值(自动启动、空闲休眠、发送间隔、并发、卡片顺序),会先弹出确认窗口再执行;窗口里可选勾选「同时删除已登录账号和 token(不可恢复)」,不勾选则保留账号。
    • 确认窗口内还有二级页「删除所有账号和数据」:彻底清空账号/token/cookie、用量统计、cookie 罐与全部设置(POST /factory-reset),需再点一次「确认彻底删除」。

内嵌登录窗口(实验)与回滚

站点风控会拦掉「插件内直接把账号密码 POST 给站点」的登录,但真实网页里的登录能过。内嵌窗口就是把真实登录页搬进设置页,省掉切浏览器这一步:

  • 原理:本机 18090 端口有一个登录反向代理,把 chat.deepseek.com 的登录页镜像成一个本机独立 origin(127.0.0.1:18090),设置页用 iframe 显示它;cookie 只写在本机,DSH 页面本身不接触站点 cookie。
  • 成功后:登录页里的注入脚本把 token 回传给插件(/dsh-deepseek-web/login/token),同时 postMessage 告诉设置页 —— 设置页自动关掉窗口并刷新账号列表。
  • 账号行:有保存密码的账号会显示「内嵌登录」(自动填好账号密码)和「浏览器登录」(新标签页/系统浏览器,旧方式)两个按钮;添加账号卡片另有「用系统浏览器打开」,内嵌窗口白屏或被站点风控挡住时走这条。
  • 苹果账号:Apple 授权页禁止被任何网页内嵌,所以 Apple 登录只能走外部窗口,这条线路标为实验、优先级低。
  • 前置条件:浏览器和 DSH 在同一台机器上(代理只监听 127.0.0.1)。

回滚(三选一,都不用重装旧包):

  1. 设置页「运行设置」→ 取消勾选「在设置页里内嵌登录窗口(实验)」→ 立即回到 v1.0.41 的行为(登录页走新标签页/系统浏览器),iframe 不再出现;
  2. 环境变量 DS_EMBED_LOGIN=0 启动 DSH,效果同上(配置文件里的开关也会被写成关);
  3. 代码级回滚:git revert 本版本提交,或直接重装 v1.0.41 的压缩包(账号数据在 ~/.dsh/storages/dsh-deepseek-web,不受影响)。

系统浏览器线路(POST /dsh-deepseek-web/login/browser → 宿主 openOnDevice)完整保留,内嵌开关关不关都能用。

目录

lib/index.js          Host 插件:入口监听、按需拉起引擎、设置界面路由
lib/client.js         客户端设置分区(__ModuleLoader__ 手写 bundle)
server/server.mjs     OpenAI 网关(流式、工具调用、续聊)
server/engine-http.mjs HTTP 引擎(PoW、SSE、账号池)
server/pow.mjs        DeepSeekHashV1 求解(wasm)
server/accounts.mjs   多账号存储与选择
server/config.mjs     运行配置
bin/cli.mjs           login/accounts/start/stop/status/doctor

状态目录:state/(accounts.json、config.json、engine.log,权限 0600)。

排障

  • 模型调用报「没有可用账号」→ 设置里没登录或 token 全部失效。
  • 报 502 AUTH_REQUIRED → token 过期,重新粘贴。
  • 引擎起不来 → 看设置页「引擎日志」或 state/engine.log。
  • 端口冲突:入口固定 127.0.0.1:18081,引擎内部用 18082。

风险提示

直连网页接口属于自动化访问,可能触发站点风控;多账号会放大风险。插件做了串行、节流、真实浏览器请求头与自然提示词,但不能保证不被限流或封禁。

MIT License

更新日志

v1.0.43

  • 修「打开登录页」登录后拿不到 token:账号行的「打开登录页」以前直接 window.open('https://chat.deepseek.com/sign_in'),那是站点官网,页面上没有插件注入脚本,登录完 token 不会回传,插件永远等不到。现在改成走本机登录代理(127.0.0.1:18090/sign_in,也就是 /login/browser 背后的真实地址):
    • 系统浏览器能接(手机端)就交给系统浏览器;桌面端 window.open 新标签页;
    • 登录成功后注入脚本照常回传 token,账号状态原地更新 —— 不用再手动复制 token;
    • URL 带上 __dsweb_acct=<账号id>,回传的 token 原地替换这个账号,不会在账号池里多出一个重复账号。
  • /login/browser 返回值更诚实:以前固定回 opened: true(桌面端其实没开),现在真的去等设备桥 /app/open 的结果:opened: false 时前端才知道要自己开新标签页。
  • 没存密码的异常账号也能内嵌登录:登录失效 / 被封 / 禁言 / 需要浏览器登录、且没保存密码的账号,现在也显示「内嵌登录」按钮(不自动填表),登录成功后 token 原地替换该账号,不用再走「复制 token → 手动添加」。
  • 注入脚本识别 __dsweb_acct:登录页从这个参数知道「这次登录的是哪个账号」,回传时带上 accountId,宿主用 replaceToken 原地更新。

升级说明:lib/client.js 刷新设置页即可;lib/index.js、server/inject.html、server/config.mjs 需要重启 DSH(或等宿主热重载)后生效。

v1.0.42

  • 新增内嵌登录窗口(实验):设置页「添加账号」现在可以把真实登录页直接嵌在页内,不用再切浏览器 / 等系统浏览器弹出来。
    • 新增宿主路由 POST /login/embed:复用同一个本机登录代理(18090),把 /sign_in 地址交给设置页;带 accountId 时顺带签发一次性票据,账号密码自动填好。这条路由不调用 openOnDevice,不会弹系统浏览器。
    • 设置页里是一个 iframe(登录页跑在独立 origin,cookie 只在本机),带「重新加载 / 用系统浏览器打开 / 关闭」;登录页里的脚本登录成功后 postMessage 通知设置页,设置页自动关闭窗口并刷新账号列表。
    • 账号行有保存密码时同时给「内嵌登录」(自动填表)和「浏览器登录」(新标签页,旧方式)两个按钮,互不影响。
    • 注入脚本在 iframe 里会把 target=_blank 链接改成当前窗口跳转、window.open 兜底,避免点了链接被浏览器拦掉卡在中间页。
  • 系统浏览器线路完整保留:/login/browser + openOnDevice 原样不动,内嵌窗口旁边就有「用系统浏览器打开」;内嵌白屏、被站点风控挡住或需要走 Apple 授权时都能退回旧路。
  • 回滚开关:设置页「运行设置」新增「在设置页里内嵌登录窗口(实验)」,取消勾选立即回到 v1.0.41 的行为(登录页走新标签页/系统浏览器);也支持环境变量 DS_EMBED_LOGIN=0。配置项 embedLogin 默认 true。
  • Apple 登录标为实验性:Apple 授权页禁止被内嵌(frame-ancestors 'none' + 顶层窗口校验),所以 Apple 只能走外部窗口。按钮改为「Apple 账号登录(实验)」,/apple 页面也加了「实验性 · 优先级低」标记,说明这条线路不是主路径。
  • 旧版本后台兼容:宿主还是旧版(没有 /login/embed)时点内嵌登录会明确提示「重启 DSH 后再试」,不会偷偷改成弹窗口。
  • 本轮改动:lib/client.js 是客户端热更(刷新设置页即可);lib/index.js、server/config.mjs、server/inject.html 需要重启 DSH 后才生效。

v1.0.41

  • 修「各对话详情」全叫同一个名字:对话标签以前直接取第一条 user 消息,而 DSH 的自动续跑/检查会把每个会话的第一条消息都写成同一句「This is an automatically generated check」,于是 5 个对话看起来一模一样。
    • 现在优先取「第一条真正有内容的用户消息」当标题(跳过自动检查/续跑这类套话,至少 6 个字符);
    • 老记录没法回溯,显示时把这类套话统一显示成「自动检查 / 续跑会话」;
    • 每行补上网页会话 id 和更新时间(#8d3af0b6 · 11/01 10:42),一眼能分清是哪一条;
    • 加了一行说明:按网页会话统计,同一会话续聊会累计到一起,所以「轮次」比对话条数多。

v1.0.40

  • 账号行布局重做:以前邮箱、徽标、6~7 个按钮全挤在一个 flex 行里,窄一点就把「删除」单独挤到第二行,看着很别扭。现在拆成三层:
    • 第一行:完整邮箱 + 「已存密码」/「正常」/「禁言中」等徽标;
    • 第二行:状态说明(禁言至…、登录失效、风控提示等)单独占一行;
    • 第三行:操作按钮统一 6px 10px 紧凑样式、文字强制不换行,按钮行整体可折行 —— 现在 8 个按钮也排得下,不会再出现孤零零的「删除」。
  • 新增「复制账号密码」:实测站点风控会把插件内的登录一起拦掉(连真实网页自动填表都可能过不去)。现在账号行直接提供「复制账号密码」,把保存的完整邮箱和密码写进剪贴板:
    • 复制内容就是 账号:xxx@qq.com + 密码:xxx 两行,手机剪贴板可直接粘进 Chrome;
    • 另配「打开登录页」按钮,一键打开 chat.deepseek.com/sign_in;
    • 登录成功后在「手动添加」里贴 token 回填即可(或直接把 token 贴回同一个账号);
    • 没存密码的账号不会显示这个按钮,先点「存密码」。
  • 禁言/封号账号的提示文案也补上了「点复制账号密码去 Chrome 手动登录」,不再只让你干等或删号。

v1.0.39

  • 新增「请求模式」(原始 / 保险):设置页「运行设置」里多了一个二选一开关,两套提示词真的不一样:
    • 原始模式:提示词就是你原本的请求 —— messages 原样、工具 schema 完整、不加任何额外说明(只在末尾保留一行回复格式约定),历史预算约 118k tokens。
    • 保险模式:提示词最前面插入一段「【使用规范】」(不输出违法违规、色情、暴力、仇恨、攻击性内容,遇到就礼貌拒绝并给合规替代),工具描述压到 200 字、历史预算约 48k,并在末尾要求「输出前先自检」;同时发送间隔抬到至少 4 秒、抖动更长、同账号并发强制 1。
    • 两种模式共用同一个账号池、工具协议和流式解析,随时切换,改动下一轮对话生效。
  • Apple 登录白屏有救:Apple 自己的授权页在 Edge / 微信内嵌窗口里经常白屏且不报错。/apple 页现在会显示「用 Chrome 打开」的提示和一键复制本页地址,并加了 45 秒看门狗 —— 超时会明确告诉你「可能白屏了,换 Chrome」,不会再无声卡住。
  • Apple 登录按钮在需要重启时禁用:避免在旧版本后台里点开 404 页面。

v1.0.38

  • 新增「Apple 账号登录」:添加账号卡片里多了一个「Apple 账号登录」按钮,点开是本机的一个授权页,用 Apple ID 授权后直接把 id_token 换成 DeepSeek 登录态并入库(和站点自己的 /oauth/apple/login 同一条路),不用再去站点登录页里找按钮。
    • 新 Apple 账号被站点要求「绑定手机号」时,会明确提示去浏览器登录页完成绑定(这一步只能人工做),不会把失败伪装成成功。
    • Apple 返回风控 RISK_DEVICE_DETECTED、封号、凭证失效等错误都分别翻译成了人话。
  • 禁言 / 封号识别:站点现在会 禁言(错误码 50006,返回 end_at)或 封号(40012)来处置违规账号。插件会:
    • 从 users/current 的 chat.is_muted / mute_until 和对话流里的 50006 认出来,记下到期时间;
    • 到期前账号池不会再用它发消息,自动切到别的号,不再一调用就报错;
    • 账号行显示「禁言中」徽标和「禁言至 2026/11/4 08:27」的说明,封号显示「已封禁」;点「检查」会如实返回禁言状态。
  • 密码登录被站点前置风控拦住时不再误报:users/login 现在经常直接回 HTTP 202(WAF 挑战)或 403(Request Blocked),以前会被显示成「未知原因({})」。现在识别成「站点前置风控拦截」,按风控处理(6 小时冷却 + 提示改用浏览器登录),并在登录请求被 40029(按 IP 限流)拦时按限流处理,不再反复空撞。

v1.0.37

  • 被设备风控拦下时改用「浏览器登录」(自动填表):站点的 users/login 会回 RISK_DEVICE_DETECTED(设备风控),脚本密码登录这条路从此一直是死的。现在认得出这个错误:账号行直接提示「站点设备风控拦住了脚本密码登录」,并给出「浏览器登录」按钮 —— 点一下就在真实网页里打开登录页,保存的邮箱和密码会自动填进表单并提交(站点的 JS 自己完成风控/PoW),登录成功后 token 原地回填到同一个账号,不会多出一个重复账号。需要邮箱验证码时在这一页输入 6 位码即可。
  • 风控期间不再反复撞:命中风控后该账号冷却 6 小时,后台扫描(启动时 + 每 10 分钟)也不会再拿它去试密码登录,避免越撞越黑;点「改密码」重新保存凭证或「浏览器登录」成功后标记自动清除。
  • 自动重登的退避更合理:验证码 30 分钟、风控 6 小时、限流 10 分钟、密码错 5 分钟,各自分开处理,不再把「密码错」和「被风控」混成一个模糊的失败提示。
  • 登录请求体对齐站点前端:users/login 补上 mobile / area_code 空字段、os 改成 web,少字段的请求更容易被当成脚本。
  • 顺手修掉:浏览器登录回填 token 时按账号 id 原地更新,之前会新增一个「浏览器登录」账号。

v1.0.36

  • 账号列表显示完整邮箱:站点的用户接口只返回脱敏地址(如 262*****77@qq.com),以前就把它当账号名存了下来,看着分不清是谁、拿去自动重登还会必然失败。现在邮箱分两个字段:emailFull 只存用户自己填过的完整地址并优先显示;上游回的脱敏地址只作兜底,并在旁边标「(脱敏)」。
  • 补邮箱不用带密码:账号行按钮变成「填邮箱」(脱敏时)/「存密码」,只填一个完整邮箱也能保存(会做格式校验,拒绝保存带 * 的地址);保存后列表立刻显示完整地址。
  • 脱敏地址不再空跑重登:如果保存的邮箱是带 * 的地址,自动重登会直接给出「请填完整邮箱和密码」的提示,不会每两分钟拿一个必然失败的地址去登录一次。
  • 用邮箱 + 密码登录时,users/login 拿到的是脱敏邮箱,但登录表单里填的是完整地址,现在会存成 emailFull,所以新登录的账号一开始就显示完整邮箱。
  • 浏览器登录也会带上完整邮箱:登录页注入脚本会记住表单里填的邮箱(并拦截 /api/v0/users/login 的请求体),回传 token 时一起回传,所以「在插件里登录」的账号也直接显示完整地址,不用再手填。

v1.0.35

  • 修正「邮箱登录要挂 VPN」的错误说法:邮箱 + 密码登录在中国大陆网络下本来就能直连使用,不需要 VPN / 代理。界面上的「海外账号需 VPN」徽标改成「国内网络可用」,「海外(邮箱注册)」线路改名为「邮箱(英文页)」,说明文字也改清楚了:邮箱 / Google 账号选「邮箱(英文页)」,国内手机号账号选「国内」,两者都只是登录页语言不同。

v1.0.34

  • 保存账号密码,token 失效自动重登:用「邮箱 + 密码」登录时可以勾选「保存账号密码」,密码用本机密钥 AES-256-GCM 加密后存在 state/accounts.json(密钥单独放 credentials.key,权限 0600),接口永远不会把密码回传前端。
    • 失效即重登:对话中途撞到 401 时,先用保存的密码换一个新 token,然后同一个账号原地重试,不会打断对话、也不会白白浪费一次轮换。
    • 点「检查」也会自动补登:token 失效的账号不必手动操作;启动后与之后每 2 分钟还会扫一遍「失效且存了密码」的账号。
    • 需要验证码的情况:新设备首次密码登录可能被要求邮箱验证码,此时不会硬撞上游(避免反复发码),账号行会提示去手动「重新登录」一次;设备被站点记住后,后续就是全自动了。
    • 给老账号补密码:已有账号行多了「存密码」按钮,填一次邮箱+密码会立刻验证(验证通过才算存好);也可以「改密码」「删除已存密码」。
    • 账号列表里存了密码的账号会显示蓝色「已存密码」徽标,并多一个「重新登录」按钮。
    • 运行设置里新增开关「token 失效时用保存的密码自动重新登录」(默认开)。

v1.0.33

  • token 统计改用上游真实数字:网页接口的流里其实带了 accumulated_token_usage(站点自己分词算出来的「上下文 + 输出」合计),以前没用上、全靠按字数估。现在优先用它反推 prompt_tokens,上下文越大越准,不会再把长对话的输入量估小。
  • 缓存读取修对了:以前只认「插件自己记的那条网页会话还在不在」,一旦换了账号、站点回收了会话、或者 DSH 压缩历史换了指纹,缓存读取就直接掉成 0。现在按前缀语义算:除了最后一条 assistant 之后新追加的内容,其余都已经在上下文里,算缓存命中;全新对话(还没有 assistant 消息)才记 0。长对话实测能到 99%+,和官方 API 的 prompt_cache_hit_tokens 语义一致。
  • 续聊固定回到同一个账号:网页会话属于某个账号,多账号轮换时第二句换了号,上游会回 invalid chat session id。现在每条对话都会记住自己的账号,续聊照着回;万一那个号不可用,会自动换新会话 + 完整上下文重试一次,不再把 502 甩给用户。
  • 分词系数校准:中文 0.52、英文 1/3.8,跟着 DeepSeek 真实分词器走(原来 0.7 把中文估多了三成)。
  • 设置页用量卡片显示缓存读取:总 tokens / 输入 / 输出 / 缓存读取(命中率)/ 轮次,各对话详情里也加了「缓存」一列。

v1.0.32

  • 安装后明确提示需要重启:插件会比对「磁盘上装好的版本」和「正在运行的版本」,只要不一致,设置页顶部就出现橙色横幅:「已安装 vX,需要重启 DSH 后生效(当前运行 vY)」,并写明重启方法。装完即刻出现,不会再让人以为没生效。
  • 「维护」拆成两块:上半「版本更新」(检查更新 / 复制链接 / 安装),下半「数据与还原」(清空用量 / 重置设置),中间分隔线,更新和还原不再混在同一排按钮里。

v1.0.31

  • 安装链接可以直接复制:Release 说明里的安装地址改成代码块(GitHub 自带复制按钮),不再是被自动识别成超链接、换行后没法选中的样子。
  • 插件界面加「复制链接」:查到新版本时,「维护」卡片里多一个「复制链接」(复制 gh-proxy 镜像地址,一键粘贴到别的设备);「关于」卡片的仓库地址旁边也能一键复制。

v1.0.30

  • 一键安装补两道保护:装之前先看磁盘上已有的版本,已经是最新就不重复下载;link 安装(开发模式)直接拒绝并给出下载地址,不会动链接。

v1.0.29

  • 检查更新后可以一键安装:查到新版本时,「维护」卡片会多出一个绿色「安装 vX.Y.Z」按钮。
    • 从 gh-proxy 镜像下载(失败自动回退 GitHub 直链),解压后只替换 <DSH_HOME>/profiles/<profile>/node_modules/dsh-deepseek-web 这一个目录;
    • 旧目录先备份成 dsh-deepseek-web.bak-<时间戳>,替换失败自动回滚,只保留最近一份备份;
    • 安装前会先停掉引擎子进程;装完提示「重启 DSH 后生效」。
    • 如果当前是 link 安装(开发模式),不会动链接,只把安装包下好并提示路径。
  • 安装包和进度都在「维护」卡片里直接看得到,不用再去 GitHub 手动下载。

v1.0.28

  • 「已是最新版本」不再显示在运行设置中间:操作结果以前统一塞在「运行设置」卡片里,点「检查更新」后提示就夹在勾选框和空闲休眠之间,位置很怪。现在结果横幅固定在整块设置最上方(可点 × 关闭,15 秒自动消失),「维护」卡片里也会常驻显示「当前版本 vX.Y.Z / 最新版本」。
  • 账号显示账号名:账号以前全叫「浏览器登录」,失效时分不清是哪个号。现在会自动补上邮箱(启动时补、检查时补),账号列表直接显示邮箱;登录失效的账号会额外提示「登录已失效,需要重新登录(邮箱)」。

v1.0.27

  • 修复「浏览器登录抓不到 token」的真正原因:v1.0.26 里为了从网络层抓 token 写的那段注入脚本,正则里的 / 没转义,被模板字符串吃掉后整段脚本语法错误 —— 于是状态栏、提示、抓取全部失效。现在注入脚本拆成独立文件 server/inject.html(不再受转义影响),并在发布前做了语法校验。
  • 抓取来源扩到四条:请求头 Authorization: Bearer …、登录/MFA 响应里的 token、localStorage(含 {value:…} 包一层的老格式)、Cookie 与 IndexedDB(站点新版把登录态搬到这里)。随便哪条能拿到就立刻回传。
  • 新增「提取并保存 token」按钮:登录页右上角,已登录状态下点一下就会从当前页面把所有来源扫一遍,不用重新登录。
  • 抓不到时有诊断:页面 12 秒内没抓到 token,会把「localStorage / Cookie / IndexedDB 清单」回传给插件(只记 key 名,不记值),日志里可查,方便定位。
  • 「检查更新」修好了:之前 res 变量名把 HTTP 响应对象盖住,一点就报 res.writeHead is not a function。现在正常返回,没有新版本时明确显示「当前已是最新版本 vX.Y.Z(无需更新)」。
  • 风控拦截不再白屏:登录页返回 AWS WAF 人机验证(202 challenge)时自动重试两次,仍失败会显示中文说明页(等 30 秒重试,或改用邮箱+密码登录)。

v1.0.26

  • 修复 v1.0.24 的编辑事故:维护 / 页面设置 / 关于 三张卡片被误删(表现为「之前的数据全都没了」),已恢复。
  • 数据不再随插件升级丢失:状态目录从「插件包内 state/」迁移到「~/.dsh/storages/dsh-deepseek-web/」,首次启动自动把老数据复制过去(已有数据不会被覆盖)。
  • 浏览器登录能抓到 token 了:站点新版本把 token 存进 IndexedDB,原来只轮询 localStorage.userToken 抓不到;现在直接从网络层取(请求头 Authorization: Bearer …,以及登录/MFA 响应里的 user.token),新旧存储方式都覆盖。
  • 维护卡片新增「检查更新」:查 GitHub 最新 release,与当前版本比较,给出下载链接(含 gh-proxy 镜像)。
  • 接口 404 有明确提示:返回 HTTP 404:该功能需要重启 DSH 后才会加载,不再静默无反应。

v1.0.25

  • 批量登录支持验证码排队:粘贴多行 邮箱----密码 后,需要验证码的账号会自动发码并列入「待填验证码」清单,每个账号一行输入框,逐个填 6 位码即可完成登录,不用重新走一遍密码流程。
  • 批量结果会区分「已登录 / 待验证码 / 失败(含服务端原因)」。

v1.0.24

  • 新增「邮箱 + 密码登录」(不再依赖浏览器):设置 → DeepSeek 网页版 → 添加账号 →「邮箱 + 密码登录」。
    • 邮箱登录在中国大陆网络下可以直连使用,不需要 VPN;邮箱 / Google 注册的账号把「登录线路」选成「邮箱(英文页)」即可。
    • 新设备首次登录会被要求邮箱验证码,界面会自动多出发码/填码两栏(支持 MFA 流程)。
    • 登录成功后自动加入账号池,失败会返回服务端原文(如 PASSWORD_OR_USER_NAME_IS_WRONG)。
  • 批量登录:一次粘贴多行 邮箱----密码 或 备注----邮箱----密码,逐个登录并加入账号池,需要验证码的行会单独列出。
  • 批量导入 token:手动添加区块支持多行 备注----token----cookie,一次导入多个已有账号。

v1.0.23

  • 注册页可用性提示:/sign_up 会做人机验证,在本地反代域名(127.0.0.1)下常常过不了,表现是「注册」按钮一直转圈。现在注册页顶部会提示改用邮箱验证码登录(首次登录自动创建账号,效果等同注册),并给出返回登录的路径。
  • 登录按钮不再遮挡页面:注入的「没有账号?邮箱注册 / 退出本页登录」移到右上角竖排,注册页自动隐藏注册入口,不再压在「返回登录」上。
  • 登录/注册失败有据可查:所有 /api/v0/users/* 请求只要返回的 code 非 0(或 biz_code 非 0),页面底部就会显示服务端原文;请求超过 15 秒没返回也会提示。

v1.0.22

  • 登录页不再白屏:静态资源(main.js 等)带 2 次快速重试(6s/次),失败立刻回磁盘缓存;缓存键去掉了页面每次加载都会变的 ?t=,同一份 main.js 现在能真正命中缓存;缓存目录只保留最近 30 个文件。
  • CDN 响应分级:只有「200 + javascript/css」才当作成功并写缓存;503/502、WAF 挑战页(200 但返回 text/html)一律走重试→缓存→报错,不会再把坏内容写进缓存或当脚本执行。
  • 站点页重试预算收紧:从 3×30s 改成 2×8s,弱网下快速失败而不是干等 90 秒。
  • 登录失败能看到真实原因:登录/注册/发码接口返回非成功时,页面底部会显示上游返回的原文(例如字段校验失败、风控拒绝)。
  • 安装链接固定到 tag:README 与各旧发行版的说明都改成 releases/download/v<版本>/…,不会再因为发新版本而 404。

v1.0.21

  • 历史对话没有名称时显示「未命名对话 xxxxxxxx」(老记录产生时还没有存名称),新对话一律显示首条提问。

v1.0.20

  • token 数量带单位显示:累计用量和单对话用量过万显示 K、百万显示 M、十亿显示 B(如 3.67M tok、1.25B tok),鼠标悬停可看完整数字;万以下仍显示原数字。

v1.0.19

  • 登录线路支持国内 / 邮箱两种登录页:设置 → DeepSeek 网页版 → 添加账号 → 「登录线路」三选一。
    • 自动:跟随浏览器语言(默认)。
    • 国内:中文登录页,手机号 / 微信 / 邮箱都能登。
    • 邮箱(英文页):英文登录页,邮箱或 Google 注册的账号用它;大陆网络同样可用,不需要代理。
    • 发验证码的 locale 也会跟着线路切换(zh_CN / en_US),登录页状态栏会显示当前线路。
  • 对话详情显示对话名称:用量卡片里的各对话详情不再显示一串哈希 ID,改成该对话第一条用户消息(如「帮我统计一下这个仓库里 mjs 文件的数量…」),最多 40 字;老记录没有名称时仍回退显示 ID。

v1.0.18

  • 引擎日志并入「维护」卡片:不再单独占一张卡,改成维护卡片里的一行「▸ 引擎日志(最近 40 行)」,点开才显示;「页面设置」的可排序列表里也同步去掉了它。

v1.0.17

  • 「网页版用量」里的各对话详情默认收起,点「▸ 各对话详情(N)」才展开,卡片更短。

v1.0.16

  • 「显示任务执行中的说明文字」的说明收进开关后面的 ? 气泡里,点击展开/收起,默认不占版面。

v1.0.15

  • 设置项文案改写:开关改为「显示任务执行中的说明文字」,解释改成两句人话——「模型在动手前常会先写一句说明……开启后这句说明会显示;关闭只保留命令执行记录和最终回答」。

v1.0.14

  • 新增开关「显示执行任务过程中的思考输出」(设置 → DeepSeek 网页版 → 运行设置): 默认关闭。关闭时,调用工具的轮次只显示工具调用本身,不再显示模型先写的那段大号白字说明(「我先看看 XX / 继续排查 YY」);思考块与最终回答不受影响,打开后恢复原样。

v1.0.13

  • 内部标记不再漏进正文:网页模型会吐 <|DSML|tool_calls>、写成歪格式的 <DSML||calls>(全角竖线)、甚至整段 {"role":"assistant",...} JSON。现在这些一律解析成 tool_calls 或被吞掉,任何情况下都不会出现在对话里。
  • 参数修不好也不再丢弃调用:以前缺必填参数会丢掉调用、并在正文里写一句「参数不完整,已忽略」,用户只能手动说「继续」;现在照原样透传给宿主工具层,由工具报错、模型在同一轮里自己改(与官方 API 行为一致)。
  • 写坏的 JSON 自动修复:字符串里漏转义的换行/制表符会被补回;实在解析不了就按 "name"/"arguments" 逐字段抠出调用。
  • 支持同时跑多个对话:去掉全局串行锁,改为「全局并发 maxConcurrency + 每账号并发 perAccountConcurrency(默认 2)」。两个对话同时请求实测 7.3s(串行需 12.0s)。

v1.0.12

  • 大幅减少「上下文已压缩」的频率:DSH 的自动压缩阈值是 min(窗口×0.8, 窗口 − 回复预留 − 65536),而默认 headroom 固定 65536。之前窗口声明 131072、回复预留 32768, 阈值只剩 32768 token —— 每多几轮就压一次,还常常只压掉 1 条记录(约 3~4k token),上下文被反复切碎。 现在改为声明窗口 196608(192K)、回复预留 16384,阈值抬到 约 114688 token,压缩频率降到原来的 1/3.5。
  • 插件自身的 prompt 预算同步放宽到 118K token / 330K 字符(仍低于网页版真实 128K 上限),避免刚放宽阈值就被插件自己截断。

v1.0.11

  • 工具参数按 schema 自动纠正类型:网页模型没有约束解码,常把 timeoutMs: 60000 写成 "60000"、run_in_background: true 写成 "true",导致 DSH 报 invalid arguments: "timeoutMs" must be a number 并空转重试。 现在按 tools 里的 JSON Schema 逐层纠正:数字字符串 → 数字(含科学计数法)、"true"/"false" → 布尔、JSON 字符串 → 数组/对象,嵌套对象与数组元素同样处理;纠正后再做必填校验,日志里会打印 [tool] coerced args。
  • 回复契约里补一句「参数类型严格按 schema,数字/布尔写裸值」,从源头减少此类错误。

v1.0.10

  • 仓库迁移:GitHub 用户名由 wsxuyue 改为 irerc,仓库地址变为 https://github.com/irerc/dsh-deepseek-web。 旧的 wsxuyue 链接会被 GitHub 自动 301 跳转到新地址,已安装的用户无需重装。
  • 安装命令、徽章、package.json 的 repository/homepage/issues 与插件「关于」页链接全部同步为新地址。

v1.0.9

  • 请求体 100% 是 API JSON:发出去的整段内容就是 {"model":"deepseek-web","messages":[…],"tools":[…],"tool_choice":"auto"}, JSON 外面不再有任何中文包装;「按 assistant JSON 回复」的要求改成 messages 里的一条 system 消息。

v1.0.8

  • 请求体就是真正的 API JSON:发给网页模型的是标准 OpenAI 请求体 {"model":"deepseek-web","messages":[...],"tools":[...]}(消息里保留 role / content / tool_calls / tool_call_id),后面再附一小段「按 assistant 消息 JSON 回复」的要求。
  • 回复解析兼容两种形状:{"role":"assistant",...} 与完整响应 {"choices":[{"message":{...}}]}。

v1.0.7

  • 空参数的工具调用直接拦下:模型信息不足时经常甩一个 {} 调用(截图里 输入 {} → 无障碍服务报 ACCESSIBILITY_UNAVAILABLE)。现在参数为空但工具需要参数时判为无效,返回「参数不完整,请补全」提示,不再把坏调用丢给工具层。
  • 配合 v1.0.6:工具调用缺 description 自动补全,缺其它必填则丢弃并回提示。

v1.0.6

  • 按 API 格式收发:发给网页模型的是 API 请求体形状的内容(messages[] 带 role / tool_calls / tool_call_id,加工具清单),并要求模型按 OpenAI assistant 消息格式回复: {"role":"assistant","content":...,"tool_calls":[{"name":...,"arguments":{...}}]}
    • 桥接器解析后翻译成标准 OpenAI 响应(正文 + tool_calls),解析失败自动退回纯文本,不会把 JSON 漏给用户。
    • 需要旧式「正文 + 标记」协议时:环境变量 DSW_REPLY_FORMAT=text。
  • 上游报错不再静默:网页端返回「消息发送过于频繁」等提示时直接回 429/502 说明原因,不再空回复重试三次、越retry越被限流。

v1.0.5

  • 一段 DSH 对话只用一条网页对话:首轮新建,之后一直复用,不再因为历史对不上、重试、压缩就新开。
  • 压缩后能认回原会话:DSH 压缩上下文、首条消息变了时,用「最近几轮回复的指纹」把原来的网页会话找回来,并补最近 8 条继续(日志里是 adopted existing web session by reply digest / continuation+resync)。
  • 超长交给网页端:不再本地整段重发或新开会话,上下文超过网页端上限时由网页端自行清理。

v1.0.4

  • 行为对齐官方 API:同一段对话能复用网页会话时只补「网页会话里还没有的那部分」(省 token、命中缓存);一旦历史对不上(编辑/压缩/换会话),整段重发 —— 效果与无状态 API 一致。
  • 工具参数校验与修补:DSH 的工具会拒收缺必填参数的调用,模型收到报错后会反复重试坏调用(截图里的 missing required property "description" 循环)。
    • description 缺失时由 command 自动推导补全;
    • 其他必填缺失或参数不是合法 JSON 时丢弃该调用,并回一句「参数不完整,请补全重试」,不再把坏调用交给工具层。
  • 工具说明标注「必填:…」,并在协议里强调缺参数会被拒绝。

v1.0.3

  • 修复「满屏 \n」的乱码回复:模型给出的工具调用块参数过长、被上游截断(没有结束标记)时,旧代码会把整段 JSON 当正文吐出来,用户就看到带 \n 转义的乱码。
    • 现在:能解析就照常当工具调用;解析不了只给一句「工具调用内容过长被截断,请拆成更小步骤」,不再把原始 JSON 当正文。
    • 正文里成片出现的 \n 转义会自动还原成真实换行。
  • 提示词约束:正文必须用真实换行 / 普通 Markdown,禁止输出 JSON 转义写法;工具参数里的长文本要求分块(单次约 2000 字)。
  • 历史里展示工具参数时会把转义还原成可读文本,避免模型跟着模仿。

v1.0.2

  • 上下文不再被截断:以前 prompt 超过 6 万字符会把工具说明整段丢掉,导致模型「不会用工具、看不到提问功能」。现在按 token 预算(默认 96K,可用 DSW_MAX_PROMPT_TOKENS 调)分配:
    • 系统设定与工具说明永远保留(工具说明放不下时先降级压缩,而不是删除)
    • 只从最旧的历史开始裁剪,并在正文里标注省略了多少条
  • 工具结果可见:最后一条用户消息之后的 assistant(tool_calls) 与 tool 结果现在会一起发给网页模型,并在历史里标成「(我调用了工具 X)/(X 的返回结果)」,模型不会再重复调用同一个工具。
  • 工具调用协议更明确:提示词要求「整条回复只输出工具块」,并点明需要用户选择时调用 ask_user_question 这类提问工具。
  • 流式返回补充 role: assistant 起始块,兼容更多 OpenAI 客户端。
  • 工具说明默认给出更完整的描述与参数(600 字描述 / 2400 字参数),预算不足时自动压缩。

Похожие плагины