Zentraler, Docker- und Unraid-tauglicher Benchmark-Orchestrator fuer OpenAI-kompatible LLM-Endpunkte mit integriertem Web-Dashboard. Das Projekt vergleicht lokale und externe Modelle mit denselben Prompts, schreibt nachvollziehbare Rohdaten, erzeugt Reports fuer Menschen und liefert ein maschinenlesbares analysis_input.json fuer spaetere LLM- oder Analysten-Auswertung.
Der aktuelle Endstand ist bewusst als community-faehige Basisversion gedacht: lauffaehig fuer reale Unraid-Setups, reproduzierbar in CI, als oeffentliches GHCR-Image verteilbar und strukturiert genug, damit die Community darauf sauber weiterentwickeln kann.
Der produktionsnahe Zielbetrieb in diesem Repository ist:
- lokales Mistral-Modell ueber einen OpenAI-kompatiblen Endpoint
- lokales Qwen-Modell ueber einen OpenAI-kompatiblen Endpoint
- OpenAI als externe Referenz
Das Tool hostet diese Modelle nicht selbst. Es arbeitet als zentraler Benchmark-Orchestrator und kann auf Unraid entweder als:
- persistentes Dashboard laufen
- oder als Job-Container einen Benchmark ausfuehren und danach sauber beenden
- Benchmarkt mehrere OpenAI-kompatible Endpunkte mit identischen Testfaellen.
- Trennt Warmup-, Cold- und Warm-Runs sauber.
- Bewertet Qualitaet, Format-Treue, Latenz, Stabilitaet, Instruktionsbefolgung und Reproduzierbarkeit.
- Exportiert Rohdaten als JSONL und CSV.
- Exportiert Aggregationen als CSV, Markdown, HTML,
final_report.jsonundanalysis_input.json. - Liefert ein integriertes Web-Dashboard auf Basis derselben Ergebnisdateien.
- Kann Benchmarks direkt aus dem Dashboard starten und den Fortschritt mit Timeline, Status und Historie anzeigen.
- Enthaelt eine Live-Compare-Ansicht fuer den direkten Antwortvergleich von 2 bis 4 Modellen mit Default auf Mistral, Qwen und OpenAI.
- Fuehrt Live Compare standardmaessig seriell aus, damit CPU-lastige lokale Systeme fairere Laufzeiten liefern.
- Liefert 10 sofort nutzbare Praxis-Presets fuer Docker, Ollama, Paperless, Home Assistant, WhatsApp, YAML, Coding und Loganalyse.
- Zeigt projektbezogene Empfehlungen fuer SecondBrain, secondbrain-voice-gateway und Paperless-KIplus.
- Arbeitet robust weiter, auch wenn einzelne Endpunkte fehlschlagen, timeouts produzieren oder keine Token-Metriken liefern.
- Ist fuer Unraid-Mounts mit
/config,/app/testsund/app/resultsvorbereitet. - Unterstuetzt einen env-gesteuerten Auto-Run-Startpfad fuer Unraid.
- Bringt GitHub Actions fuer Tests und GHCR-Container-Publishing mit.
- Enthaelt Community-Health-Dateien fuer Issues, Pull Requests, Code Owners und Verhaltensregeln.
Fuer die erste oeffentliche Community-Version soll das Projekt in genau diesem Zustand nutzbar sein:
- reproduzierbare lokale und Unraid-nahe Nutzung
- veroeffentlichbares Container-Image ueber GHCR
- lesbare Dokumentation fuer Betreiber und Mitwirkende
- stabile JSON-/CSV-Artefakte fuer externe Analyse
- klare Erweiterungspunkte statt schwer entkoppelbarer Spezialpfade
Das Zielbild ist in community-end-state.md kurz als Maintainer- und Community-Referenz beschrieben.
Das integrierte Dashboard laeuft im selben Container und nutzt denselben Benchmark-Pfad wie die CLI. Es liest die vorhandenen Ergebnisdateien direkt, kann aber zusaetzlich kontrolliert einen neuen Benchmark im Hintergrund starten und dessen Status sichtbar machen.
Zusaetzlich gibt es unter /live-compare eine interaktive Live-Compare-Ansicht. Sie verwendet dieselben Modellkonfigurationen und denselben OpenAI-kompatiblen Client-Stack wie der Benchmark, sendet aber eine freie Eingabe direkt an die ausgewaehlten Modelle und zeigt die Antworten nebeneinander an.
Wichtige Fairness-Regel fuer produktive CPU-Systeme:
- Standardmodus ist
Fair Compare (seriell). - Die Modelle laufen dabei in dieser Reihenfolge:
Mistral Local,Qwen Local,OpenAI Reference. - Das vermeidet, dass zwei lokale Modelle gleichzeitig um dieselbe CPU-Zeit konkurrieren und dadurch scheinbar langsamer oder schneller wirken, als sie isoliert waeren.
Parallel Comparebleibt verfuegbar, ist aber sichtbar als potenziell unfair fuer CPU-only- oder CPU-lastige Server gekennzeichnet.
Vor dem eigentlichen Benchmark kann das Dashboard ausserdem per Button einen leichten LLM-Erreichbarkeits-Check ausfuehren. Dieser prueft fuer alle aktiven Modelle den OpenAI-kompatiblen /models-Endpunkt, inklusive Auth und Sichtbarkeit des konfigurierten Modellnamens.
Wichtiger Praxis-Hinweis fuer Qwen auf Ollama:
- Wenn ein Qwen-Thinking-Modell ueber Ollamas OpenAI-kompatible
/v1/chat/completions-Route angebunden wird, sollte in der Modellkonfiguration fuer produktionsnahe Benchmarks meistdefault_parameters.reasoning_effort: "none"gesetzt werden. - Sonst kann der Endpoint bei kleineren
max_tokens-Budgets nurreasoningliefern und ein leeres Assistant-contentzurueckgeben. - Das Benchmark-Tool erkennt diesen Fall inzwischen explizit als
empty_assistant_content, statt ihn still als normalen Validierungsfehler zu behandeln.
Verfuegbare Routen:
/dashboard/live-compare/health/api/dashboard/run/current/api/dashboard/run/history/api/dashboard/run/start/api/dashboard/connectivity/current/api/dashboard/connectivity/check/api/dashboard/summary/api/dashboard/models/api/dashboard/categories/api/dashboard/tests/api/dashboard/failures/api/dashboard/domain/api/dashboard/live-compare/api/dashboard/live-compare/current/api/dashboard/live-compare/history/api/dashboard/live-compare/<run_id>/downloads/<datei>
Das Dashboard orientiert sich optisch am Synthwave-/Dark-Design des Feberdin-Templates:
- dunkle Panels mit klarer Lesbarkeit
- starke Kartenhierarchie
- farbige Status-Badges
- kontrastreiche Tabellen
- projektbezogene Empfehlungskarten
Zusatz zu core, api_replacement, long_context und quick_compare:
secondbrainvoice_gatewaypaperless_kiplus
Die Suite secondbrain_suite.yaml testet unter anderem:
- RAG / Kontexttreue
- quellenorientierte Antworten
- strukturierte Query-JSONs
- Dokument- und Mail-Zusammenfassungen
- Fakt- und Metadatenextraktion
- Prompt-Injection-Abwehr
- Home-Assistant-Kontext
- WhatsApp-Kommunikation
- Banking- und Salary-Kontext
Die Suite voice_gateway_suite.yaml testet unter anderem:
- Routing-Klassifikation
- Prefix-Priorisierung
- kurze Alexa-Antworten
- Backend-/Tool-Selektion
- Ambiguitaetsbehandlung
- Home-Assistant-Action-Safety
- Docker-Ops-Sprachantworten
- Troubleshooting-Kurzantworten
- Latest-Mail-Shortcut
Die Suite paperless_kiplus_suite.yaml testet unter anderem:
- Dokumentklassifikation
- strikte JSON-/Schema-Treue
- YAML-Generierung
- Precheck-/Skip-/Duplicate-Entscheidungen
- AI-Notes
- produktive Runtime-Defaults
- Tax Enrichment
- Review-Flags und Unsicherheit
- sparsame Tagging-Empfehlungen
Das Projekt bleibt bewusst in einer einzigen Architektur:
configLaedt YAML/JSON-Konfigurationen und expandiert${ENV_VAR}-Platzhalter.domainEnthaelt die stabilen Typmodelle fuer Testfaelle, Responses und Ergebnisdatensaetze.clientsSpricht OpenAI-kompatible Chat-Completions-Endpunkte an, inklusive Retry-Logik und optionaler TTFT-Messung.validationPrueft JSON, YAML, JSON-Schema, Pflichtfelder, Tool-Calls und Instruktionsregeln transparent.runnerOrchestriert Wiederholungen, Warmups, Fehlerisolation und Scoring.reportingBaut CSV-, Markdown-, HTML-, Final-JSON- und Analyse-JSON-Reports.dashboardServiert das Web-Dashboard direkt aus den vorhandenen Ergebnisdateien, kann neue Runs im Hintergrund starten und bietet zusaetzlich Live Compare fuer direkte Modellantworten.
Wichtige Architekturentscheidung:
- Kein zweiter Datenpfad fuer das Dashboard
Das Dashboard liest
final_report.json,analysis_input.jsonundraw_runs.jsonldirekt. Dadurch bleiben CLI, Reports und Web immer konsistent.
.
├── .github
│ ├── ISSUE_TEMPLATE
│ ├── workflows
│ ├── CODEOWNERS
│ └── PULL_REQUEST_TEMPLATE.md
├── Dockerfile
├── docker-compose.yml
├── .env.example
├── README.md
├── CONTRIBUTING.md
├── SECURITY.md
├── CODE_OF_CONDUCT.md
├── CHANGELOG.md
├── docs
│ └── community-end-state.md
├── docker
│ ├── entrypoint.sh
│ └── icon.svg
├── fixtures
│ ├── config
│ │ ├── config.example.yaml
│ │ └── config.unraid.example.yaml
│ ├── suites
│ │ ├── quick_compare.yaml
│ │ ├── secondbrain_suite.yaml
│ │ ├── voice_gateway_suite.yaml
│ │ └── paperless_kiplus_suite.yaml
│ ├── live_compare
│ │ └── presets.yaml
│ └── tests
│ ├── 001_chat_cap_theorem.yaml
│ ├── ...
│ ├── 101_quick_chat_triage.yaml
│ ├── ...
│ └── domain
│ ├── secondbrain
│ ├── voice_gateway
│ └── paperless_kiplus
├── src
│ └── llm_benchmark
│ ├── cli.py
│ ├── clients
│ ├── config
│ ├── dashboard
│ │ ├── app.py
│ │ ├── service.py
│ │ ├── templates
│ │ └── static
│ ├── domain
│ ├── reporting
│ ├── runner
│ ├── templates
│ ├── validation
│ └── utils.py
├── tests
│ ├── test_loader_and_validation.py
│ ├── test_scoring_and_reporting.py
│ └── test_dashboard_service.py
└── unraid
└── llm-benchmark.xml
Die produktionsnahe Unraid-Beispielkonfiguration unter config.unraid.example.yaml nutzt bewusst konservative Defaults:
concurrency: 1Grund: Grosse lokale Modelle blockieren auf CPU-Systemen sonst schnell das ganze System.warmup_runs: 1Grund: Der erste echte Vergleich soll Cache- und Initialisierungseffekte sichtbar machen, aber nicht unnoetig Zeit verbrennen.default_repetitions: 2Grund: Reproduzierbarkeit wird sichtbar, ohne dass die Laufzeit explodiert.default_timeout_seconds: 300Grund: Lokale CPU-Inferenz kann deutlich langsamer sein als Cloud-APIs.max_retries: 2Grund: Genug fuer kurzzeitige Netzwerk- oder Busy-Fehler, aber nicht so viel, dass instabile Endpunkte schoen gerechnet werden.retry_backoff_seconds: 2.0Grund: Exponentieller Backoff von 2s auf 4s und 8s ist defensiv fuer lokale und externe Endpunkte.temperature: 0.0undtop_p: 1.0Grund: Benchmarking soll moeglichst deterministisch und fair bleiben.stream_for_ttft: falseGrund: Nicht alle lokalen OpenAI-kompatiblen Runtimes liefern Streaming-Telemetrie konsistent.max_output_tokensKurztests typischerweise 90 bis 180, strukturierte Tests 120 bis 260, YAML-Test bewusst hoeher.
Empfohlene Host-Struktur:
/mnt/user/appdata/llm-benchmark/
├── config/
│ └── config.unraid.example.yaml
├── results/
│ ├── raw_runs.jsonl
│ ├── raw_runs.csv
│ ├── summary_by_model.csv
│ ├── summary_by_category.csv
│ ├── final_report.json
│ ├── final_report.md
│ ├── final_report.html
│ └── analysis_input.json
├── tests/
│ ├── 001_chat_cap_theorem.yaml
│ ├── ...
│ └── domain/
│ ├── secondbrain/
│ ├── voice_gateway/
│ └── paperless_kiplus/
├── suites/
│ ├── quick_compare.yaml
│ ├── secondbrain_suite.yaml
│ ├── voice_gateway_suite.yaml
│ └── paperless_kiplus_suite.yaml
└── logs/
config/Persistente YAML-Konfigurationen. Diese Dateien passt der Benutzer aktiv an.results/Vom Container erzeugte Reports und Rohdaten. Dieser Ordner muss persistent sein.tests/Ausfuehrbare Benchmark-Testdateien plus synthetische Domain-Fixtures. Dieser Ordner sollte persistent sein.suites/Suite-Manifeste zur Dokumentation und internen Versionierung.logs/Optional. Standardmaessig loggt der Container nach STDOUT.
/mnt/user/appdata/llm-benchmark/config/mnt/user/appdata/llm-benchmark/results/mnt/user/appdata/llm-benchmark/tests
raw_runs.jsonlraw_runs.csvsummary_by_model.csvsummary_by_category.csvfinal_report.jsonfinal_report.mdfinal_report.htmlanalysis_input.json
config/config.unraid.example.yamloder eine abgeleitete eigene Config- eigene oder angepasste Testfaelle unter
tests/ - optional Suite-Manifeste unter
suites/
Die Vorlage liegt unter llm-benchmark.xml.
Wichtige Eigenschaften:
- direkte Mounts fuer
/config,/app/results,/app/tests - Repository zeigt auf
ghcr.io/feberdin/llm-benchmark:latest - optionaler Dashboard-Port
8080 BENCHMARK_ACTION=dashboardals sinnvoller Default fuer persistenten BetriebBENCHMARK_ACTION=runfuer One-Shot-Benchmark-Jobs- WebUI zeigt auf
/dashboard
Die produktionsnahe Drei-Modell-Konfiguration liegt unter config.unraid.example.yaml.
Sie enthaelt:
mistral_localqwen_localopenai_reference
Dort ist klar kommentiert:
- wo
model_namegeaendert wird - wo
base_urlgeaendert wird - wie ein Modell per
enabled: falsedeaktiviert wird - wie
timeout_secondspro Modell gesetzt werden - wie globale und modellbezogene
default_parametersueberschrieben werden
Nach einem Lauf entstehen mindestens:
results/raw_runs.jsonlresults/raw_runs.csvresults/summary_by_model.csvresults/summary_by_category.csvresults/final_report.jsonresults/final_report.mdresults/final_report.htmlresults/analysis_input.json
Zusaetzlich erzeugt die Live-Compare-Ansicht eigene persistente Dateien unter:
results/live_compare/current_state.jsonresults/live_compare/history.jsonresults/live_compare/runs/<run_id>.json
Diese Dateien enthalten jetzt auch:
execution_modeexecution_ordermanual_notequeue_wait_msexecution_start_atexecution_end_atisolated_duration_mstotal_elapsed_since_run_start_ms
Fuer normale Benchmarklaeufe gibt es zusaetzlich pro Run eigene Snapshot-Artefakte unter:
results/history/<benchmark_run_id>/raw_runs.jsonlresults/history/<benchmark_run_id>/raw_runs.csvresults/history/<benchmark_run_id>/summary_by_model.csvresults/history/<benchmark_run_id>/summary_by_category.csvresults/history/<benchmark_run_id>/final_report.jsonresults/history/<benchmark_run_id>/final_report.mdresults/history/<benchmark_run_id>/final_report.htmlresults/history/<benchmark_run_id>/analysis_input.json
Das Dashboard zeigt diese Snapshots jetzt direkt im Run-Verlauf als separate Download-Links an. Damit kannst du einzelne Laeufe gezielt sichern oder teilen, ohne die aktuellen Hauptdateien manuell kopieren zu muessen.
Dieses Artefakt ist fuer Menschen und strukturierte Tools gedacht und enthaelt unter anderem:
benchmark_infoenvironment_infomodelstest_suitesaggregate_scoresrankingsstrengthsweaknessesanomaliesfailed_runsrecommendations
Dieses Artefakt ist speziell als Input fuer ein spaeteres Analyse-LLM gedacht. Es enthaelt jetzt unter anderem:
benchmark_metadatahardware_and_environment_hintsmodel_rankingsspeed_summarycategory_findingsaggregate_scoresrepo_recommendationsbest_model_for_secondbrainbest_model_for_voice_gatewaybest_model_for_paperless_kiplussecurity_behavior_summarystructured_output_summaryvoice_response_summarytax_enrichment_summaryrepresentative_failuresrepresentative_success_examplesmodel_cards
Config validieren:
benchmark validate-config --config /config/config.unraid.example.yamlModelle auflisten:
benchmark list-models --config /config/config.unraid.example.yamlTests der Quick-Compare-Suite auflisten:
benchmark list-tests --tests-dir /app/tests --suite quick_compareSecondBrain-Suite auflisten:
benchmark list-tests --tests-dir /app/tests --suite secondbrainQuick Compare ausfuehren:
benchmark run --config /config/config.unraid.example.yaml --suite quick_compare --tests-dir /app/tests --results-dir /app/resultsSecondBrain-Suite ausfuehren:
benchmark run --config /config/config.unraid.example.yaml --suite secondbrain --tests-dir /app/tests --results-dir /app/resultsVoice-Gateway-Suite ausfuehren:
benchmark run --config /config/config.unraid.example.yaml --suite voice_gateway --tests-dir /app/tests --results-dir /app/resultsPaperless-KIplus-Suite ausfuehren:
benchmark run --config /config/config.unraid.example.yaml --suite paperless_kiplus --tests-dir /app/tests --results-dir /app/resultsReport aus vorhandenem JSONL neu erzeugen:
benchmark report --input /app/results/raw_runs.jsonl --output /app/resultsDashboard starten:
benchmark dashboard --config /config/config.unraid.example.yaml --tests-dir /app/tests --results-dir /app/results --host 0.0.0.0 --port 8080GHCR-Image direkt nutzen:
docker pull ghcr.io/feberdin/llm-benchmark:latestLive Compare im Browser nutzen:
http://<host>:8080/live-compare
python3 -m venv .venv
. .venv/bin/activate
.venv/bin/pip install -e ".[dev]".venv/bin/python -m pytest -qbenchmark dashboard --config fixtures/config/config.example.yaml --tests-dir fixtures/tests --results-dir results --port 8080Das Compose-Setup startet standardmaessig das Dashboard:
docker compose up -d llm-benchmarkFuer ein reines Registry-Setup ohne lokales Bauen kannst du stattdessen direkt das veroeffentlichte GHCR-Image verwenden:
docker run --rm ghcr.io/feberdin/llm-benchmark:latest --helpBenchmark-Lauf parallel oder manuell:
docker compose run --rm llm-benchmark run --config /config/config.example.yaml --suite quick_compare --tests-dir /app/tests --results-dir /app/resultsmkdir -p /mnt/user/appdata/llm-benchmark/config
mkdir -p /mnt/user/appdata/llm-benchmark/results
mkdir -p /mnt/user/appdata/llm-benchmark/tests
mkdir -p /mnt/user/appdata/llm-benchmark/suites
mkdir -p /mnt/user/appdata/llm-benchmark/logsKopiere config.unraid.example.yaml nach:
/mnt/user/appdata/llm-benchmark/config/config.unraid.example.yaml
Passe dann mindestens an:
MISTRAL_BASE_URLQWEN_BASE_URLMISTRAL_MODEL_NAMEQWEN_MODEL_NAME- optional
OPENAI_MODEL_NAME
Kopiere:
- Inhalte aus
fixtures/tests/nach/mnt/user/appdata/llm-benchmark/tests/ - Inhalte aus
fixtures/suites/nach/mnt/user/appdata/llm-benchmark/suites/
Fuer den ersten produktiven Lauf reichen die fuenf quick_compare-Dateien. Fuer projektspezifische Entscheidungen kopierst du zusaetzlich die drei Domain-Unterordner unter tests/domain/.
Im Unraid-Template oder Container-Setup:
OPENAI_API_KEYsetzenOPENAI_BASE_URLnur aendern, wenn du nicht direkt gegen OpenAI testest
Importiere llm-benchmark.xml oder uebernimm dessen Felder manuell.
Wichtig:
- Die XML zeigt jetzt auf das oeffentliche GHCR-Image
ghcr.io/feberdin/llm-benchmark:latest. - Fuer lokale Entwickler-Builds kannst du das Repository-Feld in Unraid trotzdem auf ein eigenes Test-Image ueberschreiben.
Fuer den persistenten Dashboard-Betrieb:
BENCHMARK_AUTO_RUN=trueBENCHMARK_ACTION=dashboardBENCHMARK_CONFIG=/config/config.unraid.example.yamlDASHBOARD_PORT=8080
Dann ist das Dashboard unter http://<unraid-ip>:8080/dashboard erreichbar.
Bevorzugter Weg auf Unraid:
- Dashboard unter
http://<unraid-ip>:8080/dashboardoeffnen. - Im Bereich
Run Controlzuerst optionalLLM-Erreichbarkeit pruefenklicken. - Danach die Suite
quick_comparewaehlen. Benchmark startenklicken.- Timeline, Fortschrittsbalken und Historie im selben Webinterface verfolgen.
- Nach Abschluss aktualisiert das Dashboard die Reports automatisch.
Alternative fuer CLI/Terminal:
benchmark run --config /config/config.unraid.example.yaml --suite quick_compare --tests-dir /app/tests --results-dir /app/resultsHinweis:
docker run --rm ... run ...ist weiterhin moeglich, aber unkomfortabler fuer Unraid, weil der Job-Container nach Abschluss sofort verschwindet.- Fuer produktiven Betrieb ist
BENCHMARK_ACTION=dashboardals dauerhafter Container die angenehmere Variante.
http://<unraid-ip>:8080/live-compareoeffnen.- Oben eine echte Alltagsfrage oder ein Log/Prompt eintragen.
- Optional einen kurzen System-Prompt hinterlegen.
- Standardmaessig bleiben
Mistral Local,Qwen LocalundOpenAI Referenceaktiviert. - Einen Ausfuehrungsmodus waehlen. Standard ist
Fair Compare (seriell). - Optional eine kurze manuelle Notiz wie
Mistral wirkt vorsichtiger bei Faktenfragenhinterlegen. Alle 3 vergleichenklicken.- Die drei Antwortkarten zeigen live Status, isolierte Dauer, Queue-Wartezeit, Token-Metriken, Fehler und die eigentliche Antwort.
- Fruehere Vergleiche bleiben unter
results/live_compare/und in der History auf der Seite erhalten.
Die Artefakte liegen unter:
/mnt/user/appdata/llm-benchmark/results/
Besonders wichtig:
summary_by_model.csvsummary_by_category.csvfinal_report.htmlfinal_report.jsonanalysis_input.jsonhistory/<benchmark_run_id>/...fuer laufspezifische Snapshots und Downloadslive_compare/history.jsonlive_compare/runs/<run_id>.json
Praktische Reihenfolge:
- Dashboard
Overviewfuer schnellen Gesamtblick Modelsfuer Score-Karten, Median und p95Domainsfuer projektbezogene EmpfehlungenFailuresfuer Timeouts, Schema-Drift und Sicherheitsproblemeanalysis_input.json, wenn spaeter ein anderes LLM die Ergebnisse auswerten sollLive Compare, wenn du vor einer echten Modellentscheidung die Antwortqualitaet direkt nebeneinander sehen willst
Die Live-Compare-Ansicht ist fuer die schnelle Alltagsentscheidung gedacht: "Welches Modell wuerde ich fuer genau diese konkrete Frage bevorzugen?"
Standardmaessig werden diese drei Modelle vorausgewaehlt:
Mistral LocalQwen LocalOpenAI Reference
Der Standardmodus ist jetzt bewusst:
Fair Compare (seriell)
Warum:
- Auf CPU-lastigen lokalen Servern verfaelschen parallele Requests die Laufzeiten stark.
- Zwei lokale Modelle, die gleichzeitig rechnen, teilen sich dieselben CPU-Ressourcen und wirken dadurch kuenstlich langsamer.
- Serielle Ausfuehrung liefert fuer
isolated_duration_msdie deutlich belastbarere Vergleichsmetrik.
Verfuegbare Modi:
Fair Compare (seriell)Modelle laufen nacheinander in der festen ReihenfolgeMistral Local,Qwen Local,OpenAI Reference.Parallel CompareAlle ausgewaehlten Modelle starten moeglichst gleichzeitig. Das ist praktisch fuer grobe Antwortvergleiche, aber fuer lokale CPU-Latenzen oft unfair.
Die Ansicht zeigt pro Modellspalte:
- Status
waiting,running,finishedoderfailed - Start- und Endzeit
isolated_duration_msals wichtigste faire Laufzeitmetrikqueue_wait_mstotal_elapsed_since_run_start_ms- optional
ttft_ms - optional
input_tokens,output_tokensundtokens_per_second - HTTP-Status
- optionale JSON-Vorschau bei strukturierter Antwort
- kompakte Fehlerkarte mit einklappbaren technischen Details
- Quick-Badges wie
fastest,shortest-response,json-detected,yaml-detected,code-detectedoderuncertainty-marked
Die Presets liegen unter presets.yaml und koennen direkt in das Prompt-Feld geladen werden.
Faktenfrage mit UnsicherheitsdisziplinPrueft, ob ein Modell sauber zwischen Wissen und Unsicherheit trennt.Docker-FehleranalysePraxisnaher GHCR-/Docker-/Unraid-Support-Fall.Ollama TroubleshootingStrukturierte Fehlersuche fuer lokale CPU-only-Inferenz.Paperless DokumentklassifikationJSON-Treue fuer dokumentnahe Workflows.Steuerliche Einordnung vorsichtigKonservative Tax-Enrichment-Naeherung ohne ueberzogene Sicherheit.Home Assistant StatusinterpretationKurze, sprachgeeignete Zusammenfassung fuer Voice-/HA-Szenarien.WhatsApp GespraechsauswertungKommunikations- und SecondBrain-nahe Extraktion.YAML Konfiguration robustStrukturausgabe und Konfigurationsdisziplin ohne Markdown-Huelle.Python Coding TestKleine Coding-Aufgabe mit Funktion und pytest-Test.Loganalyse mit Ursache und MassnahmenStrukturierte Root-Cause- und Next-Step-Antwort fuer echte Betriebsfehler.
Persistenz:
- Jeder Live-Compare-Lauf wird als eigenes JSON unter
results/live_compare/runs/gespeichert. - Die History-Liste auf der Seite liest diese lauffaehigen Persistenzdaten wieder ein.
- Eine optionale manuelle Notiz wird zusammen mit dem Lauf gespeichert.
Grenzen der Aussagekraft:
- Live Compare ist absichtlich weniger streng als der Benchmark und bewertet nicht automatisch dieselbe Regeltiefe wie eine Test-Suite.
- Lokale CPU-Modelle koennen im parallelen Direktvergleich deutlich langsamer sein als bei einem isolierten Einzelrequest.
- Fuer CPU-lastige lokale Hardware ist
Fair Compare (seriell)die empfohlene Standardwahl. - Token- und TTFT-Metriken sind providerabhaengig und nicht bei jedem Endpoint verfuegbar.
- Ein besonders gutes Live-Compare-Ergebnis ersetzt keine projektspezifische Suite wie
secondbrain,voice_gatewayoderpaperless_kiplus.
SecondBrainAchte besonders auf Kontexttreue, Zitationsdisziplin, Sicherheitsgehorsam und konservative Extraktion.secondbrain-voice-gatewayAchte besonders auf exakte Routing-Disziplin, kurze sprechbare Antworten und sichere Allowlist-Beachtung.Paperless-KIplusAchte besonders auf strikte JSON-/YAML-Treue, konservative Entscheidungen, Review-Flags und Tax-Enrichment-Sicherheit.
Ein hohes Gesamtranking allein reicht nicht. Fuer produktive Auswahlentscheidungen solltest du immer:
- die jeweilige Repo-Suite
- die Failure-Ansicht
- die strukturierten Teilzusammenfassungen in
analysis_input.json
gemeinsam lesen.
- Identische Prompts und Token-Budgets machen den Vergleich fairer, aber nicht perfekt.
- Externes Prompt-Caching oder providerseitige Optimierungen koennen Antworten und Latenz beeinflussen.
- OpenAI-Modelle liefern mitunter stabilere Token-Metriken als lokale OpenAI-kompatible Runtimes.
- Lokale CPU-basierte Inferenz kann stark schwankende Latenzen erzeugen.
- Fehlende Token-Metriken werden nicht geraten, sondern bleiben leer.
- Streaming/TTFT ist optional und nur dann aussagekraeftig, wenn alle verglichenen Backends aehnlich streamen.
Config validation failedPruefe Pfade,${ENV_VAR}-Platzhalter und Modell-IDs.Tests directory does not existPruefe den Mount fuer/app/tests.- Run startet im Dashboard nicht
Pruefe die Preflight-Hinweise im Bereich
Run Control. Ein leeres Unraid-Mount auf/app/testsueberdeckt die eingebauten Fixture-Tests im Container. Missing required API key environment variablesPruefeOPENAI_API_KEYoder andere referenzierte Secret-Variablen.- Viele
json_parse_failedoderyaml_parse_failedDas Modell verletzt die geforderte Format-Treue; schaue inraw_runs.jsonl,final_report.jsonund DashboardTests. - Lokales Modell ist sehr langsam
Erhoehe nicht zuerst die Parallelisierung. Pruefe lieber Quantisierung, Runtime-Flags, CPU-Last und
timeout_seconds. - Dashboard zeigt keine Daten
Pruefe, ob
final_report.json,analysis_input.jsonundraw_runs.jsonlin/app/resultsliegen oder starte den ersten Lauf direkt im Dashboard.
- CLI und Container verstehen
--debugbzw.BENCHMARK_DEBUG=true - Standard-Log-Level ueber
LOG_LEVEL=INFOoderLOG_LEVEL=DEBUG - Wichtige Laufzeitdetails landen in:
- Container-Logs
raw_runs.jsonlfinal_report.jsonanalysis_input.json
- CI prueft derzeit Python-Tests, Fixture-Smokes und den Container-Build.
- Container-Releases gehen ueber GitHub Actions nach GHCR.
- Fuer Bugs und Erweiterungen liegen strukturierte GitHub-Issue-Templates bereit.
- Pull Requests nutzen eine feste Checkliste, damit Report-Schema, Doku und Tests nicht vergessen werden.
- Repository-weite Verantwortlichkeit ist ueber CODEOWNERS beschrieben.
- API-Keys nie in YAML committen. Verwende
api_key_envplus Umgebungsvariable. - Lokale Modellendpunkte sollten nur im vertrauenswuerdigen Netz erreichbar sein.
- Das Dashboard ist fuer internes Betriebsnetz gedacht und sollte nicht ohne Reverse Proxy, Authentifizierung und Netzwerkgrenzen oeffentlich exponiert werden.
- Secrets werden in Umgebungs-Metadaten nur maskiert dargestellt.
Siehe LICENSE.