dsh-web
zhu1090093659/dsh-webDeepSeek Harness(DSH)Web 插件聚合生态包 · 一切皆插件,创意工坊分发(dsh-market.com)
把内置的 llm-pi-ai 与 llm-deepseek 适配器、模型选择器、模型服务设置页替换为自维护版本;经安全区下载跟踪上游 @earendil-works/pi-ai 并提供一键启用开关;另加供应商额度与余额查询、供应商管理页。
一个 dsh(DeepSeek Harness)插件:接管官方的
pi-ai 适配器(llm-pi-ai)、DeepSeek 适配器(llm-deepseek)、模型选择器(ui-model-selection)
与 Models 设置页(ui-settings-models),提供自维护的 pi-ai 桥接、模型选择器、额度查询与
供应商管理界面。
中文 · English
本仓库 fork 自 imchangchang/dsh-llm-provider,此后独立维护演进。当前版本 v0.2.6(安装走 main 分支)。
dsh plugin --profile web add github:Ztyss/dsh-llm-provider # 私有仓库,git 需凭据(gh auth login 即可)
dsh web # 需要重启:插件树在进程启动时组装
lib/ 构建产物随仓库分发,装完即用。改源码后 npm run build 并把 lib/ 与 src/
同 commit 提交(刻意没有 prepare 脚本:pnpm 从 git 安装时跑它会失败)。
设置页(Provider → pi-ai 桥接)的**「启用最新版 pi-ai」开关**:让官方 pi-ai 适配器跑在从 npm
下载的 @earendil-works/pi-ai 最新版上,替代 DSH 自带版本——pi-ai 出新版本、支持新模型时
不必等待 dsh 发版。
dist-tags.latest 的 @earendil-works/pi-ai——
sha512 校验 → 解压 → 装依赖闭包 → 按桥接副本的 import 需求体检,落安全区
$DSH_HOME/llm-provider-bridge/pi-ai/<版本>/(插件包随时可能被整棵递归删,几百 MB 不放
包里);重启后桥接软链指向自有版,顶替 DSH 自带那份,体检不过自动回退,开关永远有兜底。$DSH_HOME/llm-provider-bridge/vendor-status.json——此前偏好写在
插件包内 vendor/status.json,包管理器每次重装/升级都整棵重建插件目录,开关被重置回 OFF;
迁出后重装零丢失(包内过渡版文件首次读取时自动并入安全区再移除)。updateDecision 跳过「最新版 ≤ 本地已就位」);60 秒最小间隔只是防 crash-loop
的工程防抖。拨 OFF 一概不触网。piAiNeedsRestart 现场推导(偏好 + 安全区已就位版本 + 当前跑的那档)——原地启用(无需
下载)那一态也照实说重启;待生效的那一版是本次检查真下载来的(lastCheck.installed
正是它,典型:重启后启动检查自动更新)说「已更新」,文件早有、只是没在跑说「已下载」;
未过检验的原因常驻在桥接明细行。下载中 2s 轮询。tf 插值,走 dsh 自己的 locale 机制,语言切换实时跟随。POST /provider/set-models
(服务端校验、拒绝内置路由),声明原文为底稿——保全手写的 reasoningEfforts / compat;
「跟随目录(还原)」即删掉该键回到目录全量。需要控制台会话的 provider(StepFun 的 Step Plan 点数这一类)把 Cookie 存在
$DSH_HOME/llm-provider-bridge/.cookies.yaml——单文件、点前缀隐藏,对齐 .credentials.yaml
的习惯;范式同 credentials(version + 扁平键表),键 = 凭据 ref 名(如
STEPFUN_CONSOLE_COOKIE),新 provider / 新 Cookie 直接加键。解析容错手改,坏行不炸查询。
stepfun-console-session.json 首次读取并入新文件后移除。seedSha(种子凭据指纹)——同一凭据的后续配额刷新
命中指纹即用存储值,不再把静态凭据反复写回。此前一次刷新 = 两次写盘 + 一次白做的续期 RPC;
现在只在「重贴 Cookie」与「续期轮换」两种真实变化时落盘。Oasis-Token 段——只贴了 Oasis-Webid 一枚的碎片不会覆盖
已轮换的好 jar。/model 命令与模型目录
状态机全部由本插件提供。/model 命令:按供应商过滤、搜索模型,候选按供应商分组展示,每组显示额度/余额。modlens-<上游> / deepseek-modlens 这类合成 provider
的 chip、输入框旁当前额度、/model 面板都按上游账户取数(dot 状态点与配色一并跟上游)。available 契约:为 / 命令贡献实现官方必填的 available(session)——被寻址为子代理
的会话不出现模型选择;契约是宿主裸调、一抛整批 / 候选陪葬,因此实现永不抛错,任何异常
一律吞掉并放行。src/pi-ai-source.ts 校验 manifest、入口与官方 bundle 实际 import
的四条子路径;残缺时给出可执行的恢复指引(npm pack 覆盖回宿主目录,插件不代劳)。
piAiCandidates() 候选链 = 安全区(拨 ON 时,新→旧)→ vendor 遗留档 → 内置依赖 →
dsh 自带,逐个体检,第一个通过的入选。$DSH_HOME/llm-provider-bridge/:插件包随时可能被整棵递归删
(Node ≥24.15 的 rmSync 会顺 junction 清空目标),安全区方案下没有任何链接可供跟随。
不变量:安装插件包整包零链接(test/host-safety.mjs 实证)。resources/app.asar 后,官方 bundle、它依赖的
@deepseek-ai/*、以及 DSH 自带那份 pi-ai 全在归档里。目录链接(Windows junction / POSIX symlink)
的目标由内核的对象管理器解析,而内核不认识 asar——链进归档必然悬空,existsSync 直接 false,
启动时只剩一句 Cannot find package '@deepseek-ai/dsh-launch-environment'(pi-ai 则是
Cannot find package '@earendil-works/pi-ai'),整座桥退化。所以包目录落在 .asar 里时不挂链,
改为把桥接副本里的 specifier 直接写成归档入口的 file:// URL:宿主自己就是这么加载官方 bundle 的,
同一条路径解析出同一个模块实例(不会出现「一份代码两个 LlmError / cordis」)。「启用最新版 pi-ai」
拨 ON / 拨 OFF 两条路都覆盖——OFF 时中选的就是归档里 DSH 自带那份;副本始终从真源按本轮改写集重新
推导,来回拨开关两个方向都落得对。入口解不出才退回挂链(错误形态与改动前一致)。npm test # 构建 + 18 步离线测试链(不需要 dsh;末步是 patch 条件漂移校验)
node test/host-safety.mjs # junction 安全回归:须在 node 24.14 与 DSH 自带运行时(≥24.15)各跑一遍