New features: Route Stickness, Handoff, Clarification, Read-Only/Transactional, Long Term Memory

This commit is contained in:
2026-08-03 08:57:02 -03:00
parent e684b0ecc3
commit 8e414e4e26
604 changed files with 38978 additions and 402 deletions

View File

@@ -0,0 +1,50 @@
import asyncio
from types import SimpleNamespace
from agent_framework.runtime.agent_runtime import AgentRuntimeMixin
class Registry:
def __init__(self):
self.items={
'consultar_pedido': SimpleNamespace(selection_keywords=['pedido','status do pedido']),
'consultar_entrega': SimpleNamespace(selection_keywords=['entrega','rastreio']),
}
def get_tool(self,name): return self.items.get(name)
class Router:
registry=Registry()
def parameter_extract_rules(self, tool):
return {'order_id': {'from':'message','type':'string','strategy':'hybrid','pattern':r'(?i)\bpedido\s+([A-Z0-9-]+)\b','group':1}}
class Runtime(AgentRuntimeMixin):
tool_router=Router()
llm=None
settings=SimpleNamespace(SKIP_RAG_WHEN_MCP_SUFFICIENT=True)
def test_selects_only_relevant_read_only_tool():
r=Runtime()
assert r._select_read_only_tools(['consultar_pedido','consultar_entrega'],'consultar pedido 123') == ['consultar_pedido']
assert r._select_read_only_tools(['consultar_pedido','consultar_entrega'],'rastreio da entrega 123') == ['consultar_entrega']
def test_hybrid_regex_does_not_require_llm():
r=Runtime()
state={'user_text':'consultar pedido 123','sanitized_input':'consultar pedido 123','context':{},'business_context':{}}
out=asyncio.run(r._extract_mcp_parameters('consultar_pedido',{},state))
assert out['order_id']=='123'
def test_direct_answer_is_blocked_for_transactional_request():
runtime = object.__new__(AgentRuntimeMixin)
registry = SimpleNamespace(
tools={"consultar_pedido": object(), "solicitar_devolucao": object()},
get_tool=lambda name: {
"consultar_pedido": SimpleNamespace(selection_keywords=["pedido"]),
"solicitar_devolucao": SimpleNamespace(selection_keywords=["devolver pedido", "devolver", "devolução"]),
}.get(name),
)
runtime.tool_router = SimpleNamespace(registry=registry)
runtime._resolve_tool_execution_policy = lambda name, args=None: {"operation_type": "transactional" if name == "solicitar_devolucao" else "read_only"}
state = {"user_text": "Quero devolver o pedido 123"}
results = [{"ok": True, "tool_name": "consultar_pedido", "result": {"order_id": "123", "status": "ENTREGUE"}}]
assert runtime.build_direct_mcp_answer(state, results, agent_label="OrdersAgent") is None