docs: document module separation, tool overview, and RSS extensibility

Ergänzt die README um:
- Architektur-Abschnitt mit dem tatsächlich verifizierten Import-Graphen
  (comfyui.py/rss.py/articles.py/documents.py/feeds.py sind gegenseitig
  unabhängig, tools.py ist der einzige Integrationspunkt, triggers.py
  ruft Handler per context.tools-Introspektion ohne tools.py zu
  importieren)
- Werkzeuge-Überblickstabelle (was, wodurch ausgelöst, gemessene
  Zuverlässigkeit)
- Kurzanleitung, wie man RSS-Feeds/Themen in feeds.py ergänzt
- Sicherheitshinweis: anders als die Basisversion macht dieser Fork
  bewusst ausgehende Verbindungen (ComfyUI, RSS-Feeds, beliebige
  Artikel-URLs über read_article — auch potenziell modellvorgeschlagene,
  da die URL nicht gegen eine Allowlist geprüft wird)

NICHT gepusht — weiterhin nur lokal, wie angewiesen.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01LVgSHNHdRx3UNTBodFmhRA
This commit is contained in:
Jeuner 2026-09-07 19:03:07 +02:00
parent 1656d26ea6
commit 6efb67f1a6

View file

@ -28,6 +28,35 @@ Die Stimme lässt sich im UI per Dropdown wählen (`/api/voices` listet alle
26, Auswahl wird im Browser gemerkt). Jede Stimme wird beim ersten Gebrauch 26, Auswahl wird im Browser gemerkt). Jede Stimme wird beim ersten Gebrauch
lazy geladen und danach für die Laufzeit des Prozesses gecacht. lazy geladen und danach für die Laufzeit des Prozesses gecacht.
## Architektur
Jede Fähigkeit ist ein eigenständiges, gegenseitig unabhängiges Modul —
verifiziert am Import-Graphen, nicht nur behauptet:
```
astra/comfyui.py — nur httpx, kein astra-Import
astra/rss.py — nur feedparser+httpx, importiert astra.feeds (Daten)
astra/articles.py — nur httpx+trafilatura, kein astra-Import
astra/documents.py — nur pypdf, kein astra-Import
astra/feeds.py — reine Daten, kein einziger Import
```
Keines dieser fünf Module kennt Pipecat, LLM-Tools oder ein anderes der
fünf. **`astra/tools.py`** ist die einzige Stelle, die sie zu
LLM-aufrufbaren `FunctionSchema`s verdrahtet (Beschreibung + Handler +
UI-Benachrichtigungen). **`astra/triggers.py`** ruft dieselben Handler
bei Bedarf direkt auf — per Introspektion über `context.tools`, ohne
`tools.py` zu importieren — wenn ein einfacher Keyword-Treffer
zuverlässiger ist als die LLM-Entscheidung (siehe unten).
### Werkzeuge im Überblick
| Werkzeug | Macht | Ausgelöst durch | Live gemessene Zuverlässigkeit |
|---|---|---|---|
| `generate_image` | Bild via ComfyUI erzeugen | LLM-Entscheidung | ~100 % |
| `read_news` | Schlagzeilen aus konfiguriertem RSS-Thema | Keyword-Trigger (`triggers.py`) | ~100 % (Trigger) / ~1520 % (reine LLM-Entscheidung) |
| `read_article` | Vollen Artikeltext zu einer Nummer/URL laden | Keyword-Trigger + LLM-Fallback | Trigger 2/2 live; LLM-Fallback ~65 % |
## Bilder erzeugen und Dokumente lesen ## Bilder erzeugen und Dokumente lesen
Zwei zusätzliche, sauber getrennte Fähigkeiten, unabhängig von STT/LLM/TTS: Zwei zusätzliche, sauber getrennte Fähigkeiten, unabhängig von STT/LLM/TTS:
@ -53,7 +82,13 @@ nur für die Dauer der Session, nichts wird auf Disk geschrieben.
- **`astra/feeds.py`** — kuratierte Feed-Liste, nach Thema gruppiert - **`astra/feeds.py`** — kuratierte Feed-Liste, nach Thema gruppiert
(`tech`, `nachrichten`, `wirtschaft`, `hilden` — lokal für Hilden via (`tech`, `nachrichten`, `wirtschaft`, `hilden` — lokal für Hilden via
RP ONLINE). Reine Daten, editierbar. RP ONLINE). Reine Daten, editierbar: neues Thema = neuer Dict-Key mit
`{"name": ..., "url": ...}`-Tupeln, neuer Feed = eine Zeile in einem
bestehenden Thema. `TOPICS` wird automatisch aus den Keys abgeleitet,
taucht dadurch sofort im `read_news`-Schema (`enum`) und in
`triggers.py`'s Themen-Erkennung auf — keine weitere Codeänderung nötig,
solange der neue Themenname selbsterklärend ist (sonst zusätzlich einen
Alias in `_TOPIC_ALIASES` in `astra/triggers.py` ergänzen).
- **`astra/rss.py`** — async Feed-Client (`feedparser`), holt konfigurierte - **`astra/rss.py`** — async Feed-Client (`feedparser`), holt konfigurierte
Feeds eines Themas parallel ab, überspringt nicht erreichbare Feeds statt Feeds eines Themas parallel ab, überspringt nicht erreichbare Feeds statt
komplett zu scheitern. komplett zu scheitern.
@ -160,6 +195,13 @@ Origin-Prüfung lassen dann zusätzlich diesen einen Hostnamen durch.
wirft, falls das Modell trotzdem Denkausgabe liefert wirft, falls das Modell trotzdem Denkausgabe liefert
- Kein Audio, keine Transkripte werden auf Disk geschrieben; der - Kein Audio, keine Transkripte werden auf Disk geschrieben; der
Gesprächsverlauf lebt nur im Speicher der laufenden Session Gesprächsverlauf lebt nur im Speicher der laufenden Session
- Anders als die Basisversion macht dieser Fork bewusst ausgehende
Verbindungen: zu ComfyUI (`ASTRA_COMFYUI_URL`), zu den konfigurierten
RSS-Feeds (`astra/feeds.py`) und zu beliebigen Artikel-URLs, die
`read_article` aufruft (aus einem `read_news`-Ergebnis oder — bei
LLM-Tool-Aufruf statt Trigger — theoretisch vom Modell selbst
vorgeschlagen). Alle drei sind auf ihre jeweilige eigene HTTP-Anfrage
begrenzt, keins davon hat sonstigen Datei- oder Netzwerkzugriff.
--- ---