FFFF feat(collector): book omp Antigravity usage per Google account and read live quota after a 429 by InfinityPacer · Pull Request #68 · 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
10 changes: 7 additions & 3 deletions docs/collector.md
Original file line number Diff line number Diff line change
Expand Up @@ -116,8 +116,12 @@ Codex 的 `bo` 等其他通道属于网关后面的账户,读取时跳过并

- 额度缓存来自 `~/.cache/agy-statusline/quota-<label>.tsv`,由交互式状态栏脚本写出,并在采集器发现新的 Antigravity 用量时按需刷新(见下),采样时间取文件修改时间。每行用制表符分隔窗口名、已用百分比整数和重置时间的 Unix 秒,窗口名为 `gemini_5h`、`gemini_weekly`、`3p_5h` 或 `3p_weekly`,另可带一行 `plan\t<套餐名>\t-`。`<label>` 是 Google 账号邮箱本地部分转小写并把非 `[a-z0-9_-]` 字符替换为 `-` 后的标签,采集器不读取也不还原完整邮箱。同目录下的 `current-account` 保存当前活跃账号标签。
- 每个 Google 账号在 Antigravity 中有两套独立额度池,采集器为每个 `<label>` 建立一个订阅账户 `Antigravity (<label>)`(标识 `agy-<label>`)。`gemini_5h` 与 `gemini_weekly` 上报为 `five-hour` 与 `seven-day` 窗口,`3p_5h` 与 `3p_weekly` 上报为 `five-hour-3p` 与 `seven-day-3p` 窗口,服务端按窗口计算各池的本期花费,Gemini 窗口只计 `gemini-` 开头的模型,另两个窗口只计其他模型。旧版采集器按池分别建立的 `agy-<label>-gemini` 与 `agy-<label>-3p` 两个账户仍随每轮同步上报,并指向新账户,它们名下的历史用量与额度在报表里归入新账户。原来在旧账户上手动设置的套餐不会自动带过来,需要在新账户上再选一次。当某个窗口的重置时间不晚于采样时间或当前时间时,该窗口按已过期处理,旧百分比不会带入新周期。百分比或重置时间为 `-` 时保留未知,不补零。
- 无界面运行(例如经 Paseo 或 omp 调用)时,状态栏脚本不会执行,额度缓存会一直停在上次交互使用时。所以 `sync` 发现新的 Antigravity 用量(`agy` 会话库或 omp 里新入账的请求)后,会在同一轮运行一次本机的 `agy -p /usage`,把返回的四个额度窗口合并写回 `quota-<label>.tsv`,并随这一批用量一起上传,不必等下一轮。`agy` 的 `/usage` 不返回套餐,原有的 `plan` 行和这次没刷到的窗口行原样保留。账号标签取自 `agy` 登录日志里邮箱的本地部分,缺失时沿用 `current-account`;首次使用、还没有任何缓存时,也靠这一步确定账号并补记之前暂缓的 omp 请求。
- 按需刷新有三道限制:两次尝试至少相隔 5 分钟(失败也计一次,上游故障或未登录时不会每分钟重试);缓存文件在 5 分钟内刚被状态栏写过时直接跳过;没有新的 Antigravity 用量时不运行。`agy` 限时 35 秒,超时会连同它启动的进程一起终止。刷新失败不影响本轮已读到的用量和已有额度的上传,原因只在与上次不同时写入日志,`status` 显示最近一次尝试的结果。`scan` 只读本地文件,不会触发刷新。联网的是 `agy` 本身,采集器不直接访问 Google 接口。
- 无界面运行(例如经 Paseo 或 omp 调用)时,状态栏脚本不会执行,额度缓存会一直停在上次交互使用时,所以 `sync` 在同一轮按需刷新,新额度随这一批用量一起上传,不必等下一轮。刷新只合并这次读到的窗口,原有的 `plan` 行和没读到的窗口行原样保留。
- `agy` 会话库里有新用量时运行一次本机的 `agy -p /usage`,它只能读到 `agy` 当前登录的账号。账号标签取自 `agy` 登录日志里邮箱的本地部分,并写回 `current-account`。
- omp 里有新入账的 Antigravity 请求时运行一次 `omp usage --json`,一次读回 omp 登录的所有 Google 账号,各自写进自己的 `quota-<label>.tsv`,不改 `current-account`。omp 会把额度缓存几分钟,平时直接用它的缓存。
- 额度用完后上游拒绝请求,不再产生用量,只靠新用量触发会让读数停在用满前。所以 omp 记录里出现额度用完(429)的响应时,采集器先让 omp 丢弃缓存,再读一次实时额度。
- omp 请求找不到账号时(账号库读不到,也还没有 `current-account`),两种刷新都会运行,由 `agy` 确定账号并补记之前暂缓的请求。
- 按需刷新有几道限制:没有新的 Antigravity 用量或 429 æ— 8000 ¶不运行;同一种刷新两次尝试至少相隔 5 分钟,因 429 触发的实时读取至少相隔 1 分钟(失败也计一次,上游故障或未登录时不会每轮重试);`agy` 的额度缓存在 5 分钟内刚被状态栏写过时跳过。`agy` 与 `omp` 各限时 35 秒,超时会连同它们启动的进程一起终止。刷新失败不影响本轮已读到的用量和已有额度的上传,原因只在与上次不同时写入日志,`status` 显示最近一次尝试的结果。`scan` 只读本地文件,不会触发刷新。联网的是 `agy` 与 `omp` 本身,采集器不直接访问 Google 接口。
- Token 用量来自 `~/.gemini/antigravity-cli/conversations/*.db`。`agy` 运行中会锁住会话库,采集器对无 WAL 的库以只读不可变模式打开,对存在 `.db-wal` 的库先把 `.db` 与 `.db-wal` 复制到系统临时目录再只读打开,不在 `~/.gemini` 下写入、加锁或创建附属文件。
- 采集器解码 `gen_metadata` 表中的 `CortexStepGeneratorMetadata` protobuf,提取每次生成的未缓存输入、缓存读取、缓存写入、输出和属于输出子集的思考 Tokens,并关联 `steps` 表中的完成时间。任一基础桶缺失时保留未知,不补零。模型名与思考档位从上游响应模型、显示名和模型枚举归一化得到,同一账号的 Gemini、Claude 与 GPT-OSS 模型都记在这个账号的账户下。早于 `2026-09-20` 的记录在读取时丢弃,已读取记录按会话、步骤与执行标识幂等去重。

Expand All @@ -128,7 +132,7 @@ Codex 的 `bo` 等其他通道属于网关后面的账户,读取时跳过并
- 只读扫描该目录下各工作目录子目录里的 `.jsonl` 会话文件(隐藏的锁文件和终端输出不读),先读最近修改的,每轮最多读取约 64 MiB,其余顺延。每个文件只读新增的部分,没写完的最后一行留到下一轮。
- 每条已完成的助手消息算一次请求,只提取模型、供应商通道、完成时间和 Token 用量,以及会话里设置的思考档位和服务档位。消息正文、会话标题、工作目录和会话 ID 不读取也不上传,早于 `2026-09-20` 的记录读取时丢弃。刚启动即中止、四类 Token 全为 0 的响应不算请求。
- omp 记录里的输入已经扣除缓存,输出已包含推理量,推理量为 0 时记录会省略该字段,采集器保持未知而不补零。omp 自带的 `cost` 不采用,费用由 Meterleaf 按[计价说明](pricing.md)估值。
- 通过 `opencode-go` 通道发起的请求归入 `opencode-go` 账户,与 OpenCode 的用量一起撑起 Go 的额度估算。通过 `google-antigravity` 通道发起的请求归入当前活跃的 Antigravity 账户 `Antigravity (<label>)`,Gemini 模型计入 Gemini 池,其他模型计入 Claude/GPT 池,额度刷新见 [Antigravity 来源](#antigravity-来源)。omp 的会话记录不含 Google 邮箱,这里以 `~/.cache/agy-statusline/current-account` 为准,所以在 omp 里切换使用多个 Google 账号时,请求会记到状态栏记录的那个账号上。其他通道没有规则时跳过并计数。
- 通过 `opencode-go` 通道发起的请求归入 `opencode-go` 账户,与 OpenCode 的用量一起撑起 Go 的额度估算。通过 `google-antigravity` 通道发起的请求归入它实际使用的 Google 账号 `Antigravity (<label>)`,Gemini 模型计入 Gemini 池,其他模型计入 Claude/GPT 池,额度刷新见 [Antigravity 来源](#antigravity-来源)。omp 每条请求记着所用登录的编号,采集器只读打开 omp 的账号库 `~/.omp/agent/agent.db`(与会话目录同级),只查编号和登录邮箱,不读令牌,用邮箱本地部分得到标签。omp 登录多个 Google 账号并在它们之间分摊请求时,用量因此分别记到各自的账户下。早期没有编号的记录、或账号库里查不到的编号,归入 `~/.cache/agy-statusline/current-account` 记录的账号。其他通道没有规则时跳过并计数。
- 请求按 omp 自己的消息标识、完成时间、通道、模型和 Token 数去重,不看文件路径和会话 ID。会话被移到别的工作目录、从中间分支出新会话而复制了历史消息,都不会重复计入。
- 文件里有 Antigravity 请求却还没有活跃账号时(首次使用且没有状态栏缓存),这个文件暂不推进读取进度,等账号确定后自动补记。

Expand Down
2 changes: 1 addition & 1 deletion package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "meterleaf",
"version": "0.16.0",
"version": "0.16.1",
"private": true,
"type": "module",
"license": "Apache-2.0",
Expand Down
Loading
Loading
0