@@ -111,22 +133,6 @@ const ModelSection = ({
/>
-
Success vs Failed Requests
@@ -377,6 +383,7 @@ export const processActivityData = (
total_cache_read_input_tokens: 0,
total_cache_creation_input_tokens: 0,
top_api_keys: [],
+ top_models: [],
daily_data: [],
};
}
@@ -444,6 +451,45 @@ export const processActivityData = (
});
}
+ // Process Model breakdowns for each API key (only when key is 'api_keys')
+ if (key === "api_keys") {
+ Object.entries(modelMetrics).forEach(([apiKeyHash, _]) => {
+ const modelBreakdown: Record = {};
+
+ // Aggregate Model data for this key across all days
+ // We need to look in breakdown.models[model].api_key_breakdown[apiKeyHash]
+ dailyActivity.results.forEach((day) => {
+ Object.entries(day.breakdown.models || {}).forEach(([modelName, modelData]) => {
+ if (modelData && "api_key_breakdown" in modelData) {
+ const keyDataForModel = modelData.api_key_breakdown?.[apiKeyHash];
+ if (keyDataForModel) {
+ if (!modelBreakdown[modelName]) {
+ modelBreakdown[modelName] = {
+ model: modelName,
+ spend: 0,
+ requests: 0,
+ successful_requests: 0,
+ failed_requests: 0,
+ tokens: 0,
+ };
+ }
+
+ modelBreakdown[modelName].spend += keyDataForModel.metrics.spend;
+ modelBreakdown[modelName].requests += keyDataForModel.metrics.api_requests;
+ modelBreakdown[modelName].successful_requests += keyDataForModel.metrics.successful_requests || 0;
+ modelBreakdown[modelName].failed_requests += keyDataForModel.metrics.failed_requests || 0;
+ modelBreakdown[modelName].tokens += keyDataForModel.metrics.total_tokens;
+ }
+ }
+ });
+ });
+
+ // Sort by spend
+ modelMetrics[apiKeyHash].top_models = Object.values(modelBreakdown)
+ .sort((a, b) => b.spend - a.spend);
+ });
+ }
+
// Sort daily data
Object.values(modelMetrics).forEach((metrics) => {
metrics.daily_data.sort((a, b) => new Date(a.date).getTime() - new Date(b.date).getTime());