new feature: Multi-Intent

This commit is contained in:
2026-09-10 16:12:04 -03:00
parent ffe47e8d49
commit 05410adf09
223 changed files with 1121 additions and 21 deletions

View File

@@ -0,0 +1,66 @@
from agent_framework.routing.models import IntentDefinition
from agent_framework.routing.multi_intent import MultiIntentPlanner
def _planner():
return MultiIntentPlanner([
IntentDefinition(name="cancel", agent="orders", priority=10, keywords=["cancelar pedido"], mcp_tools=["cancelar_pedido"]),
IntentDefinition(name="invoice", agent="billing", priority=20, keywords=["segunda via"], mcp_tools=["consultar_fatura"]),
], {
"enabled": True,
}, transactional_tools={"cancelar_pedido"})
def test_builds_validated_plan_and_keeps_primary_first():
plan = _planner().plan("quero cancelar pedido e preciso da segunda via")
assert plan is not None
assert [item.intent for item in plan.operations] == ["cancel", "invoice"]
assert plan.operations[1].disposition == "execute"
assert plan.operations[1].tools == ["consultar_fatura"]
def test_confirmation_with_secondary_does_not_lose_confirmation():
plan = _planner().plan_confirmation_secondary(
"sim e preciso da segunda via", primary_intent="cancel", primary_agent="orders"
)
assert plan is not None
assert [item.intent for item in plan.operations] == ["cancel", "invoice"]
assert MultiIntentPlanner.public_messages(plan) == []
def test_transactional_intent_is_primary_even_when_mentioned_second():
plan = _planner().plan("preciso da segunda via e quero cancelar pedido")
assert plan is not None
assert [item.intent for item in plan.operations] == ["cancel", "invoice"]
def test_does_not_plan_single_intent_or_invent_unknown_intent():
assert _planner().plan("quero cancelar pedido") is None
assert _planner().plan("quero cancelar pedido e saber o clima") is None
def test_known_primary_with_actionable_unknown_creates_off_context_topic():
plan = _planner().plan("quero cancelar pedido e alterar meu CNPJ")
assert plan is not None
assert plan.operations[1].intent == "off_context"
assert plan.operations[1].disposition == "unsupported"
def test_confirmation_with_unknown_secondary_keeps_confirmation():
plan = _planner().plan_confirmation_secondary(
"sim e altere meu CNPJ", primary_intent="cancel", primary_agent="orders"
)
assert plan is not None
assert plan.operations[0].intent == "cancel"
assert plan.operations[1].intent == "off_context"
def test_single_word_keyword_does_not_match_a_longer_word_prefix():
planner = MultiIntentPlanner([
IntentDefinition(name="cancel", agent="orders", priority=10, keywords=["cancela"]),
IntentDefinition(name="invoice", agent="billing", priority=20, keywords=["segunda via"]),
])
plan = planner.plan("sim, pode cancelar e preciso da segunda via")
assert plan is not None
assert all(item.intent != "cancel" for item in plan.operations)
assert [item.intent for item in plan.operations] == ["invoice", "off_context"]