bugfix: Invoice details

This commit is contained in:
2026-08-24 16:39:08 -03:00
parent 4b3e4d44e8
commit d7f270f52a
102 changed files with 183 additions and 10 deletions

View File

@@ -71,7 +71,7 @@ class ToolCall(BaseModel):
TOOLS: dict[str, dict[str, Any]] = {
"consultar_faturas": {"description": "Consulta faturas do cliente.", "input_schema": {"msisdn": "string"}},
"consultar_faturas": {"description": "Consulta faturas do cliente, incluindo valor total quando disponível na fatura detalhada.", "input_schema": {"msisdn": "string"}},
"consultar_plano": {"description": "Consulta exclusivamente o plano ou planos contratados presentes na fatura.", "input_schema": {"msisdn": "string"}},
"invoice_explanation": {"description": "Executa o workflow de explicação de fatura com pause/resume pelo WorkflowRuntime do framework.", "input_schema": {"msisdn": "string"}},
"consultar_vas": {"description": "Consulta VAS ativos.", "input_schema": {"msisdn": "string"}},
@@ -307,17 +307,22 @@ def _preflight_subject(name: str, args: dict[str, Any]) -> dict[str, Any] | None
return None
async def _enrich_invoice_context(name: str, args: dict[str, Any]) -> None:
if name not in {"consultar_plano", "invoice_explanation", "cancelar_vas_avulso", "tratar_vas_estrategico", "contestar_cobranca"}:
if name not in {"consultar_faturas", "consultar_plano", "invoice_explanation", "cancelar_vas_avulso", "tratar_vas_estrategico", "contestar_cobranca"}:
return
msisdn = str(args.get("msisdn") or "").strip()
if not msisdn:
return
# If all required evidence is already present, preserve it exactly.
if isinstance(args.get("complete_invoices_payload"), dict) and isinstance(args.get("billing_analysis"), dict):
# If all required evidence is already present, preserve it exactly. For
# consultar_faturas/invoice_explanation the semantic amount also matters, so
# a cached pair without detail must still be enriched.
has_base = isinstance(args.get("complete_invoices_payload"), dict) and isinstance(args.get("billing_analysis"), dict)
needs_detail = name in {"consultar_faturas", "invoice_explanation", "cancelar_vas_avulso", "contestar_cobranca"}
has_detail = isinstance(args.get("invoice_detail"), dict) or args.get("invoice_amount") not in (None, "")
if has_base and (not needs_detail or has_detail):
return
session_id = str(args.get("session_id") or args.get("original_session_id") or args.get("conversation_key") or "").strip()
invoice_id = str(args.get("invoice_id") or args.get("current_invoice_number") or "").strip()
include_detail = name in {"cancelar_vas_avulso", "contestar_cobranca"} and not isinstance(args.get("invoice_detail"), dict)
include_detail = name in {"consultar_faturas", "invoice_explanation", "cancelar_vas_avulso", "contestar_cobranca"} and not isinstance(args.get("invoice_detail"), dict)
try:
ctx = await get_invoice_context_service().get(
session_id=session_id,