feat: AI 用量改账户级本机采集(Claude 钥匙串/Codex RPC)+宽版 7d 合并行
- Claude:复用 Claude Code 钥匙串登录态直调 /api/oauth/usage,零依赖 statusline 与 Claude Code 进程;只读不刷新 token - Codex:经 codex app-server JSON-RPC 读 ChatGPT 订阅的 Codex 额度池(普通聊天额度无账户级途径,右块改名 Codex Usage) - 两路采集共用 TTL 缓存+失败退避(CLAUDE_USAGE_TTL/CODEX_USAGE_TTL,语义同 WEATHER_TTL),推送端两路独立上报 - E1002:Claude 7d 与 fable 7d 合并为一行(单边框内上下对半实心,数字取较大者)、标签去 all 前缀、空值按 00% 00 占位等宽 - E1002/网页版:今日实时环比同比改涨绿跌红,与 K 线一致 Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
This commit is contained in:
37
config.py
37
config.py
@@ -104,12 +104,37 @@ BTC_LIMIT = int(os.environ.get("BTC_LIMIT", "48")) # 展示最近 N 根
|
||||
BTC_TTL = int(os.environ.get("BTC_TTL", "300")) # 秒,默认 5 分钟(本机文件缓存与 server.py 内存缓存共用)
|
||||
BTC_CACHE_PATH = os.path.join(BASE_DIR, ".btc_cache.json")
|
||||
|
||||
# ---- Claude Code 用量(Claude Usage 模块)数据源 ----
|
||||
# 只读本地、**不发任何网络请求**(详见 usage_local.py)——生产者/消费者模式:
|
||||
# 生产者 = 打过补丁的 claude-statusline,把每次从 Claude Code stdin 拿到的**权威实时**额度
|
||||
# (five_hour/seven_day 的 utilization + resets_at)落盘到 ~/.claude/usage-snapshot.json;本项目读它。
|
||||
# 活跃使用时该快照几乎持续刷新、准确;空闲时停在最后一次。文件缺失时用量区显示 "--"。
|
||||
USAGE_LOCAL_PATH = os.environ.get("USAGE_LOCAL_PATH", os.path.expanduser("~/.claude/usage-snapshot.json"))
|
||||
# ---- AI 用量数据源(Claude Usage / Codex Usage 两个模块)----
|
||||
# 形态 A:两路都在**本机**采集(需本机的登录态),由 main.py --target push 上报给 server.py;服务端不持任何凭证、不读本机文件。
|
||||
# Claude(claude_usage.py):复用 Claude Code 自身的 OAuth 登录态(macOS 钥匙串「Claude Code-credentials」,只读、绝不刷新),
|
||||
# 直接调 https://api.anthropic.com/api/oauth/usage——与 Claude Code `/usage` 同源、**账户级**(CLI/桌面/网页消耗都算),
|
||||
# 不依赖 Claude Code 进程在跑、不依赖 statusline 插件。
|
||||
CLAUDE_USAGE_TTL = int(os.environ.get("CLAUDE_USAGE_TTL", "300")) # 秒,快照有效期(同 WEATHER_TTL 语义,0=每次实拉);社区一致建议 ≥300(突发调用 429 会封约 24 小时)
|
||||
CLAUDE_USAGE_BACKOFF = int(os.environ.get("CLAUDE_USAGE_BACKOFF", "1800")) # 秒;拉取失败后的退避期,期内沿用旧快照
|
||||
CLAUDE_USAGE_SCOPE_MODEL = os.environ.get("CLAUDE_USAGE_SCOPE_MODEL", "Fable") # limits[] 里模型限定周额度按 display_name 识别
|
||||
CLAUDE_USAGE_SCOPE_FALLBACK_KEY = os.environ.get("CLAUDE_USAGE_SCOPE_FALLBACK_KEY", "seven_day_opus") # 旧版顶层键兜底
|
||||
CLAUDE_USAGE_UA = os.environ.get("CLAUDE_USAGE_UA", "claude-code/2.1.34")
|
||||
CLAUDE_USAGE_CACHE_PATH = os.path.join(BASE_DIR, ".claude_usage_cache.json") # 只存快照与时间戳,不存凭证
|
||||
# Codex(codex_usage.py):经官方 `codex app-server` JSON-RPC 读 ChatGPT 订阅的 Codex 额度池(CLI/IDE/Web/桌面 App 内 Codex 共用);
|
||||
# token 刷新由 Codex CLI 代管。需 Codex 以 ChatGPT 账号登录(`codex login`);CODEX_USAGE_HOME 留空用默认 ~/.codex,
|
||||
# 也可指向独立 CODEX_HOME 与日常配置隔离。
|
||||
def _which_codex():
|
||||
"""launchd 不继承登录 shell 的 PATH(无 /opt/homebrew/bin),故按 PATH → Homebrew/常见位置解析出绝对路径。"""
|
||||
import shutil
|
||||
env = os.environ.get("CODEX_BIN", "")
|
||||
if env:
|
||||
return os.path.expanduser(env)
|
||||
for cand in (shutil.which("codex"), "/opt/homebrew/bin/codex", "/usr/local/bin/codex", os.path.expanduser("~/.npm-global/bin/codex")):
|
||||
if cand and os.path.exists(cand):
|
||||
return cand
|
||||
return "codex"
|
||||
CODEX_BIN = _which_codex()
|
||||
# 留空 = 用 Codex 默认目录 ~/.codex(2026-09-14 用户直接在默认目录用 ChatGPT 账号登录,故默认跟随之);
|
||||
# 若日常 Codex 需保持 API Key/中转登录而另开一份 ChatGPT 登录,可设为独立目录(如 ~/.codex-usage)并在其下 `CODEX_HOME=… codex login`。
|
||||
CODEX_USAGE_HOME = os.environ.get("CODEX_USAGE_HOME", "")
|
||||
CODEX_USAGE_TTL = int(os.environ.get("CODEX_USAGE_TTL", "300")) # 秒,快照有效期(0=每次实拉)
|
||||
CODEX_USAGE_BACKOFF = int(os.environ.get("CODEX_USAGE_BACKOFF", "900"))
|
||||
CODEX_USAGE_CACHE_PATH = os.path.join(BASE_DIR, ".codex_usage_cache.json")
|
||||
USAGE_WARN = int(os.environ.get("USAGE_WARN", "80")) # 用量 ≥ 此百分比 → 进度条与百分比转红预警(两个版面统一)
|
||||
# 以下两项仅六色宽版(E1002)使用,三色小屏只有 黑/红 两档。用量与 pace 各自三档、独立取色,颜色顺序固定为 绿 → 黑 → 红
|
||||
# (黄不用:2026-09-14 曾按要求加过 60%~80% 黄档,随即被否——黄小字压白底发虚、且四档在三行里过于花):
|
||||
|
||||
Reference in New Issue
Block a user