feat: v0.5.2 - daily trend refactor + provider/model two-level drill-down

- Dashboard: 用量趋势卡片改为外层 tab 容器(下划线 tab),移除卡片标题与内部 pill 切换器
- 用量趋势: 新增 供应商模型用量趋势 tab,与 模型用量趋势 并列
- 供应商 tab 弹窗: 每日用量详情改为两级(供应商 → 模型)分组
- 后端: DailyRow 新增 by_provider_model 嵌套聚合
- 前端: DailyBars 通用化(dimension/colorMap),DailyDetailModal 按 tab 维度渲染
- i18n: 新增 providerDistribution(中/英)
- 版本: 0.5.1 → 0.5.2(tauri.conf / Cargo.toml / package.json / README)
This commit is contained in:
KimiSwitch Dev committed 2026-07-29 13:41:04 +08:00
1 parent 3dd1fd93fe
commit a1fdc6c93d
16 files changed
+1190 -506

No files matched your search

+64
View File
@@ -209,6 +209,7 @@ export const enTranslations: Record<TranslationKey, string> = {
totalTokens: "Total tokens",
cost: "Cost",
modelDistribution: "Model distribution",
providerDistribution: "Provider distribution",
modalEscHint: "Press Esc or click outside to close",
doubleClickHint: "Double-click for details",
@@ -252,4 +253,67 @@ export const enTranslations: Record<TranslationKey, string> = {
unknownModelProvider: "Model '{0}' references unknown provider '{1}'",
emptyModelId: "Model '{0}' has an empty model ID",
invalidMaxContextSize: "Model '{0}' has an invalid max_context_size",
// Dashboard — ranges / status
rangeToday: "Today",
range7d: "7d",
range30d: "30d",
rangeAll: "All",
dashLoadFailed: "Failed to load",
// Dashboard — KPI labels
kpiRequests: "Requests",
kpiInputOther: "Non-cached input",
kpiOutput: "Output",
kpiCacheRead: "Cache read",
kpiCacheCreation: "Cache creation",
kpiCacheHit: "Cache hit",
kpiCost: "Est. cost",
// Dashboard — cards
cardHeatmap: "Full-year heatmap",
cardHeatmapSub: "Coloured by token volume",
cardDailyTrend: "Usage trend",
cardDailyTrendSubCapped: "Last 30 days · {n} days total",
tabModelTrend: "Model usage trend",
tabProviderTrend: "Provider–model usage trend",
providerUnknown: "Unknown provider",
cardDailyTrendSub: "{n} days",
cardModelUsage: "Model usage",
cardModelUsageSub: "{n} models",
cardRecent: "Recent requests",
cardRecentCapped: "Showing first {n} / {m}",
cardRecentCount: "{n} entries",
// Dashboard — table columns / units
colModel: "Model",
colTokens: "Tokens",
colCacheHit: "Cache hit",
colTime: "Time",
colInput: "Input",
colOutput: "Output",
colCacheRead: "Cache read",
unitTimes: "requests",
estimate: "est.",
collapse: "Collapse",
expandAll: "Expand all ({n})",
// Dashboard — pagination
paginationPage: "Page {x} / {y}",
paginationRange: "{x}–{y}",
paginationPerPage: "{n} per page",
pageFirst: "First",
pagePrev: "Previous",
pageNext: "Next",
pageLast: "Last",
// Dashboard — footer / attribution
footerScanned: "Scanned {n} files · {m} records",
dashboardAttribution: "Dashboard ported from",
sessionsAttribution: "Session manager ported from",
attributionSuffix: "(MIT, © JochenYang)",
// Sessions — preview
previewCollapseChars: "Collapse · {n} chars",
previewExpandChars: "Expand · {n} chars",
};
+64
View File
@@ -204,6 +204,7 @@ export const zhTranslations = {
totalTokens: "总 Token",
cost: "费用",
modelDistribution: "模型用量分布",
providerDistribution: "供应商用量分布",
modalEscHint: "按 Esc 或点击外部关闭",
doubleClickHint: "双击查看详情",
@@ -247,6 +248,69 @@ export const zhTranslations = {
unknownModelProvider: "模型「{0}」引用了未知供应商「{1}」",
emptyModelId: "模型「{0}」的模型 ID 为空",
invalidMaxContextSize: "模型「{0}」的 max_context_size 无效",
// Dashboard — ranges / status
rangeToday: "今天",
range7d: "7 天",
range30d: "30 天",
rangeAll: "全部",
dashLoadFailed: "加载失败",
// Dashboard — KPI labels
kpiRequests: "请求数",
kpiInputOther: "非缓存输入",
kpiOutput: "输出",
kpiCacheRead: "缓存读",
kpiCacheCreation: "缓存创建",
kpiCacheHit: "缓存命中",
kpiCost: "预估费用",
// Dashboard — cards
cardHeatmap: "全年热力图",
cardHeatmapSub: "按 Token 量着色",
cardDailyTrend: "用量趋势",
cardDailyTrendSubCapped: "近 30 天 · 共 {n} 天",
tabModelTrend: "模型用量趋势",
tabProviderTrend: "供应商模型用量趋势",
providerUnknown: "未知供应商",
cardDailyTrendSub: "共 {n} 天",
cardModelUsage: "模型用量",
cardModelUsageSub: "{n} 个模型",
cardRecent: "最近请求",
cardRecentCapped: "显示前 {n} / {m} 条",
cardRecentCount: "{n} 条",
// Dashboard — table columns / units
colModel: "模型",
colTokens: "Token",
colCacheHit: "缓存命中",
colTime: "时间",
colInput: "输入",
colOutput: "输出",
colCacheRead: "缓存读",
unitTimes: "次",
estimate: "估算",
collapse: "收起",
expandAll: "展开全部 ({n})",
// Dashboard — pagination
paginationPage: "第 {x} / {y} 页",
paginationRange: "{x}–{y} 条",
paginationPerPage: "每页 {n} 条",
pageFirst: "首页",
pagePrev: "上一页",
pageNext: "下一页",
pageLast: "末页",
// Dashboard — footer / attribution
footerScanned: "扫描 {n} 个文件 · {m} 条记录",
dashboardAttribution: "仪表盘功能基于",
sessionsAttribution: "会话管理功能基于",
attributionSuffix: "(MIT,© JochenYang)移植",
// Sessions — preview
previewCollapseChars: "收起 · {n} 字符",
previewExpandChars: "展开全文 · {n} 字符",
} as const;
export type TranslationKey = keyof typeof zhTranslations;