fix: 合并跨分组账号评分

This commit is contained in:
root
2026-07-16 16:43:11 +02:00
parent 44f4f358f6
commit 4eb09e9831
6 changed files with 240 additions and 13 deletions
+53
View File
@@ -1,4 +1,5 @@
import { AdminHttpClient } from "../../src/admin-http-client";
import { mergeAccountScores } from "../../src/account-score-aggregation";
import { createEmbeddedContext } from "../../src/bootstrap";
import { loadConfig, type EmbeddedCliTarget, type HttpCliTarget } from "../../src/config";
@@ -13,6 +14,10 @@ interface Parsed {
draws: number | null;
}
function record(value: unknown): Record<string, unknown> | null {
return typeof value === "object" && value !== null && !Array.isArray(value) ? value as Record<string, unknown> : null;
}
function value(args: string[], name: string): string | null {
const index = args.indexOf(name);
if (index < 0) return null;
@@ -60,6 +65,7 @@ function help(): Record<string, unknown> {
commands: [
"config validate",
"backend check",
"scores aggregate-smoke",
"lottery status",
"lottery draw [--confirm]",
"lottery reset [--draws N] [--include-records] --confirm",
@@ -156,6 +162,53 @@ export async function runCli(args: string[]): Promise<void> {
}, null, 2));
return;
}
if (parsed.command.join(" ") === "scores aggregate-smoke") {
const account = (groupId: number, groupName: string, successRequests: number, failureRequests: number, ttftP95Ms: number, apiAmountUsd: number) => ({
accountId: 15,
accountName: "lyon9801 0.0",
groupId,
groupName,
status: "active",
currentlyAvailable: true,
priority: 1,
successRequests,
failureRequests,
observedAttempts: successRequests + failureRequests,
streamSuccessRequests: successRequests,
firstTokenSamples: successRequests,
ttftP95Ms,
usage: { requestCount: successRequests, tokenCount: successRequests * 1000, apiAmountUsd },
});
const rows = mergeAccountScores([
account(3, "自用", 100, 0, 10_591, 1),
account(2, "unidesk-codex-pool", 50, 1, 13_206, 0.5),
]);
const row = rows[0] ?? {};
const checks = {
uniqueAccount: rows.length === 1,
groupsMerged: Array.isArray(row.groupNames) && row.groupNames.length === 2,
attemptsMerged: row.observedAttempts === 151,
usageMerged: record(row.usage)?.requestCount === 150 && record(row.usage)?.apiAmountUsd === 1.5,
decimalScore: typeof row.score === "number" && !Number.isInteger(row.score),
conservativeTtft: row.ttftP95Ms === 13_206,
};
console.log(JSON.stringify({
ok: Object.values(checks).every(Boolean),
action: "account-score-aggregate-smoke",
checks,
result: {
accountId: row.accountId,
accountName: row.accountName,
groupNames: row.groupNames,
observedAttempts: row.observedAttempts,
score: row.score,
ttftP95Ms: row.ttftP95Ms,
usage: row.usage,
},
mutation: false,
}, null, 2));
return;
}
const targetId = parsed.targetId ?? config.runtime.defaultCliTarget;
const target = config.runtime.cliTargets[targetId];
if (!target) throw new Error(`runtime.cliTargets.${targetId} does not exist`);