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: