Zum Inhalt springen

LLM-Auswahl über den Modellkatalog und ein gemeinsamer Aufrufweg

Status: angenommen. Datum: 03.11.2026, überarbeitet am 04.11.2026 (Ersatzmodell, Rückfrage bei abgelehnten Antworten).

Anlass

Das Team will Claude (Anthropic) vor allem für die Kriterienanalyse erproben. Die Sprachmodelle waren an Google und OpenAI gebunden. Kriterienanalyse und Projekt-Extraktion riefen Gemini je mit eigenem Code über google-genai auf, mit doppelter Upload- und Abbruchlogik. Modellnamen standen verstreut in sechs Umgebungsvariablen, und nur der Chat las die Modellwahl aus der Datenbank.

Entscheidung

  • Die Modellwahl liegt in der Datenbank. Plattform-Admins pflegen den Katalog procur_regx.llm_models in der Oberfläche; das Hinzufügen prüft das Modell live. platform_settings.agent_model_id gilt für Chat, Zusammenfassung langer Chats, Zertifikatserkennung und Website-Import, platform_settings.criteria_model_id für Kriterienanalyse, Projekt-Extraktion und Dokumentanalyse.
  • Anbieter sind google, openai und anthropic. OpenAI-kompatible Endpunkte laufen über openai mit OPENAI_BASE_URL. Schlüssel und Base-URLs stehen nur in der Umgebung, nie in der Datenbank oder in API-Anfragen.
  • Die Umgebung enthält genau ein Ersatzmodell: LLM_MODEL im Format anbieter:modell, Standard google:gemini-3.8-flash. Es gilt, wenn für einen Zweck nichts gewählt ist. Ein Wert ohne Anbieter stoppt den Start. Ist für das gewählte Modell kein Schlüssel gesetzt, schlägt der Aufruf fehl; ein anderer Anbieter springt nicht ein. Ebenso bricht die Kriterienanalyse ab, wenn die Auswahl wegen eines Datenbankfehlers nicht lesbar ist; nur die noch nicht migrierte Spalte zählt als „nichts gewählt“. Der Standard ist Gemini und nicht Claude, weil Claude Haiku 5.5 in der Kriterienanalyse noch nicht verlässlich arbeitet (siehe Folgen); Claude bleibt im Katalog für jeden Zweck wählbar.
  • Alle strukturierten Dokumentauswertungen laufen über criteria_extraction/service.generate() und die direkten Aufrufe von Pydantic AI: genau eine Anfrage mit strukturierter Ausgabe, bei Claude gestreamt. Gemini erzwingt das Schema beim Generieren. OpenAI erhält es als Antwortformat, aber nicht im Strict-Modus, weil unsere Schemas dessen Regeln nicht erfüllen; es ist also nicht erzwungen. Claude erhält es in den Anweisungen, weil Anthropic strikte Schemas in eine Grammatik übersetzt, deren Größengrenze fünf der sechs Schemas überschreiten; die Antwort wird danach wie bei allen Anbietern mit Pydantic validiert. Ein weggelassenes Feld, das leer sein darf, und ein unbekanntes Feld mit dem Wert null gelten dabei als leer, weil beide keinen Inhalt tragen; alles andere bleibt streng. Scheitern Validierung oder die Abschlussprüfung des Schritts, fragt generate() einmal mit der Fehlerliste nach; eine zweite Ablehnung lässt den Schritt scheitern. Anbieterspezifisch bleiben sonst nur Vorbereitungsschritte: Gemini lädt große Dateien über die Files API hoch und nutzt einen expliziten Prompt-Cache, Claude markiert den System-Prompt für das Prompt-Caching.
  • Ein Kriterienlauf speichert beim Anlegen sein Modell als anbieter:modell und behält es beim Fortsetzen. Modellaufrufe in Kriterienläufen wiederholt bei 429, 5xx und verlorener Verbindung allein der Worker; Gemini-Uploads behalten die Wiederholungen des SDK. So wird kein Aufruf auf zwei Ebenen wiederholt.

Folgen

  • Ein Modellwechsel braucht keine Codeänderung; nur MODEL_CONTEXT_WINDOW für die Kontextanzeige des Chats bleibt ein Handwert in der Umgebung. Entfallen sind MODEL_PROVIDER, AGENT_GOOGLE_LLM_MODEL, AGENT_SUMMARY_LLM_MODEL (im Agenten) und CRITERIA_V2_MODEL. Alte .env-Werte ohne Anbieter-Präfix stoppen den Start mit einer Meldung.
  • Der Agent startet nur, wenn LLM_MODEL auf einen Anbieter mit Schlüssel zeigt; mit dem Standard ist das GOOGLE_API_KEY, der ohnehin für Embeddings und Transkription nötig ist. ANTHROPIC_API_KEY braucht er erst, wenn ein Claude-Modell gewählt ist.
  • Claude erhält Dokumente direkt in der Anfrage: höchstens 600 PDF-Seiten und 128 MB. Größere Bestände scheitern vor dem Aufruf; gekürzt wird nichts.
  • Das Nutzungsprotokoll weist Kosten nur für Modelle mit hinterlegtem Preis aus (Gemini 3.8 Flash), für Claude nur Tokens.
  • Gemini über Pydantic AI formt Schemas leicht anders um als der direkte SDK-Aufruf. Vergleichsläufe auf denselben Unterlagen sichern die Ergebnisqualität ab.
  • Prompts sind auf Gemini abgestimmt; die Qualität anderer Modelle ist zu messen.
  • Ohne erzwungenes Schema scheitern Claude-Antworten häufig an der Validierung. Eine Messung am 04.11.2026 mit Claude Haiku 5.5 im Dokumentschritt (drei TED-Bekanntmachungen mit 5, 8 und 18 Seiten, je 4 Läufe pro Stufe, noch ohne Rückfrage) ergab bei Thinking low 3 von 12 gültige Antworten ohne jedes Denken und bei medium 5 von 12; zwei medium-Läufe auf derselben Bekanntmachung endeten auch nach 420 s und 900 s nicht. Die Fehler sind weggelassene Pflichtfelder, erfundene Felder mit dem Wert null und Bezeichnungen aus einer fremden Kategorie. Thinking low ist für Claude keine Abhilfe: Es denkt dann gar nicht und findet in großen Bekanntmachungen deutlich weniger Kriterien.
  • Mit Bereinigung und Rückfrage waren in 9 Läufen (medium, Zeitlimit 360 s) alle 8 beendeten Antworten gültig, schon ohne Rückfrage. Offen bleiben Läufe, in denen Claude trotz medium nicht denkt: Einer fand in der 18-Seiten-Bekanntmachung 5 statt 24 bis 48 Kriterien, gültig, aber unvollständig. Für die Kriterienanalyse bleibt Gemini deshalb die Empfehlung, bis Claude in Vergleichsläufen gleichwertig abschneidet.
  • Hänger: 4 von 33 nicht gestreamten Läufen im Produktionspfad warteten bis zum Zeitlimit, obwohl 50 000 Tokens nach etwa 190 s erreicht sind. Der Auslöser ist nicht belegt, ließ sich am 05.11.2026 nicht wiederholen und ist nicht die Laufzeit (auch 190 s stumm liefen sauber durch). Mehrfach starben aber parallele Verbindungen im selben Moment; eine stumme Anfrage kann das nur am Zeitlimit bemerken. Deshalb streamt Claude, Stille über 120 s gilt als tote Verbindung (Anthropic pingt alle 30 s), und der Worker wiederholt verlorene Verbindungen. 9 von 9 Läufen, die der Verbindungsverlust nicht traf, und die 38-Seiten-Bekanntmachung liefen so sauber.
  • Thinking high ist für Haiku 5.5 unbrauchbar: In 12 von 12 Läufen verbrauchte das Denken das Budget von 50 000 Tokens, fast ohne Antworttext.
  • Eine Rückfrage sendet Dokumente und Anweisungen erneut, kostet also einen zweiten Aufruf und erhält ein eigenes Zeitfenster; das Nutzungsprotokoll zählt beide Aufrufe.