diff --git a/web/src/features/monitor/UsageTab.vue b/web/src/features/monitor/UsageTab.vue index 1add2508..2bb39727 100644 --- a/web/src/features/monitor/UsageTab.vue +++ b/web/src/features/monitor/UsageTab.vue @@ -24,7 +24,8 @@ import EmptyState from '@/components/ui/EmptyState.vue' import InlineFeedback from '@/components/ui/InlineFeedback.vue' import QueryFeedback from '@/components/ui/QueryFeedback.vue' import StatusBadge from '@/components/ui/StatusBadge.vue' -import { formatEstimatedCost, formatInteger, formatTokens } from '@/lib/format' +import { formatCacheHitRate } from '@/lib/cache-rate' +import { formatEstimatedCost, formatInteger, formatPercent, formatTokens } from '@/lib/format' import MonitorSectionHeading from './MonitorSectionHeading.vue' import { @@ -84,6 +85,20 @@ function formatCost(aggregate: UsageAggregateDto): string { return formatEstimatedCost(aggregate.estimated_cost_nano_usd, locale.value) } +function inputTokens(aggregate: UsageAggregateDto): number { + return ( + aggregate.uncached_input_tokens + + aggregate.cache_read_tokens + + aggregate.cache_write_5m_tokens + + aggregate.cache_write_1h_tokens + + aggregate.cache_write_unknown_tokens + ) +} + +function cacheRateLabel(aggregate: UsageAggregateDto): string { + return formatCacheHitRate(aggregate.cache_read_tokens, inputTokens(aggregate), locale.value) +} + function groupName(groupID: number): string { if (groupID === 0) return t('monitor.usage.breakdown.unattributedGroup') return ( @@ -369,17 +384,15 @@ defineExpose({ openFilters }) {{ t('monitor.usage.columns.quality') }} {{ - t('monitor.usage.columns.qualityUsage', { - missing: formatInteger(row.usage_missing_count, locale), - partial: formatInteger(row.partial_count, locale), + t('monitor.usage.columns.qualitySuccess', { + rate: formatPercent(row.success_count, row.request_count, locale), }) }} {{ - t('monitor.usage.columns.qualityPricing', { - unpriced: formatInteger(row.unpriced_request_count, locale), - partial: formatInteger(row.pricing_partial_count, locale), + t('monitor.usage.columns.qualityCache', { + rate: cacheRateLabel(row), }) }} diff --git a/web/src/i18n/locales/en-US/monitor.ts b/web/src/i18n/locales/en-US/monitor.ts index b1cb03b1..dacf2415 100644 --- a/web/src/i18n/locales/en-US/monitor.ts +++ b/web/src/i18n/locales/en-US/monitor.ts @@ -335,6 +335,8 @@ export default { estimatedCost: 'Estimated cost', quality: 'Quality', actions: 'Actions', + qualitySuccess: 'Success rate {rate}', + qualityCache: 'Cache hit rate {rate}', qualityUsage: 'Missing {missing} · Partial {partial}', qualityPricing: 'Unpriced {unpriced} · Partial {partial}', qualityCompact: diff --git a/web/src/i18n/locales/ja-JP/monitor.ts b/web/src/i18n/locales/ja-JP/monitor.ts index 751070f0..8996ced1 100644 --- a/web/src/i18n/locales/ja-JP/monitor.ts +++ b/web/src/i18n/locales/ja-JP/monitor.ts @@ -336,6 +336,8 @@ export default { estimatedCost: '推定コスト', quality: '品質', actions: '操作', + qualitySuccess: '成功率 {rate}', + qualityCache: 'キャッシュ率 {rate}', qualityUsage: 'なし {missing} · 部分 {partial}', qualityPricing: '未設定 {unpriced} · 一部 {partial}', qualityCompact: diff --git a/web/src/i18n/locales/zh-CN/monitor.ts b/web/src/i18n/locales/zh-CN/monitor.ts index ff8b9326..418d9944 100644 --- a/web/src/i18n/locales/zh-CN/monitor.ts +++ b/web/src/i18n/locales/zh-CN/monitor.ts @@ -323,6 +323,8 @@ export default { estimatedCost: '预估成本', quality: '质量', actions: '操作', + qualitySuccess: '成功率 {rate}', + qualityCache: '缓存率 {rate}', qualityUsage: '缺失 {missing} · 部分 {partial}', qualityPricing: '未定价 {unpriced} · 部分定价 {partial}', qualityCompact: