Skip to content

Commit 6d17b51

Browse files
asizikovCopilot
andcommitted
feat: add model AIC-per-request chart
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
1 parent 6d3bd11 commit 6d17b51

2 files changed

Lines changed: 55 additions & 1 deletion

File tree

src/App.css

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -997,6 +997,24 @@ td.cost-centers-view__num {
997997
outline-offset: 2px;
998998
}
999999

1000+
.per-model__chartGroup {
1001+
display: flex;
1002+
flex-direction: column;
1003+
gap: 10px;
1004+
}
1005+
1006+
.per-model__chartNote {
1007+
margin: 0;
1008+
font-size: 16px;
1009+
font-weight: 400;
1010+
text-align: center;
1011+
color: #1f2328;
1012+
}
1013+
1014+
.per-model__chartNote strong {
1015+
font-weight: 700;
1016+
}
1017+
10001018
.products-view {
10011019
display: flex;
10021020
flex-direction: column;

src/views/ModelsView.tsx

Lines changed: 37 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import { useState, useMemo } from 'react'
22
import type { ModelUsageResult, ModelDailyUsageData } from '../pipeline/aggregators/modelUsageAggregator'
3-
import { DualAxisLineChart } from '../components'
3+
import { DualAxisLineChart, MultiSeriesStackedBarChart } from '../components'
44
import { fillDataForRange } from '../utils/fillDataForRange'
55
import { formatAiu, formatUsd } from '../utils/format'
66

@@ -24,6 +24,10 @@ type ModelsViewProps = {
2424
rangeEnd: string | null
2525
}
2626

27+
function formatAverageAicPerRequest(value: number): string {
28+
return value.toLocaleString(undefined, { minimumFractionDigits: 0, maximumFractionDigits: 3 })
29+
}
30+
2731
export function ModelsView({ modelUsage, aicDiscountRate, rangeStart, rangeEnd }: ModelsViewProps) {
2832
const [selectedModel, setSelectedModel] = useState<string>(modelUsage.models[0] ?? '')
2933

@@ -41,6 +45,19 @@ export function ModelsView({ modelUsage, aicDiscountRate, rangeStart, rangeEnd }
4145
const selectedModelAicNetAmount = selectedModelTotals
4246
? Math.max(selectedModelTotals.aiuGrossAmount - selectedModelAicDiscount, 0)
4347
: 0
48+
const dailyAverageAicPerRequest = useMemo(
49+
() => filledPerModelDailyData.map((day) => ({
50+
date: day.date,
51+
averageAicPerRequest: day.requests > 0 ? day.aiuQuantity / day.requests : 0,
52+
})),
53+
[filledPerModelDailyData],
54+
)
55+
const overallAverageAicPerRequest = selectedModelTotals && selectedModelTotals.requests > 0
56+
? selectedModelTotals.aiuQuantity / selectedModelTotals.requests
57+
: 0
58+
const overallAverageAicGrossPerRequest = selectedModelTotals && selectedModelTotals.requests > 0
59+
? selectedModelTotals.aiuGrossAmount / selectedModelTotals.requests
60+
: 0
4461

4562
const periodLabel = rangeStart
4663
? new Date(rangeStart + 'T00:00:00').toLocaleString('en-US', { month: 'long', year: 'numeric' })
@@ -132,6 +149,25 @@ export function ModelsView({ modelUsage, aicDiscountRate, rangeStart, rangeEnd }
132149

133150
{selectedModel && filledPerModelDailyData.length > 0 && (
134151
<div className="per-model__charts charts-grid">
152+
<div className="per-model__chartGroup">
153+
<MultiSeriesStackedBarChart
154+
title={`Daily average AIC per Request (${selectedModel})`}
155+
labels={dailyAverageAicPerRequest.map((day) => day.date)}
156+
series={[
157+
{
158+
label: 'Average daily AICs per request',
159+
color: '#14b8a6',
160+
data: dailyAverageAicPerRequest.map((day) => day.averageAicPerRequest),
161+
},
162+
]}
163+
height={320}
164+
/>
165+
<p className="per-model__chartNote">
166+
Average AICs per request for <strong>{selectedModel}</strong> in the current report period:{' '}
167+
<strong>{formatAverageAicPerRequest(overallAverageAicPerRequest)}</strong>, average gross per request{' '}
168+
<strong>{formatUsd(overallAverageAicGrossPerRequest)}</strong>
169+
</p>
170+
</div>
135171
<DualAxisLineChart
136172
title={`Daily Requests & AI Credits (${selectedModel})`}
137173
labels={filledPerModelDailyData.map((day) => day.date)}

0 commit comments

Comments
 (0)