bugfixes: router stickness vs transaction workflow parameters

This commit is contained in:
2026-08-21 14:34:30 -03:00
parent bdc44b15d6
commit b5d2a12953
170 changed files with 1479 additions and 176 deletions

View File

@@ -0,0 +1,75 @@
import pytest
from agent_framework.guardrails.rails import ProactiveOfferRail
@pytest.mark.asyncio
@pytest.mark.parametrize("status", ["COLLECTING_PARAMETERS", "AWAITING_CONFIRMATION"])
async def test_aoferta_bypasses_transaction_continuation_without_llm(monkeypatch, status):
async def should_not_run(*args, **kwargs):
raise AssertionError("AOFERTA LLM must not run for transaction continuation")
monkeypatch.setattr(
"agent_framework.guardrails.rails.classify_with_framework_llm",
should_not_run,
)
decision = await ProactiveOfferRail().evaluate(
"Para prosseguir, informe valor.",
{"transaction_status": status},
)
assert decision.allowed is True
assert decision.code == "AOFERTA"
assert decision.metadata["mechanism"] == "deterministic_transaction_bypass"
assert decision.metadata["transaction_status"] == status
@pytest.mark.asyncio
async def test_aoferta_detects_transaction_continuation_from_mcp_results(monkeypatch):
async def should_not_run(*args, **kwargs):
raise AssertionError("AOFERTA LLM must not run for transaction continuation")
monkeypatch.setattr(
"agent_framework.guardrails.rails.classify_with_framework_llm",
should_not_run,
)
decision = await ProactiveOfferRail().evaluate(
"Você confirma o cancelamento do serviço TIM Fashion?",
{
"mcp_results": [
{
"tool_name": "cancelar_vas_avulso",
"awaiting_confirmation": True,
"transaction_status": "AWAITING_CONFIRMATION",
}
]
},
)
assert decision.allowed is True
assert decision.metadata["transaction_status"] == "AWAITING_CONFIRMATION"
@pytest.mark.asyncio
async def test_aoferta_still_calls_llm_outside_transaction_continuation(monkeypatch):
calls = []
async def fake_classify(*args, **kwargs):
calls.append((args, kwargs))
return {"allowed": False, "reason": "oferta proativa"}
monkeypatch.setattr(
"agent_framework.guardrails.rails.classify_with_framework_llm",
fake_classify,
)
decision = await ProactiveOfferRail().evaluate(
"Quer aproveitar e cancelar outro serviço?",
{"transaction_status": "COMPLETED"},
)
assert len(calls) == 1
assert decision.allowed is False
assert decision.metadata["mechanism"] == "llm_supervisor"