feat(config): Rollen-/Judge-Modelle klar benannt + per Env waehlbar (#317)#334
Merged
Conversation
…317) MODEL_OPUS defaultete real auf Sonnet, aber Name suggerierte Opus - und der Eval-Judge lief hart darauf, ohne eigenen Override. Neuer Hauptslot MODEL_MAIN (Env ATOMIC_AGENT_MODEL_MAIN) + separater MODEL_JUDGE fuer den Eval-Judge (Env ATOMIC_AGENT_MODEL_JUDGE, Default = MODEL_MAIN). Jede Pipeline-Rolle (Planner/Extractor/Extender/Canonicalizer) einzeln per Env ueberschreibbar, Konstantennamen unveraendert (Sperrzone-Importe intakt). MODEL_OPUS bleibt als deprecated Alias auf MODEL_MAIN, ATOMIC_AGENT_MODEL_OPUS weiter als Fallback gelesen (Prioritaet: MAIN > OPUS-Alias > Default) - alte .env-Dateien brechen nicht. Gesetztes Alt-Env loest eine DeprecationWarning aus.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Closes #317
Problem
MODEL_OPUS(generative/config.py) defaultete real aufanthropic/claude-sonnet-4-6(A/B-Test 2026-05-20). Der Eval-Judge sowie mehrere Pipeline-Rollen (MODEL_PLANNER,MODEL_EXTRACTOR,MODEL_EXTENDER,MODEL_CANONICALIZER) aliasten direkt aufMODEL_OPUS— sie liefen also auf Sonnet, während der Konstantenname „Opus" suggerierte. Das ist irreführend bei Auswertungen/Studien-Caveats (Self-Preference-Kontext: welches Modell tatsächlich Judge spielt, ist zitierrelevant) und bei der Config-Erwartung, wenn ein Modell bewusst gewählt werden soll.Neues Namensschema
MODEL_OPUS(irreführend)MODEL_MAINATOMIC_AGENT_MODEL_MAINMODEL_OPUS)MODEL_JUDGE(Default =MODEL_MAIN)ATOMIC_AGENT_MODEL_JUDGEMODEL_PLANNER(Name unverändert, Sperrzone-Import)ATOMIC_AGENT_MODEL_PLANNERMODEL_EXTRACTOR(Name unverändert)ATOMIC_AGENT_MODEL_EXTRACTORMODEL_EXTENDER(Name unverändert)ATOMIC_AGENT_MODEL_EXTENDERMODEL_CANONICALIZER(Name unverändert)ATOMIC_AGENT_MODEL_CANONICALIZERbase.py-Defaults (call_claude/call_claude_full/call_claude_async/call_claude_full_async) laufen jetzt aufMODEL_MAINstattMODEL_OPUS.eval_quality_v4.py(Judge-Call + JSON-Reparatur-Call) läuft jetzt aufMODEL_JUDGE.Die vier Rollen-Konstantennamen (
MODEL_PLANNER/MODEL_EXTRACTOR/MODEL_EXTENDER/MODEL_CANONICALIZER) blieben absichtlich unverändert — sie sind Sperrzone-Importe inplanner.py/extractor.py/canonicalizer.py, die in diesem PR nicht angefasst werden durften.Deprecation-Pfad
MODEL_OPUSbleibt als Alias aufMODEL_MAINbestehen (Kommentar „deprecated, nutze MODEL_MAIN").ATOMIC_AGENT_MODEL_OPUSwird weiter als Fallback gelesen — Prioritätsreihenfolge:ATOMIC_AGENT_MODEL_MAIN>ATOMIC_AGENT_MODEL_OPUS(deprecated) > Default. Bestehende.env-Dateien mitATOMIC_AGENT_MODEL_OPUSfunktionieren dadurch unverändert weiter. IstATOMIC_AGENT_MODEL_OPUSgesetzt, wird zusätzlich eineDeprecationWarningausgelöst (getestet).Judge-Verifikation (Kernpunkt des Issues)
Geprüft, wo der Judge-Modellname in Eval-Records/DB-Feldern landet:
model_config-Feld (eval_quality_v4.py:1045, Snapshot vonMODEL_CONFIG) hat keinen eigenenjudge-Eintrag — nurplanner/extractor/verifier/cross_ref/critic/canonicalizer. Das war schon vor diesem PR so und ist unverändert (bewusst keine Schema-Änderung anquality_history.jsonl, siehe unten).model=MODEL_JUDGEübergeben) schreibt sein reales, aufgelöstes Modell in die Call-Trace (.cache/runs/<run-id>.jsonl, Feld"model",generative/agents/base.py::_trace). Der irreführende Konstantenname landete dort nie — nur der echte, aufgelöste String. Keine Verhaltensänderung nötig, nur verifiziert.docs/evaluation.md(Abschnitt „LLM-Judge") um diesen Befund + das neue Namensschema ergänzt.Kein EVAL_VERSION-Bump
Reine Benennung/Config-Erweiterung, kein Mess-Verhalten geändert:
MODEL_JUDGEdefaultet exakt auf denselben Wert wie vorherMODEL_OPUS(anthropic/claude-sonnet-4-6, sofern kein Env gesetzt), der Judge-Prompt/die Judge-Logik ist unverändert. KeinEVAL_VERSION-Bump nötig.RED-Nachweis (TDD)
Tests zuerst gegen den unveränderten
config.pygeschrieben und ausgeführt — 8 fehlschlagend wie erwartet:Nach Implementierung: alle grün (siehe unten).
Suite-Ergebnis
generative/tests/test_config.py+test_config_dead_constants.py+test_per_agent_tracking.py+test_runtime_config.py: 54 passeduv run pytest generative lib/decision_engine/tests shared/tests -q: 6165 passed, 3 skipped, 8 deselected, 33 warnings in 564s (0 Failures)uv run ruff check .: All checks passeduv run ruff format --check .: 301 files already formattedAuffälligkeiten
generative.__file__zeigte auf den Worktree (keine editable-Install-Falle)..env.exampleenthielt vor diesem PR „~5x cheaper than opus",config.pys Kommentar sagt „3x günstiger" — beim ohnehin nötigen Umschreiben dieses Kommentarblocks (neue Env-Vars daneben) die widersprüchliche Zahl entfernt statt weitergetragen; keine separate Recherche/Korrektur außerhalb des Scopes betrieben.