Skip to main content
Glama
token-usage-bar-chart.tsx4.58 kB
import * as React from 'react' import { ChartContainer, ChartTooltip, ChartTooltipContent } from '@/components/ui/chart' import { Bar, BarChart, XAxis, YAxis } from 'recharts' import { useLanguage } from '@/contexts/language-context' import { Card, CardContent, CardHeader } from '@/components/ui/card' import { StatDetail } from '@/api' import { formatUsageValue } from '@/utils/usageValueFormatter' export function TokenUsageBarChart({ data, Title }: { data: StatDetail; Title: React.ReactNode }) { const { t } = useLanguage() const chartConfig = { prompt_tokens: { label: t('tokenUsage.char.inputTokens'), color: 'var(--chart-1)', }, completion_tokens: { label: t('tokenUsage.char.outputTokens'), color: 'var(--chart-2)', }, } const totalTokens = [ { name: 'prompt_tokens', value: data.prompt_tokens, }, { name: 'completion_tokens', value: data.completion_tokens, }, { name: 'total_tokens', value: data.total_tokens, }, ] return ( <Card className='pt-0'> <CardHeader className='flex flex-row items-stretch justify-between border-b !p-0'> {Title} <div className='flex items-center'> {totalTokens.map((token) => { return ( <div key={token.name} className='relative z-30 flex flex-1 flex-col justify-center gap-1 border-t px-6 py-4 text-left min-w-[148px] even:border-l sm:border-t-0 sm:border-l sm:px-8 sm:py-6'> <span className='text-muted-foreground text-xs'> {token.name === 'prompt_tokens' ? t('tokenUsage.char.inputTokens') : token.name === 'completion_tokens' ? t('tokenUsage.char.outputTokens') : t('tokenUsage.record.totalTokens')} </span> <span className='text-lg font-mono leading-none font-bold sm:text-3xl'> {formatUsageValue(token.value)} </span> </div> ) })} </div> </CardHeader> <CardContent> <div className='w-full h-[320px]'> {data.details.length === 0 ? ( <div className='h-full flex justify-center items-center'> <div className='text-muted-foreground'>No data</div> </div> ) : ( <ChartContainer config={chartConfig} className='h-[320px] w-full'> <BarChart data={data.details}> <XAxis dataKey='period' tickLine={false} axisLine={false} /> <YAxis tickLine={false} axisLine={false} /> <ChartTooltip content={ <ChartTooltipContent className='min-w-[200px]' formatter={(value, name, item, index) => ( <> <div className='h-2.5 w-2.5 shrink-0 rounded-[2px] bg-[--color-bg]' style={ { '--color-bg': `var(--color-${name})`, } as React.CSSProperties } /> {chartConfig[name as keyof typeof chartConfig]?.label || name} <div className='ml-auto flex items-baseline gap-0.5 font-mono font-medium tabular-nums text-foreground'> {value} </div> {/* Add this after the last item */} {index === 1 && ( <div className='mt-1.5 flex basis-full items-center border-t pt-1.5 text-xs font-medium text-foreground'> {t('tokenUsage.record.totalTokens')} <div className='ml-auto flex items-baseline gap-0.5 font-mono font-medium tabular-nums text-foreground'> {item.payload.total_tokens} </div> </div> )} </> )} /> } /> <Bar dataKey='prompt_tokens' stackId='a' fill='var(--chart-1)' /> <Bar dataKey='completion_tokens' stackId='a' fill='var(--chart-2)' /> </BarChart> </ChartContainer> )} </div> </CardContent> </Card> ) }

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/itcook/graphiti-mcp-pro'

If you have feedback or need assistance with the MCP directory API, please join our Discord server