From b0f65c6844c5dd4dc07573d5e6b330dea9b941d1 Mon Sep 17 00:00:00 2001 From: "cristiano.hoshikawa" Date: Mon, 7 Sep 2026 22:57:40 -0300 Subject: [PATCH] bugfix reconciliation extractor --- .../__pycache__/__init__.cpython-313.pyc | Bin 411 -> 411 bytes .../__pycache__/extensions.cpython-313.pyc | Bin 2139 -> 2139 bytes .../__pycache__/idempotency.cpython-313.pyc | Bin 8912 -> 8912 bytes .../__pycache__/observer.cpython-313.pyc | Bin 17555 -> 17555 bytes .../__pycache__/__init__.cpython-313.pyc | Bin 547 -> 547 bytes .../composite_publisher.cpython-313.pyc | Bin 2502 -> 2502 bytes .../__pycache__/event_builder.cpython-313.pyc | Bin 1260 -> 1260 bytes .../__pycache__/factory.cpython-313.pyc | Bin 3996 -> 3996 bytes .../__pycache__/publisher.cpython-313.pyc | Bin 1872 -> 1872 bytes .../tim_payload_mapper.cpython-313.pyc | Bin 9286 -> 9286 bytes .../__pycache__/tim_sequence.cpython-313.pyc | Bin 17561 -> 17561 bytes .../__pycache__/__init__.cpython-313.pyc | Bin 514 -> 514 bytes .../__pycache__/kafka.cpython-313.pyc | Bin 1812 -> 1812 bytes .../__pycache__/langfuse.cpython-313.pyc | Bin 23172 -> 23172 bytes .../__pycache__/oci_streaming.cpython-313.pyc | Bin 1821 -> 1821 bytes .../__pycache__/pubsub.cpython-313.pyc | Bin 7440 -> 7440 bytes .../__pycache__/__init__.cpython-313.pyc | Bin 403 -> 403 bytes .../usage_repository.cpython-313.pyc | Bin 15686 -> 15686 bytes .../__pycache__/__init__.cpython-313.pyc | Bin 213 -> 213 bytes .../cache/__pycache__/cache.cpython-313.pyc | Bin 16523 -> 16523 bytes .../__pycache__/__init__.cpython-313.pyc | Bin 216 -> 216 bytes .../__pycache__/adapters.cpython-313.pyc | Bin 4172 -> 4172 bytes .../channels/__pycache__/base.cpython-313.pyc | Bin 1796 -> 1796 bytes .../__pycache__/gateway.cpython-313.pyc | Bin 5771 -> 5771 bytes .../__pycache__/interruption.cpython-313.pyc | Bin 6456 -> 6456 bytes .../__pycache__/transcription.cpython-313.pyc | Bin 1429 -> 1429 bytes .../__pycache__/__init__.cpython-313.pyc | Bin 923 -> 923 bytes .../checkpoint_repository.cpython-313.pyc | Bin 27163 -> 27163 bytes .../langgraph_saver.cpython-313.pyc | Bin 33265 -> 33265 bytes .../__pycache__/__init__.cpython-313.pyc | Bin 214 -> 214 bytes .../agent_registry.cpython-313.pyc | Bin 6947 -> 6947 bytes .../__pycache__/settings.cpython-313.pyc | Bin 13789 -> 13789 bytes .../__pycache__/__init__.cpython-313.pyc | Bin 306 -> 306 bytes .../mcp_gateway_client.cpython-313.pyc | Bin 3332 -> 3332 bytes .../__pycache__/__init__.cpython-313.pyc | Bin 1501 -> 1501 bytes .../__pycache__/base.cpython-313.pyc | Bin 1375 -> 1375 bytes .../__pycache__/config_loader.cpython-313.pyc | Bin 9160 -> 9160 bytes .../__pycache__/custom_rails.cpython-313.pyc | Bin 4404 -> 4404 bytes .../framework_llm_client.cpython-313.pyc | Bin 19673 -> 19673 bytes .../__pycache__/llm_rails.cpython-313.pyc | Bin 5923 -> 5923 bytes .../output_supervisor.cpython-313.pyc | Bin 24306 -> 24306 bytes .../parallel_executor.cpython-313.pyc | Bin 21862 -> 21862 bytes .../__pycache__/pipeline.cpython-313.pyc | Bin 10889 -> 10889 bytes .../__pycache__/rail_action.cpython-313.pyc | Bin 654 -> 654 bytes .../__pycache__/rail_decision.cpython-313.pyc | Bin 1605 -> 1605 bytes .../__pycache__/rail_result.cpython-313.pyc | Bin 1004 -> 1004 bytes .../__pycache__/rails.cpython-313.pyc | Bin 43324 -> 43324 bytes .../__pycache__/__init__.cpython-313.pyc | Bin 2994 -> 2994 bytes .../__pycache__/_compat.cpython-313.pyc | Bin 2445 -> 2445 bytes .../contestation_validation.cpython-313.pyc | Bin 2177 -> 2177 bytes .../__pycache__/contracts.cpython-313.pyc | Bin 6901 -> 6901 bytes .../__pycache__/input_size.cpython-313.pyc | Bin 3649 -> 3649 bytes .../__pycache__/llm_adapter.cpython-313.pyc | Bin 3799 -> 3799 bytes .../__pycache__/llm_client.cpython-313.pyc | Bin 7454 -> 7454 bytes .../__pycache__/llm_rails.cpython-313.pyc | Bin 8894 -> 8894 bytes .../output_sanitization.cpython-313.pyc | Bin 13910 -> 13910 bytes .../__pycache__/pipeline.cpython-313.pyc | Bin 12661 -> 12661 bytes .../__pycache__/__init__.cpython-313.pyc | Bin 473 -> 473 bytes .../__pycache__/_context.cpython-313.pyc | Bin 5871 -> 5871 bytes .../ausencia_oferta_proativa.cpython-313.pyc | Bin 12205 -> 12205 bytes .../__pycache__/coerencia.cpython-313.pyc | Bin 4157 -> 4157 bytes .../__pycache__/dlex_in.cpython-313.pyc | Bin 1304 -> 1304 bytes .../__pycache__/dlex_out.cpython-313.pyc | Bin 1815 -> 1815 bytes .../__pycache__/fallback.cpython-313.pyc | Bin 17652 -> 17652 bytes .../__pycache__/fraseologia.cpython-313.pyc | Bin 7633 -> 7633 bytes .../__pycache__/out_of_scope.cpython-313.pyc | Bin 17493 -> 17493 bytes .../prompts/__pycache__/pinj.cpython-313.pyc | Bin 8424 -> 8424 bytes .../__pycache__/ragsec.cpython-313.pyc | Bin 1120 -> 1120 bytes .../__pycache__/revprec.cpython-313.pyc | Bin 3150 -> 3150 bytes .../prompts/__pycache__/tox.cpython-313.pyc | Bin 644 -> 644 bytes .../toxicidade_output.cpython-313.pyc | Bin 928 -> 928 bytes .../__pycache__/__init__.cpython-313.pyc | Bin 1663 -> 1663 bytes .../rails/__pycache__/alcada.cpython-313.pyc | Bin 4999 -> 4999 bytes .../rails/__pycache__/anatel.cpython-313.pyc | Bin 9148 -> 9148 bytes .../__pycache__/confirmation.cpython-313.pyc | Bin 11042 -> 11042 bytes .../rails/__pycache__/dlex_in.cpython-313.pyc | Bin 3279 -> 3279 bytes .../__pycache__/dlex_out.cpython-313.pyc | Bin 3331 -> 3331 bytes .../rails/__pycache__/ragsec.cpython-313.pyc | Bin 5462 -> 5462 bytes .../rails/__pycache__/revprec.cpython-313.pyc | Bin 5470 -> 5470 bytes .../rails/__pycache__/tox.cpython-313.pyc | Bin 8293 -> 8293 bytes .../__pycache__/__init__.cpython-313.pyc | Bin 533 -> 533 bytes .../rules/__pycache__/alcada.cpython-313.pyc | Bin 1881 -> 1881 bytes .../__pycache__/pinj_patterns.cpython-313.pyc | Bin 3730 -> 3730 bytes .../__pycache__/tox_blocklist.cpython-313.pyc | Bin 1506 -> 1506 bytes .../__pycache__/__init__.cpython-313.pyc | Bin 408 -> 408 bytes .../__pycache__/mcp_mapper.cpython-313.pyc | Bin 4692 -> 4692 bytes .../__pycache__/models.cpython-313.pyc | Bin 3144 -> 3144 bytes .../__pycache__/resolver.cpython-313.pyc | Bin 4713 -> 4713 bytes .../__pycache__/__init__.cpython-313.pyc | Bin 618 -> 618 bytes .../judges/__pycache__/judge.cpython-313.pyc | Bin 41125 -> 41125 bytes .../__pycache__/__init__.cpython-313.pyc | Bin 225 -> 225 bytes .../__pycache__/llm_client.cpython-313.pyc | Bin 5404 -> 5404 bytes .../__pycache__/__init__.cpython-313.pyc | Bin 233 -> 233 bytes .../prompts/__pycache__/aluc.cpython-313.pyc | Bin 6529 -> 6529 bytes .../prompts/__pycache__/csi.cpython-313.pyc | Bin 1332 -> 1332 bytes .../__pycache__/fallback.cpython-313.pyc | Bin 8035 -> 8035 bytes .../prompts/__pycache__/rqlt.cpython-313.pyc | Bin 1165 -> 1165 bytes .../prompts/__pycache__/vctn.cpython-313.pyc | Bin 626 -> 626 bytes .../llm/__pycache__/__init__.cpython-313.pyc | Bin 476 -> 476 bytes .../llm/__pycache__/base.cpython-313.pyc | Bin 1623 -> 1623 bytes .../profile_resolver.cpython-313.pyc | Bin 9322 -> 9322 bytes .../llm/__pycache__/providers.cpython-313.pyc | Bin 46978 -> 46978 bytes .../structured_output.cpython-313.pyc | Bin 7459 -> 7459 bytes .../llm/__pycache__/types.cpython-313.pyc | Bin 1274 -> 1274 bytes .../mcp/__pycache__/__init__.cpython-313.pyc | Bin 473 -> 473 bytes .../mcp/__pycache__/client.cpython-313.pyc | Bin 18426 -> 18426 bytes .../mcp/__pycache__/models.cpython-313.pyc | Bin 2136 -> 2136 bytes .../mcp/__pycache__/registry.cpython-313.pyc | Bin 4740 -> 4740 bytes .../__pycache__/tool_policy.cpython-313.pyc | Bin 5685 -> 5685 bytes .../__pycache__/tool_router.cpython-313.pyc | Bin 14189 -> 14189 bytes .../__pycache__/__init__.cpython-313.pyc | Bin 1135 -> 1135 bytes .../long_term_extractor.cpython-313.pyc | Bin 2513 -> 2513 bytes .../long_term_memory.cpython-313.pyc | Bin 6839 -> 6839 bytes .../long_term_models.cpython-313.pyc | Bin 1748 -> 1748 bytes .../long_term_store.cpython-313.pyc | Bin 29186 -> 29186 bytes .../message_history.cpython-313.pyc | Bin 8359 -> 8359 bytes .../summary_memory.cpython-313.pyc | Bin 12510 -> 12510 bytes .../__pycache__/summary_store.cpython-313.pyc | Bin 9520 -> 9520 bytes .../__pycache__/__init__.cpython-313.pyc | Bin 214 -> 214 bytes .../__pycache__/identity.cpython-313.pyc | Bin 3465 -> 3465 bytes .../__pycache__/session.cpython-313.pyc | Bin 2708 -> 2708 bytes .../__pycache__/__init__.cpython-313.pyc | Bin 1394 -> 1394 bytes .../__pycache__/code_mapper.cpython-313.pyc | Bin 21447 -> 21447 bytes .../__pycache__/context.cpython-313.pyc | Bin 7386 -> 7386 bytes .../__pycache__/event_bus.cpython-313.pyc | Bin 3632 -> 3632 bytes .../guardrail_events.cpython-313.pyc | Bin 2050 -> 2050 bytes .../__pycache__/ic_events.cpython-313.pyc | Bin 625 -> 625 bytes .../__pycache__/judge_events.cpython-313.pyc | Bin 1410 -> 1410 bytes .../langgraph_telemetry.cpython-313.pyc | Bin 4963 -> 4963 bytes .../__pycache__/llm_advisors.cpython-313.pyc | Bin 2937 -> 2937 bytes .../__pycache__/noc_contract.cpython-313.pyc | Bin 5074 -> 5074 bytes .../__pycache__/noc_otel.cpython-313.pyc | Bin 6321 -> 6321 bytes .../__pycache__/observer.cpython-313.pyc | Bin 5104 -> 5104 bytes .../__pycache__/otel.cpython-313.pyc | Bin 3411 -> 3411 bytes .../streaming_events.cpython-313.pyc | Bin 1834 -> 1834 bytes .../__pycache__/telemetry.cpython-313.pyc | Bin 52427 -> 52427 bytes .../__pycache__/token_cost.cpython-313.pyc | Bin 8690 -> 8690 bytes .../workflow_events.cpython-313.pyc | Bin 3329 -> 3329 bytes .../oci/__pycache__/__init__.cpython-313.pyc | Bin 211 -> 211 bytes .../oci/__pycache__/auth.cpython-313.pyc | Bin 3243 -> 3243 bytes .../__pycache__/__init__.cpython-313.pyc | Bin 219 -> 219 bytes .../__pycache__/oracle_store.cpython-313.pyc | Bin 45931 -> 45931 bytes .../__pycache__/sqlite_store.cpython-313.pyc | Bin 15018 -> 15018 bytes .../__pycache__/__init__.cpython-313.pyc | Bin 454 -> 454 bytes .../__pycache__/renderers.cpython-313.pyc | Bin 4317 -> 4317 bytes .../rag/__pycache__/__init__.cpython-313.pyc | Bin 709 -> 709 bytes .../embedding_provider.cpython-313.pyc | Bin 6516 -> 6516 bytes .../__pycache__/graph_store.cpython-313.pyc | Bin 5527 -> 5527 bytes .../rag/__pycache__/ingest.cpython-313.pyc | Bin 12580 -> 12580 bytes .../__pycache__/kbdb_service.cpython-313.pyc | Bin 10011 -> 10011 bytes .../__pycache__/rag_service.cpython-313.pyc | Bin 10897 -> 10897 bytes .../__pycache__/vector_store.cpython-313.pyc | Bin 18655 -> 18655 bytes .../__pycache__/__init__.cpython-313.pyc | Bin 220 -> 220 bytes .../session_repository.cpython-313.pyc | Bin 8589 -> 8589 bytes .../__pycache__/__init__.cpython-313.pyc | Bin 425 -> 425 bytes .../__pycache__/config_loader.cpython-313.pyc | Bin 2296 -> 2296 bytes .../__pycache__/continuity.cpython-313.pyc | Bin 15933 -> 15933 bytes .../enterprise_router.cpython-313.pyc | Bin 61971 -> 61971 bytes .../__pycache__/models.cpython-313.pyc | Bin 2446 -> 2446 bytes .../routing/enterprise_router.py | 40 ++- .../__pycache__/__init__.cpython-313.pyc | Bin 348 -> 348 bytes .../__pycache__/agent_runtime.cpython-313.pyc | Bin 206069 -> 200597 bytes .../transaction_parameters.cpython-313.pyc | Bin 26391 -> 14476 bytes .../agent_framework/runtime/agent_runtime.py | 247 ++----------- .../runtime/transaction_parameters.py | 335 +----------------- .../sse/__pycache__/__init__.cpython-313.pyc | Bin 211 -> 211 bytes .../sse/__pycache__/events.cpython-313.pyc | Bin 9587 -> 9587 bytes .../__pycache__/__init__.cpython-313.pyc | Bin 218 -> 218 bytes .../__pycache__/supervisor.cpython-313.pyc | Bin 4943 -> 4943 bytes .../__pycache__/__init__.cpython-313.pyc | Bin 878 -> 878 bytes .../__pycache__/graph.cpython-313.pyc | Bin 1415 -> 1415 bytes .../input_contract.cpython-313.pyc | Bin 8790 -> 8790 bytes .../__pycache__/models.cpython-313.pyc | Bin 7669 -> 7669 bytes .../__pycache__/registry.cpython-313.pyc | Bin 2361 -> 2361 bytes .../__pycache__/repository.cpython-313.pyc | Bin 2714 -> 2714 bytes .../__pycache__/runtime.cpython-313.pyc | Bin 36152 -> 36152 bytes .../__pycache__/tool_executor.cpython-313.pyc | Bin 1966 -> 1966 bytes 177 files changed, 64 insertions(+), 558 deletions(-) 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 48ae02cc3a77f740817e8f5d306f46193d70a609..ce1e9f932ef9681c3ac6d82b0b3abcf39917f394 100644 GIT binary patch delta 20 acmbQuJe!&OGcPX}0}$NKoWGHK0wVx7+69jQ delta 20 acmbQuJe!&OGcPX}0}z-!nYWR90wVx6GzDY; 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 e226376dc0d25f9a5e039727b3950acce319bbd7..807caa308a05696a980d0132b0f4a131280a78af 100644 GIT binary patch delta 20 acmcaDa9e=;GcPX}0}$NKoWGGffCB(RwFU41 delta 20 acmcaDa9e=;GcPX}0}z-!nYWQUfCB(Q4+X^l 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 f7069c7be7bd0a4aebdd2ba11549e2124a5a9945..6f08ffe36b73995050c0785b03287d184464dab4 100644 GIT binary patch delta 20 acmccMdcl?ZGcPX}0}$NKoWGI#s1g84iw4sG delta 20 acmccMdcl?ZGcPX}0}z-!nYWSqs1g82md`y`8GcPX}0}$NKoWGHKHzxo<+6FiP delta 20 acmX>md`y`8GcPX}0}z-$nYWR9Hzxo;I|dE_ 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 a2b9a990b7ee95ebc11f717fe5d8a27ac5c19319..1d9aa3cbb521b36ca4fb43488d913feae4bb8496 100644 GIT binary patch delta 20 acmaFE`G%AGGcPX}0}$NKoWGI#AqxOST?UZ= delta 20 acmaFE`G%AGGcPX}0}z-$nYWSqAqxOQz6NIi 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 107dc9770b605a60bb4a539d67d35ab0b07fe51c..765ccd7de86b1570bc1622630d8431b6cd280316 100644 GIT binary patch delta 20 acmbOuKS!SXGcPX}0}$NKoWGHKB0m5;00r0p delta 20 acmbOuKS!SXGcPX}0}z-$nYWR9B0m5+VFj)L 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 62d17e73a4fdcd61f8e834af9398d603adf4da84..c229aea4baf9f9a73d6e22a6ce2670e9f4207c3e 100644 GIT binary patch delta 20 acmcb>cY%-lGcPX}0}$NKoWGIVl^p;;v<1ol delta 20 acmcb>cY%-lGcPX}0}z-$nYWSKl^p;-6$PLG 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 10d4565491e15c0db120f29daa25c877c0623ece..1283c1078a048d6fc08587964b5efe9576b4165c 100644 GIT binary patch delta 20 acmX@+am<7JGcPX}0}$NKoWGIVS_J?{X$Cz2 delta 20 acmX@+am<7JGcPX}0}z-$nYWSKS_J?_$_5hv 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 503859cb2c96975f140920ae106d97b7fba885da..696a9cad26ad465dc634876eed1211932254ec94 100644 GIT binary patch delta 22 ccmbQ)$vCr<{9 delta 22 ccmZqK%Gk1%k^3_*FBbz4m_M1fk-IVq08iEi-v9sr 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 0e791d4a2be2296f5e6ac71fd3e74d0de4ac76a0..d79f3db27efb638aca926455b195f2889595e41d 100644 GIT binary patch delta 20 acmbQsH delta 20 acmX?Bb*zf}GcPX}0}z-$nYWSK+7jsbj 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 390cc71b06530e7817938f766b8d509385fb4818..1ceb7715cf50973e4f7eb06fdd2758766df4d212 100644 GIT binary patch delta 19 Zcmcc0c$Ja+GcPX}0}$NKoIjEK6aYF21{eSU delta 19 Zcmcc0c$Ja+GcPX}0}z-$nKzO96aYAs1?~U< 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 adab518adc7f6fa70b20886edf838aa3917d773d..6d3d8bfac55cdb31897e7933b4c057e4887ba6d3 100644 GIT binary patch delta 22 ccmeBfWbAHam*3M()qNyj%=Ga65DUMs9&D09hLc8~^|S delta 22 ccmbPzg>m*3M()qNyj%=GVD@C*Ms9&D09SPe@c;k- 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 ddb3a98758acd0284e4320413c7f5c1667b66b74..5b1b72e52b354a656b251737e60f951f5b1f4999 100644 GIT binary patch delta 22 ccmey^%=EFDiTg7zFBbz4+|Hc8k^5OA09Hq)$ 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 e1c89b73895b6c941a48d57cf8c50c26d5f48a4c..d425540198f6eade2b8d2ebf7be4c147ccd9cc5e 100644 GIT binary patch delta 19 Zcmcb{c#V 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 30f2c6e93b7fda83eb7dcb8e8b35c4d805129549..4cb1188fa51191c52b35d170e580f72eebe78810 100644 GIT binary patch delta 20 acmZ2%w%CmOGcPX}0}$NKoWGGhy{HB 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 e7e99a011f97b23e26f5f6dfbaa732b3a99048c3..37a3be28a91e1f83bedc1b86c176591245db0216 100644 GIT binary patch delta 22 ccmcaPlkw(EM()qNyj%=Ga65DUM(%Sy09$GY!TGcPX}0}$NKoWGHKIX3`4Oa=x3 delta 20 acmdlazDb<>GcPX}0}z-!nYWR9IX3`2rUlyo 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 eea12353781e6ba15fc74aa26ee2db36a2a67a96..6d79bde398d68a35c24d2dbb1c7aa9026a1d3f55 100644 GIT binary patch delta 20 acmeAb?iJ?#%*)Hg00g%)=Wpb0;sgLU@&%0m delta 20 acmeAb?iJ?#%*)Hg00d@F=56F|;sgLTOa)>9 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 e5169af35b501e0025f2dfd83b1a4ee1d9c82607..4dfda6f51ec3c74a81caeb6a090689a7a76ade6e 100644 GIT binary patch delta 20 acmZn^Y!u}F%*)Hg00g%)=WpaL;{X6P$pvHp delta 20 acmZn^Y!u}F%*)Hg00d@F=56FI;{X6OBLz7C 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 22ef4238fc19709fabb69186b528c750f3542389..3865d2ccb10837dc2e49b8e7d8222ec4cf2e0d39 100644 GIT binary patch delta 20 acmexr`qh;CGcPX}0}$NFoWGI#l@tI?5(gUq delta 20 acmexr`qh;CGcPX}0}z-!nYWSql@tI=Wd`p6 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 02d22db5a6cb6a4ff1577ec959c9769ef558d81d..84347c885a8a4f09766e64d734d1357fbc64c07d 100644 GIT binary patch delta 20 acmX>ob5Mr+GcPX}0}$NKoWGIVj1K@nTLr)X delta 20 acmX>ob5Mr+GcPX}0}z-!nYWSKj1K@lwFQ*` 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 a6a7843edaf24759e58461ba9971e68b5332341d..0366ecf2ff1b033d61a5370c37a5af783c9465e4 100644 GIT binary patch delta 20 acmcaEdtH|MGcPX}0}$NKoWGI#3?BeQ?*@bb delta 20 acmcaEdtH|MGcPX}0}z-!nYWSq3?BePNd{Q} 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 a0c2f406e8ada3cc4d708b9a3ff2e5ff2a81675d..8435c79964d1aef42f5e0a215f4da581bfb3f895 100644 GIT binary patch delta 20 acmbPdHP4FsGcPX}0}$NKoWGG;M1& delta 22 ccmey;$@ry{k^3_*FBbz4m_3=dk^7|!09(}uzyJUM 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 02ecc9f5a6497e42b3ca690d509af1ab72991ba0..d5c23d92e725dc02f066fbfe499888d9c959fcf2 100644 GIT binary patch delta 20 acmca;ebJixGcPX}0}$NFoWGI#m@EKDO$NRI delta 20 acmca;ebJixGcPX}0}z-!nYWSqm@EKBpazlv 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 e2438f0e809fe94fd7e09e9071bbcbb5f856664d..605811986280b8ee4a34176e04fbcaef573585cf 100644 GIT binary patch delta 22 ccmccG!FaWUk^3_*FBbz4+{v83k=x4!09Pgl4FCWD delta 22 ccmccG!FaWUk^3_*FBbz4m_3=dk=x4!09APg;Q#;t 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 c4abf03586c9ecc6ea4898c8c517077531179d93..6414806b2764b7848fa2bfbf5996ca95571402cf 100644 GIT binary patch delta 20 acmaFi_`;F| delta 20 acmaFB@qmN-GcPX}0}z-!nYWQUlm!4lvjxBa 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 051d0f80bbb3bc6eae26cc0362cce7ce02893cf8..1140c6aaf99ffcca67206a0df2888a06e1b75666 100644 GIT binary patch delta 20 acmX>naZZB!GcPX}0}$NFoWGIVnFjzt*ahAI delta 20 acmX>naZZB!GcPX}0}z-!nYWSKnFjzsD+RIu 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 5824f376dcdd90e32afc44f65e618f4a3bfc36d7..0e61c16a7f8ae6733763faed965fe024aa1c18a4 100644 GIT binary patch delta 20 acmZo+ZDHm9%*)Hg00eh3=Wpb$WC8#*k_Auz delta 20 acmZo+ZDHm9%*)Hg00d@F=56GzWC8#(*WGcPX}0}$NFoWGHKqcQ+Sy9S*A delta 20 acmdnvzQ>*WGcPX}0}z-!nYWR9qcQ+R4hC@m 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 c723122bb2978ad4f3cd7891a426a18ff1c6a7c2..cc0ecfdaaa98bd87996476b9892c47cd699b882a 100644 GIT binary patch delta 20 acmZ1!wkVAIGcPX}0}$NFoWGGvd0vwHGcPX}0}$NFoWGI#2oC^5BnD#u delta 20 acmX>vd0vwHGcPX}0}z-!nYWSq2oC^3cLp~A 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 69ca93c1af75bfd499352714d1bae9147c67c721..5ba6e9b7eff2d1c3b99375ed704cb2d3ea26ad9e 100644 GIT binary patch delta 20 acmZpcYL?>u%*)Hg00eh3=Wpcx!2u%*)Hg00d@F=56Hu!2|Ih delta 20 acmcbobx(`?GcPX}0}z-!nYWQUSQG$7JO&Q{ 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 884e386c498038ab3568b039a459fa30c85b18eb..8e03ce6e98a51c116428e70c1d97752931e436bb 100644 GIT binary patch delta 20 acmaFr@YI3(GcPX}0}$NFoWGGfN&x^%BnF27 delta 20 acmaFr@YI3(GcPX}0}z-!nYWQUN&x^#cLrMk 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 028d247ce3ca1cbaa30662fbeaa37aab54b949be..65e10062714d88d6309bee94fdfcb8be8c039e29 100644 GIT binary patch delta 20 acmbQrGL?n delta 20 acmbQiJcF70GcPX}0}z-$nYWRhaYBOoGcPX}0}$NFoWGIVmInYp=mpFG delta 20 acmX>haYBOoGcPX}0}z-$nYWSKmInYoLIt4! 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 c0422abc24827fe1612b9f9d4351ce7d52f278f6..a6cfed472a36d72cc8cedaa012ff71d6150f488c 100644 GIT binary patch delta 20 acmaE<@=}HSGcPX}0}$NFoWGGfP6z-;#s*CQ delta 20 acmaE<@=}HSGcPX}0}z-$nYWQUP6z--AO<1; 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 bd33b868a05bb6719cafd3f672594d188992627a..c1caea452ed64079c88067aee1a70f6c95baeef8 100644 GIT binary patch delta 20 acmaFG@`{D~GcPX}0}$NFoWGGfo(TX$UIqXF delta 20 acmaFG@`{D~GcPX}0}z-$nYWQUo(TX!xCPY! 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 c5626b0b35623fc29eb99647e69c2aec3f614e2a..fbca2fb9a0a8c2206009170f483241c0381dcf0b 100644 GIT binary patch delta 22 ccmZ2_kZI{bChpI?yj%=Ga3^#AM($Y)09i%{%>V!Z delta 22 ccmZ2_kZI{bChpI?yj%=GVE$y@M($Y)09T*~q5uE@ 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 085a359ed5c44dd97ac1c1a5627ec95a2abd74bf..2f95a868653bc463b2becd4da52c383697130dbf 100644 GIT binary patch delta 19 ZcmaFJ_>htNGcPX}0}$NFoIjEK8UQ=X20Z`( delta 19 ZcmaFJ_>htNGcPX}0}z-$nKzO98UQ*_1`+@O 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 78fc057cadbaf179f504ff8443cf83bb57035cab..5d7c24389f574ef93695f755de345e9635efbc3e 100644 GIT binary patch delta 20 acmbQEHAjp4GcPX}0}$NFoWGGnFVzK delta 20 acmbQEHAjp4GcPX}0}z-$nYWQ!P!s?<^94!( 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 6f73658d1304c59ad2670ca57fd4958b72654956..cf731d8f5ed168b5936e3199898001ee582f79c7 100644 GIT binary patch delta 19 ZcmaFK_>z(PGcPX}0}$NFoIjEK9soS^22}t6 delta 19 ZcmaFK_>z(PGcPX}0}z-$nKzO99soOd1}Xpm 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 33a256da3b9b209567eee17c79be534f1d733c22..e25ed611d44eb1b6a6150b86165115fbd36818f6 100644 GIT binary patch delta 20 acmZoPZZzip%*)Hg00eh3=WpaLlLP=dsRg?B(SC%*)Hg00eh3=Wpb0VgUd)j0JT7 delta 20 acmeC>?B(SC%*)Hg00ibw=56F|VgUd&<^@Us 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 bd81b3e7633cfae868e764a917601e4a9cd8ed90..3250734d187c42e76dd191b399bf8bc92674dd2d 100644 GIT binary patch delta 20 acmeyw@`;7}GcPX}0}$NFoWGGfoe2O$o(32I delta 20 acmeyw@`;7}GcPX}0}z-$nYWQUoe2O!_yz3% 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 2e33c5ada21ab4c422b357dbd78e8ee816b5a258..4f933a0ac3a85bffbb604f13ca6416efcb127b59 100644 GIT binary patch delta 20 acmcb^e21C)GcPX}0}$NKoWGI#A|n7o0tQk5 delta 20 acmcb^e21C)GcPX}0}z-!nYWSqA|n7mTm~lq 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 91b37ff6ed97927635708988e2b3e136b5e72d85..1cc721696070506232a4c3bdbc2104aa3c2474c3 100644 GIT binary patch delta 20 acmcc4bDf9#GcPX}0}$NKoWGIVhYbKhg9X|E delta 20 acmcc4bDf9#GcPX}0}z-!nYWSKhYbKf-36}z 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 8414daa631226dec65d0ee84650f339877e96753..a8df724167e12f1a46531c7d27cb8158ca4c1537 100644 GIT binary patch delta 20 acmaFm@ydhyGcPX}0}$NKoWGGfUIhS62?nVE delta 20 acmaFm@ydhyGcPX}0}z-!nYWQUUIhS4V+MWz 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 6558a05e8c1f902b0dec19d6d6fc3f35f67883e0..55667e21d4a1c237a62147b39d68e3f00203f89b 100644 GIT binary patch delta 22 ccmZpA&(!puiTg7zFBbz4+|Hc8k-L0509tnk)&Kwi delta 22 ccmZpA&(!puiTg7zFBbz4m_3=dk-L0509erns{jB1 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 28c9f6690af56c65607816e9a286f59fd2f1cc10..51f486a6969f6a23d417ecc607343c89d4a949fc 100644 GIT binary patch delta 20 acmZ2%wb+XLGcPX}0}$NKoWGG&-kmKk^3_*FBbz4+|Hc8k^8+n0AFed3;+NC delta 22 ccmey>&-kmKk^3_*FBbz4m_3=dk^8+n0A0if;Q#;t 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 b2f73e5a8169fdf8cedbdcd45553ba2c39188732..2c1f9120711765e55ee48eb043d255067cf4df44 100644 GIT binary patch delta 20 acmca1a6^FmGcPX}0}$NKoWGIVmjeJoJq70g delta 20 acmca1a6^FmGcPX}0}z-!nYWSKmjeJmmj%24 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 91673ee2c8d16eb3b3106bcbdde7465de9a6f95e..c2d673c659ab7ef9dd560f35944e5a4f6747e8b7 100644 GIT binary patch delta 20 acmZosZBga^%*)Hg00g%)=Wpb$6aoM_8wH;L delta 20 acmZosZBga^%*)Hg00d@F=56Gz6aoM@bp><) 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 80770cac9c4e3c8175c16aae5a722ebd08b64f35..3703011ad132fdc65420c2580ee52e56990aba29 100644 GIT binary patch delta 20 acmdn0vsH)tGcPX}0}$NKoWGG<1A5 delta 20 acmaEx_co9FGcPX}0}z-!nYWQU$s7PtMh4~p 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 821ddffd93d65b64757db7494ded48e556cd6aec..eb070c7e05299ca1835aeb4e4b30ab498154fae0 100644 GIT binary patch delta 20 acmaFQ@t%YGGcPX}0}$NKoWGGfg#`dau?83b delta 20 acmaFQ@t%YGGcPX}0}z-!nYWQUg#`dZ3kB@} 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 25dd37deebe0187d592e69f70a176044b52914d3..4d634cfb799f49cea11ef51dab12fbee15f192d5 100644 GIT binary patch delta 20 acmca8d{LPDGcPX}0}$NKoWGI#7$*Qik_K4- delta 20 acmca8d{LPDGcPX}0}z-!nYWSq7$*Qg>;^6X 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 97d6a0ef8bef4aedced97a5bb724dac73fcfbf82..a36e263449346d2a5368c29a6bd5fd7bf0b95412 100644 GIT binary patch delta 20 acmdmPy4{rfGcPX}0}$NKoWGHKjT8VwTLxeN delta 20 acmdmPy4{rfGcPX}0}z-!nYWR9jT8VuwFWf+ 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 964ca61571a91a84ea1abeb9274be72815985077..2193260b049aaeae9d42d8a436cb8a5696a7bc07 100644 GIT binary patch delta 20 acmcb@dxe+#GcPX}0}$NKoWGI#BpU!iF9uTp delta 20 acmcb@dxe+#GcPX}0}z-!nYWSqBpU!gi3TVD 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 6974e0bf4bf68e2e0e69c8d3f5fe7e76b6434848..5aa19260dc11bc3b250ca1c1af8b687daf1d2d88 100644 GIT binary patch delta 22 ccmZpA!r1hLk^3_*FBbz4+|Hc8k^6fg09juL_y7O^ delta 22 ccmZpA!r1hLk^3_*FBbz4m_3=dk^6fg09UyO%>V!Z 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 6791cba2ade8a6ea02e9298a8431756fb727fcfe..8d6318d37ea9c56faa41e7709032b734574327ad 100644 GIT binary patch delta 20 acmZ4PxZIKZGcPX}0}$NKoWGHKjsgHekp@lx delta 20 acmZ4PxZIKZGcPX}0}z-!nYWR9jsgHc>jonL 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 a296c8b7d47f42ca17c90b0b4be41d8df200bb20..eb0f8b4106542bee35f4a3e88d9182285bd33b8b 100644 GIT binary patch delta 20 acmcbYcrTIrGcPX}0}$NKoWGI#vH<{3xd%f4 delta 20 acmcbYcrTIrGcPX}0}z-!nYWSqvH<{269*Uo 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 0e09b4444ba494a72e3c1221b45d8eceb34229b3..8968f9f04a8a9f58a9e0c97bbf48b12f00b5ae6d 100644 GIT binary patch delta 20 acmdnswZV(~GcPX}0}$NKoWGG 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 1bc92c07bc626ec39f785944b5f9f85cce6083ab..0916ec78ad8068ac37f86ce23a6bcdb7998472ab 100644 GIT binary patch delta 20 acmeB_?v&>K%*)Hg00g%)=Wpb$;{^aXb_JCH delta 20 acmeB_?v&>K%*)Hg00d@F=56Gz;{^aV&;@D$ 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 5670c61074a292ec36a9fae864cc643a40b31cf2..68e68130b9cb3a2f7b6a7cb165866deb156b3453 100644 GIT binary patch delta 20 acmbOtIz^QGGcPX}0}$NKoWGH~lM4VjQw660 delta 20 acmbOtIz^QGGcPX}0}z-!nYWR(*^th 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 b2c83c349585299d3f4d0b0df73cc5a8aa60f953..fdade17464fd7f3d769b1661051d31ee531424c6 100644 GIT binary patch delta 22 ccmX@UobmW_M()qNyj%=Ga65DUM(#bq09uU)uK)l5 delta 22 ccmX@UobmW_M()qNyj%=GVE$y@M(#bq09ft^g#Z8m 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 5691591285e63a7270d94f1107c4c4eca977812f..f3181065f504cfdf6e2265bc0b246622d6ab9e47 100644 GIT binary patch delta 20 acmca*dCQXfGcPX}0}$NKoWGI#ybJ(IWd_p# delta 20 acmca*dCQXfGcPX}0}z-$nYWSqybJ(G#s;YX 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 008082f29cb3d7e4e4b70a2e1903d8f463fa73e5..a7a250c450b695e9f002c249848e021b1fc5d1a4 100644 GIT binary patch delta 20 acmdlWvq6UYGcPX}0}$NKoWGG#06LY delta 20 acmZ3*w~CMZGcPX}0}z-$nYWQ!o*e)=B?T@3 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 f6f8eacfba05ba392c3315d364327bd20b958732..6e14600a6939321ee95ea4ecc1ee7b2f5d0f8f70 100644 GIT binary patch delta 22 ccmX>-llk;aX710tyj%=Ga65DUM(zV=09o1y8~^|S delta 22 ccmX>-llk;aX710tyj%=GVE$y@M(zV=09ZQ*@&Et; 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 1d8a814ad45780e612b618e0285d648c63bc7877..676cc7dedb94dc6df122e5f6509cbfe3a8ba0116 100644 GIT binary patch delta 20 acmez5{K=X7GcPX}0}$NKoWGI#xgr2gk_R*Z delta 20 acmez5{K=X7GcPX}0}z-$nYWSqxgr2e^9Kq5 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 1030d5b0725356400d4dfae5c7f203d25e2cc024..8cfe8a502b587de0b19ae61825a16d21cb1cd2e3 100644 GIT binary patch delta 20 acmZpaYLw#s%*)Hg00g%)=Wpcx#sdI25e51H delta 20 acmZpaYLw#s%*)Hg00ibw=56Hu#sdI0as|); 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 082666b5ceaa968fd104ac3559191b90fdde5c04..199cb2d740ebca1e5f6e2e4e82dce82d6c100d52 100644 GIT binary patch delta 19 Zcmcc2c$ty=GcPX}0}$NKoIjEK1OPd|1`+@O delta 19 Zcmcc2c$ty=GcPX}0}z-$nKzO91OPZn1?T_( 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 22d20e71cbea5dced265313ce4a5f56cdfc735d0..c62ed31a4e3d665ce91952986bd50d12e015d0d0 100644 GIT binary patch delta 20 acmZ22xmuF@GcPX}0}$NKoWGHK0S^E@eFgRa delta 20 acmZ22xmuF@GcPX}0}z-$nYWR90S^E>-UZA6 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 dc841698fc6f32caf3f08ccdc2814aaba41fd686..d4e59f695a8dc22edfab7133725bb78f654e8e8b 100644 GIT binary patch delta 19 Zcmcc3c$<;?GcPX}0}$NFoIjEK0suPg1}gvn delta 19 Zcmcc3c$<;?GcPX}0}z-$nKzO90suL31^@s6 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 40316ceb3c83fe8e23be05ff06e9ac3ab085d128..99c6ac076a29b090431d5a8d31d86bcec86b5980 100644 GIT binary patch delta 22 ccmaF;jOq0=ChpI?yj%=Ga3^#AM(%{o0BODmd;kCd delta 22 ccmaF;jOq0=ChpI?yj%=GVE$y@M(%{o0B9HpQ2+n{ 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 36823cf37d81f52f1c5f3b7e7dbb16b5d040702a..1d3f8d5d27df1a4510627dd4f7651e54c9d156ae 100644 GIT binary patch delta 20 acmZ2gx~i1>GcPX}0}$NFoWGHKz7+sUdIs76 delta 20 acmZ2gx~i1>GcPX}0}z-$nYWR9z7+sS)CR8r 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 fec5fe336e1baf79d09403e22b61af4306a27f84..c23bb7da8e2bd7b33448f87330d44e367274a8b1 100644 GIT binary patch delta 20 acmX@ce2kg;>fj 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 1f7c717543a91c30509e14f1c38cdd0f22580842..68466170e26602c16899a0bade231aa135e12b60 100644 GIT binary patch delta 20 acmcbscvq48GcPX}0}$NKoWGI#k^lfkaR#6O delta 20 acmcbscvq48GcPX}0}z-!nYWSqk^lfi%La7- 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 e18d19152aeb4628f78bef41d6e26e1ada789a69..e6c302bfcb54d0b74d1f7f79b26a6e0e87590efc 100644 GIT binary patch delta 20 acmX@gdX$y>GcPX}0}$NKoWGHK7ZU(Jvj!3X delta 20 acmX@gdX$y>GcPX}0}z-$nYWR97ZU(I6b0x2 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 25c78801e67f9b0e3ab898945f04d661e1f812c6..fdf9cd31ec7deb781ec22a5aea1191f4319b017b 100644 GIT binary patch delta 20 acmexj^u>t#GcPX}0}$NKoWGGfQxX76b_S3D delta 20 acmexj^u>t#GcPX}0}z-$nYWQUQxX74*9K+) 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 df1326391165934266d9f253e9e829725438bbcb..990e8dcda335a4178ffa70a8eb2c902e9837a5f5 100644 GIT binary patch delta 20 acmbQPJzbmoGcPX}0}$NKoWGH~M-%`&?gi%n delta 20 acmbQPJzbmoGcPX}0}z-$nYWR{GcPX}0}$NKoWGH~O$z`)`vyJ$ delta 20 acmbOjIx&>{GcPX}0}z-$nYWRX 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 e946076c12ddbc682b4a2d35c64f220140417ecf..5cc1572641a040630b657dca0af7d38936184766 100644 GIT binary patch delta 22 ccmcaVk@5aSM()qNyj%=Ga65DUM(!&f09!BzzyJUM delta 22 ccmcaVk@5aSM()qNyj%=GVE$y@M(!&f09la-mH+?% 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 048b5406f938868c20806bfc2ba80285fd76f588..2ba82514c00d0326d5771de7ac4ffe21b2f24e48 100644 GIT binary patch delta 19 Zcmcb^c!!buGcPX}0}$NKoIjEKA^pv delta 20 acmew%_(PEUGcPX}0}z-!nYWSqEe8Nby9S;B 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 7c7e220f088389d8740a10a30d02faabf572ef5e..8866cf66b5aaef59b836214b138e7c2b201fa971 100644 GIT binary patch delta 20 acmdm6v$ux(GcPX}0}$NFoWGIV$PNHaat5UU delta 20 acmdm6v$ux(GcPX}0}z-!nYWSK$PNHY#Rho* 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 c8967c9d3279f369c7f8c0aaa8c50ab73c218951..aa65e5cbfd4533e0400df0d9ed67e4e9b3648647 100644 GIT binary patch delta 22 ccmbRIgn9B4X710tyj%=Ga3^#AMsAKz09yb%7 delta 22 ccmbRIgn9B4X710tyj%=GVD@C*MsAKz09juLg#Z8m 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 0790f6375a814af246d084531df89927841e4806..dffeae85abe43d0b7ebeb9704a5bdaaf5677b285 100644 GIT binary patch delta 20 acmeAZ?i1$z%*)Hg00eh3=Wpb0<^%vZAq9~D delta 20 acmeAZ?i1$z%*)Hg00d@F=56F|<^%vXbOmJq diff --git a/agent_framework_oci/libs/agent_framework/src/agent_framework/routing/enterprise_router.py b/agent_framework_oci/libs/agent_framework/src/agent_framework/routing/enterprise_router.py index ff6e5d5e..e622918f 100644 --- a/agent_framework_oci/libs/agent_framework/src/agent_framework/routing/enterprise_router.py +++ b/agent_framework_oci/libs/agent_framework/src/agent_framework/routing/enterprise_router.py @@ -880,13 +880,12 @@ class EnterpriseRouter: text: str, state_decision: RouteDecision, ) -> RouteDecision | None: - """Detecta abandono explícito da transação seguido (ou não) de nova intenção. + """Detecta semanticamente mudança de intenção durante uma transação. - Durante COLLECTING_PARAMETERS/AWAITING_CONFIRMATION, uma classificação - genérica de outra intent nunca basta para interromper a transação. A saída - só é permitida quando o turno expressa semanticamente abandono explícito - do objetivo atual (por exemplo, desistir/deixar para lá) ou handoff tratado - por sua regra própria. Não há blacklist/keyword hardcoded de abandono. + Não existe lista de palavras para desistência ou mudança de assunto. Uma + interrupção nasce de uma intent diferente resolvida por uma keyword + configurada no ``routing.yaml`` ou, na ausência dela, por uma decisão + semântica do LLM com o contexto da transação pendente. """ active_tx = state.get("active_transaction") if isinstance(state.get("active_transaction"), dict) else {} started_intent = str(active_tx.get("started_from_intent") or "").strip() @@ -911,10 +910,15 @@ class EnterpriseRouter: # both failure modes: parameter extraction cannot hide a real new goal, # and a broad keyword cannot steal a legitimate parameter turn. if not (self.enable_llm_router and self.llm is not None): - # Sem classificador semântico não há evidência suficiente para - # distinguir uma nova meta explícita de uma expressão pertencente - # à própria transação (ex.: "isso mesmo, pode cancelar"). - return None + configured_candidate.metadata = { + **(configured_candidate.metadata or {}), + "transaction_interruption": "intent_shift", + "interrupted_state": state_decision.next_state, + "interrupted_agent": state_decision.agent, + "interrupted_intent": started_intent or previous_intent, + "interruption_source": "configured_routing", + } + return configured_candidate if not (self.enable_llm_router and self.llm is not None): return None @@ -947,11 +951,11 @@ class EnterpriseRouter: ), } system = ( - "Você decide somente se o usuário ABANDONA EXPLICITAMENTE a transação ativa. " - "Uma nova intent semanticamente plausível NÃO basta. Use o significado completo da mensagem e o contexto transacional; nunca use uma palavra isolada como regra. " - "Retorne CONTINUE quando a fala puder ser confirmação, correção, parâmetro, referência ou instrução ligada à operação ativa, inclusive expressões como 'pode cancelar' quando cancelar pode ser a própria ação em andamento. " - "Retorne ABANDON somente quando houver evidência explícita de desistência/abandono da operação atual; se a mesma fala também trouxer um novo objetivo, informe a nova intent/agent permitidos. " - "Exemplo semântico: 'esquece isso, quero ver minha fatura' = ABANDON + nova intent. " + "Você decide apenas se o turno atual continua a transação ativa ou muda de intenção. " + "Use o significado da mensagem e o contexto transacional; não use palavras isoladas como regra. " + "A extração dos parâmetros pendentes já foi tentada antes desta etapa e não consumiu o turno. " + "Se ainda assim a mensagem for apenas uma resposta referencial/valor/nome ao dado pendente, retorne CONTINUE. " + "Se o usuário passou claramente a perseguir outro objetivo, retorne SHIFT e a nova intent permitida. " "Retorne somente JSON válido com decision, intent, agent, confidence, reason." ) user = { @@ -977,7 +981,7 @@ class EnterpriseRouter: logger.warning("Falha ao avaliar mudança semântica de intent transacional via LLM: %s", exc) return None - if str(data.get("decision") or "").strip().upper() != "ABANDON": + if str(data.get("decision") or "").strip().upper() != "SHIFT": return None confidence = float(data.get("confidence") or 0.0) if confidence < self.intent_shift_threshold: @@ -998,11 +1002,11 @@ class EnterpriseRouter: reason=str(data.get("reason") or "Mudança semântica de intenção durante transação."), method="llm", metadata={ - "transaction_interruption": "explicit_abandonment", + "transaction_interruption": "intent_shift", "interrupted_state": state_decision.next_state, "interrupted_agent": state_decision.agent, "interrupted_intent": started_intent or previous_intent, - "interruption_source": "semantic_abandonment_classifier", + "interruption_source": "semantic_classifier", "configured_routing_hint": ( configured_candidate.intent if configured_candidate is not None else None ), 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 0493330973acadaa205b556abf3b339521ac4a09..a35920c55239c319b7f9a26329efc678d601cd51 100644 GIT binary patch delta 20 acmcb^bcc!iGcPX}0}$NKoWGGfkP!et-UZMA delta 20 acmcb^bcc!iGcPX}0}z-$nYWQUkP!esKLw@$ 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 aa23cc687534949264eaca2e82e78d2d81131a2c..7be129632969730dc1a4c132323536093b0e7c4c 100644 GIT binary patch delta 13685 zcmcI~33OD&((rWOnMpE}WwK88ne0pgAqx<)KnP31ngGop7)S^tKp;%QO;`jaC{N^x zC=j7hK|sarfr5(HU4n>$2qFj?g@=0FQ4z%_>VvPUX0joE=l{?7|8S_OuCA)CuCA`$ z?xjP%8@Boe{Ospv(!t-ywOi-3UF3TLKC<$|UM){sLIYO_B~mv>uNs727}A;eM~fvq zrTKQ@jnp|@^%5(^9m0o7O!XG4#6N|}Q}Usb*;6u6$=6dd$LeBrVim&f|3Kc)!{a-} zPuwZ|vD6pMgFn?@tQG;2kfa7swWV9NWlEs9O9XbK1p#f12sxEn1*+|%M8 zk(RJlgdrU|7X~e?6V`5AR-mnKnG%u2T3T+4a75fIVm;iEVuP?Du10}VHntpyNMW+& ze1xrelSm|bthi4k5oQzji)6y=;sKFDSR7zI2#W{#&BB5B9Hu6SEh3fZiQ++#Mp%;A zDtZ!@EVhYWgr$Jgc9D)aNc9j8iQYtawA>kKoBXiIq#CZKibq5i)ucgRc8F}mI~?2- zv^*;M5HC}EiN{1=;!OwM$3?$xyuBePa#{vOg$6t!`jZ4#GdgHbid+vZvz^xbq{#Eo zvY?%RiF_(CHCyZy1&FJCpq*V}0OB1s^%YNvfmGWMutLIefN!OES`5O{9M-|xALzS9 zQ8)QqpzRTZBXz^OD9wWqct#BA#+Waj6+=mVfp|^~BWwT&KO>5}@eOP_7ZW;luP7mo zLg08_4DZG<2;@glZ4uOJVq~}4!9*L?jW$HQAV!nKP;l26aBE1*g&2eFMNx`W2*+U{ z^^z#-CRL1c^wkdsfMdJ zfb?N8qf@#Wa?2zb{c0qslcBPPup0rJNm#jfN6aE@3XJD$!lr^^y@(UF=}Nl`I)B9x zF$cL|7N-VxEV2nm8t0#9Srb6ZM2m&(w*AxlElQ<_lFc zil*x}cw8*-=%|MNy)PDGsbi>W#3He{YY2!F;wBIOOn>T$yEl5Vq-D7+Y1~P%)Kfi6 zd?0Q{T%8RLJ|%7;I#X-KX|asxbHs8=IS4qd zB1Y}9w*Cm0Kds>vTzyWyQ_gN=(`51#7I%Y&;%IWI`Y%Mu zX1AqSbf6tQ5Ilv&rxEN%um{022-c$&fauga5j%{ud*p*tSS5Q&UYWvTY%e3}K?J_Y zwgy297Hd)9UYR!)#)Ep*`D_&b$*4h9u)@}8 z?=&&a`cT)O$8MfSzIy>UylJ@Fyc%j;)wQl!>VJXQ=3TS6p=L%CnEi!h3t1h%WYp>x zvM2TYzg$KwWuLGB?YE`uPa_*3FWtr_Mq3q-GR>$09o1D$HH~U45Zrd!?()AsSwoFB5yo41x1W~efJ&TD%gWQ2mN^tI|y|L$ka@%_LocTsC zm`owSv|J|x`|@B-ZDBo)p?y1BM63|O!}8htSWiFH<4{z$P4fJGEDFr^z8|JfFmnAD zm1iI}Tn6l7p)632zn}GIR=N6qHkUo9{pWtBS6I6Ia|^r4*ow{HByU~CGPRu#vIn?z z5{l*{2*nOv26Yaj>Xa4RnIm!t(#K#6w;OddCop3neN5v?;aKi`$I#4NbN6F113w_9#>NXI@&?W6W$YQqz;)LrZz z{gjp3`a1-jS&9-2O?ApQyJXXAtS?(6pL~s_O(i9rW8#CNi%@4U##(3IB_+3D z1&ygiO-Cp7MnHMhg;hteNZwnF#hYZ->#W2`O>C0QuS51~mH&R7t%GoxzmF}@v&q_5 z2iPoy-7m}DW`o%ZZT;I!&&-=p`aT5r%k76CZ!~GjVfKfTL8@pp(ME`@zcv3Dn9>%q z@gxh8gO9Rm3r?Ljui3CP)~h$E&C2>m!sL;oYz$kkMIK|96j%%`CsnuB}FDA!R$WgScM33pO9S*8OlVPOD0c1p%re)OUHEpIY%Q#c^S)y-kTF(&$83?EYuy2K z%}Vsea>Od+f$yNDd@budi{VDk06BkPnTehL>w^xVkwBljUA_&m?efVV*zmXkfVV}| zH`J(AI5n&4DreNg=4x?MrCQTi)1)TK;2$AZ-l#SI$h-~tG#un9oH_2iNaJM3;*F?y z5&~TF9Sn9@onH;JV%P_5#b|<{OUGX88>*US!)~I)n~&ok_-OZg^H|Q#$QMl(>YVd?vr-BL@WVeQcg~C4len_q~eU#0jkarpTvbc{IPQ$aiCTF~6$FP#fykzH5>uPbej)SD`A&XrQU~w zXONb7p31yremsAMd22t!^V42I6QC9F5G}lKqW)yLwima`A5wV{Tcu^B@y{50TL$;y zg#*`t8sI&S!$kvULM$FzJcw!(H5PH&o_IXpxs4lwdZ)Adw4ZzNw+u$wH`(OAY;I#E z@?17AV;M4|508re4voci0`d}xlWkV?MzWmMhbJ48v6T|p(uY^EN3=_QxZN1<)`v_q zkrDu#;P7&l%SMuCJQy30JGMTc7a9ywvVB>Roxk+2sVH;Sj(J8iXt>23at z>eab3>*^O(LIP>3QG3bFqqvQyD{^}r50fWG@j3i6lU6vI|I-{s$*v!W6?fSujFM+> z;E~26bi^Qe}Avf1?D@$ydKQz4M+*pHGtWM_&cLvGrlVE{AU&qZXT>e(a zV_1;f^D2;1=kYjsR}_zsYiEF9vRsCQ|JLwCd8UTjWr_=`&OOUa(moUN0V$S)T-+Ss zNH;i{NX3CI3vx1Q!B3qaTk>C8I2&e?M7nov1&HqV6|xNSBsm%mxL zFOSj5ve}Rq?6ur0J4W=*HQ03`Lu5Mr0Y*AwoEDLl?$w(m>YV=0Ad#KUU4D~}3u?@% z8{fBO&$QscSg45HFoNsXQVgpuJ-*TY0YA7tjG)d6S#5bNRb0 zt`v7*$=$c}g!lpNvCuw7)u=qBy;OChP8QWexK2~KS?K|j6y|)W!%qyPnC+1PGjA9Z zeop@k2ET>r#&&&nU3;_!V6+Z&M=Q{Vpjk;s%g$B0#Qs1qb5ObwjTaeETa==cM;Alx zSku5`4GxejX<-Y3{g~6y?s&USzP6M{_&D4>%GJwrP_#PQZRqF)gtQnew=LwAh9PAU zP6vio+|cW?4J%`!*p=!`Egvmkna>^ORHs9fpruZSyfB|fMWu>Nk&yutPYh2twCm{X zt_3}w>glcny3^7+BD`f^lgW?zknbA2L(>$}$029KQhW1+f zx3?t*=1p>^E@xVqrRCNPD;ps{4dGG2y_~(;`&^<_^?|&fE4P<1Tg$fPK5}Lwe@q56 zf=8d4!_72*rGF)lQPRr?$lVp(CjFYYPtW#NT)myW+m%&$gB9swbbHElrk7cuGvlZ; z$42=CxiXv?Vhouz2z*`Y>_xNpy-Tp%_%7g?N=6q-w7^_fmaeBj%@AWzu7p(;KqFn` zHZ94to^%9`VZ1=+rgX$I@EKrc4214RU@O$|3Dh303cxGpRdHXB!@%*8 zn5KQ?w8gMuU+YC&j(xk#$@Zx9@tz@|12{?l?-iOn6FRfYAlhM|2MVWWsExt8iJ6VO zx2}=HvJ4BjD^mtWz@{Nn9>ccr>4X&E>?AIOmQNun;X|%79yV zEXjF`YU&UrOLNBza3@c5O}n(aEN{7m`}lTQ*-1)n0ji~)Q_M~`bab2%0~;!Rm%&zY zDtgtcwzECb=Pl-Rx++92TL$@{5?2qobs0AW_H*{@7#tWbr=exgl?Yk0gh&2mjB{X& zt8k3X{hT>suBgjZTsaha3J_#oGoPpQcZK3I9%0UD4+2-Nyt0g2y_mC~vp=xmezFII zaNflHMkT`?#F3u8Wu7bFnb)}|b@rDT%Xw&8o-@CakAXnM9bu#5%6H|7m|Xo|_Gbm4 z9#>Z1f_87gAmawo4sGW^TxU4@i+R`C*tvU=08AZLTTtXW8%OBA4ZD)lzUAmxy!+we z4UGhCtcK+PG|8W=JeW_Qt!j7-2{|oJ&u-PJZ+Cl@4Gv0cm+-I<;exU22ORZ~2XRN> znE;`RXUfFl7Pnv5EpC^N8WLsPN*q~pJ0AJ%?L5g!+Zxf3uJ5AVlU@VezU#V?f%Z&pDsE-m8>QtH+!O}B zoKK0U(^YVcB3A_o6>9yQ;PdM`D#7h0+zmB$+g@Py&w#;e-xpEjcF!6LPW%s-^0@zZ zTcB&!vGyHcgl7{3Z@GW#s%zJ>=4;k6Z(T`H={A6Yr56c?G;)|E+!Z=g2W3m?bb$V) zj}dfqtMe^=4XEbQTLGF%UjgV{3X&w9Nz#VWW}q5Mrw|+pP+wZQm412yR7$_^R7e=j zO%hc~72x2dZ3G2DJ3v-iNzjp_%w&!Q+H3#hH?Yt*VO!nhWKWm>yJhNXIG7a4NvnCD z5wCRAe7R{gk9N>)z)>X7T_wIu(Jj9kf*2kD>CSzJJhPh5lVx{vZ#n)hK7k)M%g68H zcBaWgck!}7_wz4gJ@p9$Cv`G$4NpsY910Et-6^$sHL10;X2BKNNH~S4SVO#Ri7gD4 zq@!#2)|ByZ4|2&24@=?D`Zv1ey7%HIy`ML6cgQ2z+nOHB-Ifc5%c>^ty_*-XQ}X!T zd_v+xkZB82Yv#~%Uu8p;S~af*EaAEc#I*BgKNbNLWP%Gu)wLHs8YOtMd zY~@<(T5y_tVm0`9|3W9ggyL74BAF(@8!CQ#Y4e|}hvKndo5M&@|K8VDt2v(v(ALOR{ z){bjC)q=F&5xj&fU0%qrNLPgO5qlNEa^$0@&9AVCr+9TIwv>RD??LQKr2PY%dNx}1@gDbMfdVjHcKA7m(LHzD^a*l6pINKUbF&4?aU1yx8)P_8`6;y776_O1Dm<*=<*KW;skW-FaR7diki1dC z4z;J`qr7g$2%KWomPx)-nRLNd7oTxDF8g>~_U_UXaYIhWjo7EYA2(u?;luE_t$z3U zJu>6*q=)D1PCON!^OK^BAIZ*z#GDREJRXwx$b`q!Pp1|fPc3+1(uvgK)2XB1jz5t! z=443exukTt^#MNG@{`#(jD@Wo_Fm+m_d|*~dor4A^bO$wlK6*})#HXq>nHpkr_b77s;0(X2ld zImC{|BY9Bt*B{9r?1#l;-l0X~0`64mS5XBCru9B^<@yCtpk-kpWzs`pkH)0}5l0~n>$>rGVJRnYD zm`Zo}qy-yL zNhzAs7>JoCL_V~Sm#~G}xBK|VhN#uZLQfrcA+`oUvHLraJLS29{5JlXpH}@A&(O2G z<%W0o3EShyMk~g4#OOhRlu+`$OWtvWXR}@Mc{jpp2@jZ!Dt%l* z2JS-XIXZdaDqN_iyvv913w~PNyL=<_ivy3g8ERb(3z}5B7I2LB@M0Tf|5Lmq8{Qm& zh_8?80qiTix^6^%rLktdDiQO7Z-^Qo=c=z@6R*l=PVt`XE&1R#PcFwMou@o+bk%)h1lEj{g2>D$*RS-@e!O=%DPWL+^Lz)@Rt%ynitQ?4u1i${40>xLrAE_A!8j3BgCQa6Jz-m;u+zWlYKO_5~EC#31=9QwB4`My|vp zpTxGlKyU`ZB8>X3Z?)g!>U&lW;mUIUwZHZzR~k7!a^@KnZ^cNDPkC~;Vu35B1DW~I_hOe=|9?lUXBS+u-hR&1cn;;Y;Nk3*>eicM<1N*L4}^;Jsr*nn&e zP^>b;PuT>Fhy0WWpt8naspioJS>Uh4x|!mF6>IWh)J@}0reJ&UH3IF|h)Q4mMPoC0 za({plW}#iI9c|x+&WV;^2Ph76S3DSAnXdSAj%Ih_xSINOqve}|!gwvZi`G-uw z=3!%KRpbSKB?O-JKCvi?aaa!q+EFi@WOeSxTf#iPj0;q3!Ng|j#wO4CD$%mgUopgO zh8YJ+I!&U_17fgKq$FBy2!sKNmaTzGy88p2D0wMRDN3XdS;$8EnuT0+49)1Yd$YVT zNXaQiZSdV)r=fo@fY#`{aJoB!RBw647seNiHf;=6N?s-XeCA1rTd zQhVBqTsKWs;R}F_5GB5u#@pl$912=$hQ@`a2`M3Gbb5+pJkRf)RK&VDjvjhxa5^rOx(vi-6;6oxEp!Oqn7{PG_bgrZG**PrIq3S$h zKO^`Z0e(i{K8Dd5i@r$6LfQZXbYi3p)JiPwK!AIPKI$`wzJY+2z0QT>BGMLO-*NR& z4LD$d2qL5-LP=&rw6PJ&e1#3yLSmFueZf30gY{fM%mo7?7rb>A`vo6D;rx(!!Az*H zE-dnbAEEv_Q|zSxM1QFW(3Zq0?=iMmj!ICn*jBkLLD^`m!*0!&k%>xAc(g7_RJI0G O<}uSn9YPgfr~U^p7s88FJruLO2o*GXa_hfe2wpCXkR!;+q5s3PE7kpeV4T zH0z1iipMIjyAJB^N>n^{SxF3%7$e|!_q*)m;fgkutY#{v z&LHeon=UlDub;UiwvEbeY!ADQd59X3-P!GIFVi|}9-`*ytZ7Bf%USb`Rzxet;0TuJ>d6nBNSXKj8K={~5Rdz#U)# zGjM_IXEvX()OZ^UMm!8I7<#yih0LG|0o>iT>%$VsLEFwSLl|e#PU>)Wh{Yf*M}Sd& zZhJK>ncQRhBrK-yUX~#6(d<5!D4-a2KT8sjo;|>l1r!TVih$yP|3PLzxQ)p1>@b@p z@Coc8mMWk`_ApBmP!fBDr3)w-xE^I02m@CNdyHiYyuo%`cue0fShi@P@+|f^%MmT9 zFqR`M7vV_*r-76wSe~FIayomG9`8H3|#IxRy`dl zmoq!7L5y6%POt?6ss!fe*uoifvu%TsL5(guTYD7tm5*f1RzF!M+TJ7~BV1zrofDA_nA*0$R@AWa|VZ0plN-X$Ip8 z!2OY}pMhHm^SOteW=)8l<`DHT_GXBbe`03QLgiJ!{T6F+a`!m`*=m^j4TzE(pmC#s zt_P@9Kx^0;)+V5}FqxYK)ChuAES9xrC|wqqda^;*fmASY>(~&p2o4j_N3zZgIz<<) z!12G$x}3!8*)Y375I3>2Ocqdcwt`tV5!uYTSr6OHZv4>>-(g#vGFo7K=U6Y+CTD5` z+sba5?g4Cs-7M$>sJu~(#4#Eb+m@lhd9fXh(!hVWrK4=SQ*bMLm-Qhmw}Gk0*badw z@+S5kyG7vJ**M!Npbn6^3(WpL+byW5Y+*lv@sBChP}UJi z&3&RsDDv@;6C{eb@gb1I2hY#|J~)f22;~DcG>AVNMZCxcer6jG*Hvh_ZzAz<5Gbbz z)cX|*Ni|iEctoM_ROl6;pSwg;M9-j4JW#pYj_nFmF%5I$et!q~vrC9abUIMv69<`I zAt`^1!`;bYn|=NV45}Yv@NhAFU*Vyf*@LsC&)wB&g2JFRd4P>-}8_jx{(5_C|)IP~=mi4Vxy-D9TBARrnh$Ln|fp!raZm7N4DrUo7#KK zKx1h}u(jFLZEn_f%O;D})FiqFhv_!!O|n^U?dj?QXKB`3&0QuLu_oz?~uWN2j_IHPO>hmd~;ercfcoe1xT0^mCk-Ur3jB9|XD<~D+i&8?k1*2c+I z-H79C?35dwLp3*o2HoZ@-6dN2zoCPziNKyO{HQT+iXV;K*wYOIG+CO=VCk)f$!_u+ zJ7FYpBfpqMg8NFe1`pYasy>V=aVW;rR`7{#xfRqN)3jRw>XHv(>l&o{8x+732ahqg zPFYN`+>9+IM5%>z`F^Co53vuTNO!AQxSrMO0XV(uPqyh^R+Bick0n9AlNxSrHQzXv zXRE3T;2GzM7f+8R?tL>_#~}n+4WQo+#TUVffP@kM`9uEmPi`3YH}<=o_YEEm2pWxv z?e`cBkL*{CMnv_iM*|~90+WUUlgLw*ILxsBZBa&1YKQY#ppO4I9@F>DGUtq~1PXY7|~NC&^%6~2 zlZ(OfPmr;o_RgkF=H^Cc$Y^Y7HMcign_!m29~f1kf&WT{f_$C>SlBZF$7jPnU|aI6 zr&8HKY@IiSBWzMhw4AsiXEVHc=@kvY==gK(paF^%YAelFSSf5TKDfO!;0_}GB(*Dk zw$fTyF&OeK8jBjjz8i*q+p(R&wspVP@|ZTF;}_RZRmy@Q5aBURgojInMP0u_>{y~>>=T{tUX#Dx0FWC0yWbViXIqy z*FFEaA5Pq9D1Ro3c=v%7>K~ER$uO+i497s~3nlkFWdaOb5C1Ld7KK4&>IP$0LD22} zVQ6=546gm4qX%LO?g-{BupXOQyJtpu$GpKdu>!+A#9)XDG6eX^2#Mj!u`M`)?qodB zZ!|%`+Ss~bqZuL`1RaQ~5Jt^<2%Zp=P2D0sJHq7;wS@59Vd_PZ7!f=4CfsS7`XCls z)AZ|MA45e=7E5QhwyE80lJyXgJ7M#<5n`o-1teGLA+&>}sUZ5p7z(l1+=YE<9YI(& zw?PnrtPLDUrXJM`k zZgMR=>QyLr>+h{_sXq>iBH_q&i5A=|rzW<4ef?Vsj zAQnPnq{25~e=)B-Oox5q`<3H9{`)IN0+J6e8}>=*SB@GgMhrEt#=nv{Xs8+XTllu2 z=CJCn`2EcX4MT>Se$AlY!qJ4Jejia>3<~8d53D@Yw{|!vZ6qk?D1AF9r+@xu z9uIjaEW;*1CM(tPKz7PaP%^?#$3SGcq z~`!NqcL`a= zf0{)Wd7c1_Jb=Z^{Jkua&Ud^|0(oRMDRYw_L-do}luZ&eXAnNYZ_g%+$Vq-KnB}K&Xp+W$K8O54sjV6cuNs_FKODZwe!PI>y3Kk4 zNR9IEP=cd#ghb}>B0`%{s*wLG_pKla`P0)Y6L4vTUuE+fy=Sd3s*4B|9@tAg~C7W>Ld66xbPrN?ji_FA%z{E=U%C9BDk zyu?UiSH6XOsJc;p89|}DLu0HOPz&53N zI*P@+Sd3xu9v1IFG3MUX*|EOWVs4gS;@{MfTQz9pv209IY_soi=Q<+^CimE%UqUW= z&?q;4?`rZT^>(w{8puBg`I_%qL-x~HH+#@pQcr1?o4s=#F%f?i?3Pa`H<5PxS3TruC8^?%_L3x0%>UR+GD!vhwwK&R_SpAtC0ciAymu!_ z(o~_e5We&$B*cDxC(#qng(&ViES7VR-K4}D)s+2VOFiA~x9=x| zG{k}&OR)&Tsk;JF3>tY8muXa6M=C5BPE&p$9bQ}iXd?|Y#ND297jajS z13dc>Sxz3~KRrY;;{>4v`PM=)rfhBAGN$S5!j~(#8wKa{{pmEAe|m_lq-pN<>Yo!& zwMM97;VT~?rO85qSd60k36#|-IMLSB=vb)T{P_n+ELqIodw^twZ^3r42a26fSY<8Z zZV*<{BqMC$6%UeqwA|f(=0S3TLi~L85faazdYEh@w{XKFB#Z3gs~>@}tg%DOJ4&4q z*@PvQAXLZidYmjKyZOb(Np|FYxQsOI<_)H%UaJap!&d{j0PQ)%(~po@#Kh~5kSk=b zec2P_il$sh+bcv)$`#}M1c&%B7E>Wh#2c~1MfiD@_a7zsIf!;=54&)b4l3Fru&ln*8 zRFda-!YPtSe#IA^BH>~OlV9L%r$CkG`JJc8Biue3PW<#L5=d6NY<{|KUy8l+W>x-X!y>-ou{# z2l9@}QwVUnir*O$T7COu4{rcul;6bq*Pu$Zd=@9|J1oA%LPP+u43;5{7f$4t&;Y@u zAN?&PO?FHVwhAW~lZSd4RMVoc*eUk&<7dbQTH#@j7$k40s)dDxs|hdpDU24FuCcpl zLIq(;#BfDAIo&Zb-w|W3dxvz8_4ePrL$(s~CNCO+V0wl(j*z9`BF9EZvN{x9aLiM@ z%fsPEM_0FN(N2t${bY#W@;;opJ;on=UkH5ZeG*E#`RMx~_b2x1^CXID9MiyCFOuwp zDcdZ<(F-f1JsswJ4k0`L{YA2XFz)sNh%DjBA3*eb)NcELxT_O{MaA%O88||oFtr}5 zUC3|YFZ~s^!ES!;uVjAEJ!t)>5RXR&4s(z4tPe?ijEE$H&w}lnp@2LZ2H1v_r@8zg zxs4pRU;U6&Dq$^@e@teRgh`(g>u}oCqboS(f1E$`2?_D^M4|VhsQdUUpO9X1)?WT8 znWZF4_{Iq`OY;!6ck)9MGtEOosPJtCG;jEZETu78`!nB=XbNKg^c|6Dn$})*mF!kh z57phT(^xX^?!VI(TB+qr2|Y=6+5IVf%x6{*L{b@-qwE9FR`;76=VRNpdf#N)0B3ED z?WXnS_HDASihrP^)ig-O4SqBYp7xb~w3d(;`D6ZcUI=DFTWP6YWJ6<`wob@^Wck3s z0D66JAolSD_VGEIQ-@Wm;t)Lx-EbT-2t67=v%Cc10}f^QCjm56AA+=@SiA}b9`nG1 zx<)vrG&zoqB6va|okgN}T_8P9mf2|#9dYw-1DRkVv9F#&X=VK5NLo+cw$F>A|3%1o zo*Y9fEADoz*^$t{N#(# zVTT}DG3IME!;yQZMI6M*o$c}({zW3KD-!9$)MCdBbxhN0frGeinV<;VAs`NkR8I^d z9kFHnrX+YjC_|mrV7d{?UrM42$!B(tWUAN1U86!V@GOUS)~O&`%@?QBnAjD1~IgQ=M;lCM|LK4Hi-J=fb;M$7ty8=*Xd zpTlZXFUTSTpNCqDfiFPlA1LH|ET+_}Lg`;)BoO)eAFwL+%52~;L{5vjA0eaY@l%B0 z?2s=ir{R!8MKoC>GLB}Rw3x+@wkqDNa=W*{j!n%OXUXd`wbzm|Grfm zdGKx67SB9NB5k!#2XdVs@#Pzr(`@wzNWw47BQZR)jmFzAE~l-8u2FEmRWzUPSOLo& z+7Hw?PONNSnF8?>%nCSV3tbUrRXWevq8tZUmQYKW6xQH6qEnQD{hMJnY9Zxrz{n&1 zq)^up8l1w#I8Wiik(c}af(D05{!)k(&Jv21Jur5Qza_#FDfzHO-qi@NxL!Uq>|i}j z<+Y78f!EbjJx{HtVYV)VmTT)FMj32NE8>g|v6J0}ySkf(i}(>-qzlJpWq3%0rK11U z`AcM3x^1XDz$cZFsRKR9w)D;*J_bEUrMdVdB}*?>S)v+n)rmir!F8)>jXGM2T9$0P zcw0E0_EkEK6=Ts$`f0`j4wKVZQj8SM53iyzb7Ne>uOW1ULq|PWDh8FTg+od_VVs5m z|H9KvNwF-~_E1Iu4_Zx&NG3O~rVZY)Qmku=Oi}!3D;z4mwVJx6#rXNhmXgH-V+#Ww`oOsB(a zNBdL(@pU9i0j*Q66K@;P2JwB()PrAlJ&oWO%rwHsl5i~ryeJMBV2ixEglb7S7(PN@ zQnEmym^wZ-C5hu>m5f&>AZg}jfzQeP2P0Rsnt8DCYc{dg*1G0t;=coGZOVy zmP!f#qo=#GvJ4Hn=)rX~$}8FBmKK9#JFqV(Nis-NxLHzyGz(XvsT$_SM@q(71m3AR zOm@woG;8`Cg5Lx#Kn4)^<1?8mr8c1>CR_X^gGI-PC9X~>r3!b6TMu(C#R*uktO^|> zG?0}StHh%AvFI#m4wvG36OE6paGA>GnawCT%~dn4<~O&|aNFTA4`sSUgyj+?Z&oRs zH9boq>E;vWE%{^-c+SqyxWwssW&@3I148st{?G;*k|NwTuUI+F)hof#t1>jGEz1U{ zo`a6eKkK0(ymUQ{CK-Hx2MtqZuIBU zUR{`!fnG!A3%qA_9bq+=OewR$$lIEz!823JU<*(WDT6=IL?ePTSq{t2g0;jJW=wvo z5JQOc%yg_XDI=5E{_#q@It#j83f)GMY2$xkYbl{ zSY=7QBj`w3bvi!uGzsA^nrT=lthyX2$7TE)r6~^rIEb_z$c*9_55wvUG*fu5o?K;f zl(`L+{NyqklY5;@y6b7llk!}mOztqNxvUn|!(b=n*6Ab#Uw0!7ikSSkZONDNnNg@V z8*Tv9NjYNe{VN~(eW8VBE3>CzA{mCNB^fH=Y58m^^3@Pi83>=^^Rf6$TgwhSuH|5h z|I~Z~MA)+bgPD(T&OBofSN+85^T%$4CyZ^T2JcBvs7rEscYp-WkfmVDGn6hvUgHSr zWfFQ_OvYrpLQ;eOR>CO4P`ntAgrPc;>z7ea;uv@1b2N+(w$UJG9qf?c=~y4=%IH&( zw2AS<8-Olm8TI-Pd>)Qv1kN%!MX@j)m28D`LNt&m6j*7d<9l2x#K!{AXaNbLQi07> z8=1mZy3}X&B{w?r1q0ZoU3j-82bU~yL zFLve~T{Ob)+MT(GA8n_>Nm7ASI{`j zO+DNkanYKh4q9lajx|UGgqE=DGbmfb*79@h)WFpi8j!#mv5Bo?CTLpE))uR--4FGS zIHLrm_>vA9@uRT@8d;u*HO^W0oj&VR@#nJ+8ba2<3^Ie3FpvD(>QV-|^=RIhHtF2*bLlrHV8(l4~ zCu_}6|2soWhRYW^X%uP18E|WxQo(Ps8@9<|O&;0>o2QAFbkV55QmNE6FPL=VS`b;9 z3M7<@;1+bPLzIEPH{l}kDwWDuJL@P`TFM;$sgeN2|JFr2ROOZ+v9J0_I;qU%IF<_j z>;e+v0kWlXsmzhyZFJ?uSq^^>pOzPgPNjuXxyu@p88RdqQm7QxNNd4~F>|vjEn${W z7WG4iu~dR$m^$dCN|zjP%2F0RmEhtHq(i)W2*->R%>O|5DcZKPE)~x2eD1%+%kRQ|rM&AOK}c z<*e&R(p;w>MWP=~I*kr%Gt=m(AVfK{=*dK;l#j|ZF=UE!deXiellJg%lm#y7OxveL zr5KD#Y3v4cd}x+o$HDXnBGV7O2|ULc?BX%+FP)zEPxCHZOpw>3pQJeZ{qdX-vitP` z;8e~y6%h9WAyp{Esr+O@SSk`iVH}YVhWwj^knioLiT)z(W7cUw8PmKFZ!zGqX~|xw z7EJ&ahb)V4YlHX1!(;A&Fl*gn+n5UE(P*++tOuIBrP3_&zcE;%!(5m{TZmyx&tiBDn!m-|1b1D;mBF5NyR?PQBSG)M%gVGf8}Sk6 zb^c5*O(!e)crPu{;BlV3lt*r*kp^+j^A|*jV`}`M=r|<~L`WRsh>s<|FW$qI&Wcuf2)Zc{#rAgBQq8Q~t}FXlmO@tl(t<$6XN*aiTcp1~=mHwu!t5 zl$U4HIPQc5&ba&Gyl^rW=EAz}b-?8i$7PVQ1RH@*g8nzt2Q{s5Fjnow?Kca>MsKEN zo0yloqe(l|QgcWi@=b_suW8x1An{Ecn2%~O0d5vSoxc=>iX8@-Vq+zzLR zy?8peh5vRth3g6YAKM|(?6#}>paXtOEm=c0@&g~!z#_^;bw9uhU2=CcJbKx7n6FX>3 z2x?@=aa=|ahoh%)j)wS!9W=CW9jdh*5iMBM;#9qdCjB0Z576xQBCZIb+Yovmp_2$@ zVeuSR#b=zA$RY0VyoS)fu(%I};*DI#apdG7tgJ(vPPrV)L8O`Xp%bg(eE3#`hOyXz z)Z#wSRjh_!^=a(A7}Y<9(07R24SgDB^FQ1IXMo=#C4BI^g&N5=K4&MrAyPhyL=r0Y z0rKG8A^F!>{D$(^cG6u+xDmu_cF{EvjUad|0Is=iHH%~BmR7k#T!e)W-Y@NWDlKFH6E9Ac>73l@lbN{iIm~wxg*I7Ps+n_i^j7H2a9TlvyJ0f1xL3JXH}2q zm!2>V=P$k#pq)>G_s<^;pZ#`V)kLVB?V*uAkv@uun33?3q41Iu1t&{~!|VEeN8^%4 z;@D6e<9BdcNtW|JaT?QiF)U>?Fm601aVT-+VBvz1LgO2AMhcb>6)ZnnuwpoI<#5c( zOKz%sZNGZZCu_((d%{Z*n>eDMJ*1y~GWd;%VZAiy9(BP}KN_Dr62EXLe&MJtXf)g~ zs!ti!r%re%5*ER@)d@adDb&$E{YEfyLdsxD@kmPLiDkp_v-?KktB2yN&&DqRD<}Gl z#V`1I-l6P6rZ=k2O6!NNTW{0crQBb2P%{+20IcX82S!fx0V9`Ij+Cq$Dp@zGi#W7) zaBe*`mYUGQr9MMmh5d^UMIVU<14pNiMpTc(WvYykxV)jbyrT`naaAL6IKfd1#-rm7 z_f?F<=MTl_A8j9wp9=#3V@EF<*C!laJCay9lvsGeXE?EDB(e65oMF9jJUsf)_K}$E zp_uHWDZ??PBQaGchY9}Bin~lD#p`uj~a*5=fdQa`}EHr^e=kb zt9T+*;qAX~;hu$q!DT0!&w9-T{i5s>oW7<^Tie4 z)5}_g{}OV=iXmWUbyC%;H1b*ssj4Tc*9>#Au=-{gR8^`s!{_R;db$LvZmQFzbG)&7 z#yzO2UaLA26(VYR(CDk`JCkp~>R_~ARlUDvFxM9!L$o>`u_K8<6sj6Ynxnw#yGc-u zP`#TxUxU^2=^!v#b%6?j7qIhq)rIhRmDuBqGi5M zP}M4pYG8hRzNlA+23M`})D2YUz!30R>>=ivb`2kPPCk7$o};$ad+9gMpw ztq&N}oQO;(0geU*g8PVPx#PJ?;e5hPD8#SQcsZVd&U%QW!&NZ1qCMXEbauE(bV!=O zeJB4^eDDE!bM*VLdB9Hu?#J!r6vET*hxPHc2Vqlr&;I;_^aFR_3%JqXNBQdIz;eO< z#1Yy+{C|b4;x^p|kZ&OJ!#wy&dPMUy;-BKLK1t_ljsiTE$S*!gL$a(r9UUgQx3R4E$>U;Y$LCJ*zQpQ8EcM^KPkhsgq;(PUY4aT3^M z@fA-uz4n?)&qSvE5|2W-Am-*PAKTfk$ z>RghsC; zBVIEQ*KYYOC+J+d&d2`R33`xt7lJv*)UB4To^H9o-uePfaU=KepAFEOT=^Kv!J7*5 zt2jLTaxFiN^h&Gw2Kko=xxppDF1Ug%zk{8e<6bY*G}Q%w`9Ey%%cxDKsLns54DJV; z+N~8CPU4^2yI-dF6RJ`1fLH0OFeG|uxc*jFO5p5i;-r8P1CLWDvM1;K)1aX+>T13$RGrkx?`QTA0A=nj=%0P_AC4fq=@0@eJZKhyiE zQpxxHh5n4@`P!rYo3^US3j3`eQ4a#wDf7R(AB@+qAIR|r;rN~4lKLDjEf@lPyn#6{sb?bEXoXZ1^d|EF{Zt@pLZd`7Jl z??T))LEV)J;+ymmU>tMr+$4UGV;%EqF}1cs`i?)(vBH%+$CbW!KBqP07JJkeptR;G z?CM#b_D|YRa`|umNt=W6Q0d3fX1NH#cL9ZboM(JVQ^|3@`b%0Fl0S(@--f#hA0bUX zKl&wY^b|}#73@6xE1F62_@b}iqjxTE`-x{((>yglc!fr*P%j?!J$zbO`wjJt#eU%WlDIt~oJU*}7Rn2io#G$) zhDNM$cU+!>kH&CC4OfUD!{l}=+?42UfL{--(ci2$cEZIGWZs(E-2=bPYJe;HqA^Wh zW$9g$rf-Me$qC|V;2M7E8yXTJUdxJba3>}^aOk1nH+)UQbmEO?8UYXemKJ0p*OpO*fU?S4tXO!R5K)8-D`Yla}#dfff z9%YKbiwhV664H)9~1-YML@mP2ajodt8$) zrdkX`yf04;s0dX_;QilI-#%eZ2eV@w;(h1GjEp!Kr??N~hFU6cRR~8G{D^~g{27ES z+TDMo-Cf*ba!egc3f}5h3qON^pT?laI6MfiGNt{C#`TG5)jFJ4^dtHf;}8p37)+1- zO&P}N3StVUum~C4rB#BWt`$Va;9Nr+jt{6#;7~u*KdLJRNWeKKyoZ_HJ zobwsIz{d`!g&w{;1->+u3c4g=N$oUCi4CFwWxj(p6VSQ4f38gR{1WRopqS6@KBJ78 z~h9X zt}&SCM2sDkF?89gLc+O*D*xOkZt*{ft6RL%i`RVd{*Slp9oL7%JGKfn5V!ku2#L$v z*$7o&;kdz#kT_4+gwPFGh>OkQpkX&w`>_z0GsO|XuatdIe-V+GZaJ=oiF1lUtcpW` zQG_mH@gWxCfI=KHe2G&AliK7pZ;T?u*h5QmC zMRxN?gvPNDJMh%jrNznGjP}6&OOC>-0gG%Np;9K1yX|vS${UodOri1roW`r;KUV@Y zfzSjTQ~{_}DECPtA#177 z32&-N^Mr^R)cm`YLDYsP>mh^^RRMWOu10zq8`NgCWhd&jKDG|yy1iL#o_CJ|RUj6+Qt-@H`?a`v-@c6vZtj}e$<{+ z+U4PJyZlf4pv(1dSl2(Os2(G#MKhCxY$d=oM99=`LW~V?`f^LR&xmO;c`n+u+ykn; zMu*m+_KY7VghBSyK9DI!{Gdj-=WFocST{md zHp$VBxY7%$+9>bDx&|=rfeFxZ;&yOooo}ZD*yz%dV~`enD98a`QtOhR#<%)6 zkV(&+DW?;g>zsCz=Mt%SIEB(T=W$q^r=BnXY((VcL~2X-@gXfT=5u$jdiWY4syFSk zJSk{TBeEy5vG!Mfk(h2sL11lA5h@RMZdQiZzS;SEPo2F2-6&5^Oe;s^pC`6FF+q*; zJ0|64i-PHlW>^+UzF^WUr%R^DGpbu=4#e_DPhW1zn1-cixnM@tlzVsmL582{l{=o< zva)Df8Agj>$7VTNeiv9UB3N#i@;o&~7HF1d1h+EWDDrV?TU;#Uxn;3sj`|F|!3NDU z-J*tBViTZWFkt~cOI%p2sGA1MEx;1p(9`8rT0*NP_*ywzG#?x_X@LnwYXW8z^<^_1 z*p{Y8;hbsV3EQ&Et3n6hPRtPDq^g(U}E$TFC1f8*mlh8uq6tD z7nz`uPm(7c^xM)~5y8a+rfJ!3-_OkpsoOh#68BV*1rUNa@N(@5BLngGD z)7@Ba==ky_EGKjbhh7kQthW4Ya%u%q&5A-_gy?Y>`o{qc;`NHT@U8M1bcetMvizdc zMVRb-I(c+!-gW2%BxUCa8)R;S=7$2u!rTcOeZWrf-^_K zhhxhc#`EqhA_mNzX`HqVOowGVoy!DBAC9rX&)85@6Xp~HhAynttiS~{dIpxYg6@CN zWr927nx^}h31X3doElRmWZiUX z1x6m4q5v4mtI%keMi89lda=B^B?klWRGPkIm@gX(Of1`&0}HQ-C6>!Avdl|}i(5q) zM@Tfp0)q$xTH^Gve0{~>m_aA~f@Ssd&@*z+WJj=8TDZT`ft_;O^jdUlnyMV?Q7d09 z8S=l=`-ffBa5>>!X*mgn`N*8&(4UacybdF$8*nM;VnS*&V_U%=G!;-GI9v_y0K(DH zG<^<)`9*!%b~>60cHVUIF)VK#y5IwyugMFC-)!AKq*R)?VcCK&Fe{_$^3ajtO+y|5 zU;Ly}pXE!;&K1vx1COO_oSxqnBUwhW70CJHa#~AC|FQ8{R0L5vj3fl4QU?jiTk`s`7rH8b zR=_S1PvV9TvSe2LmI*zW9qN(KKCh2g0!up2Wf!ah&s3UVqziU&!8*kXyy7nixSfgu zevgofm!Hj4yn?-4sV}f|Ig@2&?)X%l)dQRI!{a^jU&jZ77ho|3AL}CgXjr2s-d5_X zq1J}3YOnn5{8kxzada_xFG=5;`RUBt_V332)ORB}cfIpqm3R&*@xRCEn+;W>^!DBB z+jMKdz0uT@_BwkNUTCBehWXZM?YLH}o;1pHy3E#64rlPUS?!p~Pegebog(wjFaPKx)Tumm_ zL2`AwqW1f)?(iW$5eNCT_C~FqT%*%zU$8#Sh=WwlJK28}d7SD4@_pj3RNk*VefqpKILdO_Y8fu!@3yi_Vz_9}2tfog+>R zj+%qS;SkQ}4LP{r=i$^z2bnBoY2y26-$D01m#FMcj4VPaCd0SzvX*N?0?ob5nuoS literal 26391 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 F{{syvlXCz7 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 4fa4428f..aeaabeca 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 @@ -12,7 +12,7 @@ from typing import Any, Iterable, Mapping from agent_framework.memory.summary_memory import MemoryContext, render_recent_messages -from agent_framework.runtime.transaction_parameters import extract_current_transaction_parameters, extract_transaction_parameters, reconcile_transaction_parameters, parse_transaction_confirmation +from agent_framework.runtime.transaction_parameters import extract_transaction_parameters, reconcile_transaction_parameters, parse_transaction_confirmation from agent_framework.workflows.input_contract import match_expected_input @@ -859,17 +859,6 @@ class AgentRuntimeMixin: if parameter: recovered_arguments = dict(arguments or {}) recovered_arguments.pop(parameter, None) - # Domain validators may declare derived fields that became invalid - # together with the rejected parameter. The framework does not - # interpret field names; it simply honors the generic clear_fields - # contract. This prevents stale derived values from contaminating - # later collection turns. - validator_clear_fields = [ - str(name) for name in (payload.get("clear_fields") or []) - if str(name).strip() - ] - for field in validator_clear_fields: - recovered_arguments.pop(field, None) recovered_policy = self._resolve_tool_execution_policy(tool_name, recovered_arguments) missing = self._missing_required_arguments(recovered_policy, recovered_arguments) if parameter not in missing: @@ -888,7 +877,6 @@ class AgentRuntimeMixin: "status": status, "parameter": parameter, "terminal": False, - "validator_clear_fields": validator_clear_fields, "result": result, } # A recoverable validator may provide a user-facing explanation @@ -1509,100 +1497,6 @@ 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, - *, - protected_current_fields: set[str] | None = None, - ) -> tuple[dict[str, Any], list[str]]: - """Apply temporal reconciliation without erasing current-turn candidates. - - Current-turn extraction is the first source of truth for *what the user - just said*. Reconciliation may canonicalize that candidate, and business - pre-validation may reject it, but temporal history must not make it - disappear before the validator sees it. - """ - out = dict(arguments or {}) - rec = dict(reconciliation or {}) - protected = {str(name) for name in (protected_current_fields or set())} - ignored_clears: list[str] = [] - for field in rec.get("clear_fields") or []: - name = str(field) - if name in protected: - ignored_clears.append(name) - continue - out.pop(name, None) - # Canonicalized values are still allowed; this is not a hard field lock. - out.update(dict(rec.get("values") or {})) - return out, ignored_clears - - @staticmethod - def _apply_prevalidated_structural_candidates( - arguments: dict[str, Any], - reconciliation: dict[str, Any] | None, - policy: dict[str, Any] | None, - ) -> tuple[dict[str, Any], dict[str, str]]: - """Apply structural *candidates* only behind authoritative pre-validation. - - Candidates are not resolved parameters. They may be raw local evidence - fragments and exist solely so a configured domain validator can - canonicalize/reject them. Without enabled pre-validation they are ignored. - """ - out = dict(arguments or {}) - cfg = (policy or {}).get("pre_validation") if isinstance(policy, dict) else None - if not isinstance(cfg, dict) or not cfg.get("enabled") or not str(cfg.get("tool") or "").strip(): - return out, {} - rec = dict(reconciliation or {}) - candidates = dict(rec.get("candidates") or {}) - provenance = dict(rec.get("candidate_provenance") or {}) - applied: dict[str, str] = {} - for field, value in candidates.items(): - name = str(field) - if out.get(name) not in _EMPTY_VALUES or value in _EMPTY_VALUES: - continue - out[name] = value - applied[name] = str(provenance.get(name) or "structural_candidate") - return out, applied - async def _reconcile_transaction_parameters( self, state: dict[str, Any], @@ -1649,7 +1543,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_priority_view(conversational_context) + ordered_context = self._transaction_context_newest_first(conversational_context) cached = route_meta.get("transaction_parameter_values") effective_known = dict(known_arguments or {}) if isinstance(cached, dict): @@ -1708,7 +1602,7 @@ class AgentRuntimeMixin: route_meta = ((state.get("route_decision") or {}).get("metadata") or {}) if isinstance(state.get("route_decision"), dict) else {} text = route_meta.get("original_input") if route_meta.get("contextual_reentry") else None text = text or state.get("sanitized_input") or state.get("user_text") or "" - return await extract_current_transaction_parameters( + return await extract_transaction_parameters( getattr(self, "llm", None), text=str(text), tool_name=tool_name, @@ -1716,6 +1610,7 @@ class AgentRuntimeMixin: known_arguments=dict(known_arguments or {}), parameter_schema=schema, tool_description=description, + conversational_context="", ) async def _extract_transaction_parameters( @@ -3074,12 +2969,12 @@ class AgentRuntimeMixin: # intent, a transação anterior é encerrada e seus latches são limpos. active_before_interruption = self._active_transaction(state) interruption = str(route_meta.get("transaction_interruption") or "").strip().lower() - if active_before_interruption and interruption == "explicit_abandonment": + if active_before_interruption and interruption == "intent_shift": interrupted_tool = active_before_interruption.get("tool_name") self._finish_active_transaction(state, "CANCELLED") state["transaction_pre_validation"] = None state["tool_policy_result"] = { - "action": "cancelled_by_explicit_abandonment", + "action": "cancelled_by_intent_shift", "tool_name": interrupted_tool, } @@ -3113,59 +3008,21 @@ class AgentRuntimeMixin: policy = self._resolve_tool_execution_policy(tool_name, previous_args) missing_before = self._missing_required_arguments(policy, previous_args) - # O EnterpriseRouter pode já ter consumido parâmetros pendentes - # neste MESMO turno para garantir precedência da transação sobre - # intent shift. Esses valores não são apenas telemetria: precisam - # ser materializados no estado transacional antes de qualquer nova - # extração. Eles continuam sendo candidatos e passam normalmente - # pela pre-validation autoritativa antes de confirmação/execução. + # Primeira tentativa: coleta tradicional usando SOMENTE a fala + # atual. O histórico não deve participar enquanto a mensagem corrente + # conseguir preencher o contrato normalmente. arguments = dict(previous_args) - cached_route_values: dict[str, Any] = {} - cached = route_meta.get("transaction_parameter_values") - missing_before_set = {str(name) for name in missing_before} - if isinstance(cached, dict): - cached_route_values = { - str(key): value - for key, value in cached.items() - if str(key) in missing_before_set and value not in _EMPTY_VALUES - } - arguments.update(cached_route_values) - - # A fala atual pode tanto preencher um campo faltante quanto corrigir - # explicitamente um campo já coletado. Por isso o extrator current-only - # examina TODOS os parâmetros requeridos, nunca apenas missing_parameters. - # Ele continua estritamente local à mensagem atual e só devolve campos - # explicitamente presentes; portanto não compete com a reconciliação - # temporal e não apaga estado quando o usuário não mencionou o campo. - required_fields = [str(name) for name in (policy.get("requires") or [])] - # Legacy/domain overrides historically receive only pending fields. - # Keep that extension contract intact; the base framework extractor - # is the one allowed to inspect every required field so an explicit - # current-turn correction can replace an already collected value. - legacy_override = getattr(type(self), "_extract_transaction_parameters", None) - has_legacy_override = ( - legacy_override is not None - and legacy_override is not AgentRuntimeMixin._extract_transaction_parameters - ) - current_fields = ( - self._missing_required_arguments(policy, arguments) - if has_legacy_override else required_fields - ) extracted_current = await self._extract_transaction_parameters_current_only( state, tool_name=tool_name, - missing_parameters=current_fields, - known_arguments=arguments, + missing_parameters=missing_before, + known_arguments=previous_args, ) arguments.update(dict(extracted_current or {})) state["transaction_parameter_collection"] = { "tool_name": tool_name, "mode": "current_turn", - "router_resolved_fields": sorted(cached_route_values.keys()), - "current_turn_resolved_fields": sorted(str(k) for k in (extracted_current or {}).keys()), - "resolved_fields": sorted( - set(cached_route_values.keys()) | {str(k) for k in (extracted_current or {}).keys()} - ), + "resolved_fields": sorted(str(k) for k in (extracted_current or {}).keys()), } # Segunda opção: somente se a coleta tradicional ainda deixar @@ -3181,23 +3038,15 @@ class AgentRuntimeMixin: parameter_names=required_fields, known_arguments=arguments, ) - protected_current_fields = { - str(k) - for k, v in dict(extracted_current or {}).items() - if v not in _EMPTY_VALUES - } - arguments, ignored_clears = self._apply_transaction_reconciliation( - arguments, reconciliation, protected_current_fields=protected_current_fields - ) + for field in reconciliation.get("clear_fields") or []: + arguments.pop(str(field), None) + arguments.update(dict(reconciliation.get("values") or {})) 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 {}), - "protected_current_fields": sorted(protected_current_fields), - "ignored_clear_fields": sorted(ignored_clears), } else: state.pop("transaction_parameter_reconciliation", None) @@ -3222,12 +3071,6 @@ class AgentRuntimeMixin: tool_name, arguments, state, exclude_fields=policy.get("requires") or [] ) policy = self._resolve_tool_execution_policy(tool_name, arguments) - arguments, applied_candidates = self._apply_prevalidated_structural_candidates( - arguments, locals().get("reconciliation"), policy - ) - if applied_candidates: - state.setdefault("transaction_parameter_reconciliation", {})["applied_structural_candidates"] = applied_candidates - policy = self._resolve_tool_execution_policy(tool_name, arguments) missing = self._missing_required_arguments(policy, arguments) if missing: self._set_collecting_parameters( @@ -3478,53 +3321,21 @@ class AgentRuntimeMixin: policy = self._resolve_tool_execution_policy(selected_action, action_args) required = [str(name) for name in (policy.get("requires") or [])] - # 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. + # 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. missing_initial = self._missing_required_arguments(policy, action_args) - extracted_initial = await self._extract_transaction_parameters_current_only( + # 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( 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, - ) - protected_current_fields = { - str(k) - for k, v in dict(extracted_initial or {}).items() - if str(k) in set(missing_initial) and v not in _EMPTY_VALUES - } - action_args, ignored_clears = self._apply_transaction_reconciliation( - action_args, reconciliation, protected_current_fields=protected_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 {}), - "protected_current_fields": sorted(protected_current_fields), - "ignored_clear_fields": sorted(ignored_clears), - } - 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. @@ -3543,18 +3354,6 @@ class AgentRuntimeMixin: ) state["tool_policy_result"] = {**policy, "tool_name": selected_action} - action_args, applied_candidates = self._apply_prevalidated_structural_candidates( - action_args, locals().get("reconciliation"), policy - ) - if applied_candidates: - state.setdefault("transaction_parameter_reconciliation", {})["applied_structural_candidates"] = applied_candidates - selected = {"tool_name": selected_action, "arguments": action_args} - state["selected_tool_call"] = selected - self._set_active_transaction( - state, tool_name=selected_action, arguments=action_args, status="COLLECTING_PARAMETERS" - ) - policy = self._resolve_tool_execution_policy(selected_action, action_args) - missing = self._missing_required_arguments(policy, action_args) if missing: self._set_collecting_parameters( 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 d6c2687f..88cfbeb6 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 @@ -69,81 +69,6 @@ def parse_transaction_confirmation(text: str) -> str | None: return None -async def extract_current_transaction_parameters( - llm: Any, - *, - text: str, - tool_name: str, - missing_parameters: list[str], - known_arguments: Mapping[str, Any] | None = None, - parameter_schema: Mapping[str, Any] | None = None, - tool_description: str | None = None, -) -> dict[str, Any]: - """Extract only values explicitly present in the current user utterance. - - This is deliberately narrower than temporal reconciliation: no history, no - cross-turn inference and no routing. Spoken numeric expressions are normalized - according to the declared numeric type, while textual fields must satisfy the - schema description in the current message itself. - """ - names = [str(x) for x in (missing_parameters or []) if str(x).strip()] - message = str(text or "").strip() - if not names or not message or llm is None: - return {} - schema = dict(parameter_schema or {}) - field_spec = { - name: { - "type": schema.get(name, "string") if not isinstance(schema.get(name), dict) else schema.get(name, {}).get("type", "string"), - "description": None if not isinstance(schema.get(name), dict) else schema.get(name, {}).get("description"), - } - for name in names - } - output = {name: None for name in names} - prompt = ( - "Extraia SOMENTE parâmetros explicitamente expressos na mensagem atual do usuário. " - "Não use histórico, não complete referências elípticas com conhecimento anterior e não invente valores. " - "Use exclusivamente type/description do schema para decidir se um trecho preenche um campo. " - "Para campos numéricos, normalize também números falados por extenso para número (por exemplo uma expressão monetária falada deve virar number). " - "Para campos textuais que exigem uma entidade concreta, uma referência apenas por valor/posição não preenche o campo. " - "Retorne SOMENTE JSON válido com exatamente as chaves pedidas; use null quando ausente ou ambíguo.\n" - f"tool: {tool_name}\n" - f"tool_description: {tool_description or ''}\n" - f"known_arguments: {json.dumps(dict(known_arguments or {}), ensure_ascii=False, default=str)}\n" - f"parameter_schema: {json.dumps(field_spec, ensure_ascii=False, default=str)}\n" - f"current_user_message: {message}\n" - f"Formato: {json.dumps(output, ensure_ascii=False)}" - ) - try: - response = await llm.ainvoke( - [{"role": "user", "content": prompt}], - profile_name="transaction_parameter_extraction", - component_name="transaction_parameter_extraction", - generation_name="llm.transaction_parameter_current_only", - temperature=0.0, - ) - except TypeError: - response = await llm.ainvoke([{"role": "user", "content": prompt}]) - except Exception as exc: - logger.warning("transaction.parameter.current_extract_failed tool=%s fields=%s error=%s", tool_name, names, exc) - return {} - raw = _response_text(response).strip() - try: - payload = parse_json_object(raw) - except (TypeError, ValueError): - logger.warning("transaction.parameter.current_extract_invalid tool=%s raw=%r", tool_name, raw[:240]) - return {} - if not isinstance(payload, dict): - return {} - values: dict[str, Any] = {} - for name in names: - value = payload.get(name) - declared = field_spec.get(name, {}).get("type", "string") - coerced = _coerce(value, declared) - if coerced not in _EMPTY_VALUES: - values[name] = coerced - return values - - async def reconcile_transaction_parameters( llm: Any, *, @@ -188,217 +113,33 @@ 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. " - "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. " + "Reconstrua UM CONJUNTO COERENTE de parâmetros; não extraia cada campo de forma isolada. " "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, 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" + "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" 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"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" + f"known_arguments: {json.dumps(known, 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"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"conversational_context: {str(conversational_context or '').strip()}\n" f"Formato obrigatório: {json.dumps(output_shape, ensure_ascii=False)}" ) @@ -471,49 +212,11 @@ async def reconcile_transaction_parameters( else: decisions[name] = "unresolved" - # Structural candidates are intentionally NOT resolved values. They are only - # fallback material for a configured authoritative pre-validator. This lets - # the runtime carry a unique local evidence fragment (or, when no anchor - # exists, a single prior user utterance) to domain validation without letting - # the framework invent/canonicalize business entities. - structural_candidates: dict[str, Any] = {} - candidate_provenance: dict[str, str] = {} - # For a field that was already missing before reconciliation, ``clear`` has - # no distinct state effect: there is no prior value to invalidate. Treat it - # as unresolved *only for structural-candidate fallback* so a unique anchored - # history fragment can still be offered to the configured authoritative - # pre-validator. This does not promote the fragment to a resolved value and - # does not change ``clear_fields`` semantics for fields that were previously - # populated. - unresolved_missing = [ - name for name in missing_initial - if decisions.get(name) in {"unresolved", "clear"} and name not in values - ] - anchored = [b for b in evidence_blocks if b.get("anchor_matches") and str(b.get("text") or "").strip()] - prior_user = [ - b for b in evidence_blocks - if int(b.get("priority") or 99) == 4 and str(b.get("text") or "").strip() - ] - for name in unresolved_missing: - declared = str(field_spec.get(name, {}).get("type") or "string").strip().lower() - if declared not in {"string", "str", "text"}: - continue - if len(anchored) == 1: - structural_candidates[name] = str(anchored[0].get("text") or "").strip() - candidate_provenance[name] = "unique_anchored_evidence_block" - logger.info( - "transaction.parameter.reconciled tool=%s decisions=%s resolved=%s clear=%s provenance=%s candidates=%s", - tool_name, decisions, sorted(values), clear_fields, provenance, sorted(structural_candidates), + "transaction.parameter.reconciled tool=%s decisions=%s resolved=%s clear=%s provenance=%s", + tool_name, decisions, sorted(values), clear_fields, provenance, ) - return { - "values": values, - "decisions": decisions, - "provenance": provenance, - "clear_fields": clear_fields, - "candidates": structural_candidates, - "candidate_provenance": candidate_provenance, - } + return {"values": values, "decisions": decisions, "provenance": provenance, "clear_fields": clear_fields} async def extract_transaction_parameters( 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 2476284377604fb9f1445277f932b279613414e4..abd217765813067c53de17863ce66d03f5a3e817 100644 GIT binary patch delta 19 Zcmcc2c$ty=GcPX}0}$NKoIjEK1OPd|1`+@O delta 19 Zcmcc2c$ty=GcPX}0}z-$nKzO91OPZn1?T_( 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 90fbf1eb8c8d0f104a7bfa0edda25a58493ff485..27bd0c7dc1745a43259d6f9fadc98618bf3383fd 100644 GIT binary patch delta 20 acmezD_1TO2GcPX}0}$NKoWGGfLlpo{x(3Mr delta 20 acmezD_1TO2GcPX}0}z-$nYWQULlpo`8wQ^M 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 d939ba537c3059ae5e73a82472967be9b8731f20..0db928e02476996ce1035f9937179d0c20fd7a42 100644 GIT binary patch delta 19 Zcmcb`c#DzyGcPX}0}$NKoIjEKJODbv1}6Xj delta 19 Zcmcb`c#DzyGcPX}0}z-$nKzO9JODXO1^oa3 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 12591f6903412d4bb6f45e51a0fb8d82e438a1f7..dcbefa0eea6db1b74cfabac4c49196316155de9b 100644 GIT binary patch delta 20 acmX@Fc3zG9GcPX}0}$NKoWGIVMHm1>_yz+2 delta 20 acmX@Fc3zG9GcPX}0}z-$nYWSKMHm1=Sq0eu 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 5491d910d5331c3603cdde05b580f7c3c14dc5a2..def6ac65b3e37a2137224777e1b62ae56eccab5e 100644 GIT binary patch delta 20 acmaFI_KuDFGcPX}0}$NFoWGGfnHc~?M+Ol9 delta 20 acmaFI_KuDFGcPX}0}z-$nYWQUnHc~=p#|mu 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 c2232406ca12869acddf9b93d47cf4d287fbef46..856528037f3dcfbdeaf622aba6ecddd9791d301e 100644 GIT binary patch delta 20 acmZqYZs+Fy%*)Hg00eh3=Wpb$VFds+ delta 20 acmdlfv{Q)tGcPX}0}z-$nYWQ!j}rhq4+Uia 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 25ce0041f8e7c1139ac315a63765260c62f3f2eb..5ab0dd87182b933417206b9d5786abf5bf47de3d 100644 GIT binary patch delta 20 acmbOwI!l!MGcPX}0}$NFoWGH~p9=swN(H(A delta 20 acmbOwI!l!MGcPX}0}z-$nYWR)v 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 bb1aaaab85f56354a1bd2a9a7b815b52d2c6e26e..f24728d937bb19bfdc9ad9ac1dd4a2925f7cc5ae 100644 GIT binary patch delta 22 ccmdlni)qI!ChpI?yj%=Ga3^#AMsD3+09A7bB>(^b delta 22 ccmdlni)qI!ChpI?yj%=GVE$y@MsD3+08`Bd`Tzg` 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 234176e35868848614dd3001eaa03567133ebb6d..15f1453ad726f48b72edeacf2e752bddecd388ad 100644 GIT binary patch delta 20 acmZ3-zmA{#GcPX}0}$NFoWGHKF*^V}j|Jxd delta 20 acmZ3-zmA{#GcPX}0}z-$nYWR9F*^V{=>@z1