feat: Web-Such-Budget pro Nutzer/Tag
Neue Tabelle web_search_usage + Store-Zaehler (web_search_count / add_web_search_usage, kaskadiert in delete_user). Pro-Nutzer-Limit web_search_daily_limit (Pref > global; 0 = unbegrenzt) in quota.py (web_search_within_budget). ws.py: Gate vor _resolve (Budget aufgebraucht -> Web-Suche fuer den Turn aus) + Zaehlung nach dem Turn (trace.web_searches, gezaehlt im Orchestrator je on_citations). Admin: Feld + UI-Eingabe. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
parent
5609741039
commit
88c8c9df7f
8 changed files with 106 additions and 5 deletions
28
app/quota.py
28
app/quota.py
|
|
@ -40,3 +40,31 @@ def enforce_quota(user, store, cfg=None) -> None:
|
|||
def record_usage(user, store, units: int = 0) -> None:
|
||||
store.add_usage(user.id, units)
|
||||
metrics.inc("turns_total")
|
||||
|
||||
|
||||
def web_search_limit(user, cfg=None) -> int:
|
||||
"""Max. Web-Suchen pro Tag fuer diesen Nutzer (Pref > global; 0 = unbegrenzt)."""
|
||||
if cfg is None:
|
||||
from app.runtime_config import runtime_settings
|
||||
cfg = runtime_settings
|
||||
pref = user.prefs.get("web_search_daily_limit") if user and user.prefs else None
|
||||
if pref is not None:
|
||||
try:
|
||||
return int(pref)
|
||||
except (TypeError, ValueError):
|
||||
pass
|
||||
return cfg.web_search_daily_limit
|
||||
|
||||
|
||||
def web_search_within_budget(user, store, cfg=None) -> bool:
|
||||
"""Darf der Nutzer heute noch eine Web-Suche ausloesen? (Limit 0 = unbegrenzt)."""
|
||||
limit = web_search_limit(user, cfg)
|
||||
if not limit or limit <= 0:
|
||||
return True
|
||||
return store.web_search_count(user.id) < limit
|
||||
|
||||
|
||||
def record_web_search(user, store, n: int = 1) -> None:
|
||||
"""Zaehlt n tatsaechlich ausgefuehrte Web-Suchen fuer den Nutzer."""
|
||||
if n and n > 0 and user is not None:
|
||||
store.add_web_search_usage(user.id, n)
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue