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,14 @@ 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+
31+ function roundAverageAicPerRequest ( value : number ) : number {
32+ return Number ( value . toFixed ( 3 ) )
33+ }
34+
2735export function ModelsView ( { modelUsage, aicDiscountRate, rangeStart, rangeEnd } : ModelsViewProps ) {
2836 const [ selectedModel , setSelectedModel ] = useState < string > ( modelUsage . models [ 0 ] ?? '' )
2937
@@ -41,6 +49,19 @@ export function ModelsView({ modelUsage, aicDiscountRate, rangeStart, rangeEnd }
4149 const selectedModelAicNetAmount = selectedModelTotals
4250 ? Math . max ( selectedModelTotals . aiuGrossAmount - selectedModelAicDiscount , 0 )
4351 : 0
52+ const dailyAverageAicPerRequest = useMemo (
53+ ( ) => filledPerModelDailyData . map ( ( day ) => ( {
54+ date : day . date ,
55+ averageAicPerRequest : day . requests > 0 ? roundAverageAicPerRequest ( day . aiuQuantity / day . requests ) : 0 ,
56+ } ) ) ,
57+ [ filledPerModelDailyData ] ,
58+ )
59+ const overallAverageAicPerRequest = selectedModelTotals && selectedModelTotals . requests > 0
60+ ? selectedModelTotals . aiuQuantity / selectedModelTotals . requests
61+ : 0
62+ const overallAverageAicGrossPerRequest = selectedModelTotals && selectedModelTotals . requests > 0
63+ ? selectedModelTotals . aiuGrossAmount / selectedModelTotals . requests
64+ : 0
4465
4566 const periodLabel = rangeStart
4667 ? new Date ( rangeStart + 'T00:00:00' ) . toLocaleString ( 'en-US' , { month : 'long' , year : 'numeric' } )
@@ -132,6 +153,25 @@ export function ModelsView({ modelUsage, aicDiscountRate, rangeStart, rangeEnd }
132153
133154 { selectedModel && filledPerModelDailyData . length > 0 && (
134155 < div className = "per-model__charts charts-grid" >
156+ < div className = "per-model__chartGroup" >
157+ < MultiSeriesStackedBarChart
158+ title = { `Daily average AIC per Request (${ selectedModel } )` }
159+ labels = { dailyAverageAicPerRequest . map ( ( day ) => day . date ) }
160+ series = { [
161+ {
162+ label : 'Average daily AICs per request' ,
163+ color : '#14b8a6' ,
164+ data : dailyAverageAicPerRequest . map ( ( day ) => day . averageAicPerRequest ) ,
165+ } ,
166+ ] }
167+ height = { 320 }
168+ />
169+ < p className = "per-model__chartNote" >
170+ Average AICs per request for < strong > { selectedModel } </ strong > in the current report period:{ ' ' }
171+ < strong > { formatAverageAicPerRequest ( overallAverageAicPerRequest ) } </ strong > , average gross per request{ ' ' }
172+ < strong > { formatUsd ( overallAverageAicGrossPerRequest ) } </ strong >
173+ </ p >
174+ </ div >
135175 < DualAxisLineChart
136176 title = { `Daily Requests & AI Credits (${ selectedModel } )` }
137177 labels = { filledPerModelDailyData . map ( ( day ) => day . date ) }
0 commit comments