Commit graph

231 commits

Author SHA1 Message Date
Auto-Sync
d3097ece29 Auto-Sync: 2026-03-30 15:45 2026-03-30 15:45:09 +02:00
Homelab Cursor
89eca6c388 docs: Save.TV Pipeline Doku + CT 116 RAM/DNS-Fix in homelab.conf 2026-03-28 20:59:25 +01:00
Homelab Cursor
eb47bcb8d1 feat(savetv): Jellyfin-Filter, Archiv-Cache, Stabilitäts-Fixes
- savetv_web.py: Archiv-Cache mit Hintergrund-Refresh (kein Blockieren bei Save.TV-Login)
- savetv_web.py: Flask threaded=True für parallele Requests
- savetv_web.py: Jellyfin-Duplikate-Filter (Checkbox, default: ein)
- tools/savetv.py: Login-Timeout (8s connect, 20s read) + modernerer User-Agent
- savetv_sync.py: Dateien unter 700 MB werden übersprungen (kein SD-Schrott)
- CT 116: www.save.tv statisch in /etc/hosts → kein DNS-GIL-Block mehr
- CT 116: RAM von 512 MB auf 1 GB erhöht (war der Hauptgrund für Einfrieren)
2026-03-28 20:55:12 +01:00
Homelab Cursor
afada512d6 fix(savetv): Wartezeit auf 24h erhöht (Save.TV Werbeschnitt) 2026-03-28 19:43:50 +01:00
Homelab Cursor
8c1e810204 feat(savetv): Pipeline-Dashboard mit 3 Blöcken (Warten/Bereit/NAS)
- /downloads ersetzt durch Pipeline-Dashboard
- /api/pipeline: Status aller Filme (pending/bereit/auf NAS)
- /api/nas_synced: Callback wenn Jellyfin-Sync fertig
- Sync-Script meldet sich nach erfolg zurück ans CT
2026-03-28 19:39:53 +01:00
Homelab Cursor
fad6b145ff fix(savetv): user:pass@ aus URL entfernen (Chrome strippt Credentials) 2026-03-28 19:12:35 +01:00
Homelab Cursor
73332bfc14 fix(savetv): Basic-Auth in Direct-Download-URL einbetten
Credentials (mike:astral66) direkt im href-Link, damit kein Browser-Auth-Dialog erscheint.
SAVETV_DIRECT_USER/PASS als env-ueberschreibbare Konstanten.
2026-03-28 19:05:07 +01:00
Homelab Cursor
ba13fc2659 feat(savetv): direkter Download via Hetzner-IP statt Cloudflare
- SAVETV_DIRECT_BASE / SAVETV_TUNNEL_BASE Konstanten eingefuegt
- Downloads-Seite: gruener Download-Button -> Hetzner :9443 (ohne CF, Basic-Auth mike)
- CF-Fallback-Link pro Zeile -> savetv.orbitalo.net (Cloudflare-Tunnel)
- Infobox mit URL, Auth-Hinweis und CF-Erlaeuterung unterhalb der Dateianzahl
2026-03-28 18:43:08 +01:00
Homelab Cursor
6989b5c07b feat(savetv): Jellyfin-Abgleich im Archiv
- API /api/jellyfin_library: Jellyfin-Filme via Tailscale, 1h Cache
- Archiv-Karten: Badge Jellyfin wenn Titel in Mediathek (normalisierter Vergleich)
- Entfernt: /opt/savetv_extra_routes.py Doppelung (nur noch Repo-Modul)
2026-03-28 17:28:37 +01:00
Homelab Cursor
902441bbbc feat(savetv): add savetv_extra_routes.py to repo — sortable downloads page
Downloads page now has sort buttons (date/name/size) with toggle asc/desc.
Default: newest first. Client-side JS sorting, no page reload needed.
Previously this file was only in /opt/ outside git.
2026-03-28 17:17:46 +01:00
Homelab Cursor
3b6ee14b37 fix(rag): timeout 45s, RRF rank-map bug fix 2026-03-28 16:54:20 +01:00
Homelab Cursor
a3735bf265 fix(rag): RRF fusion, 512-char snippets, 15 candidates — speed+quality 2026-03-28 16:51:06 +01:00
Homelab Cursor
da0d1cd16c feat(rag): Cross-Encoder Reranking via CT123 bge-reranker-v2-m3 2026-03-28 16:37:56 +01:00
Homelab Cursor
7a371944b4 docs: Jellyfin Server Zugangsdaten und API-Key 2026-03-28 13:18:45 +01:00
Homelab Cursor
53b63ee8fe savetv: Hetzner-Speicherindikator im Archiv, Datumssortierung Downloads 2026-03-28 12:59:27 +01:00
Homelab Cursor
2c9f07dbb7 docs: Save.TV Enricher Dokumentation (Enricher, Web-UI, Umbenennung) 2026-03-27 14:54:47 +01:00
Homelab Cursor
9f60a9e292 savetv_web: Neueste Filme zuerst, Aufnahmedatum anzeigen 2026-03-27 14:15:56 +01:00
Homelab Cursor
8751b42724 savetv_enrich: Sleep auf 0.5s reduziert für schnellere Verarbeitung 2026-03-27 13:57:44 +01:00
Homelab Cursor
e204edf2ea savetv_enrich: File-Lock + Debug-Logging + robusterer Cache-Save
- fcntl.flock verhindert parallele Enricher-Instanzen
- Atomarer Cache-Save über tmp-Datei
- Debug-Logs bei leerer/gefilterter Beschreibung
- Sleep auf 2s erhöht für stabilere Ollama-Antworten
2026-03-27 13:49:21 +01:00
cf1a0ccdd1 fix: qwen2.5:14b als Primärmodell, robustes JSON-Parsing
- qwen3 schreibt Reasoning in Content trotz think=false
- qwen2.5 liefert zuverlässig JSON
- Actors-Feld: Strings oder Objekte werden beides akzeptiert
- Prompt explizit auf Deutsch eingeschränkt
2026-03-27 12:39:34 +00:00
caa2883a66 fix: Ollama native API nutzen statt OpenAI-compat für Enricher
Qwen3 via /v1/chat/completions verbraucht max_tokens fürs
Reasoning und liefert leeren Content. Umstellung auf /api/chat
mit think=false löst das Problem.
2026-03-27 12:36:38 +00:00
0b495c3544 feat: Web-UI zeigt KI-Filmbeschreibungen, Darsteller und Regisseur
Die filmCard-Funktion rendert jetzt die angereicherten Daten:
- 3-6 Sätze Beschreibung
- Hauptdarsteller + Regisseur
- Land, Jahr, Genre als Metadaten-Zeile
2026-03-27 12:27:58 +00:00
45b2903fb6 feat: KI-Enricher für Save.TV Filmdatenbank
Nutzt Ollama (qwen3:30b) um Filme im Archiv automatisch
mit Beschreibung, Hauptdarstellern, Land und Genre anzureichern.
Läuft als Cronjob alle 3h, Ergebnis sofort in der Web-UI sichtbar.
2026-03-27 12:25:58 +00:00
Homelab Cursor
8b78cf0854 rag: docnm_search (Boost 5.0) — Dateinamen als Volltext durchsuchbar (#52)
ES-Index: neues Feld docnm_search (custom analyzer mit path_splitter,
__ und _ werden zu Leerzeichen). docnm_kwd bleibt als Keyword.
Hybrid-Suche nutzt jetzt docnm_search mit Boost 5.0 —
Arakawa/Wohnung/Kambodscha etc. finden direkt ueber den Dateinamen
ohne handverdrahtete Subqueries.

Closes #52
2026-03-27 10:41:00 +01:00
Homelab Cursor
70469cfbc5 rag: Fix toter Code — Immobilien-Wide-Check war nach return unreachbar 2026-03-26 19:04:23 +01:00
Homelab Cursor
0a76bee464 rag: Breitensuche fuer Wohnungen/Immobilien/Kambodscha
- _is_wide_recall_query: erkennt jetzt Wohnung+welche/alle, Kambodscha+Wohnung
- _WIDE_SUBQUERIES_IMMOBILIEN: Arakawa-Wohnungen, Mietvertraege, Kaufvertrag, Hard Title etc.
- handle_rag_search waehlt Subquery-Pool je nach Thema (Immo vs. Versicherung)
2026-03-26 19:00:28 +01:00
Homelab Cursor
00283a6268 llm+rag: RAG-Pflicht fuer Wohnung/Immobilie/Kambodscha; generische Forced-Prompts
- _DOC_KW: wohnung, immobilie, condo, kambodscha, takeo, phnom, haus, ...
- Bei Geo/Wohnung: RAG-Query mit Zusatz-Keywords
- Forced-RAG: Finanz-Fokus vs. allgemeine Unterlagen (Gedaechtnis nicht Prioritaet)
- rag.py: Tool-Prompt Wohnungen/Ausland explizit
2026-03-26 18:53:06 +01:00
Homelab Cursor
031b8d6c65 llm: RAG-Unterlagen — STIL-OVERRIDE und Struktur (Kurzfassung + je Dokument)
Globaler Prompt fordert sonst knappe Antworten; bei forciertem rag_search
jetzt explizit ausfuehrlicher. User-Zeile: strukturierte Kosten-Antwort statt
nur Quellen-Hinweis. Markdown ** um Dateiname entfernt (Telegram).
2026-03-26 18:39:14 +01:00
Homelab Cursor
93aabf3fc5 monitor: CT 115/Shop-VMIDs als erwartet gestoppt unabhängig vom Proxmox-Host-Key
Die API setzt _host je nach homelab.conf (z.B. pve-hetzner); (115,pve-ka-1)
griff dann nicht. Erwartete stopped-VMIDs jetzt host-unabhängig bei status stopped.
2026-03-26 18:31:23 +01:00
Homelab Cursor
40d6badfc7 fix(rag+llm): Kfz-Kosten mit Quelle; kein nackter EUR-Betrag
- Forciertes RAG: Prompt verbietet Ein-Zahl-Antwort; Dateiname Pflicht.
- User-Nachtrag [Quelle: ...] bei forced RAG.
- rag: kostet/wie viel in wide recall; Subqueries Ford Transit / Kfz jährlich.
2026-03-26 17:18:32 +01:00
Homelab Cursor
ae6a50d182 fix(rag+llm): 60 wide treffer, Pfad-Dedup, 100k tool payload
(Nachtrag: vorheriger Commit enthielt nur telegram_bot.)
2026-03-26 17:15:48 +01:00
Homelab Cursor
60d0ef671d fix(rag+tg): mehr Treffer, Pfad-Dedup, keine 4k-Abschneidung
- rag: wide bis 60 Treffer, ES 200, 22 Subqueries, Merge mit Dedup
  pro vollem docnm_kwd (Ordner+Datei getrennt).
- llm: forciertes RAG top_k 60, Tool bis 100k Zeichen.
- telegram: lange Antworten in mehrere Nachrichten (RAG-Listen sichtbar).
2026-03-26 17:15:25 +01:00
Homelab Cursor
dcf70b087b fix(rag): breite Mehrfachsuche + mehr Treffer fuer Uebersichten
- wide_recall: bis 16 ES-Runden mit Sparten-/Gesellschafts-Queries, Merge
  nach Dedup-Key, bis 25 distinct Treffer, groessere Snippets.
- Normale Suche: top_k bis 15, ES bis 150.
- Forciertes RAG: top_k 25, Tool-Payload 32k Zeichen.
- Hinweis: 100% Vollstaendigkeit haengt von Index/OCR ab.
2026-03-26 17:12:13 +01:00
Homelab Cursor
a9d1069728 fix(bot): import rag_mode before build_reply_keyboard 2026-03-26 17:05:36 +01:00
Homelab Cursor
44d80d2a9e feat(bot): Schalter Betriebsart Unterlagen (RAG zuerst)
- Neue Tastaturzeile: Unterlagen AUS/AN zeigt Modus und schaltet um.
- document_mode in ask_with_tools: erzwingt lokales Modell und RAG-Pflicht
  wie bei Doc-Keywords (Session wird bei Suche wie bisher bereinigt).
- Optional: doku:/rag: Prefix fuer einmalige Suche ohne Modus.
- Sprache und Hilfetext ergaenzt.
2026-03-26 17:05:06 +01:00
Homelab Cursor
d771a330c7 fix(routing): yearly costs to local RAG, not Sonar
- Remove standalone "kosten" from WEB_TRIGGERS (matched "jährlichen kosten" and sent Perplexity without tools).
- Add LOCAL_OVERRIDES for jahreskosten/jaehrlich/beitragsrechnung phrases.
- Extend forced-RAG keywords and enrich ES query with Beitrag/Beitragsrechnung for cost questions.
- System hint: extract amounts and periods per hit when possible.
2026-03-26 17:01:43 +01:00
Homelab Cursor
03f70fdda3 fix(rag): larger forced tool payload (12k) + list all insurance Sparten
- Forced rag_search used top_k=10 and tool content up to 12k chars (was 3k, cut off most hits).
- System instruction: enumerate each Sparte/doc type for same insurer, not only first hit.
- rag.py SYSTEM_PROMPT_EXTRA: same rule for multi-hit answers.
2026-03-26 16:56:29 +01:00
Homelab Cursor
7b6543be90 fix(rag): strip session history when forced RAG fires
Poisoned session history (4x wrong answers) overrode RAG results.
Now: when doc keywords trigger forced rag_search, rebuild messages
from scratch with ONLY system prompt + RAG results + question.
No session history = no poisoning.
2026-03-26 16:51:29 +01:00
Homelab Cursor
e5327cd65e fix(rag): force rag_search in code, do not rely on LLM tool-calling
The LLM ignores system injections when session history already
contains insurance answers. Now: when doc keywords detected, call
rag_search directly in Python, inject results as fake tool-call
into messages. LLM only needs to format the answer.
2026-03-26 16:48:21 +01:00
Homelab Cursor
98d0698db0 fix(rag): inject PFLICHT-reminder for doc-keywords to prevent LLM skipping rag_search
When session history already contained insurance/document answers,
the LLM would skip rag_search and hallucinate from memory.
Now: if doc keywords detected, inject system-message reminder AFTER
session history but BEFORE user question, forcing rag_search call.

Fixes #51 follow-up: LVM query returned wrong answer.
2026-03-26 16:38:29 +01:00
Homelab Cursor
59e53a2750 rag: 19/20 E2E-Tests bestanden — Dedup + Anti-Halluzination + Pflicht-Prompt
- Dedup auf Dateinamen-Ebene (Extension + Kopie-Marker ignorieren)
- docnm_kwd boost 1.5→3.0 fuer bessere Ordner-Treffer
- SYSTEM_PROMPT_EXTRA verschaerft: IMMER rag_search bei Dokument-Fragen
- Expliziter Ende-Marker gegen LLM-Halluzination
- MIN_TOP_K=5, Default top_k=8
- Content-Snippet 400→600 Zeichen
Ref: Issue #51
2026-03-26 15:25:52 +01:00
Homelab Cursor
a43c0b913b rag: bessere Treffer + Anti-Halluzination
- top_k min=5, default=8 (LLM kann nicht mehr top_k=3 setzen)
- docnm_kwd boost 1.5→3.0 (Ordner/Dateinamen staerker gewichten)
- Ordnerpfad als Kategorie-Info in Ausgabe
- Content-Snippet 400→600 Zeichen
- SYSTEM_PROMPT_EXTRA: LLM darf keine Details erfinden
- es_size erhoehen fuer breitere Suche
Ref: Issue #51
2026-03-26 15:07:31 +01:00
Homelab Cursor
0e1c7a6ebb llm: Routing-Fix — Dokument-Keywords in LOCAL_OVERRIDES
Versicherung/Vertrag/Steuer/Rente/Dokument etc. routen jetzt lokal
statt zu Sonar, damit rag_search per Tool-Calling aufgerufen wird.
Vorher: aktuell in Frage -> Sonar -> kein Tool-Calling -> kein RAG.
Ref: Issue #51
2026-03-26 14:43:56 +01:00
Homelab Cursor
f9b69ad283 rag: Elasticsearch direkt (Hybrid kNN + deutsch) statt RAGFlow API
- ES 100.109.101.12:1200, Filter kb_id, knn auf q_768_vec
- Query-Embedding via Ollama nomic-embed-text
- Text: content_de, content_ltks, docnm_kwd
- OCR-Heuristik, Deduplizierung nach docnm_kwd
- Ref: Issue #51
2026-03-26 14:34:40 +01:00
Auto-Sync
9d79af7481 Auto-Sync: 2026-03-26 12:30 2026-03-26 12:30:10 +01:00
Homelab Cursor
07b785ece1 docs: GPU-Architektur Doku (STATE.md, RAGFLOW.md)
- STATE.md: Hybrid-Architektur, LLM-Routing, VRAM-Belegung
- RAGFLOW.md: Warnung dass qwen2.5:14b Hauptmodell verdraengt
2026-03-25 21:01:47 +01:00
Homelab Cursor
d2a6391f52 feat(llm): Ollama warmup bei Start - Modelle permanent im VRAM
- warmup_ollama() laedt qwen3:30b-a3b + nomic-embed-text mit keep_alive=-1
- Wird beim Bot-Start in post_init() aufgerufen (via asyncio.to_thread)
- keep_alive=-1 nur ueber native Ollama API (/api/generate) moeglich
- GPU haelt 22.6/24 GB permanent: Text + Embeddings ohne Swap
2026-03-25 20:59:30 +01:00
Homelab Cursor
a0724ba6f1 refactor(llm): GPU-Architektur - Text lokal, Vision Cloud
- MODEL_VISION von qwen3-vl:32b (Ollama) auf openai/gpt-4o-mini (OpenRouter)
- Vision-Modell aus OLLAMA_MODELS entfernt (kein GPU-Swap mehr)
- keep_alive=-1 fuer Ollama: Textmodell bleibt permanent im VRAM
- RTX 3090 wird dedizierter Text+Embedding-Server
- Neue Dienste koennen Ollama mitnutzen ohne Konkurrenz
2026-03-25 20:56:55 +01:00
Homelab Cursor
92898a33e3 fix(llm): kein Fallback auf Textmodell bei Vision-Anfragen
Wenn qwen3-vl:32b timeout hat, wurde bisher auf qwen2.5:14b
(Textmodell) zurueckgefallen. Das kann keine Bilder sehen und
halluziniert stattdessen. Jetzt: allow_fallback=False fuer Vision
und klare Fehlermeldung bei Timeout.
2026-03-25 19:46:35 +01:00
Homelab Cursor
203843dc38 fix(monitor): Flugscanner retries 2->3, retry_delay 3->5 fuer DERP-Relay
Tailscale-Verbindung zu pve-kunde1-1 laeuft ueber DERP Singapore
Relay und faellt intermittierend aus. Max Wartezeit 40s gibt genug
Puffer fuer Reconnects.
2026-03-25 19:41:20 +01:00