dsh-provider-quote:在 DSH 里查当前提供商余额与模型单价

前言

在 DSH 里切换模型提供商或中转站时,常见两个实际问题:账户还剩多少额度,以及当前选的模型按 token 大概什么价。这些信息往往分散在各厂商控制台、OpenRouter 目录或 cc-switch 的「服务商询价」脚本里,对话界面本身不会汇总展示。

miku05231 的 dsh-provider-quote 把同类能力做进 DSH:针对当前正在使用的提供商查余额与单价,思路参考 cc-switch 的「服务商询价」,但以 DSH 插件形式挂在宿主 API 与 Web 客户端上。

这是什么

  • 名称:miku05231/dsh-provider-quote(npm 包名 @local/dsh-provider-quote)
  • 维护者:miku05231
  • 分类:联网工具(SkillHub 目录)
  • 版本(package.json):0.4.0;许可证 MIT
  • DSH 引擎要求:>=0.2.0-rc.2

插件回答三类问题,数据来源在 README 中有明确对应:

问题 数据来源
我还有多少钱? 按 baseURL 自动分派厂商余额适配器,或配置与 cc-switch 兼容的 usage_script
这个模型多少钱? OpenRouter 公开价格目录 https://openrouter.ai/api/v1/models(USD / 1M tokens),可本地 priceOverrides 覆盖
我能用哪些模型? 提供商 OpenAI 兼容的 GET /models

核心功能

宿主侧:询价引擎与 HTTP 路由

bundle 的宿主部分包含纯询价逻辑(lib/pricing.js)和 DSH 集成(lib/host.js)。Agent 可通过工具 provider_quote 直接问价,例如:

  • provider_quote() — 默认范围
  • provider_quote({ all: true }) — 全部提供商
  • provider_quote({ provider: 'openrouter' }) — 指定提供商
  • provider_quote({ models: true }) — 模型相关

对外 HTTP 路由包括:

  • GET /api/provider-quote/summary(?refresh=1 跳过约 30s 报价缓存)
  • GET /api/provider-quote/refresh(同上,路径别名)
  • GET /api/provider-quote/ping — 自检版本、模块 URL、目录缓存模型数

可选查询参数:scope=session|default、sessionId、provider、model。带 scope=session&provider=… 时,「使用中」对应该会话的模型选择;只带 sessionId 或未选模型时,按新会话的全局默认处理。

客户端:胶囊与设置页

client.js 挂载两处 UI,共用同一份 store,避免重复请求:

  1. 对话输入框下方(slot conversation.composer.dock):常驻胶囊,例如 ● 余额 12.4 USD,只显示本会话选中提供商的余额;在模型选择器里换提供商会立刻切换;点击立即重新询价(?refresh=1);每 5 分钟静默刷新。悬停可见提供商、来源(本会话 / 全局默认)与失败原因。
  2. 设置 → 模型 页底部(slot settings.models.footer):当前提供商余额、当前模型单价、其余提供商概览,带「刷新询价」(设置页无会话上下文,固定按全局默认)。

本会话选择 vs 全局默认

DSH 里「当前提供商」有两套语义,插件分开处理,避免「胶囊显示 A、刷新却查了 B」:

  • 本会话选择:各会话的 modelSelection(next ?? lastUsed),供输入框模型选择器与胶囊使用。
  • 全局默认:agentDefaultModel.currentSelection(),只决定新会话默认模型;设置面板、provider_quote 工具、尚未选模型的会话走这一路。

显示始终跟本会话;点刷新会把 scope=session&sessionId=…&provider=…&model=… 传给宿主。

余额适配器

adapters: auto(默认)时按 baseURL 的 host 优先,再依次兜底;失败会记录试过的 URL 与 HTTP 状态。内置 id 包括 openrouter、deepseek-official、relay-user-balance、one-api、new-api、openai-billing,以及 script:<host>(粘贴 cc-switch 的 usage_script,支持 {{baseUrl}} / {{apiKey}})。

中转站、New API 等场景在 README 中有专门说明:例如 New API 用仅 API key 查余额可能 401 或误读「无限额度」占位值 100000000;v0.4.0 起识别占位值后只报真实「已用」,准确余额需配置 accessTokenEnv 指向面板访问令牌(profile:read)。

单价与价格目录

模型 id 按 priceOverrides、OpenRouter slug、完整 id、裸名、归一化名依次匹配;匹配不到则标注「未匹配到价格」并给出最多 3 条目录候选,不猜测。目录默认缓存 6 小时(catalogTtlMs);抓取失败时保留上次成功目录并标记 stale。

提供商来源:自动扫描 profile 里带 providers: { id: { baseURL, apiKeyEnv, models } } 的配置;apiKeyEnv 经 ctx.credentials 解析且不落盘明文;也可用插件自身 config.providers 补全;内置映射如 deepseek-official → https://api.deepseek.com。

安装与启用

安装方式来自 README,需在会话里用 plugin_manager 指定工作区目录(不要在 profile 目录手写 package.json 或跑 pnpm):

plugin_manager action=install_bundle target=<本插件的绝对路径,如 ~/dev/dsh-provider-quote>

装完查看返回的 application 与 warnings:applied 表示生效。宿主代码变更后需重启 DSH 才会加载新代码。

配置写在 cordis.patch.yml 中该插件行的 config,常用键包括:

键 默认 含义
enabled true 关闭整行
adapters auto 'auto' 或适配器 id 数组
timeoutMs 12000 单次 HTTP 超时
catalogTtlMs 21600000 价格目录缓存(6h)
autoRefreshMinutes 0 后台预热间隔,0 为关闭
scripts {} host → cc-switch 兼容脚本

典型用法

Agent 工具询价(在已安装并启用插件的 DSH 会话中,由 agent 调用):

provider_quote()
provider_quote({ all: true })
provider_quote({ provider: 'openrouter' })
provider_quote({ models: true })

自定义余额脚本(与 cc-switch 同格式,写入 scripts):

scripts:
  relay.example.com: >-
    ({ request: { url: "{{baseUrl}}/user/balance", method: "GET",
                  headers: { "Authorization": "Bearer {{apiKey}}", "User-Agent": "cc-switch/1.0" } },
       extractor: function (response) { return { isValid: response.is_active || true, remaining: response.balance, unit: "USD" }; } })

New API 准确余额(示例字段名来自 README):

providers:
  xianapi-ds:
    baseURL: https://www.xianapi.cloud/v1
    accessTokenEnv: XIANAPI_DS_ACCESS_TOKEN

单价锚定(匹配不到时按候选写入):

priceOverrides:
  deepseek-flash: { openrouterId: deepseek/deepseek-chat }
  my-local-model: { input: 0.3, output: 0.9, cacheRead: 0.03, cacheWrite: 0.4 }

浏览器 / 客户端:日常看本会话余额用输入框下胶囊;看全量提供商与单价用设置 → 模型页底部面板,必要时点「刷新询价」或胶囊触发 refresh=1。

适用场景与注意

适合在 DSH 中长期使用多提供商、中转站或 OpenRouter 的开发者:对话前快速确认余额,选型时对照 OpenRouter 参考价(中转站有倍率时用 priceOverrides 对齐实付)。

使用前请注意:

  • 插件以当前 DSH 进程权限运行,会按配置发起对外 HTTP 并使用 ctx.credentials 解析 API key / 访问令牌;安装前应阅读 GitHub 仓库 源码与 MIT 许可证,确认凭据命名与出站请求符合你的安全策略。
  • 单价来自 OpenRouter 公开目录,对中转站仅为参考;余额接口因厂商而异,查不到时 README 要求给出可解释的失败信息而非静默空白。
  • SkillHub 目录页与 GitHub 由社区维护,与 DeepSeek / 幻方无官方从属关系;星标等元数据以目录为准(当前 GitHub 星标为 0)。

结尾

dsh-provider-quote 把「当前提供商还剩多少、模型大概什么价」收进 DSH 界面与 provider_quote 工具,并与 cc-switch 询价脚本、OpenRouter 目录对齐,减少在控制台与文档之间来回切换。

  • 目录页:https://www.skillhub.cn/plugins/miku05231/dsh-provider-quote
  • GitHub:https://github.com/miku05231/dsh-provider-quote
羽毛球分组比赛记分
小程序二维码

欢迎使用《羽毛球分组比赛记分》微信小程序

小夜