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:
21
CLAUDE.md
21
CLAUDE.md
@@ -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/:
|
||||
|
||||
In neuem Issue referenzieren
Einen Benutzer sperren