Files
ROMFASTSQL/docs/chatboti-si-punti.md
Claude Agent ecf5f2fa7a docs: de ce nu raspund ambele punti in chatul "Eu", si re-legarea fara QR
Corectie la ce am scris mai devreme in aceeasi zi: ambele punti chiar PRIMESC
mesajele din self-chat, dar Echo le arunca pe toate cu `fromMe && !isGroup`, iar
in self-chat tot ce scrii e fromMe. Deci raspunde doar Maria; Echo foloseste "Eu"
in celalalt sens, ca destinatie de notificari prin /send. Echilibrul e insa
accidental — scoaterea acelui `continue` aduce doua raspunsuri la fiecare mesaj.

Adaugat si cum se re-leaga o punte prin cod, nu prin QR (ambele au /pair), si de
ce nu se poate ocoli slotul de dispozitiv: doua procese cu acelasi auth/ folosesc
aceleasi chei si se dau afara reciproc.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Q4uzvgm7AyJch5WH8QHRhY
2026-08-31 21:28:15 +00:00

214 lines
10 KiB
Markdown

# Chatboții și punțile de mesagerie — care e care
Există **trei lucruri numite „Maria"**, **doi boți pe Discord** și **două punți WhatsApp
legate la același număr de telefon**. Documentul ăsta spune care e care, unde rulează și
cum verifici, în 30 de secunde, cu care vorbești de fapt.
> **De ce există documentul:** pe 2026-08-31 s-a pierdut aproape o oră de diagnostic
> fiindcă Maria de pe WhatsApp răspundea, dar toate verificările se făceau pe containerul
> greșit. Pe LXC 171 totul părea rupt (niciun LLM, WhatsApp neasociat, log fără
> activitate) — răspunsurile veneau de pe LXC 104.
**Verificat live pe 2026-08-31.** Stările (`connected`, ce serviciu rulează) se schimbă;
topologia, nu.
---
## Tabelul scurt
| Cine | Unde rulează | Canal | Model | Sursa de cunoștințe |
|---|---|---|---|---|
| **Maria pe Flowise** | LXC 104, `flowise.service`, port 3000 | web (prin ngrok) | configurat în chatflow | chatflow Flowise + docstore propriu |
| **Maria WhatsApp** ← instanța vie | LXC 171, `maria-*.service` | WhatsApp, nr. 40723197939 | `llama-qwen35` de pe 104, prin rețea | depozit sincronizat din Google Drive |
| **Maria WhatsApp — prototipul** | LXC 104, `maria-whatsapp-*.service` | — (**oprit** 2026-08-31) | — | `rag_index.json` propriu, mic |
| **Echo (MoltBot)** | LXC 110, `echo-core.service` | Telegram + WhatsApp + Discord | Claude Opus 4.5 (API) | proiectele lui, roa2web |
| **Puntea Discord → Claude Code** | LXC 171, `claude-discord.service` | Discord (guild privat) | Sonnet/Opus, per fir | tot `/workspace`, acces SSH la cluster |
Cele două Marii de WhatsApp rulează **același cod**, din surse diferite. Vezi mai jos.
---
## Cele trei Marii
### 1. Maria pe Flowise — chatbot web
LXC 104 (`10.0.20.161`), `flowise.service` pe portul 3000, expus public prin
`ngrok.service` la `https://mutual-special-koala.ngrok-free.app`.
Chatflow-ul e definit în interfața Flowise; memoria e Buffer Window (ultimele 5 schimburi).
Sursa versionată a chatflow-ului: `vfp_roaauto/COMUN/utile/chatbot/`.
Detalii: [`proxmox/lxc104-flowise/README.md`](../proxmox/lxc104-flowise/README.md).
### 2. Maria WhatsApp + RAG — prototipul, OPRIT din 2026-08-31
**LXC 104**, `/root/maria-whatsapp-bridge/` — **în afara git-ului**. Serviciile
`maria-whatsapp-bridge` și `maria-whatsapp-consumer` sunt **oprite și dezactivate** din
2026-08-31, când rolul a trecut pe versiunea din git de pe LXC 171. Codul a rămas pe disc
ca plasă de siguranță; `llama-qwen35.service` și `flowise.service` rulează mai departe și
sunt folosite de restul sistemului.
Ce era cât timp a fost activ:
| Serviciu | Ce face |
|---|---|
| `maria-whatsapp-bridge.service` | punte Baileys (Node), port 8099 |
| `maria-whatsapp-consumer.service` | `consumer.py` — citește mesaje, caută în RAG, întreabă LLM-ul |
| `llama-qwen35.service` | `llama.cpp` cu `Qwen3.5-2B-Q4_K_M`, API compatibil OpenAI pe **8091** |
| `ollama.service` | embeddings, port 11434 |
Era legată la **+40723197939**, în self-chat. **De ce a fost înlocuită:** indexul ei avea
24 de chunk-uri dintr-un singur fișier (`knowledge/roaauto_instructiuni.txt`), deci orice
întrebare din afara subiectului roaauto primea un răspuns inventat — retrieval-ul n-avea
ce să găsească.
### 3. Maria WhatsApp + RAG — versiunea din git, cea care răspunde acum
**LXC 171**, cod în `proxmox/lxc171-claude-agent/maria-whatsapp-bridge/`, stare în
`~/.maria-bridge/`. Aceleași servicii, sub `systemctl --user`.
Are tot ce s-a construit peste prototip: depozit sincronizat din Google Drive prin rclone
(11 documente, 173 de chunk-uri), suport `.xml` preferat peste `.md`, lacăt între
reindexări, dashboard de control. Foloseste LLM-ul de pe 104 prin rețea
(`LLM_URL=http://10.0.20.161:8091`) — pe 171 nu există niciun model de chat, doar
embeddings.
**Asociată la +40723197939 pe 2026-08-31**, ca dispozitiv nou al aceluiași cont; sesiunea
stă în `~/.maria-bridge/whatsapp-auth/`. Din acel moment e singura Maria care răspunde pe
WhatsApp.
Detalii: [`maria-whatsapp-bridge/README.md`](../proxmox/lxc171-claude-agent/maria-whatsapp-bridge/README.md).
---
## Cei doi boți de Discord
### Puntea Discord → Claude Code (LXC 171)
`claude-discord.service`. Un fir de Discord = o sesiune Claude Code care rulează **pe
container, cu drepturile utilizatorului `claude`**: acces la `/workspace`, chei SSH,
`pct exec` pe tot clusterul. Comenzi `/new`, `/cd`, `/model`, `/status`, `/stop`,
`/cleanup`, `/permisiuni`.
Dashboard de control: `claude-discord-dashboard.service`, port 18790, expus prin Tailscale
la `https://claude-agent.tailf7372d.ts.net/claude`. Tot de acolo se comandă și Maria.
Detalii: [`discord-bridge/README.md`](../proxmox/lxc171-claude-agent/discord-bridge/README.md).
### Echo Core (LXC 110)
`echo-core.service` — bot pe Telegram, WhatsApp **și** Discord, cu Claude Opus 4.5 prin
API. Alt bot, alt scop, alt container. Dacă un mesaj de pe Discord primește un răspuns
care nu seamănă cu Claude Code, verifică dacă nu cumva a răspuns Echo.
Detalii: [`proxmox/lxc110-moltbot/README.md`](../proxmox/lxc110-moltbot/README.md).
---
## Porturi
| Port | Container | Serviciu |
|---|---|---|
| 3000 | LXC 104 | Flowise (web, prin ngrok) |
| 4040 | LXC 104 | ngrok, interfață locală |
| 8091 | LXC 104 | `llama.cpp` / Qwen3.5-2B — **LLM-ul de răspuns al Mariei**, folosit de 171 |
| 8099 | LXC 104 | punte WhatsApp Maria — prototip, oprit |
| 11434 | LXC 104 | Ollama (embeddings) |
| 8098 | LXC 110 | punte WhatsApp Echo |
| 18789 | LXC 110 | gateway clawdbot |
| 7788 / 7789 | LXC 110 | supertonic-tts / pocket-tts |
| 8099 | LXC 171 | punte WhatsApp Maria — **instanța vie** |
| 11434 | LXC 171 | Ollama (doar embeddings, fără model de chat) |
| 18790 | LXC 171 | dashboard punte Discord + Maria |
`8099` și `11434` există pe **ambele** containere, cu conținut diferit. De aici jumătate
din confuzie — verifică întotdeauna pe ce container ești.
---
## Cum afli cu cine vorbești
```bash
# Care punte WhatsApp e conectata, si pe ce numar
ssh root@10.0.20.171 "curl -s http://127.0.0.1:8099/status" # Maria (vie)
ssh root@10.0.20.201 "pct exec 104 -- curl -s http://127.0.0.1:8099/status" # prototip (oprit)
ssh root@10.0.20.200 "pct exec 110 -- curl -s http://127.0.0.1:8098/status" # Echo
# Ce a procesat consumer-ul Mariei din git (daca e gol, nu ea a raspuns)
tail -20 ~/.maria-bridge/logs/rag.log
# LLM-ul de raspuns
curl -s http://10.0.20.161:8091/v1/models
```
**Regula:** WhatsApp-ul lui Echo (LXC 110) și cel al Mariei (LXC 171) sunt legate la
**același număr**, `+40723197939`, ca dispozitive diferite ale aceluiași cont. Un mesaj
poate ajunge la ambele. Dacă primești două răspunsuri, două punți sunt active simultan.
### Chatul „Eu" (self-chat) le vede amândouă
Ambele punți sunt *dispozitive conectate* ale aceluiași cont, deci **amândouă primesc
mesajele din chatul cu tine însuți**. Nu există o setare care să dea self-chat-ul doar
uneia. Că nu răspund amândouă ține de un singur rând din puntea lui Echo:
```js
if (msg.key.fromMe && !isGroup) continue; // bridge/whatsapp/index.js
```
În self-chat **tot ce scrii e `fromMe`**, deci Echo aruncă mesajele și doar Maria
răspunde (ea are `TEST_MODE_SELF_CHAT_ONLY` și compară explicit cu `ownJid`/`ownLid`).
Echo folosește „Eu" în celălalt sens: ca **destinație de notificări**, prin `/send` — de
aici mesajele lui care apar acolo fără să fi întrebat nimeni nimic.
Concluzia practică: cele două punți coexistă, dar **echilibrul e accidental**. Dacă
cineva scoate acel `continue` din Echo, sau pornește un al treilea bot fără filtru,
ajungi cu două răspunsuri la fiecare mesaj din „Eu".
Pentru a scoate complet Echo din WhatsApp (Telegram și Discord rămân neatinse):
```bash
ssh root@10.0.20.200 "pct exec 110 -- sudo -u moltbot XDG_RUNTIME_DIR=/run/user/1000 \
systemctl --user disable --now echo-whatsapp-bridge"
```
### Re-legarea unei punți fără cod QR
Fiecare punte Baileys **este** un dispozitiv conectat și consumă unul din cele 4 sloturi
ale contului; nu se poate ocoli (două procese cu același `auth/` folosesc aceleași chei
și se dau afară reciproc — simptomul e `No matching sessions found for message` în log).
Ambele punți acceptă însă asociere prin cod, ceea ce scutește de dus un ecran în fața
telefonului:
```bash
# Maria (LXC 171) — sau din dashboard, cardul „Conectare WhatsApp"
curl -s -X POST -H 'Content-Type: application/json' \
-d '{"phone":"40723197939"}' http://127.0.0.1:8099/pair
# Echo (LXC 110), după ce i-ai golit auth/ și ai repornit serviciul
ssh root@10.0.20.200 "pct exec 110 -- curl -s -X POST -H 'Content-Type: application/json' \
-d '{\"phone\":\"40723197939\"}' http://127.0.0.1:8098/pair"
```
Codul e valabil ~3 minute. Pe telefon: Dispozitive conectate → Conectează un dispozitiv →
**Conectează cu număr de telefon**.
**Atenție la scope-ul systemd pe LXC 110:** serviciile lui Echo sunt unități de
**utilizator** (`moltbot`, uid 1000). Un `systemctl is-active echo-core` rulat ca root
răspunde `inactive` deși botul rulează — exact genul de răspuns care trimite diagnosticul
pe pistă falsă. Folosește forma de mai sus, cu `--user` și `XDG_RUNTIME_DIR`.
---
## Capcane
- **„Maria" nu e un singur lucru.** Întreabă întâi: web (Flowise), WhatsApp de pe 104,
sau WhatsApp de pe 171?
- **Prototipul de pe 104 nu e în git** și e oprit din 2026-08-31. Nu-l reporni ca să
„repari" Maria: ar răspunde în paralel cu cea din git, pe același număr, cu un index de
24 de chunk-uri. Codul versionat e cel de pe 171.
- **Depozitul Mariei din git e oglindă a Google Drive.** `rclone sync` șterge local ce nu
mai există în Drive; un document adăugat manual din dashboard dispare la următoarea
sincronizare.
- **Reindexarea durează ~21 de minute** pentru 173 de chunk-uri (embedding CPU-only,
~7,3 s per chunk pe LXC 171). Nu pare blocată — chiar durează.
- **Maria nu are voie la infrastructură.** E chatbot pentru clienții ERP ROA; nimic din
`proxmox/`, niciun IP, port sau credențial nu intră în depozitul ei de documente.
Puntea Discord, în schimb, are acces la tot. Vezi `claude-agent/CLAUDE.md`.