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 4863078..f8c70c4 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 9499deb..ddcd57f 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 4950c71..de09ac2 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 4929616..a726204 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 ba44907..d548db5 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 2550c75..69bd22b 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 1d34064..48f7d5a 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 ce6ebcb..4bcd451 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 64a4f8a..c4901cd 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 e39f099..8c60d8f 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 beafe48..5fd44af 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 c9fa989..384343e 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 617999a..ce3475c 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 059f0dc..20cb3fa 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 deabfe0..8921350 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 567b0d6..1458ff0 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 08357c6..5c31516 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 7d68a98..5285deb 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 44d75e9..13881e7 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 3517624..66072c9 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 f520e90..b4b3fde 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 9a17468..a307663 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 4378e5f..fd5ec41 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 93d4070..a84f951 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 953d8ab..5ad662b 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 820a3cd..a898bfe 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 bc9e8de..333f20d 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 ec90810..47f2463 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 e6c3d6a..f230256 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 d642f11..69e908a 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 cef92f3..5210e7c 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 620bbed..4dc9805 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 3ba77e2..3cae7c9 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 24c2611..2b66521 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 aa1c7ad..656d136 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 c05807e..7909a8a 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 c731bc5..dcf2392 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 9c16e82..4734a86 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 6d2e121..06f9eae 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 170c01a..db931db 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 32d61ea..112d959 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 16ca8d9..f18abd0 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 5bc0873..edb612d 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 160e65c..67c2445 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 e54d65b..7541193 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 b4ab329..d9e53cb 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 fad910e..59f52bb 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 5fde2c2..f758829 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 301eb4e..66f0d1e 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 cdb5396..2c248c3 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 9fb8ff0..7ef5a80 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 213473b..c7c88fa 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 16e8514..908bd59 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 a7fdcd9..b12fd64 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 645c72e..293a24c 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 1f2be21..f7ce815 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 3bf7ebf..d7e938b 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 15d3d08..8d8604f 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 5248f14..9fcf3a3 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 340328e..529052c 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 3022688..07e87ce 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 2c49d3a..251de0c 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 f64d5da..b9fd59f 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 c80d5cd..ada751d 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 c36a2d4..b4a792a 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 f1b478f..8905a4e 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 ff0e3e7..31ddc96 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 dddc419..68f9cbd 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 1b8a9d3..b787756 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 12cab79..62ca20f 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 ecd8196..300c22a 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 d329b33..5e31e72 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 fd5a6a0..1fff83b 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 278bb70..74f244a 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 bf039b9..92b74c0 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 bcc4b67..96af157 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 601538e..a6393b4 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 426217f..ec87619 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 458a998..b764e2a 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 803056f..ca91413 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 9576f69..e3e74e4 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 1bd263f..02973ae 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 e5b5f25..ad81f20 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 ba0ecbf..3f92e87 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 2f9d089..acead03 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 fefe0f5..331448f 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 ad2e1fe..9be9c23 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 b1a0f9e..d947f4d 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 8bb690c..30bd0f3 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 446c506..13620c2 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 f0c64ca..2a8bcc4 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 125d60c..1b4b1f2 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 7ac59d8..d1b0443 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 5d1f48c..c70f960 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 2eee30e..d5664d6 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 b1a0594..0243e60 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 9f4b74b..0fd52f7 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 5d5eeef..f3d4e6a 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 40c3f90..5f63af4 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 4863078..f8c70c4 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 2225db2..8523e2f 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 2e18081..4965994 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 692d923..ce757d7 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 f57e48a..2a481a8 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 0e63775..65d8871 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 ff3e57d..22b3d70 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 03f02ab..7e6b5e8 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 721ad48..03efe84 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 c887205..26f9b5f 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 f323acb..2c6e05d 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 aba5f04..7eeb142 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 9d2d08e..7dd5a20 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 f5734ca..95a4f91 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 b517b93..0ca27c9 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 352b02a..c35712e 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 3432983..fbac24f 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 458e73c..27d7b8f 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 953fbdb..c0dafc3 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 3fc0e83..ae721c4 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 99557e8..6fe3ec3 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 254b973..72a3a3f 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 0000000..9664a07 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 bffe0c2..50a7816 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 3372658..90ea4e1 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 aeb7c6a..d8765ce 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 0000000..245a7bb --- /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 5a278b7..b683e47 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 d3d049d..cc89f5e 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 12989e6..0f9e4af 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 51e8f3d..62cf581 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 c354322..41f361c 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 92e1fbf..a2184ab 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 7ae88b6..1455ef5 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 6f94b5c..bf72c59 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 84cf39d..79c43f7 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 a317c2d..4cade82 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 1a322bb..bcdd694 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 4dc396c..3472676 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 a27f27e..837ee36 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 55be2b9..37d834a 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 10af14f..58daae4 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 f3e25cc..806a543 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 cbe3fd2..4a12ed1 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 16ebb80..1f1d73f 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 5d5e75e..8e92516 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 466aa0e..7a83068 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 5306ee2..45b240c 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 3c2dd38..5ca3097 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 c0ea5e1..f469a9d 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 4efb693..36dc576 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 4405b9f..fe0bd9c 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 48aaa79..fce4799 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 3b16de7..fd18fc0 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 2d37d6d..ccb1323 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 d17dce1..a340117 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 25ec585..185c1fd 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 2c7fb3e..5a623de 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 8fd1dd2..95e8949 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 5ddf5a0..42a053e 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 c387e65..6bc687d 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 5d5ff8b..cf48e74 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 fb3d676..d30f51a 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 6b089b7..7b26f45 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 c2346eb..b5e162e 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 94b1c21..63c06a1 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 46996ad..99dd036 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 e6831cd..b6895c7 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 4518f77..4a1a73d 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 51d66cf..962fa82 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 d81ba84..5c31d32 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 9b33ce3..ee7273b 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 9fd10d5..bb2200e 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 1cb6f4b..2fbeaed 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 4c1891b..c7a1f00 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 2d204cf..f3a89d5 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 d54892f..b11c48d 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 997a762..be1d14f 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 c767fb3..417d540 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 89e025c..0f8e9ff 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 4a94ed8..34028e5 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 b9244ec..dcd5ec7 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 792cd5e..84125b2 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 a2be3e8..06a92f8 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 7ec80b2..6f41b8e 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 5ff8869..e1b46ea 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 2ae837f..156855a 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 837d048..d4b6641 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 475f077..4682a1f 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 d5ac65c..111dafd 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 ab536da..edb64da 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 1c721f3..5c8d321 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 2e80012..c9dd3ee 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 57c4c9c..3cfe661 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 320825c..34c93c2 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 65b4de9..d1fb5e0 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 b6c01e7..685b355 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 5003257..04cd414 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 8338651..97afa37 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 2ba5f61..5309359 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 c521ad1..b69667d 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 dba65ea..2d18d61 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 7c792a6..6022ef8 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 277c35c..10c9a53 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 f695a2f..b709e0d 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 5115c16..59cb344 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 b45edff..17572f2 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 b047262..130bc82 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 0000000..3540833 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 e2a7c21..4b2fda1 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 0000000..2721be2 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 391c614..c7491df 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 0000000..15dcc40 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 4ef41f5..4cbb1d1 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 6fa7a4b..ab54f2c 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 86b3d26..a56a7c0 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 0000000..c0b3bb4 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 29f28f7..289bd4f 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 6fdde9d..d701b12 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 9d8ca51..8d7f43c 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 e1bc6e7..7b19f26 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 5029b3b..2bba895 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 9756659..6300ab3 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 0000000..80588af --- /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 0000000..40acf7f --- /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 f9eff09..d6fe8ed 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 0000000..0cad778 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 a19dcc6..d7ff70e 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 f8d2b6b..4831c43 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 0000000..092f763 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 0000000..f0a24c1 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 0000000..a31b823 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 b34fe31..f8fe590 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 e8f04d4..3a78071 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 bb8f5cf..192c984 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 0000000..e4adf4b 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 0000000..44e704d 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 0000000..64941e7 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 0000000..9e323f1 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 0000000..dbafeb2 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 391cb27..8c40105 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 0000000..0ae3355 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 151b578..3cf6c23 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 e26f6bb..c6608e0 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 88a14b6..db1cf34 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 0000000..b0b1040 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 0000000..d79f76e 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 0000000..3def25f 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 0000000..0aa346b 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 6d28128..6d9294e 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 09c30aa..33ee3e1 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 cbeca66..be26097 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 0000000..0c4a1f9 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 ba86d2a..f10b421 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 2613583..6e4631e 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 0b6e03f..5c1ba22 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 c2b5780..8f9ac0a 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 bf95d21..54d78a2 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 9606a1a..7dc294f 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 8b26317..dda9257 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 fde4c07..b4e19bc 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 82d86dd..8ed7c03 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 a4fbd5b..323c858 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 9e59032..125586c 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 2a55feb..1b8ae6f 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 983b877..522a7c2 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 e2b8dd5..2614921 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 11d57f1..eb63b19 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 5a8d6ef..b6d303a 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 0cfae96..7e8da73 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 8338638..84eee0a 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 a80d983..c66c999 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 d7ea452..bd121d2 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 defbd44..551af99 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 03fa0fa..3eedc42 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 75d1b5d..535667c 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 91ded5a..b34aec2 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 9ac20e9..1e0f7f4 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 1af2b4e..80a272e 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 ee91198..a239bbd 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 b1bf41f..3715613 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 8bbf65e..c512d01 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 1c16ff3..8506e24 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 fbe0671..abd0cd2 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 b593c2d..15effbc 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 d18992b..513f66b 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 de785cd..93f5e68 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 65731ea..f381e52 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 81f2189..89906b5 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 5b371f3..242959d 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 15cdadd..4c28b9c 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 662f4bc..4824e06 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 39519f2..fd3dcc0 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 ee054fb..c3588c1 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 d7a73ac..8f014b8 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 57ef7b6..2c4e2fb 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 827aeaf..5d4143a 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 c95cb84..706510f 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 6b207c7..0108ccf 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 ddbac9c..677bffa 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 c79ce64..e52c095 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 191cf84..4ef11a4 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 84c3906..1cfee2a 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 c4a0ca5..c05b849 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 959b617..3500fbb 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 3d20fdb..1d4c052 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 9f04a04..cf296d8 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 e7f5a62..d7adebb 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 eb790fe..856ee35 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 a6fb47e..7a823fe 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 66fee14..33f38b2 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 6e51f5f..6b0e166 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 5ceea6b..3bad8da 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 bfdfde6..0e95f4d 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 191a54c..d7051bf 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 1af4364..25ac0f0 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 0000000..47993b9 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 b7f9c1b..c9a05f9 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 7e81c6a..bfb5165 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 3467c15..f42a41a 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 5a7ab7b..5719508 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 5a836db..03ad0c3 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 b8e0fe2..6869f09 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 1d68599..30ba8aa 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 b83f684..db50ba2 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 0000000..4ccd3ea 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 0e32b18..481b290 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 86d40e0..8699199 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 0000000..f116c9c --- /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 dffec5e..eff1ce8 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