Affichage des crédits extra_usage + parser validé contre réponse réelle
This commit is contained in:
@@ -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,
|
||||||
)
|
)
|
||||||
|
|||||||
@@ -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 %}
|
||||||
|
|||||||
Reference in New Issue
Block a user