Files
planer/phase0/beispiel-einheiten-config-m3.md
2026-07-22 16:12:23 +02:00

98 lines
4.8 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# Einheiten: backend/config.py
stand: UNBEKANNT
## backend/config.py::_load_env
beschreibung: Lädt KEY=VALUE-Zeilen aus einer .env-Datei in os.environ, wobei die Datei bereits gesetzte Umgebungsvariablen überschreibt.
fakten:
- Liest die .env-Datei UTF-8-codiert ein.
beleg: "text = path.read_text(encoding=\"utf-8\")"
- Bricht den Ladevorgang still ab, wenn die Datei nicht lesbar ist.
beleg: "except OSError:"
- Überspringt Leerzeilen, Kommentarzeilen und Zeilen ohne Gleichheitszeichen.
beleg: "if not line or line.startswith(\"#\") or \"=\" not in line:"
- Entfernt umgebende Anführungszeichen aus den Werten.
beleg: "value = value.strip().strip('\"').strip(\"'\")"
- Schreibt jeden gültigen Schlüssel in os.environ (Datei gewinnt gegen vererbte Env).
beleg: "os.environ[key] = value"
kanten:
## backend/config.py::DEFAULT_PROVIDER
beschreibung: Stellt sicher, dass DEFAULT_PROVIDER aus der Umgebung gesetzt ist, und bricht den Start sonst mit einer RuntimeError ab.
fakten:
- Liest DEFAULT_PROVIDER aus der Umgebung mit leerem Default.
beleg: "DEFAULT_PROVIDER = os.getenv(\"DEFAULT_PROVIDER\", \"\")"
- Bricht den Start ab, wenn DEFAULT_PROVIDER nicht gesetzt ist.
beleg: "if not DEFAULT_PROVIDER:"
- Die Fehlermeldung nennt `minimax` als konkreten Beispielwert.
beleg: "DEFAULT_PROVIDER=minimax)\""
kanten:
## backend/config.py::PROVIDERS
beschreibung: Stellt die unabhängigen Provider-Stacks (claude, minimax, lokal) mit Rollen-Modellen, CLI-Aufrufen und Authentifizierungs-Umgebungsvariablen bereit.
fakten:
- Mehrere voneinander unabhängige Provider-Stacks sind in einem Dict zusammengefasst.
beleg: "PROVIDERS = {"
- Der `lokal`-Stack prüft Ollama-Erreichbarkeit über eine HTTP-URL.
beleg: "\"check_url\": \"http://localhost:11434/api/tags\","
- Der `minimax`-Stack nutzt den ENV-Key `MINIMAX_API_KEY` zur Authentifizierung.
beleg: "\"env_key\": \"MINIMAX_API_KEY\","
- Der `claude`-Stack nutzt OAuth-Authentifizierung statt eines API-Keys.
beleg: "\"env_key\": None, # auth via CLAUDE_CODE_OAUTH_TOKEN"
kanten:
- wird-genutzt-von: backend/config.py::resolve_role
## backend/config.py::ROLE_ROUTING
beschreibung: Bildet die vier Agent-Rollen quick/judge/guide/fast auf optionale prozessweite Override-Provider aus Umgebungsvariablen ab.
fakten:
- Vier Agent-Rollen können prozessweit auf einen anderen Provider-Stack umgeleitet werden.
beleg: "\"quick\": os.getenv(\"ROLE_QUICK\", \"\"),"
- Fehlende Env-Variablen ergeben einen leeren Override-String.
beleg: "os.getenv(\"ROLE_QUICK\", \"\"),"
kanten:
- wird-genutzt-von: backend/config.py::resolve_role
## backend/config.py::resolve_role
beschreibung: Liefert für eine Rolle das konkrete (provider, model)-Paar, wobei ein per Env gesetzter Rollen-Override Vorrang hat und sonst der Lauf-Provider genutzt wird.
fakten:
- Ein gesetzter Rollen-Override aus ROLE_ROUTING hat Vorrang vor dem Lauf-Provider.
beleg: "target = ROLE_ROUTING.get(role, \"\") or run_provider"
- Die Syntax "provider:model" erlaubt es, ein bestimmtes Modell zu pinnen.
beleg: "provider, _, model = target.partition(\":\")"
- Unbekannte Provider fallen auf den Lauf-Provider zurück.
beleg: "if provider not in PROVIDERS:"
- Fehlt eine explizite Modellangabe, wird das Rollen-Default des Stacks genutzt.
beleg: "model = PROVIDERS.get(provider, {}).get(role, \"\")"
kanten:
- nutzt: backend/config.py::ROLE_ROUTING
- nutzt: backend/config.py::PROVIDERS
## backend/config.py::TIMEOUTS
beschreibung: Definiert pro Agent-Schritt ein (Basis, pro-Block)-Timeout-Paar, das unabhängig vom Provider gilt.
fakten:
- Jeder Agent-Schritt hat individuelle Timeout-Werte als (Basis, pro-Block)-Tupel.
beleg: "\"research_mapping\": (600, 3), # n = pre-merged entries"
- Die Judge-Caps wurden am 2026-07-04 reduziert.
beleg: "# Judge caps tightened 2026-07-04: judge p50 is 672 s;"
- Der `writer` skaliert mit 60 s pro Sektion.
beleg: "\"writer\": (450, 60), # per section"
- QA/Repair-Wellen (`qa_judge`) skalieren nicht mit n.
beleg: "\"qa_judge\": (600, 0),"
kanten:
- wird-genutzt-von: backend/config.py::_apply_param_overrides
## backend/config.py::_apply_param_overrides
beschreibung: Liest ein JSON-Override-Dict aus der Umgebungsvariable CREATOR_PARAMS und überschreibt damit numerische Tuning-Konstanten dieses Moduls zur Prozess-Startzeit.
fakten:
- Bricht die Override-Anwendung still ab, wenn CREATOR_PARAMS nicht gesetzt ist.
beleg: "if not raw:"
- Weist ungültiges JSON in CREATOR_PARAMS mit SystemExit zurück.
beleg: "except ValueError:"
- Timeout-Overrides werden über das Präfix `TIMEOUT_` in TIMEOUTS eingespielt.
beleg: "if key.startswith(\"TIMEOUT_\"):"
- Unbekannte Schlüssel oder boolesche Werte werden mit SystemExit abgewiesen.
beleg: "isinstance(g[key], bool):"
- Numerische Overrides behalten den ursprünglichen Typ des Ziels.
beleg: "g[key] = type(g[key])(val)"
kanten:
- nutzt: backend/config.py::TIMEOUTS