Selbstverbesserndes, personalisiertes Morning Briefing — lokal-first in Rust, mit lokalen LLMs. Siehe SPEC.md · Projektseite ↗
Stand: M1–M6 ✓ — vollständige Pipeline plus Selbstverbesserung auf drei Achsen (Gewichte, Prompts, Quellen), jede abgesichert. Anti-Blase-Sektionen (Gegenperspektive, Wildcard) sind nicht abschaltbar. Build + Tests grün unter Rust 1.95 / Edition 2024.
- Rust (1.80+)
- Ollama lokal laufend, mit den Modellen aus
config/profile.toml:
ollama pull qwen2.5:14b # Massen-Tier (Enrich)
ollama pull llama3.3:70b # Synthese-Tier (TL;DR)Auf kleinerer Hardware kleinere Modelle eintragen (z.B.
llama3.1:8bfür beide).
cargo run -p ibrief-app # = `brief`: Briefing erzeugen
cargo run -p ibrief-app -- brief ./configErgebnis: out/briefing-YYYY-MM-DD.md (+ stdout) und Persistenz in ibrief.db
(Items werden dedupliziert — bereits gesehene erscheinen nicht erneut).
- Bot bei @BotFather anlegen, Token holen.
chat_idinconfig/profile.tomlsetzen,enabled = true.- Token als Env-Var bereitstellen und beide Prozesse starten:
export IBRIEF_TELEGRAM_TOKEN=123456:ABC...
cargo run -p ibrief-app -- brief # pusht das Briefing mit 👍/👎-Buttons
cargo run -p ibrief-app -- feedback # Long-Polling: Klicks → ibrief.db (Tabelle feedback)Die erfassten 👍/👎 sind die Datengrundlage für den Lern-Loop ab M3/M4.
| Crate | Zweck |
|---|---|
ibrief-core |
Domänentypen (ContentItem, Briefing, …) |
ibrief-llm |
LanguageModel-Trait + Backends: OllamaClient (lokal), ClaudeCodeModel (Abo via claude -p) |
ibrief-ingest |
RSS/Atom-Fetch (feed-rs) |
ibrief-pipeline |
Stages: Enrich, Curate, Render |
ibrief-store |
SQLite (sqlx): Content, Briefing-Records, Feedback, Evals, Dedup |
ibrief-telegram |
Telegram-Push + Feedback-Buttons (Bot-API via reqwest) |
ibrief-eval |
Eval Engine: Verhaltens-Score + LLM-Judge + Strukturchecks |
ibrief-learn |
Gewichts-Lernen: Thompson-Sampling + Safety Gate + A/B-Entscheidung + Config-Versionierung |
ibrief-optimize |
Prompt-Optimierung: Optimizer-LLM + Schatten-Test + Prompt-Versionierung |
ibrief-sources |
Quellen-Evolution: Qualitäts-Scoring + Pruning + Drift-Wächter |
ibrief-research |
AutoResearch (§14): gated Loop + Beleg-Verifikation über lokalen Korpus |
ibrief-app |
Binary ibrief (brief/feedback/eval/learn/config/optimize/experiment/sources/research) |
cargo run -p ibrief-app -- eval # heutiges Briefing bewerten (Judge lokal)
cargo run -p ibrief-app -- eval 2026-06-28 # bestimmtes Datum
cargo run -p ibrief-app -- eval calibrate # Judge via Abo (claude -p) statt lokalErgebnis: total-Note (0–1) aus behavior/judge/structure (Gewichte 0.5/0.3/0.2),
gespeichert in der evals-Tabelle pro date × config_version. Diagnose-Notizen inklusive.
cargo run -p ibrief-app -- learn # Gewichte aus Feedback lernen (Thompson + Safety Gate)
cargo run -p ibrief-app -- config list # Config-Historie (aktive mit * markiert)
cargo run -p ibrief-app -- config rollback cfg-xxxx # auf frühere Version zurücklearn aggregiert das Feedback je Quelle/Thema, sampelt neue Gewichte (Beta/Thompson,
geklemmt auf [0.2, 2.0] → Exploration-Floor gegen Aussterben), prüft das Safety Gate
(Grenzen + Quellen-Diversität) und übernimmt nur bei PASS als neue, versionierte Config.
brief nutzt die aktive Config beim Ranking (recency × source_weight × topic_weight).
cargo run -p ibrief-app -- optimize 2026-06-28 # TL;DR-Prompt im Schatten-Test verbessern
cargo run -p ibrief-app -- optimize 2026-06-28 calibrate # Optimizer+Judge via Abo (claude -p)
cargo run -p ibrief-app -- experiment list # A/B-Experiment-HistorieEin Optimizer-LLM erzeugt eine Prompt-Variante; im Schatten-Test rendern aktiver und
Kandidaten-Prompt dasselbe Beispiel-Briefing, der Judge bewertet beide. Nur bei klarem
Vorsprung (Marge 0.05) wird der Kandidat neue, versionierte Default-Prompt-Version.
brief nutzt stets den aktiven Prompt. Die temporale A/B-Entscheidung
(ibrief-learn::ab_decision) ist die Grundlage für mehrtägige Behavioral-Tests.
cargo run -p ibrief-app -- sources list # Registry: Qualität, aktiv/inaktiv
cargo run -p ibrief-app -- sources evolve # bewerten + aussortieren (mit Drift-Wächter)
cargo run -p ibrief-app -- research "Was ist neu bei lokalen LLMs?"sources evolve bewertet Quellen aus Feedback + Selektionshäufigkeit, deaktiviert schwache
(nie unter 3 aktive), und der Drift-Wächter setzt Pruning aus, wenn die Quellen-Diversität
zu stark sinkt (HHI > 0.5) — Anti-Blase vor Engagement.
research ist der gated AutoResearch-Loop (§14) über den lokalen Korpus: belegpflichtig,
unbelegte Aussagen werden verworfen. Die ResearchSource-Trait erlaubt später ein Web-Backend.
M1 statisch ✓ · M2 Persistenz + Feedback ✓ · M3 Eval ✓ · M4 Lernen (Gewichte) ✓ · M5 Prompt-Opt ✓ · M6 Quellen-Evolution + AutoResearch ✓. Details in SPEC.md. Alle Meilensteine implementiert; Build + 19 Tests grün.