bugfixes: router stickness vs transaction workflow parameters

This commit is contained in:
2026-08-20 22:59:33 -03:00
parent 250e86819c
commit 13a873bcff
269 changed files with 1107 additions and 11 deletions

View File

@@ -78,6 +78,7 @@ TOOLS: dict[str, dict[str, Any]] = {
"consultar_historico_vas": {"description": "Consulta histórico de VAS.", "input_schema": {"msisdn": "string"}},
"cancelar_vas_avulso": {"description": "Executa workflow de cancelamento VAS após confirmação transacional do framework.", "input_schema": {"msisdn": "string", "subject": "string", "items": "array"}},
"tratar_vas_estrategico": {"description": "Executa workflow conversacional de VAS estratégico/bundle.", "input_schema": {"msisdn": "string", "subject": "string", "items": "array"}},
"validar_contestacao": {"description": "Pre-valida contestação sem executar efeitos transacionais.", "input_schema": {"msisdn": "string", "subject": "string", "valor": "number", "motivo": "string", "target_tool": "string"}},
"contestar_cobranca": {"description": "Executa workflow completo de contestação/Conta Certa.", "input_schema": {"msisdn": "string", "subject": "string", "valor": "number"}},
"pro_rata": {"description": "Executa workflow conversacional de pró-rata.", "input_schema": {"msisdn": "string", "planos": "array", "has_plano_controle": "boolean"}},
"termino_desconto": {"description": "Formata capability de término de desconto.", "input_schema": {"msisdn": "string", "nome_plano": "string"}},
@@ -817,6 +818,25 @@ async def _run_cancelamento_com_contestacao(args: dict[str, Any]) -> dict[str, A
},
}
async def _validate_contestation(args: dict[str, Any]) -> dict[str, Any]:
"""Business-owned, side-effect-free eligibility validation for contestation."""
await _enrich_invoice_context("contestar_cobranca", args)
preflight = _preflight_subject("contestar_cobranca", args)
if preflight is not None:
status = str(preflight.get("status") or "OUT_OF_SCOPE") if isinstance(preflight, dict) else "OUT_OF_SCOPE"
if status == "NEEDS_CLARIFICATION":
return {**dict(preflight), "eligible": False}
return {**dict(preflight), "eligible": False}
return {
"eligible": True,
"status": "ELIGIBLE",
"subject": args.get("subject"),
"resolved_value": args.get("resolved_value") or args.get("valor"),
"category": args.get("resolved_category"),
"metadata": {"side_effect_free": True, "target_tool": args.get("target_tool") or "contestar_cobranca"},
}
async def _invoke(name: str, args: dict[str, Any]) -> Any:
requirements = {
"consultar_faturas": ("msisdn",),
@@ -826,6 +846,7 @@ async def _invoke(name: str, args: dict[str, Any]) -> Any:
"consultar_historico_vas": ("msisdn",),
"cancelar_vas_avulso": ("msisdn", "subject"),
"tratar_vas_estrategico": ("msisdn", "subject"),
"validar_contestacao": ("msisdn", "subject", "valor"),
"contestar_cobranca": ("msisdn", "subject", "valor"),
"pro_rata": ("msisdn",),
"termino_desconto": ("msisdn",),
@@ -836,6 +857,9 @@ async def _invoke(name: str, args: dict[str, Any]) -> Any:
}
_require(args, *requirements.get(name, ()))
if name == "validar_contestacao":
return await _validate_contestation(args)
await _enrich_invoice_context(name, args)
preflight = _preflight_subject(name, args)
if preflight is not None: