OpenClaw Token 监控中心
实时追踪 · 历史回溯 · 费用统计
实时监控中
🕒
—
轮询
3秒
会话
—
采样
0
DB
—
轮询
0.5秒(高频)
1秒(快速)
1.5秒
2秒
3秒(标准)
5秒(省资源)
10秒(低功耗)
30秒
(选择后点确认生效)
✓ 确认
📷 导出图表
🌐 EN
⬇ CSV
日期
←
加载中...
→
今日
实时
输入 Tokens
—
累计
输出 Tokens
—
累计
总消耗 Tokens
—
输入+输出
预估费用
—
人民币
模型
未检测
费用计数
上下文已用
—
上下文窗口
活跃会话数
—
当前统计
⚡ 本月预估账单
—
已用
0
天
预计
—
tokens
费用
—
▲
输入速率
0
tok/s
▲
输出速率
0
tok/s
△
总速率
0
tok/s
¥
费用增速
0
¥/min
📊 Token 消耗趋势
0 采样点
📊 各会话分布
📋 会话详情
0 个会话
⬇
导出 CSV
会话
模型
类型
输入
输出
合计
分布
上下文
更新时间
活跃
📋 会话详情
✕
Token 消耗
输入
-
输出
-
合计
-
费用
-
上下文窗口
-
活跃时长
-
💰 MiniMax 费用 = 输入×¥2.1/万 + 输出×¥8.4/万
会话信息
模型
-
类型
-
更新时间
-
会话 ID
-
// ── i18n (bilingual) ──────────────────────────────────────────────────── var I18N = { zh: { title: 'OpenClaw Token \u76d1\u63a7\u4e2d\u5fc3', tag: '\u5b9e\u65f6\u8ffd\u8e2a · \u5386\u53f2\u56de\u6eaf · \u8d39\u7528\u7edf\u8ba1', liveLabel: '\u5b9e\u65f6\u76d1\u63a7\u4e2d', histLabel: '\u5386\u53f2\u89c6\u56fe', pollLabel: '\u8f6e\u8be2', pollHint: '\uff08\u9009\u62e9\u540e\u70b9\u786e\u8ba4\u751f\u6548\uff09', confirmBtn: '\u2714 \u786e\u8ba4', exportImg: '\U0001f4f7 \u5bfc\u51fa\u56fe\u8868', exportCsv: '\u2b07\ufe0f CSV', dateLabel: '\u65e5\u671f', prevBtn: '\u2190', nextBtn: '\u2192', todayBtn: '\u4eca\u65e5', liveBtn: '\u5b9e\u65f6', loading: '\u52a0\u8f7d\u4e2d...', kIn: '\u8f93\u5165 Tokens', kOut: '\u8f93\u51fa Tokens', kTotal: '\u603b\u6d88\u8017 Tokens', kCny: '\u9884\u4f30\u8d39\u7528', kCtx: '\u4e0a\u4e0b\u6587\u5df2\u7528', kSess: '\u6d3b\u8dc3\u4f1a\u8bdd\u6570', subIn: '\u7d2f\u8ba1', subOut: '\u7d2f\u8ba1', subTotal: '\u8f93\u5165+\u8f93\u51fa', subCny: '\u4eba\u6c11\u5e01', subCtx: '\u4e0a\u4e0b\u6587\u7a97\u53e3', subSess: '\u5f53\u524d\u7edf\u8ba1', projLabel: '\u26a1 \u672c\u6708\u9884\u4f30\u8d26\u5355', projUsed: '\u5df2\u7528', projDays: '\u5929', projTotal: 'tokens', projCost: '\u8d39\u7528', rIn: '\u8f93\u5165\u901f\u7387', rOut: '\u8f93\u51fa\u901f\u7387', rTotal: '\u603b\u901f\u7387', rCny: '\u8d39\u7528\u589e\u901f', tokPerS: 'tok/s', cnyPerMin: '\u00a5/min', chartTitle: 'Token \u6d88\u8017\u8d8b\u52bf', sessTitle: '\u5404\u4f1a\u8bdd\u5206\u5e03', cPts: '\u91c7\u6837\u70b9', mPts: '\u91c7\u6837', tableTitle: '\u4f1a\u8bdd\u8be6\u60c5', noSess: '\u6682\u65e0\u6570\u636e', mdl: '\u6a21\u578b', kind: '\u7c7b\u578b', input: '\u8f93\u5165', output: '\u8f93\u51fa', total: '\u603b\u8ba1', bar: '\u5360\u6bd4', ctx: '\u4e0a\u4e0b\u6587', upd: '\u66f4\u65b0', age: '\u6d3b\u8dc3\u65f6\u957f', modalTitle: '\u4f1a\u8bdd\u8be6\u60c5', closeBtn: '\u00d7 \u5173\u95ed', inpRate: '\u8f93\u5165\u901f\u7387', outRate: '\u8f93\u51fa\u901f\u7387', errTitle: '\u9519\u8bef', errClose: '\u00d7', histMode: '\u7d2f\u8ba1\u603b\u6d88\u8017', liveMode: '\u6bcf\u6b21\u8f6e\u8be2\u589e\u91cf', modelDetected: '\u68c0\u6d4b\u5230\u6a21\u578b', noModel: '\u672a\u77e5\u6a21\u578b', costBreakdown: '\u8d39\u7528\u660e\u7ec6', }, en: { title: 'OpenClaw Token Monitor', tag: 'Real-time · History · Cost Analytics', liveLabel: 'Live', histLabel: 'History', pollLabel: 'Poll', pollHint: '(confirm to apply)', confirmBtn: '\u2714 Confirm', exportImg: '\U0001f4f7 Export Chart', exportCsv: '\u2b07\ufe0f CSV', dateLabel: 'Date', prevBtn: '\u2190', nextBtn: '\u2192', todayBtn: 'Today', liveBtn: 'Live', loading: 'Loading...', kIn: 'Input Tokens', kOut: 'Output Tokens', kTotal: 'Total Tokens', kCny: 'Est. Cost', kCtx: 'Context Used', kSess: 'Active Sessions', subIn: 'cumulative', subOut: 'cumulative', subTotal: 'in+out', subCny: 'CNY', subCtx: 'context window', subSess: 'current', projLabel: '\u26a1 Monthly Est.', projUsed: 'Used', projDays: 'days', projTotal: 'tokens', projCost: 'cost', rIn: 'Input Rate', rOut: 'Output Rate', rTotal: 'Total Rate', rCny: 'Cost Rate', tokPerS: 'tok/s', cnyPerMin: '\u00a5/min', chartTitle: 'Token Consumption', sessTitle: 'Session Distribution', cPts: 'samples', mPts: 'pts', tableTitle: 'Session Details', noSess: 'No data', mdl: 'Model', kind: 'Type', input: 'Input', output: 'Output', total: 'Total', bar: 'Share', ctx: 'Context', upd: 'Updated', age: 'Age', modalTitle: 'Session Detail', closeBtn: '\u00d7 Close', inpRate: 'In Rate', outRate: 'Out Rate', errTitle: 'Error', errClose: '\u00d7', histMode: 'Cumulative Total', liveMode: 'Per-Poll Delta', modelDetected: 'Model', noModel: 'Unknown Model', costBreakdown: 'Cost Breakdown', } }; var LANG = 'zh'; function T(k){ return (I18N[LANG]||I18N.zh)[k] || k; } function toggleLang(){ LANG = LANG === 'zh' ? 'en' : 'zh'; var flag = LANG === 'zh' ? String.fromCodePoint(0x1F1FE,0x1F1F3)+ EN' : String.fromCodePoint(0x1F1E8,0x1F1E6)+ 中文'; document.getElementById('btn-lang').innerHTML = flag; applyI18n(); if (isLive) { liveHistory = []; loadDate(currentDate); } else { var sel = document.getElementById('date-select'); if(sel) loadDate(sel.value); } } function applyI18n(){ var ll = document.getElementById('live-label'); if(ll) ll.textContent = isLive ? T('liveLabel') : T('histLabel'); var kpis = { 'lbl-kin': T('kIn'), 'lbl-subin': T('subIn'), 'lbl-kout': T('kOut'), 'lbl-subout': T('subOut'), 'lbl-ktotal': T('kTotal'), 'lbl-subtotal': T('subTotal'), 'lbl-kcny': T('kCny'), 'lbl-subcny': T('subCny'), 'lbl-kctx': T('kCtx'), 'lbl-subctx': T('subCtx'), 'lbl-ksess': T('kSess'), 'lbl-subsess': T('subSess'), }; for (var id in kpis) { var el = document.getElementById(id); if(el) el.textContent = kpis[id]; } var rates = {'lbl-rin': T('rIn'), 'lbl-rout': T('rOut'), 'lbl-rtotal': T('rTotal'), 'lbl-rcny': T('rCny')}; for (var id in rates) { var el = document.getElementById(id); if(el) el.textContent = rates[id]; } var ct = document.getElementById('lbl-chart1'); if(ct) ct.innerHTML = '📊 '+T('chartTitle'); var cs = document.getElementById('lbl-chart2'); if(cs) cs.innerHTML = '📊 '+T('sessTitle'); var tt = document.getElementById('lbl-tabletitle'); if(tt) tt.innerHTML = '📋 '+T('tableTitle'); var fp = document.getElementById('lbl-pricing'); if(fp) { var p = getModelPricing(); fp.textContent = detectedModel+' \u00a5'+p.inp+'/M in \u00b7 \u00a5'+p.out+'/M out'; } var ths = { 'lbl-th-sess': T('total'), 'lbl-th-model': T('mdl'), 'lbl-th-kind': T('kind'), 'lbl-th-in': T('input'), 'lbl-th-out': T('output'), 'lbl-th-total': T('total'), 'lbl-th-bar': T('bar'), 'lbl-th-ctx': T('ctx'), 'lbl-th-upd': T('upd'), 'lbl-th-age': T('age'), }; for (var id in ths) { var el = document.getElementById(id); if(el) el.textContent = ths[id]; } }