Files
agent_contas/tests/migration/test_framework_rag_directive.py

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.",
]