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:
Dieter Schlüter 2026-06-30 09:22:06 +02:00
commit 88c8c9df7f
8 changed files with 106 additions and 5 deletions

View file

@ -35,6 +35,7 @@ class PipelineTrace(BaseModel):
spoken_response: str | None = None
tts_ready_text: str | None = None
citations: list[str] = [] # Quellen-URLs der Web-Suche (für die UI-Bubble)
web_searches: int = 0 # Anzahl tatsächlich ausgeführter Web-Suchen in diesem Turn
class SpeakRequest(BaseModel):
@ -164,7 +165,8 @@ class AdminUserPrefsUpdate(BaseModel):
Format geprüft (serverseitige Härtung zusätzlich zur Frontend-Validierung).
"""
allowed_languages: str | None = None
web_search_enabled: bool | None = None # Web-Suche (Weg 2) pro Nutzer an/aus
web_search_enabled: bool | None = None # Web-Suche (Weg 2) pro Nutzer an/aus
web_search_daily_limit: int | None = None # max. Web-Suchen/Tag (0 = unbegrenzt)
# Notfall-Profil (in user.prefs gespeichert, fließt in die Notruf-Meldungen ein)
full_name: str | None = None
street: str | None = None