Files
ROMFASTSQL/proxmox/lxc171-claude-agent/maria-whatsapp-bridge/ops/env.example
Claude Agent 47110d71bf fix(maria): mesajul si captura sunt acelasi lucru, iar cosinusul singur nu mai e dovada
Doua greseli din grupul "Maria Test", 2026-09-01, pe care 27409fb le-a atenuat dar
nu le-a rezolvat.

1. La o reclamatie vaga Maria cauta, in loc sa intrebe. "Buna . Am si eu o factura
   pe luna august cu eroare in spv la trimitere AUTO SULE" nu spune CE eroare e —
   n-are ce cauta in documente si n-are ce trimite la suport, fiindca programatorul
   ar pune exact aceeasi intrebare. Gardul (triaj.prea_vag) exista, dar cerea text
   sub 12 cuvinte; mesajul are 14. Gresea si invers: "nu pot incarca factura in SPV,
   imi da eroare de certificat" are 9 cuvinte si ARE raspuns in documente, si era
   oprita degeaba. Lungimea nu masoara cat de precis e mesajul.
   -> gardul nu mai numara cuvinte si se aplica DUPA cautare, doar cand nu exista
      acoperire. O singura data pe fir: daca nici intrebat omul nu spune mai mult,
      mesajul pleaca la suport.

2. Textul si captura, trimise una dupa alta, erau tratate ca doua probleme fara
   legatura. `este_continuare` rupea firul la ORICE imagine — dar cazul frecvent e
   tocmai omul care scrie problema si trimite captura imediat dupa, sau care
   raspunde la "trimite-mi o captura". Textul se pierdea, captura se cauta doar pe
   OCR-ul ei, se deschideau doua fire si se puteau deschide doua escaladari pentru
   aceeasi problema.
   -> o captura in primele FIR_IMAGINE_MIN (5) minute continua firul: textul citit
      din ea intra in ancora (cu tot cu coduri), cautarea se face pe mesaj +
      captura, iar pe o escaladare deschisa pleaca la aceeasi referinta — cu
      imaginea, nu doar cu textul citit din ea (_notifica_suport ia si media).

Si, ca urmare a lui (2): RANK_STRONG_COSINE dispare. Interogarea pe un fir e ancora
plus mesajul nou, deci cosinusul urca la fiecare replica fara sa apara vreo dovada
noua — aceeasi captura da 0,778 singura si 0,836 cu mesajul de dinainte, adica peste
0,80 pus ieri. Orice prag fix de sus e trecut de o discutie destul de lunga. Acoperirea
ramane pe dovada lexicala (termenii distinctivi ai intrebarii chiar in chunk-uri),
care e stabila la lungime. Niciun caz cu raspuns in documente nu avea nevoie de
scurtatura.

ops/calibrate-rank.py: 26/26, cu interogarea combinata adaugata la set. Teste: 102 pass.
Verificat end-to-end pe scenariul real (mesaj, apoi captura la 10 secunde): intrebare
de detalii, apoi o singura escaladare care poarta si textul si captura.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Q4uzvgm7AyJch5WH8QHRhY
2026-09-01 19:44:24 +00:00

84 lines
4.2 KiB
Plaintext

# Configurarea puntii WhatsApp+RAG a lui Maria.
#
# install.sh copiaza acest fisier in ~/.maria-bridge/env cu drepturi 0600.
# Format KEY=value, fara `export`, fara expandare de variabile.
# --- Puntea WhatsApp (whatsapp/index.js) -----------------------------------
BRIDGE_HOST=127.0.0.1
BRIDGE_PORT=8099
# true = raspunde DOAR in chatul cu tine insuti (self-chat). Pune "false" abia
# dupa ce esti multumit de calitatea raspunsurilor — altfel Maria raspunde la
# oricine iti scrie pe numarul legat.
TEST_MODE_SELF_CHAT_ONLY=true
# Grupuri in care Maria raspunde chiar si cu self-chat-only (JID-uri, separate prin
# virgula). JID-ul unui grup se citeste din punte: curl -s localhost:8099/groups
# ATENTIE: nu pune un grup in care raspunde si Echo (LXC 110) — puntea lui nu
# filtreaza `fromMe` in grupuri, deci cei doi boti isi raspund unul altuia la
# nesfarsit. Vezi docs/chatboti-si-punti.md.
ALLOWED_GROUP_JIDS=
# Imaginile primite (capturi cu erori) peste aceasta marime sunt refuzate, fara
# descarcare. O captura de ecran normala are sub 1 MB.
MAX_MEDIA_MB=8
# --- OCR pentru capturile de ecran ------------------------------------------
# Modelul de raspuns e strict text, deci capturile trec prin tesseract inainte de
# RAG (vezi rag/ocr.py). Cere: apt-get install tesseract-ocr tesseract-ocr-ron
OCR_LANGS=ron+eng
OCR_MAX_CHARS=1500
OCR_TIMEOUT_S=60
# --- Ordonare (rank) si pragul de escaladare ---------------------------------
# Chunk-urile se ordoneaza de doua ori — semantic (embeddings) si lexical (BM25) —
# iar clasamentele se fuzioneaza. Vezi rag/rank.py; valorile de mai jos sunt
# calibrate pe indexul real, nu alese din burta.
# Sub RANK_WEAK_COSINE escaladam direct; peste, raspundem doar daca termenii rari
# din intrebare (coduri de eroare, in general) chiar apar in chunk-urile gasite.
# Nu exista prag „cosinus destul de mare ca sa nu mai verificam" — vezi rag/rank.py.
RANK_WEAK_COSINE=0.58
RANK_RECALL_N=12
# Ce fractiune din termenii distinctivi ai intrebarii trebuie sa apara in
# chunk-urile gasite, ca sa salvam un cosinus de mijloc. Un singur termen gasit
# nu e o dovada — vezi ops/calibrate-rank.py.
RANK_MIN_RARE_RATIO=0.5
# --- Escaladare la suport ----------------------------------------------------
# Unde pleaca intrebarile la care Maria NU are raspuns in documente. Fara asta ar
# raspunde generic, ceea ce e mai rau decat sa nu raspunda deloc.
# JID de WhatsApp: "<numar>@s.whatsapp.net" pentru o persoana,
# "<id>@g.us" pentru un grup. Numarul se scrie international, fara "+".
# Gol = escaladarile se scriu doar in ~/.maria-bridge/escalations/, fara notificare.
SUPPORT_JID=
# Numarul spus clientului cand asteapta de peste 30 de minute fara raspuns.
SUPPORT_PHONE=
# --- Backend LLM + embeddings -----------------------------------------------
# Modelul de chat folosit pentru raspunsuri (format compatibil OpenAI
# /v1/chat/completions). Implicit presupune un tunel/proxy local catre acelasi
# backend folosit de Echo (LXC 110) — vezi docs/maria-whatsapp-rag-prototype.md.
LLM_URL=http://127.0.0.1:8091
# Ollama, pentru embeddings (nomic-embed-text).
OLLAMA_URL=http://127.0.0.1:11434
EMBED_MODEL=nomic-embed-text
TOP_K=3
MAX_TOKENS=250
# 0 = raspunsul e mereu acelasi si sta in context. Nu urca fara motiv.
LLM_TEMPERATURE=0
POLL_INTERVAL_S=2
# --- Depozit de documente + sincronizare Google Drive -----------------------
# Tinta rclone pentru dosarul de documente din Drive (pe Windows apare ca
# D:\GoogleDrive\romfast\document_store). Se aduc doar *.txt, *.md, *.xml.
# Gol = sincronizare dezactivata; documentele se administreaza doar manual din
# dashboard. Vezi README.md, "Sincronizare cu Google Drive": autorizarea se face
# cu `rclone authorize` pe o masina cu browser, tokenul se muta aici — fara cont
# de serviciu. Exemplu, cu dosarul fixat pe ID:
# DRIVE_REMOTE=gdrive,root_folder_id=1C4e75zgH1_7ZK-_oBP5ZZBvUPh3iEo1O:
DRIVE_REMOTE=
# --- control -----------------------------------------------------------------
# Fara dashboard propriu: start/stop/restart, documente, reindexare si
# sincronizare Drive se fac din dashboard-ul puntii Discord (discord-bridge/),
# sectiunea "Maria — WhatsApp + RAG" — un singur panou comun, o singura
# autentificare (DASHBOARD_TOKEN din ~/.claude-discord/env).