8000 feat(web): merge the overview tabs and filter it by time range by InfinityPacer · Pull Request #9 · InfinityPacer/meterleaf · GitHub
[go: up one dir, main page]

Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
7 changes: 7 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,13 @@

## [未发布]

- 「累计总览」和「时间段用量」合并为一个用量总览。默认显示历史至今,也可切换今天、近 7 天、近 30 天或自定义日期。摘要、趋势和模型分布跟随所选范围,账户额度始终按当前周期显示。旧的 `#period` 链接会打开总览。
- 摘要固定四格,缓存命中率单独一格,并用条形图拆开缓存读取、普通输入和缓存写入,输出单独列出。历史至今显示日均,其它范围的 Tokens、费用和请求都显示环比。
- 趋势图下方显示峰值时段、有用量的时段数和单次请求平均值。点击总览里的模型会带着同一范围打开统计报表。
- 统计报表顶部增加同样的范围摘要,分组汇总增加缓存命中率列和合计行,宽屏模型分布去掉与表格重复的图例列。
- 日期范围增加「历史至今」快捷项,统计报表和请求明细也可使用。只选一天时直接显示日期。
- 缩写数字统一保留两位小数(如 3.00B、2.95B),同屏数值更容易比较。

## [0.4.0] - 2026-09-25

- 本机采集器采集 Claude 的 Fable 独立周额度。首页、账户列表与账户详情单独显示 Fable 一行,本期费用和预估只计 Fable 请求;上游没有上报 Fable 额度的账户不显示这一行。升级时先升级 Meterleaf 服务端,再升级采集器,否则新采集器推送的数据会被旧服务端拒收,直到服务端升级后才补推。
Expand Down
6 changes: 3 additions & 3 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -6,9 +6,9 @@ Meterleaf 只读采集一个 Sub2API PostgreSQL 实例,也可以接收本机

## 能做什么

- **用量总览**:历史累计、账户额度与所选时段用量,配合消耗趋势和模型分布。
- **用量总览**:默认看历史至今的 Tokens、费用、请求和缓存命中率,可切到今天、近 7 天等范围;账户额度始终按当前周期显示,下方是同一范围的消耗趋势和模型分布。
- **账户额度**:5 小时与 7 天窗口、重置时间及七天额度预估,支持排序和归档。
- **统计报表**:按小时、天、周、模型或账户汇总,比较 Tokens、请求数和费用。
- **统计报表**:顶部是所选范围的摘要与环比,按小时、天、周、模型或账户汇总 Tokens、缓存命中率、请求数和费用,附合计行。
- **请求明细**:查看模型、来源、推理强度、Token 拆分与计价依据。
- **独立估值**:同时保留订阅 Credits 与 USD,美元可切换订阅等价和标准 API 口径。

Expand All @@ -18,7 +18,7 @@ Meterleaf 只读采集一个 Sub2API PostgreSQL 实例,也可以接收本机

### Web

![Web 用量总览:历史累计、账户额度与消耗趋势](docs/images/web-overview.png)
![Web 用量总览:历史至今摘要、缓存命中率与账户额度](docs/images/web-overview.png)

<details>
<summary>账户额度</summary>
Expand Down
Binary file modified docs/images/mobile-overview.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file modified docs/images/mobile-reports.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file modified docs/images/web-overview.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file modified docs/images/web-reports.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
22 changes: 14 additions & 8 deletions docs/reporting.md
Original file line number Diff line number Diff line change
Expand Up @@ -4,20 +4,26 @@

## 四个页面

| 页面 | 内容 | 时间范围 |
| -------- | ------------------------------------------------------------ | ---------------------------------------------------- |
| 用量总览 | 历史累计、账户额度、时段摘要、趋势与模型分布 | 累计不受筛选影响;订阅额度按当前窗口;其余按所选时段 |
| 账户额度 | 周期百分比、重置时间、Tokens、请求数、估算费用与七天预估 | 有额度快照的账户按当前窗口;无快照账户显示历史累计 |
| 统计报表 | 模型分布与小时、天、周、模型、账户分组汇总 | 按本页日期和筛选条件 |
| 请求明细 | 来源、模型、推理强度、账户、Token 数和费用;点击查看完整证据 | 按本页条件筛选并在服务端分页 |
| 页面 | 内容 | 时间范围 |
| -------- | ------------------------------------------------------------ | -------------------------------------------------- |
| 用量总览 | 所选范围的摘要、账户额度、消耗趋势与模型分布 | 默认历史至今,可切换,账户额度始终按当前周期 |
| 账户额度 | 周期百分比、重置时间、Tokens、请求数、估算费用与七天预估 | 有额度快照的账户按当前窗口;无快照账户显示历史累计 |
| 统计报表 | 范围摘要、模型分布与小时、天、周、模型、账户分组汇总 | 按本页日期和筛选条件 |
| 请求明细 | 来源、模型、推理强度、账户、Token 数和费用;点击查看完整证据 | 按本页条件筛选并在服务端分页 |

Web 总览与手机 App 首页中,无额度快照的账户优先展示历史累计,缺少累计时才使用当前区间汇总。API 接入只表示接入方式;有快照时仍可展示订阅额度。

手机默认使用 App 模式,底部为首页、账户、统计、明细和我的。首页的时间段用量入口打开独立趋势页,微型趋势固定显示全账户近 30 天。可在“我的”中切换为侧栏模式;导航模式和主题会记住,重新打开仍然生效。
总览只按时间切换,不按模型或账户筛选。第一眼是总量和账户额度,默认范围「历史至今」从账本第一条记录起算。换成今天、近 7 天、近 30 天或自定义日期后,摘要、趋势和模型分布一起变化,账户额度仍按各自当前周期显示,不受范围影响。

摘要有四格。Tokens、费用和请求在历史至今下显示日均和起始日期,其它范围显示与上一个等长时段相比的环比,上期没有用量时显示「暂无对比」。缓存命中率是缓存读取占输入侧(普通输入、缓存读取、缓存写入)的比例,下方的条形图按这三部分拆开,输出 Tokens 不计入命中率,单独列出数量。趋势图下方给出峰值时段、有用量的时段数和单次请求平均值。点击模型分布中的模型,会带着同一范围打开统计报表。

统计报表顶部使用同样的摘要。分组汇总多一列缓存命中率,多于一行时末尾有合计行。

手机默认使用 App 模式,底部为首页、账户、统计、明细和我的。首页顶部可在全部、近 7 天和近 30 天之间切换,日历按钮提供其它范围。可在“我的”中切换为侧栏模式;导航模式和主题会记住,重新打开仍然生效。

## 筛选与图表

快捷范围与自定义起止日期均支持;完整有效的日期修改立即生效,无需应用按钮。自然日和自然周按 `Asia/Shanghai` 统计。
快捷范围与自定义起止日期均支持,快捷范围的第一项是「历史至今」;完整有效的日期修改立即生效,无需应用按钮。自然日和自然周按 `Asia/Shanghai` 统计。

各页面独立记住日期、模型、账户、图表选项及适用的汇总维度和排序。搜索关键词和分页不保存。

Expand Down
17 changes: 17 additions & 0 deletions src/shared/date-range.ts
Original file line number Diff line number Diff line change
Expand Up @@ -62,3 +62,20 @@ export function reportBounds(
}
: { start: currentStart, end: currentEnd, endInclusive: true };
}

/** 上海自然日;账本首条记录与采样时刻都按这个时区折成日期。 */
export function shanghaiDate(timestamp: string) {
return new Date(asOfTime(timestamp) + 8 * 3600_000)
.toISOString()
.slice(0, 10);
}

/**
* 「历史至今」只是客户端的范围写法:服务端仍收到普通自然日范围,
* 从账本首条记录所在日到采样当日,因此不会与其它自定义范围混淆缓存。
*/
export function allTimeRange(firstAt: string, asOf: string): DateRange {
const from = shanghaiDate(firstAt);
const to = shanghaiDate(asOf);
return { from: from <= to ? from : to, to };
}
5 changes: 5 additions & 0 deletions src/shared/ledger-view.ts
Original file line number Diff line number Diff line change
Expand Up @@ -96,6 +96,9 @@ export interface LedgerView extends Omit<LedgerSnapshot, "records"> {
creditsSummary: MetricSummary;
tokenSummary: MetricSummary;
previousUsdSummary: MetricSummary;
/** 上一个等长时段;旧缓存结果可能缺少,界面应显示为暂无对比。 */
previousTokenSummary?: MetricSummary;
previousCount?: number;
cacheSummary: MetricSummary;
cacheRate: number | null;
completeCacheCount: number;
Expand Down Expand Up @@ -375,6 +378,8 @@ export function createLedgerView(
creditsSummary: totals.credits,
tokenSummary: totals.tokens,
previousUsdSummary: summarize(previous, "usd"),
previousTokenSummary: summarize(previous, "tokens"),
previousCount: previous.length,
cacheSummary: tokenFieldSummary(current, "cacheRead"),
cacheRate: allInput ? (cache / allInput) * 100 : null,
completeCacheCount: completeCacheRows.length,
Expand Down
2 changes: 2 additions & 0 deletions src/shared/report.ts
Original file line number Diff line number Diff line change
Expand Up @@ -111,6 +111,8 @@ export type Granularity = "hour" | "day" | "week";
export interface ReportFilter {
days: number;
dateRange?: DateRange;
/** 历史至今;仅在界面偏好中保留,查询前换算为自然日范围,服务端不识别。 */
all?: boolean;
model: string;
account: string;
search: string;
Expand Down
2 changes: 2 additions & 0 deletions src/storage/report-index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -1192,6 +1192,8 @@ export class ReportIndex {
creditsSummary: totals.credits,
tokenSummary: totals.tokens 66C9 ,
previousUsdSummary: metricSummary(previousTotal, "usd", basis),
previousTokenSummary: metricSummary(previousTotal, "tokens", basis),
previousCount: previousTotal.count,
cacheSummary: this.cacheSummary(currentTotal),
cacheRate: currentTotal.completeCacheInput
? (currentTotal.completeCacheRead / currentTotal.completeCacheInput) *
Expand Down
Loading
Loading
0