106 lines
3.3 KiB
Python
106 lines
3.3 KiB
Python
from __future__ import annotations
|
|
|
|
from types import SimpleNamespace
|
|
|
|
import pytest
|
|
|
|
from agent_framework.runtime.agent_runtime import AgentRuntimeMixin
|
|
from app.domain.contas.workflow_actions import build_contas_workflow_actions
|
|
|
|
|
|
class DummyAgent(AgentRuntimeMixin):
|
|
pass
|
|
|
|
|
|
class Doc:
|
|
def __init__(self, ident: str, score: float):
|
|
self.id = ident
|
|
self.score = score
|
|
|
|
|
|
class RagResult:
|
|
def __init__(self, query: str):
|
|
self.query = query
|
|
self.latency_ms = 3
|
|
self.documents = [Doc("d1", 0.9)]
|
|
self.graph_neighbors = []
|
|
self.metadata = {"rewritten": False}
|
|
|
|
def as_prompt_context(self):
|
|
return "ORIENTACAO OFICIAL DO PARCEIRO"
|
|
|
|
|
|
class RagService:
|
|
def __init__(self):
|
|
self.calls = []
|
|
|
|
async def retrieve(self, query, *, namespace, graph_node, rewrite):
|
|
self.calls.append((query, namespace, graph_node, rewrite))
|
|
return RagResult(query)
|
|
|
|
|
|
@pytest.mark.asyncio
|
|
async def test_tool_pode_forcar_rag_e_fornecer_query_override():
|
|
rag = RagService()
|
|
agent = DummyAgent()
|
|
agent.rag_service = rag
|
|
agent.guardrail_pipeline = None
|
|
agent.settings = SimpleNamespace(
|
|
SKIP_RAG_WHEN_MCP_SUFFICIENT=True,
|
|
ENABLE_RAG_QUERY_REWRITE=False,
|
|
ENABLE_RAG_CONTEXT_COMPRESSION=False,
|
|
)
|
|
state = {
|
|
"sanitized_input": "quero cancelar o paramount",
|
|
"user_text": "quero cancelar o paramount",
|
|
"route": "vas_agent",
|
|
"mcp_results": [{
|
|
"ok": True,
|
|
"result": {
|
|
"status": "COMPLETED",
|
|
"output": {
|
|
"registrar_nao": {
|
|
"requires_rag": True,
|
|
"rag_queries": [
|
|
"Como cancelar Paramount+ no parceiro?",
|
|
"Procedimento oficial Paramount+",
|
|
],
|
|
}
|
|
},
|
|
},
|
|
}],
|
|
}
|
|
context, metadata = await agent._retrieve_rag_context(state)
|
|
assert context == "ORIENTACAO OFICIAL DO PARCEIRO"
|
|
assert rag.calls[0][0] == "Como cancelar Paramount+ no parceiro?\nProcedimento oficial Paramount+"
|
|
assert metadata["required_by_tool"] is True
|
|
assert metadata["query_overridden_by_tool"] is True
|
|
assert agent.build_direct_mcp_answer(state, state["mcp_results"], agent_label="VAS") is None
|
|
|
|
|
|
def test_vas_estrategico_rejeitado_declara_rag_sem_executar_rag_no_dominio():
|
|
class Service:
|
|
class Client:
|
|
def abrir_protocolo(self, payload):
|
|
return {"interactionProtocol": "P1"}
|
|
client = Client()
|
|
|
|
action = build_contas_workflow_actions(Service()).get("registrar_atendimento_vas_estrategico")
|
|
result = action({
|
|
"linhas": [{
|
|
"msisdn": "11999999999",
|
|
"bundle_names": [],
|
|
"estrategico_names": ["Paramount+ Mensal", "YouTube Premium"],
|
|
}],
|
|
"mensagem_base": "orientação genérica",
|
|
}, {
|
|
"input": {"resposta_usuario": "NAO"},
|
|
"execution_id": "wf1",
|
|
"vars": {},
|
|
})
|
|
assert result["requires_rag"] is True
|
|
assert result["rag_queries"] == [
|
|
"Como cancelar o serviço Paramount+ Mensal no parceiro? Procedimento oficial de cancelamento.",
|
|
"Como cancelar o serviço YouTube Premium no parceiro? Procedimento oficial de cancelamento.",
|
|
]
|