Zum Inhalt

touchstone — Doku

touchstone (llm-touchstone) ist ein dünner Benchmark-Harness für lokale LLM-Endpoints. Er fährt ein festes Prompt-Set über einen OpenAI-kompatiblen Endpoint und misst zwei Hälften:

  • Performance — TTFT / Prefill-tok/s / Decode-tok/s mit Verteilung (P50/P95, CV%), in einem entkoppelten Prozess korreliert mit macOS-Speicherdruck/Throttling.
  • Qualität — eine Use-Case-Pack-Eval (deterministisch erzeugt) + optionaler LLM-as-judge (gewichtete Master-Scorecard + Sicherheits-K.-o.).

Derselbe Code läuft auf M1 (LM Studio) und M5 (mlx_lm / mlx-openai-server) — nur die Config wechselt. Output: report.md + raw.csv (Perf) bzw. ein Bundle aus responses.jsonl/scores.csv/scorecard.md (Qualität).

Wo finde ich was? (Diátaxis-Karte)

Quadrant Frage Hier
Tutorial „Ich will es einmal komplett durchspielen." tutorial.md
How-to „Wie erledige ich Aufgabe X?" how-to/
Reference „Welche Metrik/Spalte bedeutet was?" reference/metrics-and-schema.md
Explanation „Warum ist es so gebaut?" (Narrativ) explanation/design-decisions.md
Decisions „Welche Entscheidung, welche Alternativen, welche Folgen?" decisions/README.md
Historie (SDD) „Wie wurde Feature X entworfen/geplant?" superpowers/specs/ · superpowers/plans/
Konventionen / Gotchas „Wie arbeite ich hier?" ../AGENTS.md

Die vier How-to-Guides: eigenen Pack bauen · neue Maschine einrichten · Nacht-Queue fahren · Web-Steuerzentrale nutzen

Noch offen: Hero-Bild (AGENTS.md „CORE-META-03/04").

Architektur in einem Blick

Ein geteilter Daten-Kontrakt (models.py); zwei entkoppelte Producer, per Zeitstempel gemergt.

config.py    YAML → validierte Config            prompts.py  Szenarien + deterministisches Token-Padding
runner.py    stream_once() Metrik-Ableitung · run_benchmark()   client.py  EINZIGE engine-bewusste Datei
sampler.py   entkoppelter Host-Sampler (psutil/powermetrics)    merge.py   Latenz × Ressourcen per Fenster
stats.py     P50/P95 · Median · CV%              report.py   raw.csv + report.md

# Qualitäts-Hälfte (Antwort-Qualität statt Tempo):
pack.py      Use-Case-Pack (YAML→validiert): Prompts + Flags + gewichtete Dimensionen + K.-o.  (Daten, kein Code)
qualrun.py   deterministischer Lauf: Matrix → Bundle      results.py  EvalResponse · Verdict · ModelReport
judge.py     pluggable LLM-as-judge (per-Antwort + holistische Master-Dimensionen + Safety-K.-o.)
scorecard.py Gewichtung/K.-o./Kategorie-Mathe → scorecard.md   aggregate.py  Cross-Run: Hardware×Qualität
runqueue.py  Nacht-Queue: viele Modelle sequenziell als isolierte Subprozesse

# Optional (Extra [gui]): out-of-process Control-Plane, misst nie im eigenen Prozess
gui/         FastAPI-Steuerzentrale; spawnt eval/judge als Subprozess, tailt events.jsonl; runs/ = SSOT

Die tragenden Entscheidungen hinter diesen Modulen (mit Alternativen + Auswirkungen) stehen in decisions/. Konventionen, Befehle und Gotchas: ../AGENTS.md.