File size: 1,092 Bytes
5c1d1c7 | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 | """Budget d'appels HTTP pour borner le coût d'une inférence.
Chaque appel `relations_from` au graphe JDM consomme une unité. Quand le
plafond est atteint, `BudgetExhausted` est levée — le moteur l'attrape et
renvoie un résultat silencieux plutôt que de laisser filer une exception.
"""
from __future__ import annotations
class BudgetExhausted(RuntimeError):
"""Levée quand le budget d'appels JDM d'une inférence est épuisé."""
class LookupBudget:
"""Compte les appels JDM consommés et coupe net au plafond."""
def __init__(self, limit: int) -> None:
self.limit: int = max(1, int(limit))
self.used: int = 0
@property
def remaining(self) -> int:
return max(0, self.limit - self.used)
def can_afford(self, n: int = 1) -> bool:
return self.used + n <= self.limit
def spend(self, n: int = 1) -> None:
"""Consomme `n` unités ; lève BudgetExhausted si on dépasse."""
self.used += n
if self.used > self.limit:
raise BudgetExhausted(f"budget épuisé ({self.used}/{self.limit})")
|