Text_Agent/WORKLOG.md
dschlueter 5146b7fa30 feat: Pi Text-Agent — initialer Commit (sauberes Repo)
Vollständiges Multi-Agenten-System für Fact-Checking, Artikelschreiben
und Argumentationsanalyse. Zwei Backends: llama.cpp (★ bevorzugt) und Ollama.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-12 04:21:48 +02:00

14 KiB
Raw Permalink Blame History

WORKLOG.md — Append-only Arbeitslog

Neueste Einträge oben. Nicht bearbeiten — nur anhängen.


[2026-05-12] llama-logic-editor + Dokumentation vollständig aktualisiert

Erledigt

  • agenten/llama-logic-editor.ts — Pi-Tool: analyze_logic_llama ★ BEVORZUGT
  • logic-editor.tsollama-logic-editor.ts (Naming-Convention)
  • BEDIENUNGSANLEITUNG.md: Kompletter Rewrite auf llama.cpp-Pipeline
  • README.md: logic-editor-Einträge auf ollama/llama-Varianten aktualisiert
  • AGENTS.md: logic-editor-Einträge aktualisiert

tsc: fehlerfrei

Getestet

  • npx tsx agenten/llama-logic-editor.ts "Sokrates-Syllogismus" → STARK, 13s ✓

[2026-05-12] Vollständige llama.cpp-Pipeline + Writer-Umbenennung

Erledigt

Neue llama.cpp-Agenten (alle: Schema im System-Prompt, /no_think, reasoning_content-Fallback, Retry 3×/15s):

  • agenten/llama-claim-extractor.ts — Pi-Tool: extract_claims_llama
  • agenten/llama-verifier.ts — Pi-Tool: verify_claim_llama ★ BEVORZUGT, userLanguage-Parameter
  • agenten/llama-verify-article.ts — Pi-Tool: verify_article_llama, Batch-Verdict-Aufruf
  • agenten/llama-writer.ts — Pi-Tool: write_article_llama ★ BEVORZUGT

Umbenennungen (Naming-Convention ollama-* / llama-*):

  • writer.tsollama-writer.ts (Pi-Tool bleibt write_article)
  • verify-article.tsollama-verify-article.ts (Pi-Tool bleibt verify_article)

Deployment:

  • ~/.pi/agent/extensions/fact-checker/package.json: 9 Extensions
  • Symlinks: writer.ts entfernt, ollama-writer.ts + llama-writer.ts hinzugefügt
  • Alle anderen llama.cpp-Symlinks angelegt

Dokumentation: AGENTS.md, README.md, HANDOFF.md, TODO.md, WORKLOG.md aktualisiert

tsc: fehlerfrei

Getestet

  • npx tsx agenten/llama-writer.ts --from-job pipeline-test --style blog → 253 Wörter, 18.7s ✓
  • Pipeline-Test: llama-verify-articlellama-writer kompatibel (gleiche VerificationReport-Struktur) ✓

Probleme und Lösungen

Problem Lösung
writer.ts → "fetch failed" mit qwen3.5:27b + format: llama-writer.ts: Schema im System-Prompt, /no_think
createLogger("name", "debug") — falsige Signatur createLogger({ verbose: true }) verwendet

Verbleibende offene Punkte

  • Pi /reload (manuell) damit write_article_llama aktiv wird
  • OLLAMA_KEEP_ALIVE via systemd (optional, niedrige Priorität)

[2026-04-17] Standard-Modell auf qwen3.5:9b gesetzt

Erledigt

  • claim-extractor.ts — Standardmodell von qwen3.5:27b auf qwen3.5:9b geändert
    • Präzision: 8/9 Claims vs. 9/9 (qwen3.5:27b) — fast gleich
    • Geschwindigkeit: 2× schneller (96s vs. 205s bei Apollo-11-Text)
    • VRAM: 6.6GB statt 17GB — vollständig in VRAM, kein CPU-Offloading
  • Kommentar in Header aktualisiert: Empfehlung qwen3.5:9b (6.6GB, 1 GPU, fast gleiche Präzision wie 27B, 2× schneller)
  • TypeBox-Parameter-Beschreibung ergänzt: "Empfohlene Alternative: qwen3.5:27b für maximale Präzision"

tsc: fehlerfrei

Getestet

  • npx tsx agenten/claim-extractor.ts --verbose "Test" → zeigt "Ollama-Modell: qwen3.5:9b"
  • Apollo-11-Test: 8 Claims extrahiert (qwen3.5:27b: 9 Claims) — akzeptabler Trade-off

[2026-04-16] Job-Speicher implementiert

Erledigt

lib/jobs.ts (neue Datei, ~200 Zeilen) — reines File-I/O, keine Agenten-Abhängigkeiten

  • createJob(slug, model) → legt ~/.pi/agent/jobs/<datum>_<slug>/ + perplexity/-Unterverzeichnis an
  • findJobDir(slug) → neuestes Job-Verzeichnis mit diesem Slug
  • getOrCreateJob(slug, model) → Resume-Logik: vorhandenes wiederverwenden oder neu anlegen
  • saveJobFile/loadJobFile/loadJobText/jobFileExists → Datei-I/O mit JSON-Serialisierung
  • updateJobMeta → shallow merge in meta.json mit updatedAt-Timestamp
  • listJobs → alle Jobs sortiert nach Datum (neueste zuerst)
  • formatJobList → Tabellenausgabe für CLI

verify-article.ts — --job-id <slug>

  • Erstlauf: erstellt Job, speichert input.txt, claims.json, perplexity/<id>.json, report.json
  • Resume: gecachte claims.json → Extraktion übersprungen; gecachte perplexity/<id>.json → kein API-Aufruf
  • meta.json wird bei jedem Schritt aktualisiert (status + step-Metadaten)
  • Fehler: meta.json auf status: "failed" gesetzt

writer.ts — --from-job <slug> + --from-report

  • --from-job: lädt report.json aus Job, speichert article.md nach Fertigstellung
  • Fehlerausgabe wenn Job oder report.json nicht gefunden

tsc: fehlerfrei

Verzeichnisstruktur

~/.pi/agent/jobs/<datum>_<slug>/
├── input.txt
├── claims.json
├── perplexity/
│   ├── c001.json
│   └── c002.json  ...
├── report.json
├── article.md
└── meta.json

[2026-04-16] Verbose-Modus + lib/logger.ts implementiert

Erledigt

lib/logger.ts (neue Datei, ~90 Zeilen)

  • Logger-Klasse mit info/warn/error/debug-Methoden
  • Schreibt in ~/.pi/agent/logs/YYYY-MM-DD_HH-MM-SS[_jobId].log (append, FS-Fehler werden ignoriert)
  • verbose=true → alle Einträge zusätzlich auf stderr; warn/error immer auf stderr
  • createLogger(opts) — Factory; legt LOG_DIR automatisch an
  • nullLogger — Null-Objekt für Pi-Extension-Kontext (keine Seiteneffekte)

claim-extractor.ts — Logging + --verbose

  • Alle Chunking-Schritte geloggt: Chunk-Aufteilung, Token-Counts, Laufzeit pro Chunk, Dedup-Stats
  • Ollama-Antwort-Details geloggt (promptTokens, outputTokens, rawLength)
  • Fehler (API-Fehler, JSON-Parse, 0-Claims) mit Kontext geloggt
  • --verbose / -v CLI-Flag: erstellt Logger mit verbose=true

verify-article.ts — Logging + --verbose

  • Pipeline-Start/Ende geloggt (textLength, model, totalCostUSD, latencyMs)
  • Perplexity-Outcomes geloggt (successful/failed Count, Kosten)
  • --verbose / -v CLI-Flag

verifier.ts — Logging + --verbose

  • Perplexity-Aufruf + Urteilssynthese geloggt
  • --verbose / -v CLI-Flag

tsc: fehlerfrei

Chunking-Test läuft

  • claim-extractor.ts --verbose "$(cat Umerziehung.md)" gestartet
  • Logger bestätigt: 7 Chunks (29452984 Zeichen), Chunk 1/7 wird verarbeitet
  • Alter Fehler (fetch failed) war temporär (Ollama nicht bereit); kein Code-Bug

[2026-04-16] Phasen 13 komplett, Handoff-Dokumentation

Erledigt

Phase 1 — Fundament

  • Projektstruktur analysiert, GPU-Setup entschieden (qwen3.5:27b auf 1 GPU)
  • package.json + tsconfig.json erstellt (ESM, tsx, no-build)
  • types/pi-coding-agent.d.ts — Stub für lokale TS-Prüfung ohne Pi-Paket
  • schemas/claim.schema.json — ClaimSet mit 6 Claim-Typen, 3 Checkability-Stufen
  • schemas/source-record.schema.json — Perplexity-Quellen
  • schemas/verification-result.schema.json — 5 Status-Werte
  • agenten/claim-extractor.ts (509 Zeilen) — Pi-Extension + CLI
    • Getestet: qwen3.5:27b extrahiert korrekt, structured output funktioniert

Phase 2 — Kernpipeline

  • lib/perplexity.ts (175 Zeilen) — Retry, Kostenberechnung, Deduplizierung
  • agenten/verifier.ts (427 Zeilen) — Perplexity + Ollama-Verdict
    • Getestet: "Inflationsrate 3,2%" → WIDERLEGT (korrekt: 2,2%, Destatis-Quelle)
    • Kosten: ~$0.0054/Claim
  • agenten/verify-article.ts (600 Zeilen) — Orchestrator
    • runWithConcurrencyLimit() für max. 5 parallele Perplexity-Calls
    • Batch-Ollama-Verdict (1 Call für N Claims, num_ctx: 16384)
    • End-to-End-Test: 4 falsche Facts erkannt, 2 korrekte bestätigt — $0.0324, 407s

Phase 3 — Produktionsreife

  • lib/router.ts (232 Zeilen) — TaskType-basiertes Routing, ENV-Overrides
  • schemas/argument-map.schema.json — 12 Fehlschluss-Typen
  • schemas/article-draft.schema.json — 5 Stile, Quellenverzeichnis
    • Bugfix: "type": "["string", "null"]" (String) → "type": ["string", "null"] (Array)
  • agenten/logic-editor.ts (538 Zeilen) — deepseek-r1:32b, Pi + CLI
    • Zwei Bugs gefixt (location-Feld, Chinesische Zeichen im Output)
    • Retest nach Fix steht noch aus
  • agenten/writer.ts (522 Zeilen) — Pipe-CLI, 5 Stile, Quellenautomatik
    • tsc fehlerfrei, End-to-End-Test steht noch aus

Deployment

  • ~/.pi/agent/extensions/fact-checker/ mit 5 Symlinks
  • ~/.pi/agent/extensions/lib~/Pi_Agent_Projekts/text_agent/lib
  • Pi /reload noch nicht getestet

Handoff-Dokumentation

  • AGENTS.md, SYSTEM.md, HANDOFF.md, TODO.md, WORKLOG.md, docs/ARCHITECTURE.md

Probleme und Lösungen

Problem Lösung
@mariozechner/pi-coding-agent nicht von tsc gefunden Lokaler Typ-Stub in types/
execute params implicit any in Stub Generic entfernt, params: any direkt
ClaimSet nicht exportiert export type zu allen Typen in claim-extractor.ts
ArticleDraft fehlt schema_version Lokaler Typ ergänzt in writer.ts
article-draft.schema.json type-Bug Array-Syntax korrigiert
logic-editor zeigt JSON-Keys statt Textzitate Prompt-Anweisung mit Zitat-Beispiel ergänzt
Chinesische Zeichen im Output "Antworte ausschließlich auf Deutsch." an Prompt-Anfang
Nutzer will .bashrc nicht von Claude editieren lassen Anleitung gegeben: manuell export OLLAMA_KEEP_ALIVE=-1 einfügen
Ollama läuft via systemd, nicht direkt Anleitung: sudo systemctl edit ollama + Environment=...

Offen nach dieser Session

  • logic-editor.ts retest nach Fixes
  • writer.ts End-to-End-Test
  • Pi /reload bestätigen
  • OLLAMA_KEEP_ALIVE in systemd setzen (Nutzer)
  • Testkorpus aufbauen

[2026-04-16] 0-Claims-Bug gefixt, sequential-Guideline ergänzt

Erledigt

claim-extractor.ts — dynamisches num_ctx

  • Ursache des 0-Claims-Bugs: num_ctx=8192 für 17964-Zeichen-Essay zu klein (Eingabe ~4491 Tokens + Prompt ~1000 + Output ~3200 = ~8691 → Overflow)
  • Fix: estimateNumCtx(textLength, maxClaims) berechnet 8192/16384/32768 dynamisch
    • Umerziehung.md (17964 Zeichen) → 16384 ✓
    • Kurze Texte (<~3000 Zeichen) → bleiben bei 8192
  • Fix: 0-Claims wirft jetzt Fehler: "Ollama hat 0 Claims extrahiert (num_ctx=..., prompt_tokens=...)"
  • Fix: System-Prompt Duplikat-Unterdrückung: "Extrahiere jeden Sachverhalt nur einmal"

verify-article.ts — Warnung bei 0 prüfbaren Claims

  • onProgress("⚠ Keine prüfbaren Claims gefunden...") wenn checkableClaims.length === 0

verifier.ts — sequential Guideline

  • promptGuidelines ergänzt: nie mehrere verify_claim gleichzeitig aufrufen

tsc: fehlerfrei nach allen Änderungen

[2026-04-16] Probelauf analysiert, Status-Dateien aktualisiert

Probelauf-Ergebnisse (Probelauf.md)

  • Pi lädt alle 6 Extensions korrekt ✓
  • extract_claims auf 2.000-Wort-Essay: 25 Claims (14 prüfbar, 10 teilweise, 1 Meinung) — 285s ✓
  • verify_claim einzeln: 11/14 bestätigt, 2 widerlegt (41 Mio. Wohnungen veraltet, IW-Zahl nicht belegbar), 1 → deep retry → bestätigt ✓
  • research_web: korrekte Recherche zu Wohnungsbestand ✓
  • Problem: verify_article auf langem Text → 0 Claims extrahiert (173s) — Bug
  • Problem: parallele verify_claim-Aufrufe → viele fetch failed — Ollama-Überlastung

Status-Dateien aktualisiert

  • HANDOFF.md: Probelauf-Ergebnisse und neue offene Punkte eingetragen
  • TODO.md: P1 um Bug-Fix und Prompt-Guidelines ergänzt, erledigte P1-Items abgehakt

[2026-04-16] P2-Features implementiert

Erledigt

verify-article.ts — Fortschrittsanzeige

  • onProgress-Callback als optionaler Parameter in verifyArticle()
  • Meldet: "Claims extrahieren...", "N Claims extrahiert — M prüfbar", "[1/3] ✓ ...", "Urteilssynthese..."
  • CLI-Modus: Callback schreibt auf process.stderr--json-Output auf stdout unberührt
  • Pi-Extension: kein Callback → keine Seiteneffekte

logic-editor.ts — --only-fallacies Flag

  • Neues CLI-Flag --only-fallacies: gibt nur Fehlschlüsse ohne vollständige ArgumentMap aus
  • Kombinierbar mit --json → liefert JSON-Array der fallacies
  • Ohne --json → formatierter Text mit Icon, Typ, Beschreibung, Zitat

Beide: tsc fehlerfrei, CLI-Tests bestanden

[2026-04-16] P1-Bugs gefixt, alle Agenten getestet

Erledigt

logic-editor.ts — Bugfix + Retest

  • Gefunden: analyzeWithOpenRouter(model, text, signal) — Argumente vertauscht (model/text)
  • Fix: analyzeWithOpenRouter(text, model, signal)
  • Prompt-Fixes aus vorheriger Session (location-Feld, Deutsch-Anweisung) bestätigt
  • Retest erfolgreich: 3 Fehlschlüsse korrekt erkannt (Ad Hominem critical, Falsche Dichotomie critical, Autoritätsargument moderate)
  • location-Felder zeigen wörtliche Zitate ✓, kein Chinesisch ✓, alles Deutsch ✓

writer.ts — Bugfix + End-to-End-Test

  • Gefunden: routeModel("article_writing") ohne cloud-Flag wählte OpenRouter statt Ollama (weil OPENROUTER_API_KEY gesetzt → medium-Complexity → Cloud-Branch) → OpenRouter-Modell lieferte body als Array, lead als undefined
  • Fix in writer.ts: complexity "low" wenn kein --cloud → Router wählt immer Ollama
  • End-to-End-Test: 3 Claims → verify-article → writer --style blog
    • c001 (Inflationsrate 3,2%) korrekt als contradicted ausgeschlossen
    • c002 (EZB-Zinssenkung Juni 2024) + c003 (DAX 20.000) als supported verwendet
    • Blog-Artikel mit Quellenverzeichnis, editorial_notes korrekt
    • Laufzeit: ~144s, kostenlos (lokal)
  • tsc nach allen Fixes: fehlerfrei

Handoff-Dokumentation vervollständigt

  • SYSTEM.md, HANDOFF.md, TODO.md, WORKLOG.md, docs/ARCHITECTURE.md geschrieben
  • TODO.md: P1-Aufgaben abgehakt
  • HANDOFF.md: Offene Punkte aktualisiert

Verbleibende offene Punkte

  • Pi /reload in Pi-App testen (nur vom Nutzer durchführbar)
  • OLLAMA_KEEP_ALIVE via systemd setzen (nur vom Nutzer durchführbar)
  • Testkorpus (tests/corpus/) — P3, noch nicht begonnen