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 dd2ef206..48ae02cc 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 3c4a8cde..e226376d 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 7c1f07aa..f7069c7b 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 16c60ca2..94671244 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 f90a6c2e..63bd5648 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 d80e9263..f5cf6027 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 f26065c2..a2b9a990 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 f2c6660d..107dc977 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 08395717..62d17e73 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 d60075e3..10d45654 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 526cd36a..503859cb 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 b3d43155..ce88e0d7 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 b84fe312..61b559d9 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 af8601ce..fd1ada62 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 9bd8ab35..0e791d4a 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 b3e70975..a0a778ad 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 268522ef..811a3db4 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 8fe71156..02a772b1 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 a0808ef1..390cc71b 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 f173ee89..adab518a 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 f3fdadf1..695028f0 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 e0991987..c00a5b27 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 2dfbd907..d33dcf13 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 9b06a47f..74d99bbe 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 f51d600e..27509e52 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 eb0fdc02..e1937d14 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 38d35de0..ad48543f 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 7466402b..0dc69e33 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 2c808c8d..ddb3a987 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 c2ae0f81..e1c89b73 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 ac1c17ec..30f2c6e9 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 1678ae97..a8ca03d6 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 7dcc5682..a141cbf3 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 a661b749..2af9c0f7 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/guardrails/__pycache__/__init__.cpython-313.pyc b/agent_framework_oci/libs/agent_framework/src/agent_framework/guardrails/__pycache__/__init__.cpython-313.pyc index bc07267e..a2e67500 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 50fd70a4..60404b21 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 868b18d1..a676c72e 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 5297e5ad..15315313 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 6a077d2e..e7e99a01 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 70803d59..760511e6 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 c62f7b42..1a95498d 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 dd9c3d8e..7566cb14 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 49c70be6..9831fb49 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 93052a6e..e6a6ad3f 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 863f5c04..51ea7ddd 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 67dcd0c3..980c3ad6 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 0dbd89ea..bf745752 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 715230e5..313dbfdb 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 4d7ec529..eea12353 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 ac2b9d08..e5169af3 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 c5bcaafc..22ef4238 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 89c78ab4..02d22db5 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 df23f355..a6a7843e 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 b6bfcaa0..a0c2f406 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 8b9f7599..a16bc757 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 fb48f8ca..a5ccb3aa 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 1b50e7c1..7e8e28e8 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 a1c0ae30..8e710aba 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 85e68340..02f82eab 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 014d27e9..d3b4d36d 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 1adbe28e..4ee48241 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 4c253913..b2e2b5fb 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 4c834efd..519acde0 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__/dlex_out.cpython-313.pyc.128272546232176 b/agent_framework_oci/libs/agent_framework/src/agent_framework/guardrails/calibrated/prompts/__pycache__/dlex_out.cpython-313.pyc.128272546232176 new file mode 100644 index 00000000..e69de29b 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 ae92b20e..b90b4650 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 e757574e..02ecc9f5 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 cdb2534f..e2438f0e 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 d785a3a9..c4abf035 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 c586b640..21e1b4c0 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 6b2041d1..051d0f80 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 50fcb153..5824f376 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 ec8f20bf..61b05c6f 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 8f3fac0e..2f860c00 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 e93d71ee..0a60ca00 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 659cca02..ac98b776 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 6c7e3841..c723122b 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 f1573488..c27dc0a1 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 e437bea9..69ca93c1 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 b62a84fc..4d4b00c0 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 aa2be86e..79ec8b5d 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 15dcb19f..884e386c 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/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 313b48ab..028d247c 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 86c6d7e1..4618efa9 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 72d4bc1b..856ed5b3 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 85ecb207..8c270f8e 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/identity/__pycache__/__init__.cpython-313.pyc b/agent_framework_oci/libs/agent_framework/src/agent_framework/identity/__pycache__/__init__.cpython-313.pyc index 262a3b61..ce6477c2 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 78250ff9..e3a4e1e1 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 8444ca7d..29992982 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 ddd7be65..c0422abc 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 fd1f7bba..bd33b868 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 1954bc6f..c5626b0b 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 4b91dab9..085a359e 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 2e44150e..78fc057c 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/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 0ab8d48c..6f73658d 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 6c3e14d1..33a256da 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 63a7acfa..5df633e2 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 c3493b7d..0accf86c 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 032224bc..17d0cb78 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 6ba3e526..bd81b3e7 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/llm/__pycache__/__init__.cpython-313.pyc b/agent_framework_oci/libs/agent_framework/src/agent_framework/llm/__pycache__/__init__.cpython-313.pyc index da7e2194..2e33c5ad 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 972b6626..91b37ff6 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 c2b4ecf0..8414daa6 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 4039e6cd..6558a05e 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 index f55398b8..28c9f669 100644 Binary files a/agent_framework_oci/libs/agent_framework/src/agent_framework/llm/__pycache__/structured_output.cpython-313.pyc 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 05014a07..682afe5e 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/mcp/__pycache__/__init__.cpython-313.pyc b/agent_framework_oci/libs/agent_framework/src/agent_framework/mcp/__pycache__/__init__.cpython-313.pyc index c872622e..98a22d40 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 d8ae516a..650147f5 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 a64e2705..b2f73e5a 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 16e0b00f..91673ee2 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 ca72d392..80770cac 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 bc53c02f..15ef7985 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 fab016ee..821ddffd 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 ab2e2fc2..25dd37de 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 087fa9a9..97d6a0ef 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 08efccd5..964ca615 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 d2853bee..6974e0bf 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 aa77e381..6791cba2 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 71ed3378..a296c8b7 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 7274f40d..0e09b444 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 06466e2a..1be6af5e 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 ffe49033..1bc92c07 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 b1d21044..5670c610 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 d0cd341a..c03dd804 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 0ae593ee..b2c83c34 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 d783e517..56915912 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 f8903e56..008082f2 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 eccd2803..9ae83e78 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 96696e63..a639dcda 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 718770ed..5335e900 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 5634f6ca..eea7ac20 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 169138a5..9b0c8051 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 7d81579c..e18587b8 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 e4fbb18c..f85d0eef 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 14bb5c47..4b2bf48f 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 e75b197d..3e96c2e6 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 69cab224..de7097ec 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 b6eae437..f6f8eacf 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 584ec9fb..1d8a814a 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 da593ed6..1030d5b0 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 48f64060..082666b5 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 548cdccb..22d20e71 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 41a9bdd9..dc841698 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 162b6407..40316ceb 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 a7bfda16..36823cf3 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 220e3feb..fec5fe33 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 0e257d59..1f7c7175 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 eeabd1b8..e18d1915 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 bf4541b2..25c78801 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 4b40d3cb..df132639 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 f43963f6..2e4d5c88 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 1c3214e2..9061d5e1 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 ac74e8a0..ef05742c 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 2775a7a0..e946076c 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 557f93ac..048b5406 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 90f2737d..c2aa0d4c 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 d1878255..d13f739e 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 5dc21fb9..611825b6 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 170e4f41..7c7e220f 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 9c23d1ae..c8967c9d 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 369446f1..0790f637 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/runtime/__pycache__/__init__.cpython-313.pyc b/agent_framework_oci/libs/agent_framework/src/agent_framework/runtime/__pycache__/__init__.cpython-313.pyc index 53122589..04933309 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 9603442b..aa23cc68 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 b797d4f4..e67111ab 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 aeaabeca..96deab01 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 @@ -1497,6 +1497,80 @@ class AgentRuntimeMixin: newest = list(reversed(blocks)) return "\n".join(f"history:{i+1}: {block}" for i, block in enumerate(newest)) + @staticmethod + def _transaction_context_priority_view(context: Any) -> str: + """Group bounded history by reconciliation priority without losing recency. + + The temporal reconciler is a fallback, so current-turn values and validated + transaction state are supplied separately. Within historical conversation, + assistant explanations are intentionally considered before older user turns: + they frequently carry grounded relationships produced from tool/evidence + results (for example item -> amount). They remain interpretive candidates + only and must still pass the configured authoritative pre-validation. + """ + ordered = AgentRuntimeMixin._transaction_context_newest_first(context) + if not ordered: + return "" + assistant: list[str] = [] + user: list[str] = [] + other: list[str] = [] + for line in ordered.splitlines(): + payload = line.split(": ", 1)[1] if ": " in line else line + low = payload.lower().lstrip() + if low.startswith(("assistant:", "agente:")): + assistant.append(line) + elif low.startswith(("user:", "cliente:")): + user.append(line) + else: + other.append(line) + + sections: list[str] = [] + if assistant: + sections.append( + "priority_3_previous_assistant_tool_or_evidence_context:\n" + "\n".join(assistant) + ) + if user: + sections.append("priority_4_previous_user_utterances:\n" + "\n".join(user)) + if other: + sections.append("priority_5_other_conversational_context:\n" + "\n".join(other)) + return "\n".join(sections) + + @staticmethod + def _apply_transaction_reconciliation( + arguments: dict[str, Any], + reconciliation: dict[str, Any] | None, + *, + locked_current_fields: set[str] | None = None, + ) -> tuple[dict[str, Any], list[str], list[str]]: + """Apply temporal reconciliation without mutating explicit current-turn fields. + + Values extracted from the current user utterance have highest precedence for + that turn. The temporal reconciler may use them as anchors, but it cannot + clear or overwrite them. A later authoritative pre-validation step may + still reject a current value and trigger the dedicated recovery path. + """ + out = dict(arguments or {}) + rec = dict(reconciliation or {}) + locked = {str(name) for name in (locked_current_fields or set())} + ignored_clears: list[str] = [] + ignored_values: list[str] = [] + + for field in rec.get("clear_fields") or []: + name = str(field) + if name in locked: + ignored_clears.append(name) + continue + out.pop(name, None) + + for field, value in dict(rec.get("values") or {}).items(): + name = str(field) + if name in locked: + ignored_values.append(name) + continue + out[name] = value + + return out, ignored_clears, ignored_values + async def _reconcile_transaction_parameters( self, state: dict[str, Any], @@ -1543,7 +1617,7 @@ class AgentRuntimeMixin: suffix = "\n\nCONTINUAÇÃO ATUAL DO CLIENTE:\n" if prefix in effective and suffix in effective: conversational_context = effective.split(prefix, 1)[1].split(suffix, 1)[0].strip() - ordered_context = self._transaction_context_newest_first(conversational_context) + ordered_context = self._transaction_context_priority_view(conversational_context) cached = route_meta.get("transaction_parameter_values") effective_known = dict(known_arguments or {}) if isinstance(cached, dict): @@ -3038,15 +3112,22 @@ class AgentRuntimeMixin: parameter_names=required_fields, known_arguments=arguments, ) - for field in reconciliation.get("clear_fields") or []: - arguments.pop(str(field), None) - arguments.update(dict(reconciliation.get("values") or {})) + locked_current_fields = { + str(k) for k, v in dict(extracted_current or {}).items() if v not in _EMPTY_VALUES + } + arguments, ignored_clears, ignored_values = self._apply_transaction_reconciliation( + arguments, reconciliation, locked_current_fields=locked_current_fields + ) state["transaction_parameter_reconciliation"] = { "tool_name": tool_name, "trigger": "traditional_collection_unresolved", "decisions": dict(reconciliation.get("decisions") or {}), "provenance": dict(reconciliation.get("provenance") or {}), "clear_fields": list(reconciliation.get("clear_fields") or []), + "values": dict(reconciliation.get("values") or {}), + "locked_current_fields": sorted(locked_current_fields), + "ignored_clear_fields": sorted(ignored_clears), + "ignored_reconciled_values": sorted(ignored_values), } else: state.pop("transaction_parameter_reconciliation", None) @@ -3321,21 +3402,52 @@ class AgentRuntimeMixin: policy = self._resolve_tool_execution_policy(selected_action, action_args) required = [str(name) for name in (policy.get("requires") or [])] - # Valores já estruturados no contexto podem satisfazer requirements sem - # parsing textual. Para qualquer required field ainda ausente, a fala do - # usuário é interpretada exclusivamente pelo extrator LLM transacional. + # Primeiro turno transacional segue a mesma regra de COLLECTING_PARAMETERS: + # 1) coleta tradicional SOMENTE da fala atual; 2) reconciliação temporal + # apenas como fallback se ainda houver required fields faltando. + # Isso evita que histórico altere o happy path e, ao mesmo tempo, permite + # resolver referências contextuais quando a fala atual é incompleta. missing_initial = self._missing_required_arguments(policy, action_args) - # No primeiro turno, a fala atual pode fornecer/corrigir qualquer required - # field, inclusive um valor que exista no contexto estruturado mas pertença - # a uma transação anterior. O extrator continua restrito ao contrato - # ``requires`` e só sobrescreve quando a LLM realmente extrai um valor. - extracted_initial = await self._extract_transaction_parameters( + extracted_initial = await self._extract_transaction_parameters_current_only( state, tool_name=selected_action, missing_parameters=required, known_arguments={k: v for k, v in action_args.items() if k not in set(required)}, ) action_args.update(extracted_initial) + state["transaction_parameter_collection"] = { + "tool_name": selected_action, + "mode": "current_turn", + "resolved_fields": sorted(str(k) for k in (extracted_initial or {}).keys()), + } + + missing_after_current = self._missing_required_arguments(policy, action_args) + if missing_after_current: + reconciliation = await self._reconcile_transaction_parameters( + state, + tool_name=selected_action, + parameter_names=required, + known_arguments=action_args, + ) + locked_current_fields = { + str(k) for k, v in dict(extracted_initial or {}).items() if v not in _EMPTY_VALUES + } + action_args, ignored_clears, ignored_values = self._apply_transaction_reconciliation( + action_args, reconciliation, locked_current_fields=locked_current_fields + ) + state["transaction_parameter_reconciliation"] = { + "tool_name": selected_action, + "trigger": "initial_traditional_collection_unresolved", + "decisions": dict(reconciliation.get("decisions") or {}), + "provenance": dict(reconciliation.get("provenance") or {}), + "clear_fields": list(reconciliation.get("clear_fields") or []), + "values": dict(reconciliation.get("values") or {}), + "locked_current_fields": sorted(locked_current_fields), + "ignored_clear_fields": sorted(ignored_clears), + "ignored_reconciled_values": sorted(ignored_values), + } + else: + state.pop("transaction_parameter_reconciliation", None) # O mapper MCP continua responsável somente por parâmetros auxiliares que # não pertencem ao contrato transacional. 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 88cfbeb6..55cc1c37 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 @@ -113,33 +113,217 @@ async def reconcile_transaction_parameters( for name in names } } + + def _anchor_tokens(value: Any) -> list[str]: + """Return generic textual variants for a known scalar anchor.""" + if value in _EMPTY_VALUES: + return [] + raw = str(value).strip().lower() + tokens = {raw} + try: + number = float(str(value).replace(",", ".")) + tokens.add(f"{number:.2f}") + tokens.add(f"{number:.2f}".replace(".", ",")) + if number.is_integer(): + tokens.add(str(int(number))) + except (TypeError, ValueError): + pass + return [token for token in tokens if token] + + def _anchor_relation_candidates(context: str, arguments: Mapping[str, Any]) -> list[str]: + """Surface history fragments related to any already-known parameter. + + This is not a second reconciliation pass and does not resolve anything + deterministically. It only structures the SAME temporal scan so the LLM + can use known/current fields as cross-field anchors while reconciling all + pending fields coherently in one call. + """ + if not context or not arguments: + return [] + # Keep role/history prefixes but split long assistant explanations into + # smaller semantic clauses (bullets/semicolons) so one anchor is not lost + # among many unrelated entity/value pairs. + fragments: list[str] = [] + for raw_line in context.splitlines(): + line = raw_line.strip() + if not line: + continue + parts = [part.strip() for part in re.split(r"\s*\*\s*|\s*;\s*", line) if part.strip()] + fragments.extend(parts or [line]) + + candidates: list[str] = [] + for field_name, field_value in arguments.items(): + variants = _anchor_tokens(field_value) + if not variants: + continue + for fragment in fragments: + low = fragment.lower() + if any(token in low for token in variants): + candidates.append(f"anchor[{field_name}={field_value}]: {fragment}") + return list(dict.fromkeys(candidates)) + + def _structured_evidence_blocks(context: str, arguments: Mapping[str, Any]) -> list[dict[str, Any]]: + """Represent the same bounded history as explicit message evidence blocks. + + The reconciler remains a single LLM call. This helper only prevents role, + recency and anchor relationships from being hidden inside one prose blob. + It is fully domain-neutral: field meaning still comes from parameter_schema. + """ + blocks: list[dict[str, Any]] = [] + current_role = "other" + current_lines: list[str] = [] + rank = 0 + + def flush() -> None: + nonlocal rank, current_lines, current_role + if not current_lines: + return + text_block = " ".join(x.strip() for x in current_lines if x.strip()).strip() + current_lines = [] + if not text_block: + return + + # A single assistant message often contains a list of independent + # entity/attribute relations (for example several invoice items). + # Keeping the whole answer as one evidence block makes an otherwise + # exact anchor ambiguous because every entity in the list competes + # inside the same block. Segment LOCAL relations while preserving + # the original role, priority and message recency. This is still the + # same temporal reconciliation and the same single LLM call. + fragments = [ + frag.strip(" \t-•") + for frag in re.split( + r"\s+(?:\*|•)\s+|\s*;\s+|\s+(?=\d+[.)]\s+)", + text_block, + ) + if frag.strip(" \t-•") + ] + if not fragments: + fragments = [text_block] + + rank += 1 + role_priority = 3 if current_role == "assistant" else 4 if current_role == "user" else 5 + for fragment_index, fragment in enumerate(fragments, start=1): + anchor_matches: list[dict[str, Any]] = [] + low = fragment.lower() + for field_name, field_value in arguments.items(): + variants = _anchor_tokens(field_value) + matched = [token for token in variants if token in low] + if matched: + anchor_matches.append({ + "field": str(field_name), + "value": field_value, + "matched_tokens": matched, + }) + blocks.append({ + "priority": role_priority, + "recency": rank, + "fragment": fragment_index, + "role": current_role, + "text": fragment, + "anchor_matches": anchor_matches, + }) + + for raw_line in str(context or "").splitlines(): + line = raw_line.strip() + if not line: + continue + low = line.lower() + # Priority-view section headers are metadata, not conversational text. + if low.startswith("priority_3_previous_assistant"): + flush(); current_role = "assistant"; continue + if low.startswith("priority_4_previous_user"): + flush(); current_role = "user"; continue + if low.startswith("priority_5_other"): + flush(); current_role = "other"; continue + payload = line.split(": ", 1)[1] if line.startswith("history:") and ": " in line else line + plow = payload.lower().lstrip() + detected = None + if plow.startswith(("assistant:", "agente:")): + detected = "assistant" + elif plow.startswith(("user:", "cliente:")): + detected = "user" + elif plow.startswith("system:"): + detected = "other" + if detected is not None: + flush() + current_role = detected + payload = payload.split(":", 1)[1].strip() if ":" in payload else payload + current_lines.append(payload) + flush() + return blocks + + context_text = str(conversational_context or "").strip() + anchor_relations = _anchor_relation_candidates(context_text, known) + evidence_blocks = _structured_evidence_blocks(context_text, known) + missing_initial = [name for name in names if name not in known] + + # Field-targeted views do not resolve parameters and do not add another LLM + # pass. They expose the SAME local evidence blocks next to the declarative + # semantics of each still-missing field so the single temporal reconciliation + # call can correlate anchors with the correct schema-defined target instead of + # rediscovering that mapping inside a large generic JSON blob. No field names + # or domain concepts are hardcoded here. + anchored_blocks = [block for block in evidence_blocks if block.get("anchor_matches")] + field_evidence_views = { + name: { + "field_spec": field_spec.get(name, {}), + "anchored_evidence_blocks": anchored_blocks, + } + for name in missing_initial + } + + reconciliation_focus = { + "current_user_message": message, + "known_parameters": known, + "missing_parameters": missing_initial, + "missing_field_views": field_evidence_views, + } + prompt = ( + "FOCO PRINCIPAL DA RECONCILIAÇÃO (examine isto antes de qualquer contexto secundário):\n" + f"reconciliation_focus: {json.dumps(reconciliation_focus, ensure_ascii=False, default=str)}\n" + "Se um campo faltante tiver um único evidence_block ancorado semanticamente compatível com seu field_spec, resolva-o; use unresolved somente em ambiguidade real.\n\n" "Você é o conciliador temporal de parâmetros de uma transação ativa. " - "Reconstrua UM CONJUNTO COERENTE de parâmetros; não extraia cada campo de forma isolada. " + "Faça UMA ÚNICA VARREDURA TEMPORAL e reconstrua UM CONJUNTO COERENTE de parâmetros. " + "Todos os campos conhecidos e faltantes devem ser avaliados juntos; não execute uma busca isolada por campo e não faça uma segunda etapa de fallback. " "Não decida roteamento, confirmação nem execução.\n\n" "CONTRATO OBRIGATÓRIO:\n" - "1. O significado de cada campo vem EXCLUSIVAMENTE de parameter_schema e transaction_description, considerando principalmente a descrição semântica quando disponível. O framework não conhece conceitos de domínio por nome de campo.\n" - "2. A ausência de tipo ou descrição NÃO impede a extração quando o restante do contrato e o texto forem semanticamente suficientes.\n" - "3. A busca textual é temporal, em ordem decrescente: user_message é a fonte mais nova; depois conversational_context já vem do texto mais novo para o mais antigo.\n" - "3. Textos do usuário e textos explicativos do assistente podem ser usados para interpretar referências e relações entre campos. Não trate texto do contexto como uma nova afirmação do cliente; eles são contexto, não evidência autoritativa de negócio.\n" - "4. Para cada campo escolha: resolved = um texto determina novo valor; preserve = nenhum texto mais novo invalida o valor conhecido; clear = existe mudança textual mais nova que torna o valor conhecido incompatível/sem vínculo seguro com o novo contexto e ainda não há substituto; unresolved = não há valor conhecido nem candidato textual seguro.\n" - "5. Se uma fonte mais nova muda uma entidade, objeto, escopo ou outro contexto que dava sentido a campos extraídos anteriormente, REAVALIE os demais campos como conjunto. Não combine automaticamente um atributo antigo com um contexto novo só porque ambos existem.\n" - "6. Um valor de texto anterior pode continuar válido após uma mudança somente quando os textos, considerados em conjunto, sustentarem de forma inequívoca que ele ainda pertence ao contexto mais recente. Caso contrário use clear para o campo dependente.\n" - "7. Se a nova menção é inválida no mundo real, NÃO volte silenciosamente ao valor antigo. Ainda assim devolva o candidato textual mais recente como resolved; a pre-validation autoritativa é responsável por rejeitá-lo.\n" - "8. known_arguments é fallback de estado. Use preserve somente quando nenhum texto mais novo o contradiz ou rompe sua associação contextual.\n" - "9. Uma expressão só pode preencher um campo se satisfizer semanticamente type/description desse campo. Não transfira um trecho para outro campo apenas por proximidade lexical.\n" - "10. Se um texto recente corrige explicitamente informação anterior, a correção prevalece para os campos que o schema permite inferir; os demais devem ser reavaliados quanto à coerência com a correção.\n" - "11. Em ambiguidade razoável, prefira clear/unresolved a inventar uma associação. Em caso de dúvida razoável sobre a correspondência ou o valor, prefira null.\n" - "12. Responda SOMENTE JSON válido no formato pedido, sem markdown e sem chaves extras.\n\n" + "1. O significado de cada campo vem EXCLUSIVAMENTE de parameter_schema e transaction_description, principalmente a descrição semântica quando disponível. O framework não conhece conceitos de domínio por nome de campo.\n" + "2. A ausência de tipo ou descrição NÃO impede a extração nem a resolução quando o restante do contrato e o contexto forem semanticamente suficientes.\n" + "3. A resolução deve obedecer ESTA PRIORIDADE, sem inverter níveis: (1) informação explicitamente fornecida pelo usuário na mensagem atual e semanticamente compatível com o schema; (2) parâmetros já conhecidos/validados da transação; (3) respostas anteriores do assistente que apresentem relações locais entre parâmetros/atributos e que possam ter sido apoiadas por tool/evidence; (4) falas anteriores do usuário; (5) demais contexto conversacional.\n" + "4. Dentro de cada nível histórico, preserve a ordem temporal decrescente (mais novo -> mais antigo). Nunca escolha fonte de prioridade menor quando uma fonte de prioridade maior resolve o mesmo campo de forma coerente.\n" + "5. known_arguments contém o estado parcial já coletado/validado. Trate CADA parâmetro conhecido, independentemente de nome ou tipo, como possível ÂNCORA para resolver QUALQUER outro campo faltante no histórico. O significado e a compatibilidade de cada âncora vêm exclusivamente do parameter_schema. Use múltiplas âncoras simultaneamente quando disponíveis.\n" + "6. anchor_relation_candidates são apenas recortes do MESMO histórico que contêm representações de parâmetros conhecidos; eles servem para facilitar a correlação entre campos dentro desta única varredura. Não são uma segunda fonte, não têm prioridade própria e não autorizam inventar relações.\n" + "7. Quando uma âncora conhecida aparecer em um mesmo contexto local com uma ou mais informações semanticamente compatíveis com campos faltantes, use essa relação local para reconciliar TODOS os campos faltantes que puderem ser resolvidos de forma coerente na mesma resposta. Não pressuponha quais tipos de campo devem coexistir; siga apenas o schema e o contexto.\n" + "8. Texto anterior do assistente é CONTEXTO INTERPRETATIVO, não evidência autoritativa: pode fornecer relações locais entre quaisquer parâmetros/atributos definidos pelo schema, mas todo candidato continua sujeito à pre-validation/tool de negócio. Não descarte uma relação apenas por estar na fala do assistente. Não trate texto do contexto como uma nova afirmação do cliente.\n" + "9. Para cada campo escolha: resolved = texto/contexto determina novo valor; preserve = o valor conhecido continua coerente; clear = contexto mais novo rompe sua associação e não há substituto seguro; unresolved = não há candidato seguro.\n" + "10. Se uma fonte mais nova muda o contexto semântico que dava sentido a campos anteriores, REAVALIE os demais campos como conjunto. Não combine automaticamente informação antiga com contexto novo.\n" + "11. Se a nova menção é inválida no mundo real, NÃO volte silenciosamente ao valor antigo. Devolva o candidato textual mais recente como resolved e deixe a pre-validation autoritativa rejeitá-lo.\n" + "12. Uma expressão só pode preencher um campo se satisfizer semanticamente type/description desse campo. Não transfira um trecho para outro campo apenas por proximidade lexical.\n" + "13. Se o usuário corrige explicitamente informação anterior, a correção prevalece nos campos compatíveis e os demais devem ser reavaliados quanto à coerência.\n" + "14. unresolved é ÚLTIMO RECURSO. Antes de devolver unresolved para um campo faltante, você DEVE verificar todos os evidence_blocks na ordem de prioridade e recência e todas as anchor_relation_candidates. Se existir uma única interpretação semanticamente compatível com type/description do campo, resolva-a.\n" + "15. Se um parâmetro conhecido aparecer como anchor_match em um evidence_block e o MESMO bloco contiver uma única informação semanticamente compatível com um campo faltante segundo o schema, use a relação para resolved desse campo; não devolva unresolved apenas porque a informação foi apresentada pelo assistente.\n" + "16. Se não houver âncora útil, mas uma fonte histórica de prioridade 3 ou 4 contiver explicitamente uma informação que satisfaça semanticamente um campo faltante segundo o schema e não houver candidato concorrente de prioridade maior, resolva esse campo. Isso cobre referências posteriores em que o usuário omite um atributo porque ele já estava explícito no diálogo.\n" + "17. field_evidence_views reorganiza os MESMOS evidence_blocks ancorados por cada campo ainda faltante e coloca ao lado a semântica declarativa desse campo. Para cada campo faltante, examine obrigatoriamente essa visão antes de unresolved. Se um bloco ancorado contiver uma única informação compatível com field_spec e não houver concorrente de prioridade/recência maior, retorne resolved. Essa visão não é uma nova fonte nem uma segunda etapa.\n" + "18. Em ambiguidade REAL — dois ou mais candidatos semanticamente plausíveis sem desempate por prioridade, recência ou âncora — prefira clear/unresolved a inventar uma associação. Em caso de dúvida razoável sobre a correspondência ou o valor, prefira null/unresolved conforme o formato de saída.\n" + "19. Responda SOMENTE JSON válido no formato pedido, sem markdown e sem chaves extras.\n\n" f"transaction_tool: {tool_name}\n" f"transaction_description: {tool_description or ''}\n" f"parameter_names: {json.dumps(names, ensure_ascii=False)}\n" + f"known_parameters: {json.dumps(known, ensure_ascii=False, default=str)}\n" + f"missing_parameters: {json.dumps(missing_initial, ensure_ascii=False)}\n" f"pending_parameters: {json.dumps(names, ensure_ascii=False)}\n" f"parameter_schema: {json.dumps(field_spec, ensure_ascii=False, default=str)}\n" - f"known_arguments: {json.dumps(known, ensure_ascii=False, default=str)}\n" + f"anchor_relation_candidates: {json.dumps(anchor_relations, ensure_ascii=False, default=str)}\n" + f"evidence_blocks: {json.dumps(evidence_blocks, ensure_ascii=False, default=str)}\n" + f"field_evidence_views: {json.dumps(field_evidence_views, ensure_ascii=False, default=str)}\n" "conversation_sources_newest_to_oldest:\n" + f"priority_1_current_user_message: {message}\n" f"user_message: {message}\n" - f"conversational_context: {str(conversational_context or '').strip()}\n" + f"prioritized_conversational_context: {context_text}\n" + "RELEMBRE O FOCO PRINCIPAL: examine reconciliation_focus.missing_field_views antes de unresolved. " + "Um bloco ancorado único e semanticamente compatível deve produzir resolved, independentemente do papel assistant/user, respeitada a prioridade declarada.\n" f"Formato obrigatório: {json.dumps(output_shape, ensure_ascii=False)}" ) 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 c4a831ab..24762843 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 ff084315..90fbf1eb 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 a1defb9b..d939ba53 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 08a3aab2..12591f69 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 0bd6d734..5491d910 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 3a3c2690..c2232406 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 4ca4c0b7..20f7c2db 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 730f0f64..206b904f 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 93500be2..d8bb37de 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 eee267b7..25ce0041 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 011d24d9..bb1aaaab 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 b80ecdc2..234176e3 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/test_contextual_reentry_transaction_parameters.py b/agent_framework_oci/tests/test_contextual_reentry_transaction_parameters.py index 46a7b3bd..af32141f 100644 --- a/agent_framework_oci/tests/test_contextual_reentry_transaction_parameters.py +++ b/agent_framework_oci/tests/test_contextual_reentry_transaction_parameters.py @@ -42,3 +42,316 @@ async def test_contextual_reentry_separates_current_claim_from_prior_context_for assert "Cobrança Tamboro Mensal" in llm.prompt assert "user_message: é a de quatorze e noventa e nove" in llm.prompt assert "Não trate texto do contexto como uma nova afirmação do cliente" in llm.prompt + +class _TwoPassContextLLM: + def __init__(self): + self.calls = [] + + async def ainvoke(self, messages, **kwargs): + prompt = messages[-1]["content"] + self.calls.append(prompt) + # First pass: current utterance provides only the amount. + if "user_message: é a de vinte e cinco e cinquenta" in prompt: + return json.dumps({"subject": None, "valor": 25.50}, ensure_ascii=False) + # Second bounded pass: previous USER utterance provides the missing entity. + if "user_message: não reconheço esse Tamboro Mensal na minha fatura" in prompt: + return json.dumps({"subject": "Tamboro Mensal"}, ensure_ascii=False) + return "{}" + + +@pytest.mark.asyncio +async def test_contextual_reentry_second_pass_recovers_only_missing_candidate_from_prior_user_turn(): + from agent_framework.runtime.agent_runtime import AgentRuntimeMixin + + class Runtime(AgentRuntimeMixin): + pass + + runtime = Runtime() + runtime.llm = _TwoPassContextLLM() + state = { + "route_decision": { + "metadata": { + "contextual_reentry": True, + "original_input": "é a de vinte e cinco e cinquenta", + "relevant_conversation_context": ( + "user: não reconheço esse Tamboro Mensal na minha fatura\n" + "assistant: identifiquei duas cobranças de Tamboro Mensal" + ), + } + }, + "sanitized_input": "é a de vinte e cinco e cinquenta", + } + out = await runtime._extract_transaction_parameters( + state=state, + tool_name="contestar_cobranca", + missing_parameters=["subject", "valor"], + known_arguments={}, + ) + assert float(out["valor"]) == 25.5 + assert out["subject"] == "Tamboro Mensal" + assert len(runtime.llm.calls) >= 2 + +class _CoherentTemporalLLM: + """Simulates the structured decisions expected from temporal reconciliation.""" + def __init__(self): + self.prompts = [] + + async def ainvoke(self, messages, **kwargs): + prompt = messages[-1]["content"] + self.prompts.append(prompt) + low = prompt.lower() + # Product A + value X established. + if "user_message: na verdade é tim fashion mensal" in low: + return json.dumps({"fields": { + "subject": {"decision": "resolved", "value": "TIM Fashion Mensal", "source": "current"}, + # Previous 14.99 was tied to the former product and must not be transplanted. + "valor": {"decision": "clear", "value": None, "source": "history:1"}, + }}, ensure_ascii=False) + if "user_message: na verdade é produto inexistente" in low: + return json.dumps({"fields": { + # Keep the newest candidate so authoritative validation can reject it. + "subject": {"decision": "resolved", "value": "Produto Inexistente", "source": "current"}, + "valor": {"decision": "clear", "value": None, "source": "history:1"}, + }}, ensure_ascii=False) + if "user_message: desculpa, era tamboro mensal mesmo" in low: + return json.dumps({"fields": { + "subject": {"decision": "resolved", "value": "Tamboro Mensal", "source": "current"}, + # Full temporal text makes the old amount coherent again with the restored product. + "valor": {"decision": "resolved", "value": 14.99, "source": "history:2"}, + }}, ensure_ascii=False) + return json.dumps({"fields": { + "subject": {"decision": "preserve", "value": None, "source": "state"}, + "valor": {"decision": "preserve", "value": None, "source": "state"}, + }}, ensure_ascii=False) + + +@pytest.mark.asyncio +async def test_temporal_reconciliation_product_change_rechecks_old_value_as_part_of_coherent_set(): + from agent_framework.runtime.transaction_parameters import reconcile_transaction_parameters + + llm = _CoherentTemporalLLM() + out = await reconcile_transaction_parameters( + llm, + text="na verdade é TIM Fashion Mensal", + conversational_context=( + "history:1: user: é R$ 14,99\n" + "history:2: user: quero contestar Tamboro Mensal" + ), + tool_name="contestar_cobranca", + parameter_names=["subject", "valor"], + known_arguments={"subject": "Tamboro Mensal", "valor": 14.99}, + parameter_schema={ + "subject": {"type": "string", "description": "Nome do serviço, produto, item ou cobrança objeto da contestação."}, + "valor": {"type": "number", "description": "Valor monetário associado ao item objeto da contestação."}, + }, + tool_description="Contesta uma cobrança após validação.", + ) + assert out["values"] == {"subject": "TIM Fashion Mensal"} + assert out["clear_fields"] == ["valor"] + assert out["provenance"]["subject"] == "current" + + +@pytest.mark.asyncio +async def test_temporal_reconciliation_invalid_new_product_does_not_erase_history_or_fall_back_silently(): + from agent_framework.runtime.transaction_parameters import reconcile_transaction_parameters + + llm = _CoherentTemporalLLM() + history = ( + "history:1: user: é R$ 14,99\n" + "history:2: user: quero contestar Tamboro Mensal" + ) + out = await reconcile_transaction_parameters( + llm, + text="na verdade é Produto Inexistente", + conversational_context=history, + tool_name="contestar_cobranca", + parameter_names=["subject", "valor"], + known_arguments={"subject": "Tamboro Mensal", "valor": 14.99}, + parameter_schema={ + "subject": {"type": "string", "description": "Nome do serviço, produto, item ou cobrança objeto da contestação."}, + "valor": {"type": "number", "description": "Valor monetário associado ao item objeto da contestação."}, + }, + tool_description="Contesta uma cobrança após validação.", + ) + # The newest candidate stays visible for pre-validation; the old product is not silently restored. + assert out["values"] == {"subject": "Produto Inexistente"} + assert "valor" in out["clear_fields"] + assert "Tamboro Mensal" in llm.prompts[-1] # history remains available to future reconciliation. + + +@pytest.mark.asyncio +async def test_temporal_reconciliation_can_restore_coherent_old_value_when_product_is_explicitly_restored(): + from agent_framework.runtime.transaction_parameters import reconcile_transaction_parameters + + llm = _CoherentTemporalLLM() + out = await reconcile_transaction_parameters( + llm, + text="desculpa, era Tamboro Mensal mesmo", + conversational_context=( + "history:1: user: na verdade é Produto Inexistente\n" + "history:2: user: é R$ 14,99\n" + "history:3: user: quero contestar Tamboro Mensal" + ), + tool_name="contestar_cobranca", + parameter_names=["subject", "valor"], + known_arguments={}, + parameter_schema={ + "subject": {"type": "string", "description": "Nome do serviço, produto, item ou cobrança objeto da contestação."}, + "valor": {"type": "number", "description": "Valor monetário associado ao item objeto da contestação."}, + }, + tool_description="Contesta uma cobrança após validação.", + ) + assert out["values"] == {"subject": "Tamboro Mensal", "valor": 14.99} + assert out["provenance"] == {"subject": "current", "valor": "history:2"} + + +def test_temporal_context_priority_places_assistant_before_older_user_history(): + from agent_framework.runtime.agent_runtime import AgentRuntimeMixin + + context = ( + "user: tem uma cobrança aqui que eu não reconheço\n" + "assistant: Cobrança Tamboro Mensal no valor de R$ 14,99; TIM Fashion Mensal no valor de R$ 10,00." + ) + prioritized = AgentRuntimeMixin._transaction_context_priority_view(context) + + assert "priority_3_previous_assistant_tool_or_evidence_context:" in prioritized + assert "priority_4_previous_user_utterances:" in prioritized + assert prioritized.index("assistant: Cobrança Tamboro Mensal") < prioritized.index("user: tem uma cobrança") + + +class _AssistantRelationshipReconcilerLLM: + def __init__(self): + self.prompt = "" + + async def ainvoke(self, messages, **kwargs): + self.prompt = messages[-1]["content"] + # Simula o comportamento desejado: a fala atual dá o valor, enquanto a + # relação item->valor está numa resposta anterior do assistant. + assert "user_message: é a de quatorze e noventa e nove" in self.prompt + assert "priority_3_previous_assistant_tool_or_evidence_context:" in self.prompt + assert "assistant: Cobrança Tamboro Mensal no valor de R$ 14,99" in self.prompt + assert "anchor_relation_candidates:" in self.prompt + assert "anchor[valor=14.99]" in self.prompt + return json.dumps({"fields": { + "subject": {"decision": "resolved", "value": "Tamboro Mensal", "source": "history:1"}, + "valor": {"decision": "resolved", "value": 14.99, "source": "current"}, + }}, ensure_ascii=False) + + +@pytest.mark.asyncio +async def test_temporal_reconciler_can_use_grounded_assistant_relationship_after_current_only_extraction_is_incomplete(): + from agent_framework.runtime.agent_runtime import AgentRuntimeMixin + + class Runtime(AgentRuntimeMixin): + pass + + runtime = Runtime() + runtime.llm = _AssistantRelationshipReconcilerLLM() + runtime.tool_router = type("TR", (), { + "registry": type("REG", (), { + "get_tool": staticmethod(lambda name: type("CFG", (), { + "requires": ["subject", "valor"], + "args_schema": { + "subject": {"type": "string", "description": "Nome do item ou cobrança a contestar."}, + "valor": {"type": "number", "description": "Valor monetário do item a contestar."}, + }, + "description": "Contesta uma cobrança após validação.", + })()) + })(), + "resolve_execution_policy": staticmethod(lambda name, arguments=None: { + "operation_type": "transactional", + "requires": ["subject", "valor"], + }), + })() + + state = { + "sanitized_input": "é a de quatorze e noventa e nove", + "user_text": "é a de quatorze e noventa e nove", + "route_decision": {"metadata": { + "contextual_reentry": True, + "original_input": "é a de quatorze e noventa e nove", + "relevant_conversation_context": ( + "user: tem uma cobrança aqui que eu não reconheço\n" + "assistant: Cobrança Tamboro Mensal no valor de R$ 14,99; TIM Fashion Mensal no valor de R$ 10,00." + ), + }}, + } + + # O happy path corrente só consegue o valor; o subject fica faltando. + class _CurrentOnlyLLM: + async def ainvoke(self, messages, **kwargs): + return json.dumps({"valor": 14.99}, ensure_ascii=False) + + original_llm = runtime.llm + runtime.llm = _CurrentOnlyLLM() + current = await runtime._extract_transaction_parameters_current_only( + state, + tool_name="contestar_cobranca", + missing_parameters=["subject", "valor"], + known_arguments={}, + ) + assert current == {"valor": 14.99} + + runtime.llm = original_llm + reconciled = await runtime._reconcile_transaction_parameters( + state, + tool_name="contestar_cobranca", + parameter_names=["subject", "valor"], + known_arguments=current, + ) + assert reconciled["values"]["subject"] == "Tamboro Mensal" + assert float(reconciled["values"]["valor"]) == 14.99 + assert "(3) respostas anteriores do assistente" in runtime.llm.prompt + +class _UnifiedAnchorScanLLM: + def __init__(self): + self.calls = [] + + async def ainvoke(self, messages, **kwargs): + prompt = messages[-1]["content"] + self.calls.append(prompt) + assert "UMA ÚNICA VARREDURA TEMPORAL" in prompt + assert "known_parameters: {\"valor\": 14.99}" in prompt + assert "missing_parameters: [\"subject\", \"data\"]" in prompt + assert "anchor_relation_candidates:" in prompt + assert "anchor[valor=14.99]" in prompt + assert "Tamboro Mensal no valor de R$ 14,99" in prompt + return json.dumps({"fields": { + "subject": {"decision": "resolved", "value": "Tamboro Mensal", "source": "history:1"}, + "valor": {"decision": "preserve", "value": None, "source": "state"}, + "data": {"decision": "resolved", "value": "01/11/2025", "source": "history:1"}, + }}, ensure_ascii=False) + + +@pytest.mark.asyncio +async def test_temporal_reconciler_single_scan_uses_all_known_fields_as_anchors_and_resolves_all_missing_fields(): + from agent_framework.runtime.transaction_parameters import reconcile_transaction_parameters + + llm = _UnifiedAnchorScanLLM() + result = await reconcile_transaction_parameters( + llm, + text="é a de quatorze e noventa e nove", + tool_name="contestar_cobranca", + parameter_names=["subject", "valor", "data"], + known_arguments={"valor": 14.99}, + parameter_schema={ + "subject": {"type": "string", "description": "Nome do item ou cobrança a contestar."}, + "valor": {"type": "number", "description": "Valor monetário do item a contestar."}, + "data": {"type": "string", "description": "Data da cobrança selecionada."}, + }, + tool_description="Contesta uma cobrança após validação.", + conversational_context=( + "priority_3_previous_assistant_tool_or_evidence_context:\n" + "history:1: assistant: Cobrança Tamboro Mensal no valor de R$ 14,99 no dia 01/11/2025 * " + "TIM Fashion Mensal no valor de R$ 10,00 no dia 01/11/2025.\n" + "priority_4_previous_user_utterances:\n" + "history:2: user: tem uma cobrança aqui que eu não reconheço" + ), + ) + + assert len(llm.calls) == 1 + assert result["values"]["subject"] == "Tamboro Mensal" + assert float(result["values"]["valor"]) == 14.99 + assert result["values"]["data"] == "01/11/2025" + assert result["provenance"]["subject"] == "history:1" + diff --git a/agent_framework_oci/tests/test_transaction_parameter_llm_precedence.py b/agent_framework_oci/tests/test_transaction_parameter_llm_precedence.py index fe2ed05b..c15adcb8 100644 --- a/agent_framework_oci/tests/test_transaction_parameter_llm_precedence.py +++ b/agent_framework_oci/tests/test_transaction_parameter_llm_precedence.py @@ -643,3 +643,98 @@ intents: [] decision = await router.route(state) assert decision.metadata["transaction_confirmation_decision"] == "confirm" assert decision.metadata["transaction_confirmation_source"] == "deterministic" + +@pytest.mark.asyncio +async def test_collecting_preserves_resolved_required_fields_and_only_extracts_currently_missing(): + class Runtime(_Runtime): + def __init__(self): + super().__init__() + self.pending_seen = None + + async def _extract_transaction_parameters( + self, state, *, tool_name, missing_parameters, known_arguments=None + ): + self.pending_seen = list(missing_parameters) + # Simulate the value extracted for the only missing field. A resolved + # required field must not be offered back to the semantic extractor. + return {"reason": "desisti da compra"} + + runtime = Runtime() + state = { + "user_text": "desisti da compra", + "sanitized_input": "desisti da compra", + "transaction_status": "COLLECTING_PARAMETERS", + "missing_parameters": ["reason"], + "mcp_tools": ["solicitar_devolucao"], + "active_transaction": { + "tool_name": "solicitar_devolucao", + "arguments": {"order_id": "PED-1001"}, + "status": "COLLECTING_PARAMETERS", + "parameter_schema": {"order_id": "string", "reason": "string"}, + "tool_description": "Abre uma solicitação de devolução de pedido.", + }, + "selected_tool_call": { + "tool_name": "solicitar_devolucao", + "arguments": {"order_id": "PED-1001"}, + }, + "route_decision": {"metadata": {}}, + "route": "support_agent", + "intent": "state:COLLECTING_SUPPORT_PARAMETERS", + } + + result = await runtime.execute_tools_for_intent(state) + assert runtime.pending_seen == ["reason"] + assert state["pending_tool_call"]["arguments"]["order_id"] == "PED-1001" + assert state["pending_tool_call"]["arguments"]["reason"] == "desisti da compra" + assert result[-1]["awaiting_confirmation"] is True + +@pytest.mark.asyncio +async def test_correction_of_missing_numeric_value_does_not_reopen_resolved_text_entity(): + class Runtime(_Runtime): + def __init__(self): + super().__init__() + self.pending_seen = None + + async def _extract_transaction_parameters( + self, state, *, tool_name, missing_parameters, known_arguments=None + ): + self.pending_seen = list(missing_parameters) + # If subject were incorrectly offered again, a semantic extractor + # could reinterpret the monetary phrase as an entity. The runtime + # contract must expose only the missing numeric field here. + out = {"valor": 19.99} + if "subject" in missing_parameters: + out["subject"] = "cobrança de R$ 19,99" + return out + + runtime = Runtime() + state = { + "user_text": "desculpa é a de dezenove e noventa e nove", + "sanitized_input": "desculpa é a de dezenove e noventa e nove", + "transaction_status": "COLLECTING_PARAMETERS", + "missing_parameters": ["valor"], + "mcp_tools": ["solicitar_devolucao"], + "active_transaction": { + "tool_name": "solicitar_devolucao", + "arguments": {"order_id": "PED-1001"}, + "status": "COLLECTING_PARAMETERS", + "parameter_schema": {"order_id": "string", "reason": "string", "valor": "number"}, + }, + "selected_tool_call": { + "tool_name": "solicitar_devolucao", + "arguments": {"order_id": "PED-1001"}, + }, + "route_decision": {"metadata": {}}, + "route": "support_agent", + "intent": "state:COLLECTING_SUPPORT_PARAMETERS", + } + # This synthetic tool doesn't require valor, so exercise the extraction + # contract directly with the same resolved-text/missing-number shape. + out = await runtime._extract_transaction_parameters( + state, + tool_name="solicitar_devolucao", + missing_parameters=["valor"], + known_arguments={"subject": "Tamboro Mensal"}, + ) + assert runtime.pending_seen == ["valor"] + assert out == {"valor": 19.99} diff --git a/agent_framework_oci/tests/test_transactional_tool_flow.py b/agent_framework_oci/tests/test_transactional_tool_flow.py index 48f6b0f7..71c03b0d 100644 --- a/agent_framework_oci/tests/test_transactional_tool_flow.py +++ b/agent_framework_oci/tests/test_transactional_tool_flow.py @@ -1283,3 +1283,94 @@ async def test_prevalidation_parameter_message_is_used_once_without_changing_tra # One-shot: subsequent clarification falls back to the normal prompt. assert runtime.transaction_clarification_message(state) != expected assert "transaction_parameter_message_override" not in state + +class _TemporalFallbackRuntime(AgentRuntimeMixin): + def __init__(self): + from types import SimpleNamespace + self.calls = [] + self.llm = None + self.tool_router = SimpleNamespace( + registry=SimpleNamespace( + get_tool=lambda name: SimpleNamespace( + requires=["subject"], + args_schema={"subject": {"type": "string", "description": "Nome do serviço ou VAS alvo do cancelamento."}}, + description="Cancela o serviço VAS selecionado pelo cliente.", + confirmation_required=True, + tool_type="transactional", + ) + ), + resolve_execution_policy=lambda name, arguments=None: { + "operation_type": "transactional", + "require_confirmation": True, + "requires": ["subject"], + "pre_validation": {"enabled": True, "tool": "validar_vas_subject", "fail_open": False}, + }, + ) + + async def _extract_transaction_parameters_current_only(self, state, *, tool_name, missing_parameters, known_arguments=None): + # Simula o collector tradicional interpretando literalmente a fala atual. + return {"subject": "dezenove e noventa e nove"} + + async def _reconcile_transaction_parameters(self, state, *, tool_name, parameter_names, known_arguments=None): + # Simula o reconciliador temporal usando tools.yaml + contexto newest->oldest. + return { + "values": {"subject": "Tamboro Mensal"}, + "decisions": {"subject": "resolved"}, + "provenance": {"subject": "history:2"}, + "clear_fields": [], + } + + async def _call_mcp_tool(self, tool_name, arguments, state): + self.calls.append((tool_name, dict(arguments))) + if tool_name == "validar_vas_subject": + subject = arguments.get("subject") + if subject == "Tamboro Mensal": + return {"ok": True, "tool_name": tool_name, "result": {"eligible": True, "status": "ELIGIBLE"}} + return {"ok": True, "tool_name": tool_name, "result": { + "eligible": False, + "status": "NEEDS_PARAMETER", + "parameter": "subject", + "reason": "subject_not_resolved", + }} + return {"ok": True, "tool_name": tool_name, "result": {"status": "OK"}} + + +@pytest.mark.asyncio +async def test_temporal_reconciler_is_fallback_after_traditional_candidate_fails_prevalidation(): + runtime = _TemporalFallbackRuntime() + state = { + "user_text": "é a de dezenove e noventa e nove", + "sanitized_input": "é a de dezenove e noventa e nove", + "route": "contestacao_agent", + "intent": "state:COLLECTING_CONTESTACAO_PARAMETERS", + "transaction_status": "COLLECTING_PARAMETERS", + "selected_tool_call": {"tool_name": "cancelar_vas_avulso", "arguments": {}}, + "active_transaction": { + "transaction_id": "tx-1", + "tool_name": "cancelar_vas_avulso", + "arguments": {}, + "status": "COLLECTING_PARAMETERS", + "started_from_intent": "contas_vas_cancel", + "requires": ["subject"], + "parameter_schema": {"subject": {"type": "string", "description": "Nome do serviço ou VAS alvo do cancelamento."}}, + "tool_description": "Cancela o serviço VAS selecionado pelo cliente.", + "parameter_conversational_context": ( + "user: não reconheço esse Tamboro Mensal na minha fatura\n" + "assistant: identifiquei Tamboro Mensal por R$ 14,99 e R$ 19,99" + ), + }, + "context": {}, + } + + result = await runtime.execute_tools_for_intent(state, tools=[]) + + validations = [(name, args.get("subject")) for name, args in runtime.calls if name == "validar_vas_subject"] + assert validations == [ + ("validar_vas_subject", "dezenove e noventa e nove"), + ("validar_vas_subject", "Tamboro Mensal"), + ] + assert state["transaction_parameter_collection"]["mode"] == "current_turn" + assert state["transaction_parameter_reconciliation"]["trigger"] == "prevalidation_needs_parameter" + assert state["pending_tool_call"]["arguments"]["subject"] == "Tamboro Mensal" + assert state["transaction_status"] == "AWAITING_CONFIRMATION" + assert result[-1]["awaiting_confirmation"] is True diff --git a/contas_mcp/__pycache__/__init__.cpython-313.pyc b/contas_mcp/__pycache__/__init__.cpython-313.pyc index 9290c03f..abd191a6 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 20a6bcb1..fb77a9c2 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 77f66018..94ad7ad8 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__/authorized_lines_service.cpython-313.pyc b/contas_mcp/servers/contas_mcp_server/__pycache__/authorized_lines_service.cpython-313.pyc index c58ce681..f5504cd0 100644 Binary files a/contas_mcp/servers/contas_mcp_server/__pycache__/authorized_lines_service.cpython-313.pyc and b/contas_mcp/servers/contas_mcp_server/__pycache__/authorized_lines_service.cpython-313.pyc differ diff --git a/contas_mcp/servers/contas_mcp_server/__pycache__/discount_history_service.cpython-313.pyc b/contas_mcp/servers/contas_mcp_server/__pycache__/discount_history_service.cpython-313.pyc index 7171b3be..ad7ed13a 100644 Binary files a/contas_mcp/servers/contas_mcp_server/__pycache__/discount_history_service.cpython-313.pyc and b/contas_mcp/servers/contas_mcp_server/__pycache__/discount_history_service.cpython-313.pyc differ diff --git a/contas_mcp/servers/contas_mcp_server/__pycache__/line_policy.cpython-313.pyc b/contas_mcp/servers/contas_mcp_server/__pycache__/line_policy.cpython-313.pyc index 4d38b53d..9f5e07cb 100644 Binary files a/contas_mcp/servers/contas_mcp_server/__pycache__/line_policy.cpython-313.pyc and b/contas_mcp/servers/contas_mcp_server/__pycache__/line_policy.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 9814d3e8..10352f8e 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 212d4737..7ef59f51 100644 --- a/contas_mcp/servers/contas_mcp_server/main.py +++ b/contas_mcp/servers/contas_mcp_server/main.py @@ -151,9 +151,26 @@ def _invoice_subject_catalog(args: dict[str, Any]) -> list[dict[str, Any]]: key = _norm_invoice_name(canonical) if not key: return - item = found.setdefault(key, {"name": canonical, "value": value, "category": str(category or "").strip(), "contestable": contestable}) - if item.get("value") in (None, "") and value not in (None, ""): - item["value"] = value + item = found.setdefault(key, { + "name": canonical, + "value": None, + "values": [], + "category": str(category or "").strip(), + "contestable": contestable, + }) + if value not in (None, ""): + # Preserve every distinct billed value for the canonical subject. + # A subject may occur more than once on the same invoice; in that case + # no single value is authoritative until the user-selected amount is + # validated against this set. + raw = str(value).strip().replace(",", ".") + try: + normalized_value: Any = float(raw) + except (TypeError, ValueError): + normalized_value = str(value).strip() + if normalized_value not in item["values"]: + item["values"].append(normalized_value) + item["value"] = item["values"][0] if len(item["values"]) == 1 else None if not item.get("category") and category: item["category"] = str(category).strip() if item.get("contestable") is None and contestable is not None: @@ -283,6 +300,13 @@ def _preflight_subject(name: str, args: dict[str, Any]) -> dict[str, Any] | None subject = canonical if explicit.get("value") not in (None, ""): args["resolved_value"] = str(explicit.get("value")) + args["resolved_value_source"] = "invoice_unique_subject_value" + else: + # Multiple billed occurrences for the same subject (or no billed + # value) mean the subject alone cannot resolve an amount. Never + # preserve a stale/user-claimed value as resolved_value. + args.pop("resolved_value", None) + args.pop("resolved_value_source", None) category = str(explicit.get("category") or "").strip() if category: args["resolved_category"] = category @@ -334,8 +358,21 @@ def _preflight_subject(name: str, args: dict[str, Any]) -> dict[str, Any] | None args.setdefault("item_msisdn", resolved.msisdn) if resolved.charge_date: args.setdefault("charge_date", resolved.charge_date) - if getattr(resolved, "value", None) is not None: - args.setdefault("resolved_value", str(resolved.value)) + subject_key = _norm_invoice_name(resolved.canonical_name) + subject_record = next(( + item for item in _invoice_subject_catalog(args) + if _norm_invoice_name(item.get("name")) == subject_key + ), None) + unique_subject_value = subject_record.get("value") if isinstance(subject_record, dict) else None + if unique_subject_value not in (None, ""): + args["resolved_value"] = str(unique_subject_value) + args["resolved_value_source"] = "invoice_unique_subject_value" + else: + # Do not select one arbitrary occurrence when the same subject has + # multiple billed values. The user-selected value must be checked by + # CVAL against the subject before it can become resolved_value. + args.pop("resolved_value", None) + args.pop("resolved_value_source", None) # Paridade do backend original: se o cliente pediu cancelamento avulso, # mas a própria fatura classifica o item como estratégico/bundle, não # executamos a operação errada. A resolução determinística do domínio @@ -1040,7 +1077,14 @@ async def _validate_contestation(args: dict[str, Any]) -> dict[str, Any]: "parameter": "subject", "reason": "subject_not_resolved", "subject": args.get("resolved_subject") or args.get("subject"), - "resolved_value": requested_value, + # requested_value is only a candidate while the subject itself is + # unresolved. It must never be promoted to resolved_value. + "candidate_value": requested_value, + "resolved_value": None, + "clear_fields": [ + "resolved_subject", "resolved_value", "resolved_category", + "item_msisdn", "charge_date", + ], "validation_log": validation_log, "items": validated, "metadata": { @@ -1082,7 +1126,14 @@ async def _validate_contestation(args: dict[str, Any]) -> dict[str, Any]: "reason": "CVAL", "recoverable_reason": "amount_not_supported_by_invoice", "subject": canonical_subject, - "resolved_value": billed, + # The claimed value was rejected. Keep it only as diagnostic + # candidate data. The billed value may be shown to the user but + # is not persisted as the selected resolved_value until the next + # candidate is validated relationally against this subject. + "candidate_value": requested_value, + "billed_value": billed, + "resolved_value": None, + "clear_fields": ["resolved_value"], "parameter_message": message, "validation_log": validation_log, "items": validated, @@ -1105,14 +1156,25 @@ async def _validate_contestation(args: dict[str, Any]) -> dict[str, Any]: "items": validated, "metadata": {"side_effect_free": True, "target_tool": args.get("target_tool") or "contestar_cobranca", "guardrail_code": "CVAL"}, } + canonical_subject = str(args.get("resolved_subject") or args.get("subject") or "").strip() return { "eligible": True, "status": "ELIGIBLE", - "subject": args.get("resolved_subject") or args.get("subject"), + "subject": canonical_subject, + # Only the successful subject+amount CVAL relationship promotes the + # candidate into resolved_value. "resolved_value": requested_value, "category": args.get("resolved_category"), "validation_log": validation_log, "items": validated, + "transaction_decision": { + "resolved_arguments": { + "subject": canonical_subject, + "resolved_subject": canonical_subject, + "resolved_value": requested_value, + "resolved_value_source": "contestation_cval_subject_amount", + } + }, "metadata": {"side_effect_free": True, "target_tool": args.get("target_tool") or "contestar_cobranca", "guardrail_code": "CVAL"}, } diff --git a/docs/FIX_CONTESTATION_RELATIONAL_RESOLUTION_20260907.md b/docs/FIX_CONTESTATION_RELATIONAL_RESOLUTION_20260907.md new file mode 100644 index 00000000..6410712b --- /dev/null +++ b/docs/FIX_CONTESTATION_RELATIONAL_RESOLUTION_20260907.md @@ -0,0 +1,15 @@ +# Correção — resolução relacional de contestação + +## Regra + +`resolved_value` representa um valor efetivamente resolvido/validado para o `subject` da transação. +Um valor apenas informado pelo usuário é `candidate_value` até a pré-validação autoritativa confirmar a relação `subject + valor` contra a evidência da fatura. + +## Invariantes + +1. Um valor divergente não é promovido a `resolved_value`. +2. Se o mesmo subject aparece com vários valores na fatura, o subject sozinho não escolhe um valor arbitrário. +3. Se dois produtos diferentes têm o mesmo valor, o valor não substitui um subject já identificado por evidência mais forte do usuário. +4. Quando a pré-validação rejeita um parâmetro, ela pode declarar `clear_fields` para invalidar derivados dependentes; o framework aplica essa lista sem conhecer semântica de domínio. +5. A extração do turno atual ocorre antes da reconciliação. A reconciliação pode canonicalizar o candidato, mas não apagá-lo antes da pré-validação. +6. Somente uma validação relacional bem-sucedida promove o candidato a `resolved_value`. diff --git a/docs/FIX_RECONCILIACAO_REWORK_MINIMO_20260907.md b/docs/FIX_RECONCILIACAO_REWORK_MINIMO_20260907.md new file mode 100644 index 00000000..dd481db4 --- /dev/null +++ b/docs/FIX_RECONCILIACAO_REWORK_MINIMO_20260907.md @@ -0,0 +1,19 @@ +# Rework mínimo da reconciliação temporal — 2026-09-07 + +## Princípios + +1. Extração do turno atual é uma etapa curta, sem histórico. +2. Reconciliação temporal só roda se required fields continuarem faltando. +3. Candidate estrutural só existe quando há um único evidence block ancorado por parâmetro conhecido. +4. Candidate estrutural nunca é resolved; exige pre-validation configurada. +5. Não existe fallback baseado apenas em uma fala histórica única. +6. A pre-validation/CVAL é a autoridade para canonicalização e relação subject+valor. +7. Intent shift genérico não encerra transação ativa; abandono explícito pode encerrar e rerotear. + +## Cenário 08 + +Mensagem atual -> valor 14.99 (current-only extraction) -> histórico ancorado -> candidate subject -> CVAL -> subject canônico -> confirmação. + +## Cenário 16 + +Subject preservado -> valor 25.50 candidato -> CVAL rejeita relação -> valor continua pendente -> valor 19.99 -> CVAL valida relação -> confirmação. Uma fala como "isso mesmo, pode cancelar" permanece na transação; abandono explícito como "esquece isso, quero ver minha fatura" pode rerotear. diff --git a/tests/migration/test_contestation_resolved_value_relational.py b/tests/migration/test_contestation_resolved_value_relational.py new file mode 100644 index 00000000..22f9e447 --- /dev/null +++ b/tests/migration/test_contestation_resolved_value_relational.py @@ -0,0 +1,90 @@ +from __future__ import annotations + +import asyncio + +from contas_mcp.servers.contas_mcp_server import main + + +def _analysis(): + return { + "currentInvoice": [ + { + "type": "servicos_contratados_de_parceiros", + "items": [ + {"desc": "Tamboro Mensal", "value": "14.99", "contestable": True, "classe": "avulso"}, + {"desc": "Tamboro Mensal", "value": "19.99", "contestable": True, "classe": "avulso"}, + {"desc": "Outro Produto", "value": "19.99", "contestable": True, "classe": "avulso"}, + ], + } + ] + } + + +def test_subject_catalog_does_not_choose_arbitrary_value_for_repeated_subject(): + catalog = main._invoice_subject_catalog({"billing_analysis": _analysis()}) + tamboro = next(x for x in catalog if x["name"] == "Tamboro Mensal") + assert sorted(tamboro["values"]) == [14.99, 19.99] + assert tamboro["value"] is None + + +def test_preflight_does_not_resolve_value_from_subject_when_subject_has_multiple_values(monkeypatch): + class DummyClient: + def billing_analysis(self, _msisdn): + return _analysis() + + class DummyService: + client = DummyClient() + + monkeypatch.setattr(main, "service", DummyService()) + args = { + "msisdn": "11999999999", + "subject": "Tamboro Mensal", + "query": "não reconheço esse Tamboro Mensal", + "billing_analysis": _analysis(), + "resolved_value": "25.5", + } + # The resolver may continue to normal validation, but it must not retain an + # arbitrary/stale resolved_value just because the subject matched. + main._preflight_subject("contestar_cobranca", args) + assert args["subject"] == "Tamboro Mensal" + assert args.get("resolved_value") is None + + +def test_invalid_amount_is_candidate_not_resolved(monkeypatch): + async def no_enrich(_name, _args): + return None + monkeypatch.setattr(main, "_enrich_invoice_context", no_enrich) + monkeypatch.setattr(main, "_preflight_subject", lambda *_a, **_k: None) + args = { + "msisdn": "11999999999", + "subject": "Tamboro Mensal", + "valor": 25.5, + "billing_analysis": _analysis(), + "target_tool": "contestar_cobranca", + } + result = asyncio.run(main._validate_contestation(args)) + assert result["eligible"] is False + assert result["status"] == "NEEDS_PARAMETER" + assert result["parameter"] == "valor" + assert result["candidate_value"] == 25.5 + assert result["resolved_value"] is None + + +def test_valid_amount_is_resolved_only_after_subject_amount_validation(monkeypatch): + async def no_enrich(_name, _args): + return None + monkeypatch.setattr(main, "_enrich_invoice_context", no_enrich) + monkeypatch.setattr(main, "_preflight_subject", lambda *_a, **_k: None) + args = { + "msisdn": "11999999999", + "subject": "Tamboro Mensal", + "valor": 19.99, + "billing_analysis": _analysis(), + "target_tool": "contestar_cobranca", + } + result = asyncio.run(main._validate_contestation(args)) + assert result["eligible"] is True + assert result["resolved_value"] == 19.99 + resolved = result["transaction_decision"]["resolved_arguments"] + assert resolved["subject"] == "Tamboro Mensal" + assert resolved["resolved_value"] == 19.99 diff --git a/tests/migration/test_contestation_subject_entity_resolution.py b/tests/migration/test_contestation_subject_entity_resolution.py index f43481fd..de6187ee 100644 --- a/tests/migration/test_contestation_subject_entity_resolution.py +++ b/tests/migration/test_contestation_subject_entity_resolution.py @@ -50,6 +50,8 @@ def test_validator_turns_unresolved_subject_into_recoverable_parameter_request(m assert result["status"] == "NEEDS_PARAMETER" assert result["parameter"] == "subject" assert result["reason"] == "subject_not_resolved" - assert result["resolved_value"] == 10.0 + assert result["candidate_value"] == 10.0 + assert result["resolved_value"] is None + assert "resolved_value" in result["clear_fields"] assert result["metadata"]["entity_resolution"] == "invoice_evidence" assert "error" not in result diff --git a/tests/migration/test_requested_tools_parity_pente_fino.py b/tests/migration/test_requested_tools_parity_pente_fino.py index da631a77..ffc05b85 100644 --- a/tests/migration/test_requested_tools_parity_pente_fino.py +++ b/tests/migration/test_requested_tools_parity_pente_fino.py @@ -113,7 +113,7 @@ async def test_validar_contestacao_usa_mesma_cval_e_rejeita_valor_acima_da_fatur @pytest.mark.asyncio -async def test_validar_contestacao_aprova_quando_item_e_valor_sao_comprovados(monkeypatch): +async def test_validar_contestacao_rejeita_valor_que_nao_pertence_ao_item(monkeypatch): billing = json.loads((ROOT / "app/domain/contas/fixtures/divergencia.json").read_text(encoding="utf-8")) async def no_enrich(name, args): @@ -127,8 +127,12 @@ async def test_validar_contestacao_aprova_quando_item_e_valor_sao_comprovados(mo "motivo": "quero contestar TIM Fashion Mensal", "billing_analysis": billing, }) - assert out["eligible"] is True - assert out["status"] == "ELIGIBLE" + assert out["eligible"] is False + assert out["status"] == "NEEDS_PARAMETER" + assert out["parameter"] == "valor" + assert out["candidate_value"] == 50 + assert out["billed_value"] == "10" + assert out["resolved_value"] is None def test_termino_desconto_e_valor_divergente_preservam_semantica_do_original(): diff --git a/tests/migration/test_subject_entity_resolution_all_domains.py b/tests/migration/test_subject_entity_resolution_all_domains.py index 4711601a..d23741a3 100644 --- a/tests/migration/test_subject_entity_resolution_all_domains.py +++ b/tests/migration/test_subject_entity_resolution_all_domains.py @@ -274,6 +274,9 @@ async def test_contestation_wrong_amount_is_recoverable_with_invoice_amount(monk assert result['eligible'] is False assert result['status'] == 'NEEDS_PARAMETER' assert result['parameter'] == 'valor' - assert result['resolved_value'] == '14.99' + assert result['candidate_value'] == '29.98' + assert result['billed_value'] == '14.99' + assert result['resolved_value'] is None + assert 'resolved_value' in result['clear_fields'] assert 'R$ 14,99' in result['parameter_message'] assert 'R$ 29,98' in result['parameter_message']