feat(eu-umbau): staan-Recherche-Schleife und Doppelspur (Phase 2)

Im EU-Modus laeuft die Recherche jetzt europaeisch: agents/eu_researcher.py
steuert eine Schleife aus Bedrock-Planung (Opus, EU-Profile) und staan-Suchen
(services/staan_client.py, Suche + Volltexte via full_content=markdown,
Pflicht-Domain-Ausschlussliste je Anfrage). Bildet die 4-Phasen-Tiefenrecherche
nach und liefert exakt das JSON der bisherigen CLI-WebSearch, Parsing und
Filter in researcher.search bleiben unveraendert. Anti-Halluzination: nur URLs
aus echten staan-Treffern werden akzeptiert; published_at nur wenn aus Inhalt
oder URL ableitbar (staan liefert keine Daten).

Doppelspur im Orchestrator: Lane-Schluessel ist jetzt (Organisation, Backend),
Aufloesung zentral in _resolve_ai_backend (Lage > Org-Setting > ENV). CLI- und
EU-Lauf derselben Organisation laufen gleichzeitig, gleiche Backends seriell.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Dieser Commit ist enthalten in:
claude-dev
2026-07-30 20:12:31 +00:00
Ursprung e0edac2a18
Commit a7f1aa29ab
6 geänderte Dateien mit 589 neuen und 20 gelöschten Zeilen

Datei anzeigen

@@ -66,6 +66,26 @@ BEDROCK_PRICING = {
BEDROCK_CACHE_WRITE_FACTOR = 1.25
BEDROCK_CACHE_READ_FACTOR = 0.10
# --- staan.ai Such-API (EU/DSGVO-Umbau, Phase 2) -------------------------------
# Europäischer Suchindex (European Search Perspective). Ersetzt im EU-Modellweg
# die eingebaute WebSearch/WebFetch des Claude CLI. Client in
# services/staan_client.py, Recherche-Schleife in agents/eu_researcher.py.
STAAN_API_KEY = os.environ.get("STAAN_API_KEY", "")
STAAN_BASE_URL = os.environ.get("STAAN_BASE_URL", "https://api.staan.ai/v2")
# 2 Euro je 1000 Anfragen, als USD-Näherung für die interne Kostenkontrolle.
STAAN_COST_PER_QUERY_USD = float(os.environ.get("STAAN_COST_PER_QUERY_USD", "0.0023"))
# Pflicht-Ausschlussliste je Suchanfrage (Befund aus Phase 0, hebt die
# Trefferqualität deutlich). staan erlaubt maximal 10 Domains je Anfrage,
# Nutzer-Ausschlüsse füllen die restlichen Plätze auf.
STAAN_EXCLUDE_DOMAINS = [
"youtube.com", "wikipedia.org", "facebook.com", "reddit.com",
"pinterest.com", "tiktok.com", "instagram.com", "x.com",
]
# Rundenbegrenzung der EU-Recherche-Schleife (Planungsaufrufe an das Modell,
# ohne die Abschlussrunde). research bildet die 4-Phasen-Tiefenrecherche nach.
EU_RESEARCH_MAX_ROUNDS_ADHOC = int(os.environ.get("EU_RESEARCH_MAX_ROUNDS_ADHOC", "3"))
EU_RESEARCH_MAX_ROUNDS_RESEARCH = int(os.environ.get("EU_RESEARCH_MAX_ROUNDS_RESEARCH", "5"))
# --- Verbrauchssaetze (Credits je Aktion) -------------------------------------
# Beschlossen 2026-07-23, der Verbrauchsrechner im Verwaltungsportal nutzt
# dieselben Werte: Live-Lauf 45, Recherche je Durchlauf 40 (das Anlegen faehrt