Tænkemusik til hver kategori og kvote-vagt på forvarmningen
CI / test (push) Successful in 56s

- Eget tænkenummer til de ti oprindelige kategorier
- tts_warm --reserve: forvarmningen rører aldrig de sidste credits i perioden

Claude-Session: https://claude.ai/code/session_01JmhJG6JnhXfzNiKv8f2vHu
This commit is contained in:
agw
2026-10-03 19:19:07 +02:00
parent 554c924097
commit 51931f3c64
12 changed files with 22 additions and 1 deletions
+9 -1
View File
@@ -24,8 +24,10 @@ class Command(BaseCommand):
def add_arguments(self, parser):
parser.add_argument("--budget", type=int, default=0, help="højst så mange nye tegn ud over de faste replikker")
parser.add_argument("--reserve", type=int, default=40000,
help="rør ikke de sidste så mange credits i perioden (de skal bruges til spil)")
def handle(self, *args, budget, **opts):
def handle(self, *args, budget, reserve, **opts):
if not tts.enabled():
self.stdout.write("ElevenLabs er ikke sat op (ELEVENLABS_API_KEY/ELEVENLABS_VOICE_ID). Springer over.")
return
@@ -36,6 +38,12 @@ class Command(BaseCommand):
self.stdout.write(self.style.SUCCESS(f"{ok} af {len(static)} faste replikker ligger i cachen."))
if budget <= 0:
return
left = tts.credits_left()
if left is not None:
budget = min(budget, max(0, left - reserve))
self.stdout.write(f"{left} credits tilbage i perioden; reserve {reserve}; budget i nat {budget} tegn.")
if budget <= 0:
return
# Spørgsmålene i den rækkefølge, spillet vælger dem (mindst brugte først), skiftevis med
# kategori-replikkerne, så begge dele bliver dækket over et par nætter.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
+13
View File
@@ -64,6 +64,19 @@ def _fetch(text: str, path: Path) -> None:
tmp.replace(path)
def credits_left() -> int | None:
"""Resterende ElevenLabs-credits i denne periode, eller None hvis nøglen ikke må læse det (user_read)."""
req = urllib.request.Request("https://api.elevenlabs.io/v1/user/subscription",
headers={"xi-api-key": settings.ELEVENLABS_API_KEY})
try:
with urllib.request.urlopen(req, timeout=15) as resp:
d = json.load(resp)
return int(d["character_limit"]) - int(d["character_count"])
except Exception as e: # noqa: BLE001
log.info("Kunne ikke læse ElevenLabs-saldoen: %s", _describe(e))
return None
def is_cached(text: str) -> bool:
return bool(text.strip()) and cache_path(_digest(text)).exists()