Affichage des crédits extra_usage + parser validé contre réponse réelle

This commit is contained in:
2026-06-15 11:08:10 +02:00
parent 74d33eb693
commit 80c8d0ac93
2 changed files with 31 additions and 0 deletions

View File

@@ -64,6 +64,22 @@ class Window:
return f"{m}min" return f"{m}min"
@dataclass
class ExtraUsage:
"""Crédits « extra usage » (pay-as-you-go au-delà de l'abonnement)."""
used: float
limit: float | None
currency: str = "EUR"
@property
def label(self) -> str:
sym = "" if self.currency == "EUR" else self.currency
if self.limit:
return f"Extra : {self.used:.0f}{sym} / {self.limit:.0f}{sym}"
return f"Extra : {self.used:.0f}{sym}"
@dataclass @dataclass
class ClaudeUsage: class ClaudeUsage:
ok: bool ok: bool
@@ -72,6 +88,7 @@ class ClaudeUsage:
seven_day: Window | None = None seven_day: Window | None = None
seven_day_opus: Window | None = None seven_day_opus: Window | None = None
seven_day_sonnet: Window | None = None seven_day_sonnet: Window | None = None
extra: ExtraUsage | None = None
burn_rate: float | None = None # tokens/min (ccusage, optionnel) burn_rate: float | None = None # tokens/min (ccusage, optionnel)
@@ -208,11 +225,22 @@ async def fetch_usage() -> ClaudeUsage:
data = resp.json() data = resp.json()
burn = _burn_rate_from_ccusage() if config.ccusage_enabled else None burn = _burn_rate_from_ccusage() if config.ccusage_enabled else None
extra = None
eu = data.get("extra_usage") or {}
if eu.get("is_enabled") and eu.get("used_credits"):
extra = ExtraUsage(
used=float(eu.get("used_credits", 0)),
limit=float(eu["monthly_limit"]) if eu.get("monthly_limit") else None,
currency=eu.get("currency", "EUR"),
)
return ClaudeUsage( return ClaudeUsage(
ok=True, ok=True,
five_hour=_parse_window(data.get("five_hour")), five_hour=_parse_window(data.get("five_hour")),
seven_day=_parse_window(data.get("seven_day")), seven_day=_parse_window(data.get("seven_day")),
seven_day_opus=_parse_window(data.get("seven_day_opus")), seven_day_opus=_parse_window(data.get("seven_day_opus")),
seven_day_sonnet=_parse_window(data.get("seven_day_sonnet")), seven_day_sonnet=_parse_window(data.get("seven_day_sonnet")),
extra=extra,
burn_rate=burn, burn_rate=burn,
) )

View File

@@ -111,6 +111,9 @@
<div class="sub">reset dans {{ g.resets_in }}{% if g.extra %} · {{ g.extra }}{% endif %}</div> <div class="sub">reset dans {{ g.resets_in }}{% if g.extra %} · {{ g.extra }}{% endif %}</div>
</div> </div>
{% endfor %} {% endfor %}
{% if claude.extra %}
<div class="sub" style="font-size:32px;">{{ claude.extra.label }}</div>
{% endif %}
{% if claude.burn_rate %} {% if claude.burn_rate %}
<div class="sub" style="font-size:32px;">Burn rate : {{ claude.burn_rate | round | int }} tok/min</div> <div class="sub" style="font-size:32px;">Burn rate : {{ claude.burn_rate | round | int }} tok/min</div>
{% endif %} {% endif %}