feat: add local auth billing and usage management

This commit is contained in:
inman committed 2026-08-12 12:13:06 +08:00
1 parent f642b5e71f
commit 196fdde83f
119 files changed
+15695 -2650

No files matched your search

+22
View File
@@ -26,9 +26,14 @@ export type SeedanceQueryResult = {
status: "queued" | "running" | "succeeded" | "failed" | "cancelled";
resultUrl?: string;
errorMessage?: string;
usage?: SeedanceUsage;
raw: Record<string, unknown>;
};
export type SeedanceUsage = {
completionTokens: number;
};
export function getSeedanceConfig() {
const model = process.env.SEEDANCE_MODEL || "doubao-seedance-2-0-260128";
return {
@@ -107,10 +112,21 @@ export async function querySeedanceTask(providerTaskId: string): Promise<Seedanc
json.data?.url ||
json.data?.output,
errorMessage: json.error?.message || json.data?.error?.message,
usage: extractSeedanceUsage(json),
raw: json as Record<string, unknown>
};
}
export function extractSeedanceUsage(value: unknown): SeedanceUsage | undefined {
const root = recordValue(value);
const data = recordValue(root?.data);
const usage = recordValue(root?.usage) || recordValue(data?.usage);
if (!usage) return undefined;
const completionTokens = Number(usage.completion_tokens ?? usage.completionTokens);
if (!Number.isFinite(completionTokens) || completionTokens <= 0) return undefined;
return { completionTokens: Math.floor(completionTokens) };
}
function normalizeSeedanceStatus(status: unknown): SeedanceQueryResult["status"] {
const value = String(status || "").toLowerCase();
if (["succeeded", "success", "completed"].includes(value)) return "succeeded";
@@ -119,3 +135,9 @@ function normalizeSeedanceStatus(status: unknown): SeedanceQueryResult["status"]
if (["running", "processing", "generating"].includes(value)) return "running";
return "queued";
}
function recordValue(value: unknown): Record<string, unknown> | undefined {
return typeof value === "object" && value !== null && !Array.isArray(value)
? value as Record<string, unknown>
: undefined;
}