🎁 福利专区全网大模型免费应用 + 新用户福利 + 注册活动入口,低成本玩转 AI

提供商拓展 forestbiankiii/dsh-provider-extension

DeepSeek Harness
forestbiankiii19 天前有提交已提供中文文档扫描:含敏感能力

提供商拓展插件 · Provider Extension

32.2/100
综合分
3
GitHub 星标
—
npm 周下载
—/5
用户评分

数据截至 2026/10/15 · 周下载取自 npm 全网(含 CI / 镜像),非本站安装数;综合分由星标、活跃度与兼容性检查合成。

自动兼容检查有告警:未发布到 npm registry,仅可从源码安装。
安装命令 · 需先装 dsh CLI 引擎
dsh plugin --profile web add forestbiankiii/dsh-provider-extension
该包不可直接 npm 安装,改从 GitHub 源安装(明细见下方安装检查)

状态速览

判定依据:实装验证 · 静态安装检查 · 自动扫描 · 仓库维护状态
信任档位:已验证
是什么
dsh 原生插件 · market
装得上吗
本站已在 dsh 0.2.1-rc.5 下真实安装成功
非静态推断
L5 · 运行时冒烟等级说明 →
安全吗
本站尚未对该插件做风险分级
暂未覆盖,不等同于无风险
还在维护吗
活跃:最近一次提交在 19 天前
档位由哪些信号合成

本站实装验证(真实安装 L4 覆盖全站;L5 为运行时冒烟或实机截图,覆盖范围小于 L4) · 验证所用 dsh 版本 · 静态安装检查 · 风险分级 · 仓库维护状态。 下方各区块是它的证据明细。

验证判据与等级说明 →
社区实装还没有人打卡 · 装过的第一个就是你
安装兼容性检查⚠ 装前注意

未发布到 npm registry,仅可从源码安装

展开查看检查明细 ↓

以下结论由程序自动检查 npm 包、engines 声明与入口文件得出,未做人工实机验证——能装不等于用着没问题。

✗npm 包dsh-provider-extension(未发布到 npm,仅可源码安装)
✓Node 引擎要求 >=20 · 基线 Node 22.19 满足
✓dsh CLI 依赖未声明 dsh 版本约束
✓入口文件main/exports/bin 已声明

验证方式:npm registry 存在性 + package.json 静态校验 · 最后检查 2026/10/21 17:44:15

安全扫描自动 · 静态分析源码
v2.7.0
🔵 扫描:含敏感能力尚无人工评估
展开查看扫描说明与证据 ↓

静态扫描发现插件具备触达本地系统的能力:执行外部命令、读写/删除本地文件、读取剪贴板或密钥类环境变量(至少其一)。这是能力清单,不是危险判定——具体能力项与证据见下方,安装前请自行判断是否需要。

可执行外部命令读写/删除本地文件写入剪贴板(不计风险)读取剪贴板或密钥环境变量发起外部网络请求
查看扫描证据(共 97 处,展示前 38 条)
  • 删除本地文件
    lib/index.js:112
    await unlink(path);
  • 删除本地文件
    lib/index.js:144
    await unlink(path);
  • 删除本地文件
    lib/index.js:153
    await unlink(path);
  • 删除本地文件
    lib/index.js:187
    await unlink(lockPath).catch(() => {
  • 读取本地文件
    lib/index.js:201
    const stat3 = await lstat(lockPath);
  • 删除本地文件
    lib/index.js:203
    await unlink(lockPath).catch(() => {
  • 写入本地文件
    lib/index.js:210
    await mkdir(parent, { recursive: true, mode: 448 });
  • 写入本地文件
    lib/index.js:211
    await chmod(parent, 448).catch(() => {
  • 读取本地文件
    lib/index.js:228
    fileInfo = await lstat(path);
  • 读取本地文件
    lib/index.js:237
    text2 = await readFile(path, "utf8");
  • 写入本地文件
    lib/index.js:264
    await chmod(temporary, 384);
  • 写入本地文件
    lib/index.js:265
    await rename(temporary, path);
  • 写入本地文件
    lib/index.js:266
    await chmod(path, 384);
  • 删除本地文件
    lib/index.js:269
    await unlink(temporary).catch(() => {
  • 读取本地文件
    lib/index.js:403
    const file2 = await lstat(path);
  • 读取本地文件
    lib/index.js:404
    const parent = await lstat(dirname(path));
  • 发起网络请求
    lib/index.js:2012
    response = await transport.request({
  • 请求外部主机www.googleapis.com
    lib/index.js:2318
    const userinfoRes = await fetch("https://www.googleapis.com/oauth2/v2/userinfo", {
  • 发起网络请求
    lib/index.js:2318
    const userinfoRes = await fetch("https://www.googleapis.com/oauth2/v2/userinfo", {
  • 发起网络请求
    lib/index.js:2890
    let response = await transport.request({
  • 发起网络请求
    lib/index.js:2898
    const retryResponse = await transport.request({
  • 读取本地文件
    lib/index.js:3094
    const [file2, directory] = await Promise.all([lstat2(path), lstat2(dirname2(path))]);
  • 写入本地文件
    lib/index.js:3145
    await mkdir2(directory, { recursive: true, mode: 448 });
  • 发起网络请求
    lib/index.js:4681
    response = await this.transport.request({
  • 发起网络请求
    lib/index.js:4827
    response = await this.transport.request({
  • 读取密钥环境变量
    lib/index.js:33995
    hit = process.env.OPENCODE_API_KEY || process.env[ref];
  • 执行外部命令来自配置/变量
    lib/index.js:34206
    const child = spawn3(
  • 执行外部命令固定命令
    lib/index.js:34948
    const child = spawn4("powershell.exe", ["-NoProfile", "-NoExit", "-Command", command], { detached: true, stdio: "ignore", windowsHide: false, env: { .
  • 读取密钥环境变量
    lib/index.js:36024
    process.env.OPENCODE_API_KEY = key;
  • 读取密钥环境变量
    lib/index.js:36056
    key = process.env.OPENCODE_API_KEY;
  • 发起网络请求
    lib/client.js:1160
    const res = await fetch(endpoint, {
  • 发起网络请求
    lib/client.js:1194
    const res = await fetch(endpoint, { headers });
  • 写入剪贴板
    lib/client.js:5626
    await navigator.clipboard.writeText(annotations.map((m, i) => `${i + 1} (${(m.x * 100).toFixed(2)}%, ${(m.y * 100).toFixed(2)}%): ${m.note}`).join("\n
  • 发起网络请求
    lib/client.js:5879
    const response = await fetch(src, { signal: controller.signal });
  • 发起网络请求
    lib/client.js:6090
    const r = await fetch(src);
  • 发起网络请求
    lib/client.js:6296
    const r = await fetch(cleanUrl, { signal: c.signal });
  • 发起网络请求
    lib/client.js:7213
    const response = await fetch(new URL(`${channel}/${endpoint}`, location.origin), {
  • 读取本地文件
    lib/claude-bridge.mjs:28
    const tools = JSON.parse(readFileSync(manifestPath, 'utf8'))
扫描于 2026/11/2(1 天前) · 范围 入口闭包 + 发布文件清单 · 来源 GitHub 仓库
涉及外部主机:www.googleapis.com

静态扫描只反映源码中出现的调用,不构成安全背书;人工评估与自动扫描相互独立、互不覆盖。

依赖的 DSH / Cordis 模块
@deepseek-ai/cordis@deepseek-ai/dsh-agent@deepseek-ai/dsh-api-remotes@deepseek-ai/dsh-api-session-controller@deepseek-ai/dsh-attachment@deepseek-ai/dsh-client-connection@deepseek-ai/dsh-client-locale@deepseek-ai/dsh-client-store@deepseek-ai/dsh-client-ui-conversation@deepseek-ai/dsh-client-ui-model-selection@deepseek-ai/dsh-client-ui-primitives@deepseek-ai/dsh-client-ui-settings
给这个插件打分还没有人投票↓
用户评分
还没有人投票,来当第一个

功能亮点

  • 作曲服务商扩展
  • 账号与模型控制
  • 按账号订阅配额

非官方 DSH Desktop 服务商扩展:作曲服务商、账号、模型控制,支持按账号订阅配额

README

由 DeepSeek 最新模型翻译生成
提供商拓展插件 · Provider Extension dsh-provider-extension 是面向 DeepSeek Harness 的非官方社区插件,负责在 DSH Desktop 中接管输入区的提供方座位,并为每个提供方承载一个独立接入模块。 本项目不隶属于 DeepSeek,也未获得 DeepSeek 官方背书。DeepSeek Harness 及相关名称归各自权利人所有。 本项目此前名为 dsh-model-panel,安装器会自动迁移旧安装。 提供方接入状态 | 提供方 | 状态 | 插件提供的能力 | | ChatGPT / Codex 订阅(dsh-codex-subscription 2.x) | 已实现 | 列出全部已保存账号、切换真实活动账号、显示每个账号的周余额 | | Antigravity(dsh-antigravity-auth 0.1.4-rc.1) | 已实现 | 提供商设置页确认该能力包的风险提示、登录 Google 账号,并列出该账号上报的模型 | | OpenAI GPT(API) | 计划中 | — | | Google Gemini | 计划中 | — | | OpenCode Go | 已实现 | 网关模型、API Key 配置及额度窗口 |
展开完整文档(README 剩余 1 节)
提供商拓展插件 · Provider Extension

dsh-provider-extension 是面向 DeepSeek Harness 的非官方社区插件,负责在 DSH Desktop 中接管输入区的提供方座位,并为每个提供方承载一个独立接入模块。

本项目不隶属于 DeepSeek,也未获得 DeepSeek 官方背书。DeepSeek Harness 及相关名称归各自权利人所有。

本项目此前名为 dsh-model-panel,安装器会自动迁移旧安装。

提供方接入状态

| 提供方 | 状态 | 插件提供的能力 |
| ChatGPT / Codex 订阅(dsh-codex-subscription 2.x) | 已实现 | 列出全部已保存账号、切换真实活动账号、显示每个账号的周余额 |
| Antigravity(dsh-antigravity-auth 0.1.4-rc.1) | 已实现 | 提供商设置页确认该能力包的风险提示、登录 Google 账号,并列出该账号上报的模型 |
| OpenAI GPT(API) | 计划中 | — |
| Google Gemini | 计划中 | — |
| OpenCode Go | 已实现 | 网关模型、API Key 配置及额度窗口 |
| Claude 订阅(anthropic-claude-cli) | 已实现;真实调用待用户登录验证 | 官方 CLI 管理登录、文本流式响应、工具调用回传、模型别名及开关 |

每个提供方在 src/client/providers/ 下拥有独立模块。未实现并在真实 DSH 窗口验收之前,不会宣称已接入。

Host 接入实现已包含在此 Bundle 中,上游来源和许可证记录在 THIRD-PARTY-NOTICES。不要重复启用占用同一路由的适配器。Antigravity/Codex 凭据保留在各自 Host 模块;Claude 则完全由官方 CLI 管理登录。

Codex 回答详略

在「提供商拓展 → OpenAI Codex」的快捷展开或详情页选择「回答详略」:默认/简短/适中/详细。这是当前 DSH 配置内各 Codex 账号共用的一个偏好,选择后通过宿主配置编辑器自动保存,仅影响后续 Codex 请求,不切换模型或账号,不改变其他渠道及搜索设置。默认跟随模型上报的默认值,没有上报时维持适配器原有的适中档;不支持此参数的模型保持原行为。它是风格偏好,不是硬性字数限制。

界面会显示保存确认或失败,宿主无法持久化时为只读。延迟加载的 codex_output_verbosity 工具调用同一偏好操作。更新后重启 DSH,再检查四档选择及再次重启后的保留情况。后续功能仍需单独确认,候选及验收状态见 CODEX-ROADMAP.md。

Codex 上下文长度

在「OpenAI Codex → 管理设置」中选择「上下文长度」:标准使用模型默认值,扩展使用模型上限,自定义统一设置一个全局数值,例如 256k(1k = 1,000 tokens)。模式下方会列出各模型当前实际生效容量;每个模型最多使用自己的目录上限。切换模式自动保存;自定义数值修改后点「保存」。更大上下文可能增加输入 token 消耗,也不能解锁服务端权限。

之前保存的逐模型覆盖值会保留以兼容旧配置,但界面不再逐个调整。统一值只影响后续请求,已准备好的请求保持原容量。更新后重启 DSH,测试自定义 K 值并再次重启确认是否保留;自动测试使用模拟配置和流,不修改用户设置或发送推理请求。延迟加载的 codex_context_length 工具也只读写一个 tokensK 值。

Codex 额度详情

输入区额度提示和 Codex 账号展开详情会显示 API 实际上报的 5h/周额度、额外额度分组、Credits 及个人消费上限;未上报的值不展示、不推算。Credits 不是货币,消费上限按 API 原值展示,不猜测单位或换算货币。Usage 统计页已有独立的提供商 Credits 和重置券卡片。本显示复用现有额度读取,不增加模型推理请求。

Codex 图片工具

在「OpenAI Codex → 管理设置」中,可分别开关「图片生成」和「图片编辑」。设置保存到宿主配置;切换开关不会生成或编辑图片,实际调用仍可能消耗订阅额度。开关仅供用户操作,不提供 Agent 设置工具。Codex 路由中明确提出的生图/编辑请求会指向 codex_image_generate;仅讨论图片或编写提示词不会调用,关闭的开关不会被绕过,也不会回退到其他图片提供商;其他提供商路由不受影响。不改输入图片处理或默认输出模型/画质;带标注的编辑也要求开启「图片编辑」。

Codex 原图预览与下载

Codex 图片工具调用完成后,生成图片会显示在助手回答下方,不依赖展开工具详情;图片卡片保留结果预览,并提供「查看原图」和「下载 PNG」。原图从 DSH 宿主私有存储中按当前会话授权分块读取并校验;不请求图片服务,也不额外消耗订阅额度。原图不可用时会显示提示,不会读取任意宿主路径。

Codex 区域标注编辑

点击图片缩略图会打开大图模态窗口。底部悬浮工具栏支持缩放、平移、适合窗口、原始大小、原图下载、编号备注、涂抹擦除、去背景、调整比例及进入画板。图片不会被浏览器拖走;选择移动工具时拖动图片,选择标注工具时点击图片落下编号,拖动编号可以调整位置。备注按 Enter 收起、Shift+Enter 换行。

开启「图片编辑」及区域标注后,「继续编辑」把干净源图、带编号的 PNG 定位参考图和坐标/备注提示放入当前 Codex 输入框。涂抹擦除则附上同尺寸的黑白定位蒙版。所有操作均不修改保存的原图,也不会自动发送;检查草稿后点击发送才会请求编辑,可能消耗订阅额度。已有图片或结构化引用不会被覆盖,准备过程中输入框改变会中止回填。

直接粘贴、上传或用画板「附加到输入框」发来的图片已经是可用的编辑参考:助手按图片引用中的 sha256 标识调用编辑工具,字节数、格式和尺寸由 DSH 从当前会话读取,不需要你再上传一次,也不需要工作区文件路径。引用从会话完整历史中查找,因此之后发生摘要压缩或图片卸载时,早先发过的图片仍可引用。为避免误用,仍然只接受你在本次会话中明确选定的图片;read_image 只用于真正的工作区文件。

Codex 自由绘画画板

从 Codex 输入框左侧工具栏的画笔图标进入(悬浮提示「草图画板」),也可从大图工具栏进入。支持钢笔、铅笔、荧光笔、笔刷橡皮、对象橡皮、直线、箭头、矩形、椭圆、曲线及文字;选择对象后可移动、调整大小和颜色。图层可以新增、复制、删除、重排、显隐及锁定,橡皮只作用于当前图层。Ctrl/Cmd+Z 撤销,Shift+Ctrl/Cmd+Z 重做,画布聚焦后空格+拖动平移。

可以导入 PNG/JPEG/WebP 为图层,导出 PNG 或本插件的可编辑 JSON 画稿。最多 20 份已保存草稿留在当前浏览器;关闭再打开会保留本页未保存画稿,但刷新、退出前仍应保存或导出。与上游画板的 JSON 文件格式不作兼容承诺。

「附加到输入框」只加入草图和提示词,需由你补充成品要求并发送。此增量不启用 Agent 自动画图,不改变图片精度或默认画质。

DSH 原生 Codex 子任务

在「提供商拓展 → OpenAI Codex → 管理设置」开启「启用 Codex 委派」(默认关闭)。这是 DSH 的独立子会话,使用本插件的 Codex 订阅模型,不是官方 Codex CLI。无需安装组件;开启/关闭设置不会发起模型请求。原有 subagent、subagent_fork 不变。

在 Codex 会话明确要求助手调用 codex_subtask,提供完整、自包含的任务,例如:“用 codex_subtask 只读检查某个文件,不要修改”。可指定目录里实际可用的 model 及其支持的 reasoning_effort;省略模型则继承当前模型,换模型未指定推理档位则使用新模型默认值。显式模型选择遵守 DSH 子任务模型限制。主会话模型不变。

子会话使用父工作区、DSH 委派权限与递归深度限制,不读取父对话。默认等待最终答案;run_in_background: true 返回作业 id,用 job_output 收集结果、job_kill 请求停止。取消不回滚文件修改。关闭开关只禁止后续新任务,已接受任务可继续;卸载插件会取消并等待它发起的任务释放。独立子任务会额外消耗订阅用量,测试不使用实际付费调用。

官方 CLI 独立运行时因不能通过公开接口可靠隔离系统/项目 MCP,未交付,也不会悄悄回退启用。

Codex 云端上下文压缩(实验)

在「OpenAI Codex → 管理设置 → 云端上下文压缩」选择「DSH(默认)」或「云端(实验)」。保存偏好不发起模型请求。云端模式只在普通 Codex 会话回复请求中添加服务器自动压缩参数,不另行调用 /responses/compact,也不修改其他提供商、标题生成或 DSH 摘要请求。

服务端触发压缩后,加密条目与后续输出保存在原生回复回放元数据里;之后只在账号、模型、会话、原生签名及请求边界匹配时重用。压缩只作用于发送给模型的请求窗口,不删除原始聊天历史。更换账号/模型、会话分叉、工具或历史发生变化时,失效的缓存不重用,而从保留的历史重新建立请求。DSH 手动 /compact 和自动安全压缩仍按原有规则工作。

这是实验性请求参数。离线模拟验证不能证明当前 ChatGPT 订阅端支持它;若服务器拒绝或回放边界不匹配,会报错,不会悄悄切换模式或新增重试。可由你切回「DSH(默认)」继续。既有 DSH 错误恢复策略未改,不保证解决上游请求缓冲错误。

云端压缩可能消耗订阅用量并损失上下文细节;加密条目不是可读摘要。测试使用模拟 HTTP,没有压缩你的真实对话;与 WebSocket 明确互斥,不启用原生审查模型。

Codex WebSocket 连接(实验)

在「OpenAI Codex → 管理设置 → Codex 连接方式」选择「SSE(默认)」或「WebSocket(实验)」。保存只修改偏好,不打开连接、不发起模型请求。WebSocket 仅用于普通 Codex 会话回复;标题和 DSH 摘要请求仍走 SSE,其他提供商和搜索路由不变。

本增量复用原生 SDK 的连接和协议,仍发送完整上下文;没有开启 previous_response_id 增量缓存,不保证更快或节省订阅用量。每个连接按本插件实例、会话、实际账号和代理隔离,沿用现有环境/系统代理。握手或断线失败不实际退回 SSE,也不切换账号或模型;需要时由你改选 SSE。SDK 原有有限连接恢复和 DSH 错误策略保留,没有新增重试设置。

WebSocket 与云端压缩不能同时启用:先选「DSH(默认)」压缩,再开 WebSocket;要用云端压缩,先切回 SSE。互斥在原生配置写入及请求入口检查,不会替你关闭另一项。

切回 SSE 会清理空闲连接,已接受的 WebSocket 请求可继续至结束再释放。取消、会话销毁、切换/移除账号、退出登录和插件卸载会清理自有连接;账号切换或卸载可能中断进行中的请求。离线测试使用假 socket,没有访问真实模型服务;实际订阅和代理支持仍待你验收。

Codex 速度模式

在「OpenAI Codex → 管理设置」中选择「标准」或「Fast」。它会保存为 Codex 配置偏好并作用于后续请求;是否实际使用 Fast 优先级通道,由现有模型目录的支持信息决定,不支持的模型仍按标准模式请求,支持列表为空时界面会提示。Fast 不改变推理等级、模型、账号或其他渠道,可能更快消耗订阅额度,也不能解锁权限。

设置使用宿主配置编辑器持久化,延迟加载的 codex_speed_mode 工具读写同一偏好。更新后重启 DSH,测试支持 Fast 的模型在两种模式下的请求行为,并在再次重启后确认设置保留。自动测试使用模拟请求,不产生推理费用。此增量不包括 Ultrafast。

Claude 订阅:通过官方 CLI 接入

先安装未修改的官方 Claude Code CLI 并加入 PATH,重启 DSH,再打开「提供商拓展 → Anthropic Claude」。Windows 上的登录按钮会在可见终端启动官方 claude auth login,其他平台请自行执行该命令。完成登录后刷新状态,在输入区选择 Anthropic Claude 和 Sonnet/Opus/Haiku 模型别名。登录及账号切换仍由官方 CLI 管理,本插件不导入、保存、导出或改写其 Token。CLI 也可能使用 API Key/第三方计费,设置页会明确提示。请遵守 Anthropic 的认证及凭据规则。

适配器借鉴 MIT 项目 katsos/dsh-claude-cli,固定提交为 3a3a57f22a3e748c9720a1b96ce64e015f0f9643。DSH 保留对话记录并执行工具,CLI 内置工具及本地设置不参与,仅由无执行能力的 MCP 桥声明工具;一个模型消息完成后结束 CLI 请求。首版只支持文本,历史以转录形式重建,并非原生角色/思考签名回放;模型别名是参考目录,不保证套餐权限。CLI 未报告的订阅额度/到期日不会伪造,请在官方 CLI 使用 /usage 查看,不提取 Token 或发送收费探测消息。

插件 Config 字段:claudeExecutable(默认 claude)、claudeStreamIdleTimeoutMs(默认 300000)、claudeUnsupportedFields(默认 error)。这里的 CLI 无法精确兑现 temperature、maxTokens、stop;请从代理配置移除,或显式设置 ignore 才忽略。claude_channel 工具只提供状态/模型查询,登录仅限用户界面或终端。安装检测和模拟测试不能替代您的真实登录及模型调用验收。

功能

- 使用 DSH 每个会话的权威 ModelDirectory,不复制模型目录。
- 覆盖自带的 conversation.input.model 视觉座位,同时保留其权威服务和 /model 命令。
- 只呈现两个模型相关控件:先选择提供方/账号,再选择模型与推理等级。
- 把所选提供方的模型显示为带独立强调色的推理等级滑杆,并显示当前模型声明的推理等级按钮。
- 没有推理档位的模型仍然可以选择。
- 选择普通提供方只改变正在浏览的目录分组;只有继续选择模型后,才会改变会话的实际模型。
- 后端不支持上下文窗口选择时明确说明,不提供虚假的 256K/512K/1M 按钮。

使用统计(与本插件一同安装)

侧边栏「使用统计」覆盖当前 DSH 配置内的全部工作区、会话和子代理,不跨配置同步。页面提供年度活动热力图、用量趋势、渠道/模型/工作区/会话排行,以及耗时、首字延迟、重试和失败统计。页面跟随 DSH 深浅主题,不提供预算提醒或自动限流。

首次打开会在后台从持久化会话日志补齐历史,显示导入进度和读档失败。分叉继承的历史前缀不重复计费;压缩前真实产生的请求仍计入总量。提供商未上报的用量标为缺失,不当作零。

DeepSeek 的充值余额、赠金余额复用 DSH「账号与余额」中的登录,不需要再次提供密钥。现有「查询用量」是平台页面入口,不是账单接口;余额不能代表消费流水。本地金额是按「费率设置」中各渠道、模型的每百万 Token 单价计算的预估费用,采用当前配置费率,不还原历史价格。未设置价格或缓存计费信息不足时显示未知;人民币与美元不合并,其他渠道首版不估价。

账号区还会直接读取 Codex 各账号的 5 小时/周额度与提供商 Credits、Antigravity 各账号的分组额度,以及 OpenCode Go 的 Host 用量接口。统计页不切换活动账号,也不向页面发送密钥。当前及非当前账号均使用各自的认证刷新后直接读取,暂无接口的渠道会明确标注;缺少数据不当作满额度或零余额。OpenCode 的上报比例不会猜测为剩余额度。重新进入页面会先显示同一连接上次查询的账号数据,再后台更新;旧查询时间保留至新结果返回,刷新失败会提示旧数据可能过期。仅使用浏览器内存,不写浏览器存储,整页重载后清空。账号数据在进入页面及手动刷新时读取,不受日志筛选影响。usage_statistics 新增 balances 动作返回同一账号视图;旧 balance 动作仍只查询 DeepSeek。

账号卡片支持拖动把手排序,聚焦把手后也可用方向键。“选择显示卡片”提供各账号的复选框和上下箭头,卡片右上角亦可直接隐藏;“恢复默认布局”重置顺序和显示状态。本浏览器仅保存卡片标识及显示偏好,不保存余额、账号标签或 Token。新账号自动追加,刷新不打乱已保存顺序;隐藏卡片不改变登录状态或提供商查询。

统计缓存由 DSH 会话投影管理,可从日志重建;费率保存在当前配置的宿主存储中。页面与 usage_statistics 工具共用报告、余额查询及费率保存操作。统计接口只返回元数据和计量,不返回消息正文或凭据。新增能力要求宿主提供 sessionQuery、sessionProjections 和 connection;费率保存还需 storageDomain。

通过 DSH 内置插件管理器安装或升级本 bundle 即包含该页面。替换已加载的包可能要求重启;以安装结果为准,不保证仅刷新页面就加载新的 Host 代码。

ChatGPT / Codex 订阅账号

- 每个已保存账号都列在对应提供方下,显示账号标签、脱敏邮箱和活动标记。
- 分组标题显示账号数量,而不是模型数量。
- 选择账号会调用订阅插件经过认证的 account/select RPC、刷新额度控件并重新加载模型目录;OAuth 凭据不会进入本插件。
- 打开列表时自动读取当前活动账号的周余额。
- 现有对话控件/设置中的按需查询仍采用临时切换后立即恢复的流程,恢复失败会明确报错。使用统计页改用按账号 ID 读取的新路径:不切换账号,指定账号请求失败时也不会回退到其他账号的额度。

兼容性

已在 DSH Desktop v2.0.9 中验证,并按公开的 0.1.2-rc.1 DSH 包契约构建。这些仍是预发布接口,因此较新的 Desktop 版本可能需要更新插件。

当前选择请求只包含:

{ provider: string, model: string, reasoningEffort?: string }

真正的上下文预算还需要 Host 请求准备、持久化、提供方支持和压缩策略接入;插件不会把目录元数据误当成已打通的后端能力。

安装

需要:已经初始化 desktop profile 的 DSH Desktop、Git 和 Node.js 20 或更高版本。

git clone https://github.com/forestbiankiii/dsh-provider-extension.git
cd dsh-provider-extension
node scripts/profile.mjs install

仓库已提交预构建的 lib/index.js 和 lib/client.js,安装时不需要运行 npm install,也不需要本地编译器。

安装器会:

1. 从依赖、bundle、patch row 和运行副本中清除所有旧包名(dsh-model-panel、@dshx/client-ui-model-panel);
2. 把白名单内的运行文件复制到 ~/.dsh/local-plugins/dsh-provider-extension;
3. 在 ~/.dsh/profiles/desktop/package.json 声明本地 file 依赖;
4. 把运行副本放入该 profile 的 node_modules,确保能够解析;
5. 在 dsh.profile.bundles 中只加入一次 dsh-provider-extension;
6. 清理用户 patch 中遗留或手工添加的 provider-extension、model-panel row,避免 bundle 被注册两次;
7. 修改前备份以上两个 profile 文件。

它不会修改应用安装目录或 app.asar。若数据目录或 profile 不同:

node scripts/profile.mjs install --dsh-home D:\path\to\.dsh --profile desktop

随后必须完全退出并重新启动 DSH Desktop。仅刷新页面不会重建组合后的插件行。

更新

在已克隆的仓库中执行:

git pull --ff-only
node scripts/profile.mjs install

然后重启 DSH Desktop。重复运行安装器是幂等的,并会重新创建备份。

从 dsh-model-panel 升级不需要额外步骤:运行安装器就会完成迁移,包括删除旧的运行副本。

卸载

在已克隆的仓库中执行:

node scripts/profile.mjs uninstall

然后重启 DSH Desktop。卸载器只删除本插件的精确依赖、bundle 条目、遗留或手工 patch row 和运行副本,并保留修改前备份。

开发

npm ci
npm run check

npm run check 会进行严格 TypeScript 检查,运行组件、策略和安装器测试,重新构建 DSH client-module,并检查可发布包。独立构建器使用 esbuild 与 Lightning CSS,外置由 DSH 提供的运行模块,并用 window.__ModuleLoader__.load(...) 包装浏览器产物。

UI 与运行行为修改必须遵守 CONTRIBUTING.md 中的真实窗口验收门禁:先在本地安装候选版本,让需求方在当前 DSH Desktop 窗口试用,收到明确确认后才允许 push、打 tag 或发布 Release。

结构

- src/index.ts:Host 提供商接入与统计模块挂载入口。
- src/usage/:无正文的计量投影、历史回填、报告、DeepSeek 余额与费率存储。
- src/client/usage/:统计主页面、侧栏入口、筛选及图表。
- src/client/index.ts:客户端注册和具备生命周期的样式注入。
- src/client/ProviderPanel.tsx:composer 按钮、弹层、滑杆和无障碍行为。
- src/client/providers/codex.ts:ChatGPT/Codex 订阅账号名册、账号切换与额度读取。
- src/client/selection.ts:纯模型/推理档位选择策略。
- cordis.patch.yml:注册 provider-extension 行的 bundle patch。
- scripts/profile.mjs:先备份后修改的 profile 安装/卸载器与改名迁移。
- lib/client.js:DSH 实际加载的预构建浏览器产物。

插件声明 sessions、remote 与 remote.session,因为 modelDirectories.directoryFor(sessionId) 会通过调用方的 Cordis 上下文读取这些服务。

隐私与安全

插件包含 Host 提供商接入与 Client UI。使用统计模块通过宿主查询及投影读取会话日志中的计量、模型、时间和关系信息,只向页面返回统计及会话元数据,不返回消息正文或凭据。DeepSeek 余额由宿主账号服务查询,统计不另行读取密钥,也不自动切换其他提供商账号。提供商接入本身可能管理认证并访问对应服务;这与统计模块的权限边界不同。没有新增遥测。详见 SECURITY.md。

许可证

MIT
预览分享卡片长什么样 ↓forestbiankiii/dsh-provider-extension
分享 · DeepSeek Harness Hub
forestbiankiii/dsh-provider-extension

提供商拓展插件 · Provider Extension

这是你的仓库?认领条目

回到顶部