From 1fd18531c0d8a7ff1cc5f4b5f42cca0663b1beb3 Mon Sep 17 00:00:00 2001 From: "cristiano.hoshikawa" Date: Thu, 27 Aug 2026 21:11:01 -0300 Subject: [PATCH] Documentation organization --- .../app/__pycache__/__init__.cpython-313.pyc | Bin 0 -> 230 bytes .../app/__pycache__/main.cpython-313.pyc | Bin 0 -> 32382 bytes ...mcp_gateway_client_factory.cpython-313.pyc | Bin 0 -> 1078 bytes .../app/__pycache__/state.cpython-313.pyc | Bin 0 -> 2717 bytes .../__pycache__/billing_agent.cpython-313.pyc | Bin 0 -> 6322 bytes .../__pycache__/orders_agent.cpython-313.pyc | Bin 0 -> 5975 bytes .../__pycache__/product_agent.cpython-313.pyc | Bin 0 -> 6319 bytes .../__pycache__/prompting.cpython-313.pyc | Bin 0 -> 1227 bytes .../__pycache__/runtime.cpython-313.pyc | Bin 0 -> 6631 bytes .../__pycache__/support_agent.cpython-313.pyc | Bin 0 -> 6030 bytes .../app/agents/billing_agent.py | 2 +- .../app/agents/orders_agent.py | 2 +- .../app/agents/product_agent.py | 2 +- .../app/agents/support_agent.py | 2 +- .../__pycache__/__init__.cpython-313.pyc | Bin 0 -> 301 bytes .../__pycache__/grl_examples.cpython-313.pyc | Bin 0 -> 1883 bytes .../__pycache__/ic_examples.cpython-313.pyc | Bin 0 -> 1839 bytes .../__pycache__/mcp_examples.cpython-313.pyc | Bin 0 -> 1981 bytes .../__pycache__/noc_examples.cpython-313.pyc | Bin 0 -> 1928 bytes .../observer_examples.cpython-313.pyc | Bin 0 -> 1437 bytes .../__pycache__/__init__.cpython-313.pyc | Bin 0 -> 244 bytes .../telemetry_observer.cpython-313.pyc | Bin 0 -> 4855 bytes .../__pycache__/__init__.cpython-313.pyc | Bin 0 -> 336 bytes .../tool_renderers.cpython-313.pyc | Bin 4412 -> 6035 bytes .../app/presentation/tool_renderers.py | 37 +++++- .../__pycache__/__init__.cpython-313.pyc | Bin 0 -> 284 bytes .../__pycache__/devolucao.cpython-313.pyc | Bin 0 -> 1062 bytes .../__pycache__/agent_graph.cpython-313.pyc | Bin 0 -> 60618 bytes .../app/workflows/agent_graph.py | 121 +++++++++++++++++- .../app/__pycache__/__init__.cpython-313.pyc | Bin 0 -> 220 bytes .../app/__pycache__/main.cpython-313.pyc | Bin 0 -> 31117 bytes ...mcp_gateway_client_factory.cpython-313.pyc | Bin 0 -> 1068 bytes .../app/__pycache__/state.cpython-313.pyc | Bin 0 -> 2616 bytes .../__pycache__/billing_agent.cpython-313.pyc | Bin 0 -> 6312 bytes .../__pycache__/orders_agent.cpython-313.pyc | Bin 0 -> 5965 bytes .../__pycache__/product_agent.cpython-313.pyc | Bin 0 -> 6309 bytes .../__pycache__/prompting.cpython-313.pyc | Bin 0 -> 1217 bytes .../__pycache__/runtime.cpython-313.pyc | Bin 0 -> 504 bytes .../__pycache__/support_agent.cpython-313.pyc | Bin 0 -> 6020 bytes .../app/agents/billing_agent.py | 2 +- .../app/agents/orders_agent.py | 2 +- .../app/agents/product_agent.py | 2 +- .../app/agents/support_agent.py | 2 +- .../__pycache__/__init__.cpython-313.pyc | Bin 0 -> 291 bytes .../__pycache__/grl_examples.cpython-313.pyc | Bin 0 -> 1873 bytes .../__pycache__/ic_examples.cpython-313.pyc | Bin 0 -> 1829 bytes .../__pycache__/mcp_examples.cpython-313.pyc | Bin 0 -> 1971 bytes .../__pycache__/noc_examples.cpython-313.pyc | Bin 0 -> 1918 bytes .../observer_examples.cpython-313.pyc | Bin 0 -> 1427 bytes .../__pycache__/__init__.cpython-313.pyc | Bin 0 -> 231 bytes .../example_guardrails.cpython-313.pyc | Bin 0 -> 1189 bytes .../example_judges.cpython-313.pyc | Bin 0 -> 1408 bytes .../__pycache__/__init__.cpython-313.pyc | Bin 0 -> 234 bytes .../telemetry_observer.cpython-313.pyc | Bin 0 -> 4845 bytes .../__pycache__/__init__.cpython-313.pyc | Bin 0 -> 326 bytes .../tool_renderers.cpython-313.pyc | Bin 0 -> 6025 bytes .../app/presentation/tool_renderers.py | 37 +++++- .../__pycache__/agent_graph.cpython-313.pyc | Bin 0 -> 56846 bytes .../app/workflows/agent_graph.py | 121 +++++++++++++++++- .../app/__pycache__/__init__.cpython-313.pyc | Bin 185 -> 220 bytes .../app/__pycache__/main.cpython-313.pyc | Bin 32264 -> 32372 bytes ...mcp_gateway_client_factory.cpython-313.pyc | Bin 993 -> 1068 bytes .../app/__pycache__/state.cpython-313.pyc | Bin 2493 -> 2707 bytes .../__pycache__/billing_agent.cpython-313.pyc | Bin 5256 -> 6312 bytes .../__pycache__/orders_agent.cpython-313.pyc | Bin 5164 -> 5965 bytes .../__pycache__/product_agent.cpython-313.pyc | Bin 5280 -> 6309 bytes .../__pycache__/prompting.cpython-313.pyc | Bin 1182 -> 1217 bytes .../__pycache__/runtime.cpython-313.pyc | Bin 384 -> 504 bytes .../__pycache__/support_agent.cpython-313.pyc | Bin 5176 -> 6020 bytes .../app/agents/billing_agent.py | 2 +- .../app/agents/orders_agent.py | 2 +- .../app/agents/product_agent.py | 2 +- .../app/agents/support_agent.py | 2 +- .../__pycache__/__init__.cpython-313.pyc | Bin 216 -> 291 bytes .../__pycache__/grl_examples.cpython-313.pyc | Bin 1798 -> 1873 bytes .../__pycache__/ic_examples.cpython-313.pyc | Bin 1754 -> 1829 bytes .../__pycache__/mcp_examples.cpython-313.pyc | Bin 1896 -> 1971 bytes .../__pycache__/noc_examples.cpython-313.pyc | Bin 1843 -> 1918 bytes .../observer_examples.cpython-313.pyc | Bin 1352 -> 1427 bytes .../__pycache__/__init__.cpython-313.pyc | Bin 199 -> 234 bytes .../telemetry_observer.cpython-313.pyc | Bin 4810 -> 4845 bytes .../__pycache__/__init__.cpython-313.pyc | Bin 0 -> 326 bytes .../tool_renderers.cpython-313.pyc | Bin 4402 -> 6025 bytes .../app/presentation/tool_renderers.py | 37 +++++- .../__pycache__/agent_graph.cpython-313.pyc | Bin 54189 -> 60608 bytes .../app/workflows/agent_graph.py | 121 +++++++++++++++++- .../app/__pycache__/__init__.cpython-313.pyc | Bin 0 -> 210 bytes .../app/__pycache__/main.cpython-313.pyc | Bin 0 -> 31107 bytes ...mcp_gateway_client_factory.cpython-313.pyc | Bin 0 -> 1058 bytes .../app/__pycache__/state.cpython-313.pyc | Bin 0 -> 2606 bytes .../__pycache__/billing_agent.cpython-313.pyc | Bin 0 -> 6302 bytes .../__pycache__/orders_agent.cpython-313.pyc | Bin 0 -> 5955 bytes .../__pycache__/product_agent.cpython-313.pyc | Bin 0 -> 6299 bytes .../__pycache__/prompting.cpython-313.pyc | Bin 0 -> 1207 bytes .../__pycache__/runtime.cpython-313.pyc | Bin 0 -> 494 bytes .../__pycache__/support_agent.cpython-313.pyc | Bin 0 -> 6010 bytes .../app/agents/billing_agent.py | 2 +- .../app/agents/orders_agent.py | 2 +- .../app/agents/product_agent.py | 2 +- .../app/agents/support_agent.py | 2 +- .../__pycache__/__init__.cpython-313.pyc | Bin 0 -> 281 bytes .../__pycache__/grl_examples.cpython-313.pyc | Bin 0 -> 1863 bytes .../__pycache__/ic_examples.cpython-313.pyc | Bin 0 -> 1819 bytes .../__pycache__/mcp_examples.cpython-313.pyc | Bin 0 -> 1961 bytes .../__pycache__/noc_examples.cpython-313.pyc | Bin 0 -> 1908 bytes .../observer_examples.cpython-313.pyc | Bin 0 -> 1417 bytes .../__pycache__/__init__.cpython-313.pyc | Bin 0 -> 224 bytes .../telemetry_observer.cpython-313.pyc | Bin 0 -> 4835 bytes .../__pycache__/__init__.cpython-313.pyc | Bin 0 -> 316 bytes .../tool_renderers.cpython-313.pyc | Bin 4392 -> 6015 bytes .../app/presentation/tool_renderers.py | 37 +++++- .../__pycache__/agent_graph.cpython-313.pyc | Bin 0 -> 56836 bytes .../app/workflows/agent_graph.py | 121 +++++++++++++++++- .../app/__pycache__/__init__.cpython-313.pyc | Bin 0 -> 219 bytes .../app/__pycache__/main.cpython-313.pyc | Bin 0 -> 31116 bytes ...mcp_gateway_client_factory.cpython-313.pyc | Bin 0 -> 1067 bytes .../app/__pycache__/state.cpython-313.pyc | Bin 0 -> 2615 bytes .../__pycache__/billing_agent.cpython-313.pyc | Bin 0 -> 6311 bytes .../__pycache__/orders_agent.cpython-313.pyc | Bin 0 -> 5964 bytes .../__pycache__/product_agent.cpython-313.pyc | Bin 0 -> 6308 bytes .../__pycache__/prompting.cpython-313.pyc | Bin 0 -> 1216 bytes .../__pycache__/runtime.cpython-313.pyc | Bin 0 -> 418 bytes .../__pycache__/support_agent.cpython-313.pyc | Bin 0 -> 6019 bytes .../app/agents/billing_agent.py | 2 +- .../app/agents/orders_agent.py | 2 +- .../app/agents/product_agent.py | 2 +- .../app/agents/support_agent.py | 2 +- .../__pycache__/__init__.cpython-313.pyc | Bin 0 -> 233 bytes .../telemetry_observer.cpython-313.pyc | Bin 0 -> 4844 bytes .../__pycache__/agent_graph.cpython-313.pyc | Bin 0 -> 56845 bytes .../app/workflows/agent_graph.py | 121 +++++++++++++++++- .../app/__pycache__/__init__.cpython-313.pyc | Bin 0 -> 219 bytes .../app/__pycache__/main.cpython-313.pyc | Bin 0 -> 31116 bytes ...mcp_gateway_client_factory.cpython-313.pyc | Bin 0 -> 1067 bytes .../app/__pycache__/state.cpython-313.pyc | Bin 0 -> 2615 bytes .../__pycache__/billing_agent.cpython-313.pyc | Bin 0 -> 6311 bytes .../__pycache__/orders_agent.cpython-313.pyc | Bin 0 -> 5964 bytes .../__pycache__/product_agent.cpython-313.pyc | Bin 0 -> 6308 bytes .../__pycache__/prompting.cpython-313.pyc | Bin 0 -> 1216 bytes .../__pycache__/runtime.cpython-313.pyc | Bin 0 -> 503 bytes .../__pycache__/support_agent.cpython-313.pyc | Bin 0 -> 6019 bytes .../app/agents/billing_agent.py | 2 +- .../app/agents/orders_agent.py | 2 +- .../app/agents/product_agent.py | 2 +- .../app/agents/support_agent.py | 2 +- .../__pycache__/__init__.cpython-313.pyc | Bin 0 -> 290 bytes .../__pycache__/grl_examples.cpython-313.pyc | Bin 0 -> 1872 bytes .../__pycache__/ic_examples.cpython-313.pyc | Bin 0 -> 1828 bytes .../__pycache__/mcp_examples.cpython-313.pyc | Bin 0 -> 1970 bytes .../__pycache__/noc_examples.cpython-313.pyc | Bin 0 -> 1917 bytes .../observer_examples.cpython-313.pyc | Bin 0 -> 1426 bytes .../__pycache__/__init__.cpython-313.pyc | Bin 0 -> 233 bytes .../telemetry_observer.cpython-313.pyc | Bin 0 -> 4844 bytes .../__pycache__/__init__.cpython-313.pyc | Bin 0 -> 325 bytes .../tool_renderers.cpython-313.pyc | Bin 4401 -> 6024 bytes .../app/presentation/tool_renderers.py | 37 +++++- .../__pycache__/agent_graph.cpython-313.pyc | Bin 0 -> 56845 bytes .../app/workflows/agent_graph.py | 121 +++++++++++++++++- .../app/__pycache__/__init__.cpython-313.pyc | Bin 0 -> 228 bytes .../app/__pycache__/main.cpython-313.pyc | Bin 0 -> 31125 bytes ...mcp_gateway_client_factory.cpython-313.pyc | Bin 0 -> 1076 bytes .../app/__pycache__/state.cpython-313.pyc | Bin 0 -> 2624 bytes .../__pycache__/billing_agent.cpython-313.pyc | Bin 0 -> 6320 bytes .../__pycache__/orders_agent.cpython-313.pyc | Bin 0 -> 5973 bytes .../__pycache__/product_agent.cpython-313.pyc | Bin 0 -> 6317 bytes .../__pycache__/prompting.cpython-313.pyc | Bin 0 -> 1225 bytes .../__pycache__/runtime.cpython-313.pyc | Bin 0 -> 427 bytes .../__pycache__/support_agent.cpython-313.pyc | Bin 0 -> 6028 bytes .../app/agents/billing_agent.py | 2 +- .../app/agents/orders_agent.py | 2 +- .../app/agents/product_agent.py | 2 +- .../app/agents/support_agent.py | 2 +- .../__pycache__/__init__.cpython-313.pyc | Bin 0 -> 242 bytes .../telemetry_observer.cpython-313.pyc | Bin 0 -> 4853 bytes .../__pycache__/agent_graph.cpython-313.pyc | Bin 0 -> 56854 bytes .../app/workflows/agent_graph.py | 121 +++++++++++++++++- .../app/__pycache__/__init__.cpython-313.pyc | Bin 0 -> 214 bytes .../app/__pycache__/main.cpython-313.pyc | Bin 0 -> 36653 bytes ...mcp_gateway_client_factory.cpython-313.pyc | Bin 0 -> 1062 bytes .../app/__pycache__/state.cpython-313.pyc | Bin 0 -> 2905 bytes .../__pycache__/billing_agent.cpython-313.pyc | Bin 0 -> 6306 bytes .../__pycache__/orders_agent.cpython-313.pyc | Bin 0 -> 5959 bytes .../__pycache__/product_agent.cpython-313.pyc | Bin 0 -> 6303 bytes .../__pycache__/prompting.cpython-313.pyc | Bin 0 -> 1211 bytes .../__pycache__/runtime.cpython-313.pyc | Bin 0 -> 498 bytes .../__pycache__/support_agent.cpython-313.pyc | Bin 0 -> 6014 bytes .../app/agents/billing_agent.py | 2 +- .../app/agents/orders_agent.py | 2 +- .../app/agents/product_agent.py | 2 +- .../app/agents/support_agent.py | 2 +- .../__pycache__/__init__.cpython-313.pyc | Bin 0 -> 285 bytes .../__pycache__/grl_examples.cpython-313.pyc | Bin 0 -> 1867 bytes .../__pycache__/ic_examples.cpython-313.pyc | Bin 0 -> 1823 bytes .../__pycache__/mcp_examples.cpython-313.pyc | Bin 0 -> 1965 bytes .../__pycache__/noc_examples.cpython-313.pyc | Bin 0 -> 1912 bytes .../observer_examples.cpython-313.pyc | Bin 0 -> 1421 bytes .../__pycache__/__init__.cpython-313.pyc | Bin 0 -> 228 bytes .../telemetry_observer.cpython-313.pyc | Bin 0 -> 4839 bytes .../__pycache__/__init__.cpython-313.pyc | Bin 0 -> 320 bytes .../tool_renderers.cpython-313.pyc | Bin 0 -> 6019 bytes .../app/presentation/tool_renderers.py | 37 +++++- .../__pycache__/__init__.cpython-313.pyc | Bin 0 -> 268 bytes .../__pycache__/devolucao.cpython-313.pyc | Bin 0 -> 1046 bytes .../__pycache__/agent_graph.cpython-313.pyc | Bin 0 -> 60987 bytes .../app/workflows/agent_graph.py | 121 +++++++++++++++++- .../app/__pycache__/__init__.cpython-313.pyc | Bin 0 -> 220 bytes .../app/__pycache__/main.cpython-313.pyc | Bin 0 -> 36732 bytes ...mcp_gateway_client_factory.cpython-313.pyc | Bin 0 -> 1068 bytes .../app/__pycache__/state.cpython-313.pyc | Bin 0 -> 2973 bytes .../__pycache__/billing_agent.cpython-313.pyc | Bin 0 -> 6312 bytes .../__pycache__/orders_agent.cpython-313.pyc | Bin 0 -> 5965 bytes .../__pycache__/product_agent.cpython-313.pyc | Bin 0 -> 6309 bytes .../__pycache__/prompting.cpython-313.pyc | Bin 0 -> 1217 bytes .../__pycache__/runtime.cpython-313.pyc | Bin 0 -> 504 bytes .../__pycache__/support_agent.cpython-313.pyc | Bin 0 -> 6020 bytes .../app/agents/billing_agent.py | 2 +- .../app/agents/orders_agent.py | 2 +- .../app/agents/product_agent.py | 2 +- .../app/agents/support_agent.py | 2 +- .../__pycache__/__init__.cpython-313.pyc | Bin 0 -> 291 bytes .../__pycache__/grl_examples.cpython-313.pyc | Bin 0 -> 1873 bytes .../__pycache__/ic_examples.cpython-313.pyc | Bin 0 -> 1829 bytes .../__pycache__/mcp_examples.cpython-313.pyc | Bin 0 -> 1971 bytes .../__pycache__/noc_examples.cpython-313.pyc | Bin 0 -> 1918 bytes .../observer_examples.cpython-313.pyc | Bin 0 -> 1427 bytes .../__pycache__/__init__.cpython-313.pyc | Bin 0 -> 234 bytes .../telemetry_observer.cpython-313.pyc | Bin 0 -> 4845 bytes .../__pycache__/__init__.cpython-313.pyc | Bin 0 -> 326 bytes .../tool_renderers.cpython-313.pyc | Bin 0 -> 6025 bytes .../app/presentation/tool_renderers.py | 37 +++++- .../__pycache__/__init__.cpython-313.pyc | Bin 0 -> 274 bytes .../__pycache__/devolucao.cpython-313.pyc | Bin 0 -> 1052 bytes .../__pycache__/agent_graph.cpython-313.pyc | Bin 0 -> 60993 bytes .../app/workflows/agent_graph.py | 121 +++++++++++++++++- .../app/__pycache__/__init__.cpython-313.pyc | Bin 145 -> 184 bytes .../app/__pycache__/main.cpython-313.pyc | Bin 36677 -> 36696 bytes ...mcp_gateway_client_factory.cpython-313.pyc | Bin 993 -> 1032 bytes .../app/__pycache__/state.cpython-313.pyc | Bin 2812 -> 2937 bytes .../__pycache__/billing_agent.cpython-313.pyc | Bin 5216 -> 6276 bytes .../__pycache__/orders_agent.cpython-313.pyc | Bin 5124 -> 5929 bytes .../__pycache__/product_agent.cpython-313.pyc | Bin 5240 -> 6999 bytes .../__pycache__/prompting.cpython-313.pyc | Bin 1142 -> 1181 bytes .../__pycache__/runtime.cpython-313.pyc | Bin 344 -> 468 bytes .../__pycache__/support_agent.cpython-313.pyc | Bin 5136 -> 5984 bytes .../app/agents/billing_agent.py | 2 +- .../app/agents/orders_agent.py | 2 +- .../app/agents/product_agent.py | 2 +- .../app/agents/support_agent.py | 2 +- .../__pycache__/__init__.cpython-313.pyc | Bin 216 -> 255 bytes .../__pycache__/grl_examples.cpython-313.pyc | Bin 1798 -> 1837 bytes .../__pycache__/ic_examples.cpython-313.pyc | Bin 1754 -> 1793 bytes .../__pycache__/mcp_examples.cpython-313.pyc | Bin 1896 -> 1935 bytes .../__pycache__/noc_examples.cpython-313.pyc | Bin 1843 -> 1882 bytes .../observer_examples.cpython-313.pyc | Bin 1352 -> 1391 bytes .../__pycache__/__init__.cpython-313.pyc | Bin 159 -> 198 bytes .../telemetry_observer.cpython-313.pyc | Bin 4770 -> 4809 bytes .../__pycache__/__init__.cpython-313.pyc | Bin 0 -> 290 bytes .../tool_renderers.cpython-313.pyc | Bin 4366 -> 5989 bytes .../app/presentation/tool_renderers.py | 37 +++++- .../__pycache__/__init__.cpython-313.pyc | Bin 199 -> 238 bytes .../__pycache__/devolucao.cpython-313.pyc | Bin 977 -> 1016 bytes .../__pycache__/agent_graph.cpython-313.pyc | Bin 54222 -> 60957 bytes .../app/workflows/agent_graph.py | 121 +++++++++++++++++- .../app/__pycache__/__init__.cpython-313.pyc | Bin 186 -> 193 bytes .../app/__pycache__/main.cpython-313.pyc | Bin 31083 -> 35274 bytes ...mcp_gateway_client_factory.cpython-313.pyc | Bin 1034 -> 1041 bytes .../app/__pycache__/state.cpython-313.pyc | Bin 1918 -> 2651 bytes .../__pycache__/billing_agent.cpython-313.pyc | Bin 2541 -> 6285 bytes .../__pycache__/orders_agent.cpython-313.pyc | Bin 2459 -> 5938 bytes .../__pycache__/product_agent.cpython-313.pyc | Bin 2564 -> 6282 bytes .../__pycache__/prompting.cpython-313.pyc | Bin 1183 -> 1190 bytes .../__pycache__/runtime.cpython-313.pyc | Bin 385 -> 392 bytes .../__pycache__/support_agent.cpython-313.pyc | Bin 2461 -> 5993 bytes .../app/agents/billing_agent.py | 2 +- .../app/agents/orders_agent.py | 2 +- .../app/agents/product_agent.py | 2 +- .../app/agents/support_agent.py | 2 +- .../__pycache__/__init__.cpython-313.pyc | Bin 200 -> 207 bytes .../telemetry_observer.cpython-313.pyc | Bin 4811 -> 4818 bytes .../__pycache__/agent_graph.cpython-313.pyc | Bin 44732 -> 56838 bytes .../app/workflows/agent_graph.py | 121 +++++++++++++++++- .../conftest.cpython-313-pytest-9.0.2.pyc | Bin 780 -> 788 bytes ...y_consistency.cpython-313-pytest-9.0.2.pyc | Bin 0 -> 9785 bytes ..._presentation.cpython-313-pytest-9.0.2.pyc | Bin 10410 -> 10418 bytes ...saction_shift.cpython-313-pytest-9.0.2.pyc | Bin 25786 -> 25794 bytes ...stomer_facing.cpython-313-pytest-9.0.2.pyc | Bin 4783 -> 4791 bytes ..._interruption.cpython-313-pytest-9.0.2.pyc | Bin 28263 -> 28271 bytes ...nal_tool_flow.cpython-313-pytest-9.0.2.pyc | Bin 70413 -> 70421 bytes ...ent_template_backend_safety_consistency.py | 70 ++++++++++ 289 files changed, 1689 insertions(+), 96 deletions(-) create mode 100644 Tuning-Performance/Deterministic_Transactional_Workflow/agent_template_backend/app/__pycache__/__init__.cpython-313.pyc create mode 100644 Tuning-Performance/Deterministic_Transactional_Workflow/agent_template_backend/app/__pycache__/main.cpython-313.pyc create mode 100644 Tuning-Performance/Deterministic_Transactional_Workflow/agent_template_backend/app/__pycache__/mcp_gateway_client_factory.cpython-313.pyc create mode 100644 Tuning-Performance/Deterministic_Transactional_Workflow/agent_template_backend/app/__pycache__/state.cpython-313.pyc create mode 100644 Tuning-Performance/Deterministic_Transactional_Workflow/agent_template_backend/app/agents/__pycache__/billing_agent.cpython-313.pyc create mode 100644 Tuning-Performance/Deterministic_Transactional_Workflow/agent_template_backend/app/agents/__pycache__/orders_agent.cpython-313.pyc create mode 100644 Tuning-Performance/Deterministic_Transactional_Workflow/agent_template_backend/app/agents/__pycache__/product_agent.cpython-313.pyc create mode 100644 Tuning-Performance/Deterministic_Transactional_Workflow/agent_template_backend/app/agents/__pycache__/prompting.cpython-313.pyc create mode 100644 Tuning-Performance/Deterministic_Transactional_Workflow/agent_template_backend/app/agents/__pycache__/runtime.cpython-313.pyc create mode 100644 Tuning-Performance/Deterministic_Transactional_Workflow/agent_template_backend/app/agents/__pycache__/support_agent.cpython-313.pyc create mode 100644 Tuning-Performance/Deterministic_Transactional_Workflow/agent_template_backend/app/examples/__pycache__/__init__.cpython-313.pyc create mode 100644 Tuning-Performance/Deterministic_Transactional_Workflow/agent_template_backend/app/examples/__pycache__/grl_examples.cpython-313.pyc create mode 100644 Tuning-Performance/Deterministic_Transactional_Workflow/agent_template_backend/app/examples/__pycache__/ic_examples.cpython-313.pyc create mode 100644 Tuning-Performance/Deterministic_Transactional_Workflow/agent_template_backend/app/examples/__pycache__/mcp_examples.cpython-313.pyc create mode 100644 Tuning-Performance/Deterministic_Transactional_Workflow/agent_template_backend/app/examples/__pycache__/noc_examples.cpython-313.pyc create mode 100644 Tuning-Performance/Deterministic_Transactional_Workflow/agent_template_backend/app/examples/__pycache__/observer_examples.cpython-313.pyc create mode 100644 Tuning-Performance/Deterministic_Transactional_Workflow/agent_template_backend/app/observability/__pycache__/__init__.cpython-313.pyc create mode 100644 Tuning-Performance/Deterministic_Transactional_Workflow/agent_template_backend/app/observability/__pycache__/telemetry_observer.cpython-313.pyc create mode 100644 Tuning-Performance/Deterministic_Transactional_Workflow/agent_template_backend/app/presentation/__pycache__/__init__.cpython-313.pyc create mode 100644 Tuning-Performance/Deterministic_Transactional_Workflow/agent_template_backend/app/workflow_actions/__pycache__/__init__.cpython-313.pyc create mode 100644 Tuning-Performance/Deterministic_Transactional_Workflow/agent_template_backend/app/workflow_actions/__pycache__/devolucao.cpython-313.pyc create mode 100644 Tuning-Performance/Deterministic_Transactional_Workflow/agent_template_backend/app/workflows/__pycache__/agent_graph.cpython-313.pyc create mode 100644 Tuning-Performance/External_Guardrails_Judges/agent_template_backend/app/__pycache__/__init__.cpython-313.pyc create mode 100644 Tuning-Performance/External_Guardrails_Judges/agent_template_backend/app/__pycache__/main.cpython-313.pyc create mode 100644 Tuning-Performance/External_Guardrails_Judges/agent_template_backend/app/__pycache__/mcp_gateway_client_factory.cpython-313.pyc create mode 100644 Tuning-Performance/External_Guardrails_Judges/agent_template_backend/app/__pycache__/state.cpython-313.pyc create mode 100644 Tuning-Performance/External_Guardrails_Judges/agent_template_backend/app/agents/__pycache__/billing_agent.cpython-313.pyc create mode 100644 Tuning-Performance/External_Guardrails_Judges/agent_template_backend/app/agents/__pycache__/orders_agent.cpython-313.pyc create mode 100644 Tuning-Performance/External_Guardrails_Judges/agent_template_backend/app/agents/__pycache__/product_agent.cpython-313.pyc create mode 100644 Tuning-Performance/External_Guardrails_Judges/agent_template_backend/app/agents/__pycache__/prompting.cpython-313.pyc create mode 100644 Tuning-Performance/External_Guardrails_Judges/agent_template_backend/app/agents/__pycache__/runtime.cpython-313.pyc create mode 100644 Tuning-Performance/External_Guardrails_Judges/agent_template_backend/app/agents/__pycache__/support_agent.cpython-313.pyc create mode 100644 Tuning-Performance/External_Guardrails_Judges/agent_template_backend/app/examples/__pycache__/__init__.cpython-313.pyc create mode 100644 Tuning-Performance/External_Guardrails_Judges/agent_template_backend/app/examples/__pycache__/grl_examples.cpython-313.pyc create mode 100644 Tuning-Performance/External_Guardrails_Judges/agent_template_backend/app/examples/__pycache__/ic_examples.cpython-313.pyc create mode 100644 Tuning-Performance/External_Guardrails_Judges/agent_template_backend/app/examples/__pycache__/mcp_examples.cpython-313.pyc create mode 100644 Tuning-Performance/External_Guardrails_Judges/agent_template_backend/app/examples/__pycache__/noc_examples.cpython-313.pyc create mode 100644 Tuning-Performance/External_Guardrails_Judges/agent_template_backend/app/examples/__pycache__/observer_examples.cpython-313.pyc create mode 100644 Tuning-Performance/External_Guardrails_Judges/agent_template_backend/app/extensions/__pycache__/__init__.cpython-313.pyc create mode 100644 Tuning-Performance/External_Guardrails_Judges/agent_template_backend/app/extensions/__pycache__/example_guardrails.cpython-313.pyc create mode 100644 Tuning-Performance/External_Guardrails_Judges/agent_template_backend/app/extensions/__pycache__/example_judges.cpython-313.pyc create mode 100644 Tuning-Performance/External_Guardrails_Judges/agent_template_backend/app/observability/__pycache__/__init__.cpython-313.pyc create mode 100644 Tuning-Performance/External_Guardrails_Judges/agent_template_backend/app/observability/__pycache__/telemetry_observer.cpython-313.pyc create mode 100644 Tuning-Performance/External_Guardrails_Judges/agent_template_backend/app/presentation/__pycache__/__init__.cpython-313.pyc create mode 100644 Tuning-Performance/External_Guardrails_Judges/agent_template_backend/app/presentation/__pycache__/tool_renderers.cpython-313.pyc create mode 100644 Tuning-Performance/External_Guardrails_Judges/agent_template_backend/app/workflows/__pycache__/agent_graph.cpython-313.pyc create mode 100644 Tuning-Performance/Long_Term_Memory/templates/agent_template_backend/app/presentation/__pycache__/__init__.cpython-313.pyc create mode 100644 Tuning-Performance/Normal/templates/agent_template_backend/app/__pycache__/__init__.cpython-313.pyc create mode 100644 Tuning-Performance/Normal/templates/agent_template_backend/app/__pycache__/main.cpython-313.pyc create mode 100644 Tuning-Performance/Normal/templates/agent_template_backend/app/__pycache__/mcp_gateway_client_factory.cpython-313.pyc create mode 100644 Tuning-Performance/Normal/templates/agent_template_backend/app/__pycache__/state.cpython-313.pyc create mode 100644 Tuning-Performance/Normal/templates/agent_template_backend/app/agents/__pycache__/billing_agent.cpython-313.pyc create mode 100644 Tuning-Performance/Normal/templates/agent_template_backend/app/agents/__pycache__/orders_agent.cpython-313.pyc create mode 100644 Tuning-Performance/Normal/templates/agent_template_backend/app/agents/__pycache__/product_agent.cpython-313.pyc create mode 100644 Tuning-Performance/Normal/templates/agent_template_backend/app/agents/__pycache__/prompting.cpython-313.pyc create mode 100644 Tuning-Performance/Normal/templates/agent_template_backend/app/agents/__pycache__/runtime.cpython-313.pyc create mode 100644 Tuning-Performance/Normal/templates/agent_template_backend/app/agents/__pycache__/support_agent.cpython-313.pyc create mode 100644 Tuning-Performance/Normal/templates/agent_template_backend/app/examples/__pycache__/__init__.cpython-313.pyc create mode 100644 Tuning-Performance/Normal/templates/agent_template_backend/app/examples/__pycache__/grl_examples.cpython-313.pyc create mode 100644 Tuning-Performance/Normal/templates/agent_template_backend/app/examples/__pycache__/ic_examples.cpython-313.pyc create mode 100644 Tuning-Performance/Normal/templates/agent_template_backend/app/examples/__pycache__/mcp_examples.cpython-313.pyc create mode 100644 Tuning-Performance/Normal/templates/agent_template_backend/app/examples/__pycache__/noc_examples.cpython-313.pyc create mode 100644 Tuning-Performance/Normal/templates/agent_template_backend/app/examples/__pycache__/observer_examples.cpython-313.pyc create mode 100644 Tuning-Performance/Normal/templates/agent_template_backend/app/observability/__pycache__/__init__.cpython-313.pyc create mode 100644 Tuning-Performance/Normal/templates/agent_template_backend/app/observability/__pycache__/telemetry_observer.cpython-313.pyc create mode 100644 Tuning-Performance/Normal/templates/agent_template_backend/app/presentation/__pycache__/__init__.cpython-313.pyc create mode 100644 Tuning-Performance/Normal/templates/agent_template_backend/app/workflows/__pycache__/agent_graph.cpython-313.pyc create mode 100644 Tuning-Performance/Normal/templates/agent_template_backend_day_zero/app/__pycache__/__init__.cpython-313.pyc create mode 100644 Tuning-Performance/Normal/templates/agent_template_backend_day_zero/app/__pycache__/main.cpython-313.pyc create mode 100644 Tuning-Performance/Normal/templates/agent_template_backend_day_zero/app/__pycache__/mcp_gateway_client_factory.cpython-313.pyc create mode 100644 Tuning-Performance/Normal/templates/agent_template_backend_day_zero/app/__pycache__/state.cpython-313.pyc create mode 100644 Tuning-Performance/Normal/templates/agent_template_backend_day_zero/app/agents/__pycache__/billing_agent.cpython-313.pyc create mode 100644 Tuning-Performance/Normal/templates/agent_template_backend_day_zero/app/agents/__pycache__/orders_agent.cpython-313.pyc create mode 100644 Tuning-Performance/Normal/templates/agent_template_backend_day_zero/app/agents/__pycache__/product_agent.cpython-313.pyc create mode 100644 Tuning-Performance/Normal/templates/agent_template_backend_day_zero/app/agents/__pycache__/prompting.cpython-313.pyc create mode 100644 Tuning-Performance/Normal/templates/agent_template_backend_day_zero/app/agents/__pycache__/runtime.cpython-313.pyc create mode 100644 Tuning-Performance/Normal/templates/agent_template_backend_day_zero/app/agents/__pycache__/support_agent.cpython-313.pyc create mode 100644 Tuning-Performance/Normal/templates/agent_template_backend_day_zero/app/observability/__pycache__/__init__.cpython-313.pyc create mode 100644 Tuning-Performance/Normal/templates/agent_template_backend_day_zero/app/observability/__pycache__/telemetry_observer.cpython-313.pyc create mode 100644 Tuning-Performance/Normal/templates/agent_template_backend_day_zero/app/workflows/__pycache__/agent_graph.cpython-313.pyc create mode 100644 Tuning-Performance/Route_Stickness/templates/agent_template_backend/app/__pycache__/__init__.cpython-313.pyc create mode 100644 Tuning-Performance/Route_Stickness/templates/agent_template_backend/app/__pycache__/main.cpython-313.pyc create mode 100644 Tuning-Performance/Route_Stickness/templates/agent_template_backend/app/__pycache__/mcp_gateway_client_factory.cpython-313.pyc create mode 100644 Tuning-Performance/Route_Stickness/templates/agent_template_backend/app/__pycache__/state.cpython-313.pyc create mode 100644 Tuning-Performance/Route_Stickness/templates/agent_template_backend/app/agents/__pycache__/billing_agent.cpython-313.pyc create mode 100644 Tuning-Performance/Route_Stickness/templates/agent_template_backend/app/agents/__pycache__/orders_agent.cpython-313.pyc create mode 100644 Tuning-Performance/Route_Stickness/templates/agent_template_backend/app/agents/__pycache__/product_agent.cpython-313.pyc create mode 100644 Tuning-Performance/Route_Stickness/templates/agent_template_backend/app/agents/__pycache__/prompting.cpython-313.pyc create mode 100644 Tuning-Performance/Route_Stickness/templates/agent_template_backend/app/agents/__pycache__/runtime.cpython-313.pyc create mode 100644 Tuning-Performance/Route_Stickness/templates/agent_template_backend/app/agents/__pycache__/support_agent.cpython-313.pyc create mode 100644 Tuning-Performance/Route_Stickness/templates/agent_template_backend/app/examples/__pycache__/__init__.cpython-313.pyc create mode 100644 Tuning-Performance/Route_Stickness/templates/agent_template_backend/app/examples/__pycache__/grl_examples.cpython-313.pyc create mode 100644 Tuning-Performance/Route_Stickness/templates/agent_template_backend/app/examples/__pycache__/ic_examples.cpython-313.pyc create mode 100644 Tuning-Performance/Route_Stickness/templates/agent_template_backend/app/examples/__pycache__/mcp_examples.cpython-313.pyc create mode 100644 Tuning-Performance/Route_Stickness/templates/agent_template_backend/app/examples/__pycache__/noc_examples.cpython-313.pyc create mode 100644 Tuning-Performance/Route_Stickness/templates/agent_template_backend/app/examples/__pycache__/observer_examples.cpython-313.pyc create mode 100644 Tuning-Performance/Route_Stickness/templates/agent_template_backend/app/observability/__pycache__/__init__.cpython-313.pyc create mode 100644 Tuning-Performance/Route_Stickness/templates/agent_template_backend/app/observability/__pycache__/telemetry_observer.cpython-313.pyc create mode 100644 Tuning-Performance/Route_Stickness/templates/agent_template_backend/app/presentation/__pycache__/__init__.cpython-313.pyc create mode 100644 Tuning-Performance/Route_Stickness/templates/agent_template_backend/app/workflows/__pycache__/agent_graph.cpython-313.pyc create mode 100644 Tuning-Performance/Route_Stickness/templates/agent_template_backend_day_zero/app/__pycache__/__init__.cpython-313.pyc create mode 100644 Tuning-Performance/Route_Stickness/templates/agent_template_backend_day_zero/app/__pycache__/main.cpython-313.pyc create mode 100644 Tuning-Performance/Route_Stickness/templates/agent_template_backend_day_zero/app/__pycache__/mcp_gateway_client_factory.cpython-313.pyc create mode 100644 Tuning-Performance/Route_Stickness/templates/agent_template_backend_day_zero/app/__pycache__/state.cpython-313.pyc create mode 100644 Tuning-Performance/Route_Stickness/templates/agent_template_backend_day_zero/app/agents/__pycache__/billing_agent.cpython-313.pyc create mode 100644 Tuning-Performance/Route_Stickness/templates/agent_template_backend_day_zero/app/agents/__pycache__/orders_agent.cpython-313.pyc create mode 100644 Tuning-Performance/Route_Stickness/templates/agent_template_backend_day_zero/app/agents/__pycache__/product_agent.cpython-313.pyc create mode 100644 Tuning-Performance/Route_Stickness/templates/agent_template_backend_day_zero/app/agents/__pycache__/prompting.cpython-313.pyc create mode 100644 Tuning-Performance/Route_Stickness/templates/agent_template_backend_day_zero/app/agents/__pycache__/runtime.cpython-313.pyc create mode 100644 Tuning-Performance/Route_Stickness/templates/agent_template_backend_day_zero/app/agents/__pycache__/support_agent.cpython-313.pyc create mode 100644 Tuning-Performance/Route_Stickness/templates/agent_template_backend_day_zero/app/observability/__pycache__/__init__.cpython-313.pyc create mode 100644 Tuning-Performance/Route_Stickness/templates/agent_template_backend_day_zero/app/observability/__pycache__/telemetry_observer.cpython-313.pyc create mode 100644 Tuning-Performance/Route_Stickness/templates/agent_template_backend_day_zero/app/workflows/__pycache__/agent_graph.cpython-313.pyc create mode 100644 Tuning-Performance/Transaction_Evidence/agent_template_backend/app/__pycache__/__init__.cpython-313.pyc create mode 100644 Tuning-Performance/Transaction_Evidence/agent_template_backend/app/__pycache__/main.cpython-313.pyc create mode 100644 Tuning-Performance/Transaction_Evidence/agent_template_backend/app/__pycache__/mcp_gateway_client_factory.cpython-313.pyc create mode 100644 Tuning-Performance/Transaction_Evidence/agent_template_backend/app/__pycache__/state.cpython-313.pyc create mode 100644 Tuning-Performance/Transaction_Evidence/agent_template_backend/app/agents/__pycache__/billing_agent.cpython-313.pyc create mode 100644 Tuning-Performance/Transaction_Evidence/agent_template_backend/app/agents/__pycache__/orders_agent.cpython-313.pyc create mode 100644 Tuning-Performance/Transaction_Evidence/agent_template_backend/app/agents/__pycache__/product_agent.cpython-313.pyc create mode 100644 Tuning-Performance/Transaction_Evidence/agent_template_backend/app/agents/__pycache__/prompting.cpython-313.pyc create mode 100644 Tuning-Performance/Transaction_Evidence/agent_template_backend/app/agents/__pycache__/runtime.cpython-313.pyc create mode 100644 Tuning-Performance/Transaction_Evidence/agent_template_backend/app/agents/__pycache__/support_agent.cpython-313.pyc create mode 100644 Tuning-Performance/Transaction_Evidence/agent_template_backend/app/examples/__pycache__/__init__.cpython-313.pyc create mode 100644 Tuning-Performance/Transaction_Evidence/agent_template_backend/app/examples/__pycache__/grl_examples.cpython-313.pyc create mode 100644 Tuning-Performance/Transaction_Evidence/agent_template_backend/app/examples/__pycache__/ic_examples.cpython-313.pyc create mode 100644 Tuning-Performance/Transaction_Evidence/agent_template_backend/app/examples/__pycache__/mcp_examples.cpython-313.pyc create mode 100644 Tuning-Performance/Transaction_Evidence/agent_template_backend/app/examples/__pycache__/noc_examples.cpython-313.pyc create mode 100644 Tuning-Performance/Transaction_Evidence/agent_template_backend/app/examples/__pycache__/observer_examples.cpython-313.pyc create mode 100644 Tuning-Performance/Transaction_Evidence/agent_template_backend/app/observability/__pycache__/__init__.cpython-313.pyc create mode 100644 Tuning-Performance/Transaction_Evidence/agent_template_backend/app/observability/__pycache__/telemetry_observer.cpython-313.pyc create mode 100644 Tuning-Performance/Transaction_Evidence/agent_template_backend/app/presentation/__pycache__/__init__.cpython-313.pyc create mode 100644 Tuning-Performance/Transaction_Evidence/agent_template_backend/app/presentation/__pycache__/tool_renderers.cpython-313.pyc create mode 100644 Tuning-Performance/Transaction_Evidence/agent_template_backend/app/workflow_actions/__pycache__/__init__.cpython-313.pyc create mode 100644 Tuning-Performance/Transaction_Evidence/agent_template_backend/app/workflow_actions/__pycache__/devolucao.cpython-313.pyc create mode 100644 Tuning-Performance/Transaction_Evidence/agent_template_backend/app/workflows/__pycache__/agent_graph.cpython-313.pyc create mode 100644 Tuning-Performance/Transaction_Pre_Validation/agent_template_backend/app/__pycache__/__init__.cpython-313.pyc create mode 100644 Tuning-Performance/Transaction_Pre_Validation/agent_template_backend/app/__pycache__/main.cpython-313.pyc create mode 100644 Tuning-Performance/Transaction_Pre_Validation/agent_template_backend/app/__pycache__/mcp_gateway_client_factory.cpython-313.pyc create mode 100644 Tuning-Performance/Transaction_Pre_Validation/agent_template_backend/app/__pycache__/state.cpython-313.pyc create mode 100644 Tuning-Performance/Transaction_Pre_Validation/agent_template_backend/app/agents/__pycache__/billing_agent.cpython-313.pyc create mode 100644 Tuning-Performance/Transaction_Pre_Validation/agent_template_backend/app/agents/__pycache__/orders_agent.cpython-313.pyc create mode 100644 Tuning-Performance/Transaction_Pre_Validation/agent_template_backend/app/agents/__pycache__/product_agent.cpython-313.pyc create mode 100644 Tuning-Performance/Transaction_Pre_Validation/agent_template_backend/app/agents/__pycache__/prompting.cpython-313.pyc create mode 100644 Tuning-Performance/Transaction_Pre_Validation/agent_template_backend/app/agents/__pycache__/runtime.cpython-313.pyc create mode 100644 Tuning-Performance/Transaction_Pre_Validation/agent_template_backend/app/agents/__pycache__/support_agent.cpython-313.pyc create mode 100644 Tuning-Performance/Transaction_Pre_Validation/agent_template_backend/app/examples/__pycache__/__init__.cpython-313.pyc create mode 100644 Tuning-Performance/Transaction_Pre_Validation/agent_template_backend/app/examples/__pycache__/grl_examples.cpython-313.pyc create mode 100644 Tuning-Performance/Transaction_Pre_Validation/agent_template_backend/app/examples/__pycache__/ic_examples.cpython-313.pyc create mode 100644 Tuning-Performance/Transaction_Pre_Validation/agent_template_backend/app/examples/__pycache__/mcp_examples.cpython-313.pyc create mode 100644 Tuning-Performance/Transaction_Pre_Validation/agent_template_backend/app/examples/__pycache__/noc_examples.cpython-313.pyc create mode 100644 Tuning-Performance/Transaction_Pre_Validation/agent_template_backend/app/examples/__pycache__/observer_examples.cpython-313.pyc create mode 100644 Tuning-Performance/Transaction_Pre_Validation/agent_template_backend/app/observability/__pycache__/__init__.cpython-313.pyc create mode 100644 Tuning-Performance/Transaction_Pre_Validation/agent_template_backend/app/observability/__pycache__/telemetry_observer.cpython-313.pyc create mode 100644 Tuning-Performance/Transaction_Pre_Validation/agent_template_backend/app/presentation/__pycache__/__init__.cpython-313.pyc create mode 100644 Tuning-Performance/Transaction_Pre_Validation/agent_template_backend/app/presentation/__pycache__/tool_renderers.cpython-313.pyc create mode 100644 Tuning-Performance/Transaction_Pre_Validation/agent_template_backend/app/workflow_actions/__pycache__/__init__.cpython-313.pyc create mode 100644 Tuning-Performance/Transaction_Pre_Validation/agent_template_backend/app/workflow_actions/__pycache__/devolucao.cpython-313.pyc create mode 100644 Tuning-Performance/Transaction_Pre_Validation/agent_template_backend/app/workflows/__pycache__/agent_graph.cpython-313.pyc create mode 100644 templates/agent_template_backend/app/presentation/__pycache__/__init__.cpython-313.pyc create mode 100644 tests/__pycache__/test_agent_template_backend_safety_consistency.cpython-313-pytest-9.0.2.pyc create mode 100644 tests/test_agent_template_backend_safety_consistency.py diff --git a/Tuning-Performance/Deterministic_Transactional_Workflow/agent_template_backend/app/__pycache__/__init__.cpython-313.pyc b/Tuning-Performance/Deterministic_Transactional_Workflow/agent_template_backend/app/__pycache__/__init__.cpython-313.pyc new file mode 100644 index 0000000000000000000000000000000000000000..da7ea03ce176d9e346986e6f2292b649283b62ce GIT binary patch literal 230 zcmXwzF=_)r3`KWh2SUK$Yq&_J4j5OdLy85LLYdVrW6x+7t&H&j+`982e5GxDg0L6J z3^>1#-bZ}#r^Vv6%8JX&uIzgm|1uAl<{7S4SFOy~t&*qgrg9q3HnQ3V6)m`;to literal 0 HcmV?d00001 diff --git a/Tuning-Performance/Deterministic_Transactional_Workflow/agent_template_backend/app/__pycache__/main.cpython-313.pyc b/Tuning-Performance/Deterministic_Transactional_Workflow/agent_template_backend/app/__pycache__/main.cpython-313.pyc new file mode 100644 index 0000000000000000000000000000000000000000..5b6ab51ef8bcaa631604cf1790228c71d51cc665 GIT binary patch literal 32382 zcmdVDYj_*Ubs*Y}_Zxf@Bta5-hweQVnc5F|QO@bD*+faw{Dp|ks-7gzb(t0dA z-*@jh)#wHYf|{8x`)6BX_35fpr>ag>ojO%@s_?{YHc;@)rTptNJ5Ev5f5#8$F^T~F z#G$9CZ%_=y&;wLI&C(8p6$1)Z0dM7ivR}ojqJC;t4SuQtO~01a_Ul+(zn;~TF!g|; z-^dyXtQj!%n^`k~wF8!ZD{CdNZXl&Ul}#nEeju$solPgOVIZSFlg%WsaUiQdo6RP$ zX~5Q>!{!j!JdoR;$Jz;O8OZN1U<(Lr9VqN~unq#J3>5Vjv&95X9VqE9WlIU1Hc-}I z&XyB6eW0ShlCA8oVynn^#z1xd4t7U>4O>ILGY4w>ovf3|IPTg}Z6-o9!6W!ncDdYNpxFu}=5b zVt5iXW`s0;OZtkv-EYNU31W&R%IVY*DyXP~zjUfMjiTl$_f-ii_TC)@4=E02P?V8! z0DgdCN|@3*n*5bDtDziDET=@7?Hg;}^xZ#JfZt<%WBp8dvyvScb8HG994jW_gJT0@ zeN08Oiaj{ixCvuuZ1<+`;juj=MjunztY8m~rQ?_T_hb2%Af^iV<{r!06q^}40N)sw zW=F>C0DCZ;sb+TUR*EsBJ~d2jf{&9?NIq?JWi*)y=$XI;kxE?*gQ<5aC9XhtDW*cw zRj^0KD&2n|c97ZG ztYgQ}5ca{oUP6npPhh%l5SIjzRAKKI=iz642a2uk*mpk&>K?SKa_A{Z|DUnaxb7ilOKD= z-0n|eu_Y)jUZ?vnB;VMZ*(=p9<7Jw2sWU1mm+YjC0%_2aOEIluR;kSF6myE%hj{EX z<73(gG{c-`_7ms~GtL|!&{<}J@iQ+Ve1>LcL7MzcEL90&TypB|xs;r8U>ocX8M`wM zdwv`2E*ZN!4trr6>>e4rHxBzH!2YR}+t{1wld&h6ek`M$_uw`$2I682Zi=zEO^y!A zF{YSlW=Q0uoX*lVv4-VXhvLd{Zkt>kma%7;GmJYSjhDBH#mKQHnUPIpIloN|Ph5;6 zn_^tprW{A*7-yMdn_?_)6XUoXW0sj?P9&7&;x@5HRf`DlX8p~ z<2d}f3!m|H1hQ|15l1JEkE;|7={iCF<4VTLd~604c*Yglcir1EQSsvq8cOZ*XaD&c|Nx%2-)awDAS+;{5!qmz`f)Bx#vRZu=%6 z%QK4?suV(s1VbU`XMv_*ZC?t`1pL8Z$9!PXe|`~=j8N*ugW%`e zC29AKpY>0W@L^II!ant^|D1nT$O4*>fkpq^!YtP7X+#c8EEf}e$4J!QL5Kt<9Nm3x zW~3I{zy!7oHL!lxFVHn30$p9D63o6?NZmWn&P>e&fHHpy>-KT|=(+ z!7i_B$TfI;q_2bN7Sd(dd&oU}q_4Bf%?RfC@fj~Pcd-`XXZ;g`eu14oH-iNc42$y%GvnR`-{Lf2=)^_@Ez%g* zh6T&!*1nuOIC#(@(Qu6WSk^z~o0xBLlm(Xy2YrF5$)%v*F)g;mXndc_?>$tSEw8En&vq3@r)O zI7K%d72Q#-gf$A&P4SUZkm3XsqtQtzMR^ooAXSA#Aud(OF-*3UUx12AqQa<~m5^hT zlux$|Nj?;)R8sB($^yzm7Xz21_R4$q4l;BF5F7>7QGDE~ z5)^wg8YlrwwGtojg~?Uoq=_=FEvgtesY@$8X&P*)p&(}t~ zHoG4np`c@<3YMVspC1ouAkaY` z;f=bvz+&BmZ_!uhn{4)?2(1&x)=5dEdSQ^M8(9i~Dph;P&rZ&>bH2d1zpfLQ$Ab0- zLmG@3BdjkF^o=8ve6wC@M32%+9H;Ai3k!8~zL|h?;ey~us;hYCWL1$p3i%y?zu*OE zHh)j8P(M)>-d7bxQf=1?uNLyDrCe(1>WksjU3_Zi_m$u8`d-iXOe_6ss{BZLek3LP zn)RxcPbuM2N>&HLDfN6x%kAz+M&7mItHXRo1(#8A%Nowu`&g?|Yn~b?Yx-L=U!D2d z*_EDkMY_8DK~C}No^Z|%K7Ge!U1Y~@UT5QUw(A9)u5!(i{nq@O^Pz&KNLK!}z|{Z} z9k@EcXOwaorIEZ6KCh0;t6R$}cvtnF{`d9YGTxfv9J}viaD{E*y!{(`b+cjJK&57{ z8!2nSI;FPSKBd%p8$jTgs1)1N3`$@6Uvy;~WmHDZh6=oY_0&R{GM`XdwM9<8F{}&L-8zrD}w$jDYmEnwS}1 z6toMz3$ydSiJ@N`pw~KHaSY7|{DMyGD#dW1!X@l@AZnwfp6R_3w*tplT(P`Hp(5$Fm7dE?SY?ZtQ@?aDl2^FWd-+UQRT!~5 zR{Ab4|5ufR#p)%IH>pV|o`C=K6Bwg__b>>_q8mJ-PfYazH6~hHsK$(9Z1PBJIMNEB z4~Bb>A{i}@tVWemQ&g2=NYH^`_MwQXQnJ_rKvjnM5pV*e5IY7Q;C~YRm1q4I*fRhH zF%KZ%2tx!b%*#Xq-gCa$B@kK=ip2@mfwMwItXXeeeDmV^S81!|wop*S^d52|U~a5R}(SBUs={DoZ$ ziLY@~L19b4Qb<^(z^Wm^h*BQsTR2o2q>sLdDg|LLVNVrJSQ^BFM%kF*#eoGxJQ*dT z@!6LE;R5^xJHc6@9_g%a8Q(NsIT+Rze@ZF!4H0A7Tdi-lUU?;KEd5jo9zQYWUf;8N zFl=o2R1Kd`HIyk2JO;zYo$GqFS|c(zUgtIfWzq!y2LQ<6xWbB>E*+pi52f4?p7_A> zpQ;{oRJYtLV;GVa3yYbGBg&w%UR>OVCCeqCyHIkhWJ^j4ui{`@bV*YgPzDs8bQ4`F zE|!q*NeZ+ZY!c)F-7bez2M)R9amzCR$p?fMXzEfGIjBNvO4gLB)I-0{Br?W1B`$bC zTNYOVv`c}rf%%sMOW4B)T|+(H9;VCd9v&X?GKXA4-XYh)E|>+K`%gD#XT;eU5foKw zK|_Y{ML|6S<8qKa1n~vU?EKUe%=EOdHiIKQ=tDYb)D|?P+XMyrtU#X&V&R}~MO#Id zSEL3j9P^9b;DRqe1Rwhx7zi9X)%Xd|G=+&b4Uc6OxuekB9B=nTb4I1 zq3r!1>hA0M9$3rQ)!_Z>U@;{1uZmo$)E{KKjF!7We8KFD{-dGeej!-u{G!b+ZFy5;#`EKe{qiiIcP zNNhF}&_K#b=8?y`la_?08E&nvS{Dl6e;W|V87p@@9+Y4FHA~u+#%rxtTlw_T)#9+FY^5iXl77v6)y$`yUd?_l?`Gbu z(Qr{SeBC+vr=#B;{Uk5k=7F!!@zX1P5o;Q1guHd}`pfTJym9eXOSrHJzV1}~>5lL2 z`0z})m#~?%X>n)f-6(tMAGy4^cpU`CYwqev{Xr59UwRRomrx~FFXUNzUQgv-r=1@#Q71K|? z45C$Bb}gVr!Bc#ascA4sB^h9o52BJ9mAE7qz$Mk^54w_2RgGGu+#HiN=OxI&!jXmZ z9(A$-MiOEHJuEoFl5gU}Bpdp~rD3y#JBmG&JQB5-xE;-w!aVXqZNNARs-^gN^q?%r zLxJQAB3td2ml-$t7R0_J2q+}uvcY5Arc829;s&x(GW=_j@*o*LnX7={cSyO2yVvg{_yuWDPh>k3Ukw$XLRBoD1bOs~=GZrZk4ZSj zXhBs_ikOM*Z5UF8+*eCcOC@N*6i5kJ0@hKS zER%;B_(JV!ySACUy(!$F{3bq(-l_4V;8Y7Zle|rvXJyqfd2M;jvvR-QrmdT2fg9oj z7)kOG*V4t7Yfgp*Dak!Et_4WdB_#oGk6G&Di7miEf%0Z{H^m`G!MHp`B^FWdnzv#~ z33_xM4P$Vk8fc!ym1gq9^#Z8bxPF$r7Z{ISb3Z2y#^jXkyb{Y2?F%hZ%I-D^ioHGh z(F4*KV+QWOAbrK&z!43UA!%RSrd6O)`J7yX;%jlLyJ*JRtlVzo*d#AN8hs|GQb1;y znba@9kB(RwC1`uu0KGj`w!DI+h(M|*HCY*%G$y^7j@cmw(g1V2ku=#TK_!!U9uj}h@DX#yh; z&KAhyJ}5!4wAUiI#;aDmX#1wimBpxNohE2T- zrl_CUyBt94`C~4wXOYLvNKovZoY%=~2Y7_-PQw(bfdEL7kr*8bij&6Dh>%PVOB#2Z z8hF0MN-7yWX;Il|-d++w%f#)0geO|YFVYr1s~>9J#}g8P&)8VR6g!O|aZ8-rj(q{! z=n08}`=kWL-jHXT$H0_=gpH2Z&uvw%&(W&NkY+L+jVYJ<)HdN2QaDrjS=!(>6sjZ& zacv3O5cG`XIjT;APc#8$M<8eP^N+GMo}4ez8<<*;0cFfKx%%9E+9tkJD%CdOby7Ik zh-;reUVnx(+6i@?RF-ce1(Mgo=PvIkE`N~6lOva*!KvB4?T-577|Erv-jh>LF^$lp zljx{kn%R}Sd=Robc^M(3DY<-rkUbtfxO+WDaFredxaHf_k<1gosn`Zb?k|Aj+y+N( z3xLzS4NkMfOTcN_2B#$sr*#{g);OGf&({_qr8bWa-2L0olG`ZY9M}fug}C%w|Ew`3 zdAn?{ledz#$w3F4+K9@{Z7@2eJZ=--RWGN(bUW4cG|2OwW>p|JZXIV_YQwR&Cs(4I zD6a!~o@}>2hABawJSoN())RUm?sN5oxcN`f=NKXSj(wBq|16!}lNZEuWAIPna36ec zUVZp%3^Wt#(GQKnMxsvQgt(CyP{xb|8G2M+JMzfuON^pf;Zgb_)qv6khE$SK6;RX- zy-wU=;x-cdZe_q4uuNil+M!l(HA4~NzCzq1#BGUMf~OKZ)zCBWRSo@^xZeX8c9e0_KKOlI{?9t9Z&~i$YFgqBl`P<=$YVr0QOT< zxLE+^a3rgzkR(Y4)wwDIn7W}Yfn1EZLS9Bx!bZX_IWt1`HhbJ`5J^HtF(RQTmuFer zD5;e;vX?bvgQR6yD;n#xEbArfhnA5lt;m`fgOMU^lA~ERWY{+a_R+Cj?qyqaL*ALl zj^z}Is962}33dguXasva(XgI<6Z1+cB39g3y0L=8(qFVH%yBGAh={}m`|NyR3hd$8 zx#%GTIFoStj32gsaHq*Mz65sXU|fh_EJ=y906l5T{Mrz`Jh#CGP%#dkv1`PqhDDY)4E6|8yKG+dM^PR#|BB)ic5}Emt0dIA?DF`QP9stPj>_bBZ9CEg*lD&NcOv! zF~ii7kDXvarUZp_8J5cl+jog|C!{6#%=m+XEx|ADRL7POG*t5v>r)|rOW?~a*nLDZ z3)UdU_=W;zAaJB%f;0lb5J$$eDOR*wlZN;n)(Q~}sj;3A<@mCWNI^K6AqgH*b3TYt z)hKAAH6`c+Xj3{nv+Nf;@JYh9BWSDDMNDXkyd1!UzKIU03S8h2jb~p%2-h{mmVF8# zY$k#g8z)*Uq2(_218p$q_f9XJhTUFrXaa3l1l8>P_*p^apPO04GehKPO^`i@RC17t zN!<3Fobk_2h)n~xS5cmlVza-4NMJmS2ZW%ZFDyWDS+qK5ku^Xb4=&iD>hAL{)DunE4JVp7&k@SQjTp< z$HqB9BQlZwHqyF?&MO$j5*>ZOxDh!f&~xl<^w*Ei1-+s)HKQGwUrG*pe!T6FpeNr% z;))W|KM}&}$iad`20UQMNk%-r1XHZ#Vu)>vvki83%aFfy+wR$c4S&xP9fplc5)V z;lU|R)wj|cDsG5m7mE9_;p_(3Y(;bBysLTF$HJ-Ad}_4Wsj#J-*OiBKk4gdS|qD-T?y|;j!NFKlXL8h6jkv>ja*S)4Qvh1Sre=u`Y^ZD0GJ4t#eY z)O#$v?>OIdJk)eNoOa?~)A8G>S9V_8cXi+Dkt_ScV3p8x{IWKbb^>bMmUr#q)r*lF z`#bqJ@-g?&jw0CwU?iVuxU7fD%d}nVz1kbe&LwzIMa~;eQu8~w9H@2&Z>!>LRS`#h zB(FS@TM9rt<2N#mIfl#Tr#33Le$ABr_1;jyo>23lu<7ulLTEPy@3h_k(+03>sO9Xn z5ojFwbzFWOq>hZxwu&WGF!p^TR<>wj#_ikLEalbti!uV1*8cgq~gZ@O>V^OJP@wf$H3M@+eq?270? zgh)m<9vz6-N+M}_kyHrDTTi7jz=l?zVc0+i(zj%=hbO~n3~ypW@ZUf4t2I1_u!GCn@kp+9xgCIvs@xkXaYoAa z+_7?Hy^nTv^1BXmyAJcaCPJPu-ZQ~@CL*P~_)-^F>WUPWzw`Qy*EhA8qSE(lH*FBI zt}r{YBDpo|N_amispd;|b0xd)G=)lbhf3Nbbqyc9_Wo;;@}@}5zDPwwq@?=212+#u zO3L4Bz1bQmuLp0wriZKP3D@*Rs+#$#KCY@STs07>aXrofiW~X%)U+qc0=wl?svyg9 zx%=r0G?iW;GNa+nWN73?ZkIQlc8WKh3YkuUNIR85!Ii(SM@uRX@ zzHARywkJ|r!qJc0_}+6wYZ z-Z^pO#4T+&zdlk>`p%gfXKvZT1r2MZ6}L3s8rU#vk){D@8jvP9(2Z;rvW(pU@@8F; z1A->Qv0Cz;^QLoM315#g3Ri8SoLN`HH;VScRh=k;*0t!PqcW>+HGZ)F{r&5D{5DXT z6`{(#>qh)AQJKZ7t?Oolq5BuDRp;ipfbx= zC*M1B^Gs-`D_q{bo{7F$38>lVX`?b7t67BQ1L2~*>pAF|i#cd|ujOXTt+{Z?zV$rx zw2OI^h30xb`W6u1w)H~%aKut53>P%77ole{7NHy~GF00hF78+_LEln{7pd68S9Ed} zoqWa7Pqcq+{WEK{VnemA4;#Y8-I0HNU(z9H1; z4vicMR~`jRtg5VyGN8SoFR)oI_deZE6_nv1cB?m>znjnAeYuxNB?o5$leGJ$>K`+s zas8z8!|8C^FmDCR&<_R_!-`*lo!O^8 zB?u}aver>#eLAI}Qu6R@#p5c<`T`9W+?h`(8Wk%`-Yw-Hcid6_Q7>m{`>-*j>;BEU z5<`CdxE$g0tKJKnD8gV-0kJ$HmZYH;&Mht?6$~!w*d7H@ukH4U)xAClyl0 ze~B6YwUl#Iklwm@`QkqX8x>&BPR~&Emun}j)OYAflj;vu0R5kx6nMfZr^(%#kM}4M zZmF9tSN@=ip4_YXL3IJZKh)8at(qU|30#poxnK7qwF+Ic2Ho`bCP4agJw2t;{JFtZ z1|NS>M^9-re^KwkD1T|8rwp3Ev{oX#hn_NP{&Fw+|5X+}m7@8pYz@NsIaBGHziR5N zf{$<^J!R8{9ZG~ta;I9<;Wm0IPZ!=_2Jrn7da6KozqF$SJ|bFrsz?{nIS{U-r%H8^ zDwh^M9@NuQ6}ksI+jqmqS~)#cty`;b6~f1lHS|=i?#J4$X88CCMNif1enK}P40&tN z{bX+yz&|abr*`RnT8yNAT4jQa{B$=x)uj7rlM3M$6ENy$KxnV#XIeGFCK{OeGpk{; zLHVfalFAcGN)=J#{T7ZA9Mfm3i;+lz@LfmxZ#?SL;NcZOj#D$yy zTuR&u;#L#4mbg$%2yGzlF5)&3I(xCMf8L^*PSyW{qNkOXU(hCm&6xTxGK>)Vi$Z$3 zSoI5s2H|qeber}UHS~0y=@+#ogqyYCzpSl;BcHR2)8jC^kRRA87L6eHDJ3IF*wCRF z1#BEB;}+4O%_Tm7p^BX^NoLaM)+NTFD2SyVg{h7BxaEao$tSi!3z(YcpG4jrjRb}$ zaPB2~Ar{PN;XLG;xLLg1(FZI$d1DRBhSPKFl=!c<%!{>1?I$IR3^oU-$1HPh7mn! z1y`y~Qe^QyZwQwm@T9h&m_I9+;9d=!1U-I@&%zobtg%HeqVP)BUWjYKLH4&G z9l?Zak6@)QUcX_)Wg-bLOI@tD;L_=N~=xCs<|zXK+P1 zy1pZ1#+IYvIpIXQ8M5I%V8h)yBH3JACSCC1$#Phj^UlFy88V$5xVOg+oXeXau^UnH zX5mtiaai*dulI;8;NUJp7FkdeOmGp2%vQD@v!VBj^$!OiPQ$mj<_5<{rP^ijlz?Ey zB|2<2corlmE-{PE!aeL6>4UmFINaGK7^1Zcx7P@HOc%rS4G($UU5AF5z7eQoIcXtR zto3AJERP8mbo6$03>+HngKJrm5ypbWVAWoV>t1QKu9Sk#Z_+%{WxcKAZMB@O7Ic1-26TRX z#@Cr^C$FC5Gk0*AJ3#LTUmc~-d%KUf*K_vzu)P74fABO=`qXz{<10G2ijMmgUE#Fu zdlg-)Mb}!s-ojOMacSK!EdVqV#vS7At(+Yv2jByGVYZyA6@5}Deb(2{^V!v0b~Vfo zzy}Vo=f6G87qoK)?Jzk2A2?cXfBP7p{{ol)0!$3RCkrUAWf#1CK2+8IVOKc2f6Z3- zt}ayF_2FXJHn^5o{O;aR?Z77^;XLiR#5it zbg2Gth&dWAI0loae8YM+QZJ|Uj(1@`)XNq1u2-NBD7ATS_wx4roPGa#75Y?DdPtFX zv~iBM^&RL_L+ODYU*5-+_pR5Wj}uhkZ|nHVgIwjo^*Z#ar}X9To)@PO>pRhh%28{c zJvLD3J@m6+I<&Y;uKaF0eYY^PJ6m^mS7#-BfM!D0c7vNV6SQ>u5+2X^Z2+RT;s7K* z$?kE9lj#^Y;dzd(fNS~*&t_eLp`D5?@?J3nI|gDUtDN`oP8O9#%L)ORSsx^7C{RV*4s67gw;cJ3RY>{ zj~>Go%<^V+?=UkWq>gkAc7bSyK|;jrgiGASLB6w{NNLszbl4PhQjwx~XBV?c$frxA zQJmyw%@`#Uoh)#wQpCNbeDuJqu?6T9qEicnVT}kCp|d$bwix|N(Ai9p92zIbxWqja zJ!#%Bex74X0s9vG1yNRDPlB`j8FoIsgi9}3!v$F!2FUVbBbV2>hO6{-Tu$9uemS4N zlgr;3&Tm}9HT<1i?#{J}I=*6ns~A`-cZ$+(t-67)KFn1gUMnc)3!1rt=C#5KzOa=m zY>g4GtQQ608ZK#~)ZECoqWrUh{3F-gT^ zrBbea8NfLjqpXKHShHfQA+#gzWbY_Pq>Ac`0ffhHfF z0d6%TifgX=gk<1TlDnI7B+vh1_{nbfI!eKD8<4zUtaAqbdf>15ix}4o4T(lOL_aqS zEn7&7abg8{p#lVLbenkD(m6BbbNFDt)E9IN55ScZxCICL{DmM`Y%JT{nYTj<;b2R!~ig#RPLTCt%=&;xZqRscs(PtGm{r&$BkGtmSg zF~p7^CE&gTF^6y^Bt@Z^4*n}ZAwz`K_SS1}z6Qq{Z(j(tyF*RP<=1%Y$UW=GT68}m zGe1<_$(g!fDHIkkIaBkxT3Kp%LMd%VxCSH5cvr=5y;V{y!J}^_vm(==HDs-x>?k2 zQQlS1?FP+Vr3zuK5xnoF(d{PH-Sj4aKQhqZ|B;DC*rI7K(|(jew`ZF^$}}Ndqy_(F zQ*`7aW*Fm8eEGrU0@6)Vpi6w7ZnEt;lO$u6+{B^D$6Lw;=-6d>$K-oX$T`fCg)XpG zP12mf7nfEN9=QA?$p{u_Z4I3auFHe{wdbAf^e7nxYB)eG$udWB-#R?Sh3Br6?#zTt z!6yh3xr0OeB%?f>yv*JjPwL!wRRLIDs-60PW>g*xlbz~dG%d#{$~O)pvpn)8JKf_h z+M1e2BiUeX5mH(dXJErxoFtakU7FN4$th=ourN=Q33QNspdbX3|4oK}l>G3yFv`4=tOCh^v*%yH)_1SVe$Y z)VC3Kp#wb#ZiZq{Axx~8E+KRoofULG07tL}eSw)pu!NZqO(lrwMARH7xU>Lwy3Pc_ zW+f#Ci--O}?EQNr@`vc4YAjk|8OZD#&d`th(SE`Qwt1q_%Dag2@4x|Xay2c9US(td z3%*W3`aW*%^U7>tk1s;r8<08+#+^ znd=HF`tYs+O-#8w)r zbA2-M*Q0+n8k(5qC+4|{c}V63MJFcn0_@&EGWY_|QMlm*2=)+3d*=|!%n5N{;hTAvmlDKOU`Z$eVgt&p!!Zn3V`nND zd!y18{o~Vt8Muowb|DApz+ZuIFhv#bG$9vyRGB`HydlJiutX^X`r$me)KZ04g1|cF zH!v5!i%t@O5qH<6C=o<$G?p_w^!~Rf6l7iR3kd~S;DRYkPJ#^zOh%eHM|0TGiWUz0 zZ{l5#g$7u<%CC)Gs$t)`W-EY8L|(b^%D;InY;!`l#;J=zt=UjR$9NXRn!V&~FNO}$ z?ofTlRS%%7rIA~vH(g~VFWq!PywB6nkI@X>tVkTyNhPaDB`b#BSBRC2+y^b&2`@n} z-v5l&nr+B91$augfkovl$sBtCLN^ctw^4|^O)cV6cW|j7^FpaRLa9f2L z!b5@g02Npa$K+uwZ-p<>3tCZd9ByFrliS^ciIZfjIPA#w!E6Vx;g_3OkzFhJ zzk8V5JsjSBm@~RVD)%#T!P=#A(8%-RSb$f%)?Fm`aO3rnuWqV(S;qYxhfY** z;l3yuF!ldxn_lHh590f z^tWo?tPR_8ANJN*4|8wk-oZ@vol~D>e zzGi6P?pKRur5mJ#DUCPUIir2GJY=+oj8!33)rJ`Yp9OK|amkhKs-y4b(5_n5-P{a- zp|3;@TI-^7>v71U{K$f#0lcDpMGp6nedp(j0p(El`!xFqBE#z+#1{(P_{p<1(V}(; zQqVz52;#&kGxc|ka z8DR$?bL=2G2f>LiM|wgzh}raEKr(MFi;7EasM ze>wG7t!sSTKU>?rG&$*K@pelE9`Bl%@p%_7z?`ZN$^;WAd=aT3nBdxR*xn^Ol|fdI z{(lJ$4t=LZxz7$`oan)>!x*N*5(IHvf=NhJ*N_^M*cRAPXd!9XjwS$$2oJa%^}w44 zL^b*P>tSOZZydk9hi~lRz;Li}fNLE1WH{V72EL(F<13wOM*Eu1%Ik7CUC#CDcgJs) zerqPItB<6YgC*~s!H{>HOPScvs!)%B+pMEYpsq&OZhE<}F4__|w@FE21UC&Ra^w7M z$Z523#;@vQF%zEH8cm{D$Lm#PLy=T46e&(NFyPWExvvEFtD?V~21~8cg~*cV8AL^N z+g~*lC+fvBZFo&ExfvBl>idv6_P?ToDr2;s1oi9;oP=P13SOHlDgzE?$d~X*WLPg$ zmmRCC6C#l6$}PP=cA6iX;>M;z(`_rpa>iFes#gGhcCX>$GolDx%7tyBw`mup`8^Fl-?G8h(f1I#t5D+xQqeZ`6x(dy zBo48&6EQLbz~`%}?SHI6RDWQY)x=bwOF$RTB}ykxV7&bs;)OiJA76pa`388zOVO-& ze#WA*nDZj!XfZ^Ha`gK<_?AOl%c0QW(QwNcziW&$o(!o@a=XT&N?~ppu&YG#d)hMm zO`qwd#R<6eb{q)E4^R|&unPc@2XX3NlC~;MZt&bFmh^oZw-sw4Hj4*P6Vy4;4+F|E z@6dw90ZnD*Rau-W>%XXMQKc=*Mgtub2P~>&poEb1lQHy|MQ0$v7Z+s~m)HRNA_i#K z3y6d;yNnKrIE6WiMkI5c;~0d#%T0?*@EZoBF1*XKFM3mA4g5UH_+pKtee;h9)i`hy zbQCJ<v)6uO8T(NI`27bs=!bGnNR>k2fD!o_DpBNv zZOnxUIHWi;&f?ONkWV&{y|S5#Gir+xbe@KvtP)RQIkv@#4h1Y~JVMzPG-4#<6usg1 zbMVO61=ftXh1=jtziuVkz7!>5$-i{voP+~#V64RAGJ;@B#FKvGhsD_@`~sBpOIY5i z+4<8jg_pv&79aL1!f=p;380WW zi6S3ez063CH4hh-2A$Hnka!8|78c0CSwMuvwGg3TOF=|R(h4sswc_c(ibTv!zh(iu zUeO=sVqrd&q|BSKf&1iObRLq&m3krZ$2j27b@Vs6;7q7f(k*4r3v52d+L@TCm<$d= zvz0`7ywz3##>?9h50xq>(YaWh#S4{*81M^Y@cRW*&ct86VjYN{n}`nDyfdl|6(K?n zn1DH@gO9;z2bf}g3)5^dhL>XaW+urjmD?s;f~ZF5hBM=!_kp>YpdTFW@eXz!=^7OD zFc=Mz+s)aR5l;yu1&eQDBJL+f1QY%`op;#X*V8w|z~Scwu!X}j(Co~DI4f8(n~nnS3Wj_Q9aJ&d2Z*DZ z3BZP@yjdyk+LKLuV&pYzOE+ZEg2f3hi<3DPXF)`TC5jOl%i$-&0;1AR#z;`B>3P-$ zcw|wizFt&=b^G81E&Kq+e)c*9!G9|FpFwQ_dw-gKNEQEg%JPuP`WwplbE=V}8Xr;( z52?C`RKZWF=7&`4L#q2Bwd*0(`;ZzSzzYwlk%v_KL#p||QQh$WA=UQZsOg84=OJ~1 zAPhdFY9At|Z(yv#FCk5|OwGn*^ug|@w&kf}@hV{EvG=HlxhcfnZn&uT{ zgi`WU8b_r?RA~{kLulp7TlsPqSMK_--p!@;M6z-t z=~-9Ghyy?5LZ@#~8d|ZDLYcF!OovT{EBXiN)wlMB(|3ialn0uWE4J0+A=hC}<6cod z&}UsaAJ#ioG!If6Z})yO89H$?G{bVK!4=B`W9jO#u+h1qdtkx%mR&2x2fBt{^^l&i;&v5h+y^nKoCj7&B2?6P+Y`37K1j7) zw}ndf-l+?x_CH9=xn3D6ZM`!RPHX4Wf_JArnGPMB4F%Y6cMv8Kd5Wi$idJsGPvVrV z9=nsnSvppXk&IG4!+9^mdFwo1H^|iuhBFR^sMH6kWvkQS)H=wvfs~Ll)IpYv@EbJO zCs$`~=iKT2Ny@7Jr&;V^^l; z#&q7+^7ZXpefxc?;}Na;O2HciS2STd`-#F%mp@Tb3fnqDPxq_nqASOdWkpXdDmvw< zMMGlCh4^dducOnszCo zp$LNAWHhclOlNHj;5?VKgu=OlNK=v~)X-akJnID1cz^2*I{DY?qy3I_HTZ zgHFNF+;xQ38=`?B14OnzQJ6)_`EaTaC>KbS3&OPRe=2DD7@?fAPCz+VAw5Rk08fU5 zLu>@aa7a01s0h=Q|5Kr-t1;=Sb%fyLm6)%P0ScA>1fm?k&;pEnATF*WOc!D3ehe+f z(EV{KBjqOw;CPfWKw$GJG9;w04%0g@->;H<)nMdTqxpiG2z8pEIGXS$7s{~!5d>23f3 literal 0 HcmV?d00001 diff --git a/Tuning-Performance/Deterministic_Transactional_Workflow/agent_template_backend/app/__pycache__/mcp_gateway_client_factory.cpython-313.pyc b/Tuning-Performance/Deterministic_Transactional_Workflow/agent_template_backend/app/__pycache__/mcp_gateway_client_factory.cpython-313.pyc new file mode 100644 index 0000000000000000000000000000000000000000..77accaf2c8f92acfc695d121b2dc1411d742b4a5 GIT binary patch literal 1078 zcmah|&1(}u6rbH}c9VXkAy(7ILn%@W)@(sjZBZdjV`)><(oHGS!!X@U(rx!6%+4B8 zJct*;gMv^BB6!uCN00sqksK;RJyk((mEhgkCXrSTeXz6dz4^`WeaxFye}50)Vhz67 z{viNxd2f)z0-|MU+h z1=fpf+o6aWj_nq>J@_EIGLI;(p?cOduuXLz*cCsS002U(k0-MSHoAVW+DYcGgDYb^ zAx%toc2L8UToMR=|eR#huF@(4;Q=x!7Quv-@&axY|}giD%}wY9rin zoL`TuDcy)&J}opIxB`;l0*mq1!TC%vx1M|mQks9|BpqtL~=W0%}ykcp1VPohMsTQMIaCdKFgMV+Zw>D(Zof{;Z^%%B_!6O(pXs68qMhIE=>jhhGgh5)+M7 zt{J_5I57Cqcy2V}*O~(p2Lm@hNQd#no7uMuuNNBQ*-yph<;7+^|4Whj zN{UP-n0mzCy~OY5%!3(yJX&yUoRnD)gk_I|FocA^8bBg^Vex-jn(EZ;o?OUDMI`2< r{Xk^MKN7lQIVI1;_s9r0{Xuqp#Bo3ngs))i2!y|b^lv#Nw6psIzw89l literal 0 HcmV?d00001 diff --git a/Tuning-Performance/Deterministic_Transactional_Workflow/agent_template_backend/app/__pycache__/state.cpython-313.pyc b/Tuning-Performance/Deterministic_Transactional_Workflow/agent_template_backend/app/__pycache__/state.cpython-313.pyc new file mode 100644 index 0000000000000000000000000000000000000000..8e74de72c6db5a4e5bd1c03e5c5a63f23ac1bf96 GIT binary patch literal 2717 zcmZ`*%}*Og6kpqmF&_qOW3c%M0YiW$#7#-tM6Du4iP|VpX(c1I2b9sUJ0_E?cb%D8 zh^tc&0r~u*B0OOJ3JX+LBgF&SfVJIO-9ywl&g59_tZz0)8V$ahy9L>bV#AeHLpsV{})c+UIO!?~C;>G%w(8au`id|m#(=-5F^~R1ee1$RDig;rc9eo15;ZLHH;<_j$?5-qF~py zfcGI5-n9t&V3FsYifT$52l!`f)%ytFP5OA4( z;Wn_1USQjF>UF5^wM#hkP7dx`j`2zb?I|N_Q=vz+=TZ~f2Dwl!7J@XILeBIUhADuJ zkOOn*br~21)IvQb-CHh3s+cVtVGG>M7Q)S@MWL#^<)~>A)<6x?a2O?AmOhfTP?vY} zmox{AiZ18m+$A-4cV7aB!kwADq_rGuBEp!%{?xYCM`Z>f8^(x`97d?&m@e=U$x(z} zyV!~};|Kv~xUi^AYzNdSE|>%N!^0=k@_x>Sf*g{WD$i7 zqy~ciGP(;J2`=m_Fg}O3CV#CqY*96_z*StokJPSLJ3C%iG*f5f7__?W+CaXI9|)^E zKx3F*^|2yhgW8Z1;%|T030UVJqwkC;mKv=E+lh8D5X3gCFq3MyueX~m27eN?@S(n< z`1^#W{iX%u`NOSXEO+=_Fi|-CKA0-|dO65V`ub#0nD$a$&C47=@b$%xVX@@vrC?<2 z@M$nQe)ueyEO`ab@Jh#9zP{8E<%_;v46?bSy+`eW_vH8&Wpz&roDRuwh7;Oh&~ z^P;snoeZgK6w6-4$ieV117^xT`Zu}y~4DwPY3f+ zPoVMBGrm3(l;?bXE~?{tMa5pIv>%@qPL0#jyREZ@O<&&(R&VWE0 zY33bF>`t&0_GWSUFMXMP+nxP4>j^m^fY#R5x-QeA)daqUtY(T99g-;Cc3hqSl9{hN loAZD@gCp=p<5TeXH_$oa}7Y~_dl!UFS7su literal 0 HcmV?d00001 diff --git a/Tuning-Performance/Deterministic_Transactional_Workflow/agent_template_backend/app/agents/__pycache__/billing_agent.cpython-313.pyc b/Tuning-Performance/Deterministic_Transactional_Workflow/agent_template_backend/app/agents/__pycache__/billing_agent.cpython-313.pyc new file mode 100644 index 0000000000000000000000000000000000000000..cf6799349d69733f7d0f33662fd3af1bc8bd5219 GIT binary patch literal 6322 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 literal 0 HcmV?d00001 diff --git a/Tuning-Performance/Deterministic_Transactional_Workflow/agent_template_backend/app/agents/__pycache__/orders_agent.cpython-313.pyc b/Tuning-Performance/Deterministic_Transactional_Workflow/agent_template_backend/app/agents/__pycache__/orders_agent.cpython-313.pyc new file mode 100644 index 0000000000000000000000000000000000000000..5c3f4a04e8928ff0a543639286480dd5a7839e40 GIT binary patch literal 5975 zcmbUlTWs6bmDJ0!WXrbvkSxFGmmE2YoTPD_U|kZ&kJOPZ8>W@IO9z&wXqyd1swCyc z#()MbFnB<)bss_7?V~9+Aj!TmbRYd1S_EhcbRQD5K?IQo0XAUhpB=Xt`ZMetQj#Ba zmTpXRe4po@_dVzC)Yf_k_>8~2`}#}G1o3z5ls{*wv2zj{w+Nb`$vAPDR7eWjwz%!G zU9nR{kmw<3dx)SNuiA(0)*i*N;*7Yy#!iGZLTn}@t~2ZkFKJ9hk(ULL$G_=}2D1&L zI6j}1G$GB;2-gLPvyfQOR_g4WgT^i5RYD}ZxL53vYQsCLqk;LK!u_OXmGbcJKYhDw};v^O`qN_4~L#(Q_-xb~E_6l*2OaQ%hQA``v z8ZYu`UQ^Z$uO`bPqsUo}R}8Pht}rUEtO*=%I60PEZCVNDGpnY68bBD6FKi zoF>Q;D>5&`zGYEMdVyk$=~YhWkr ztJqF?7eOS+;S#okJ0x4ucBHhB?T3|zpX-8itFBh8FKH{|14`V7Q?l4iR}TPYz*w=) z!zhyMNqdEYDT1Iqu%lwbyF2FhdR1xIN6_A+-ABCONRsntcLzSYrcCFL$?_Q~kURvR z+N6#4#q4kvTIqprS6&ljA98^9d*It$BRP_eGIsXj|G|Odhj8#i>6M&Gr%5w<+JSG; zPuJ1)XYG8el+cANzL{*Ur&0DAm%Bi%$d$Lw@V%<%&y2^Yk{ZBtuqU{%3M#n z52Y2>2{Dq$Kk#JvI!jI8fbl{S5jzmt%vQn z+EyL~kL(;SMUkW}S(S9tU1yzAHSFvtui5)pY=V@4VP!Gc9r?tjYoUNo?|s-EYIb2Am*Tt zJVUSGX>Q_@E%9d)-ZkM{0LcX7CKCUK-#_8^NB9Lt?8{^%lGq4Ljm2i?$0z1#X7tiT zVu7I-M&}nM#tr{cRuv>(RT&Pl8d-vb#;D5hDIq1R8-DXXj9K?oOx0Kg)1KIK%-C#VVPbIs{!UL%j3N34>(=Mhtf;{WkScA|??amAGKLobqnK+{gS@(7`zd93 zB>uX_z>yknG?(yAB`z^@qw}LP6AQpd#BR9Y;(e1>6be+LbRxj?1W5E+7rDqT@uJ}x z9b1^XGBLSeG^7ND=QIY-v$g_~DqdojL_TFysn>)Iux_{%o>gTj;!t`JCxrm98+J%r zlrXgRGCn_gslxdD#KQd4#1&xNmy)?`8q-FTYol&OVKb|Y#0x8{OR}OG9?S|P4pJI5 zVpj(7jH3vmhbxREnoc%EIOvtMISOF^?yy!W0WC z#8Fg%It2QmcnXN6*sLZi!iG5ws+6f^S<*~YkaEE;9@c?2z!*|2rOL)v~M@^CYqo$5Q-tSiQuWgJ2(N|hB9rP8nlA6-DSE5tzS%czB=;@;F`t;URX&qttA2ftj6T=&{+ki71trU0_D1r)OWrsmal)>4|X^ zHB<(QjD`oH0;#rAY*vh-b%_G-TrozOO3RwChO5n^&~!|i1ZmCW$rPl-!W!V60yl#o zfkFc8pc##gMI1)0x~@WYUMlA-2RG}Ik`Wp;SfoJl!eWiE;k&vgCx-x4V}?`4iY-RK zDonuHO#`lMi#QL&5G8_6egd7mbvJlgF?nouW^Ni{+qk*MAb`jkD@-xmDhn~AZk1Kd z;AKfkwd$yH{POLmVWVYVpe-3NpNiB&p~0u2&JZ}G87LM-jEQETF0*bIdCBNDjod11 z7_?N=v9Zhn_Dqj4su`Ss%Y(t znKB$p5FsO8r3n`}tvjb?pFElmXTJ$ZFr924{cwGt4I8y34oa6)3>80wN4P5_;r*gw zAyz3%DN4a)6|S1BWYq03xfl%KC8YAe$JbB;>OTLk(!WUSHT`-`gI?Qx`)sb}nBFqD zRZY~jZxPNq&%X#~wFg=Nd_-qYv126PG4hGC&~dI9IJa5z*c;IOE$(FcfXeb55nBdF+RI`3}RslFmLnWrW{%@(McoV(+( zmwM9P@qX$<=>w_QIh^kt&UKu=zmz+h$eo$Zh353m-VcQjgu69`&f#L`T<+|g-gR`l z%Gu=Gaubb#qCb}R$L?ke{^6}^94sH#SL_2$LbH31 zu?}cC?0^>E=Hyll(G=R8c@k_d22bUKr|u_nSGZj8R4$m>tbObaJ_!x%#a8Sb{Uit| z_1+`*7jhGe`M@jN)h?jabAWs=4iYYqRy}cas5m&DA4Kv86bDA~10%UJQ-y)cdQYs_b28s^^8Sm3 zo(tPmjs`yv&~|LA!PHhYYO5Nxg&;)KH5Pr5yf1RMzu-GwbRW;Tk3RunH-__#VX&J= zp;MswEgR9m*X}s&Z78bNem&T$xAp_ZrUAgyyJ#iVcZP z*OOrQ_S)^$T+5IiI-<7?=#5?aK=jV~N9(y0mkR^&ZEuy|1A<062J^nbyTb+FiLF`~ z+;naEVc4?a0ifj{RPXJ{JC{GYeD`{x?@Y1p+$R?c)cHrf17I?}!;iXpZ%-HdPUZVf z-G8OfcfQbdLGKy36Zt5Ti%t}JCbz56JZp%+&{m`A03LJz4>|yX7NWjov-as*Ht>e0 zJ|cMjsRPzOy-X7Q)8w`TgtZ+as!ss$&yw3su;n}Tm*8%12jfxlH)K5M_${_RCgW|6 zKOKeEXI*5x)A1QK-UFS_ZDhRL@wt5zI}iKGc%S287}q~MN5;dBhv!G2{l#fAe#G&` z$i)zJzHA`lgN`r#RoHGL5q6re+k|~444d$X2?r7Gd%(eX_741ZE&%v%4>->*`LK{k zIIu`i@Sy`T=cdYqfJt&G#71mpY*Z#;jcNl>ic-oMXdB&oqf}-4-uQU~_q78s<5qKP zu{oA+Mqh6pF4hg_+{5|0;qO#@$9ucElYEbCcf9ZHBqP<lqIpM65?X^L-EB z8g^g*BJM=#gN-l3l;L5Rw4BPqlPzP^Fbrl+r7NnAVIXd+nh2$jB*U}=CzKXMID^1s zteG(j5P0HaHMn<{;OP=>x_g8Y#3dM}&3eNG_)4YXbMwy$-P?L&+zbkOQxO0A{CWdK z*Ji!0Q4h3z)7<1d_B8q$>1_FS+)g@ATj;QINkp7R6Fd;c%$r+{Suf4-`dGTV_DsQT zfUnL9zSCM%yo{|1Wrq7ji}!QNPhbKc;?xj;Ejvk)UlBk0ia7p_>t`f+I_K~GmcWL& F_djVr_-p_G literal 0 HcmV?d00001 diff --git a/Tuning-Performance/Deterministic_Transactional_Workflow/agent_template_backend/app/agents/__pycache__/product_agent.cpython-313.pyc b/Tuning-Performance/Deterministic_Transactional_Workflow/agent_template_backend/app/agents/__pycache__/product_agent.cpython-313.pyc new file mode 100644 index 0000000000000000000000000000000000000000..0e8cc297dfb06a857c9c4b8593005d665b49b4c9 GIT binary patch literal 6319 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 p?^m_2!34f;>L~#GewJnb$b9*a%=tfszQeMYs@ zTm6tg=%;i}418(I@i5#!q9Q6PPtg;FDF!NP#l$dL)mWmU=99l=T3(4V*!Kg01r2;| z$JH`~)b6Dm&nXhAgqGlW){4qZyn9C(kAuz)gp7;w6X)bZR|8%9fBZP#Pm~hpa#Anu z;j1O}+#2nonqqQEPU4Ks#J;bUw12vRS4kN|B~3@gR7ug%O?3?Ad#b-6dETKmj2Ih% z5i(My8-d{vSO#7w3_I}4v{Gf*fhcA&30H_OEJ3``#ex`|xTI6>1ch|^K6Y@NK^-Fu z0LcMNpEAQE0)he;c#T7~)oo@FFK%LXfO(;YJ-1*y<~&Gy*cS);UQC7?lm{*_;n37G zoNDM&8#AC}AAE6W1$aZKgF?7LcnG|(OE+ajAsuDA#6eh@x+LlWX@YEssP}|els&~P zLYs+nI-iKt3K3C~3r53yQZ7Jtq=PJ6bp^j7Kq3bx7&dqnzHU{iCs>Qlcm{hY9Jz(BuE%m+je=D`fPptiNlu+OnAzY6SH zFQBgM2J11_$*EYcvAsro$HZY6&(-V_1@J;xi-sZK)~r(_iKVasAg#g0>u{^1qdt@y z+@afaH`mn1Te`hh`n0mY^10TWo^MSrd|hfyEgnuSezTfWuOQmMc736p8`|00-rAjO z=B~DKQ+uQJM{Rv*$K7^!?=|(wmVSMYwX(B^+1X}xuKw^xW}uxLY4nb?^}#nU-!JbL z8dvg-%tS+*I0g>rSw6-3;2CM~t_qfwOBD_zN--j;%x8nJlUJj(WtFS2K`e{OPopDc oAF)ev-7l+pZ+n4Lb;(_J8C>~;;1cafRTSkr8vT>XD3hJ^zab<(F8}}l literal 0 HcmV?d00001 diff --git a/Tuning-Performance/Deterministic_Transactional_Workflow/agent_template_backend/app/agents/__pycache__/runtime.cpython-313.pyc b/Tuning-Performance/Deterministic_Transactional_Workflow/agent_template_backend/app/agents/__pycache__/runtime.cpython-313.pyc new file mode 100644 index 0000000000000000000000000000000000000000..26cc262c0490ed302bb7937204d8626242fe19c1 GIT binary patch literal 6631 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 literal 0 HcmV?d00001 diff --git a/Tuning-Performance/Deterministic_Transactional_Workflow/agent_template_backend/app/agents/__pycache__/support_agent.cpython-313.pyc b/Tuning-Performance/Deterministic_Transactional_Workflow/agent_template_backend/app/agents/__pycache__/support_agent.cpython-313.pyc new file mode 100644 index 0000000000000000000000000000000000000000..f56e53d61838de3d488b85d7b2b7da02198b5681 GIT binary patch literal 6030 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 Y@q;gkfv-J3CCM}S#_n$jY?!$J0k7B)mH+?% literal 0 HcmV?d00001 diff --git a/Tuning-Performance/Deterministic_Transactional_Workflow/agent_template_backend/app/agents/billing_agent.py b/Tuning-Performance/Deterministic_Transactional_Workflow/agent_template_backend/app/agents/billing_agent.py index aa60099..05254d1 100644 --- a/Tuning-Performance/Deterministic_Transactional_Workflow/agent_template_backend/app/agents/billing_agent.py +++ b/Tuning-Performance/Deterministic_Transactional_Workflow/agent_template_backend/app/agents/billing_agent.py @@ -95,7 +95,7 @@ class BillingAgent(AgentRuntimeMixin): state, system_prompt=apply_agent_profile_prompt( state, - "Você é um agente especialista em faturas. Responda com clareza, objetividade e sem sugerir ações não solicitadas. Use dados MCP quando disponíveis.", + "Você é um agente especialista em faturas.\n\nUse dados de tools/MCP e RAG autorizados como fonte de verdade para responder somente à solicitação atual.\nNunca exponha identificadores técnicos ou de identidade presentes no estado, contexto ou MCP, incluindo customer_key, contract_key, account_key, resource_key, session_key, customer_id, document, message_id, ura_call_id ou MSISDN/telefone completo.\nNão transforme nomes internos de campos em rótulos para o cliente, como “contract_key”, “customer_key” ou “MSISDN”.\nPara consultas informativas de fatura, apresente somente dados de negócio necessários, como valor, vencimento, situação e itens cobrados.\nNão acrescente canais, telefones, códigos USSD, URLs, aplicativos, lojas, relatórios adicionais, procedimentos alternativos ou próximos passos que não tenham sido explicitamente retornados pela tool/RAG e solicitados pelo usuário.\nNão ofereça espontaneamente outras ações ou detalhamentos.\nSe uma tool retornar BLOCKED, OUT_OF_SCOPE, NOT_ALLOWED, FAILED ou outro resultado terminal, explique somente o motivo retornado, não declare sucesso, não invente alternativa e encerre a resposta.", ), mcp_results=tool_context, rag_context=rag_context, diff --git a/Tuning-Performance/Deterministic_Transactional_Workflow/agent_template_backend/app/agents/orders_agent.py b/Tuning-Performance/Deterministic_Transactional_Workflow/agent_template_backend/app/agents/orders_agent.py index f557bed..b793c26 100644 --- a/Tuning-Performance/Deterministic_Transactional_Workflow/agent_template_backend/app/agents/orders_agent.py +++ b/Tuning-Performance/Deterministic_Transactional_Workflow/agent_template_backend/app/agents/orders_agent.py @@ -95,7 +95,7 @@ class OrdersAgent(AgentRuntimeMixin): state, system_prompt=apply_agent_profile_prompt( state, - "Você é um agente de pedidos de varejo. Use dados de tools quando disponíveis.", + "Você é um agente de pedidos de varejo.\n\nUse dados de tools/MCP e RAG autorizados como fonte de verdade e responda somente à solicitação atual.\nNunca exponha identificadores técnicos ou de identidade presentes no estado, contexto ou MCP, incluindo customer_key, contract_key, account_key, resource_key, session_key, customer_id, document, message_id, ura_call_id ou telefone completo.\nNão transforme nomes internos de campos em rótulos para o cliente.\nNão declare sucesso, alteração, troca, cancelamento ou qualquer mutação se a tool não tiver confirmado a execução.\nNão acrescente canais, procedimentos, ofertas ou próximos passos não solicitados.\nSe uma tool retornar BLOCKED, OUT_OF_SCOPE, NOT_ALLOWED, FAILED ou outro resultado terminal, explique somente o motivo retornado, não invente alternativa e encerre a resposta.", ), mcp_results=tool_context, rag_context=rag_context, diff --git a/Tuning-Performance/Deterministic_Transactional_Workflow/agent_template_backend/app/agents/product_agent.py b/Tuning-Performance/Deterministic_Transactional_Workflow/agent_template_backend/app/agents/product_agent.py index 34433f5..998dad6 100644 --- a/Tuning-Performance/Deterministic_Transactional_Workflow/agent_template_backend/app/agents/product_agent.py +++ b/Tuning-Performance/Deterministic_Transactional_Workflow/agent_template_backend/app/agents/product_agent.py @@ -95,7 +95,7 @@ class ProductAgent(AgentRuntimeMixin): state, system_prompt=apply_agent_profile_prompt( state, - "Você é um agente especialista em produtos, planos e serviços. Explique sem fazer oferta proativa e sem executar ações sem confirmação. Use dados MCP quando disponíveis.", + "Você é um agente especialista em produtos, planos e serviços.\n\nUse dados de tools/MCP e RAG autorizados como fonte de verdade e responda somente à solicitação atual.\nNunca exponha identificadores técnicos ou de identidade presentes no estado, contexto ou MCP, incluindo customer_key, contract_key, account_key, resource_key, session_key, customer_id, document, message_id, ura_call_id ou MSISDN/telefone completo.\nNão transforme nomes internos de campos em rótulos para o cliente.\nEm consultas meramente informativas, não exponha flags ou capacidades transacionais internas como can.cancel e não informe espontaneamente que algo pode ser cancelado, alterado, contratado, removido ou trocado. Só mencione capacidade transacional quando o usuário tiver solicitado essa ação.\nNão faça oferta proativa e não execute nem simule mutações sem a confirmação exigida pelo framework.\nNão acrescente canais, procedimentos ou próximos passos não solicitados.\nSe uma tool retornar BLOCKED, OUT_OF_SCOPE, NOT_ALLOWED, FAILED ou outro resultado terminal, explique somente o motivo retornado, não declare sucesso, não invente alternativa e encerre a resposta.", ), mcp_results=tool_context, rag_context=rag_context, diff --git a/Tuning-Performance/Deterministic_Transactional_Workflow/agent_template_backend/app/agents/support_agent.py b/Tuning-Performance/Deterministic_Transactional_Workflow/agent_template_backend/app/agents/support_agent.py index b4f0244..b15a0e4 100644 --- a/Tuning-Performance/Deterministic_Transactional_Workflow/agent_template_backend/app/agents/support_agent.py +++ b/Tuning-Performance/Deterministic_Transactional_Workflow/agent_template_backend/app/agents/support_agent.py @@ -95,7 +95,7 @@ class SupportAgent(AgentRuntimeMixin): state, system_prompt=apply_agent_profile_prompt( state, - "Você é um agente de suporte de varejo para troca, devolução e garantia.", + "Você é um agente de suporte de varejo para troca, devolução e garantia.\n\nUse dados de tools/MCP e RAG autorizados como fonte de verdade e responda somente à solicitação atual.\nNunca exponha identificadores técnicos ou de identidade presentes no estado, contexto ou MCP, incluindo customer_key, contract_key, account_key, resource_key, session_key, customer_id, document, message_id, ura_call_id ou telefone completo.\nNão transforme nomes internos de campos em rótulos para o cliente.\nNão declare sucesso nem simule troca, devolução, garantia ou outra mutação se a tool não tiver confirmado a execução.\nNão acrescente canais, procedimentos, ofertas ou próximos passos não solicitados.\nSe uma tool retornar BLOCKED, OUT_OF_SCOPE, NOT_ALLOWED, FAILED ou outro resultado terminal, explique somente o motivo retornado, não invente alternativa e encerre a resposta.", ), mcp_results=tool_context, rag_context=rag_context, diff --git a/Tuning-Performance/Deterministic_Transactional_Workflow/agent_template_backend/app/examples/__pycache__/__init__.cpython-313.pyc b/Tuning-Performance/Deterministic_Transactional_Workflow/agent_template_backend/app/examples/__pycache__/__init__.cpython-313.pyc new file mode 100644 index 0000000000000000000000000000000000000000..97bc58039aafe8b7c1a32fe7dd12ae954e389631 GIT binary patch literal 301 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 literal 0 HcmV?d00001 diff --git a/Tuning-Performance/Deterministic_Transactional_Workflow/agent_template_backend/app/examples/__pycache__/noc_examples.cpython-313.pyc b/Tuning-Performance/Deterministic_Transactional_Workflow/agent_template_backend/app/examples/__pycache__/noc_examples.cpython-313.pyc new file mode 100644 index 0000000000000000000000000000000000000000..fce919c03dbf6608b0f2afd05e61567763258366 GIT binary patch literal 1928 zcmdUwO>7%Q6o6;F>$SbMLug8ORs246sK{?dS35ip0u0n<2#GAF3qKXO*To}o3-kW** z=FOXL#{0#hfuQ;0pRfL?A@s8}l2#Zg`g^{H;QkK?G8(JfE zCY1&sE8Wm6y^*#u@XK1cGX={iqg9RRf8(16-^9?;+HMtJH6|LXKUE z>lYU)h5-^Y+Gdo~AR;)TE$Y*Vc?5@T%828I0cln6MSLY>Yb&kr3U)*Af+!@Sc=h&| znED=QGTQ9y3(w1dpv>W9=xhaF;1T7RCTsg4j~MYW-GC(_7vg&HG9Jh49f}F&>mB0a zcIZ+=2KN}O0cPy%u-jipo)hwlaaR`7RD@a!x*{81;*@PrCel2D)I^4~J-fqNA}{R@ zw;hNl44HP|bZwstozbYng1RG%oHTiEpTTcmfS5)YPG}h|D#`SN-cpv8MfHK5XjW=& zWX6K>O!5JeNl`%VE|R*B!ZK+*JxK5oN_J=&lNc+76~G$W=Ru{3p7(_Mc5Y` zlj1QDLWfc>L#2&jr59wObE87P#eXl*s|0wVyb^@Ywjy#)=)-A3wC$A0$`iI>La0p| znP~>s1u=OdOqU`fMHU2?V^}uvMb!_Ys!JkLB`fo`B(plqZUwla(zZj#t1fi{FKC{6 zo3fRV`6O^?^;H^C=6iw10U~>ek$@9NZk@F3cSnSeVkMBDr9UY zMy1^q2S<3@5<4&0AT7@&tPDBlW%6qv?xIgn-#Bo`nEJt(>Sv2Tm5*(io96C`vwP)p zcgl;sxo_uh&fjY6onP#ij&7AUOV`ium8$(iN49dCx$7tQ4xQ>x9_g2#?w6+T6*D%XFWTHlxAH+}%t`?Pkv_MEaat<+3y=Y$TrD8fAtJItYW0EKd7 zt&^4mB?i9_%Ks01z#bmRe~JBRCLiI4Fb4J>;<}Jjs}99tvZQQ6ii1*2f-tqe;5sEo zV^U>VC8(?fikM8u7~Tkv08oJwvSTnQ`QY+@;J;wwuqnaF>j1`>1Y;rw!;oMY5)2Rt z7`S#)*?CH-&1gH*I_PFrWNh07rfs1|-8NhsCf_!p!P^`O6&`G%dO;Ke9cR9c_F*0k zx0rp&58Y0SzQUe`G5P%Q4?zr6MN#gh(u#I}3@J|z^n#*)H8DWYeY4b??(yEtjrU{o zJ16dTKN$7v(a`RG^o#T!9L>X*r-5?#GU_edn&`cD7%Q6rR~#uh*MY)Csi857Ji9f>FC$LinjDNU>`bm(-5D2~=QdHQgP%+t|Cy z%sRzApbG9t9IBqV(G%^797(xwLXC2WH7BH=dUF(2h#PN$S5#382c9%<-@JL>do$mg z+5IC&Oa#(9`t9}iRD>SMNhbQ(*k1(WHgXX|E_RiV@g;>R7IM{=;%Y6mrL~krB?mEX z&ea!nH$RK6Yb@8%OGcl7yGeP!7h4JY<@+@BV=IWQ##K()24$8Xvm|CD4L4%jG}kz_ zC{L+H*cW|p!7>2-xJxVmCt*OWgfL>&DyOY_qhe9(VsqIxAIpuFuuzwxfiU86Zjs|D zNvY5oP5UgW`-%)3OCG-8z}UZr5qbq#aK1I%1pBbK`0cUx1N{1UF(@KHJSSes;v;1Z zHG$K^;;L6pJhPIPA>Evd;>HY&A-Fi3|+DXf+hR)9S+d1G%D>6fIJbSby9e!~SQz&j2ehOKwL?>pr@asg`@%RdqByfUtP4<0 zZbmlaAPJYPwk%8Bae7he1SBO6X`l0M#BAO9`v`4DdQ{H6*bkl6eiTNXGb@y}W7Z>) zPn`=irK}f5A%}|`L0$y0>PqZ>d_%mK;aIdb+AY+Mq{e*^Ux-9p3Su{$&0%{-htvs1Kpi?w?ve=6NC zZ7%OD)NWn+-JIGrXSdDSp)o%^e&WZ$-NEMUj&ot#s1B!2j`C1O5U>CKPse|0eZ_0=cR%jN*}7qAsxN&o-= literal 0 HcmV?d00001 diff --git a/Tuning-Performance/Deterministic_Transactional_Workflow/agent_template_backend/app/observability/__pycache__/__init__.cpython-313.pyc b/Tuning-Performance/Deterministic_Transactional_Workflow/agent_template_backend/app/observability/__pycache__/__init__.cpython-313.pyc new file mode 100644 index 0000000000000000000000000000000000000000..47fe1272524e37976f481c4cb4442bef6f030456 GIT binary patch literal 244 zcmXw!!Ab)`42E}X1rZ8;jUF^-K|FaD4}~5>b~d|=oyjcO)Y6ymB0hw#)T>V*`vT5D z{SV3a6Y`VHtJQ5&l-3__wg1%eFL!}?S>US~nvHw;ZuF|SxsJ}Cki?)PBcT2Pk6HIX z1B+p=l(>4#KEU=ML590m);?<@@eI#wtSLyCEO^{1$wb~l7K*qldwtBuOO|mOBN<~$ we$UbYjU(iCVtuDJ#9${tEJ=oVKc3Dvk12PD$WMA*Zmd5{6@C}aIb9U`15{B-8UO$Q literal 0 HcmV?d00001 diff --git a/Tuning-Performance/Deterministic_Transactional_Workflow/agent_template_backend/app/observability/__pycache__/telemetry_observer.cpython-313.pyc b/Tuning-Performance/Deterministic_Transactional_Workflow/agent_template_backend/app/observability/__pycache__/telemetry_observer.cpython-313.pyc new file mode 100644 index 0000000000000000000000000000000000000000..05612aeeb02d2cb7292953764c0fef8b04d0d461 GIT binary patch literal 4855 zcmdTIOKcR$wW>e!x5xN{ZQ{jk>=?%28He9uv@C0Eiv`1gJRTP04W0H(&v?wZ+f?_! z4#@#+q{z`G8#o|Pq$sQu1#$Cn4>^G%`8X4=G**j^kaFT?Vgy-~L*A>NG1xe;w@u3G zH?OMRt5@~v{mQF#bpZlxw&BZ}(GVg3z)r16E<#sl0J%jHBtgf>Ny?}~wqs8i6HW?D zI4Lqw!M->qos^jjcrYPtBQp~7048(H3z&yvzC>vr>Hj?lk5L{U-kPSrY zo?s_JouFnIrmfjI)373f<4bF{Zs%ro$A|EmY3M*C4jIK1b=f(@ZHt7^)$4%VB9m)# zNpghl;v|HmK_G0D9;nWa1INa8pgLfXBpH`C&Js{Sjk~t02CF7X52zwZ>d8K#heV{f z<4wlL;%7dIN2HhHiQ(u=Y3TS6!1x)&kB^^W(_+Ay3k@;W>CFqvP&^7s~fhOVcM*Yebr3mViN@;XJq@&>MUcj zSqVzF6l-(rp?X8 z%qdG}SG1{IK4%wWww~8#b(l z^L8by+$b&uyDGt*<>1bxVC4G9a#QQ=qc@M1x{pT&w{;>S*Qb)wE*}3fpQ?qd=KShS>83BZ9t9+Vr>ZCI3v0(clIvnu+dd2thClJfu4Y_Vk(eol)1uGK4(oU_B1mK*=c16B4ZI^rFGVw(3vu=Gd=ohqQ(NDR+-g` z%9I{RnMNj;EigT;VE9%v<&162mXnaB)K6Co)snLnikr<|xfq{e3 zjfV_?d<#VC3WoeEx?;^~M$8ofJGMdY9>p?|0ybKe13_Qcn36Lr*fnQ{ePr``fa#YD zx@9YzKN@ht8!`~svBxqCETyNashz+L5yZK>qWRt;=Nt0y>$dYs9w~UslKT{#$MLVF z7>2hT5gp0W^BER_4j-}5{}n}XUBsuVklSokb$+~d!<$%4v_>`n%oaK#_)zh3;#NNN4|6I8(-h!_HOW@%GTX?rF+4zf{)s}{@C&Rjz3M`%YT($YTs9B zKT>W#vebTbxw&n*t>bCXvn4PuuhdKa!^@3ZZ%1!ND~-M7#@@Tv{!(1rwsdr&)Yw~U zOjbh4QYg9NBMmL{p{IUQcaHw+QMhfD2>!#5*Yhnk4pu^ge+vylx|I*2i#? z&yRVA`{@IJ@3BMVL5vZCz;a9b?F%vTDmw@9!uT0P-;n6!s(JPT@I(eTg4dic~3w6GuS<7v>q_W!*sjA3`dH?o1Q^LCy@Y;a}1}sO}}ixXgUdx z<2_J(6@RMyLgB<1a~YZ|U+x+_n^|pY3`SqpuV;fG%H3pbU6+@y!Z(FXEDj(NbfBIv z;6)AfL_k$%&2%A;ct}+*7qonJCakKN9JA~^)MthX(_U3g!^=)(yKyCMa6^cVA~*rS zX;D>p+~W&ev*E2jRe;J*Rqwm68}6;F8;KF1=B&#Aenp-NUfH+ONCr>R7etWXTd5~~ z(G_p2+_DlNyJO4mbv>LOJ8vKlpxOQAif9q$Hi+(;|fCc!Kea1?iIZn4WhC#1-MU8788*IBaxfzJn*W4 z0+Ml6<9`JhcSde_UD)LZPa=kOfg8GfAGo^zke!Dy3ZHclz=}vI{g&)lkt8a;2obvL fTe9_;N1*5Evw%Q9tO74>deI!ES^7_ckgxk6vBC?c literal 0 HcmV?d00001 diff --git a/Tuning-Performance/Deterministic_Transactional_Workflow/agent_template_backend/app/presentation/__pycache__/__init__.cpython-313.pyc b/Tuning-Performance/Deterministic_Transactional_Workflow/agent_template_backend/app/presentation/__pycache__/__init__.cpython-313.pyc new file mode 100644 index 0000000000000000000000000000000000000000..c39a0a899139f5e974e3889c20b464eef4019c04 GIT binary patch literal 336 zcmZusyGq1R5WROJtgftVrLBb)DfAXrf>>E8h>!&fi(yPAA?|&I$z2vpf51ZUBm5id zfFM}e3Hbphuy#%{GiP4sOh27Yl$e`6Kio1rn(p7d^80{G+3U( zD)7Q!MLt5w=xD$Y^4iRozV_A84RIORq0h-&kdV9Di-OE zkz8Xj65M0H5TOQ}#xzW=5aF<50OU{vIBp)h%`+E@rKNM;5{bjR?M&QHqP6}|C!gB~ M?~}u)F^{GA3#T<^VgLXD literal 0 HcmV?d00001 diff --git a/Tuning-Performance/Deterministic_Transactional_Workflow/agent_template_backend/app/presentation/__pycache__/tool_renderers.cpython-313.pyc b/Tuning-Performance/Deterministic_Transactional_Workflow/agent_template_backend/app/presentation/__pycache__/tool_renderers.cpython-313.pyc index 009b7c12fbc13a60978eabb33f4e2eeba0d9df9c..79a8274a69f01c26de313e79379329b613dc9359 100644 GIT binary patch delta 1950 zcmZ`(T}%{L6u!g$&+aUX%OWlU*X5@yA}cNeF4mv=6QF>`&1xbVGVTs^5N5V_W=%m2 zyj9vJti5fd+NLy`79W~wcxWGdFyW;SeOR+rx6?E=X>4L&w2?Lq=|j)mb)~U(9=^Hv zobTN8opXO~1!&0qR1kOspYdIK>{riC_vf5@J~W}|p@gW5A#r5K($AcktFi;dgb?>M z0r(+`axs$|MN7h_5JyGp2KvCs({G)Xw9MRUvz)3yC}yU6?d9!J+mMAV&%T&tJ69M% zs6A{d&M=BuqmFLyiN0cBAj-$A|DoAlqbXoO zZOwe51fc;xn0R{IV6QEGZgIt&kP<|TEb;_Iy5bw@tM*RrEMVoH zm=ltF{#Bx@80tp?6Wff0r(rAh>qliaDJw?P;p6^WnT^^C+VnQX7hV|v^aYc@+TIg_ZFHVAqEvI2c z#Yu5;Ton^|VBcZflvD|p-jXJg<0_ueWG$hz@bQ$ULwYhSCt7eqji;CtEa6irO;#jr zTEnNMNiB$#<*O_|3KV8o@>!=W`Sn(9y^IyXt0mp|5j*(? zhl38oG%D$aRZJ#fPl$(^c^T^0bV?mQ!7z`hvSOIVB_$}(X45N`hGm>}$FSt3l5&V3 za8D5Z(NVq8a27Nqby-!28_b#jfZ0bM3l;PYlV@NXSlC(7-T@Ue=!pw?%FEvt_}VzMSBlJ3f1S-kudU%^alf@pTbf z*}Ok%tIOGiIoGT!eQu#|VdvtT8DHC7`?j1-NFUGIYS)|x7rGYPGQKT$?X3^!SA6rd zw|YKtZU235@Qye5gQqg*ulcm;qo#%KtUq+$zwbu-*IhTezB!l;@4N7NuDtS6&&8hk zW7+bC3kPzg{`s+NX%h=7EuTG~^VHn;G~DqtT#GMm&Ng=3^K?Eanii`Tg&VP3k=s(X zyFU{d$TSY#^Bnr!hkPdgpB1#-8K_;cquRhi!x4)ZfML>3r^tFXt!4mkDk2yF(yr-X=ZDlW zsAtf?fE|E>K-WtJMwp+SAku;$F=4L`X=M;%uoZy*nwMjK63SQBJB_+8<`TrBr22t(~NwsUG#flkEIW&C#c{3J{P86x_|StQ%P7?2unnm zo4m##OmCJ3Ed4N)X|8m~bQng1L393e6EjQw3_RWaGr)=yX8Vzgk z&6l5Tj7L7i-l37bLfz$s3gM(c)*Y9ZZO`R|m4Q37YL}_Q8lKCX^5&J+7i6GC6VB_J zh7J-yUTZ68RgY;afmH;kkDECyZ!Af)<|j*df$%0J7%H-6jgtx~Vj6-|??EF1)_Ic| z5Q!&N_Ur(VURX?#r`nHbY-f9?-X0p;P3>AAQ9Dv>8^zW{_yMwIkZ~x?e8cwY*w^vm z4L{V~!hT@1YmwKbzV2`tB#nmSR;01vRo%QrRns)7Af=#R!4QBn8-#L3ht)<#{ECd2 zS)g$-*z*>pTYEh}11KZj^qwin$R??Iw9GwDYJT5+72r-##LGD>%_?_XCXZDdX2Sr9 zCk@xDJ5pzln)$$z)cnvbr6@wPQ&=JlU7b{}rvSwFP z3NLmBA60oZ{Xelv)#huA(@{L@Zk4*XF|X2{E9nU5AoRna!H@Bh=Q{ZSofG@1<>{lW zmES*q#nfAp)^y#gG;7Wby$vCP#V&|a|3C(zsY5G*vWLS-G;}x?M#0~M2D*!=`o+J2 CJHv$l diff --git a/Tuning-Performance/Deterministic_Transactional_Workflow/agent_template_backend/app/presentation/tool_renderers.py b/Tuning-Performance/Deterministic_Transactional_Workflow/agent_template_backend/app/presentation/tool_renderers.py index f77c47a..cb44202 100644 --- a/Tuning-Performance/Deterministic_Transactional_Workflow/agent_template_backend/app/presentation/tool_renderers.py +++ b/Tuning-Performance/Deterministic_Transactional_Workflow/agent_template_backend/app/presentation/tool_renderers.py @@ -13,7 +13,42 @@ def _money_brl(value: Any) -> str: def render_telecom_invoice(*, tool_name: str, result: dict[str, Any], state: dict[str, Any], agent_label: str) -> str | None: - return f"[{agent_label}] Fatura consultada: {result}." + """Renderiza somente campos de negócio seguros da fatura. + + Identificadores técnicos/PII presentes no payload MCP (por exemplo msisdn, + customer_id, document e business keys) não devem ser propagados ao usuário. + """ + lines = [f"[{agent_label}] Dados da sua fatura:"] + total = result.get("valor_total") + vencimento = result.get("vencimento") + status = result.get("status") + if total is not None: + lines.append(f"Valor total: R$ {_money_brl(total)}.") + if vencimento not in (None, ""): + lines.append(f"Vencimento: {vencimento}.") + if status not in (None, ""): + lines.append(f"Situação: {status}.") + + items = result.get("itens") or [] + rendered_items: list[str] = [] + if isinstance(items, list): + for item in items: + if not isinstance(item, dict): + continue + description = item.get("descricao") or item.get("nome") + value = item.get("valor") + if description in (None, ""): + continue + if value is None: + rendered_items.append(str(description)) + else: + rendered_items.append(f"{description}: R$ {_money_brl(value)}") + if rendered_items: + lines.append("Itens: " + "; ".join(rendered_items) + ".") + + # Se não houver nenhum campo de negócio seguro além do cabeçalho, deixe a + # composição pela LLM/guardrails em vez de despejar o payload bruto. + return " ".join(lines) if len(lines) > 1 else None def render_telecom_plan(*, tool_name: str, result: dict[str, Any], state: dict[str, Any], agent_label: str) -> str | None: diff --git a/Tuning-Performance/Deterministic_Transactional_Workflow/agent_template_backend/app/workflow_actions/__pycache__/__init__.cpython-313.pyc b/Tuning-Performance/Deterministic_Transactional_Workflow/agent_template_backend/app/workflow_actions/__pycache__/__init__.cpython-313.pyc new file mode 100644 index 0000000000000000000000000000000000000000..8accd287b4b3fd0026fc516b18291ad49bcfd631 GIT binary patch literal 284 zcmXv}u}Z{15Zz5cPT}A>TPq=jZY_wFm4XO&U^$GNNmwtt8zvhMf5J}x!Cy*YV`V4g z2b{%oikbHw^Byzva(Ser{Oa}TROVME|5fb4yb|!H)@rS9)s1F-qS~S=zqQDfo(^kz zj@@W6-c`kXR`ke5`WYaDDT%Si&N z#M<)xySd%;2PGCsw#@l`lUIRDf63oi0Q7Wz? zN)u{hYC3jSij+-4+(<5CwlC2X&qKwzp(sStqR+bLGu=iE>8Nze6kX{t2(#0(Ni0V% zR(!`V&pyGlLv_yLKgV}M=2&KtB0p@gK(6^bp_Ald*b7{a!Q4dFHuh~D1%ZB! zV5r-8hqx6BkzDYKDxy+hM9JX_=V^+kPru6}X8*1J$s7XF4p z`|e5xM#B`Bc}h@wTJx zwZhZ&f>A8wIofnU2_qKAtBPB$g!_Q@b5#PD4)B-`wvE^yX1EcJG*oaYv$s>-I?l}3 zCKhU=i-&KHdsk}8O43Q+09?(gQI~1j#4^oj?A)#7+W0~$`iT_Vu~>^*eBucI*yIz$ zRYd7K9O@mg%TaT-hLC_nNa-AfLl literal 0 HcmV?d00001 diff --git a/Tuning-Performance/Deterministic_Transactional_Workflow/agent_template_backend/app/workflows/__pycache__/agent_graph.cpython-313.pyc b/Tuning-Performance/Deterministic_Transactional_Workflow/agent_template_backend/app/workflows/__pycache__/agent_graph.cpython-313.pyc new file mode 100644 index 0000000000000000000000000000000000000000..192132da76d083548dc4bd252d3c7d07840e493f GIT binary patch literal 60618 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 Ueq2!jU}uD0w@^otAo6bI-(E4Rc>n+a literal 0 HcmV?d00001 diff --git a/Tuning-Performance/Deterministic_Transactional_Workflow/agent_template_backend/app/workflows/agent_graph.py b/Tuning-Performance/Deterministic_Transactional_Workflow/agent_template_backend/app/workflows/agent_graph.py index b8ed7bc..303bf51 100644 --- a/Tuning-Performance/Deterministic_Transactional_Workflow/agent_template_backend/app/workflows/agent_graph.py +++ b/Tuning-Performance/Deterministic_Transactional_Workflow/agent_template_backend/app/workflows/agent_graph.py @@ -494,6 +494,119 @@ class AgentWorkflow: "next_state": "SESSION_ENDED", } + @staticmethod + def _output_guardrail_context(state: dict) -> dict: + """Monta o contexto operacional do turno para os guardrails de saída. + + Mantém evidências/protocolos necessários aos rails, mas impede que uma + transação encerrada ou semanticamente interrompida governe o novo turno. + O histórico completo permanece no state/checkpoint para auditoria. + """ + ctx = dict(state.get("context", {}) or {}) + mcp_results = state.get("mcp_results") or [] + ctx["evidence"] = mcp_results or ctx.get("evidence") + ctx["tool_result"] = mcp_results or ctx.get("tool_result") + ctx["tool_executed"] = any(isinstance(r, dict) and r.get("ok") for r in mcp_results) + + history = list(state.get("history") or []) + current_user_text = str(state.get("user_text") or "").strip() + if current_user_text: + if ( + not history + or not isinstance(history[-1], dict) + or str(history[-1].get("content") or "") != current_user_text + or str(history[-1].get("role") or "") != "user" + ): + history.append({"role": "user", "content": current_user_text}) + + route_decision = state.get("route_decision") or {} + route_metadata = route_decision.get("metadata") if isinstance(route_decision, dict) else {} + route_metadata = route_metadata if isinstance(route_metadata, dict) else {} + pre_validation = state.get("transaction_pre_validation") or {} + pre_validation = pre_validation if isinstance(pre_validation, dict) else {} + tx_status = str( + state.get("transaction_status") or pre_validation.get("status") or "" + ).strip().upper() + terminal_tx = bool(pre_validation.get("terminal")) or tx_status in { + "COMPLETED", "FAILED", "CANCELLED", "BLOCKED", "OUT_OF_SCOPE" + } + semantic_intent_shift = ( + str(route_metadata.get("transaction_interruption") or "").strip().lower() + == "intent_shift" + ) + stickiness_intent_shift = bool(route_metadata.get("route_stickiness_preempted")) + should_isolate_history = semantic_intent_shift or (terminal_tx and stickiness_intent_shift) + + current_route = str( + state.get("route") + or (route_decision.get("route") if isinstance(route_decision, dict) else "") + or "" + ).strip() + current_intent = str( + state.get("intent") + or (route_decision.get("intent") if isinstance(route_decision, dict) else "") + or "" + ).strip() + ctx["current_user_message"] = current_user_text + ctx["current_route"] = current_route + ctx["current_intent"] = current_intent + + if should_isolate_history: + operational_history = ( + [{"role": "user", "content": current_user_text}] + if current_user_text else [] + ) + ctx["historical_transaction_ignored"] = True + ctx["historical_transaction_status"] = tx_status or ( + "INTERRUPTED" if semantic_intent_shift else "TERMINAL" + ) + if semantic_intent_shift: + ctx["historical_transaction_interruption"] = "intent_shift" + for stale_key in ( + "transaction_pre_validation", + "transaction_status", + "active_transaction", + "transaction", + ): + ctx.pop(stale_key, None) + else: + operational_history = history + + ctx["conversation_history"] = operational_history + ctx["history_texts"] = [ + str(item.get("content") or "") + for item in operational_history + if isinstance(item, dict) and item.get("content") not in (None, "") + ] + + protocols: list[str] = [] + seen: set[str] = set() + protocol_keys = { + "protocol_number", "protocolo_id", "interactionProtocol", + "protocolNumber", "finalizacao_protocol", + } + + def walk(value): + if isinstance(value, dict): + for key, item in value.items(): + if key in protocol_keys and item not in (None, ""): + text = str(item).strip() + if text and text not in seen: + seen.add(text) + protocols.append(text) + elif isinstance(item, (dict, list, tuple)): + walk(item) + elif isinstance(value, (list, tuple)): + for item in value: + walk(item) + + walk(mcp_results) + if protocols: + ctx["expected_protocols"] = protocols + ctx["requer_protocolo"] = True + ctx.setdefault("tipo_fluxo", "ajuste") + return ctx + async def output_supervisor(self, state): """Valida a resposta candidata com o OutputSupervisor corporativo. @@ -509,15 +622,15 @@ class AgentWorkflow: } candidate = state.get("answer") or "" - context = { - **(state.get("context") or {}), + context = self._output_guardrail_context(state) + context.update({ "tenant_id": state.get("tenant_id"), "agent_id": state.get("agent_id"), "session_id": state.get("conversation_key") or state.get("session_id"), "route": state.get("route"), "intent": state.get("intent"), "supervisor_attempt": int(state.get("supervisor_attempt", 0)), - } + }) async with self.telemetry.span( "workflow.output_supervisor", session_id=state.get("conversation_key") or state.get("session_id"), @@ -603,7 +716,7 @@ class AgentWorkflow: component="workflow.output_guardrails.start", ) final, decisions = await self.guardrails.run_output( - state["answer"], state.get("context", {}) + state["answer"], self._output_guardrail_context(state) ) for _decision in decisions: await self.guardrail_telemetry.evaluated("output", _decision) diff --git a/Tuning-Performance/External_Guardrails_Judges/agent_template_backend/app/__pycache__/__init__.cpython-313.pyc b/Tuning-Performance/External_Guardrails_Judges/agent_template_backend/app/__pycache__/__init__.cpython-313.pyc new file mode 100644 index 0000000000000000000000000000000000000000..21303451216b5048bbefe70920edbd7ac712080a GIT binary patch literal 220 zcmXwzO$x#=5QQ6mK!k$VaG_ZX;!Xq?;==tfHq#Pq(lAX?@eb}hgjed;6G$&$0{Ry7 zzQ@4hb!j?Ig52bBivEu0FY$wJ5a5{<$yDrK3HL(k;;X$&W4%=9QDVM;OT}l21z8U{ zqoJ6g%CtN*R@-8>C(bK2Xfu-Qt0%Tt!lpr1jJm90+o*!-UxO#(O7sLr%+6$$MCT-c ew%P;C-K`xhO{JQWRy+(_;?_FCr!R!yexNT2B0mTK literal 0 HcmV?d00001 diff --git a/Tuning-Performance/External_Guardrails_Judges/agent_template_backend/app/__pycache__/main.cpython-313.pyc b/Tuning-Performance/External_Guardrails_Judges/agent_template_backend/app/__pycache__/main.cpython-313.pyc new file mode 100644 index 0000000000000000000000000000000000000000..005a6d8a67fff90452e0aa8131b96ccd464bddec GIT binary patch literal 31117 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 YJyh)rG*MswI5*#|G5keQj@xMXKlYrwW&i*H literal 0 HcmV?d00001 diff --git a/Tuning-Performance/External_Guardrails_Judges/agent_template_backend/app/__pycache__/mcp_gateway_client_factory.cpython-313.pyc b/Tuning-Performance/External_Guardrails_Judges/agent_template_backend/app/__pycache__/mcp_gateway_client_factory.cpython-313.pyc new file mode 100644 index 0000000000000000000000000000000000000000..2f4233929bea6a178b77e4e7da56b22ed27cf424 GIT binary patch literal 1068 zcmah|&1(}u6rbH}c9VXkAy(7ILn%@W)@(sjZBZdjV`?lGz!IgcW0Zqt(tU!cuPZx6{5&7Sj^JOI>ai3q4#=wq5{ADpN|MWJ; z1=f!&%ch7Lw&moxJ-m`$TSOGsP(5uL*rK`z?1@Ll2Y}EX;AHl}X3r1SyJY@4xH7>B zX=1V)S@$20b@XJ{rHOMj01(ev2AfI`cWQQ@CiSwPiuEUXc28~!7dr|la%NtuHiKQq z>GjB((mS!2PYcZYE`WG2&mz2aa4}WL+)3SqnS5$~IkUhdN?goB$3q+I%X=f+lvd|d z)wFeFZrcu>yMASQnuU+!3ahzHp2beMmR2&W8wIFk(yRFejfpeUaUTn8AqPX3n9NV@ zU2L%sH7eM4DRi)ITSX`CXQJ&exr`~c?lHe<*DxUxFPr%ci@pPGuLJCs0 zGz)7s*;P@Q&j2hDRKcDNZQW1{u4P!|%WIgFY*Im%j@8V4iiw3xxacBMB*-uwn01R~ z>~u3wT&bFTuHY8ZImM!is#Ue3S7Es`Y*0U%HdsPBwMjiut+VKsYnVm&KZu;=YymmJ)nie^hUTC*R6VMLkfGpOj=%x%OeEsiZ!KBH#LBt#IV!=!?-tY^ssSG{d)B zL&MLFCq^TBsW~)tFm(03)QZMl&%arEwbYnQe=Ic5XPeR7FGU)V4}s*D$r*l9Tx2rA z)Fsy5IesfAp2_%w@w{!}xXk(>EV&$nAtd~*021O0i~iHdM7M6|=o*eHA`uVm9YjXF nErA;qyXczu78&EFH@=RCIP?jE@C8hK1;Oti`CASM9d>^J0hs`O literal 0 HcmV?d00001 diff --git a/Tuning-Performance/External_Guardrails_Judges/agent_template_backend/app/__pycache__/state.cpython-313.pyc b/Tuning-Performance/External_Guardrails_Judges/agent_template_backend/app/__pycache__/state.cpython-313.pyc new file mode 100644 index 0000000000000000000000000000000000000000..8ee7f90000976866f35a899bf11cd2d32d41d45e GIT binary patch literal 2616 zcmZ`)%TF6e7+>3qF%JW_G1xr9!y!Nu;wGe0B2|&1JlYbKR&owKpp1syv9rl~cQZ2! zxQAXiRJl~4oCZ@!0pks(BrKZ#p&y}47P3$CTa#<-Ut4b|7r_@q=$(mXldZ5x&BfUBN zLAq@wMe32&5+g5K4$+?&8rPy|;g=d6EBw4*auu)ip83RbHaz#Sg}9{wvho1g+yL2pD3k0KLNo$sF-F%0cr1mo z%wCWC@&KEa$fl2Hbko&PBlA^4B=cP#5MeF0yAj*1$7mx)o3Y&&F}fL|QHXpimTiS- zP@ivy8p)%2rOlUdoI4@vyBGM~m9pA49c$d%{7Q^IY7mRpIOgPo+yybhiG?kW3|(Zf z)JZhT2xEqANj#<5)&Zdmb18U3T4LXIsDr5DV{{ z1pRN3XT&5L2kz1XY1lMH&LNg=SdBhW9&6k2+-%EXLclH~i;At{%MB3!3# z&}O%+l)QBfO7zdf8iDY-$cHQ(+cdORL|o*X1~duiIGExl;m{+fx$6*mU@)5^$HbP% z_X&Cz9*;zvW=YAXQG**|1!Lw-7TL&2|#i{NB2RLG8rwzG-W3WY9huQJD&TqK0ee*wV-)x|nm)bhw!7GYnI}G(rx{pw?xW zC>Sl&XVSanN~DUXg&}N$o8Cg$aZCeP+n}X(kbZ#xrgj7O`wlrx>RKq}Z}-m{^!0 z22xdr|1O%6JF1$n147-0NfasA9#KT$7#SLZB2i->)(Twc12DdTk0Oq$O^a7`%yAXh zA0WA~)$XF!<*djvvNfan!nI(6wtghEZo@1>3#w0#pdfMqzv-gMH#wU-T2h%05;AvjzWY7DJfROkMwbza``)h(G%^=h4p_tWXbd12jG z*Snm;Op}H7<998YJy&e&-gYPD-9NF;b8Ei3CWC3GzWyG_-h13Bc;BA< zBCRg#X6AZ9eD!)znwO;Jmwa_8dSAAdr_&L6jbhoWc+A^4fooJ`%om+XhjlhiU!Iq4 z`Rc8pTY%}XQkMyIt5=xy)!AS%stFW+cFtGlg7Si|E<`+*D>C*{rSs&haHgG=-tV3- zZTsqWuzu55Zw^X&Eeuy#KTDm}&NA;G{;A%fPka4-wwVw^90u6j-Bd-Iw;Y(PaDJ&A zh3;U;3GKQ(10*tEcX#9={SJ;WD+-%|*T+;Mk@#C#`8RzhakpLWtX(JoLcjk23|kBP literal 0 HcmV?d00001 diff --git a/Tuning-Performance/External_Guardrails_Judges/agent_template_backend/app/agents/__pycache__/billing_agent.cpython-313.pyc b/Tuning-Performance/External_Guardrails_Judges/agent_template_backend/app/agents/__pycache__/billing_agent.cpython-313.pyc new file mode 100644 index 0000000000000000000000000000000000000000..7214e11ade669cc5f0b625b72b36e2373d64ab19 GIT binary patch literal 6312 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 literal 0 HcmV?d00001 diff --git a/Tuning-Performance/External_Guardrails_Judges/agent_template_backend/app/agents/__pycache__/orders_agent.cpython-313.pyc b/Tuning-Performance/External_Guardrails_Judges/agent_template_backend/app/agents/__pycache__/orders_agent.cpython-313.pyc new file mode 100644 index 0000000000000000000000000000000000000000..f1bf0dfee7e890c6cc76a5360015b0b743ef44fc GIT binary patch literal 5965 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 A6951J literal 0 HcmV?d00001 diff --git a/Tuning-Performance/External_Guardrails_Judges/agent_template_backend/app/agents/__pycache__/product_agent.cpython-313.pyc b/Tuning-Performance/External_Guardrails_Judges/agent_template_backend/app/agents/__pycache__/product_agent.cpython-313.pyc new file mode 100644 index 0000000000000000000000000000000000000000..af63de6a9cb96673857b1899a594473f4aefa907 GIT binary patch literal 6309 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 literal 0 HcmV?d00001 diff --git a/Tuning-Performance/External_Guardrails_Judges/agent_template_backend/app/agents/__pycache__/runtime.cpython-313.pyc b/Tuning-Performance/External_Guardrails_Judges/agent_template_backend/app/agents/__pycache__/runtime.cpython-313.pyc new file mode 100644 index 0000000000000000000000000000000000000000..52afdf364c9acbefe98f63065b199bf9f25b5ab3 GIT binary patch literal 504 zcmZ8ev1%JZ5S`UYK1D{hQ;Ad&?o?RY*oDCu9Fqi2IK+06DzL0|qhsy6-OKDAQA+Sct>qvVuXy+d z=Ws42kO&gPW^PSdNkmc7rgqYy&OH`Q){>awA$*LtVQ=L#1j*`CLEWr9>ilcak*L?T zwJzvjob{uqetMLl4QG`Nroa<3H@4n5LGN{jFDjF#NcF~wJ$5$WJg~=rFf%?Nso-3$ z2rcW7{F~8}x~J5v3KgMJ6!FP=z*aV>8R-H)JGvUv@))(5rB2h<8r_yI%W+BQS$!Xm z;s%bD(s{1b4_NRD^|dT)kf{z@>e;?(9Oa`6%1w=YS6O4TowrCcM}@XilrQHT+3H-q zt~8~jP3~1vr5XB_L%^cUbwG8Yr&s(a$&r?nm#fs{@=M)4C|p|Qcu1R^h<^|Kb8feh f5aI^5|93%r5I^Dl4eb7g!7q6Br+0iEQ=c_=)}WUJ literal 0 HcmV?d00001 diff --git a/Tuning-Performance/External_Guardrails_Judges/agent_template_backend/app/agents/__pycache__/support_agent.cpython-313.pyc b/Tuning-Performance/External_Guardrails_Judges/agent_template_backend/app/agents/__pycache__/support_agent.cpython-313.pyc new file mode 100644 index 0000000000000000000000000000000000000000..a44cfd9ce8d8537cecdc8c680db6a110663e343b GIT binary patch literal 6020 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 Z{Pxq>Jy?0Kr#~P)U0-`F(%1~F_$Q^vs?Y!c literal 0 HcmV?d00001 diff --git a/Tuning-Performance/External_Guardrails_Judges/agent_template_backend/app/examples/__pycache__/mcp_examples.cpython-313.pyc b/Tuning-Performance/External_Guardrails_Judges/agent_template_backend/app/examples/__pycache__/mcp_examples.cpython-313.pyc new file mode 100644 index 0000000000000000000000000000000000000000..37c8d76c02c51eecbb37cbe21c014d0118154050 GIT binary patch literal 1971 zcmb_dO>7%Q6rQzr*Y?_R6FUl77wD!5s0)paXe%0^NKw+Fgd`2w<^qvc)7?qBjlHv- zUAIY9qzEpYkT_J(Q&Vv%hf3**9*NRJkB)q>wc=2TQ*Vx<3L!4MalAC38VQM&=FR(= znfJ|`_ulUJ^e6~EulJj)e~1YE%7y65beR2VU~VG=F=Plv>=R)+#$p;W;!80@gdr`( zmtZ~}lVF`8FNsFtZ<-|7GDfO^u8K@rQS@~60W3VfMk-#J`kGC&*@=1WZEb3zs3;e; z@fG3*3spC8DrDAKb6oA}&OObezF&1T)1u`vu>!MVdBD2?Sqo0+C$$RpHR17h(BuurfF0PO;;o%OM z@c>01kM376_Rq!;8b%sKcrmshMCKQ>A)M)G&j}|wYP%1?jxOtC(Rx=}6c*wyPKr1q zz9@CsD@J>}*rmVhaYHV`OB>0t_!Q*E74UOixE-I9G8`FNIDFTRWT4ti-!lQy9XmZCjRpduG}Sdng1hppC_WXSd@((1D)x-l94S+U1KVbpd^~x zf-w(6c`v>!=tt(lUMK^|KOYAUb9x6U$E*Bj8W)7+f%FDcT@#2g*F+MYMeiBlY zxY!NA940ZZHsExT@r-0WoMbuS5N~G48iq0@eh~@|3Ls_Cibq}86DB(47xrGR`i=`O zqk`094Du6&y_7jCj*H8Y;bs=l97YnOtGe_u$1D#A=wcXOA>fHr9KdLWqJ_)lFabIo z1WZpbXjzEyOk*-995PFC!tcV%&aajOpR2WlFZ{Yxaf6bL16;z(W9ALYR!avlSY}YO zTsEoYlrB|W$6XnnCv2Ir3U)10I==?(f#2riDrPprPT4o7tM&@D0=H*o*Z;Qv(uD#OJfCq$~&@u5^DY#+Ca^|f$!9B)!Na~dS9{8 zH?{S~Px?ds(MOa=V5AWuOo5{Xr@<_9A?5=)C-<+x! zijBhQt>X=KY*!tty+2b|XB(jn&oBhI(o%*Gi%OkrtBr;b18%Z(L|)Q92*t z8~k^CzvR^K-`pIzFV=ITdubW4W;xb;8>_;xDjX{(gD8{RnB6-Exc3IY(Owp`zx!t) zYF~~IO%{ahVPUdg+#YEQJCZOtAnwTH39vlw5he%4$JsVNAaKnfr*pa-CQQ?&mT87^ zu zLBcC7c}U3JKh;7oJsNILKif}E)#i;SXSdz9T*LOkO#NDLqqcsl7TnsUU$k{CgeGDa MV$b<@ror)l0wwX#4*&oF literal 0 HcmV?d00001 diff --git a/Tuning-Performance/External_Guardrails_Judges/agent_template_backend/app/examples/__pycache__/noc_examples.cpython-313.pyc b/Tuning-Performance/External_Guardrails_Judges/agent_template_backend/app/examples/__pycache__/noc_examples.cpython-313.pyc new file mode 100644 index 0000000000000000000000000000000000000000..3e4fe4b8d2178a59e1dced303fb857cb737d3f76 GIT binary patch literal 1918 zcmdUvO>7%Q6o6;F>$SbMLug8P=t%J4HA;YGToiHo7lU~ z%x)S>fDl|baqA(clp8r9(VKgsQ7>GOf^w*t6B4K1T!jk3i8pI6MHLksxG>Vbd2iTO1nf+qXK+rnlU#$G7A@s8}l2#Zg`&U7^jx5BGrC6!Al#3~r!pKq^DNAdp4Xu$n zlS+e+m2PO3-bh;+__9{+Ou;hBXhmcC-}vUiH}Ny9LhP4m=FDRBJ%n1=pzTg8;Mk?O ze(6HRFhF8PJB)JbhXjYTMcXuF9>GC}GU9lFPg)gx3117?>T)Z%hTQ$=dCJhm5o_U56zh7vg&HG9Jfk5yb@awTQU5 z6S&ln!950RfEhbG?9SJr=LEcB+>?bg6`|JruE+*gIA!aUi8K!(HIX45&yHA2P z+ktq(kZJo)*KTv6Ga5$BuRF5HNt5UH8GQQ!#5BTiLQ7~-Nv0q6ma?QQst@f%vr=;- z?^l(X(V+Vzf=G|?R}=ro%xnKJpZ;?`wWKZqDHYwySlM~?O9z+fIqBJYgFqgxaK` znPzZZ5R)gubSW}YWI=E_hGi3!jtmgq0!Fyi9oE#0>Kg~{8dE!6!ik+E$Tn6`x;b~|ucn0(QM1}}0bRCuO^>iJ;|be#D%+J|{G++y~X zcHl-W`Wky4#^j^NKLjyQ6-Bw9N-NrfF{C^_&7%Q6rR~#uh*MY)Csgo9HgzFg+=Xd3E`)rAjQTC4yhe^8&rX%)pU2_Ze#B* zGwV?IfGRkH#G&HMjh<*vph@4fln z*aydsnFu63{>}AwRD>SN%~7V^}V;%P0lrL~j=B?mEH z&eIokFF%W}Yb@8+ZKFrP-K4zNO{|pt@_iNsi4`VR<0_|YlQJtvSeh`BMVpCZnroa| zlxNf;?6V%Y;23~G(jgXr(3nLlj7CD}g zj0&C6tjFSdpvbV1^7G!y*F2GvbwTe5|aY zCUAOGJoU<{r&iL&NH6Co9`JZUtpV%TAjc-Yt=4msvMOpys*i|g{Lh?{k0at0{xhfP zO*rbaI&C8Z)jxqX53BIDx{mG1x;P#rF$|u=$dlOLpnYL-%DLP`;mxU9#i?GYURqsg z`1R^iqf%=KgS2U!!KtmV0`$n_i@jN-H%K?_Q0|Q94G*9I?z42a}n~? z7gt2SQTD3MkE=qjta+Ckmu&T)jH19u)bWEPq_!s1HqAtyb|WYp2;#vBydK;)Luy zVm{pjS`rRO4nIQ9UVwHbo%}aYkI*eND4zIk=G&PErE|MQXRlbhd-^B)p1rlQJ72rC z{JS}|XU^`JvjbypaPriT{X6}w*1zFd5+Jdd}FxO`UIp0cI= zE-pLT_Qlu0zJCUn&ujNz(WUKRsn1Jo>mu*_VG{Vh(6fFD6Jm0(LJOlH6DrTxA#-=o z0eBI6UY;2jyGhvV(D&IKY~|kte;w3N#Tf4^D%KvG2%jA4(^&uEjUj^1-E6D!^Yqq- R_r5sX{`&G`>18EA{RNplS@Zw^ literal 0 HcmV?d00001 diff --git a/Tuning-Performance/External_Guardrails_Judges/agent_template_backend/app/extensions/__pycache__/__init__.cpython-313.pyc b/Tuning-Performance/External_Guardrails_Judges/agent_template_backend/app/extensions/__pycache__/__init__.cpython-313.pyc new file mode 100644 index 0000000000000000000000000000000000000000..a1382b068c2c4776052a62e70e2ae80f0fed90bb GIT binary patch literal 231 zcmXwzF=_)r3`KY11cJffYoth22SPeyaA8uo7xIpF8GA>wXl6-r0hjK4h+N67Phj=} zo&o0<()$Q~{y3XWt1O)#cV%D7_?NlE_?Y2TwbhGR|5f^s-B?cN19(YbDG^Zfj^9D| zKrKtcM#*#W7-|QbL7cR&U#v|~Pf{~1eiExths%M~D!DG=YOpQGdqQI0ca#{nRPR|V pP~QXRFNrQl1Vkq;A-?s$=jRU}?9lP2KIK}ab}Vq67-Mvj=>|GuLzDmj literal 0 HcmV?d00001 diff --git a/Tuning-Performance/External_Guardrails_Judges/agent_template_backend/app/extensions/__pycache__/example_guardrails.cpython-313.pyc b/Tuning-Performance/External_Guardrails_Judges/agent_template_backend/app/extensions/__pycache__/example_guardrails.cpython-313.pyc new file mode 100644 index 0000000000000000000000000000000000000000..4a27a18a126b91f62c0a44fa55045bf699d5161b GIT binary patch literal 1189 zcmZWo&2JM&6o0e3_8Lf(C;~##BCJ5GnyN9XL?y)cht-mRNj-_w3Z&6^cWiC5o^@wt z`8wrPajJSKQg2O9g?kVD86cz$NORqB}0b%K(Ge1FbLCTb=g#E9}As zz1(h5%GR!3xqR_UTg`Ga%uQ5QU!)F^qE1HN7X@4|3j)~iPLmG`6Mz_TtHUwq?DQ<( zC^=sGOt|!~m$+gS=u}I?9c;s&ME(%|kvV3e-Zesf8qmryLaQf&BhU!jc3Rx#gJCLI zH_f8WyYr=5@0JkMhXn=}Y)zEttTzH1L|H6s$kQ~tC1P7ug6mA$+CUf{bHklUH_KA% z_k~feW;KJvU2Bo{Y+x{&4Wmqsg(AC%wS&2i$9~rwNYiwon!I;{-OAKvllO%*tf%-u zIGtrt(p=AFBKse$3DwKgfXhfUCsSl^w?wm*Jnjo!Mlb?9<_3G_(Wa1blMjbY*PV1r zq){A0(w}UZULM}T{%`U$M>l(TlHvb*vOF=WVI#VOWD8!*?f)VCaeDjX-{y}#nLqmA z?9=&^Pv=hE3xA(^XM69@3qLJ93V&JsRisZoB8I^Ju5S?ZKs z)Ei+`cnIxA&DI!`hz4VJH)De=&T){;PBHd%&eQT`hOu6vv`KNLWyV-B2wTwx;Z%zl z%I;$fHIqb)8>5nLZiGg=gZQT2b!5R2x6TD|GtzTNzJX_Z-rKtLY-;aT>rLQS@LLt; z&a&O8x|({q$raY5+V33xUqidfUipNO W=dkn#T>L8t3H7!Y-hkspHGcz$!a899 literal 0 HcmV?d00001 diff --git a/Tuning-Performance/External_Guardrails_Judges/agent_template_backend/app/extensions/__pycache__/example_judges.cpython-313.pyc b/Tuning-Performance/External_Guardrails_Judges/agent_template_backend/app/extensions/__pycache__/example_judges.cpython-313.pyc new file mode 100644 index 0000000000000000000000000000000000000000..d82ff088b18b3170d142f9847c57867ac4e57c79 GIT binary patch literal 1408 zcmZ`(O^6&-5U$rhGqc%jc1hes7mdv-Y76e<;0lR9E4nIdU<}(k6CuLm?aZ4=@AkZ& zyw~j-PkRy%B6!%FhXjQnc*sTY;2{SOdNQ&H<&lWsLH4#fh*zt6xu<(b;&)+LjQ%FAs06rSwC+n`wl+KHHUBS(8t zot$hj?ML1M=vw6K`k)pz?EGu*W>PDWypo$(Nn;8J2Nb=1NR~RjSt|LpTqJRJy<55~ zyp!!T02@D7xW2-QQ(W5YMMmKe_3#E}&X!AU8mx0_-hRmS^T3?<1t z?Z(ZGT*Yee%q6M&sU8Z|mCY)9{zfizPm4G)ygFDR2Q=}x^5es$12V^w`Z%@|AXyPrLST5<`gcw@Qr^b{_*wB-Keww^5xqP ze0g?^$IvZ%hL4*=)xEHh8Ou!?Hr5h=l#baY_tw&ECv(H!BwB>zi(>rLB#GF|ucCS_+dY+Zf7BP^Hn(O{7A*OvfWlNa@qGP=|!R zp25vFuI19u=-8T2W=CpU@1`n4Z~6@C4dsjt6a;##`!Sq<=A!H9_PhO zmYP}4`>{4zf}^Zb&L@z};R8Cr#m;kX=x5U9B17CZ^Gq7fKZn9)0fMI57YjjZ=<56M z)ASR&tM|Oie>#p|##flMunHJVKhJWF!D#9{`|y#`TPjDR*d~Q4d^|~xDAf}D7bZEq gq@Tt!`ZpM=(V@#2yAO-^;n}}DpLLu+fY##T-}!c5WdHyG literal 0 HcmV?d00001 diff --git a/Tuning-Performance/External_Guardrails_Judges/agent_template_backend/app/observability/__pycache__/__init__.cpython-313.pyc b/Tuning-Performance/External_Guardrails_Judges/agent_template_backend/app/observability/__pycache__/__init__.cpython-313.pyc new file mode 100644 index 0000000000000000000000000000000000000000..14323bf2354a451f127435a5d5ff1e819660155b GIT binary patch literal 234 zcmXwzO=;(79k7wMa^{0(Aqy^O;4gnaN{nA@Jenyfy@Q$ z2J;s6zDL314YS#_NZP%eHrcQF{7XGx7$^8EnqscL&V@XsH00Oi2+l{)6bYz)!`~oV zpoV?KTF7zE7%Btn-W%V%ezVj;9Qlf2xsNQKEUtPIEo5wmpS^Cldo)CLt)<9VQnh8T sf!Y>A*|GdkX{?C{Ks4S^3!Jioi3d&?g(Nz3x`F2il4l#)@RJ03Db#Q*>R literal 0 HcmV?d00001 diff --git a/Tuning-Performance/External_Guardrails_Judges/agent_template_backend/app/observability/__pycache__/telemetry_observer.cpython-313.pyc b/Tuning-Performance/External_Guardrails_Judges/agent_template_backend/app/observability/__pycache__/telemetry_observer.cpython-313.pyc new file mode 100644 index 0000000000000000000000000000000000000000..15b7866707cd8bc567791fc6e5c5ee0c1b515035 GIT binary patch literal 4845 zcmdTIOKcR$wW_=4KlT`ZuuZ(UjUB@nJmc_NjFx4MvAozYAdiQDyrI*c=^3{fcbn=S zU`P&VBSnsqY(NnL^G%`8bYO8mq-dNI7vcF@h}0A@5bs7;GHa+a_i8 zn^&*itIwDsU|x>-li{R~V}Ta3izNL!NHTCpaMxnNTrgVm z6gyGsgjB;YZPnII!-@)yKcm{3tFTU1%$g!ypo$c!B?p8q5|t8; zFO?Wgoc(bkD!md<4aQzc1H%IV6K4@09y=Xl0hoMVbVSQ$jt77~>jW)ZWwv!qx2NW* zBc;uZX5n6C=lAg$!;XV4)VP}MSFV}ta$L=6hOK0oI-_A5R zjkFdYx^8RCQ1i-gL1h`H>Um2UDP(e*RhhxoW@huCWo1%LU)GFFT%Dbbo0FEtuBwxI zUbl;JTgz)Rn$3!eOV?Ozw&>I=1}>7 zsG}U(y%gHL9E#pNxzf;l_xSDOrOp%OhQXzV!MTGaDYbZD(O%3hwgI{Z(&T^chK2PT z78A@5J7ggQcwV**fO}c20Z^ym4dobSMLW$fQV-u+KY;gY=lXD|hiP0J($ix$fjZsI=G4z3!gC zm4l1hl3RSsnUP!iFWjCjxxG1G)Srk7+@TppR!7j&+%g;yZl0kU91)J`c(kkFvQf(F zfCOPI$oq<2oUQn|YdQhtvTkG)@L<*fjBW5)0|0K472me9uWiZKc26n$dY62?E0KoR zwDV-;U zwMj4h`C`IONC_MNk`WB;)6%psO(7A~ChL*`-lxpRd%;T2&wHUtFOUpF67WX1Ic?+B zNOJ;%QDy*R+*uxrH1@O`wyORNuIMB)XM1%+whAz0%Vt*Iz$o)bmXRlm^7?!+uIpGZ zc+!+1!N{|P$-Hh&$@Ua83%MzI077KZ*3;HGcR*wEl*Y8!>w&5W1Xy`SEy|NxFl`!H zJy&2_M#i8mtMX~p$Yl$bCeJeSsty5hpR5`gSVe^;RbWXo4PvbYR9U-jGgW4$X$JvG zYckxpJXx@GL$fTI@7IDOreR)7h9ojDJd_w$2G5>3cY0`i=wuv|NnhXL*yck9VSNjh z)MPbn>sK||npKUsy9DgmhIRMJmWdp&(aJgy^fi^qx?#btxiIV_m)C+!yHe0BTjuhy zpcC1YcfgLlmRVqFEnP|I1a62R&fOKw_YS#Gmxo`sU6Aw0!CQ{ZQ*a(9u%2QV-f~oQ zBumR@Srj^)Vxj-bvh2EuUr}^Jw-v?t;rb14VKK2PTOSBp=!oD$t-F3xyRyCQw;}Eh zxVRs3n~KSmuaw4>u;CGW@cjZEYSrD3MK%pUw^|yd zJSlHdh&U0C%~Oz z9O5#!h)Vw?IIbg2nwcW&g>8Z1OBkr5VMog7X&cHn&CY09wUD>D7{lwq9B_?cCFzI- zJM9E?%jC70?b>!bjPNk;1aQ3}#!MFVvmPYNDCL_~i+NMc@HO3e_aj|Gqh%;=;YEXM z@aFo5q|NBI)A3Hv#6ChiN%kr*(%=O?^_ zz4T$A`@|9QFiuY#mLB#=h#wS?ewZSDWY1ua_(-OMo!&lvv7=09_i1#4A9tL1e z9tM7mVc-&U+%T|pkuXsW9^kT7BTor^Bqa{fBuxr^6n?ibdT#Ji#S9t7%<*~Znwh{p zf-bMD=Ox!Lu!dw^i4qv^#d0Hq6`l`c&#jizs1EH!1ykxa>-S&C%7UBejic~>v}Gub?_&MZ3*^_gM9uuoAk@Um0bUYv;=+yG)j2u=ZTniK_| z^iWkQstqsv$pTb((vY3b*7>V3u=Y>}d6p)Oo z8viT6xHEFY>%cBQcnUGB3*6A<|H#$-$Ls>oD16po0IMRU^c%8kRg$RmGEC^6Z^-uN cUV)yc&w~Q}xB`5%;bmit=IB2OLO$<*04}x%Q2+n{ literal 0 HcmV?d00001 diff --git a/Tuning-Performance/External_Guardrails_Judges/agent_template_backend/app/presentation/__pycache__/__init__.cpython-313.pyc b/Tuning-Performance/External_Guardrails_Judges/agent_template_backend/app/presentation/__pycache__/__init__.cpython-313.pyc new file mode 100644 index 0000000000000000000000000000000000000000..e34e5416e8f8230d231ea85070e5ab9f0b37a6e7 GIT binary patch literal 326 zcmZusu}Z{15Zz6L=*h`d+FEFlLbtFI#7=}0lsKi~$=&M9Wzn;G7`8K%>T2yr)ixxEhcYb1XWt-!Dyz^lkaCNIQXvfLF}q$EdG zoUVP#Fid5?!&K?k6N7io0Fy0@eL0men(dMMi9>Q^p2F^R=f>E0m=3P-yyHfB}HwHby z4d%;WPhr!jhN%tm=(V#7KwIqr4x7h*{iJq9XXunSg0b<*b{5i4ET#MqN1vN}@00zf Igp<(x1w(&g4FCWD literal 0 HcmV?d00001 diff --git a/Tuning-Performance/External_Guardrails_Judges/agent_template_backend/app/presentation/__pycache__/tool_renderers.cpython-313.pyc b/Tuning-Performance/External_Guardrails_Judges/agent_template_backend/app/presentation/__pycache__/tool_renderers.cpython-313.pyc new file mode 100644 index 0000000000000000000000000000000000000000..28859532d9c37ff7fad2edfb91fb6be4ae7ca3f6 GIT binary patch literal 6025 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 literal 0 HcmV?d00001 diff --git a/Tuning-Performance/External_Guardrails_Judges/agent_template_backend/app/presentation/tool_renderers.py b/Tuning-Performance/External_Guardrails_Judges/agent_template_backend/app/presentation/tool_renderers.py index f77c47a..cb44202 100644 --- a/Tuning-Performance/External_Guardrails_Judges/agent_template_backend/app/presentation/tool_renderers.py +++ b/Tuning-Performance/External_Guardrails_Judges/agent_template_backend/app/presentation/tool_renderers.py @@ -13,7 +13,42 @@ def _money_brl(value: Any) -> str: def render_telecom_invoice(*, tool_name: str, result: dict[str, Any], state: dict[str, Any], agent_label: str) -> str | None: - return f"[{agent_label}] Fatura consultada: {result}." + """Renderiza somente campos de negócio seguros da fatura. + + Identificadores técnicos/PII presentes no payload MCP (por exemplo msisdn, + customer_id, document e business keys) não devem ser propagados ao usuário. + """ + lines = [f"[{agent_label}] Dados da sua fatura:"] + total = result.get("valor_total") + vencimento = result.get("vencimento") + status = result.get("status") + if total is not None: + lines.append(f"Valor total: R$ {_money_brl(total)}.") + if vencimento not in (None, ""): + lines.append(f"Vencimento: {vencimento}.") + if status not in (None, ""): + lines.append(f"Situação: {status}.") + + items = result.get("itens") or [] + rendered_items: list[str] = [] + if isinstance(items, list): + for item in items: + if not isinstance(item, dict): + continue + description = item.get("descricao") or item.get("nome") + value = item.get("valor") + if description in (None, ""): + continue + if value is None: + rendered_items.append(str(description)) + else: + rendered_items.append(f"{description}: R$ {_money_brl(value)}") + if rendered_items: + lines.append("Itens: " + "; ".join(rendered_items) + ".") + + # Se não houver nenhum campo de negócio seguro além do cabeçalho, deixe a + # composição pela LLM/guardrails em vez de despejar o payload bruto. + return " ".join(lines) if len(lines) > 1 else None def render_telecom_plan(*, tool_name: str, result: dict[str, Any], state: dict[str, Any], agent_label: str) -> str | None: diff --git a/Tuning-Performance/External_Guardrails_Judges/agent_template_backend/app/workflows/__pycache__/agent_graph.cpython-313.pyc b/Tuning-Performance/External_Guardrails_Judges/agent_template_backend/app/workflows/__pycache__/agent_graph.cpython-313.pyc new file mode 100644 index 0000000000000000000000000000000000000000..7e370465aefd0ee85dd21f4b866a0082c54b18fd GIT binary patch literal 56846 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
P7#5-|3R1D>A9PI#}60WBr6wFH>xvHH<=J+a*A zTHXmgO^!bbJ-A)%J8PyU%>Hq+d&nHmJiPP%o$71X>*Kj+(Uy1w6pegL)M68lrs}cR z_S#`^C$txbVaJD00Wbf_jXaotc>VqBk8amTFE&Ome|V+Nz46J&IJnHn)F(qD4;CAv z=WC=nsVfy`aH8WQqo`2Sg?%Bp9&hB;F2Oxq6Ac6+~K_AoEx6}Uo zTRu1q&tpvTjpqSa|NJ`3oLpp|1wdKPQcUY>0OBj`vmV&;d;PEBxP3dB%dmgX=8}OQ zVCxB+>ks_PX=wd?h|LWKe$LGfL+2MhHg_WM3;zsuK0e9jMgt#@;rfp+v$?Ur$8StS z`~@-^Q$g4Hxc+%yan6+EW$w>p0MGl4aaPF%7zmN54?+EK>H5-Uc3q5 z|9TgD^$P;lXZZluUKHPtpcv_CW(2G|+!&ko*};*{!y4TOzztLMBDAgH17WJUe}4qM zhZ_d~*nz9}Sfe*v>&3&~JJslzs)na(9aF#8@ip|@y@Txc*nz-%!9h0N>b!_zgmfN5 zyRclN&xPL>4GfXuT255SP?K454Pmtdf_Yd9O=>z|IV_J7Hk(PQ^! z?Wkb(B=LVNZgxRt}-(9CTO>=F>r|2cBNDcJkJ< z&VxO?;kwyt-xQ<+e7vVnXt`W`6L~zwewJl_&HT}?nX|tQ S{W;5CsCJM3j=_e#_kRJVxp%Pu literal 0 HcmV?d00001 diff --git a/Tuning-Performance/Normal/templates/agent_template_backend/app/agents/__pycache__/orders_agent.cpython-313.pyc b/Tuning-Performance/Normal/templates/agent_template_backend/app/agents/__pycache__/orders_agent.cpython-313.pyc new file mode 100644 index 0000000000000000000000000000000000000000..d93873a6c1f5ceba998c54a3ea68b6ef44385dcb GIT binary patch literal 5955 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 WC+7U0L;u3Em#W>Pe_^m;@BLrqaCN%? literal 0 HcmV?d00001 diff --git a/Tuning-Performance/Normal/templates/agent_template_backend/app/agents/__pycache__/prompting.cpython-313.pyc b/Tuning-Performance/Normal/templates/agent_template_backend/app/agents/__pycache__/prompting.cpython-313.pyc new file mode 100644 index 0000000000000000000000000000000000000000..da03ff12c18a7814a8459e0680febaf926d9a77d GIT binary patch literal 1207 zcma)6OG_J36uy(0B$Akk7LisE29aWF%=Cd^r4OV~`w%I{KwXsKcIGCG&Wn5RP@|hH z>!x-*=dqZZ4NWV0`4= z=7$7AKSeMwh=obr3AlemWmJ})qh}J8G*ni~i3zl+&_qoxB!7#tf)r)3=lL9S+xM6m zcZ(E~`Z>!#5tRfV^66l|8xVdiZqQXii*mqilm}D@-!->!(ULmWZ5RH7;C;3 zP*SzGea#}^`fk8A)Ay=&Eu`3jET*Ce*NDdrPTau3oM?Q*1;7hC_KxT%Wujc4I0&oS4vEqrjgxI24GoAzxiicn zw3EnW3W-Rr5gsKOr*=?C3I}9ID#*g2!$F2vRFsZ!X&P1q5Vd zt9OkzKHcgIHmVf6M8t+~+WLCv*g!NytKH;9eb*xVwXrQ;xo zcc}MC0Z=KZM-z~6>c$!QF>N{u1Qobg18xm;I*jsT`}UrFkZ-9oZPh%ieA+nL_*`$z zEw$&Czpk~5D<{R3Z$_*53bIXXHkLd2@%`Ps-Gjwe{(3uKJe+Dg>8RuT&YpAdu%*tn z)mw+Oom)7`EwplrjmJN-qn-R@b7-=oj=g>Pe*K`-yjEytZ#0z~UEqLL3n@Ab&q#sy zlGB`UWmtZcqJ)RkqhoMVkfV%YR6{r*hC#(=(35h6=oR6Qh_0b~u5X17c|fm1D1HV^ TpqY5S`5>UW_Da6|4+)Da~UpPT`dGAYjB= z1upeUfk$3YrgBiB%5Tr>%>_RBEx7d8U~{I^0`AzyjH+R|UHL4!ZI&-crL>hc(#o{G ze0euSWlu6?qXZA4aisFb0U9Gi+{>bPfRs08)2>z)$JS{y3B$-(Bw@9V1)*|0By-rF z&uc;qGn)|#L7qFAH=UHSVn{N<8%?7QO^;F8O{r3(xq`PO)3lQk8pr;%M}E=vg^+P9 z#1l+h3Hc3Al;s0yC6~i3Q7H0%7liId{47(E3fGU2hME$o`p6Fp5Oa%38cU02w)a2pr*LOvIx>9bwUgfF)$K$NvKV)0(fM$H24>ZzFOMEEe&R=2U4Vo{o M@?PuS`BZnDADJGK^8f$< literal 0 HcmV?d00001 diff --git a/Tuning-Performance/Normal/templates/agent_template_backend/app/agents/__pycache__/support_agent.cpython-313.pyc b/Tuning-Performance/Normal/templates/agent_template_backend/app/agents/__pycache__/support_agent.cpython-313.pyc new file mode 100644 index 0000000000000000000000000000000000000000..e38f7072ac62533a7fdf5495090e20f4e3860667 GIT binary patch literal 6010 zcmbUlTTC3+b!K1e1C}?tUNDRSgBPzC>=Z)k9<{$EX9%1k6mr69gQ5zQY%&Y1CyxAPt|i~X4gP) zop$U!+}C-Zd+t4Vr>4eFz-RpBo!8!MCWyadr~J9?#?C2d+#+a#CKJRJQXwg9I}(m7 zPQ^(PVWN|uoe_d|z2Y2nS~!Yp$sP54g`FsAMA&RrTw~ZJUecJXA}X+nmd5>^F?vxr#GVRv@UL*o|l3ZalRp*Uz#ancUO)lTgFM|){kgm{fq+_XDF zC?47au!^oyyi3lg�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 NzjG<&D0cCph<}HkRwn=e literal 0 HcmV?d00001 diff --git a/Tuning-Performance/Normal/templates/agent_template_backend/app/examples/__pycache__/grl_examples.cpython-313.pyc b/Tuning-Performance/Normal/templates/agent_template_backend/app/examples/__pycache__/grl_examples.cpython-313.pyc new file mode 100644 index 0000000000000000000000000000000000000000..e21d30a50da8eff1d07d90e4987a312bd4fd5798 GIT binary patch literal 1863 zcmdUvO>7%Q6o6;FKepFNNEqgeq#$Hzne0xSZPvT1 zncdKEKnU*KddMl2I6!V(kdhOLa^;XJhgx$&;zDnZOoiaYn|17npehnKM%wo?@6DUP zZ>KvvtRrY_^qYG>D+v86oPJ9q;B;LO50Hf@vLq|>p7d^pW(;J>jf|x<43`*h*WWMeI!J?(h!RGE z7#n0AR4?94Fm);Rd{#CVTaeVG_@#7IrSfvQEQVJq3kEy*HZ(}fi#<1FdPMxth&)hU zK*TJkRSaUJ(K|^TC9#!6gsyumq=p+BD-^fLXCYlH8%vCca!l0KTR2FtZ{Uaom>ChK z*jUHD=i-C!4t^xea1s`WE$?&eLKy1cCM=(n^(U}bRFb${4K{c#TxKvAp(T?crVhdUO_W15^_ILM zmGU*7z4L~(Siif-N1ZT$gJL-L!oXf58(e3EG2wVF&&O~LK`hK%deUH(R5}DZqr*as z2%!m)1@YGqxsL%i!pcqRZ%aJygsmtH;EJ|0JSUj3A;9G(iMJIhPM!+ZPb)CdXF%g$ zn5`f-T^wT*uPoRC6|=X50XlZ*c;<&m;04Va9}v0{QlQ5nW=$Br84L2^_Swm}zHcvM zXN?4|iKEEuFW7{2*?p%RZSZN*`*Z98&vuV0?1pp#R#||Lt%7)hzC>;P;$waKkv`qd zUHE0{g{{(N>G0|+M^m>RPt|vB{M7_V~8 zTcMlyOU1}bQWg*8}M4XB>(^b literal 0 HcmV?d00001 diff --git a/Tuning-Performance/Normal/templates/agent_template_backend/app/examples/__pycache__/ic_examples.cpython-313.pyc b/Tuning-Performance/Normal/templates/agent_template_backend/app/examples/__pycache__/ic_examples.cpython-313.pyc new file mode 100644 index 0000000000000000000000000000000000000000..04492435c95a29fd617fa825c33c69c7708a0941 GIT binary patch literal 1819 zcmdUv&u<$=6vt=1>$Sa3s{Eo&9MKGI1a+0z2U@DAfV8+p7%CUMF$l@9jMrmlll87U zvm0V05Q00m9&$>Ll|G(TFOL9DfAnE;0~9hGfLvlHQE57)FL%jTuT+t}4~ol~^1! zM!c#Rs*$*oG?E##uCVyuXi}ijs%oUujC7<+G!xme;CuLqn_INic07*j6c-D485e!p z5=p^xedakdr)k9k$Beca<<#{_3)4;TgBF)IAAD!oUJl=MD96OHTLVqeZFsCjpyU!~ z2^RuJ>K?Pnl15;nLtC)7CQTqJN_DWAH;^+lK@O}I;lvI-Muva~Q`!l+>WNYgC>>`hZF-iSUkzN_Z7#n}Swxj<(R@kZ<>Z0ZwgZ>Whkc{mtPyL2y7fG1xAUWo=55Oy z#kqDToTCH!%?1HThzTdd1IH(I!e(HH;-xtS^9X&8dfL=OE%T$6=_SwqoLSh(Zf6e` zUpmZOdzdMAul}%de`T+Fc)i@4JHIoxJ$LW=;at8q`|M6?J9Y2!;p}oRvv`z>r?mbU zn#TP}l%DUSR9gKFrQ+(bFu(IDSm_IWLC;G2&q?|V%Kilv;xJ9D=%!qtKa6=BmN?7N zNI?*h+=Jl%Msh_4mgE19&Gp?D4+z6RzL9P|GLj``<%Q!__t75F$K z_?V9P&;%cv-~-Hv53FC7_Af~KC1wAj3UM|WCQP&LS*97Pey0uJ2@{`JsMKxC4`uGN z27%Q6rT0|*j_tsVn-qC0^KwLb)m5lZAAkVDN0%?B}qfJxj>}VWOtHoV(+-K z>o%zhir|jKp@N>8ic2|E3MYCbN)J6c^1;@MLnThVIf^QTxbVjD(tv6tBu1Jy?{DUP z`)1zTgPtB0!SH*(Uj0Kt=vOX8Bi&&RE(3E1nTR1%Fk>GJmt!oZBU4rb<3uu60rlTY*&Ey0QGEVDd?CZo2h>qFys(XX# zW$FhE>r|~^hwXk(^$G^jzJ|-#;lAsY((Xgs4S>f~4=62Jj8+4}^y^jZIaK$EO?-d% zK67b7ea2H^2%$LcZG@>K-eH0+`GnmdER_8K2P90ktsX9uFkZnMC5oL;VI-(B&*lk= z2G8zSFb~eh5E@20WOyMqFGS`St0|o8XfFt-I%=m6!HzEevB=+(7le87#YquoiVJd= zy;8Kdi(UT9E}BXKZrV(YiBs@4u0fm|!X0r|PIF{v{^+-M0xyUQQkQd+(YZ&y5%Qv= zchF07qIUQH?-9(@nDozY@RTmOOaC9a`z#*a#e!n?nCM*Rmds2+?wV6&1SQbyHq1Gg z>U-j{U>utbd!Y>A{rNa>sb{T`jZpRB<#NGwZe^jWpuDWBSFTK36XVm<7boF~5)XR; zn8O6-)drj)G5#W14<{K;IK*3NvW}rliC=(%g91p}v|OPc>-2LUtU z3|baq{G~C46AqarIN{&I%g(Qs0-vk(!x4T_EPFxG!2vGfL+Wc+A6ny$Y)wR!oe znr*20JvHAf|IM&RcxM$oowx;U&LL+~6`(#5K+tbEs?@!mY znTBT8J~5+UV|8t`p`F>zwvwoSq=n>uI9Sdoo0nP{l*&c;2LB!3FInxoH@8L}NcHUK zeo6tX8ICpA#;S6xD#yynAWCO9XZ9}u?)?D>w4VX(@BVqn+Lz-)lX+ohSeWdWc1GI5 zt}ILrNW02-94wD}gvmkaai+}=2wXGB>8zoIam#Y3ZCRlbY*gUF885_8a$GwIMfiiX zujU7I09wQ}ZcBVvrcSj)K4L>4!hIqCQy?u-5QP1hBuLNGNO+~C3<=o>XIcoBN5k#q vXXnY8+MN01{EpX_YuGtlsb33j);4a}g4=ua^R}*q&_wJ~>^a}gbU6M`w3*BP literal 0 HcmV?d00001 diff --git a/Tuning-Performance/Normal/templates/agent_template_backend/app/examples/__pycache__/noc_examples.cpython-313.pyc b/Tuning-Performance/Normal/templates/agent_template_backend/app/examples/__pycache__/noc_examples.cpython-313.pyc new file mode 100644 index 0000000000000000000000000000000000000000..502913f3dd2429cac8f73af1d166877bf9520d68 GIT binary patch literal 1908 zcmdUvO>7%Q6o6;F>$SbMLug8=%m$g25-hSp88$=x1ppqcB$XuYhs`*@z)qu~Y9TZ>LxaBU^2xY^|X-v_|So zDh)Aqx}n*6BW-8k$=bOy1=}d2RgLL?6Pt(FB+jr4aa^XEGmG8tA=QOzwB2ci9D5Yk zFD_OM10-g&!ziagL~uk~v`r)C6C8FZBd#9?q*cWi@zs#6t+c|c*b5;FvXF@4)jMBe z+V(+{+2-b6d08d|WgaI>XRG)Ek0{49*}EO`h>I@kcIWHJcSBw^?#o7+ico7oPh`W(oU#qdM4CrXn#hoj?{ry9sgqG2glDHquwz8}&sgLYLvs3fq z=+~9m@uK%Mf=o|{SCjZB__crVr~mY)mepk-rK;N*JG-F11#De`3OAG+YCTgjXpiel#KLYG*f3q_%1df z#Zw@J4y|5>P8*|6FUm&e#*KcL|6ZWi2=GFAH3;2pMdaMD4W|j&wo@W2PuKy6P@6O| z(+qwW#N>%EU5bnpSrA;VVL8Ngs~tp^Mm~4_XsOP zeR)~v8i@PoQ#3FR+%sl=FlGkX;!ovcTjr*@d*bX~`P{woQh)xtg>M&bH}=ji4N6D1 zN}Hvd=l4q1;Lwq++-C0P$-P6T2Gd6d<>v>b%7bDiXACFN)bZgnD1Uf}@_GGNluzsX zQvAjbz(_xpn)Cr&|uIy_va-hVJ4?y|F8kFnx2WU+MGy?5z)D^R63DyC03`^=M@GKKVsP50B>I l&C@_RyczWuZ%_5#ymdV`ci;bDG&fgAbI2dcF!llz@CW1Z$Y%fm literal 0 HcmV?d00001 diff --git a/Tuning-Performance/Normal/templates/agent_template_backend/app/examples/__pycache__/observer_examples.cpython-313.pyc b/Tuning-Performance/Normal/templates/agent_template_backend/app/examples/__pycache__/observer_examples.cpython-313.pyc new file mode 100644 index 0000000000000000000000000000000000000000..84f7d61e5cc712534005d327383e94a5e995200f GIT binary patch literal 1417 zcmbtUO>7%Q6rR~#uh*MY)Csgo9HgzFltt}s3E`)rASK2sE~y=P8&rX%)pmE{Ze#B( zGwXnRKoz|sai}aSPfRb9L0kS{E^=lAg1K(B~g-MwewdAM|k!SqRm~tM6$SeJ4Ow*fi z)aO;&K?Z7k24@~l>0NaV+mj7(G^7bEp2Ny%;;)l|Fgf8|DsgmUs$O+!S8A75mYaT~ zcA;6VH-!;&NRq*=t*{c*$mEN?Q6^sny|hcXlkXcIKndPUN)vDw(|MTYO0BgBaT<%u zqS##WYOPOeLa(lRmz$St^`D5M#Dci%hcqI#Ce#keM3MAjNE`~|KuBmVbyydmnk+^x z;~)r^tF|ml+;V$K=0-slxWU>v|4Yi&-M?E{V?mEd-KSyfUhXGx(mAt2*cxTMAPI@v zkV4nZ2y_NdmydC|?q3bUb&^DGkfv_lznk~(=N2a&h-0$inE7M_hCw+XIsEiEdkKn^ zL*%~!dxUPHVfoniGvCcTten{?JGH+6OCQFUmXPe2+%`F8Pqn zfhzwb_?y5+D#mzEQL*;eMELkfpT_!+Z;cRq?q-|SU#2%dzW4Qk`ry^a(#k4;`U^3; BRpS5v literal 0 HcmV?d00001 diff --git a/Tuning-Performance/Normal/templates/agent_template_backend/app/observability/__pycache__/__init__.cpython-313.pyc b/Tuning-Performance/Normal/templates/agent_template_backend/app/observability/__pycache__/__init__.cpython-313.pyc new file mode 100644 index 0000000000000000000000000000000000000000..be993d0af33c172b2989ddce59726c87d40c6ecb GIT binary patch literal 224 zcmXwzJqp4=5Js~`L4<(Uu+XUm@d&}fewiebux5Y4W}~F?26i68E2Z@Wk_)&C$ydz0 z$1w1XNwSH2-1c<~`y0j_Ho>^`@Q$iz$I?$^7v9Ej8lIrEg904_mPh_Dwg#+7J6>8; z6r7t}z_rstSNjXu(pZH$CrATGaHJZEj@s#OcAjBglP&<8229qHy<;Y%a6ND?v~Zjs antoWHlqot%XS?!!Lf7j&6|U;;`5$|Xf3QsqZezzV2G2PBEk?_-##k&E2ITP&kT-PNGd<%r<8D*k z13M%Kw2>mOl5F6BK)HmKq9EUV+(S;FNIuTQD~;7+Bcz}`{> z`pv7V_v+`>dtbfsYF%BBK(QOXoE`}i@(--kisUkMbsCsEBuSEVl$@rF%47%Dgi+zN zz=YEx6J@N6qta;)^8g=8O54b^#Js?HIOhY-%Q=5Cob+)n&_;HWq<wuDFi47wc{cVEFhEVaHmVAvrbrK%B1P)SexZj% zrG(>4B}NnHewv6%uf$Wsu~*X2$swSLbI6|@I}>987<^uIM9XH52Z%oF1T9--wsl>% zr{<|6rOk|H;aX+qi};LT$H5kAT+I$D*G+aMuI4nuRl+KB9g@Q}ncgi)78P$U69}BS3DF$D#T;yAqLa6_-L?mC&woXxCCGdh^6` zQ|sMhw~v*&k5`(8%T2>`2TD?EasQ&dm|g4ub``YA|J=C>Yv(E^m>*WiLP&7GYzq+g zh*%S_PSYF4G0duUTA`;AzSTh>@3qeTLzSk!a#J4~=jcMug1wMkr~{U@fcF1^aR5=i zhjDT&@4C)55Jv;CHY9KD5kr&*_Lsoi!Ju3VZD^>L*CD+YlpvLZgWFVEd@F=eTKX^2 zo=v5_IbYPDhzdN68RDrU=xOd5jtD2u&jJ?J_^cryH_5VZOU2hw_I2D-D!%@*uYWnx^t$ar#n)5z^(;r4H*E_w zx<-YO)(WB}lp0!oN*GNNCL}2nlLC{HVp59HWStA+(*pAV^w%f7@aKyOJK!Q%|Cfv) zpifKF!ZZc=uTM541H4X|kJp0LnxEG~)mk7K2I%)jw>TZ+HKaL?V3Zj`WIM;PNMlcX zVX5jb;D}BzbGBbMWUByOwrpnQb%HWSvWz@gl-I_Kaa+fN!4swo*NQw_n9S?elx$Bi zvyhvThYU4ewDq)g-tEwsJf$%$_PV2{0$PBu zX&Bd%;p!MVIg%JxhR>Zne`aKSEf&VVEX!_) z_!UJrbX!rJAFrM8CLR;3i4B0Vg@Fh$)V}k#^~+m3ei!25fRp>-Zd36}uG zAAG;U0QoyCxtqxAQwm{YN-;oc7-4wcNIk@N$azzq&C-t~P0?CjB$E_PNpFk+JApPb zRt;ZVY^_XqYup&#P#ellGQl%GY#u{@V%df= zhBx4badt2KwvJ~Z@0Q@4 zXQf^W99eGMdN+1ER%z@lH}>AY@t5M_wxwg^rN-V;W2zEPmBOhNKWS*03qK2xx(oDQ zk0WiXL(eML(;EF|Pk&wGy_q|Sn_g`tfeu-wvq_tNc4-*o=;nU#<RU$Iw{T#o^YGWZN@uji&w!LJT`v7RQ$C}ik+PLYw&c&2 zBiZlRFsT2K?z98uUvC)9wb{o&HZ=_9s_(v6xnV#oiQ}9^f_ntBRq4ib$dNlx19wuw!y1IN6z9>{;2_Vss1NnpjuV=_7f{HR@W(s-a!-{gXpysPR z5k<-B%(C;4pBW}}`xGSuFFS?p!I8Mb4Iwvz? zhDR&wMqwmqIqNErUz2Bo&*NWdB!j2vOCor-uhf&i*ov>!)3OpId*aL6yPnlSHx zjT;Ef2dy&vxJUH5HH5~>7T`R=SWH9-L?ZXH^TMkJ5=h2PjsF#3JQ%s-bzzlnJcS(Q z1uk^?KXh&X5xWR&6h7+^kQI?q`YqYHB1u$w876f1w`A*cuRt%*=RtvfR3$#z^s+fd LbM&7CDIfPgQJ@1r literal 0 HcmV?d00001 diff --git a/Tuning-Performance/Normal/templates/agent_template_backend/app/presentation/__pycache__/__init__.cpython-313.pyc b/Tuning-Performance/Normal/templates/agent_template_backend/app/presentation/__pycache__/__init__.cpython-313.pyc new file mode 100644 index 0000000000000000000000000000000000000000..d5802e05208c4508f175da4093e9d2577181fa7c GIT binary patch literal 316 zcmZusy-LJD5Z+CM=*h`d+FEFlLZ`42#0O9~4q|69tjQ#-x7iJ|dx(wT3)uM(zKwO@ zK(MkC@&az)u5*f+?`LM18K%>Th~Z~%kN2^Dk7OIk1`LN0yo*8<@>bkPmdBz_MAq4o~Ql6KYE`bDq|2o#1Pv={{pQIP^q9m)tC6> zcnPW@8?a{8(#X-38tztB+vaRRTsv-+EeYl$Fc7Hij0)s8b6buNs$9mSKy@8-Og=7E vK|2eG+UkIK-aYrbSFNj7hOT)po-@AYXEFVzQp&Zs_}V}DoSeR9oJH{uBBx#Z literal 0 HcmV?d00001 diff --git a/Tuning-Performance/Normal/templates/agent_template_backend/app/presentation/__pycache__/tool_renderers.cpython-313.pyc b/Tuning-Performance/Normal/templates/agent_template_backend/app/presentation/__pycache__/tool_renderers.cpython-313.pyc index 23b52e138221f8fc623622c7fe8fe767b8579417..970b809f47ad8563dde405293a4ecf1333a80c4b 100644 GIT binary patch delta 1843 zcmZ`(U2GIp6rSnq?9Bem?w0MAvbFTG{jm$BYgzikmY`C8+S*p^W+7=IWY`^=DecU9 zXSSgQ(mwb=^`Wg-Lj{dB5?$WFn&^WMnwt2+!;(c<#~4Wzqb~-e@u3guxmyY(;5>YL z?z!K&-*?X3*=*?FCeH&&ax(B(*XKrl^Ih|N!g}6_jA>>hC7W_YKDmqh%-*XMfx$5h z`yd7QE)!=HoQH{*M7an{=3Se}b(fQT?y4Yv!mnVfb?_%PGfcuZz>#LVzeO10sRVrz zd<(l4LA@B|)>nv0*yD~4*pmZ~D{Gty`%^sOX`bLp2$Vt*e2#?0HsK7! z4rpp#^oLy_=zF3u_jItXLBfx5N4C6^I!sT^kB*eLWlZ z$KC-CuoEwXn!wbfomwVtuVuo4OdhHR6fLD-by7x#KBj1LyLq4vW z8F~3ra27)rubPTxSdNrpBr%Lew`>~pW%1*36P!887tdQ2x+yJ&R!ch2AM`?7EDAd; zZdfrbyPQtLJ0aK+k}TVZu4)!Hs%T+}lylElSo|m*h{YG(;WDVjaN`;Boudj_t~K4X zsp=Z`K-!Q1(E3C6a-qH*knz&3H$ixsx#wnlrE`^YQm!hRlXm9ZEz|o8?hUg&Gd*+X z^6olVm2SKcoDVMa=1arVJq5`>J2*4AAm*hl(+9|DXH85fT?podnt~|Jx@X*TXBT@G zcV}PE1)6V)I|_m{H<%ZyA8#I5Y|l350^4tjO?Sv8=hi8I)k5m>zT5ur4S)CtUqvCf z`NM|y8Wub9!N~1k=hdBGv|nrg@<2Y?dH$6`S;d8}`L2Z{`Leq6`wQOS!bslRK#RO( zGv^Av&9{AZH+*%Mli6+g`qo>%wma*oY-Luun)oXAwUY1X&Bgk1_5HVeuig(Z0WSD= zIYF*a^@_+;hZgHDjbxiIY3HM}?KACj``>yoXKTG$3$Qf99bx&kVgGKcZpT|-h&V){ z9w02@1{#McY^AV`LJNS!r)6v!xRoXXq?6yqw?o)U4E`b;UGms}DPaTTFR^9{`zfWI z!X^qq3Y7pBXPnC5jdWQ>0sbBti~vCPu@4{3)=;RWP)C7YfHi~eXBv#reR_j%BLl*i z{;}XD3K0q~0FYlD&HQc%_ALdSZ7f(GaB(afBZu8**em3FcP}fGkTg+GomiZ#P5jR= ziduWfH_}Ud4^WR1yXS3t6rvSmN$6J(U?%_TV@y;Ui)UI$680x1beAc=%XF>SZESGGQ_Hrk N^s~fQT4tkt{s-rv)u{jg delta 794 zcmZ`%&rcIU6yE9XwrfiZ+8@}K%D7ZbgIEmy2nC5meyA~+fan29Gif)Z*zVSuDUo8L z7Y%18Uc7NJ8V_Q)n0PSZFW_X%B%TZx4@yG4c+of2BW^NZzBliC?|XT(zt6m~Bm3cS zP=jx>_;h(F^e*xe^>5^BF3*<df;50M>x6Pfd(=fndcf3H!t&NVa zK9mtpI{Ox7XoXZgTI3!l)n?ai72tMIz_VE_%?fv1CJ&VzR)Q@NPa3XQbEMAhHFCZg zsWk)Fl%jx}z7Z@DhN+Gz*IoeeF<=i-3@q1i;H+7t%m7HUT5%mF&9=1|urlIO*IDx% zq>gW~u8Rn!esfqyC@bC`SuN}af?|5-`f=7Q*sT{g!-IxOzS zo}r}p5&M=>&p_2~sPdvJt(t2zDfZ*Gc?IZ{NF|0rek*~e+Y1k?yxRJ&NV!tt3yjm# zc-&oG{QC-%D&2mHwr~Q%W)L*^A)fJEC+DLR;zMHg{z2Bt@1MV7>Q9l@Xw54(s?Hd_ z4k3cW1_1V88|aH>?`nx%?P|+!pj0b@&`8S)A-mNRN9opJ5cz+m40IFGBvkwXUQNQ3 diff --git a/Tuning-Performance/Normal/templates/agent_template_backend/app/presentation/tool_renderers.py b/Tuning-Performance/Normal/templates/agent_template_backend/app/presentation/tool_renderers.py index f77c47a..cb44202 100644 --- a/Tuning-Performance/Normal/templates/agent_template_backend/app/presentation/tool_renderers.py +++ b/Tuning-Performance/Normal/templates/agent_template_backend/app/presentation/tool_renderers.py @@ -13,7 +13,42 @@ def _money_brl(value: Any) -> str: def render_telecom_invoice(*, tool_name: str, result: dict[str, Any], state: dict[str, Any], agent_label: str) -> str | None: - return f"[{agent_label}] Fatura consultada: {result}." + """Renderiza somente campos de negócio seguros da fatura. + + Identificadores técnicos/PII presentes no payload MCP (por exemplo msisdn, + customer_id, document e business keys) não devem ser propagados ao usuário. + """ + lines = [f"[{agent_label}] Dados da sua fatura:"] + total = result.get("valor_total") + vencimento = result.get("vencimento") + status = result.get("status") + if total is not None: + lines.append(f"Valor total: R$ {_money_brl(total)}.") + if vencimento not in (None, ""): + lines.append(f"Vencimento: {vencimento}.") + if status not in (None, ""): + lines.append(f"Situação: {status}.") + + items = result.get("itens") or [] + rendered_items: list[str] = [] + if isinstance(items, list): + for item in items: + if not isinstance(item, dict): + continue + description = item.get("descricao") or item.get("nome") + value = item.get("valor") + if description in (None, ""): + continue + if value is None: + rendered_items.append(str(description)) + else: + rendered_items.append(f"{description}: R$ {_money_brl(value)}") + if rendered_items: + lines.append("Itens: " + "; ".join(rendered_items) + ".") + + # Se não houver nenhum campo de negócio seguro além do cabeçalho, deixe a + # composição pela LLM/guardrails em vez de despejar o payload bruto. + return " ".join(lines) if len(lines) > 1 else None def render_telecom_plan(*, tool_name: str, result: dict[str, Any], state: dict[str, Any], agent_label: str) -> str | None: diff --git a/Tuning-Performance/Normal/templates/agent_template_backend/app/workflows/__pycache__/agent_graph.cpython-313.pyc b/Tuning-Performance/Normal/templates/agent_template_backend/app/workflows/__pycache__/agent_graph.cpython-313.pyc new file mode 100644 index 0000000000000000000000000000000000000000..114625a75f1eb41ac56ec89a9e485938646aa83e GIT binary patch literal 56836 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 LRyNxLsMX3}(%!LG literal 0 HcmV?d00001 diff --git a/Tuning-Performance/Normal/templates/agent_template_backend/app/workflows/agent_graph.py b/Tuning-Performance/Normal/templates/agent_template_backend/app/workflows/agent_graph.py index 0a12c4b..2cb86e1 100644 --- a/Tuning-Performance/Normal/templates/agent_template_backend/app/workflows/agent_graph.py +++ b/Tuning-Performance/Normal/templates/agent_template_backend/app/workflows/agent_graph.py @@ -492,6 +492,119 @@ class AgentWorkflow: "next_state": "SESSION_ENDED", } + @staticmethod + def _output_guardrail_context(state: dict) -> dict: + """Monta o contexto operacional do turno para os guardrails de saída. + + Mantém evidências/protocolos necessários aos rails, mas impede que uma + transação encerrada ou semanticamente interrompida governe o novo turno. + O histórico completo permanece no state/checkpoint para auditoria. + """ + ctx = dict(state.get("context", {}) or {}) + mcp_results = state.get("mcp_results") or [] + ctx["evidence"] = mcp_results or ctx.get("evidence") + ctx["tool_result"] = mcp_results or ctx.get("tool_result") + ctx["tool_executed"] = any(isinstance(r, dict) and r.get("ok") for r in mcp_results) + + history = list(state.get("history") or []) + current_user_text = str(state.get("user_text") or "").strip() + if current_user_text: + if ( + not history + or not isinstance(history[-1], dict) + or str(history[-1].get("content") or "") != current_user_text + or str(history[-1].get("role") or "") != "user" + ): + history.append({"role": "user", "content": current_user_text}) + + route_decision = state.get("route_decision") or {} + route_metadata = route_decision.get("metadata") if isinstance(route_decision, dict) else {} + route_metadata = route_metadata if isinstance(route_metadata, dict) else {} + pre_validation = state.get("transaction_pre_validation") or {} + pre_validation = pre_validation if isinstance(pre_validation, dict) else {} + tx_status = str( + state.get("transaction_status") or pre_validation.get("status") or "" + ).strip().upper() + terminal_tx = bool(pre_validation.get("terminal")) or tx_status in { + "COMPLETED", "FAILED", "CANCELLED", "BLOCKED", "OUT_OF_SCOPE" + } + semantic_intent_shift = ( + str(route_metadata.get("transaction_interruption") or "").strip().lower() + == "intent_shift" + ) + stickiness_intent_shift = bool(route_metadata.get("route_stickiness_preempted")) + should_isolate_history = semantic_intent_shift or (terminal_tx and stickiness_intent_shift) + + current_route = str( + state.get("route") + or (route_decision.get("route") if isinstance(route_decision, dict) else "") + or "" + ).strip() + current_intent = str( + state.get("intent") + or (route_decision.get("intent") if isinstance(route_decision, dict) else "") + or "" + ).strip() + ctx["current_user_message"] = current_user_text + ctx["current_route"] = current_route + ctx["current_intent"] = current_intent + + if should_isolate_history: + operational_history = ( + [{"role": "user", "content": current_user_text}] + if current_user_text else [] + ) + ctx["historical_transaction_ignored"] = True + ctx["historical_transaction_status"] = tx_status or ( + "INTERRUPTED" if semantic_intent_shift else "TERMINAL" + ) + if semantic_intent_shift: + ctx["historical_transaction_interruption"] = "intent_shift" + for stale_key in ( + "transaction_pre_validation", + "transaction_status", + "active_transaction", + "transaction", + ): + ctx.pop(stale_key, None) + else: + operational_history = history + + ctx["conversation_history"] = operational_history + ctx["history_texts"] = [ + str(item.get("content") or "") + for item in operational_history + if isinstance(item, dict) and item.get("content") not in (None, "") + ] + + protocols: list[str] = [] + seen: set[str] = set() + protocol_keys = { + "protocol_number", "protocolo_id", "interactionProtocol", + "protocolNumber", "finalizacao_protocol", + } + + def walk(value): + if isinstance(value, dict): + for key, item in value.items(): + if key in protocol_keys and item not in (None, ""): + text = str(item).strip() + if text and text not in seen: + seen.add(text) + protocols.append(text) + elif isinstance(item, (dict, list, tuple)): + walk(item) + elif isinstance(value, (list, tuple)): + for item in value: + walk(item) + + walk(mcp_results) + if protocols: + ctx["expected_protocols"] = protocols + ctx["requer_protocolo"] = True + ctx.setdefault("tipo_fluxo", "ajuste") + return ctx + async def output_supervisor(self, state): """Valida a resposta candidata com o OutputSupervisor corporativo. @@ -507,15 +620,15 @@ class AgentWorkflow: } candidate = state.get("answer") or "" - context = { - **(state.get("context") or {}), + context = self._output_guardrail_context(state) + context.update({ "tenant_id": state.get("tenant_id"), "agent_id": state.get("agent_id"), "session_id": state.get("conversation_key") or state.get("session_id"), "route": state.get("route"), "intent": state.get("intent"), "supervisor_attempt": int(state.get("supervisor_attempt", 0)), - } + }) async with self.telemetry.span( "workflow.output_supervisor", session_id=state.get("conversation_key") or state.get("session_id"), @@ -601,7 +714,7 @@ class AgentWorkflow: component="workflow.output_guardrails.start", ) final, decisions = await self.guardrails.run_output( - state["answer"], state.get("context", {}) + state["answer"], self._output_guardrail_context(state) ) for _decision in decisions: await self.guardrail_telemetry.evaluated("output", _decision) diff --git a/Tuning-Performance/Normal/templates/agent_template_backend_day_zero/app/__pycache__/__init__.cpython-313.pyc b/Tuning-Performance/Normal/templates/agent_template_backend_day_zero/app/__pycache__/__init__.cpython-313.pyc new file mode 100644 index 0000000000000000000000000000000000000000..f58a0656f204975b603d816541862495d09b3187 GIT binary patch literal 219 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 literal 0 HcmV?d00001 diff --git a/Tuning-Performance/Normal/templates/agent_template_backend_day_zero/app/agents/__pycache__/billing_agent.cpython-313.pyc b/Tuning-Performance/Normal/templates/agent_template_backend_day_zero/app/agents/__pycache__/billing_agent.cpython-313.pyc new file mode 100644 index 0000000000000000000000000000000000000000..b054c868b9d84fb03578fba0bae3453e7cd5d19c GIT binary patch literal 6311 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 X|DHMf=fKxl_CmRH_%94LtiAsSF+Y2D literal 0 HcmV?d00001 diff --git a/Tuning-Performance/Normal/templates/agent_template_backend_day_zero/app/agents/__pycache__/orders_agent.cpython-313.pyc b/Tuning-Performance/Normal/templates/agent_template_backend_day_zero/app/agents/__pycache__/orders_agent.cpython-313.pyc new file mode 100644 index 0000000000000000000000000000000000000000..710b3183fd0b8eef26f09ef79b0b6b1ebbe6ec68 GIT binary patch literal 5964 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 literal 0 HcmV?d00001 diff --git a/Tuning-Performance/Normal/templates/agent_template_backend_day_zero/app/agents/__pycache__/prompting.cpython-313.pyc b/Tuning-Performance/Normal/templates/agent_template_backend_day_zero/app/agents/__pycache__/prompting.cpython-313.pyc new file mode 100644 index 0000000000000000000000000000000000000000..71ad8ec6b92c7a83373ef79d752c15bde5e983b3 GIT binary patch literal 1216 zcma)6OG_J36uy(0B$Akk7LisE29aVkX8J&|(g#wgeTWoepf1XAJ9868=f%A@)aWL3 zRX4SZ7V;Bx)k6P3!A+NuED{FVO&6s*A#~q!lSx5Q=z*Cz=bm%E^L;0o>1Hx11ja|+ zZGDI#^iu=_gIJiQ5v%SmAxd!ElRw|$S9 zQMX7TxqnIBB}pKa&^kQNTTxnwPVY%GQPR4Fkak&p?1Fljs-YYIj~~^0u~O_pPV(h5 zJh>!a*rQz5Q;e^RO`NlZDE5?+@=rJLDoN9*q^PKvC`l^1El;Cdvib{(mo3|b6=TiU z0!qsEj;~n+T;C12X8K;)u2d4BsSX7vdaA^`&8YcSUSR4XPSolVFJ+2G= zIxgQaUi);rFW4wk>=F?hzG>?lRnPV+^Unz_`xNw>L|+q*qYpODqP{_Fyu#)-@hro_ zHDi}hU&lcZEmQBa1H?j53nw7q)QmHGi1^b{V5-2y>Ts*0(_xeyJFxfdMz*ESv{m!4 z^l9^G^K-2=zucZ*`MTcDub$*rzZtFkOUO2{Szqa7#}D@Q_ZmyB?Dcjwe>hct+)>95 zoPDS9pry{W)tiU3omo7|EVeRB^+!L_qn+$zb7-=oj=g>Hexp%nUduJpvrT2T3mni| zEcM05?^b$zSq cko)v1gyO5f1lp-ANz!*T^(T>*=6dCS0YTh3jsO4v literal 0 HcmV?d00001 diff --git a/Tuning-Performance/Normal/templates/agent_template_backend_day_zero/app/agents/__pycache__/runtime.cpython-313.pyc b/Tuning-Performance/Normal/templates/agent_template_backend_day_zero/app/agents/__pycache__/runtime.cpython-313.pyc new file mode 100644 index 0000000000000000000000000000000000000000..e10fbd85138a3653f08dece0a7b590e70efb589d GIT binary patch literal 418 zcmZ8dze@u#6i#|qTUuIl(Y3f8Xfq2UXcxKCqE=l)?7cf;?~>zP4qGSv2i*K4{Bv9b zE;_jh9bC=PcJU35@5}dtN0yyVi?}h{FZbt^kgtktrnUlfdEme+nUDz`l8_?pRk${+ zg&umLkA7IkdXF&oc1dw7@dE$5iU!oSg;LrGBeg05&+eQipv+aNjLcvp=Th132#P`^ za8}AR0<_(=I?&3%+>C>UZE+r#rbOTzJ=bgZoL?CpqsZVvZ|OU^ M`D_iI8`yTzA5#c@(*OVf literal 0 HcmV?d00001 diff --git a/Tuning-Performance/Normal/templates/agent_template_backend_day_zero/app/agents/__pycache__/support_agent.cpython-313.pyc b/Tuning-Performance/Normal/templates/agent_template_backend_day_zero/app/agents/__pycache__/support_agent.cpython-313.pyc new file mode 100644 index 0000000000000000000000000000000000000000..1a49580acc4ced1256130ded67fdc39e89d917b7 GIT binary patch literal 6019 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 literal 0 HcmV?d00001 diff --git a/Tuning-Performance/Normal/templates/agent_template_backend_day_zero/app/agents/billing_agent.py b/Tuning-Performance/Normal/templates/agent_template_backend_day_zero/app/agents/billing_agent.py index aa60099..05254d1 100644 --- a/Tuning-Performance/Normal/templates/agent_template_backend_day_zero/app/agents/billing_agent.py +++ b/Tuning-Performance/Normal/templates/agent_template_backend_day_zero/app/agents/billing_agent.py @@ -95,7 +95,7 @@ class BillingAgent(AgentRuntimeMixin): state, system_prompt=apply_agent_profile_prompt( state, - "Você é um agente especialista em faturas. Responda com clareza, objetividade e sem sugerir ações não solicitadas. Use dados MCP quando disponíveis.", + "Você é um agente especialista em faturas.\n\nUse dados de tools/MCP e RAG autorizados como fonte de verdade para responder somente à solicitação atual.\nNunca exponha identificadores técnicos ou de identidade presentes no estado, contexto ou MCP, incluindo customer_key, contract_key, account_key, resource_key, session_key, customer_id, document, message_id, ura_call_id ou MSISDN/telefone completo.\nNão transforme nomes internos de campos em rótulos para o cliente, como “contract_key”, “customer_key” ou “MSISDN”.\nPara consultas informativas de fatura, apresente somente dados de negócio necessários, como valor, vencimento, situação e itens cobrados.\nNão acrescente canais, telefones, códigos USSD, URLs, aplicativos, lojas, relatórios adicionais, procedimentos alternativos ou próximos passos que não tenham sido explicitamente retornados pela tool/RAG e solicitados pelo usuário.\nNão ofereça espontaneamente outras ações ou detalhamentos.\nSe uma tool retornar BLOCKED, OUT_OF_SCOPE, NOT_ALLOWED, FAILED ou outro resultado terminal, explique somente o motivo retornado, não declare sucesso, não invente alternativa e encerre a resposta.", ), mcp_results=tool_context, rag_context=rag_context, diff --git a/Tuning-Performance/Normal/templates/agent_template_backend_day_zero/app/agents/orders_agent.py b/Tuning-Performance/Normal/templates/agent_template_backend_day_zero/app/agents/orders_agent.py index f557bed..b793c26 100644 --- a/Tuning-Performance/Normal/templates/agent_template_backend_day_zero/app/agents/orders_agent.py +++ b/Tuning-Performance/Normal/templates/agent_template_backend_day_zero/app/agents/orders_agent.py @@ -95,7 +95,7 @@ class OrdersAgent(AgentRuntimeMixin): state, system_prompt=apply_agent_profile_prompt( state, - "Você é um agente de pedidos de varejo. Use dados de tools quando disponíveis.", + "Você é um agente de pedidos de varejo.\n\nUse dados de tools/MCP e RAG autorizados como fonte de verdade e responda somente à solicitação atual.\nNunca exponha identificadores técnicos ou de identidade presentes no estado, contexto ou MCP, incluindo customer_key, contract_key, account_key, resource_key, session_key, customer_id, document, message_id, ura_call_id ou telefone completo.\nNão transforme nomes internos de campos em rótulos para o cliente.\nNão declare sucesso, alteração, troca, cancelamento ou qualquer mutação se a tool não tiver confirmado a execução.\nNão acrescente canais, procedimentos, ofertas ou próximos passos não solicitados.\nSe uma tool retornar BLOCKED, OUT_OF_SCOPE, NOT_ALLOWED, FAILED ou outro resultado terminal, explique somente o motivo retornado, não invente alternativa e encerre a resposta.", ), mcp_results=tool_context, rag_context=rag_context, diff --git a/Tuning-Performance/Normal/templates/agent_template_backend_day_zero/app/agents/product_agent.py b/Tuning-Performance/Normal/templates/agent_template_backend_day_zero/app/agents/product_agent.py index 34433f5..998dad6 100644 --- a/Tuning-Performance/Normal/templates/agent_template_backend_day_zero/app/agents/product_agent.py +++ b/Tuning-Performance/Normal/templates/agent_template_backend_day_zero/app/agents/product_agent.py @@ -95,7 +95,7 @@ class ProductAgent(AgentRuntimeMixin): state, system_prompt=apply_agent_profile_prompt( state, - "Você é um agente especialista em produtos, planos e serviços. Explique sem fazer oferta proativa e sem executar ações sem confirmação. Use dados MCP quando disponíveis.", + "Você é um agente especialista em produtos, planos e serviços.\n\nUse dados de tools/MCP e RAG autorizados como fonte de verdade e responda somente à solicitação atual.\nNunca exponha identificadores técnicos ou de identidade presentes no estado, contexto ou MCP, incluindo customer_key, contract_key, account_key, resource_key, session_key, customer_id, document, message_id, ura_call_id ou MSISDN/telefone completo.\nNão transforme nomes internos de campos em rótulos para o cliente.\nEm consultas meramente informativas, não exponha flags ou capacidades transacionais internas como can.cancel e não informe espontaneamente que algo pode ser cancelado, alterado, contratado, removido ou trocado. Só mencione capacidade transacional quando o usuário tiver solicitado essa ação.\nNão faça oferta proativa e não execute nem simule mutações sem a confirmação exigida pelo framework.\nNão acrescente canais, procedimentos ou próximos passos não solicitados.\nSe uma tool retornar BLOCKED, OUT_OF_SCOPE, NOT_ALLOWED, FAILED ou outro resultado terminal, explique somente o motivo retornado, não declare sucesso, não invente alternativa e encerre a resposta.", ), mcp_results=tool_context, rag_context=rag_context, diff --git a/Tuning-Performance/Normal/templates/agent_template_backend_day_zero/app/agents/support_agent.py b/Tuning-Performance/Normal/templates/agent_template_backend_day_zero/app/agents/support_agent.py index b4f0244..b15a0e4 100644 --- a/Tuning-Performance/Normal/templates/agent_template_backend_day_zero/app/agents/support_agent.py +++ b/Tuning-Performance/Normal/templates/agent_template_backend_day_zero/app/agents/support_agent.py @@ -95,7 +95,7 @@ class SupportAgent(AgentRuntimeMixin): state, system_prompt=apply_agent_profile_prompt( state, - "Você é um agente de suporte de varejo para troca, devolução e garantia.", + "Você é um agente de suporte de varejo para troca, devolução e garantia.\n\nUse dados de tools/MCP e RAG autorizados como fonte de verdade e responda somente à solicitação atual.\nNunca exponha identificadores técnicos ou de identidade presentes no estado, contexto ou MCP, incluindo customer_key, contract_key, account_key, resource_key, session_key, customer_id, document, message_id, ura_call_id ou telefone completo.\nNão transforme nomes internos de campos em rótulos para o cliente.\nNão declare sucesso nem simule troca, devolução, garantia ou outra mutação se a tool não tiver confirmado a execução.\nNão acrescente canais, procedimentos, ofertas ou próximos passos não solicitados.\nSe uma tool retornar BLOCKED, OUT_OF_SCOPE, NOT_ALLOWED, FAILED ou outro resultado terminal, explique somente o motivo retornado, não invente alternativa e encerre a resposta.", ), mcp_results=tool_context, rag_context=rag_context, diff --git a/Tuning-Performance/Normal/templates/agent_template_backend_day_zero/app/observability/__pycache__/__init__.cpython-313.pyc b/Tuning-Performance/Normal/templates/agent_template_backend_day_zero/app/observability/__pycache__/__init__.cpython-313.pyc new file mode 100644 index 0000000000000000000000000000000000000000..42d368bd4e7c253d678462e95c94a1fa5cf5be81 GIT binary patch literal 233 zcmXwzO$x$53`RTtfCz%uaG_ZX;t`4q_aSZ5GTNCb>8R8bxN_$qypmf_AiaPypx+{S zj}Z9!*=(AG`1$=1_dAY%)DQYmfJag#3za?-83gO&>2(8RJrv{#s9fX4$q}ex>#-Cv z935S*VSlpPR?8hr>BNxD8PW(fcs5Nn+a literal 0 HcmV?d00001 diff --git a/Tuning-Performance/Normal/templates/agent_template_backend_day_zero/app/observability/__pycache__/telemetry_observer.cpython-313.pyc b/Tuning-Performance/Normal/templates/agent_template_backend_day_zero/app/observability/__pycache__/telemetry_observer.cpython-313.pyc new file mode 100644 index 0000000000000000000000000000000000000000..b99954da01e05c312337663b740b2951a0123689 GIT binary patch literal 4844 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
pAj(GEHt;Us)~VQPB9!>CG8J^PVy zDz))oqd@a9F%(g2>|pTpvtDsB5Y@9cRa`1|iZ1A+Ly~-|Qz%qN05q@*hXEi?_JXgN zA_b*i$%qtHekCjB6uQENd%oR&Wq+u8&!X-tnIL1qDXG0-DvXpj-!PTjtlxXx6skY5 zsJmgRxmnxxP>iV{0xiGk4FnDlOsyHN-K7O;H_*%giDm^F_4nG>`3_}Az zqfYNkTXb<^3hJS91|&`asf zDncNucE@7!E0*e|{3hhL+^pPoWuH{p6U$#xvve}teKgd4Gs#pKtHYOArv4UEUnaY)H= zw21r`{_aKK?9|2xpd;F0yrn*B1ke$jF=Y}c&+P~EAejj2;zsyN>@4!RB9%xQ(10h0 ze=>yqcwd{pnlo_&HTZMj&s@PZb1aQcCbXJ3D<^N-6KK~7jf-<)H*gKOZNIc%B9KY7T^ynv^e^ zfVj7V<_}iFPPd%w%g7zr1Lq$Yal}y)cC>~ZtzpN;kYnS@$d&f6qw_Bvo$r-7m-OE} za_$TFwOnBrk3b25j#}jvAwfsyKL_X(@}-K-M*iD;r^WDZweT%lJ9D((=R2*2Ki0x` z#fq@2I=(Z@0D1xWtvrISX7S|DF?7}$uNLr~Mb@hhEBUL82p10mZi6mHR{9eB;tS;b zPjFZVeC9Ksam6}7@1cf9?JBMRpD8u%1ONCucVDA1*WEU7IfaYa44q#y#}qv2Ut?SP zIya`wzcDO@u}7XEetwi!BajP(2hdzid004Yb}5fMqvT(lZ`9#p{;I;IaFr9J3{U<| z3m15gDqISuO)ce-;mN;g;p)=BrEmq$N&uJP$-img0-sT>FNM>Vp7O}>nZ=HtuLMM z)xHY~S8&7xa2cNbn-*?H8n_g$;Fcc)t~Cu@3RiH_j{!F`4O|L$CE&?Ex&88Q+J4AN z1DC>SS4nwfc=B&rxY=poQh0R=P`t|U$rhFbfvJ?pBz3ET>8>ktbtK?bOof z9wCkX5z-hQA&v17(wH70jrkGMSRNrwhG6~B{;>*~ADSjp$okMUSwi-QrpXp^J~U0v zSerbD)}-AahbDfB9EI}-qB*IA@Mumd89bU9$2emI=xAmf z<&3{tV>qWA8Am$fuSO;ha^gfZ^W*~LBRukJ28lq#NzBol1i~H9miqv@9+iU>lp9zm zL$af}N!cM=GUa0Nu?bCUyjA#Fx-P)iJC|xV#>eZTXSHeL$Dox_h`ic z9>EPOM>Yh+A0~YeKfs|gwF4l&Fg*R&kl->O)q>{<6K|4EZf;vM*ieDk;*U9+}a=uE=8FJ2& z^P6x`9czLI04beP(LiwyI8l>#VuGD^#V=FXi{$)kavl-5_*<0tYvg>LoNthGj-2yw zV&Husvxr2}kLFWp===%D5Y2*)=Ao!S)Zy`-fP56BUe@wwL>dwjV40bln)Zo=>M?2& z#*ualP(_Hufw83lam6}YJVi0Z>HC=)7PtUd&vQ3zrQbR#+3FXK5mR>9R0tMsu&4k{O7*MFuQW^5dvBQbeT4jF z%et2>mn|zhR;$BZ!=bKWsb08Y8c`rTQdc!EPrUrp<)?xj2d+X(00wGwmVP)h8N56YC_}Ed9N5aQWg^rz) z+E3pweNF*$UbVk&$rIyS`9atE8>S5`eND(z6S0;@tT|z8eaKoLDXa*#c8087?;CYy z%WVs1&Iz01iQcoe->PVf;J?dFZb>z{&gMw$lx7ZC6rYG=nXV-7s|~g)|4<5A^ip4bvti z$$3YxvOPH--&=Zn7GeZy3LE4$#UUwH8gH=6fful{Mvk6NVW z!;4=CW*-Tfj>K?j1xv>FN?$(x-J|UdOEa&&G|M}kOdBDwFadj>pkYfjTl~cf03m)0 z&gIxDB7PD6H7m%!MZg235A_x58s#O5HE5fq6))|-uzzVPT-p{YZCgAQG(EQR6r2Z} zL#XAK@OSSY&5HEhhcrph9N@gqfMH49z@9N$QQ3o?iWc;gM~#W;Cj?)Ga4?*ak{Pdb z3{BI~M!BPtSh=}afzu6)K~CSM9HUc-V#uo*)!?XX!XFO4Zpf#lsVfmyQXV1W)2?Y6 zcviV3LS~0njr5l$UskJv%s@6$tH?$IX`kJoI+>FWiI8b5h|4tUK+jYqc?_ffQy(EW zO>I8*_@#kolY1piyj_kL@`QZ1PACu@9a@zcph_GWCMHM9Gs+8An*Ly7s(&|ya*0VZ z6pMiiIePd}U7B2v+>SK)i_(`W6uWgjX=nce>Na<1)L`fK^84^D`iY=}F;9JliCdKN z2zjGM8AVX-QxyW4+H4s$s*z6CETtubyil5^?f-&vDrqG&3S|k_`4~x8u}8ga@@TEe zU!KS>INe6Um1eGfXm9oZSB_RNwNX?ALge~kwSDL)?&bS2igAYZqpsf-zi1;x^ZSrV zS^Gc;on0KRNc4g1lkwSvTsS0uO+uwx_i4;?q3Rc{Uxd7|D!J`KbumZ%B=>@^xQTejBV4muQdZGRkj!y%2?nbvE@CfX!QT-<@t4U~fV;6lC zM%rH8KpSMpwFAMpJ?Dq5{v~zFILLX*9OvMJ$ zdlOSkF4FbXwTrG3vr{e~M8`#u#Jyen{Zr#pJ{QO@q%q`mQ7I6Pbdih+2@ewW!z;Q^ zSH_EX&me(!(&rX^Px;2@eG_qv9EFgGHIo{IRA4j*d7;P?fNbon-}AKZR5Sw>^u#M2 z&6I1;YTaOfe7isJtWS(une4VF_7)?;WXoWwIwHh5{t#`8TKtfAXTrC>(?zlfhC7uo z5H&AA7KO>i;}rigWz@4YQR7KafS~skS9<|uH^pk(+SZY@PF&&iJE;|951vsvm@fxw( z1`=h6uTep$*m`m{#zc~dym#4{QXBDAN@*q`9}rJK?;v3-CdGfcGJOSQf!5Q-3F=v_ zBi&TxX&*-Ua%#iHu6U(7){w?`@lbphthAI}dWJn^M$yxGv)RlH# zVn_!ocmJ?q<=~}L7f)T0P455U z9VWhmT8lqU=_v6h6#7#*MQC(DX|!$QcN&%so;!8+)VUpJcYLSe12Kd&3nceAKq~>h zI;OXRr2%RuBt<>rqBQ_=!+u%`W|(ZX=!4)8(_}#^(d)l<$?Im_gKs-Kp`^lwMEoAr zD`qjJTq6s`68PeJ0%=Wj4GDk8)G zS>2=jjChSfP+AuI9?Xh#cx;{mYX`Y8{>0P)h;SM$fA~aw6KMip$J}FL5*ayP?Rc@{ zj7Q3-S=?YFf7Seo zd9_*EG8nNr&NZBEINt}->1`vIS9hP&lv8Vde?&-~qRAO~j$m&|$|9&1Fy{c`&dr>i2^Tbn3YsHjwc#>1{-5nx>A6+gbZP41RIsf} zs_hQfKDoN^)~Tzff(M_F_C6Vjm;O1aW?Q7X;nMz#`qi zo|{#5%jR%>N2tC-s@i(9vSGPl@DR1CT1)6xfGG#_Ke~j^a zZ)>+y5nG;{FE;f^p!qp8h4R@H%Ale%sAxFv7jilFkZt4T2FbQDoV_uWz42CETcq3*srJ3MyI*P= zcy0fc&%S)%@_|1ZxVk^oG=LF}II94((00FDgRg>pA9vXIF{0tBTi$zYzf{-zn)%AQ zm#vqrf0T9A9I7L&DF`d(W!)FnX1QC0Pxx*jz8rxO+&$)%WrDA6H6XHM>nU`{%$; z>>n?5?hv-|S9kHlt-9B^&Pu#otK^5*8?IGp$zPi+SLUA^+w3WnXWf=(aSppyr4C`&d@W zPvN_YgksaXh2(#?jMBW@zza^pyNw3&ujk2aCkXHE;NeOfbG6JhFxO16QZDn`364}q zxujy|cQSv4LD*uH>Ug2iDxoIuZ!{v!8dY?X^Z63~?wtX`9y>E7WWYcepfgpX*fcJl6Bo!42wP6*a@F*|CP9=+dBqAy#13+%f7}cstZXr}f?n=mV zYun>vms+-q1H5#wRER}s)2ftNKyY)imM{Acldcp%xW0kH{g;bW* zlZ8SNGz)cV(qIUc(bYr-4xx(lS0WgpgtVqS2qh{*$|DqS-G}u`r}p(Ft)AEih%KSI z+Lj2VGRgCk!I8&LDEs7fQec(GVX3#B)@$s4pQzqWxvaE3Or=;^DJtI~*cDWM`ufFk zs;rsuoGPo@BaWO)uDMX*)(t}24&-a=qpXA=L23s+$J|lo7Q@vHe2uvQ=2pSw2Ywx7 z$>NVqdaN3VT9ehJ#d*x$B#K+AJeatG_!zN-q3%DR*MAQO)~|HXIQB(#%u+?x97$u% zE(BsUJn;&pn;;P_l@><4tVx; z4(uM>vq$_crL-qfDwT@bk^&Q?M3YQRN%RWS1!I&(Yf{br8v!;<%+7eH{897F_?(CI z`T}ggpw$JNBhUEaQg`w0IDTr*8wmI&SY@M*HG+FkCxlrP7lH_TsGkR$YIo|6)H3e$*ELm9E?vsc4a- z)+VfUN8)L-O?3r#^6fyAi_lCU`+1f-tifG8hZ4swjDai?DswL{NM%qWYG2$3l2O>! z7_v2nZLJ|&E9fMv``#M3IuIN=a^u8I(Ekjoe2VX+ns;mVQe!6hee^b>IYx~d(Tr1j z=?8%U&F3gEpxHypZtLJdh_G=bn?Rtk*MlrWga|7UBFHJ_iYs3# zzfc~*PwRzN1;mw25W@;qcFEyoHQ}<>5Di;xxO`oxd|kv*MA8PWmk~f4ZH-sxYR>W|{&QQh9;I1L5;$U#}c&Oqy$Z-Yb=R9XU%T_6W<83pC z##XEkRjdzJY*{%TcI^ncb_90{l4~T=(fO+L73cK>Qpe$?di2P@X%4TBJ5fha;*!yHm?kao!djs?ZF)fCFk&6v%b~_+T*qzcdBe4 zp?G24lZxa+QlCi7hfy<>hAZbASC7Sxl>towVF3~UyHv&{cTQ zz`s_^59J$PE76j_yk@9bdriv^6&kMTcEJBS&kvOtUe|PP$IBZ#tw{8yg&!(6yqTdV ze@;2V-*ods6^1ukJ8gKmjvUp7>zb}Yyu1zIb%wV~dg}2K)Kd0fHb2y82<8~bU&vE< z33JPN3aMcJYUb84w~>W68xCrX!S(!5yEVAMO8#9&q+dgqFriV5F7XtWH<_2C#=}w5 ze1w)m8jUjfypwc3%8gSRXz5LP1g)H2AYmM}6bg<5b7lH8!d9w+Z)zv$^jPDgoyi8a zd{S-92E)MV0)<=0PB?B^se1*z6FX+G4Ux`F*vk%6Xks5-z-v?sUWfP{_>y^LOjbKu zvX=Rk?r}G{<{KQKuI=3%fS(SBv>ByWwhymi*<;t|IN# z9eh{5;p$E;{IBs=guj-_cR38NWf{ny&r`UACx4NltIhbDlkcjuzUH!$zuAcJU(Wkq z%y}QzB}u|59y0Hr!4wgBOyCFS{Z|l`I`7x$sXRm3wB+dE{Bk<{VoZnplw~k(zv7Wr z!DrLY22z4aRs2X+Q~Fg*fdC~^Sp=&-@gi7qq2wj!1?O_URMZ-_wyh=g^Ea3)OERDs`cX!;YchUrxVJ5ub*g*H(dv#?NcK zs>ry~g-K_yICT-+B#mkwjeHJE%7b#irO>wWj8CG%ryACwPALzl+A2y2X;RV|H04Q? z(vp%4uWBg;om=PEwZc>|{z%Inl)cnvI6F0jgOUSIpXmG4M|c>YOD(;^=Q_Mj6<#u* zOGCE77@sR+t=*4NEo7>Gg^7Rb)Sy7nJ6^WmG-{<RDj5Bn02XAAVM_x-~sKj1rq* zeZ(xM1pjGGDX@;ESL28rKCMz2VY;i$Ib=aQTYxs;Us!(#|+9b^~HZ!3X z5pNM>#J&&{aTZ{&GNIKA%O`8<4|{?6a=8iHY(g&M58_*aD65Uo2_chQf5u>$U>|nK zITF7@9>ikx4+`4)twR2&HH+Jz@n?)?kf185E4X#cCW{0t;CJ!2J5G1aIEgPIX8bz6 zO_qTp37aepg$t!(WdBmW_}WKV{0Y2iZ*eNzrpnqEsi* zcUd2%EY{E!Ww4YJ<^V#NC>qE+Tuf$-7z7Aqgv9T`AI%_=DY^;QF9d#06I7&C@U+Ha z8IMm_ymB1PunqXTw-ru&X(q8qAilG?0*lUq0vg!I8cK>urHzY2;?rT`kXmNLTE~h$ zt-%EWRQy29QjJFZ3%o@6xiz@nPbe%!A~LlLR3su-Q13tm@-m4?*YMkgtDQ@e7kihs zFN-S`EBn6Nv{Lq$6}#Rp{2)M!`wK-S{K5`+#sr0Y{)DSro`$hu#~hov_QUD!~xtO00~~q+5js!YGDmv zMuj0o97`0<7(Yoy)M7@HU^AR%M63Y@D#JGsAi)DhSC*X^eVG^?sr2QfCbP1BgU00F z!=W*O+2EY~ubz7GRIsQ~%5Dm0Lmmw@W>{A)JX?6aUdpWs=Wbcf4%Tg1G~5Ci_}GPG z;j)%cSqssG6ECH%m-;UBy)<}Xa7{Qws`4z0CeY>b3Kn63t#C2pBap8nWmPYqx_s(N zq14(HvUR5r0q$8iXU!Q45g(f`G%uZ&ir1epM(o9BcfFTa8Yw@#lpicVyi)vb`QbAe z?>TFiJ|{Uhgo`$uF+_3-&t;#@UT%ELa@BHuOK|jY>9NBh*O41JMMd=$ zwDscF1{2SX$RrZQ3jGGY|cfBThLWx zvRZGp+-V`=MIKkY@qWHc&`3JD2aaKkU+AviTh3o=LN#?DS2FK=-?BHq$4zs|6?#Q2tl-pFZ-X7g?8y1X82g!BD6C^Gh<4Q)YPzHeEhuB$u zfkx#J_I1%WF@?>LwoMVcvDZa=_&Baai7lT@7lZc4_~wa41{>k&k%l|_*)o>*wBseWIC6E(!@$5OKOoffOuLPb=; zXnrSgTpy2LNFq1(PicMn8sZ;7n1gj4tG>6Uu1*Dqj!Ao-2-<7I_9x%9KN%?~IX887 zD(GsH3f6@Sh)SQoJ(R!w%F*jK*!c_R4~6oFf(JcP{%0W4tmAWQA~j8rqz$(A1grO~ zdg+_o&&NJW6NgXvM9^MyKahHu@~H3ZTt$~WixzN3*YxUtz8A$ z*EmoB`PZy`SDxXuOi%{-*YbFB3k+Q?#@9;uE~oXiGAsETj0j)znGwFhKC?FL`0>w7 z9YavVwq%MoIxh7Ql(RFF?4$EU%A@*WXrUCXQ~xv*mwY5y&{nnIMylMhJz@F0offyF z4K3xNPcjXjq~JAa;uSn3O}s^}PwFR+g+#3vGvxHZb{?hvSuv8xVu=&P@4F(yHNG!09-l z>c!R!((0OnuEwm_ecCB2aIGl=YFskM{?9O$Os7d?%M~40AJqDxP!WtyZe&l?v9@Nz zJqJg71js~yBS9y(m^8x&Lnn%$)D9_>E5orR>*g6FkQ=I z!c+KGp8VSlyY0r;HT-V9^>wY4{Mkl?|8n(1|0<7~9Puw#zx1??WP7t~SHC>v=!Dfv zw)z!Y`|L?7qsq$H(wVf(C26t_GO`6I6}UZ-X|2J2?X3HBzP#=M`omW{u@*}P6SW%I zBmOTK=`{-(Tf^9DMhlrpB0soZ@PT#dEFz;tYfni@?TUWfRcXidMz$)AzH1*{vnurj z_dX*PJuBru_rR)D_dj4&VhUkRP-6QAd4|dIebV z{DSCTLl`0YE~v=dy>Eab_oVGf`;&Q3<|o_01%;O4Qyu|wlCr$(gXaNx=ZCdi_1ww{ zD>W}@!k~XAh05nNwK^!02_V~O>rlf-&Z$T&Ag7LUCJal^MUtbM2dRxnX<#V{y<<#_T`@R1PJ)>3LrqNpENEXAdJFRvRC_h(3T2&SjQxfrc!r0-!^{~q z#B!vmb?!rIZA>b~_#vejSt-V(u~zRT#q>^6FG2bmy=qi#w_;K#DLwlh9&IM8aX^$= zZc5xJl%{k=UqYpqF!51qlaRj+a~rp=BxbomwIu~AFg{946mCfTW5SQz62UaRfl1oh84+$ogM4stjol(OIdB$Uzbs8v~O1-vEJ zZE$I!fyUOZR(_Dj-k2?vV;^#|T&AQ}#zx(uz`>XcF4VOGsViCPL>y+l;6Qj4g$va& z+YtU7VEqnx?j?RlbA%dsM*!asDTo;|s2SDzvk%`9Y8mWo7z={HW-CP901f+vKR0Q{ zH^z+e%KuL<-n!!C2KCm2_u^J0*pN92`I9D-l&ITnffDl5LMB`pnGI`^} zO@6Q!E0SH<39oCC?wE3(P(3SEIWPR(N$PY8>kE1OXvVze^0PSX8& zv37bFV4ijsH|K#Di6aHB<3T^sZJ{v*75R=N#tT|=>ZK#k2K?O<;m9O<%-t5u-DJH& zKIsMs%piIabIO~`R#tVgyTUDxvk_b4Y(#e72QG5b%sxE;g&fONV9JliQ3nnJdW;|} z^Ap#a%Vqq;t!pux_&wx_I}XWaFHH{>#^OJra{>)0gfSK?kG(rIc75Hqw=R3XpC?sq z3Rms9vhLOPSK3$e{$$&Ysy&E}GZ@=9<6e7q+Z1CYlXA%qsj5F9$4&75A3Wlpz!%lQ zJP;I&$mS2&v|CXk3y)E>wor=V*u-I%>EfDrp9dyDFg3_ZQPh?kM?=04h#KO*Cb}w~ zu9e+MgBLZ>P?=&$*B|b(c+j64CwmfPlI(B2v9|FV>mVan<$;>Gez^p7r+9*y^PGl zQQRz3G*b>`Frr!VYpj5gXnD-Y5WbIT&zkB?`e(t0h-T~`80i@v9v!0Uo8ax=KhSv~ zT9zhTymzY7L?<^Ae1`2bAUo(IvBlZ?Nman-!oF!XGy`Z}vH__W{8N`T18m5d^_AF2 zSe5mI%uYe8EVh~qEX*8-IjL;<-Q$l1*jbfgmnjd$(?;`{T^`64jC*I%*D(ldzE~r= zoz6!0-bC$p>egbY4}PV}D*QXxT~rxe^6HMS{zX{Z!Ph-!8|6oI+faxXdl;zsJncGO z5J(gB`@~wWCc7@f1jRmqZ#4s!cErG7fzLByP{Z3s6=Ad^pFglQ-!HXh3U0XkE2&{ zCh=G>Fc%|}JFf8_O*p!H$;1ilN1{{U0v*+u7TzMU7&t_@|^5>2|~V#)89o!x(? zJK`ulKLZOkE4nMaQrjLFI9b~G%~LOZ;ldXrXWMz*UzIqQcCYB9>WvY|2JE}AZ)xOP z1Ci32aA|X>6t|)MtaSYyJy+9yVdMJ-uDE(>_aAKhe%|*NV1qhbv{NeD`Ceh^`H|nT z+|A}HTXEsDt@M1)w|Dd4=cmzR`PE%av7vd1qTM(pv;2`@x88VX{xD((3Eb1^X!+H0b@ z@-nJelVe+otRgC3x=zc_njOVF{~Qwu!A6oHZy=ue=b|7=#!e|PM@4$A@rB=!wB)ae zCq2jKdGFZkQVx<=Q+%bZ2Ot^a~)?p&L3IUNcN_% z9Re&;*7`+loGHANDUmTGTxky3lj53i@%Cl=%Z|&Am13!3`=WNS_r>f;S$(*yYq|U7 zy_ff{^h?cM2*$nY#ms2WvCz<%RC!Et9z*D0$W;0_wt_PYWTPr!z)7;LUo_q<#XV!p zLR6FF+7xzezfvic?g*E5hf2Gp(w?BH=&v$L|4Uv8?l)hmTdus=^at~?tIBTL3(h=y zUOfA`b6+_7g{4!HV_nz*7Pe&H65QS|+56YVKO;HZ$hT4{+1sxaNcLT~avbNf&Sote zg4+&+oc%X)25uFVzf^RgC|I>YD%uz>+ImH^n00eo&#M2%p`+n#W1($h=gY%IO(EPl z(0ik3bI?1E_@?$1|LYUsroK>9--YtvL17X1B*x+Fl8PP+7wuW?Qcrg?&k?caes%wg z`-26IlC>#pJ-GaTc^fvkhOr zqvZU~a7jz3qy=`RN;;&1t@k;N!*XTnHm5njLp4*g%d(j9zKP4sIg=F=&k0uTkaBj0 zb9S#*O4gpRwJ&7tldSz=s}QmZl65qaU3N#yXO?4CFqb1|Ro&9BhU+>)bsfR2horj4 zrOLxWlQUAWDO@prWm|aL@nGNapsDb3-}l_66VZ1}Tz2)q74YiY<-_Fpn8{@%dl)u6E@ z6~UIBq1;`eoW~-K&FJ7v7p_2T?^x^(=Cp;Z>mnPrqZ%8t{;Fcr*~}}wB=L|F%xMi- z+W;Y_CbFaNj5e6p5z5(mPopo-I%9_9R&L%o<5}Z*^U}tj<<#HJL@@Mhs~Uq==dId~ zSe5P=xT5BJdY#Mi*M&`IbhK$ye_I#MuDORAG~I$FwED~SD;-kfj@6@~#z7YPmF_dT zbEdPV^F>llRXC?%NyH6|?-e%PAu#bz4W+v(7tJ?|O23)EsJpAt7FiZE?^~>9Clpi7 z&O5lhAail-27Ot1k@|Ji%Ic7{CQ{o--pY`*Dq_w4>cEQw=eI8x-mtEZWZM>Dj;fPK z5dm!NT+mr07<9qycDNyX9o#j1NlNl1{N4L9HrNTh*K^#8u$YTZ;mVmb(VuG6U1khl ztu-IN^|-MsF2`?Ak>h`4L-vQO$K+*;Q?pH!6btMy^+}3#r^a#IIxWLc zfk&a_wg=<=hQXE(t<(Ak^D(Uqa2$jpKp>l28y`#qeI5Eoy{R&9KF%8Pp*7v~U@cfp zvBC?*pl};NvZJ0L+EU7cP?a$St=g#2s`mm%HG*@rH6<%v5nAwIsH)XA<1pbiDG&0i z^btaLrX<9xP~z5uBE4UsNE-!`;!|4#OB2_Vq;DTg_iN+Sc+8O5XVuC~&@p3Nm^5~+ z$`a+-39HAhJ-axh?FVmy@c4erB>D|#{U*PW#zH7}n<2$#r+>5+tap>^XLT$snLW(hS4lJUh2?VwFQGn=f#<0q@kfraBh7UvhHkP!qcA0&Lm)`Z@G zYX->dl$V5ceQsCJv=50u0Qb&a`(D5`8`EI$xgaqN(ZSEejIDnL>O-XL1ByK;@3AZI zTjTfP#c1`-F3>V27EVw3LGK^;!kT%&k|@&Cs8GrQiP>TXoV~*b+%T!`cE>y&u4ksa zE`~P_9tV~78K3C3L<@TcI=c?^ct9;30>Lz)3j!%a)5KK3dwd$C$z)9s?>y)&bMs8w z26XI-_>F)Gwu8qzEuvFSd7$<&J%!xK_W;Jof8rM~EHP0E8euOgXH!-iuyh|U!+Re6TJmy0?Htc1odmQI4Oq7 z)?>;*Wj03NS3p;Un}V$)wIu0<6vP zR(J?hm|m&>V(l5F*Z)q=e}oe?%9=^EW{QuIvx|ifb_qShhkC>YdNVO|UWa;yqd6zM z)6>Vj<4=3ybbE0JCCE-`V8YaY%%)kg9dd#g<2v0VAM0<{pPQ(XUN`}&j6&9l5gC7r zigB)`+dR;TpCNMM%h-&GQ}aI5jq<*>_x$dc`Y-ecn|fB~rMv^-?EX-8|E>0|k(yRA zja>6`!{vtH#(mc-q{ahMZ9lV53~RwKMP%h5d%OSa{_`iLyt;5+%kug~Gc(TA7P7Ui z{7+AX1yp=FP64JGd^wwYpGExY>5;*Uuw9}5Uk!L6>km~4_|3#cEgWJ+lC`C z!QS(bf2)(pM<%JD;bvvck}qZ;d-tkWs@*45?k79TmiIZMIRohMS|jH557X+mm89q~ z0kto$43}*Um2C}|b%)BjVez``@v!4@n4QWmBWp(C{6?r1Js^; zeP5`3-;W!^y~jem$AXnlNZC(BoONO6x{!0-S!*P>=$!Mc^V_}Q>dm3*%~I~>i1Wl* z>n%#LCFI<4#(LYpmDELC&CvCT)U}4|wuI`os7=XEM!8DxT!}rZH?45(=`#nb$hOBq`JOH zMMJn^-Mba*ZrEnvp6`71^ed;sy9Tchhj)&Ic8&x`CxcT@hj&h|O#J4?(9Y?z8$(EL zn*qtI-p}8u$s=ptysSF*KH0*73Gc$g{9PRe`)(on`-8h%QTPYeg@J3r_J6_(Z;fL}JZ`F1g@$#boWoMEDwVO%5vjCH&oUE94p+Jh67AKDbsp9x7utUTh@n zn5vdq5s64TWto z!JMWHg?y6KD>Au9t=ARN(=_ms2?lEU74j2|E~}4IGC@fVf`XF61c8B6deYn;Xh|N& zm|vZYCTJM}gi{mjOpxIeM1vE!WJF^Dvu3Vp6vi6jxAl?XX`1sXkD7r5GCZ9QF6Obi z5e?e$Qy!pcc_~47RlXwBP_O}!B?HoGJ^C*=2gV$7y&;5_moTuM5Rp=EoBS=W$)BId z&kRUA(#(wy?XCE2eQKkqMnrq)D6YA!Pi=)MlY1cXD-`~sjTFuALr|TIqx>Mj&yK1Y zWTzu4J!@|3(+fopRnL3mc`g+HqVzRv38ZE znV;#@E6Wpvl20}sjELfNYaUG%5+D59GIQtSf`ocTMEN@qQYO}f z)O>8MYu7*w$zwjdjZ zaMnmG(NaRCe44kgJ>*ic=z3LzGO6C%r)ME>7TD=l?rOV@I*LK6eTbZQ;XJfEnS@ph zq1VLd20ufV23x8=DMQTPBaly%(?JfQ`Qm5E_aDe1nsaB_8Pl_YoBDR zc@T{SoKJjHQcWZcW~p43v_tK(Bw(Q8U#sK?iwv(-X~|#PWggt7eI5D_rH0qr+Tnkrh97hq-l%PY|IJ)}u+sFV zt&3i+@8Ab(OxJhX;r~&-liZE`V7=)_?VS|;j;m;}$@Wf%75*RV`N1~Bj}2W$y!<4S zA6#$vNmeoW>x%|AT7JqK;Qy)7iW>aX&JT7Newt?>e<@GlPUfPP@S`$t>zUica;<0n zjd}|2;3?NO!;sAwgdJ&}HK?(YKg)>lHHf$s&1Z;sAy&1R+yqbz1g1W!ni4#YUW6y5 zJPAt{DhQ-ndIb$n120K$QnftgRw}{ZhItru#CQ##P^}iGN75~&gP2-wbJ9UfBbe*Z zCm){jf&S5`!cHL2unhPR$O0;Pc0<%1yBUs?-WN7zKjxdNqRK8G1^PnBcr@Bf~x4~=u~?|LHLt;5IZcpCr52` z6p0cchxoV?I5Gl>R7;sFAJLVXpsi`rDmsZuTGXL`A#Hj^ClRR7qQZ66VHEP%XsOy} zNkgE}QRPQ@LC=0Qvh|kK+r%LG0UL(a6aGEI37d2FdqlKAn2x;{Ic|6tAA<3VdsSEEq)Fw|8j`ee`_ z)p!+n*VA#7O2?2aNHq?G;vwK;<89xXx3Z6oaupAp&Qeeo#vx8ZseXVyVkdK`7nzt* z8R*o+_r|ZS2L`ckIwnTWB7t#CM{~*O-;{rn-D~5aAjV3IW-0R0p7~RAK4=&vlux|V z(R}Z--YKva{^~XwHg$_@Y){{N7?Pxu->uA{k<%ATeMBE2xVMoY=Qe%o0CCU`QZA zWJMd}rHaHhRJ0O^YZyanzD@<&*W!1qw*N$k%o3ajY<@+or4M7L#mwO>mq^a`IC`^F z>O2~M<%!iUscG+G|M`}X zwLVhc^0N7|d8K95Ce`l_*ZZz#hW8x_?K=`YIw9@zAyp%Zn#M23eO9X3jG(%ZwK5XB zOLxU2)pj7L9#W|H493E&Gg>eT5l1)q27d3!GnrCO<(*ta+%DkI3gVz;u823vx8h>o zjah$PzV*zWn|7EY`}RcG-UN}^+Ig%Q;nIzv(v9-1#Y;WQ?of5dl^sB#$_RyWWG(K!XW&Y!U~rM{8*U60G(yBa z1S$K+rGg#doE`7x?6{*vf?I1X8&!TB++)iw$@$n1jVtReSua|DKkF4^$oZJ6r6U`c zU;WCYRI}%YlUH&tO<$b;eg7+yp_)BG``-Iw$~m2#^gp=Uh<4w}LsRbHsK1kLuyu9v z?0EmdT^m=smru%)e6**9>4nbv0~Y>jBi~nGxZ0#8zq@N!Uz_&zmZH8Q!yA@P2Y%kH z$tQPfGa}xq<@?GFZ`IYoe?5!ubD6GZcQ)eXM;%3dmA1ESR`}m8=lgIWi_=X0`l7xD z(>uHt{&#d%6!A_D-{&^GlWQP42g5Pd}>TRrNkL9>L(Nx$!b_|Qa_<2 zFcXbnf-Mh>06nSY5yNm)BcB4v_Q9xjkpBpVD9>WIK8C+q{AGOXecC*bLt&3z}uw~=$oP6iZEMCdL4}(wp5Oz9c3lcZd zc0(lE6eDimpj;`^D2XayXCiP-AeIIG4k=YOnn$604M?`8l&u8<9Ik3od<#38})B>5}SpVdZqu%2}NCV((%XBoja@OS1UZ5{d6)rIK^gYF8*{?>)Vi zI0QZgoY47LC5y?vyi736$S+Lv6UxnSa zM#I%2E%{3~bg$RGmd$rJ8(z!V4F5GF-|aSBGv$!K(26wIs`>6V!?hX%`I~tPcQdz* zr;zoA-DV?Md)sEc)?tPJb-fYcYt|X`cWj+G2G2)bXA(@&)Nca@TlrB9vC}cPP0XCN zW*}NNJxhl(C|5%iYGzhE<#|?wE@k{wf=M@pN<^)3IYbXx8Gr@T#MGjbOn_>voLJ6L zhT63!7CC!rVOwc#wITzXTaJ>LdRN%d8FF;4)<}+h;oN~c;e9H^lt<@7 z3#O0IF0{u*NNtS!u3mq|Y)cxr31W$Q{zqwW2m()aKVO)Hoy=by07DLb6FE1_=s*MzDjo$_sgESllJBTqrH4et1IpLEbkP#fZRI{YohnaO2G zvpe_p42&eCs1qFFnAwn*= z$Hk82Cvd>4+I7cn$+g|nrwX;ob*vBB>Txjql33AaCt@dkF3SS?^+;^dZ!$Ww>!mz1)RVu%iY#yI z`QCiP+Xe&qvv`ERoy%N1bMtu$cNluz#<$D(UYGUlax3{8jR;?Jt|glHm+*J*rcpVT zsSCX+!lp?ZiM))n3tDiNg)T6iX4}%=eWkX^rV|fUD^Wh&Vbw`}5)^Z6=4$atxUp)y zBC5%bWoi%Qxbs%-;~Qfls8x zwI7|2A<&^mt(Bj4zbi+OH03D=ku>oNza?qrq5X`XrB;81lk_RUQ|wiKO7QY!P78!C z4T2-C!@5RD76*NGev}#qsVGgoemRb7zD7YA$D}*Z)V~1bJ5QZ)f?{ z9OKkyxF|IQmM85(X@}+kx&R49TOLfUYNs&!p+eE%Fh9!u4LEx4W`c@U>;T$@gXanS z?ZIC){_-lgF-2S5$az6OW_t5#b%a%j)CX&pe$AStOTPIn?QF+tpZW-8zi6{PA<&w* zQ4jWpD^qI@jeH`}q&(2g)hDe1DgEMu@VsB&sXxJ=;9}ad9~&8PCf%+PwK5Lg9p5BIVpPQPP)BQ{%2;N_A$k}sF7KFnwnsy2BT&r)#)sDE^m=p zp{Fy+*dCaLEi8@Apkd zEphEYvTT=u1~C35ULHUrqLz3TM2fFaX+MOMbSshEu2rf;W(?yIMmmRK<&PQEdjO*N zC#=qJqS=bks~B$5z()H z!g>2vMz3s#791%#x|X)Bn1hvDgSp#4LW7BVeg<+oj5(NOc2~ ze4Uc2w}h*AUg-)~b%(0DSNo-^;Sa%+QgtDnDM;JV)%LeKu6A5MCUqZGFhZ$fbHr7{ ztba91uJ&|Q`><-?tZQ6uXT0b!si`yEM2KBo3Sw7(o68{905B%_;1uR&7DSv?FP*+{ zI;I@CQiH2$g3i6+qP@87ju^Bpp@J6Nixn!^9Ne<+daYD&Fr0HRm~#-^;rn}ej3gV= z_u0T^ahZLPd?bXdkYQz9@jm{&oP&3IDB(Z6zmMng%I-mFvmgmH@qUBtJ*xq!pf8-$ z7s}~dD?FQ5bSuUd54LqlwcX*`Cs!BVI(79_@Zb~D-X~=)`sbvYZSu%H1)b5G71c|^ z?-fQGTV8It+!AhlEY$cIE{e!6z{GQ|yKUzjEznh*Lf7WOX8yGfzHf)&wXIt6?{E#;wAae`1DxSnd3P0F-s1TKTEknK z?lQc*?c@&_3~#%19@Q?7JN#*sDi;0QvaD?#ceD{u4j-)X;KDXDMIl9-oxxJmaS;<=Ypr)Z2k}R1I zYepnwj)o^{R6g1|5mtHDy%Ne_8al!o1y(acg$e`ZuwtP?O^|n2s52&Fm4&FBXo(b> zBPh33@{VH1=^jknDv$;e0F0d*u&#sHb%ci=SIVIx3BWBv^MJONPf^nEt*@ap2jC9m zn%4!CvcNMy`|eUG!S2R_@pwGes;wm5!l$Fa7%&cSRFohN922wwtOH+w=fDf#CGZM( z4ZHz90B?bJz_1V0X8z=~js={8Dt0JvA( z;FL*}0DRfpcgBX;4un-`JKCXQKc4)YPHx7NyMi~I`?5ksok*X0Af06?)u42YS*eaX z!@*&!#sY@wc4|Fb^h%v7>^zi}s@_Nqp=L1;!i)?=O5eT$h#JdZp29!qZ{n9CWS zEr)Xq6Ay_9tFw%x_l8T!Jxdq^u-eP0Aba_(dtz|e*NEA|sPDDthISKTf4*x?M6;8`egy&ML#lOo` zf-f^ullVn(VV(0!xZY{g??I*(mZp<{wnhgnlojgdM}pPG^Z@;4BgTu!!8Y^sl~USb z>X+!*6g_{$pe=6N;;LTyY;nUD{k9mj#kei5+v2V*uGyknFBddV+k(Z$Y|(3r$vwkF S&P~Q%QchLNMn{0!to#ML*|i)1 literal 0 HcmV?d00001 diff --git a/Tuning-Performance/Normal/templates/agent_template_backend_day_zero/app/workflows/agent_graph.py b/Tuning-Performance/Normal/templates/agent_template_backend_day_zero/app/workflows/agent_graph.py index 0a12c4b..2cb86e1 100644 --- a/Tuning-Performance/Normal/templates/agent_template_backend_day_zero/app/workflows/agent_graph.py +++ b/Tuning-Performance/Normal/templates/agent_template_backend_day_zero/app/workflows/agent_graph.py @@ -492,6 +492,119 @@ class AgentWorkflow: "next_state": "SESSION_ENDED", } + @staticmethod + def _output_guardrail_context(state: dict) -> dict: + """Monta o contexto operacional do turno para os guardrails de saída. + + Mantém evidências/protocolos necessários aos rails, mas impede que uma + transação encerrada ou semanticamente interrompida governe o novo turno. + O histórico completo permanece no state/checkpoint para auditoria. + """ + ctx = dict(state.get("context", {}) or {}) + mcp_results = state.get("mcp_results") or [] + ctx["evidence"] = mcp_results or ctx.get("evidence") + ctx["tool_result"] = mcp_results or ctx.get("tool_result") + ctx["tool_executed"] = any(isinstance(r, dict) and r.get("ok") for r in mcp_results) + + history = list(state.get("history") or []) + current_user_text = str(state.get("user_text") or "").strip() + if current_user_text: + if ( + not history + or not isinstance(history[-1], dict) + or str(history[-1].get("content") or "") != current_user_text + or str(history[-1].get("role") or "") != "user" + ): + history.append({"role": "user", "content": current_user_text}) + + route_decision = state.get("route_decision") or {} + route_metadata = route_decision.get("metadata") if isinstance(route_decision, dict) else {} + route_metadata = route_metadata if isinstance(route_metadata, dict) else {} + pre_validation = state.get("transaction_pre_validation") or {} + pre_validation = pre_validation if isinstance(pre_validation, dict) else {} + tx_status = str( + state.get("transaction_status") or pre_validation.get("status") or "" + ).strip().upper() + terminal_tx = bool(pre_validation.get("terminal")) or tx_status in { + "COMPLETED", "FAILED", "CANCELLED", "BLOCKED", "OUT_OF_SCOPE" + } + semantic_intent_shift = ( + str(route_metadata.get("transaction_interruption") or "").strip().lower() + == "intent_shift" + ) + stickiness_intent_shift = bool(route_metadata.get("route_stickiness_preempted")) + should_isolate_history = semantic_intent_shift or (terminal_tx and stickiness_intent_shift) + + current_route = str( + state.get("route") + or (route_decision.get("route") if isinstance(route_decision, dict) else "") + or "" + ).strip() + current_intent = str( + state.get("intent") + or (route_decision.get("intent") if isinstance(route_decision, dict) else "") + or "" + ).strip() + ctx["current_user_message"] = current_user_text + ctx["current_route"] = current_route + ctx["current_intent"] = current_intent + + if should_isolate_history: + operational_history = ( + [{"role": "user", "content": current_user_text}] + if current_user_text else [] + ) + ctx["historical_transaction_ignored"] = True + ctx["historical_transaction_status"] = tx_status or ( + "INTERRUPTED" if semantic_intent_shift else "TERMINAL" + ) + if semantic_intent_shift: + ctx["historical_transaction_interruption"] = "intent_shift" + for stale_key in ( + "transaction_pre_validation", + "transaction_status", + "active_transaction", + "transaction", + ): + ctx.pop(stale_key, None) + else: + operational_history = history + + ctx["conversation_history"] = operational_history + ctx["history_texts"] = [ + str(item.get("content") or "") + for item in operational_history + if isinstance(item, dict) and item.get("content") not in (None, "") + ] + + protocols: list[str] = [] + seen: set[str] = set() + protocol_keys = { + "protocol_number", "protocolo_id", "interactionProtocol", + "protocolNumber", "finalizacao_protocol", + } + + def walk(value): + if isinstance(value, dict): + for key, item in value.items(): + if key in protocol_keys and item not in (None, ""): + text = str(item).strip() + if text and text not in seen: + seen.add(text) + protocols.append(text) + elif isinstance(item, (dict, list, tuple)): + walk(item) + elif isinstance(value, (list, tuple)): + for item in value: + walk(item) + + walk(mcp_results) + if protocols: + ctx["expected_protocols"] = protocols + ctx["requer_protocolo"] = True + ctx.setdefault("tipo_fluxo", "ajuste") + return ctx + async def output_supervisor(self, state): """Valida a resposta candidata com o OutputSupervisor corporativo. @@ -507,15 +620,15 @@ class AgentWorkflow: } candidate = state.get("answer") or "" - context = { - **(state.get("context") or {}), + context = self._output_guardrail_context(state) + context.update({ "tenant_id": state.get("tenant_id"), "agent_id": state.get("agent_id"), "session_id": state.get("conversation_key") or state.get("session_id"), "route": state.get("route"), "intent": state.get("intent"), "supervisor_attempt": int(state.get("supervisor_attempt", 0)), - } + }) async with self.telemetry.span( "workflow.output_supervisor", session_id=state.get("conversation_key") or state.get("session_id"), @@ -601,7 +714,7 @@ class AgentWorkflow: component="workflow.output_guardrails.start", ) final, decisions = await self.guardrails.run_output( - state["answer"], state.get("context", {}) + state["answer"], self._output_guardrail_context(state) ) for _decision in decisions: await self.guardrail_telemetry.evaluated("output", _decision) diff --git a/Tuning-Performance/Route_Stickness/templates/agent_template_backend/app/__pycache__/__init__.cpython-313.pyc b/Tuning-Performance/Route_Stickness/templates/agent_template_backend/app/__pycache__/__init__.cpython-313.pyc new file mode 100644 index 0000000000000000000000000000000000000000..f8eb54116a4e53c07be274286eeeeb1640b1b142 GIT binary patch literal 219 zcmXwzO$x$53`RTtfCvSz;X<<(#3P8P`w-i-jCC?)Iz{vl?mUE7>edrTFW?O5w@BV2 z5WYT5r%8y+9_P5KWQC6|!Ky?j>TC_)8*0*l5 XHa2fBym8}DC01=Be1=LXHw^Rz$BaI= literal 0 HcmV?d00001 diff --git a/Tuning-Performance/Route_Stickness/templates/agent_template_backend/app/__pycache__/main.cpython-313.pyc b/Tuning-Performance/Route_Stickness/templates/agent_template_backend/app/__pycache__/main.cpython-313.pyc new file mode 100644 index 0000000000000000000000000000000000000000..dd7251b049729d4d3ce798f48d6950f583aba41d GIT binary patch literal 31116 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 a$-_NV?F%$fU;j8a->otHMNy91X!t+3jJy>9 literal 0 HcmV?d00001 diff --git a/Tuning-Performance/Route_Stickness/templates/agent_template_backend/app/__pycache__/mcp_gateway_client_factory.cpython-313.pyc b/Tuning-Performance/Route_Stickness/templates/agent_template_backend/app/__pycache__/mcp_gateway_client_factory.cpython-313.pyc new file mode 100644 index 0000000000000000000000000000000000000000..2e1002955eec963d7d2ddbb825690d8d1f7e8536 GIT binary patch literal 1067 zcmah|&1(}u6rcT0`jv)QO&brTNHJKm1x>X@g*1(&O`Dc%ibxN`b~8!0-Ry?hSwo5k z@gj&Q2t^RVtKK|%^iPQ7P#NN>3VN#q@6I-fw0h`+oqg}kZ{GX8H*ea5gMEOBJ^Xy< z2M55RZ}f!kC|oYS=t zj-gxIj!WilUYnk#;gh(+S~ioTu~V+4)y&#P0cx4_T5dt3{LFM*pn)yjMbN_*m58&8 zY#JhF1vwspE;1au=*A_=J1&*Wh#>m`l`N-*Fcw+aR4{Gw9<==q&}VAJCTdY9x~i9E zVa>t2s$OO@083b}Am4_LVX6hsHtq7&b%aX}uIRRb)I7_Ephiq%*G8_Z5>%;LY>eD) zfSwJvbb~Q0s(Q7mR*WhvcV-P5$HN9ox>-n+mq z<k3VY!sJiAA}{3fe?h4Jr#gMY@yMA`k3g}?H=F4aYZ=dqy0p9#6J?aRdI@* gh3?=nX8P0X`iLWe2J|&J|7>&hfJVp~Cx|ll|d$Tc`3Q=ZvATsJSJ*2|SrO~-d zJ^9e1?p=t{Y!t0Wy^5D+&wUg*AD#!;Lfz63TX~3WVTf%pv?+E=AsPd8B}ShO$yg3; zncY73t3zT|qL=}m(M?xFkLp(mk?MDCNQJdH?s^=z9;1yIZN_n*$LL0g#-Z}f*tQj- zVSBz6dK8c9r7>T`b#8}f;9ih-N7;;RHc`L3`K26xSSOA!1Qz7IdJA$)5C=N~QA=j9 z@+maV3Fp*x6rM3%=YTMdg);1uwwyS0*?!G-50yLHOKLK=Mr|U;TAVN>$QvQ2Id-U^ zKNAa4r`Zy6gt;w2WSTnAQ^=|Ch%91K)k~(a!w(6QlQrsK8%3wlmy`>awdE-A2I5;uTejeG+yMrNt82=%G)3d22SY|O<4OMbu|l4@~TgzMBO zYxKs-$mcYd10H&?=|qOq~`LZNzCERsmHbIVcx%ZJF&GU?7k(|FYG<4tj|l z%dORb-|H6PFgrQAXS?RUDmp+T8dG7wRBurWJ0`h67YjieO(7Qs0>c)dM(BY#%(@JU z0%@Uvkp3-KB3G;yj<5}BRvY1F)26^GZ@X%ngf&ouG+agrm!*$vZPeG@l}|i}jEcVI z{?K+dCuIg92X=vw97m|(S}hP2l9LF%Zecs}Od|w~=fb8Aaa?exxL^{j*l}D?ENF;> zRkz@O7fY!(s@w1eq`n7Alqq;UvWP+%Q4_(C7~O+s1u5)41fRo?CJ(C(M^r5=a240? zBlTdby@y&;T2W`@nzZ`7<$!{=eju#of)-%~)gRR(MTVf}z5{EoswLR)j(Aj{e@1&4 zR_j<*m}WJ6X}6kf2LH;n@Js!1;eRDG?N=?B&L8arQ@Nw>f|y1z}HuLfyI)qmx76@qo={-^wG0mw&WE&(<>eC`1)$klrQ>vG05gR*E-yL z)OmA!>nyvX3V^B7;hl}QFMNG5C|~ic?)GV_d+)?KD{uMwmg=W_Mz`YqbTV~TSoihy z9;dL=bfNR;ZCiEE6+4!<-A#G-j-9jIny;^^V&(}jUkyr2{R+N*J(yqg9(4=eH^;xI zsEfY2g?6E)`=Nf=8??3%U3#tGB literal 0 HcmV?d00001 diff --git a/Tuning-Performance/Route_Stickness/templates/agent_template_backend/app/agents/__pycache__/billing_agent.cpython-313.pyc b/Tuning-Performance/Route_Stickness/templates/agent_template_backend/app/agents/__pycache__/billing_agent.cpython-313.pyc new file mode 100644 index 0000000000000000000000000000000000000000..f5a9d47532a63706ff7ca73360127bee35aa17b1 GIT binary patch literal 6311 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 literal 0 HcmV?d00001 diff --git a/Tuning-Performance/Route_Stickness/templates/agent_template_backend/app/agents/__pycache__/product_agent.cpython-313.pyc b/Tuning-Performance/Route_Stickness/templates/agent_template_backend/app/agents/__pycache__/product_agent.cpython-313.pyc new file mode 100644 index 0000000000000000000000000000000000000000..7ebb5c30ad4460049c0c1aa02574f37879a181c0 GIT binary patch literal 6308 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 literal 0 HcmV?d00001 diff --git a/Tuning-Performance/Route_Stickness/templates/agent_template_backend/app/agents/__pycache__/runtime.cpython-313.pyc b/Tuning-Performance/Route_Stickness/templates/agent_template_backend/app/agents/__pycache__/runtime.cpython-313.pyc new file mode 100644 index 0000000000000000000000000000000000000000..0302053e6c96f738a4570b4f3c77b7494b060d56 GIT binary patch literal 503 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 KHv~3J-2VW2i3{!k literal 0 HcmV?d00001 diff --git a/Tuning-Performance/Route_Stickness/templates/agent_template_backend/app/agents/billing_agent.py b/Tuning-Performance/Route_Stickness/templates/agent_template_backend/app/agents/billing_agent.py index aa60099..05254d1 100644 --- a/Tuning-Performance/Route_Stickness/templates/agent_template_backend/app/agents/billing_agent.py +++ b/Tuning-Performance/Route_Stickness/templates/agent_template_backend/app/agents/billing_agent.py @@ -95,7 +95,7 @@ class BillingAgent(AgentRuntimeMixin): state, system_prompt=apply_agent_profile_prompt( state, - "Você é um agente especialista em faturas. Responda com clareza, objetividade e sem sugerir ações não solicitadas. Use dados MCP quando disponíveis.", + "Você é um agente especialista em faturas.\n\nUse dados de tools/MCP e RAG autorizados como fonte de verdade para responder somente à solicitação atual.\nNunca exponha identificadores técnicos ou de identidade presentes no estado, contexto ou MCP, incluindo customer_key, contract_key, account_key, resource_key, session_key, customer_id, document, message_id, ura_call_id ou MSISDN/telefone completo.\nNão transforme nomes internos de campos em rótulos para o cliente, como “contract_key”, “customer_key” ou “MSISDN”.\nPara consultas informativas de fatura, apresente somente dados de negócio necessários, como valor, vencimento, situação e itens cobrados.\nNão acrescente canais, telefones, códigos USSD, URLs, aplicativos, lojas, relatórios adicionais, procedimentos alternativos ou próximos passos que não tenham sido explicitamente retornados pela tool/RAG e solicitados pelo usuário.\nNão ofereça espontaneamente outras ações ou detalhamentos.\nSe uma tool retornar BLOCKED, OUT_OF_SCOPE, NOT_ALLOWED, FAILED ou outro resultado terminal, explique somente o motivo retornado, não declare sucesso, não invente alternativa e encerre a resposta.", ), mcp_results=tool_context, rag_context=rag_context, diff --git a/Tuning-Performance/Route_Stickness/templates/agent_template_backend/app/agents/orders_agent.py b/Tuning-Performance/Route_Stickness/templates/agent_template_backend/app/agents/orders_agent.py index f557bed..b793c26 100644 --- a/Tuning-Performance/Route_Stickness/templates/agent_template_backend/app/agents/orders_agent.py +++ b/Tuning-Performance/Route_Stickness/templates/agent_template_backend/app/agents/orders_agent.py @@ -95,7 +95,7 @@ class OrdersAgent(AgentRuntimeMixin): state, system_prompt=apply_agent_profile_prompt( state, - "Você é um agente de pedidos de varejo. Use dados de tools quando disponíveis.", + "Você é um agente de pedidos de varejo.\n\nUse dados de tools/MCP e RAG autorizados como fonte de verdade e responda somente à solicitação atual.\nNunca exponha identificadores técnicos ou de identidade presentes no estado, contexto ou MCP, incluindo customer_key, contract_key, account_key, resource_key, session_key, customer_id, document, message_id, ura_call_id ou telefone completo.\nNão transforme nomes internos de campos em rótulos para o cliente.\nNão declare sucesso, alteração, troca, cancelamento ou qualquer mutação se a tool não tiver confirmado a execução.\nNão acrescente canais, procedimentos, ofertas ou próximos passos não solicitados.\nSe uma tool retornar BLOCKED, OUT_OF_SCOPE, NOT_ALLOWED, FAILED ou outro resultado terminal, explique somente o motivo retornado, não invente alternativa e encerre a resposta.", ), mcp_results=tool_context, rag_context=rag_context, diff --git a/Tuning-Performance/Route_Stickness/templates/agent_template_backend/app/agents/product_agent.py b/Tuning-Performance/Route_Stickness/templates/agent_template_backend/app/agents/product_agent.py index 34433f5..998dad6 100644 --- a/Tuning-Performance/Route_Stickness/templates/agent_template_backend/app/agents/product_agent.py +++ b/Tuning-Performance/Route_Stickness/templates/agent_template_backend/app/agents/product_agent.py @@ -95,7 +95,7 @@ class ProductAgent(AgentRuntimeMixin): state, system_prompt=apply_agent_profile_prompt( state, - "Você é um agente especialista em produtos, planos e serviços. Explique sem fazer oferta proativa e sem executar ações sem confirmação. Use dados MCP quando disponíveis.", + "Você é um agente especialista em produtos, planos e serviços.\n\nUse dados de tools/MCP e RAG autorizados como fonte de verdade e responda somente à solicitação atual.\nNunca exponha identificadores técnicos ou de identidade presentes no estado, contexto ou MCP, incluindo customer_key, contract_key, account_key, resource_key, session_key, customer_id, document, message_id, ura_call_id ou MSISDN/telefone completo.\nNão transforme nomes internos de campos em rótulos para o cliente.\nEm consultas meramente informativas, não exponha flags ou capacidades transacionais internas como can.cancel e não informe espontaneamente que algo pode ser cancelado, alterado, contratado, removido ou trocado. Só mencione capacidade transacional quando o usuário tiver solicitado essa ação.\nNão faça oferta proativa e não execute nem simule mutações sem a confirmação exigida pelo framework.\nNão acrescente canais, procedimentos ou próximos passos não solicitados.\nSe uma tool retornar BLOCKED, OUT_OF_SCOPE, NOT_ALLOWED, FAILED ou outro resultado terminal, explique somente o motivo retornado, não declare sucesso, não invente alternativa e encerre a resposta.", ), mcp_results=tool_context, rag_context=rag_context, diff --git a/Tuning-Performance/Route_Stickness/templates/agent_template_backend/app/agents/support_agent.py b/Tuning-Performance/Route_Stickness/templates/agent_template_backend/app/agents/support_agent.py index b4f0244..b15a0e4 100644 --- a/Tuning-Performance/Route_Stickness/templates/agent_template_backend/app/agents/support_agent.py +++ b/Tuning-Performance/Route_Stickness/templates/agent_template_backend/app/agents/support_agent.py @@ -95,7 +95,7 @@ class SupportAgent(AgentRuntimeMixin): state, system_prompt=apply_agent_profile_prompt( state, - "Você é um agente de suporte de varejo para troca, devolução e garantia.", + "Você é um agente de suporte de varejo para troca, devolução e garantia.\n\nUse dados de tools/MCP e RAG autorizados como fonte de verdade e responda somente à solicitação atual.\nNunca exponha identificadores técnicos ou de identidade presentes no estado, contexto ou MCP, incluindo customer_key, contract_key, account_key, resource_key, session_key, customer_id, document, message_id, ura_call_id ou telefone completo.\nNão transforme nomes internos de campos em rótulos para o cliente.\nNão declare sucesso nem simule troca, devolução, garantia ou outra mutação se a tool não tiver confirmado a execução.\nNão acrescente canais, procedimentos, ofertas ou próximos passos não solicitados.\nSe uma tool retornar BLOCKED, OUT_OF_SCOPE, NOT_ALLOWED, FAILED ou outro resultado terminal, explique somente o motivo retornado, não invente alternativa e encerre a resposta.", ), mcp_results=tool_context, rag_context=rag_context, diff --git a/Tuning-Performance/Route_Stickness/templates/agent_template_backend/app/examples/__pycache__/__init__.cpython-313.pyc b/Tuning-Performance/Route_Stickness/templates/agent_template_backend/app/examples/__pycache__/__init__.cpython-313.pyc new file mode 100644 index 0000000000000000000000000000000000000000..fda75cab82e4e8c4326005be46f0242da646f601 GIT binary patch literal 290 zcmXv}K}rNM5KL5b5f*$xu6uC%q#%eluOhDZrcHW=IGbchGPrv6?#)N|rMdb6VLo62 zGj-{zhOVxf*6VXo;4i*jugm_il;+#G$t{efM-4@ntTLkh|SmFtEw zs~6H8d!yKAj(xO=w+|aRo*|l`5r4!~UB^#wK7*l5K+O%lh1dbLdtdYu)I#Q!J=`F0@U}w2Py$M0iyLbBX0Zmadqp08TNb^ VPfMm+H`S_t$5P5sT*Z?j{sH&aS?2%% literal 0 HcmV?d00001 diff --git a/Tuning-Performance/Route_Stickness/templates/agent_template_backend/app/examples/__pycache__/grl_examples.cpython-313.pyc b/Tuning-Performance/Route_Stickness/templates/agent_template_backend/app/examples/__pycache__/grl_examples.cpython-313.pyc new file mode 100644 index 0000000000000000000000000000000000000000..9d7cc49ed36946faec41310d7c3b108e2fefd6e3 GIT binary patch literal 1872 zcmdUvO>7%Q6o6;FKepFNNEmjF9;sCjEK}t>}%9TT^9BR!8i3`0s3KfDAZ`QFRf~rW|7-`?nyti-O z%zV4Y!^0+m5sZFw?`I96U!~I@Nd%l@55xmxBZh3nPQ9nRn_?*o*=jvyYjw4*)l>5+ z9dc~FuGt1WX*)A-+Sw^|Ph6yieL;i*m~&*4wrBi>3+EVkBgQ zlOVztSp(IJH)6~@hW!>VT8nK+YB2m#@>aS0aSuGz*xj9V5CNr1T( zVur0X-10rV|K0wNgj;URBii;q#~y^C4sJmEq-Z{Yy`q95)Jm`}GIW{4T7(ImM>rxP zD|h9%)FZ-R1alfl9mOoDx^Pp2kp=53c#b219xE9shcO+ zuPN6~X1xmtDm^1#?dLxuuALLt2l3RBY8ype^0J`51B9(Ye{0GEwW<%n`VEvpRsEK_ zq7<@Kk-qbWy;!@uC`Mfxz(H{w`805vWL=n?a4sF+6WIu^A&8`zNlqH9g3g9uXKYxC z5h)BQ(jfjCBKI-iMtHHoT3d?9y0jhA0Ip~&B{Gs32LeKEkZ4O|^5mIh{j>s?a~2Ho zb*UXhB@aiqgjW_EiAt&0!T=qIx_;@yIPinUjSmQ0p$zD8NvTHTh&XoSyUhUhQi|j! z02uI-0)5|E#%_}YUI~X`so!}C8g%+jF&u`{8@(*tx=1ZN) z%bVGa?8EDalQ%l~+0OXPQO?Mk-4Qf)r8|alGhJlnj6aa68^==o$uGiUUskNjb!Bf> zsa(_c<_xg^L9+bcBqR$k{*NTv>7rq0?Cd!#n^mEf%kxZL!Wk}wzTBd2vtXQ=Kc!6= z*p=L~=j7X?Qplramp}|iWaHq8iGNd&RA(~~&CC2Ih%*EX|7QX^Bcbw$CD0~) zZ=qudq23NNuePZdx5(>k4(8-vjK?6ls-h@IDP7T?jv!^CYvdH;2epepZNIfUw(IUr z?o<=^;G<7^+H3T5EBsxib!UbYDAU#nZ{;e G<-Y;0M!n?# literal 0 HcmV?d00001 diff --git a/Tuning-Performance/Route_Stickness/templates/agent_template_backend/app/examples/__pycache__/ic_examples.cpython-313.pyc b/Tuning-Performance/Route_Stickness/templates/agent_template_backend/app/examples/__pycache__/ic_examples.cpython-313.pyc new file mode 100644 index 0000000000000000000000000000000000000000..e1fe21e2d2a556f48cea24f30f4e36eee95326dc GIT binary patch literal 1828 zcmdUv&2Jk;6u@V_>$Sa3s(jHVj%bE9g1SoV11(ilKw8`)3{?u=7=&b4#_O@O@p{*t z*$puVgh1lRt%sb_Be{W)kb5Fg|AC-L)Y=mgr`{Ze3c-mtYdcgC6^I)n?faPb-p=fs z-|X@DxQ1Z36JKpq6@-2f&S*ptaE?C$aTghgAwx1^Z%J>)SPUaWuEY$bB3G13>`E*S zIYzvq7^;!Dk~ESTw4t#0-{hnqN2{n&o@S(@yhJ0B9SgpPSKQp9t+wNFT%)*Hz{|Mk z)0S`wp6fHup*c+}7C2_K%_yg?Pg{p~q!@1fdf;T-SUmoQ@C9eEKJbn_7 z8EQ^35=L@GE&?L!u)9s^uDlu_gVh@-iB{v+3078N0!@|{VoV4X#2;z8MSva3 zbGEfBg(=HxwLKR~c4J|JwrnW1Lb*Zxtjqv)#00WYDHkop7>8fxTdtq45ufBqeZ>@q zn;)!ta@eM4+4;4=wcW<@+muCAxfacryuhcX0U$M9*nS?cZ98!KeE5QqZ&r!bq;4%w z+U@*k$9dZ_M|Q5=3FqkG8kltgv=9?o!~@4CHNs|KtK#c91@Q=dhI-o6LoM^8mgyzW z|D0La$!=#47GFBdTzi-)b+7)ga(`v7a(KPen>)WVw>@|7`r%x@H~Z{PYCCoB^5N`q zFSB@*il?;x7@EfYNtB-Nqf}b`4W;7hu@JxWDOl-qeL>Gk`_D=G3(Ecl73?rgtmw#G zxCUX&Yg(eIqmcq5Lb?aW{|)J~3{c1a9n_NmwO-I~3#1FT%EcQx6W@M{&}{tF1bap# zofTqSh%-V=fB?Avg7YMai#Z?^vuQBGvm-u;MLa==HP155Q1v@)xG+rI zvrwtomLJO8XA#VyQuRD1+WIa!h6FVD#^lQ_uNFA;Rfb_s{N8vAL|>L9=_sa1%HuI4 zo$ITbq<(Gn5vcBBm+uw2TlaI3d+_f21N~w3R}t=K(vbRMAA$PD?-ur^yKj8^Y2+TP Ty*JPwkb$mmJQite0apAIpem|= literal 0 HcmV?d00001 diff --git a/Tuning-Performance/Route_Stickness/templates/agent_template_backend/app/examples/__pycache__/mcp_examples.cpython-313.pyc b/Tuning-Performance/Route_Stickness/templates/agent_template_backend/app/examples/__pycache__/mcp_examples.cpython-313.pyc new file mode 100644 index 0000000000000000000000000000000000000000..b69294dc64f9baa5110e0ae1a4cbe04a5a384330 GIT binary patch literal 1970 zcmb_dO>7%Q6rT0|*j_tsVn-qC0^KwLb)m5lZAAkVDN0%?B}qfJxj>}VWOtHoV(+-K z>o%#16v2TT5{C+UYAP<}P$`_~ktjX%=*S0KD-M-7_2ww55aPlc$4djMk&swv-n^fg zdEdNw@9jZPkBZ>)dcR)%Lqh0RE<|6t!yH@&<_r)d2RlTB* zuMjVouX=%7CNu83>*=ez_w@?({i>^5HZ7Hi9av?%0=yTH_286oS}$W?Cw@S5%&u46 z8&oe-KVVp=Y6UxN_j{^WFo^awT*eMxyIv{nKD6Bccue(x(vrn!H6TpCUd5h6b&uG@ z_jm6zmlo7#JQRiyisRl!m^!jLOwc8tup5MhvLE1pgvqwm!(|f2D|n+su@fqc1XbqQ zJV4RMqx&U{gYz+jhLH{tUWm;Lk@>}J3gWnH~;W!jn;pPs%r2`NfE z>;+&B6PQ;UaE8QqMzS7GGMsRTx6))CLzxo400jpHkhE#JLOs|M#yjN~_AXU@*8`VP zK^idz`H8|_%G?##!==b@D+6ebB8ky8Lw=cKmV*NfDHK--cp_yNFxsJH<5DS%gANA) zGvW+d7GgZpn8FE%%o3dNyYRB}tEIr_YW?sFzbcl!py=QL7xD6#b(6BS;$aMy8PqJ7 zEo!^Pt5whSRz~LtTc)gxJ)0Egd4I6Xz_r)-ZHobKU{LaY=YUAImax4>Jg0~&m0}dX zB5zocP^fH#Ida$ltxiwk9gXDyDR0RBX(;(;XcIO22ENt4(Q3y>>wSer-_-USKN&w7 zkEZMIPHkR(s%9H%eoxIe6R$qak2JN{?`e0ntq{}f0|6a-;ECJEB>G!kBEDMLc` z!I>6<>Ctd|`q_DMrZ#6jIltqz7%Q6o6;F>$SbML#Ruro&HQofo!4PK$})k0m+Ig@grQ6ZIF;Gmg(-q-NfE? zX4Yvf0YY%##;u2(Qf}mcL~rKQM!j%B3d*5oPDq@3a}_ECC*G{R6jfAk;KE4z=DnG> zZ{EE5X7-Ck13?QWzgYcIL+EE|B&{%3_OF0)9odK>Td`AbDQ~7&3L{%>q-?FBHnc|S zOezgNcDkY2dLwOT;LF;%GX>kIpjD0Of8(16-^9P2BcNR7xC4Qt*x}etJn*{3!;#S;?+A} zV%qjWlhNkpUV2dm1Z5s4Luae_0*@%iG+DbH@`#Z(rW>#%U^oJ4Ta&Km6rgHz6>;d>$n#Ueo@)hubkae-#)tO)yJ z6H+_@Lg-NHWvH|st-+xqTe;2LjgxzaP7S7x3@XnK$}{(inVd14M5W`yr%?Xz z5asjwuPC3^_oeuaAAt2ftsSqupzO>jHB;L;p@S}paJj=SbEy+RbzE8Cq~$<~X&->{ z|DzpPhgb1mvVNM$m-i8N0k}tCE+o~eL$R1FDJw~FP>LxKruG*`r{!pjr!1?ala)ac zQwbTPYv2S8KpL> z?ab()n^}=@91oawgdX)ea95ao(1ZpLawJrErG@GTQ4DmP`8L{zc{JK$_LX+%bzAf` z_B@QqH;;b^VyG&LazB+;v9{xNHl*6A~jOI?Bu^ literal 0 HcmV?d00001 diff --git a/Tuning-Performance/Route_Stickness/templates/agent_template_backend/app/examples/__pycache__/observer_examples.cpython-313.pyc b/Tuning-Performance/Route_Stickness/templates/agent_template_backend/app/examples/__pycache__/observer_examples.cpython-313.pyc new file mode 100644 index 0000000000000000000000000000000000000000..3a2600e2de233774a88adf295e1850d175a3b05d GIT binary patch literal 1426 zcmbtUO>Epm6rQoYUaymiZUU|HgX9VdHEQh=!cRp($}X$2CEbnI4XR)z%e5z4H@hA) z;|**NsDdj(;!ttsMo+XSawP4A6Ka%0R&zq))Z0c;g}Cu1U5hGe;lPvT`Mo#uy?OJ! z8SfuCVj_^_=(pG3Q4#t>I=Sd$V}B8hTgXEUdDv4v!WR{$Sjbb`il?>Jw$@e_l>)5s z3ZA~Gd&OCFU1NogZX5jo!Y#u4J!+-w{tsCkQY)fX^C~B7gD@+kETt^S;tlGU<|-!^ z;Tf?4_E{f7Fb%+vb^{B*X&ePs8nD2sS5I4wX4N9rh1RlTK9q&pSg1?MKp1qKTNHQ} zWJKtUWPO%2LPahcOA)?b!`Q!u5qb$(aK2UC0{gId_|0+jJ$!0B8I=(rp0QrZ*C)y< zY5}K*#Z#}GcnSGRi}2Pc4=j~ z={IT@n$>z!7(s_58O+)WD?yD+-q;&u@Z*6SdC6A)$tX%Jh`WABBVubp?T}0qNiT+tLtz{k3C*nz>jG4h z#mHtHB;m5vmSu@=++LEoQIG|0uy)S>oU(QI@e$To&?D0KX&Aeg`$?R1&a4o&Mp-XN zLgKb)KO?>euVg&|QrwKd5#bK=af00UuLj{dNg_8$Q#U8V&57{yh?5S)FCF%CetF>j M`tl~e@+$=jZw_yU~) z=P#u95QsnL`D+&AHn&sSziB+87MRx&?pc#<)#p#JPj)-vTvk z1#3@+lcOs&90#jy^Y+EQcHWRJ8NS^hj0e$WYdHiEHho9JVR`UyEU0YRRzQ6Zt_bYU lROn922#DHhL45DW>1AhJHFUi9&#_o49uoYmlu~{b=^xl1M05ZE literal 0 HcmV?d00001 diff --git a/Tuning-Performance/Route_Stickness/templates/agent_template_backend/app/observability/__pycache__/telemetry_observer.cpython-313.pyc b/Tuning-Performance/Route_Stickness/templates/agent_template_backend/app/observability/__pycache__/telemetry_observer.cpython-313.pyc new file mode 100644 index 0000000000000000000000000000000000000000..7c9b983bf311170a26ac8991f2b190193daea29d GIT binary patch literal 4844 zcmdTIOKcR$wW_=4KlT`ZFeV1Kv11s6XB>Wu(Xy;D77K;}xjh8r4W0H(&$!LF+f?_! z4#@#+q{vZ{4MakqT*69G5H}z9kP|49kK=fyv07||loK}-Bgmp0@?Q0f!N!5TZBkah zdG+eO`n-C-@=9G@m_V}{zL*-067mo1)SBcWbY%*V+e9G>9U-SEqcYi!Jz+#RB{1QX z$V3_Y;)rz0$9#ZC6lp7&l9(SbAIAcK`8gI;qDp{cp)F(wQG#2E5;`DwYq4-X9Itzd zoj7$PnrT{&<`|Y~#|1Z-)g0Y1rgb-n@VaH{z$6Zur404NImB&?gwT~6fZQhIt7B<$ zgzn-jgk)hs*eE?v9UTRU_3c2FV3IT$^{pQzpn#fmZB`9tO_Od=MVi!;eL^>hODQ*y zPK~6_{x}tvUWq4%60fAe6N3O#XAwU!dOE>EF!=+~6>W#PJ^;py8@3&dIrcTfnS4N9 zDPv`I8}}-^zfVq^P7-vXCAHjudd*^&lUiOk9W}?aX&w8jl`)cIMbj|zedlzRv)Hs| zX7uE!RdjS!ag5AmQ@8D;qfgHiK&f_hf?8jl&@z{GGn>?AW|G!~t+T7zgi$b@5{MM^ zY29HZ)uZbyF;j9IRTI}J7}s^x$f&qm)(pF?gU>z;;0Addsh@Q!G5Ka`G16Iy>|BWK zT#UqT9A9c`y>s-|(Q?23A)vGTbs;5pJHL8e9>M>H74m;IVPa8h`{*EX@0= zQ<|x|xo0{d^|E1RRd8U|35@OV*@FOXkfp$;N}zoq(0*5~1o{>NeM_;X*R=DMK=(qR zdnwkuAuZDADHUc~Z5TG8)xzedgi(bsL7_}k1STn>A|Q zQ84UD*_mWkF+V8}np&X*G15Ng4d_gs)R~@mJx~*Y_$p6pC3!**XDl;kp;-gH6|OT4ZG&Tu#bE}4>SErQMVnL%O}EaY+c#`JNDaF zk!AEuHJ=l>A%Zw}S2W+-6J4lXxAm%7mZK9*)<32aUonj2)GPj6o|2R0V zD@|D066=F)f#FLSsN+#r${HC5syE%q>N%}gaJU%5>%kmwjbS0_ibW^mh78-{rJ3W| zb_a~`Fz<$Ny#y?OT{T|%Q}C~o6LgKO~S`G=%W8;;xg zPTxS5{V4ud08ha)o;Q$&=9?$(oVm*uV>@Q0$FZiHpWI2^6Bc7#v(i#9`n%Y#Vt0La zuYVovebUwiK2+Jf`<`?^@@3?4Tjw9!|Iq%Y$@_&b3yW?0Ds4v=+Kw!?9bIbPvb3fB zS;W67JnLJomqLe^8aLlb+)7j$dlnjd?p^;&X@2YC(Xn!4Pq{H&iKffZ^m33iw9H1I zg-G3b`me{aEh|I_9e%P_Zn1Ho5*_$kbO6%bY;-vQ9RIdIfs=fG%s2t z^w>e^VZVg7&MW4yIUnOG$g@_AhoE`f6wSv_AhCfbzvl<)3C3PV1|+2MDh6xScjr~E7+_Oyo)ZZ0jG%T*-aN3y z{a$>-bmUR%0dxIKcZ$q(r4&5m8ANmv5A!(3aG2Zls}_u=iWjRcCCzrN$ zKC6SyljhcC9}@kfac6C~Y1eWDX;HH22g}F>!r?71Vt~EaOMNlhwD+tvGR2hD}D|$_hpt5pBxKB_P6OjWWk(ccJ@T!3Vl5thze+3wKMs9eW z*yRULBZhT>7rKHUdbu(|&prrXS)`PHLv}1n5|v&?3ElM#+5Fru(DU?pSfC$O SL4Y>BY);TT{U<@l=lu_63hqwcfB>XI=(?F9ktr#sBT>!5VBzM+M@R=VB0l1pkFOmYk1Ik&DSa2 zb*dxuyj=(5tO79B1b~z7dDuR0UC}pqK{LK<`q3}B{KZnrFLC<4bND$wdPyi@^B>=< BVY~nU literal 0 HcmV?d00001 diff --git a/Tuning-Performance/Route_Stickness/templates/agent_template_backend/app/presentation/__pycache__/tool_renderers.cpython-313.pyc b/Tuning-Performance/Route_Stickness/templates/agent_template_backend/app/presentation/__pycache__/tool_renderers.cpython-313.pyc index 567eb4dcb26331acc08869aa04106d30e73d78d5..8c88b043079575f95b21ed4ce2bd9fae93142177 100644 GIT binary patch delta 1859 zcmZ`(T}%{L6u!gk?Cjs{E-ou{5x6ctvVyF*intJK>n{js*sLa^G2`w?24QAz_~zbo zzH`2F&)hTj!qZXjQ%Q0mc&u;cMt=6+^WNsX??%ToGn$r7IVzvuLx14@tZ@K?M~Hix z27DhSxFqjIiLw|UX(!_EcB;0T~2H>f6Vb*0M? z>JNd*MW66NPNF}FQOR2>Lvyd$>wV8Ho}?Q@pkkRto`y(IY7?Ln4pTvU9d*K`(r#bU z4ch(}&gUtm@uC+`*Z(0xZiFF8^RrgSO^~G6AHF=XfzCVXCmq|sSBl4IsQeifcqMBh z5PuH}15cu2&{y)Wzt@=!C}D3vkzh6t-a$o6D@2`;v7wJCnyKKFJeJW7oK~==3@}+)=<0bjC8u?w7}#9ClhV|bZbXmw^xzDbSULl1I?l-B zqq>~N{rivO=8R6T@}@GD8P)Nap&Dte)s@N`CdiYsYPuDt^;DLXf)#u&Yp9xHOd9xt zGHyh$w)}|>m0eWEu%QqT(KGTe=o?tpan{H#e@s-p&1G>z6C2Oq14R$iY-CGy$1V3o zc~mE7P2H47E!RawOQ}pux9o-qM>7Ui{U;a$7a4Ip*nr6v5ju6JY`{Vjo)ga_;yCL8 zdqOp{^75xpS)6t|L+wIQU_vN{u8KXTq8V|#TGoYsVZ&f?IO4SUVa2rUawY@qr_QK zdXx|M?*I$C3C7zXJcWMqAb^_-NeiRGl7InS=Cg9Xoq+1{Dnxhr{3Bkam6uZOON z=KJ#Hk*VH-6qr3Vb86m^mo`rwqHnqC<6`-IC@B=2ixLB5KaD+Pb;BY)$4 zf8(vxVoScM}L6$h#d zFErj9S!} z*bYE{b+!xLusE<(@7m2l$wO|QkeUpgwe?B3}W=QFD&%IQl;Pe_HZ#O`tjjn z%Zo>3eP8va)s#78n4}fIrj4Ij`wjyvy!bJS#D3ULxPXH%;{jb$B4wnXYW~6Qmq|0d zXZmc#=Eib#kLl^`sIr$NU<*Tpj5hkWzpA!@+r2Wtxw-JlrXW|nvfahme-GKXV;o^; F{0Eh+$~FK1 delta 786 zcmZ`%&ubGw6y8a8lbAHy*8HexO*^Kk5?YDUsx&RZVq1S8MOvyzDa()yB{kU%Gm}Eo z3VM;81RcEi2MG4mQV%_g2aoY41L8q?7c7Y4!8fVLx-j2%XxVQYOTJ|U=pVPTM$TMNXr-B0#q&fo7{QQ>H>!e^NddDUoO%ly`7?OI;wD6r zhcY8)fONy+nmjQ+NA1>DtJWU4w42-w9iVok&^8PEW8nuVqyk((VlG>ep=sq`qe2Bp zy-wY-GS|I|n+q{r8cS$MYUtB20HCZoVS=->`a@cNjf`3upfTCq^%|x2ce=j$P+C6k z9v)PY4N~=(BRoN>&7S)@z@4Cg7qjwluz$qQA2o8m1!XjYw*_^10XKb9SRo7r3~GZR z0QoVPxyLZDT-S+ZWwkO5psZ@erCeDZ7iCoht#M^DxEE!#>>S6Ye#!Zs%hm*(Ik&&v za}7b|?|S_RW#z%?EtAE-bs}~b73I^|=6PL-@)LLSKW*vwUzIq1-I@XEq@?keffTTk z@uD4$MA o?m&oO@rwZ8p)2T%kvTMyhsLd=fQkB#Y=owcLbBc$H}y6D0!;kD(f|Me diff --git a/Tuning-Performance/Route_Stickness/templates/agent_template_backend/app/presentation/tool_renderers.py b/Tuning-Performance/Route_Stickness/templates/agent_template_backend/app/presentation/tool_renderers.py index f77c47a..cb44202 100644 --- a/Tuning-Performance/Route_Stickness/templates/agent_template_backend/app/presentation/tool_renderers.py +++ b/Tuning-Performance/Route_Stickness/templates/agent_template_backend/app/presentation/tool_renderers.py @@ -13,7 +13,42 @@ def _money_brl(value: Any) -> str: def render_telecom_invoice(*, tool_name: str, result: dict[str, Any], state: dict[str, Any], agent_label: str) -> str | None: - return f"[{agent_label}] Fatura consultada: {result}." + """Renderiza somente campos de negócio seguros da fatura. + + Identificadores técnicos/PII presentes no payload MCP (por exemplo msisdn, + customer_id, document e business keys) não devem ser propagados ao usuário. + """ + lines = [f"[{agent_label}] Dados da sua fatura:"] + total = result.get("valor_total") + vencimento = result.get("vencimento") + status = result.get("status") + if total is not None: + lines.append(f"Valor total: R$ {_money_brl(total)}.") + if vencimento not in (None, ""): + lines.append(f"Vencimento: {vencimento}.") + if status not in (None, ""): + lines.append(f"Situação: {status}.") + + items = result.get("itens") or [] + rendered_items: list[str] = [] + if isinstance(items, list): + for item in items: + if not isinstance(item, dict): + continue + description = item.get("descricao") or item.get("nome") + value = item.get("valor") + if description in (None, ""): + continue + if value is None: + rendered_items.append(str(description)) + else: + rendered_items.append(f"{description}: R$ {_money_brl(value)}") + if rendered_items: + lines.append("Itens: " + "; ".join(rendered_items) + ".") + + # Se não houver nenhum campo de negócio seguro além do cabeçalho, deixe a + # composição pela LLM/guardrails em vez de despejar o payload bruto. + return " ".join(lines) if len(lines) > 1 else None def render_telecom_plan(*, tool_name: str, result: dict[str, Any], state: dict[str, Any], agent_label: str) -> str | None: diff --git a/Tuning-Performance/Route_Stickness/templates/agent_template_backend/app/workflows/__pycache__/agent_graph.cpython-313.pyc b/Tuning-Performance/Route_Stickness/templates/agent_template_backend/app/workflows/__pycache__/agent_graph.cpython-313.pyc new file mode 100644 index 0000000000000000000000000000000000000000..91f49fc4b49e4e6a6108154d1780f8b1ba2dc60e GIT binary patch literal 56845 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 S dict: + """Monta o contexto operacional do turno para os guardrails de saída. + + Mantém evidências/protocolos necessários aos rails, mas impede que uma + transação encerrada ou semanticamente interrompida governe o novo turno. + O histórico completo permanece no state/checkpoint para auditoria. + """ + ctx = dict(state.get("context", {}) or {}) + mcp_results = state.get("mcp_results") or [] + ctx["evidence"] = mcp_results or ctx.get("evidence") + ctx["tool_result"] = mcp_results or ctx.get("tool_result") + ctx["tool_executed"] = any(isinstance(r, dict) and r.get("ok") for r in mcp_results) + + history = list(state.get("history") or []) + current_user_text = str(state.get("user_text") or "").strip() + if current_user_text: + if ( + not history + or not isinstance(history[-1], dict) + or str(history[-1].get("content") or "") != current_user_text + or str(history[-1].get("role") or "") != "user" + ): + history.append({"role": "user", "content": current_user_text}) + + route_decision = state.get("route_decision") or {} + route_metadata = route_decision.get("metadata") if isinstance(route_decision, dict) else {} + route_metadata = route_metadata if isinstance(route_metadata, dict) else {} + pre_validation = state.get("transaction_pre_validation") or {} + pre_validation = pre_validation if isinstance(pre_validation, dict) else {} + tx_status = str( + state.get("transaction_status") or pre_validation.get("status") or "" + ).strip().upper() + terminal_tx = bool(pre_validation.get("terminal")) or tx_status in { + "COMPLETED", "FAILED", "CANCELLED", "BLOCKED", "OUT_OF_SCOPE" + } + semantic_intent_shift = ( + str(route_metadata.get("transaction_interruption") or "").strip().lower() + == "intent_shift" + ) + stickiness_intent_shift = bool(route_metadata.get("route_stickiness_preempted")) + should_isolate_history = semantic_intent_shift or (terminal_tx and stickiness_intent_shift) + + current_route = str( + state.get("route") + or (route_decision.get("route") if isinstance(route_decision, dict) else "") + or "" + ).strip() + current_intent = str( + state.get("intent") + or (route_decision.get("intent") if isinstance(route_decision, dict) else "") + or "" + ).strip() + ctx["current_user_message"] = current_user_text + ctx["current_route"] = current_route + ctx["current_intent"] = current_intent + + if should_isolate_history: + operational_history = ( + [{"role": "user", "content": current_user_text}] + if current_user_text else [] + ) + ctx["historical_transaction_ignored"] = True + ctx["historical_transaction_status"] = tx_status or ( + "INTERRUPTED" if semantic_intent_shift else "TERMINAL" + ) + if semantic_intent_shift: + ctx["historical_transaction_interruption"] = "intent_shift" + for stale_key in ( + "transaction_pre_validation", + "transaction_status", + "active_transaction", + "transaction", + ): + ctx.pop(stale_key, None) + else: + operational_history = history + + ctx["conversation_history"] = operational_history + ctx["history_texts"] = [ + str(item.get("content") or "") + for item in operational_history + if isinstance(item, dict) and item.get("content") not in (None, "") + ] + + protocols: list[str] = [] + seen: set[str] = set() + protocol_keys = { + "protocol_number", "protocolo_id", "interactionProtocol", + "protocolNumber", "finalizacao_protocol", + } + + def walk(value): + if isinstance(value, dict): + for key, item in value.items(): + if key in protocol_keys and item not in (None, ""): + text = str(item).strip() + if text and text not in seen: + seen.add(text) + protocols.append(text) + elif isinstance(item, (dict, list, tuple)): + walk(item) + elif isinstance(value, (list, tuple)): + for item in value: + walk(item) + + walk(mcp_results) + if protocols: + ctx["expected_protocols"] = protocols + ctx["requer_protocolo"] = True + ctx.setdefault("tipo_fluxo", "ajuste") + return ctx + async def output_supervisor(self, state): """Valida a resposta candidata com o OutputSupervisor corporativo. @@ -507,15 +620,15 @@ class AgentWorkflow: } candidate = state.get("answer") or "" - context = { - **(state.get("context") or {}), + context = self._output_guardrail_context(state) + context.update({ "tenant_id": state.get("tenant_id"), "agent_id": state.get("agent_id"), "session_id": state.get("conversation_key") or state.get("session_id"), "route": state.get("route"), "intent": state.get("intent"), "supervisor_attempt": int(state.get("supervisor_attempt", 0)), - } + }) async with self.telemetry.span( "workflow.output_supervisor", session_id=state.get("conversation_key") or state.get("session_id"), @@ -601,7 +714,7 @@ class AgentWorkflow: component="workflow.output_guardrails.start", ) final, decisions = await self.guardrails.run_output( - state["answer"], state.get("context", {}) + state["answer"], self._output_guardrail_context(state) ) for _decision in decisions: await self.guardrail_telemetry.evaluated("output", _decision) diff --git a/Tuning-Performance/Route_Stickness/templates/agent_template_backend_day_zero/app/__pycache__/__init__.cpython-313.pyc b/Tuning-Performance/Route_Stickness/templates/agent_template_backend_day_zero/app/__pycache__/__init__.cpython-313.pyc new file mode 100644 index 0000000000000000000000000000000000000000..f0d4c0e1f839b61c0dc378c178c33cff8aaeef62 GIT binary patch literal 228 zcmXwzO$x#=5Jnq+Km@^SxX@V(;t@pD{V+Du65AvtO%dI?cjqCzl3Pz8y?_a{-(u!H z28OSl&8A6+oj)&ef8*#QI%r1$UP+!T#O|HAL9jNSJ`d2wgCtKt*&46b6+k%~kC`LQ z(b1*~PK{9}U+&pu)@d>+!@)M5@#s}r7_MvZtgDhd*WH8O@l0vKMxvw}-q~58ssco1 elt)}ux6fpwt!zr(x^d_fJJ%6@Lm`A42KobHheCY- literal 0 HcmV?d00001 diff --git a/Tuning-Performance/Route_Stickness/templates/agent_template_backend_day_zero/app/__pycache__/main.cpython-313.pyc b/Tuning-Performance/Route_Stickness/templates/agent_template_backend_day_zero/app/__pycache__/main.cpython-313.pyc new file mode 100644 index 0000000000000000000000000000000000000000..ca99d56864d547d26886899f3cf9e1fdd60fb0fc GIT binary patch literal 31125 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 literal 0 HcmV?d00001 diff --git a/Tuning-Performance/Route_Stickness/templates/agent_template_backend_day_zero/app/__pycache__/mcp_gateway_client_factory.cpython-313.pyc b/Tuning-Performance/Route_Stickness/templates/agent_template_backend_day_zero/app/__pycache__/mcp_gateway_client_factory.cpython-313.pyc new file mode 100644 index 0000000000000000000000000000000000000000..ffaf183b08b08c73dfce3b274e9f806a335b8a69 GIT binary patch literal 1076 zcmah|&1(}u6rcUbZqlzb#A@1jC`F3Fnk{ImEh?mGEN$9UvMC}x4Aadd-8R_?vlBy# z2k|0!P!NhBf>*tH^yr@u$)PgTQx)`93ErJ;5^43&2Rr-To8P?mdvD&f2M7Cr5HkFH z`-cR;p=b0&?kG|_E|fiB0#nL>Wr<4To-Su(DvQ68QI=Jz3ZKtZ$H2BqeI+@j{qzpU zB;Jo4hcLu!;<#C153i=~Eh2{NsF5n$*kP6j?1@K40YGXG2r_$Mqvr>?E}6d$p-c!u zrkv>R9N zc0HP@_cHe4nf_Vj5{Lz|JS1Zb_J6fgD$p+Q*dKGE)$n)CCsq%ko(G{jww||*<7(5_8zpo4)8sr;xMCt7&1_C z7S;*fF;Gd&04!2e!JZ9?WgGdLV>_j*_b@FIT0xG5jhx7ap~-A($HA^^FkGpY#TdEW z06iOSB1?cmY)0)41ep79)!ZLMqiFLqf^azx)r*6 zFf{zaer7i#S6V|;`$N}1s0WegoB6j(ua}yWsZaUV#pPBc^GjC;v?HMUG5Z}LA&wMDlD>k8LlF2562CRS)M57rUS9+9 literal 0 HcmV?d00001 diff --git a/Tuning-Performance/Route_Stickness/templates/agent_template_backend_day_zero/app/__pycache__/state.cpython-313.pyc b/Tuning-Performance/Route_Stickness/templates/agent_template_backend_day_zero/app/__pycache__/state.cpython-313.pyc new file mode 100644 index 0000000000000000000000000000000000000000..8a0915dce83d473f91a10639954830ddc9eadc85 GIT binary patch literal 2624 zcmZ`)O-~y~7+%|pF&_qOW3c%M0fzuhh?|f~iBv_3l2&b^(yE(74=AHyckE19?>aMM zh;yhaaj0^s;81C~IXC)q&`Q;6q^gIWa*ITNK;K!fwK@!36^-0WXY>qNn6p3F_%V{bM_6Cuj%^hHLUCI?iQx->d> zsV5(L)V&KanvSCNs8{jQ?3s@uXTx(JTc}$aU@H%>%?+^4hc?A-Aw(m97Grc}K*myN z%k1>HUmXy$9L4nUjBdITdQ`tkh*ZC811hY>ao6LxwHU3(Xd{mMEJim%Gzyh(#xEHEI(%(&B_6L0$_v$+1HP zeM2lnon}kOA?CIOk!k8cPa!A5BeIA|RWF&w4nH7Fj@PJzZ4{k`Ur;Vw)|SJ-BdlAf zw=lC9rgogmW%gyusuRQrZ`p#&Q3n_xuC6K5mfOJ8ks}SWiG=IgT#hN&i!I=NsD*cJ zg8q-lb7B)y0C$yvOl;dS*CdWboqC@sk4-`M2@(wGDh&6SvN0DIEcrfnNUFtU5w26C ztkE4SBd=PN5$hAPNuazX^C63-Yg4lw5tsP}g(U% z_ZfN@9*;2v=OIuSOrv#`D!|denuI-w8s%RgLXiSAZQ@uqk?3m;NT`UA?G=-e&3k+L;8leZ~FzYfX z3Z#YlLVCAcj$E-?IKnohS#5-yO`8I%yzQ!O64pQs(r_6iT$VnvwNX!Zi=TK77!^Iu z{h@7djLQr{4(tLUIf_ujwOSx5B*zhY)xvh*slws+!A#lL z%Rz41*QbNRte5f(FLV6B*O$A2#gea=g0YFiC&BpS;nQHcbSmCY zClhCdHD6!ratb?57LFdhZL99N;*sTTbyD8FW9KZl>g%hjn0W%sSAx<)uY#{%4`%1R zN1cNA&GFAF>Y{IEu2;m@uLY%fMQVP@*O#L2i_z+IGNP_gEPEA?d+Wz=jf$%ItW)Xm z&icvov(impzZrA~Fda_nB7yGo3bVdG8!SdMfx*wt`TAT?UhwsWh{x56s=ZX{JU%U) zny00A+hVsh=G}uo_1o;L-oC%yNXQ`pLbkUzbeR_I zCMYb_F;i0L3PUNioANavnfbE&Rvxf#;RssM_zZk~NF@@9zqRFm)3+0Mj>?_Ya}7Y4 F_aA8{4{!hg literal 0 HcmV?d00001 diff --git a/Tuning-Performance/Route_Stickness/templates/agent_template_backend_day_zero/app/agents/__pycache__/billing_agent.cpython-313.pyc b/Tuning-Performance/Route_Stickness/templates/agent_template_backend_day_zero/app/agents/__pycache__/billing_agent.cpython-313.pyc new file mode 100644 index 0000000000000000000000000000000000000000..455b175343408f2efb786c8099b55b37d10ba0d5 GIT binary patch literal 6320 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 literal 0 HcmV?d00001 diff --git a/Tuning-Performance/Route_Stickness/templates/agent_template_backend_day_zero/app/agents/__pycache__/orders_agent.cpython-313.pyc b/Tuning-Performance/Route_Stickness/templates/agent_template_backend_day_zero/app/agents/__pycache__/orders_agent.cpython-313.pyc new file mode 100644 index 0000000000000000000000000000000000000000..bb03d128d89f0f7359f41d7e05c7b2548041da12 GIT binary patch literal 5973 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 B_lW=i literal 0 HcmV?d00001 diff --git a/Tuning-Performance/Route_Stickness/templates/agent_template_backend_day_zero/app/agents/__pycache__/product_agent.cpython-313.pyc b/Tuning-Performance/Route_Stickness/templates/agent_template_backend_day_zero/app/agents/__pycache__/product_agent.cpython-313.pyc new file mode 100644 index 0000000000000000000000000000000000000000..44aa6f58cebadbd8617dd827da299d25977e7ac0 GIT binary patch literal 6317 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 literal 0 HcmV?d00001 diff --git a/Tuning-Performance/Route_Stickness/templates/agent_template_backend_day_zero/app/agents/__pycache__/prompting.cpython-313.pyc b/Tuning-Performance/Route_Stickness/templates/agent_template_backend_day_zero/app/agents/__pycache__/prompting.cpython-313.pyc new file mode 100644 index 0000000000000000000000000000000000000000..7d146604905d9618dee7c39191a383fcfacf492e GIT binary patch literal 1225 zcma)6&1(}u6ras*(vp~sN)asxixe?!n)L%giyw&KXAwyn(1R@F?j(%e-C1U4v1u$%n2MI{W|lX?~b#WcKBxAKW9< z8~VOA#z8gpY)wsKk6ldt&}bNcbpx-4HisI9iR!tAW}*xF94b%6KOp&rM_m{(wwM)h z(xhw5@(65M5J}5rVUxCEjy;HCu99$zgwl~DhO9p+MdB@SuWT6{=&lX1}R61&D?Nu0W*?rKPcuy;o11#EH z#{394pa}S0Bb$$`0a3)&8)m in!XY+FZRhbejHr&dk_lkm#%5rS9I!kuAnW9)BgZlOg&Bj literal 0 HcmV?d00001 diff --git a/Tuning-Performance/Route_Stickness/templates/agent_template_backend_day_zero/app/agents/__pycache__/runtime.cpython-313.pyc b/Tuning-Performance/Route_Stickness/templates/agent_template_backend_day_zero/app/agents/__pycache__/runtime.cpython-313.pyc new file mode 100644 index 0000000000000000000000000000000000000000..340ff14d1e9045e9990472bc30dc0df465896b18 GIT binary patch literal 427 zcmZ8du};G<6ttU^R;^mW0&B$<3F;XMAwd_Est8(OwM_C7nI?Ai;)s@wk%f(q;B#0l zvB1QJ)PWU8Z5Q6~bmzNwI(gaYw1^wM{c?X!3HhqXW@;-ymj@2Kk_nm6AqgqcUWIGJ zTIit{`sjystoI0WZ&wtzQZMkotJ8qmwopnNVWd_?;Mtwi6qFg4%E%l>axRtaj-V(+ z3TLIvVnEwns{^eJ%*{p6ur1D$(v%3Cqvvw%p7Sfi6BIc-Xq@(Om59Dmv0kmM%Gcmr zWEtmgWa%ie&n#Dl#li?Ck|SQ7vVT!rN0MEaN~-km5-`!23l#wy>(T(97#U5KE6fb! zvrHH$)&U#N??f~O74uju_#>cZVm4cO3bwAFd4lK=n! literal 0 HcmV?d00001 diff --git a/Tuning-Performance/Route_Stickness/templates/agent_template_backend_day_zero/app/agents/__pycache__/support_agent.cpython-313.pyc b/Tuning-Performance/Route_Stickness/templates/agent_template_backend_day_zero/app/agents/__pycache__/support_agent.cpython-313.pyc new file mode 100644 index 0000000000000000000000000000000000000000..c047c8d5b32e787a0924daadbfc59b936fa8161c GIT binary patch literal 6028 zcmbUlZA=^I`OaS$8w{8aJBGjo2*kuOBn=_ax+H{;j2H~!a7vd>*W-M^HRn6`?o0t~ zYSc*+lcKfz5w+cZG}R`B>{q7lM}JMNA~lt|AGW;7r&Ah5+N7!fAheqLXWH}JogJWL z>2`@9-mmBTd7t-v-ksW79|527mv>(KSu;WW9XsXEZ8vsKLE{!d6EvA1u8;~zVcU^# zTyZK+iU<>(1nrCvwCfe;pwq%pTubh#=PT?)Nh88$v*H@VF7cAaWEFW)5PAHY$!aj$ zFpT4~IY|>T{FJaNNSsB)f)2a0a~>MEh*t=OqzT1AlZumeD6V#5??2j0yCTGEq~fOC z5km3M9)MMJmEv7;Myrh)I+xALie~cs3NL zRBOD*XLwCnGyIw?i;N=YG+r_M3cJLpys{#2yy50pZkac{Dz9mRw4@qdc>(8OohQR* zWIzt6xlD#t))=cF^%*Xe7Z(*ja8+s$)FKEVs6$YXpaDS;K_dVa4MbHw;+1mbROIy*>6fZ|e@=5nRRF&_Ub% z9DX|w!M|Mu1#yxhW-GA)GxkT5DUx>3&H<8k(e87u3D`!<5GyO>EoahQ1DJqUiJdYQ zL8Qn*o7#R1$&qp#vlp^QVdcSmJ;1l>S|$2Yjxs%v#CxzL^GE3FUZ4yVE75t7M3OV* ztVl3H5VQ|4Dlz;NV|MqhvWEi%?N2!a#0#zzIg4?(@1twVa{iDk^GJi`A^p^*9CRS= z1YQ`W`@X048Y8<=1B~B&-_tdcE9ELvXD|I98o0iX2H#g+$(?eWGUHC$_ss|CI=cRx zQ}U!d6^S8^Q{dnK(S8jePmpe;o9O1alWvK-zNaPOh}i!}6t10h+vW3dN zt!R>XX8eXzt;T4eW6E;JpC03GLS!WPRqYq%h_V9fWbMwLA(t zvVG9bA}L3zD&?g+&bg&(z&u=D^YkyQu1i&y57+&6mV7jo@<9|j=p#VO`;2JltmxVm zcR%0X5Qzt8lkOC`E0?$r^zP9zukY;Kp7PAKjH%<5^Kr+dAiR8cG_fPo!5q{wz=OP)6CfCCgBXK%4Gc!Fq#|&Q{OU^O$ z-06I?d<^+xkRjN3<5T-8_wuRhh4rR&r#!c!wN z%*b?dZft%I{!UJgjUa;t>)_|roTvd0xG$|Y>?NDwvW6c3qnL|SgS@ux_z7kBBz{$6 zfT_kC%{IY_>#eikYasp2JeLFCh*`E?H-)T#6# zlj8_tNPnM|fN$<~IA*WP-2FdL_wQ1<3}vdwQ)!;EJ%-H{R^eZhsVu9ol%~iW8-vjm zSzLp#hN#HWMLjDtCR%7Lo}r27{#F^tD20bfZKu9h}5;5ZRS!trR{oJvB24d2rN3G6)c~ z#!6`nx6DF%sas}MGtpU=QmwkHoa+L6g;)>m&B}Hl^XX_klqP%zDieV-nn7k!!~|-l z^|Jm>k(Z1kX0XF%!+nGiYi@9}XYU-Nn!yP;Y#1zeB&f5X`Qfa=KsIV^4eS#w zj;`-V7T$_Tco?ZzxmD^|ic;`)3+GZ!GU|87T^vU6$WnPwfLT@>~RZY~jZ4vG|-@gcVwGUbV0z`Xf>F`kD@X*KZ;^Fh9(D{v;NB)o= zY7r74!@WFKzd&)wGS5B2lI!|+*`<>OXkl`=OZ(Ed)EiT`@&{T zv3;=AK9fH;qjwzNu5vd8w!B1Rs1%GBg7M8LyvRQ_x-ADQ0G#$wQN5QCP$#`snZ(G=O3dK_*mg-;j4r|+fmSJV0M>3o>qsD0!Q zKaTY7rdDbn{x}RI^{!+0=JI3nh0x2})gF-4w@-XO4iX-)Ry}dNztlHc=tJ@Q5~c1$ z!Fy!GulqwKe`~?t`rbsz-&64S?D50no>QfsGliZr`Jv0jo*(JGFO+(R3cW-5vlGSM zD|%Wv+GZ|u(6himzhSBkxfZGTnJ2ZlyD z`U-)*&B0>eU%GFN93j z;KPot+mog4(}nKS_g*e`Unq85)H{3cL_dt?V`Ih6@$G61&l(~$u+?a803U7uA8r5y zEku3GM(vX~9k3go1c>m3CoWk3+Bk97jLcymIxMw$2P6WJC+c`GsFq5M)4r^2g06R@7XQ6F$?nzS> z{M{M!1|qfrFcVkvp;B|a(2SeCd9YMBnD-7A>IT16@#*ia=63R3vd#6LyPb?yThD)( zA+49c25gz{g65MTK2JP-FpPSW_6LYB!j$1-n2el;ixnJ8H4O7QTwU!$s*YhGbE}#N z#gZh$vCTg=hF#$eosrW|y3qtot zZj72)L2nA<|3FZ0fb`m|*EQ;))~}nJ+$WyIUM1Zv-;6p*_Zf>E7COnO+h~GU#khHR zt8wdj8Xhd|(`(lh90&MRt>DwHCB;kFsz_#dU$k^TulyJ$@a;~G0N8SpB>5%rgD;7J TuRT8{$us%J?r#Wen7ID|-Rlpt literal 0 HcmV?d00001 diff --git a/Tuning-Performance/Route_Stickness/templates/agent_template_backend_day_zero/app/agents/billing_agent.py b/Tuning-Performance/Route_Stickness/templates/agent_template_backend_day_zero/app/agents/billing_agent.py index aa60099..05254d1 100644 --- a/Tuning-Performance/Route_Stickness/templates/agent_template_backend_day_zero/app/agents/billing_agent.py +++ b/Tuning-Performance/Route_Stickness/templates/agent_template_backend_day_zero/app/agents/billing_agent.py @@ -95,7 +95,7 @@ class BillingAgent(AgentRuntimeMixin): state, system_prompt=apply_agent_profile_prompt( state, - "Você é um agente especialista em faturas. Responda com clareza, objetividade e sem sugerir ações não solicitadas. Use dados MCP quando disponíveis.", + "Você é um agente especialista em faturas.\n\nUse dados de tools/MCP e RAG autorizados como fonte de verdade para responder somente à solicitação atual.\nNunca exponha identificadores técnicos ou de identidade presentes no estado, contexto ou MCP, incluindo customer_key, contract_key, account_key, resource_key, session_key, customer_id, document, message_id, ura_call_id ou MSISDN/telefone completo.\nNão transforme nomes internos de campos em rótulos para o cliente, como “contract_key”, “customer_key” ou “MSISDN”.\nPara consultas informativas de fatura, apresente somente dados de negócio necessários, como valor, vencimento, situação e itens cobrados.\nNão acrescente canais, telefones, códigos USSD, URLs, aplicativos, lojas, relatórios adicionais, procedimentos alternativos ou próximos passos que não tenham sido explicitamente retornados pela tool/RAG e solicitados pelo usuário.\nNão ofereça espontaneamente outras ações ou detalhamentos.\nSe uma tool retornar BLOCKED, OUT_OF_SCOPE, NOT_ALLOWED, FAILED ou outro resultado terminal, explique somente o motivo retornado, não declare sucesso, não invente alternativa e encerre a resposta.", ), mcp_results=tool_context, rag_context=rag_context, diff --git a/Tuning-Performance/Route_Stickness/templates/agent_template_backend_day_zero/app/agents/orders_agent.py b/Tuning-Performance/Route_Stickness/templates/agent_template_backend_day_zero/app/agents/orders_agent.py index f557bed..b793c26 100644 --- a/Tuning-Performance/Route_Stickness/templates/agent_template_backend_day_zero/app/agents/orders_agent.py +++ b/Tuning-Performance/Route_Stickness/templates/agent_template_backend_day_zero/app/agents/orders_agent.py @@ -95,7 +95,7 @@ class OrdersAgent(AgentRuntimeMixin): state, system_prompt=apply_agent_profile_prompt( state, - "Você é um agente de pedidos de varejo. Use dados de tools quando disponíveis.", + "Você é um agente de pedidos de varejo.\n\nUse dados de tools/MCP e RAG autorizados como fonte de verdade e responda somente à solicitação atual.\nNunca exponha identificadores técnicos ou de identidade presentes no estado, contexto ou MCP, incluindo customer_key, contract_key, account_key, resource_key, session_key, customer_id, document, message_id, ura_call_id ou telefone completo.\nNão transforme nomes internos de campos em rótulos para o cliente.\nNão declare sucesso, alteração, troca, cancelamento ou qualquer mutação se a tool não tiver confirmado a execução.\nNão acrescente canais, procedimentos, ofertas ou próximos passos não solicitados.\nSe uma tool retornar BLOCKED, OUT_OF_SCOPE, NOT_ALLOWED, FAILED ou outro resultado terminal, explique somente o motivo retornado, não invente alternativa e encerre a resposta.", ), mcp_results=tool_context, rag_context=rag_context, diff --git a/Tuning-Performance/Route_Stickness/templates/agent_template_backend_day_zero/app/agents/product_agent.py b/Tuning-Performance/Route_Stickness/templates/agent_template_backend_day_zero/app/agents/product_agent.py index 34433f5..998dad6 100644 --- a/Tuning-Performance/Route_Stickness/templates/agent_template_backend_day_zero/app/agents/product_agent.py +++ b/Tuning-Performance/Route_Stickness/templates/agent_template_backend_day_zero/app/agents/product_agent.py @@ -95,7 +95,7 @@ class ProductAgent(AgentRuntimeMixin): state, system_prompt=apply_agent_profile_prompt( state, - "Você é um agente especialista em produtos, planos e serviços. Explique sem fazer oferta proativa e sem executar ações sem confirmação. Use dados MCP quando disponíveis.", + "Você é um agente especialista em produtos, planos e serviços.\n\nUse dados de tools/MCP e RAG autorizados como fonte de verdade e responda somente à solicitação atual.\nNunca exponha identificadores técnicos ou de identidade presentes no estado, contexto ou MCP, incluindo customer_key, contract_key, account_key, resource_key, session_key, customer_id, document, message_id, ura_call_id ou MSISDN/telefone completo.\nNão transforme nomes internos de campos em rótulos para o cliente.\nEm consultas meramente informativas, não exponha flags ou capacidades transacionais internas como can.cancel e não informe espontaneamente que algo pode ser cancelado, alterado, contratado, removido ou trocado. Só mencione capacidade transacional quando o usuário tiver solicitado essa ação.\nNão faça oferta proativa e não execute nem simule mutações sem a confirmação exigida pelo framework.\nNão acrescente canais, procedimentos ou próximos passos não solicitados.\nSe uma tool retornar BLOCKED, OUT_OF_SCOPE, NOT_ALLOWED, FAILED ou outro resultado terminal, explique somente o motivo retornado, não declare sucesso, não invente alternativa e encerre a resposta.", ), mcp_results=tool_context, rag_context=rag_context, diff --git a/Tuning-Performance/Route_Stickness/templates/agent_template_backend_day_zero/app/agents/support_agent.py b/Tuning-Performance/Route_Stickness/templates/agent_template_backend_day_zero/app/agents/support_agent.py index b4f0244..b15a0e4 100644 --- a/Tuning-Performance/Route_Stickness/templates/agent_template_backend_day_zero/app/agents/support_agent.py +++ b/Tuning-Performance/Route_Stickness/templates/agent_template_backend_day_zero/app/agents/support_agent.py @@ -95,7 +95,7 @@ class SupportAgent(AgentRuntimeMixin): state, system_prompt=apply_agent_profile_prompt( state, - "Você é um agente de suporte de varejo para troca, devolução e garantia.", + "Você é um agente de suporte de varejo para troca, devolução e garantia.\n\nUse dados de tools/MCP e RAG autorizados como fonte de verdade e responda somente à solicitação atual.\nNunca exponha identificadores técnicos ou de identidade presentes no estado, contexto ou MCP, incluindo customer_key, contract_key, account_key, resource_key, session_key, customer_id, document, message_id, ura_call_id ou telefone completo.\nNão transforme nomes internos de campos em rótulos para o cliente.\nNão declare sucesso nem simule troca, devolução, garantia ou outra mutação se a tool não tiver confirmado a execução.\nNão acrescente canais, procedimentos, ofertas ou próximos passos não solicitados.\nSe uma tool retornar BLOCKED, OUT_OF_SCOPE, NOT_ALLOWED, FAILED ou outro resultado terminal, explique somente o motivo retornado, não invente alternativa e encerre a resposta.", ), mcp_results=tool_context, rag_context=rag_context, diff --git a/Tuning-Performance/Route_Stickness/templates/agent_template_backend_day_zero/app/observability/__pycache__/__init__.cpython-313.pyc b/Tuning-Performance/Route_Stickness/templates/agent_template_backend_day_zero/app/observability/__pycache__/__init__.cpython-313.pyc new file mode 100644 index 0000000000000000000000000000000000000000..e757f9311d64ab5074163f3e245c74aedf57db7a GIT binary patch literal 242 zcmXw!UrNM442L_ef(Q#IKuDJL`mV}}_s5UYe@nTAc|LSW`2wZ?UBr4=e#F rMhJCc`J~#8R%bx8-YVi#oKLqeF0|9guX2+wEFYu-e=B2*tTO!rsC7s> literal 0 HcmV?d00001 diff --git a/Tuning-Performance/Route_Stickness/templates/agent_template_backend_day_zero/app/observability/__pycache__/telemetry_observer.cpython-313.pyc b/Tuning-Performance/Route_Stickness/templates/agent_template_backend_day_zero/app/observability/__pycache__/telemetry_observer.cpython-313.pyc new file mode 100644 index 0000000000000000000000000000000000000000..65b0a28a2b861175de7bca65ccf2d2f34f6b4af8 GIT binary patch literal 4853 zcmdTIOKcR$wW_=4KlT`Zz$ON_!7+@%GY-GSXj#@6iv`1g+#Uk*hE98?XWVAoZK``< z$H@V0q{vZ{4IB_CIfRv>AZ{G@kP|49k2CQ~W3|`_DJO0wMvz50AM*hoQKZdeT4H{{d>jh^=I2;Yi7Ek(h1$tBq69Y+CA44g)?(p&INtCC zJ8|kpG}E*k%`q&~jtg!ut2w%3%;;_q;hbgaz$6Ztr404NImB&?gwU01fZQY#t7B<$ znC|2(gk)hs*eKm!8yy3QwQYZmV3IT$^Q|2vpn$q`eO3)-O_Lr_MVd5{y+RL(ODQ*y zPK~C{{5TbtUWzA%6ECHq<3j*bXAnO=b}GR_F!?>v6>W#PJ^;q78@3&dIrdezm8^7fansQ95rkzbN(hT3qAb|I3=gxs@OJAj>50!KHe$Rd9 ze(rt)psWp~{|}S{G3GlcC(jC=>1+meR1j-N@YWg8X}PO^0mw~s(^Y2&Lan`W@>Mql zt~^}ay4>PhPL15sf8qA6%k9qx;=xp0;Ev5O!n%Ty;g;cwaPth+;EHfe*QZ|r*Ns!w z1SAM&Vcu7r(rnG&J<|!PmkjVn@MP8vjGge=LjbOkrND-2ptBO_yscIP{gpufQmo|_ z?OZj`Qwj7e#ah>;MVdXO!c40T<0rIw{QQ(Kst_h9l!=PKBt=xD1XUWmz&G-!<&Cf3`6|1G%ZY1NC=HelM>>6$^yI>uJwYv7pe6^N)(cTKfb~39Ir>3 zqZpO4Lm2DM@K~g?C%v#$?PqXB$Cx$SZmYFm1 zMW$zE4BoOPpVG{Hu4wD>EVHf{5D<6Enwf=FG+0stmJHJ|2m@8tKXaHSGs|+qfMj$T zZd{%$+6KmJneW$zBW7S;TZUvZbbKT=t`46$efHGI_{gy&CY6DK1BtbV48!_1EUC*{ z#xbtwvOTMrNpA_*u>TClbY@;KB4|Qz&P216y$q7|YhQG0cE#+WAcr7}9xzlhq7B5eLN+P)|;Q&acp$V#*iAlLdN6kfi+G zWMX4oCO|X@>HO5+dBwW^_zIvaZ-pSiHM;mJIdWL+B02hjn4?&}iH??!``i$BigAd` z+#+iIW8k>1G-+i^tRJ=ohA&~Djz?W7Yh)ZK<8&vh=d@zM;bIK02Xnwxh83kN7M+Y6 zGHi?2XpU#wT`q3Xt6cci2fr^ z93)L`^Urt$Ig$SWTkKdGAY#yve2mclwgmgC_T@C=pzwJ-pB%dGk5BJjt zq28kh$%7<4dO&(GAR)d_K>7iS_`#jSed0rz4sZ8A?DiqvE5hi*I7Pe<@zpQ@bMi3o zYYYPyq2q;t^^1gwdhh_3ts8k-7$9kJgep`K1}OZlWAxnMrJ5NsjG5#2sApyZ`w+Uk zvc4yIhJiIC!wQ>o*l1^X`QF_J@M57LcYEG@{lIk^WNmb9w1B0yj$0RQT==@{NB4Uc zyFU18Q+YJAFa@A|{?qcs$;xQv`h{{^wi?TpgV{7VH?>8|hl)!G)= z%Q!m%5UMe*GhR-941_f*3UU=earU0{QD-{~Q>?tDq&@fdEp{FJYDf8$zVI1<@`a1# zpJpqkbW~EV8q1Y~xk@beEgJ^$@6(*N!uoG225W8hF@SXygSG0r^D0*iuqimtaRhiq zP&+1X9@yf3FTP%I=}*Fo+*Z|l-s^^YE8C9D2vBqOWdOeW~^oklmW#x)+pP(!zA_qnyFWLFwRRaYiSs&eE`6+NGbh>Y+IHjD!qsjy7L>d@tI$s Z=jgMrKtHO10Bw2EnxJ|5PlAxo`yU993dR5c literal 0 HcmV?d00001 diff --git a/Tuning-Performance/Route_Stickness/templates/agent_template_backend_day_zero/app/workflows/__pycache__/agent_graph.cpython-313.pyc b/Tuning-Performance/Route_Stickness/templates/agent_template_backend_day_zero/app/workflows/__pycache__/agent_graph.cpython-313.pyc new file mode 100644 index 0000000000000000000000000000000000000000..d268a633e037a7a98bba6a4205a4c6e3d3769ab7 GIT binary patch literal 56854 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 literal 0 HcmV?d00001 diff --git a/Tuning-Performance/Route_Stickness/templates/agent_template_backend_day_zero/app/workflows/agent_graph.py b/Tuning-Performance/Route_Stickness/templates/agent_template_backend_day_zero/app/workflows/agent_graph.py index 0a12c4b..2cb86e1 100644 --- a/Tuning-Performance/Route_Stickness/templates/agent_template_backend_day_zero/app/workflows/agent_graph.py +++ b/Tuning-Performance/Route_Stickness/templates/agent_template_backend_day_zero/app/workflows/agent_graph.py @@ -492,6 +492,119 @@ class AgentWorkflow: "next_state": "SESSION_ENDED", } + @staticmethod + def _output_guardrail_context(state: dict) -> dict: + """Monta o contexto operacional do turno para os guardrails de saída. + + Mantém evidências/protocolos necessários aos rails, mas impede que uma + transação encerrada ou semanticamente interrompida governe o novo turno. + O histórico completo permanece no state/checkpoint para auditoria. + """ + ctx = dict(state.get("context", {}) or {}) + mcp_results = state.get("mcp_results") or [] + ctx["evidence"] = mcp_results or ctx.get("evidence") + ctx["tool_result"] = mcp_results or ctx.get("tool_result") + ctx["tool_executed"] = any(isinstance(r, dict) and r.get("ok") for r in mcp_results) + + history = list(state.get("history") or []) + current_user_text = str(state.get("user_text") or "").strip() + if current_user_text: + if ( + not history + or not isinstance(history[-1], dict) + or str(history[-1].get("content") or "") != current_user_text + or str(history[-1].get("role") or "") != "user" + ): + history.append({"role": "user", "content": current_user_text}) + + route_decision = state.get("route_decision") or {} + route_metadata = route_decision.get("metadata") if isinstance(route_decision, dict) else {} + route_metadata = route_metadata if isinstance(route_metadata, dict) else {} + pre_validation = state.get("transaction_pre_validation") or {} + pre_validation = pre_validation if isinstance(pre_validation, dict) else {} + tx_status = str( + state.get("transaction_status") or pre_validation.get("status") or "" + ).strip().upper() + terminal_tx = bool(pre_validation.get("terminal")) or tx_status in { + "COMPLETED", "FAILED", "CANCELLED", "BLOCKED", "OUT_OF_SCOPE" + } + semantic_intent_shift = ( + str(route_metadata.get("transaction_interruption") or "").strip().lower() + == "intent_shift" + ) + stickiness_intent_shift = bool(route_metadata.get("route_stickiness_preempted")) + should_isolate_history = semantic_intent_shift or (terminal_tx and stickiness_intent_shift) + + current_route = str( + state.get("route") + or (route_decision.get("route") if isinstance(route_decision, dict) else "") + or "" + ).strip() + current_intent = str( + state.get("intent") + or (route_decision.get("intent") if isinstance(route_decision, dict) else "") + or "" + ).strip() + ctx["current_user_message"] = current_user_text + ctx["current_route"] = current_route + ctx["current_intent"] = current_intent + + if should_isolate_history: + operational_history = ( + [{"role": "user", "content": current_user_text}] + if current_user_text else [] + ) + ctx["historical_transaction_ignored"] = True + ctx["historical_transaction_status"] = tx_status or ( + "INTERRUPTED" if semantic_intent_shift else "TERMINAL" + ) + if semantic_intent_shift: + ctx["historical_transaction_interruption"] = "intent_shift" + for stale_key in ( + "transaction_pre_validation", + "transaction_status", + "active_transaction", + "transaction", + ): + ctx.pop(stale_key, None) + else: + operational_history = history + + ctx["conversation_history"] = operational_history + ctx["history_texts"] = [ + str(item.get("content") or "") + for item in operational_history + if isinstance(item, dict) and item.get("content") not in (None, "") + ] + + protocols: list[str] = [] + seen: set[str] = set() + protocol_keys = { + "protocol_number", "protocolo_id", "interactionProtocol", + "protocolNumber", "finalizacao_protocol", + } + + def walk(value): + if isinstance(value, dict): + for key, item in value.items(): + if key in protocol_keys and item not in (None, ""): + text = str(item).strip() + if text and text not in seen: + seen.add(text) + protocols.append(text) + elif isinstance(item, (dict, list, tuple)): + walk(item) + elif isinstance(value, (list, tuple)): + for item in value: + walk(item) + + walk(mcp_results) + if protocols: + ctx["expected_protocols"] = protocols + ctx["requer_protocolo"] = True + ctx.setdefault("tipo_fluxo", "ajuste") + return ctx + async def output_supervisor(self, state): """Valida a resposta candidata com o OutputSupervisor corporativo. @@ -507,15 +620,15 @@ class AgentWorkflow: } candidate = state.get("answer") or "" - context = { - **(state.get("context") or {}), + context = self._output_guardrail_context(state) + context.update({ "tenant_id": state.get("tenant_id"), "agent_id": state.get("agent_id"), "session_id": state.get("conversation_key") or state.get("session_id"), "route": state.get("route"), "intent": state.get("intent"), "supervisor_attempt": int(state.get("supervisor_attempt", 0)), - } + }) async with self.telemetry.span( "workflow.output_supervisor", session_id=state.get("conversation_key") or state.get("session_id"), @@ -601,7 +714,7 @@ class AgentWorkflow: component="workflow.output_guardrails.start", ) final, decisions = await self.guardrails.run_output( - state["answer"], state.get("context", {}) + state["answer"], self._output_guardrail_context(state) ) for _decision in decisions: await self.guardrail_telemetry.evaluated("output", _decision) diff --git a/Tuning-Performance/Transaction_Evidence/agent_template_backend/app/__pycache__/__init__.cpython-313.pyc b/Tuning-Performance/Transaction_Evidence/agent_template_backend/app/__pycache__/__init__.cpython-313.pyc new file mode 100644 index 0000000000000000000000000000000000000000..41099f9b6eab6f5a5a452a3ea475fdee5951315f GIT binary patch literal 214 zcmXwzK?=e!5JelSAVR@wxX`QxapzWCbU%#kw8S=(k|v6maOWYsl3Pz8y?_boU(CEe z!-qd)*(?e2^V=!zR~&zd9}MFF_oPl1V*g0&D7YcMo?dEpvP6dxt2JDVZ6wyj4l0Y9 zq6bqbnR`}TFAroZV>NO?GPlS*7ET$4-C30skKe2#-L>clj#xCrrNpk20E(3ZSasLu XbfZn_TiV)5Xc1fX5#Ff~!lr>fWv4uz literal 0 HcmV?d00001 diff --git a/Tuning-Performance/Transaction_Evidence/agent_template_backend/app/__pycache__/main.cpython-313.pyc b/Tuning-Performance/Transaction_Evidence/agent_template_backend/app/__pycache__/main.cpython-313.pyc new file mode 100644 index 0000000000000000000000000000000000000000..7a89633b08ddd2293fb55807e637487ebd08da4a GIT binary patch literal 36653 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 literal 0 HcmV?d00001 diff --git a/Tuning-Performance/Transaction_Evidence/agent_template_backend/app/__pycache__/mcp_gateway_client_factory.cpython-313.pyc b/Tuning-Performance/Transaction_Evidence/agent_template_backend/app/__pycache__/mcp_gateway_client_factory.cpython-313.pyc new file mode 100644 index 0000000000000000000000000000000000000000..c84d77fa9265924c5925c140cf0f6391ea552b5a GIT binary patch literal 1062 zcmah|&1(}u6rcT0`jv)QO&brTNHJKm1x>X@g*1(&O-)NTMWlyex|yWgCc9yFwjsrX zcqw>L5Q-pzSG{@k=${bDp)%A{74%jK-kog{Y4y+tJNw?7-+S|WZ{D=}`+EQvZ}9on z4*`H9-{^|iR)ki9EBn9zhL8n|0ue@iUCfF^j$eHGJhRh8RLWu zG1=K!RZj1<^<>9oh%+?+5YJfx>sl9gZg$C#yV=jhDoLK*m%GB%wgL*Ancu4QV8?NO zJ*uH~PweJ10@KnJ5D(^9gtrdPr}CMHsYfuAOU*82=9o;0hgsb`Ixd~LePeQxg-_%1%h^nh#m=}E9%Po+^3cenmveIl6Q?HQ5({h~7ekMfnL?dy zY_kxxD%kNTbg}8!1vjoR(Q%nt!W7#(Oes4xOo+_OW|C#o_n_r>fbHoOo9YEbk&cSf zu;!3$9hLYDz#>5v?Ay>WEj{nqmR-8Of=SUK6=a)O&l6<3$n?huW_GLs_MPomiYwJJ zpD4J2Oir$#qiR*Jm{nM6j~O&i<_s2jxI^lRYMn(lJgZ!Q|AWXy&NIM27xU!_IMjlB z^{4elc>JB()bs-_`B_UgwOb#jnp)~hDDtg0b{LMl8h$z4h)pySnP&L@;lSVv>zUPv zUTY3a91Pt2ARk6!Z)V>vyk2OGr$6PJmlvDS>@Q93Q;&hHsN@1aDK0XVVCoTj_Y%L4 zGY@3+@o3Jmaa?6R5EeZS!VnVvN&pG*g+>2qVWLyFdvXCM6_JRK_75UMen{X>#VL4Y fe22H=l!x1V&_3foRFkITpG%ws*oyZg`iCPzzX1rb;a4dQKo9{i}_xskTqoYFxeEf;u zpAYmK#y{%N`M_C!PS@e*52IpKQjd&>DVBPeX6Z{t!B{pb=~<(a*-2MWrSA@6nZ4{r z{|Du?k(Qb7+=d){+^AFQzHJIq$BG{){yqIMqeAZ(ELAaBx{_j$=|1JtSLsi*0|^>T&`^SgH9G4%l4wU0G^WwOPM2kzX}m{-iF2(d z&(-9#M%_D~psCmz#kr=>^}g_l<%~XeRSR(oJ!Himve_Q8IW1Gw&1=-F6AL~3E}m<> zs5OHS@lt}8dPG=`BXoLD>S41I+jQMG?%1l4(_qs$mVhVeoV!@zX zh2b6(4&maAB-f?ZMfqG#b<60!ZBf^xviPYlPE-pFD%w}0>ghQR?Wx+V)*ch1FMXR) zOMWUgDU@r;oW51vb8NE_H$vuWHVhrES0{|rsDPQn4E;J~`!@F&t~~5*71miDPtacZ)|Uj$N`L97$e4V2;-V(`M_^1M=*Zr6DQV;V+@?(!m(ZI zdZ5m5!6ZnD>w2&}KxYn8WWirFgFjH2 zjz%XBR}Oh_@9_1}=E>-i3IL+gAwOJy`!qyzQE?%#np>?*^Y*cOQoI(TYbqZKD$P>x zeI-+lI)T;bh zYCU;Bc2c?(qFd42Vu%*w=h+PEbUdi8K3xn-0T0%X;OZq+$Kz(H$(!rPPfrS0Lv%H2 zH*HFH_iWMaj^}4WG!reveS~4n%!X(-D$a*!KCb;zNyUb8@3-3822Sy@6y_H0r=f&3vY) x)FzhVcH89-jyxMl_^nzM%*ZMipgkrCCz#` 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
}E%-qX3H8nOpGdY2(hDv~_=y(t+kZVvyT2gp9 zirytlAalhTRVJ&s0X_4!TZ6B~A}+H|yQ)EU zUMk=018&tJB_}j%u_%FJg~yuUn*Y*{oE!pFtrbo=JGPiXyAXlHZaHveTg1I5hL8vz z@}qdj+qQ$J9h1lBX6I)hwoO=jObVE+wZjxAtnm;t>eqP93SPFBG`nsp$1neG9BN{d90wC{ zd2m>~DBz{ga;}QH8Qi(q3gcXc*M&9HK00NrB`4j5G`O6VbPUUJ38?8f|HB^1aCgra8{)=+gc%cQr zPj&Vb4~*syjDF%S95`JJp5CZ^>s*7pwo`moV()M#ii8vA}P+=&(jMsp1(jc^nY zH8HTg$q$I?{Llj6rrzeG&qcM(@FUi@C|AeDIYgHC4c= zcMtnM9Hgp1TMg8q;o{IlehAqgiWmFhc~AF-&+r9{zV^JY{r%~pZy@g**ky;u1ILO3 zC-MU)a--)911}kaFBAty^Mj+glhcL43r0_@*mEr3bL`%Wg`Trds$Go%V4(f*W}{`T z8njjoS_?s#s&6X#BYA)1PJh9Fr06-4^Bj2$%5ECSHw}Q_JPaQP%WpcUMzL~_IvCuj+6=(3?Zbn>%RiXj zTT{0$e01T?l|tXiV&Cac&J~z54|@l}WqL;*cJzdJ?8;jsghG(NCIT%Xiu@;kdmWibv_+(D9J#x7hlaj<>u1bO>6Xb%al-htoNSpfg-0q5Bz9~Ke`7ZwQwA37j&ZmwJi zm?W1%Y{X&3MluC!GzWlElp-ggZFcXBQkCsHwR}89jUS3?l3;u&vy7AVn6Cx?|Jyvu>IN>@gzzgY zOfSc!)l?RqXgRZ%<1lk7T~YNM2XR}|Whi|V6{cM{L0S>vECNfg7S1X_B!S~~xObM} zsS<9wyA%oG5)9K;y3PwX{WSRrOyEPD76!2Cq-pvq>PKHuN4}~08BL$a1$w`wuwm`}4>o-9qyPW_ literal 0 HcmV?d00001 diff --git a/Tuning-Performance/Transaction_Evidence/agent_template_backend/app/agents/__pycache__/product_agent.cpython-313.pyc b/Tuning-Performance/Transaction_Evidence/agent_template_backend/app/agents/__pycache__/product_agent.cpython-313.pyc new file mode 100644 index 0000000000000000000000000000000000000000..1ebd6c50eeff35c50a529ef696c7c6c95ca6c1f4 GIT binary patch literal 6303 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 literal 0 HcmV?d00001 diff --git a/Tuning-Performance/Transaction_Evidence/agent_template_backend/app/agents/__pycache__/prompting.cpython-313.pyc b/Tuning-Performance/Transaction_Evidence/agent_template_backend/app/agents/__pycache__/prompting.cpython-313.pyc new file mode 100644 index 0000000000000000000000000000000000000000..2a94b99f7875403766d464d55957820f7de93f86 GIT binary patch literal 1211 zcma)6%}X0W6ras*5{YJ`MWhvkMWmP-lYSsr=?79;`yr(m1NBgr>Fy+q?iVw&tx*a& z)=TZ7h5QM6YN7u?!Ap;k93l(trH9g+AieiZvKADDKG@xP^WOWt-|x-t9%Zu`1Qrgy zTm6tg=%;j!4SZ?J(J0(MqB1HgPtaq9DF!NQ<-{mj)mWmY=99l=T3(6zvFG^$3+j8^ zimPP^sl7`%no}fF1uenzw3U^ac=xt483*m_2pQ+)C(g)+t_HgL|M+pfm#8GpYUsfwbb8|nngr^8>6Ja1DAMvM*L z2pFl-b>FZFEPXc+hUI%zS_>JrA&Qwy!ZqRvQxG?BupkB}4(Zn0ele4|hix2ZP}>N6 zK(YbTqs(xLfS|xdUguD4_L>>QjhmFZz`R(;u2VD~aqeea?1{ZyHzvak%6$izaA@ip zb{II+!VD-`dtYo?1Ktqoq7ZHn9sn=w&<$Bp%tYB9aS&Fe4vEqrO^|gF^&Jz7vL~2D zXd{uyL`mu| z;p$EEwa?aig3T(!E|I?JTeP$sdeo~;KO?N_Gth65(lWyy$CmsK%=@pXP2}duQ!rm* zYmInz2?s$u$5M|NfE9y!GztNyZk`xHOq~q@NewREfLj9{4xrrdHr=AlTw9;)=+;i< z)5`A3=X!g3zB9e>b*WQW+%GJCGuwq15N%m}&q#xJQ?RUDs&D{NiV+bqj}604UX3!QSq))>m?o2-LRZQzVi)9kP*(Nba(z2= c$Q^bOT=_%b675h`6y-Y_|C8!hrn>2W0gF*LZvX%Q literal 0 HcmV?d00001 diff --git a/Tuning-Performance/Transaction_Evidence/agent_template_backend/app/agents/__pycache__/runtime.cpython-313.pyc b/Tuning-Performance/Transaction_Evidence/agent_template_backend/app/agents/__pycache__/runtime.cpython-313.pyc new file mode 100644 index 0000000000000000000000000000000000000000..0014d62e235c2bb0a4bbf668acd0fd96973ed3b0 GIT binary patch literal 498 zcmZ8eJx?1!5S{heoG~&nm6ZyM&PBWp6i5gOP*R*l#CL_X+SudM!rks^c8`Ek3Hch4&&AfU0=8bmRZnwZk+4*&G#{m9?<~?e&f=$2p;uenK zm<=Ie#CoBw4Qok6QBtRR(xAp077Z7YnBpFs$7`@L*XaTG>_bM)wBBz#1+>qqC8@P> z(kY{DKdM%CQq=CK)K2BNudbD@miN(Gnc{A#vN2M%JfH3v?eN-pjV@uTtV0scm`o6A z&qK0b`-@deh)L;6LLn&fE32-T(oRfB=J?&v<$z|(sP3oK2x%ekIJ@B|JxwUNb!?WE1iBiK$;lJr5+(aA*rn#h1137 zD>cRd&fYrAi%dEc-{k1hpToVG*~s#_-$8LxHMepzE;HPw58jLaH?XTdJx7eOM_7Al Z0y|?5aQX=Af1vvtKK^a({fw#YIjJXXT)eO#hIL4tYBJ0YF!AinW@eTE zY85w?Dk@oR`e7w$KjNsBjQiy({m569$Wk0B{n*vE+R@0dEVWXVKQM`^{8T+>W_Aq( z*J;Pz!+o7|&+DFh&fTf4^%3wHe|h`0pR^Ff-?3Bv+;(H<6f|xTG(nRI;tHvd6t*1+ z#}%jIq=*pFMbOSLLAzdY4mm9x#kJ&)c)r9=gfzlzHY=_%>=G|&OjeN>1(Cx@+tZ3$*U!sIYt!fQf{3SV4A@-)YIf}HC1#pX)uNUnJ zf|#d7vfP;;6w7Q9^A|;139x2HbXC^8DwY*W%x6VUW&DO%RcXI1ddux4;x3s4j-8^I zF{(9QhN|Yf2s1W3X6u&G0geAPE}77%jW)8!Hc^Qq|J{ZV+1` zqB(fes~_sR8PMB$|LP6duqAxcr-!JUwH9b?zv9mQX$S2bBxx7zKIfW%gR>0Yu|nQ*CfzlF33wH6DPs{tiX5`3 z?Z=QDDaSE;A$t^79=xvy_N}^B@wb$tObX6i$^G7$16yTRQ{Dr43zltLktFd< z{|%+cXHYp*rt*yW@N?$d%JXzP=;83eX908*+%Glo`pi>Fq0b#U2;*8?c@$1$$B-RG zQjSzr%1d{ib4%5LdAPjh>0ek~m#Qvbr~CCR`DiNT121&YM}U_18Q#!Uk+nPKe!jiI z6Az9iJt=ZmEO8%b-J|8bzIAeY%QM$H%kn*qN4v(J<27X}&y}?==Aw^1!>(}Byu@Wk z^3NvRG~t^7$t2??lK+O^KjHUB_=Sd@i)18{Tn|l*#^}_{%=GLWGjcheoMY&@k=eQU zn9;b9Qw51vRfdC9MwTFpF{eN3 zhP0sYoW|gO7Ag>_;w5%L|S%6=S|+PU2XKUxn4nEQMK;CM*gZ5C;;JcKkgYs-6MyU*}0hKd2np0SYV?_}<$ONXg zpdKDLgOrcgWRMuOtzmMAsUi>T13oYcDX(NHoMYj{sT7}~l=~lQIT6~X)j$YQK$&eK zX`U0os9(|ImS=;z#Ud`KuGUn@U>vh+5C-4x-0+rZn zh9M(pRW1+~OgFAzM%??tjS|6da1z5ocvqygLip(P)XXHr!7&rbAb`;tE2J^pG7I6Q zZkbihKxb)6wJNQ0tPAXAVm-JwD%+0Crz7=Hn(!H@Oa#to0iHz>1E?9+%kn!#UNVlD z&Tdyi=&|MjH|rw%1y!?0A1w!q-wZ66Cv6Y^aMz$C8@09s_Kg-p(+}Vl-U>^2 z8L3#gRVr7CQZT!PdnqRw^}GEp1|xW7sXPesB~*=ipz&9kUu5)}UcIJ4uRU`6T)yUn z-got(;o-vJ;g8(K!{&HKB3p2 z((7CFhMwPZo6%zLaK8Sm9zFqtnkYbT3IL(n0JH!E2r9afDR|p;s;5Ma7pU=%b46+@ z?>+p;Pd#ow{BHVv={>2`F;wUn${#*+Zy|p!nLj(756|cw-R}$U37a*=j-gV=O#a-A z-g$hx%H15;@)AwKQe&*p7~9Mh8;7>4aj?8yPpNaP&^h*Ts@R#xd)puRI}hGwDt|Va z4^Qvj#@e9upbc6B8{=CwM00p!>T#&O6gpi9oxYdKUrpyjr}H6xqxO+M^f=tNn_8)3 z(sp$i(MDDt6U9@z(8AUtHHEZHCn40t%V>=)HRg?kwPG{d9)Z9EO`g>-oeM9?55sA z6Z*}=@M*C8mV;AFSn1UMcn^w*6I&K2S9B(O(GkZw?g$ zC%0;0aKp3J2*Z{S9|K44MlBtV2NJaNJLCs#<~=p?!A0%dK7iRzO88fVDuWyu70(c$`p8ta12rw%f4#Pz9j1UnCol8GMIgI-+!;5?b=bv?K+4DHX( zkcnfi&xS9Bq4RkIndoeU)^#em&+S-DfOvSm-1pZlf7q6=UY*t;VbeX?UWv zZ?9cba2?>|w1SVh78fsJtHPP#ebJKryz)bsz_&X!3}DMilH?b}_r4$ozw-Q;B+ulV LdcG#GVdDM=0A2~s literal 0 HcmV?d00001 diff --git a/Tuning-Performance/Transaction_Evidence/agent_template_backend/app/agents/billing_agent.py b/Tuning-Performance/Transaction_Evidence/agent_template_backend/app/agents/billing_agent.py index aa60099..05254d1 100644 --- a/Tuning-Performance/Transaction_Evidence/agent_template_backend/app/agents/billing_agent.py +++ b/Tuning-Performance/Transaction_Evidence/agent_template_backend/app/agents/billing_agent.py @@ -95,7 +95,7 @@ class BillingAgent(AgentRuntimeMixin): state, system_prompt=apply_agent_profile_prompt( state, - "Você é um agente especialista em faturas. Responda com clareza, objetividade e sem sugerir ações não solicitadas. Use dados MCP quando disponíveis.", + "Você é um agente especialista em faturas.\n\nUse dados de tools/MCP e RAG autorizados como fonte de verdade para responder somente à solicitação atual.\nNunca exponha identificadores técnicos ou de identidade presentes no estado, contexto ou MCP, incluindo customer_key, contract_key, account_key, resource_key, session_key, customer_id, document, message_id, ura_call_id ou MSISDN/telefone completo.\nNão transforme nomes internos de campos em rótulos para o cliente, como “contract_key”, “customer_key” ou “MSISDN”.\nPara consultas informativas de fatura, apresente somente dados de negócio necessários, como valor, vencimento, situação e itens cobrados.\nNão acrescente canais, telefones, códigos USSD, URLs, aplicativos, lojas, relatórios adicionais, procedimentos alternativos ou próximos passos que não tenham sido explicitamente retornados pela tool/RAG e solicitados pelo usuário.\nNão ofereça espontaneamente outras ações ou detalhamentos.\nSe uma tool retornar BLOCKED, OUT_OF_SCOPE, NOT_ALLOWED, FAILED ou outro resultado terminal, explique somente o motivo retornado, não declare sucesso, não invente alternativa e encerre a resposta.", ), mcp_results=tool_context, rag_context=rag_context, diff --git a/Tuning-Performance/Transaction_Evidence/agent_template_backend/app/agents/orders_agent.py b/Tuning-Performance/Transaction_Evidence/agent_template_backend/app/agents/orders_agent.py index f557bed..b793c26 100644 --- a/Tuning-Performance/Transaction_Evidence/agent_template_backend/app/agents/orders_agent.py +++ b/Tuning-Performance/Transaction_Evidence/agent_template_backend/app/agents/orders_agent.py @@ -95,7 +95,7 @@ class OrdersAgent(AgentRuntimeMixin): state, system_prompt=apply_agent_profile_prompt( state, - "Você é um agente de pedidos de varejo. Use dados de tools quando disponíveis.", + "Você é um agente de pedidos de varejo.\n\nUse dados de tools/MCP e RAG autorizados como fonte de verdade e responda somente à solicitação atual.\nNunca exponha identificadores técnicos ou de identidade presentes no estado, contexto ou MCP, incluindo customer_key, contract_key, account_key, resource_key, session_key, customer_id, document, message_id, ura_call_id ou telefone completo.\nNão transforme nomes internos de campos em rótulos para o cliente.\nNão declare sucesso, alteração, troca, cancelamento ou qualquer mutação se a tool não tiver confirmado a execução.\nNão acrescente canais, procedimentos, ofertas ou próximos passos não solicitados.\nSe uma tool retornar BLOCKED, OUT_OF_SCOPE, NOT_ALLOWED, FAILED ou outro resultado terminal, explique somente o motivo retornado, não invente alternativa e encerre a resposta.", ), mcp_results=tool_context, rag_context=rag_context, diff --git a/Tuning-Performance/Transaction_Evidence/agent_template_backend/app/agents/product_agent.py b/Tuning-Performance/Transaction_Evidence/agent_template_backend/app/agents/product_agent.py index 34433f5..998dad6 100644 --- a/Tuning-Performance/Transaction_Evidence/agent_template_backend/app/agents/product_agent.py +++ b/Tuning-Performance/Transaction_Evidence/agent_template_backend/app/agents/product_agent.py @@ -95,7 +95,7 @@ class ProductAgent(AgentRuntimeMixin): state, system_prompt=apply_agent_profile_prompt( state, - "Você é um agente especialista em produtos, planos e serviços. Explique sem fazer oferta proativa e sem executar ações sem confirmação. Use dados MCP quando disponíveis.", + "Você é um agente especialista em produtos, planos e serviços.\n\nUse dados de tools/MCP e RAG autorizados como fonte de verdade e responda somente à solicitação atual.\nNunca exponha identificadores técnicos ou de identidade presentes no estado, contexto ou MCP, incluindo customer_key, contract_key, account_key, resource_key, session_key, customer_id, document, message_id, ura_call_id ou MSISDN/telefone completo.\nNão transforme nomes internos de campos em rótulos para o cliente.\nEm consultas meramente informativas, não exponha flags ou capacidades transacionais internas como can.cancel e não informe espontaneamente que algo pode ser cancelado, alterado, contratado, removido ou trocado. Só mencione capacidade transacional quando o usuário tiver solicitado essa ação.\nNão faça oferta proativa e não execute nem simule mutações sem a confirmação exigida pelo framework.\nNão acrescente canais, procedimentos ou próximos passos não solicitados.\nSe uma tool retornar BLOCKED, OUT_OF_SCOPE, NOT_ALLOWED, FAILED ou outro resultado terminal, explique somente o motivo retornado, não declare sucesso, não invente alternativa e encerre a resposta.", ), mcp_results=tool_context, rag_context=rag_context, diff --git a/Tuning-Performance/Transaction_Evidence/agent_template_backend/app/agents/support_agent.py b/Tuning-Performance/Transaction_Evidence/agent_template_backend/app/agents/support_agent.py index b4f0244..b15a0e4 100644 --- a/Tuning-Performance/Transaction_Evidence/agent_template_backend/app/agents/support_agent.py +++ b/Tuning-Performance/Transaction_Evidence/agent_template_backend/app/agents/support_agent.py @@ -95,7 +95,7 @@ class SupportAgent(AgentRuntimeMixin): state, system_prompt=apply_agent_profile_prompt( state, - "Você é um agente de suporte de varejo para troca, devolução e garantia.", + "Você é um agente de suporte de varejo para troca, devolução e garantia.\n\nUse dados de tools/MCP e RAG autorizados como fonte de verdade e responda somente à solicitação atual.\nNunca exponha identificadores técnicos ou de identidade presentes no estado, contexto ou MCP, incluindo customer_key, contract_key, account_key, resource_key, session_key, customer_id, document, message_id, ura_call_id ou telefone completo.\nNão transforme nomes internos de campos em rótulos para o cliente.\nNão declare sucesso nem simule troca, devolução, garantia ou outra mutação se a tool não tiver confirmado a execução.\nNão acrescente canais, procedimentos, ofertas ou próximos passos não solicitados.\nSe uma tool retornar BLOCKED, OUT_OF_SCOPE, NOT_ALLOWED, FAILED ou outro resultado terminal, explique somente o motivo retornado, não invente alternativa e encerre a resposta.", ), mcp_results=tool_context, rag_context=rag_context, diff --git a/Tuning-Performance/Transaction_Evidence/agent_template_backend/app/examples/__pycache__/__init__.cpython-313.pyc b/Tuning-Performance/Transaction_Evidence/agent_template_backend/app/examples/__pycache__/__init__.cpython-313.pyc new file mode 100644 index 0000000000000000000000000000000000000000..deb38e5d864909d8ee38c8d05681581df6bd11f2 GIT binary patch literal 285 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 PK>E7A@mQp>Iau*e&%~%^ literal 0 HcmV?d00001 diff --git a/Tuning-Performance/Transaction_Evidence/agent_template_backend/app/examples/__pycache__/mcp_examples.cpython-313.pyc b/Tuning-Performance/Transaction_Evidence/agent_template_backend/app/examples/__pycache__/mcp_examples.cpython-313.pyc new file mode 100644 index 0000000000000000000000000000000000000000..d78ba9c154302d876113db3e90555ffd3e0e3bfd GIT binary patch literal 1965 zcmb_dO>7%Q6rNr0uI;tsCUz9EF3?RAP!}2-(N;7-k)kA(Qj#=en+rr*O?M~hHujD? zyH1m;NKv^Xaj2lDq~cNzmBNW0snSD_j(o7S;!ufGZ;ql0AuhaeyfmO135k*B&HI~q z-@cjm_MoRnMKG$pUtj-2Lg-g6L?hi{4lV(67nz75Q!vF(g-aq6b!5htL{ow(FU6K% zJuAxKXDUmQ8ULFm0k*W6%%kfPlUGzDRecDKQ|qK$DN$c{h(0?pufMBLPZU)3vOc~- zykMc~1#X$ly6di|U*Em2SE%n-UEQ*2sYL9+D%%y{y@0F-r;O8j8T&f%1EOPgqw20v zy-fXpVV$ZK?6BSMsb0Y#+ShOyJKT4@QrdlJy8-Z+>H(!Ci_vO8n0}**J%{QZv5D{R z-e)c?sLy#S3?Yn-dmCZuh-Nm9}_L%5g=a$S&LGGGUWdtSA+z!ln znCb_yWx+T$7xqFK!29!Y;8M?8B^#mY!^`D@>)gshRY7@KS1wV!pqLDmI9xv^}`X~DVDvU=->bs@$#5;ld{#~VGfoV)GU`R zYP-cNRnPTSM&}7zrmT!Tn-s4w?D^Pkr+I44bqH4;?hSY^gX*`gVtbW%P7zls#VB<} z-m4;^P}vA`prCTjK#e5-w<)sBzW`wES|>7BQJGJZ53 z&D7tY-n{fo%{J8ho|D4E`eRtN8&PfEF>0+Y%p_sZ%YHPuLKMa9_y(97roB2*SQ73DS!+5?*U5Lqhh! znHGZO(QteD*?D@VHg7&X|JZBGHS8R&)UO3MYa6#~!R7%Q6o6;F>$SbML#Ruro&HQofo!36piQf&fMi9H_z^D3CP+vY%XD|_Zes5` zGwZaL0HJc{)4#3KfDAZ`NLlDk?Z|VWfTY-prdf zZ{K_~2l>2#pmis|So={!=x1rfEjLyUu7Gj_S%@J^u@dhnZzos+BTKC(EUm8AwR+-Q zA_+cLvaVTrJ!z%jOIw+9Im;-aHI3@I7GthBq_ zb|9WGWZJ&dv)f$gjD}t2*Bn{oxXE+-9KHhqVg_M2p;ff3#M6&@OIcNx)kk)$S&8|v z_v^~+c+hFAF9Sl2q$f?)1ELm6_l;)haAlO`M&Xr|8c@Ly~~ zil;yb9ZJ0ll{Q9|UX+E-j0^oP|2;>q5#WXLvL84*ipV%Y8%`6V?Ic86p0EuQLT%E} zOftAGh{+RSx)doX(jd4T!?KC%m9`&NToRHBX)M^1%*rUc25?2CZ3m85S?T(o-#qgk zWsQKfiSN+L3L`!zPV}=&o1P0S(DB+BYWp&A)~WASNT*YYQ?EdVc5IY8J#l!9vn?_6 z{7usGT*69_V^$`+4&pxg3=ND!_l)TujOjr-|5NG2wz*~QojSi?x^SgW~b+;#TqI#r+lBs{w?2)`z4t#D_06?WAMl6LjlBQ~`~lDH$_@Yk literal 0 HcmV?d00001 diff --git a/Tuning-Performance/Transaction_Evidence/agent_template_backend/app/examples/__pycache__/observer_examples.cpython-313.pyc b/Tuning-Performance/Transaction_Evidence/agent_template_backend/app/examples/__pycache__/observer_examples.cpython-313.pyc new file mode 100644 index 0000000000000000000000000000000000000000..ffc9f3f317efd8a911ba0e304f92170717cec672 GIT binary patch literal 1421 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 TRpO&fFPmdDNB>EX@_GLQ)*1xn literal 0 HcmV?d00001 diff --git a/Tuning-Performance/Transaction_Evidence/agent_template_backend/app/presentation/__pycache__/__init__.cpython-313.pyc b/Tuning-Performance/Transaction_Evidence/agent_template_backend/app/presentation/__pycache__/__init__.cpython-313.pyc new file mode 100644 index 0000000000000000000000000000000000000000..8048b8f58bca2f6e8c20c61a3cccfc1a440545a0 GIT binary patch literal 320 zcmZusJxjzu5Z%29(UX&_w6)M8g>GRbh@Fjs2)WK;7?Vj@FWC)~jbf=kz|J4xzp)M+ z2v&AN{(uwI&R5L5dGo=WVK$p8K{tQCy_Wnj7Jr!hl3`oOi%M0hFVwkay{poR(L5=m zWbIQ+GtvDHQ)$~k48i*fm|RXw+;SxS%OvWz{?Ypw0ILe%RShzx`X^JnU~&v-usDW$ z&r5?Pxc~)YO=Ar{vu4pb>&k;G;=*%{E+eyGbS-AVdIx8BHm6bi*$q@T6$XME%$8!z zVAGg}sg=VxE*JpoYydcH9{Tl@+UH$Gr@SGS#`oH}gs(_zy;4W-n|p85{l}PN5x)V- CTVJ98 literal 0 HcmV?d00001 diff --git a/Tuning-Performance/Transaction_Evidence/agent_template_backend/app/presentation/__pycache__/tool_renderers.cpython-313.pyc b/Tuning-Performance/Transaction_Evidence/agent_template_backend/app/presentation/__pycache__/tool_renderers.cpython-313.pyc new file mode 100644 index 0000000000000000000000000000000000000000..defbfd70cf328aa4f3c297a74433a80341b0728c GIT binary patch literal 6019 zcmb_gO>7&-6`m!R+~uE0{m_;vM;_afV>+^ATmF@QQpa{|OEzP8&BU>45G!(}u1)Q- zvrENdlR^!0uo@JW(HLf$08x+tk%1l*^bj3#NZ~_s=z$8Ah~2t?(IN$Mb6~e>rUHW?jp})}&r?~72cRvG_8%RPDH-P#% z!eLr>4Y>N<#LepN0lwcuJWvlvd<y z;|<@?CF7hGkTp#=WmDBP13uk{wQ=}cN0brOFcp$Abv>IRijjkU1u9xbAqq)zba=J! z@b5;5yFUSy8>k%()_Rj@SG6v2VRRO_mKVt-xp!6f-+|VnK{^{NgI=e$(nGM%E)PaW4LH9Z|%*FXc!QH)M*y6e^t}E`bJi}RCHZ6fDxvZR4EZ@2DoN|m1 zoml=CwjeEvulR<^X*43U-&Fsm@rraYB?@PU+lgmBwh@zRPVIq$z^gE@e z)t+;CP1Q!Wo>9oKPDW)dt@NBDvS!F>s@Bx8F*T#mMtiKOjDjSlk{XiJmqDLBaxT}C z0~N!>>>PTkI=5AAbmzt`e`-|Ml=0LM$r3OgB*M=)3}gb`bGbdSJ58&Lo?mwrjZ)*r z#c(F~` z2i>1?2i5LsdeHC;ELrB-nIU4#O3U%r|)H^H3s?W$2~Ivcj7SxS>W zN20CJEQyplEdWlSH@hTj7A`gSy#@P+9;v17j5W>!iNusTVpnJ%2s(|IZh zR`5{XP&LIc@MUG(h-2;c2Rg_#ri_9_1lG`V@(3(%U|Gj`BY*pSqUzm#iyJJgx`>am z9uV2cJ7V`)0YF`y#u`)3TK+KrOO>vrTV4YoF>fRuMgXcoM8?sF&vsx!9p;uRVWC3s z#oB;AoTqpusb*fj{SgS(hb@n4Dw<*WGK!HVpcviaHP{w|dYu$JY`TZSNy^oSAG-GA zZvZTi#o@Tma*rsc17XN(`Bm6Ghy{Rd@mUCx7N1emCZXnQ@t1T}v)oxli-#;9 z!*LBFh2@2_$Y)K`^-1<`Vz=C+NA~Y6bWnp8LXX@4I{^v-2$Nv;*t;E{j+x+(C>HXzc&tmMz?9Na2e!O?? z`Eu`(s{@sm)|)4;pD4amZt1*wtP+kDFO|ca>7a1SyJtIq+=nAUkA+|w;8+M2 z;h=7y6#^#bzz~FGo@Qqw5T;qMb|-lNLLLJ44-<~PLo|$f>Or{VWnolU3cE>R2uykf zevt;yUY8>~WVODtwSZ1FVV6gtUGh`N1(*yZEDvN+nogRaAx|y&B9@dqW{vpvEo=o; zz)hklW@==Jc~pT12fzh4KK@)muz>{^TwOMl#NA{)OhPtL0)YX=MM47wiBqzLl4mH{ z1q7CsiD{7Cw1N7nK_j-~d$!*-FY`Mp7ugGJbdYf!$OLj6jG8uBwGjNpYn5+ zA(%1gsoJQU*(lg71aVK&1Jv6qfUT~S7z&Q9XaZOkO$@ztEm2&O5Y)!7*_S4U^`)%^ z`TsLndjq7S$=c7qf3hY&2V?3dYJO+uOQZtZ#4GXFlBgy8|1GhrrA=Dk1y|A!>0Lky z(X^Q*kQtEce@WXW>Ly+F&#XZT*G-XX=Rtj6@>1&P0uUoocZ}EJ0IXZ${M#-od9T$9kxQYiXtsu>?1X)GN8cHC0Mx+ghmO@8L!J|*)1m7L^zkl=&uPJtX$S;OF=fjt>-ZpgK0Z5#cD>-t=idO?{)#fuwRvlBwc=v&< zo|d!5q3#;13=2)@m2Y z_2^ZwZom7{TVdUP{>dj5YHV>&q7bfLjJm5Aqe9SWpcz{sXe+y$L24mf{c?;g4o|Tl zBD+kn=uDRR_U$yD+@;UbGY2 z1oYV1En_?lp9Meg;8$@1o*luEX_LjXk03loriSydhLTDV>fn~w9M8c6sJ;H$WiO=N z)kg>Rv}vo01xR`UU9K~#i{*+F4~*)Wd{#L`B62 literal 0 HcmV?d00001 diff --git a/Tuning-Performance/Transaction_Evidence/agent_template_backend/app/presentation/tool_renderers.py b/Tuning-Performance/Transaction_Evidence/agent_template_backend/app/presentation/tool_renderers.py index f77c47a..cb44202 100644 --- a/Tuning-Performance/Transaction_Evidence/agent_template_backend/app/presentation/tool_renderers.py +++ b/Tuning-Performance/Transaction_Evidence/agent_template_backend/app/presentation/tool_renderers.py @@ -13,7 +13,42 @@ def _money_brl(value: Any) -> str: def render_telecom_invoice(*, tool_name: str, result: dict[str, Any], state: dict[str, Any], agent_label: str) -> str | None: - return f"[{agent_label}] Fatura consultada: {result}." + """Renderiza somente campos de negócio seguros da fatura. + + Identificadores técnicos/PII presentes no payload MCP (por exemplo msisdn, + customer_id, document e business keys) não devem ser propagados ao usuário. + """ + lines = [f"[{agent_label}] Dados da sua fatura:"] + total = result.get("valor_total") + vencimento = result.get("vencimento") + status = result.get("status") + if total is not None: + lines.append(f"Valor total: R$ {_money_brl(total)}.") + if vencimento not in (None, ""): + lines.append(f"Vencimento: {vencimento}.") + if status not in (None, ""): + lines.append(f"Situação: {status}.") + + items = result.get("itens") or [] + rendered_items: list[str] = [] + if isinstance(items, list): + for item in items: + if not isinstance(item, dict): + continue + description = item.get("descricao") or item.get("nome") + value = item.get("valor") + if description in (None, ""): + continue + if value is None: + rendered_items.append(str(description)) + else: + rendered_items.append(f"{description}: R$ {_money_brl(value)}") + if rendered_items: + lines.append("Itens: " + "; ".join(rendered_items) + ".") + + # Se não houver nenhum campo de negócio seguro além do cabeçalho, deixe a + # composição pela LLM/guardrails em vez de despejar o payload bruto. + return " ".join(lines) if len(lines) > 1 else None def render_telecom_plan(*, tool_name: str, result: dict[str, Any], state: dict[str, Any], agent_label: str) -> str | None: diff --git a/Tuning-Performance/Transaction_Evidence/agent_template_backend/app/workflow_actions/__pycache__/__init__.cpython-313.pyc b/Tuning-Performance/Transaction_Evidence/agent_template_backend/app/workflow_actions/__pycache__/__init__.cpython-313.pyc new file mode 100644 index 0000000000000000000000000000000000000000..50d3c241e72cdbf73be6ee14d966aa174c2779a0 GIT binary patch literal 268 zcmXv|u}T9$6nuLJ5(9yBX|04S%+`X~*%%NZ=^xMCcgLFB-D7Vr!5^@+^CSGFD{QRn zg!=(^iB9p}%)ksYEf#Y~7?y9(m+60H@sHw?;KUBpCp-lD%OzFb-Dy@rBQzS|CH6DG~OKR9ftOHrj8oe@dH#p;(t49vC50;!_ zxeMfaQqg#acL$?6o2P7K+qD!KpGfW5X-Qotb64H^Bc3w7L^RGs#C7*F&Tg#NL(8{e TmS*MQeI`Gp5aJV7;Vg+?xM)pm literal 0 HcmV?d00001 diff --git a/Tuning-Performance/Transaction_Evidence/agent_template_backend/app/workflow_actions/__pycache__/devolucao.cpython-313.pyc b/Tuning-Performance/Transaction_Evidence/agent_template_backend/app/workflow_actions/__pycache__/devolucao.cpython-313.pyc new file mode 100644 index 0000000000000000000000000000000000000000..40704f84e81a753a4875c088ed75240ada262915 GIT binary patch literal 1046 zcmZ{i&ui2`6vt;K*>wABYiWhHYB#o0-9k70iHIU7T?DH|o2>^egfy95(k7WONw%mL z(StWn3iafAvj?Ha-un-1*^>i;;K|#TJ$Z8``vY2VVBUK(`M#O=K9lC)U?1QkzVKn^ zG6LYYSae2DJ7~H*_ylx7fev-F1|K4dRIr7nfG(}TmP(hmBt6BavL!7mdd~#dkyqLW zP&v`2|D)|aqfM3ja{ciGo_f!U9O8$nja8d?$KQR2r~#&)>0=9fs!vq2jQt4TR*6bu zKXN>*;xIb?Dn6B{>ES&>ck_Ql6*DEHN$V_? zRKe1O+L#)SokL9CCd6e@8Ak_*ruaEj+#8BQRF%EgJU`NGGcq-^bjuK3X$c6U+p|F| zM=Qp@@5;u+3@V!~PFL5K4u(2=+*1D233>2e;mDW=w6$*YBDb5#7xtaqdEbhDrr z3#%MuI-n#X7RRZGSB=91KnJ<14U=YgOouu~qL?aCaT*~fOsyipyh1%p|ZEWf2 z^-2F)OY9lQqd2SZO4jQ)RG%V`DT+(kW|6acRXUp zF1}00`JVWvLZ6$41R?wZ9{&U@rwTyBwc)FEIMqN9E>%YxfV*#Y;tr#xST!YprjyU7 k=|nzLhu0ej!AG#lg~A^$xBSs+Gg*t28>fkcj`1u10qkH0;s5{u literal 0 HcmV?d00001 diff --git a/Tuning-Performance/Transaction_Evidence/agent_template_backend/app/workflows/__pycache__/agent_graph.cpython-313.pyc b/Tuning-Performance/Transaction_Evidence/agent_template_backend/app/workflows/__pycache__/agent_graph.cpython-313.pyc new file mode 100644 index 0000000000000000000000000000000000000000..515e583dcac2dadded66f59ddf64e5614155a91f GIT binary patch literal 60987 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�F)SC8br^B1$BFHGDX3bc-e;?p1a; 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 literal 0 HcmV?d00001 diff --git a/Tuning-Performance/Transaction_Evidence/agent_template_backend/app/workflows/agent_graph.py b/Tuning-Performance/Transaction_Evidence/agent_template_backend/app/workflows/agent_graph.py index e6605a4..fef0791 100644 --- a/Tuning-Performance/Transaction_Evidence/agent_template_backend/app/workflows/agent_graph.py +++ b/Tuning-Performance/Transaction_Evidence/agent_template_backend/app/workflows/agent_graph.py @@ -494,6 +494,119 @@ class AgentWorkflow: "next_state": "SESSION_ENDED", } + @staticmethod + def _output_guardrail_context(state: dict) -> dict: + """Monta o contexto operacional do turno para os guardrails de saída. + + Mantém evidências/protocolos necessários aos rails, mas impede que uma + transação encerrada ou semanticamente interrompida governe o novo turno. + O histórico completo permanece no state/checkpoint para auditoria. + """ + ctx = dict(state.get("context", {}) or {}) + mcp_results = state.get("mcp_results") or [] + ctx["evidence"] = mcp_results or ctx.get("evidence") + ctx["tool_result"] = mcp_results or ctx.get("tool_result") + ctx["tool_executed"] = any(isinstance(r, dict) and r.get("ok") for r in mcp_results) + + history = list(state.get("history") or []) + current_user_text = str(state.get("user_text") or "").strip() + if current_user_text: + if ( + not history + or not isinstance(history[-1], dict) + or str(history[-1].get("content") or "") != current_user_text + or str(history[-1].get("role") or "") != "user" + ): + history.append({"role": "user", "content": current_user_text}) + + route_decision = state.get("route_decision") or {} + route_metadata = route_decision.get("metadata") if isinstance(route_decision, dict) else {} + route_metadata = route_metadata if isinstance(route_metadata, dict) else {} + pre_validation = state.get("transaction_pre_validation") or {} + pre_validation = pre_validation if isinstance(pre_validation, dict) else {} + tx_status = str( + state.get("transaction_status") or pre_validation.get("status") or "" + ).strip().upper() + terminal_tx = bool(pre_validation.get("terminal")) or tx_status in { + "COMPLETED", "FAILED", "CANCELLED", "BLOCKED", "OUT_OF_SCOPE" + } + semantic_intent_shift = ( + str(route_metadata.get("transaction_interruption") or "").strip().lower() + == "intent_shift" + ) + stickiness_intent_shift = bool(route_metadata.get("route_stickiness_preempted")) + should_isolate_history = semantic_intent_shift or (terminal_tx and stickiness_intent_shift) + + current_route = str( + state.get("route") + or (route_decision.get("route") if isinstance(route_decision, dict) else "") + or "" + ).strip() + current_intent = str( + state.get("intent") + or (route_decision.get("intent") if isinstance(route_decision, dict) else "") + or "" + ).strip() + ctx["current_user_message"] = current_user_text + ctx["current_route"] = current_route + ctx["current_intent"] = current_intent + + if should_isolate_history: + operational_history = ( + [{"role": "user", "content": current_user_text}] + if current_user_text else [] + ) + ctx["historical_transaction_ignored"] = True + ctx["historical_transaction_status"] = tx_status or ( + "INTERRUPTED" if semantic_intent_shift else "TERMINAL" + ) + if semantic_intent_shift: + ctx["historical_transaction_interruption"] = "intent_shift" + for stale_key in ( + "transaction_pre_validation", + "transaction_status", + "active_transaction", + "transaction", + ): + ctx.pop(stale_key, None) + else: + operational_history = history + + ctx["conversation_history"] = operational_history + ctx["history_texts"] = [ + str(item.get("content") or "") + for item in operational_history + if isinstance(item, dict) and item.get("content") not in (None, "") + ] + + protocols: list[str] = [] + seen: set[str] = set() + protocol_keys = { + "protocol_number", "protocolo_id", "interactionProtocol", + "protocolNumber", "finalizacao_protocol", + } + + def walk(value): + if isinstance(value, dict): + for key, item in value.items(): + if key in protocol_keys and item not in (None, ""): + text = str(item).strip() + if text and text not in seen: + seen.add(text) + protocols.append(text) + elif isinstance(item, (dict, list, tuple)): + walk(item) + elif isinstance(value, (list, tuple)): + for item in value: + walk(item) + + walk(mcp_results) + if protocols: + ctx["expected_protocols"] = protocols + ctx["requer_protocolo"] = True + ctx.setdefault("tipo_fluxo", "ajuste") + return ctx + async def output_supervisor(self, state): """Valida a resposta candidata com o OutputSupervisor corporativo. @@ -509,15 +622,15 @@ class AgentWorkflow: } candidate = state.get("answer") or "" - context = { - **(state.get("context") or {}), + context = self._output_guardrail_context(state) + context.update({ "tenant_id": state.get("tenant_id"), "agent_id": state.get("agent_id"), "session_id": state.get("conversation_key") or state.get("session_id"), "route": state.get("route"), "intent": state.get("intent"), "supervisor_attempt": int(state.get("supervisor_attempt", 0)), - } + }) async with self.telemetry.span( "workflow.output_supervisor", session_id=state.get("conversation_key") or state.get("session_id"), @@ -603,7 +716,7 @@ class AgentWorkflow: component="workflow.output_guardrails.start", ) final, decisions = await self.guardrails.run_output( - state["answer"], state.get("context", {}) + state["answer"], self._output_guardrail_context(state) ) for _decision in decisions: await self.guardrail_telemetry.evaluated("output", _decision) diff --git a/Tuning-Performance/Transaction_Pre_Validation/agent_template_backend/app/__pycache__/__init__.cpython-313.pyc b/Tuning-Performance/Transaction_Pre_Validation/agent_template_backend/app/__pycache__/__init__.cpython-313.pyc new file mode 100644 index 0000000000000000000000000000000000000000..f942810b9cfc05ca241b70854a1168fe3a02b2c3 GIT binary patch literal 220 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 Z+bQR>G}#~jVR@b>+wd2)*`9pE{{kLW{F?v( literal 0 HcmV?d00001 diff --git a/Tuning-Performance/Transaction_Pre_Validation/agent_template_backend/app/__pycache__/mcp_gateway_client_factory.cpython-313.pyc b/Tuning-Performance/Transaction_Pre_Validation/agent_template_backend/app/__pycache__/mcp_gateway_client_factory.cpython-313.pyc new file mode 100644 index 0000000000000000000000000000000000000000..accca3bf8cd6b2ebbcd3e122165a0e1718bae637 GIT binary patch literal 1068 zcmah|&ubGw6rSB|c9Z@}L#(Eahf<^%tl5I5+M+_5#?q!uOE*=dhhe&zq}y(G!|ZHB ziU;u`2r39g5W%b7JbLs`h~!Wi;;9OHs|4@PHi@))=!2bo@69*gd~fDWtG~YoaN8Yx zzWqZ0;Lr=YCbk`+mEg`k(10dn!Jj}T zjti_8S(Z%^HEhet@py1Ky*iI5uA*AnG_XZ=57;$Nj1K^z)yKu`gN<$;taZfvO>k$7 z3(~}7XJ*ZRa<1(sJ1I?^sRDpFX9;X5UEG=MK27SfpNaJ+IlE`Kh0ARR6u2_)s5XL~ z#M$-8n$q2|%cljVeV0Hym}3!sbZ|bE&)iQvfSFusb}2K*BuZS&LMNxz*OvB%wkWO4 zsH$n}$lS6WI&<^d^7gDcYorEFG(Pf-DE=UK_zxg5f=68k~rS z9R`Za6_fWB+(bH;SWr==qL%dvEVY{r>c`y%i=4zJwM3=HqMNQ^7U2INa-ORV@Xx_~ zcm$eC@Ja1)tsWkKCpQ%JKuLa9k`3j?$Ek*r`VxwK>y0(TkypbnhwHJ4dLq*Z-)#;I zzA&B|_2`wxz{J78^$$`r8hbPQcH#9xeLVds-?+Hgh-QB&QlESTB)?3~@txu#lL@9S zvGy+TTRHViMjwvmYzxO_)&pVDUNH=;kY6a@zCBzWXM|* lxK*|bu8HrE5gvN&>v)JGpCAZd!Pp@Peh10lazJRS`vW1W0Ehqp literal 0 HcmV?d00001 diff --git a/Tuning-Performance/Transaction_Pre_Validation/agent_template_backend/app/__pycache__/state.cpython-313.pyc b/Tuning-Performance/Transaction_Pre_Validation/agent_template_backend/app/__pycache__/state.cpython-313.pyc new file mode 100644 index 0000000000000000000000000000000000000000..103d670b04fbb4af8843a8e9c1e4e81da2f6b335 GIT binary patch literal 2973 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 literal 0 HcmV?d00001 diff --git a/Tuning-Performance/Transaction_Pre_Validation/agent_template_backend/app/agents/__pycache__/product_agent.cpython-313.pyc b/Tuning-Performance/Transaction_Pre_Validation/agent_template_backend/app/agents/__pycache__/product_agent.cpython-313.pyc new file mode 100644 index 0000000000000000000000000000000000000000..5f7bfa18ee650c53ae36840ad5d783868e38b977 GIT binary patch literal 6309 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 literal 0 HcmV?d00001 diff --git a/Tuning-Performance/Transaction_Pre_Validation/agent_template_backend/app/agents/__pycache__/runtime.cpython-313.pyc b/Tuning-Performance/Transaction_Pre_Validation/agent_template_backend/app/agents/__pycache__/runtime.cpython-313.pyc new file mode 100644 index 0000000000000000000000000000000000000000..c06c12481f90c7e91da14a7f3180ff98824405de GIT binary patch literal 504 zcmZ8eJx?1!5S{heoG~&Xl|_X`=K^m7MWiTFf<$o^5nrK-v|8-(Y2j}7G`q(~$sb4; zDSv^VgOutd3X+Nr$ptNQ*l9AwXg;3ad!w0kyB*-TT>EkUO91?>n}5-m7h<-@#ZNef zV=;n6km%QSW7J3@ijpQZlNPn!X3=OVi7D>G_jnU_7Ce2Bj6M|9PMd?)Q#~DsYDHV? zf)2)6KZvULpHsBqsI z9>+@QEK}+ZX52z`D{~vG1_0CE3z^<>kWlu(+w(A9FV;GyFvF*b#pZ{067zNC@!& cn=fq;r{W&IJ;3%O^nSzopU&=WOkKvj0^*664gdfE literal 0 HcmV?d00001 diff --git a/Tuning-Performance/Transaction_Pre_Validation/agent_template_backend/app/agents/__pycache__/support_agent.cpython-313.pyc b/Tuning-Performance/Transaction_Pre_Validation/agent_template_backend/app/agents/__pycache__/support_agent.cpython-313.pyc new file mode 100644 index 0000000000000000000000000000000000000000..ba05a3eb9580ed5ffb5b406494b8c3d5f47e0414 GIT binary patch literal 6020 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 ax?qN$?)bEXs(n-K`gbg)9K{u%6!-^Rv|2*| literal 0 HcmV?d00001 diff --git a/Tuning-Performance/Transaction_Pre_Validation/agent_template_backend/app/examples/__pycache__/grl_examples.cpython-313.pyc b/Tuning-Performance/Transaction_Pre_Validation/agent_template_backend/app/examples/__pycache__/grl_examples.cpython-313.pyc new file mode 100644 index 0000000000000000000000000000000000000000..0cf9b024ccde5d0fe6bf90da99198be89d2b6030 GIT binary patch literal 1873 zcmdUvO>7%Q6o6;FKepFNNE&4|Sooky5ItfMg&-{K&1mO+d)fGTEIt+t|CS zncdKELU7^4t%saai38-u1t~d^C|3@ta;P;YBrf#k$W#bUyjdrX2&y7+W2AjQ^WMIB zGxP0s2M0|AV{Q1G`#)<4{VJW4kwn1hx*#4R3o&FVR_X)g{S-@KWU2L(rPbBCR!_~Q zbjY#vx@H;hq^-=XX=NwSeU0ho=9x*J(a02X@o!LO{sC=;&46Q<;&*Ew7EKc*W;A4! zQ$He@u7T>s8!=%nBVLmi@q7!C8jQS>yj3p0S}e-f%jG%D_rDD=ZF!OB2HXs3Gr*w- z%JZpQ<+KW>IEmhgqcD!FIHYXN;{n5NfR`C*(a!?5TEq*S%5q%RHCx1wNfVQh`h??< zFoM@e({suGcl$q5j-8lCLCgD`xDbXqqyg>IqWKi|iVBKQEB?C31WO#&qD<&KA`ul? zxhvZVTq+Dk2@ia!qnPs~-m={fo8N&a)<+BtE(A5Sf)mQmCtFLUa9K-dcOx28N)tNH+}-#{5u)o-cG zN+DYn={s*(^R>l!G3*3B926&!7x?xnT^A;&oJ+@ZMK*$K@FQtvl9L9jptAwk85@*h zND4!WG>E?j=mP?{QC@7Y=9VI|PS6SiAFgOCB{Gs38v;UY&}d6z^5mIh{j>s?a~OvB zy43Qcl1m~|BFl5OM5WYgp^uIoI9};q?0bIW#$C#m0|xXsv~-UVpA#q9(OpLE#RMSf z9#@FuHvwGOOT<~FzFQ(;SUPFF1RdHZPBB~;leG5@*?qF@9$&-_*ckMigNLtxc#6J2 zZS&$2bMmn{+0I<}W#XmH!baiX>T8D+x1LPYwr~D4w==g}KfGOQ=U?2+Z{#1{KFpWe zu|3F#(a1xXS82?9PEa%gWx2QYmPAR}HWWX_2;VH*joQ7}0tN9|w~^DxtZa6A6_^EP*!Z zdkb|TgnB#7yxt1jxJln+GcYHAV>|}YQ58iwO6iLBYzQf19V4e0Kd2o9YWtntkzHqZ ze5abY2OoXX({7`uo8j*=tur;C7~j9$L7=v^ZEJUC`{SLV#67SUd-_wSr&pTKWEz`> GmH!3;=DtAy literal 0 HcmV?d00001 diff --git a/Tuning-Performance/Transaction_Pre_Validation/agent_template_backend/app/examples/__pycache__/ic_examples.cpython-313.pyc b/Tuning-Performance/Transaction_Pre_Validation/agent_template_backend/app/examples/__pycache__/ic_examples.cpython-313.pyc new file mode 100644 index 0000000000000000000000000000000000000000..479518dca9a87256a0d9713aeba25770a05594b9 GIT binary patch literal 1829 zcmdUv&2Jk;6u@Ucytda#l`q=F5zWv>P*;h4prwimNQ+y9p-M|OEFLU7>5t%sb_Be{W)kb9z0|AC-L)Y=mgr`{Ze3c-mtYdcgC6^I)n?faPb-hBRM zk48sz1Z{KdtM#gi&@aLnwm1UL(MKTeA`>xWN~Zjd^tQ}oj7+5>n`%X=s1^B=oPZoN zQBh6JOkPTvsVrJoS>kVU(vYK9v^Y;UGjU$Bk<5*R-@_2sw`jBF`W)9NE*0@2E(NqH zoTBdq%y(&C*Gol?8ErAjsTYtYrkkMqB_3@&{LXg#JihKyj*06u`#B}A?z1L=kVo7F zTnrhh`OF~;I)RRM;MjZtzu`3A4Jm75Kg4%J;@$xVx5BFH@HMb(->W-~xDtClt~1i4 zANy=0uRn&Bqns2ehS!c#ew9 z(N7@GBMgUKMk~@F`jj%Ivb6Ga$ zGzP~Chs8+%cVlhPcBFI4xp3gT(gF2|7YH*&8gQ3j4~j*_(LK&c%m4I1PW2B;$@kc~^ZI8uyp^kt#x1%(<3NP*OsEOEJo z{;bEBZTYrSSPebLYb@TPET+n{XV4=M*&SGqH2cV@O{?p-~YDRifw-$`$$?_E5Y zUhHP)57UXX-Wx%axHpb6vptl~XuqL!LOT-TcRm3#eQwMdIce_&$#_ZKJEwsiWd_^z z;2lJ=zhR409kw(WG1FZz{%=f|6`(rt@2DOJs*R#?Q!rh;Q7&CGnArOXM01G~9qc)g zbXtf}Ax;S~1_J2*i_YUDF8Tmb%qGEzP7nDYHt_`=wi^O&Y#M@R;Nxo`PQWqyU*MR1 zu{$w!n9+cbQ-Y7lm=9g>p$k4h4EeyuMQQJxWL!}9&TC-jQc=>fYQAk*kruRD@M4&F zXpvfT>>yHjz+#vqwd(tBy!2gk1PQ3W$JDD$zZSamb%vo&{NH#JL{E_<=}=ZB^~ng5 z&h#{0(!REP2vldj!ygnoTle#^yMO!rzW%WKs|fe98AyG(hd_N3bczoqJ8ymaY3%N= TzSq|ukiM?3KM`qc4rcrl<7cYd literal 0 HcmV?d00001 diff --git a/Tuning-Performance/Transaction_Pre_Validation/agent_template_backend/app/examples/__pycache__/mcp_examples.cpython-313.pyc b/Tuning-Performance/Transaction_Pre_Validation/agent_template_backend/app/examples/__pycache__/mcp_examples.cpython-313.pyc new file mode 100644 index 0000000000000000000000000000000000000000..2baa2d5e5e1e57597175415e3505322a0cec59e6 GIT binary patch literal 1971 zcmb_dO>7%Q6rT0|*j_tsVn-qC0^KwLb)m5lZAAkVDN0%?AxT5F;Q*0V)7?qBjlJW} zuG6F{QUn)HNE|BYsj0Y>L#6aYk5uWQM@K%`T5+hvsW(Sag%B6sI9?i1jfBKV^XC1` zy!Y*!d2jc7dQ=2st@oR&e@F=Z%7tj8JIwwxFt?D27%~Mj_OUP>V=*0>;!@0%V9HD4 z60E0VGVC*zCCQBcO_Kmy+DzurRf)+fs*$SRhmGggNx4#@zU~lxc4A(CTc4UJsOm+1 ze1&+yLe&f0GMRPPT~EKdb62lW->as^$Lw0w zU88!L`T@f_RV&zGJ3mmpfGn)Buuug9xjtGUcnnBik(nlB&aga z<_U@h&+b<+_s_-<8b&%~crmshMCKQ(DV*tO&j}|wYNrpui7xwN(SA=}6c)r6o+8c^ z7v(NzrRZ!IyZo13G?fC}w3!$ar{HZ|fjDczEpbjxb7W}Y@V9mXFN%v&7r)8K@1bvm zyy)m1^wOND-S_|Z2xe+b`sX)zN|)TF|Bu{#9*^!~Q89Z=bf$AlW~Lx_&8aei5@>E4 z<~&UGJ#kquj?9IpvcvsTGQsQU17x!^iCvQSk}Ue=|H7iX-A@tK+Plkh}| zhrIyIVFL4N1I~~bf03+*lME*u;*B&}$55ukFF?UT0VHi&u22uogz--Kg}s-nzUx8A zs346PgZGKTUdr4R*TbdAa3cd~4kL-tRYQJRV3q?1h7^h`1R{~L3mENCvT>;t#zBXJ zfEjTHEekRJ(wM>ths+Y3@NeN|=T}RC&(-?D2){0ty`bpe02lG{n01}9)#5=8mKoG6 zmn~|$#YiI$= ze|r0PLmS)G#%k}+)V0}$X4XD2qhMooZM31C+RnC;sDGq|iIHl<_!N9`^{7gVN(nn;#IkW{}f4LkZ)SM^U2vqUR$nV=U}CNEx2CWxLFHs?$R&Xx)wqcu?w;1 J{5aFW{hwev&>8>$ literal 0 HcmV?d00001 diff --git a/Tuning-Performance/Transaction_Pre_Validation/agent_template_backend/app/examples/__pycache__/noc_examples.cpython-313.pyc b/Tuning-Performance/Transaction_Pre_Validation/agent_template_backend/app/examples/__pycache__/noc_examples.cpython-313.pyc new file mode 100644 index 0000000000000000000000000000000000000000..912d680d7c2c2f6b50e59ec85c7a6aa6429dab9d GIT binary patch literal 1918 zcmdUvO>7%Q6o6;F>$SbMLug8u3>=^)AH(^Yt!q zaVK!8A%lAi)&MhdcG%soL(d6#*|;wYX(~dk`aO{ju5ijWC=*E@LTVyKI-cESEs>RW zm)j1+6NXINcY1c43!Txh%lw)niySw3ZlA%oFF=$Kh7(#rOG-TbsJE0AWl4Qx$C{Ox zAA7&9%#H`$rx8SYg1;L3KVe?`hxz26^NAI81xP9DR?12*sBZyVS0Td<<%U{I<{*P6 zN~2oxoZ3*#OiieBbFYd?C-9+aoP==F_8RR8gHz6>;khCM#Ug$v)ii0sae-#)ED!r) z6H+_{Lg-NH6{xf^s`R2PbY@)Wclqx*dYu3-l$ZU$*;Yix3EFU)5N$gl((;6Dm=J1{ zhGvq%bwNy?2-BrVNs$J@twh!fTWQF6F0VTqH z0LuRlcYqz9#eWI=X(pfE$KVCx9-}!ISE~laVzQ)cN{WM0OoK4Bzd$-8MARCb71prg#U(LT(h(H7IMwF9@? zqHnMlVN5=H{6i2!RZ)}&iKL=EoIuL6Lp`VHUrh}Wbl)uZOMTv-z4d-%e&` literal 0 HcmV?d00001 diff --git a/Tuning-Performance/Transaction_Pre_Validation/agent_template_backend/app/examples/__pycache__/observer_examples.cpython-313.pyc b/Tuning-Performance/Transaction_Pre_Validation/agent_template_backend/app/examples/__pycache__/observer_examples.cpython-313.pyc new file mode 100644 index 0000000000000000000000000000000000000000..bc15baf22c6f71c20467bfaf2307ccbe6ac12748 GIT binary patch literal 1427 zcmbtUO>7%Q6rR~#uh*MY)JbWTI7nMTfvwuz62ebKL5hu4Tv9voCRJ4|t){yZcN=?m znOz&)1FGN*5{HU2H+rHyks~P=PN-21vF3!tsW(Sag}Cv?ctsVpaOjif?R#(Ld-LXd z&ptSEL`NX~qu<l5%jy z$vNth>g4CqO@-y!s;Tt|gqt+!bt5BYzkHttUS#-@(YT&a)~C$yA{IxCq(MKjbbURc z22E0G5cX*gLa+@$FX|8jz;WOcBPNU(waOWz-l!PVxY%5=^hcsl6LWbv9B?g~a_ z9W{Z|!{W$SPd@b~B||znOLBn6^KuPXzX3V=_>Nr9O^aJmQ&4?K9PK%C3O){rQ~2MU zx-(_T&#JVIG*rI^YY|rA9eD$r({+B-i$Z980xge1casjdp3o!_PT=2~sa34%)#~Nd zm4;idUTjoq4X%+k4O7@PC02kMnV8sHMfy4E#vPhiS-)Wb3NSBm6vA;no26;2R-4O^ zr@p+x^Nq4oZCvB$Ns5k{HSW*vYk zq8QPPags!|+As|MwcQO<+b1cp$;Ns2vxsfl|2$!XkuDX!8+n1f)(eBMeRh?yjfizg z=uvx(kuV|Nn3`2a-7BO6GcVjphLpmaVW{2f#M`8yZ<9E-GbZee2{(&a@qix}wFk_l zeV`>u0GYs#Fkvr3xq{B*H&BnzZ8R(%|8DNvxre2*yG3iSSi5)XC-c6!wX(ZdyM5_* zeP&Oe-_hrX+QRU}$sY%I2V3*I_J=!KbvScslt)vg5mKhqKarAC!2&gnre^o_(vDsl zYA-zBtGIkldGMMlYzqs0PH0o*dDrzL&vm()4r1sK6OHAHA9yL3la!5_yNeDW zir6u+r(Nhqey>A6U<=@izl-DzP$L;*yf4XEd8{LRVx-Pu^@le{2tN1Ht;)}{TOZy3 PV(k9<%3~2_B|!ZR#64O6 literal 0 HcmV?d00001 diff --git a/Tuning-Performance/Transaction_Pre_Validation/agent_template_backend/app/observability/__pycache__/__init__.cpython-313.pyc b/Tuning-Performance/Transaction_Pre_Validation/agent_template_backend/app/observability/__pycache__/__init__.cpython-313.pyc new file mode 100644 index 0000000000000000000000000000000000000000..515f833847f014652c17345d56c17b28d03f09d6 GIT binary patch literal 234 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 DOU7as literal 0 HcmV?d00001 diff --git a/Tuning-Performance/Transaction_Pre_Validation/agent_template_backend/app/presentation/__pycache__/tool_renderers.cpython-313.pyc b/Tuning-Performance/Transaction_Pre_Validation/agent_template_backend/app/presentation/__pycache__/tool_renderers.cpython-313.pyc new file mode 100644 index 0000000000000000000000000000000000000000..fde7777ab971fb4e6fc08727626997f9e34a1352 GIT binary patch literal 6025 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 literal 0 HcmV?d00001 diff --git a/Tuning-Performance/Transaction_Pre_Validation/agent_template_backend/app/presentation/tool_renderers.py b/Tuning-Performance/Transaction_Pre_Validation/agent_template_backend/app/presentation/tool_renderers.py index f77c47a..cb44202 100644 --- a/Tuning-Performance/Transaction_Pre_Validation/agent_template_backend/app/presentation/tool_renderers.py +++ b/Tuning-Performance/Transaction_Pre_Validation/agent_template_backend/app/presentation/tool_renderers.py @@ -13,7 +13,42 @@ def _money_brl(value: Any) -> str: def render_telecom_invoice(*, tool_name: str, result: dict[str, Any], state: dict[str, Any], agent_label: str) -> str | None: - return f"[{agent_label}] Fatura consultada: {result}." + """Renderiza somente campos de negócio seguros da fatura. + + Identificadores técnicos/PII presentes no payload MCP (por exemplo msisdn, + customer_id, document e business keys) não devem ser propagados ao usuário. + """ + lines = [f"[{agent_label}] Dados da sua fatura:"] + total = result.get("valor_total") + vencimento = result.get("vencimento") + status = result.get("status") + if total is not None: + lines.append(f"Valor total: R$ {_money_brl(total)}.") + if vencimento not in (None, ""): + lines.append(f"Vencimento: {vencimento}.") + if status not in (None, ""): + lines.append(f"Situação: {status}.") + + items = result.get("itens") or [] + rendered_items: list[str] = [] + if isinstance(items, list): + for item in items: + if not isinstance(item, dict): + continue + description = item.get("descricao") or item.get("nome") + value = item.get("valor") + if description in (None, ""): + continue + if value is None: + rendered_items.append(str(description)) + else: + rendered_items.append(f"{description}: R$ {_money_brl(value)}") + if rendered_items: + lines.append("Itens: " + "; ".join(rendered_items) + ".") + + # Se não houver nenhum campo de negócio seguro além do cabeçalho, deixe a + # composição pela LLM/guardrails em vez de despejar o payload bruto. + return " ".join(lines) if len(lines) > 1 else None def render_telecom_plan(*, tool_name: str, result: dict[str, Any], state: dict[str, Any], agent_label: str) -> str | None: diff --git a/Tuning-Performance/Transaction_Pre_Validation/agent_template_backend/app/workflow_actions/__pycache__/__init__.cpython-313.pyc b/Tuning-Performance/Transaction_Pre_Validation/agent_template_backend/app/workflow_actions/__pycache__/__init__.cpython-313.pyc new file mode 100644 index 0000000000000000000000000000000000000000..6003863ca75eb204e294e1981dbb06efba82a9a4 GIT binary patch literal 274 zcmXwzze)o^5XN`!K%x*xXKN)~p<4%n51=4{1lwWUn>*I*pJQ(?!FLclAHr9a$;k{0gj)&0x;erfZOhMoUL4_ X2TONx#^rMTK8xQ{O8F%&;~B#r$iz?K literal 0 HcmV?d00001 diff --git a/Tuning-Performance/Transaction_Pre_Validation/agent_template_backend/app/workflow_actions/__pycache__/devolucao.cpython-313.pyc b/Tuning-Performance/Transaction_Pre_Validation/agent_template_backend/app/workflow_actions/__pycache__/devolucao.cpython-313.pyc new file mode 100644 index 0000000000000000000000000000000000000000..e179f6df7dc9513d53c9ef42134c22e5ac5750ad GIT binary patch literal 1052 zcmZ{i&ui2`6vt;K*>wABYiWhHYB#o0-9k70iHIU7ErQijn{5wT2x&6Aq}^n~WOj>s z5k2ckp`KiC_8|1wd;ftgdvZV!JbBx)CvVPVe?SWk%zJN=@4R{MGt=nr?*U?zFMZg( ziU9a67wys23K~Tbd;%t*z=S4Rg^v+MI@m@Nz*LrCQ)Q~#ikT2o+g27evuh0Os!Oc| zRE@RC|7g3OmFFt*!sX>9tk4d#kx!Ulkb5?^bk|u4zPoLJs`SWzyZT|b)wT! zz&s!8IASMX<*z)oeY{WTUiOcyA_Mt=T;+>o-?HPxJXN-fo@-Mp#IENOu7$SP6!ApF zY=*f;F)Pu)5m-7y6VW>{8xMt<1iHimU$hVaun9JljaNrtt7#bJ2MTU#Z zq*!unk_}%{Rn{ksEHoMy<_~xSe)SD~%pFX9nf^Rod0rcvtzDk0_Rd$;`M;6WzP*-) ze2C(L7cnYspp)?&ZOJmGt&5;ddlQ&Q9+d(M$W%-Mhm8}^nUo`LDSb4U& zV&+zs1<+(j2_uexs>!=8MTda)3snm#O^KKew2j;!rG=4=)HQG=eNe9Ko~Gxj@7E9=eIPxF)q6$|4 literal 0 HcmV?d00001 diff --git a/Tuning-Performance/Transaction_Pre_Validation/agent_template_backend/app/workflows/__pycache__/agent_graph.cpython-313.pyc b/Tuning-Performance/Transaction_Pre_Validation/agent_template_backend/app/workflows/__pycache__/agent_graph.cpython-313.pyc new file mode 100644 index 0000000000000000000000000000000000000000..8604cd4cf4a61e6e014cab3af2d5c818a673ef17 GIT binary patch literal 60993 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 literal 0 HcmV?d00001 diff --git a/Tuning-Performance/Transaction_Pre_Validation/agent_template_backend/app/workflows/agent_graph.py b/Tuning-Performance/Transaction_Pre_Validation/agent_template_backend/app/workflows/agent_graph.py index e6605a4..fef0791 100644 --- a/Tuning-Performance/Transaction_Pre_Validation/agent_template_backend/app/workflows/agent_graph.py +++ b/Tuning-Performance/Transaction_Pre_Validation/agent_template_backend/app/workflows/agent_graph.py @@ -494,6 +494,119 @@ class AgentWorkflow: "next_state": "SESSION_ENDED", } + @staticmethod + def _output_guardrail_context(state: dict) -> dict: + """Monta o contexto operacional do turno para os guardrails de saída. + + Mantém evidências/protocolos necessários aos rails, mas impede que uma + transação encerrada ou semanticamente interrompida governe o novo turno. + O histórico completo permanece no state/checkpoint para auditoria. + """ + ctx = dict(state.get("context", {}) or {}) + mcp_results = state.get("mcp_results") or [] + ctx["evidence"] = mcp_results or ctx.get("evidence") + ctx["tool_result"] = mcp_results or ctx.get("tool_result") + ctx["tool_executed"] = any(isinstance(r, dict) and r.get("ok") for r in mcp_results) + + history = list(state.get("history") or []) + current_user_text = str(state.get("user_text") or "").strip() + if current_user_text: + if ( + not history + or not isinstance(history[-1], dict) + or str(history[-1].get("content") or "") != current_user_text + or str(history[-1].get("role") or "") != "user" + ): + history.append({"role": "user", "content": current_user_text}) + + route_decision = state.get("route_decision") or {} + route_metadata = route_decision.get("metadata") if isinstance(route_decision, dict) else {} + route_metadata = route_metadata if isinstance(route_metadata, dict) else {} + pre_validation = state.get("transaction_pre_validation") or {} + pre_validation = pre_validation if isinstance(pre_validation, dict) else {} + tx_status = str( + state.get("transaction_status") or pre_validation.get("status") or "" + ).strip().upper() + terminal_tx = bool(pre_validation.get("terminal")) or tx_status in { + "COMPLETED", "FAILED", "CANCELLED", "BLOCKED", "OUT_OF_SCOPE" + } + semantic_intent_shift = ( + str(route_metadata.get("transaction_interruption") or "").strip().lower() + == "intent_shift" + ) + stickiness_intent_shift = bool(route_metadata.get("route_stickiness_preempted")) + should_isolate_history = semantic_intent_shift or (terminal_tx and stickiness_intent_shift) + + current_route = str( + state.get("route") + or (route_decision.get("route") if isinstance(route_decision, dict) else "") + or "" + ).strip() + current_intent = str( + state.get("intent") + or (route_decision.get("intent") if isinstance(route_decision, dict) else "") + or "" + ).strip() + ctx["current_user_message"] = current_user_text + ctx["current_route"] = current_route + ctx["current_intent"] = current_intent + + if should_isolate_history: + operational_history = ( + [{"role": "user", "content": current_user_text}] + if current_user_text else [] + ) + ctx["historical_transaction_ignored"] = True + ctx["historical_transaction_status"] = tx_status or ( + "INTERRUPTED" if semantic_intent_shift else "TERMINAL" + ) + if semantic_intent_shift: + ctx["historical_transaction_interruption"] = "intent_shift" + for stale_key in ( + "transaction_pre_validation", + "transaction_status", + "active_transaction", + "transaction", + ): + ctx.pop(stale_key, None) + else: + operational_history = history + + ctx["conversation_history"] = operational_history + ctx["history_texts"] = [ + str(item.get("content") or "") + for item in operational_history + if isinstance(item, dict) and item.get("content") not in (None, "") + ] + + protocols: list[str] = [] + seen: set[str] = set() + protocol_keys = { + "protocol_number", "protocolo_id", "interactionProtocol", + "protocolNumber", "finalizacao_protocol", + } + + def walk(value): + if isinstance(value, dict): + for key, item in value.items(): + if key in protocol_keys and item not in (None, ""): + text = str(item).strip() + if text and text not in seen: + seen.add(text) + protocols.append(text) + elif isinstance(item, (dict, list, tuple)): + walk(item) + elif isinstance(value, (list, tuple)): + for item in value: + walk(item) + + walk(mcp_results) + if protocols: + ctx["expected_protocols"] = protocols + ctx["requer_protocolo"] = True + ctx.setdefault("tipo_fluxo", "ajuste") + return ctx + async def output_supervisor(self, state): """Valida a resposta candidata com o OutputSupervisor corporativo. @@ -509,15 +622,15 @@ class AgentWorkflow: } candidate = state.get("answer") or "" - context = { - **(state.get("context") or {}), + context = self._output_guardrail_context(state) + context.update({ "tenant_id": state.get("tenant_id"), "agent_id": state.get("agent_id"), "session_id": state.get("conversation_key") or state.get("session_id"), "route": state.get("route"), "intent": state.get("intent"), "supervisor_attempt": int(state.get("supervisor_attempt", 0)), - } + }) async with self.telemetry.span( "workflow.output_supervisor", session_id=state.get("conversation_key") or state.get("session_id"), @@ -603,7 +716,7 @@ class AgentWorkflow: component="workflow.output_guardrails.start", ) final, decisions = await self.guardrails.run_output( - state["answer"], state.get("context", {}) + state["answer"], self._output_guardrail_context(state) ) for _decision in decisions: await self.guardrail_telemetry.evaluated("output", _decision) diff --git a/templates/agent_template_backend/app/__pycache__/__init__.cpython-313.pyc b/templates/agent_template_backend/app/__pycache__/__init__.cpython-313.pyc index f6a2b79f0ac62dab88b9458890c4272746a21aa0..ee504c1e0c9e249822507350c3be476b71686e63 100644 GIT binary patch delta 63 zcmbQpxPy`VGcPX}0}$wW_e|tA)(F?n%`4GQNi0d!PfW9nFV8Q^)=x}N%`1sdD@x2w P1@YtalQZ=v+6MsuP7D;U delta 24 ecmdnNIFXV2GcPX}0}ya#7fj?fW;B?X76brAWCfc5 diff --git a/templates/agent_template_backend/app/__pycache__/main.cpython-313.pyc b/templates/agent_template_backend/app/__pycache__/main.cpython-313.pyc index 08f8cb6c796a90e7306597eb22f68a0d4d0fce17..521accbaa6ac25caeb3de85d7face79bce936781 100644 GIT binary patch delta 48 zcmX>)kLkudChpI?yj%=Gpy%DQk$a}FNU(lxUWtB6Vo9QYVwz=qd45s0{^q5^3#tKf CTo54u delta 29 jcmcaHkLl<JM!V9VaiQ)+@ diff --git a/templates/agent_template_backend/app/__pycache__/mcp_gateway_client_factory.cpython-313.pyc b/templates/agent_template_backend/app/__pycache__/mcp_gateway_client_factory.cpython-313.pyc index 8d7093dfce13eaaaafdbe36e8ab554a88679460a..0e8f5864846a0512a8acd326bd19dc8eb09d24cc 100644 GIT binary patch delta 66 zcmaFJ-oe5BnU|M~0SNTGdp2?>GihY%=jN5@rzDmn>L;dI#+T<8W$P!Vr{N`UI@I9isl#<>faC); z;WAoq8ErUA2hP%ktJ8zC^ua7Hpj`%VF+-4jlN*@XSV8VH2JyH};IgJ5I~C2~d~-O< z0>lcoEaFbL(zM>ZpE;0GB{8`qvn(~fq$n}37{t!cyCsm5SX_cEvYC%nfLYESsP{7v zGu#T%&&?~*Pf09E)K5&aj4#hG%GRH($q~S)J-LeGla$Pi;04MvB4+YkW>LE#CN;x& z0rL!tiFubNkZTA2G delta 345 zcmew<_D7WOGcPX}0}xnhw`aX(o5)wpXtA-WiII_IGCz~-lFy9C+Zw#_$@(N}FL6BKyAn{=HBJOkx zP0P*CnFAR&$FcG;bK3%iKLattEyu}S9082{lW%i;+WeAJk&)4JGB>xbBS=A!Cy4L@ wsp7E7%}*)KNwq8T1#%gIxL6EGd|+l|WW3Ly_=U}sQFVgk0@cq9Kn7SJ04CK$&Hw-a diff --git a/templates/agent_template_backend/app/agents/__pycache__/billing_agent.cpython-313.pyc b/templates/agent_template_backend/app/agents/__pycache__/billing_agent.cpython-313.pyc index 4e27b2050509f616535e4eeacb5853c87efd3d19..7a1b3b5b6e91f06be677054801ac4a1530302c3b 100644 GIT binary patch delta 1241 zcmYLJO>Z1U5Ji?Fp#?{X1LryhY49os4jhf`peSpvm5s%L!%+0pnvQ$AC;ed@E}KJs zKqMqiAdw&uaYU>9g1PbwazgnF`~hCg>>6Kox~sbCy;raN&zeRk4}psSCc5NGY`F zDAfOkPiKwI+`sOB55&2!+n<~kZEAQiRfBB1v<4kegmV9<@zwxLDB8si@v#x& zS~`&rBq`%XMMmLV=b-68U6J+173-TorlbrovA&e2V`5~J#}gY93WT{_X$*x!iAKg) zl9X)ln`hf1wyCHIrYO6LTI4|5T5n6_+OTst3@8@&7e}YlEKZ=60AbrX$pO?=h8)?a zWr(eSMk}iX#95*rz`lzs|+sd(anboK^Bl1XFnT>=$LeCG_suuhnq3MGMNf zQ#i;x84%&TKRMH3;bkf=v$kF-6wdYvC&<0TlpJ_*L#ZMwb%sGRqwL7AXNziE^|WxmZtMkw zIA1J|Dms5S!zFjHmcrK7E<9%ZL~)$^wZb88;Jh%_>S8d`jCc@ns`mI4`mCsf($}^f zluijhPYOmej7nh977Sn}7kV8!EI?)l3@Rn$S_qYPYzDRif=FM^=7$fCq0IdJQ9Zv` zFAnEt#}%Ehqrc~e7yeV Iqg%WG0j)XKB>(^b delta 178 zcmZoMe4xSinU|M~0SGv=3$o@4ZR9g$Vzk+u&6L2wG?QWSSuWjrg`m{pg8aOcM1|!1 zT!rME#G=%yL>-0vq^#7E%(Bds#FSKpRE6TyT!rG&^wgrvB89}m%MWi&Emp`oyf|N> zI6o&dIkO}&C9zmfA+$JE0jMFrSi#phK%uZSF)t-wAte)J{^7M{shP!knk=_?iz|yu bQgh=Ait=*{N;a4Av$HbgFm0|EVPydTBNINQ diff --git a/templates/agent_template_backend/app/agents/__pycache__/orders_agent.cpython-313.pyc b/templates/agent_template_backend/app/agents/__pycache__/orders_agent.cpython-313.pyc index 803273ebcdf8da5b54ba9c331ff49f25081bcc29..92838379c54fc4e7454ef3cf831ce2cd9d8e9b7a 100644 GIT binary patch delta 908 zcmX|9J#Q015Dg|m=p;u_&`%kmQ{2!{8Ycl16G!-~n{eH2A@7K@wuO8j`wsEhw`Fvnq z9Ml|nz|H;YwGXEQejzSaO<*heUU{Vli&5{{&EDSi4ir{oqAU@wccWy(DDcM}E-#eR3PgO$6FPwIhD=eXq{lFC$O(Puaq zm!zFCNxRyUN^Jz0P@T$~6)>=hs~aoj6HMt!b2RoTC|O-wXvk(+&fxr6l0Y_HZ3Fw} zZqekH^UO|Tm)Xrm2McFWm6@p2?e20mD;T9RnLL4YThbH*rPkdfTzw-Ua<{uFbj-Bv zbbu(9mQA>d1d_H@90?^07IWkc0Yb7&-72f4Pm(-7`@K-+^$<{9^QgSONah$rcB)hI<$_>prIRwOHIaIgV-Jxf9 zUAaKPv^fP*@IvHn+SPN{SN! z`*Ggvn>X)$-+Qb7&vniWem*duNbuMD+v`8gr~f>-;+a#6hG`dT*v3U%f4cfJ%3dzw zZDQKhI>QFxc9p7H(OviaF){#WUxnxMi$S*#o7hWx6JFN|B;}NA1hTFkxGbzOZpq^U zCj@2%B90@ID>BbPlFCzsh#9U(&&lpVa3pxLB3HuYQ|_O<33n)vbbk{FN9X#U5-v&- z-%O^C4^N+cUXpM|l8yt+JQko8xDlUS@$`>ZJe6Q2RGxdYc! zp07j(rSEvk3+^w1qbG95;qwJQ1Rio*-ZA(6;HbRl{yTV5F1S~GX}RcTL(lU3ToTF- zeSK!B;43fl{LfbWr=*Z{$y=fVUl6zi=qU{Y%B6LIo{&`f44(Jk8GF)Om*-FK{Uh`v zd8!v`FnUX?5!MS>HnttB7sj?tjD}5WYzE45%gW+)#`)>_31gJ?{5KuKZui0_$YwRL zO6DVM0p7D5hdc*F(g%H1L3Jkm^6cQms` zk?L4BB*UsNliPhqhE=<7VO6CLjD~pCguv8cD(RaRu`G?6hsTbBXtg}5QPttq0|_^6!puJP zDmEIhA_ijnd$yy)x`7!+P>rtf;tR@#!Hc#W-NqK=!DpNEt(iP1wzXT>$|I9sbwqMq z$J>HW6+<@(GJ$BG2Uyg^O^s*4lYodqU=^DMcvPZ;v?5kNJSfd&wy{YLuZ31cSl_0o zK|w8xFw{RM#KAfQJ(h{Vr-@6(h`}d9NM9E5jBVoqj2I{PF|Zg#APnZu#0*{7+*-S`v7Sd;mFv~5i`DYl*0qg1 zDs5e_u5NB_-Qce-u3p~USm%vM9blIaCT|sB2DC6V6YF{27`n!l>ksP-1Q<0aP|4lJ zU0f%jdyS|%X5i_l!0gekX5JDd3W3cdLP0(FfI&a-OQDTz>^>iPReoykpOH6ZIqI^3 z>hcQzG@SwHonUyoN_d=V1K-vuuJuBPV`Z@^@UWr)$o=m?-ZSdk8ymbQH~*D7)k)2@ zQggeRcIvy`#8f9S(@MC}_l6&=ubnJ>pKJ#GY)E5$82*0lY0ul9h delta 919 zcmYL|Z%7ki9LMjuJGb4PTW(I>ZB8Gj-Zq^lE!--!KWdp>inT@%gdXmcsoV5!i;BP~ z=v_iQL{V>oUgV1kWBDowL~w#{Hhi%mQN9Rz7m7*sCVFmr(F4EFeSg2_`+M%;?s*YQPx5nBO@)?Ytolw>NrmisPso#QGn?KZD@vR1?^~w;emjbnLadPV9*by`N)5# zSEM68)X2I!$F zj2%-#(KNhqP4(bZ(|;+V?EzAuvO)VAm??1$Mb1^=T+fD!oKWC|lCAz}*W<2IO|Vo` zw<`pTLZ~2w^5LOv;X=uKtmq9Fyy5)u;cf55l1D6hf(1`-rFYwNX5UC#ZF?-?68Ee` zE!-oRTFWnjFU9)w R@wU4Fgz~j*hlDQ5zJHRS^~C@H diff --git a/templates/agent_template_backend/app/agents/__pycache__/prompting.cpython-313.pyc b/templates/agent_template_backend/app/agents/__pycache__/prompting.cpython-313.pyc index eda48f56cae61bf11461b26c11974f94f0c0418c..f4cf1727ecb3bcaa175324fc5298cf560d52708b 100644 GIT binary patch delta 66 zcmeyyF_)A3GcPX}0}$wY_iW@AVAhD&&&?~*Pf09E)K5&aj4#hG%GOUzPt7ZdPb*5y SO$G7e^OH06H_I?bF#-UTbrl={ delta 27 hcmbQs`Hh47GcPX}0}ya#7i{DfU}m(~?93d+2moD*1_uBD diff --git a/templates/agent_template_backend/app/agents/__pycache__/runtime.cpython-313.pyc b/templates/agent_template_backend/app/agents/__pycache__/runtime.cpython-313.pyc index df7bf1540128d98ce4730c2b8fec5005d9603a10..a2df5a5f712a02bd579cea89907b04d14e3b5c8b 100644 GIT binary patch delta 235 zcmcb?bcLDsGcPX}0}$wY_hikO$ScX{Hc?$wEtnyg*_+Lay@*|bA%uOzV~Ge5709ca=m_W1b3oSgXhl?onGO@^$*-w*w;!P_- z_W1b3oSgXhl?BNhh#aB<9GMnx0 zQFe++ra-@C(ha~fJ<~m1E45P%Ty<3&7o9L#Z#;aV^Rb+v| zTI=#P2d)(xgP^cTVgw5kP_ttr$wPC|p8~r$^1%xDqaI9?1P7%v=u~XSc#5U4n5S&; z9&=!V45N$cRhLGT;UE;V0tHVF6;a!4aJJwTgQQHn$?eW7xyw@obUUgz$St0Nm3EU>6`OJt p1_c7TeAE@l delta 24 ecmey*c!QDqGcPX}0}ya#7fj^NW3-&OFb)7zE(Wv! diff --git a/templates/agent_template_backend/app/examples/__pycache__/grl_examples.cpython-313.pyc b/templates/agent_template_backend/app/examples/__pycache__/grl_examples.cpython-313.pyc index 8fc575e974f16282f77fcefc646c95e92424d76c..5a027786169bdc04fef0b048c5badf4d1e6beced 100644 GIT binary patch delta 66 zcmZqUTg%7&nU|M~0SNTGdp2@AGi#*i=jN5@rzDmn>L;dI#+T<8W$P!Vr{*T%>FnU|M~0SGv=3pR2)Gc($5E@R%#3;L;dI#+T<8W$P!Vr{nU|M~0SGv=3pR4IFf-b0HfKJ?3;@5+|GQN831Dj2NVDR diff --git a/templates/agent_template_backend/app/examples/__pycache__/observer_examples.cpython-313.pyc b/templates/agent_template_backend/app/examples/__pycache__/observer_examples.cpython-313.pyc index 3b7d6a833e47c463be3fb2fd1743e45642680257..ccfb7552c1ab3a36707e78660abf7a542932b212 100644 GIT binary patch delta 66 zcmX@X^`49SGcPX}0}$wW_iW_$WY);k&&?~*Pf09E)K5&aj4#hG%GOUzPt7ZdPb*5y SO$G7e^OH06H-|ERW&{ANEf!Y* delta 27 hcmaFQb%KlgGcPX}0}ya#7i{GAWM*{QT*LgC5ddaS2SWe= diff --git a/templates/agent_template_backend/app/observability/__pycache__/__init__.cpython-313.pyc b/templates/agent_template_backend/app/observability/__pycache__/__init__.cpython-313.pyc index 9144c5b2b50b996926c88cef775c6df54df4f3b8..288f277b4898c4943cc4bc2ea21635e1c65ae682 100644 GIT binary patch delta 63 zcmbQwc#M(zGcPX}0}$wY_e|tA)=1UQ%`4GQNi0d!PfW9nFV8Q^)=x}N%`1sdD@x2w P1@YtalQZ=v+9v=2S8f#O delta 24 ecmX@cIG>UGGcPX}0}ya#7fj?fX0)4_mH+@qE(Oy7 diff --git a/templates/agent_template_backend/app/observability/__pycache__/telemetry_observer.cpython-313.pyc b/templates/agent_template_backend/app/observability/__pycache__/telemetry_observer.cpython-313.pyc index 9495cf23358c2ac930be348c1e891b909ded9afc..51251828288d5441997e3e3b809bc6f6b65030b2 100644 GIT binary patch delta 66 zcmZ3adQz49GcPX}0}$wW_iW@|$*7U9pPN^rpORRTsGpc-8DE}Xl&znbo|;z@pH`HZ Sn+oE`=O<_CZ{EuIRsaCHju#97 delta 27 hcmX@9x=5A#GcPX}0}ya#7i{ES$;jxj`3~b-0RU*u2lxO0 diff --git a/templates/agent_template_backend/app/presentation/__pycache__/__init__.cpython-313.pyc b/templates/agent_template_backend/app/presentation/__pycache__/__init__.cpython-313.pyc new file mode 100644 index 0000000000000000000000000000000000000000..9191fadd3013bb8b896bfdfb632d1a7447467556 GIT binary patch literal 290 zcmZusy-LJD5Z+CM=*fwdwia5XaSJO!d;kw@Qd$h-WiG6@*V&-_~V5_(#tb06GWou0~l?xi!5{rp1H?SC{YhxXCYHSbC2 Z^uTZ^?YGogf2xbG{nL-x*-OQhh<{bsQ~Lk_ literal 0 HcmV?d00001 diff --git a/templates/agent_template_backend/app/presentation/__pycache__/tool_renderers.cpython-313.pyc b/templates/agent_template_backend/app/presentation/__pycache__/tool_renderers.cpython-313.pyc index 32e74b958bd684add894a70a4d279c35cf81b204..69de758a0090a1f2aa27fb8e75d8fbc47857d791 100644 GIT binary patch delta 1895 zcmZ`(TWl0n7(Ub4+57Bn*>0&@N)Nr+h0>)gy|8V(aI-CKA>AxQ3X)-WXr{C?>zP?% z3#28!P)+RO(NMs|8i^DW6Oac@^g+@$W6Y8zbe+UVf|zK0z)*c?eDFV8mXd(;@Xa~@ z|NZCt&OhhOdo>T5JuiQqAR$c+5vyW#na^NfVYR3n^}3@I!f-%fww?pE1>!6U>y zN&KCu;?jTP+cqWYVVVXJMIE8@GG&(!%*o?tfO9gJ9i4O zVn^Hss=lXo=Ps6d(9?VC{|F%$!YJ-&T-iL58ep-<{ozYvYiQbDJ89nx+2RTq4V6A7 z1G5;7`J*3z9mvGW2EE1n>U))0hho+`6bhtskR6oOq)e0v3G3RJtQs;-NMk8Y$4MEh z^6#o7L@RD$w(8a+3D;_0$n+-B&4K9WE~p|*Al9d(Dd;Bo*tZn5L-^i zs)ke2_^2i&asST!xG|*>EWag>rA9S8rYm| z^+_F{kjM29Ru?|iz}ZQ84C^uh5iKPRgT9U>4X5?=!Y4%0nw=&$G*Ny8?@J)!1g`EoQUpJ`i2#BU-L{n6gAC=XRNdGN)vBDHaS$9mKV3m|X z1%W$)=ogNvb*5{@L&{Jzm3SbmivXBC^p;poqr9(wD@52?(cb|VQ|O@^`ARdD88KTG z$%@;u?$)W@dH0%`-s#@VnVh>GW~FN{1kVR&`*NkBsouQkpE)#rXx5$+H%#rJZ#ZkC zw$j;P&Q_bZi!<(Ncjok5?_AgXo7q6i9sAb2P0Sq1*{WBQd*(XkTe5-8ckIpg=vn8+ zNq^OB^2)A7f9SS9^pme5A6)-&`F{kh$FZ*X=b=WS#~-m>X4dEfd)U;S-g{guT0rd&hYU0?gXVraf{Uc4UvHu{~M z>+H)$`?C!LcYXW*3ZMWV{HL5+T{YE9c2r$6SAThAzU8udE;7?G-I3Y-?#o$A+x0qt zn;L(R6IPo2qouloY=9<`8U}EEQOHi%btWMO8yRe3&4v52nL(Jr76AIaqebX~!LBcz?HoAnaPb@$rCsh* z+%@`*yN{EoT^w&EshcRSF3_2SnGoi6N*wR_oTLnWl2?)43l=SefY$NFrLQTZhjgDKn{q_Z|XgjR4rqnZb( o`~m7-vRb&{lBbSqUmD<=iVu$H1}P>aDIp)^DkFdBmdf<_5$Chde2+TCVmN<#7A zNjRCngo`&1ns~$X;=z-DK~0R&xf*ZAi+C|H@lElFo6NW0+xg~wZ{FK)7oMfVKSQCQ z2G6YhbbZ`>6Mlt8cXCyS=SrC499|<1w~MaBF|&aaS}xj@u$t>IVsBm+@6jib40cRK zA;p2VgqFQwZOOBY0KMZzM$78+60J01tJWOmb&4&>#p)G~OE_;)Kb(3E8u8J8)?hkB zVj++o=>yUQiz)I%`y2}IZtqrG$+5%uVc;!lnfaEUZ*~Olqk!}=4vCo{=1@U;*9ezB zT&oeMB=vQ->|_H}l}2L<;tF~dBmtyR!;~{RpgyF;J9E@X1C5C9=5v&2?sR_jpp@9? z8XlD9Ca$>D<}SyTM)y4xSnVKhEoQ_+fB%S=ZPc@#d8sx0w>WWF-fDOzEr~2BU{Dzh z0f?9W^a8bjWjjwSE2ESt0BKap4q?)0yGWzVNtMYkg?kZ7O7?NAtCtw=zGz&6GpCym zy00Rre6PogP(~b_+SX|VTzevS(3E%-**c>tkzVX<{iiK$|1088 zD{6bKsQ3~6(62^9RiCKxq)MhtG@1}!VrkZ{W`jfsJh`_P>R2L diff --git a/templates/agent_template_backend/app/presentation/tool_renderers.py b/templates/agent_template_backend/app/presentation/tool_renderers.py index f77c47a..cb44202 100644 --- a/templates/agent_template_backend/app/presentation/tool_renderers.py +++ b/templates/agent_template_backend/app/presentation/tool_renderers.py @@ -13,7 +13,42 @@ def _money_brl(value: Any) -> str: def render_telecom_invoice(*, tool_name: str, result: dict[str, Any], state: dict[str, Any], agent_label: str) -> str | None: - return f"[{agent_label}] Fatura consultada: {result}." + """Renderiza somente campos de negócio seguros da fatura. + + Identificadores técnicos/PII presentes no payload MCP (por exemplo msisdn, + customer_id, document e business keys) não devem ser propagados ao usuário. + """ + lines = [f"[{agent_label}] Dados da sua fatura:"] + total = result.get("valor_total") + vencimento = result.get("vencimento") + status = result.get("status") + if total is not None: + lines.append(f"Valor total: R$ {_money_brl(total)}.") + if vencimento not in (None, ""): + lines.append(f"Vencimento: {vencimento}.") + if status not in (None, ""): + lines.append(f"Situação: {status}.") + + items = result.get("itens") or [] + rendered_items: list[str] = [] + if isinstance(items, list): + for item in items: + if not isinstance(item, dict): + continue + description = item.get("descricao") or item.get("nome") + value = item.get("valor") + if description in (None, ""): + continue + if value is None: + rendered_items.append(str(description)) + else: + rendered_items.append(f"{description}: R$ {_money_brl(value)}") + if rendered_items: + lines.append("Itens: " + "; ".join(rendered_items) + ".") + + # Se não houver nenhum campo de negócio seguro além do cabeçalho, deixe a + # composição pela LLM/guardrails em vez de despejar o payload bruto. + return " ".join(lines) if len(lines) > 1 else None def render_telecom_plan(*, tool_name: str, result: dict[str, Any], state: dict[str, Any], agent_label: str) -> str | None: diff --git a/templates/agent_template_backend/app/workflow_actions/__pycache__/__init__.cpython-313.pyc b/templates/agent_template_backend/app/workflow_actions/__pycache__/__init__.cpython-313.pyc index d217376044aa07f27746a8bbc8017869e7897083..323636475ede0acce1386cfbb3bf7c13f2d569cb 100644 GIT binary patch delta 63 zcmX@k_>PhLGcPX}0}$wY_e|st)yUA#%`4GQNi0d!PfW9nFV8Q^)=x}N%`1sdD@x2w P1@YtalQZ=vCZ+)Zag!B= delta 24 ecmaFIc$|^@GcPX}0}%Y`E||z2%IG+;BMkst8wY^^ diff --git a/templates/agent_template_backend/app/workflow_actions/__pycache__/devolucao.cpython-313.pyc b/templates/agent_template_backend/app/workflow_actions/__pycache__/devolucao.cpython-313.pyc index 9ec9aa1b6daa7d9bda590c8289fbfd5b1b8db60c..001fdff458e44fd912552fbc90eec0e13e120e1b 100644 GIT binary patch delta 66 zcmcb}{)3(SGcPX}0}$wY_iW@|$*7U3pPN^rpORRTsGpc-8DE}Xl&znbo|;z@pH`HZ Sn+oE`=O<_CZ{Er%!vp}p;}%K) delta 27 hcmeytevzH~GcPX}0}%Y`F4)Mul9ADA^BqPRCIESO2u1(^ diff --git a/templates/agent_template_backend/app/workflows/__pycache__/agent_graph.cpython-313.pyc b/templates/agent_template_backend/app/workflows/__pycache__/agent_graph.cpython-313.pyc index c5a3581927113268636bb146f308f6553041f9df..720b535ec5b9e019e59644fe8b63e77b3b051ad1 100644 GIT binary patch delta 8935 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 UR4evHI@4S#WV}TY$X6Tx503G)L;wH) delta 3394 zcmai04Nz3q6@K@ur4^+xu*wq)3ASH&%Vh~*HThyjA z(VEmGok@)GXsR(a#zfR)s_5pgNo&-K2&k;lL_=--NoQ)(Nkr0)b*5>1?h0Dl&h)|i z-gnNq=iGDeJ@?-I!~{3;lOTVC1Wz0=K<5i?riEDt^>7fT z=oE{O&LbfKE_c|$qsqj}0^H+d)Z0n~!c`GPg3pJi!G;Yci}aYlaVyDYp-wb%Ax*so zUM-Ymi4FDMCnUxqUx>(5t``)u2=4WXWcU3j>9 z4gxPq5V|B&$A1N4LlWYP2qdphVM7}aESVeA#`CGyEJ%m4T{bXJ(WWX+pH8tVt`gyY z^rQj5PS#HtcidPl85{3N3$kIp&PFD{;f=}Q1QX1uw$Tvv=ix}u4Gn)s!*bAPC8E}d zy%vlIy88{$diIB-Uy#VcK?I7Sp~}WLPJjm>&4ja{B>9O#^Uw!YgB@oWv#;2cMT)_) z(?+yxzKO)Rpj|MHeIa?Wtf|*7D1{@FY^r%kQUrNh_K<1t>6T4oDztBPp=RCI@5L3f#^-u4$4r|)Fg3I7{FPG38=oIb&ep_Sm2(PmlF2qYOJpS{?x46#6XPl4s z?odYr)Lw=a+aA%6#v^@JJ7SGo+IEp&LjyBNuZ{!^v{x@MZgdASgx-lHV4}UbWko3T zrIA1a?MpA$qR{Up0UPblnZuf$(wCV7cI#UJJBO?DUx?kpRu&3D4Qoid1S8(c4vq4JFscy(tU3{~0Sn>{*1GpiLF)`|o-c7jW0 zA=y)}QDlWH!fnc)MhDbYr9#xAOKtr3Cic5c6o*f%IN{3cE<6J+?n%_L$oKz=gV!!O z;qW90d!7l`@ff*u(FuVa0X%Q?(Da%IChn3+3hpc~pXh@tpJVYid3hy?r4#4A-94t5 z4D-7kuDiQYU0!m)hfPoc*Oijntb62FJ`W=%wX+)Dfzy5qKTCY+c_{F%BF zvuw!w?QVue#P8Mh7nd>fV4BOHYaJ{#B0ouqzmT5PmTOTsZ6^N7^mKe8<4e6Rf01E` zrzi~RjF`fZMEs?6NT!UZ5T^IUFe8ST4QjkG%#C?Xj`1Rq=}QUonoa{YZImYg(HIqs zjK^yOcDS<7!8<8LKYRnW@81V+^yEQ7F$Ko~J6kico>vT6aAkk&7-mx3ZE1Fa-inej zi!F-D##P!m4ljnnHajG&Gw=^*zy}8kQ#4^dp9}M7ej3f1Mty7%5$ZLK6qc`Yg6E)~ zXrMVNoQgBesh=^}&cKf_Y-kI&h0q`4!?O3Xr|VR9!KrJRZ7jgz&QMqI$6doh zd+>2J6(g&$@Y=D+>Ks&sb?5+Jy_ZFw!xakefc#JGkoW#d_l4}d{rbK7p1i}>v)Oac zX9rK1&Q~^^sceWYY&lyQjA(w{L#&NNBN=XT2!CO4YcvOre~?BRVaIkEzWYGCrq)1? zX+*dxUra(BB=c;khUPGA!KgaKr8J6avp)Zrvq|&~uEaWH5q{gE=5nq;r zLVt;?CfzzP7tmU*cCeV#lo$u68j+tAw6zBK`XNW;^oLLIcn#Jbnxq-#JKN!@LnZug_{gC{ zJ(SL1Q`rPvy}8uO*Wv96ulIgPmojZTv>Y#^K}HwCTgM-=%tbn^X=(0iR-2f12H5&4 z_(49>*jFYxI#A^m)gHEThZuasAOw+N^21`dd1bIg?SzC=*~wvMsAC4r z-8H|xzN_GYQ#1Knd}Pz9w@KWcd#P0%J4&WQXH!n3DLR{Ilz5*WucjnC>+Rsomq@rl%I`_^wiHc*wImYR5$fi2Eh@ZqfKY{0|?~JwCBM9y^yq(g4oY;9k9S zt|6g;4dHKWtY$U?df4!Z3tB&sV9h6QQVDOoa0M3PpY1nn28;Du(PT5<NDNXV zv(HP!({OL?jT*4Qjnp`VM1#qEa}KM)HEXetC(E*{3t1Uf$FVYG+&71-b_mCOq}oi6 z<(H?S(3e1}Ews;4o{mEQWP-m5`=^MEml)AyKqS>N9iWtPGeP};C5E;b%7p11wA!Z~ zNFmi8<3Oqrxj2xctuBn1K6_S2o`ILHEThk{kv|XmtF!5PMxO)!)gsaf>#mlQC*j1^ zEE0y1t9h2Enejyiv5mWmfagsq3FTqAY)LTG^-!nU-rCW*%GcZ$TG`nioD*sK;;aU5 z-ok4w@T+SR$Y%KXS|-^9x30D3jpo!7(L5UB%h{)r_lcEc^ig6GXO5=kqUHz0B|b<- zi}OU+Umt dict: + """Monta o contexto operacional do turno para os guardrails de saída. + + Mantém evidências/protocolos necessários aos rails, mas impede que uma + transação encerrada ou semanticamente interrompida governe o novo turno. + O histórico completo permanece no state/checkpoint para auditoria. + """ + ctx = dict(state.get("context", {}) or {}) + mcp_results = state.get("mcp_results") or [] + ctx["evidence"] = mcp_results or ctx.get("evidence") + ctx["tool_result"] = mcp_results or ctx.get("tool_result") + ctx["tool_executed"] = any(isinstance(r, dict) and r.get("ok") for r in mcp_results) + + history = list(state.get("history") or []) + current_user_text = str(state.get("user_text") or "").strip() + if current_user_text: + if ( + not history + or not isinstance(history[-1], dict) + or str(history[-1].get("content") or "") != current_user_text + or str(history[-1].get("role") or "") != "user" + ): + history.append({"role": "user", "content": current_user_text}) + + route_decision = state.get("route_decision") or {} + route_metadata = route_decision.get("metadata") if isinstance(route_decision, dict) else {} + route_metadata = route_metadata if isinstance(route_metadata, dict) else {} + pre_validation = state.get("transaction_pre_validation") or {} + pre_validation = pre_validation if isinstance(pre_validation, dict) else {} + tx_status = str( + state.get("transaction_status") or pre_validation.get("status") or "" + ).strip().upper() + terminal_tx = bool(pre_validation.get("terminal")) or tx_status in { + "COMPLETED", "FAILED", "CANCELLED", "BLOCKED", "OUT_OF_SCOPE" + } + semantic_intent_shift = ( + str(route_metadata.get("transaction_interruption") or "").strip().lower() + == "intent_shift" + ) + stickiness_intent_shift = bool(route_metadata.get("route_stickiness_preempted")) + should_isolate_history = semantic_intent_shift or (terminal_tx and stickiness_intent_shift) + + current_route = str( + state.get("route") + or (route_decision.get("route") if isinstance(route_decision, dict) else "") + or "" + ).strip() + current_intent = str( + state.get("intent") + or (route_decision.get("intent") if isinstance(route_decision, dict) else "") + or "" + ).strip() + ctx["current_user_message"] = current_user_text + ctx["current_route"] = current_route + ctx["current_intent"] = current_intent + + if should_isolate_history: + operational_history = ( + [{"role": "user", "content": current_user_text}] + if current_user_text else [] + ) + ctx["historical_transaction_ignored"] = True + ctx["historical_transaction_status"] = tx_status or ( + "INTERRUPTED" if semantic_intent_shift else "TERMINAL" + ) + if semantic_intent_shift: + ctx["historical_transaction_interruption"] = "intent_shift" + for stale_key in ( + "transaction_pre_validation", + "transaction_status", + "active_transaction", + "transaction", + ): + ctx.pop(stale_key, None) + else: + operational_history = history + + ctx["conversation_history"] = operational_history + ctx["history_texts"] = [ + str(item.get("content") or "") + for item in operational_history + if isinstance(item, dict) and item.get("content") not in (None, "") + ] + + protocols: list[str] = [] + seen: set[str] = set() + protocol_keys = { + "protocol_number", "protocolo_id", "interactionProtocol", + "protocolNumber", "finalizacao_protocol", + } + + def walk(value): + if isinstance(value, dict): + for key, item in value.items(): + if key in protocol_keys and item not in (None, ""): + text = str(item).strip() + if text and text not in seen: + seen.add(text) + protocols.append(text) + elif isinstance(item, (dict, list, tuple)): + walk(item) + elif isinstance(value, (list, tuple)): + for item in value: + walk(item) + + walk(mcp_results) + if protocols: + ctx["expected_protocols"] = protocols + ctx["requer_protocolo"] = True + ctx.setdefault("tipo_fluxo", "ajuste") + return ctx + async def output_supervisor(self, state): """Valida a resposta candidata com o OutputSupervisor corporativo. @@ -509,15 +622,15 @@ class AgentWorkflow: } candidate = state.get("answer") or "" - context = { - **(state.get("context") or {}), + context = self._output_guardrail_context(state) + context.update({ "tenant_id": state.get("tenant_id"), "agent_id": state.get("agent_id"), "session_id": state.get("conversation_key") or state.get("session_id"), "route": state.get("route"), "intent": state.get("intent"), "supervisor_attempt": int(state.get("supervisor_attempt", 0)), - } + }) async with self.telemetry.span( "workflow.output_supervisor", session_id=state.get("conversation_key") or state.get("session_id"), @@ -603,7 +716,7 @@ class AgentWorkflow: component="workflow.output_guardrails.start", ) final, decisions = await self.guardrails.run_output( - state["answer"], state.get("context", {}) + state["answer"], self._output_guardrail_context(state) ) for _decision in decisions: await self.guardrail_telemetry.evaluated("output", _decision) diff --git a/templates/agent_template_backend_day_zero/app/__pycache__/__init__.cpython-313.pyc b/templates/agent_template_backend_day_zero/app/__pycache__/__init__.cpython-313.pyc index eafedeeb7fe800a4d544ac4403d9f6b173ee6671..6a9d2090df4a08ff8b0411c446eae6ba48b73287 100644 GIT binary patch delta 58 zcmdnRc#x6%GcPX}0}$wW_e|tAR!-2*%`4GQNi0d!PfW9nFV8Q^)=x}N%`1sdD@x2w K1@R|FB>({SCKE*f delta 51 zcmX@exQmhdGcPX}0}w1Z899;LSSC`xB)3362S^mzir7g^&;lXlv*+RQXIcALq(S?$~V zTwNhpZKtx?+Gn5rJNxW&?%C(+y;brmQ)E5J%+w3;aSnd^^ap32$tot@&(wahW}uK3 z+67S%4TD7k#k82?#zFIdg<3eCIao4K`plwvUpa5)3|0(O(n^l!4pt3R(`t_A4b}|Q z(prw22I~eK)WPxm!TNy)+Q9LG!A%2=l(mt@69Zf6R!%byZX0N)?HsoZb_{gVPL7uh zZXf8PT^uhR+%eEiyE$Gq*fX$`?&P?2uyDvbdO!|D%?-9mYjT*x77V< zb|c%Qvv&|q{tS}0h~;er;~)rhpEsjI5G%yW4nq6A{qE06^mOPofSS*h;Cc^(}JJevVwLUOWs{U%S16KWG#WS0hP*`!S&*-7K;@E&&mkUQD$zKy=0 z>6FJU`o--Q;k2qP=_ox@EI_h$Sp;#1H(RzzL*hxX8~Nz8I4<^ZEG$llJ2@5+17a`7 zX2eNxO5BC`X+qCJvi}V2v1c`f>S(HU3tF*M>jAW8Ktc_cB9!(c zQ#Q4+XYxvGt=OT81*ZcPg@NZ>ARMD8lu*vn5SOI;*jst^WHSnRPY1BgcA1W=kAaHeh5u;^C~~H`w)26L)CCyb!_0-@{d&do(5q@d2Dt&$Ji)G&H;cNaW(EY5JQCl?!X$J%%2c|q`R5`@uinda`rJ+Iv0(fxi2Pp)W$ zhn|9+%`V(;7e;r>f*utZ$#id(+iTyWeKJ0ZD}sN-OfgH|>c#91RXER+=iY~=^*NnK z1mO|lHw$cOlbxNfvCNsotZ@G5h%D?e$y*mpq?!Ubz4JOyH|D9EbAh3k6q){KUW zMl)0T3e%qT@GOI4SC(u+G<6=?EC>@o9^M9lS`#Yz!$R%@_=v1YogYwmY`w6oUt;YH z=i7x5g#k>Din3dy2W1Rmb4bS5zCHOs@8Z*y-=XSn%y|m8Z{O!RhmV2%{Zk zI~#0j9Xik6JW{}})tcBZ8yl4hx0lU0^6egjM=zE_HwbL}0QCfpOpX0xh&7do_|NLh z7HyC(=Fyah8<*CGkH^gJIn9}tjWNiuLkz$oY9!^Xxv7>N-%_Qn@L1ZEn9}UtmJDKH zmbNO0#P3@%;S%<+u1Q&Wt)@Y;XWWQ<{&Tew5@|g&ETL5)Zf4E3g%(7c zRN-=uA(c_!iKiT*0Ksl+^%#&t&U;AowLJ$PI2%45oTyATR@=~E@K`LLra8y zvLVeY()94XOWo$NN&6G~x9Utjy<35jHbEiTmOH|};c&3`s|s^+2xd@46PD_pfPqcYbrs@GEm!QZ48 zcX{*}-v7>2vVXU1T56m2$ZfIDnX#6OSujg$8=mCfUY2vpY)I{o(*Bhdt{#O)iS&_l z?s!DjDSxN!mj>Kq(B1T;#Mw{eOqQ!b3c zV=5UPsIw(Z9CB);L{&jB_->h@^Henp;xKF8Y$h&TRw^G6M{ucW0ol(}kqi_R9PsF% z?e-V|Dm{9DT~ZXXQ&|SI9Z6cs4WR8#(o!h^G*O~KeWBAp^I($YpzJBoJQ6K4RbT+^ z5W87tH3D+jgWerUilveXXh$Vl%ds?7fAaQiwsPFM7N>6X z$e)Scv`tgm$}3gdN7$aWkvW6wF|F{3!8OETGcPfe;p}kMqyQAXs~w=u^(zkN zIouCW>w2EU%K$T6-{J7H97Z@i!J!qP#`QXff5G9C$r7fNYgfC(y+BrTBWhOx;40Tg zIUMH@6)0V204lhf3YQIV;>ywrt~>B|1O8rszw6Ah^_jU7uHaulE;$r*9|R|%nSf(= zFqF_wLsN zvG`hSS{2q(2lo=^sBMnb69GXF^4xgiKZh z;aEb2VRa}ISt<8;A(zNbwZ}t2IL#+=qq8$Jp};g&c@pVjeR9}y&OcDiI+Ip|fr&)L zAK(FHyd(~y8`4zkX#k2zC~;$fgfUre@S-S@kyMf}tx5UlTp$XCk*_78p@Er@|HArS zsk8auUMP5R>e43m)7X3p0Z*WL#J&k2ktr#Hg2o?(qC6)UO)JMwLi~zSg|07pYAiw_ zCP6wr8;m8gQ!{|2>ufZk4~3w*g4uu|7-Nx0C@Qydr)K?hf4KykwgO zf7rY2`ExijNGF99BN!^Wb}=`Z5l*PRW+LH995k0b=2_&0H~$;;)7e6 z^8uRBNZ;&d9UXIPahXT%ln7lyInC+WiK#%8{v9?llVk7&a6aj`k*1Ss>)=Ghk&!UL zl8O0n+2FlKOj_c$4aD_1I|oUt=NvQw*C+`C$MNb3*0u?X|8oHvxU`}2%PeB0A`!6`x@*|miuy68+tc^A~&;|^S6b>J38#MYy)*|~-XO$t9mUNjd zbym$?)bgDjLXunp(!M?c!EtmaGLjx8bYZ+`2?Z|(q?{YW;OP(HO->)b`qBVFx`V>Y z32F5YBc?)t_cs(T#3;{|)G!k4`R!eEcnqSY01`$_`H*ii7zj;BLrG|)<;GVI{XB9) zNh(O`kN0YHKY}a(;4M7s;6{t)VoT#6=U0E4>A-Y^UP!1yFs%tKT<5@)z@`ED1~+^( zQL_FnT3bMN!Yd$O30ybLLUvpe2_vwchu4^pnx_o9fYeZ z*leDICdGo7Kd$H}u{SR@BNM4hCO*0U1AB9%dqX+n;qg0<;RdD63V-LuiS?p8H(h6W?lcM1ZF5zdyH{6xW@q-st`+y4Fld#dOGr{$QP!TvuakfHH+Gse=Y0&R`k1%e*4ko zvVDtMOWaU4Z+fZt#o}dy<8EHbvrW%5#d8|psn{H^u6yaoi$~%WTkdD5a`PUjGfY_@ z2pO4K_YgeH6N($-`6Y34L%ghNrL1wOtnqGT{ny$T+r&lB;pNIB_jT&IV*OR)J)>YO zUNKmg4A%Mjw+x%^R@A-J@M6QFvwOLsXQi~~>Tuj@zdCZ)Tt46UBXje0_1z-t7iQ-t zU!GVlYQ3(yYbl?ve%btuUCWkj*E8;#3a`hWz4!&ndgdo@n>PK8=^Kat*YTT*<(Azm zE&WR^{VOel%PoU^sTb98=uZuwvV` zWZM?EH^nQQD;2Fv6|La39Y(3PWL+HqPE)BAk1mWy#in@GzTX#%-{c56mUvCmb>mw( zmGPSG*NwMxD&MJbUY|=5pyM4wQ8Eg3%ZB>9MK$r_k{1lm8R8`k@q+S|g2tr+2z&KQ z&KI5Wa>q(}>r#1Z++Me0Z&|Xp#2cJn@BT`6yskZ7=|oSg74hnpmFo7T>h^fumX*4` zrMkX&Q)|4ob)|OqQtj?|MQyyQ&k=Vx@7r=LdG~b%#aUPPJ=`Q%t6wEtj>e z6t!L5mz?v(imt`s^1)%HkW=#XrB7YD zcT6c*YF5nkOXm8kS-(-Rj-6go!~SgN>!fnwOz#*WO$&>=zDVY574tPO)xTK3*vKcl zqVMMBW$WG*>(G*QXxZw5SueHE7rtb9(em=ha(UNs>5i4sL$BoDj4byax;lJMp|fYj zO_mi?<&vp##pIZ$_mn_-r?&BK>$Y!czN`PXesQ;F@$l$!yLY+uc-&g`!s+Kuzg)Cz zZHe2eU%1%w+{KscmTeG~E%D0DE0x|KOy9V)cy#pb%{^by+;p$zg0icRyk#tXm@k-k z>d)6M=hd$m>lcmn|C(2_Ftf*?$O|ZS`T7q80QV4luv^Wp?Hy^TUDd)mShWjfJIQJe zWX!4&+e1Vs-kLC8P8dg4Js7Z6uaYJ9cFlDPnGLHdJ+SOUmUoRKcZ`qTA4lc)cdLQ% zgI#Lb&~MPte}W|*@TV`~zpI!2E2>rs!pF#LDfvVrH3~Nf)v5kk1=u(D2ta&gE1{b; zuWVBy-q|#(P~L*K4sDuS_10O%obm@+LfbVz&_P4_gIWvSuKmAi6~asnLes9T(DAB{ zM2Y5AeXkK3uN9K0O7mJ#Zw@qGuO-n8&Fgi&dC+*HlSK8JH@5expz)@%8sR41SZpTI zOwD3TIgpm}NHj;YWZJDk`)`>^)TDXKQV%`1RU}%dxvfUQ+w~-B*4%E$Kzy?ioWI>o zqNSSKJ!-&zq}l=W6+)sm&5EKo9~yCRt3nemszbboM5{G-1RT^ID~Z-=?%2SZ@=mom z+Mv19y~hTPx64R$u37uGRf&yqORP}+_I46&)xO6Y#i8`x8rV1~h&OTs_*KR_tnn#?OmLOriaG@$MFA{8C3^YV9xey*6mP=O8hy z_PzQ&CTP6BgTxHl_q(^o3g^`Kwvbqs_FkIt3K>Mom@VsJnGtaZ`u?!lfW6yEtXuW4O9S|?6`EOd z#;>(x)?oa#&WLzH#%$@rQ~m#}AWyTYq2r{5-5QFD{Dfp28XETPcaI$E-_z%ojzBt} zR5-%xzyLmY@q~r1`ryp$hXQSaeg+Adc$C72E55OcN|n#k3r`IzN#0TH*PIIYL$OnI zGdyNj7Uo@*id|2mwqj^Q0fIUxCsYH0K7-9>z~oncsKUTa@Ka2bZh_8!Ur-+yP$()0 zJ0R{g)}f#SK|Nt#7B|h+Anrua1i+EQ&wz9*5-JdEL(qqL;Q37XrH)`eib zM*en`o{3#s1wE5M+(fwzc}bMX3( zQasZ@t;L=A4YJ|Mll}*QgnBYG8$CrU(KrSlwj|_EkBS!F)W&>J`O@9MrBN(651WWW zrTnb#Z`pqw8O|Eb0|EZ=5O+TF9W5h8c+t+TAFU$r_5*&s^XAb^c$e{C?o#&QQ3J8E z>A_NkyORClSR>niOv}Q@;GJEDdlS2H%xu6DJO8+y{5L@@z}5nKP@{9yLi$<%sBPQF zfrTF?q0;4NN?u#yS@aLoeq7+6*bActnpaWw8vD*@)!g?H@g_th`%Lxp4ltle7rr z8>Fv8bz`@FuRy-Po%D67zTeeb0gYQ$($}rJWh+6viy-UIqEv_Up98??pOivI-6)g1`#p$#D!l86Dgj*^nd~6{txJ@~ zz_J&!cLKP6AzTsOG2}hn^QnbrgImem_kbqFE_wN;O_pa-F!Mfk-a~*1mb9Bthk{TO zQ$3Dwo#A{a{e5z^E32W80^cN>$L)Zdw^Y65J-OnYTJlb@p)u4AB9{sa)@cw%2+x~(-)`WRR{!=4B|SIKwxk3e%nhEYyKFvE6DS5IOXX$Anu zo-xFI2qFkv0Me;=2^*WGVd}>Y4Sfum5T_qOzy+_M#iSr#fnMyo!rqwfom*>TiqZea zdypR`VbrO9hr;Co!+afb{d|>kY!3LL%ZFlUhK>Pt(J&DlkJ%ryyCPw{t>o;ycWrd! z7j>J_OnUEm)WUO0ntjRfPq1%>Ysd)um+=2#`y<-o^y>z=ssWKK0Ersb6ESD6do4h- z+2fH0lEZF9s!1+eiPVxj_PdCcn3#2@o8+_OGn+^Odvd0M6ar5Hdu=8MAC8fNTz=^k zb*6q^Qw(wi`KhKE&B70CgoKs7J5!V;Uxo6EpHjB}Y$GXSm(Mn6tjK6%Uq9PM?CfV} zx4~}-%4j*MU_Ed$sbpblCspieY9rO`>u_$VVF_AGE;2>5agMH{EYBO<^`uh)UjseZ z{3QaOnCfvqq?~lp`3X=HIzPPpxBx%qiqaj(_3sGyE~Mi>K)T?c4$(~*Y=%9bL4Zq} z;sY+B3Wni#Qk6Kf(t(d3jQBZ;pUqAp=N9DDPX{L^LU27v1N0bDd2-Dl7DI3a0e{%y z<%+Z!;`xss-uM}bpIP9^7lAc}k2Q+>KHs*f7k65U`yj1EntV8WtL)wOSQ)gvkXvySqNdF!Yu4(*do_#!Bi~-SST2n-S_%SvJ;rC zRidZY@9x+A`@Q~tjcNYyDarjTC&wbd=O?f3nfUb$r*fUdeX8-+q+1XL(K=AvUqVYb zZX0m+yQqufIRmBrWwe~*xdRpbm9&!Mc>`7bZtCWE{y=qq4XxpL!9Z<)9j)Vd;Xr+V z18v~AeW02Aca9(MA1>scA7MI0jfdX<5&4*T9PY4%)%-(t(xzowSqV zWdp1FSJTxTFCSRb-$lDPUNO+!zm~3b3jvMqIQvBF(3bd4u(#Un=E_dOsW$_)XtP+= zPA~z2KsN-8HG=3Ct2+tp4fOi%ROt(0z#1s=-L;US;=a4lbVW_ZmR;B-$eLF8+J()9 zf)E#cr`V3xQud%GFIg+rwG#fV@65*evM{1v-x&;la%E=f zVo>ZX6()4;>ABERrvQ6-RjDAZ4&-Ir(J^sYT!V6STnvd_9E*ti#cqyGh$G@!j!lYT zQ4-f7K0#;{o`v_&Us+Gq-}+J^>noPwvs(}Nku`2Oa$>?LK#q}7!4qc_=D$iwmgh94 z7T6vhLR(TzIc<8<&Gr;NEa_qoKrToKCUd*!SwM2i<{` zr%2M|PjWMdr2TXNFxtZ&E{<*QL1JDo7>dQ>iBKXEkIBIx4Whs>vK+ynjP#LUD3PF% z{WA#(1wz34488*0gp12eG^i3Wh+(bBz0*G@{a zbOJD03&8Dm(_Jj+bm*sGMA@u!B^hVWI)B%JMko>?ov0{d5dmRNa{F+oEkiQu6) zog9tE4+SG(dH`6n>}A(hGM=)R?ja=@ut%>LFfpNoqK_n`DVc6(C(BlnUF=t7<@%dI z;za8GvLm{(VL%mQSQ-t@L=!w25HS*Ikjd_~g(r}2nx@jhNPI^2=;=vz+C5l_q4D`C z#*ug|fpKvq9)6IuRj({^pr&n<#;1ZAkrV7_wVT|=9;)u><`(WiGh7juK{3M8jz*#q zy%|TYjMw1)8Az%m%UMGwSz*m0m`ry~iT**5y)$(~%`F5{_(82pv(%pYW9=`rWFrf; zw6IO}PIhd0aVozlLRdv>tJb>ves-m`TqoMR8up^M(l)dTEbx!7i&eK2)eNo85X2n6 z#7wlI@zUMS@@z+(N7{R=~b(+h{KG>SA^bh8@Va0t^)?|^GKBkte|+1}sJ6;q#7-?PgEV@zZov7vY|jdbEL87c!}ZMt zW^iQn8^mfoFf;ieh0L?O!pw6Aw4IP@2MaIvk?XOlTKy)m#%qPOs`auDnoDz>L%Xw< zhfvn&^jpL_STi*Q3+rvK)7OJ1Cwr^TVQt9FRUPLvX2xQZR|}z55iUnO>`JcPSc)x( zDoL7=!k#ME=ZlMCu4^}1?t+cB*zbbvy4WJN_$`>;?{{s@x=!=GnNZYmerskdwt0=} z-Ym0yC)-Q>W_&i(u&Lf z+ea59Vmodr6Cf-2YJ`Ryjt;*W#w-0+fLgx=V1pWRUN*ZxYfRI!App&rre&uJw9YiG zGZPljR;6jH7SL9!w4BuoXlvNVt(7)V=<;KT-D$OK=76?VrB$q3pw`o=i8VCQ)BwS}4e2l|8cx~0j@?yE80#FQt_j1?@P(OH%!=H0_DqV#OxSVcqJ5Y6l z?Hm>Y)D9*%+{Ix5K+WJj4v9$^{20E!gzvp30LS5bfX#I;X8vv|xoI%+7!(|jhT@r` z7{XE_6p1R9DL8zg;$pd34-Aiq^15K0ktK@6VIZoNv42=cY`Boc0A$+gAFd>LYf z8tyV5xraaq?K8>%nr#r;K4QnAB}J-jZ?DJ0m7fLxWU0&yWX|)uVrp%7%%V@R%gCV;d`bxZQd2tfXR7Z3bZvQJG$o zXPyW(2kiZgb=K^%(|=^PO?Ao4(sAoQ#bEgA7tF7|JROgPrSM@B-`Y|vySsS6AyDxw zRg7bhfJ32K#T>&{EE+j1sf)K4r(xL@iq1$Id27rc0^X`(H&ah}Y*-_y4#5Eg*fCSS zT*HV3*%O=AB@ZI%0-)Gn)4{Vc8j+%5b;624-TFLu%23EKB~8H^LB^-2A!zDEb)2B0 zi^B5Jn-DdQ!BY<%FwI3S@6L7dbSOr*BG;7ZJr!dpl8haUPfF^Z`XO?yBjeJ@dswwQ#nu{!73IIMq z@a33>-RIxN3U;kZ)>v|KuWTlQbH#bvwtu(Xc;z~jy)vc|^2@#))nxR(K)tU)5y*ER zQUBd``Wv4LeM~(d!WA7!camuK=mn%p_c9c+JvN4}&wUBwT4Y)7FD3 zXLCuo+Hf|n3GogRt}~oniS##$Nx0GQMu`FO3Rk$<@WzT>4-C##k#MW&oLh@{ZK+hC zKbPzx;iaZ?-SsedyOxC8O>ft&cf;Tv9SN^Ay`$%NJqfQiz0=TR1jf59B;0L!*So$Q z2Jh7piJ0E2>#2gl`&uIDOz-P@?JziBLL{T;jJ&v3C)k9aMCd|qs@gw5KEZAD?7_L5Ey_$9LrxR>$> zXk9Ag&|yTplH=7J)^XU#VKe6A(ozDBFSTh}WU}%ZseYT|uNy-Q^Ag;$4Q(BIED1WYl2$z0QVsz7gn$ zjjiKS>Y+Wq)sVZG9N0^|?5%(-;@P0swrtrN-0s`9tFL#XkG3Jn91M;`L-23}>3$fi z#|K=BgHkNCKPrXkohX%qrwu+wc-xcJqyDbc{d={fkl%C-<5DP^7^hkSciYs@_SI_E z(FWy&FA)0y0s^87FUwZ$f*%bs)dTbHR6(d;qxno=dq+0ezCxX^5&ThL zPmL^2eu?=1AP_*3y1QANy95uVv?tHn5rT-)a1W?I>^%ghjSip-u2>Hxj?r=fJxgyC+gdO5mbZ z#@>wB;7;+;{&MzJ#A?QKlYdyj(jxYwDhK;!qLgi)Fp(PUowY_^9ltL|Cwdx0lh;@$ z3}sb(i!;jezrI#3{>?-sxI@R@$x^b7^-WfF90w_W#zPOtkNO@YU|Ih&Eeu!qIeTQ% zVR#Zn?_j^2tV=$IDDNR~qp7Wm1xm#zWFB7VUDUUpP8XLi z%XMUvPWN(s8Q`yI2tpme)Z4McB!3u#2_oR_&h2d9bm``7E2h{oH5%TW$sXJPC#~Gh z3AD)A3)4lt*jxPBJjmE|!HYQfs83|BI%!<%L?kgw8(_|7Ny>SkjI0|*OK2Hx5nlLF z%<|0CRET0r*Mzyz05M}IoxK^nGSOz>zE7A;|9P+j74?aDJSxLJT@543N#Ix>fftTa zkn^rRDe}~~rbedId@q>1KvKu#Eo2$b7p^h{#__*Kv)R1~hb7-!=uFX#grZSM&9{ka z&j&z|bpXCIfAqrzmxG)CB<#AG&)a_sf{zom!6AHmEj(26u5E-mLGyFMrVrjkYj028H@ku) z=X0lC7!^~xzr#g)6%^654}z-f)Q1IrIjWGH-{A7y6o4rGp@o z!)`wMKrOEs+hBOj4x^lgppdP*seTmGNR0qs_wdszfP^RlY`7Ov@kmU}&=}o^3Fy@8(Od=8+lW8tndc4t)2PPFKdwQ-|2Sp*D%^vS21?-=W zFNW8YA0!>@>~UkhdV0*l)dBBg)DGtANfE$ewskI#IN08~N<%S5Tf*k%>J0p%=3-CG zwZJPUH1fh+F8gNAWZ<{La%MTvPAb^C6CI?I-FTv!RIvw7c!`_6dcsYr*+(a;pypam zHj`S`ezK7qVtY@vB;kq>z6-vF1fFCku{>FbcG!>=aBJmyscOrNR!5aV+T_iRdPtG?gYB$B3E8fuYqOb%d zEmM(jI0~0&D$(mvpYNS1#10_12>~yz7ZBrT9X5@;GbtD8=jN5@rzDmn>L;dI#+T<8W$P!Vr{Z}HiuH!so$ zIohWt4?jLtGX0xsitC%HR>@ma3QAeVii~3-W~y_-S9!*`;Kd2a2ROeHqet7|qA%TAX)1MmHoH@SO{*%iTCw@9Y5I)D49+c%=@72pmuFxfo&@q!jQ6aO8$%uD1*$U(b%ch;WfY^2<$*?=uoyOYPQujh$$H$ z=$&g2q(>KJ4e{A}lou-l$Hs=X%af^#S(G;oO2w`YB+x_*5$|hq^<|FOE<<2z*MXGs z(qTS`8J26XT|kYF1#xtlB3{XN5*D#>lsy&r^}M9C?V8X6+tAYOc3UooDF0DM$4N(7 zxW|9*34e*`RnxRslOF_|uzeT2x5?Wk>>!JQw%AB;&rPi>KfQ0M?|YRAU+Y!^bvi7M z`>kHx-{|H7bv7(j{fE7R|K#99pf)aeqhtO`FX`VoumW`^ELQ`y8cxmhT3_nDjnBM# zF|1Ao>g2z8zOP{2fk3T=#fo3|z5VobW279YX&c)oX-eyu$6hAu6v wiCf7d5gv$P7f7gUsNt$<0qG%}KQ@vI24$fw))t3_u209{~CKLTCU0 diff --git a/templates/agent_template_backend_day_zero/app/agents/__pycache__/billing_agent.cpython-313.pyc b/templates/agent_template_backend_day_zero/app/agents/__pycache__/billing_agent.cpython-313.pyc index 406206dff4f2eeede23a18a83e3dd9bc346ed112..fa947b3c8544b93a0e0bde47b37fe7fcfb912c40 100644 GIT binary patch literal 6285 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 bB>5HbgRh8_-?)B4l4lFS-fs!qF!uf%*;MJz delta 922 zcmYjO%}*0S6rb6zmIc}dXszXI0KpVuDIqNZy%fa*%12oC;78mnbZAPtyJcoq<)qOI z9?8U$(fD=MMEM6KoH!Uck|rizJa{2A$ia&`10I}Y-uu0I@Aqcr_daHxwMLGbn{~j~ z+ua+hyP?fU@u%8aGOf1z!I`}c^6jfmdQ_2;l1o4oDxMA;Oy@Vht@bUlv diff --git a/templates/agent_template_backend_day_zero/app/agents/__pycache__/product_agent.cpython-313.pyc b/templates/agent_template_backend_day_zero/app/agents/__pycache__/product_agent.cpython-313.pyc index d394a5bffdf0cb7a16d3842fc00bdf991d7d38d0..4e1d80ea78d7f63d64e18f7934af2b79e533fb06 100644 GIT binary patch literal 6282 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 L{R4vyd++}Mp}KF2 delta 1084 zcmYjQO>A355Z--%c3zygG_ez6r`WRdPZOB*a8{eMkYs(_*iU!~1b| z_l1~C%b!%isao|2QbbWtl@JI{Tq>V>tKfiT2?>r|P@<9pC)jmCVx^s(*>7fc_S@M{ z7e5{!eKIm)13B(J+TFX7yfZp^b4glvfdeRTprdWV4UK9@>H4O=VNe5sNpJx;#uRYO zH;uBcq5+_0(<&z7ds4Mus_dfI*LPk;H`cedU#Z+!N6({e8r9<(uQW->ZF`;V$HXT* zLP7UI*a{-F*F8eDC}`sb?>;ynzB15S6dn-DFmFYn69)mNoh=eXv{SO3_-)2pJjN(O zZ7KsfA_yZ&niQitK_O{&zpb?*nI~*SG$7KCkr-iB04dpb-a3M*Z{QltlX)Jr=Y1(? zv^PJ%y|$0JiV_X&U6>X>YSr1KyxB)`KKVn6S%4%*^B~k55b6scG+eL)1vK*FGyRPC z+cHI{XP$e*l)i)ELI;+$e|62(UBl5{Fhf&@CB%LrQ`BAaKPq3AbM>;w6(U4 z_G28@BUEp(b`+`?Yq3(%=#Q`t<0SCZlcd|cKOEHB9wjXHITIhGb7^YH!ux62BA#jy z@qPNj#lD3@_8y^qJ0yqPV;plrbIMPrxJl1Tt!RoDpIN=GHwiB$=(xhnfnPtxqsaGU ztz5>^yhP}b53_ltUxk&jC}eLH3aSFt3kcDST>2SVzVDM7_x^tu z@k4eFu8QBXZM&cJybuS(^TcZt%hn|sL`yLfLSI{za+OnKLnEnC=9R>!6(#1T Kg7}lU7|Q_+brV+r delta 52 zcmeBRZe-^E%*)Hg00c`;Mo#2@EEBI^l3Spk10;&_v-A_wQ}asV3vv=m((;RPCkrx` F0|2q;5yt=k diff --git a/templates/agent_template_backend_day_zero/app/agents/__pycache__/support_agent.cpython-313.pyc b/templates/agent_template_backend_day_zero/app/agents/__pycache__/support_agent.cpython-313.pyc index 9dee7059da020e37fd2a806601d770b8999a8d6d..fa42c73ec0cca7b505fb2fbde087be4214835089 100644 GIT binary patch literal 5993 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 diff --git a/templates/agent_template_backend_day_zero/app/agents/billing_agent.py b/templates/agent_template_backend_day_zero/app/agents/billing_agent.py index aa60099..05254d1 100644 --- a/templates/agent_template_backend_day_zero/app/agents/billing_agent.py +++ b/templates/agent_template_backend_day_zero/app/agents/billing_agent.py @@ -95,7 +95,7 @@ class BillingAgent(AgentRuntimeMixin): state, system_prompt=apply_agent_profile_prompt( state, - "Você é um agente especialista em faturas. Responda com clareza, objetividade e sem sugerir ações não solicitadas. Use dados MCP quando disponíveis.", + "Você é um agente especialista em faturas.\n\nUse dados de tools/MCP e RAG autorizados como fonte de verdade para responder somente à solicitação atual.\nNunca exponha identificadores técnicos ou de identidade presentes no estado, contexto ou MCP, incluindo customer_key, contract_key, account_key, resource_key, session_key, customer_id, document, message_id, ura_call_id ou MSISDN/telefone completo.\nNão transforme nomes internos de campos em rótulos para o cliente, como “contract_key”, “customer_key” ou “MSISDN”.\nPara consultas informativas de fatura, apresente somente dados de negócio necessários, como valor, vencimento, situação e itens cobrados.\nNão acrescente canais, telefones, códigos USSD, URLs, aplicativos, lojas, relatórios adicionais, procedimentos alternativos ou próximos passos que não tenham sido explicitamente retornados pela tool/RAG e solicitados pelo usuário.\nNão ofereça espontaneamente outras ações ou detalhamentos.\nSe uma tool retornar BLOCKED, OUT_OF_SCOPE, NOT_ALLOWED, FAILED ou outro resultado terminal, explique somente o motivo retornado, não declare sucesso, não invente alternativa e encerre a resposta.", ), mcp_results=tool_context, rag_context=rag_context, diff --git a/templates/agent_template_backend_day_zero/app/agents/orders_agent.py b/templates/agent_template_backend_day_zero/app/agents/orders_agent.py index f557bed..b793c26 100644 --- a/templates/agent_template_backend_day_zero/app/agents/orders_agent.py +++ b/templates/agent_template_backend_day_zero/app/agents/orders_agent.py @@ -95,7 +95,7 @@ class OrdersAgent(AgentRuntimeMixin): state, system_prompt=apply_agent_profile_prompt( state, - "Você é um agente de pedidos de varejo. Use dados de tools quando disponíveis.", + "Você é um agente de pedidos de varejo.\n\nUse dados de tools/MCP e RAG autorizados como fonte de verdade e responda somente à solicitação atual.\nNunca exponha identificadores técnicos ou de identidade presentes no estado, contexto ou MCP, incluindo customer_key, contract_key, account_key, resource_key, session_key, customer_id, document, message_id, ura_call_id ou telefone completo.\nNão transforme nomes internos de campos em rótulos para o cliente.\nNão declare sucesso, alteração, troca, cancelamento ou qualquer mutação se a tool não tiver confirmado a execução.\nNão acrescente canais, procedimentos, ofertas ou próximos passos não solicitados.\nSe uma tool retornar BLOCKED, OUT_OF_SCOPE, NOT_ALLOWED, FAILED ou outro resultado terminal, explique somente o motivo retornado, não invente alternativa e encerre a resposta.", ), mcp_results=tool_context, rag_context=rag_context, diff --git a/templates/agent_template_backend_day_zero/app/agents/product_agent.py b/templates/agent_template_backend_day_zero/app/agents/product_agent.py index 34433f5..998dad6 100644 --- a/templates/agent_template_backend_day_zero/app/agents/product_agent.py +++ b/templates/agent_template_backend_day_zero/app/agents/product_agent.py @@ -95,7 +95,7 @@ class ProductAgent(AgentRuntimeMixin): state, system_prompt=apply_agent_profile_prompt( state, - "Você é um agente especialista em produtos, planos e serviços. Explique sem fazer oferta proativa e sem executar ações sem confirmação. Use dados MCP quando disponíveis.", + "Você é um agente especialista em produtos, planos e serviços.\n\nUse dados de tools/MCP e RAG autorizados como fonte de verdade e responda somente à solicitação atual.\nNunca exponha identificadores técnicos ou de identidade presentes no estado, contexto ou MCP, incluindo customer_key, contract_key, account_key, resource_key, session_key, customer_id, document, message_id, ura_call_id ou MSISDN/telefone completo.\nNão transforme nomes internos de campos em rótulos para o cliente.\nEm consultas meramente informativas, não exponha flags ou capacidades transacionais internas como can.cancel e não informe espontaneamente que algo pode ser cancelado, alterado, contratado, removido ou trocado. Só mencione capacidade transacional quando o usuário tiver solicitado essa ação.\nNão faça oferta proativa e não execute nem simule mutações sem a confirmação exigida pelo framework.\nNão acrescente canais, procedimentos ou próximos passos não solicitados.\nSe uma tool retornar BLOCKED, OUT_OF_SCOPE, NOT_ALLOWED, FAILED ou outro resultado terminal, explique somente o motivo retornado, não declare sucesso, não invente alternativa e encerre a resposta.", ), mcp_results=tool_context, rag_context=rag_context, diff --git a/templates/agent_template_backend_day_zero/app/agents/support_agent.py b/templates/agent_template_backend_day_zero/app/agents/support_agent.py index b4f0244..b15a0e4 100644 --- a/templates/agent_template_backend_day_zero/app/agents/support_agent.py +++ b/templates/agent_template_backend_day_zero/app/agents/support_agent.py @@ -95,7 +95,7 @@ class SupportAgent(AgentRuntimeMixin): state, system_prompt=apply_agent_profile_prompt( state, - "Você é um agente de suporte de varejo para troca, devolução e garantia.", + "Você é um agente de suporte de varejo para troca, devolução e garantia.\n\nUse dados de tools/MCP e RAG autorizados como fonte de verdade e responda somente à solicitação atual.\nNunca exponha identificadores técnicos ou de identidade presentes no estado, contexto ou MCP, incluindo customer_key, contract_key, account_key, resource_key, session_key, customer_id, document, message_id, ura_call_id ou telefone completo.\nNão transforme nomes internos de campos em rótulos para o cliente.\nNão declare sucesso nem simule troca, devolução, garantia ou outra mutação se a tool não tiver confirmado a execução.\nNão acrescente canais, procedimentos, ofertas ou próximos passos não solicitados.\nSe uma tool retornar BLOCKED, OUT_OF_SCOPE, NOT_ALLOWED, FAILED ou outro resultado terminal, explique somente o motivo retornado, não invente alternativa e encerre a resposta.", ), mcp_results=tool_context, rag_context=rag_context, diff --git a/templates/agent_template_backend_day_zero/app/observability/__pycache__/__init__.cpython-313.pyc b/templates/agent_template_backend_day_zero/app/observability/__pycache__/__init__.cpython-313.pyc index 359dee6e45c3f33c435089d7c5c4141ca2ed9494..029d41d1a27edae146fba615821ea7a605622fbb 100644 GIT binary patch delta 58 zcmX@Xc%G5_GcPX}0}$wW_e|tAR?gGU%`4GQNi0d!PfW9nFV8Q^)=x}N%`1sdD@x2w K1@R|FrC8JECeo1bDeh!c*%FohIOi#@#i7&`WEJ@2R%H4dO H@wWf~`F9i& diff --git a/templates/agent_template_backend_day_zero/app/workflows/__pycache__/agent_graph.cpython-313.pyc b/templates/agent_template_backend_day_zero/app/workflows/__pycache__/agent_graph.cpython-313.pyc index a39b5852a026f642b44beac29cda2ef94d232c11..09d9e25fef257a0391d7663214fd45614ee901af 100644 GIT binary patch delta 16500 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 delta 7192 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 diff --git a/templates/agent_template_backend_day_zero/app/workflows/agent_graph.py b/templates/agent_template_backend_day_zero/app/workflows/agent_graph.py index 8612e4f..aa1eb63 100644 --- a/templates/agent_template_backend_day_zero/app/workflows/agent_graph.py +++ b/templates/agent_template_backend_day_zero/app/workflows/agent_graph.py @@ -492,6 +492,119 @@ class AgentWorkflow: "next_state": "SESSION_ENDED", } + @staticmethod + def _output_guardrail_context(state: dict) -> dict: + """Monta o contexto operacional do turno para os guardrails de saída. + + Mantém evidências/protocolos necessários aos rails, mas impede que uma + transação encerrada ou semanticamente interrompida governe o novo turno. + O histórico completo permanece no state/checkpoint para auditoria. + """ + ctx = dict(state.get("context", {}) or {}) + mcp_results = state.get("mcp_results") or [] + ctx["evidence"] = mcp_results or ctx.get("evidence") + ctx["tool_result"] = mcp_results or ctx.get("tool_result") + ctx["tool_executed"] = any(isinstance(r, dict) and r.get("ok") for r in mcp_results) + + history = list(state.get("history") or []) + current_user_text = str(state.get("user_text") or "").strip() + if current_user_text: + if ( + not history + or not isinstance(history[-1], dict) + or str(history[-1].get("content") or "") != current_user_text + or str(history[-1].get("role") or "") != "user" + ): + history.append({"role": "user", "content": current_user_text}) + + route_decision = state.get("route_decision") or {} + route_metadata = route_decision.get("metadata") if isinstance(route_decision, dict) else {} + route_metadata = route_metadata if isinstance(route_metadata, dict) else {} + pre_validation = state.get("transaction_pre_validation") or {} + pre_validation = pre_validation if isinstance(pre_validation, dict) else {} + tx_status = str( + state.get("transaction_status") or pre_validation.get("status") or "" + ).strip().upper() + terminal_tx = bool(pre_validation.get("terminal")) or tx_status in { + "COMPLETED", "FAILED", "CANCELLED", "BLOCKED", "OUT_OF_SCOPE" + } + semantic_intent_shift = ( + str(route_metadata.get("transaction_interruption") or "").strip().lower() + == "intent_shift" + ) + stickiness_intent_shift = bool(route_metadata.get("route_stickiness_preempted")) + should_isolate_history = semantic_intent_shift or (terminal_tx and stickiness_intent_shift) + + current_route = str( + state.get("route") + or (route_decision.get("route") if isinstance(route_decision, dict) else "") + or "" + ).strip() + current_intent = str( + state.get("intent") + or (route_decision.get("intent") if isinstance(route_decision, dict) else "") + or "" + ).strip() + ctx["current_user_message"] = current_user_text + ctx["current_route"] = current_route + ctx["current_intent"] = current_intent + + if should_isolate_history: + operational_history = ( + [{"role": "user", "content": current_user_text}] + if current_user_text else [] + ) + ctx["historical_transaction_ignored"] = True + ctx["historical_transaction_status"] = tx_status or ( + "INTERRUPTED" if semantic_intent_shift else "TERMINAL" + ) + if semantic_intent_shift: + ctx["historical_transaction_interruption"] = "intent_shift" + for stale_key in ( + "transaction_pre_validation", + "transaction_status", + "active_transaction", + "transaction", + ): + ctx.pop(stale_key, None) + else: + operational_history = history + + ctx["conversation_history"] = operational_history + ctx["history_texts"] = [ + str(item.get("content") or "") + for item in operational_history + if isinstance(item, dict) and item.get("content") not in (None, "") + ] + + protocols: list[str] = [] + seen: set[str] = set() + protocol_keys = { + "protocol_number", "protocolo_id", "interactionProtocol", + "protocolNumber", "finalizacao_protocol", + } + + def walk(value): + if isinstance(value, dict): + for key, item in value.items(): + if key in protocol_keys and item not in (None, ""): + text = str(item).strip() + if text and text not in seen: + seen.add(text) + protocols.append(text) + elif isinstance(item, (dict, list, tuple)): + walk(item) + elif isinstance(value, (list, tuple)): + for item in value: + walk(item) + + walk(mcp_results) + if protocols: + ctx["expected_protocols"] = protocols + ctx["requer_protocolo"] = True + ctx.setdefault("tipo_fluxo", "ajuste") + return ctx + async def output_supervisor(self, state): """Valida a resposta candidata com o OutputSupervisor corporativo. @@ -507,15 +620,15 @@ class AgentWorkflow: } candidate = state.get("answer") or "" - context = { - **(state.get("context") or {}), + context = self._output_guardrail_context(state) + context.update({ "tenant_id": state.get("tenant_id"), "agent_id": state.get("agent_id"), "session_id": state.get("conversation_key") or state.get("session_id"), "route": state.get("route"), "intent": state.get("intent"), "supervisor_attempt": int(state.get("supervisor_attempt", 0)), - } + }) async with self.telemetry.span( "workflow.output_supervisor", session_id=state.get("conversation_key") or state.get("session_id"), @@ -601,7 +714,7 @@ class AgentWorkflow: component="workflow.output_guardrails.start", ) final, decisions = await self.guardrails.run_output( - state["answer"], state.get("context", {}) + state["answer"], self._output_guardrail_context(state) ) for _decision in decisions: await self.guardrail_telemetry.evaluated("output", _decision) diff --git a/tests/__pycache__/conftest.cpython-313-pytest-9.0.2.pyc b/tests/__pycache__/conftest.cpython-313-pytest-9.0.2.pyc index 17572f2e6454da10b9117d96dc8bcbef89c5e630..2e7e76e5d2d5ce4c5a756010ed753347ab2f838b 100644 GIT binary patch delta 63 zcmeBSo5IHRnU|M~0SK;d-N@y}q;8>~n^&Trl30?cpO|JDU!Gr-t)G~lnpYB^R+N~V P3gXA-CudI1XPOHDXKodG delta 55 zcmbQj*2Bj2nU|M~0SGQ-Z{%`gk~h%L%`4GQNi0d!&ri;bPfSTHC`m1fPs^-`FV8Q^ Jo?Ol}7XZH)5CnkbUOKaDJCVARX*+FS@&-7aPI>CNyV|Rjs$`N* z;K`Tu)jem=z4z?dyZ3zOTsGR;!W5MDKi&D^326NT6Hf6~8ym~ec$eZSo<2_@+WPgJ z^Qs<>I_E=v4&U*d51b34AV*yZ#;GgJ7;X2R?QjOG{f3fG8pv4lZ?XO#to=;Qyff|qB^MQgA^sxDSFl|3lg|E zgYLIUDg)|V=%px-CW=*W!4FTp1hpkIfMu4bcfr~hMkuNUW?P_-c<1SaXA<``yTt`b z)&xz;7jmK|30KARHA&8xyPETbjCfNhNl2MVc+5an6*5_5`eZRL0qsd1H0gqh$K^Ql z2Sa&T8_I~9I3&)$C|p<2wIO@Zc?9y97L;^$NRw1ewQAuj=2XRbNxLbe6h1$GGK_m6q0b z#&3_mGqK^PLgBylZhP;AU%#O55shB)-)K=*Dv#k^KdyxtHccBT|r27+I zGoUI+lQO1n_Tt4$rXMZjl&cS@4UmP^2bCGAR||CmGYEg`9;j|npSQ#wV@>`U>-tsi z-QIhrez|MI5A+7*YYl*o{s8I%!Ma6?zdCD?hJE#m)L9`itR=EaenGhxF7#+Daai2W zLghV!aGUq?zB&9USY;O5t)axpYP43_wz@g2U7@~195iy~a5NLa6s}JS+qa>(dtIb? z-$8m1w36vL))92|k2<{CFZ3r*=FBe9_&YmGPiJ5x5AWv#d=UOINuTUZdB1MYv3i}R zs3NTG!kLtZ4-K|}t-`oY`EWgpUsXflTlm%&X*rPcTm5&ztij7m*lNnMV~MkLCQ@e$ zyhs`fyrs4jbBN|6mzNHC#;Wg;XTS6J6m%@*X!niY6X^x-iRGi;xmJPyODoa~w2Jbv zq{mu6A=j#D`aPsPvs)X?59A!|wRUlIiBNod$_I5vDtOcrp+^1A9lq20j=EBz>Y5FI zi!~c|Msa>6@S8Gomc9_TcW-E&C9Q?(j!q@IXG-xINnR}GIcF>9s#`e+8>S*_NX#gu zXn0aoRS9X_-u;D}2NSC4g&#AhiD*I6)P(n6``|HWigH@yU~5(6MUl&9z(Hi^vuPLr zNh+s({2(o7(~4TeOLgYs_Z3b|!;LhENnBc##jN^tJ1=p?yvS*alH-u1DM%I(_q|sx zo;rW#bi#|UJxgH_PQqVW$|2ZBz)@QKB6jfBxEU#(6OqKJ#k8ctZfgnoO3|y?TrMjw z*!}{1K`B~5N~W0BY8+NU840O1MpP{p3b0`lj_DN(1v6mz9QCQcsLc*eIt1+x`y3s;NToR*bgI@_U{TLg7cDdsW)k_t$` z4oA!h*!!9x0eeZzHX|pkQL>7B1|bER9nR?RMsx6bG`M5>v#?H7GlV2D18(Yu21 z%vmF+m3#s0Znhu^KtXm%65s{4<2TfT@Yi9sVC`(3hfUvAQI*U+D}z+RMIixb#k3H(a`JeEA6B8FiG+28qw3 zJHDg4lL4TiN3VS8 zrMB(<(ogLkelkSGw)`(j!KlGPDOZEdQ407&@AQ4}hky-u+VZ6ytM*#H6!&c?ypQ*T zFQxf_5>L^V4;^*9ROYv^LzCTnmY|o~5a2TTF zvrW;8gTJt58Q7;>V}pNhEN*n-JcZ?JYfsT!BZ6tbtA+S*)vNh1(nvWN$v+o!=5uL* zKi`G|S`e@0_BY4q!fw88)6Upj&)m+DO*=mqJF}a1elB*7Zrb^I*!isY!utgM$7axW znA8m6q{@6wxvrKXHbz=NVqp;wGTI6E5k#O=DT$OKBzp3aCgS8w5`h2yID`kXDyA_s z6taNh5h@li5l^5#==7k9f`=2TgMvo^&-$(5A9yhG9mdt@(}*j+7_%YoSSfbw7#GLG zLZ(Sw%+71^(m-0fF&AHie2#)3w8#l{8Z5{VYGmTCbH}(#s3?{8TGD`Dr8Hz*1VD6} zl2&r6B|)gtURBD?Ck1%ELQxYIiXzG&F`L7gBMfo(s~V)Z5{a;dz|k-^3HH7SGGi3N zQ5)*V)d5^V=8Qr~Tn#~$2q5g?(Fv$*sA@mwK{qkt2C;|S#9cb22vvab^By63;U{eFuPJD?{gjo4&4`mzyy zS?9m6Lmi!4_E*^BIy3!n%wVU>O!Zo2rgiqXO|HAzL;#o%#|UNAQG~t5Ojp>r&K$Te z8SH^FQ@vK113DYG$#qwo2mtfGL@1+=#Mc8Z1RE0gPGsi#LYhXK6uT|!_&K|bObyu4R0P~~0gfi+V!d_#JKfA#{ zV~#&*qhftu1Ioi849a<0cICJo_-X<3Kj1`LiiU(B#9_Pz$$2ZuC3_$}(gd74y&WiP zrJi4a)ELG42iq)|?`fJhhXfpedN0o?r&HdSAS_c-WDE@I36yW1h~z^lKY;r1d)}3WoNL-x3qKAvU6MI>_gY`U1k5!D3uV;BP3KS|I}1G1t) zzyyZ~-S`jzhfg-gI!J&J%1(`+#Dkv3)fuQtTkQet$ZSc>DG2iKnwYBwW9T>*+EOP3 zhZfm9=&i&PrB3%99P$)Z;C8sVko=c{3I7>_o&@D$&I!k)qn8=9()m)RdbWX1!JLr& z$45S9K)L~OoBHhns1UjceXS_Ugp&c=r1s-a;Tv$OMWJb2y^O0Dp;7^;R)Z!8o$R=2 z)QX$ti*O3y9CX2dLQn)StB@(?3jz|aLj=2|WYdyR5O3xbF@t7d9BaUzTES5z!rnSd zBBYLASZ1o%Dl@3F5FTN2-PI-nz+CAhlu<_!_8K!-VfX0F zz>3enMy_6~%z)1BvB`B;n+O1N#YZTkjw0;On1RP#5I#NXrn-A{U-zBYZogFab=%jf zuN$8QRVlmiX&uj~QE=nVYYoCc!WdR)mWY~+bG&C|9n7tQeIS^$GYgP>Nh0Ywf=|^9 z5tbRO@~pWzp}VlI0X;h@Z91OXqu2?Caayup%$1>jqQZxyHi?X(9z2D8!y)@Olm z2w`bte_zbeJe;KFq)9XfHy|RTRQ%~b^3pW@SBiRz`jp!8I6yJ2%hNx9qa55}1b3_j qca?+tjNrZ%+6eaF@;wRo>A;id4*GTa$q710pP)B7+vpx^lK%q!0khZu literal 0 HcmV?d00001 diff --git a/tests/__pycache__/test_generic_tool_response_presentation.cpython-313-pytest-9.0.2.pyc b/tests/__pycache__/test_generic_tool_response_presentation.cpython-313-pytest-9.0.2.pyc index 4b2fda1c38ccd8f0cfeafd53e62111b97bf982a3..0e408dc183eadaafad8030b9172e10a6188a089d 100644 GIT binary patch delta 65 zcmZ1#xG9kPGcPX}0}x!_I$G6Voi?%kzt}^%K)m^Gf2= UiV|~ELHzjqF*{;U|05{+nwEzGB delta 59 zcmX?fl5y8bM()qNyj%=GpzGbUk$WebyuW^KUWtB6Vo9QYesX4fVoG8`NorAiT4qIj Nd45s$=GSc3V*yb_6|n#S diff --git a/tests/__pycache__/test_transaction_confirmation_customer_facing.cpython-313-pytest-9.0.2.pyc b/tests/__pycache__/test_transaction_confirmation_customer_facing.cpython-313-pytest-9.0.2.pyc index 289bd4f5507cf6528d01b7cc45ecee5ed2050e40..64c4baabbe4f1a755135e6114f3dd0171de333f4 100644 GIT binary patch delta 65 zcmZ3lx?Pp~GcPX}0}x!>I$~vtDE-{L68)6Kl0^N)G|Tw%{Gx3A#Prm>lK8Zu S#N1R6KR!P>b8{Z^&ny5Qo*3l- delta 58 zcmaEVhw=FxMy}7iyj%=GP@cV!%avI^NIy5PL_a05BvC&b8xW0A5M(zhZ>OT6pc_sQOi6x2piD{Pc<@rU~`ibeOc_r~_ XMTxnoAbxy)a%M9Z?{+R;MrJkuah(_6 delta 63 zcmbQbjHP!O3-@PUUM>b8(Dm-w$o+sv-bFt*uS7p3u_RGHKRGi#F(t8}B(*3$EwduN RJijQrS%`PL5HBM$8vuUU6XO5? diff --git a/tests/test_agent_template_backend_safety_consistency.py b/tests/test_agent_template_backend_safety_consistency.py new file mode 100644 index 0000000..9c2788a --- /dev/null +++ b/tests/test_agent_template_backend_safety_consistency.py @@ -0,0 +1,70 @@ +from pathlib import Path + + +ROOT = Path(__file__).resolve().parents[1] + + +def _template_dirs(): + return sorted( + p + for p in ROOT.rglob("*") + if p.is_dir() and p.name in {"agent_template_backend", "agent_template_backend_day_zero"} + ) + + +def test_all_agent_template_backend_copies_have_safe_agent_prompts(): + targets = _template_dirs() + assert targets, "Nenhum template backend encontrado" + for base in targets: + checks = { + "billing_agent.py": ( + "Nunca exponha identificadores técnicos", + "Não acrescente canais", + "Se uma tool retornar BLOCKED", + ), + "product_agent.py": ( + "Nunca exponha identificadores técnicos", + "can.cancel", + "Se uma tool retornar BLOCKED", + ), + "orders_agent.py": ( + "Nunca exponha identificadores técnicos", + "Não declare sucesso", + "Se uma tool retornar BLOCKED", + ), + "support_agent.py": ( + "Nunca exponha identificadores técnicos", + "Não declare sucesso", + "Se uma tool retornar BLOCKED", + ), + } + for filename, required in checks.items(): + text = (base / "app" / "agents" / filename).read_text(encoding="utf-8") + for marker in required: + assert marker in text, f"{base.relative_to(ROOT)}/{filename} sem {marker!r}" + + +def test_all_agent_template_backend_copies_isolate_interrupted_transaction_context(): + for base in _template_dirs(): + graph = (base / "app" / "workflows" / "agent_graph.py").read_text(encoding="utf-8") + assert 'route_metadata.get("transaction_interruption")' in graph + assert '== "intent_shift"' in graph + assert 'ctx["historical_transaction_ignored"] = True' in graph + assert 'ctx["expected_protocols"] = protocols' in graph + assert 'self._output_guardrail_context(state)' in graph + + +def test_full_templates_do_not_dump_raw_invoice_payload(): + checked = 0 + for base in _template_dirs(): + renderer = base / "app" / "presentation" / "tool_renderers.py" + if not renderer.exists(): + continue + checked += 1 + text = renderer.read_text(encoding="utf-8") + assert 'Fatura consultada: {result}' not in text + assert 'result.get("valor_total")' in text + assert 'result.get("vencimento")' in text + assert 'result.get("status")' in text + assert 'result.get("itens")' in text + assert checked > 0

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 RZZh^#a dict: + """Monta o contexto operacional do turno para os guardrails de saída. + + Mantém evidências/protocolos necessários aos rails, mas impede que uma + transação encerrada ou semanticamente interrompida governe o novo turno. + O histórico completo permanece no state/checkpoint para auditoria. + """ + ctx = dict(state.get("context", {}) or {}) + mcp_results = state.get("mcp_results") or [] + ctx["evidence"] = mcp_results or ctx.get("evidence") + ctx["tool_result"] = mcp_results or ctx.get("tool_result") + ctx["tool_executed"] = any(isinstance(r, dict) and r.get("ok") for r in mcp_results) + + history = list(state.get("history") or []) + current_user_text = str(state.get("user_text") or "").strip() + if current_user_text: + if ( + not history + or not isinstance(history[-1], dict) + or str(history[-1].get("content") or "") != current_user_text + or str(history[-1].get("role") or "") != "user" + ): + history.append({"role": "user", "content": current_user_text}) + + route_decision = state.get("route_decision") or {} + route_metadata = route_decision.get("metadata") if isinstance(route_decision, dict) else {} + route_metadata = route_metadata if isinstance(route_metadata, dict) else {} + pre_validation = state.get("transaction_pre_validation") or {} + pre_validation = pre_validation if isinstance(pre_validation, dict) else {} + tx_status = str( + state.get("transaction_status") or pre_validation.get("status") or "" + ).strip().upper() + terminal_tx = bool(pre_validation.get("terminal")) or tx_status in { + "COMPLETED", "FAILED", "CANCELLED", "BLOCKED", "OUT_OF_SCOPE" + } + semantic_intent_shift = ( + str(route_metadata.get("transaction_interruption") or "").strip().lower() + == "intent_shift" + ) + stickiness_intent_shift = bool(route_metadata.get("route_stickiness_preempted")) + should_isolate_history = semantic_intent_shift or (terminal_tx and stickiness_intent_shift) + + current_route = str( + state.get("route") + or (route_decision.get("route") if isinstance(route_decision, dict) else "") + or "" + ).strip() + current_intent = str( + state.get("intent") + or (route_decision.get("intent") if isinstance(route_decision, dict) else "") + or "" + ).strip() + ctx["current_user_message"] = current_user_text + ctx["current_route"] = current_route + ctx["current_intent"] = current_intent + + if should_isolate_history: + operational_history = ( + [{"role": "user", "content": current_user_text}] + if current_user_text else [] + ) + ctx["historical_transaction_ignored"] = True + ctx["historical_transaction_status"] = tx_status or ( + "INTERRUPTED" if semantic_intent_shift else "TERMINAL" + ) + if semantic_intent_shift: + ctx["historical_transaction_interruption"] = "intent_shift" + for stale_key in ( + "transaction_pre_validation", + "transaction_status", + "active_transaction", + "transaction", + ): + ctx.pop(stale_key, None) + else: + operational_history = history + + ctx["conversation_history"] = operational_history + ctx["history_texts"] = [ + str(item.get("content") or "") + for item in operational_history + if isinstance(item, dict) and item.get("content") not in (None, "") + ] + + protocols: list[str] = [] + seen: set[str] = set() + protocol_keys = { + "protocol_number", "protocolo_id", "interactionProtocol", + "protocolNumber", "finalizacao_protocol", + } + + def walk(value): + if isinstance(value, dict): + for key, item in value.items(): + if key in protocol_keys and item not in (None, ""): + text = str(item).strip() + if text and text not in seen: + seen.add(text) + protocols.append(text) + elif isinstance(item, (dict, list, tuple)): + walk(item) + elif isinstance(value, (list, tuple)): + for item in value: + walk(item) + + walk(mcp_results) + if protocols: + ctx["expected_protocols"] = protocols + ctx["requer_protocolo"] = True + ctx.setdefault("tipo_fluxo", "ajuste") + return ctx + async def output_supervisor(self, state): """Valida a resposta candidata com o OutputSupervisor corporativo. @@ -507,15 +620,15 @@ class AgentWorkflow: } candidate = state.get("answer") or "" - context = { - **(state.get("context") or {}), + context = self._output_guardrail_context(state) + context.update({ "tenant_id": state.get("tenant_id"), "agent_id": state.get("agent_id"), "session_id": state.get("conversation_key") or state.get("session_id"), "route": state.get("route"), "intent": state.get("intent"), "supervisor_attempt": int(state.get("supervisor_attempt", 0)), - } + }) async with self.telemetry.span( "workflow.output_supervisor", session_id=state.get("conversation_key") or state.get("session_id"), @@ -601,7 +714,7 @@ class AgentWorkflow: component="workflow.output_guardrails.start", ) final, decisions = await self.guardrails.run_output( - state["answer"], state.get("context", {}) + state["answer"], self._output_guardrail_context(state) ) for _decision in decisions: await self.guardrail_telemetry.evaluated("output", _decision) diff --git a/Tuning-Performance/Long_Term_Memory/templates/agent_template_backend/app/__pycache__/__init__.cpython-313.pyc b/Tuning-Performance/Long_Term_Memory/templates/agent_template_backend/app/__pycache__/__init__.cpython-313.pyc index 884409ed746324caa06d75871c191596fb69d6ae..823d284146ce2f1f0d4687f6682c0ce3984f82bf 100644 GIT binary patch delta 98 zcmdnVc!!buGcPX}0}$j0^iAY8_O8~?%`4GQNi0d!PfW9nFV8Q^)=x}N%`1sdD@x2w y1@YtalQZ>0O7k-F(sct;i_-Foauf5CQ}uoF^U~u(Qj2oqeN%Juiz+9k1p@#|$RiN| delta 46 zcmcb^xRa6lGcPX}0}#y7&!5O`EE1ugn^&TrqVF5*86QxTpOub8$Pwt<$So}#R<56$SE8SiSdyrpm}VJYo?n!$pO~JSR}!CA zl$e_e;>YJFXX=NP=4Ixk>jtD2rR5jpCgvrl>igv9rN@V)7UjnKrsn1sRqB_d<`(26 UmZTQzPrk=3#;CtpUHD-Z02oax?*IS* delta 29 jcmezJhq2=iBll-sUM>b8c#v7Jky~1rk$dxG;fGlOpM(kQ diff --git a/Tuning-Performance/Long_Term_Memory/templates/agent_template_backend/app/__pycache__/mcp_gateway_client_factory.cpython-313.pyc b/Tuning-Performance/Long_Term_Memory/templates/agent_template_backend/app/__pycache__/mcp_gateway_client_factory.cpython-313.pyc index d6621835a07807c6a6b4ba4914d4e5640f3f740f..71b133957919c7e3d3b8c5003d9076f46e46e55d 100644 GIT binary patch delta 102 zcmaFJzJ`PQGcPX}0}$j0^lju$X7cIP&&?~*Pf09E)K5&aj4#hG%GOUzPt7ZdPb*5y zO$G7e^OH06LrU{9^U`$#Qj5~^i*gh5l2i44^7GQ;LsE-!<9$^v-SOj<1D?*bA9W z?Yi&>u=Xo##6~RbMEw9W7Za1r$@8A~yl3Vy#KXZxFxc!8r_y%0XI}@ITl3sqoCCfL zT0xXAflw^gFYLUQ_hvgB3JB`_A->@53TR&Gd$Zkg8pOE;+QU66)2lKG>HCsD4!?7U zrsbvq<)>6;P|=V>&0=m?_0sZ%mJvtG4bah}${&;O#K)D+D4LLzounw-6ADDhpDM=VAG-}kYTf0K@8i!8~(Jui;R6t3J_JR z&}NA7vM&VQ`Kj+S+EL5aduuy4txsCtb0k{J)IGJCYx1NexaofbD||DMUXtIXE3&N0 oKl|rRt8h@ki*!v$Ag&z|<--F2cy-0Unld1H)m~3FTmqcjH{m#p6951J delta 356 zcmbO%x>uO@GcPX}0}wpOEXY!y$Xmj6hiPMTBcmis3~R8II#42p6UdT=vt%YaG79s` zg83XVEUZ8klO37lCzmk_i7J3aK{^%T>Xkt11C`-2DsUN9I7^fjR=VWeXWmb@_`XIX$4dAK_;VdH%E7-V*JKaRnbaOXzAme5x)%Vbe*iqrRxZiFLDJDZXiV*Ho5sJr8%i~MV>$| iBM=vh0f`UHjEs!;85F;;88WI)kX)epnE}WE>jMDFSVE`( diff --git a/Tuning-Performance/Long_Term_Memory/templates/agent_template_backend/app/agents/__pycache__/billing_agent.cpython-313.pyc b/Tuning-Performance/Long_Term_Memory/templates/agent_template_backend/app/agents/__pycache__/billing_agent.cpython-313.pyc index 0e9f1e1ccd115e065d40dcf3f436c542eb47c4e6..abd23f2bbe20e039078cc384c293b16a029789b2 100644 GIT binary patch delta 1276 zcmYLJO>Z1U5Ji?Fp(TzG2hM$sH1Uc92ad*eP?WXT%G%;MDtc;{j{9TMAI9b~k#b0m zNJu#aiH}3zh*tc9xgvf*j`<7x0bb4Q8eew0tGepFSFil){_mgN`*&||@&W$d{r$t! zUqAix-sd}yUrwFR(}prlY57I{U5J-cTCvadGLmCC*Fl@__s4%G54y?ZBC%?y2}w1qatJm}PY%x%t0xCvDJnTc^ZgLk z!3DJpJ|myi6-T^c)lwuCIkmwz990Sqpjh=kRv|=E1t>qj*U1Z3Se3H>HXgKZ?5ND2llwXr;@x@NXew~ZO_n zSR>?x2&VA<`5R%rCG`IJPt|a@MGMNf6FA5`84%&TKRJ_O;bkf|leF#zmt=E=6XafE zN|7o>?MCd|dEPq2^QvEK6O?BS75ZPI326iCifo7#tl_m0p)jCiF!#{`m}X|5(Epn# zh7v_OafU`SE$oygPX^Vt>Pg{#-Ix`GxL7QXDs}N>hD&N;Edp$5ZNpQ-Ph?BEUke;X z4V)LoT5SxPn-LEpR@5G!LZ42xQ2N@qLFtt6^Q>Sr!>AY*bzlH9!LXy5M|VdI6jfwt zTC^S3W-9x_x31sBf-0#DB5e#1mK?c%iye@a=`wl7{tEd}Fi;?bT7SXi!vbWoz#vjW zt_7>&#%5qUAc*SA+5GVFF_f8KoY(V*_2O`Tc3i2``FVXXo6WzL(8GgAv*RPFC_RE0 zUJL+U9n^5fldVRILVml#LAf9jZ+pqU4Z<|6Ekz_2alrQ0c+4F%{#O_r6|BG!xtsqH fSlj*kyYKeWP0H-*c3nQYduQj_C+im<-`V{SGu`BS delta 217 zcmWm6F-ikL6oBC{Bt!xmA$WjSCZHKCJb_h;K!{i`&zWbKb!Xl>ZxYcat(A?HL8}y| zv5>_R>@B>7cmdum>zKJ)gnt5`$&1?*HF>tjNiD)c(%oUK07ditMXYZw|X1 LRjPV>)M@_#iw#bG diff --git a/Tuning-Performance/Long_Term_Memory/templates/agent_template_backend/app/agents/__pycache__/orders_agent.cpython-313.pyc b/Tuning-Performance/Long_Term_Memory/templates/agent_template_backend/app/agents/__pycache__/orders_agent.cpython-313.pyc index f05ef2c6479b9fb2140f2b7910601bb299e3ab20..3a5ff2f4601e9ddc83c1bbc4bf5cd232a0625baa 100644 GIT binary patch delta 944 zcmX|9J8u&~5C#(=WaJ16sHcq3k!xruLmq(Q#8Ki1QJqG6aoz#2-MS zKu9#mEuBRN6&=3Zv^4<{ubiHp@Fu$5d_Ug>h2oOVYK_asbwu@P~i1p!OcHDb; ztG9jQ{rCQZX}^Ei3e{ZumTIBsy=lvx^*s{WUwcZNq7V8_cdfkjH1RH?U+7E%UJ3ew zw2gN)Q|m1N3C%y?XtdIi=bz>uJ#kEIR{OijDJD5b_bVn{qj{<)T46e7P@I2OPAdTM zDR1Z+bho6zeIDJC^CWG=i-J^!avptd2jYUXQzmIwds3;5028VcxmYv?R&i0WQa(Yq z?rMs`J_RLg-d#Ss8lvlhYOhjeSCB;yl&|vN6u44s42p~*iV+ATfMy#b(Svj5 z9|OBK`ys%O_dpsYI53@pr()aSD3-!}7L&ob;lKnMMrYQSQ)*F$gHW3kAV2^%n6i+# zzz(k%T(ji{iEs;HPNDp1l0Y_HxdFeqGn(9dn$c-^nbn+VBnIkbk3^-;yUX3IAe72r z@&?vzK@Ap4t-DPq{X|0K&btOY&b94$04Pk$B3wlRNn7n72qg;?Q{)W+LdYBkdNLfX zZ*OiCG&&qtqpj*-eYCe((C%nltqq5x7x`*y?fGzXBdhHbIOp^wlLG4fcCC|Mafi LmBDP~&eGC9YcXIQ delta 137 zcmX@Bw?>2SGcPX}0}#y7&(Crb+Q?_Zq>-$jn^&TrqVF5*86QxTpOu&^2I zKm2+9&fdeS<-}9&erjI&a5m+oxYTrkt(0@)m7bnvr`_`QiG|6M4^^jAE^~e-kUgmbZ|mKkN58r=j4O_wO%W4 zJ$2qC#0#BEz*mB}AhGwZWs2THkkIxc9*tHy@%E4HXHT3mo5|=nJH;d`ME}C1TLiCl zrxmgz2c_*7<+OqjpG$=rplgvH_a${C=SgD17h_UI$}0I14#i{APMNG->q+I9ASN_t z@@fbStkQ5|rF;grdbLJkpM#R&7$rvS-Nk3SB)T0_>s2n@jmaVg36} zlhKhaO~-5!N9ZWV7v9=cuaiFKI3`z0?I3rCmzAgDo>hej&_xGM-tk%&6-5LxR)ZD0 z3I0k9tgX3*^l-Y^oY=`l*%w)e&C*lv;Z~GD!*|sjHb{DDQ^4F7%K`@QT*Dw(mV#Hj zZvBK7+YP#LMG%->3jM!MLoYHHXFcVZx1WLrPK_D7oHX1OV`vz;3*sG4AlOMrOnvZN z814F!m8f+FKL_Sf+iZkvt~2`;=0v>Z!n@O0q+yU{rI&z6y%?;*Zt*UPvBEH^>Iguv zh8HNQq}9cyVXS+2yVACL8>5fw0r75Ku!WP+LMU6Vs|aA&KgWUY&gKUXj}FH)e{$N) z?=_2q`N`3kj_0S%{%kgXTCVQxKbRdI7PdZvZduGSDj)+dtafb1WiX5`&JD}@OhD9n zU@76XR`IF&-ik6D5SbOo?%ry5UR$gNyB$!tCjqfsieiitZ+`pk=G8s>{pS6Rt5^O5 D^PAH9 delta 217 zcmZ2#xImNdGcPX}0}#y7&(GQ_w2{x0Nh3u+H?KrLMc+5rGd`dwKPxr4q*y;OJvFZ+ zKCLJ*H?=&!C_6qsIdgL#QxXT$28PL>xSZ-0Tq_E4G7C#n6^c`H719!`Qi~Mw(^88{ z5)}%H@)Juk%MukJa;X)m$)zQUMGA?Bmml7mS`5~ZoS&DLS(FPBTAZ(^5L%q7kdl~^ zU##Hk9H3BGnwXc8uaJ^iT#%o4cx_o~X0e_o%PrpG%HopL+<2h*xtpi*bFwlyGjCoX H!pZ^w1G`UU diff --git a/Tuning-Performance/Long_Term_Memory/templates/agent_template_backend/app/agents/__pycache__/prompting.cpython-313.pyc b/Tuning-Performance/Long_Term_Memory/templates/agent_template_backend/app/agents/__pycache__/prompting.cpython-313.pyc index 27c5dd67ede2919acdfd9154c883b727601ef3d0..0ab1a52bff309be8b133a8388def5ab4a4d3f478 100644 GIT binary patch delta 85 zcmbQod61L)GcPX}0}$j0^lju8U>0uH&&?~*Pf09E)K5&aj4#hG%ATyxEUFw*nwOcE nt{aeAl$KwVo0ylJs_&DZmmVLIT9g~_o0^+nRJqxiIhqjwM=BeS delta 66 zcmX@eIggY3GcPX}0}#y7&)>)`z^sv=pPN^rpQ7&@>=_?Wl%JKFTvDu`n4X$f5}#I- Un44OjUz8o6pPacljX9bT0F7`JbN~PV diff --git a/Tuning-Performance/Long_Term_Memory/templates/agent_template_backend/app/agents/__pycache__/runtime.cpython-313.pyc b/Tuning-Performance/Long_Term_Memory/templates/agent_template_backend/app/agents/__pycache__/runtime.cpython-313.pyc index 321fc08938aeca5f7295d480b1be6e2d3b8e0ef1..108929121ccab9207f5ef8b18ad6511f68d49c19 100644 GIT binary patch delta 284 zcmWlS%}T>S6ou~?HMJ1zu5_cNqLPIUf?eoV5d1|+6&J!Vv^OD|nF%)|;!67hLU7{) zxbblWSAj0{34|_m>EytEp+z1iqmkReA|6&$vof82@BL# z+SF+B9jWq#kXa_gJ4|bGHReiNK9W{)8SjXDL$_QeZX;rn3hOM)Fy(_go$6%c3@J9G zq#hzaHaZalBqdHz8G7IrRh~(Ug(JMIu>RJf`@o!wWp{o&#@GaUzYSoQ>;o<)u>A$? OPw0F%_r^X2uJaEy?NmGf delta 136 zcmeyt+`!EHnU|M~0SM;k=Vy6LonGO@^$*-w*w;!P_H z_W1b3oSgXhl?Wpv`=1?pe~;$pGM7a2vk9&tH0vKMg!1pp8SCIkQg diff --git a/Tuning-Performance/Long_Term_Memory/templates/agent_template_backend/app/agents/__pycache__/support_agent.cpython-313.pyc b/Tuning-Performance/Long_Term_Memory/templates/agent_template_backend/app/agents/__pycache__/support_agent.cpython-313.pyc index bcd05596d98c5ecf8965eaf9ad03596c391eb6ae..66abc5411b3ffcf32ebe4e9ac64aea3389900cef 100644 GIT binary patch delta 946 zcmXw2J8u&~5Dw-cWRwUB8mcJ~I&uXP5@pCsC{7$Djwnx~y*aaFcjvMXlOQ2CNVG`& z0VE1UiQLe;MWUzRHz4r`m_6H;iyiOm%=hw-hwsacf9vc0HTnGh`SJC;``c2W8XCgkN6NuQ_C zva1mSTLDBc|13wNm5w<7I{(6eF`?P)A0?*{=u*00A?R9~r@GNfrppY7^KZ&&B|tdk z4PAromb7x8M+a~W6r#K+KxHVGk#oBsE;Q6rc>dm(6(|U3w}O}$;i1yk03OR&a9VHYElM0K}bpbnAJ;~kOs+=GnFWi Qe|u~94mM^_?%urdA1(7?F#rGn delta 97 zcmZqC-=V?xnU|M~0SM;k=Vt{7ZR9g!(n!(I%`4GQ(f1AZj1MTv&q_@$Db`O+Pt7Zd zPb*5yO)bwa%8t)Z&fMJ3l*qy4%`o{Bm+$6OzJpARNt@LLgP53a2*hr#7iMJv0MX7L A5C8xG diff --git a/Tuning-Performance/Long_Term_Memory/templates/agent_template_backend/app/agents/billing_agent.py b/Tuning-Performance/Long_Term_Memory/templates/agent_template_backend/app/agents/billing_agent.py index aa60099..05254d1 100644 --- a/Tuning-Performance/Long_Term_Memory/templates/agent_template_backend/app/agents/billing_agent.py +++ b/Tuning-Performance/Long_Term_Memory/templates/agent_template_backend/app/agents/billing_agent.py @@ -95,7 +95,7 @@ class BillingAgent(AgentRuntimeMixin): state, system_prompt=apply_agent_profile_prompt( state, - "Você é um agente especialista em faturas. Responda com clareza, objetividade e sem sugerir ações não solicitadas. Use dados MCP quando disponíveis.", + "Você é um agente especialista em faturas.\n\nUse dados de tools/MCP e RAG autorizados como fonte de verdade para responder somente à solicitação atual.\nNunca exponha identificadores técnicos ou de identidade presentes no estado, contexto ou MCP, incluindo customer_key, contract_key, account_key, resource_key, session_key, customer_id, document, message_id, ura_call_id ou MSISDN/telefone completo.\nNão transforme nomes internos de campos em rótulos para o cliente, como “contract_key”, “customer_key” ou “MSISDN”.\nPara consultas informativas de fatura, apresente somente dados de negócio necessários, como valor, vencimento, situação e itens cobrados.\nNão acrescente canais, telefones, códigos USSD, URLs, aplicativos, lojas, relatórios adicionais, procedimentos alternativos ou próximos passos que não tenham sido explicitamente retornados pela tool/RAG e solicitados pelo usuário.\nNão ofereça espontaneamente outras ações ou detalhamentos.\nSe uma tool retornar BLOCKED, OUT_OF_SCOPE, NOT_ALLOWED, FAILED ou outro resultado terminal, explique somente o motivo retornado, não declare sucesso, não invente alternativa e encerre a resposta.", ), mcp_results=tool_context, rag_context=rag_context, diff --git a/Tuning-Performance/Long_Term_Memory/templates/agent_template_backend/app/agents/orders_agent.py b/Tuning-Performance/Long_Term_Memory/templates/agent_template_backend/app/agents/orders_agent.py index f557bed..b793c26 100644 --- a/Tuning-Performance/Long_Term_Memory/templates/agent_template_backend/app/agents/orders_agent.py +++ b/Tuning-Performance/Long_Term_Memory/templates/agent_template_backend/app/agents/orders_agent.py @@ -95,7 +95,7 @@ class OrdersAgent(AgentRuntimeMixin): state, system_prompt=apply_agent_profile_prompt( state, - "Você é um agente de pedidos de varejo. Use dados de tools quando disponíveis.", + "Você é um agente de pedidos de varejo.\n\nUse dados de tools/MCP e RAG autorizados como fonte de verdade e responda somente à solicitação atual.\nNunca exponha identificadores técnicos ou de identidade presentes no estado, contexto ou MCP, incluindo customer_key, contract_key, account_key, resource_key, session_key, customer_id, document, message_id, ura_call_id ou telefone completo.\nNão transforme nomes internos de campos em rótulos para o cliente.\nNão declare sucesso, alteração, troca, cancelamento ou qualquer mutação se a tool não tiver confirmado a execução.\nNão acrescente canais, procedimentos, ofertas ou próximos passos não solicitados.\nSe uma tool retornar BLOCKED, OUT_OF_SCOPE, NOT_ALLOWED, FAILED ou outro resultado terminal, explique somente o motivo retornado, não invente alternativa e encerre a resposta.", ), mcp_results=tool_context, rag_context=rag_context, diff --git a/Tuning-Performance/Long_Term_Memory/templates/agent_template_backend/app/agents/product_agent.py b/Tuning-Performance/Long_Term_Memory/templates/agent_template_backend/app/agents/product_agent.py index 34433f5..998dad6 100644 --- a/Tuning-Performance/Long_Term_Memory/templates/agent_template_backend/app/agents/product_agent.py +++ b/Tuning-Performance/Long_Term_Memory/templates/agent_template_backend/app/agents/product_agent.py @@ -95,7 +95,7 @@ class ProductAgent(AgentRuntimeMixin): state, system_prompt=apply_agent_profile_prompt( state, - "Você é um agente especialista em produtos, planos e serviços. Explique sem fazer oferta proativa e sem executar ações sem confirmação. Use dados MCP quando disponíveis.", + "Você é um agente especialista em produtos, planos e serviços.\n\nUse dados de tools/MCP e RAG autorizados como fonte de verdade e responda somente à solicitação atual.\nNunca exponha identificadores técnicos ou de identidade presentes no estado, contexto ou MCP, incluindo customer_key, contract_key, account_key, resource_key, session_key, customer_id, document, message_id, ura_call_id ou MSISDN/telefone completo.\nNão transforme nomes internos de campos em rótulos para o cliente.\nEm consultas meramente informativas, não exponha flags ou capacidades transacionais internas como can.cancel e não informe espontaneamente que algo pode ser cancelado, alterado, contratado, removido ou trocado. Só mencione capacidade transacional quando o usuário tiver solicitado essa ação.\nNão faça oferta proativa e não execute nem simule mutações sem a confirmação exigida pelo framework.\nNão acrescente canais, procedimentos ou próximos passos não solicitados.\nSe uma tool retornar BLOCKED, OUT_OF_SCOPE, NOT_ALLOWED, FAILED ou outro resultado terminal, explique somente o motivo retornado, não declare sucesso, não invente alternativa e encerre a resposta.", ), mcp_results=tool_context, rag_context=rag_context, diff --git a/Tuning-Performance/Long_Term_Memory/templates/agent_template_backend/app/agents/support_agent.py b/Tuning-Performance/Long_Term_Memory/templates/agent_template_backend/app/agents/support_agent.py index b4f0244..b15a0e4 100644 --- a/Tuning-Performance/Long_Term_Memory/templates/agent_template_backend/app/agents/support_agent.py +++ b/Tuning-Performance/Long_Term_Memory/templates/agent_template_backend/app/agents/support_agent.py @@ -95,7 +95,7 @@ class SupportAgent(AgentRuntimeMixin): state, system_prompt=apply_agent_profile_prompt( state, - "Você é um agente de suporte de varejo para troca, devolução e garantia.", + "Você é um agente de suporte de varejo para troca, devolução e garantia.\n\nUse dados de tools/MCP e RAG autorizados como fonte de verdade e responda somente à solicitação atual.\nNunca exponha identificadores técnicos ou de identidade presentes no estado, contexto ou MCP, incluindo customer_key, contract_key, account_key, resource_key, session_key, customer_id, document, message_id, ura_call_id ou telefone completo.\nNão transforme nomes internos de campos em rótulos para o cliente.\nNão declare sucesso nem simule troca, devolução, garantia ou outra mutação se a tool não tiver confirmado a execução.\nNão acrescente canais, procedimentos, ofertas ou próximos passos não solicitados.\nSe uma tool retornar BLOCKED, OUT_OF_SCOPE, NOT_ALLOWED, FAILED ou outro resultado terminal, explique somente o motivo retornado, não invente alternativa e encerre a resposta.", ), mcp_results=tool_context, rag_context=rag_context, diff --git a/Tuning-Performance/Long_Term_Memory/templates/agent_template_backend/app/examples/__pycache__/__init__.cpython-313.pyc b/Tuning-Performance/Long_Term_Memory/templates/agent_template_backend/app/examples/__pycache__/__init__.cpython-313.pyc index e011e2c1613531059c3e340e048f089dc4c4b424..82f6849ced0bfe64d8e426f05d50be9740ff75dc 100644 GIT binary patch delta 99 zcmcb?xR{CiGcPX}0}$j0^iAZ>^J&q~%`4GQNi0d!PfW9nFV8Q^)=x}N%`1sdD@x2w z1@YtalQZ>0O7k-F(sct;i_-Foauf5CQ}uoF^U~u(Qj2oqeN%Juiz@XeR>c7TdITej delta 24 ecmZ3?bc2!mGcPX}0}urN%bm!b$7nh6XdD1kz6VzT diff --git a/Tuning-Performance/Long_Term_Memory/templates/agent_template_backend/app/examples/__pycache__/grl_examples.cpython-313.pyc b/Tuning-Performance/Long_Term_Memory/templates/agent_template_backend/app/examples/__pycache__/grl_examples.cpython-313.pyc index 417fdeaf32888e0d6d9e8772ec338891007c6a65..5ce2480386fc425c237b69444af71cc785146b9f 100644 GIT binary patch delta 102 zcmZqUyU54=nU|M~0SIyg`ZjVqGy8Pt=jN5@rzDmn>L;dI#+T<8W$P!Vr{FnU|M~0SJQs-Z CFC&cr delta 27 hcmZ3=cZ-+%GcPX}0}urN%iYM$!pvy1Ihy$tGXQAq2U!3B diff --git a/Tuning-Performance/Long_Term_Memory/templates/agent_template_backend/app/examples/__pycache__/mcp_examples.cpython-313.pyc b/Tuning-Performance/Long_Term_Memory/templates/agent_template_backend/app/examples/__pycache__/mcp_examples.cpython-313.pyc index 8684f23bc51276468a617f04c595b2327971cf01..0f860a4a4aea9993049fa0b2bb0d13a9d62c2430 100644 GIT binary patch delta 102 zcmaFCx0#>&GcPX}0}$j0^ljvR&f?RdpPN^rpORRTsGpc-8DE}Xl&znbo|;z@pH`HZ zn+oE`=O<_Chm_`J=B4Wfq!y*+7v(1AC8z59(ihMgVA}2j&0( diff --git a/Tuning-Performance/Long_Term_Memory/templates/agent_template_backend/app/observability/__pycache__/__init__.cpython-313.pyc b/Tuning-Performance/Long_Term_Memory/templates/agent_template_backend/app/observability/__pycache__/__init__.cpython-313.pyc index 60f4328ae3e853d8fed5880b8b29d819e69f1ce0..e06cfd229a97431b39683b9a0159b32378f07808 100644 GIT binary patch delta 98 zcmX@k_==JHGcPX}0}$j0^iAY8_U_cr%`4GQNi0d!PfW9nFV8Q^)=x}N%`1sdD@x2w y1@YtalQZ>0O7k-F(sct;i_-Foauf5CQ}uoF^U~u(Qj2oqeN%Juiz+9kB?16hwj)UZ delta 46 zcmaFGc$|^@GcPX}0}#y7&!5O`ERv?5n^&TrqVF5*86QxTpOu=>&C|f@&ri%`d9le24L!008>Q BC2jx! delta 66 zcmaE>dP+sl2M~TKR2&LKSkd+*fTz$C_gJTxujS>F+DY}BtESu UF*mh5zbHFCKRI*rf5vwL0MvaKGRbh!5Z&2f5B-7?Vj@Z-2sM54qCL%Fc)IZL9-= zU}Y!d1>C@0=U2>pKf^H7PbOm#VWzK-_pyHuVuR6|^!t&#iCpCJT3kt%haw*-$)h^S zwti#`Gua(5)w&JD5WF|QXR99<=LVuNZoi>!<^W{Em_Yi705OQ1GVc78x0RwEaG_z zn?^NEZCsB*d#3=j(*fYLS#{eN)|X2|m%I}X8=h>ZvHT`d%1?3jwR`k2K7LL)jpiRR Ck74ux literal 0 HcmV?d00001 diff --git a/Tuning-Performance/Long_Term_Memory/templates/agent_template_backend/app/presentation/__pycache__/tool_renderers.cpython-313.pyc b/Tuning-Performance/Long_Term_Memory/templates/agent_template_backend/app/presentation/__pycache__/tool_renderers.cpython-313.pyc index 32cbdf804cb8637d1026aa386d7d188a32214831..2c6e20ef9c7e6ef0613d7d8297a2ffe4eb6a3784 100644 GIT binary patch delta 1889 zcmZ`(U2GIp6u#5#?C;EWOS@3Fl-_QC=$6u@ER?dXi2S#73+ZMdp(Qx%4$YMA%z9^* z*agz+6V=2PuZ999Rz)dqU?22>2TdO}W}79j&I=f$i7!S&^`UCwxm%VJ#d-MV-gCcm zzH`ppGoSeBmzrq0v zU*tm^d+4b*MloyD(FL(2Z_%&L8MFR}W&1bF=8D-Ei~eb?=LA}7JLs5&2=)qe=o-~* zEzU#zTuP=i9VcY0 z%EJruaYe)9x;&gF%qZbAl947-o735o0J?HUiAxEM$T~I_ZpBq4uIa&}Jv}%DCKgV| zs)ke2*r+BYaAfaM+?>(~mS2;TsZk9lbwy98t`wAzJvz{*I z9X4I(q*0BWGBiUPHJ#^VHLfr*&9v$Ul&1GDdyX*%E-=D)paGMOHt5u?l716qgkw)V z!ZQeAj212mu)?UtmezIN&fX!?IyorBn*q zPcJz9qFFkkDXM81mDPYqv1MbG$&a$yO}>x_sRUmF6M*QVqXwI&spGz9$D^WYu6jk>9+?Yw`WDmbSS3 zwM%wX>z{4BJ~G#SUA+{V>YVJH-v8E1+0u^N4FL1ha-16~G&@ro*OEA6!3XzbY%3Q8 zXG&TzVK*XRA$9N~eg-hKC}1aSh)IA!3xiDzwgZ@aN+O0%I+(#rBm5@56P6wHB7cnw z%~x4}DB-;HFPL>w!6<7Pyubi{P>56mm=^tPnyh2n8V2wiMFazY>}nn!X02z?z@U)< zyBaGA3eQb2%+A@}BCQC73H#fSHU>ckTL9=Uj&{Bq7W?KKoI5y3dB|nqxG;T1IM3ap z4~0HXqOIas6U)T3Nb1=CG^3!ki+(Nc=6iuUL_O|ztRYy%(dBFe$JZ@6gZO3m>CE zjKDVI1P;D{`!!V#l#mG3JOka&lV*BP^x29{lxgoyYKioyyo*F(3*&|KHu|@xYC{9J cW2v8WasH+CUaop+i<7hd?knYvaD>(P57NieN&o-= delta 766 zcmZ`%&ubGw7@f)PCQH+#vH4NcnsypfCDan7*3z^Ti~XfY4=q)s)G#D#Nlka-%%sp% zMLbA*5*@tw2ME$jwFr6@Ja~&Y84v{NU1$$d5d0>3tPAsa-^`ouee>Au+}m{cAQWmr z@J$t-tPTd>gkRzQo!pu$awRHgj;=VaC=@+cP+kD;uyV1$9A5QY?iALC4dYtAXWRF5x{X)0=r5@^V46+ufhPgnqMy#|f^6*y~g z6Dld}bl*uJZLqi|kI>gpcx!WOtHT3C>RGjgYBR6zGnnj+>XXL{`XP?3E*0R1ih3bK;!f|-wja{}TKsqAt#Gd<;z>4TuBPQG9UpjU2 zOvk~rC(|-*f>=`ij;F0FK&NFUF@lrwc7n__GY;u<9rRJSR4$4oF4#FT;chJd4Sq@= zH`8wlC!wsjfQH;BbDryDeQZ*GO3dFn&RYBZ^VdxO9LgSB^GdafGtRC-iDB^pfS-^G d{)W=~D6x-b5B( str: def render_telecom_invoice(*, tool_name: str, result: dict[str, Any], state: dict[str, Any], agent_label: str) -> str | None: - return f"[{agent_label}] Fatura consultada: {result}." + """Renderiza somente campos de negócio seguros da fatura. + + Identificadores técnicos/PII presentes no payload MCP (por exemplo msisdn, + customer_id, document e business keys) não devem ser propagados ao usuário. + """ + lines = [f"[{agent_label}] Dados da sua fatura:"] + total = result.get("valor_total") + vencimento = result.get("vencimento") + status = result.get("status") + if total is not None: + lines.append(f"Valor total: R$ {_money_brl(total)}.") + if vencimento not in (None, ""): + lines.append(f"Vencimento: {vencimento}.") + if status not in (None, ""): + lines.append(f"Situação: {status}.") + + items = result.get("itens") or [] + rendered_items: list[str] = [] + if isinstance(items, list): + for item in items: + if not isinstance(item, dict): + continue + description = item.get("descricao") or item.get("nome") + value = item.get("valor") + if description in (None, ""): + continue + if value is None: + rendered_items.append(str(description)) + else: + rendered_items.append(f"{description}: R$ {_money_brl(value)}") + if rendered_items: + lines.append("Itens: " + "; ".join(rendered_items) + ".") + + # Se não houver nenhum campo de negócio seguro além do cabeçalho, deixe a + # composição pela LLM/guardrails em vez de despejar o payload bruto. + return " ".join(lines) if len(lines) > 1 else None def render_telecom_plan(*, tool_name: str, result: dict[str, Any], state: dict[str, Any], agent_label: str) -> str | None: diff --git a/Tuning-Performance/Long_Term_Memory/templates/agent_template_backend/app/workflows/__pycache__/agent_graph.cpython-313.pyc b/Tuning-Performance/Long_Term_Memory/templates/agent_template_backend/app/workflows/__pycache__/agent_graph.cpython-313.pyc index 17e9714aafd4f09ab474f9c15738539760267ec6..8adf49f375f6a548c633aee93dee68ec47c2cfc1 100644 GIT binary patch delta 7605 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 bgqkV8VHT5rK&vu?+C3W5a+knR`0V|EssAOg delta 2181 zcmZWqZBSEJ8ouX#oP2PTK<-UKLIT7f7{mx@5NM$Vt2Wh=)VrCTnzEWoa8U$%6X?3L zyK39%$1Ei+FLYR|Rjf+gP92b!Bh)3%kRy7S9SzMmzZ zAN~M;dpXTlGhqaW+hzD}P!A2sJUF*g!>>W}PE)cHZV%dEOHxOI6|gty&Dl48qk|Jk zzox*4*PtE_9{Xx3XP&Q_7^6ZoSD(i!QUiyW08(W5Pi;NC{ffaP|C(c%el)_h2_n!vYi>Y5yZ#~rPe^Zx5YL@Rx#CF1#W*KhnUyQ#e zYViqhy&iGiWVMq1OOu@3{nGAH`&Ey_j;&`S7MOXHygnOT4-}K>&=yB5L^`*^ykb=t zKN)1Y6q`?@6vE7y4b*^zNQ&H}a|~>`RtVQ>WjJ`m1$&RWA$U}V0pj~{lK`weW`VJz z5}fl}I6-kh%ezjvxv7#>ihh2cvPj9@-N=4U2NUKb#y{_%Z;q~r8ww^R!R5nBaqcv! z2ee-#p#NrgkLnHphtUAYNf^}%_vx|{p10O@JrSbihdOI zYA@Bb(D0<&9;`A?Hj0E_#wb{WFKb#g#F#Ro;0iota!|hAYY+PM(<~;&v{ocXn3hqn z5l>q%$ znbpSnyEbv4yJtRnq;ne9?N0!?W+pQMUp>HOT)ofN{@xJbax*81cEk^^XruY6Wke?3!nOZ)} z_U?f0GY#wqY-;?>1jbFYtR31fRADdMMt*i+;KKWOJN52>N7F4hM(HLPPXDstA*#-I zL=#c9oqC(#PI@gn$)+B<*do}viOVaf6ZASCQaDSY2M$aIccAX0kh{y%&~&+(z0Ib6fB6{=dVJ`!Z;_mu`z(@&UVzmzJMjQ5 zeHl*AJctJ=9e_JCe$)%Kv#sbE=$oxTaX2`;Z1M9n_$r0FvV_Gk*`+kM)Wvke5%_M_ zfmWyV-(2O93%>rg12)Z-p%K_KSB{3^_*^G@t1{*PhlNL{VEv6w(+&|?Z!r|rB}CxA Duo7#c diff --git a/Tuning-Performance/Long_Term_Memory/templates/agent_template_backend/app/workflows/agent_graph.py b/Tuning-Performance/Long_Term_Memory/templates/agent_template_backend/app/workflows/agent_graph.py index b8ed7bc..303bf51 100644 --- a/Tuning-Performance/Long_Term_Memory/templates/agent_template_backend/app/workflows/agent_graph.py +++ b/Tuning-Performance/Long_Term_Memory/templates/agent_template_backend/app/workflows/agent_graph.py @@ -494,6 +494,119 @@ class AgentWorkflow: "next_state": "SESSION_ENDED", } + @staticmethod + def _output_guardrail_context(state: dict) -> dict: + """Monta o contexto operacional do turno para os guardrails de saída. + + Mantém evidências/protocolos necessários aos rails, mas impede que uma + transação encerrada ou semanticamente interrompida governe o novo turno. + O histórico completo permanece no state/checkpoint para auditoria. + """ + ctx = dict(state.get("context", {}) or {}) + mcp_results = state.get("mcp_results") or [] + ctx["evidence"] = mcp_results or ctx.get("evidence") + ctx["tool_result"] = mcp_results or ctx.get("tool_result") + ctx["tool_executed"] = any(isinstance(r, dict) and r.get("ok") for r in mcp_results) + + history = list(state.get("history") or []) + current_user_text = str(state.get("user_text") or "").strip() + if current_user_text: + if ( + not history + or not isinstance(history[-1], dict) + or str(history[-1].get("content") or "") != current_user_text + or str(history[-1].get("role") or "") != "user" + ): + history.append({"role": "user", "content": current_user_text}) + + route_decision = state.get("route_decision") or {} + route_metadata = route_decision.get("metadata") if isinstance(route_decision, dict) else {} + route_metadata = route_metadata if isinstance(route_metadata, dict) else {} + pre_validation = state.get("transaction_pre_validation") or {} + pre_validation = pre_validation if isinstance(pre_validation, dict) else {} + tx_status = str( + state.get("transaction_status") or pre_validation.get("status") or "" + ).strip().upper() + terminal_tx = bool(pre_validation.get("terminal")) or tx_status in { + "COMPLETED", "FAILED", "CANCELLED", "BLOCKED", "OUT_OF_SCOPE" + } + semantic_intent_shift = ( + str(route_metadata.get("transaction_interruption") or "").strip().lower() + == "intent_shift" + ) + stickiness_intent_shift = bool(route_metadata.get("route_stickiness_preempted")) + should_isolate_history = semantic_intent_shift or (terminal_tx and stickiness_intent_shift) + + current_route = str( + state.get("route") + or (route_decision.get("route") if isinstance(route_decision, dict) else "") + or "" + ).strip() + current_intent = str( + state.get("intent") + or (route_decision.get("intent") if isinstance(route_decision, dict) else "") + or "" + ).strip() + ctx["current_user_message"] = current_user_text + ctx["current_route"] = current_route + ctx["current_intent"] = current_intent + + if should_isolate_history: + operational_history = ( + [{"role": "user", "content": current_user_text}] + if current_user_text else [] + ) + ctx["historical_transaction_ignored"] = True + ctx["historical_transaction_status"] = tx_status or ( + "INTERRUPTED" if semantic_intent_shift else "TERMINAL" + ) + if semantic_intent_shift: + ctx["historical_transaction_interruption"] = "intent_shift" + for stale_key in ( + "transaction_pre_validation", + "transaction_status", + "active_transaction", + "transaction", + ): + ctx.pop(stale_key, None) + else: + operational_history = history + + ctx["conversation_history"] = operational_history + ctx["history_texts"] = [ + str(item.get("content") or "") + for item in operational_history + if isinstance(item, dict) and item.get("content") not in (None, "") + ] + + protocols: list[str] = [] + seen: set[str] = set() + protocol_keys = { + "protocol_number", "protocolo_id", "interactionProtocol", + "protocolNumber", "finalizacao_protocol", + } + + def walk(value): + if isinstance(value, dict): + for key, item in value.items(): + if key in protocol_keys and item not in (None, ""): + text = str(item).strip() + if text and text not in seen: + seen.add(text) + protocols.append(text) + elif isinstance(item, (dict, list, tuple)): + walk(item) + elif isinstance(value, (list, tuple)): + for item in value: + walk(item) + + walk(mcp_results) + if protocols: + ctx["expected_protocols"] = protocols + ctx["requer_protocolo"] = True + ctx.setdefault("tipo_fluxo", "ajuste") + return ctx + async def output_supervisor(self, state): """Valida a resposta candidata com o OutputSupervisor corporativo. @@ -509,15 +622,15 @@ class AgentWorkflow: } candidate = state.get("answer") or "" - context = { - **(state.get("context") or {}), + context = self._output_guardrail_context(state) + context.update({ "tenant_id": state.get("tenant_id"), "agent_id": state.get("agent_id"), "session_id": state.get("conversation_key") or state.get("session_id"), "route": state.get("route"), "intent": state.get("intent"), "supervisor_attempt": int(state.get("supervisor_attempt", 0)), - } + }) async with self.telemetry.span( "workflow.output_supervisor", session_id=state.get("conversation_key") or state.get("session_id"), @@ -603,7 +716,7 @@ class AgentWorkflow: component="workflow.output_guardrails.start", ) final, decisions = await self.guardrails.run_output( - state["answer"], state.get("context", {}) + state["answer"], self._output_guardrail_context(state) ) for _decision in decisions: await self.guardrail_telemetry.evaluated("output", _decision) diff --git a/Tuning-Performance/Normal/templates/agent_template_backend/app/__pycache__/__init__.cpython-313.pyc b/Tuning-Performance/Normal/templates/agent_template_backend/app/__pycache__/__init__.cpython-313.pyc new file mode 100644 index 0000000000000000000000000000000000000000..33197e54f3f949feeccfbdc5e3e42a748af56778 GIT binary patch literal 210 zcmXwzO$x$53`RRvL4<{*bq_TpH*PPD48P literal 0 HcmV?d00001 diff --git a/Tuning-Performance/Normal/templates/agent_template_backend/app/__pycache__/main.cpython-313.pyc b/Tuning-Performance/Normal/templates/agent_template_backend/app/__pycache__/main.cpython-313.pyc new file mode 100644 index 0000000000000000000000000000000000000000..b834e5a5823dd39dfbd890adab5eb16f49f9fe93 GIT binary patch literal 31107 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 Tef{Iye7DB%7ezU4qv8JmDW$ko literal 0 HcmV?d00001 diff --git a/Tuning-Performance/Normal/templates/agent_template_backend/app/__pycache__/mcp_gateway_client_factory.cpython-313.pyc b/Tuning-Performance/Normal/templates/agent_template_backend/app/__pycache__/mcp_gateway_client_factory.cpython-313.pyc new file mode 100644 index 0000000000000000000000000000000000000000..3f0f59de50710d238d7248cc9978f165b328e48e GIT binary patch literal 1058 zcmah|&ubGw6rTN^^j8{UHElhVBE?|M7Btls71A`8Hf>tEDIz@#+s!21cC#C1XALPH zL=S=o1)&Hcc-5OnkNydf94bRRRY7l+;N96KE3F>-V0XXw=9@R)d;6x{-`@k6xr5Jl zesBOB`c7bc2XO5q1N%S&8kYl09OlM+%;$K_v#*d7mP9PFn52m#U`NDKnNP?+{mluE z_Ug9n5S^Hg?dF+3xRP00&*Xo#iZpO(o!+nO)GtAp4nIDaEq;cALB00iei~`K{UvcLQhF zBWp@SZ$Lm^>J` z{y}WTN8il7U3|URn8-M z$3_X6_CQ$j7zsg$*$n|W!d^7~Py3SHy4~aEA6JB9KHEPC5BXa{w<=E2v(Ozp!d!o7 YU7v9za2)p)j30vVcaZumhq#WqKhL@RT>t<8 literal 0 HcmV?d00001 diff --git a/Tuning-Performance/Normal/templates/agent_template_backend/app/__pycache__/state.cpython-313.pyc b/Tuning-Performance/Normal/templates/agent_template_backend/app/__pycache__/state.cpython-313.pyc new file mode 100644 index 0000000000000000000000000000000000000000..66a88310934d7d48081c33fe39ec27dbcb4848c1 GIT binary patch literal 2606 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