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

@@ -31,13 +31,18 @@ backend:
(EU-Inferenzprofile Frankfurt, agents/bedrock_client.py). Umschaltbar je
Lage (incidents.ai_backend) > Organisation (org_setting 'ai_backend') >
global (ENV AI_BACKEND, Default 'cli'). Aufloesung je Refresh im
Orchestrator via ContextVar _ai_backend_var. Phase 1 bedient nur
werkzeuglose Aufrufe (tools=None); Aufrufe mit WebSearch/WebFetch laufen
weiter uebers CLI, bis die staan-Recherche-Schleife (Phase 2) fertig ist.
Kosten werden aus Token x BEDROCK_PRICING (config.py) berechnet, damit
das Credits-System unveraendert funktioniert. AWS-Zugang + STAAN_API_KEY
liegen in der Staging-.env. boto3 muss im venv installiert sein (beim
Promote nach Live auch dort nachziehen!).
Orchestrator via ContextVar _ai_backend_var (gemeinsame Aufloesung mit der
Lane-Wahl, siehe _resolve_ai_backend). Seit Phase 2 (2026-07-30) laeuft im
EU-Modus auch die RECHERCHE europaeisch: agents/eu_researcher.py steuert
eine Schleife aus Bedrock-Planung und staan-Suchen (services/staan_client.py)
und liefert dasselbe JSON wie die CLI-WebSearch. Werkzeuglose Aufrufe gehen
direkt ueber bedrock_client; Faktenchecker/Analyzer nutzen im EU-Modus noch
die CLI-WebSearch (kommt in Phase 3). Doppelspur: eine Orchestrator-Lane je
(Organisation, Backend) — CLI- und EU-Lauf derselben Org laufen gleichzeitig,
gleiche Backends seriell. Kosten aus Token x BEDROCK_PRICING plus
STAAN_COST_PER_QUERY_USD, Credits-System unveraendert. AWS-Zugang +
STAAN_API_KEY liegen in der Staging-.env. boto3 muss im venv installiert
sein (beim Promote nach Live auch dort nachziehen!).
ki_modelle:
schnell: CLAUDE_MODEL_FAST (Haiku) — Feed-Selektion, Topic-Filter, Geoparsing, Uebersetzung, Chat, QC
mittel: CLAUDE_MODEL_MEDIUM (Sonnet) — nur Netzwerkanalyse (entity_extractor hat aktuell keinen Aufrufer in der App)
@@ -89,6 +94,7 @@ src/:
translator.py: "Haiku-Uebersetzung in Batches a 5 (groessere Batches rissen den JSON-Output ab)"
claude_client.py: "Shared Claude CLI Client, Usage-Tracking (Token, Kosten), Rate-Limit-Erkennung, Cancel via ContextVar. Routet je nach _ai_backend_var werkzeuglose Aufrufe zu bedrock_client"
bedrock_client.py: "EU-Modellweg ueber AWS Bedrock Converse (nur eu.-Inferenzprofile, Token-zu-USD-Umrechnung ueber BEDROCK_PRICING, gleiche Fehlerkategorien wie das CLI). EU-Umbau Phase 1"
eu_researcher.py: "EU-Recherche-Schleife (Phase 2): Bedrock-Modell schlaegt Suchanfragen vor, Code fragt staan, Modell entscheidet weiter/fertig. Bildet die 4-Phasen-Tiefenrecherche nach, liefert denselben JSON-Array-Text wie die CLI-WebSearch (Einstieg in researcher.search), akzeptiert NUR URLs aus echten staan-Treffern"
feeds/:
rss_parser.py: "RSS-Feed-Parsing (feedparser + httpx), adaptive Keyword-Schwelle, Frische-Bonus, Domain-Cap"
@@ -104,6 +110,7 @@ src/:
source_suggester.py: "KI-Quellen-Vorschlaege via Haiku + Karteileichen-Heuristik"
pdf_ingest.py: "Minutenjob: hochgeladene PDFs einlesen (pdfplumber + OCR-Fallback), uebersetzen, als Pool-Artikel ablegen"
org_settings.py: "Key-Value-Einstellungen je Organisation (output_language etc.) mit 60s-Cache"
staan_client.py: "staan.ai Such-Client (EU-Umbau Phase 2): Suche + Volltexte (full_content=markdown) ueber den europaeischen Index, Pflicht-Domain-Ausschlussliste je Anfrage, max 10 Ausschluss-Domains"
license_service.py: "Lizenz-Pruefung, Credits-Buchung (charge_usage_to_tenant), Periodenwechsel, Budget-Warnung. expire_licenses() existiert, hat aber KEINEN Scheduler-Job"
middleware/: