Skip to content

Commit 00c65ae

Browse files
committed
fix: expand charts to top 10 models
Increase the Usage Trends model scope from top 5 to top 10 and align Cost Analysis chart legend labels accordingly. Keep Cost Analysis Details unbounded so the table still shows all models.
1 parent 02e9e25 commit 00c65ae

File tree

1 file changed

+20
-20
lines changed

1 file changed

+20
-20
lines changed

frontend/src/components/Dashboard.jsx

Lines changed: 20 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -492,26 +492,26 @@ function Dashboard({ stats, dailyStats, modelUsage, hourlyStats, loading, isRefr
492492
}))
493493
}, [filteredDailyStats])
494494

495-
// Top 5 Models for Trends
495+
// Top 10 Models for Trends
496496
const topRequestModels = useMemo(() => {
497497
return [...filteredModelUsage]
498498
.sort((a, b) => (b.request_count || 0) - (a.request_count || 0))
499-
.slice(0, 5)
499+
.slice(0, 10)
500500
.map(m => m.model_name)
501501
}, [filteredModelUsage])
502502

503503
const topTokenModels = useMemo(() => {
504504
return [...filteredModelUsage]
505505
.sort((a, b) => (b.total_tokens || 0) - (a.total_tokens || 0))
506-
.slice(0, 5)
506+
.slice(0, 10)
507507
.map(m => m.model_name)
508508
}, [filteredModelUsage])
509509

510510
// Top models sorted by requests (chart always shows requests)
511511
const activeTopModels = useMemo(() => {
512512
return [...filteredModelUsage]
513513
.sort((a, b) => (b.request_count || 0) - (a.request_count || 0))
514-
.slice(0, 5)
514+
.slice(0, 10)
515515
.map(m => m.model_name)
516516
}, [filteredModelUsage])
517517

@@ -622,28 +622,28 @@ function Dashboard({ stats, dailyStats, modelUsage, hourlyStats, loading, isRefr
622622
const sparklineData = hourlyChartData.slice(-12)
623623
const costSparkline = dailyChartData.length >= 2 ? dailyChartData : [...Array(7)].map((_, i) => ({ cost: i === 6 ? totalCost : totalCost * (i * 0.1) }))
624624

625-
// Cost breakdown datasets (same top 5 model scope as Usage Trends)
626-
const top5ModelSet = useMemo(() => new Set(activeTopModels), [activeTopModels])
625+
// Cost breakdown datasets
626+
const topModelSet = useMemo(() => new Set(activeTopModels), [activeTopModels])
627627

628-
const costBreakdownBase = useMemo(() => {
629-
const top5Models = (filteredModelUsage || []).filter(m => top5ModelSet.has(m.model_name))
630-
const top5TotalCost = top5Models.reduce((sum, m) => sum + (m.estimated_cost_usd || 0), 0)
631-
632-
return top5Models.map((m) => ({
628+
// Full dataset for Details tab (unlimited)
629+
const costBreakdownAllBase = useMemo(() => {
630+
return (filteredModelUsage || []).map((m) => ({
633631
...m,
634-
percentage: top5TotalCost > 0 ? ((m.estimated_cost_usd || 0) / top5TotalCost * 100).toFixed(0) : '0',
632+
percentage: totalCost > 0 ? ((m.estimated_cost_usd || 0) / totalCost * 100).toFixed(0) : '0',
635633
color: getModelColor(m.model_name)
636634
}))
637-
}, [filteredModelUsage, top5ModelSet])
635+
}, [filteredModelUsage, totalCost])
638636

639-
// Legend always sorted by cost (desc)
637+
// Chart/legend dataset follows same top model scope as Usage Trends
640638
const costLegend = useMemo(() => {
641-
return [...costBreakdownBase].sort((a, b) => (b.estimated_cost_usd || 0) - (a.estimated_cost_usd || 0))
642-
}, [costBreakdownBase])
639+
return costBreakdownAllBase
640+
.filter(m => topModelSet.has(m.model_name))
641+
.sort((a, b) => (b.estimated_cost_usd || 0) - (a.estimated_cost_usd || 0))
642+
}, [costBreakdownAllBase, topModelSet])
643643

644644
// Table sorting honors user-selected column/direction
645645
const costBreakdown = useMemo(() => {
646-
return [...costBreakdownBase].sort((a, b) => {
646+
return [...costBreakdownAllBase].sort((a, b) => {
647647
let aVal = a[tableSort.column]
648648
let bVal = b[tableSort.column]
649649

@@ -657,7 +657,7 @@ function Dashboard({ stats, dailyStats, modelUsage, hourlyStats, loading, isRefr
657657

658658
return tableSort.direction === 'asc' ? aVal - bVal : bVal - aVal
659659
})
660-
}, [costBreakdownBase, tableSort])
660+
}, [costBreakdownAllBase, tableSort])
661661

662662
// Handle table sort
663663
const handleSort = (column) => {
@@ -1150,7 +1150,7 @@ function Dashboard({ stats, dailyStats, modelUsage, hourlyStats, loading, isRefr
11501150
gap: '4px',
11511151
paddingRight: '4px'
11521152
}}>
1153-
<span>Top 5 Models</span>
1153+
<span>Top 10 Models</span>
11541154
<span style={{ textAlign: 'right' }}>Req</span>
11551155
<span style={{ textAlign: 'right' }}>Tokens</span>
11561156
<span style={{ textAlign: 'right', color: isDarkMode ? '#10b981' : '#059669' }}>Cost</span>
@@ -1448,7 +1448,7 @@ function Dashboard({ stats, dailyStats, modelUsage, hourlyStats, loading, isRefr
14481448
justifyContent: 'space-between',
14491449
paddingRight: '8px'
14501450
}}>
1451-
<span>Top 5 Models</span>
1451+
<span>Top 10 Models</span>
14521452
<span>Cost / %</span>
14531453
</div>
14541454
{costLegend.map((model, index) => (

0 commit comments

Comments
 (0)