style: show only cache hit rate below dashboard token total

This commit is contained in:
Sycun committed 2026-10-12 00:00:26 +08:00
1 parent 5d14daf486
commit 4badef67c1
7 files changed
+6 -9

No files matched your search

+1 -1
View File
@@ -29,7 +29,7 @@ DeepSeek 的未命中输入不等于 Claude 的缓存写入。不能根据文本
## 功能入口与数据流
点击首页「Token 用量」卡片进入「系统设置 → Token 用量」,也可直接从设置二级菜单打开。首页卡片显示近 7 天总用量,副标仅用一行显示今日用量与缓存命中率(缓存读取 Token / 输入 Token),调用次数保留在详情页。支持当前项目范围、7/30/90 天切换、八项指标、最多 20 项运行模型排行、每日趋势与完整日明细、最多 20 项最近运行。详情页独立加载,支持手动刷新与请求取消,切换周期不会刷新整个仪表盘;刷新页面可保持该设置分区。
点击首页「Token 用量」卡片进入「系统设置 → Token 用量」,也可直接从设置二级菜单打开。首页卡片显示近 7 天总用量,副标仅显示缓存命中率(缓存读取 Token / 输入 Token),调用次数和每日用量保留在详情页。支持当前项目范围、7/30/90 天切换、八项指标、最多 20 项运行模型排行、每日趋势与完整日明细、最多 20 项最近运行。详情页独立加载,支持手动刷新与请求取消,切换周期不会刷新整个仪表盘;刷新页面可保持该设置分区。
运行事件 → 流式/非流式用量累加 → `eino_usage_summary` → `process_details` 与 `model_token_usage` → 现有 `/api/usage/tokens`、对话用量接口 → 首页与聊天摘要。
+1 -1
View File
@@ -288,7 +288,7 @@
"successRate": "Tool success rate",
"tokenUsage": "Token usage",
"usageCacheHitRate": "Cache hit {{rate}}",
"tokenUsageSub": "Today {{today}} · Cache hit {{rate}}",
"tokenUsageSub": "Cache hit {{rate}}",
"noTokenUsageYet": "No usage yet",
"clickToViewTasks": "Click to view tasks",
"clickToViewChat": "Click to view conversations",
+1 -1
View File
@@ -288,7 +288,7 @@
"successRate": "Успешность инструментов",
"tokenUsage": "Расход токенов",
"usageCacheHitRate": "Попадания в кэш {{rate}}",
"tokenUsageSub": "Сегодня {{today}} · Кэш {{rate}}",
"tokenUsageSub": "Кэш {{rate}}",
"noTokenUsageYet": "Расхода пока нет",
"clickToViewTasks": "Открыть задачи",
"clickToViewChat": "Открыть диалоги",
+1 -1
View File
@@ -288,7 +288,7 @@
"successRate": "工具执行成功率",
"tokenUsage": "Token 用量",
"usageCacheHitRate": "缓存命中 {{rate}}",
"tokenUsageSub": "今日 {{today}} · 缓存命中 {{rate}}",
"tokenUsageSub": "缓存命中 {{rate}}",
"noTokenUsageYet": "暂无用量",
"clickToViewTasks": "点击查看任务管理",
"clickToViewChat": "点击查看对话",
+1 -3
View File
@@ -717,7 +717,6 @@ function renderDashboardTokenUsage(res) {
}
const cacheRate = tokenUsageCacheRate(summary);
const total = Number(summary.totalTokens || 0);
const today = res && res.today ? Number(res.today.totalTokens || 0) : 0;
if (!Number.isFinite(total) || total <= 0) {
setEl('dashboard-kpi-token-usage', '0');
setKpiSubText('dashboard-kpi-token-sub-text', dt('dashboard.noTokenUsageYet', null, '暂无用量'));
@@ -726,9 +725,8 @@ function renderDashboardTokenUsage(res) {
setEl('dashboard-kpi-token-usage', formatTokenUsageCompact(total));
setKpiSubText('dashboard-kpi-token-sub-text',
dt('dashboard.tokenUsageSub', {
today: formatTokenUsageCompact(today),
rate: cacheRate
}, '今日 ' + formatTokenUsageCompact(today) + ' · 缓存命中 ' + cacheRate));
}, '缓存命中 ' + cacheRate));
}
function formatTokenUsageCompact(num) {
@@ -75,7 +75,6 @@ test('all supported languages expose usage labels and interpolation placeholders
for (const key of ['usageView', 'usageScope', 'usageCacheRead', 'usageCacheWrite', 'usageTrend', 'usageCacheHitRate']) assert.ok(data.dashboard[key]);
assert.ok(data.settings.nav.tokenUsage);
assert.match(data.dashboard.usageCacheHitRate, /\{\{rate\}\}/);
assert.match(data.dashboard.tokenUsageSub, /\{\{today\}\}/);
assert.match(data.dashboard.tokenUsageSub, /\{\{rate\}\}/);
assert.match(data.chat.turnTokenUsageTitle, /\{\{cacheWrite\}\}/);
}
+1 -1
View File
@@ -7016,7 +7016,7 @@
<script src="/static/js/info-collect.js?v=20260717-1"></script>
<script src="/static/js/assets.js?v=20260717-7"></script>
<script src="/static/js/agents.js"></script>
<script src="/static/js/dashboard.js?v=20261011-token-settings-compact"></script>
<script src="/static/js/dashboard.js?v=20261011-token-settings-cache-only"></script>
<script src="/static/js/chat-scroll.js?v=20260815-1"></script>
<script src="/static/js/monitor.js?v=20261011-token-usage"></script>
<script src="/static/js/chat.js?v=20261011-token-usage"></script>