new feature: Multi-Intent

This commit is contained in:
2026-09-10 16:12:08 -03:00
parent 2a563840c1
commit 82d96f2dbf
302 changed files with 2070 additions and 28 deletions

Binary file not shown.

View File

@@ -42,6 +42,8 @@ class AgentState(TypedDict, total=False):
missing_parameters: list[str]
supervisor_plan: dict[str, Any]
supervisor_results: list[dict[str, Any]]
pending_topics: list[dict[str, Any]]
handled_topics: list[dict[str, Any]]
active_agent: str
route_bypassed: bool
continuity_signal: dict[str, Any]
@@ -67,4 +69,3 @@ class AgentState(TypedDict, total=False):
regulatory_context: dict[str, Any]
terminal_status: str
conversation_terminal_message: str

View File

@@ -7,6 +7,7 @@ from agent_framework.guardrails.rail_action import RailAction
from agent_framework.guardrails.rail_result import RailResult
from agent_framework.judges.judge import JudgePipeline
from agent_framework.routing.enterprise_router import EnterpriseRouter
from agent_framework.routing.pending_topics import drain_pending_topics
from app.domain.contas.conversation_policy import evaluate as evaluate_contas_conversation_policy
from agent_framework.supervisor.supervisor import Supervisor
from agent_framework.observability.workflow_events import WorkflowTelemetry
@@ -724,6 +725,10 @@ class AgentWorkflow:
"reason": decision.reason if decision.method == "continuity" else None,
"profile": (decision.metadata or {}).get("continuity_profile"),
} if decision.method == "continuity" else {},
"pending_topics": (
(decision.metadata or {}).get("multi_intent_plan", {}).get("operations", [])[1:]
if (decision.metadata or {}).get("multi_intent_plan") else []
),
}
async def conversation_policy(self, state):
@@ -922,14 +927,27 @@ class AgentWorkflow:
agente gerar `answer` e antes dos judges/persistência, produzindo campos
supervisor_* no state e eventos GRL.001..GRL.009 via AgentObserver.
"""
drained = await drain_pending_topics(
state,
str(state.get("answer") or ""),
{
"faturas_agent": self.faturas.run,
"vas_agent": self.vas.run,
"contestacao_agent": self.contestacao.run,
"suporte_contas_agent": self.suporte_contas.run,
},
)
candidate = drained.answer
if not bool(getattr(self.settings, "ENABLE_OUTPUT_SUPERVISOR", True)):
return {
"answer": candidate,
"final_answer": candidate,
"pending_topics": drained.pending_topics,
"handled_topics": drained.handled_topics,
"output_guardrails_already_applied": False,
"supervisor_action": "disabled",
"supervisor_attempt": int(state.get("supervisor_attempt", 0)),
}
candidate = state.get("answer") or ""
context = {
**self._output_guardrail_context(state),
"tenant_id": state.get("tenant_id"),
@@ -1000,6 +1018,8 @@ class AgentWorkflow:
"output_guardrails_already_applied": True,
"guardrail_decisions": state.get("guardrail_decisions", [])
+ [item for r in decision.results for item in (r.metadata or {}).get("framework_decisions", [])],
"pending_topics": drained.pending_topics,
"handled_topics": drained.handled_topics,
}
async def output_guardrails(self, state):