feat(maria): raspunsul omului de la suport se pastreaza in jurnalul escaladarii
Jurnalul pastra doar intrebarile FARA raspuns. Replica omului care prelua discutia se scria numai in firul din `conversations/`, care se sterge dupa FIR_TTL_MIN — deci exact rezolvarea disparea, iar perechea eroare + rezolvare trebuia recuperata manual din WhatsApp. Acum, cat tine preluarea, fiecare mesaj al omului se adauga la fisierul escaladarii (`completari`, `"fel": "raspuns_om"`, cu cine a scris). La fiecare mesaj, nu doar la primul: rezolvarea vine de obicei in doua-trei replici. De aici se pot extrage erorile si rezolvarile pentru `document_store` — „CUI cumparator incorect" ajunge in documente doar daca o scrie cineva, si cel mai ieftin loc de unde poate fi scrisa e ce a raspuns deja omul o data. Limita, documentata in README: preluarea se detecteaza doar in grupuri cu cel putin FIR_PRELUARE_MIN_PARTICIPANTI participanti, deci nu in self-chat si nu in grupul de test. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01Q4uzvgm7AyJch5WH8QHRhY
This commit is contained in:
@@ -450,6 +450,38 @@ def completeaza(ref: str, msg: dict, text: str) -> str | None:
|
||||
return raspuns
|
||||
|
||||
|
||||
def raspuns_de_om(ref: str, msg: dict, text: str) -> None:
|
||||
"""Ce a raspuns omul de la suport, in fisierul escaladarii.
|
||||
|
||||
Fara asta, jurnalul pastra doar intrebarile FARA raspuns: rezolvarea se scria
|
||||
numai in firul din `conversations/`, care se sterge dupa `FIR_TTL_MIN`. Or
|
||||
perechea eroare + rezolvare e chiar materia prima pentru documentele RAG —
|
||||
„CUI cumparator incorect" e in documente doar daca cineva o scrie acolo, si
|
||||
cel mai ieftin loc de unde se poate scrie e ce a raspuns omul deja o data.
|
||||
|
||||
Se cheama la fiecare mesaj al omului cat tine preluarea, nu doar la primul:
|
||||
rezolvarea vine de obicei in doua-trei replici.
|
||||
"""
|
||||
text = (text or "").strip()
|
||||
if not text:
|
||||
return
|
||||
fisier = _fisier_escaladare(ref)
|
||||
if fisier is None:
|
||||
return
|
||||
try:
|
||||
record = json.loads(fisier.read_text(encoding="utf-8"))
|
||||
record.setdefault("completari", []).append({
|
||||
"at": time.time(), "text": text, "fel": "raspuns_om",
|
||||
"cine": msg.get("pushName") or msg.get("from") or "necunoscut",
|
||||
"message_id": msg.get("id"),
|
||||
})
|
||||
fisier.write_text(json.dumps(record, ensure_ascii=False, indent=2), encoding="utf-8")
|
||||
except (OSError, ValueError) as exc:
|
||||
print(f"[consumer] nu pot salva raspunsul omului la {ref}: {exc}", file=sys.stderr)
|
||||
return
|
||||
print(f"[consumer] raspuns de la om, pastrat la {ref}: {text[:60]!r}", file=sys.stderr)
|
||||
|
||||
|
||||
_GRUPURI_CACHE: dict = {"at": 0.0, "date": {}}
|
||||
GRUPURI_TTL_S = 600
|
||||
|
||||
@@ -527,6 +559,8 @@ def handle(index: Index, msg: dict) -> None:
|
||||
if preluare_de_om(msg):
|
||||
fir = fir or fir_mod.deschide(sender, "")
|
||||
fir_mod.adauga(fir, "om", text)
|
||||
if fir.get("ref"):
|
||||
raspuns_de_om(fir["ref"], msg, text)
|
||||
fir_mod.taci(fir)
|
||||
fir_mod.salveaza(fir)
|
||||
print(f"[consumer] {sender}: a preluat un om, tac {fir_mod.tacere_s() // 60} min",
|
||||
|
||||
Reference in New Issue
Block a user