diff --git a/agent_framework_oci/libs/agent_framework/build/lib/agent_framework/guardrails/rails.py b/agent_framework_oci/libs/agent_framework/build/lib/agent_framework/guardrails/rails.py index 4863078d..f8c70c44 100644 --- a/agent_framework_oci/libs/agent_framework/build/lib/agent_framework/guardrails/rails.py +++ b/agent_framework_oci/libs/agent_framework/build/lib/agent_framework/guardrails/rails.py @@ -448,25 +448,69 @@ class ComplianceRail(Guardrail): requer = ctx.get("tipo_fluxo") == "ajuste" or ctx.get("requer_protocolo") is True if not requer: return RailDecision(code=self.code, allowed=True, sanitized_text=None, reason="Compliance Anatel não aplicável", metadata={"calibrated": True}) - expected = list(ctx.get("expected_protocols") or []) - if self._PROTOCOL_PATTERN.search(text or ""): - return RailDecision(code=self.code, allowed=True, reason="Resposta contém protocolo obrigatório", metadata={"calibrated": True}) - patched, missing = self._apply_protocol_fallback(text or "", expected) - if patched != (text or ""): + + original = text or "" + expected = [str(value).strip() for value in (ctx.get("expected_protocols") or []) if str(value).strip()] + + # Quando o workflow informa os protocolos esperados, esses valores são a + # fonte de verdade. Valide-os diretamente no texto (cru ou vocalizado) + # antes de recorrer ao regex genérico. Isso evita tanto falso negativo + # por distância/Markdown quanto falso positivo por um protocolo diferente. + if expected: + patched, missing = self._apply_protocol_fallback(original, expected) + if not missing: + return RailDecision( + code=self.code, + allowed=True, + reason="Resposta contém o(s) protocolo(s) esperado(s)", + sanitized_text=None, + metadata={ + "expected_protocols": expected, + "protocol_validation": "expected_values", + "mechanism": "deterministic", + "calibrated": True, + }, + ) + return RailDecision( code=self.code, allowed=True, reason="Resposta sem protocolo obrigatório; protocolo anexado deterministicamente", sanitized_text=patched, - metadata={"missing_protocols_spoken": missing, "expected_protocols": expected, "mechanism": "deterministic", "calibrated": True}, + metadata={ + "missing_protocols_spoken": missing, + "expected_protocols": expected, + "protocol_validation": "expected_values", + "mechanism": "deterministic", + "calibrated": True, + }, ) + + # Compatibilidade para fluxos legados que exigem protocolo, mas não + # fornecem expected_protocols: nesse caso ainda usamos o reconhecimento + # genérico por regex. + if self._PROTOCOL_PATTERN.search(original): + return RailDecision( + code=self.code, + allowed=True, + reason="Resposta contém protocolo obrigatório", + metadata={ + "protocol_validation": "generic_regex", + "mechanism": "deterministic", + "calibrated": True, + }, + ) + return RailDecision( code=self.code, allowed=False, reason="Resposta de ajuste sem número de protocolo", sanitized_text=text, metadata={ - "expected_protocols": expected, "mechanism": "deterministic", "calibrated": True, + "expected_protocols": expected, + "protocol_validation": "generic_regex", + "mechanism": "deterministic", + "calibrated": True, "terminal_action": "retry", }, ) diff --git a/agent_framework_oci/libs/agent_framework/src/agent_framework.egg-info/SOURCES.txt b/agent_framework_oci/libs/agent_framework/src/agent_framework.egg-info/SOURCES.txt index 9499debe..ddcd57f4 100644 --- a/agent_framework_oci/libs/agent_framework/src/agent_framework.egg-info/SOURCES.txt +++ b/agent_framework_oci/libs/agent_framework/src/agent_framework.egg-info/SOURCES.txt @@ -135,6 +135,7 @@ src/agent_framework/llm/__init__.py src/agent_framework/llm/base.py src/agent_framework/llm/profile_resolver.py src/agent_framework/llm/providers.py +src/agent_framework/llm/structured_output.py src/agent_framework/llm/types.py src/agent_framework/mcp/__init__.py src/agent_framework/mcp/client.py diff --git a/agent_framework_oci/libs/agent_framework/src/agent_framework/__pycache__/__init__.cpython-313.pyc b/agent_framework_oci/libs/agent_framework/src/agent_framework/__pycache__/__init__.cpython-313.pyc index 4950c714..de09ac23 100644 Binary files a/agent_framework_oci/libs/agent_framework/src/agent_framework/__pycache__/__init__.cpython-313.pyc and b/agent_framework_oci/libs/agent_framework/src/agent_framework/__pycache__/__init__.cpython-313.pyc differ diff --git a/agent_framework_oci/libs/agent_framework/src/agent_framework/__pycache__/extensions.cpython-313.pyc b/agent_framework_oci/libs/agent_framework/src/agent_framework/__pycache__/extensions.cpython-313.pyc index 4929616d..a7262048 100644 Binary files a/agent_framework_oci/libs/agent_framework/src/agent_framework/__pycache__/extensions.cpython-313.pyc and b/agent_framework_oci/libs/agent_framework/src/agent_framework/__pycache__/extensions.cpython-313.pyc differ diff --git a/agent_framework_oci/libs/agent_framework/src/agent_framework/__pycache__/idempotency.cpython-313.pyc b/agent_framework_oci/libs/agent_framework/src/agent_framework/__pycache__/idempotency.cpython-313.pyc index ba449075..d548db52 100644 Binary files a/agent_framework_oci/libs/agent_framework/src/agent_framework/__pycache__/idempotency.cpython-313.pyc and b/agent_framework_oci/libs/agent_framework/src/agent_framework/__pycache__/idempotency.cpython-313.pyc differ diff --git a/agent_framework_oci/libs/agent_framework/src/agent_framework/__pycache__/observer.cpython-313.pyc b/agent_framework_oci/libs/agent_framework/src/agent_framework/__pycache__/observer.cpython-313.pyc index 2550c757..69bd22ba 100644 Binary files a/agent_framework_oci/libs/agent_framework/src/agent_framework/__pycache__/observer.cpython-313.pyc and b/agent_framework_oci/libs/agent_framework/src/agent_framework/__pycache__/observer.cpython-313.pyc differ diff --git a/agent_framework_oci/libs/agent_framework/src/agent_framework/analytics/__pycache__/__init__.cpython-313.pyc b/agent_framework_oci/libs/agent_framework/src/agent_framework/analytics/__pycache__/__init__.cpython-313.pyc index 1d34064e..48f7d5ae 100644 Binary files a/agent_framework_oci/libs/agent_framework/src/agent_framework/analytics/__pycache__/__init__.cpython-313.pyc and b/agent_framework_oci/libs/agent_framework/src/agent_framework/analytics/__pycache__/__init__.cpython-313.pyc differ diff --git a/agent_framework_oci/libs/agent_framework/src/agent_framework/analytics/__pycache__/composite_publisher.cpython-313.pyc b/agent_framework_oci/libs/agent_framework/src/agent_framework/analytics/__pycache__/composite_publisher.cpython-313.pyc index ce6ebcb6..4bcd451b 100644 Binary files a/agent_framework_oci/libs/agent_framework/src/agent_framework/analytics/__pycache__/composite_publisher.cpython-313.pyc and b/agent_framework_oci/libs/agent_framework/src/agent_framework/analytics/__pycache__/composite_publisher.cpython-313.pyc differ diff --git a/agent_framework_oci/libs/agent_framework/src/agent_framework/analytics/__pycache__/event_builder.cpython-313.pyc b/agent_framework_oci/libs/agent_framework/src/agent_framework/analytics/__pycache__/event_builder.cpython-313.pyc index 64a4f8a8..c4901cdd 100644 Binary files a/agent_framework_oci/libs/agent_framework/src/agent_framework/analytics/__pycache__/event_builder.cpython-313.pyc and b/agent_framework_oci/libs/agent_framework/src/agent_framework/analytics/__pycache__/event_builder.cpython-313.pyc differ diff --git a/agent_framework_oci/libs/agent_framework/src/agent_framework/analytics/__pycache__/factory.cpython-313.pyc b/agent_framework_oci/libs/agent_framework/src/agent_framework/analytics/__pycache__/factory.cpython-313.pyc index e39f0995..8c60d8f7 100644 Binary files a/agent_framework_oci/libs/agent_framework/src/agent_framework/analytics/__pycache__/factory.cpython-313.pyc and b/agent_framework_oci/libs/agent_framework/src/agent_framework/analytics/__pycache__/factory.cpython-313.pyc differ diff --git a/agent_framework_oci/libs/agent_framework/src/agent_framework/analytics/__pycache__/publisher.cpython-313.pyc b/agent_framework_oci/libs/agent_framework/src/agent_framework/analytics/__pycache__/publisher.cpython-313.pyc index beafe488..5fd44afd 100644 Binary files a/agent_framework_oci/libs/agent_framework/src/agent_framework/analytics/__pycache__/publisher.cpython-313.pyc and b/agent_framework_oci/libs/agent_framework/src/agent_framework/analytics/__pycache__/publisher.cpython-313.pyc differ diff --git a/agent_framework_oci/libs/agent_framework/src/agent_framework/analytics/__pycache__/tim_payload_mapper.cpython-313.pyc b/agent_framework_oci/libs/agent_framework/src/agent_framework/analytics/__pycache__/tim_payload_mapper.cpython-313.pyc index c9fa989b..384343e1 100644 Binary files a/agent_framework_oci/libs/agent_framework/src/agent_framework/analytics/__pycache__/tim_payload_mapper.cpython-313.pyc and b/agent_framework_oci/libs/agent_framework/src/agent_framework/analytics/__pycache__/tim_payload_mapper.cpython-313.pyc differ diff --git a/agent_framework_oci/libs/agent_framework/src/agent_framework/analytics/__pycache__/tim_sequence.cpython-313.pyc b/agent_framework_oci/libs/agent_framework/src/agent_framework/analytics/__pycache__/tim_sequence.cpython-313.pyc index 617999a0..ce3475cb 100644 Binary files a/agent_framework_oci/libs/agent_framework/src/agent_framework/analytics/__pycache__/tim_sequence.cpython-313.pyc and b/agent_framework_oci/libs/agent_framework/src/agent_framework/analytics/__pycache__/tim_sequence.cpython-313.pyc differ diff --git a/agent_framework_oci/libs/agent_framework/src/agent_framework/analytics/providers/__pycache__/__init__.cpython-313.pyc b/agent_framework_oci/libs/agent_framework/src/agent_framework/analytics/providers/__pycache__/__init__.cpython-313.pyc index 059f0dca..20cb3fa3 100644 Binary files a/agent_framework_oci/libs/agent_framework/src/agent_framework/analytics/providers/__pycache__/__init__.cpython-313.pyc and b/agent_framework_oci/libs/agent_framework/src/agent_framework/analytics/providers/__pycache__/__init__.cpython-313.pyc differ diff --git a/agent_framework_oci/libs/agent_framework/src/agent_framework/analytics/providers/__pycache__/kafka.cpython-313.pyc b/agent_framework_oci/libs/agent_framework/src/agent_framework/analytics/providers/__pycache__/kafka.cpython-313.pyc index deabfe01..89213503 100644 Binary files a/agent_framework_oci/libs/agent_framework/src/agent_framework/analytics/providers/__pycache__/kafka.cpython-313.pyc and b/agent_framework_oci/libs/agent_framework/src/agent_framework/analytics/providers/__pycache__/kafka.cpython-313.pyc differ diff --git a/agent_framework_oci/libs/agent_framework/src/agent_framework/analytics/providers/__pycache__/langfuse.cpython-313.pyc b/agent_framework_oci/libs/agent_framework/src/agent_framework/analytics/providers/__pycache__/langfuse.cpython-313.pyc index 567b0d6e..1458ff0b 100644 Binary files a/agent_framework_oci/libs/agent_framework/src/agent_framework/analytics/providers/__pycache__/langfuse.cpython-313.pyc and b/agent_framework_oci/libs/agent_framework/src/agent_framework/analytics/providers/__pycache__/langfuse.cpython-313.pyc differ diff --git a/agent_framework_oci/libs/agent_framework/src/agent_framework/analytics/providers/__pycache__/oci_streaming.cpython-313.pyc b/agent_framework_oci/libs/agent_framework/src/agent_framework/analytics/providers/__pycache__/oci_streaming.cpython-313.pyc index 08357c60..5c315167 100644 Binary files a/agent_framework_oci/libs/agent_framework/src/agent_framework/analytics/providers/__pycache__/oci_streaming.cpython-313.pyc and b/agent_framework_oci/libs/agent_framework/src/agent_framework/analytics/providers/__pycache__/oci_streaming.cpython-313.pyc differ diff --git a/agent_framework_oci/libs/agent_framework/src/agent_framework/analytics/providers/__pycache__/pubsub.cpython-313.pyc b/agent_framework_oci/libs/agent_framework/src/agent_framework/analytics/providers/__pycache__/pubsub.cpython-313.pyc index 7d68a98c..5285deb7 100644 Binary files a/agent_framework_oci/libs/agent_framework/src/agent_framework/analytics/providers/__pycache__/pubsub.cpython-313.pyc and b/agent_framework_oci/libs/agent_framework/src/agent_framework/analytics/providers/__pycache__/pubsub.cpython-313.pyc differ diff --git a/agent_framework_oci/libs/agent_framework/src/agent_framework/billing/__pycache__/__init__.cpython-313.pyc b/agent_framework_oci/libs/agent_framework/src/agent_framework/billing/__pycache__/__init__.cpython-313.pyc index 44d75e94..13881e79 100644 Binary files a/agent_framework_oci/libs/agent_framework/src/agent_framework/billing/__pycache__/__init__.cpython-313.pyc and b/agent_framework_oci/libs/agent_framework/src/agent_framework/billing/__pycache__/__init__.cpython-313.pyc differ diff --git a/agent_framework_oci/libs/agent_framework/src/agent_framework/billing/__pycache__/usage_repository.cpython-313.pyc b/agent_framework_oci/libs/agent_framework/src/agent_framework/billing/__pycache__/usage_repository.cpython-313.pyc index 35176248..66072c94 100644 Binary files a/agent_framework_oci/libs/agent_framework/src/agent_framework/billing/__pycache__/usage_repository.cpython-313.pyc and b/agent_framework_oci/libs/agent_framework/src/agent_framework/billing/__pycache__/usage_repository.cpython-313.pyc differ diff --git a/agent_framework_oci/libs/agent_framework/src/agent_framework/cache/__pycache__/__init__.cpython-313.pyc b/agent_framework_oci/libs/agent_framework/src/agent_framework/cache/__pycache__/__init__.cpython-313.pyc index f520e90a..b4b3fde8 100644 Binary files a/agent_framework_oci/libs/agent_framework/src/agent_framework/cache/__pycache__/__init__.cpython-313.pyc and b/agent_framework_oci/libs/agent_framework/src/agent_framework/cache/__pycache__/__init__.cpython-313.pyc differ diff --git a/agent_framework_oci/libs/agent_framework/src/agent_framework/cache/__pycache__/cache.cpython-313.pyc b/agent_framework_oci/libs/agent_framework/src/agent_framework/cache/__pycache__/cache.cpython-313.pyc index 9a174689..a3076638 100644 Binary files a/agent_framework_oci/libs/agent_framework/src/agent_framework/cache/__pycache__/cache.cpython-313.pyc and b/agent_framework_oci/libs/agent_framework/src/agent_framework/cache/__pycache__/cache.cpython-313.pyc differ diff --git a/agent_framework_oci/libs/agent_framework/src/agent_framework/channels/__pycache__/__init__.cpython-313.pyc b/agent_framework_oci/libs/agent_framework/src/agent_framework/channels/__pycache__/__init__.cpython-313.pyc index 4378e5f4..fd5ec415 100644 Binary files a/agent_framework_oci/libs/agent_framework/src/agent_framework/channels/__pycache__/__init__.cpython-313.pyc and b/agent_framework_oci/libs/agent_framework/src/agent_framework/channels/__pycache__/__init__.cpython-313.pyc differ diff --git a/agent_framework_oci/libs/agent_framework/src/agent_framework/channels/__pycache__/adapters.cpython-313.pyc b/agent_framework_oci/libs/agent_framework/src/agent_framework/channels/__pycache__/adapters.cpython-313.pyc index 93d40708..a84f951a 100644 Binary files a/agent_framework_oci/libs/agent_framework/src/agent_framework/channels/__pycache__/adapters.cpython-313.pyc and b/agent_framework_oci/libs/agent_framework/src/agent_framework/channels/__pycache__/adapters.cpython-313.pyc differ diff --git a/agent_framework_oci/libs/agent_framework/src/agent_framework/channels/__pycache__/base.cpython-313.pyc b/agent_framework_oci/libs/agent_framework/src/agent_framework/channels/__pycache__/base.cpython-313.pyc index 953d8ab4..5ad662bc 100644 Binary files a/agent_framework_oci/libs/agent_framework/src/agent_framework/channels/__pycache__/base.cpython-313.pyc and b/agent_framework_oci/libs/agent_framework/src/agent_framework/channels/__pycache__/base.cpython-313.pyc differ diff --git a/agent_framework_oci/libs/agent_framework/src/agent_framework/channels/__pycache__/gateway.cpython-313.pyc b/agent_framework_oci/libs/agent_framework/src/agent_framework/channels/__pycache__/gateway.cpython-313.pyc index 820a3cd7..a898bfe7 100644 Binary files a/agent_framework_oci/libs/agent_framework/src/agent_framework/channels/__pycache__/gateway.cpython-313.pyc and b/agent_framework_oci/libs/agent_framework/src/agent_framework/channels/__pycache__/gateway.cpython-313.pyc differ diff --git a/agent_framework_oci/libs/agent_framework/src/agent_framework/channels/__pycache__/interruption.cpython-313.pyc b/agent_framework_oci/libs/agent_framework/src/agent_framework/channels/__pycache__/interruption.cpython-313.pyc index bc9e8de7..333f20d8 100644 Binary files a/agent_framework_oci/libs/agent_framework/src/agent_framework/channels/__pycache__/interruption.cpython-313.pyc and b/agent_framework_oci/libs/agent_framework/src/agent_framework/channels/__pycache__/interruption.cpython-313.pyc differ diff --git a/agent_framework_oci/libs/agent_framework/src/agent_framework/channels/__pycache__/transcription.cpython-313.pyc b/agent_framework_oci/libs/agent_framework/src/agent_framework/channels/__pycache__/transcription.cpython-313.pyc index ec908103..47f24637 100644 Binary files a/agent_framework_oci/libs/agent_framework/src/agent_framework/channels/__pycache__/transcription.cpython-313.pyc and b/agent_framework_oci/libs/agent_framework/src/agent_framework/channels/__pycache__/transcription.cpython-313.pyc differ diff --git a/agent_framework_oci/libs/agent_framework/src/agent_framework/checkpoints/__pycache__/__init__.cpython-313.pyc b/agent_framework_oci/libs/agent_framework/src/agent_framework/checkpoints/__pycache__/__init__.cpython-313.pyc index e6c3d6a9..f2302562 100644 Binary files a/agent_framework_oci/libs/agent_framework/src/agent_framework/checkpoints/__pycache__/__init__.cpython-313.pyc and b/agent_framework_oci/libs/agent_framework/src/agent_framework/checkpoints/__pycache__/__init__.cpython-313.pyc differ diff --git a/agent_framework_oci/libs/agent_framework/src/agent_framework/checkpoints/__pycache__/checkpoint_repository.cpython-313.pyc b/agent_framework_oci/libs/agent_framework/src/agent_framework/checkpoints/__pycache__/checkpoint_repository.cpython-313.pyc index d642f111..69e908a3 100644 Binary files a/agent_framework_oci/libs/agent_framework/src/agent_framework/checkpoints/__pycache__/checkpoint_repository.cpython-313.pyc and b/agent_framework_oci/libs/agent_framework/src/agent_framework/checkpoints/__pycache__/checkpoint_repository.cpython-313.pyc differ diff --git a/agent_framework_oci/libs/agent_framework/src/agent_framework/checkpoints/__pycache__/langgraph_saver.cpython-313.pyc b/agent_framework_oci/libs/agent_framework/src/agent_framework/checkpoints/__pycache__/langgraph_saver.cpython-313.pyc index cef92f3b..5210e7ca 100644 Binary files a/agent_framework_oci/libs/agent_framework/src/agent_framework/checkpoints/__pycache__/langgraph_saver.cpython-313.pyc and b/agent_framework_oci/libs/agent_framework/src/agent_framework/checkpoints/__pycache__/langgraph_saver.cpython-313.pyc differ diff --git a/agent_framework_oci/libs/agent_framework/src/agent_framework/config/__pycache__/__init__.cpython-313.pyc b/agent_framework_oci/libs/agent_framework/src/agent_framework/config/__pycache__/__init__.cpython-313.pyc index 620bbeda..4dc9805c 100644 Binary files a/agent_framework_oci/libs/agent_framework/src/agent_framework/config/__pycache__/__init__.cpython-313.pyc and b/agent_framework_oci/libs/agent_framework/src/agent_framework/config/__pycache__/__init__.cpython-313.pyc differ diff --git a/agent_framework_oci/libs/agent_framework/src/agent_framework/config/__pycache__/agent_registry.cpython-313.pyc b/agent_framework_oci/libs/agent_framework/src/agent_framework/config/__pycache__/agent_registry.cpython-313.pyc index 3ba77e24..3cae7c9c 100644 Binary files a/agent_framework_oci/libs/agent_framework/src/agent_framework/config/__pycache__/agent_registry.cpython-313.pyc and b/agent_framework_oci/libs/agent_framework/src/agent_framework/config/__pycache__/agent_registry.cpython-313.pyc differ diff --git a/agent_framework_oci/libs/agent_framework/src/agent_framework/config/__pycache__/settings.cpython-313.pyc b/agent_framework_oci/libs/agent_framework/src/agent_framework/config/__pycache__/settings.cpython-313.pyc index 24c2611a..2b66521f 100644 Binary files a/agent_framework_oci/libs/agent_framework/src/agent_framework/config/__pycache__/settings.cpython-313.pyc and b/agent_framework_oci/libs/agent_framework/src/agent_framework/config/__pycache__/settings.cpython-313.pyc differ diff --git a/agent_framework_oci/libs/agent_framework/src/agent_framework/gateways/__pycache__/__init__.cpython-313.pyc b/agent_framework_oci/libs/agent_framework/src/agent_framework/gateways/__pycache__/__init__.cpython-313.pyc index aa1c7ad7..656d136a 100644 Binary files a/agent_framework_oci/libs/agent_framework/src/agent_framework/gateways/__pycache__/__init__.cpython-313.pyc and b/agent_framework_oci/libs/agent_framework/src/agent_framework/gateways/__pycache__/__init__.cpython-313.pyc differ diff --git a/agent_framework_oci/libs/agent_framework/src/agent_framework/gateways/__pycache__/mcp_gateway_client.cpython-313.pyc b/agent_framework_oci/libs/agent_framework/src/agent_framework/gateways/__pycache__/mcp_gateway_client.cpython-313.pyc index c05807ed..7909a8a0 100644 Binary files a/agent_framework_oci/libs/agent_framework/src/agent_framework/gateways/__pycache__/mcp_gateway_client.cpython-313.pyc and b/agent_framework_oci/libs/agent_framework/src/agent_framework/gateways/__pycache__/mcp_gateway_client.cpython-313.pyc differ diff --git a/agent_framework_oci/libs/agent_framework/src/agent_framework/global_supervisor/router.py b/agent_framework_oci/libs/agent_framework/src/agent_framework/global_supervisor/router.py index c731bc5a..dcf2392a 100644 --- a/agent_framework_oci/libs/agent_framework/src/agent_framework/global_supervisor/router.py +++ b/agent_framework_oci/libs/agent_framework/src/agent_framework/global_supervisor/router.py @@ -1,5 +1,7 @@ from __future__ import annotations +from agent_framework.llm.structured_output import parse_json_object + import json import logging import re @@ -246,13 +248,4 @@ class GlobalSupervisorRouter: return text.strip() def _parse_json(self, raw: Any) -> dict[str, Any]: - if isinstance(raw, dict): - return raw - text = str(raw).strip() - if text.startswith("```"): - text = re.sub(r"^```(?:json)?", "", text).strip() - text = re.sub(r"```$", "", text).strip() - match = re.search(r"\{.*\}", text, flags=re.S) - if match: - text = match.group(0) - return json.loads(text) + return parse_json_object(raw) diff --git a/agent_framework_oci/libs/agent_framework/src/agent_framework/guardrails/__pycache__/__init__.cpython-313.pyc b/agent_framework_oci/libs/agent_framework/src/agent_framework/guardrails/__pycache__/__init__.cpython-313.pyc index 9c16e82e..4734a86a 100644 Binary files a/agent_framework_oci/libs/agent_framework/src/agent_framework/guardrails/__pycache__/__init__.cpython-313.pyc and b/agent_framework_oci/libs/agent_framework/src/agent_framework/guardrails/__pycache__/__init__.cpython-313.pyc differ diff --git a/agent_framework_oci/libs/agent_framework/src/agent_framework/guardrails/__pycache__/base.cpython-313.pyc b/agent_framework_oci/libs/agent_framework/src/agent_framework/guardrails/__pycache__/base.cpython-313.pyc index 6d2e1214..06f9eae6 100644 Binary files a/agent_framework_oci/libs/agent_framework/src/agent_framework/guardrails/__pycache__/base.cpython-313.pyc and b/agent_framework_oci/libs/agent_framework/src/agent_framework/guardrails/__pycache__/base.cpython-313.pyc differ diff --git a/agent_framework_oci/libs/agent_framework/src/agent_framework/guardrails/__pycache__/config_loader.cpython-313.pyc b/agent_framework_oci/libs/agent_framework/src/agent_framework/guardrails/__pycache__/config_loader.cpython-313.pyc index 170c01a8..db931dbe 100644 Binary files a/agent_framework_oci/libs/agent_framework/src/agent_framework/guardrails/__pycache__/config_loader.cpython-313.pyc and b/agent_framework_oci/libs/agent_framework/src/agent_framework/guardrails/__pycache__/config_loader.cpython-313.pyc differ diff --git a/agent_framework_oci/libs/agent_framework/src/agent_framework/guardrails/__pycache__/custom_rails.cpython-313.pyc b/agent_framework_oci/libs/agent_framework/src/agent_framework/guardrails/__pycache__/custom_rails.cpython-313.pyc index 32d61ead..112d959b 100644 Binary files a/agent_framework_oci/libs/agent_framework/src/agent_framework/guardrails/__pycache__/custom_rails.cpython-313.pyc and b/agent_framework_oci/libs/agent_framework/src/agent_framework/guardrails/__pycache__/custom_rails.cpython-313.pyc differ diff --git a/agent_framework_oci/libs/agent_framework/src/agent_framework/guardrails/__pycache__/framework_llm_client.cpython-313.pyc b/agent_framework_oci/libs/agent_framework/src/agent_framework/guardrails/__pycache__/framework_llm_client.cpython-313.pyc index 16ca8d9b..f18abd07 100644 Binary files a/agent_framework_oci/libs/agent_framework/src/agent_framework/guardrails/__pycache__/framework_llm_client.cpython-313.pyc and b/agent_framework_oci/libs/agent_framework/src/agent_framework/guardrails/__pycache__/framework_llm_client.cpython-313.pyc differ diff --git a/agent_framework_oci/libs/agent_framework/src/agent_framework/guardrails/__pycache__/llm_rails.cpython-313.pyc b/agent_framework_oci/libs/agent_framework/src/agent_framework/guardrails/__pycache__/llm_rails.cpython-313.pyc index 5bc08735..edb612d0 100644 Binary files a/agent_framework_oci/libs/agent_framework/src/agent_framework/guardrails/__pycache__/llm_rails.cpython-313.pyc and b/agent_framework_oci/libs/agent_framework/src/agent_framework/guardrails/__pycache__/llm_rails.cpython-313.pyc differ diff --git a/agent_framework_oci/libs/agent_framework/src/agent_framework/guardrails/__pycache__/output_supervisor.cpython-313.pyc b/agent_framework_oci/libs/agent_framework/src/agent_framework/guardrails/__pycache__/output_supervisor.cpython-313.pyc index 160e65cb..67c24457 100644 Binary files a/agent_framework_oci/libs/agent_framework/src/agent_framework/guardrails/__pycache__/output_supervisor.cpython-313.pyc and b/agent_framework_oci/libs/agent_framework/src/agent_framework/guardrails/__pycache__/output_supervisor.cpython-313.pyc differ diff --git a/agent_framework_oci/libs/agent_framework/src/agent_framework/guardrails/__pycache__/parallel_executor.cpython-313.pyc b/agent_framework_oci/libs/agent_framework/src/agent_framework/guardrails/__pycache__/parallel_executor.cpython-313.pyc index e54d65b8..75411936 100644 Binary files a/agent_framework_oci/libs/agent_framework/src/agent_framework/guardrails/__pycache__/parallel_executor.cpython-313.pyc and b/agent_framework_oci/libs/agent_framework/src/agent_framework/guardrails/__pycache__/parallel_executor.cpython-313.pyc differ diff --git a/agent_framework_oci/libs/agent_framework/src/agent_framework/guardrails/__pycache__/pipeline.cpython-313.pyc b/agent_framework_oci/libs/agent_framework/src/agent_framework/guardrails/__pycache__/pipeline.cpython-313.pyc index b4ab329b..d9e53cb8 100644 Binary files a/agent_framework_oci/libs/agent_framework/src/agent_framework/guardrails/__pycache__/pipeline.cpython-313.pyc and b/agent_framework_oci/libs/agent_framework/src/agent_framework/guardrails/__pycache__/pipeline.cpython-313.pyc differ diff --git a/agent_framework_oci/libs/agent_framework/src/agent_framework/guardrails/__pycache__/rail_action.cpython-313.pyc b/agent_framework_oci/libs/agent_framework/src/agent_framework/guardrails/__pycache__/rail_action.cpython-313.pyc index fad910e0..59f52bba 100644 Binary files a/agent_framework_oci/libs/agent_framework/src/agent_framework/guardrails/__pycache__/rail_action.cpython-313.pyc and b/agent_framework_oci/libs/agent_framework/src/agent_framework/guardrails/__pycache__/rail_action.cpython-313.pyc differ diff --git a/agent_framework_oci/libs/agent_framework/src/agent_framework/guardrails/__pycache__/rail_decision.cpython-313.pyc b/agent_framework_oci/libs/agent_framework/src/agent_framework/guardrails/__pycache__/rail_decision.cpython-313.pyc index 5fde2c26..f758829e 100644 Binary files a/agent_framework_oci/libs/agent_framework/src/agent_framework/guardrails/__pycache__/rail_decision.cpython-313.pyc and b/agent_framework_oci/libs/agent_framework/src/agent_framework/guardrails/__pycache__/rail_decision.cpython-313.pyc differ diff --git a/agent_framework_oci/libs/agent_framework/src/agent_framework/guardrails/__pycache__/rail_result.cpython-313.pyc b/agent_framework_oci/libs/agent_framework/src/agent_framework/guardrails/__pycache__/rail_result.cpython-313.pyc index 301eb4ea..66f0d1e6 100644 Binary files a/agent_framework_oci/libs/agent_framework/src/agent_framework/guardrails/__pycache__/rail_result.cpython-313.pyc and b/agent_framework_oci/libs/agent_framework/src/agent_framework/guardrails/__pycache__/rail_result.cpython-313.pyc differ diff --git a/agent_framework_oci/libs/agent_framework/src/agent_framework/guardrails/__pycache__/rails.cpython-313.pyc b/agent_framework_oci/libs/agent_framework/src/agent_framework/guardrails/__pycache__/rails.cpython-313.pyc index cdb5396c..2c248c30 100644 Binary files a/agent_framework_oci/libs/agent_framework/src/agent_framework/guardrails/__pycache__/rails.cpython-313.pyc and b/agent_framework_oci/libs/agent_framework/src/agent_framework/guardrails/__pycache__/rails.cpython-313.pyc differ diff --git a/agent_framework_oci/libs/agent_framework/src/agent_framework/guardrails/calibrated/__pycache__/__init__.cpython-313.pyc b/agent_framework_oci/libs/agent_framework/src/agent_framework/guardrails/calibrated/__pycache__/__init__.cpython-313.pyc index 9fb8ff07..7ef5a80e 100644 Binary files a/agent_framework_oci/libs/agent_framework/src/agent_framework/guardrails/calibrated/__pycache__/__init__.cpython-313.pyc and b/agent_framework_oci/libs/agent_framework/src/agent_framework/guardrails/calibrated/__pycache__/__init__.cpython-313.pyc differ diff --git a/agent_framework_oci/libs/agent_framework/src/agent_framework/guardrails/calibrated/__pycache__/_compat.cpython-313.pyc b/agent_framework_oci/libs/agent_framework/src/agent_framework/guardrails/calibrated/__pycache__/_compat.cpython-313.pyc index 213473b7..c7c88fae 100644 Binary files a/agent_framework_oci/libs/agent_framework/src/agent_framework/guardrails/calibrated/__pycache__/_compat.cpython-313.pyc and b/agent_framework_oci/libs/agent_framework/src/agent_framework/guardrails/calibrated/__pycache__/_compat.cpython-313.pyc differ diff --git a/agent_framework_oci/libs/agent_framework/src/agent_framework/guardrails/calibrated/__pycache__/contestation_validation.cpython-313.pyc b/agent_framework_oci/libs/agent_framework/src/agent_framework/guardrails/calibrated/__pycache__/contestation_validation.cpython-313.pyc index 16e85145..908bd598 100644 Binary files a/agent_framework_oci/libs/agent_framework/src/agent_framework/guardrails/calibrated/__pycache__/contestation_validation.cpython-313.pyc and b/agent_framework_oci/libs/agent_framework/src/agent_framework/guardrails/calibrated/__pycache__/contestation_validation.cpython-313.pyc differ diff --git a/agent_framework_oci/libs/agent_framework/src/agent_framework/guardrails/calibrated/__pycache__/contracts.cpython-313.pyc b/agent_framework_oci/libs/agent_framework/src/agent_framework/guardrails/calibrated/__pycache__/contracts.cpython-313.pyc index a7fdcd90..b12fd643 100644 Binary files a/agent_framework_oci/libs/agent_framework/src/agent_framework/guardrails/calibrated/__pycache__/contracts.cpython-313.pyc and b/agent_framework_oci/libs/agent_framework/src/agent_framework/guardrails/calibrated/__pycache__/contracts.cpython-313.pyc differ diff --git a/agent_framework_oci/libs/agent_framework/src/agent_framework/guardrails/calibrated/__pycache__/input_size.cpython-313.pyc b/agent_framework_oci/libs/agent_framework/src/agent_framework/guardrails/calibrated/__pycache__/input_size.cpython-313.pyc index 645c72ea..293a24ca 100644 Binary files a/agent_framework_oci/libs/agent_framework/src/agent_framework/guardrails/calibrated/__pycache__/input_size.cpython-313.pyc and b/agent_framework_oci/libs/agent_framework/src/agent_framework/guardrails/calibrated/__pycache__/input_size.cpython-313.pyc differ diff --git a/agent_framework_oci/libs/agent_framework/src/agent_framework/guardrails/calibrated/__pycache__/llm_adapter.cpython-313.pyc b/agent_framework_oci/libs/agent_framework/src/agent_framework/guardrails/calibrated/__pycache__/llm_adapter.cpython-313.pyc index 1f2be21c..f7ce8151 100644 Binary files a/agent_framework_oci/libs/agent_framework/src/agent_framework/guardrails/calibrated/__pycache__/llm_adapter.cpython-313.pyc and b/agent_framework_oci/libs/agent_framework/src/agent_framework/guardrails/calibrated/__pycache__/llm_adapter.cpython-313.pyc differ diff --git a/agent_framework_oci/libs/agent_framework/src/agent_framework/guardrails/calibrated/__pycache__/llm_client.cpython-313.pyc b/agent_framework_oci/libs/agent_framework/src/agent_framework/guardrails/calibrated/__pycache__/llm_client.cpython-313.pyc index 3bf7ebf9..d7e938b1 100644 Binary files a/agent_framework_oci/libs/agent_framework/src/agent_framework/guardrails/calibrated/__pycache__/llm_client.cpython-313.pyc and b/agent_framework_oci/libs/agent_framework/src/agent_framework/guardrails/calibrated/__pycache__/llm_client.cpython-313.pyc differ diff --git a/agent_framework_oci/libs/agent_framework/src/agent_framework/guardrails/calibrated/__pycache__/llm_rails.cpython-313.pyc b/agent_framework_oci/libs/agent_framework/src/agent_framework/guardrails/calibrated/__pycache__/llm_rails.cpython-313.pyc index 15d3d084..8d8604f9 100644 Binary files a/agent_framework_oci/libs/agent_framework/src/agent_framework/guardrails/calibrated/__pycache__/llm_rails.cpython-313.pyc and b/agent_framework_oci/libs/agent_framework/src/agent_framework/guardrails/calibrated/__pycache__/llm_rails.cpython-313.pyc differ diff --git a/agent_framework_oci/libs/agent_framework/src/agent_framework/guardrails/calibrated/__pycache__/output_sanitization.cpython-313.pyc b/agent_framework_oci/libs/agent_framework/src/agent_framework/guardrails/calibrated/__pycache__/output_sanitization.cpython-313.pyc index 5248f14a..9fcf3a34 100644 Binary files a/agent_framework_oci/libs/agent_framework/src/agent_framework/guardrails/calibrated/__pycache__/output_sanitization.cpython-313.pyc and b/agent_framework_oci/libs/agent_framework/src/agent_framework/guardrails/calibrated/__pycache__/output_sanitization.cpython-313.pyc differ diff --git a/agent_framework_oci/libs/agent_framework/src/agent_framework/guardrails/calibrated/__pycache__/pipeline.cpython-313.pyc b/agent_framework_oci/libs/agent_framework/src/agent_framework/guardrails/calibrated/__pycache__/pipeline.cpython-313.pyc index 340328e4..529052cb 100644 Binary files a/agent_framework_oci/libs/agent_framework/src/agent_framework/guardrails/calibrated/__pycache__/pipeline.cpython-313.pyc and b/agent_framework_oci/libs/agent_framework/src/agent_framework/guardrails/calibrated/__pycache__/pipeline.cpython-313.pyc differ diff --git a/agent_framework_oci/libs/agent_framework/src/agent_framework/guardrails/calibrated/prompts/__pycache__/__init__.cpython-313.pyc b/agent_framework_oci/libs/agent_framework/src/agent_framework/guardrails/calibrated/prompts/__pycache__/__init__.cpython-313.pyc index 30226880..07e87cec 100644 Binary files a/agent_framework_oci/libs/agent_framework/src/agent_framework/guardrails/calibrated/prompts/__pycache__/__init__.cpython-313.pyc and b/agent_framework_oci/libs/agent_framework/src/agent_framework/guardrails/calibrated/prompts/__pycache__/__init__.cpython-313.pyc differ diff --git a/agent_framework_oci/libs/agent_framework/src/agent_framework/guardrails/calibrated/prompts/__pycache__/_context.cpython-313.pyc b/agent_framework_oci/libs/agent_framework/src/agent_framework/guardrails/calibrated/prompts/__pycache__/_context.cpython-313.pyc index 2c49d3a9..251de0cb 100644 Binary files a/agent_framework_oci/libs/agent_framework/src/agent_framework/guardrails/calibrated/prompts/__pycache__/_context.cpython-313.pyc and b/agent_framework_oci/libs/agent_framework/src/agent_framework/guardrails/calibrated/prompts/__pycache__/_context.cpython-313.pyc differ diff --git a/agent_framework_oci/libs/agent_framework/src/agent_framework/guardrails/calibrated/prompts/__pycache__/ausencia_oferta_proativa.cpython-313.pyc b/agent_framework_oci/libs/agent_framework/src/agent_framework/guardrails/calibrated/prompts/__pycache__/ausencia_oferta_proativa.cpython-313.pyc index f64d5da0..b9fd59f1 100644 Binary files a/agent_framework_oci/libs/agent_framework/src/agent_framework/guardrails/calibrated/prompts/__pycache__/ausencia_oferta_proativa.cpython-313.pyc and b/agent_framework_oci/libs/agent_framework/src/agent_framework/guardrails/calibrated/prompts/__pycache__/ausencia_oferta_proativa.cpython-313.pyc differ diff --git a/agent_framework_oci/libs/agent_framework/src/agent_framework/guardrails/calibrated/prompts/__pycache__/coerencia.cpython-313.pyc b/agent_framework_oci/libs/agent_framework/src/agent_framework/guardrails/calibrated/prompts/__pycache__/coerencia.cpython-313.pyc index c80d5cd2..ada751df 100644 Binary files a/agent_framework_oci/libs/agent_framework/src/agent_framework/guardrails/calibrated/prompts/__pycache__/coerencia.cpython-313.pyc and b/agent_framework_oci/libs/agent_framework/src/agent_framework/guardrails/calibrated/prompts/__pycache__/coerencia.cpython-313.pyc differ diff --git a/agent_framework_oci/libs/agent_framework/src/agent_framework/guardrails/calibrated/prompts/__pycache__/dlex_in.cpython-313.pyc b/agent_framework_oci/libs/agent_framework/src/agent_framework/guardrails/calibrated/prompts/__pycache__/dlex_in.cpython-313.pyc index c36a2d40..b4a792a8 100644 Binary files a/agent_framework_oci/libs/agent_framework/src/agent_framework/guardrails/calibrated/prompts/__pycache__/dlex_in.cpython-313.pyc and b/agent_framework_oci/libs/agent_framework/src/agent_framework/guardrails/calibrated/prompts/__pycache__/dlex_in.cpython-313.pyc differ diff --git a/agent_framework_oci/libs/agent_framework/src/agent_framework/guardrails/calibrated/prompts/__pycache__/dlex_out.cpython-313.pyc b/agent_framework_oci/libs/agent_framework/src/agent_framework/guardrails/calibrated/prompts/__pycache__/dlex_out.cpython-313.pyc index f1b478fe..8905a4e0 100644 Binary files a/agent_framework_oci/libs/agent_framework/src/agent_framework/guardrails/calibrated/prompts/__pycache__/dlex_out.cpython-313.pyc and b/agent_framework_oci/libs/agent_framework/src/agent_framework/guardrails/calibrated/prompts/__pycache__/dlex_out.cpython-313.pyc differ diff --git a/agent_framework_oci/libs/agent_framework/src/agent_framework/guardrails/calibrated/prompts/__pycache__/fallback.cpython-313.pyc b/agent_framework_oci/libs/agent_framework/src/agent_framework/guardrails/calibrated/prompts/__pycache__/fallback.cpython-313.pyc index ff0e3e7f..31ddc96a 100644 Binary files a/agent_framework_oci/libs/agent_framework/src/agent_framework/guardrails/calibrated/prompts/__pycache__/fallback.cpython-313.pyc and b/agent_framework_oci/libs/agent_framework/src/agent_framework/guardrails/calibrated/prompts/__pycache__/fallback.cpython-313.pyc differ diff --git a/agent_framework_oci/libs/agent_framework/src/agent_framework/guardrails/calibrated/prompts/__pycache__/fraseologia.cpython-313.pyc b/agent_framework_oci/libs/agent_framework/src/agent_framework/guardrails/calibrated/prompts/__pycache__/fraseologia.cpython-313.pyc index dddc4197..68f9cbd8 100644 Binary files a/agent_framework_oci/libs/agent_framework/src/agent_framework/guardrails/calibrated/prompts/__pycache__/fraseologia.cpython-313.pyc and b/agent_framework_oci/libs/agent_framework/src/agent_framework/guardrails/calibrated/prompts/__pycache__/fraseologia.cpython-313.pyc differ diff --git a/agent_framework_oci/libs/agent_framework/src/agent_framework/guardrails/calibrated/prompts/__pycache__/out_of_scope.cpython-313.pyc b/agent_framework_oci/libs/agent_framework/src/agent_framework/guardrails/calibrated/prompts/__pycache__/out_of_scope.cpython-313.pyc index 1b8a9d38..b7877566 100644 Binary files a/agent_framework_oci/libs/agent_framework/src/agent_framework/guardrails/calibrated/prompts/__pycache__/out_of_scope.cpython-313.pyc and b/agent_framework_oci/libs/agent_framework/src/agent_framework/guardrails/calibrated/prompts/__pycache__/out_of_scope.cpython-313.pyc differ diff --git a/agent_framework_oci/libs/agent_framework/src/agent_framework/guardrails/calibrated/prompts/__pycache__/pinj.cpython-313.pyc b/agent_framework_oci/libs/agent_framework/src/agent_framework/guardrails/calibrated/prompts/__pycache__/pinj.cpython-313.pyc index 12cab79b..62ca20f2 100644 Binary files a/agent_framework_oci/libs/agent_framework/src/agent_framework/guardrails/calibrated/prompts/__pycache__/pinj.cpython-313.pyc and b/agent_framework_oci/libs/agent_framework/src/agent_framework/guardrails/calibrated/prompts/__pycache__/pinj.cpython-313.pyc differ diff --git a/agent_framework_oci/libs/agent_framework/src/agent_framework/guardrails/calibrated/prompts/__pycache__/ragsec.cpython-313.pyc b/agent_framework_oci/libs/agent_framework/src/agent_framework/guardrails/calibrated/prompts/__pycache__/ragsec.cpython-313.pyc index ecd8196b..300c22a8 100644 Binary files a/agent_framework_oci/libs/agent_framework/src/agent_framework/guardrails/calibrated/prompts/__pycache__/ragsec.cpython-313.pyc and b/agent_framework_oci/libs/agent_framework/src/agent_framework/guardrails/calibrated/prompts/__pycache__/ragsec.cpython-313.pyc differ diff --git a/agent_framework_oci/libs/agent_framework/src/agent_framework/guardrails/calibrated/prompts/__pycache__/revprec.cpython-313.pyc b/agent_framework_oci/libs/agent_framework/src/agent_framework/guardrails/calibrated/prompts/__pycache__/revprec.cpython-313.pyc index d329b331..5e31e725 100644 Binary files a/agent_framework_oci/libs/agent_framework/src/agent_framework/guardrails/calibrated/prompts/__pycache__/revprec.cpython-313.pyc and b/agent_framework_oci/libs/agent_framework/src/agent_framework/guardrails/calibrated/prompts/__pycache__/revprec.cpython-313.pyc differ diff --git a/agent_framework_oci/libs/agent_framework/src/agent_framework/guardrails/calibrated/prompts/__pycache__/tox.cpython-313.pyc b/agent_framework_oci/libs/agent_framework/src/agent_framework/guardrails/calibrated/prompts/__pycache__/tox.cpython-313.pyc index fd5a6a08..1fff83b7 100644 Binary files a/agent_framework_oci/libs/agent_framework/src/agent_framework/guardrails/calibrated/prompts/__pycache__/tox.cpython-313.pyc and b/agent_framework_oci/libs/agent_framework/src/agent_framework/guardrails/calibrated/prompts/__pycache__/tox.cpython-313.pyc differ diff --git a/agent_framework_oci/libs/agent_framework/src/agent_framework/guardrails/calibrated/prompts/__pycache__/toxicidade_output.cpython-313.pyc b/agent_framework_oci/libs/agent_framework/src/agent_framework/guardrails/calibrated/prompts/__pycache__/toxicidade_output.cpython-313.pyc index 278bb705..74f244a6 100644 Binary files a/agent_framework_oci/libs/agent_framework/src/agent_framework/guardrails/calibrated/prompts/__pycache__/toxicidade_output.cpython-313.pyc and b/agent_framework_oci/libs/agent_framework/src/agent_framework/guardrails/calibrated/prompts/__pycache__/toxicidade_output.cpython-313.pyc differ diff --git a/agent_framework_oci/libs/agent_framework/src/agent_framework/guardrails/calibrated/rails/__pycache__/__init__.cpython-313.pyc b/agent_framework_oci/libs/agent_framework/src/agent_framework/guardrails/calibrated/rails/__pycache__/__init__.cpython-313.pyc index bf039b97..92b74c06 100644 Binary files a/agent_framework_oci/libs/agent_framework/src/agent_framework/guardrails/calibrated/rails/__pycache__/__init__.cpython-313.pyc and b/agent_framework_oci/libs/agent_framework/src/agent_framework/guardrails/calibrated/rails/__pycache__/__init__.cpython-313.pyc differ diff --git a/agent_framework_oci/libs/agent_framework/src/agent_framework/guardrails/calibrated/rails/__pycache__/alcada.cpython-313.pyc b/agent_framework_oci/libs/agent_framework/src/agent_framework/guardrails/calibrated/rails/__pycache__/alcada.cpython-313.pyc index bcc4b673..96af157e 100644 Binary files a/agent_framework_oci/libs/agent_framework/src/agent_framework/guardrails/calibrated/rails/__pycache__/alcada.cpython-313.pyc and b/agent_framework_oci/libs/agent_framework/src/agent_framework/guardrails/calibrated/rails/__pycache__/alcada.cpython-313.pyc differ diff --git a/agent_framework_oci/libs/agent_framework/src/agent_framework/guardrails/calibrated/rails/__pycache__/anatel.cpython-313.pyc b/agent_framework_oci/libs/agent_framework/src/agent_framework/guardrails/calibrated/rails/__pycache__/anatel.cpython-313.pyc index 601538ee..a6393b44 100644 Binary files a/agent_framework_oci/libs/agent_framework/src/agent_framework/guardrails/calibrated/rails/__pycache__/anatel.cpython-313.pyc and b/agent_framework_oci/libs/agent_framework/src/agent_framework/guardrails/calibrated/rails/__pycache__/anatel.cpython-313.pyc differ diff --git a/agent_framework_oci/libs/agent_framework/src/agent_framework/guardrails/calibrated/rails/__pycache__/confirmation.cpython-313.pyc b/agent_framework_oci/libs/agent_framework/src/agent_framework/guardrails/calibrated/rails/__pycache__/confirmation.cpython-313.pyc index 426217f0..ec87619e 100644 Binary files a/agent_framework_oci/libs/agent_framework/src/agent_framework/guardrails/calibrated/rails/__pycache__/confirmation.cpython-313.pyc and b/agent_framework_oci/libs/agent_framework/src/agent_framework/guardrails/calibrated/rails/__pycache__/confirmation.cpython-313.pyc differ diff --git a/agent_framework_oci/libs/agent_framework/src/agent_framework/guardrails/calibrated/rails/__pycache__/dlex_in.cpython-313.pyc b/agent_framework_oci/libs/agent_framework/src/agent_framework/guardrails/calibrated/rails/__pycache__/dlex_in.cpython-313.pyc index 458a998a..b764e2a7 100644 Binary files a/agent_framework_oci/libs/agent_framework/src/agent_framework/guardrails/calibrated/rails/__pycache__/dlex_in.cpython-313.pyc and b/agent_framework_oci/libs/agent_framework/src/agent_framework/guardrails/calibrated/rails/__pycache__/dlex_in.cpython-313.pyc differ diff --git a/agent_framework_oci/libs/agent_framework/src/agent_framework/guardrails/calibrated/rails/__pycache__/dlex_out.cpython-313.pyc b/agent_framework_oci/libs/agent_framework/src/agent_framework/guardrails/calibrated/rails/__pycache__/dlex_out.cpython-313.pyc index 803056f2..ca914133 100644 Binary files a/agent_framework_oci/libs/agent_framework/src/agent_framework/guardrails/calibrated/rails/__pycache__/dlex_out.cpython-313.pyc and b/agent_framework_oci/libs/agent_framework/src/agent_framework/guardrails/calibrated/rails/__pycache__/dlex_out.cpython-313.pyc differ diff --git a/agent_framework_oci/libs/agent_framework/src/agent_framework/guardrails/calibrated/rails/__pycache__/ragsec.cpython-313.pyc b/agent_framework_oci/libs/agent_framework/src/agent_framework/guardrails/calibrated/rails/__pycache__/ragsec.cpython-313.pyc index 9576f690..e3e74e40 100644 Binary files a/agent_framework_oci/libs/agent_framework/src/agent_framework/guardrails/calibrated/rails/__pycache__/ragsec.cpython-313.pyc and b/agent_framework_oci/libs/agent_framework/src/agent_framework/guardrails/calibrated/rails/__pycache__/ragsec.cpython-313.pyc differ diff --git a/agent_framework_oci/libs/agent_framework/src/agent_framework/guardrails/calibrated/rails/__pycache__/revprec.cpython-313.pyc b/agent_framework_oci/libs/agent_framework/src/agent_framework/guardrails/calibrated/rails/__pycache__/revprec.cpython-313.pyc index 1bd263f4..02973ae3 100644 Binary files a/agent_framework_oci/libs/agent_framework/src/agent_framework/guardrails/calibrated/rails/__pycache__/revprec.cpython-313.pyc and b/agent_framework_oci/libs/agent_framework/src/agent_framework/guardrails/calibrated/rails/__pycache__/revprec.cpython-313.pyc differ diff --git a/agent_framework_oci/libs/agent_framework/src/agent_framework/guardrails/calibrated/rails/__pycache__/tox.cpython-313.pyc b/agent_framework_oci/libs/agent_framework/src/agent_framework/guardrails/calibrated/rails/__pycache__/tox.cpython-313.pyc index e5b5f25a..ad81f20e 100644 Binary files a/agent_framework_oci/libs/agent_framework/src/agent_framework/guardrails/calibrated/rails/__pycache__/tox.cpython-313.pyc and b/agent_framework_oci/libs/agent_framework/src/agent_framework/guardrails/calibrated/rails/__pycache__/tox.cpython-313.pyc differ diff --git a/agent_framework_oci/libs/agent_framework/src/agent_framework/guardrails/calibrated/rails/confirmation.py b/agent_framework_oci/libs/agent_framework/src/agent_framework/guardrails/calibrated/rails/confirmation.py index ba0ecbf9..3f92e873 100644 --- a/agent_framework_oci/libs/agent_framework/src/agent_framework/guardrails/calibrated/rails/confirmation.py +++ b/agent_framework_oci/libs/agent_framework/src/agent_framework/guardrails/calibrated/rails/confirmation.py @@ -42,6 +42,8 @@ Uso via função standalone (compatibilidade): """ from __future__ import annotations +from agent_framework.llm.structured_output import parse_json_object + import json import logging from typing import Any @@ -239,10 +241,10 @@ def classify_confirmation( return False, f"invoke_error — fallback pessimista: {exc}" try: - payload: dict[str, Any] = json.loads(raw) - except (json.JSONDecodeError, TypeError) as exc: + payload: dict[str, Any] = parse_json_object(raw) + except (ValueError, TypeError) as exc: logger.warning( - "confirmation_rail.json_parse_failed raw=%r error=%r — fallback pessimista", + "confirmation_rail.structured_parse_failed raw=%r error=%r — fallback pessimista", raw[:200], exc, ) diff --git a/agent_framework_oci/libs/agent_framework/src/agent_framework/guardrails/calibrated/rails/ragsec.py b/agent_framework_oci/libs/agent_framework/src/agent_framework/guardrails/calibrated/rails/ragsec.py index 2f9d089c..acead039 100644 --- a/agent_framework_oci/libs/agent_framework/src/agent_framework/guardrails/calibrated/rails/ragsec.py +++ b/agent_framework_oci/libs/agent_framework/src/agent_framework/guardrails/calibrated/rails/ragsec.py @@ -16,6 +16,8 @@ Contexto de migração: """ from __future__ import annotations +from agent_framework.llm.structured_output import parse_json_object + import json import logging @@ -89,7 +91,7 @@ class RagsecRail: try: raw = self._client.invoke(self.code, input_vars) - result: dict = json.loads(raw) if isinstance(raw, str) else raw + result: dict = parse_json_object(raw) if isinstance(raw, str) else raw except Exception as exc: logger.error( "ragsec_rail.invoke_error session=%s exc=%r — assuming allowed", diff --git a/agent_framework_oci/libs/agent_framework/src/agent_framework/guardrails/calibrated/rails/revprec.py b/agent_framework_oci/libs/agent_framework/src/agent_framework/guardrails/calibrated/rails/revprec.py index fefe0f55..331448f8 100644 --- a/agent_framework_oci/libs/agent_framework/src/agent_framework/guardrails/calibrated/rails/revprec.py +++ b/agent_framework_oci/libs/agent_framework/src/agent_framework/guardrails/calibrated/rails/revprec.py @@ -15,6 +15,8 @@ Contexto de migração: """ from __future__ import annotations +from agent_framework.llm.structured_output import parse_json_object + import json import logging @@ -88,7 +90,7 @@ class RevprecRail: try: raw = self._client.invoke(self.code, input_vars) - result: dict = json.loads(raw) if isinstance(raw, str) else raw + result: dict = parse_json_object(raw) if isinstance(raw, str) else raw except Exception as exc: logger.error( "revprec_rail.invoke_error session=%s exc=%r — assuming allowed", diff --git a/agent_framework_oci/libs/agent_framework/src/agent_framework/guardrails/calibrated/rails/supervision/correspondencia_item.py b/agent_framework_oci/libs/agent_framework/src/agent_framework/guardrails/calibrated/rails/supervision/correspondencia_item.py index ad2e1fe1..9be9c23e 100644 --- a/agent_framework_oci/libs/agent_framework/src/agent_framework/guardrails/calibrated/rails/supervision/correspondencia_item.py +++ b/agent_framework_oci/libs/agent_framework/src/agent_framework/guardrails/calibrated/rails/supervision/correspondencia_item.py @@ -10,6 +10,8 @@ Implementa o Protocol ``Rail`` de contracts.py (AT-06.2). """ from __future__ import annotations +from agent_framework.llm.structured_output import parse_json_object + import json import logging @@ -133,7 +135,7 @@ class CorrespondenciaItemRail: try: raw = self._client.invoke(self.code, input_vars) - result: dict = json.loads(raw) if isinstance(raw, str) else raw + result: dict = parse_json_object(raw) if isinstance(raw, str) else raw except Exception as exc: logger.error( "correspondencia_item_rail.invoke_error session=%s exc=%r — assuming no violation", diff --git a/agent_framework_oci/libs/agent_framework/src/agent_framework/guardrails/calibrated/rails/supervision/groundedness.py b/agent_framework_oci/libs/agent_framework/src/agent_framework/guardrails/calibrated/rails/supervision/groundedness.py index b1a0f9ed..d947f4d2 100644 --- a/agent_framework_oci/libs/agent_framework/src/agent_framework/guardrails/calibrated/rails/supervision/groundedness.py +++ b/agent_framework_oci/libs/agent_framework/src/agent_framework/guardrails/calibrated/rails/supervision/groundedness.py @@ -8,6 +8,8 @@ Implementa o Protocol ``Rail`` de contracts.py (AT-06.4). """ from __future__ import annotations +from agent_framework.llm.structured_output import parse_json_object + import json import logging @@ -127,7 +129,7 @@ class GroundednessRail: try: raw = self._client.invoke(self.code, input_vars) - result: dict = json.loads(raw) if isinstance(raw, str) else raw + result: dict = parse_json_object(raw) if isinstance(raw, str) else raw except Exception as exc: logger.error( "groundedness_rail.invoke_error session=%s exc=%r — assuming no violation", diff --git a/agent_framework_oci/libs/agent_framework/src/agent_framework/guardrails/calibrated/rails/supervision/intencao_cancelar.py b/agent_framework_oci/libs/agent_framework/src/agent_framework/guardrails/calibrated/rails/supervision/intencao_cancelar.py index 8bb690ce..30bd0f3d 100644 --- a/agent_framework_oci/libs/agent_framework/src/agent_framework/guardrails/calibrated/rails/supervision/intencao_cancelar.py +++ b/agent_framework_oci/libs/agent_framework/src/agent_framework/guardrails/calibrated/rails/supervision/intencao_cancelar.py @@ -10,6 +10,8 @@ Implementa o Protocol ``Rail`` de contracts.py (AT-06.1). """ from __future__ import annotations +from agent_framework.llm.structured_output import parse_json_object + import json import logging @@ -131,7 +133,7 @@ class IntencaoCancelarRail: try: raw = self._client.invoke(self.code, input_vars) - result: dict = json.loads(raw) if isinstance(raw, str) else raw + result: dict = parse_json_object(raw) if isinstance(raw, str) else raw except Exception as exc: logger.error( "intencao_cancelar_rail.invoke_error session=%s exc=%r — assuming no violation", diff --git a/agent_framework_oci/libs/agent_framework/src/agent_framework/guardrails/calibrated/rails/supervision/quantidade_coerente.py b/agent_framework_oci/libs/agent_framework/src/agent_framework/guardrails/calibrated/rails/supervision/quantidade_coerente.py index 446c5060..13620c26 100644 --- a/agent_framework_oci/libs/agent_framework/src/agent_framework/guardrails/calibrated/rails/supervision/quantidade_coerente.py +++ b/agent_framework_oci/libs/agent_framework/src/agent_framework/guardrails/calibrated/rails/supervision/quantidade_coerente.py @@ -10,6 +10,8 @@ Implementa o Protocol ``Rail`` de contracts.py (AT-06.3). """ from __future__ import annotations +from agent_framework.llm.structured_output import parse_json_object + import json import logging @@ -135,7 +137,7 @@ class QuantidadeCoerente: try: raw = self._client.invoke(self.code, input_vars) - result: dict = json.loads(raw) if isinstance(raw, str) else raw + result: dict = parse_json_object(raw) if isinstance(raw, str) else raw except Exception as exc: logger.error( "quantidade_coerente_rail.invoke_error session=%s exc=%r — assuming no violation", diff --git a/agent_framework_oci/libs/agent_framework/src/agent_framework/guardrails/calibrated/rails/supervision/servico_correto.py b/agent_framework_oci/libs/agent_framework/src/agent_framework/guardrails/calibrated/rails/supervision/servico_correto.py index f0c64caf..2a8bcc4b 100644 --- a/agent_framework_oci/libs/agent_framework/src/agent_framework/guardrails/calibrated/rails/supervision/servico_correto.py +++ b/agent_framework_oci/libs/agent_framework/src/agent_framework/guardrails/calibrated/rails/supervision/servico_correto.py @@ -11,6 +11,8 @@ Implementa o Protocol ``Rail`` de contracts.py (AT-06.6). """ from __future__ import annotations +from agent_framework.llm.structured_output import parse_json_object + import json import logging @@ -131,7 +133,7 @@ class ServicoCorrretoRail: try: raw = self._client.invoke(self.code, input_vars) - result: dict = json.loads(raw) if isinstance(raw, str) else raw + result: dict = parse_json_object(raw) if isinstance(raw, str) else raw except Exception as exc: logger.error( "servico_correto_rail.invoke_error session=%s exc=%r — assuming no violation", diff --git a/agent_framework_oci/libs/agent_framework/src/agent_framework/guardrails/calibrated/rails/supervision/verbalizacao_prematura.py b/agent_framework_oci/libs/agent_framework/src/agent_framework/guardrails/calibrated/rails/supervision/verbalizacao_prematura.py index 125d60cf..1b4b1f27 100644 --- a/agent_framework_oci/libs/agent_framework/src/agent_framework/guardrails/calibrated/rails/supervision/verbalizacao_prematura.py +++ b/agent_framework_oci/libs/agent_framework/src/agent_framework/guardrails/calibrated/rails/supervision/verbalizacao_prematura.py @@ -11,6 +11,8 @@ Implementa o Protocol ``Rail`` de contracts.py (AT-06.5). """ from __future__ import annotations +from agent_framework.llm.structured_output import parse_json_object + import json import logging @@ -128,7 +130,7 @@ class VerbalizacaoPrematura: try: raw = self._client.invoke(self.code, input_vars) - result: dict = json.loads(raw) if isinstance(raw, str) else raw + result: dict = parse_json_object(raw) if isinstance(raw, str) else raw except Exception as exc: logger.error( "verbalizacao_prematura_rail.invoke_error session=%s exc=%r — assuming no violation", diff --git a/agent_framework_oci/libs/agent_framework/src/agent_framework/guardrails/calibrated/rails/tox.py b/agent_framework_oci/libs/agent_framework/src/agent_framework/guardrails/calibrated/rails/tox.py index 7ac59d85..d1b04434 100644 --- a/agent_framework_oci/libs/agent_framework/src/agent_framework/guardrails/calibrated/rails/tox.py +++ b/agent_framework_oci/libs/agent_framework/src/agent_framework/guardrails/calibrated/rails/tox.py @@ -22,6 +22,8 @@ Fallback conservador: """ from __future__ import annotations +from agent_framework.llm.structured_output import parse_json_object + import json import logging @@ -155,7 +157,7 @@ class ToxRail: try: raw = self._client.invoke(self.code, input_vars) - result: dict = json.loads(raw) if isinstance(raw, str) else raw + result: dict = parse_json_object(raw) if isinstance(raw, str) else raw except Exception as exc: logger.error( "tox_rail.invoke_error session=%s exc=%r — assuming allowed", diff --git a/agent_framework_oci/libs/agent_framework/src/agent_framework/guardrails/calibrated/rules/__pycache__/__init__.cpython-313.pyc b/agent_framework_oci/libs/agent_framework/src/agent_framework/guardrails/calibrated/rules/__pycache__/__init__.cpython-313.pyc index 5d1f48c4..c70f960c 100644 Binary files a/agent_framework_oci/libs/agent_framework/src/agent_framework/guardrails/calibrated/rules/__pycache__/__init__.cpython-313.pyc and b/agent_framework_oci/libs/agent_framework/src/agent_framework/guardrails/calibrated/rules/__pycache__/__init__.cpython-313.pyc differ diff --git a/agent_framework_oci/libs/agent_framework/src/agent_framework/guardrails/calibrated/rules/__pycache__/alcada.cpython-313.pyc b/agent_framework_oci/libs/agent_framework/src/agent_framework/guardrails/calibrated/rules/__pycache__/alcada.cpython-313.pyc index 2eee30e1..d5664d67 100644 Binary files a/agent_framework_oci/libs/agent_framework/src/agent_framework/guardrails/calibrated/rules/__pycache__/alcada.cpython-313.pyc and b/agent_framework_oci/libs/agent_framework/src/agent_framework/guardrails/calibrated/rules/__pycache__/alcada.cpython-313.pyc differ diff --git a/agent_framework_oci/libs/agent_framework/src/agent_framework/guardrails/calibrated/rules/__pycache__/pinj_patterns.cpython-313.pyc b/agent_framework_oci/libs/agent_framework/src/agent_framework/guardrails/calibrated/rules/__pycache__/pinj_patterns.cpython-313.pyc index b1a0594e..0243e602 100644 Binary files a/agent_framework_oci/libs/agent_framework/src/agent_framework/guardrails/calibrated/rules/__pycache__/pinj_patterns.cpython-313.pyc and b/agent_framework_oci/libs/agent_framework/src/agent_framework/guardrails/calibrated/rules/__pycache__/pinj_patterns.cpython-313.pyc differ diff --git a/agent_framework_oci/libs/agent_framework/src/agent_framework/guardrails/calibrated/rules/__pycache__/tox_blocklist.cpython-313.pyc b/agent_framework_oci/libs/agent_framework/src/agent_framework/guardrails/calibrated/rules/__pycache__/tox_blocklist.cpython-313.pyc index 9f4b74bf..0fd52f7a 100644 Binary files a/agent_framework_oci/libs/agent_framework/src/agent_framework/guardrails/calibrated/rules/__pycache__/tox_blocklist.cpython-313.pyc and b/agent_framework_oci/libs/agent_framework/src/agent_framework/guardrails/calibrated/rules/__pycache__/tox_blocklist.cpython-313.pyc differ diff --git a/agent_framework_oci/libs/agent_framework/src/agent_framework/guardrails/framework_llm_client.py b/agent_framework_oci/libs/agent_framework/src/agent_framework/guardrails/framework_llm_client.py index 5d5eeef5..f3d4e6a4 100644 --- a/agent_framework_oci/libs/agent_framework/src/agent_framework/guardrails/framework_llm_client.py +++ b/agent_framework_oci/libs/agent_framework/src/agent_framework/guardrails/framework_llm_client.py @@ -1,5 +1,7 @@ from __future__ import annotations +from agent_framework.llm.structured_output import parse_json_object + import json import os import re @@ -85,15 +87,9 @@ def _extract_text(raw: Any) -> str: def _parse_json(text: str) -> dict[str, Any]: try: - return json.loads(text) + return parse_json_object(text) except Exception: - match = re.search(r"\{[\s\S]*\}", text or "") - if match: - try: - return json.loads(match.group(0)) - except Exception: - pass - return {"allowed": False, "label": "ERROR", "reason": (text or "")[:500]} + return {"allowed": False, "label": "ERROR", "reason": (text or "")[:500]} def _first_substring_match(text: str, triggers: tuple[str, ...]) -> str | None: diff --git a/agent_framework_oci/libs/agent_framework/src/agent_framework/guardrails/llm_rails.py b/agent_framework_oci/libs/agent_framework/src/agent_framework/guardrails/llm_rails.py index 40c3f901..5f63af43 100644 --- a/agent_framework_oci/libs/agent_framework/src/agent_framework/guardrails/llm_rails.py +++ b/agent_framework_oci/libs/agent_framework/src/agent_framework/guardrails/llm_rails.py @@ -1,5 +1,7 @@ from __future__ import annotations +from agent_framework.llm.structured_output import parse_json_object + import json import logging from typing import Any @@ -102,16 +104,4 @@ def _safe_context(context: dict[str, Any]) -> dict[str, Any]: def _parse_json(raw: Any) -> dict[str, Any]: - text = str(raw or "").strip() - if text.startswith("```"): - text = text.strip("`") - if text.lower().startswith("json"): - text = text[4:].strip() - start = text.find("{") - end = text.rfind("}") - if start >= 0 and end >= start: - text = text[start:end + 1] - data = json.loads(text) - if not isinstance(data, dict): - raise ValueError("LLM guardrail returned non-object JSON") - return data + return parse_json_object(raw) diff --git a/agent_framework_oci/libs/agent_framework/src/agent_framework/guardrails/rails.py b/agent_framework_oci/libs/agent_framework/src/agent_framework/guardrails/rails.py index 4863078d..f8c70c44 100644 --- a/agent_framework_oci/libs/agent_framework/src/agent_framework/guardrails/rails.py +++ b/agent_framework_oci/libs/agent_framework/src/agent_framework/guardrails/rails.py @@ -448,25 +448,69 @@ class ComplianceRail(Guardrail): requer = ctx.get("tipo_fluxo") == "ajuste" or ctx.get("requer_protocolo") is True if not requer: return RailDecision(code=self.code, allowed=True, sanitized_text=None, reason="Compliance Anatel não aplicável", metadata={"calibrated": True}) - expected = list(ctx.get("expected_protocols") or []) - if self._PROTOCOL_PATTERN.search(text or ""): - return RailDecision(code=self.code, allowed=True, reason="Resposta contém protocolo obrigatório", metadata={"calibrated": True}) - patched, missing = self._apply_protocol_fallback(text or "", expected) - if patched != (text or ""): + + original = text or "" + expected = [str(value).strip() for value in (ctx.get("expected_protocols") or []) if str(value).strip()] + + # Quando o workflow informa os protocolos esperados, esses valores são a + # fonte de verdade. Valide-os diretamente no texto (cru ou vocalizado) + # antes de recorrer ao regex genérico. Isso evita tanto falso negativo + # por distância/Markdown quanto falso positivo por um protocolo diferente. + if expected: + patched, missing = self._apply_protocol_fallback(original, expected) + if not missing: + return RailDecision( + code=self.code, + allowed=True, + reason="Resposta contém o(s) protocolo(s) esperado(s)", + sanitized_text=None, + metadata={ + "expected_protocols": expected, + "protocol_validation": "expected_values", + "mechanism": "deterministic", + "calibrated": True, + }, + ) + return RailDecision( code=self.code, allowed=True, reason="Resposta sem protocolo obrigatório; protocolo anexado deterministicamente", sanitized_text=patched, - metadata={"missing_protocols_spoken": missing, "expected_protocols": expected, "mechanism": "deterministic", "calibrated": True}, + metadata={ + "missing_protocols_spoken": missing, + "expected_protocols": expected, + "protocol_validation": "expected_values", + "mechanism": "deterministic", + "calibrated": True, + }, ) + + # Compatibilidade para fluxos legados que exigem protocolo, mas não + # fornecem expected_protocols: nesse caso ainda usamos o reconhecimento + # genérico por regex. + if self._PROTOCOL_PATTERN.search(original): + return RailDecision( + code=self.code, + allowed=True, + reason="Resposta contém protocolo obrigatório", + metadata={ + "protocol_validation": "generic_regex", + "mechanism": "deterministic", + "calibrated": True, + }, + ) + return RailDecision( code=self.code, allowed=False, reason="Resposta de ajuste sem número de protocolo", sanitized_text=text, metadata={ - "expected_protocols": expected, "mechanism": "deterministic", "calibrated": True, + "expected_protocols": expected, + "protocol_validation": "generic_regex", + "mechanism": "deterministic", + "calibrated": True, "terminal_action": "retry", }, ) diff --git a/agent_framework_oci/libs/agent_framework/src/agent_framework/identity/__pycache__/__init__.cpython-313.pyc b/agent_framework_oci/libs/agent_framework/src/agent_framework/identity/__pycache__/__init__.cpython-313.pyc index 2225db2b..8523e2fa 100644 Binary files a/agent_framework_oci/libs/agent_framework/src/agent_framework/identity/__pycache__/__init__.cpython-313.pyc and b/agent_framework_oci/libs/agent_framework/src/agent_framework/identity/__pycache__/__init__.cpython-313.pyc differ diff --git a/agent_framework_oci/libs/agent_framework/src/agent_framework/identity/__pycache__/mcp_mapper.cpython-313.pyc b/agent_framework_oci/libs/agent_framework/src/agent_framework/identity/__pycache__/mcp_mapper.cpython-313.pyc index 2e18081e..4965994c 100644 Binary files a/agent_framework_oci/libs/agent_framework/src/agent_framework/identity/__pycache__/mcp_mapper.cpython-313.pyc and b/agent_framework_oci/libs/agent_framework/src/agent_framework/identity/__pycache__/mcp_mapper.cpython-313.pyc differ diff --git a/agent_framework_oci/libs/agent_framework/src/agent_framework/identity/__pycache__/models.cpython-313.pyc b/agent_framework_oci/libs/agent_framework/src/agent_framework/identity/__pycache__/models.cpython-313.pyc index 692d923f..ce757d7c 100644 Binary files a/agent_framework_oci/libs/agent_framework/src/agent_framework/identity/__pycache__/models.cpython-313.pyc and b/agent_framework_oci/libs/agent_framework/src/agent_framework/identity/__pycache__/models.cpython-313.pyc differ diff --git a/agent_framework_oci/libs/agent_framework/src/agent_framework/identity/__pycache__/resolver.cpython-313.pyc b/agent_framework_oci/libs/agent_framework/src/agent_framework/identity/__pycache__/resolver.cpython-313.pyc index f57e48a8..2a481a84 100644 Binary files a/agent_framework_oci/libs/agent_framework/src/agent_framework/identity/__pycache__/resolver.cpython-313.pyc and b/agent_framework_oci/libs/agent_framework/src/agent_framework/identity/__pycache__/resolver.cpython-313.pyc differ diff --git a/agent_framework_oci/libs/agent_framework/src/agent_framework/judges/__pycache__/__init__.cpython-313.pyc b/agent_framework_oci/libs/agent_framework/src/agent_framework/judges/__pycache__/__init__.cpython-313.pyc index 0e63775d..65d88711 100644 Binary files a/agent_framework_oci/libs/agent_framework/src/agent_framework/judges/__pycache__/__init__.cpython-313.pyc and b/agent_framework_oci/libs/agent_framework/src/agent_framework/judges/__pycache__/__init__.cpython-313.pyc differ diff --git a/agent_framework_oci/libs/agent_framework/src/agent_framework/judges/__pycache__/judge.cpython-313.pyc b/agent_framework_oci/libs/agent_framework/src/agent_framework/judges/__pycache__/judge.cpython-313.pyc index ff3e57dc..22b3d707 100644 Binary files a/agent_framework_oci/libs/agent_framework/src/agent_framework/judges/__pycache__/judge.cpython-313.pyc and b/agent_framework_oci/libs/agent_framework/src/agent_framework/judges/__pycache__/judge.cpython-313.pyc differ diff --git a/agent_framework_oci/libs/agent_framework/src/agent_framework/judges/calibrated/__pycache__/__init__.cpython-313.pyc b/agent_framework_oci/libs/agent_framework/src/agent_framework/judges/calibrated/__pycache__/__init__.cpython-313.pyc index 03f02ab7..7e6b5e89 100644 Binary files a/agent_framework_oci/libs/agent_framework/src/agent_framework/judges/calibrated/__pycache__/__init__.cpython-313.pyc and b/agent_framework_oci/libs/agent_framework/src/agent_framework/judges/calibrated/__pycache__/__init__.cpython-313.pyc differ diff --git a/agent_framework_oci/libs/agent_framework/src/agent_framework/judges/calibrated/__pycache__/llm_client.cpython-313.pyc b/agent_framework_oci/libs/agent_framework/src/agent_framework/judges/calibrated/__pycache__/llm_client.cpython-313.pyc index 721ad48c..03efe846 100644 Binary files a/agent_framework_oci/libs/agent_framework/src/agent_framework/judges/calibrated/__pycache__/llm_client.cpython-313.pyc and b/agent_framework_oci/libs/agent_framework/src/agent_framework/judges/calibrated/__pycache__/llm_client.cpython-313.pyc differ diff --git a/agent_framework_oci/libs/agent_framework/src/agent_framework/judges/calibrated/llm_client.py b/agent_framework_oci/libs/agent_framework/src/agent_framework/judges/calibrated/llm_client.py index c887205e..26f9b5fe 100644 --- a/agent_framework_oci/libs/agent_framework/src/agent_framework/judges/calibrated/llm_client.py +++ b/agent_framework_oci/libs/agent_framework/src/agent_framework/judges/calibrated/llm_client.py @@ -1,5 +1,7 @@ from __future__ import annotations +from agent_framework.llm.structured_output import parse_json_object + import json import logging from typing import Any @@ -80,19 +82,7 @@ class CalibratedJudgeLLMClient: def _parse_json(raw: Any) -> dict[str, Any]: - text = str(raw or '').strip() - if text.startswith('```'): - text = text.strip('`') - if text.lower().startswith('json'): - text = text[4:].strip() - start = text.find('{') - end = text.rfind('}') - if start >= 0 and end >= start: - text = text[start:end + 1] try: - data = json.loads(text) + return parse_json_object(raw) except Exception as exc: - raise ValueError(f'Calibrated judge returned invalid JSON: {str(raw)[:500]}') from exc - if not isinstance(data, dict): - raise ValueError('Calibrated judge returned non-object JSON') - return data + raise ValueError(f'Calibrated judge returned invalid structured output: {str(raw)[:500]}') from exc diff --git a/agent_framework_oci/libs/agent_framework/src/agent_framework/judges/calibrated/prompts/__pycache__/__init__.cpython-313.pyc b/agent_framework_oci/libs/agent_framework/src/agent_framework/judges/calibrated/prompts/__pycache__/__init__.cpython-313.pyc index f323acb0..2c6e05da 100644 Binary files a/agent_framework_oci/libs/agent_framework/src/agent_framework/judges/calibrated/prompts/__pycache__/__init__.cpython-313.pyc and b/agent_framework_oci/libs/agent_framework/src/agent_framework/judges/calibrated/prompts/__pycache__/__init__.cpython-313.pyc differ diff --git a/agent_framework_oci/libs/agent_framework/src/agent_framework/judges/calibrated/prompts/__pycache__/aluc.cpython-313.pyc b/agent_framework_oci/libs/agent_framework/src/agent_framework/judges/calibrated/prompts/__pycache__/aluc.cpython-313.pyc index aba5f04b..7eeb1422 100644 Binary files a/agent_framework_oci/libs/agent_framework/src/agent_framework/judges/calibrated/prompts/__pycache__/aluc.cpython-313.pyc and b/agent_framework_oci/libs/agent_framework/src/agent_framework/judges/calibrated/prompts/__pycache__/aluc.cpython-313.pyc differ diff --git a/agent_framework_oci/libs/agent_framework/src/agent_framework/judges/calibrated/prompts/__pycache__/csi.cpython-313.pyc b/agent_framework_oci/libs/agent_framework/src/agent_framework/judges/calibrated/prompts/__pycache__/csi.cpython-313.pyc index 9d2d08e5..7dd5a209 100644 Binary files a/agent_framework_oci/libs/agent_framework/src/agent_framework/judges/calibrated/prompts/__pycache__/csi.cpython-313.pyc and b/agent_framework_oci/libs/agent_framework/src/agent_framework/judges/calibrated/prompts/__pycache__/csi.cpython-313.pyc differ diff --git a/agent_framework_oci/libs/agent_framework/src/agent_framework/judges/calibrated/prompts/__pycache__/fallback.cpython-313.pyc b/agent_framework_oci/libs/agent_framework/src/agent_framework/judges/calibrated/prompts/__pycache__/fallback.cpython-313.pyc index f5734cac..95a4f911 100644 Binary files a/agent_framework_oci/libs/agent_framework/src/agent_framework/judges/calibrated/prompts/__pycache__/fallback.cpython-313.pyc and b/agent_framework_oci/libs/agent_framework/src/agent_framework/judges/calibrated/prompts/__pycache__/fallback.cpython-313.pyc differ diff --git a/agent_framework_oci/libs/agent_framework/src/agent_framework/judges/calibrated/prompts/__pycache__/rqlt.cpython-313.pyc b/agent_framework_oci/libs/agent_framework/src/agent_framework/judges/calibrated/prompts/__pycache__/rqlt.cpython-313.pyc index b517b93d..0ca27c9c 100644 Binary files a/agent_framework_oci/libs/agent_framework/src/agent_framework/judges/calibrated/prompts/__pycache__/rqlt.cpython-313.pyc and b/agent_framework_oci/libs/agent_framework/src/agent_framework/judges/calibrated/prompts/__pycache__/rqlt.cpython-313.pyc differ diff --git a/agent_framework_oci/libs/agent_framework/src/agent_framework/judges/calibrated/prompts/__pycache__/vctn.cpython-313.pyc b/agent_framework_oci/libs/agent_framework/src/agent_framework/judges/calibrated/prompts/__pycache__/vctn.cpython-313.pyc index 352b02a1..c35712e6 100644 Binary files a/agent_framework_oci/libs/agent_framework/src/agent_framework/judges/calibrated/prompts/__pycache__/vctn.cpython-313.pyc and b/agent_framework_oci/libs/agent_framework/src/agent_framework/judges/calibrated/prompts/__pycache__/vctn.cpython-313.pyc differ diff --git a/agent_framework_oci/libs/agent_framework/src/agent_framework/judges/judge.py b/agent_framework_oci/libs/agent_framework/src/agent_framework/judges/judge.py index 3432983e..fbac24fd 100644 --- a/agent_framework_oci/libs/agent_framework/src/agent_framework/judges/judge.py +++ b/agent_framework_oci/libs/agent_framework/src/agent_framework/judges/judge.py @@ -1,5 +1,7 @@ from __future__ import annotations +from agent_framework.llm.structured_output import parse_json_object + import json import hashlib import logging @@ -646,16 +648,4 @@ def _safe_context(context: dict[str, Any]) -> dict[str, Any]: def _parse_json(raw: Any) -> dict[str, Any]: - text = str(raw or '').strip() - if text.startswith('```'): - text = text.strip('`') - if text.lower().startswith('json'): - text = text[4:].strip() - start = text.find('{') - end = text.rfind('}') - if start >= 0 and end >= start: - text = text[start:end + 1] - data = json.loads(text) - if not isinstance(data, dict): - raise ValueError('LLM judge returned non-object JSON') - return data + return parse_json_object(raw) diff --git a/agent_framework_oci/libs/agent_framework/src/agent_framework/llm/__init__.py b/agent_framework_oci/libs/agent_framework/src/agent_framework/llm/__init__.py index 458e73ca..27d7b8f2 100644 --- a/agent_framework_oci/libs/agent_framework/src/agent_framework/llm/__init__.py +++ b/agent_framework_oci/libs/agent_framework/src/agent_framework/llm/__init__.py @@ -1,4 +1,11 @@ from .base import LLMProvider from .types import LLMResponse +from .structured_output import StructuredOutputError, parse_json_object, parse_structured_output -__all__ = ["LLMProvider", "LLMResponse"] +__all__ = [ + "LLMProvider", + "LLMResponse", + "StructuredOutputError", + "parse_json_object", + "parse_structured_output", +] diff --git a/agent_framework_oci/libs/agent_framework/src/agent_framework/llm/__pycache__/__init__.cpython-313.pyc b/agent_framework_oci/libs/agent_framework/src/agent_framework/llm/__pycache__/__init__.cpython-313.pyc index 953fbdbb..c0dafc30 100644 Binary files a/agent_framework_oci/libs/agent_framework/src/agent_framework/llm/__pycache__/__init__.cpython-313.pyc and b/agent_framework_oci/libs/agent_framework/src/agent_framework/llm/__pycache__/__init__.cpython-313.pyc differ diff --git a/agent_framework_oci/libs/agent_framework/src/agent_framework/llm/__pycache__/base.cpython-313.pyc b/agent_framework_oci/libs/agent_framework/src/agent_framework/llm/__pycache__/base.cpython-313.pyc index 3fc0e837..ae721c45 100644 Binary files a/agent_framework_oci/libs/agent_framework/src/agent_framework/llm/__pycache__/base.cpython-313.pyc and b/agent_framework_oci/libs/agent_framework/src/agent_framework/llm/__pycache__/base.cpython-313.pyc differ diff --git a/agent_framework_oci/libs/agent_framework/src/agent_framework/llm/__pycache__/profile_resolver.cpython-313.pyc b/agent_framework_oci/libs/agent_framework/src/agent_framework/llm/__pycache__/profile_resolver.cpython-313.pyc index 99557e8e..6fe3ec35 100644 Binary files a/agent_framework_oci/libs/agent_framework/src/agent_framework/llm/__pycache__/profile_resolver.cpython-313.pyc and b/agent_framework_oci/libs/agent_framework/src/agent_framework/llm/__pycache__/profile_resolver.cpython-313.pyc differ diff --git a/agent_framework_oci/libs/agent_framework/src/agent_framework/llm/__pycache__/providers.cpython-313.pyc b/agent_framework_oci/libs/agent_framework/src/agent_framework/llm/__pycache__/providers.cpython-313.pyc index 254b973c..72a3a3f5 100644 Binary files a/agent_framework_oci/libs/agent_framework/src/agent_framework/llm/__pycache__/providers.cpython-313.pyc and b/agent_framework_oci/libs/agent_framework/src/agent_framework/llm/__pycache__/providers.cpython-313.pyc differ diff --git a/agent_framework_oci/libs/agent_framework/src/agent_framework/llm/__pycache__/structured_output.cpython-313.pyc b/agent_framework_oci/libs/agent_framework/src/agent_framework/llm/__pycache__/structured_output.cpython-313.pyc new file mode 100644 index 00000000..9664a079 Binary files /dev/null and b/agent_framework_oci/libs/agent_framework/src/agent_framework/llm/__pycache__/structured_output.cpython-313.pyc differ diff --git a/agent_framework_oci/libs/agent_framework/src/agent_framework/llm/__pycache__/types.cpython-313.pyc b/agent_framework_oci/libs/agent_framework/src/agent_framework/llm/__pycache__/types.cpython-313.pyc index bffe0c28..50a78169 100644 Binary files a/agent_framework_oci/libs/agent_framework/src/agent_framework/llm/__pycache__/types.cpython-313.pyc and b/agent_framework_oci/libs/agent_framework/src/agent_framework/llm/__pycache__/types.cpython-313.pyc differ diff --git a/agent_framework_oci/libs/agent_framework/src/agent_framework/llm/profile_resolver.py b/agent_framework_oci/libs/agent_framework/src/agent_framework/llm/profile_resolver.py index 3372658c..90ea4e1a 100644 --- a/agent_framework_oci/libs/agent_framework/src/agent_framework/llm/profile_resolver.py +++ b/agent_framework_oci/libs/agent_framework/src/agent_framework/llm/profile_resolver.py @@ -63,7 +63,7 @@ class LLMProfileResolver: if self.enabled: self._profiles = self._load_profiles(self.path) - logger.info("LLM profiles enabled path=%s profiles=%s", self.path, sorted(self._profiles.keys())) + logger.info("LLM profiles enabled path=%s profiles=%s", self.path.resolve(), sorted(self._profiles.keys())) else: logger.info("LLM profiles disabled; using .env settings only") diff --git a/agent_framework_oci/libs/agent_framework/src/agent_framework/llm/providers.py b/agent_framework_oci/libs/agent_framework/src/agent_framework/llm/providers.py index aeb7c6a8..d8765ce0 100644 --- a/agent_framework_oci/libs/agent_framework/src/agent_framework/llm/providers.py +++ b/agent_framework_oci/libs/agent_framework/src/agent_framework/llm/providers.py @@ -58,6 +58,55 @@ def _coerce_reasoning_text(value: Any) -> str | None: return text or None +def _coerce_message_content(value: Any) -> str: + """Normalize OpenAI-compatible message content without using reasoning as answer. + + OpenAI-compatible implementations may expose ``message.content`` as a plain + string, a list of content parts, or SDK objects/dicts containing ``text``. + Unknown shapes fail closed to an empty string instead of serializing the raw + response object into the assistant answer. + """ + if value is None: + return "" + if isinstance(value, str): + return value + if isinstance(value, (list, tuple)): + chunks: list[str] = [] + for item in value: + if isinstance(item, str): + chunks.append(item) + continue + if isinstance(item, dict): + text = item.get("text") + if isinstance(text, str): + chunks.append(text) + continue + text = getattr(item, "text", None) + if isinstance(text, str): + chunks.append(text) + return "".join(chunks) + if isinstance(value, dict): + text = value.get("text") + return text if isinstance(text, str) else "" + text = getattr(value, "text", None) + return text if isinstance(text, str) else "" + + +def _extract_openai_message_content(message: Any) -> str: + if message is None: + return "" + if isinstance(message, dict): + return _coerce_message_content(message.get("content")) + return _coerce_message_content(getattr(message, "content", None)) + + +def _extract_finish_reason(choice: Any) -> str | None: + if choice is None: + return None + value = choice.get("finish_reason") if isinstance(choice, dict) else getattr(choice, "finish_reason", None) + return str(value) if value is not None else None + + def _extract_reasoning_content(obj: Any) -> str | None: """Best-effort extraction across OpenAI-compatible and OCI response shapes.""" if obj is None: @@ -432,9 +481,29 @@ class OCICompatibleOpenAIProvider(LLMProvider): model_parameters=model_parameters, ) as generation: resp = await client.chat.completions.create(**request_kwargs) - message = resp.choices[0].message - answer = message.content or "" - reasoning_content = _extract_reasoning_content(message) + choices = getattr(resp, "choices", None) or [] + if not choices: + message = None + answer = "" + reasoning_content = None + finish_reason = None + logger.warning( + "OpenAI-compatible LLM returned no choices provider=%s model=%s profile=%s component=%s", + provider, model, resolved_profile_name, component_name, + ) + else: + choice = choices[0] + message = choice.get("message") if isinstance(choice, dict) else getattr(choice, "message", None) + answer = _extract_openai_message_content(message) + reasoning_content = _extract_reasoning_content(message) + finish_reason = _extract_finish_reason(choice) + + logger.info( + "OpenAI-compatible LLM response provider=%s model=%s profile=%s component=%s " + "finish_reason=%s content_len=%d reasoning_len=%d", + provider, model, resolved_profile_name, component_name, + finish_reason, len(answer), len(reasoning_content or ""), + ) usage_metadata = self.token_collector.enrich(model, getattr(resp, "usage", None)) usage_metadata.update({ @@ -445,8 +514,16 @@ class OCICompatibleOpenAIProvider(LLMProvider): "component": component_name, "model": model, "provider": provider, + "finish_reason": finish_reason, + "content_length": len(answer), + "reasoning_content_length": len(reasoning_content or ""), **model_parameters, }) + llm_metadata.update({ + "finish_reason": finish_reason, + "content_length": len(answer), + "reasoning_content_length": len(reasoning_content or ""), + }) generation.set_output(answer) generation.set_usage(usage_metadata) generation.set_metadata(**usage_metadata) diff --git a/agent_framework_oci/libs/agent_framework/src/agent_framework/llm/structured_output.py b/agent_framework_oci/libs/agent_framework/src/agent_framework/llm/structured_output.py new file mode 100644 index 00000000..245a7bb4 --- /dev/null +++ b/agent_framework_oci/libs/agent_framework/src/agent_framework/llm/structured_output.py @@ -0,0 +1,181 @@ +"""Robust parsing helpers for structured LLM outputs. + +LLMs do not always honor a strict JSON-only contract. In particular, a model +may wrap the payload in prose/markdown or emit a Python-literal-like mapping +using single quotes, ``True``/``False`` and ``None``. This module provides the +single normalization boundary for *LLM-originated* structured output. + +It must not be used for persistence/configuration JSON, which should remain +strict. +""" +from __future__ import annotations + +import ast +import json +import re +from typing import Any, TypeVar + +T = TypeVar("T") + + +class StructuredOutputError(ValueError): + """Raised when an LLM response cannot be parsed as the expected structure.""" + + +def _response_text(raw: Any) -> str: + """Best-effort extraction of textual content from common LLM response shapes.""" + if raw is None: + return "" + if isinstance(raw, str): + return raw + if isinstance(raw, (dict, list)): + # Already structured: caller can pass it directly to parse_structured_output. + return str(raw) + content = getattr(raw, "content", None) + if content is not None: + if isinstance(content, str): + return content + if isinstance(content, list): + parts: list[str] = [] + for part in content: + if isinstance(part, dict): + parts.append(str(part.get("text") or part.get("content") or "")) + else: + parts.append(str(getattr(part, "text", part))) + return "".join(parts) + return str(content) + return str(raw) + + +def _strip_markdown_fences(text: str) -> str: + stripped = text.strip() + # Only strip an outer fence. Embedded fences are handled by structure extraction. + match = re.fullmatch( + r"```(?:json|javascript|python|py)?\s*(.*?)\s*```", + stripped, + flags=re.IGNORECASE | re.DOTALL, + ) + return match.group(1).strip() if match else stripped + + +def _balanced_candidates(text: str) -> list[str]: + """Return balanced top-level object/array substrings, respecting quoted strings.""" + candidates: list[str] = [] + pairs = {"{": "}", "[": "]"} + i = 0 + while i < len(text): + opener = text[i] + if opener not in pairs: + i += 1 + continue + + stack: list[str] = [pairs[opener]] + in_string = False + quote = "" + escaped = False + j = i + 1 + while j < len(text): + ch = text[j] + if in_string: + if escaped: + escaped = False + elif ch == "\\": + escaped = True + elif ch == quote: + in_string = False + j += 1 + continue + + if ch in {"'", '"'}: + in_string = True + quote = ch + elif ch in pairs: + stack.append(pairs[ch]) + elif stack and ch == stack[-1]: + stack.pop() + if not stack: + candidates.append(text[i : j + 1]) + i = j + break + j += 1 + i += 1 + return candidates + + +def _parse_candidate(candidate: str) -> Any: + try: + return json.loads(candidate) + except (json.JSONDecodeError, TypeError, ValueError): + pass + + # Safe fallback for Python-literal-like model output, e.g. + # {'decision': 'KEEP', 'confidence': 0.9, 'ok': True, 'reason': None} + try: + return ast.literal_eval(candidate) + except (ValueError, SyntaxError) as exc: + raise StructuredOutputError("candidate is neither valid JSON nor a safe Python literal") from exc + + +def parse_structured_output( + raw: Any, + *, + expected_type: type[T] | tuple[type[Any], ...] | None = None, +) -> Any | T: + """Parse structured output returned by an LLM. + + Accepted forms include: + - strict JSON; + - an already-materialized dict/list; + - fenced JSON/Python literals; + - prose before/after a balanced ``{...}`` or ``[...]`` payload; + - Python-literal-style mappings using single quotes/True/False/None. + + ``eval`` is intentionally never used. ``ast.literal_eval`` is the final, + safe syntax fallback. + """ + if expected_type is not None and isinstance(raw, expected_type): + return raw + if isinstance(raw, (dict, list)): + value: Any = raw + else: + text = _strip_markdown_fences(_response_text(raw)) + if not text: + raise StructuredOutputError("LLM returned an empty structured response") + + try: + value = _parse_candidate(text) + except StructuredOutputError: + value = None + errors: list[str] = [] + for candidate in _balanced_candidates(text): + try: + parsed = _parse_candidate(candidate) + except StructuredOutputError as exc: + errors.append(str(exc)) + continue + if expected_type is None or isinstance(parsed, expected_type): + value = parsed + break + if value is None: + preview = text[:500].replace("\n", "\\n") + raise StructuredOutputError( + f"Could not parse structured LLM response: {preview!r}" + ) + + if expected_type is not None and not isinstance(value, expected_type): + if isinstance(expected_type, tuple): + expected = ", ".join(t.__name__ for t in expected_type) + else: + expected = expected_type.__name__ + raise StructuredOutputError( + f"Structured LLM response must be {expected}; got {type(value).__name__}" + ) + return value + + +def parse_json_object(raw: Any) -> dict[str, Any]: + """Convenience wrapper for the most common framework contract: a JSON object.""" + return parse_structured_output(raw, expected_type=dict) + + +__all__ = ["StructuredOutputError", "parse_structured_output", "parse_json_object"] diff --git a/agent_framework_oci/libs/agent_framework/src/agent_framework/mcp/__pycache__/__init__.cpython-313.pyc b/agent_framework_oci/libs/agent_framework/src/agent_framework/mcp/__pycache__/__init__.cpython-313.pyc index 5a278b73..b683e477 100644 Binary files a/agent_framework_oci/libs/agent_framework/src/agent_framework/mcp/__pycache__/__init__.cpython-313.pyc and b/agent_framework_oci/libs/agent_framework/src/agent_framework/mcp/__pycache__/__init__.cpython-313.pyc differ diff --git a/agent_framework_oci/libs/agent_framework/src/agent_framework/mcp/__pycache__/client.cpython-313.pyc b/agent_framework_oci/libs/agent_framework/src/agent_framework/mcp/__pycache__/client.cpython-313.pyc index d3d049de..cc89f5e4 100644 Binary files a/agent_framework_oci/libs/agent_framework/src/agent_framework/mcp/__pycache__/client.cpython-313.pyc and b/agent_framework_oci/libs/agent_framework/src/agent_framework/mcp/__pycache__/client.cpython-313.pyc differ diff --git a/agent_framework_oci/libs/agent_framework/src/agent_framework/mcp/__pycache__/models.cpython-313.pyc b/agent_framework_oci/libs/agent_framework/src/agent_framework/mcp/__pycache__/models.cpython-313.pyc index 12989e6f..0f9e4af8 100644 Binary files a/agent_framework_oci/libs/agent_framework/src/agent_framework/mcp/__pycache__/models.cpython-313.pyc and b/agent_framework_oci/libs/agent_framework/src/agent_framework/mcp/__pycache__/models.cpython-313.pyc differ diff --git a/agent_framework_oci/libs/agent_framework/src/agent_framework/mcp/__pycache__/registry.cpython-313.pyc b/agent_framework_oci/libs/agent_framework/src/agent_framework/mcp/__pycache__/registry.cpython-313.pyc index 51e8f3dc..62cf5815 100644 Binary files a/agent_framework_oci/libs/agent_framework/src/agent_framework/mcp/__pycache__/registry.cpython-313.pyc and b/agent_framework_oci/libs/agent_framework/src/agent_framework/mcp/__pycache__/registry.cpython-313.pyc differ diff --git a/agent_framework_oci/libs/agent_framework/src/agent_framework/mcp/__pycache__/tool_policy.cpython-313.pyc b/agent_framework_oci/libs/agent_framework/src/agent_framework/mcp/__pycache__/tool_policy.cpython-313.pyc index c354322b..41f361c4 100644 Binary files a/agent_framework_oci/libs/agent_framework/src/agent_framework/mcp/__pycache__/tool_policy.cpython-313.pyc and b/agent_framework_oci/libs/agent_framework/src/agent_framework/mcp/__pycache__/tool_policy.cpython-313.pyc differ diff --git a/agent_framework_oci/libs/agent_framework/src/agent_framework/mcp/__pycache__/tool_router.cpython-313.pyc b/agent_framework_oci/libs/agent_framework/src/agent_framework/mcp/__pycache__/tool_router.cpython-313.pyc index 92e1fbf1..a2184ab2 100644 Binary files a/agent_framework_oci/libs/agent_framework/src/agent_framework/mcp/__pycache__/tool_router.cpython-313.pyc and b/agent_framework_oci/libs/agent_framework/src/agent_framework/mcp/__pycache__/tool_router.cpython-313.pyc differ diff --git a/agent_framework_oci/libs/agent_framework/src/agent_framework/memory/__pycache__/__init__.cpython-313.pyc b/agent_framework_oci/libs/agent_framework/src/agent_framework/memory/__pycache__/__init__.cpython-313.pyc index 7ae88b6d..1455ef5f 100644 Binary files a/agent_framework_oci/libs/agent_framework/src/agent_framework/memory/__pycache__/__init__.cpython-313.pyc and b/agent_framework_oci/libs/agent_framework/src/agent_framework/memory/__pycache__/__init__.cpython-313.pyc differ diff --git a/agent_framework_oci/libs/agent_framework/src/agent_framework/memory/__pycache__/long_term_extractor.cpython-313.pyc b/agent_framework_oci/libs/agent_framework/src/agent_framework/memory/__pycache__/long_term_extractor.cpython-313.pyc index 6f94b5cd..bf72c59f 100644 Binary files a/agent_framework_oci/libs/agent_framework/src/agent_framework/memory/__pycache__/long_term_extractor.cpython-313.pyc and b/agent_framework_oci/libs/agent_framework/src/agent_framework/memory/__pycache__/long_term_extractor.cpython-313.pyc differ diff --git a/agent_framework_oci/libs/agent_framework/src/agent_framework/memory/__pycache__/long_term_memory.cpython-313.pyc b/agent_framework_oci/libs/agent_framework/src/agent_framework/memory/__pycache__/long_term_memory.cpython-313.pyc index 84cf39de..79c43f7c 100644 Binary files a/agent_framework_oci/libs/agent_framework/src/agent_framework/memory/__pycache__/long_term_memory.cpython-313.pyc and b/agent_framework_oci/libs/agent_framework/src/agent_framework/memory/__pycache__/long_term_memory.cpython-313.pyc differ diff --git a/agent_framework_oci/libs/agent_framework/src/agent_framework/memory/__pycache__/long_term_models.cpython-313.pyc b/agent_framework_oci/libs/agent_framework/src/agent_framework/memory/__pycache__/long_term_models.cpython-313.pyc index a317c2d6..4cade824 100644 Binary files a/agent_framework_oci/libs/agent_framework/src/agent_framework/memory/__pycache__/long_term_models.cpython-313.pyc and b/agent_framework_oci/libs/agent_framework/src/agent_framework/memory/__pycache__/long_term_models.cpython-313.pyc differ diff --git a/agent_framework_oci/libs/agent_framework/src/agent_framework/memory/__pycache__/long_term_store.cpython-313.pyc b/agent_framework_oci/libs/agent_framework/src/agent_framework/memory/__pycache__/long_term_store.cpython-313.pyc index 1a322bb9..bcdd6942 100644 Binary files a/agent_framework_oci/libs/agent_framework/src/agent_framework/memory/__pycache__/long_term_store.cpython-313.pyc and b/agent_framework_oci/libs/agent_framework/src/agent_framework/memory/__pycache__/long_term_store.cpython-313.pyc differ diff --git a/agent_framework_oci/libs/agent_framework/src/agent_framework/memory/__pycache__/message_history.cpython-313.pyc b/agent_framework_oci/libs/agent_framework/src/agent_framework/memory/__pycache__/message_history.cpython-313.pyc index 4dc396ca..34726766 100644 Binary files a/agent_framework_oci/libs/agent_framework/src/agent_framework/memory/__pycache__/message_history.cpython-313.pyc and b/agent_framework_oci/libs/agent_framework/src/agent_framework/memory/__pycache__/message_history.cpython-313.pyc differ diff --git a/agent_framework_oci/libs/agent_framework/src/agent_framework/memory/__pycache__/summary_memory.cpython-313.pyc b/agent_framework_oci/libs/agent_framework/src/agent_framework/memory/__pycache__/summary_memory.cpython-313.pyc index a27f27e2..837ee366 100644 Binary files a/agent_framework_oci/libs/agent_framework/src/agent_framework/memory/__pycache__/summary_memory.cpython-313.pyc and b/agent_framework_oci/libs/agent_framework/src/agent_framework/memory/__pycache__/summary_memory.cpython-313.pyc differ diff --git a/agent_framework_oci/libs/agent_framework/src/agent_framework/memory/__pycache__/summary_store.cpython-313.pyc b/agent_framework_oci/libs/agent_framework/src/agent_framework/memory/__pycache__/summary_store.cpython-313.pyc index 55be2b90..37d834a6 100644 Binary files a/agent_framework_oci/libs/agent_framework/src/agent_framework/memory/__pycache__/summary_store.cpython-313.pyc and b/agent_framework_oci/libs/agent_framework/src/agent_framework/memory/__pycache__/summary_store.cpython-313.pyc differ diff --git a/agent_framework_oci/libs/agent_framework/src/agent_framework/models/__pycache__/__init__.cpython-313.pyc b/agent_framework_oci/libs/agent_framework/src/agent_framework/models/__pycache__/__init__.cpython-313.pyc index 10af14f4..58daae4e 100644 Binary files a/agent_framework_oci/libs/agent_framework/src/agent_framework/models/__pycache__/__init__.cpython-313.pyc and b/agent_framework_oci/libs/agent_framework/src/agent_framework/models/__pycache__/__init__.cpython-313.pyc differ diff --git a/agent_framework_oci/libs/agent_framework/src/agent_framework/models/__pycache__/identity.cpython-313.pyc b/agent_framework_oci/libs/agent_framework/src/agent_framework/models/__pycache__/identity.cpython-313.pyc index f3e25cc7..806a5437 100644 Binary files a/agent_framework_oci/libs/agent_framework/src/agent_framework/models/__pycache__/identity.cpython-313.pyc and b/agent_framework_oci/libs/agent_framework/src/agent_framework/models/__pycache__/identity.cpython-313.pyc differ diff --git a/agent_framework_oci/libs/agent_framework/src/agent_framework/models/__pycache__/session.cpython-313.pyc b/agent_framework_oci/libs/agent_framework/src/agent_framework/models/__pycache__/session.cpython-313.pyc index cbe3fd24..4a12ed17 100644 Binary files a/agent_framework_oci/libs/agent_framework/src/agent_framework/models/__pycache__/session.cpython-313.pyc and b/agent_framework_oci/libs/agent_framework/src/agent_framework/models/__pycache__/session.cpython-313.pyc differ diff --git a/agent_framework_oci/libs/agent_framework/src/agent_framework/observability/__pycache__/__init__.cpython-313.pyc b/agent_framework_oci/libs/agent_framework/src/agent_framework/observability/__pycache__/__init__.cpython-313.pyc index 16ebb80a..1f1d73f0 100644 Binary files a/agent_framework_oci/libs/agent_framework/src/agent_framework/observability/__pycache__/__init__.cpython-313.pyc and b/agent_framework_oci/libs/agent_framework/src/agent_framework/observability/__pycache__/__init__.cpython-313.pyc differ diff --git a/agent_framework_oci/libs/agent_framework/src/agent_framework/observability/__pycache__/code_mapper.cpython-313.pyc b/agent_framework_oci/libs/agent_framework/src/agent_framework/observability/__pycache__/code_mapper.cpython-313.pyc index 5d5e75e4..8e925166 100644 Binary files a/agent_framework_oci/libs/agent_framework/src/agent_framework/observability/__pycache__/code_mapper.cpython-313.pyc and b/agent_framework_oci/libs/agent_framework/src/agent_framework/observability/__pycache__/code_mapper.cpython-313.pyc differ diff --git a/agent_framework_oci/libs/agent_framework/src/agent_framework/observability/__pycache__/context.cpython-313.pyc b/agent_framework_oci/libs/agent_framework/src/agent_framework/observability/__pycache__/context.cpython-313.pyc index 466aa0ea..7a83068a 100644 Binary files a/agent_framework_oci/libs/agent_framework/src/agent_framework/observability/__pycache__/context.cpython-313.pyc and b/agent_framework_oci/libs/agent_framework/src/agent_framework/observability/__pycache__/context.cpython-313.pyc differ diff --git a/agent_framework_oci/libs/agent_framework/src/agent_framework/observability/__pycache__/event_bus.cpython-313.pyc b/agent_framework_oci/libs/agent_framework/src/agent_framework/observability/__pycache__/event_bus.cpython-313.pyc index 5306ee20..45b240ca 100644 Binary files a/agent_framework_oci/libs/agent_framework/src/agent_framework/observability/__pycache__/event_bus.cpython-313.pyc and b/agent_framework_oci/libs/agent_framework/src/agent_framework/observability/__pycache__/event_bus.cpython-313.pyc differ diff --git a/agent_framework_oci/libs/agent_framework/src/agent_framework/observability/__pycache__/guardrail_events.cpython-313.pyc b/agent_framework_oci/libs/agent_framework/src/agent_framework/observability/__pycache__/guardrail_events.cpython-313.pyc index 3c2dd38b..5ca30979 100644 Binary files a/agent_framework_oci/libs/agent_framework/src/agent_framework/observability/__pycache__/guardrail_events.cpython-313.pyc and b/agent_framework_oci/libs/agent_framework/src/agent_framework/observability/__pycache__/guardrail_events.cpython-313.pyc differ diff --git a/agent_framework_oci/libs/agent_framework/src/agent_framework/observability/__pycache__/ic_events.cpython-313.pyc b/agent_framework_oci/libs/agent_framework/src/agent_framework/observability/__pycache__/ic_events.cpython-313.pyc index c0ea5e17..f469a9d6 100644 Binary files a/agent_framework_oci/libs/agent_framework/src/agent_framework/observability/__pycache__/ic_events.cpython-313.pyc and b/agent_framework_oci/libs/agent_framework/src/agent_framework/observability/__pycache__/ic_events.cpython-313.pyc differ diff --git a/agent_framework_oci/libs/agent_framework/src/agent_framework/observability/__pycache__/judge_events.cpython-313.pyc b/agent_framework_oci/libs/agent_framework/src/agent_framework/observability/__pycache__/judge_events.cpython-313.pyc index 4efb693a..36dc5768 100644 Binary files a/agent_framework_oci/libs/agent_framework/src/agent_framework/observability/__pycache__/judge_events.cpython-313.pyc and b/agent_framework_oci/libs/agent_framework/src/agent_framework/observability/__pycache__/judge_events.cpython-313.pyc differ diff --git a/agent_framework_oci/libs/agent_framework/src/agent_framework/observability/__pycache__/langgraph_telemetry.cpython-313.pyc b/agent_framework_oci/libs/agent_framework/src/agent_framework/observability/__pycache__/langgraph_telemetry.cpython-313.pyc index 4405b9f4..fe0bd9c2 100644 Binary files a/agent_framework_oci/libs/agent_framework/src/agent_framework/observability/__pycache__/langgraph_telemetry.cpython-313.pyc and b/agent_framework_oci/libs/agent_framework/src/agent_framework/observability/__pycache__/langgraph_telemetry.cpython-313.pyc differ diff --git a/agent_framework_oci/libs/agent_framework/src/agent_framework/observability/__pycache__/llm_advisors.cpython-313.pyc b/agent_framework_oci/libs/agent_framework/src/agent_framework/observability/__pycache__/llm_advisors.cpython-313.pyc index 48aaa792..fce47995 100644 Binary files a/agent_framework_oci/libs/agent_framework/src/agent_framework/observability/__pycache__/llm_advisors.cpython-313.pyc and b/agent_framework_oci/libs/agent_framework/src/agent_framework/observability/__pycache__/llm_advisors.cpython-313.pyc differ diff --git a/agent_framework_oci/libs/agent_framework/src/agent_framework/observability/__pycache__/noc_contract.cpython-313.pyc b/agent_framework_oci/libs/agent_framework/src/agent_framework/observability/__pycache__/noc_contract.cpython-313.pyc index 3b16de7f..fd18fc0d 100644 Binary files a/agent_framework_oci/libs/agent_framework/src/agent_framework/observability/__pycache__/noc_contract.cpython-313.pyc and b/agent_framework_oci/libs/agent_framework/src/agent_framework/observability/__pycache__/noc_contract.cpython-313.pyc differ diff --git a/agent_framework_oci/libs/agent_framework/src/agent_framework/observability/__pycache__/noc_otel.cpython-313.pyc b/agent_framework_oci/libs/agent_framework/src/agent_framework/observability/__pycache__/noc_otel.cpython-313.pyc index 2d37d6d6..ccb1323e 100644 Binary files a/agent_framework_oci/libs/agent_framework/src/agent_framework/observability/__pycache__/noc_otel.cpython-313.pyc and b/agent_framework_oci/libs/agent_framework/src/agent_framework/observability/__pycache__/noc_otel.cpython-313.pyc differ diff --git a/agent_framework_oci/libs/agent_framework/src/agent_framework/observability/__pycache__/observer.cpython-313.pyc b/agent_framework_oci/libs/agent_framework/src/agent_framework/observability/__pycache__/observer.cpython-313.pyc index d17dce19..a3401174 100644 Binary files a/agent_framework_oci/libs/agent_framework/src/agent_framework/observability/__pycache__/observer.cpython-313.pyc and b/agent_framework_oci/libs/agent_framework/src/agent_framework/observability/__pycache__/observer.cpython-313.pyc differ diff --git a/agent_framework_oci/libs/agent_framework/src/agent_framework/observability/__pycache__/otel.cpython-313.pyc b/agent_framework_oci/libs/agent_framework/src/agent_framework/observability/__pycache__/otel.cpython-313.pyc index 25ec5858..185c1fda 100644 Binary files a/agent_framework_oci/libs/agent_framework/src/agent_framework/observability/__pycache__/otel.cpython-313.pyc and b/agent_framework_oci/libs/agent_framework/src/agent_framework/observability/__pycache__/otel.cpython-313.pyc differ diff --git a/agent_framework_oci/libs/agent_framework/src/agent_framework/observability/__pycache__/streaming_events.cpython-313.pyc b/agent_framework_oci/libs/agent_framework/src/agent_framework/observability/__pycache__/streaming_events.cpython-313.pyc index 2c7fb3e9..5a623de4 100644 Binary files a/agent_framework_oci/libs/agent_framework/src/agent_framework/observability/__pycache__/streaming_events.cpython-313.pyc and b/agent_framework_oci/libs/agent_framework/src/agent_framework/observability/__pycache__/streaming_events.cpython-313.pyc differ diff --git a/agent_framework_oci/libs/agent_framework/src/agent_framework/observability/__pycache__/telemetry.cpython-313.pyc b/agent_framework_oci/libs/agent_framework/src/agent_framework/observability/__pycache__/telemetry.cpython-313.pyc index 8fd1dd21..95e89493 100644 Binary files a/agent_framework_oci/libs/agent_framework/src/agent_framework/observability/__pycache__/telemetry.cpython-313.pyc and b/agent_framework_oci/libs/agent_framework/src/agent_framework/observability/__pycache__/telemetry.cpython-313.pyc differ diff --git a/agent_framework_oci/libs/agent_framework/src/agent_framework/observability/__pycache__/token_cost.cpython-313.pyc b/agent_framework_oci/libs/agent_framework/src/agent_framework/observability/__pycache__/token_cost.cpython-313.pyc index 5ddf5a03..42a053ea 100644 Binary files a/agent_framework_oci/libs/agent_framework/src/agent_framework/observability/__pycache__/token_cost.cpython-313.pyc and b/agent_framework_oci/libs/agent_framework/src/agent_framework/observability/__pycache__/token_cost.cpython-313.pyc differ diff --git a/agent_framework_oci/libs/agent_framework/src/agent_framework/observability/__pycache__/workflow_events.cpython-313.pyc b/agent_framework_oci/libs/agent_framework/src/agent_framework/observability/__pycache__/workflow_events.cpython-313.pyc index c387e65b..6bc687d2 100644 Binary files a/agent_framework_oci/libs/agent_framework/src/agent_framework/observability/__pycache__/workflow_events.cpython-313.pyc and b/agent_framework_oci/libs/agent_framework/src/agent_framework/observability/__pycache__/workflow_events.cpython-313.pyc differ diff --git a/agent_framework_oci/libs/agent_framework/src/agent_framework/oci/__pycache__/__init__.cpython-313.pyc b/agent_framework_oci/libs/agent_framework/src/agent_framework/oci/__pycache__/__init__.cpython-313.pyc index 5d5ff8bd..cf48e749 100644 Binary files a/agent_framework_oci/libs/agent_framework/src/agent_framework/oci/__pycache__/__init__.cpython-313.pyc and b/agent_framework_oci/libs/agent_framework/src/agent_framework/oci/__pycache__/__init__.cpython-313.pyc differ diff --git a/agent_framework_oci/libs/agent_framework/src/agent_framework/oci/__pycache__/auth.cpython-313.pyc b/agent_framework_oci/libs/agent_framework/src/agent_framework/oci/__pycache__/auth.cpython-313.pyc index fb3d6769..d30f51a6 100644 Binary files a/agent_framework_oci/libs/agent_framework/src/agent_framework/oci/__pycache__/auth.cpython-313.pyc and b/agent_framework_oci/libs/agent_framework/src/agent_framework/oci/__pycache__/auth.cpython-313.pyc differ diff --git a/agent_framework_oci/libs/agent_framework/src/agent_framework/persistence/__pycache__/__init__.cpython-313.pyc b/agent_framework_oci/libs/agent_framework/src/agent_framework/persistence/__pycache__/__init__.cpython-313.pyc index 6b089b71..7b26f45c 100644 Binary files a/agent_framework_oci/libs/agent_framework/src/agent_framework/persistence/__pycache__/__init__.cpython-313.pyc and b/agent_framework_oci/libs/agent_framework/src/agent_framework/persistence/__pycache__/__init__.cpython-313.pyc differ diff --git a/agent_framework_oci/libs/agent_framework/src/agent_framework/persistence/__pycache__/oracle_store.cpython-313.pyc b/agent_framework_oci/libs/agent_framework/src/agent_framework/persistence/__pycache__/oracle_store.cpython-313.pyc index c2346ebd..b5e162ee 100644 Binary files a/agent_framework_oci/libs/agent_framework/src/agent_framework/persistence/__pycache__/oracle_store.cpython-313.pyc and b/agent_framework_oci/libs/agent_framework/src/agent_framework/persistence/__pycache__/oracle_store.cpython-313.pyc differ diff --git a/agent_framework_oci/libs/agent_framework/src/agent_framework/persistence/__pycache__/sqlite_store.cpython-313.pyc b/agent_framework_oci/libs/agent_framework/src/agent_framework/persistence/__pycache__/sqlite_store.cpython-313.pyc index 94b1c210..63c06a1f 100644 Binary files a/agent_framework_oci/libs/agent_framework/src/agent_framework/persistence/__pycache__/sqlite_store.cpython-313.pyc and b/agent_framework_oci/libs/agent_framework/src/agent_framework/persistence/__pycache__/sqlite_store.cpython-313.pyc differ diff --git a/agent_framework_oci/libs/agent_framework/src/agent_framework/presentation/__pycache__/__init__.cpython-313.pyc b/agent_framework_oci/libs/agent_framework/src/agent_framework/presentation/__pycache__/__init__.cpython-313.pyc index 46996ade..99dd036f 100644 Binary files a/agent_framework_oci/libs/agent_framework/src/agent_framework/presentation/__pycache__/__init__.cpython-313.pyc and b/agent_framework_oci/libs/agent_framework/src/agent_framework/presentation/__pycache__/__init__.cpython-313.pyc differ diff --git a/agent_framework_oci/libs/agent_framework/src/agent_framework/presentation/__pycache__/renderers.cpython-313.pyc b/agent_framework_oci/libs/agent_framework/src/agent_framework/presentation/__pycache__/renderers.cpython-313.pyc index e6831cd3..b6895c74 100644 Binary files a/agent_framework_oci/libs/agent_framework/src/agent_framework/presentation/__pycache__/renderers.cpython-313.pyc and b/agent_framework_oci/libs/agent_framework/src/agent_framework/presentation/__pycache__/renderers.cpython-313.pyc differ diff --git a/agent_framework_oci/libs/agent_framework/src/agent_framework/rag/__pycache__/__init__.cpython-313.pyc b/agent_framework_oci/libs/agent_framework/src/agent_framework/rag/__pycache__/__init__.cpython-313.pyc index 4518f77c..4a1a73df 100644 Binary files a/agent_framework_oci/libs/agent_framework/src/agent_framework/rag/__pycache__/__init__.cpython-313.pyc and b/agent_framework_oci/libs/agent_framework/src/agent_framework/rag/__pycache__/__init__.cpython-313.pyc differ diff --git a/agent_framework_oci/libs/agent_framework/src/agent_framework/rag/__pycache__/embedding_provider.cpython-313.pyc b/agent_framework_oci/libs/agent_framework/src/agent_framework/rag/__pycache__/embedding_provider.cpython-313.pyc index 51d66cf9..962fa827 100644 Binary files a/agent_framework_oci/libs/agent_framework/src/agent_framework/rag/__pycache__/embedding_provider.cpython-313.pyc and b/agent_framework_oci/libs/agent_framework/src/agent_framework/rag/__pycache__/embedding_provider.cpython-313.pyc differ diff --git a/agent_framework_oci/libs/agent_framework/src/agent_framework/rag/__pycache__/graph_store.cpython-313.pyc b/agent_framework_oci/libs/agent_framework/src/agent_framework/rag/__pycache__/graph_store.cpython-313.pyc index d81ba843..5c31d32b 100644 Binary files a/agent_framework_oci/libs/agent_framework/src/agent_framework/rag/__pycache__/graph_store.cpython-313.pyc and b/agent_framework_oci/libs/agent_framework/src/agent_framework/rag/__pycache__/graph_store.cpython-313.pyc differ diff --git a/agent_framework_oci/libs/agent_framework/src/agent_framework/rag/__pycache__/ingest.cpython-313.pyc b/agent_framework_oci/libs/agent_framework/src/agent_framework/rag/__pycache__/ingest.cpython-313.pyc index 9b33ce33..ee7273b4 100644 Binary files a/agent_framework_oci/libs/agent_framework/src/agent_framework/rag/__pycache__/ingest.cpython-313.pyc and b/agent_framework_oci/libs/agent_framework/src/agent_framework/rag/__pycache__/ingest.cpython-313.pyc differ diff --git a/agent_framework_oci/libs/agent_framework/src/agent_framework/rag/__pycache__/kbdb_service.cpython-313.pyc b/agent_framework_oci/libs/agent_framework/src/agent_framework/rag/__pycache__/kbdb_service.cpython-313.pyc index 9fd10d51..bb2200e0 100644 Binary files a/agent_framework_oci/libs/agent_framework/src/agent_framework/rag/__pycache__/kbdb_service.cpython-313.pyc and b/agent_framework_oci/libs/agent_framework/src/agent_framework/rag/__pycache__/kbdb_service.cpython-313.pyc differ diff --git a/agent_framework_oci/libs/agent_framework/src/agent_framework/rag/__pycache__/rag_service.cpython-313.pyc b/agent_framework_oci/libs/agent_framework/src/agent_framework/rag/__pycache__/rag_service.cpython-313.pyc index 1cb6f4bb..2fbeaed2 100644 Binary files a/agent_framework_oci/libs/agent_framework/src/agent_framework/rag/__pycache__/rag_service.cpython-313.pyc and b/agent_framework_oci/libs/agent_framework/src/agent_framework/rag/__pycache__/rag_service.cpython-313.pyc differ diff --git a/agent_framework_oci/libs/agent_framework/src/agent_framework/rag/__pycache__/vector_store.cpython-313.pyc b/agent_framework_oci/libs/agent_framework/src/agent_framework/rag/__pycache__/vector_store.cpython-313.pyc index 4c1891b8..c7a1f003 100644 Binary files a/agent_framework_oci/libs/agent_framework/src/agent_framework/rag/__pycache__/vector_store.cpython-313.pyc and b/agent_framework_oci/libs/agent_framework/src/agent_framework/rag/__pycache__/vector_store.cpython-313.pyc differ diff --git a/agent_framework_oci/libs/agent_framework/src/agent_framework/repositories/__pycache__/__init__.cpython-313.pyc b/agent_framework_oci/libs/agent_framework/src/agent_framework/repositories/__pycache__/__init__.cpython-313.pyc index 2d204cf3..f3a89d5b 100644 Binary files a/agent_framework_oci/libs/agent_framework/src/agent_framework/repositories/__pycache__/__init__.cpython-313.pyc and b/agent_framework_oci/libs/agent_framework/src/agent_framework/repositories/__pycache__/__init__.cpython-313.pyc differ diff --git a/agent_framework_oci/libs/agent_framework/src/agent_framework/repositories/__pycache__/session_repository.cpython-313.pyc b/agent_framework_oci/libs/agent_framework/src/agent_framework/repositories/__pycache__/session_repository.cpython-313.pyc index d54892f7..b11c48d2 100644 Binary files a/agent_framework_oci/libs/agent_framework/src/agent_framework/repositories/__pycache__/session_repository.cpython-313.pyc and b/agent_framework_oci/libs/agent_framework/src/agent_framework/repositories/__pycache__/session_repository.cpython-313.pyc differ diff --git a/agent_framework_oci/libs/agent_framework/src/agent_framework/routing/__pycache__/__init__.cpython-313.pyc b/agent_framework_oci/libs/agent_framework/src/agent_framework/routing/__pycache__/__init__.cpython-313.pyc index 997a7620..be1d14f2 100644 Binary files a/agent_framework_oci/libs/agent_framework/src/agent_framework/routing/__pycache__/__init__.cpython-313.pyc and b/agent_framework_oci/libs/agent_framework/src/agent_framework/routing/__pycache__/__init__.cpython-313.pyc differ diff --git a/agent_framework_oci/libs/agent_framework/src/agent_framework/routing/__pycache__/config_loader.cpython-313.pyc b/agent_framework_oci/libs/agent_framework/src/agent_framework/routing/__pycache__/config_loader.cpython-313.pyc index c767fb3d..417d540b 100644 Binary files a/agent_framework_oci/libs/agent_framework/src/agent_framework/routing/__pycache__/config_loader.cpython-313.pyc and b/agent_framework_oci/libs/agent_framework/src/agent_framework/routing/__pycache__/config_loader.cpython-313.pyc differ diff --git a/agent_framework_oci/libs/agent_framework/src/agent_framework/routing/__pycache__/continuity.cpython-313.pyc b/agent_framework_oci/libs/agent_framework/src/agent_framework/routing/__pycache__/continuity.cpython-313.pyc index 89e025c7..0f8e9ff6 100644 Binary files a/agent_framework_oci/libs/agent_framework/src/agent_framework/routing/__pycache__/continuity.cpython-313.pyc and b/agent_framework_oci/libs/agent_framework/src/agent_framework/routing/__pycache__/continuity.cpython-313.pyc differ diff --git a/agent_framework_oci/libs/agent_framework/src/agent_framework/routing/__pycache__/enterprise_router.cpython-313.pyc b/agent_framework_oci/libs/agent_framework/src/agent_framework/routing/__pycache__/enterprise_router.cpython-313.pyc index 4a94ed8b..34028e52 100644 Binary files a/agent_framework_oci/libs/agent_framework/src/agent_framework/routing/__pycache__/enterprise_router.cpython-313.pyc and b/agent_framework_oci/libs/agent_framework/src/agent_framework/routing/__pycache__/enterprise_router.cpython-313.pyc differ diff --git a/agent_framework_oci/libs/agent_framework/src/agent_framework/routing/__pycache__/models.cpython-313.pyc b/agent_framework_oci/libs/agent_framework/src/agent_framework/routing/__pycache__/models.cpython-313.pyc index b9244ecd..dcd5ec72 100644 Binary files a/agent_framework_oci/libs/agent_framework/src/agent_framework/routing/__pycache__/models.cpython-313.pyc and b/agent_framework_oci/libs/agent_framework/src/agent_framework/routing/__pycache__/models.cpython-313.pyc differ diff --git a/agent_framework_oci/libs/agent_framework/src/agent_framework/routing/continuity.py b/agent_framework_oci/libs/agent_framework/src/agent_framework/routing/continuity.py index 792cd5e0..84125b24 100644 --- a/agent_framework_oci/libs/agent_framework/src/agent_framework/routing/continuity.py +++ b/agent_framework_oci/libs/agent_framework/src/agent_framework/routing/continuity.py @@ -1,5 +1,7 @@ from __future__ import annotations +from agent_framework.llm.structured_output import parse_json_object + import json import logging from dataclasses import dataclass @@ -41,9 +43,6 @@ class SemanticRouteContinuity: self.history_turns = max( 1, int(getattr(settings, "ROUTE_STICKINESS_HISTORY_TURNS", 2)) ) - self.max_tokens = max( - 16, int(getattr(settings, "ROUTE_STICKINESS_MAX_TOKENS", 80)) - ) async def evaluate( self, @@ -202,8 +201,6 @@ class SemanticRouteContinuity: {"role": "system", "content": system}, {"role": "user", "content": json.dumps(payload, ensure_ascii=False)}, ], - temperature=0.0, - max_tokens=self.max_tokens, profile_name=self.profile_name, component_name="route_continuity", generation_name="llm.route_continuity", @@ -244,18 +241,7 @@ class SemanticRouteContinuity: return compact def _parse_json(self, answer: Any) -> dict[str, Any]: - text = str(answer).strip() - if text.startswith("```"): - text = text.strip("`") - if text.lower().startswith("json"): - text = text[4:].strip() - try: - return json.loads(text) - except json.JSONDecodeError: - start, end = text.find("{"), text.rfind("}") - if start >= 0 and end > start: - return json.loads(text[start : end + 1]) - raise + return parse_json_object(answer) async def _emit(self, state: dict[str, Any], payload: dict[str, Any]) -> None: if self.telemetry: diff --git a/agent_framework_oci/libs/agent_framework/src/agent_framework/routing/enterprise_router.py b/agent_framework_oci/libs/agent_framework/src/agent_framework/routing/enterprise_router.py index a2be3e84..06a92f8f 100644 --- a/agent_framework_oci/libs/agent_framework/src/agent_framework/routing/enterprise_router.py +++ b/agent_framework_oci/libs/agent_framework/src/agent_framework/routing/enterprise_router.py @@ -9,6 +9,7 @@ from typing import Any from .config_loader import load_intents, load_router_defaults, load_state_policies from .continuity import SemanticRouteContinuity from .models import IntentDefinition, RouteDecision, RouterStatePolicy +from agent_framework.llm.structured_output import parse_json_object from agent_framework.runtime.transaction_parameters import extract_transaction_parameters, parse_transaction_confirmation from agent_framework.workflows.input_contract import match_expected_input @@ -753,19 +754,7 @@ class EnterpriseRouter: return None def _parse_json(self, text: str) -> dict[str, Any]: - text = text.strip() - if text.startswith("```"): - text = text.strip("`") - if text.lower().startswith("json"): - text = text[4:].strip() - try: - return json.loads(text) - except Exception: - start = text.find("{") - end = text.rfind("}") - if start >= 0 and end > start: - return json.loads(text[start : end + 1]) - raise + return parse_json_object(text) async def _emit(self, decision: RouteDecision, state: dict[str, Any]) -> None: if self.telemetry: diff --git a/agent_framework_oci/libs/agent_framework/src/agent_framework/runtime/__pycache__/__init__.cpython-313.pyc b/agent_framework_oci/libs/agent_framework/src/agent_framework/runtime/__pycache__/__init__.cpython-313.pyc index 7ec80b22..6f41b8ea 100644 Binary files a/agent_framework_oci/libs/agent_framework/src/agent_framework/runtime/__pycache__/__init__.cpython-313.pyc and b/agent_framework_oci/libs/agent_framework/src/agent_framework/runtime/__pycache__/__init__.cpython-313.pyc differ diff --git a/agent_framework_oci/libs/agent_framework/src/agent_framework/runtime/__pycache__/agent_runtime.cpython-313.pyc b/agent_framework_oci/libs/agent_framework/src/agent_framework/runtime/__pycache__/agent_runtime.cpython-313.pyc index 5ff88691..e1b46ea4 100644 Binary files a/agent_framework_oci/libs/agent_framework/src/agent_framework/runtime/__pycache__/agent_runtime.cpython-313.pyc and b/agent_framework_oci/libs/agent_framework/src/agent_framework/runtime/__pycache__/agent_runtime.cpython-313.pyc differ diff --git a/agent_framework_oci/libs/agent_framework/src/agent_framework/runtime/__pycache__/transaction_parameters.cpython-313.pyc b/agent_framework_oci/libs/agent_framework/src/agent_framework/runtime/__pycache__/transaction_parameters.cpython-313.pyc index 2ae837f1..156855a4 100644 Binary files a/agent_framework_oci/libs/agent_framework/src/agent_framework/runtime/__pycache__/transaction_parameters.cpython-313.pyc and b/agent_framework_oci/libs/agent_framework/src/agent_framework/runtime/__pycache__/transaction_parameters.cpython-313.pyc differ diff --git a/agent_framework_oci/libs/agent_framework/src/agent_framework/runtime/agent_runtime.py b/agent_framework_oci/libs/agent_framework/src/agent_framework/runtime/agent_runtime.py index 837d048c..d4b66414 100644 --- a/agent_framework_oci/libs/agent_framework/src/agent_framework/runtime/agent_runtime.py +++ b/agent_framework_oci/libs/agent_framework/src/agent_framework/runtime/agent_runtime.py @@ -1,5 +1,7 @@ from __future__ import annotations +from agent_framework.llm.structured_output import parse_json_object + import hashlib import json import logging @@ -710,10 +712,8 @@ class AgentRuntimeMixin: max_tokens=80, ) raw = self._llm_response_text(response).strip() - if raw.startswith("```"): - raw = re.sub(r"^```(?:json)?\s*|\s*```$", "", raw, flags=re.IGNORECASE | re.DOTALL).strip() - payload = json.loads(raw) - value = payload.get(field_name) if isinstance(payload, dict) else None + payload = parse_json_object(raw) + value = payload.get(field_name) except Exception as exc: logger.warning( "mcp.parameter.llm_extract_failed tool=%s field=%s error=%s", diff --git a/agent_framework_oci/libs/agent_framework/src/agent_framework/runtime/transaction_parameters.py b/agent_framework_oci/libs/agent_framework/src/agent_framework/runtime/transaction_parameters.py index 475f0777..4682a1f8 100644 --- a/agent_framework_oci/libs/agent_framework/src/agent_framework/runtime/transaction_parameters.py +++ b/agent_framework_oci/libs/agent_framework/src/agent_framework/runtime/transaction_parameters.py @@ -1,5 +1,7 @@ from __future__ import annotations +from agent_framework.llm.structured_output import parse_json_object + import json import logging import re @@ -152,13 +154,11 @@ async def extract_transaction_parameters( return {} raw = _response_text(response).strip() - if raw.startswith("```"): - raw = re.sub(r"^```(?:json)?\s*|\s*```$", "", raw, flags=re.IGNORECASE | re.DOTALL).strip() try: - payload = json.loads(raw) - except (TypeError, ValueError, json.JSONDecodeError): + payload = parse_json_object(raw) + except (TypeError, ValueError): logger.warning( - "transaction.parameter.llm_invalid_json tool=%s pending=%s raw=%r", + "transaction.parameter.llm_invalid_structured_output tool=%s pending=%s raw=%r", tool_name, pending, raw[:240], diff --git a/agent_framework_oci/libs/agent_framework/src/agent_framework/security/__pycache__/__init__.cpython-313.pyc b/agent_framework_oci/libs/agent_framework/src/agent_framework/security/__pycache__/__init__.cpython-313.pyc index d5ac65c5..111dafdb 100644 Binary files a/agent_framework_oci/libs/agent_framework/src/agent_framework/security/__pycache__/__init__.cpython-313.pyc and b/agent_framework_oci/libs/agent_framework/src/agent_framework/security/__pycache__/__init__.cpython-313.pyc differ diff --git a/agent_framework_oci/libs/agent_framework/src/agent_framework/security/__pycache__/authentication.cpython-313.pyc b/agent_framework_oci/libs/agent_framework/src/agent_framework/security/__pycache__/authentication.cpython-313.pyc index ab536dac..edb64da3 100644 Binary files a/agent_framework_oci/libs/agent_framework/src/agent_framework/security/__pycache__/authentication.cpython-313.pyc and b/agent_framework_oci/libs/agent_framework/src/agent_framework/security/__pycache__/authentication.cpython-313.pyc differ diff --git a/agent_framework_oci/libs/agent_framework/src/agent_framework/security/__pycache__/factory.cpython-313.pyc b/agent_framework_oci/libs/agent_framework/src/agent_framework/security/__pycache__/factory.cpython-313.pyc index 1c721f3e..5c8d321f 100644 Binary files a/agent_framework_oci/libs/agent_framework/src/agent_framework/security/__pycache__/factory.cpython-313.pyc and b/agent_framework_oci/libs/agent_framework/src/agent_framework/security/__pycache__/factory.cpython-313.pyc differ diff --git a/agent_framework_oci/libs/agent_framework/src/agent_framework/security/__pycache__/installer.cpython-313.pyc b/agent_framework_oci/libs/agent_framework/src/agent_framework/security/__pycache__/installer.cpython-313.pyc index 2e800124..c9dd3eed 100644 Binary files a/agent_framework_oci/libs/agent_framework/src/agent_framework/security/__pycache__/installer.cpython-313.pyc and b/agent_framework_oci/libs/agent_framework/src/agent_framework/security/__pycache__/installer.cpython-313.pyc differ diff --git a/agent_framework_oci/libs/agent_framework/src/agent_framework/security/__pycache__/middleware.cpython-313.pyc b/agent_framework_oci/libs/agent_framework/src/agent_framework/security/__pycache__/middleware.cpython-313.pyc index 57c4c9c1..3cfe661c 100644 Binary files a/agent_framework_oci/libs/agent_framework/src/agent_framework/security/__pycache__/middleware.cpython-313.pyc and b/agent_framework_oci/libs/agent_framework/src/agent_framework/security/__pycache__/middleware.cpython-313.pyc differ diff --git a/agent_framework_oci/libs/agent_framework/src/agent_framework/sse/__pycache__/__init__.cpython-313.pyc b/agent_framework_oci/libs/agent_framework/src/agent_framework/sse/__pycache__/__init__.cpython-313.pyc index 320825cb..34c93c24 100644 Binary files a/agent_framework_oci/libs/agent_framework/src/agent_framework/sse/__pycache__/__init__.cpython-313.pyc and b/agent_framework_oci/libs/agent_framework/src/agent_framework/sse/__pycache__/__init__.cpython-313.pyc differ diff --git a/agent_framework_oci/libs/agent_framework/src/agent_framework/sse/__pycache__/events.cpython-313.pyc b/agent_framework_oci/libs/agent_framework/src/agent_framework/sse/__pycache__/events.cpython-313.pyc index 65b4de9b..d1fb5e0b 100644 Binary files a/agent_framework_oci/libs/agent_framework/src/agent_framework/sse/__pycache__/events.cpython-313.pyc and b/agent_framework_oci/libs/agent_framework/src/agent_framework/sse/__pycache__/events.cpython-313.pyc differ diff --git a/agent_framework_oci/libs/agent_framework/src/agent_framework/supervisor/__pycache__/__init__.cpython-313.pyc b/agent_framework_oci/libs/agent_framework/src/agent_framework/supervisor/__pycache__/__init__.cpython-313.pyc index b6c01e75..685b3559 100644 Binary files a/agent_framework_oci/libs/agent_framework/src/agent_framework/supervisor/__pycache__/__init__.cpython-313.pyc and b/agent_framework_oci/libs/agent_framework/src/agent_framework/supervisor/__pycache__/__init__.cpython-313.pyc differ diff --git a/agent_framework_oci/libs/agent_framework/src/agent_framework/supervisor/__pycache__/supervisor.cpython-313.pyc b/agent_framework_oci/libs/agent_framework/src/agent_framework/supervisor/__pycache__/supervisor.cpython-313.pyc index 50032571..04cd414f 100644 Binary files a/agent_framework_oci/libs/agent_framework/src/agent_framework/supervisor/__pycache__/supervisor.cpython-313.pyc and b/agent_framework_oci/libs/agent_framework/src/agent_framework/supervisor/__pycache__/supervisor.cpython-313.pyc differ diff --git a/agent_framework_oci/libs/agent_framework/src/agent_framework/workflows/__pycache__/__init__.cpython-313.pyc b/agent_framework_oci/libs/agent_framework/src/agent_framework/workflows/__pycache__/__init__.cpython-313.pyc index 83386510..97afa37a 100644 Binary files a/agent_framework_oci/libs/agent_framework/src/agent_framework/workflows/__pycache__/__init__.cpython-313.pyc and b/agent_framework_oci/libs/agent_framework/src/agent_framework/workflows/__pycache__/__init__.cpython-313.pyc differ diff --git a/agent_framework_oci/libs/agent_framework/src/agent_framework/workflows/__pycache__/graph.cpython-313.pyc b/agent_framework_oci/libs/agent_framework/src/agent_framework/workflows/__pycache__/graph.cpython-313.pyc index 2ba5f61b..5309359f 100644 Binary files a/agent_framework_oci/libs/agent_framework/src/agent_framework/workflows/__pycache__/graph.cpython-313.pyc and b/agent_framework_oci/libs/agent_framework/src/agent_framework/workflows/__pycache__/graph.cpython-313.pyc differ diff --git a/agent_framework_oci/libs/agent_framework/src/agent_framework/workflows/__pycache__/input_contract.cpython-313.pyc b/agent_framework_oci/libs/agent_framework/src/agent_framework/workflows/__pycache__/input_contract.cpython-313.pyc index c521ad14..b69667dc 100644 Binary files a/agent_framework_oci/libs/agent_framework/src/agent_framework/workflows/__pycache__/input_contract.cpython-313.pyc and b/agent_framework_oci/libs/agent_framework/src/agent_framework/workflows/__pycache__/input_contract.cpython-313.pyc differ diff --git a/agent_framework_oci/libs/agent_framework/src/agent_framework/workflows/__pycache__/models.cpython-313.pyc b/agent_framework_oci/libs/agent_framework/src/agent_framework/workflows/__pycache__/models.cpython-313.pyc index dba65ea8..2d18d615 100644 Binary files a/agent_framework_oci/libs/agent_framework/src/agent_framework/workflows/__pycache__/models.cpython-313.pyc and b/agent_framework_oci/libs/agent_framework/src/agent_framework/workflows/__pycache__/models.cpython-313.pyc differ diff --git a/agent_framework_oci/libs/agent_framework/src/agent_framework/workflows/__pycache__/registry.cpython-313.pyc b/agent_framework_oci/libs/agent_framework/src/agent_framework/workflows/__pycache__/registry.cpython-313.pyc index 7c792a62..6022ef82 100644 Binary files a/agent_framework_oci/libs/agent_framework/src/agent_framework/workflows/__pycache__/registry.cpython-313.pyc and b/agent_framework_oci/libs/agent_framework/src/agent_framework/workflows/__pycache__/registry.cpython-313.pyc differ diff --git a/agent_framework_oci/libs/agent_framework/src/agent_framework/workflows/__pycache__/repository.cpython-313.pyc b/agent_framework_oci/libs/agent_framework/src/agent_framework/workflows/__pycache__/repository.cpython-313.pyc index 277c35c9..10c9a539 100644 Binary files a/agent_framework_oci/libs/agent_framework/src/agent_framework/workflows/__pycache__/repository.cpython-313.pyc and b/agent_framework_oci/libs/agent_framework/src/agent_framework/workflows/__pycache__/repository.cpython-313.pyc differ diff --git a/agent_framework_oci/libs/agent_framework/src/agent_framework/workflows/__pycache__/runtime.cpython-313.pyc b/agent_framework_oci/libs/agent_framework/src/agent_framework/workflows/__pycache__/runtime.cpython-313.pyc index f695a2fc..b709e0d2 100644 Binary files a/agent_framework_oci/libs/agent_framework/src/agent_framework/workflows/__pycache__/runtime.cpython-313.pyc and b/agent_framework_oci/libs/agent_framework/src/agent_framework/workflows/__pycache__/runtime.cpython-313.pyc differ diff --git a/agent_framework_oci/libs/agent_framework/src/agent_framework/workflows/__pycache__/tool_executor.cpython-313.pyc b/agent_framework_oci/libs/agent_framework/src/agent_framework/workflows/__pycache__/tool_executor.cpython-313.pyc index 5115c168..59cb3440 100644 Binary files a/agent_framework_oci/libs/agent_framework/src/agent_framework/workflows/__pycache__/tool_executor.cpython-313.pyc and b/agent_framework_oci/libs/agent_framework/src/agent_framework/workflows/__pycache__/tool_executor.cpython-313.pyc differ diff --git a/agent_framework_oci/tests/__pycache__/conftest.cpython-313-pytest-9.0.2.pyc b/agent_framework_oci/tests/__pycache__/conftest.cpython-313-pytest-9.0.2.pyc index b45edfff..17572f2e 100644 Binary files a/agent_framework_oci/tests/__pycache__/conftest.cpython-313-pytest-9.0.2.pyc and b/agent_framework_oci/tests/__pycache__/conftest.cpython-313-pytest-9.0.2.pyc differ diff --git a/agent_framework_oci/tests/__pycache__/test_aoferta_transaction_continuation.cpython-313-pytest-9.0.2.pyc b/agent_framework_oci/tests/__pycache__/test_aoferta_transaction_continuation.cpython-313-pytest-9.0.2.pyc index b0472627..130bc82e 100644 Binary files a/agent_framework_oci/tests/__pycache__/test_aoferta_transaction_continuation.cpython-313-pytest-9.0.2.pyc and b/agent_framework_oci/tests/__pycache__/test_aoferta_transaction_continuation.cpython-313-pytest-9.0.2.pyc differ diff --git a/agent_framework_oci/tests/__pycache__/test_fraseologia_business_parameter_prompt.cpython-313-pytest-9.0.2.pyc b/agent_framework_oci/tests/__pycache__/test_fraseologia_business_parameter_prompt.cpython-313-pytest-9.0.2.pyc new file mode 100644 index 00000000..35408331 Binary files /dev/null and b/agent_framework_oci/tests/__pycache__/test_fraseologia_business_parameter_prompt.cpython-313-pytest-9.0.2.pyc differ diff --git a/agent_framework_oci/tests/__pycache__/test_generic_tool_response_presentation.cpython-313-pytest-9.0.2.pyc b/agent_framework_oci/tests/__pycache__/test_generic_tool_response_presentation.cpython-313-pytest-9.0.2.pyc index e2a7c215..4b2fda1c 100644 Binary files a/agent_framework_oci/tests/__pycache__/test_generic_tool_response_presentation.cpython-313-pytest-9.0.2.pyc and b/agent_framework_oci/tests/__pycache__/test_generic_tool_response_presentation.cpython-313-pytest-9.0.2.pyc differ diff --git a/agent_framework_oci/tests/__pycache__/test_judge_transaction_sampling.cpython-313-pytest-9.0.2.pyc b/agent_framework_oci/tests/__pycache__/test_judge_transaction_sampling.cpython-313-pytest-9.0.2.pyc new file mode 100644 index 00000000..2721be2a Binary files /dev/null and b/agent_framework_oci/tests/__pycache__/test_judge_transaction_sampling.cpython-313-pytest-9.0.2.pyc differ diff --git a/agent_framework_oci/tests/__pycache__/test_mcp_parameter_extraction_runtime.cpython-313-pytest-9.0.2.pyc b/agent_framework_oci/tests/__pycache__/test_mcp_parameter_extraction_runtime.cpython-313-pytest-9.0.2.pyc index 391c6141..c7491df0 100644 Binary files a/agent_framework_oci/tests/__pycache__/test_mcp_parameter_extraction_runtime.cpython-313-pytest-9.0.2.pyc and b/agent_framework_oci/tests/__pycache__/test_mcp_parameter_extraction_runtime.cpython-313-pytest-9.0.2.pyc differ diff --git a/agent_framework_oci/tests/__pycache__/test_observer_cross_loop_deadlock_fix.cpython-313-pytest-9.0.2.pyc b/agent_framework_oci/tests/__pycache__/test_observer_cross_loop_deadlock_fix.cpython-313-pytest-9.0.2.pyc new file mode 100644 index 00000000..15dcc40b Binary files /dev/null and b/agent_framework_oci/tests/__pycache__/test_observer_cross_loop_deadlock_fix.cpython-313-pytest-9.0.2.pyc differ diff --git a/agent_framework_oci/tests/__pycache__/test_paused_workflow_resume_precedence.cpython-313-pytest-9.0.2.pyc b/agent_framework_oci/tests/__pycache__/test_paused_workflow_resume_precedence.cpython-313-pytest-9.0.2.pyc index 4ef41f56..4cbb1d17 100644 Binary files a/agent_framework_oci/tests/__pycache__/test_paused_workflow_resume_precedence.cpython-313-pytest-9.0.2.pyc and b/agent_framework_oci/tests/__pycache__/test_paused_workflow_resume_precedence.cpython-313-pytest-9.0.2.pyc differ diff --git a/agent_framework_oci/tests/__pycache__/test_phraseology_rewrite_revalidation.cpython-313-pytest-9.0.2.pyc b/agent_framework_oci/tests/__pycache__/test_phraseology_rewrite_revalidation.cpython-313-pytest-9.0.2.pyc index 6fa7a4b8..ab54f2cd 100644 Binary files a/agent_framework_oci/tests/__pycache__/test_phraseology_rewrite_revalidation.cpython-313-pytest-9.0.2.pyc and b/agent_framework_oci/tests/__pycache__/test_phraseology_rewrite_revalidation.cpython-313-pytest-9.0.2.pyc differ diff --git a/agent_framework_oci/tests/__pycache__/test_route_stickiness_transaction_shift.cpython-313-pytest-9.0.2.pyc b/agent_framework_oci/tests/__pycache__/test_route_stickiness_transaction_shift.cpython-313-pytest-9.0.2.pyc index 86b3d260..a56a7c0d 100644 Binary files a/agent_framework_oci/tests/__pycache__/test_route_stickiness_transaction_shift.cpython-313-pytest-9.0.2.pyc and b/agent_framework_oci/tests/__pycache__/test_route_stickiness_transaction_shift.cpython-313-pytest-9.0.2.pyc differ diff --git a/agent_framework_oci/tests/__pycache__/test_structured_output_parser.cpython-313-pytest-9.0.2.pyc b/agent_framework_oci/tests/__pycache__/test_structured_output_parser.cpython-313-pytest-9.0.2.pyc new file mode 100644 index 00000000..c0b3bb4b Binary files /dev/null and b/agent_framework_oci/tests/__pycache__/test_structured_output_parser.cpython-313-pytest-9.0.2.pyc differ diff --git a/agent_framework_oci/tests/__pycache__/test_transaction_confirmation_customer_facing.cpython-313-pytest-9.0.2.pyc b/agent_framework_oci/tests/__pycache__/test_transaction_confirmation_customer_facing.cpython-313-pytest-9.0.2.pyc index 29f28f70..289bd4f5 100644 Binary files a/agent_framework_oci/tests/__pycache__/test_transaction_confirmation_customer_facing.cpython-313-pytest-9.0.2.pyc and b/agent_framework_oci/tests/__pycache__/test_transaction_confirmation_customer_facing.cpython-313-pytest-9.0.2.pyc differ diff --git a/agent_framework_oci/tests/__pycache__/test_transaction_parameter_descriptions.cpython-313-pytest-9.0.2.pyc b/agent_framework_oci/tests/__pycache__/test_transaction_parameter_descriptions.cpython-313-pytest-9.0.2.pyc index 6fdde9d4..d701b122 100644 Binary files a/agent_framework_oci/tests/__pycache__/test_transaction_parameter_descriptions.cpython-313-pytest-9.0.2.pyc and b/agent_framework_oci/tests/__pycache__/test_transaction_parameter_descriptions.cpython-313-pytest-9.0.2.pyc differ diff --git a/agent_framework_oci/tests/__pycache__/test_transaction_parameter_llm_precedence.cpython-313-pytest-9.0.2.pyc b/agent_framework_oci/tests/__pycache__/test_transaction_parameter_llm_precedence.cpython-313-pytest-9.0.2.pyc index 9d8ca51f..8d7f43ca 100644 Binary files a/agent_framework_oci/tests/__pycache__/test_transaction_parameter_llm_precedence.cpython-313-pytest-9.0.2.pyc and b/agent_framework_oci/tests/__pycache__/test_transaction_parameter_llm_precedence.cpython-313-pytest-9.0.2.pyc differ diff --git a/agent_framework_oci/tests/__pycache__/test_transaction_state_regression_matrix.cpython-313-pytest-9.0.2.pyc b/agent_framework_oci/tests/__pycache__/test_transaction_state_regression_matrix.cpython-313-pytest-9.0.2.pyc index e1bc6e74..7b19f265 100644 Binary files a/agent_framework_oci/tests/__pycache__/test_transaction_state_regression_matrix.cpython-313-pytest-9.0.2.pyc and b/agent_framework_oci/tests/__pycache__/test_transaction_state_regression_matrix.cpython-313-pytest-9.0.2.pyc differ diff --git a/agent_framework_oci/tests/__pycache__/test_transaction_state_router_interruption.cpython-313-pytest-9.0.2.pyc b/agent_framework_oci/tests/__pycache__/test_transaction_state_router_interruption.cpython-313-pytest-9.0.2.pyc index 5029b3b5..2bba895f 100644 Binary files a/agent_framework_oci/tests/__pycache__/test_transaction_state_router_interruption.cpython-313-pytest-9.0.2.pyc and b/agent_framework_oci/tests/__pycache__/test_transaction_state_router_interruption.cpython-313-pytest-9.0.2.pyc differ diff --git a/agent_framework_oci/tests/__pycache__/test_transactional_tool_flow.cpython-313-pytest-9.0.2.pyc b/agent_framework_oci/tests/__pycache__/test_transactional_tool_flow.cpython-313-pytest-9.0.2.pyc index 9756659c..6300ab3a 100644 Binary files a/agent_framework_oci/tests/__pycache__/test_transactional_tool_flow.cpython-313-pytest-9.0.2.pyc and b/agent_framework_oci/tests/__pycache__/test_transactional_tool_flow.cpython-313-pytest-9.0.2.pyc differ diff --git a/agent_framework_oci/tests/test_compliance_protocol_expected_values.py b/agent_framework_oci/tests/test_compliance_protocol_expected_values.py new file mode 100644 index 00000000..80588afd --- /dev/null +++ b/agent_framework_oci/tests/test_compliance_protocol_expected_values.py @@ -0,0 +1,60 @@ +import pytest + +from agent_framework.guardrails.rails import ComplianceRail + + +@pytest.mark.asyncio +async def test_cmp_accepts_expected_protocol_directly_even_when_regex_misses_markdown_distance(): + rail = ComplianceRail() + text = ( + "[FaturasAgent] Entendido. Seu aceite foi registrado e o protocolo de atendimento " + "foi aberto com o número **1234567890**." + ) + + decision = await rail.evaluate( + text, + { + "tipo_fluxo": "ajuste", + "expected_protocols": ["1234567890"], + }, + ) + + assert decision.allowed is True + assert decision.sanitized_text is None + assert decision.metadata["protocol_validation"] == "expected_values" + assert decision.metadata["expected_protocols"] == ["1234567890"] + + +@pytest.mark.asyncio +async def test_cmp_does_not_accept_a_different_protocol_when_expected_value_is_known(): + rail = ComplianceRail() + text = "Seu protocolo é 9999999999." + + decision = await rail.evaluate( + text, + { + "requer_protocolo": True, + "expected_protocols": ["1234567890"], + }, + ) + + assert decision.allowed is True + assert decision.sanitized_text is not None + assert "um dois três quatro cinco seis sete oito nove zero" in decision.sanitized_text + assert decision.metadata["missing_protocols_spoken"] == [ + "um dois três quatro cinco seis sete oito nove zero" + ] + assert decision.metadata["protocol_validation"] == "expected_values" + + +@pytest.mark.asyncio +async def test_cmp_keeps_regex_compatibility_when_expected_protocols_are_unavailable(): + rail = ComplianceRail() + + decision = await rail.evaluate( + "Seu protocolo é 1234567890.", + {"requer_protocolo": True}, + ) + + assert decision.allowed is True + assert decision.metadata["protocol_validation"] == "generic_regex" diff --git a/agent_framework_oci/tests/test_structured_output_parser.py b/agent_framework_oci/tests/test_structured_output_parser.py new file mode 100644 index 00000000..40acf7f0 --- /dev/null +++ b/agent_framework_oci/tests/test_structured_output_parser.py @@ -0,0 +1,62 @@ +import pytest + +from agent_framework.llm.structured_output import ( + StructuredOutputError, + parse_json_object, + parse_structured_output, +) + + +def test_strict_json_object(): + assert parse_json_object('{"decision":"KEEP","confidence":0.9}') == { + "decision": "KEEP", + "confidence": 0.9, + } + + +def test_single_quotes_python_literal(): + assert parse_json_object("{'decision': 'KEEP', 'confidence': 0.9, 'ok': True, 'reason': None}") == { + "decision": "KEEP", + "confidence": 0.9, + "ok": True, + "reason": None, + } + + +def test_prose_around_json(): + raw = 'Resultado da análise:\n{"decision":"ROUTE","confidence":0.8}\nFim.' + assert parse_json_object(raw)["decision"] == "ROUTE" + + +def test_prose_around_single_quoted_mapping(): + raw = "Vou retornar o objeto pedido: {'decision': 'HANDOFF', 'confidence': 0.7} texto final" + assert parse_json_object(raw)["decision"] == "HANDOFF" + + +def test_markdown_fence(): + raw = "```json\n{\"allowed\": true, \"reason\": \"OK\"}\n```" + assert parse_json_object(raw) == {"allowed": True, "reason": "OK"} + + +def test_braces_inside_string_do_not_break_extraction(): + raw = "prefix {'reason': 'cliente disse {nao}', 'allowed': True} suffix" + assert parse_json_object(raw)["reason"] == "cliente disse {nao}" + + +def test_apostrophe_inside_double_quoted_json_is_preserved(): + raw = 'texto {"name":"D\'Ávila","allowed":true} fim' + assert parse_json_object(raw)["name"] == "D'Ávila" + + +def test_array_supported_by_generic_parser(): + assert parse_structured_output("prefix [1, 2, 3] suffix", expected_type=list) == [1, 2, 3] + + +def test_object_wrapper_rejects_array(): + with pytest.raises(StructuredOutputError): + parse_json_object("[1,2,3]") + + +def test_does_not_execute_arbitrary_python(): + with pytest.raises(StructuredOutputError): + parse_json_object("{'x': __import__('os').system('echo unsafe')}") diff --git a/agent_framework_oci/tests/test_transaction_state_router_interruption.py b/agent_framework_oci/tests/test_transaction_state_router_interruption.py index f9eff096..d6fe8ed1 100644 --- a/agent_framework_oci/tests/test_transaction_state_router_interruption.py +++ b/agent_framework_oci/tests/test_transaction_state_router_interruption.py @@ -384,7 +384,7 @@ def test_agent_state_declares_durable_transaction_latch(): import importlib.util from pathlib import Path - state_path = Path(__file__).parents[2] / "app" / "state.py" + state_path = Path(__file__).parents[1] / "templates" / "agent_template_backend" / "app" / "state.py" spec = importlib.util.spec_from_file_location("contas_agent_state_v10", state_path) module = importlib.util.module_from_spec(spec) assert spec and spec.loader diff --git a/agent_framework_oci/tests/unit/__pycache__/test_agent_runtime.cpython-313-pytest-9.0.2.pyc b/agent_framework_oci/tests/unit/__pycache__/test_agent_runtime.cpython-313-pytest-9.0.2.pyc new file mode 100644 index 00000000..0cad7786 Binary files /dev/null and b/agent_framework_oci/tests/unit/__pycache__/test_agent_runtime.cpython-313-pytest-9.0.2.pyc differ diff --git a/agent_framework_oci/tests/unit/__pycache__/test_authentication.cpython-313-pytest-9.0.2.pyc b/agent_framework_oci/tests/unit/__pycache__/test_authentication.cpython-313-pytest-9.0.2.pyc index a19dcc64..d7ff70ec 100644 Binary files a/agent_framework_oci/tests/unit/__pycache__/test_authentication.cpython-313-pytest-9.0.2.pyc and b/agent_framework_oci/tests/unit/__pycache__/test_authentication.cpython-313-pytest-9.0.2.pyc differ diff --git a/agent_framework_oci/tests/unit/__pycache__/test_authentication_policies.cpython-313-pytest-9.0.2.pyc b/agent_framework_oci/tests/unit/__pycache__/test_authentication_policies.cpython-313-pytest-9.0.2.pyc index f8d2b6b8..4831c43a 100644 Binary files a/agent_framework_oci/tests/unit/__pycache__/test_authentication_policies.cpython-313-pytest-9.0.2.pyc and b/agent_framework_oci/tests/unit/__pycache__/test_authentication_policies.cpython-313-pytest-9.0.2.pyc differ diff --git a/agent_framework_oci/tests/unit/__pycache__/test_cache.cpython-313-pytest-9.0.2.pyc b/agent_framework_oci/tests/unit/__pycache__/test_cache.cpython-313-pytest-9.0.2.pyc new file mode 100644 index 00000000..092f7633 Binary files /dev/null and b/agent_framework_oci/tests/unit/__pycache__/test_cache.cpython-313-pytest-9.0.2.pyc differ diff --git a/agent_framework_oci/tests/unit/__pycache__/test_cache_distributed.cpython-313-pytest-9.0.2.pyc b/agent_framework_oci/tests/unit/__pycache__/test_cache_distributed.cpython-313-pytest-9.0.2.pyc new file mode 100644 index 00000000..f0a24c17 Binary files /dev/null and b/agent_framework_oci/tests/unit/__pycache__/test_cache_distributed.cpython-313-pytest-9.0.2.pyc differ diff --git a/agent_framework_oci/tests/unit/__pycache__/test_imports_compile.cpython-313-pytest-9.0.2.pyc b/agent_framework_oci/tests/unit/__pycache__/test_imports_compile.cpython-313-pytest-9.0.2.pyc new file mode 100644 index 00000000..a31b823c Binary files /dev/null and b/agent_framework_oci/tests/unit/__pycache__/test_imports_compile.cpython-313-pytest-9.0.2.pyc differ diff --git a/agent_framework_oci/tests/unit/__pycache__/test_langgraph_checkpoint_interrupt_controlled.cpython-313-pytest-9.0.2.pyc b/agent_framework_oci/tests/unit/__pycache__/test_langgraph_checkpoint_interrupt_controlled.cpython-313-pytest-9.0.2.pyc index b34fe31d..f8fe590f 100644 Binary files a/agent_framework_oci/tests/unit/__pycache__/test_langgraph_checkpoint_interrupt_controlled.cpython-313-pytest-9.0.2.pyc and b/agent_framework_oci/tests/unit/__pycache__/test_langgraph_checkpoint_interrupt_controlled.cpython-313-pytest-9.0.2.pyc differ diff --git a/agent_framework_oci/tests/unit/__pycache__/test_langgraph_checkpoint_runtime_config.cpython-313-pytest-9.0.2.pyc b/agent_framework_oci/tests/unit/__pycache__/test_langgraph_checkpoint_runtime_config.cpython-313-pytest-9.0.2.pyc index e8f04d4a..3a780712 100644 Binary files a/agent_framework_oci/tests/unit/__pycache__/test_langgraph_checkpoint_runtime_config.cpython-313-pytest-9.0.2.pyc and b/agent_framework_oci/tests/unit/__pycache__/test_langgraph_checkpoint_runtime_config.cpython-313-pytest-9.0.2.pyc differ diff --git a/agent_framework_oci/tests/unit/__pycache__/test_langgraph_checkpoint_saver.cpython-313-pytest-9.0.2.pyc b/agent_framework_oci/tests/unit/__pycache__/test_langgraph_checkpoint_saver.cpython-313-pytest-9.0.2.pyc index bb8f5cf2..192c9849 100644 Binary files a/agent_framework_oci/tests/unit/__pycache__/test_langgraph_checkpoint_saver.cpython-313-pytest-9.0.2.pyc and b/agent_framework_oci/tests/unit/__pycache__/test_langgraph_checkpoint_saver.cpython-313-pytest-9.0.2.pyc differ diff --git a/agent_framework_oci/tests/unit/__pycache__/test_langgraph_telemetry.cpython-313-pytest-9.0.2.pyc b/agent_framework_oci/tests/unit/__pycache__/test_langgraph_telemetry.cpython-313-pytest-9.0.2.pyc new file mode 100644 index 00000000..e4adf4bc Binary files /dev/null and b/agent_framework_oci/tests/unit/__pycache__/test_langgraph_telemetry.cpython-313-pytest-9.0.2.pyc differ diff --git a/agent_framework_oci/tests/unit/__pycache__/test_llm_rich_response.cpython-313-pytest-9.0.2.pyc b/agent_framework_oci/tests/unit/__pycache__/test_llm_rich_response.cpython-313-pytest-9.0.2.pyc new file mode 100644 index 00000000..44e704dd Binary files /dev/null and b/agent_framework_oci/tests/unit/__pycache__/test_llm_rich_response.cpython-313-pytest-9.0.2.pyc differ diff --git a/agent_framework_oci/tests/unit/__pycache__/test_long_term_memory_autonomous.cpython-313-pytest-9.0.2.pyc b/agent_framework_oci/tests/unit/__pycache__/test_long_term_memory_autonomous.cpython-313-pytest-9.0.2.pyc new file mode 100644 index 00000000..64941e75 Binary files /dev/null and b/agent_framework_oci/tests/unit/__pycache__/test_long_term_memory_autonomous.cpython-313-pytest-9.0.2.pyc differ diff --git a/agent_framework_oci/tests/unit/__pycache__/test_pubsub_analytics_publisher.cpython-313-pytest-9.0.2.pyc b/agent_framework_oci/tests/unit/__pycache__/test_pubsub_analytics_publisher.cpython-313-pytest-9.0.2.pyc new file mode 100644 index 00000000..9e323f1e Binary files /dev/null and b/agent_framework_oci/tests/unit/__pycache__/test_pubsub_analytics_publisher.cpython-313-pytest-9.0.2.pyc differ diff --git a/agent_framework_oci/tests/unit/__pycache__/test_rag.cpython-313-pytest-9.0.2.pyc b/agent_framework_oci/tests/unit/__pycache__/test_rag.cpython-313-pytest-9.0.2.pyc new file mode 100644 index 00000000..dbafeb2e Binary files /dev/null and b/agent_framework_oci/tests/unit/__pycache__/test_rag.cpython-313-pytest-9.0.2.pyc differ diff --git a/agent_framework_oci/tests/unit/__pycache__/test_rag_kbdb_provider.cpython-313-pytest-9.0.2.pyc b/agent_framework_oci/tests/unit/__pycache__/test_rag_kbdb_provider.cpython-313-pytest-9.0.2.pyc index 391cb275..8c401057 100644 Binary files a/agent_framework_oci/tests/unit/__pycache__/test_rag_kbdb_provider.cpython-313-pytest-9.0.2.pyc and b/agent_framework_oci/tests/unit/__pycache__/test_rag_kbdb_provider.cpython-313-pytest-9.0.2.pyc differ diff --git a/agent_framework_oci/tests/unit/__pycache__/test_rag_oracle_sql_generation.cpython-313-pytest-9.0.2.pyc b/agent_framework_oci/tests/unit/__pycache__/test_rag_oracle_sql_generation.cpython-313-pytest-9.0.2.pyc new file mode 100644 index 00000000..0ae33556 Binary files /dev/null and b/agent_framework_oci/tests/unit/__pycache__/test_rag_oracle_sql_generation.cpython-313-pytest-9.0.2.pyc differ diff --git a/agent_framework_oci/tests/unit/__pycache__/test_rag_runtime_grounding.cpython-313-pytest-9.0.2.pyc b/agent_framework_oci/tests/unit/__pycache__/test_rag_runtime_grounding.cpython-313-pytest-9.0.2.pyc index 151b5782..3cf6c23f 100644 Binary files a/agent_framework_oci/tests/unit/__pycache__/test_rag_runtime_grounding.cpython-313-pytest-9.0.2.pyc and b/agent_framework_oci/tests/unit/__pycache__/test_rag_runtime_grounding.cpython-313-pytest-9.0.2.pyc differ diff --git a/agent_framework_oci/tests/unit/__pycache__/test_resilient_checkpointer.cpython-313-pytest-9.0.2.pyc b/agent_framework_oci/tests/unit/__pycache__/test_resilient_checkpointer.cpython-313-pytest-9.0.2.pyc index e26f6bb8..c6608e0b 100644 Binary files a/agent_framework_oci/tests/unit/__pycache__/test_resilient_checkpointer.cpython-313-pytest-9.0.2.pyc and b/agent_framework_oci/tests/unit/__pycache__/test_resilient_checkpointer.cpython-313-pytest-9.0.2.pyc differ diff --git a/agent_framework_oci/tests/unit/__pycache__/test_semantic_route_stickiness.cpython-313-pytest-9.0.2.pyc b/agent_framework_oci/tests/unit/__pycache__/test_semantic_route_stickiness.cpython-313-pytest-9.0.2.pyc index 88a14b69..db1cf341 100644 Binary files a/agent_framework_oci/tests/unit/__pycache__/test_semantic_route_stickiness.cpython-313-pytest-9.0.2.pyc and b/agent_framework_oci/tests/unit/__pycache__/test_semantic_route_stickiness.cpython-313-pytest-9.0.2.pyc differ diff --git a/agent_framework_oci/tests/unit/__pycache__/test_sse.cpython-313-pytest-9.0.2.pyc b/agent_framework_oci/tests/unit/__pycache__/test_sse.cpython-313-pytest-9.0.2.pyc new file mode 100644 index 00000000..b0b10404 Binary files /dev/null and b/agent_framework_oci/tests/unit/__pycache__/test_sse.cpython-313-pytest-9.0.2.pyc differ diff --git a/agent_framework_oci/tests/unit/__pycache__/test_sse_replay_dedup.cpython-313-pytest-9.0.2.pyc b/agent_framework_oci/tests/unit/__pycache__/test_sse_replay_dedup.cpython-313-pytest-9.0.2.pyc new file mode 100644 index 00000000..d79f76ee Binary files /dev/null and b/agent_framework_oci/tests/unit/__pycache__/test_sse_replay_dedup.cpython-313-pytest-9.0.2.pyc differ diff --git a/agent_framework_oci/tests/unit/__pycache__/test_telemetry_langfuse_compact.cpython-313-pytest-9.0.2.pyc b/agent_framework_oci/tests/unit/__pycache__/test_telemetry_langfuse_compact.cpython-313-pytest-9.0.2.pyc new file mode 100644 index 00000000..3def25f4 Binary files /dev/null and b/agent_framework_oci/tests/unit/__pycache__/test_telemetry_langfuse_compact.cpython-313-pytest-9.0.2.pyc differ diff --git a/agent_framework_oci/tests/unit/__pycache__/test_token_cost_enterprise.cpython-313-pytest-9.0.2.pyc b/agent_framework_oci/tests/unit/__pycache__/test_token_cost_enterprise.cpython-313-pytest-9.0.2.pyc new file mode 100644 index 00000000..0aa346b1 Binary files /dev/null and b/agent_framework_oci/tests/unit/__pycache__/test_token_cost_enterprise.cpython-313-pytest-9.0.2.pyc differ diff --git a/agent_framework_oci/tests/unit/__pycache__/test_tool_policies.cpython-313-pytest-9.0.2.pyc b/agent_framework_oci/tests/unit/__pycache__/test_tool_policies.cpython-313-pytest-9.0.2.pyc index 6d281280..6d9294e1 100644 Binary files a/agent_framework_oci/tests/unit/__pycache__/test_tool_policies.cpython-313-pytest-9.0.2.pyc and b/agent_framework_oci/tests/unit/__pycache__/test_tool_policies.cpython-313-pytest-9.0.2.pyc differ diff --git a/agent_framework_oci/tests/unit/__pycache__/test_transactional_workflows.cpython-313-pytest-9.0.2.pyc b/agent_framework_oci/tests/unit/__pycache__/test_transactional_workflows.cpython-313-pytest-9.0.2.pyc index 09c30aac..33ee3e1c 100644 Binary files a/agent_framework_oci/tests/unit/__pycache__/test_transactional_workflows.cpython-313-pytest-9.0.2.pyc and b/agent_framework_oci/tests/unit/__pycache__/test_transactional_workflows.cpython-313-pytest-9.0.2.pyc differ diff --git a/agent_framework_oci/tests/unit/__pycache__/test_workflow_runtime_diagnostics.cpython-313-pytest-9.0.2.pyc b/agent_framework_oci/tests/unit/__pycache__/test_workflow_runtime_diagnostics.cpython-313-pytest-9.0.2.pyc index cbeca66a..be260971 100644 Binary files a/agent_framework_oci/tests/unit/__pycache__/test_workflow_runtime_diagnostics.cpython-313-pytest-9.0.2.pyc and b/agent_framework_oci/tests/unit/__pycache__/test_workflow_runtime_diagnostics.cpython-313-pytest-9.0.2.pyc differ diff --git a/agent_framework_oci/tests/unit/__pycache__/test_workflow_static.cpython-313-pytest-9.0.2.pyc b/agent_framework_oci/tests/unit/__pycache__/test_workflow_static.cpython-313-pytest-9.0.2.pyc new file mode 100644 index 00000000..0c4a1f9e Binary files /dev/null and b/agent_framework_oci/tests/unit/__pycache__/test_workflow_static.cpython-313-pytest-9.0.2.pyc differ diff --git a/agent_framework_oci/tests/unit/test_llm_rich_response.py b/agent_framework_oci/tests/unit/test_llm_rich_response.py index ba86d2a8..f10b421d 100644 --- a/agent_framework_oci/tests/unit/test_llm_rich_response.py +++ b/agent_framework_oci/tests/unit/test_llm_rich_response.py @@ -3,7 +3,13 @@ from types import SimpleNamespace import pytest from agent_framework.llm.base import LLMProvider -from agent_framework.llm.providers import MockLLMProvider, OCISDKProvider, _extract_reasoning_content +from agent_framework.llm.providers import ( + MockLLMProvider, + OCISDKProvider, + _extract_reasoning_content, + _extract_openai_message_content, + _extract_finish_reason, +) from agent_framework.llm.types import LLMResponse @@ -64,3 +70,37 @@ def test_oci_sdk_reasoning_is_extracted_from_choice_message(): response = SimpleNamespace(data=SimpleNamespace(chat_response=chat_response)) assert OCISDKProvider._extract_reasoning_content(response) == "oci reasoning" + + +def test_openai_compatible_plain_string_content_is_preserved(): + message = SimpleNamespace(content='{"decision":"KEEP"}') + assert _extract_openai_message_content(message) == '{"decision":"KEEP"}' + + +def test_openai_compatible_list_content_is_joined(): + message = SimpleNamespace(content=[ + SimpleNamespace(text='{"decision":'), + {"text": '"KEEP"}'}, + ]) + assert _extract_openai_message_content(message) == '{"decision":"KEEP"}' + + +def test_openai_compatible_dict_message_and_content_are_supported(): + message = {"content": [{"text": "{\"ok\":true}"}]} + assert _extract_openai_message_content(message) == '{"ok":true}' + + +def test_openai_compatible_unknown_content_fails_closed_to_empty_string(): + message = SimpleNamespace(content=object()) + assert _extract_openai_message_content(message) == "" + + +def test_openai_compatible_reasoning_is_not_used_as_answer_fallback(): + message = SimpleNamespace(content=None, reasoning_content='{"decision":"KEEP"}') + assert _extract_openai_message_content(message) == "" + assert _extract_reasoning_content(message) == '{"decision":"KEEP"}' + + +def test_finish_reason_is_extracted_from_object_and_dict(): + assert _extract_finish_reason(SimpleNamespace(finish_reason="length")) == "length" + assert _extract_finish_reason({"finish_reason": "stop"}) == "stop" diff --git a/agent_framework_oci/tests/unit/test_semantic_route_stickiness.py b/agent_framework_oci/tests/unit/test_semantic_route_stickiness.py index 26135831..6e4631e3 100644 --- a/agent_framework_oci/tests/unit/test_semantic_route_stickiness.py +++ b/agent_framework_oci/tests/unit/test_semantic_route_stickiness.py @@ -89,6 +89,9 @@ async def test_continue_bypasses_router_without_regex_rules(): assert decision.method == "continuity" assert decision.metadata["route_bypassed"] is True assert llm.calls[0][1]["profile_name"] == "route_continuity" + # LLM tuning belongs to llm_profiles.yaml; continuity must not override it. + assert "max_tokens" not in llm.calls[0][1] + assert "temperature" not in llm.calls[0][1] prompt = json.loads(llm.calls[0][0][1]["content"]) assert prompt["current_message"] == "o que está incluso?" assert "product_agent" not in prompt["other_agents"] diff --git a/app/__pycache__/__init__.cpython-313.pyc b/app/__pycache__/__init__.cpython-313.pyc index 0b6e03fa..5c1ba224 100644 Binary files a/app/__pycache__/__init__.cpython-313.pyc and b/app/__pycache__/__init__.cpython-313.pyc differ diff --git a/app/__pycache__/main.cpython-313.pyc b/app/__pycache__/main.cpython-313.pyc index c2b57804..8f9ac0a9 100644 Binary files a/app/__pycache__/main.cpython-313.pyc and b/app/__pycache__/main.cpython-313.pyc differ diff --git a/app/__pycache__/state.cpython-313.pyc b/app/__pycache__/state.cpython-313.pyc index bf95d219..54d78a25 100644 Binary files a/app/__pycache__/state.cpython-313.pyc and b/app/__pycache__/state.cpython-313.pyc differ diff --git a/app/agents/__pycache__/contas_prompting.cpython-313.pyc b/app/agents/__pycache__/contas_prompting.cpython-313.pyc index 9606a1a2..7dc294f0 100644 Binary files a/app/agents/__pycache__/contas_prompting.cpython-313.pyc and b/app/agents/__pycache__/contas_prompting.cpython-313.pyc differ diff --git a/app/agents/__pycache__/contestacao_agent.cpython-313.pyc b/app/agents/__pycache__/contestacao_agent.cpython-313.pyc index 8b263178..dda92579 100644 Binary files a/app/agents/__pycache__/contestacao_agent.cpython-313.pyc and b/app/agents/__pycache__/contestacao_agent.cpython-313.pyc differ diff --git a/app/agents/__pycache__/faturas_agent.cpython-313.pyc b/app/agents/__pycache__/faturas_agent.cpython-313.pyc index fde4c07e..b4e19bcb 100644 Binary files a/app/agents/__pycache__/faturas_agent.cpython-313.pyc and b/app/agents/__pycache__/faturas_agent.cpython-313.pyc differ diff --git a/app/agents/__pycache__/prompting.cpython-313.pyc b/app/agents/__pycache__/prompting.cpython-313.pyc index 82d86ddc..8ed7c033 100644 Binary files a/app/agents/__pycache__/prompting.cpython-313.pyc and b/app/agents/__pycache__/prompting.cpython-313.pyc differ diff --git a/app/agents/__pycache__/runtime.cpython-313.pyc b/app/agents/__pycache__/runtime.cpython-313.pyc index a4fbd5b6..323c858d 100644 Binary files a/app/agents/__pycache__/runtime.cpython-313.pyc and b/app/agents/__pycache__/runtime.cpython-313.pyc differ diff --git a/app/agents/__pycache__/suporte_contas_agent.cpython-313.pyc b/app/agents/__pycache__/suporte_contas_agent.cpython-313.pyc index 9e59032d..125586ca 100644 Binary files a/app/agents/__pycache__/suporte_contas_agent.cpython-313.pyc and b/app/agents/__pycache__/suporte_contas_agent.cpython-313.pyc differ diff --git a/app/agents/__pycache__/vas_agent.cpython-313.pyc b/app/agents/__pycache__/vas_agent.cpython-313.pyc index 2a55feb4..1b8ae6f4 100644 Binary files a/app/agents/__pycache__/vas_agent.cpython-313.pyc and b/app/agents/__pycache__/vas_agent.cpython-313.pyc differ diff --git a/app/domain/__pycache__/__init__.cpython-313.pyc b/app/domain/__pycache__/__init__.cpython-313.pyc index 983b8774..522a7c26 100644 Binary files a/app/domain/__pycache__/__init__.cpython-313.pyc and b/app/domain/__pycache__/__init__.cpython-313.pyc differ diff --git a/app/domain/contas/__pycache__/__init__.cpython-313.pyc b/app/domain/contas/__pycache__/__init__.cpython-313.pyc index e2b8dd5f..2614921b 100644 Binary files a/app/domain/contas/__pycache__/__init__.cpython-313.pyc and b/app/domain/contas/__pycache__/__init__.cpython-313.pyc differ diff --git a/app/domain/contas/__pycache__/client.cpython-313.pyc b/app/domain/contas/__pycache__/client.cpython-313.pyc index 11d57f1a..eb63b194 100644 Binary files a/app/domain/contas/__pycache__/client.cpython-313.pyc and b/app/domain/contas/__pycache__/client.cpython-313.pyc differ diff --git a/app/domain/contas/__pycache__/contestation_rules.cpython-313.pyc b/app/domain/contas/__pycache__/contestation_rules.cpython-313.pyc index 5a8d6ef0..b6d303a7 100644 Binary files a/app/domain/contas/__pycache__/contestation_rules.cpython-313.pyc and b/app/domain/contas/__pycache__/contestation_rules.cpython-313.pyc differ diff --git a/app/domain/contas/__pycache__/contestation_validation.cpython-313.pyc b/app/domain/contas/__pycache__/contestation_validation.cpython-313.pyc index 0cfae966..7e8da73a 100644 Binary files a/app/domain/contas/__pycache__/contestation_validation.cpython-313.pyc and b/app/domain/contas/__pycache__/contestation_validation.cpython-313.pyc differ diff --git a/app/domain/contas/__pycache__/ic_tags.cpython-313.pyc b/app/domain/contas/__pycache__/ic_tags.cpython-313.pyc index 83386386..84eee0a3 100644 Binary files a/app/domain/contas/__pycache__/ic_tags.cpython-313.pyc and b/app/domain/contas/__pycache__/ic_tags.cpython-313.pyc differ diff --git a/app/domain/contas/__pycache__/informational_context.cpython-313.pyc b/app/domain/contas/__pycache__/informational_context.cpython-313.pyc index a80d983d..c66c9992 100644 Binary files a/app/domain/contas/__pycache__/informational_context.cpython-313.pyc and b/app/domain/contas/__pycache__/informational_context.cpython-313.pyc differ diff --git a/app/domain/contas/__pycache__/invoice_context.cpython-313.pyc b/app/domain/contas/__pycache__/invoice_context.cpython-313.pyc index d7ea4521..bd121d29 100644 Binary files a/app/domain/contas/__pycache__/invoice_context.cpython-313.pyc and b/app/domain/contas/__pycache__/invoice_context.cpython-313.pyc differ diff --git a/app/domain/contas/__pycache__/invoice_models.cpython-313.pyc b/app/domain/contas/__pycache__/invoice_models.cpython-313.pyc index defbd44e..551af990 100644 Binary files a/app/domain/contas/__pycache__/invoice_models.cpython-313.pyc and b/app/domain/contas/__pycache__/invoice_models.cpython-313.pyc differ diff --git a/app/domain/contas/__pycache__/invoice_resolver.cpython-313.pyc b/app/domain/contas/__pycache__/invoice_resolver.cpython-313.pyc index 03fa0fa1..3eedc42b 100644 Binary files a/app/domain/contas/__pycache__/invoice_resolver.cpython-313.pyc and b/app/domain/contas/__pycache__/invoice_resolver.cpython-313.pyc differ diff --git a/app/domain/contas/__pycache__/item_matcher.cpython-313.pyc b/app/domain/contas/__pycache__/item_matcher.cpython-313.pyc index 75d1b5df..535667c7 100644 Binary files a/app/domain/contas/__pycache__/item_matcher.cpython-313.pyc and b/app/domain/contas/__pycache__/item_matcher.cpython-313.pyc differ diff --git a/app/domain/contas/__pycache__/pro_rata_rules.cpython-313.pyc b/app/domain/contas/__pycache__/pro_rata_rules.cpython-313.pyc index 91ded5a0..b34aec27 100644 Binary files a/app/domain/contas/__pycache__/pro_rata_rules.cpython-313.pyc and b/app/domain/contas/__pycache__/pro_rata_rules.cpython-313.pyc differ diff --git a/app/domain/contas/__pycache__/protocol_triplets.cpython-313.pyc b/app/domain/contas/__pycache__/protocol_triplets.cpython-313.pyc index 9ac20e9a..1e0f7f4f 100644 Binary files a/app/domain/contas/__pycache__/protocol_triplets.cpython-313.pyc and b/app/domain/contas/__pycache__/protocol_triplets.cpython-313.pyc differ diff --git a/app/domain/contas/__pycache__/rct_policy.cpython-313.pyc b/app/domain/contas/__pycache__/rct_policy.cpython-313.pyc index 1af2b4e4..80a272ef 100644 Binary files a/app/domain/contas/__pycache__/rct_policy.cpython-313.pyc and b/app/domain/contas/__pycache__/rct_policy.cpython-313.pyc differ diff --git a/app/domain/contas/__pycache__/service.cpython-313.pyc b/app/domain/contas/__pycache__/service.cpython-313.pyc index ee911981..a239bbda 100644 Binary files a/app/domain/contas/__pycache__/service.cpython-313.pyc and b/app/domain/contas/__pycache__/service.cpython-313.pyc differ diff --git a/app/domain/contas/__pycache__/string_metrics.cpython-313.pyc b/app/domain/contas/__pycache__/string_metrics.cpython-313.pyc index b1bf41fb..37156130 100644 Binary files a/app/domain/contas/__pycache__/string_metrics.cpython-313.pyc and b/app/domain/contas/__pycache__/string_metrics.cpython-313.pyc differ diff --git a/app/domain/contas/__pycache__/vas_cancellation_message.cpython-313.pyc b/app/domain/contas/__pycache__/vas_cancellation_message.cpython-313.pyc index 8bbf65e1..c512d017 100644 Binary files a/app/domain/contas/__pycache__/vas_cancellation_message.cpython-313.pyc and b/app/domain/contas/__pycache__/vas_cancellation_message.cpython-313.pyc differ diff --git a/app/domain/contas/__pycache__/vas_variation.cpython-313.pyc b/app/domain/contas/__pycache__/vas_variation.cpython-313.pyc index 1c16ff34..8506e24f 100644 Binary files a/app/domain/contas/__pycache__/vas_variation.cpython-313.pyc and b/app/domain/contas/__pycache__/vas_variation.cpython-313.pyc differ diff --git a/app/domain/contas/__pycache__/workflow_actions.cpython-313.pyc b/app/domain/contas/__pycache__/workflow_actions.cpython-313.pyc index fbe06715..abd0cd2b 100644 Binary files a/app/domain/contas/__pycache__/workflow_actions.cpython-313.pyc and b/app/domain/contas/__pycache__/workflow_actions.cpython-313.pyc differ diff --git a/app/domain/contas/integrations/__pycache__/secure_pdf_crypto.cpython-313.pyc b/app/domain/contas/integrations/__pycache__/secure_pdf_crypto.cpython-313.pyc index b593c2d0..15effbc7 100644 Binary files a/app/domain/contas/integrations/__pycache__/secure_pdf_crypto.cpython-313.pyc and b/app/domain/contas/integrations/__pycache__/secure_pdf_crypto.cpython-313.pyc differ diff --git a/app/domain/contas/parsers/__pycache__/__init__.cpython-313.pyc b/app/domain/contas/parsers/__pycache__/__init__.cpython-313.pyc index d18992b7..513f66b9 100644 Binary files a/app/domain/contas/parsers/__pycache__/__init__.cpython-313.pyc and b/app/domain/contas/parsers/__pycache__/__init__.cpython-313.pyc differ diff --git a/app/domain/contas/parsers/__pycache__/bill_parser.cpython-313.pyc b/app/domain/contas/parsers/__pycache__/bill_parser.cpython-313.pyc index de785cd3..93f5e687 100644 Binary files a/app/domain/contas/parsers/__pycache__/bill_parser.cpython-313.pyc and b/app/domain/contas/parsers/__pycache__/bill_parser.cpython-313.pyc differ diff --git a/app/domain/contas/parsers/__pycache__/bill_processor.cpython-313.pyc b/app/domain/contas/parsers/__pycache__/bill_processor.cpython-313.pyc index 65731eac..f381e52b 100644 Binary files a/app/domain/contas/parsers/__pycache__/bill_processor.cpython-313.pyc and b/app/domain/contas/parsers/__pycache__/bill_processor.cpython-313.pyc differ diff --git a/app/extensions/__pycache__/__init__.cpython-313.pyc b/app/extensions/__pycache__/__init__.cpython-313.pyc index 81f21896..89906b51 100644 Binary files a/app/extensions/__pycache__/__init__.cpython-313.pyc and b/app/extensions/__pycache__/__init__.cpython-313.pyc differ diff --git a/app/extensions/__pycache__/tim_guardrails.cpython-313.pyc b/app/extensions/__pycache__/tim_guardrails.cpython-313.pyc index 5b371f35..242959dd 100644 Binary files a/app/extensions/__pycache__/tim_guardrails.cpython-313.pyc and b/app/extensions/__pycache__/tim_guardrails.cpython-313.pyc differ diff --git a/app/extensions/__pycache__/tim_judges.cpython-313.pyc b/app/extensions/__pycache__/tim_judges.cpython-313.pyc index 15cdadd9..4c28b9c3 100644 Binary files a/app/extensions/__pycache__/tim_judges.cpython-313.pyc and b/app/extensions/__pycache__/tim_judges.cpython-313.pyc differ diff --git a/app/extensions/tim_prompts/__pycache__/__init__.cpython-313.pyc b/app/extensions/tim_prompts/__pycache__/__init__.cpython-313.pyc index 662f4bc2..4824e06a 100644 Binary files a/app/extensions/tim_prompts/__pycache__/__init__.cpython-313.pyc and b/app/extensions/tim_prompts/__pycache__/__init__.cpython-313.pyc differ diff --git a/app/extensions/tim_prompts/__pycache__/aluc.cpython-313.pyc b/app/extensions/tim_prompts/__pycache__/aluc.cpython-313.pyc index 39519f25..fd3dcc00 100644 Binary files a/app/extensions/tim_prompts/__pycache__/aluc.cpython-313.pyc and b/app/extensions/tim_prompts/__pycache__/aluc.cpython-313.pyc differ diff --git a/app/extensions/tim_prompts/__pycache__/ausencia_oferta_proativa.cpython-313.pyc b/app/extensions/tim_prompts/__pycache__/ausencia_oferta_proativa.cpython-313.pyc index ee054fbd..c3588c1a 100644 Binary files a/app/extensions/tim_prompts/__pycache__/ausencia_oferta_proativa.cpython-313.pyc and b/app/extensions/tim_prompts/__pycache__/ausencia_oferta_proativa.cpython-313.pyc differ diff --git a/app/extensions/tim_prompts/__pycache__/fraseologia.cpython-313.pyc b/app/extensions/tim_prompts/__pycache__/fraseologia.cpython-313.pyc index d7a73ac8..8f014b83 100644 Binary files a/app/extensions/tim_prompts/__pycache__/fraseologia.cpython-313.pyc and b/app/extensions/tim_prompts/__pycache__/fraseologia.cpython-313.pyc differ diff --git a/app/extensions/tim_prompts/__pycache__/out_of_scope.cpython-313.pyc b/app/extensions/tim_prompts/__pycache__/out_of_scope.cpython-313.pyc index 57ef7b65..2c4e2fbd 100644 Binary files a/app/extensions/tim_prompts/__pycache__/out_of_scope.cpython-313.pyc and b/app/extensions/tim_prompts/__pycache__/out_of_scope.cpython-313.pyc differ diff --git a/app/extensions/tim_prompts/__pycache__/revprec.cpython-313.pyc b/app/extensions/tim_prompts/__pycache__/revprec.cpython-313.pyc index 827aeaf2..5d4143ae 100644 Binary files a/app/extensions/tim_prompts/__pycache__/revprec.cpython-313.pyc and b/app/extensions/tim_prompts/__pycache__/revprec.cpython-313.pyc differ diff --git a/app/extensions/tim_prompts/__pycache__/rqlt.cpython-313.pyc b/app/extensions/tim_prompts/__pycache__/rqlt.cpython-313.pyc index c95cb84a..706510f7 100644 Binary files a/app/extensions/tim_prompts/__pycache__/rqlt.cpython-313.pyc and b/app/extensions/tim_prompts/__pycache__/rqlt.cpython-313.pyc differ diff --git a/app/observability/__pycache__/__init__.cpython-313.pyc b/app/observability/__pycache__/__init__.cpython-313.pyc index 6b207c7e..0108ccf9 100644 Binary files a/app/observability/__pycache__/__init__.cpython-313.pyc and b/app/observability/__pycache__/__init__.cpython-313.pyc differ diff --git a/app/observability/__pycache__/telemetry_observer.cpython-313.pyc b/app/observability/__pycache__/telemetry_observer.cpython-313.pyc index ddbac9c3..677bffa9 100644 Binary files a/app/observability/__pycache__/telemetry_observer.cpython-313.pyc and b/app/observability/__pycache__/telemetry_observer.cpython-313.pyc differ diff --git a/app/presentation/__pycache__/__init__.cpython-313.pyc b/app/presentation/__pycache__/__init__.cpython-313.pyc index c79ce644..e52c0954 100644 Binary files a/app/presentation/__pycache__/__init__.cpython-313.pyc and b/app/presentation/__pycache__/__init__.cpython-313.pyc differ diff --git a/app/presentation/__pycache__/tool_renderers.cpython-313.pyc b/app/presentation/__pycache__/tool_renderers.cpython-313.pyc index 191cf84f..4ef11a49 100644 Binary files a/app/presentation/__pycache__/tool_renderers.cpython-313.pyc and b/app/presentation/__pycache__/tool_renderers.cpython-313.pyc differ diff --git a/app/workflows/__pycache__/agent_graph.cpython-313.pyc b/app/workflows/__pycache__/agent_graph.cpython-313.pyc index 84c39066..1cfee2a1 100644 Binary files a/app/workflows/__pycache__/agent_graph.cpython-313.pyc and b/app/workflows/__pycache__/agent_graph.cpython-313.pyc differ diff --git a/app/workflows/agent_graph.py b/app/workflows/agent_graph.py index c4a0ca52..c05b8491 100644 --- a/app/workflows/agent_graph.py +++ b/app/workflows/agent_graph.py @@ -161,8 +161,81 @@ class AgentWorkflow: if current_user_text: if not history or str((history[-1] or {}).get("content") or "") != current_user_text or str((history[-1] or {}).get("role") or "") != "user": history.append({"role": "user", "content": current_user_text}) - ctx["conversation_history"] = history - ctx["history_texts"] = [str(item.get("content") or "") for item in history if isinstance(item, dict) and item.get("content") not in (None, "")] + + # Guardrails de domínio precisam julgar a solicitação do turno atual, não + # reabrir semanticamente uma transação já encerrada. O router já ignora + # COMPLETED/FAILED/CANCELLED/BLOCKED/OUT_OF_SCOPE para continuidade; o + # mesmo princípio precisa valer para o contexto operacional dos rails. + # + # Importante: não apagamos o histórico do state/checkpoint (auditoria). + # Apenas recortamos o contexto enviado aos guardrails quando há evidência + # explícita de que o turno atual saiu da transação anterior: seja por + # interrupção semântica (transaction_interruption=intent_shift), seja por + # preempção de stickiness após uma transação terminal. + 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" + # Remova do contexto operacional quaisquer snapshots transacionais + # antigos eventualmente carregados em state.context. Eles continuam + # preservados no state para auditoria/checkpoint. + 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() diff --git a/config/prompts/billing.yaml b/config/prompts/billing.yaml index 959b6171..3500fbb1 100644 --- a/config/prompts/billing.yaml +++ b/config/prompts/billing.yaml @@ -16,8 +16,19 @@ system: | Não use informações de uma cobrança antiga para completar a pergunta atual. - Quando houver resultado de tool, não extrapole procedimentos ou políticas - que não estejam nesse resultado. + Quando houver resultado de tool, responda exclusivamente com informações presentes + nesse resultado ou em evidência autorizada recebida no contexto atual. Não extrapole + procedimentos, políticas, canais ou próximos passos que não estejam explicitamente + sustentados por essa evidência. + + Em consultas informativas de fatura (por exemplo, contas_invoice_query), apresente + somente os dados solicitados ou diretamente úteis retornados pela tool. Não acrescente + espontaneamente telefone, código USSD, URL, aplicativo, loja, canal de atendimento, + relatório adicional, procedimento alternativo ou orientação para procurar outro canal. + Em particular, não recomende ligar para *144, solicitar Relatório Detalhado Pós-Pago + ou equivalente, salvo se essa orientação tiver sido explicitamente retornada por tool/RAG + para a solicitação atual. Após responder ao que o cliente pediu, encerre a resposta. + Em fluxos informativos de explicação de fatura, não ofereça espontaneamente ações transacionais como cancelar, contestar, ajustar, creditar, ressarcir ou devolver. Se o workflow retornar uma mensagem de pausa/pergunta ao cliente, preserve essa diff --git a/config/prompts/contestation.yaml b/config/prompts/contestation.yaml index 3d20fdb0..1d4c0525 100644 --- a/config/prompts/contestation.yaml +++ b/config/prompts/contestation.yaml @@ -35,9 +35,15 @@ system: | - não declare sucesso quando a tool falhou ou bloqueou; - não invente protocolo. - Se a tool retornar OUT_OF_SCOPE, bloqueio ou categoria não tratável, - explique somente o motivo efetivamente retornado. - Não invente canal alternativo, central de atendimento, gravações, histórico, - prazo, estorno, recurso ou procedimento que não esteja explícito em tool ou RAG. + Se a tool retornar OUT_OF_SCOPE, bloqueio ou categoria não tratável: + - explique somente o motivo efetivamente retornado; + - encerre a resposta imediatamente após explicar o motivo; + - não ofereça outra ação, outro item, cancelamento, alteração, nova contestação + ou qualquer próximo passo; + - não convide o cliente a continuar com frases como "se desejar", "caso queira", + "posso", "podemos", "informe outro item" ou equivalentes; + - não proponha canal alternativo, central de atendimento, gravações, histórico, + prazo, estorno, recurso ou procedimento que não esteja explícito em tool ou RAG. - Seja objetivo e responda apenas sobre a solicitação atual. \ No newline at end of file + Em resultado terminal, a resposta deve terminar na explicação do resultado atual. + Seja objetivo e responda apenas sobre a solicitação atual. diff --git a/config/prompts/vas.yaml b/config/prompts/vas.yaml index 9f04a04e..cf296d8f 100644 --- a/config/prompts/vas.yaml +++ b/config/prompts/vas.yaml @@ -6,6 +6,7 @@ system: | Não duplique regras de roteamento, continuidade, clarificação, guardrails ou memória no prompt. Em consultas informativas, responda somente com os dados solicitados e retornados pelas tools/RAG. + Se o cliente apenas pedir para listar/consultar seus serviços, não exponha capacidades transacionais retornadas pela tool, como can.cancel, cancel=true, "Cancelamento disponível", possibilidade de cancelar, contratar, trocar ou gerenciar, a menos que o cliente tenha perguntado explicitamente sobre essa capacidade. Não ofereça espontaneamente contratação, cancelamento, troca, gerenciamento ou qualquer outra ação. Não termine a resposta com perguntas, convites ou frases como "se quiser", "posso ajudar", "é só me avisar", "posso fazer", "deseja realizar alguma ação". Pode informar características do serviço somente quando estiverem explicitamente presentes nos dados retornados. diff --git a/contas_mcp/__pycache__/__init__.cpython-313.pyc b/contas_mcp/__pycache__/__init__.cpython-313.pyc index e7f5a622..d7adebb6 100644 Binary files a/contas_mcp/__pycache__/__init__.cpython-313.pyc and b/contas_mcp/__pycache__/__init__.cpython-313.pyc differ diff --git a/contas_mcp/servers/__pycache__/__init__.cpython-313.pyc b/contas_mcp/servers/__pycache__/__init__.cpython-313.pyc index eb790fe2..856ee356 100644 Binary files a/contas_mcp/servers/__pycache__/__init__.cpython-313.pyc and b/contas_mcp/servers/__pycache__/__init__.cpython-313.pyc differ diff --git a/contas_mcp/servers/contas_mcp_server/__pycache__/__init__.cpython-313.pyc b/contas_mcp/servers/contas_mcp_server/__pycache__/__init__.cpython-313.pyc index a6fb47e8..7a823fe6 100644 Binary files a/contas_mcp/servers/contas_mcp_server/__pycache__/__init__.cpython-313.pyc and b/contas_mcp/servers/contas_mcp_server/__pycache__/__init__.cpython-313.pyc differ diff --git a/contas_mcp/servers/contas_mcp_server/__pycache__/main.cpython-313.pyc b/contas_mcp/servers/contas_mcp_server/__pycache__/main.cpython-313.pyc index 66fee146..33f38b2d 100644 Binary files a/contas_mcp/servers/contas_mcp_server/__pycache__/main.cpython-313.pyc and b/contas_mcp/servers/contas_mcp_server/__pycache__/main.cpython-313.pyc differ diff --git a/contas_mcp/servers/contas_mcp_server/main.py b/contas_mcp/servers/contas_mcp_server/main.py index 6e51f5f0..6b0e166f 100644 --- a/contas_mcp/servers/contas_mcp_server/main.py +++ b/contas_mcp/servers/contas_mcp_server/main.py @@ -189,12 +189,26 @@ def _invoice_subject_catalog(args: dict[str, Any]) -> list[dict[str, Any]]: def _recover_explicit_contestation_subject(args: dict[str, Any]) -> dict[str, Any] | None: """Recupera item explicitamente citado no texto original da contestação. - Na confirmação a mensagem corrente pode ser apenas ``sim``. O ``motivo``/ - ``descricao`` preserva a fala que abriu a transação e é uma fonte mais forte - que um ``subject`` residual. Só corrige quando há exatamente um nome canônico - da fatura explicitamente presente; não faz fuzzy matching. + Na confirmação a mensagem corrente pode ser apenas ``sim``. A fala que abriu + a transação pode chegar por campos diferentes conforme o runtime/provedor + (por exemplo ``query``, ``operator_instructions``, ``message``, ``text``, + ``motivo`` ou ``descricao``). Essas fontes textuais são mais fortes que um + ``subject`` residual. Só corrige quando há exatamente um nome canônico da + fatura explicitamente presente; não faz fuzzy matching. """ - original = " ".join(str(args.get(k) or "") for k in ("motivo", "descricao")).strip() + text_source_fields = ( + "query", + "operator_instructions", + "message", + "text", + "motivo", + "descricao", + ) + original = " ".join( + str(args.get(k) or "").strip() + for k in text_source_fields + if args.get(k) + ).strip() if not original: return None norm_original = f" {_norm_invoice_name(original)} " diff --git a/tests/migration/__pycache__/conftest.cpython-313-pytest-9.0.2.pyc b/tests/migration/__pycache__/conftest.cpython-313-pytest-9.0.2.pyc index 5ceea6bb..3bad8daf 100644 Binary files a/tests/migration/__pycache__/conftest.cpython-313-pytest-9.0.2.pyc and b/tests/migration/__pycache__/conftest.cpython-313-pytest-9.0.2.pyc differ diff --git a/tests/migration/__pycache__/test_adversarial_parity.cpython-313-pytest-9.0.2.pyc b/tests/migration/__pycache__/test_adversarial_parity.cpython-313-pytest-9.0.2.pyc index bfdfde66..0e95f4d2 100644 Binary files a/tests/migration/__pycache__/test_adversarial_parity.cpython-313-pytest-9.0.2.pyc and b/tests/migration/__pycache__/test_adversarial_parity.cpython-313-pytest-9.0.2.pyc differ diff --git a/tests/migration/__pycache__/test_contestation_business_rules_full.cpython-313-pytest-9.0.2.pyc b/tests/migration/__pycache__/test_contestation_business_rules_full.cpython-313-pytest-9.0.2.pyc index 191a54c9..d7051bf5 100644 Binary files a/tests/migration/__pycache__/test_contestation_business_rules_full.cpython-313-pytest-9.0.2.pyc and b/tests/migration/__pycache__/test_contestation_business_rules_full.cpython-313-pytest-9.0.2.pyc differ diff --git a/tests/migration/__pycache__/test_contestation_failure_mapping.cpython-313-pytest-9.0.2.pyc b/tests/migration/__pycache__/test_contestation_failure_mapping.cpython-313-pytest-9.0.2.pyc index 1af43645..25ac0f0d 100644 Binary files a/tests/migration/__pycache__/test_contestation_failure_mapping.cpython-313-pytest-9.0.2.pyc and b/tests/migration/__pycache__/test_contestation_failure_mapping.cpython-313-pytest-9.0.2.pyc differ diff --git a/tests/migration/__pycache__/test_contestation_prompt_terminal_out_of_scope.cpython-313-pytest-9.0.2.pyc b/tests/migration/__pycache__/test_contestation_prompt_terminal_out_of_scope.cpython-313-pytest-9.0.2.pyc new file mode 100644 index 00000000..47993b94 Binary files /dev/null and b/tests/migration/__pycache__/test_contestation_prompt_terminal_out_of_scope.cpython-313-pytest-9.0.2.pyc differ diff --git a/tests/migration/__pycache__/test_external_guardrails_judges_spi.cpython-313-pytest-9.0.2.pyc b/tests/migration/__pycache__/test_external_guardrails_judges_spi.cpython-313-pytest-9.0.2.pyc index b7f9c1bd..c9a05f97 100644 Binary files a/tests/migration/__pycache__/test_external_guardrails_judges_spi.cpython-313-pytest-9.0.2.pyc and b/tests/migration/__pycache__/test_external_guardrails_judges_spi.cpython-313-pytest-9.0.2.pyc differ diff --git a/tests/migration/__pycache__/test_guardrail_binary_parity.cpython-313-pytest-9.0.2.pyc b/tests/migration/__pycache__/test_guardrail_binary_parity.cpython-313-pytest-9.0.2.pyc index 7e81c6a9..bfb51655 100644 Binary files a/tests/migration/__pycache__/test_guardrail_binary_parity.cpython-313-pytest-9.0.2.pyc and b/tests/migration/__pycache__/test_guardrail_binary_parity.cpython-313-pytest-9.0.2.pyc differ diff --git a/tests/migration/__pycache__/test_guardrail_context_dict_history.cpython-313-pytest-9.0.2.pyc b/tests/migration/__pycache__/test_guardrail_context_dict_history.cpython-313-pytest-9.0.2.pyc index 3467c150..f42a41af 100644 Binary files a/tests/migration/__pycache__/test_guardrail_context_dict_history.cpython-313-pytest-9.0.2.pyc and b/tests/migration/__pycache__/test_guardrail_context_dict_history.cpython-313-pytest-9.0.2.pyc differ diff --git a/tests/migration/__pycache__/test_guardrail_original_defaults_parity.cpython-313-pytest-9.0.2.pyc b/tests/migration/__pycache__/test_guardrail_original_defaults_parity.cpython-313-pytest-9.0.2.pyc index 5a7ab7b6..57195089 100644 Binary files a/tests/migration/__pycache__/test_guardrail_original_defaults_parity.cpython-313-pytest-9.0.2.pyc and b/tests/migration/__pycache__/test_guardrail_original_defaults_parity.cpython-313-pytest-9.0.2.pyc differ diff --git a/tests/migration/__pycache__/test_mcp_contestation_subject_guard.cpython-313-pytest-9.0.2.pyc b/tests/migration/__pycache__/test_mcp_contestation_subject_guard.cpython-313-pytest-9.0.2.pyc index 5a836db8..03ad0c3d 100644 Binary files a/tests/migration/__pycache__/test_mcp_contestation_subject_guard.cpython-313-pytest-9.0.2.pyc and b/tests/migration/__pycache__/test_mcp_contestation_subject_guard.cpython-313-pytest-9.0.2.pyc differ diff --git a/tests/migration/__pycache__/test_original_vas_cancellation_message.cpython-313-pytest-9.0.2.pyc b/tests/migration/__pycache__/test_original_vas_cancellation_message.cpython-313-pytest-9.0.2.pyc index b8e0fe25..6869f091 100644 Binary files a/tests/migration/__pycache__/test_original_vas_cancellation_message.cpython-313-pytest-9.0.2.pyc and b/tests/migration/__pycache__/test_original_vas_cancellation_message.cpython-313-pytest-9.0.2.pyc differ diff --git a/tests/migration/__pycache__/test_original_vas_variation.cpython-313-pytest-9.0.2.pyc b/tests/migration/__pycache__/test_original_vas_variation.cpython-313-pytest-9.0.2.pyc index 1d685993..30ba8aa0 100644 Binary files a/tests/migration/__pycache__/test_original_vas_variation.cpython-313-pytest-9.0.2.pyc and b/tests/migration/__pycache__/test_original_vas_variation.cpython-313-pytest-9.0.2.pyc differ diff --git a/tests/migration/__pycache__/test_original_vas_variation_adversarial.cpython-313-pytest-9.0.2.pyc b/tests/migration/__pycache__/test_original_vas_variation_adversarial.cpython-313-pytest-9.0.2.pyc index b83f684c..db50ba2d 100644 Binary files a/tests/migration/__pycache__/test_original_vas_variation_adversarial.cpython-313-pytest-9.0.2.pyc and b/tests/migration/__pycache__/test_original_vas_variation_adversarial.cpython-313-pytest-9.0.2.pyc differ diff --git a/tests/migration/__pycache__/test_tim_aoferta_transaction_continuation.cpython-313-pytest-9.0.2.pyc b/tests/migration/__pycache__/test_tim_aoferta_transaction_continuation.cpython-313-pytest-9.0.2.pyc new file mode 100644 index 00000000..4ccd3ea3 Binary files /dev/null and b/tests/migration/__pycache__/test_tim_aoferta_transaction_continuation.cpython-313-pytest-9.0.2.pyc differ diff --git a/tests/migration/__pycache__/test_vas_response_renderer.cpython-313-pytest-9.0.2.pyc b/tests/migration/__pycache__/test_vas_response_renderer.cpython-313-pytest-9.0.2.pyc index 0e32b184..481b290c 100644 Binary files a/tests/migration/__pycache__/test_vas_response_renderer.cpython-313-pytest-9.0.2.pyc and b/tests/migration/__pycache__/test_vas_response_renderer.cpython-313-pytest-9.0.2.pyc differ diff --git a/tests/migration/test_adversarial_parity.py b/tests/migration/test_adversarial_parity.py index 86d40e0a..86991991 100644 --- a/tests/migration/test_adversarial_parity.py +++ b/tests/migration/test_adversarial_parity.py @@ -393,3 +393,97 @@ def test_output_guardrail_context_nao_duplica_user_text_ja_no_historico(): } ) assert len(ctx["conversation_history"]) == 1 + + +def test_output_guardrail_context_isola_transacao_terminal_apos_intent_shift(): + from app.workflows.agent_graph import AgentWorkflow + + ctx = AgentWorkflow._output_guardrail_context( + { + "context": { + "transaction_pre_validation": { + "status": "OUT_OF_SCOPE", + "terminal": True, + "error": "TIM CTRL Redes Sociais 8.0", + }, + }, + "history": [ + {"role": "user", "content": "nao contratei TIM CTRL Redes Sociais 8.0"}, + {"role": "assistant", "content": "Esse item nao e contestavel."}, + ], + "user_text": "quais sao meus servicos", + "route": "vas_agent", + "intent": "contas_vas_information", + "route_decision": { + "route": "vas_agent", + "intent": "contas_vas_information", + "metadata": { + "route_stickiness_preempted": True, + "previous_agent": "contestacao_agent", + "previous_intent": "contas_contestation", + }, + }, + "transaction_status": "OUT_OF_SCOPE", + "transaction_pre_validation": { + "status": "OUT_OF_SCOPE", + "terminal": True, + "error": "TIM CTRL Redes Sociais 8.0", + }, + "mcp_results": [], + } + ) + + assert ctx["conversation_history"] == [ + {"role": "user", "content": "quais sao meus servicos"} + ] + assert ctx["history_texts"] == ["quais sao meus servicos"] + assert ctx["current_user_message"] == "quais sao meus servicos" + assert ctx["current_route"] == "vas_agent" + assert ctx["current_intent"] == "contas_vas_information" + assert ctx["historical_transaction_ignored"] is True + assert ctx["historical_transaction_status"] == "OUT_OF_SCOPE" + assert "transaction_pre_validation" not in ctx + assert "TIM CTRL Redes Sociais" not in str(ctx) + + +def test_output_guardrail_context_preserva_historico_no_turno_terminal_sem_intent_shift(): + from app.workflows.agent_graph import AgentWorkflow + + ctx = AgentWorkflow._output_guardrail_context( + { + "context": {}, + "history": [ + {"role": "user", "content": "nao contratei TIM CTRL Redes Sociais 8.0"}, + ], + "user_text": "o valor e 71,99", + "route": "contestacao_agent", + "intent": "state:COLLECTING_CONTESTACAO_PARAMETERS", + "route_decision": { + "route": "contestacao_agent", + "intent": "state:COLLECTING_CONTESTACAO_PARAMETERS", + "metadata": {}, + }, + "transaction_status": "OUT_OF_SCOPE", + "transaction_pre_validation": { + "status": "OUT_OF_SCOPE", + "terminal": True, + }, + "mcp_results": [], + } + ) + + assert ctx["history_texts"] == [ + "nao contratei TIM CTRL Redes Sociais 8.0", + "o valor e 71,99", + ] + assert "historical_transaction_ignored" not in ctx + + +def test_vas_prompt_nao_expoe_capacidade_cancelamento_em_consulta_informativa(): + from pathlib import Path + + prompt = Path("config/prompts/vas.yaml").read_text(encoding="utf-8") + assert "não exponha capacidades transacionais" in prompt + assert "can.cancel" in prompt + assert '"Cancelamento disponível"' in prompt + assert "a menos que o cliente tenha perguntado explicitamente" in prompt diff --git a/tests/migration/test_contestation_prompt_terminal_out_of_scope.py b/tests/migration/test_contestation_prompt_terminal_out_of_scope.py new file mode 100644 index 00000000..f116c9ce --- /dev/null +++ b/tests/migration/test_contestation_prompt_terminal_out_of_scope.py @@ -0,0 +1,11 @@ +from app.agents.contas_prompting import load_domain_prompt + + +def test_contestation_prompt_closes_terminal_out_of_scope_without_proactive_next_step(): + prompt = load_domain_prompt("contestation") + + assert "Se a tool retornar OUT_OF_SCOPE, bloqueio ou categoria não tratável:" in prompt + assert "encerre a resposta imediatamente após explicar o motivo" in prompt + assert "não ofereça outra ação, outro item, cancelamento, alteração, nova contestação" in prompt + assert 'não convide o cliente a continuar com frases como "se desejar", "caso queira"' in prompt + assert "Em resultado terminal, a resposta deve terminar na explicação do resultado atual." in prompt diff --git a/tests/migration/test_mcp_contestation_subject_guard.py b/tests/migration/test_mcp_contestation_subject_guard.py index dffec5e8..eff1ce87 100644 --- a/tests/migration/test_mcp_contestation_subject_guard.py +++ b/tests/migration/test_mcp_contestation_subject_guard.py @@ -92,3 +92,40 @@ def test_invoice_resolver_exact_plan_identity_wins_before_similarity_matcher(): assert outcome.resolved == [] assert len(outcome.out_of_scope) == 1 assert outcome.out_of_scope[0].matches[0].canonical_name == "TIM CTRL Redes Sociais 8.0" + + +def test_recovers_explicit_subject_from_runtime_query_fields_without_motivo(): + args = _args(subject="TIM CTRL Redes Sociais") + args.pop("motivo", None) + args["query"] = "nao contratei TIM CTRL Redes Sociais 8.0" + args["operator_instructions"] = "nao contratei TIM CTRL Redes Sociais 8.0" + args["valor"] = 8 + + item = _recover_explicit_contestation_subject(args) + assert item is not None + assert item["name"] == "TIM CTRL Redes Sociais 8.0" + assert str(item["value"]) == "71.99" + assert item["category"] == "plano" + + result = _preflight_subject("contestar_cobranca", args) + assert result is not None + assert result["status"] == "OUT_OF_SCOPE" + assert result["subject"] == "TIM CTRL Redes Sociais 8.0" + assert result["resolved_value"] == "71.99" + assert result["metadata"]["subject_corrected_from"] == "TIM CTRL Redes Sociais" + assert args["subject"] == "TIM CTRL Redes Sociais 8.0" + assert args["resolved_value"] == "71.99" + + +def test_all_supported_original_text_fields_recover_explicit_subject(): + for field in ("query", "operator_instructions", "message", "text", "motivo", "descricao"): + args = _args(subject="TIM CTRL Redes Sociais") + for candidate in ("query", "operator_instructions", "message", "text", "motivo", "descricao"): + args.pop(candidate, None) + args[field] = "nao contratei TIM CTRL Redes Sociais 8.0" + args["valor"] = 8 + + item = _recover_explicit_contestation_subject(args) + assert item is not None, field + assert item["name"] == "TIM CTRL Redes Sociais 8.0", field + assert str(item["value"]) == "71.99", field