fix(usage): 列表支持显式模板查询(Sub2API/NewAPI)——对齐后端绕过 usage_kinds 的口径 — bump to v0.7.22
Release / Version consistency (push) Canceled after 0s
Release / Build (macos-latest) (push) Canceled after 0s
Release / Build (ubuntu-latest) (push) Canceled after 0s
Release / Build (windows-latest) (push) Canceled after 0s
Release / Attach macOS install script (push) Canceled after 0s
Release / Version consistency (push) Canceled after 0s
Release / Build (macos-latest) (push) Canceled after 0s
Release / Build (ubuntu-latest) (push) Canceled after 0s
Release / Build (windows-latest) (push) Canceled after 0s
Release / Attach macOS install script (push) Canceled after 0s
This commit is contained in:
1 parent
11286419b1
commit
13e15657af
9 files changed
+58
-9
No files matched your search
@@ -1,5 +1,5 @@
|
||||
import { describe, expect, it } from "vitest";
|
||||
import { isAlertTier, type UsageData } from "./useUsageQuery";
|
||||
import { isAlertTier, usageQuerySupported, type UsageData } from "./useUsageQuery";
|
||||
|
||||
/** 百分比窗口行(five_hour 等);套餐类 tier 的 unit 恒为 "%"。 */
|
||||
function percentTier(used: number): UsageData {
|
||||
@@ -42,3 +42,22 @@ describe("isAlertTier", () => {
|
||||
expect(isAlertTier({ planName: "five_hour", unit: "%", remaining: 20 }, 50)).toBe(false);
|
||||
});
|
||||
});
|
||||
|
||||
describe("usageQuerySupported", () => {
|
||||
it("有识别类型即可查询", () => {
|
||||
expect(usageQuerySupported(["balance:deepseek"])).toBe(true);
|
||||
expect(usageQuerySupported([], true)).toBe(true);
|
||||
});
|
||||
|
||||
it("显式模板(newapi/sub2api)绕过 usage_kinds——自定义供应商也该查", () => {
|
||||
expect(usageQuerySupported(undefined, true)).toBe(true);
|
||||
});
|
||||
|
||||
it("无识别类型且非显式模板时不查询", () => {
|
||||
expect(usageQuerySupported(undefined)).toBe(false);
|
||||
expect(usageQuerySupported([])).toBe(false);
|
||||
// auto 模板没有识别到类型 = 不支持(与弹窗短路口径一致)
|
||||
expect(usageQuerySupported([], false)).toBe(false);
|
||||
expect(usageQuerySupported(undefined, undefined)).toBe(false);
|
||||
});
|
||||
});
|
||||
@@ -75,15 +75,30 @@ export function isAlertTier(
|
||||
return d.unit === "%" && d.used != null && d.used >= threshold;
|
||||
}
|
||||
|
||||
/**
|
||||
* 是否值得为该供应商发起用量查询:有预设识别类型,或后端按显式模板
|
||||
* (newapi / sub2api,二者绕过 usage_kinds)查询。
|
||||
*/
|
||||
export function usageQuerySupported(
|
||||
usageKinds?: string[],
|
||||
explicitTemplate?: boolean
|
||||
): boolean {
|
||||
return (usageKinds?.length ?? 0) > 0 || explicitTemplate === true;
|
||||
}
|
||||
|
||||
export function useUsageQuery(
|
||||
agent: Agent,
|
||||
providerName: string,
|
||||
usageKinds?: string[],
|
||||
autoIntervalMinutes?: number,
|
||||
disabled?: boolean,
|
||||
threshold?: number
|
||||
threshold?: number,
|
||||
/** Backend resolves the query from an explicit template (newapi / sub2api)
|
||||
* regardless of usageKinds — those bypass kinds entirely, so the row is
|
||||
* supported even when the provider has no preset-detected kinds. */
|
||||
explicitTemplate?: boolean
|
||||
): UsageQueryState {
|
||||
const supported = (usageKinds?.length ?? 0) > 0;
|
||||
const supported = usageQuerySupported(usageKinds, explicitTemplate);
|
||||
// Cache key includes the agent so a Kimi Code provider and a Pi provider
|
||||
// with the same name do not clobber each other's cached result.
|
||||
const cacheKey = `${agent}:${providerName}`;
|
||||
|
||||
Reference in new issue
Block a user