From b4a616502e7df03fa5215468c150f3474efa8f4e Mon Sep 17 00:00:00 2001 From: huahai0202 <2023217276@mail.hfut.edu.cn> Date: Sun, 23 Aug 2026 20:17:43 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E6=96=B0=E5=A2=9E=20Charm=20Hyper=20?= =?UTF-8?q?=E4=BD=99=E9=A2=9D=E6=9F=A5=E8=AF=A2=E9=80=82=E9=85=8D=E5=99=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/balance-providers.ts | 26 +++++++++++++++++++++++++- 1 file changed, 25 insertions(+), 1 deletion(-) diff --git a/src/balance-providers.ts b/src/balance-providers.ts index 39b5b00..4cac687 100644 --- a/src/balance-providers.ts +++ b/src/balance-providers.ts @@ -125,8 +125,32 @@ const moonshotProvider: BalanceProvider = { }, } +const hyperProvider: BalanceProvider = { + id: "hyper", + name: "Charm Hyper", + keyPlaceholder: "sk-hyper-...", + async fetchBalance(apiKey, signal) { + // 官方接口:GET /v1/credits → {"balance": 98}(积分余额) + const res = await fetch("https://hyper.charm.land/v1/credits", { + headers: { Authorization: `Bearer ${apiKey}`, Accept: "application/json" }, + signal, + }) + if (!res.ok) { + if (res.status === 401) throw new BalanceError("401") + if (res.status === 403) throw new BalanceError("403") + throw new BalanceError(String(res.status)) + } + const json = await res.json() as { balance?: string | number } + const balance = json.balance + if (typeof balance === "undefined" || balance === null) throw new BalanceError("EMPTY") + // hyper 积分换算:100 积分 = $5,即 1 积分 = $0.05 + const usd = (Number(balance) * 0.05).toFixed(2) + return [{ currency: "USD", total: usd }] + }, +} + /** 已注册的 provider 列表(按需追加新适配器)。 */ -export const balanceProviders: BalanceProvider[] = [deepseekProvider, siliconflowProvider, openrouterProvider, moonshotProvider] +export const balanceProviders: BalanceProvider[] = [deepseekProvider, siliconflowProvider, openrouterProvider, moonshotProvider, hyperProvider] /** 按 id 取 provider;未知 id 回退到第一个。 */ export function getBalanceProvider(id: string): BalanceProvider {