mirror of
https://github.com/router-for-me/Cli-Proxy-API-Management-Center.git
synced 2026-02-18 18:50:49 +08:00
feat(ui): show success/failure in API usage stats
This commit is contained in:
@@ -54,9 +54,11 @@ export interface UsageDetail {
|
||||
export interface ApiStats {
|
||||
endpoint: string;
|
||||
totalRequests: number;
|
||||
successCount: number;
|
||||
failureCount: number;
|
||||
totalTokens: number;
|
||||
totalCost: number;
|
||||
models: Record<string, { requests: number; tokens: number }>;
|
||||
models: Record<string, { requests: number; successCount: number; failureCount: number; tokens: number }>;
|
||||
}
|
||||
|
||||
const TOKENS_PER_PRICE_UNIT = 1_000_000;
|
||||
@@ -542,28 +544,65 @@ export function getApiStats(usageData: any, modelPrices: Record<string, ModelPri
|
||||
const result: ApiStats[] = [];
|
||||
|
||||
Object.entries(apis as Record<string, any>).forEach(([endpoint, apiData]) => {
|
||||
const models: Record<string, { requests: number; tokens: number }> = {};
|
||||
const models: Record<string, { requests: number; successCount: number; failureCount: number; tokens: number }> = {};
|
||||
let derivedSuccessCount = 0;
|
||||
let derivedFailureCount = 0;
|
||||
let totalCost = 0;
|
||||
|
||||
const modelsData = apiData?.models || {};
|
||||
Object.entries(modelsData as Record<string, any>).forEach(([modelName, modelData]) => {
|
||||
models[modelName] = {
|
||||
requests: modelData.total_requests || 0,
|
||||
tokens: modelData.total_tokens || 0
|
||||
};
|
||||
const details = Array.isArray(modelData.details) ? modelData.details : [];
|
||||
const hasExplicitCounts =
|
||||
typeof modelData.success_count === 'number' || typeof modelData.failure_count === 'number';
|
||||
|
||||
let successCount = 0;
|
||||
let failureCount = 0;
|
||||
if (hasExplicitCounts) {
|
||||
successCount += Number(modelData.success_count) || 0;
|
||||
failureCount += Number(modelData.failure_count) || 0;
|
||||
}
|
||||
|
||||
const price = modelPrices[modelName];
|
||||
if (price) {
|
||||
const details = Array.isArray(modelData.details) ? modelData.details : [];
|
||||
if (details.length > 0 && (!hasExplicitCounts || price)) {
|
||||
details.forEach((detail: any) => {
|
||||
totalCost += calculateCost({ ...detail, __modelName: modelName }, modelPrices);
|
||||
if (!hasExplicitCounts) {
|
||||
if (detail?.failed === true) {
|
||||
failureCount += 1;
|
||||
} else {
|
||||
successCount += 1;
|
||||
}
|
||||
}
|
||||
|
||||
if (price) {
|
||||
totalCost += calculateCost({ ...detail, __modelName: modelName }, modelPrices);
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
models[modelName] = {
|
||||
requests: modelData.total_requests || 0,
|
||||
successCount,
|
||||
failureCount,
|
||||
tokens: modelData.total_tokens || 0
|
||||
};
|
||||
derivedSuccessCount += successCount;
|
||||
derivedFailureCount += failureCount;
|
||||
});
|
||||
|
||||
const hasApiExplicitCounts =
|
||||
typeof apiData?.success_count === 'number' || typeof apiData?.failure_count === 'number';
|
||||
const successCount = hasApiExplicitCounts
|
||||
? (Number(apiData?.success_count) || 0)
|
||||
: derivedSuccessCount;
|
||||
const failureCount = hasApiExplicitCounts
|
||||
? (Number(apiData?.failure_count) || 0)
|
||||
: derivedFailureCount;
|
||||
|
||||
result.push({
|
||||
endpoint: maskUsageSensitiveValue(endpoint) || endpoint,
|
||||
totalRequests: apiData.total_requests || 0,
|
||||
successCount,
|
||||
failureCount,
|
||||
totalTokens: apiData.total_tokens || 0,
|
||||
totalCost,
|
||||
models
|
||||
|
||||
Reference in New Issue
Block a user