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>
This commit is contained in:
commit
5146b7fa30
62 changed files with 11279 additions and 0 deletions
309
WORKLOG.md
Normal file
309
WORKLOG.md
Normal file
|
|
@ -0,0 +1,309 @@
|
|||
# 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.ts` → `ollama-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.ts` → `ollama-writer.ts` (Pi-Tool bleibt `write_article`)
|
||||
- `verify-article.ts` → `ollama-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-article` → `llama-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 (96 s vs. 205 s bei Apollo-11-Text)
|
||||
- VRAM: 6.6 GB statt 17 GB — vollständig in VRAM, kein CPU-Offloading
|
||||
- Kommentar in Header aktualisiert: Empfehlung qwen3.5:9b (6.6 GB, 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 (2945–2984 Zeichen), Chunk 1/7 wird verarbeitet
|
||||
- Alter Fehler (`fetch failed`) war temporär (Ollama nicht bereit); kein Code-Bug
|
||||
|
||||
---
|
||||
|
||||
## [2026-04-16] Phasen 1–3 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
|
||||
|
||||
---
|
||||
|
||||
<!-- Neue Einträge OBEN einfügen, nach diesem Kommentar -->
|
||||
|
||||
## [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
|
||||
Loading…
Add table
Add a link
Reference in a new issue