fix(maria): fara "caut informatia" la completari, si trei feluri de raspuns
Din firul testat in grup: la "Urgent este", "Nu m-a contactat nimeni. Cat mai
dureaza?" si "Tot nimic", Maria trimitea de fiecare data "Caut informatia, revin
imediat...", calcula un embedding pe care il arunca, si raspundea acelasi sablon
("am adaugat si asta la M-..."). La intrebarea "cat mai dureaza" nu raspundea deloc,
iar "urgent" nu schimba nimic nicaieri.
- Completarea se decide INAINTEA confirmarii si a cautarii: raspunsul vine instant,
deci nici promisiune, nici embedding degeaba (~1-2s per mesaj).
- triaj.fel_completare: urgenta / stare / detaliu.
- urgenta -> escaladarea se marcheaza si suportul primeste un mesaj cu URGENT;
- stare -> raspuns cu ce stim (de cat timp asteapta) si reamintire catre echipa,
cel mult una la 15 minute, ca sa nu sune telefonul la fiecare "tot nimic";
- detaliu -> confirmare scurta, cu formularea rotita.
- Peste 30 de minute fara raspuns Maria o spune pe fata si indruma spre telefon
(SUPPORT_PHONE), in loc sa repete ca "echipa vede detaliul".
- Gramatica: "acum 10 minute", nu "acum 10 de minute".
Teste: 99 pass.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Q4uzvgm7AyJch5WH8QHRhY
This commit is contained in:
@@ -67,32 +67,105 @@ def _escaladare(ref: str) -> None:
|
||||
json.dumps({"ref": ref, "text": "eroare initiala"}), encoding="utf-8")
|
||||
|
||||
|
||||
def test_raspunsul_despre_urgenta_intra_in_escaladarea_deschisa(monkeypatch):
|
||||
def _fara_suport(monkeypatch):
|
||||
import config
|
||||
monkeypatch.setattr(config, "get", lambda k, d=None: "" if k == "SUPPORT_JID"
|
||||
else config.DEFAULTS.get(k, d))
|
||||
|
||||
|
||||
def test_completarea_intra_in_escaladarea_deschisa(monkeypatch):
|
||||
import config
|
||||
import consumer
|
||||
|
||||
monkeypatch.setattr(config, "get", lambda k, d=None: "" if k == "SUPPORT_JID"
|
||||
else config.DEFAULTS.get(k, d))
|
||||
_fara_suport(monkeypatch)
|
||||
_escaladare("M-TEST-1")
|
||||
assert consumer.append_followup("M-TEST-1", {"id": "x"}, "ma blocheaza, nu pot factura")
|
||||
raspuns = consumer.completeaza("M-TEST-1", {"id": "x"}, "eram la salvarea unei facturi")
|
||||
assert "M-TEST-1" in raspuns
|
||||
|
||||
fisier = next((config.STATE_DIR / "escalations").glob("*-M-TEST-1.json"))
|
||||
record = json.loads(fisier.read_text(encoding="utf-8"))
|
||||
assert record["completari"][0]["text"] == "ma blocheaza, nu pot factura"
|
||||
assert record["completari"][0]["text"] == "eram la salvarea unei facturi"
|
||||
assert record["completari"][0]["fel"] == "detaliu"
|
||||
|
||||
|
||||
def test_completarile_se_aduna_nu_se_inlocuiesc(monkeypatch):
|
||||
"""Omul raspunde de mai multe ori; prima data nu inchide firul."""
|
||||
def test_completarile_se_aduna_si_nu_repeta_acelasi_text(monkeypatch):
|
||||
"""Trei confirmari identice una dupa alta suna a robot."""
|
||||
import config
|
||||
import consumer
|
||||
|
||||
monkeypatch.setattr(config, "get", lambda k, d=None: "" if k == "SUPPORT_JID"
|
||||
else config.DEFAULTS.get(k, d))
|
||||
_fara_suport(monkeypatch)
|
||||
_escaladare("M-TEST-3")
|
||||
consumer.append_followup("M-TEST-3", {"id": "a"}, "da, ma blocheaza")
|
||||
consumer.append_followup("M-TEST-3", {"id": "b"}, "eram la salvarea unei facturi")
|
||||
raspunsuri = [consumer.completeaza("M-TEST-3", {"id": str(i)}, t) for i, t in enumerate(
|
||||
["eram la facturi", "si la rapoarte", "si la import"])]
|
||||
assert len(set(raspunsuri)) == 3
|
||||
|
||||
fisier = next((config.STATE_DIR / "escalations").glob("*-M-TEST-3.json"))
|
||||
record = json.loads(fisier.read_text(encoding="utf-8"))
|
||||
assert [c["text"] for c in record["completari"]] == [
|
||||
"da, ma blocheaza", "eram la salvarea unei facturi"]
|
||||
assert len(record["completari"]) == 3
|
||||
|
||||
|
||||
def test_urgenta_marcheaza_escaladarea_si_anunta(monkeypatch):
|
||||
import config
|
||||
import consumer
|
||||
|
||||
trimise = []
|
||||
monkeypatch.setattr(consumer, "_notifica_suport",
|
||||
lambda text: trimise.append(text) or True)
|
||||
_escaladare("M-TEST-U")
|
||||
raspuns = consumer.completeaza("M-TEST-U", {"id": "u"}, "Este foarte urgent, ma blocheaza")
|
||||
|
||||
record = json.loads(next((config.STATE_DIR / "escalations").glob("*-M-TEST-U.json"))
|
||||
.read_text(encoding="utf-8"))
|
||||
assert record["urgenta"] is True
|
||||
assert record["completari"][0]["fel"] == "urgenta"
|
||||
assert trimise and trimise[0].startswith("[Maria] URGENT")
|
||||
assert "urgenta" in raspuns.lower()
|
||||
|
||||
|
||||
def test_intrebarea_de_stare_primeste_un_raspuns_nu_o_confirmare(monkeypatch):
|
||||
"""„Nu m-a contactat nimeni. Cat mai dureaza?" primea „am adaugat si asta"."""
|
||||
import config
|
||||
import consumer
|
||||
|
||||
trimise = []
|
||||
monkeypatch.setattr(consumer, "_notifica_suport",
|
||||
lambda text: trimise.append(text) or True)
|
||||
_escaladare("M-TEST-S")
|
||||
raspuns = consumer.completeaza("M-TEST-S", {"id": "s"},
|
||||
"Nu m-a contactat nimeni. Cat mai dureaza?")
|
||||
assert "am adaugat" not in raspuns.lower()
|
||||
assert "M-TEST-S" in raspuns
|
||||
assert trimise and "intreaba" in trimise[0]
|
||||
|
||||
# a doua intrebare la un minut distanta nu mai suna telefonul echipei
|
||||
trimise.clear()
|
||||
consumer.completeaza("M-TEST-S", {"id": "s2"}, "tot nimic")
|
||||
assert not trimise
|
||||
|
||||
|
||||
def test_dupa_o_jumatate_de_ora_maria_o_spune_pe_fata():
|
||||
import triaj
|
||||
text = triaj.raspuns_stare("M-1", 42, False, telefon="0241 000 000")
|
||||
assert "42" in text and "0241 000 000" in text
|
||||
assert "nu mi-a raspuns nimeni" in text
|
||||
|
||||
|
||||
def test_fel_completare():
|
||||
import triaj
|
||||
assert triaj.fel_completare("Este foarte urgent") == "urgenta"
|
||||
assert triaj.fel_completare("ma blocheaza complet") == "urgenta"
|
||||
assert triaj.fel_completare("Cat mai dureaza?") == "stare"
|
||||
assert triaj.fel_completare("Tot nimic") == "stare"
|
||||
assert triaj.fel_completare("eram la salvarea unei facturi") == "detaliu"
|
||||
# ordinea conteaza: urgenta bate intrebarea de stare
|
||||
assert triaj.fel_completare("urgent, cat mai dureaza?") == "urgenta"
|
||||
|
||||
|
||||
def test_a_doua_intrebare_de_stare_nu_repeta_acelasi_text():
|
||||
import triaj
|
||||
intai = triaj.raspuns_stare("M-1", 10, False, a_cata=0)
|
||||
apoi = triaj.raspuns_stare("M-1", 11, False, a_cata=1)
|
||||
assert intai != apoi
|
||||
# „acum 10 minute", nu „acum 10 de minute"
|
||||
assert "10 minute" in intai and "10 de minute" not in intai
|
||||
assert triaj.minute_text(25) == "25 de minute"
|
||||
|
||||
Reference in New Issue
Block a user