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
214 lines
10 KiB
Markdown
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`.
|