@@ -50,6 +50,10 @@ export function UsageSection() {
5050 return u . inputTokens + ( u . cacheReadTokens ?? 0 ) + ( u . cacheWrite5mTokens ?? 0 ) + ( u . cacheWrite1hTokens ?? 0 )
5151 }
5252
53+ const calculateTotalOutputTokens = ( u : Awaited < ReturnType < typeof getUsageInfo > > [ 0 ] ) => {
54+ return u . outputTokens + ( u . reasoningTokens ?? 0 )
55+ }
56+
5357 const goPrev = async ( ) => {
5458 const usage = await getUsageInfo ( params . id ! , store . page - 1 )
5559 setStore ( {
@@ -95,8 +99,11 @@ export function UsageSection() {
9599 { ( usage , index ) => {
96100 const date = createMemo ( ( ) => new Date ( usage . timeCreated ) )
97101 const totalInputTokens = createMemo ( ( ) => calculateTotalInputTokens ( usage ) )
98- const breakdownId = `breakdown-${ index ( ) } `
99- const isOpen = createMemo ( ( ) => openBreakdownId ( ) === breakdownId )
102+ const totalOutputTokens = createMemo ( ( ) => calculateTotalOutputTokens ( usage ) )
103+ const inputBreakdownId = `input-breakdown-${ index ( ) } `
104+ const outputBreakdownId = `output-breakdown-${ index ( ) } `
105+ const isInputOpen = createMemo ( ( ) => openBreakdownId ( ) === inputBreakdownId )
106+ const isOutputOpen = createMemo ( ( ) => openBreakdownId ( ) === outputBreakdownId )
100107 const isClaude = usage . model . toLowerCase ( ) . includes ( "claude" )
101108 return (
102109 < tr >
@@ -110,13 +117,13 @@ export function UsageSection() {
110117 data-slot = "breakdown-button"
111118 onClick = { ( e ) => {
112119 e . stopPropagation ( )
113- setOpenBreakdownId ( isOpen ( ) ? null : breakdownId )
120+ setOpenBreakdownId ( isInputOpen ( ) ? null : inputBreakdownId )
114121 } }
115122 >
116123 < IconBreakdown />
117124 </ button >
118125 < span onClick = { ( ) => setOpenBreakdownId ( null ) } > { totalInputTokens ( ) } </ span >
119- < Show when = { isOpen ( ) } >
126+ < Show when = { isInputOpen ( ) } >
120127 < div data-slot = "breakdown-popup" onClick = { ( e ) => e . stopPropagation ( ) } >
121128 < div data-slot = "breakdown-row" >
122129 < span data-slot = "breakdown-label" > Input</ span >
@@ -136,7 +143,32 @@ export function UsageSection() {
136143 </ Show >
137144 </ div >
138145 </ td >
139- < td data-slot = "usage-tokens" > { usage . outputTokens } </ td >
146+ < td data-slot = "usage-tokens" >
147+ < div data-slot = "tokens-with-breakdown" onClick = { ( e ) => e . stopPropagation ( ) } >
148+ < button
149+ data-slot = "breakdown-button"
150+ onClick = { ( e ) => {
151+ e . stopPropagation ( )
152+ setOpenBreakdownId ( isOutputOpen ( ) ? null : outputBreakdownId )
153+ } }
154+ >
155+ < IconBreakdown />
156+ </ button >
157+ < span onClick = { ( ) => setOpenBreakdownId ( null ) } > { totalOutputTokens ( ) } </ span >
158+ < Show when = { isOutputOpen ( ) } >
159+ < div data-slot = "breakdown-popup" onClick = { ( e ) => e . stopPropagation ( ) } >
160+ < div data-slot = "breakdown-row" >
161+ < span data-slot = "breakdown-label" > Output</ span >
162+ < span data-slot = "breakdown-value" > { usage . outputTokens } </ span >
163+ </ div >
164+ < div data-slot = "breakdown-row" >
165+ < span data-slot = "breakdown-label" > Reasoning</ span >
166+ < span data-slot = "breakdown-value" > { usage . reasoningTokens ?? 0 } </ span >
167+ </ div >
168+ </ div >
169+ </ Show >
170+ </ div >
171+ </ td >
140172 < td data-slot = "usage-cost" > ${ ( ( usage . cost ?? 0 ) / 100000000 ) . toFixed ( 4 ) } </ td >
141173 </ tr >
142174 )
0 commit comments