Skip to content

feat(config): Rollen-/Judge-Modelle klar benannt + per Env waehlbar (#317)#334

Merged
TillQuandel merged 1 commit into
masterfrom
feat/317-model-config
Jul 17, 2026
Merged

feat(config): Rollen-/Judge-Modelle klar benannt + per Env waehlbar (#317)#334
TillQuandel merged 1 commit into
masterfrom
feat/317-model-config

Conversation

@TillQuandel

Copy link
Copy Markdown
Owner

Closes #317

Problem

MODEL_OPUS (generative/config.py) defaultete real auf anthropic/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 auf MODEL_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

Alt Neu Env
MODEL_OPUS (irreführend) MODEL_MAIN ATOMIC_AGENT_MODEL_MAIN
— (hing hart an MODEL_OPUS) MODEL_JUDGE (Default = MODEL_MAIN) ATOMIC_AGENT_MODEL_JUDGE
MODEL_PLANNER (Name unverändert, Sperrzone-Import) gleich, jetzt per Env überschreibbar ATOMIC_AGENT_MODEL_PLANNER
MODEL_EXTRACTOR (Name unverändert) gleich, jetzt per Env überschreibbar ATOMIC_AGENT_MODEL_EXTRACTOR
MODEL_EXTENDER (Name unverändert) gleich, jetzt per Env überschreibbar ATOMIC_AGENT_MODEL_EXTENDER
MODEL_CANONICALIZER (Name unverändert) gleich, jetzt per Env überschreibbar ATOMIC_AGENT_MODEL_CANONICALIZER

base.py-Defaults (call_claude/call_claude_full/call_claude_async/call_claude_full_async) laufen jetzt auf MODEL_MAIN statt MODEL_OPUS. eval_quality_v4.py (Judge-Call + JSON-Reparatur-Call) läuft jetzt auf MODEL_JUDGE.

Die vier Rollen-Konstantennamen (MODEL_PLANNER/MODEL_EXTRACTOR/MODEL_EXTENDER/MODEL_CANONICALIZER) blieben absichtlich unverändert — sie sind Sperrzone-Importe in planner.py/extractor.py/canonicalizer.py, die in diesem PR nicht angefasst werden durften.

Deprecation-Pfad

MODEL_OPUS bleibt als Alias auf MODEL_MAIN bestehen (Kommentar „deprecated, nutze MODEL_MAIN"). ATOMIC_AGENT_MODEL_OPUS wird weiter als Fallback gelesen — Prioritätsreihenfolge: ATOMIC_AGENT_MODEL_MAIN > ATOMIC_AGENT_MODEL_OPUS (deprecated) > Default. Bestehende .env-Dateien mit ATOMIC_AGENT_MODEL_OPUS funktionieren dadurch unverändert weiter. Ist ATOMIC_AGENT_MODEL_OPUS gesetzt, wird zusätzlich eine DeprecationWarning ausgelöst (getestet).

Judge-Verifikation (Kernpunkt des Issues)

Geprüft, wo der Judge-Modellname in Eval-Records/DB-Feldern landet:

  • Das im Eval-Ergebnis gespeicherte model_config-Feld (eval_quality_v4.py:1045, Snapshot von MODEL_CONFIG) hat keinen eigenen judge-Eintrag — nur planner/extractor/verifier/cross_ref/critic/canonicalizer. Das war schon vor diesem PR so und ist unverändert (bewusst keine Schema-Änderung an quality_history.jsonl, siehe unten).
  • Der tatsächlich verwendete Modellstring wird aber unabhängig davon korrekt aufgezeichnet: jeder LLM-Call (inkl. Judge- und JSON-Reparatur-Call, die jetzt explizit 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_JUDGE defaultet exakt auf denselben Wert wie vorher MODEL_OPUS (anthropic/claude-sonnet-4-6, sofern kein Env gesetzt), der Judge-Prompt/die Judge-Logik ist unverändert. Kein EVAL_VERSION-Bump nötig.

RED-Nachweis (TDD)

Tests zuerst gegen den unveränderten config.py geschrieben und ausgeführt — 8 fehlschlagend wie erwartet:

FAILED test_model_main_defaults_to_sonnet - AttributeError: module 'generative.config' has no attribute 'MODEL_MAIN'
FAILED test_model_opus_alias_env_still_works - AttributeError: ... 'MODEL_MAIN'
FAILED test_model_main_env_wins_over_opus_alias - AttributeError: ... 'MODEL_MAIN'
FAILED test_model_opus_is_deprecated_alias_of_model_main - AttributeError: ... 'MODEL_MAIN'
FAILED test_model_opus_env_emits_deprecation_warning - Failed: DID NOT WARN
FAILED test_model_judge_defaults_to_model_main - AttributeError: ... 'MODEL_JUDGE'
FAILED test_model_judge_env_override_wins - AttributeError: ... 'MODEL_JUDGE'
FAILED test_role_env_override_is_independent_per_role - AssertionError (Planner-Override wirkte nicht)
8 failed, 3 passed

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 passed
  • Volle Suite uv 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 passed
  • uv run ruff format --check .: 301 files already formatted

Auffälligkeiten

  • Import-Herkunft vor Testlauf verifiziert: generative.__file__ zeigte auf den Worktree (keine editable-Install-Falle).
  • .env.example enthielt 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.

…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.
@TillQuandel
TillQuandel merged commit 1d6b9ce into master Jul 17, 2026
4 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[MITTEL] Judge-/Rollen-Modelle klar benannt und per Config wählbar machen

2 participants