前言¶
在 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,避免重复请求:
- 对话输入框下方(slot
conversation.composer.dock):常驻胶囊,例如● 余额 12.4 USD,只显示本会话选中提供商的余额;在模型选择器里换提供商会立刻切换;点击立即重新询价(?refresh=1);每 5 分钟静默刷新。悬停可见提供商、来源(本会话 / 全局默认)与失败原因。 - 设置 → 模型 页底部(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