11import { useState , useMemo } from 'react'
22import type { ModelUsageResult , ModelDailyUsageData } from '../pipeline/aggregators/modelUsageAggregator'
3- import { DualAxisLineChart } from '../components'
3+ import { DualAxisLineChart , MultiSeriesStackedBarChart } from '../components'
44import { fillDataForRange } from '../utils/fillDataForRange'
55import { 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+
2731export 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