From 0ecff719b7a5e642fe1a563f3f4f52001c618bc0 Mon Sep 17 00:00:00 2001 From: "cristiano.hoshikawa" Date: Thu, 27 Aug 2026 20:34:15 -0300 Subject: [PATCH] bugfix: oci_openai provider --- .../lib/agent_framework/guardrails/rails.py | 58 +++++- .../src/agent_framework.egg-info/SOURCES.txt | 1 + .../__pycache__/__init__.cpython-313.pyc | Bin 412 -> 411 bytes .../__pycache__/extensions.cpython-313.pyc | Bin 2140 -> 2139 bytes .../__pycache__/idempotency.cpython-313.pyc | Bin 5696 -> 5695 bytes .../__pycache__/observer.cpython-313.pyc | Bin 17556 -> 17555 bytes .../__pycache__/__init__.cpython-313.pyc | Bin 548 -> 547 bytes .../composite_publisher.cpython-313.pyc | Bin 2503 -> 2502 bytes .../__pycache__/event_builder.cpython-313.pyc | Bin 1261 -> 1260 bytes .../__pycache__/factory.cpython-313.pyc | Bin 3997 -> 3996 bytes .../__pycache__/publisher.cpython-313.pyc | Bin 1873 -> 1872 bytes .../tim_payload_mapper.cpython-313.pyc | Bin 9287 -> 9286 bytes .../__pycache__/tim_sequence.cpython-313.pyc | Bin 17562 -> 17561 bytes .../__pycache__/__init__.cpython-313.pyc | Bin 515 -> 514 bytes .../__pycache__/kafka.cpython-313.pyc | Bin 1813 -> 1812 bytes .../__pycache__/langfuse.cpython-313.pyc | Bin 23173 -> 23172 bytes .../__pycache__/oci_streaming.cpython-313.pyc | Bin 1822 -> 1821 bytes .../__pycache__/pubsub.cpython-313.pyc | Bin 7441 -> 7440 bytes .../__pycache__/__init__.cpython-313.pyc | Bin 404 -> 403 bytes .../usage_repository.cpython-313.pyc | Bin 15687 -> 15686 bytes .../__pycache__/__init__.cpython-313.pyc | Bin 214 -> 213 bytes .../cache/__pycache__/cache.cpython-313.pyc | Bin 16524 -> 16523 bytes .../__pycache__/__init__.cpython-313.pyc | Bin 217 -> 216 bytes .../__pycache__/adapters.cpython-313.pyc | Bin 4173 -> 4172 bytes .../channels/__pycache__/base.cpython-313.pyc | Bin 1797 -> 1796 bytes .../__pycache__/gateway.cpython-313.pyc | Bin 5772 -> 5771 bytes .../__pycache__/interruption.cpython-313.pyc | Bin 6457 -> 6456 bytes .../__pycache__/transcription.cpython-313.pyc | Bin 1430 -> 1429 bytes .../__pycache__/__init__.cpython-313.pyc | Bin 924 -> 923 bytes .../checkpoint_repository.cpython-313.pyc | Bin 27164 -> 27163 bytes .../langgraph_saver.cpython-313.pyc | Bin 32223 -> 32222 bytes .../__pycache__/__init__.cpython-313.pyc | Bin 215 -> 214 bytes .../agent_registry.cpython-313.pyc | Bin 6948 -> 6947 bytes .../__pycache__/settings.cpython-313.pyc | Bin 13790 -> 13789 bytes .../__pycache__/__init__.cpython-313.pyc | Bin 307 -> 306 bytes .../mcp_gateway_client.cpython-313.pyc | Bin 3333 -> 3332 bytes .../global_supervisor/router.py | 13 +- .../__pycache__/__init__.cpython-313.pyc | Bin 1502 -> 1501 bytes .../__pycache__/base.cpython-313.pyc | Bin 1376 -> 1375 bytes .../__pycache__/config_loader.cpython-313.pyc | Bin 9161 -> 9160 bytes .../__pycache__/custom_rails.cpython-313.pyc | Bin 4405 -> 4404 bytes .../framework_llm_client.cpython-313.pyc | Bin 18084 -> 17783 bytes .../__pycache__/llm_rails.cpython-313.pyc | Bin 6643 -> 5923 bytes .../output_supervisor.cpython-313.pyc | Bin 24307 -> 24306 bytes .../parallel_executor.cpython-313.pyc | Bin 21863 -> 21862 bytes .../__pycache__/pipeline.cpython-313.pyc | Bin 10890 -> 10889 bytes .../__pycache__/rail_action.cpython-313.pyc | Bin 655 -> 654 bytes .../__pycache__/rail_decision.cpython-313.pyc | Bin 1606 -> 1605 bytes .../__pycache__/rail_result.cpython-313.pyc | Bin 1005 -> 1004 bytes .../__pycache__/rails.cpython-313.pyc | Bin 33969 -> 34444 bytes .../__pycache__/__init__.cpython-313.pyc | Bin 2995 -> 2994 bytes .../__pycache__/_compat.cpython-313.pyc | Bin 2446 -> 2445 bytes .../contestation_validation.cpython-313.pyc | Bin 2178 -> 2177 bytes .../__pycache__/contracts.cpython-313.pyc | Bin 6902 -> 6901 bytes .../__pycache__/input_size.cpython-313.pyc | Bin 3650 -> 3649 bytes .../__pycache__/llm_adapter.cpython-313.pyc | Bin 3800 -> 3799 bytes .../__pycache__/llm_client.cpython-313.pyc | Bin 7339 -> 7338 bytes .../__pycache__/llm_rails.cpython-313.pyc | Bin 8895 -> 8894 bytes .../output_sanitization.cpython-313.pyc | Bin 13911 -> 13910 bytes .../__pycache__/pipeline.cpython-313.pyc | Bin 12662 -> 12661 bytes .../__pycache__/__init__.cpython-313.pyc | Bin 474 -> 473 bytes .../__pycache__/_context.cpython-313.pyc | Bin 5872 -> 5871 bytes .../ausencia_oferta_proativa.cpython-313.pyc | Bin 11266 -> 11265 bytes .../__pycache__/coerencia.cpython-313.pyc | Bin 9486 -> 9485 bytes .../__pycache__/dlex_in.cpython-313.pyc | Bin 1305 -> 1304 bytes .../__pycache__/dlex_out.cpython-313.pyc | Bin 1592 -> 1591 bytes .../__pycache__/fallback.cpython-313.pyc | Bin 17653 -> 17652 bytes .../__pycache__/fraseologia.cpython-313.pyc | Bin 7634 -> 7633 bytes .../__pycache__/out_of_scope.cpython-313.pyc | Bin 17494 -> 17493 bytes .../prompts/__pycache__/pinj.cpython-313.pyc | Bin 8425 -> 8424 bytes .../__pycache__/ragsec.cpython-313.pyc | Bin 1121 -> 1120 bytes .../__pycache__/revprec.cpython-313.pyc | Bin 5412 -> 5411 bytes .../prompts/__pycache__/tox.cpython-313.pyc | Bin 645 -> 644 bytes .../toxicidade_output.cpython-313.pyc | Bin 929 -> 928 bytes .../__pycache__/__init__.cpython-313.pyc | Bin 1664 -> 1663 bytes .../rails/__pycache__/alcada.cpython-313.pyc | Bin 5000 -> 4999 bytes .../rails/__pycache__/anatel.cpython-313.pyc | Bin 9149 -> 9148 bytes .../__pycache__/confirmation.cpython-313.pyc | Bin 11020 -> 11042 bytes .../rails/__pycache__/dlex_in.cpython-313.pyc | Bin 3280 -> 3279 bytes .../__pycache__/dlex_out.cpython-313.pyc | Bin 3332 -> 3331 bytes .../rails/__pycache__/ragsec.cpython-313.pyc | Bin 5414 -> 5462 bytes .../rails/__pycache__/revprec.cpython-313.pyc | Bin 5422 -> 5470 bytes .../rails/__pycache__/tox.cpython-313.pyc | Bin 8245 -> 8293 bytes .../calibrated/rails/confirmation.py | 8 +- .../guardrails/calibrated/rails/ragsec.py | 4 +- .../guardrails/calibrated/rails/revprec.py | 4 +- .../rails/supervision/correspondencia_item.py | 4 +- .../rails/supervision/groundedness.py | 4 +- .../rails/supervision/intencao_cancelar.py | 4 +- .../rails/supervision/quantidade_coerente.py | 4 +- .../rails/supervision/servico_correto.py | 4 +- .../supervision/verbalizacao_prematura.py | 4 +- .../guardrails/calibrated/rails/tox.py | 4 +- .../__pycache__/__init__.cpython-313.pyc | Bin 534 -> 533 bytes .../rules/__pycache__/alcada.cpython-313.pyc | Bin 1882 -> 1881 bytes .../__pycache__/pinj_patterns.cpython-313.pyc | Bin 3731 -> 3730 bytes .../__pycache__/tox_blocklist.cpython-313.pyc | Bin 1507 -> 1506 bytes .../guardrails/framework_llm_client.py | 12 +- .../agent_framework/guardrails/llm_rails.py | 16 +- .../src/agent_framework/guardrails/rails.py | 58 +++++- .../__pycache__/__init__.cpython-313.pyc | Bin 409 -> 408 bytes .../__pycache__/mcp_mapper.cpython-313.pyc | Bin 4693 -> 4692 bytes .../__pycache__/models.cpython-313.pyc | Bin 3145 -> 3144 bytes .../__pycache__/resolver.cpython-313.pyc | Bin 4714 -> 4713 bytes .../__pycache__/__init__.cpython-313.pyc | Bin 619 -> 618 bytes .../judges/__pycache__/judge.cpython-313.pyc | Bin 38285 -> 37576 bytes .../__pycache__/__init__.cpython-313.pyc | Bin 226 -> 225 bytes .../__pycache__/llm_client.cpython-313.pyc | Bin 6103 -> 5404 bytes .../judges/calibrated/llm_client.py | 18 +- .../__pycache__/__init__.cpython-313.pyc | Bin 234 -> 233 bytes .../prompts/__pycache__/aluc.cpython-313.pyc | Bin 6530 -> 6529 bytes .../prompts/__pycache__/csi.cpython-313.pyc | Bin 1333 -> 1332 bytes .../__pycache__/fallback.cpython-313.pyc | Bin 8036 -> 8035 bytes .../prompts/__pycache__/rqlt.cpython-313.pyc | Bin 1166 -> 1165 bytes .../prompts/__pycache__/vctn.cpython-313.pyc | Bin 627 -> 626 bytes .../src/agent_framework/judges/judge.py | 16 +- .../src/agent_framework/llm/__init__.py | 9 +- .../llm/__pycache__/__init__.cpython-313.pyc | Bin 334 -> 476 bytes .../llm/__pycache__/base.cpython-313.pyc | Bin 1624 -> 1623 bytes .../profile_resolver.cpython-313.pyc | Bin 9280 -> 9322 bytes .../llm/__pycache__/providers.cpython-313.pyc | Bin 41711 -> 45052 bytes .../structured_output.cpython-313.pyc | Bin 0 -> 7459 bytes .../llm/__pycache__/types.cpython-313.pyc | Bin 1275 -> 1274 bytes .../agent_framework/llm/profile_resolver.py | 2 +- .../src/agent_framework/llm/providers.py | 83 +++++++- .../agent_framework/llm/structured_output.py | 181 ++++++++++++++++++ .../mcp/__pycache__/__init__.cpython-313.pyc | Bin 474 -> 473 bytes .../mcp/__pycache__/client.cpython-313.pyc | Bin 18427 -> 18426 bytes .../mcp/__pycache__/models.cpython-313.pyc | Bin 2137 -> 2136 bytes .../mcp/__pycache__/registry.cpython-313.pyc | Bin 4741 -> 4740 bytes .../__pycache__/tool_policy.cpython-313.pyc | Bin 5686 -> 5685 bytes .../__pycache__/tool_router.cpython-313.pyc | Bin 14190 -> 14189 bytes .../__pycache__/__init__.cpython-313.pyc | Bin 1136 -> 1135 bytes .../long_term_extractor.cpython-313.pyc | Bin 2514 -> 2513 bytes .../long_term_memory.cpython-313.pyc | Bin 6840 -> 6839 bytes .../long_term_models.cpython-313.pyc | Bin 1749 -> 1748 bytes .../long_term_store.cpython-313.pyc | Bin 29187 -> 29186 bytes .../message_history.cpython-313.pyc | Bin 8360 -> 8359 bytes .../summary_memory.cpython-313.pyc | Bin 12511 -> 12510 bytes .../__pycache__/summary_store.cpython-313.pyc | Bin 9521 -> 9520 bytes .../__pycache__/__init__.cpython-313.pyc | Bin 215 -> 214 bytes .../__pycache__/identity.cpython-313.pyc | Bin 3466 -> 3465 bytes .../__pycache__/session.cpython-313.pyc | Bin 2709 -> 2708 bytes .../__pycache__/__init__.cpython-313.pyc | Bin 1395 -> 1394 bytes .../__pycache__/code_mapper.cpython-313.pyc | Bin 21448 -> 21447 bytes .../__pycache__/context.cpython-313.pyc | Bin 7387 -> 7386 bytes .../__pycache__/event_bus.cpython-313.pyc | Bin 3633 -> 3632 bytes .../guardrail_events.cpython-313.pyc | Bin 2051 -> 2050 bytes .../__pycache__/ic_events.cpython-313.pyc | Bin 626 -> 625 bytes .../__pycache__/judge_events.cpython-313.pyc | Bin 1411 -> 1410 bytes .../langgraph_telemetry.cpython-313.pyc | Bin 4964 -> 4963 bytes .../__pycache__/llm_advisors.cpython-313.pyc | Bin 2938 -> 2937 bytes .../__pycache__/noc_contract.cpython-313.pyc | Bin 5075 -> 5074 bytes .../__pycache__/noc_otel.cpython-313.pyc | Bin 6322 -> 6321 bytes .../__pycache__/observer.cpython-313.pyc | Bin 5105 -> 5104 bytes .../__pycache__/otel.cpython-313.pyc | Bin 3412 -> 3411 bytes .../streaming_events.cpython-313.pyc | Bin 1835 -> 1834 bytes .../__pycache__/telemetry.cpython-313.pyc | Bin 52428 -> 52427 bytes .../__pycache__/token_cost.cpython-313.pyc | Bin 8691 -> 8690 bytes .../workflow_events.cpython-313.pyc | Bin 3330 -> 3329 bytes .../oci/__pycache__/__init__.cpython-313.pyc | Bin 212 -> 211 bytes .../oci/__pycache__/auth.cpython-313.pyc | Bin 3244 -> 3243 bytes .../__pycache__/__init__.cpython-313.pyc | Bin 220 -> 219 bytes .../__pycache__/oracle_store.cpython-313.pyc | Bin 44956 -> 44955 bytes .../__pycache__/sqlite_store.cpython-313.pyc | Bin 15019 -> 15018 bytes .../__pycache__/__init__.cpython-313.pyc | Bin 455 -> 454 bytes .../__pycache__/renderers.cpython-313.pyc | Bin 4318 -> 4317 bytes .../rag/__pycache__/__init__.cpython-313.pyc | Bin 710 -> 709 bytes .../embedding_provider.cpython-313.pyc | Bin 6517 -> 6516 bytes .../__pycache__/graph_store.cpython-313.pyc | Bin 5528 -> 5527 bytes .../rag/__pycache__/ingest.cpython-313.pyc | Bin 12581 -> 12580 bytes .../__pycache__/kbdb_service.cpython-313.pyc | Bin 10012 -> 10011 bytes .../__pycache__/rag_service.cpython-313.pyc | Bin 10898 -> 10897 bytes .../__pycache__/vector_store.cpython-313.pyc | Bin 18656 -> 18655 bytes .../__pycache__/__init__.cpython-313.pyc | Bin 221 -> 220 bytes .../session_repository.cpython-313.pyc | Bin 8590 -> 8589 bytes .../__pycache__/__init__.cpython-313.pyc | Bin 426 -> 425 bytes .../__pycache__/config_loader.cpython-313.pyc | Bin 2297 -> 2296 bytes .../__pycache__/continuity.cpython-313.pyc | Bin 13239 -> 12315 bytes .../enterprise_router.cpython-313.pyc | Bin 36792 -> 36172 bytes .../__pycache__/models.cpython-313.pyc | Bin 2447 -> 2446 bytes .../src/agent_framework/routing/continuity.py | 20 +- .../routing/enterprise_router.py | 15 +- .../__pycache__/__init__.cpython-313.pyc | Bin 349 -> 348 bytes .../__pycache__/agent_runtime.cpython-313.pyc | Bin 152074 -> 151759 bytes .../transaction_parameters.cpython-313.pyc | Bin 10626 -> 10308 bytes .../agent_framework/runtime/agent_runtime.py | 8 +- .../runtime/transaction_parameters.py | 10 +- .../__pycache__/__init__.cpython-313.pyc | Bin 1188 -> 1176 bytes .../authentication.cpython-313.pyc | Bin 15408 -> 15396 bytes .../__pycache__/factory.cpython-313.pyc | Bin 7977 -> 7965 bytes .../__pycache__/installer.cpython-313.pyc | Bin 5595 -> 5583 bytes .../__pycache__/middleware.cpython-313.pyc | Bin 8879 -> 8867 bytes .../sse/__pycache__/__init__.cpython-313.pyc | Bin 212 -> 211 bytes .../sse/__pycache__/events.cpython-313.pyc | Bin 9588 -> 9587 bytes .../__pycache__/__init__.cpython-313.pyc | Bin 219 -> 218 bytes .../__pycache__/supervisor.cpython-313.pyc | Bin 4944 -> 4943 bytes .../__pycache__/__init__.cpython-313.pyc | Bin 879 -> 878 bytes .../__pycache__/graph.cpython-313.pyc | Bin 1416 -> 1415 bytes .../input_contract.cpython-313.pyc | Bin 2254 -> 2253 bytes .../__pycache__/models.cpython-313.pyc | Bin 5233 -> 5232 bytes .../__pycache__/registry.cpython-313.pyc | Bin 2362 -> 2361 bytes .../__pycache__/repository.cpython-313.pyc | Bin 2715 -> 2714 bytes .../__pycache__/runtime.cpython-313.pyc | Bin 32981 -> 32980 bytes .../__pycache__/tool_executor.cpython-313.pyc | Bin 1967 -> 1966 bytes .../conftest.cpython-313-pytest-9.0.2.pyc | Bin 788 -> 780 bytes ..._continuation.cpython-313-pytest-9.0.2.pyc | Bin 8835 -> 8801 bytes ...ameter_prompt.cpython-313-pytest-9.0.2.pyc | Bin 0 -> 6151 bytes ..._presentation.cpython-313-pytest-9.0.2.pyc | Bin 10418 -> 10410 bytes ...tion_sampling.cpython-313-pytest-9.0.2.pyc | Bin 0 -> 6299 bytes ...ction_runtime.cpython-313-pytest-9.0.2.pyc | Bin 8796 -> 8776 bytes ..._deadlock_fix.cpython-313-pytest-9.0.2.pyc | Bin 0 -> 11432 bytes ...me_precedence.cpython-313-pytest-9.0.2.pyc | Bin 17584 -> 28469 bytes ..._revalidation.cpython-313-pytest-9.0.2.pyc | Bin 13627 -> 13672 bytes ...saction_shift.cpython-313-pytest-9.0.2.pyc | Bin 25795 -> 25786 bytes ...output_parser.cpython-313-pytest-9.0.2.pyc | Bin 0 -> 8361 bytes ...stomer_facing.cpython-313-pytest-9.0.2.pyc | Bin 4817 -> 4783 bytes ..._descriptions.cpython-313-pytest-9.0.2.pyc | Bin 10424 -> 10415 bytes ...lm_precedence.cpython-313-pytest-9.0.2.pyc | Bin 20646 -> 32364 bytes ...ession_matrix.cpython-313-pytest-9.0.2.pyc | Bin 45089 -> 52038 bytes ..._interruption.cpython-313-pytest-9.0.2.pyc | Bin 28238 -> 28263 bytes ...nal_tool_flow.cpython-313-pytest-9.0.2.pyc | Bin 70422 -> 70413 bytes ...est_compliance_protocol_expected_values.py | 60 ++++++ .../tests/test_structured_output_parser.py | 62 ++++++ ...t_transaction_state_router_interruption.py | 2 +- ...agent_runtime.cpython-313-pytest-9.0.2.pyc | Bin 0 -> 3349 bytes ...uthentication.cpython-313-pytest-9.0.2.pyc | Bin 8555 -> 8543 bytes ...tion_policies.cpython-313-pytest-9.0.2.pyc | Bin 9458 -> 9446 bytes .../test_cache.cpython-313-pytest-9.0.2.pyc | Bin 0 -> 3342 bytes ...e_distributed.cpython-313-pytest-9.0.2.pyc | Bin 0 -> 2015 bytes ...ports_compile.cpython-313-pytest-9.0.2.pyc | Bin 0 -> 593 bytes ...pt_controlled.cpython-313-pytest-9.0.2.pyc | Bin 16540 -> 16529 bytes ...untime_config.cpython-313-pytest-9.0.2.pyc | Bin 30681 -> 30659 bytes ...ckpoint_saver.cpython-313-pytest-9.0.2.pyc | Bin 2338 -> 2327 bytes ...aph_telemetry.cpython-313-pytest-9.0.2.pyc | Bin 0 -> 4715 bytes ...rich_response.cpython-313-pytest-9.0.2.pyc | Bin 0 -> 22888 bytes ...ry_autonomous.cpython-313-pytest-9.0.2.pyc | Bin 0 -> 7793 bytes ...ics_publisher.cpython-313-pytest-9.0.2.pyc | Bin 0 -> 7084 bytes .../test_rag.cpython-313-pytest-9.0.2.pyc | Bin 0 -> 2886 bytes ...kbdb_provider.cpython-313-pytest-9.0.2.pyc | Bin 11567 -> 11547 bytes ...ql_generation.cpython-313-pytest-9.0.2.pyc | Bin 0 -> 1425 bytes ...ime_grounding.cpython-313-pytest-9.0.2.pyc | Bin 9659 -> 9650 bytes ..._checkpointer.cpython-313-pytest-9.0.2.pyc | Bin 5298 -> 5271 bytes ...te_stickiness.cpython-313-pytest-9.0.2.pyc | Bin 26265 -> 27026 bytes .../test_sse.cpython-313-pytest-9.0.2.pyc | Bin 0 -> 4485 bytes ..._replay_dedup.cpython-313-pytest-9.0.2.pyc | Bin 0 -> 4414 bytes ...gfuse_compact.cpython-313-pytest-9.0.2.pyc | Bin 0 -> 42279 bytes ...st_enterprise.cpython-313-pytest-9.0.2.pyc | Bin 0 -> 5673 bytes ...tool_policies.cpython-313-pytest-9.0.2.pyc | Bin 13734 -> 13723 bytes ...nal_workflows.cpython-313-pytest-9.0.2.pyc | Bin 12099 -> 12089 bytes ...e_diagnostics.cpython-313-pytest-9.0.2.pyc | Bin 5445 -> 5401 bytes ...rkflow_static.cpython-313-pytest-9.0.2.pyc | Bin 0 -> 3273 bytes .../tests/unit/test_llm_rich_response.py | 42 +++- .../unit/test_semantic_route_stickiness.py | 3 + app/__pycache__/__init__.cpython-313.pyc | Bin 151 -> 150 bytes app/__pycache__/main.cpython-313.pyc | Bin 37350 -> 37349 bytes app/__pycache__/state.cpython-313.pyc | Bin 3080 -> 3079 bytes .../contas_prompting.cpython-313.pyc | Bin 1061 -> 1060 bytes .../contestacao_agent.cpython-313.pyc | Bin 5302 -> 5301 bytes .../__pycache__/faturas_agent.cpython-313.pyc | Bin 5228 -> 5227 bytes .../__pycache__/prompting.cpython-313.pyc | Bin 1148 -> 1147 bytes .../__pycache__/runtime.cpython-313.pyc | Bin 435 -> 434 bytes .../suporte_contas_agent.cpython-313.pyc | Bin 5898 -> 5897 bytes .../__pycache__/vas_agent.cpython-313.pyc | Bin 5713 -> 5712 bytes .../__pycache__/__init__.cpython-313.pyc | Bin 233 -> 232 bytes .../__pycache__/__init__.cpython-313.pyc | Bin 329 -> 328 bytes .../contas/__pycache__/client.cpython-313.pyc | Bin 48508 -> 48507 bytes .../contestation_rules.cpython-313.pyc | Bin 13577 -> 13576 bytes .../contestation_validation.cpython-313.pyc | Bin 22806 -> 22805 bytes .../__pycache__/ic_tags.cpython-313.pyc | Bin 17227 -> 17226 bytes .../informational_context.cpython-313.pyc | Bin 3496 -> 3495 bytes .../invoice_context.cpython-313.pyc | Bin 20358 -> 20357 bytes .../invoice_models.cpython-313.pyc | Bin 1804 -> 1803 bytes .../invoice_resolver.cpython-313.pyc | Bin 56049 -> 56048 bytes .../__pycache__/item_matcher.cpython-313.pyc | Bin 9917 -> 9916 bytes .../pro_rata_rules.cpython-313.pyc | Bin 17674 -> 17673 bytes .../protocol_triplets.cpython-313.pyc | Bin 7737 -> 7736 bytes .../__pycache__/rct_policy.cpython-313.pyc | Bin 6330 -> 6329 bytes .../__pycache__/service.cpython-313.pyc | Bin 20505 -> 20504 bytes .../string_metrics.cpython-313.pyc | Bin 6303 -> 6302 bytes .../vas_cancellation_message.cpython-313.pyc | Bin 16324 -> 16323 bytes .../__pycache__/vas_variation.cpython-313.pyc | Bin 42129 -> 42128 bytes .../workflow_actions.cpython-313.pyc | Bin 130069 -> 130068 bytes .../secure_pdf_crypto.cpython-313.pyc | Bin 2475 -> 2474 bytes .../__pycache__/__init__.cpython-313.pyc | Bin 936 -> 935 bytes .../__pycache__/bill_parser.cpython-313.pyc | Bin 23740 -> 23739 bytes .../bill_processor.cpython-313.pyc | Bin 36255 -> 36254 bytes .../__pycache__/__init__.cpython-313.pyc | Bin 303 -> 302 bytes .../tim_guardrails.cpython-313.pyc | Bin 9179 -> 9178 bytes .../__pycache__/tim_judges.cpython-313.pyc | Bin 5487 -> 5486 bytes .../__pycache__/__init__.cpython-313.pyc | Bin 174 -> 173 bytes .../__pycache__/aluc.cpython-313.pyc | Bin 6389 -> 6388 bytes .../ausencia_oferta_proativa.cpython-313.pyc | Bin 9811 -> 9810 bytes .../__pycache__/fraseologia.cpython-313.pyc | Bin 7528 -> 7527 bytes .../__pycache__/out_of_scope.cpython-313.pyc | Bin 17020 -> 17019 bytes .../__pycache__/revprec.cpython-313.pyc | Bin 5343 -> 5342 bytes .../__pycache__/rqlt.cpython-313.pyc | Bin 1096 -> 1095 bytes .../__pycache__/__init__.cpython-313.pyc | Bin 165 -> 164 bytes .../telemetry_observer.cpython-313.pyc | Bin 4988 -> 4987 bytes .../__pycache__/__init__.cpython-313.pyc | Bin 257 -> 256 bytes .../tool_renderers.cpython-313.pyc | Bin 5430 -> 5429 bytes .../__pycache__/agent_graph.cpython-313.pyc | Bin 59974 -> 62563 bytes app/workflows/agent_graph.py | 77 +++++++- config/prompts/billing.yaml | 15 +- config/prompts/contestation.yaml | 16 +- config/prompts/vas.yaml | 1 + .../__pycache__/__init__.cpython-313.pyc | Bin 158 -> 157 bytes .../__pycache__/__init__.cpython-313.pyc | Bin 166 -> 165 bytes .../__pycache__/__init__.cpython-313.pyc | Bin 184 -> 183 bytes .../__pycache__/main.cpython-313.pyc | Bin 61541 -> 61888 bytes contas_mcp/servers/contas_mcp_server/main.py | 24 ++- .../conftest.cpython-313-pytest-9.0.2.pyc | Bin 835 -> 847 bytes ...sarial_parity.cpython-313-pytest-9.0.2.pyc | Bin 44283 -> 53246 bytes ...ss_rules_full.cpython-313-pytest-9.0.2.pyc | Bin 23193 -> 23205 bytes ...ilure_mapping.cpython-313-pytest-9.0.2.pyc | Bin 7670 -> 7682 bytes ..._out_of_scope.cpython-313-pytest-9.0.2.pyc | Bin 0 -> 3525 bytes ...ls_judges_spi.cpython-313-pytest-9.0.2.pyc | Bin 10131 -> 10143 bytes ...binary_parity.cpython-313-pytest-9.0.2.pyc | Bin 12225 -> 12237 bytes ..._dict_history.cpython-313-pytest-9.0.2.pyc | Bin 1983 -> 1995 bytes ...faults_parity.cpython-313-pytest-9.0.2.pyc | Bin 6447 -> 6459 bytes ...subject_guard.cpython-313-pytest-9.0.2.pyc | Bin 14374 -> 21844 bytes ...ation_message.cpython-313-pytest-9.0.2.pyc | Bin 23891 -> 23903 bytes ...vas_variation.cpython-313-pytest-9.0.2.pyc | Bin 142655 -> 142667 bytes ...n_adversarial.cpython-313-pytest-9.0.2.pyc | Bin 43307 -> 43319 bytes ..._continuation.cpython-313-pytest-9.0.2.pyc | Bin 0 -> 10888 bytes ...onse_renderer.cpython-313-pytest-9.0.2.pyc | Bin 4413 -> 4425 bytes tests/migration/test_adversarial_parity.py | 94 +++++++++ ...ntestation_prompt_terminal_out_of_scope.py | 11 ++ .../test_mcp_contestation_subject_guard.py | 37 ++++ 329 files changed, 864 insertions(+), 144 deletions(-) create mode 100644 agent_framework_oci/libs/agent_framework/src/agent_framework/llm/__pycache__/structured_output.cpython-313.pyc create mode 100644 agent_framework_oci/libs/agent_framework/src/agent_framework/llm/structured_output.py create mode 100644 agent_framework_oci/tests/__pycache__/test_fraseologia_business_parameter_prompt.cpython-313-pytest-9.0.2.pyc create mode 100644 agent_framework_oci/tests/__pycache__/test_judge_transaction_sampling.cpython-313-pytest-9.0.2.pyc create mode 100644 agent_framework_oci/tests/__pycache__/test_observer_cross_loop_deadlock_fix.cpython-313-pytest-9.0.2.pyc create mode 100644 agent_framework_oci/tests/__pycache__/test_structured_output_parser.cpython-313-pytest-9.0.2.pyc create mode 100644 agent_framework_oci/tests/test_compliance_protocol_expected_values.py create mode 100644 agent_framework_oci/tests/test_structured_output_parser.py create mode 100644 agent_framework_oci/tests/unit/__pycache__/test_agent_runtime.cpython-313-pytest-9.0.2.pyc create mode 100644 agent_framework_oci/tests/unit/__pycache__/test_cache.cpython-313-pytest-9.0.2.pyc create mode 100644 agent_framework_oci/tests/unit/__pycache__/test_cache_distributed.cpython-313-pytest-9.0.2.pyc create mode 100644 agent_framework_oci/tests/unit/__pycache__/test_imports_compile.cpython-313-pytest-9.0.2.pyc create mode 100644 agent_framework_oci/tests/unit/__pycache__/test_langgraph_telemetry.cpython-313-pytest-9.0.2.pyc create mode 100644 agent_framework_oci/tests/unit/__pycache__/test_llm_rich_response.cpython-313-pytest-9.0.2.pyc create mode 100644 agent_framework_oci/tests/unit/__pycache__/test_long_term_memory_autonomous.cpython-313-pytest-9.0.2.pyc create mode 100644 agent_framework_oci/tests/unit/__pycache__/test_pubsub_analytics_publisher.cpython-313-pytest-9.0.2.pyc create mode 100644 agent_framework_oci/tests/unit/__pycache__/test_rag.cpython-313-pytest-9.0.2.pyc create mode 100644 agent_framework_oci/tests/unit/__pycache__/test_rag_oracle_sql_generation.cpython-313-pytest-9.0.2.pyc create mode 100644 agent_framework_oci/tests/unit/__pycache__/test_sse.cpython-313-pytest-9.0.2.pyc create mode 100644 agent_framework_oci/tests/unit/__pycache__/test_sse_replay_dedup.cpython-313-pytest-9.0.2.pyc create mode 100644 agent_framework_oci/tests/unit/__pycache__/test_telemetry_langfuse_compact.cpython-313-pytest-9.0.2.pyc create mode 100644 agent_framework_oci/tests/unit/__pycache__/test_token_cost_enterprise.cpython-313-pytest-9.0.2.pyc create mode 100644 agent_framework_oci/tests/unit/__pycache__/test_workflow_static.cpython-313-pytest-9.0.2.pyc create mode 100644 tests/migration/__pycache__/test_contestation_prompt_terminal_out_of_scope.cpython-313-pytest-9.0.2.pyc create mode 100644 tests/migration/__pycache__/test_tim_aoferta_transaction_continuation.cpython-313-pytest-9.0.2.pyc create mode 100644 tests/migration/test_contestation_prompt_terminal_out_of_scope.py diff --git a/agent_framework_oci/libs/agent_framework/build/lib/agent_framework/guardrails/rails.py b/agent_framework_oci/libs/agent_framework/build/lib/agent_framework/guardrails/rails.py index 4863078..f8c70c4 100644 --- a/agent_framework_oci/libs/agent_framework/build/lib/agent_framework/guardrails/rails.py +++ b/agent_framework_oci/libs/agent_framework/build/lib/agent_framework/guardrails/rails.py @@ -448,25 +448,69 @@ class ComplianceRail(Guardrail): requer = ctx.get("tipo_fluxo") == "ajuste" or ctx.get("requer_protocolo") is True if not requer: return RailDecision(code=self.code, allowed=True, sanitized_text=None, reason="Compliance Anatel não aplicável", metadata={"calibrated": True}) - expected = list(ctx.get("expected_protocols") or []) - if self._PROTOCOL_PATTERN.search(text or ""): - return RailDecision(code=self.code, allowed=True, reason="Resposta contém protocolo obrigatório", metadata={"calibrated": True}) - patched, missing = self._apply_protocol_fallback(text or "", expected) - if patched != (text or ""): + + original = text or "" + expected = [str(value).strip() for value in (ctx.get("expected_protocols") or []) if str(value).strip()] + + # Quando o workflow informa os protocolos esperados, esses valores são a + # fonte de verdade. Valide-os diretamente no texto (cru ou vocalizado) + # antes de recorrer ao regex genérico. Isso evita tanto falso negativo + # por distância/Markdown quanto falso positivo por um protocolo diferente. + if expected: + patched, missing = self._apply_protocol_fallback(original, expected) + if not missing: + return RailDecision( + code=self.code, + allowed=True, + reason="Resposta contém o(s) protocolo(s) esperado(s)", + sanitized_text=None, + metadata={ + "expected_protocols": expected, + "protocol_validation": "expected_values", + "mechanism": "deterministic", + "calibrated": True, + }, + ) + return RailDecision( code=self.code, allowed=True, reason="Resposta sem protocolo obrigatório; protocolo anexado deterministicamente", sanitized_text=patched, - metadata={"missing_protocols_spoken": missing, "expected_protocols": expected, "mechanism": "deterministic", "calibrated": True}, + metadata={ + "missing_protocols_spoken": missing, + "expected_protocols": expected, + "protocol_validation": "expected_values", + "mechanism": "deterministic", + "calibrated": True, + }, ) + + # Compatibilidade para fluxos legados que exigem protocolo, mas não + # fornecem expected_protocols: nesse caso ainda usamos o reconhecimento + # genérico por regex. + if self._PROTOCOL_PATTERN.search(original): + return RailDecision( + code=self.code, + allowed=True, + reason="Resposta contém protocolo obrigatório", + metadata={ + "protocol_validation": "generic_regex", + "mechanism": "deterministic", + "calibrated": True, + }, + ) + return RailDecision( code=self.code, allowed=False, reason="Resposta de ajuste sem número de protocolo", sanitized_text=text, metadata={ - "expected_protocols": expected, "mechanism": "deterministic", "calibrated": True, + "expected_protocols": expected, + "protocol_validation": "generic_regex", + "mechanism": "deterministic", + "calibrated": True, "terminal_action": "retry", }, ) diff --git a/agent_framework_oci/libs/agent_framework/src/agent_framework.egg-info/SOURCES.txt b/agent_framework_oci/libs/agent_framework/src/agent_framework.egg-info/SOURCES.txt index 9499deb..ddcd57f 100644 --- a/agent_framework_oci/libs/agent_framework/src/agent_framework.egg-info/SOURCES.txt +++ b/agent_framework_oci/libs/agent_framework/src/agent_framework.egg-info/SOURCES.txt @@ -135,6 +135,7 @@ src/agent_framework/llm/__init__.py src/agent_framework/llm/base.py src/agent_framework/llm/profile_resolver.py src/agent_framework/llm/providers.py +src/agent_framework/llm/structured_output.py src/agent_framework/llm/types.py src/agent_framework/mcp/__init__.py src/agent_framework/mcp/client.py diff --git a/agent_framework_oci/libs/agent_framework/src/agent_framework/__pycache__/__init__.cpython-313.pyc b/agent_framework_oci/libs/agent_framework/src/agent_framework/__pycache__/__init__.cpython-313.pyc index 4950c714fc5fa48c2ca6088db3f752de6dafa0c2..de09ac2323cffdea598c9e752e87ec47e2a3f203 100644 GIT binary patch delta 35 pcmbQkJe!&OGcPX}0}x!^I$F*cbmEB;|!|+ diff --git a/agent_framework_oci/libs/agent_framework/src/agent_framework/analytics/__pycache__/__init__.cpython-313.pyc b/agent_framework_oci/libs/agent_framework/src/agent_framework/analytics/__pycache__/__init__.cpython-313.pyc index 1d34064ebb26717ce8d1080f17135d21a4a3045d..48f7d5aea53e9b437a3f2cb0086f2fa61c44f781 100644 GIT binary patch delta 36 qcmZ3&vY3VYGcPX}0}x!@I$D`@Fbfv| delta 37 rcmZ3?vV?{EGcPX}0}$N3*|(89i;<^NKR2&LKUv?gxU_h31LI-<(KrkA diff --git a/agent_framework_oci/libs/agent_framework/src/agent_framework/analytics/__pycache__/composite_publisher.cpython-313.pyc b/agent_framework_oci/libs/agent_framework/src/agent_framework/analytics/__pycache__/composite_publisher.cpython-313.pyc index ce6ebcb6672324ec92ef99c1f0f8259dd6f02c9f..4bcd451bd1a146e9e06b4fd39805119358d84e4f 100644 GIT binary patch delta 37 rcmX>ud`y`8GcPX}0}x!@I$md|a6OGcPX}0}$N3*|(8cae|#GcPX}0}$N3*|(AV5ED<8er{fgezLw}acS}98%z}}0QIvC4gdfE 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 c9fa989b361529791c6cc111bf98e792579a366e..384343e178f9bd40cd02cddee5f34a33e9c4afd0 100644 GIT binary patch delta 37 rcmX@^am<7JGcPX}0}x!@I$RSw8 delta 38 scmX@+aomIZGcPX}0}$N3*|(9qjFG2VKR2&LKUv?gxU_h4592N+0R1ElJpcdz 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 617999a03994bb847be55e312bfe147c038f3c2d..ce3475cb7e3944df50c1399c8110dc99cc94687b 100644 GIT binary patch delta 39 tcmbQ$$vCrX=362%*)Hg00dXJPT0t8&&b`RpPN^rpQ7&@>^V7%aV-F}Lkg1s delta 37 rcmZo-X=dU6%*)Hg00eh$_HE?0XXI(t&&?~*Pu6!VE-juM%D5H)#OMof diff --git a/agent_framework_oci/libs/agent_framework/src/agent_framework/analytics/providers/__pycache__/kafka.cpython-313.pyc b/agent_framework_oci/libs/agent_framework/src/agent_framework/analytics/providers/__pycache__/kafka.cpython-313.pyc index deabfe01d4c9b52347aec913eb785f97af65c15c..89213503cf8341e34d0bfccc31f1b8b56984dbcf 100644 GIT binary patch delta 37 rcmbQrH-(S;GcPX}0}x!@I$er{fgeu}J0Okh_asU7T diff --git a/agent_framework_oci/libs/agent_framework/src/agent_framework/analytics/providers/__pycache__/pubsub.cpython-313.pyc b/agent_framework_oci/libs/agent_framework/src/agent_framework/analytics/providers/__pycache__/pubsub.cpython-313.pyc index 7d68a98c1e6efc7f071f663ffdec22376f7a9ba1..5285deb7856c81561c5e4338eba1dee349489b51 100644 GIT binary patch delta 37 rcmbPeHNlGeGcPX}0}x!@I$Lg^w0NRt4*Lg^w0NRtKLEz53$XwI diff --git a/agent_framework_oci/libs/agent_framework/src/agent_framework/channels/__pycache__/adapters.cpython-313.pyc b/agent_framework_oci/libs/agent_framework/src/agent_framework/channels/__pycache__/adapters.cpython-313.pyc index 93d40708992ad82940c2bd62fcda2b2a3e3883fe..a84f951afe8e3f8d65413ce997b3cbbf5cfaf90d 100644 GIT binary patch delta 37 rcmX@Ba7KaqGcPX}0}x!z&(2e>pPN^rpRDg#Tw1(&EBiG*0O&Fd>i_@% diff --git a/agent_framework_oci/libs/agent_framework/src/agent_framework/channels/__pycache__/interruption.cpython-313.pyc b/agent_framework_oci/libs/agent_framework/src/agent_framework/channels/__pycache__/interruption.cpython-313.pyc index bc9e8de75d4d3fc8556f6b6fb96121df04e68352..333f20d82f36aa171d4418ca93be0e4ec40a7ac8 100644 GIT binary patch delta 37 rcmdmKw8Mz|GcPX}0}x!(k;%p2U delta 38 scmdmCw9|m*3M()qNyj%=GaCz&5joix2-0k|gc_sQO`o6)Qo2{51r2zl}n+)*) delta 40 ucmbPzg>lXmM()qNyj%=GaQ|lCMs8(ho(}!oyb}FneaGU`;?0)KkJ11ZJq^+T 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 cef92f3bb0c61e0b7e9d276c76daa09d6a9415a7..5210e7ca305a955e517bce684fa27e19e5cb9938 100644 GIT binary patch delta 39 ucmccroAKUnM()qNyj%=GaCz&5jojOqxEu9z^Gftn^nHUpH=kt^ss;cokPavS delta 40 vcmccjoALf{M()qNyj%=GaQ|lCM(%A)JWcw!c_sSE`i{k=#hcGC2~`6CL6Q#% 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 620bbedab218177b0c64779866ab81c6aaed7266..4dc9805c3e3a16cbca04d0aa6f532ec81b0a5a4e 100644 GIT binary patch delta 34 ocmcc4c#VLg^w0NRtF960D3#tGB 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 3ba77e24862c8574ac30b90b4400b8a4be95bb02..3cae7c9c81c32cff96a45d3cad6d6afbb69dceec 100644 GIT binary patch delta 37 rcmZ2tw%CmOGcPX}0}x!@I$Lg^w0Po-SpdS(3=seT diff --git a/agent_framework_oci/libs/agent_framework/src/agent_framework/gateways/__pycache__/mcp_gateway_client.cpython-313.pyc b/agent_framework_oci/libs/agent_framework/src/agent_framework/gateways/__pycache__/mcp_gateway_client.cpython-313.pyc index c05807eda568fbed5996fcc0caa204b13bfa6fea..7909a8a0c8e551cfcc0bc7b9a0e0b4e42564a461 100644 GIT binary patch delta 37 rcmZpbYLVjp%*)Hg00dXIPT0tOf|0vXKR2&LKSkd+*mLuJMm25#(Jl*j delta 38 scmZpXYL(*t%*)Hg00j4L_HE=o!N}93pPN^rpRDg#Tw1*O9-|sJ0OOeqRsaA1 diff --git a/agent_framework_oci/libs/agent_framework/src/agent_framework/global_supervisor/router.py b/agent_framework_oci/libs/agent_framework/src/agent_framework/global_supervisor/router.py index c731bc5..dcf2392 100644 --- a/agent_framework_oci/libs/agent_framework/src/agent_framework/global_supervisor/router.py +++ b/agent_framework_oci/libs/agent_framework/src/agent_framework/global_supervisor/router.py @@ -1,5 +1,7 @@ from __future__ import annotations +from agent_framework.llm.structured_output import parse_json_object + import json import logging import re @@ -246,13 +248,4 @@ class GlobalSupervisorRouter: return text.strip() def _parse_json(self, raw: Any) -> dict[str, Any]: - if isinstance(raw, dict): - return raw - text = str(raw).strip() - if text.startswith("```"): - text = re.sub(r"^```(?:json)?", "", text).strip() - text = re.sub(r"```$", "", text).strip() - match = re.search(r"\{.*\}", text, flags=re.S) - if match: - text = match.group(0) - return json.loads(text) + return parse_json_object(raw) diff --git a/agent_framework_oci/libs/agent_framework/src/agent_framework/guardrails/__pycache__/__init__.cpython-313.pyc b/agent_framework_oci/libs/agent_framework/src/agent_framework/guardrails/__pycache__/__init__.cpython-313.pyc index 9c16e82eb33d5fc4b020fa9c9e4f24219525c666..4734a86a2d09b1ff5ee038ccdc3d0c41768ad2ed 100644 GIT binary patch delta 36 qcmcb|eV3d2GcPX}0}x!_GcPX}0}$N1*|(AVBMVQJer{fgezLw}acS{ncGhbE?4=CA diff --git a/agent_framework_oci/libs/agent_framework/src/agent_framework/guardrails/__pycache__/base.cpython-313.pyc b/agent_framework_oci/libs/agent_framework/src/agent_framework/guardrails/__pycache__/base.cpython-313.pyc index 6d2e1214038a8d95a4bc06b1ecf907e2dbd8b329..06f9eae6376e72d5aa0beb303a38416ef7eeace1 100644 GIT binary patch delta 37 rcmaFBb)Sp-GcPX}0}x!FB5mEer{fgeu}tlb5pL=3kG4qdkNwkj3)_cAtEy5}wX9SLiK?ym)1Gq& z2tVjp{^pzWxQ}zsIWt$^X8-;w3*8Te0t#NA{`k^z_8Xz~mD@~F-cjNTS2#;6DF!S` zTurMf4K&HMv%DWGIc=x1hQngSkZM#|| zgF49r=};;RVabE(`cwoW(Fz&Wr5jR>&?pt5bW^Gsnk5gX*Q8pYMe_Re+SEE&CwU~j zKGh1Xk~gH=QX61{Sxd^C7Yxq2HW@mALQ{?W!baLAjyY# zH*x6W!@Nhbe!iV=mTZ9U;0ehF`3T=4*%05!x3*TuWti{cqr8{IIMjB&n{SgQJNO=+ zlx&1+^4FKt+LizJ<9m6(97BbjOIl*=E-qb3Fehjf3PsznbH##%j}0XQEK^^$iUqys zU060VcGahv9wi*sJs{?zHP9;1r zfOp4}&1GyyTQY4JqUlseP4+t;oWr(M6hx!2Q}DWeHYZ-Mdtu!5$>%KF@hlf}1sFyf z*ONIK80Rd^M+JQlose#xx53ERx=kdFvKi44TACR}mLbDOmk)`iDD3_zB=2B^PCV8g zQMNziF{M*EL2Hs%jbg09nK13SDh7g035`pvtaXmg`x0|ZP9BZAKE|v!Y%lC_~VIB#%6w7fB1Io;d>fsA6RubK=9Q- zNO^lhul7Fc6}uzzY@hg6q=W4gA4N8JkE4MuoXBQ2Dzt`6`Vo9iXpRb|X?U-IS+y26OXfbdU0q5P1H;377;M~bx zmPZc<#I23p?3(!7#>q8upu^;rBUmQbB*xoMxf*v05}uYe;z#XPM6TlrA2HJL7K@2r zbX@l($ZAXVLiDZ{94Ee=;J8?cy|DiTQb)7O3vOO^(_=`Vn?9z`jL*$Y&Q5VSN!IhE z@EN6&S;)d6dhlAMe9nd!g+CtmQ9R+87>)8u_w02~Y&A`>&H+2Kchj zx3#W+SgQ-=Tt2Ipptw@9;XSk&u6}ddD8n55RdVX!>Rw(WciIqk4ahtGrLqB8Fmib} zD^xkYQ-=dB=JKXqFjmafPGa;$y;sqfi#PgW7^nC9rnM<5N+J`96Y0tp#fUFKlF&hT6T?QSf}V zI<#M7H^jeoY>HLMmd3-3{sHkD1SGW{7m(OH(&oL1qP&helF8(}>sAS%OY}?8sbaxIA32pAR2Jy(9t{t_M}~U2X{nbx|Man*7^c;#esy`5 z$!OJ5dLMZ-T;<`0+#u2{a$W8weQu=X);}PX^u0rj;)Fqv8MYc4Vu|n*($)2>u2&wH zoC(jYqR6eeC$~Di+|Dj1pzDieJPK3SfwI?$8%t)v))xWm@LUnjB=h-|Bu22DA*-xj zEZe2B?Y<2?^icu7q}9q!>a#DDa)l*%*p4q-l&Q#kB0SN_{GxwifCa?DL>CK+ixW{+ zhw^peXA^!FlI+jO!s7FZ7^@fc2jZ0oEoW`U$mbTou+41J?KM^s=UA2<%vt{wEf`Cd znUT%SX?>dBJX-=ZXrkd;o?>7Z&r_2W)dQO=vSVJP4ZcC}Cc#?-Um=iHRIlq#d~jhH zWgUHu^i-B^ZE<4so|dmrS)Q_Ix`lk56gLT|Y-C>q`sRTi*=uX}tQ525yg3G+qmbd> i>P5uw1IGTObp2JC5HC%B&*x#Y?4MzgIC#!O&i@0ibKk1~ delta 3324 zcmZ`*Z){W76@T~nPaHdrP5zKSgv3c4hzU4xNC*i@XhOpldnAyX(3S+ehx3v;IJSG< zGthLK*}9^ZZmiAKR5op;-B{acNJX+*t=*=Tec1YC5-Zy}o)DX~ePR7VMWt0}(ss@@ z5GJu_`S*VBoOAEF_uO;Nd;dDaE_|DLZ+pFN1+N>|&MtlQvbQe(Tc#-ARoWD;a28Xd z3|N4;8dE`)cN^H`-41rV+hUHW6P(h<9xI8uz!gyDTrCQBaA!Y_E#aE_ zV|CGbsF!?QY(umG8YHiXZHzWTqvVybrf2{Hl2^r=qb<;ayc$~hdI<6wXydi8iPz;} zGq2|xcmv-Uwm~~@oD1=$%@`ma;LTkOwn#~fl(a$z@8S_2tXG!oOANO1Zr(;5w(;$J zlVoAu!#7LT$$NRbWLQSud%uV^Iwa-NdCUA!d2BbUI^dW-^mD3Y%5c!GeV?CABKsB=(dZEIZw~ zoHjcXog+rh5En|HbL_-ndkbNAl^PjDIuWu%7v3%Vd@^BLwng29Zkk!O)Nq$&&uU;A zDhdJt=o3a+7n>3n$_|Yb$E1>mY1x-D$uw+7o8m}j*+4sCV7e(d2GR1y^^+!O2{UdI ziK1*m?Dj6U^dn1<;l0a=#HJ|hc8|=~Mn(MI7jVrez0yd$-dVXWfzv9pWGJsGmtcL> zjEMuD>N;8|UTHSN+KW`t&_{6^`wW}%h)+G0-Po0^)ON`8i0`Kiq+(Nd|*34Pvjq_m@Y%5s9P8JTp*iSficiZj~0VU>=ZOz2rU zT}uVsavHh@i6}9s}%H*386{_sq%BK}!E$%e&%uZi`EL%s&b5fmoGGro4#FE03A z3LL`ckPW8s1~Ukjd;AL%lT%}RM)(-Y$HhT^Q=`n&iughj3^NY;qJAYZx%E0oG|*B*;q%X zWKqB#k!aY&E{Zb^W7Tq^{iuZ$!7@RM_(#K$qNeDAgvX?fcx0(ZUdC-!nVy>vtt5t>*EhJNVJgqJ3_bXc1!vV*eIKg8g6b@qaCc=|8HYi?= z)b>(~vFsG-kPG(GLkZ|cCUsl~PA;jP%S{$fT;@VVd=lyI{~2j6A{f+8X;b&MRZIJk z%UH-jLN~A^v{XEmT808z&K3@KkJ{Kf;(NWV!FOpAa)jCbHt}}|NP0Kl>BaH4-VKiT zP?TNWG0om6%LNw0yv4GeK_QNz+jFHd}c12(u)@1aQHCDVR<(W34A3mkxA<~M!J%d z%9{QQ`IAnskyB@}K%`#o{Nww2Vwi@jB#`>GTdb z$;6UdzjS|QxgLrW24PJvrDPc@e?Ypnp0)L^dBQW}3P`8&wT=QA?99OA}EGjpwuMp&un9&KT6F*6!q9u(J#v!kV~ zOtMSJyyE@QAS)Mt9c|0|a8|1(p{0^XK{NIFaIv!(Vf3&hyO>q?5G`nnhMtfO&Z>Wy zUO%1%G^n8I*FVI-%$%e~DW2Wao|j$odD`9!1ZN1&5`2q5mW3}Kf8fg#<01>=Wztif z6^n(wJKzWby+&od$qrep%mT^YBcM8vT@d<-1^W;!*WhwyK9|ym;S+qsuO`I^A>#K1 aV>gr*ap2LPINfZ5eO532{pblhjr=csP91ju diff --git a/agent_framework_oci/libs/agent_framework/src/agent_framework/guardrails/__pycache__/llm_rails.cpython-313.pyc b/agent_framework_oci/libs/agent_framework/src/agent_framework/guardrails/__pycache__/llm_rails.cpython-313.pyc index 5bc087352db5e94a9fd25ee2b8571a723dc815d7..edb612d0812b21d0a7df93138ba2e2bbb81d4f5e 100644 GIT binary patch delta 1316 zcmZ8g-ER{|5Z}$69oy$~&Q2N<3$POi;shkBXxbDCwWw4TJA{t|fgs{~I2SACd}qy_ z6{SK7ukch@rRsa1qPD73i~j?uJgq>$Lmw($kn#^OvnHf)(*Ab#Hy=AQH@kE4x7osu zY33My&z}6;er!D|OlRHIvbC9dD<pzNSb7^>C7$sh^7KQOPm&L9JvG2CyD0HJcZNHg3di8`C z`oHkMd2O37*_zaXpaVq;UZN1X)MGzbh0lojK*u^BtN6*E<~m_Aw=#FZIWHb)TfE$_ z=&#be_}G}?6>-G4{-tu7CHFZ5SpaX{#XDRtjMsgzQ*e-U6@n84#|f&UZ`|cYQOS=V z`$S(wy*)ZeC`-1ams-nDU`qU$x6$ii{?q}=US?gl8F+E*x-#Rsq1W+U*UrJXc%2`e zoFa>K7otu#ks78Y^%XDipdw835Z@<0H;?j4|E9SybcTZMwP49k4-RRfRefKRq^uTD zLjAWyD7GdnYk!6^#hcHHFRTSiRYcdr1i|;>o^@cXOyWKQV;2hIPwRMEDGc$_0)ACo zDc;~E@q4kpV4;;gBvWy(>w^kp>p;^r$W0}429LY{>i!`3gg8+;$Zv|pQgu^BzDRNO z{}r@X2Ifog>I4mfMS=?ipOmnKoHXBeyXgl3_L+mao(8)%xcf4B5?sX<&xkiAdr;lw zetGmBpQL_CZ7ob>YBh+w1XMG1sENPEDkG{l^Av*MwszAqMh^xT-=WTK zv0EQ>*Vyh8JIr7Vl|VC$NuI+kCbQ}w$*)L9&?be6aGyOl_W$bqV@y5Or+}J<{i@*x zn?DeqCm;!FiUw*f_SmA#x$bH&=>d)(P=<2GYx!Z~t^$tadIWc8@kPwW3G|v|wc?&=Qd>vz1^hYXp~gvl&EgGIE&i8xK98YR_s)i_lf t{cu%N(T7Sr!3z=*;)VYJAsXc&?kXT&`-aqK1T*V8L0#$QcIUVAo7vf& z`S$haZ$zI*A|V3f&!=DBeb(_H+I8tMtR51B7<8OuD5Ghdd&WJ?BmW9h;IE9U887n! zrW)RHU&hb;nE(r<$&A8p`IB?K#PAJLV1mIyT?E$t!^8;8_y?62T1{$$pbgDvd)lxO zF|@ntW`{2AZ zJB0+NL5L_b@8!Wu-n5;27Sp}#2x2`b`cdd8QhZzc2xu;b51x7nPXVqcS|RyyFXBR( zw_J9V*TXtkeIFi9Vf-SP&lk$3Z&42T!`-bV2b ziW?|0C|)|kIOs&=MYao8xeR%xOuENce5vI-iipLVE7k8%rGHS=j05Y(Nt$nF@k60 zS#3HESZhq;gLrB5g6lm#b-JSs=hSI@BytQwGH|p4u0eJ*LZ}t^!XML%0 zdu?<_JGP}A+t!ZP$C`fa^V+AiMs>%Z+VZEGvBdiF>heb4T5UybYO(d<)#0@ZJ6i9S z*8BMUj@G}W^*0lTHt2?@G4$2wgVF6o-^y4s9ACe&dZSTT%hs>FH(f62s{o0dQ?~1yM2(vI&&yPkAk z-i}^*61V~})W;c?1Jv>e{Ma=V*V{AD%Dl*ywXcndP(D9bg}Z^y$e?g)q?KfUxiUXr zvgd`*U0Q@clb5XCHXV!kkQ5u52twDLfQ`_AhEORxm#lJGr!v3TUu0l1=OS=np;D}t etx>iF0G6k76U5&NrSuQd%by;+5{S^awD=F+UW!`) diff --git a/agent_framework_oci/libs/agent_framework/src/agent_framework/guardrails/__pycache__/output_supervisor.cpython-313.pyc b/agent_framework_oci/libs/agent_framework/src/agent_framework/guardrails/__pycache__/output_supervisor.cpython-313.pyc index 160e65cbe09abcbfb7d0fd09e0aedf3fa400e103..67c24457d37d2d647815b90403e7762b995290ea 100644 GIT binary patch delta 39 ucmeyom+{kHM()qNyj%=GaAoU+jojb4xSRBI^Gftn^nHUpH}i2n4F&)t<_;79 delta 40 vcmeygm+|vnM()qNyj%=GaPMZ{M(*!iJk9#Kc_sSE`i{k=#hZD#p9TW}Ijs)! diff --git a/agent_framework_oci/libs/agent_framework/src/agent_framework/guardrails/__pycache__/parallel_executor.cpython-313.pyc b/agent_framework_oci/libs/agent_framework/src/agent_framework/guardrails/__pycache__/parallel_executor.cpython-313.pyc index e54d65b835854a3d4fc7ea55f0e25d39f317ba3d..75411936947e4eb318a4ce85d354209e1f79607b 100644 GIT binary patch delta 39 tcmaF9it*VhM()qNyj%=GaAoU+jofam+)etqc_sQO`o6)Qn`2qI0ssx`42u8& delta 40 ucmaF1it+g>M()qNyj%=GaPMZ{Ms7D&o@V{ryb}FneaGU`;>|IvTmb+fz71*s diff --git a/agent_framework_oci/libs/agent_framework/src/agent_framework/guardrails/__pycache__/pipeline.cpython-313.pyc b/agent_framework_oci/libs/agent_framework/src/agent_framework/guardrails/__pycache__/pipeline.cpython-313.pyc index b4ab329bcf115f47eb3155ae0c83574701911061..d9e53cb8d44880c988caadee78747ffec6d54317 100644 GIT binary patch delta 37 rcmeAQ?F{Aq%*)Hg00dXIPT0u(n3=m$KR2&LKSkd+*mLtQ<_T&5<-QEA delta 38 scmeAS?F!}o%*)Hg00j4L_HE>T%*<1zpPN^rpRDg#Tw1*OC-Vd~0QkNQjQ{`u diff --git a/agent_framework_oci/libs/agent_framework/src/agent_framework/guardrails/__pycache__/rail_action.cpython-313.pyc b/agent_framework_oci/libs/agent_framework/src/agent_framework/guardrails/__pycache__/rail_action.cpython-313.pyc index fad910e0f15be1b281d3693037e6bb05cbb5b6f6..59f52bbaccb835cea9da37c8a43634c122b6869c 100644 GIT binary patch delta 37 rcmeBY?PKNs%*)Hg00dXIPT0tu&&XY)pPN^rpQ7&@?76v(k&_Vs#jOg1 delta 38 scmeBU?Pulw%*)Hg00j4L_HE?OXXL5X&&?~*Pu6!VE-l{N%E-wG0N11oVgLXD diff --git a/agent_framework_oci/libs/agent_framework/src/agent_framework/guardrails/__pycache__/rail_decision.cpython-313.pyc b/agent_framework_oci/libs/agent_framework/src/agent_framework/guardrails/__pycache__/rail_decision.cpython-313.pyc index 5fde2c2693ed2b3e634c358680a8c7382e445857..f758829e8ea9d34b026867d9ecf7c8f3759a9fc0 100644 GIT binary patch delta 37 rcmX@cbCiesGcPX}0}x!ier{fgeu}DTR delta 38 scmX@gbBu@kGcPX}0}$N1*|(9qoSCOyKR2&LKUv?gxU_h4FY^v20PF7zqyPW_ diff --git a/agent_framework_oci/libs/agent_framework/src/agent_framework/guardrails/__pycache__/rail_result.cpython-313.pyc b/agent_framework_oci/libs/agent_framework/src/agent_framework/guardrails/__pycache__/rail_result.cpython-313.pyc index 301eb4ea9cd23aba7abcaf879d2ca5bdef261778..66f0d1e600f2666d4472f470091bdb33d30616a1 100644 GIT binary patch delta 37 rcmaFM{)V0VGcPX}0}x!62 delta 38 scmaFE{+6BlGcPX}0}$N1*|(89nTe-XKR2&LKUv?gxU_h4B~vjY0P`vgb^rhX diff --git a/agent_framework_oci/libs/agent_framework/src/agent_framework/guardrails/__pycache__/rails.cpython-313.pyc b/agent_framework_oci/libs/agent_framework/src/agent_framework/guardrails/__pycache__/rails.cpython-313.pyc index cdb5396c2b97159189d8dcbafbf27d0f22506d78..2c248c30f5d073f0eb4a4fc99a90c368db375686 100644 GIT binary patch delta 1781 zcmZ`(TTl~M7~ZqFK(ZlR5-#DE5Fip{5=5iGfHy#_ibB?qV97urn;0%h*aQTtLba{n z*cSTJ0XuZ+Q%8NXJ5Kx1X{Y+4u@k?^;+B5w*-}Zu#HjS{3VJ)FDMBF zPZz^=b_qVwYb2>b8FY-~g4?Qv-aWEPE2W`2vBRj5vPzb6q_7ODVx?@FMart-s-t{|ludV}Iu!qAGAuGyT_-CeM(Pd8 zt!U4LA9NZBwJVrS2Ty*|Aydj`vRO%WjYYz0>!k3Jqtu+u<~R^m-^k>$d7JtX+JL(j zl>4YX5+5?_;73PjG6#F{yKvV=E%;>TBH>UZ>M`_(g3)_7hYg{Mh}jV4L(x!wXejxB z865BNl5--R8xM2+QO?^l<{290BK#!QFiVqq3C(61Nd~;0Xdo2ij}p5!0__+^kHAD{ z8*P@sqfP^}AHT&L0yK46jfpfr7v%Ure-F?3xpA|E-@+gg-@>cT`bJsO?!UPQm|#}$ zvn`^n#wQO^(Xu?0)TsLfw-Mz~m--_EGcMr$h z!*O?LMQfUGT9m<&xV9{&E&Ew(irHM#smq%1Un)wa74@ZYeM3y&@QrIl-yTyHPPhK5 z$$y$#D(Z^9&|TAsg$A+Us5n`=ZPl_{wC)$ncZsITHHEA=XN_Ur8S7z zx`nQ}E-|lA%U{me+IGU7~0j46pT z6)~pbMqZq$i7_=#HTtbe`&YNuV}VJckRrtj3I$P6q^Z|)sEk4}GkZZdrxUe0QL|qx z(65>-;0NUX z#(VOEwK&B0;p}mImB=hMCI&rSU!f+*I<*fa1pBEch(3g%syjfZ(85CZ6$zbALuqeJ z?j_f#AO7y$MXP9`+OrcO9~dTzm=h#HAccmjedXu`%ncrbSADs(mKHMmmyz5>7+vtY z*N5D2oI6Dq&~S@0q8@m}wIdG{`|=dMm~+xhV~2e{3*sQ?E7OePSb`Z1_H%sH69`5p zlK%Pdy-!c)(Xi_Kg&82y1hh2V_v_I>(%f=7lQz=Afzy`}dIuf^=4cZwbPp&IbC&Q4 z7-<+8)T6VQ-;Jt-KL&j?dKVnQhp1X83H2c56k!smf-7MIno0_zA@pco0!=n70k z+~|FXM;cIrpp8}|>1E7@-mqc&45=khi+^H~EZpl4D3QsYY8F-6sg{>gnQUCb7myLm z0E`Z$H)C2N#oltV$KG;`KL_fuRx}TtWA*5;FgMnO4^XU delta 1444 zcmZ8gZ%k8H6o2RP`k;MKq^gy163%4;VTv{s;{QrhmdwF+(p z71V_}%+ZL;636~zW?we?GkdoTO?H#_J9+1v z-#O>r-@QZclFO%v_EABBhEdk-snZ8;?z^mgsLD^4cZcKUZRJ~IiI~iDT@5_1BphQH zc(k2hzj#H{qNWtOaHnet9C#zbRVsr?M*MwOIgzen zcvsVlQc7uSXQzekU@R642fR@!5|6Y+LNRYF8tLi?OIgkiB};0c;KWy(H#*q=yKm4k zc~TioSx14Mu2e@Mqrh~L*V*K7Ikq|Kz0R#JS8Y?Hw220*l!@$lm~LKSH^S``b{VEGJN4Azaq`AnB-Td`PG*UUzons zP4bm#zH&xy`Ox*5XVf#sj@O1CFibDh5yiYt8mQ@kMl#DV1_%8qaFC4IGHKqBHg6a+ zd}F$%yVg8mZcOJ1Cv!8ruIhZxh%~`lm6DmoOV4}Gcrrq9W=UJd@?7Sn>hVyoQlg$X zX+6_UGRt!Y?E{7@(9UV`=5C{P%sbw?FSGLbSyhfvJIkvVX&x|YwdT(lr|j}*O-YRv zZ7tuy7QEN88K&g5ty2Id%-tI#w?LNmzLP_K0es?1bNi@lUhL~M;r;z4atCC-Z5@#P zfIrt1^E+si!Y#l+yN&Ds99=HpMX3ybY&Vj-Am3{r2hK&)-1x2E4<57!c9Z*n0|6_v z;H7}mx<`pl>pFd*P@*ju_QivduvZGkx};Vm;Ib2?y{WT|_y8~Nw;H53X*!<>w{=Ky zUoad$oE@)<+ynf&^QX0b+Ka+n<%{W*?G7>--q=@@$v5=X{=w#|Vj!8R{{DqwOHqBG zh&%?l_`nH(B!1F$hWm@MZ{z58JvN3O@ds&D3XcKnyDjA4GwxU2MquO{-F^aZVMX+N zVCBD~UeFw&6bcM>NG0UR0;2}<(OHTAz^_<^8G{wz%eXIuG9=r zI)!{}NS2TRz;u;>Cz4{JpghXy+@@NWx2d*XI)uL^>tGmPIJ6Op<OEht-Urfw6NJyJl$&moBVMvn*)t_>FpSNfW;{%CsD#Vlu~7i zV>D%g8oZh^aUW6lr#O>(4eYX|?{io)LOm30%C?{CxtQvyqk3voJK1?XN94KwD6wSk qWcC(hMa#;NJGcPX}0}x!;M1& 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 213473b72baa2148268a3b30f2f832e8470c0fb8..c7c88fae40bc53c23f41933cce7061912658d8cf 100644 GIT binary patch delta 37 rcmeAZ?iJ?#%*)Hg00dXIPT0sjhmE^gKR2&LKSkd+*mLt{w%beq&%z7a delta 38 scmeAb?i1$z%*)Hg00j4L_HE>z!^YF1pPN^rpRDg#Tw1(&6WeVj0OAY`x&QzG 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 16e85145cfbe66cf4a32c6cfa997434f557458da..908bd598371ee297618f807b3f6b0b146f1bced4 100644 GIT binary patch delta 37 rcmZn?Y!u}F%*)Hg00dXIPT0t;#>zceKR2&LKSkd+*mJWjt1B}A!2AkK delta 38 scmZn^Y!c-D%*)Hg00j4L_HE==W96BmpPN^rpRDg#Tw1)@hSilB0Mf$?D*ylh 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 a7fdcd90fc601e77bb7873fbefc556039066c4b8..b12fd6434e269fc0e7256170cdbcdf197d92d196 100644 GIT binary patch delta 37 rcmexn`qh;CGcPX}0}x!kb5Mr+GcPX}0}x!ob4Z5!GcPX}0}$N1*|(AVFAGn*er{fgezLw}acS{pVOBj(0QYMQPyhe` 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 1f2be21c3566bf881192bb0d678847b72f9aac55..f7ce81514ee375cf6d916675c6176621eb66eb16 100644 GIT binary patch delta 37 rcmca1dtH|MGcPX}0}x!jzBg5;V!Z diff --git a/agent_framework_oci/libs/agent_framework/src/agent_framework/guardrails/calibrated/prompts/__pycache__/__init__.cpython-313.pyc b/agent_framework_oci/libs/agent_framework/src/agent_framework/guardrails/calibrated/prompts/__pycache__/__init__.cpython-313.pyc index 302268806a23df13cb029455c611d5586b429f28..07e87cec0394f8ac51a28236148f35ae4b418a6e 100644 GIT binary patch delta 36 qcmcb`e3O~`GcPX}0}x!KO=XKer{fgeu}z>% diff --git a/agent_framework_oci/libs/agent_framework/src/agent_framework/guardrails/calibrated/prompts/__pycache__/ausencia_oferta_proativa.cpython-313.pyc b/agent_framework_oci/libs/agent_framework/src/agent_framework/guardrails/calibrated/prompts/__pycache__/ausencia_oferta_proativa.cpython-313.pyc index f64d5da0a2d251e8e889bee025943bbb017d6491..b9fd59f1a92b0e24c0faa13373b6c85d5c937773 100644 GIT binary patch delta 37 rcmZpQXpG?g%*)Hg00dXIPT0u3P>Xwxer{fgeu}hht3M%*)Hg00j4L_HE>zuFTV?pPN^rpRDg#Tw1(&t#Se*0P{Tz<^TWy diff --git a/agent_framework_oci/libs/agent_framework/src/agent_framework/guardrails/calibrated/prompts/__pycache__/dlex_in.cpython-313.pyc b/agent_framework_oci/libs/agent_framework/src/agent_framework/guardrails/calibrated/prompts/__pycache__/dlex_in.cpython-313.pyc index c36a2d406bc48f9a18cae831d8fe43b935ea25c2..b4a792a82e87018ab910ab4c1d9a50ec0bdf7552 100644 GIT binary patch delta 37 rcmbQqHG_-$GcPX}0}x!3tN;K2 diff --git a/agent_framework_oci/libs/agent_framework/src/agent_framework/guardrails/calibrated/prompts/__pycache__/dlex_out.cpython-313.pyc b/agent_framework_oci/libs/agent_framework/src/agent_framework/guardrails/calibrated/prompts/__pycache__/dlex_out.cpython-313.pyc index f1b478fe3db138fd31d5e0dee7ff982b85234159..8905a4e08d0c8136a9a33254023d4498f1dcd4e2 100644 GIT binary patch delta 37 rcmdnNvz>?gGcPX}0}x!};25*Yy}b`Hb< 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 12cab79bc540b9806b0257b5957964b81bd42932..62ca20f287547b60d9fbb2e8c2c1af933c413793 100644 GIT binary patch delta 37 rcmaFq_`;F^ZrE@h@~ diff --git a/agent_framework_oci/libs/agent_framework/src/agent_framework/guardrails/calibrated/rails/__pycache__/__init__.cpython-313.pyc b/agent_framework_oci/libs/agent_framework/src/agent_framework/guardrails/calibrated/rails/__pycache__/__init__.cpython-313.pyc index bf039b97098cba606514b4ae1aebad88e93cb534..92b74c06b371b8815c37680f901d454bd449be85 100644 GIT binary patch delta 36 qcmZqR{m;YwnU|M~0SK;aov@L6AuD&6er{fgeu}!fKR2&LKUv?gxU_ikcGeRB;!zCi diff --git a/agent_framework_oci/libs/agent_framework/src/agent_framework/guardrails/calibrated/rails/__pycache__/alcada.cpython-313.pyc b/agent_framework_oci/libs/agent_framework/src/agent_framework/guardrails/calibrated/rails/__pycache__/alcada.cpython-313.pyc index bcc4b673e58648fccd29d71c007f60a78bbcec54..96af157e1e35b5c3c8f616a0a2110382840b55fd 100644 GIT binary patch delta 37 rcmeBBZ&&C3%*)Hg00dXIPT0u(nvJ_dKR2&LKSkd+*mE-zdm9e`)>aEp delta 38 scmZoy?@;Id%*)Hg00j4L_HE>T&BoKIpPN^rpRDg#Tw1)Dk-d!v0O=46F8}}l diff --git a/agent_framework_oci/libs/agent_framework/src/agent_framework/guardrails/calibrated/rails/__pycache__/anatel.cpython-313.pyc b/agent_framework_oci/libs/agent_framework/src/agent_framework/guardrails/calibrated/rails/__pycache__/anatel.cpython-313.pyc index 601538eef1c9d3f1f704e3f8cb3dde3a72f6c69d..a6393b442f0b35fa4b2ceefea9fecda923536769 100644 GIT binary patch delta 37 rcmdn%zQ>*WGcPX}0}x!qN4er{fgezLw}acS{pZk~7%g5Pr|Q{{N}d#5i_?vvK~sRY{aIfvPD{NoXiGL^K-$QVJ`_*;r0(ubExb zrfQX5E0yx|gg5{~;(&w@Qc=W(L#2i@Ql)}~R;Ypl;s6Iw;J^WincbMQVlB-p(-<&~YrYaM`oO1`sB|rEP zlS=^z;M-pc7DEt1UqB0%!o>(gicyFbV-Rz(P$^zaKtf^X14}u&?%^lT&L^k2i=AQ6 zrG?>eFUvD6l4V+S+UEsBcaHu4rzNylmTk(=qeZp&xDQfQSv~Z{{e@sk*EWrcy)zWL73Hm+@4C-Q(VOFqraits{=D|AP}86CYvNw|Ozbe;XHhi@^oXHe zC3&3yKZ>ucr81&ES2Pu~5E1RP}iEpv>&BQjaacrrWEm8I|_ z6w;~qwd`c_Jpwuv_dt4QCwo=m-C`m)Ix~U31@C^p6U1xHi^e+iA?gIcC}XSOC>k(| zVp)}7iVSkYv=F%wo)=%`9)GEefG`QSVDhUWw*^kHVm58#k`0pxI~ge122It6lc1r@ zh{nk4$~lDg2T`_bxE)Zg)yJ@N?Fx3+SQr0{Y^0u~G&Cf53`OlvEMAR?OQW;1AS2*J zR?79ZaR$HyC%nAX@>H0o6U1PcL!m~z;kh*t17Je%LjTx*$t~K44g+XwDCT5Ge1nSh zHxrA6g~0J!^Y`*6#D|5esq_coyV3j}3;0j{5K6q6xSsevri*EHczcR{9-S+&J5!Ol zVd>6n-<%@tW;yD+il1a5Io~Jkp2*IprLWU|)ZM!}RT9Nq-nzBBjP*2^!1O&XbuK6E zcB^iz60eRa*tS>HN8l`aoo(dMMw@!5>p)X>hRao>Y3mz+9J^@3g|T|Q@j$0_vu(H9 zw%1Xa{;8Z`-Kt;g~nCan`X<&l3D)-aZsYTZQfyTm#F!>4ljuVv2o;LmJc+&Fqg HCLaC^T2o%M delta 1563 zcmZ8hO>7%g5Z>oq|HgKle|rPT#%-KzY9(pXBBi7aNtysQ1SOlcf)p&**;o$tt~I-X zrfLZ{R29)iPd)U6lp+BKB*5Yht;B^3hy$=f2u>hQK>;K#h?%vW08jF~dEdPG*_rQo z@8X*mBL|U4NWk^OcW-Up-;E@8KE}gcK@&jGnC8i{j0Zdl>0(v{(cLAGaF?>)j1PQh z^J>1VKNEmJCJ4by2tqFA&$eX35LSfC(uzze{=1UG<>+Zv$DmaUKrAjK1+6tG3tH&3 zr(tN@{j{qqqP57vrUdO;NDGg7pra_N(T{#z^w$;wAGR=~_GiaaV)*u0#jwW;W3$$l z#h>nZpS{KpdKSWM7|EhM3Uu)EaV7Q!0bUfZ3qQ8Tp_|+BW#;9d$DioyL(~zAx~+PE z{D1(9YEj7hcw&Ox;+GN%>*iMz+AIZuAc=kys_4Y3U{@c$UyxI63A#?rI;?nCo`~HgpjmMzbl1L?Z-}g&FZT^SK907i9s{5(?013BXva12N1&+U9 z8n%AbhLZ?7lD!26P*Rwna}cc?C8%J|Q+T#0hSFHrv10!)yT|YJ|FqLhF0Ck*R2(E7 z{3xhKis(p7rlDhxW(X858yfnx5bDZx<= zD3`04>sw{g`MxrIypw_la7I-f?Cp9NlH^LwskiAYpC0HW7z zccMJZqEJKiX}hHnWni4|5A}~8X0nKJP0G+SqdQYg@dYZDhw-z+i^0^pBYPw7Y4^wY z&EXrpZQq2IufobZ>X$9)1HtE={yq@B9laU-HvByARR?!wgb%vsCWX&tLUZHdgWw}` zC&UMXjPw&;l9TfMN%3Jso==Mp(_Ylwq|I_^nl9trk8rtO*Ieq;hqAsKUSH*j`6*b>k@hW1Ay8~LjV8( diff --git a/agent_framework_oci/libs/agent_framework/src/agent_framework/guardrails/calibrated/rails/__pycache__/dlex_in.cpython-313.pyc b/agent_framework_oci/libs/agent_framework/src/agent_framework/guardrails/calibrated/rails/__pycache__/dlex_in.cpython-313.pyc index 458a998a9f85170e4fa9c570797b16a5dfe3b232..b764e2a7b4a301b9b61e150e4a79b7d779ebef44 100644 GIT binary patch delta 37 scmca0d0vwHGcPX}0}x!vc|nr#RT60Q%Mqxc~qF 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 803056f29f6ca30387e8a722a24611c50c0e842e..ca914133257461b3d45a4456f965bb196e6e21eb 100644 GIT binary patch delta 37 rcmZpXYL?>u%*)Hg00dXIPT0tOgq6EXKR2&LKSkd+*mLu3R!w#Q(QpfW delta 38 scmZpcYLVjp%*)Hg00j4L_HE=o!phUFpPN^rpRDg#Tw1*O7ON&Z0OR5eTmS$7 diff --git a/agent_framework_oci/libs/agent_framework/src/agent_framework/guardrails/calibrated/rails/__pycache__/ragsec.cpython-313.pyc b/agent_framework_oci/libs/agent_framework/src/agent_framework/guardrails/calibrated/rails/__pycache__/ragsec.cpython-313.pyc index 9576f690cc1983b523cdadb84133616dbfb483ce..e3e74e40e95962cee4ad441d453528122963a586 100644 GIT binary patch delta 1311 zcmY*YO>7%g5Pole{Ij-eJGRrhNgK-!P3@$%5^zh^2$IHWiCt{sRgfS^tBt*}oY=e8 z?3#)S0Y~7}@`QwtI3T2oYl%QTR0wDe9N++oKw2&ciE}{}f+KGhyTFt7+nI0X&CHuO z?{?vbLgZm2q7c50KE1hj_f{nR{5xEEm#74YN>!mos{#lal*O7@l|b@jsV0NWIjQCY zpDL@qn!g%=Ks5-#ssal4kyU>!R1HHoLtgSVPu?1&&K)aL%tQ!8)d0j!kStMyCyA<* zg%KZDl@f)Cj+77G`Q(m}%2PK!(7`seJ=-!hYiG}BIR`EAI;FXTpQL*N4YK$AXG3q6 z`leHAm!4HO*f;(UXp!v&8t0=ts*Nc#5a;MhEvs#~(Wc(9jaF0d_KHY6iC!{?H^|S? zlCycy4Gg*iqt`VJn8q+-$8hojV04eLvHA?p!QKik&}H^naE5wO zRE)}xkkFdzSJ&&>m20b4waYJPYmLe}jAF+IVD$%%UEI}sy&b)^4_Sn}S8LntM z01|g$@5koC0rZu2EUO2n*|)Kokay?voP`4WGnP&NlacFokV9s?_$VyJv%V@C&axNd z)yeYHUxaTQ;T2Q>|Xr)LSSu)++R{E%i{gza^-?}xJbEtctPfv zr-1e5X+1ANjNP3mUAoM5cmhcQP`;t?k~6Pn>XvDYD7c7b3A{pm=t4Ayo!~V; z#5ZYrTOT+E0QT4o^4E9G>U6kXLAUb=mk_WT*RN^(A@LgiU%ney?py6)&v*({?uJjr e-sJF`NGbhYh*If~457JS1+vC|Nv=qEyuSe;)E6QE delta 1271 zcmZ8hPi)&{6#qWkiDSoJlBT68U1^$5g@iUatQ`ir|FAVTY-gAytF@LE?tsFf<9H(I4u%O1S*?;FBxvr~1g%54rO>F$fTY8p0}V3Lq5G7FR_Ooo3fkYiCYy zh5+e{kmWj(Y=6s%GHt69ICk6Wx>W?uU{->w_sQ>>VaT(L@+Os-rHs^uI9e8?RIl4} z+^*-qDAI@>CoBtq>@g7Fq($C?eWOg%I=ioo)0oAOu%1SFv)wq~Xqm5GSUhhoT{M^1 zRvK{3o$Z0Y(+h*@Wy^IhS@t$eAnzDf9```tagRN9iY~C*D)#t8oyy@_VHi`6-;@>7 z)0Gtj`Y$yIdG6Xr3*{CUng2vW=)=#Lm%g*WNjC6(Vrk>D{wF1}F7?0E8eNyX#0HKS z%X)%+rwuVrE3ogiLAIxzOb_;B?Fn{U8>R*JKpUr{?2$H^EA?ZB_L6jpY>cuQ{rRzh zJ}MLI93ftE<1xoD=g237b=oelk9E#-a9w{x7%cFTC<%@g_+AU9xd$^Wmpwfcn;3-| zRL^i#9$*)B}Vh3bnp^N04Y)uo@S zOZ&55*7xdP+4~DWitI4=OC`U2mfSt7He~UhJl7D!d-IgrKL`n~%M@_(GHsP5$grCO zwU?K<52q0n0PS~GK78@LV$1iOV+iUPmLMJ#&qACCGArd*PUX1I4>tHc2f}yaUBrum zNlctVwaBjJM@QoGh36-}Lx6t{v6^7F^4nMA0Al4Fyv`qyYMPgK!(DJp6GY6NMO1eE zPN(a2BE|N-5G*?kAf70RDe;EWuDfGeTUIZ008&__@OyTF*KxmrX)mCfM}-X|*)*-X u>+(KNju@rpcl@ng*LelnJP&V0(BkSZky84%kfG8)MM5Xpz|c7f$NvxD$p!oX diff --git a/agent_framework_oci/libs/agent_framework/src/agent_framework/guardrails/calibrated/rails/__pycache__/revprec.cpython-313.pyc b/agent_framework_oci/libs/agent_framework/src/agent_framework/guardrails/calibrated/rails/__pycache__/revprec.cpython-313.pyc index 1bd263f48521c4b2ae455ad829c31df68b6deee7..02973ae3eec91093192a9ab0e14b61fff4204563 100644 GIT binary patch delta 1323 zcmZWoU1%It6ux(NW_M=xC%efe-OaYil0?!?OqP~zLrAn~vMFXarZ&?^C52(KnXa2` zW|lK|jfymV^+jwiJ{A>x5CuVlFQQOv5TArdpfL5PAR@kqBEG8k%y!L#^YG2N-}yi1 z-jBw97>oTGi)loBN1wjA_4(~s=J`9~@D|Yt5S{9Q3M~g9kV83G36>?0d|9fRN$9cTLJiKK|spKyRLU$)*XeWo)^QZ8#fSR+a6)5!|J8Xg?&s7oaNtFnl`l zdSS*CMsnGYwtuDkD9Y-~>9P(WuiwGBS}^M55C{ zN_4Oi$R+RSG{e={a5C4?>CtIvgsf-yQ?c<=i4Gek<{Tk*X#F@wFJ_PfYjm}b-;Iel z`(MOn1F4K~@j_skVwo#2Ax<#KV~KMYd=a%Ui7+T2pY+t0Yk|S6mzftgYnIK79gCTp zCNm)}EWA+Ne#zOkAj5AZQZh(_W zuU&qS{B}%PI7{xI)k?F$`?JN;RPf*o74pH9EHF>~((`mBFF}Ie>n_a9WA<|b#LYnY zRn29Pdo8!(*w$kTrco_{UuX#JeJ6#F^^~sR)WsbIr)dFu1^g-E0AU1S6k$$)*J~Iq zGg-ZAn2bSvqs1)OFxvMlg;q%faf{k8#J}p<-t!g6<$K^6@$)ppxY1%Qu!L(6i6`2d zxdG;mwd=t4WTUY&DLQCX(Q4ChTCCY({&GACU$GZ%IJFwCL#;YC1GCCp@S6%_Zhv_Z z5yTLi-fJ=o09WCu;@K?=M{zEp-Fbu=1T4=B8;03v{I4HRncZduOfk5Y3n+R<<{A? zX4fE4B{-pq0}?#Aph^LiGgZk2RRvWgd>pvI0mKSb`~`>#apC}PHZeIchj}x<`OUm} z^WN^m;-^LZPhHmtmxsT+bG7%bK6dUc?tDNj0>q-0P@`1=1OsicCW08P5=fS0$u+qe zgIHAorK*C;Ig%Bt#j6@<2Dv1$N6G9{1#&4_rdXd4&@Baq@}xj4^)RvGWnmv5w&EoU zskUfpcfR~p*tspfN~y6kD}N$Tm3^-~k$k(fPOm}^BVwrbIz6Y` zaUB@vKq$7Iz!U(BM}Uug8o0&%_#8dPevePls4|tGg23PeS$+aHF-G5KHxdsjJfVS2MN&@@Xao;_3+_d*6~;6x&^ z66~U$A88c+1Cqz2Bb>m_>PII=2B<=srwDOljf3i=QFURzdWPNAlXQINTYX8$=6PBe z1E=YG?m9flJ(y#osfAo*Vie|3O>$+9u*<2(N;)^gSjTjzD@<%FUi zKqy`1a)`Fh{!Ld0m)bKc%J;(cKoYviV-RFt)cbcl|h5#z6RuA5YK3 z&SId*Hq+Jo{BxgY?zMiNU;bf!`R2m*;)jbLwQfHDoyd06KNd49C&*VPv{gmiRm!V^ zxVuET{k0%-ZBoF-O}cJMFwE|cl#b&~!!rm9fcEPe@7=g=tb4Ar55XdaC5Sr3M-dT0 zVa3ep7t`G5PZzwN1Ho(2D55#R3=$tlRY6M5w)t>^PRniv0d%hP1IM@Rz2}!f7QQ6F ze?X)R_D$y68&Lo;GY#kY5^A>nazE&U!&61%E+DFOy>`3fw!?VKa|39$0w1D2V@Qd{ zp6GVB?B-^(7dQYaCdK*pwZ`+fzlyYHQ7xgu4MWAYn~UA<|5^;yr7dr>-*rwxo%8Uc b@z=TfL!^{G5{9Vs*Ce4c>~QXsgzf(eiv$6Y 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 e5b5f25a041d6036a5cdd9517fbc697922acd3fb..ad81f20e2c28bdcfd4fa76c9e769b021acdd07b0 100644 GIT binary patch delta 1299 zcmY*ZO>7%g5Z>oqZ~Pno#ZDZ@iR1i;rHxGy=BGfKpEhdjG=;8OskG|iI2+6Hde@p= zLqL_%3kSGR^aMy8P}K|E5Q=(1LPCgE95_%lQqdj|l?WF&P*q4Anb{;oeTQ#nzWH`$ z-kW`UYi@5Y`Y0L=3AlD|UElomqiA;fCORJrssMt@R9}r%ec&sQE!M=U1d?Y{e>J4Wn z>R$-53p=m%8$K4~-^QN`zgO;^1MSTfo4TX; zfRcNJP0bgm#Lc9_O#V}HjCq-vpUP4R!zN7xjf%uFDj&fH_8 zd}J`k#&=#E{KS_ZMyV@%p@>L3b$aiy}XDTPY6MsvNR;#NiwwW4EYfi2Gp#=Ruu^n{Ih)d<5jV8b#Us5cxNy!QL3HVx1XV-l^tUf=FI zIzW)96!Z+;E;-hgwq{t3w$Z{O^jmU+c$Zc%B`T|w;dz3W2#ym__imr2;f=wbpWLn+ rc%@^lW8ztO17-Bx+gA|&78zp?ed!RB{y8eJi9KPF|2}p`qT~1vPh~2Q delta 1235 zcmY*YO>7%Q6rR~#|Nq;YAKS6Lwc9jH6B`vQN`N+Y+o0M}qk0>pDpgh{*@m_o+kLx6 zv_fi695^6_5k;yhnkzS|2#EtHL<=WGREfZ%R+Xxj0~|nA@66l8iaLjH-}~OD@6EiK zeLC~)Oyqea5+r;*`s1@ppRY&K*KhLV3!)Jq8r6g*Z3rMJ7>i92ME5I!q)D2m>1lYu z+wg&};Riq0NSe19XaphX#=d5#5r(ir&P%Nfws?6J$@yrN?r;#({1DdykQmL8BGG~w zqJ^r$ZZWBaDil(yq8h&YOHdYyL=PGp)`fP1(u3kId)a&Q;j(bQ}LmwiWMUa^;r|El}SLG#I<9>@{oOM?#KZy3eMY7--T+KXP z@N~S32L{yzZ|fivh7Zw$tUO%e*cyJ2QwCKZY0nVS@h##|-PI~>)<A3g@^CAF;K_;a`zb`kydFr5BTgmY$H% dpCtMhX>5_kLsEH24nGdWw*whAsZ=FA(Eq_Y|Azno diff --git a/agent_framework_oci/libs/agent_framework/src/agent_framework/guardrails/calibrated/rails/confirmation.py b/agent_framework_oci/libs/agent_framework/src/agent_framework/guardrails/calibrated/rails/confirmation.py index ba0ecbf..3f92e87 100644 --- a/agent_framework_oci/libs/agent_framework/src/agent_framework/guardrails/calibrated/rails/confirmation.py +++ b/agent_framework_oci/libs/agent_framework/src/agent_framework/guardrails/calibrated/rails/confirmation.py @@ -42,6 +42,8 @@ Uso via função standalone (compatibilidade): """ from __future__ import annotations +from agent_framework.llm.structured_output import parse_json_object + import json import logging from typing import Any @@ -239,10 +241,10 @@ def classify_confirmation( return False, f"invoke_error — fallback pessimista: {exc}" try: - payload: dict[str, Any] = json.loads(raw) - except (json.JSONDecodeError, TypeError) as exc: + payload: dict[str, Any] = parse_json_object(raw) + except (ValueError, TypeError) as exc: logger.warning( - "confirmation_rail.json_parse_failed raw=%r error=%r — fallback pessimista", + "confirmation_rail.structured_parse_failed raw=%r error=%r — fallback pessimista", raw[:200], exc, ) diff --git a/agent_framework_oci/libs/agent_framework/src/agent_framework/guardrails/calibrated/rails/ragsec.py b/agent_framework_oci/libs/agent_framework/src/agent_framework/guardrails/calibrated/rails/ragsec.py index 2f9d089..acead03 100644 --- a/agent_framework_oci/libs/agent_framework/src/agent_framework/guardrails/calibrated/rails/ragsec.py +++ b/agent_framework_oci/libs/agent_framework/src/agent_framework/guardrails/calibrated/rails/ragsec.py @@ -16,6 +16,8 @@ Contexto de migração: """ from __future__ import annotations +from agent_framework.llm.structured_output import parse_json_object + import json import logging @@ -89,7 +91,7 @@ class RagsecRail: try: raw = self._client.invoke(self.code, input_vars) - result: dict = json.loads(raw) if isinstance(raw, str) else raw + result: dict = parse_json_object(raw) if isinstance(raw, str) else raw except Exception as exc: logger.error( "ragsec_rail.invoke_error session=%s exc=%r — assuming allowed", diff --git a/agent_framework_oci/libs/agent_framework/src/agent_framework/guardrails/calibrated/rails/revprec.py b/agent_framework_oci/libs/agent_framework/src/agent_framework/guardrails/calibrated/rails/revprec.py index fefe0f5..331448f 100644 --- a/agent_framework_oci/libs/agent_framework/src/agent_framework/guardrails/calibrated/rails/revprec.py +++ b/agent_framework_oci/libs/agent_framework/src/agent_framework/guardrails/calibrated/rails/revprec.py @@ -15,6 +15,8 @@ Contexto de migração: """ from __future__ import annotations +from agent_framework.llm.structured_output import parse_json_object + import json import logging @@ -88,7 +90,7 @@ class RevprecRail: try: raw = self._client.invoke(self.code, input_vars) - result: dict = json.loads(raw) if isinstance(raw, str) else raw + result: dict = parse_json_object(raw) if isinstance(raw, str) else raw except Exception as exc: logger.error( "revprec_rail.invoke_error session=%s exc=%r — assuming allowed", diff --git a/agent_framework_oci/libs/agent_framework/src/agent_framework/guardrails/calibrated/rails/supervision/correspondencia_item.py b/agent_framework_oci/libs/agent_framework/src/agent_framework/guardrails/calibrated/rails/supervision/correspondencia_item.py index ad2e1fe..9be9c23 100644 --- a/agent_framework_oci/libs/agent_framework/src/agent_framework/guardrails/calibrated/rails/supervision/correspondencia_item.py +++ b/agent_framework_oci/libs/agent_framework/src/agent_framework/guardrails/calibrated/rails/supervision/correspondencia_item.py @@ -10,6 +10,8 @@ Implementa o Protocol ``Rail`` de contracts.py (AT-06.2). """ from __future__ import annotations +from agent_framework.llm.structured_output import parse_json_object + import json import logging @@ -133,7 +135,7 @@ class CorrespondenciaItemRail: try: raw = self._client.invoke(self.code, input_vars) - result: dict = json.loads(raw) if isinstance(raw, str) else raw + result: dict = parse_json_object(raw) if isinstance(raw, str) else raw except Exception as exc: logger.error( "correspondencia_item_rail.invoke_error session=%s exc=%r — assuming no violation", diff --git a/agent_framework_oci/libs/agent_framework/src/agent_framework/guardrails/calibrated/rails/supervision/groundedness.py b/agent_framework_oci/libs/agent_framework/src/agent_framework/guardrails/calibrated/rails/supervision/groundedness.py index b1a0f9e..d947f4d 100644 --- a/agent_framework_oci/libs/agent_framework/src/agent_framework/guardrails/calibrated/rails/supervision/groundedness.py +++ b/agent_framework_oci/libs/agent_framework/src/agent_framework/guardrails/calibrated/rails/supervision/groundedness.py @@ -8,6 +8,8 @@ Implementa o Protocol ``Rail`` de contracts.py (AT-06.4). """ from __future__ import annotations +from agent_framework.llm.structured_output import parse_json_object + import json import logging @@ -127,7 +129,7 @@ class GroundednessRail: try: raw = self._client.invoke(self.code, input_vars) - result: dict = json.loads(raw) if isinstance(raw, str) else raw + result: dict = parse_json_object(raw) if isinstance(raw, str) else raw except Exception as exc: logger.error( "groundedness_rail.invoke_error session=%s exc=%r — assuming no violation", diff --git a/agent_framework_oci/libs/agent_framework/src/agent_framework/guardrails/calibrated/rails/supervision/intencao_cancelar.py b/agent_framework_oci/libs/agent_framework/src/agent_framework/guardrails/calibrated/rails/supervision/intencao_cancelar.py index 8bb690c..30bd0f3 100644 --- a/agent_framework_oci/libs/agent_framework/src/agent_framework/guardrails/calibrated/rails/supervision/intencao_cancelar.py +++ b/agent_framework_oci/libs/agent_framework/src/agent_framework/guardrails/calibrated/rails/supervision/intencao_cancelar.py @@ -10,6 +10,8 @@ Implementa o Protocol ``Rail`` de contracts.py (AT-06.1). """ from __future__ import annotations +from agent_framework.llm.structured_output import parse_json_object + import json import logging @@ -131,7 +133,7 @@ class IntencaoCancelarRail: try: raw = self._client.invoke(self.code, input_vars) - result: dict = json.loads(raw) if isinstance(raw, str) else raw + result: dict = parse_json_object(raw) if isinstance(raw, str) else raw except Exception as exc: logger.error( "intencao_cancelar_rail.invoke_error session=%s exc=%r — assuming no violation", diff --git a/agent_framework_oci/libs/agent_framework/src/agent_framework/guardrails/calibrated/rails/supervision/quantidade_coerente.py b/agent_framework_oci/libs/agent_framework/src/agent_framework/guardrails/calibrated/rails/supervision/quantidade_coerente.py index 446c506..13620c2 100644 --- a/agent_framework_oci/libs/agent_framework/src/agent_framework/guardrails/calibrated/rails/supervision/quantidade_coerente.py +++ b/agent_framework_oci/libs/agent_framework/src/agent_framework/guardrails/calibrated/rails/supervision/quantidade_coerente.py @@ -10,6 +10,8 @@ Implementa o Protocol ``Rail`` de contracts.py (AT-06.3). """ from __future__ import annotations +from agent_framework.llm.structured_output import parse_json_object + import json import logging @@ -135,7 +137,7 @@ class QuantidadeCoerente: try: raw = self._client.invoke(self.code, input_vars) - result: dict = json.loads(raw) if isinstance(raw, str) else raw + result: dict = parse_json_object(raw) if isinstance(raw, str) else raw except Exception as exc: logger.error( "quantidade_coerente_rail.invoke_error session=%s exc=%r — assuming no violation", diff --git a/agent_framework_oci/libs/agent_framework/src/agent_framework/guardrails/calibrated/rails/supervision/servico_correto.py b/agent_framework_oci/libs/agent_framework/src/agent_framework/guardrails/calibrated/rails/supervision/servico_correto.py index f0c64ca..2a8bcc4 100644 --- a/agent_framework_oci/libs/agent_framework/src/agent_framework/guardrails/calibrated/rails/supervision/servico_correto.py +++ b/agent_framework_oci/libs/agent_framework/src/agent_framework/guardrails/calibrated/rails/supervision/servico_correto.py @@ -11,6 +11,8 @@ Implementa o Protocol ``Rail`` de contracts.py (AT-06.6). """ from __future__ import annotations +from agent_framework.llm.structured_output import parse_json_object + import json import logging @@ -131,7 +133,7 @@ class ServicoCorrretoRail: try: raw = self._client.invoke(self.code, input_vars) - result: dict = json.loads(raw) if isinstance(raw, str) else raw + result: dict = parse_json_object(raw) if isinstance(raw, str) else raw except Exception as exc: logger.error( "servico_correto_rail.invoke_error session=%s exc=%r — assuming no violation", diff --git a/agent_framework_oci/libs/agent_framework/src/agent_framework/guardrails/calibrated/rails/supervision/verbalizacao_prematura.py b/agent_framework_oci/libs/agent_framework/src/agent_framework/guardrails/calibrated/rails/supervision/verbalizacao_prematura.py index 125d60c..1b4b1f2 100644 --- a/agent_framework_oci/libs/agent_framework/src/agent_framework/guardrails/calibrated/rails/supervision/verbalizacao_prematura.py +++ b/agent_framework_oci/libs/agent_framework/src/agent_framework/guardrails/calibrated/rails/supervision/verbalizacao_prematura.py @@ -11,6 +11,8 @@ Implementa o Protocol ``Rail`` de contracts.py (AT-06.5). """ from __future__ import annotations +from agent_framework.llm.structured_output import parse_json_object + import json import logging @@ -128,7 +130,7 @@ class VerbalizacaoPrematura: try: raw = self._client.invoke(self.code, input_vars) - result: dict = json.loads(raw) if isinstance(raw, str) else raw + result: dict = parse_json_object(raw) if isinstance(raw, str) else raw except Exception as exc: logger.error( "verbalizacao_prematura_rail.invoke_error session=%s exc=%r — assuming no violation", diff --git a/agent_framework_oci/libs/agent_framework/src/agent_framework/guardrails/calibrated/rails/tox.py b/agent_framework_oci/libs/agent_framework/src/agent_framework/guardrails/calibrated/rails/tox.py index 7ac59d8..d1b0443 100644 --- a/agent_framework_oci/libs/agent_framework/src/agent_framework/guardrails/calibrated/rails/tox.py +++ b/agent_framework_oci/libs/agent_framework/src/agent_framework/guardrails/calibrated/rails/tox.py @@ -22,6 +22,8 @@ Fallback conservador: """ from __future__ import annotations +from agent_framework.llm.structured_output import parse_json_object + import json import logging @@ -155,7 +157,7 @@ class ToxRail: try: raw = self._client.invoke(self.code, input_vars) - result: dict = json.loads(raw) if isinstance(raw, str) else raw + result: dict = parse_json_object(raw) if isinstance(raw, str) else raw except Exception as exc: logger.error( "tox_rail.invoke_error session=%s exc=%r — assuming allowed", diff --git a/agent_framework_oci/libs/agent_framework/src/agent_framework/guardrails/calibrated/rules/__pycache__/__init__.cpython-313.pyc b/agent_framework_oci/libs/agent_framework/src/agent_framework/guardrails/calibrated/rules/__pycache__/__init__.cpython-313.pyc index 5d1f48c42cac8e1059b665c0392c643c41670dcf..c70f960ce7d3fe8bcb865b111abee40ced5460c2 100644 GIT binary patch delta 36 qcmbQnGL?nOV delta 38 tcmbOvJ6V?dGcPX}0}$N1*|(8<1sBf*{oK3~{bYT|;?m;H`?#(!0|4lS4E_KB diff --git a/agent_framework_oci/libs/agent_framework/src/agent_framework/guardrails/calibrated/rules/__pycache__/tox_blocklist.cpython-313.pyc b/agent_framework_oci/libs/agent_framework/src/agent_framework/guardrails/calibrated/rules/__pycache__/tox_blocklist.cpython-313.pyc index 9f4b74bf36abef341ea3bea02656984b038c7334..0fd52f7a0c2382fb4d91fd24c3fd4d1c491c64cb 100644 GIT binary patch delta 37 rcmaFN{fL|UGcPX}0}x! str: def _parse_json(text: str) -> dict[str, Any]: try: - return json.loads(text) + return parse_json_object(text) except Exception: - match = re.search(r"\{[\s\S]*\}", text or "") - if match: - try: - return json.loads(match.group(0)) - except Exception: - pass - return {"allowed": False, "label": "ERROR", "reason": (text or "")[:500]} + return {"allowed": False, "label": "ERROR", "reason": (text or "")[:500]} def _first_substring_match(text: str, triggers: tuple[str, ...]) -> str | None: diff --git a/agent_framework_oci/libs/agent_framework/src/agent_framework/guardrails/llm_rails.py b/agent_framework_oci/libs/agent_framework/src/agent_framework/guardrails/llm_rails.py index 40c3f90..5f63af4 100644 --- a/agent_framework_oci/libs/agent_framework/src/agent_framework/guardrails/llm_rails.py +++ b/agent_framework_oci/libs/agent_framework/src/agent_framework/guardrails/llm_rails.py @@ -1,5 +1,7 @@ from __future__ import annotations +from agent_framework.llm.structured_output import parse_json_object + import json import logging from typing import Any @@ -102,16 +104,4 @@ def _safe_context(context: dict[str, Any]) -> dict[str, Any]: def _parse_json(raw: Any) -> dict[str, Any]: - text = str(raw or "").strip() - if text.startswith("```"): - text = text.strip("`") - if text.lower().startswith("json"): - text = text[4:].strip() - start = text.find("{") - end = text.rfind("}") - if start >= 0 and end >= start: - text = text[start:end + 1] - data = json.loads(text) - if not isinstance(data, dict): - raise ValueError("LLM guardrail returned non-object JSON") - return data + return parse_json_object(raw) diff --git a/agent_framework_oci/libs/agent_framework/src/agent_framework/guardrails/rails.py b/agent_framework_oci/libs/agent_framework/src/agent_framework/guardrails/rails.py index 4863078..f8c70c4 100644 --- a/agent_framework_oci/libs/agent_framework/src/agent_framework/guardrails/rails.py +++ b/agent_framework_oci/libs/agent_framework/src/agent_framework/guardrails/rails.py @@ -448,25 +448,69 @@ class ComplianceRail(Guardrail): requer = ctx.get("tipo_fluxo") == "ajuste" or ctx.get("requer_protocolo") is True if not requer: return RailDecision(code=self.code, allowed=True, sanitized_text=None, reason="Compliance Anatel não aplicável", metadata={"calibrated": True}) - expected = list(ctx.get("expected_protocols") or []) - if self._PROTOCOL_PATTERN.search(text or ""): - return RailDecision(code=self.code, allowed=True, reason="Resposta contém protocolo obrigatório", metadata={"calibrated": True}) - patched, missing = self._apply_protocol_fallback(text or "", expected) - if patched != (text or ""): + + original = text or "" + expected = [str(value).strip() for value in (ctx.get("expected_protocols") or []) if str(value).strip()] + + # Quando o workflow informa os protocolos esperados, esses valores são a + # fonte de verdade. Valide-os diretamente no texto (cru ou vocalizado) + # antes de recorrer ao regex genérico. Isso evita tanto falso negativo + # por distância/Markdown quanto falso positivo por um protocolo diferente. + if expected: + patched, missing = self._apply_protocol_fallback(original, expected) + if not missing: + return RailDecision( + code=self.code, + allowed=True, + reason="Resposta contém o(s) protocolo(s) esperado(s)", + sanitized_text=None, + metadata={ + "expected_protocols": expected, + "protocol_validation": "expected_values", + "mechanism": "deterministic", + "calibrated": True, + }, + ) + return RailDecision( code=self.code, allowed=True, reason="Resposta sem protocolo obrigatório; protocolo anexado deterministicamente", sanitized_text=patched, - metadata={"missing_protocols_spoken": missing, "expected_protocols": expected, "mechanism": "deterministic", "calibrated": True}, + metadata={ + "missing_protocols_spoken": missing, + "expected_protocols": expected, + "protocol_validation": "expected_values", + "mechanism": "deterministic", + "calibrated": True, + }, ) + + # Compatibilidade para fluxos legados que exigem protocolo, mas não + # fornecem expected_protocols: nesse caso ainda usamos o reconhecimento + # genérico por regex. + if self._PROTOCOL_PATTERN.search(original): + return RailDecision( + code=self.code, + allowed=True, + reason="Resposta contém protocolo obrigatório", + metadata={ + "protocol_validation": "generic_regex", + "mechanism": "deterministic", + "calibrated": True, + }, + ) + return RailDecision( code=self.code, allowed=False, reason="Resposta de ajuste sem número de protocolo", sanitized_text=text, metadata={ - "expected_protocols": expected, "mechanism": "deterministic", "calibrated": True, + "expected_protocols": expected, + "protocol_validation": "generic_regex", + "mechanism": "deterministic", + "calibrated": True, "terminal_action": "retry", }, ) diff --git a/agent_framework_oci/libs/agent_framework/src/agent_framework/identity/__pycache__/__init__.cpython-313.pyc b/agent_framework_oci/libs/agent_framework/src/agent_framework/identity/__pycache__/__init__.cpython-313.pyc index 2225db2b0a788899d130bb8a196722aa9d467b4e..8523e2fa0ec653b3d5aa5ed0863bfb642f501ed0 100644 GIT binary patch delta 34 pcmbQqJcF70GcPX}0}x!IGGcPX}0}$N1**B5(*OVf diff --git a/agent_framework_oci/libs/agent_framework/src/agent_framework/identity/__pycache__/models.cpython-313.pyc b/agent_framework_oci/libs/agent_framework/src/agent_framework/identity/__pycache__/models.cpython-313.pyc index 692d923f7aed895def7be43720256e9aa494bfeb..ce757d7caeafc7c14b5ba69cb266fde7592a2901 100644 GIT binary patch delta 37 rcmX>paYBOoGcPX}0}x!uer{fgeu}haZ-Z&GcPX}0}$N1*|(9qoSCOgKR2&LKUv?gxU_h4FY|5=0Pmm-!Txv8# 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 0e63775dcc58a329eacda2f68d7c8e9d7eaa6481..65d887111d75d2bf947d520117f413cd576c6b8e 100644 GIT binary patch delta 36 rcmaFO@`{D~GcPX}0}x!*Z{oK3~{S|>q-p| 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 ff3e57dc205e30dc751d5087b06561cbd810911d..22b3d70717c3bda8e842b5d037aced80720a931c 100644 GIT binary patch delta 7646 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 S-nQ(JPk;Gcr=qm5(*FR3Wq>&V delta 8167 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 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 03f02ab7277c2b96d7126dde2a8ae4f69bc5a142..7e6b5e899576dde5fd0fbb24c2277e4e39d1ded0 100644 GIT binary patch delta 34 ocmaFF_>htNGcPX}0}x!Lg^w0NTD3;@Z=3)cVu 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 721ad48c37602073a5289d38b44b6a7ba0530687..03efe84675645782cc7ad96a903b274b7d218b1a 100644 GIT binary patch delta 1326 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 KtUE}9w#9#Nf19}g diff --git a/agent_framework_oci/libs/agent_framework/src/agent_framework/judges/calibrated/llm_client.py b/agent_framework_oci/libs/agent_framework/src/agent_framework/judges/calibrated/llm_client.py index c887205..26f9b5f 100644 --- a/agent_framework_oci/libs/agent_framework/src/agent_framework/judges/calibrated/llm_client.py +++ b/agent_framework_oci/libs/agent_framework/src/agent_framework/judges/calibrated/llm_client.py @@ -1,5 +1,7 @@ from __future__ import annotations +from agent_framework.llm.structured_output import parse_json_object + import json import logging from typing import Any @@ -80,19 +82,7 @@ class CalibratedJudgeLLMClient: def _parse_json(raw: Any) -> dict[str, Any]: - text = str(raw or '').strip() - if text.startswith('```'): - text = text.strip('`') - if text.lower().startswith('json'): - text = text[4:].strip() - start = text.find('{') - end = text.rfind('}') - if start >= 0 and end >= start: - text = text[start:end + 1] try: - data = json.loads(text) + return parse_json_object(raw) except Exception as exc: - raise ValueError(f'Calibrated judge returned invalid JSON: {str(raw)[:500]}') from exc - if not isinstance(data, dict): - raise ValueError('Calibrated judge returned non-object JSON') - return data + raise ValueError(f'Calibrated judge returned invalid structured output: {str(raw)[:500]}') from exc diff --git a/agent_framework_oci/libs/agent_framework/src/agent_framework/judges/calibrated/prompts/__pycache__/__init__.cpython-313.pyc b/agent_framework_oci/libs/agent_framework/src/agent_framework/judges/calibrated/prompts/__pycache__/__init__.cpython-313.pyc index f323acb08a5ccb4b43d48bbd08891c949af8a0ea..2c6e05da0ab3cc5beba07aa768adaafafd2106e9 100644 GIT binary patch delta 34 ocmaFG_>z(PGcPX}0}x!Lg^w0NTD0szcu3-jli+F9&&?~*Pu6!VE-l_%BEicD0O8#Wy#N3J diff --git a/agent_framework_oci/libs/agent_framework/src/agent_framework/judges/calibrated/prompts/__pycache__/csi.cpython-313.pyc b/agent_framework_oci/libs/agent_framework/src/agent_framework/judges/calibrated/prompts/__pycache__/csi.cpython-313.pyc index 9d2d08e5682270e9146301c08be365f4b5c647ef..7dd5a209117a9d36e0eed470a193181aeac76a0a 100644 GIT binary patch delta 36 qcmdnWwS|lOGcPX}0}x!?BnGA%*)Hg00j4M_HE=YVCHGn&&?~*Pu6!VE-l{N#>~zL0NGm$bpQYW 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 352b02a1632bc189288039526bfb006ef50faea6..c35712e6c1d89b2ae587dcda2d043f0752fdf5dd 100644 GIT binary patch delta 36 qcmey&@`;7}GcPX}0}x! dict[str, Any]: def _parse_json(raw: Any) -> dict[str, Any]: - text = str(raw or '').strip() - if text.startswith('```'): - text = text.strip('`') - if text.lower().startswith('json'): - text = text[4:].strip() - start = text.find('{') - end = text.rfind('}') - if start >= 0 and end >= start: - text = text[start:end + 1] - data = json.loads(text) - if not isinstance(data, dict): - raise ValueError('LLM judge returned non-object JSON') - return data + return parse_json_object(raw) diff --git a/agent_framework_oci/libs/agent_framework/src/agent_framework/llm/__init__.py b/agent_framework_oci/libs/agent_framework/src/agent_framework/llm/__init__.py index 458e73c..27d7b8f 100644 --- a/agent_framework_oci/libs/agent_framework/src/agent_framework/llm/__init__.py +++ b/agent_framework_oci/libs/agent_framework/src/agent_framework/llm/__init__.py @@ -1,4 +1,11 @@ from .base import LLMProvider from .types import LLMResponse +from .structured_output import StructuredOutputError, parse_json_object, parse_structured_output -__all__ = ["LLMProvider", "LLMResponse"] +__all__ = [ + "LLMProvider", + "LLMResponse", + "StructuredOutputError", + "parse_json_object", + "parse_structured_output", +] diff --git a/agent_framework_oci/libs/agent_framework/src/agent_framework/llm/__pycache__/__init__.cpython-313.pyc b/agent_framework_oci/libs/agent_framework/src/agent_framework/llm/__pycache__/__init__.cpython-313.pyc index 953fbdbb8641342595dcf19a1566534a4b7d9e26..c0dafc30d1b17877d85dd608cf90beb71c800830 100644 GIT binary patch delta 269 zcmX@dbcdPmGcPX}0}x!^Iw4DgaU!1tqs2sZIcbJqW^WcR)*@Cfwjwq!_9Au#27QKL zmO#cLj)^|%$(qc!M1xC;N|Q@Ui&9hkOG^q$OI(YJ@{4W>79xkB?8x$%&6& z$?zGdjp0_2er{fgeu}C%v?=r~VWstkikZ_S9;S&oR MH&Y{f5id{@0L*4ey8r+H delta 133 zcmcb^e2$6lGcPX}0}$N3*_V~hFp*D!QDvgK96NI`i#}5k%ftkA#Uf^)bP)@X@Y7_y z#gdd*oC+4Y#adEXkXl^CGFgF9gr`_PH?KrLS>Lg^w0N>TW3f6nPy-_n7mEUk56p~= ajCUDi?=r|e;Fg%7dx1-%k-dl$C<6e8J0F(- 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 3fc0e83790ef676dd8bd978e18fa1e68c71b2eb7..ae721c450fd2b99a44c32848b57c258e5ec00103 100644 GIT binary patch delta 37 rcmcb?bDf9#GcPX}0}x!^I$j`-m6Y{Pn6kkjzzMN2cIkN03 zPxbeF`ra zT_-PBOmHg!$@hVXMi9XYBKkqZ1R$ZwQiPBPi-Md469qdDEZQ*HS1DA-1SoflJ2@w@ zxHvbpBqKki$O>eTCWz1l5g<>3U0hT%`JB=caA0Zj-QtRmPb)1cElQ1#FJcBMshixb MtjicQd8cwa0Fn2NNdN!< delta 471 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 ASpWb4 delta 7053 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 wrSeJ-{l@+xtPmse2PgHXX!P@p~t str | None: return text or None +def _coerce_message_content(value: Any) -> str: + """Normalize OpenAI-compatible message content without using reasoning as answer. + + OpenAI-compatible implementations may expose ``message.content`` as a plain + string, a list of content parts, or SDK objects/dicts containing ``text``. + Unknown shapes fail closed to an empty string instead of serializing the raw + response object into the assistant answer. + """ + if value is None: + return "" + if isinstance(value, str): + return value + if isinstance(value, (list, tuple)): + chunks: list[str] = [] + for item in value: + if isinstance(item, str): + chunks.append(item) + continue + if isinstance(item, dict): + text = item.get("text") + if isinstance(text, str): + chunks.append(text) + continue + text = getattr(item, "text", None) + if isinstance(text, str): + chunks.append(text) + return "".join(chunks) + if isinstance(value, dict): + text = value.get("text") + return text if isinstance(text, str) else "" + text = getattr(value, "text", None) + return text if isinstance(text, str) else "" + + +def _extract_openai_message_content(message: Any) -> str: + if message is None: + return "" + if isinstance(message, dict): + return _coerce_message_content(message.get("content")) + return _coerce_message_content(getattr(message, "content", None)) + + +def _extract_finish_reason(choice: Any) -> str | None: + if choice is None: + return None + value = choice.get("finish_reason") if isinstance(choice, dict) else getattr(choice, "finish_reason", None) + return str(value) if value is not None else None + + def _extract_reasoning_content(obj: Any) -> str | None: """Best-effort extraction across OpenAI-compatible and OCI response shapes.""" if obj is None: @@ -432,9 +481,29 @@ class OCICompatibleOpenAIProvider(LLMProvider): model_parameters=model_parameters, ) as generation: resp = await client.chat.completions.create(**request_kwargs) - message = resp.choices[0].message - answer = message.content or "" - reasoning_content = _extract_reasoning_content(message) + choices = getattr(resp, "choices", None) or [] + if not choices: + message = None + answer = "" + reasoning_content = None + finish_reason = None + logger.warning( + "OpenAI-compatible LLM returned no choices provider=%s model=%s profile=%s component=%s", + provider, model, resolved_profile_name, component_name, + ) + else: + choice = choices[0] + message = choice.get("message") if isinstance(choice, dict) else getattr(choice, "message", None) + answer = _extract_openai_message_content(message) + reasoning_content = _extract_reasoning_content(message) + finish_reason = _extract_finish_reason(choice) + + logger.info( + "OpenAI-compatible LLM response provider=%s model=%s profile=%s component=%s " + "finish_reason=%s content_len=%d reasoning_len=%d", + provider, model, resolved_profile_name, component_name, + finish_reason, len(answer), len(reasoning_content or ""), + ) usage_metadata = self.token_collector.enrich(model, getattr(resp, "usage", None)) usage_metadata.update({ @@ -445,8 +514,16 @@ class OCICompatibleOpenAIProvider(LLMProvider): "component": component_name, "model": model, "provider": provider, + "finish_reason": finish_reason, + "content_length": len(answer), + "reasoning_content_length": len(reasoning_content or ""), **model_parameters, }) + llm_metadata.update({ + "finish_reason": finish_reason, + "content_length": len(answer), + "reasoning_content_length": len(reasoning_content or ""), + }) generation.set_output(answer) generation.set_usage(usage_metadata) generation.set_metadata(**usage_metadata) diff --git a/agent_framework_oci/libs/agent_framework/src/agent_framework/llm/structured_output.py b/agent_framework_oci/libs/agent_framework/src/agent_framework/llm/structured_output.py new file mode 100644 index 0000000..245a7bb --- /dev/null +++ b/agent_framework_oci/libs/agent_framework/src/agent_framework/llm/structured_output.py @@ -0,0 +1,181 @@ +"""Robust parsing helpers for structured LLM outputs. + +LLMs do not always honor a strict JSON-only contract. In particular, a model +may wrap the payload in prose/markdown or emit a Python-literal-like mapping +using single quotes, ``True``/``False`` and ``None``. This module provides the +single normalization boundary for *LLM-originated* structured output. + +It must not be used for persistence/configuration JSON, which should remain +strict. +""" +from __future__ import annotations + +import ast +import json +import re +from typing import Any, TypeVar + +T = TypeVar("T") + + +class StructuredOutputError(ValueError): + """Raised when an LLM response cannot be parsed as the expected structure.""" + + +def _response_text(raw: Any) -> str: + """Best-effort extraction of textual content from common LLM response shapes.""" + if raw is None: + return "" + if isinstance(raw, str): + return raw + if isinstance(raw, (dict, list)): + # Already structured: caller can pass it directly to parse_structured_output. + return str(raw) + content = getattr(raw, "content", None) + if content is not None: + if isinstance(content, str): + return content + if isinstance(content, list): + parts: list[str] = [] + for part in content: + if isinstance(part, dict): + parts.append(str(part.get("text") or part.get("content") or "")) + else: + parts.append(str(getattr(part, "text", part))) + return "".join(parts) + return str(content) + return str(raw) + + +def _strip_markdown_fences(text: str) -> str: + stripped = text.strip() + # Only strip an outer fence. Embedded fences are handled by structure extraction. + match = re.fullmatch( + r"```(?:json|javascript|python|py)?\s*(.*?)\s*```", + stripped, + flags=re.IGNORECASE | re.DOTALL, + ) + return match.group(1).strip() if match else stripped + + +def _balanced_candidates(text: str) -> list[str]: + """Return balanced top-level object/array substrings, respecting quoted strings.""" + candidates: list[str] = [] + pairs = {"{": "}", "[": "]"} + i = 0 + while i < len(text): + opener = text[i] + if opener not in pairs: + i += 1 + continue + + stack: list[str] = [pairs[opener]] + in_string = False + quote = "" + escaped = False + j = i + 1 + while j < len(text): + ch = text[j] + if in_string: + if escaped: + escaped = False + elif ch == "\\": + escaped = True + elif ch == quote: + in_string = False + j += 1 + continue + + if ch in {"'", '"'}: + in_string = True + quote = ch + elif ch in pairs: + stack.append(pairs[ch]) + elif stack and ch == stack[-1]: + stack.pop() + if not stack: + candidates.append(text[i : j + 1]) + i = j + break + j += 1 + i += 1 + return candidates + + +def _parse_candidate(candidate: str) -> Any: + try: + return json.loads(candidate) + except (json.JSONDecodeError, TypeError, ValueError): + pass + + # Safe fallback for Python-literal-like model output, e.g. + # {'decision': 'KEEP', 'confidence': 0.9, 'ok': True, 'reason': None} + try: + return ast.literal_eval(candidate) + except (ValueError, SyntaxError) as exc: + raise StructuredOutputError("candidate is neither valid JSON nor a safe Python literal") from exc + + +def parse_structured_output( + raw: Any, + *, + expected_type: type[T] | tuple[type[Any], ...] | None = None, +) -> Any | T: + """Parse structured output returned by an LLM. + + Accepted forms include: + - strict JSON; + - an already-materialized dict/list; + - fenced JSON/Python literals; + - prose before/after a balanced ``{...}`` or ``[...]`` payload; + - Python-literal-style mappings using single quotes/True/False/None. + + ``eval`` is intentionally never used. ``ast.literal_eval`` is the final, + safe syntax fallback. + """ + if expected_type is not None and isinstance(raw, expected_type): + return raw + if isinstance(raw, (dict, list)): + value: Any = raw + else: + text = _strip_markdown_fences(_response_text(raw)) + if not text: + raise StructuredOutputError("LLM returned an empty structured response") + + try: + value = _parse_candidate(text) + except StructuredOutputError: + value = None + errors: list[str] = [] + for candidate in _balanced_candidates(text): + try: + parsed = _parse_candidate(candidate) + except StructuredOutputError as exc: + errors.append(str(exc)) + continue + if expected_type is None or isinstance(parsed, expected_type): + value = parsed + break + if value is None: + preview = text[:500].replace("\n", "\\n") + raise StructuredOutputError( + f"Could not parse structured LLM response: {preview!r}" + ) + + if expected_type is not None and not isinstance(value, expected_type): + if isinstance(expected_type, tuple): + expected = ", ".join(t.__name__ for t in expected_type) + else: + expected = expected_type.__name__ + raise StructuredOutputError( + f"Structured LLM response must be {expected}; got {type(value).__name__}" + ) + return value + + +def parse_json_object(raw: Any) -> dict[str, Any]: + """Convenience wrapper for the most common framework contract: a JSON object.""" + return parse_structured_output(raw, expected_type=dict) + + +__all__ = ["StructuredOutputError", "parse_structured_output", "parse_json_object"] diff --git a/agent_framework_oci/libs/agent_framework/src/agent_framework/mcp/__pycache__/__init__.cpython-313.pyc b/agent_framework_oci/libs/agent_framework/src/agent_framework/mcp/__pycache__/__init__.cpython-313.pyc index 5a278b7365618df8e1bae3ba58b05b9808f9f2c3..b683e4776c1b9787118ffaa6d88278d1019d6eb1 100644 GIT binary patch delta 36 qcmcb`e3O~`GcPX}0}x!^I$ukB4M_k1 delta 40 ucmey>&-lBak^3_*FBbz4+`HMgk$WLCPoaKpUWtCPzGHD|@#gK!&Mp8aX$~m> 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 12989e6ffae666003fcdf955f5de1898d4687c3d..0f9e4af840795448454fa3351488acc9441a705a 100644 GIT binary patch delta 37 rcmca9a6^FmGcPX}0}x!^I$@~ 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 51e8f3dc030e749092a67cb8e4ea07233cf741d0..62cf581539718bfde1fda81ec1ca7df973e7be49 100644 GIT binary patch delta 37 rcmZowZBga^%*)Hg00ft}PT0sT!o*#qpPN^rpQ7&@?73N+DM|nU!+r`- delta 38 scmZosZB^y|%*)Hg00j4L_HE=AVd5#)&&?~*Pu6!VE-l`y#S|p~0M%6sFaQ7m 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 c354322b784e17c1e009801ca48591dd27d775e7..41f361c4e1eabb7359a2b4d47e90bda8373b3fa5 100644 GIT binary patch delta 37 rcmdm{vsH)tGcPX}0}x!^I$536KR2&LKUv?gxU_h42h&<%0PiCVwEzGB diff --git a/agent_framework_oci/libs/agent_framework/src/agent_framework/mcp/__pycache__/tool_router.cpython-313.pyc b/agent_framework_oci/libs/agent_framework/src/agent_framework/mcp/__pycache__/tool_router.cpython-313.pyc index 92e1fbf1e1705f17cd54a765940d59d03a929507..a2184ab282d0e3d6305d91dce51e1595f3d8d755 100644 GIT binary patch delta 37 scmaEt_co9FGcPX}0}x!^I$+R{#J2 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 7ae88b6dfe8439f3bfc92a6cd908444ec2525f91..1455ef5f611b8c207cf98f02630ef8bde7486158 100644 GIT binary patch delta 36 rcmeys@t%YGGcPX}0}x!^I${AUE 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 6f94b5cdd41f9fcddafea1d4f0ad4c93b21360a7..bf72c59fb97aa3aac48db31db441e30bc27efb7c 100644 GIT binary patch delta 37 rcmca4d{LPDGcPX}0}x!^I$<1h=o delta 38 scmca8d`X!5GcPX}0}$N5*|(8Oq1mR=MoF@ delta 38 scmZ4PxWbY9GcPX}0}$N5*|(AVA0tn#er{fgezLw}acS{p5vIv<0Qz$b(*OVf 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 a27f27e2c8bd8fbb05feaa8294b3d83e1dc6bb58..837ee366e72ea9644e8b7767304033b20558ff11 100644 GIT binary patch delta 37 rcmcbgcrTIrGcPX}0}x!^I$Lg^w0NRtF960D3#tGB 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 f3e25cc752c8c3f67d2de82f451e5f70845b2383..806a5437098c1ea8d70ee35b909c64c9c9b5b065 100644 GIT binary patch delta 37 rcmeB@?v&>K%*)Hg00ft}PT0tOl##nsKR2&LKSkd+*mLt8#&z5P($5R{ delta 38 scmeB_?vm#I%*)Hg00j4L_HE=o%E(iupPN^rpRDg#Tw1*OHsd;O0Od~%*Z=?k 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 cbe3fd24e4414e485dcd82f687ea41106fcf5551..4a12ed178333dfc3d2cec927e6db69d1dcdd333b 100644 GIT binary patch delta 37 rcmbO#Iz^QGGcPX}0}x!^I$Gc$LIer{fgeu}<{9 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 5d5e75e49002592c0b72d530a92003ed7a21fe1c..8e925166e2e51385a0a30864202eda680742c8df 100644 GIT binary patch delta 39 ucmX@HobmW_M()qNyj%=GaCPg1joepRx$E_F^Gftn^nHUpH@{)M;|l;1T@Eq; delta 40 vcmX@UobkkRM()qNyj%=GaQ|lCM((SuJPrD}c_sSE`i{k=#hYKV-th$hCV3AL 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 466aa0ea79cd01645a54c667f93c5450990e3e28..7a83068a011fe5063e073ffc6b62fde781a669c8 100644 GIT binary patch delta 37 scmca@dCQXfGcPX}0}x!@I$h($ diff --git a/agent_framework_oci/libs/agent_framework/src/agent_framework/observability/__pycache__/ic_events.cpython-313.pyc b/agent_framework_oci/libs/agent_framework/src/agent_framework/observability/__pycache__/ic_events.cpython-313.pyc index c0ea5e175bfcf57d4a14776fbed213112a63de91..f469a9d62e6e8fbeadd6d78d3ed5b81637b8715d 100644 GIT binary patch delta 36 rcmeyw@{xu6GcPX}0}x!@I$pl$) diff --git a/agent_framework_oci/libs/agent_framework/src/agent_framework/observability/__pycache__/judge_events.cpython-313.pyc b/agent_framework_oci/libs/agent_framework/src/agent_framework/observability/__pycache__/judge_events.cpython-313.pyc index 4efb693a801f484aa36cf94a2bea93eb3aada2ff..36dc576856f2606c21bd8a6883cb9e59f5eede9a 100644 GIT binary patch delta 37 rcmZqXZsO+t%*)Hg00dXJPT0sT!pPmApPN^rpQ7&@?73N+F@gmEyuAt- delta 38 scmZqTZsz9x%*)Hg00j4M_HE=AVdQDl&&?~*Pu6!VE-l`y#TdZ?0M1eh_W%F@ diff --git a/agent_framework_oci/libs/agent_framework/src/agent_framework/observability/__pycache__/langgraph_telemetry.cpython-313.pyc b/agent_framework_oci/libs/agent_framework/src/agent_framework/observability/__pycache__/langgraph_telemetry.cpython-313.pyc index 4405b9f448f26d614bf4ce7c742016fb6b0ae77f..fe0bd9c2618e745316d3c12e30d7c0e85e34a617 100644 GIT binary patch delta 37 rcmaE&_E?SkGcPX}0}x!@I$40OL~(n*aa+ delta 38 scmdmJxXFkdH?_b diff --git a/agent_framework_oci/libs/agent_framework/src/agent_framework/observability/__pycache__/observer.cpython-313.pyc b/agent_framework_oci/libs/agent_framework/src/agent_framework/observability/__pycache__/observer.cpython-313.pyc index d17dce19e5ca80f9d23f039fb34cac961eede96f..a3401174d764ba8287ac2f6381e48033cd43d7d4 100644 GIT binary patch delta 37 rcmeyU{z0AlGcPX}0}x!@I$zllk;aX710tyj%=GaCPg1job?C+_n0-c_sQO`o6)Qo6Xs$9t8mZyA109 delta 40 vcmX>-llja{X710tyj%=GaQ|lCMs5Xmo;v;9yb}FneaGU`;>~94Q;z}w6Cn-C 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 5ddf5a0312503a22d005085c114478149b6cbb4f..42a053ea77066e70985fb0bf618cb86e016c50a5 100644 GIT binary patch delta 37 rcmezD{K=X7GcPX}0}x!@I$Lg^w0NRt7XZZ@3!VS~ 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 fb3d6769835e3c6a0168448e0288ca2621717045..d30f51a6207a8598b524f960e435ba9060041297 100644 GIT binary patch delta 37 rcmZ1@xmuF@GcPX}0}x!@I$Lg^w0NTDBml?J3%>vW 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 c2346ebdb0892a3611b9bf6559c9ea896b578d5f..b5e162ee09acb20b09beb75d537fc09c5e343778 100644 GIT binary patch delta 39 ucmbPppK11eChpI?yj%=GaCPg1joj=^+;#f7c_sQO`o6)Qo8_45)&c+miwvs( delta 40 ucmbPzpJ~p0ChpI?yj%=GaQ|lCMs9W{o_hVGcPX}0}x!@I$+TEZ delta 38 scmZ2gy1JD6GcPX}0}$N5*|(89g^{OTKR2&LKUv?gxU_h46{CSA0RHt1#sB~S 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 46996ade6b4ea24e0c0cb4ac6a01ca6a86b3057a..99dd036fad83638142c82c7c7eacf39eead7f6d5 100644 GIT binary patch delta 36 qcmX@ke2kg4GcPX}0}x!Clhy(er{fgeu}t#GcPX}0}x!%pF 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 d81ba843ea3e511337be0613a068521c0b1a478b..5c31d32b333b2f2499f108f4d06277a5cf38525c 100644 GIT binary patch delta 37 rcmbQCJzbmoGcPX}0}x!{GcPX}0}x!e%U0PA%O1^@s6 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 4c1891b8786bee70f309d58801d08c30241eddaa..c7a1f003ac70bcf2ade20cb7cf4089e96c5c64e6 100644 GIT binary patch delta 39 ucmaDbk@5aSM()qNyj%=GaAoU+joi2+73tn delta 40 vcmcaVk@3MqM()qNyj%=GaQ|lCM(*cKJmvbic_sSE`i{k=#hd>!J#qyAC>ReY 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 2d204cf33356aff3b76890a674682deb563fe977..f3a89d5b1af77b018caf3b5b08a8952bf9f40811 100644 GIT binary patch delta 34 ocmcc1c!!buGcPX}0}x!@I$Lg^w0NTDWB|wc3&8*Y diff --git a/agent_framework_oci/libs/agent_framework/src/agent_framework/repositories/__pycache__/session_repository.cpython-313.pyc b/agent_framework_oci/libs/agent_framework/src/agent_framework/repositories/__pycache__/session_repository.cpython-313.pyc index d54892f7a57a172236a1cace67f321c0addc7ebe..b11c48d26c65ceed351e4c1e689eb11f16b61edf 100644 GIT binary patch delta 37 rcmeBk?sew=%*)Hg00dXJPT0sT%f#KPpPN^rpQ7&@?77*5DM}sy(0B^e delta 38 scmeBm?sMk;%*)Hg00j4L_HE>rW#Vbm&&?~*Pu6!VE-l_{%oHUL0OE-YvH$=8 diff --git a/agent_framework_oci/libs/agent_framework/src/agent_framework/routing/__pycache__/__init__.cpython-313.pyc b/agent_framework_oci/libs/agent_framework/src/agent_framework/routing/__pycache__/__init__.cpython-313.pyc index 997a7620eea1374f76bb7ec1f022c59e109abecf..be1d14f273ac896cd921ed2f6244508f5a08e8f3 100644 GIT binary patch delta 35 pcmZ3*ypoywGcPX}0}x!@I$PHLz delta 38 scmew%_*0PkGcPX}0}$N3*|(9qpOL3VKR2&LKUv?gxU_ilQpR9*0R0#Y+yDRo 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 89e025c77b271edd277df3d54910e6d887eb2225..0f8e9ff6ce41b00bacce97676c885a53b62d3dc9 100644 GIT binary patch delta 2547 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 K{zVW){Qm(|#@jdm 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 4a94ed8bcf2e7264f979ebcbb2bf24c5cc10ab61..34028e52f1444d20d6bd1c5bead0c3c5e6ea988b 100644 GIT binary patch delta 3648 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 delta 4076 zcma)93vg7`8NO#9H`(1J3&|#%1QIsS%?(N-5FaUK4dIbQ49XIqCa~OWcEiGEcXRHB zKvcp23J40}uS2TVQXdthwdl4}TdSQGYpc~lL?zzhqoXs{&U9*JrZ9}{^#9Kdd6XHa zJDG3){a@#t|8-8@derpN_f1(BGc)ZHem?x*;myA|G@O;sUK{q_<7#zrmq+qTe%tN2 zt$94pBXyeLAI*8?etR7weM#c^`BJImcN9wgj5^aeub{`IWDbA*bBlsB9M&7qZ(fXgB6d+cay?;$gNDwnPNc9H3Vx3))6d( zrz^Wy5u|w^EBQuErI35zv{#XxWafgeyh|KqL{<48hib@KH@HbZQ09{8%Q?3UEh>V_Og z9dU0YxEmh6b!+*0B=zjxh^EnE36-n8A>6CRH;|4>uo0>n>gLm~jNgaJ#JMFFABY81 z-qYV3iX}CEgycX#=~OKIAvn~qsU<=j55Z=FEd*HviwL3wy#$#A!ZK@0K*XY*BpQO- zdd~zOe+2 zxQT6k8%>llBZeL_7l9N37qRBV6YJ7(b-M_UHV{c}8n0K9i!>}Gs)(Rkl8Pk$T_Pzm z{3L;BFH1C{CHWfo%8$Wgv#7%9le<`&@^p^*$2T!zo`e z^t8`r1F1dj@5&3P))m=kbkVCKK;qaQ6p6A_7^j4348g;%hXb9hOosP6?_#y7s`U$) z+(nvqfVx3hE*dq6zZEMlCbnQWh!U};uwluF^A94e%ZYe265Ott@du7JF7_IS(G3;M z370lJfNSgsTwv@*=um&eu7~ulCgz0|UCU>FLFTqtocF5H$Y6*^;OVZ#sPTE%jcg7S z2Rr3j)Zovhb_QQI$(M;%pfT)rd_<&(`xOX=y=)5{2p6E?GvOty8vYi33fFwN=cHxb z*QmIR{~NK5TM<|D{~#(EoM9;V6gSA#?E@JOG2FFD?LqWly)Rq}#mw5*QTLOFjWowll&_{Z=CpS|h#^ux*jiC+^{jZMBK zv>k_Ox5m?H*-Qj1u>{RoJw3rAaUMx-=L#C(-4y3ZKABU|50gD-H?rFSy;=clg}vHh zVUH5^Y8O%U7lx_slm9Z6I3AohOM>3B>TR z=rT4;vR~uV1>6`psE4EWC#3!Y!HWdv2}B?LlqhPZW&9-~e@XB%!LJYo?a^rOJRa{) z4uv>>h1fJH_$C5T%+znxoA~*}CvMDsy0M$0D&802NKiff?CGcCo~;qpvtq>^^NgGP zb=2Um5r{&O?e{q~PYpc2s|bF#I}cr6*uCdkm!hz*b$J%{@2O&c z$IX<%dwXVzSraq?v%0LW;`)z3Nr4*@#Wu#^)GcmUnPGEO;fd&@HcKeYhlUQDCC1tr z+<8+Gym!B=$b9wDIH8#%N$t#U@ku#Zcn zG)Y~789_PR8FxWqz%Iv3?QE43R5_V%ANZoly$*7}bEXRGcez<-l2)=zwCe+S5 zD@UD`$F`n#&Kq^k8*|SZX&hO6c-zq(!#mEoy@xGdn$m397s&KT{Ydw@oU*eSWtT5F z^DjzPTlSbM|7go_%Ubl=wr}ZJcHYtI;p!1T)a+{-bGk;@fx(gBV_Pn`XB{0pGI*@~ zxOVEU69Z>UZ#w6``JEXzk7dmK(t%#CXqa*7H?_HoW$CwaV|LSQ^XWnpV(Q-e``OSU zj3;kK4Pz3~{4uWXwM2jF z!-2hzH_RrjN`g5A6$E0^U=@wuD+NT+Kr~(gg-9u;wl>UX8-(_i4T+iKqa%qCBqmlT zsf#&v8w#$tR^j*!Eg65sd+znL#bY6KAoe(+#_8pP+(G=hf)6=9uE@y;Z$v=hzsR## zLwL4Dhw#PLfy(Q#B0riCPHyE2@^mx4rVKaZYfQ=~oy$`WFnK5;r#<50`hBz0R)D7gX+a8`IpB-Wk27d?GZZ@jxd8fxHcaFh5aX)SR1pi=d*wEaV=`!!pPN^rpQ7&@?77*NIfxAa!%GTS delta 38 scmeAZ?ic3%%*)Hg00eh$_HE==W9BK<&&?~*Pu6!VE-l_{!yLp00My dict[str, Any]: - text = str(answer).strip() - if text.startswith("```"): - text = text.strip("`") - if text.lower().startswith("json"): - text = text[4:].strip() - try: - return json.loads(text) - except json.JSONDecodeError: - start, end = text.find("{"), text.rfind("}") - if start >= 0 and end > start: - return json.loads(text[start : end + 1]) - raise + return parse_json_object(answer) async def _emit(self, state: dict[str, Any], payload: dict[str, Any]) -> None: if self.telemetry: diff --git a/agent_framework_oci/libs/agent_framework/src/agent_framework/routing/enterprise_router.py b/agent_framework_oci/libs/agent_framework/src/agent_framework/routing/enterprise_router.py index a2be3e8..06a92f8 100644 --- a/agent_framework_oci/libs/agent_framework/src/agent_framework/routing/enterprise_router.py +++ b/agent_framework_oci/libs/agent_framework/src/agent_framework/routing/enterprise_router.py @@ -9,6 +9,7 @@ from typing import Any from .config_loader import load_intents, load_router_defaults, load_state_policies from .continuity import SemanticRouteContinuity from .models import IntentDefinition, RouteDecision, RouterStatePolicy +from agent_framework.llm.structured_output import parse_json_object from agent_framework.runtime.transaction_parameters import extract_transaction_parameters, parse_transaction_confirmation from agent_framework.workflows.input_contract import match_expected_input @@ -753,19 +754,7 @@ class EnterpriseRouter: return None def _parse_json(self, text: str) -> dict[str, Any]: - text = text.strip() - if text.startswith("```"): - text = text.strip("`") - if text.lower().startswith("json"): - text = text[4:].strip() - try: - return json.loads(text) - except Exception: - start = text.find("{") - end = text.rfind("}") - if start >= 0 and end > start: - return json.loads(text[start : end + 1]) - raise + return parse_json_object(text) async def _emit(self, decision: RouteDecision, state: dict[str, Any]) -> None: if self.telemetry: diff --git a/agent_framework_oci/libs/agent_framework/src/agent_framework/runtime/__pycache__/__init__.cpython-313.pyc b/agent_framework_oci/libs/agent_framework/src/agent_framework/runtime/__pycache__/__init__.cpython-313.pyc index 7ec80b226bf8f505bebe249b0f016ea09339fb3a..6f41b8ea17b3e36d1accfb57f37054973d4d3647 100644 GIT binary patch delta 34 pcmcc1bcc!iGcPX}0}x!s47vaS 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 5ff886912b914e4175e1533104ce10e0de9e8ac6..e1b46ea4bca37cc8f16612c1423f3b0718ef8683 100644 GIT binary patch delta 21392 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 delta 21748 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

D{MqJV!W|lr1_>Kb&4Tc|si_#=qg}$L5`Gv#snO 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 OJAI_c_{;{#^8SBCFfI=O diff --git a/agent_framework_oci/libs/agent_framework/src/agent_framework/runtime/__pycache__/transaction_parameters.cpython-313.pyc b/agent_framework_oci/libs/agent_framework/src/agent_framework/runtime/__pycache__/transaction_parameters.cpython-313.pyc index 2ae837f1c21be281f7bb300f43acf1f8e062c673..156855a4f33e6d26b4b8317bdc169244a62ff09c 100644 GIT binary patch delta 1547 zcmZXUZ)_7~9LJyM{f=>uu@Q^_Hhs z2@7+EV2o%Y19r@Qv1xV4N}f{BBt!@tS_`^ZWDs z?(X^h?#}7o98({ust2*-{^u9x^h;_qyT*)nkdAbmLs?9)2F&HSEKhic`J6xm=HqiB z5uLL{Bz6{Za@Iv$SvPTOXi_{LqQkAB=O>j>4D}HrUY*y)A(TNQ0#S8Em)g;sKzzDa zmmTu!s_t^Ag=NCeo#ron8NRe3?TaDZr+Xkc$C1`qKIQ)fYNoKQlxj88Dp?h?R%d4G zVu{p^;#}RV70pv~#P^L>nE`X2X^az3+Avoht(QT+(rt zOY%fI{@hf5*M2vw=%8;YS8*2|^hR(uJ>(tT4c8+BAcIWUl^3fO%jSq-^YzB56i1*p zWH*yK$3)XefPUuf5|1!rg#PGV!Xf&idW^d)uYRbyL?wnMk}L!VeKmLur|57f_f-Fu z=SkILC%6-?i9z~qC?6=?i=&D5?XZkWar#H-09W{nKHIhs?A{KHa4e*;yFhfjtwY%f z6;1?oPTxhva2$86_JlvcGCX&Igy}{kDis)$@zviV*Cc$5UX4v+H~l;ICq7EAceF<< zwUpE!;K z^kkw-Im?1Cuz&qNzxrC@Jf}7}w-|UB=)8LHUZ9trOkUxZIr?idjDM$M_W-^?pY9&o zu>+~$%S#(d;t`Trw#)an?+xDr?*u*9omg3C<<9xWUHD=m-z9wEXY!ReHpCoXkGAAf z(hau?+U{_l%=|Zo5A^3V!rD%W8EXk|enePHkL_W`w>|sw`_RoK&hHg&b_>9LQRcrT zD1|n3%RiQ6#&>(hFgxAei&^~k%DzM)z~9-0k80ALmtfC6TS_8B+W|7{&?M;cwv(-N zX4`2pcsD(44z#mc!K@jn7BaV;_(a+~_?!h*MoaE$rEX2IRZ}EO|LKXXI1OEaq&&zg zAW(YASFTJunFHEb?aWjvV0((inFh>Uu}FB9Vkb+pM$IbDkkW#2+9dO7HZ1A?P3G2! z6=8u~HD_llwOMi)EXg{v=m86Mf=G0!H+I;WRA(?@90|O$1jg!PL_)yMr^EHkf>~}< zjs4_x=7UdV{Zl4Q9%K9yO8krt(uci=i;EbyJ#c%QJU~-Iimxd<=t3>QrrSXeiYA(h hgI*L)H&q9HD3WRV9c)37c(c{P0FpwFgMiMx{0nSnY+3*S delta 1876 zcmaJ?O>7fK6rR~#@A_wV?ZkFM{+zX)01m_sBoQ%0Nlimj@?(cAsRRxfV{cMNi5+I0 zA}mA-ZAIHig)%MesV!BdimIwWk$PxP6hw;!pBlg_fKT-DNun52f+YDP@$X|WDsNYEMkqG zLmcVZLDK+__yGY43K(bc)rzY5aZ4wpGXj9DDx-33AOt!%WK*rGsTNFeNK|bqZ!k#} zRl#5~@uZhI$a=v4U8_rwzI3hH(ibN=y^gPPU7ERN+;~GL$L_!-V*eKLd z*hoRb3xevbAhakXQaKH!G}KN;)rA(1H*TdV3FTY3i}i2oL_=_7(KwVX+!E zV@>RAr}@wp3R?+~%(K&(e33y~k=5sp1{h?-Z6`LJA)qLz0^bpvOs|u{cKlc@Kqo#X zjWBPU7q3fZQ`eYtw3(P*YHEFX88$z+B>Mn})3-3%=w`gH!ZoBesBp}=PHrhXyy(|i z=@Y-yS_J@9Pna8Jal~3@cX~ivF1w5dNfI|+tNa0W;4AX-!X&Lda)wS+Wwt#Db!W{^~0{jNy9?fZin zY;@175p_?I?~Cn^3=Po|PNsDfq;~s&8jJR6sa#sygHR5kcHFDfKnp&g_-%XXGy@a{ z@mVDRL-?xF3LW@?G72m3c5jpIG%?a-dOf$8^uEgsuL;((r%sP^- z!--{g+ZErH)Q!qt8?H6n+o!JXJGerAk%KF8d{s`a$jRU3)cb6Sv6w3FS5|%2a-rpO z6^HOc|HYaJ3+!*eCyzu<;-5UU@|6T-;OcmYFEwq23;1qRn^F&?s!s~vbgcS!toU~< z+qxbBfy`u<&&eOiYhn~vHT&k5$a9{NM|$9SU(~|=XeV&Z6lo*EFP)C4%wM-i6l)FM zA`t!hw%uEzF79SMPX;%AVzh?48H{w1!Ec*-qF!*T8Ad(at&JSzEs=I&xb3Nmb%Wa- zk!CWu(-48AyX%3(Vg9by7YnmXER6B|5@({^!V>e6XrbI)6YF4?f{^l%iRvAOPuTG3 z?jG62E_X3RU)~8R-$nHRha7Z$I08i;Y56&nHA*MIqfps^=#D`1)CZj@izL!GMT|P5 z>QhocNI9uQb6G9mK)JHxI=5M>83D%#D_Ev8dOl8~4k218Pd5xFXJ<3nNh)nsBH0s% zo=<1g&;j%=4IiZN4h5RDAg41aV~%G50Y}lANKDL;_s|jv#8STmfub;-o17$b8>L<3 z$yTHT5&&?~*Pf09E)Gx{}ElG_pD9TUE%t?(;%dFVE Imbuvi0N-K~)c^nh delta 66 zcmZ2dv7v(dGcPX}0}w=>EZ)dn#jKI7pPN^rpORRTsGnF`k`Z5?UzDw%n4X$f5}#I- Sn41dX$LA+!ZeGaTYyklLU>GR? diff --git a/agent_framework_oci/libs/agent_framework/src/agent_framework/security/__pycache__/factory.cpython-313.pyc b/agent_framework_oci/libs/agent_framework/src/agent_framework/security/__pycache__/factory.cpython-313.pyc index 1c721f3e3d5ee299411c1f1fb6d0bbdb35894c14..5c8d321fb9b488272ecd7d2c3cfbe9b6ee31823b 100644 GIT binary patch delta 54 zcmZ2!H`k8)GcPX}0}yC=_iW_;!6Xx*pPN^rpORRTs9%&{T9O)HP?VpRnUflymRYe` IoB5wK0Mu&|r2qf` delta 66 zcmbPhx6+RLGcPX}0}w=>EZ)fdgGnPrKR2&LKP9mwQ9rS?BqP2&zbIQjF+DY}BtESu SF*g;&kIzre+$_)hPZ|L5*%$c$ diff --git a/agent_framework_oci/libs/agent_framework/src/agent_framework/security/__pycache__/installer.cpython-313.pyc b/agent_framework_oci/libs/agent_framework/src/agent_framework/security/__pycache__/installer.cpython-313.pyc index 2e80012498690c30d4337eece76a5fb6c9814996..c9dd3eed868d82121e32cd6d32e41dfb613b0677 100644 GIT binary patch delta 54 zcmcbueO{aUGcPX}0}yC=_iW^z&mEZ)dHpGhN4KR2&LKP9mwQ9rS?BqP2&zbIQjF+DY}BtESu SF*g;&kIzre+Lg^w0NRt7XZZ@3!VS~ 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 65b4de9b702d49c5ab758522295709fa8d672d58..d1fb5e0b8d18698be026e14f00fa4e7ced4fd0e6 100644 GIT binary patch delta 37 rcmez3_1TO2GcPX}0}x!Lg^w0NTDL;%NU3%URR 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 50032571a3d8a3902b04651a5086e2e5e6265125..04cd414f3c268f21dcae843d55fb60f702905caf 100644 GIT binary patch delta 37 rcmcbhc3zG9GcPX}0}x!@I$y!-; 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 2ba5f61b0d204ff936fe292abde5937dff17bb53..5309359f6c449a3bcdd2216601143928cd497408 100644 GIT binary patch delta 37 rcmeC+Zs+Fy%*)Hg00dXJPT0up#>`!+pPN^rpQ7&@?72CXS(^y}!NCep delta 38 scmZqY?%?MB%*)Hg00eh$_HE>LW9BK-&&?~*Pu6!VE-l_1!>r8&0Ml0sEdT%j diff --git a/agent_framework_oci/libs/agent_framework/src/agent_framework/workflows/__pycache__/input_contract.cpython-313.pyc b/agent_framework_oci/libs/agent_framework/src/agent_framework/workflows/__pycache__/input_contract.cpython-313.pyc index c521ad146e0151a9482105ed259ceff6a9c4b954..b69667dc5998d92c8609d4ea62813036257e3890 100644 GIT binary patch delta 37 rcmX>ncvg`6GcPX}0}x!@I$rcutV}GcPX}0}$N3*|(89h?%EeKR2&LKUv?gxU_h426HMa0PAxMBLDyZ diff --git a/agent_framework_oci/libs/agent_framework/src/agent_framework/workflows/__pycache__/models.cpython-313.pyc b/agent_framework_oci/libs/agent_framework/src/agent_framework/workflows/__pycache__/models.cpython-313.pyc index dba65ea8330b9ba604afdbdecd4555913d3542c3..2d18d6151c20addc78ed9058093e461b7d924f33 100644 GIT binary patch delta 37 rcmeyU@j-+8GcPX}0}x!@I$R^er{fgezLw}acS}9_l&DK0P36#6aWAK 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 f695a2fc2b6f070a3e6412367f38f405e783bae5..b709e0d273b1b78bbed319d1134affc1a1d12aa6 100644 GIT binary patch delta 39 tcmccG$aJNViTg7zFBbz4T-`chBX=w_ce#FUUWtB+zHhMS<`U+_S^)o647&gT delta 40 ucmcc8$aJ-liTg7zFBbz4+`ZYikvo=|r$RqBuS7pt-?6x~cylpxVl4m?oeh`( 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 5115c168f4d54cb4aa370b09c3ae867dfc320add..59cb34408e1e8c28d7379f2b6f2718f71fd9d935 100644 GIT binary patch delta 37 scmZ3_zmA{#GcPX}0}x!@I$Y0M~I0DF6Tf delta 38 scmZ3-zn-7_GcPX}0}$N3*|(8LWm31$&&?~*Pf09E)KAN-h%e7C%GOUzPt7ZdPb*5y QO$G7e^OG|t=QGU(0CFi6y#N3J diff --git a/agent_framework_oci/tests/__pycache__/test_aoferta_transaction_continuation.cpython-313-pytest-9.0.2.pyc b/agent_framework_oci/tests/__pycache__/test_aoferta_transaction_continuation.cpython-313-pytest-9.0.2.pyc index b04726277abc3398e7ae9d2f336dd5dcd67a1d8e..130bc82e04fd3f273ac3f7f3286d5f070cce5e2f 100644 GIT binary patch delta 57 zcmZp6edxmdnU|M~0SI)xdp2^P;E?y#&&?~*Pf09E)Xz`Oj89BSEGS7Wicia|h%e7C L%HAx(nJ)&&?~*Pf09E)GsqMFf7k6%GOUzPt7ZdPtMOP kNi2@fPtJ@lNzEec-0ElxTJpcdz diff --git a/agent_framework_oci/tests/__pycache__/test_fraseologia_business_parameter_prompt.cpython-313-pytest-9.0.2.pyc b/agent_framework_oci/tests/__pycache__/test_fraseologia_business_parameter_prompt.cpython-313-pytest-9.0.2.pyc new file mode 100644 index 0000000000000000000000000000000000000000..35408331c2f0c2b455bc23977eec18aec5e2fe08 GIT binary patch literal 6151 zcmeHL&2JM&6yLQc&d0`SNKpc9sWuxRM8JkZf`SO7R!C6zuu+`QswrJf)|0Sc?^v^I zAU<*EA%|Wo`It*3a^u*4p!Z$dRjgH|9(rmIRYh(+_08^jV*?dZrEsXcn#{i6n>Vv> zo}+ocdHcy^p8(JK+uuFjV%iVndzfJvjw8z=nJVHmBhnF4}}?8^$y3DP@l*`Ti`wZ_6F)CCf00WofWeaF|aC zf~*#|yjedeZ>AazB1E5B5QsM>>olJyI^PyM0lx9>dhR6`ggY(E!$4k<2*j?Piyi&^z_n6<9_fDJWkEpub$7O7nhdrrdF0RX@w2&RY#yZplIw9 zfZpQ2ajKkQ0jUJqY&|3`)QU4YU~IIY8Njxg3C!{_*|L}ni%ER_#sRyUsU@#)b~WrE zxdQA;-a}!lB6<62fa(WgGz_{5aI4VRZ9|c|hUA7c;-JyWWta1vuvO9M_H2Oa2Vyh~ zy2|AUxos#?*U)G~I_{vc3NWj&JruSo8r!}ep!$Ir4TG)%yec$y+fbygp|OT^(n0Er zgv}-xx5$wJC|@KZOR$ptW$HtfGf02WgVM3$-}MHw5gnJP1c(J z@jG*Hu_igDz<>2o__Kb3F1$N`T}wXTr~9;n=6;0h?c5#;TNTYY(sTgpEplW4${*o+ z8=AXqC{owZTthnMAf>YCO3EGzTNNqW*8)^O5TjwxRTd-UwxLK3M*dMYA$dK`>IoZy zt$D|_p!A{!g%5~<%E(h@*id$fR9<(eW4s#cUBSHC#LE~3!fPAqW(l(#!$#gxp&nzb zGi;Nb8q_f?wWWUHmwWuegr7hCFz*V!Ye9DInJv&qrAU+$#0Mthq00000 diff --git a/agent_framework_oci/tests/__pycache__/test_judge_transaction_sampling.cpython-313-pytest-9.0.2.pyc b/agent_framework_oci/tests/__pycache__/test_judge_transaction_sampling.cpython-313-pytest-9.0.2.pyc new file mode 100644 index 0000000000000000000000000000000000000000..2721be2a3c042b35d539d6304bcb3472d269a429 GIT binary patch literal 6299 zcmdT|OKcm*8J=A(mv2(0En8A#n|`G60ud!ymS2(LsPZG08Y<9=jSCi7tjLv0d%4TZ zF0DvK3!yQJqzMoMMF1Bq&|V5ym%_&$i=KKY3aLpNVc?=cdkB1!qXb2B>i^Gjmy|8o zwNa(bfc$r!|NQg%{%>Y8m5LJxeUtBA{Y`|Be_+B7QZusoLx{XjRH6!#gbMsCPJ|pW zM!HYDA6ZMK#t# zu8K6J#(M}&s|k=9H3_mqO@Z7sFDU7I*r=cgETdLyb<-&5HN&avWkV5JYNAn@H(ssQ z4YO()EWwl0hSMJt%MyxWI^mw*8oVAqwFsf$sNevZ^1q)ie^x^6!V)5HzWO6j!VkJ715M~c-F*W@K6+w z5=AV`C{ZTcvsaC>%OWtB#sbU%cFH1#rO%p1g^!-ed`TUe!=heqSQ>3u+MG?>7g{%! z5U)fJVa*VzcF0K@#mJu*Ry+<$8SvD z&G!EE`I`qII3W~h~q$BcuB2r{b11_U*pm-+=Ykr#)XD-o=Z&{~nA5afz#(mq}coqd@Q z`~0z{>Ptc;MM#N5BW6wG2p$LkXQ`reLQvCJj+_vOn^votQrfRL-QmYt-^0Y;4KF}u z<=~cHvaNc4>@X?e-sZu#*|$;$7;Cc;kHrIFyVg^Jno&ER$jWE7^s}v%tr-oh1E_eM zb*)xlRmWp%i~bBewr0q$sqV^4eQ?gKu$onO7sCSrPst^O6CT=hb@_R%FYG+o*X4f= zaDk(OC5{U9@p+=`DbNGZV1~kC5*Do(*KPB5H&H!&U{T%BYdu{CU%;mx*ZG5V5 z@$&R5V>6eh3T(Gyo7HmF)v3l?HOjip(stbdj6!U77wZN~wV^c}Vu{6E+cr74vQB+L zueyNVn%@`q581XR97`Jxi`EQRN5`Ou6wftF)XH^@awqBBLkwFHz7$7CSA?a3XOGnv zhZHCN{bnRLn#0(D;vB>8pyDX;ALK^8+>?sKLZ)G{NK@I0#6nOR#UP3y6eqt-qjRG! z*K``&)E7^$q&V2Hi0&*}<*E&Cv0<^K?{PHUH0c>MHvUq55#5-kQ?^ShLq3>Zr)9fV z*THipp;()3R85!*hsmZ5H5}HZIp4DzW`$SP=1qH6Z_Zl`+}@ml8d!Ran+4N-fl`~Y z-3XjD-PMdY>ZWe-g;OKZyXQ`6 z{lM@i-TC!rmG#4C*1MJ4=T^I3xE~95$2Um0D{(&@9T((H5`88DA`@M{^m&#fGjA=t zGqNi6-Wud$Ez$e2)ck!Q^}aO{q`b&SQt!J%LEhSyl$ZS%XtmH@!%sm|Uma+^H5k+h zA|Fb<5Brh?jGOzCKkl3_@jXeXUljZm?yK=5 znKne<)+ZL9#*cIaeq@)L-4Q>sdy5|lIn~-yrcQ0wF59M^JAdKZeS`D_?0(vZB9EdU z1kkzx_%PAFMu#vH2?jlh;xr1xPmWy_83%m{#Tbfjq9}lP7?VagCLy|-hHF&XdE~>G zq|H&grnS5Y{SN3nf_gsz@hFVyTpbu&k9MvDNM-j12o;eKp`@=NeAz) zoW(S0%rJ)x3t4OHbpiO6+n^TG%sO0T9c{^=wnt{Xi#XLm4WgLya}bZhirza*02Qm> zIQ=_mt?R<-zKa_nk)wl%=pZ6GY{+C^_o~!&bN21gkEJf}_h+f=ty4kDi+r>tZ>^Pr zf}67sRE8wzc$kRb^`0N|-|rL=i4Hso{fIp^{fKk=k=Q~%l3xS*kyKMpWaU>wKTS`Z#uM#f=IO5ATJN z(~C9}r~$T}g1_@85Rbx)&O4FyXz%L5{yPU(4~zj|oCP+~!i&%4|4%ldWLea|%yRT* z-I{m(&3iXbxUA->u|TWvk{JuK@B+^BJnTn*z{2>1;84UVcpRJuzXWUzo@EzodM)q0 z9C{!Aw8-C^y_Z#d1LT)Y&gM8w^Lgjbu-*$Ra%&bH@!ob{q$VWs8NoqMwGk2o;ctZ8 zAaADsN)CNW#{Vgc!jy2IpxlU){khxH7ep2^pJfxm{?B@2AiBar_hv^}*w6L<8@3^z A-~a#s literal 0 HcmV?d00001 diff --git a/agent_framework_oci/tests/__pycache__/test_mcp_parameter_extraction_runtime.cpython-313-pytest-9.0.2.pyc b/agent_framework_oci/tests/__pycache__/test_mcp_parameter_extraction_runtime.cpython-313-pytest-9.0.2.pyc index 391c614155b31bbce990941755405a5037a4ecbf..c7491df0ec8f5e5199cf080a3e1af5c96800f50a 100644 GIT binary patch delta 46 zcmccPa>9lCGcPX}0}$wX_iW^T&MxAlpPN^rpORRTsGpc-5ucWsmzc9zio;0?08$DL AVgLXD delta 66 zcmX@%a>s@HGcPX}0}wQ*^=;&S&aM%rpPN^rpORRTsGpb?pOaXUT3n)^n4X$f5}#I- Un44OjUz8o6pPadwjl)R_0PQ^%_5c6? diff --git a/agent_framework_oci/tests/__pycache__/test_observer_cross_loop_deadlock_fix.cpython-313-pytest-9.0.2.pyc b/agent_framework_oci/tests/__pycache__/test_observer_cross_loop_deadlock_fix.cpython-313-pytest-9.0.2.pyc new file mode 100644 index 0000000000000000000000000000000000000000..15dcc40b9092794e03750ee7e4cbeecce49d5f5c GIT binary patch literal 11432 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 literal 0 HcmV?d00001 diff --git a/agent_framework_oci/tests/__pycache__/test_paused_workflow_resume_precedence.cpython-313-pytest-9.0.2.pyc b/agent_framework_oci/tests/__pycache__/test_paused_workflow_resume_precedence.cpython-313-pytest-9.0.2.pyc index 4ef41f56ecfce6934bc64a5a276153b1676393e9..4cbb1d17a1115839654b07834ea7ce9221fd55b9 100644 GIT binary patch delta 5733 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 delta 574 zcmdmbk8wjMBj0CUUM>b8Sa`ZGt3`eyp9G`CMs-O>mUKo<;mu);flTUQ`nh=}`YDMe ziTY`o74hZyMcMj^>8W`o@o7bgxv3z2e13A~=3~sa#27UvFO-sEtlGRsDwdJ4W3!Y@ zAs0}rM{P5AIna`#3J_5>*-KrUv37Eq`VsDWkU#^7Xq@b-Va`1X#B2f)&6C?TdKu?z z7S-(Ikke!;0_(2?%KYL>EG|whDp63?D5x~mEC!l)&`^i17NlwFS&W-DFLcynAjiN%$9 u$(i{@b3kS;0}<;$#HPvdd9qylfJ{apE}lBMEpHO{XD3EUMw=ojpa=lp1*ACu diff --git a/agent_framework_oci/tests/__pycache__/test_phraseology_rewrite_revalidation.cpython-313-pytest-9.0.2.pyc b/agent_framework_oci/tests/__pycache__/test_phraseology_rewrite_revalidation.cpython-313-pytest-9.0.2.pyc index 6fa7a4b845d60bab40d8089cc5f9201c5cd34ae0..ab54f2cdf209b07d0407170b82edc5c9e0646446 100644 GIT binary patch delta 1297 zcma)*-)|IE6vumaW_PwbF4Rg1Y!f@}F0zBQ3oWE=N-AwB7Iyhjm!c)m<#uOUX1lX9 zp1DiACRig0YAp2OCYVS}2>byc>yswd@J`aIiOKk4j1QWaDCvs^jNY?L8c29xv-`>S ze9yUi=iYPX>%wn^=z267X%L^+(o2P3zli=x+K#5|5=$AB(Ug<7a@3$MGa)x)E#&4M znB#+i`G_i3ToS+an|vj(ye%8bD%o(Clx^$^WF!5-L_@DMLv)p&kq%Fs^c67Y!D8m` zL@e>chlVnl;h~YVF8MO6xTgPtO&4;MG1GRL=Qq0G2$8c4J>W<3v}jEOWv1b)VA`f( zQD!+MepebJ9sHp*Nlx(zd2mM}`K`Wsc52n0U+Z63YpFcg9BzvI)evrs{NshhwjT^d zhc@%u^6SkV_z*#l(ODCkg@(?%!EZ=c8_IUXP61tlCe%7&mw+b;XqpBuqSML$2o+;p zDEA>+5VcG%s$LFClJr)uD;JxC&?+q65j#kB@!8m;Xk3JTut=xPA|$xmx zlv5&64iNrTY@C1g^55zR7D{fV8%Fu(ZFzM}#BdNX%2mxE2e_+EH(?b#nfgWB8F^{8 zOu+zZ6?sd0Qhft!jv&%}to?$xxRv&wyK5^gbPo&Y+d)B%2k;foWTGJeGDab1x?tv+ zIQ3e`tBGS+bsTX5F^+f>kwu(DOmHo}WwC_v6#*OouUupvTojSM#aC^oG-p;^%JS#I z!7_%RSR3)mt_c?`&jCN|fHiBCXc5k1{xs&*18yZpJp%9Xg_wiHYz^RAcFx;g)RfO6owIRA>J17@JhuXJ)R`W`%~AIyzmZz!GB6+L|c=) z#}{h{4hmcR%hQd5v~b_uRKEgkN7AkI=^nfzOo$s+m2B#nuBnI-`iXHAF0MqvH$=8 delta 1262 zcma)*-)kII6vuOSXLq(c-F6L0Ae(46*=B!EvR2j0uIQeg-8!Qc2DWY5$m(lG)hm?j zs;9dJyHqZChUJ*LXB<{mNw*9*QRH2LZEl5+u}}Ez!1XqbErmxy>6Yh$t4x*8|K2CI zP#ILEs9)6z0q;5oUIemrHR%qk@+Fl6KAAW5mTl<9QuZx?nImbk^*Xw;)r{Jlz<# zUNlU4lJ9kW#765{_e?;3Q4}@4^eZ{Irhyq=>)8@_chK`-pz&-8>Xd-mNit%* zhcCN^r+Xfege+_qD@Mr^FCR!flb(a?EN~8(2lBuIa2~k87gKG!>j+N?_%a#prs=t~ zEi$#uS1h}_VbmPmE3H!*wkmKL-l)6j7_?P(ZSo^FmDkEu-J~Mw7g1MUaB2nJbq(?c z={3l&9LcLTS-Lk&uR>-^{D;&?cp32}o=#WTwfgn+7s34Cx607IH1<_n6Ux~4(&7I* zX>4B^YNq!ei|@gGr3tFFZPeJuopoOVTV742LQano6UUUgLj0Kt&>GOV z`^L>ykeYxcptd%<{3ZmPgla$r*a5JmADZ0FUznPw|I=zbbOOMZYMkCi+}IiIq<4TT zz<;)IsM*3xFnj8#ec-Bq8yDbOx`W?8v%qfDdk5|^c8(uBt16hUZ7O>P w&GF>m$HR>gmMon%d|7vE)l%7}Ygp$7fY$u;-TIMH%U;U delta 68 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 diff --git a/agent_framework_oci/tests/__pycache__/test_transaction_state_regression_matrix.cpython-313-pytest-9.0.2.pyc b/agent_framework_oci/tests/__pycache__/test_transaction_state_regression_matrix.cpython-313-pytest-9.0.2.pyc index e1bc6e74aaee5b5c74f870d302dcb9b179a14140..7b19f2652804fe5343531af8cd1cade04944e6f5 100644 GIT binary patch delta 10713 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 TcZ~9mtGXKg7Oh(=vMu}%PkXow delta 5954 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 ai-Pu>&u7ImF}zNM diff --git a/agent_framework_oci/tests/__pycache__/test_transactional_tool_flow.cpython-313-pytest-9.0.2.pyc b/agent_framework_oci/tests/__pycache__/test_transactional_tool_flow.cpython-313-pytest-9.0.2.pyc index 9756659cac1a335d508ef5e31af88ecfb8fb3379..6300ab3ae6354d2ef1df7ed2dd382c300c4317af 100644 GIT binary patch delta 63 zcmbQXjHP!O3-@PUUM>b8(Dm-w$o+sv-bFt*uS7p3u_RGHKRGi#F(t8}B(*3$EwduN RJijQrS(tabFfSuB8vuVL6XpN_ delta 72 zcmeBO#xiXg3-@PUUM>b8Xi)3h$o+sv!&g5yuS7p3u_RGHF)cnPu_U#)L_aY-HLoN- attc@!wLHHlJ3c=-vzd!`I~Ok_GaCS3U>A!3 diff --git a/agent_framework_oci/tests/test_compliance_protocol_expected_values.py b/agent_framework_oci/tests/test_compliance_protocol_expected_values.py new file mode 100644 index 0000000..80588af --- /dev/null +++ b/agent_framework_oci/tests/test_compliance_protocol_expected_values.py @@ -0,0 +1,60 @@ +import pytest + +from agent_framework.guardrails.rails import ComplianceRail + + +@pytest.mark.asyncio +async def test_cmp_accepts_expected_protocol_directly_even_when_regex_misses_markdown_distance(): + rail = ComplianceRail() + text = ( + "[FaturasAgent] Entendido. Seu aceite foi registrado e o protocolo de atendimento " + "foi aberto com o número **1234567890**." + ) + + decision = await rail.evaluate( + text, + { + "tipo_fluxo": "ajuste", + "expected_protocols": ["1234567890"], + }, + ) + + assert decision.allowed is True + assert decision.sanitized_text is None + assert decision.metadata["protocol_validation"] == "expected_values" + assert decision.metadata["expected_protocols"] == ["1234567890"] + + +@pytest.mark.asyncio +async def test_cmp_does_not_accept_a_different_protocol_when_expected_value_is_known(): + rail = ComplianceRail() + text = "Seu protocolo é 9999999999." + + decision = await rail.evaluate( + text, + { + "requer_protocolo": True, + "expected_protocols": ["1234567890"], + }, + ) + + assert decision.allowed is True + assert decision.sanitized_text is not None + assert "um dois três quatro cinco seis sete oito nove zero" in decision.sanitized_text + assert decision.metadata["missing_protocols_spoken"] == [ + "um dois três quatro cinco seis sete oito nove zero" + ] + assert decision.metadata["protocol_validation"] == "expected_values" + + +@pytest.mark.asyncio +async def test_cmp_keeps_regex_compatibility_when_expected_protocols_are_unavailable(): + rail = ComplianceRail() + + decision = await rail.evaluate( + "Seu protocolo é 1234567890.", + {"requer_protocolo": True}, + ) + + assert decision.allowed is True + assert decision.metadata["protocol_validation"] == "generic_regex" diff --git a/agent_framework_oci/tests/test_structured_output_parser.py b/agent_framework_oci/tests/test_structured_output_parser.py new file mode 100644 index 0000000..40acf7f --- /dev/null +++ b/agent_framework_oci/tests/test_structured_output_parser.py @@ -0,0 +1,62 @@ +import pytest + +from agent_framework.llm.structured_output import ( + StructuredOutputError, + parse_json_object, + parse_structured_output, +) + + +def test_strict_json_object(): + assert parse_json_object('{"decision":"KEEP","confidence":0.9}') == { + "decision": "KEEP", + "confidence": 0.9, + } + + +def test_single_quotes_python_literal(): + assert parse_json_object("{'decision': 'KEEP', 'confidence': 0.9, 'ok': True, 'reason': None}") == { + "decision": "KEEP", + "confidence": 0.9, + "ok": True, + "reason": None, + } + + +def test_prose_around_json(): + raw = 'Resultado da análise:\n{"decision":"ROUTE","confidence":0.8}\nFim.' + assert parse_json_object(raw)["decision"] == "ROUTE" + + +def test_prose_around_single_quoted_mapping(): + raw = "Vou retornar o objeto pedido: {'decision': 'HANDOFF', 'confidence': 0.7} texto final" + assert parse_json_object(raw)["decision"] == "HANDOFF" + + +def test_markdown_fence(): + raw = "```json\n{\"allowed\": true, \"reason\": \"OK\"}\n```" + assert parse_json_object(raw) == {"allowed": True, "reason": "OK"} + + +def test_braces_inside_string_do_not_break_extraction(): + raw = "prefix {'reason': 'cliente disse {nao}', 'allowed': True} suffix" + assert parse_json_object(raw)["reason"] == "cliente disse {nao}" + + +def test_apostrophe_inside_double_quoted_json_is_preserved(): + raw = 'texto {"name":"D\'Ávila","allowed":true} fim' + assert parse_json_object(raw)["name"] == "D'Ávila" + + +def test_array_supported_by_generic_parser(): + assert parse_structured_output("prefix [1, 2, 3] suffix", expected_type=list) == [1, 2, 3] + + +def test_object_wrapper_rejects_array(): + with pytest.raises(StructuredOutputError): + parse_json_object("[1,2,3]") + + +def test_does_not_execute_arbitrary_python(): + with pytest.raises(StructuredOutputError): + parse_json_object("{'x': __import__('os').system('echo unsafe')}") diff --git a/agent_framework_oci/tests/test_transaction_state_router_interruption.py b/agent_framework_oci/tests/test_transaction_state_router_interruption.py index f9eff09..d6fe8ed 100644 --- a/agent_framework_oci/tests/test_transaction_state_router_interruption.py +++ b/agent_framework_oci/tests/test_transaction_state_router_interruption.py @@ -384,7 +384,7 @@ def test_agent_state_declares_durable_transaction_latch(): import importlib.util from pathlib import Path - state_path = Path(__file__).parents[2] / "app" / "state.py" + state_path = Path(__file__).parents[1] / "templates" / "agent_template_backend" / "app" / "state.py" spec = importlib.util.spec_from_file_location("contas_agent_state_v10", state_path) module = importlib.util.module_from_spec(spec) assert spec and spec.loader diff --git a/agent_framework_oci/tests/unit/__pycache__/test_agent_runtime.cpython-313-pytest-9.0.2.pyc b/agent_framework_oci/tests/unit/__pycache__/test_agent_runtime.cpython-313-pytest-9.0.2.pyc new file mode 100644 index 0000000000000000000000000000000000000000..0cad77863aa1155447ab2f2b962245691862bb11 GIT binary patch literal 3349 zcmb_e>u(%I67QbJ?s)x*Uy0Wnj*S745oB%bYyu=}T@>O2Cm7`MN|7AVOxEMgII}ZL z_iPdeaqRTYN}?ZyE}uR9XWe*`8x%nZv>MxJs#}bguyLjAq$^H6w6+jQJIoQGaA+N(MpP@ zU`08bo-wE)=hU+uGZ~u6qhU0PENui?`h`qUjkMCv3#qx`BP%t6iZMfb zs@P0#3vSlLyw`GTbo{fBXmfe z21~BzkR|upSm>~jjWxgqIV7;(4+)K8r%+$vY1{R$1eYCt`1h-#9RWKZ5v8af1*aVwVt}A*2>8HsE4}cMGgJL9Nn&t(0 z00`hsvw{&{KFtYoP>_cNxla(0kEAMjdn)cHiTEH{8p!MDMst~MH{jj* zC*T+bc`GX<3Cu@jGzaT@o5&jD*itRcQY^iojNv3zJ_9-8670BwZ>h6-7xJ-{3J#T( zC!aUSTKo{9g=QX^Yi5MjIgo_YWfiiCalZekQjBG-js+u;nUlpJ;iA5kXHLMx zBEZ&miU_GaZ4{MpQG_3~A$XtkZT?|Kfyom!UMTUtrZurdYZ2w3ZDR;Sff z*2b~q^aT;TvbE{zPv%-ZoUA9hlHP$LSHkrP@RazP_B3C$x`RqNCGo$S*tq!rT{iv} z{%OF!=lroY{Cod${83^@a<@N(e{&b$-`j@Sz42F*Gk#Yxl}K9q3TosVtIz5$>#?Vd zKjA4O(UtU(r+gK>b)||7^bb7yjw}`fv%I4L>57ETwGc{%%k@Q3&bcOLO@(VT@Eo45 z1bzrPpY8)EoA?){R5J1P{)Z0NSH?}2FO~9QIB7DTvVC?{?o?ro1DU+uV>3_|N|_?a zz+{p3N=?^~h>a5_%e)*9@{ul3TacwI^Gc##Y}IAyF;zMa+l8VDIsv0yM;woiIBs^z zti<~vxr*XMAO#bdr5AbT@AVZ?)rd`bA53~4p-!Dvf?D0C4)20xamtzOcU+QV-XXnINHt}YZr@GA_bG}Vvn;9(4S9QRBs-QOmDB^a1G6KVpuSB)}wrl@?&aIx=8W`Rjcw}SXk^e4yJh=Yo)Fc-5a^=I7A29`Iwmsh8uJgsZlx98uO+SIbq^Qo3yJJ#f)!56#cHd-7kygk217+8?l z>fHC%i8oHHYq<{&NwU$I+tlLcQ!Tf4qRB;rFJP|NoZDz|Vj&j(OlWJ$GzXt+xgT`Y za~c24#3%6T!_y`F5uSch``>gQ49#9{B;i7z00EvQQGgX9pMcW~)VWIC5dI39Q#>8d z(c@xID%!&JaHa0B=r5z+uGb4P=vg8D;i4kxN1?6NY6 diff --git a/agent_framework_oci/tests/unit/__pycache__/test_cache.cpython-313-pytest-9.0.2.pyc b/agent_framework_oci/tests/unit/__pycache__/test_cache.cpython-313-pytest-9.0.2.pyc new file mode 100644 index 0000000000000000000000000000000000000000..092f7633b75a7cd18b19f01beb9c5b201feabe87 GIT binary patch literal 3342 zcmeHJO>7fK6rS0gwH^P2gg}~*ggBvvERX~zPWVyXmZXLfXexPY6)BZg#@VDUw%5#V zfN-KvsZfvrAw;D15Q!ehrN{Qt9#BM2t>na!3|k~BwLNf4$)#}WoAIt~(iB8*l{#8~ z^WK{`Z)V<(-?uA)fEPjQK79G(vjRfDGR0}2^S1IebT^QK6nq#_%zI%(G=v};Ayf*M zMqJdzN8Hp6y>QqwQbTJ-ywn>+AG%|WcC4x{=C4w0Q4u$x0b8d2mzYPY<^?9PEIndT zMrFYY9Lm0{Wpp|{oJfA8S#@ux43nmgO_|y_wn`2$DKrudsSX){dul#D#tD zAf)$q+0(~$gvMM>teD4@4CW9uEM(!)8u z&aBn>`&Su9EZaw3HrGC$YyW>e*OSPD4&u=dIPUkL(OdAlyjz^Wa$wZL$1QyF5xcB1 zwtS|URt+twXUB~>{8WfU=J1*IuXW|7L$VQ!M1o8V%f_5wiC|+8ep;I_42_z6Y*03s zad7gdA6Z*|6M_mUL#~RFGMp%~m$E;cB^sJ(iIV`{w{p{_W|(S%TJ>r&kxr{r%h9Bs z$t9>})u={dLSq)Ic0XSeOmbCv=)gn5uRrgTd((wdf& zU6z#O^}+}1sHJW1vZ|E+YNfBFl;RFlE4vN$Hx2S;g?lquvv)jUCVHt31xU?NeIk|C z)QQyTUUnFxcPg7Qxd=ysa@CWYwu1basjQmeWvn!yvh>3NQdBeO7FdE+7UNHVN9Zj2 z&EI_Ky|dAK-gQ^xi}KasnJqIXW}0rFxFF}fp&|+8N$6gEO|>m}A+iEP(lexBg1^=iM`;;B70CwmfNDz1Ftb zaGo&mZ7UM{StQ%|I!s-vk_*hS>{S-P<*^${kofldr0u@1{fQBU!=LLoK=3Ub-ABG^ z0_i&(jgaq$+CiLe#Rm|XZ)4{90enCp^MgYYD0d?m@CU?EV3>qJjzw_^eUIgc#e!s`eb-5EVfmjuXxq@n<-r%oMRT>%St# zCEyHlG+f0Ql{sq=HdJrXslQ_{@+6L@BH5hbQe28V?y@<ttE3Agcu&vGm|gkz@XFr_RsRyN`W~qIr_Z=2sGjLg_fd9fD7yue zkvnB?hSmefHM~4i_L)H&7;Ip$kpcViqpvV%V$cjAdn_Rxf?pqPWwtg3n;En-2r}pZ zFxZ7E)y`m$c7kGc@nSe$`G&L0Aym?g4r6M%Pc?Nl9im;}&UR`14#10IVACb_%gh)0 z1>u3ebtYEuzsgFa|H{^jTdy`;O%=SsA_?Y6aCN!bIlDJc02X{Zi^P5w$xdFbn7ULY z7noz&t1N)|UVX#O#%ql;;`NrIuQgBP*%}TDKDkKjXOYNxUu#KSs*(%LyX;jKz~!-o zqz+aDeXUOn_JMjX938~p;Aju|wh5#=>u@wg?$ix2WxfkX!(?6_a)EL;gc*hz%C(l~ z*iAEZ_})2ommE5s|QQnMupFNbo#6x}A?QzwNXS0{#X0 CxNUp@ literal 0 HcmV?d00001 diff --git a/agent_framework_oci/tests/unit/__pycache__/test_cache_distributed.cpython-313-pytest-9.0.2.pyc b/agent_framework_oci/tests/unit/__pycache__/test_cache_distributed.cpython-313-pytest-9.0.2.pyc new file mode 100644 index 0000000000000000000000000000000000000000..f0a24c1797d7d55af87ef6a8fcaa4f06f578b0df GIT binary patch literal 2015 zcmeHH&2Jk;6rb5$uh(CpZj9wLP+KWfUDDV|>a-QY&?YpYiO9i=rAk3sw)Q$PS?{i9 z*KJb?5hxO>g47^X5eW`GA-KTbP_^Qm5+t`Hq)Nagw}MY_;?1ttHW3I3i5sKcH^1MT z_c0%DrjtlS5wwY=kKW$G2>rxJ(6}z>m;i1g1u1w55$yHcBJXfHv?!2J&L0tp2qWB5 zcu^wKVuVC;=uNSl3WD|fa=MQLr0_@3OqY=ODwc(P#+GG{9(uLmxTJBpitPjI~1O85tN9Y*J!L(OkS$+!=n17|i6QTuELesTn;n^&va*VFpkOld91mL@ZxI-S(OuA-W61r3@ax;Rj9q@_&*`Bd6RN;fU{G+81SSn(kn-CE)MJ23A z6>$=KEWGkmkYOO!p+MK~A!|5@74$k3R0*4W3EOYL84UNW1N8U1mP7yVbNOHF^D2_i z0$zU0ldni<`3v}Oo#E?Pjx1BWPVtp}R;V)mohy}OeEsnAC+v+W*~yhkIR=Ze16Pv= z9TUatLz?60#P!Bb%MMeXmZOA~BIO<3CG2WZepPpA^qjrn>W-^wgeKLhW*92bZBn(G zwnlUsQ5~(WGYuU&?*(mG<^@75LWkA5MVgwc>ep;TGc^}Rs94ht-PL7@a>f+=(==4| zUWpjwQT=I6(gAX6kWBl;k2^C+&N%GO<+_cYD>O~FP}5wkKrDEQRGV1!hM}wV#Bz?;JEuN5+K$1{_?@{glXuQCaP~oLye)LU?}YK)7rxF4RCfP9<8Or|`UW>QX2>2j-KxDC^xaaJikHlq6VnfGf4 zYAjFmtEAyVZT3_&+|?2G@=?)up`+TWZn|)aT2sGjk@dV+3BL5MfPW)|rbgCjSaUYa zYQypl`zzFeK!`lc!bvYRty;^_UnVaAWf#$z0P%#!7(Yhn19T(t7%e;z5hr~(`rc?8 Vryk(cFPw-^c6h`+?I9wA#~-|5qoe=; literal 0 HcmV?d00001 diff --git a/agent_framework_oci/tests/unit/__pycache__/test_imports_compile.cpython-313-pytest-9.0.2.pyc b/agent_framework_oci/tests/unit/__pycache__/test_imports_compile.cpython-313-pytest-9.0.2.pyc new file mode 100644 index 0000000000000000000000000000000000000000..a31b823c5cf04e91cc8b0cccce0b9c564ec0cc47 GIT binary patch literal 593 zcmZ8eJx?4l5FPJs!bczorGgZ>0)aMBb|oTFMTq)Ny5@d>+v=`+)5zQquAx z_(3#2Bnm3JNcRUaUhXK)lIP8g-+N=r^X=_Tp!IWb_vexDB^1jQEt2^GCHF9b5gP!q z4x@f-qaO4V{Lq6@v=8{PWNG{wB*S7M>>#+rw3jZVAAlw=LbkwYfw6`X(rAc5lqUYG zD5Z9Mf})n!1~0Qh6c_R>`fsa;D9VgBw-T>ZA^ne40%?oO#whJSEi)%IJ}t9i J^8(I4W&rj96WIU& delta 66 zcmbQ($T+8wk?S)rFBbz4T;9KtE1y$6SwAz`o?G*a} delta 77 zcmX^7p7G{;My}7iyj%=Gz_)iJ*L_B#4E@}^68)6Kl0^OFjMU`pg8a<9lKA4pwAA>t e%nJR)^i&`>ttc@!wLHHlJ3c=-b2BT`zES```5e*! diff --git a/agent_framework_oci/tests/unit/__pycache__/test_langgraph_checkpoint_saver.cpython-313-pytest-9.0.2.pyc b/agent_framework_oci/tests/unit/__pycache__/test_langgraph_checkpoint_saver.cpython-313-pytest-9.0.2.pyc index bb8f5cf23edf2f157ab065af7b5a62d31671eb70..192c98497a2e032e3025a5a19ce754d73ebb2dc1 100644 GIT binary patch delta 54 zcmZ1^G+l`MGcPX}0}$wX_iW@=W|Q&M&&?~*Pf09E)Gx{}ElG_pD9TUE%t?(;%dFTO I%666s0HHGxMgRZ+ delta 65 zcmbO(v`C2iGcPX}0}w0;?c2z$%%&cqpPN^rpORRTsGpWu5nrBPl&znbo|;z@pH`HZ Rn+oE`=O<@w_F_BB1OSuI799Wp diff --git a/agent_framework_oci/tests/unit/__pycache__/test_langgraph_telemetry.cpython-313-pytest-9.0.2.pyc b/agent_framework_oci/tests/unit/__pycache__/test_langgraph_telemetry.cpython-313-pytest-9.0.2.pyc new file mode 100644 index 0000000000000000000000000000000000000000..e4adf4bcec8c6e3ee9b38fd6387d23bfe1c35c80 GIT binary patch literal 4715 zcmeHKU2GKB6~1?7c6ROAwO#)ZuoJS_IAvqA=EsJFV18`CF@$aEVJVVPN8{buWx{%9 zxibb#UMQ*BphhB6gvtw*U!uYrRimhn;fa@4+65w`QKMFEU#R*3+E$3F4?XA3&ak_& z+D2;MdhI=P|K{9t&OP`0?$i>Ab^>MVv5(%nAQAFMYy<_`ywpC2$919-l^!FE@~3cA zbc7^1DzQk?ACZ|1Bf_!h(HM&*$$BzKRI#6^(uClvVQr`7xn95CDCgESw*0yp=_eEQ zZWjLr@5v4CC5ki^eT-T%DeA3zN4JVIOfR1~WEkZWM#)$-T(+F6ufiX7OG)i@XkI6$ zxwlMEDHBzppD;;{s!~6BkFp3_2p-EUS`FZc|S-&Ks8NfU%NelnM?iNP1Iai34UbB9MoIO9D3SPPIXVxE%m-UL?cPIk*qi_PSm56Bt^1YEKr6< zqy&a(>B)MzY*_h}#1w2wmcD3s(Xzf=vh}#eyvy_JDoU&eMn=PIvkd7b8he1Mk-u7g(8HiNkC z=QoA?7J~e?#H=_NX6zQ0G=G@B@ma%GeKxOPM;Dk zWzyCC6Zb>KUke|(=zMT6!n0$Mc^LIemIMf4(JY-qg)K#;s-TM7 zXmAcGnFWqI0~*fL>tZGn2dvqM90h;DoLQlD1|S&%L`&%*Ck00sBaYBR-Ui$4K~+K% z-W85R92L-PiI$*7>_b`cE$FwiA;x`5$UN={FLQWSS_<%^oQ;fAHF|1#T$sQ>LTPvh zlc%K&lB^WOLygUM1jBP(LG8u!1s0)Y`GF?gm}4ykbcbjhc%cI~|67Z~x4uKwnA(;W zwn8K=S#4L9th|l#R&*ZoiI)a_YcM}p5e+;Ho(AmaBrP9SSc0L-KHX3qq2-3TGjSZ+$u`zDf!dZ->Ib$!C^878WSh5%N z66YDO;~=*Wyg$sC&AcA1V6#Qt)r^Z}uo9@mw%|6|7GB;w*=2gpU>-FXUWh#fSMmt%PN!V-T`agBO z@=53A+21CHR%Rb0(wC1s>g>Dr{?+$yys=WcbEq=>=4$7jFFW_Z9qXA$y554;?*}%o z4vgF%7bAFjklA1Ol>X>?_&s*J8m_5b_QXhj+Fn-3f6;RNVh zSqfX#rdHVfKmz5%6)AnIud1Y1rTYJUDP2*9{pQ1ldN=_(Z}o+(YEvuhhDp!beD{2R z|M7?T=yT^?h}4zz%uafT&Lreth*0}XnCTHeSD<#6(wQ#luF#G3-j12Hba(LZC^YVM zQItLM%t-X!20HU{{9b#rrCKLn{TU_1Vs6sk(ws2WiLvI8=j1{-J7kgV zfHl}o5MF!EwhCt6uyRK6H^0X6m;F8-z7(F#w2?0Y9>UjLjsxP~g~`cAK%AW9Xg8h$ zBxJi#D}dg36B6$7k#JY4tr71~FULE!2MxkY0^5t?0E&YkQc*UA^=TA`K{Nu+PIe^h z@lj`@5p{O+OSg|Xb(#c0k@2WCTRR(SxtSTFCoU1CED$>5n@IGHwm3^yH{r^7n zE1Uf0!-o0;K0llmR$$Ikkwm^npF5ZkSGG?l=r8HCB7HWs9;&GhFBY%>n}iA82F<6C zv=7w)>uF|OV5ST75q3dt_qT{E*~*zV$8H|omJ7TW+v|Vs>|@`DcL7O=gPZU~q?G=SkROr{ z5?_%M&!iabeM&$)=_Nw!#{)kYSf#yH=o6xJtR@nn?+MnPbhnI3bUz<`3ZH}f`M1D7 E0R|e#%m4rY literal 0 HcmV?d00001 diff --git a/agent_framework_oci/tests/unit/__pycache__/test_llm_rich_response.cpython-313-pytest-9.0.2.pyc b/agent_framework_oci/tests/unit/__pycache__/test_llm_rich_response.cpython-313-pytest-9.0.2.pyc new file mode 100644 index 0000000000000000000000000000000000000000..44e704ddbea6336b6d254ec4d5e49befb22ad21d GIT binary patch literal 22888 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 literal 0 HcmV?d00001 diff --git a/agent_framework_oci/tests/unit/__pycache__/test_long_term_memory_autonomous.cpython-313-pytest-9.0.2.pyc b/agent_framework_oci/tests/unit/__pycache__/test_long_term_memory_autonomous.cpython-313-pytest-9.0.2.pyc new file mode 100644 index 0000000000000000000000000000000000000000..64941e751d7a5e3150ae0830ca3743f233371b81 GIT binary patch literal 7793 zcmeHM&2JmW72hS7in6NJAa!!D0g*}V^y&jdwK#9IOpY3Z5q znx2R-BN1N&TRgY?GXWByb?+^Crh|0M1W9lvL_#xR5(c^S^Ukcd#)oiEKtNdg(U(wq&oy-zltLSP0Y^xP8t`_N7s!7eu zWnz4i&*>y9I)TBW6MkO!?G6I@OjzV?83>o+fzWsrN%27`D1Id{9(-Sj%5#t83ETFB zbzED~OO@pZEyG&Us;Lu8E^DUwz#us*4D2WQtghbAuiUo+$*I)b!i~Gppw&B@o|{q^ zQuDXf+o{{>`JbtG=F>l&zMh)5PP8<^|DRq+sdthKH?5wQ)`jFpvnlIji#$D_yf&Ls z?PfW7{UbG_fcY@i?j#lEZhHPYxCGpFWzOox%H8DbY-&NBOc;dvg29Z6qyq{QgBh`AhKi-iP)@68L&R8x2LumdIbYD#<^02;if&fSq195pLaQxN zR5d;wV&yeUHuXv+Us^HAyI?zngIoaeSlABr)%(xY2ZrjW$LoXV>PO$HA3I&|I#oXr z!MnHr+hd`ye@6)U{JYRW$Rc4E+M$!+B~W-%#8T5lNH~+CBrc*By)q(~dKTf$bEKX{ zKdUF4_s_U=))7sKxjzf=t|{I{nQ6___m^>Y*)Jp(!tLt)Hj_2V zejy{V-mKJNC7gse9e(1ZSU$6YiQV$sdHtmcSz9NS$iUh1+Q>-M4E~DMB9l}&95v6P zXpFT%#c2X{+H{#ULB(mh=rqNnW;FOI+#gV5U-g5)BSIFidq#*mC#67@A?ccTU(Xax;e;j85}b!jzUfb?lv{(_O!3Z@kVDW+gm zBi3=%yl<=)aw^fwL|rKuOIkrK!Rl>wsHV28qu4r)pu%O%oGspx(4bqz&2k;g&yHoV!njQ-i`g0*YEqVFYgWf> z-Q>y!3^cvOg?_LMBwe)_itjuST;*Uvm z7wtK~E}CNsHV1JRT@o|GJjC;hK5v=MYCN`)YE8q6A}J`eb}cNC{_r!y@JU2Y60?_Iz0BpdBwD zowot$bk149#>vW~gbVEeG_k=BR9?Y40Bmf$0x$-!3tdYrA3a_pI2)r9>4$=xLGnJ5 z0U*|K=co(LlA6!CqT)->((rvQc;8ZM4&zzA*?&TdM{YP&J( zp|0Ou`R$de6tDKhZMq(cKbM^QFH-zBS2$-^HbIu)vh@as4UTe++T%*RvLVG=m(|0A zJ(x9ku`~cn#NojnkH&$PTRV`=u{=E3<58h7v)z{DhjOrI(638vK@eRS+Jm6iTr=8& zpx&l@ZjY~Og}i2xS%@3XKJ#;$(Z3!V-SK*T{_Vlo?;q9%$81I(s1A`eK68#WK3v*cDg<}-riDUr8T)$83bD_3@$8czq^8>gI-{Nm z)MNX=RQ|ANv%k4XlUV44Z$IFKE$D2iVR!mou*;k`Y{Cwg`TAUj=Q(f`!^hXBQk XQ=+&mzK}&R2h=MjcEghBr>6e{GEMp% literal 0 HcmV?d00001 diff --git a/agent_framework_oci/tests/unit/__pycache__/test_pubsub_analytics_publisher.cpython-313-pytest-9.0.2.pyc b/agent_framework_oci/tests/unit/__pycache__/test_pubsub_analytics_publisher.cpython-313-pytest-9.0.2.pyc new file mode 100644 index 0000000000000000000000000000000000000000..9e323f1e1a7f978efdbed8a091b8c313aad67b7c GIT binary patch literal 7084 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 e;X;({i#6{#HnEVCGU5m^B literal 0 HcmV?d00001 diff --git a/agent_framework_oci/tests/unit/__pycache__/test_rag_kbdb_provider.cpython-313-pytest-9.0.2.pyc b/agent_framework_oci/tests/unit/__pycache__/test_rag_kbdb_provider.cpython-313-pytest-9.0.2.pyc index 391cb27571d7eb2329b029c1942755b6af772070..8c4010575f869d8d183cf10bb9c4dfc65d22c22d 100644 GIT binary patch delta 53 zcmZ1vy6j&ZeEFgN@7W(eo=mDNossSQGQxxPHKEwX2oU} H7Hv%c?PC&T delta 73 zcmbOowLXgLGcPX}0}!yQZR9$|Y!ITKn^&Trl30?cpO{u2pPiJF6rWj~pOaXUnxdbW bo|;z@pH`HZn_8Yv8I3$MHoguH-f_NQ%VK^&4fXTCFM&$r*4+3xW00KqZ6y!-MK z+Mjxnj8yD&XVBRv6;d&l2^gVGEtw*fBTE+a<#Z&qoL>=KyOS(rWt~#u{M|;Pz(04UlAV>lqBV`@;F;A6i9V;Y zFDBTDEs!-c$xbZCo|`v<(FU>8E6NHQo9^o}6M}=xU7rd%Wm^oqiJjbh2+i1HN+Ywj zxETU-wy+1@s!Wp!CMBr8hHggNQfAPZ(bKG+=JZsy`$6{_=mt_l4}%U}Z#%AZJfYIA zzrkFg1`w58NXkHsQPK3-gRxfDh^tt^3eo zlJf1qWge3lu`SSdK@IAX(fi#xy|^7MqQpBwcX|$odQxh6vQ%S|mB4RHP6P1kj>~D? z*)D08qSW>r8M+i$gZjWWFf2A*+Tb3CuzE4*sC(f%IbJKguQb$%qGVKSPFq|y{hB6D z9Zzzovkk1pz>yuef@Cxy@gAog@_lIHa45I4_-#CQVC8r3?v)P*^XMH7=D%7!zt1{+ zjP1ipnY zf@gLNsZ5N)h|Za0sFkF3z?0qb;Z+fpEJg|m{Y{H{M(gmAz!)09D@auKLCdeTUA_SL dwITW&B1UogV;Y9>gOGRRh%9u|DWeeP`~{L>Et3EM literal 0 HcmV?d00001 diff --git a/agent_framework_oci/tests/unit/__pycache__/test_rag_runtime_grounding.cpython-313-pytest-9.0.2.pyc b/agent_framework_oci/tests/unit/__pycache__/test_rag_runtime_grounding.cpython-313-pytest-9.0.2.pyc index 151b5782f954e929d888e9868418ef1ed5282d72..3cf6c23ffb7433b6fc1909f4dc9957819d426d9a 100644 GIT binary patch delta 53 zcmdn(y~&&FGcPX}0}$N3xsi*TNybG#H?KrLC9xz?zbL=7BsIREC_gPTCpA7TvtqLq HQ=>8f)prsx delta 62 zcmdnwz1y4XGcPX}0}#BD-^j(yr0T1mn^&Trl30?cpO_Y(mRX^nn4X$f5}#I-n44Oj QUz8o6pPaebkf~7_0B0K%+5i9m diff --git a/agent_framework_oci/tests/unit/__pycache__/test_resilient_checkpointer.cpython-313-pytest-9.0.2.pyc b/agent_framework_oci/tests/unit/__pycache__/test_resilient_checkpointer.cpython-313-pytest-9.0.2.pyc index e26f6bb833181c3ec0ed5dd9e47f54a18cc50082..c6608e0b552ccb263c85099b429f3cb8008d2e9b 100644 GIT binary patch delta 54 zcmdm_IbD`jgsB_jP0E%GF*~uJouLnfhu~rM!mvs#dI4%BxnaW8ZXQjJDATw)AY4 zZrW=QToZiPq1$XFV<917y1}+cm_l4BP&}qfmpY8o3D?X;)-;i~%_Z1eqw$&+nOy0( z;+0$zp>6apy=#Q8!(|^*v=b672_%E%Sj;3^Kfg9lS4A8S=1hD_q~4fn&$@Eew@UGX z)0%GVl~kp=Mxh?HmMRc$&1b5$n@DGP6DR-r4FX$`oU5(>EG2}5tfsm^UCYS8#+JfB zJr7UScS~6xgn{Rskkv4wKYBkXdoV4M6A^s*qhtvQ^2O+2bc-!GqNO+(%fsf_Zb|+i z3_R}yxgj4TyCA>+qXoGK^CC$R!I#<2@fjr9s);KkKmGCi0NV;jx+T&TPux*L*XWX5 zx5Qpfc%zlJbB``Y%z}rdDULXsxA7f z6#6?5I}v*jk;1Ki7Y?9x5)rQ6i0U*iY=+(TZ1DmQ*RTinJzD)abk2vJrI~i|A`k1> z{!E)ln&7J3NDe_!c5!`p3$rkFxbD=1?q$R-#BM|bN2_u0yuF5HwUjDemHu~s_>&VH zy;4CXsD?61VnuZQn-#-Hg%^WxCz>t=-3}Ol<8R)K>O4LbpIvrH$-@%*x4R2P~-s2mXgC-cySAiQ?6v_>w3N lm*RjZ?u5RDBqf=Af~kr-b`;6~uG47EeOj*iGU2T9<2Ri+W^e!i delta 1110 zcmaKrNlcSL6vsO)U)jP3T9KtT+Lo;lD7%S*37f(}4HQZY1gubsbU}wL#)uI?DFzju zMv(|2F^F*i1|$M5jWxz72jj_}xsZ4u;b6EJ=k*|!pkMO+@}Ku+-psuBX7C#sS|;Lp zNJx-`f3)LblRIi!T#&_;>FthIeZ8sGq;F5lY-qFD^d^hh(OTO;O?GofGqu(>*PUi7 zG9gH642FS|k)XJGTN;iQ%RW6)R#jua6uOxVwhdIvw7L$yP z@6D33PE7()g-gQn$VQ8TJG%0A7i1Fh?|H3#2^A-HLh3~di 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 UJxd@y8k`L~v(I^;2mm|!5A3Z+J^%m! literal 0 HcmV?d00001 diff --git a/agent_framework_oci/tests/unit/__pycache__/test_sse_replay_dedup.cpython-313-pytest-9.0.2.pyc b/agent_framework_oci/tests/unit/__pycache__/test_sse_replay_dedup.cpython-313-pytest-9.0.2.pyc new file mode 100644 index 0000000000000000000000000000000000000000..d79f76ee19ab87140b212b690ed2169324054969 GIT binary patch literal 4414 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 literal 0 HcmV?d00001 diff --git a/agent_framework_oci/tests/unit/__pycache__/test_tool_policies.cpython-313-pytest-9.0.2.pyc b/agent_framework_oci/tests/unit/__pycache__/test_tool_policies.cpython-313-pytest-9.0.2.pyc index 6d28128096881ae049833dbd8c74baa35013ae49..6d9294e1475194c8097b33870fc79ee315854a74 100644 GIT binary patch delta 54 zcmZ3MJv*EGGcPX}0}$wX_iW^z$|z%_pPN^rpORRTs9%&{T9O)HP?VpRnUflymRYg+ IIOBa|0M@+|5C8xG delta 65 zcmbQ8y)2viGcPX}0}$l*6l~<4%Bb$HpPN^rpORRTsGpct9$%hcl&znbo|;z@pH`HZ Rn+oE`=O<@w-otp`7y!cw=<6WGcPX}0}$wX_iW@oEg<8jpPN^rpORRTs9%&{T9O)HP?VpRnUflymRYg+ IkAS-z0O(c|7XSbN delta 64 zcmdlPcQ}swGcPX}0}y2WY1znqT0kv8KR2&LKP9mwQNPU4B&{?jM?Wz=HLoN-ttc@! SwLHHlJ3c=-bMq$wcR2vrSQm8w diff --git a/agent_framework_oci/tests/unit/__pycache__/test_workflow_runtime_diagnostics.cpython-313-pytest-9.0.2.pyc b/agent_framework_oci/tests/unit/__pycache__/test_workflow_runtime_diagnostics.cpython-313-pytest-9.0.2.pyc index cbeca66a09beb589ce17299bbbb7c63a90ba1344..be260971d9fc18b79a3682832d59bf654f22f973 100644 GIT binary patch delta 54 zcmX@AHB*cGGcPX}0}$wX_iW^5W|Z;P&&?~*Pf09E)Gx{}ElG_pD9TUE%t?(;%dFTO I#`syqdp`VzZ tnpYB^oS#>cSR9|9oEcw|np=>QSdt2rNh?asO)bwa$_7bp)?$1w3;>QbBnkik diff --git a/agent_framework_oci/tests/unit/__pycache__/test_workflow_static.cpython-313-pytest-9.0.2.pyc b/agent_framework_oci/tests/unit/__pycache__/test_workflow_static.cpython-313-pytest-9.0.2.pyc new file mode 100644 index 0000000000000000000000000000000000000000..0c4a1f9eb86d1de5809a3cf48dd5b3bbbe58e6ac GIT binary patch literal 3273 zcmeGfOKcle@U3^_wY^E&q$p}jTP%l=Y}6zrjgiWygjOJuKoWV0ij+vJjs5H_S?{ji zTQ{)}C=wic;97}eFG%%`V~;%|PTnNQ(GwCvoO(m#R&ik7u6Jz%LiE4^DNn0;GxO%n zo0;b~Gd>*}${-jsD_?!KoaN)Y2^yVx!<(QsXs-gC%q*>d)1 zV>pzn5X0S>b?Zg0DjG5%JOrn|gUW|!GvcE{6quNUP~?;iL2^bm&|9$P2M%^1>MF+x7Pr#k>9!;+#2)^S_I81*ytv<9d-`{*Wxgt^}_|FYe&t zuIre#hshMhR(Y0U&ok``Rht4!n08ZWj806s_19IJHSH`%Z>p4uloXo@Cc**-H=hq1 zlw#rq0(mar*7J>_k8#x@by%_``UZ_z_^)dk;IIHg_bqK0n4Pp<0f#8!@!3v(R=yw1P(2tqXcIJwo zxpI`bc5wGZxz&;upJ=|a*p@oqp|sdiZiVD=4;~8u^NAKyejgRHkEF#D<#J1!cr@-S z6K$#U9ZC}q-VLeaE*dWb@6mWn`F&K(2BA~%1)XJk9tA%BH`yL+eZg#hR#k%=?gjr; zRUzA_R~z{tpF=Jv;i;TyyERX*)C^K0hH25<^=z>GXTD0(a0-DQ4Vp9#hB!FS0WbHB zyg}=BF}r7aJE4MZE%C60tJov;+2BZ?UEvT&Usxr)gCy4gbn_t@2a?VAC$&B3;b>qo z)%h7cr7BiWCSfBtkbV!~ugUCAOImtb^p&Ny)cFpjrIvChB#(RWSOAz$i!tT*Q8D{S zS~^kwE9GDTnE-dxb1W5AFLDVO?2;aqzS*$wKslNvc#oJKl)ae6<#*492DyonELL=f913QP$vDD`&LDb*}|o6Lg{ z|3^UA0sJZog76bUU!ot-#h+#6!G~Xb-j=WW^3@~xm9{+T%ae}|q he!Sr;^WSblm1*6DTB9ALev?GuwbP6!EDOPje*ov5dxQW0 literal 0 HcmV?d00001 diff --git a/agent_framework_oci/tests/unit/test_llm_rich_response.py b/agent_framework_oci/tests/unit/test_llm_rich_response.py index ba86d2a..f10b421 100644 --- a/agent_framework_oci/tests/unit/test_llm_rich_response.py +++ b/agent_framework_oci/tests/unit/test_llm_rich_response.py @@ -3,7 +3,13 @@ from types import SimpleNamespace import pytest from agent_framework.llm.base import LLMProvider -from agent_framework.llm.providers import MockLLMProvider, OCISDKProvider, _extract_reasoning_content +from agent_framework.llm.providers import ( + MockLLMProvider, + OCISDKProvider, + _extract_reasoning_content, + _extract_openai_message_content, + _extract_finish_reason, +) from agent_framework.llm.types import LLMResponse @@ -64,3 +70,37 @@ def test_oci_sdk_reasoning_is_extracted_from_choice_message(): response = SimpleNamespace(data=SimpleNamespace(chat_response=chat_response)) assert OCISDKProvider._extract_reasoning_content(response) == "oci reasoning" + + +def test_openai_compatible_plain_string_content_is_preserved(): + message = SimpleNamespace(content='{"decision":"KEEP"}') + assert _extract_openai_message_content(message) == '{"decision":"KEEP"}' + + +def test_openai_compatible_list_content_is_joined(): + message = SimpleNamespace(content=[ + SimpleNamespace(text='{"decision":'), + {"text": '"KEEP"}'}, + ]) + assert _extract_openai_message_content(message) == '{"decision":"KEEP"}' + + +def test_openai_compatible_dict_message_and_content_are_supported(): + message = {"content": [{"text": "{\"ok\":true}"}]} + assert _extract_openai_message_content(message) == '{"ok":true}' + + +def test_openai_compatible_unknown_content_fails_closed_to_empty_string(): + message = SimpleNamespace(content=object()) + assert _extract_openai_message_content(message) == "" + + +def test_openai_compatible_reasoning_is_not_used_as_answer_fallback(): + message = SimpleNamespace(content=None, reasoning_content='{"decision":"KEEP"}') + assert _extract_openai_message_content(message) == "" + assert _extract_reasoning_content(message) == '{"decision":"KEEP"}' + + +def test_finish_reason_is_extracted_from_object_and_dict(): + assert _extract_finish_reason(SimpleNamespace(finish_reason="length")) == "length" + assert _extract_finish_reason({"finish_reason": "stop"}) == "stop" diff --git a/agent_framework_oci/tests/unit/test_semantic_route_stickiness.py b/agent_framework_oci/tests/unit/test_semantic_route_stickiness.py index 2613583..6e4631e 100644 --- a/agent_framework_oci/tests/unit/test_semantic_route_stickiness.py +++ b/agent_framework_oci/tests/unit/test_semantic_route_stickiness.py @@ -89,6 +89,9 @@ async def test_continue_bypasses_router_without_regex_rules(): assert decision.method == "continuity" assert decision.metadata["route_bypassed"] is True assert llm.calls[0][1]["profile_name"] == "route_continuity" + # LLM tuning belongs to llm_profiles.yaml; continuity must not override it. + assert "max_tokens" not in llm.calls[0][1] + assert "temperature" not in llm.calls[0][1] prompt = json.loads(llm.calls[0][0][1]["content"]) assert prompt["current_message"] == "o que está incluso?" assert "product_agent" not in prompt["other_agents"] diff --git a/app/__pycache__/__init__.cpython-313.pyc b/app/__pycache__/__init__.cpython-313.pyc index 0b6e03faa39f8132f0b0d08fda39f54d162b6d71..5c1ba2244c9b2226dcfd1301e19f49c62730d555 100644 GIT binary patch delta 34 ocmbQvIE|6}GcPX}0}%Y#IAJ2UF}JCHZeEFgioS2K=R_}G0HmG??*IS* delta 35 pcmbQnIGvIEGcPX}0}zyM>zl}J%wwjXn^&TrtnXM{T0GIy7XYO)3LXFe diff --git a/app/__pycache__/main.cpython-313.pyc b/app/__pycache__/main.cpython-313.pyc index c2b578044c0faa5be8f20ae24d737d2ae48f0986..8f9ac0a9c26202f170017593e400e0a9f5a65cec 100644 GIT binary patch delta 39 ucmaF1nCaXqVvr%*)Hg00e(FPT0u(m4n+zKR2&LKSkd+*mE-v=N~2j(lQH# delta 38 scmZpd=#b$4%*)Hg00gDm`ZjWZ<=`>a&&?~*Pu6!VE-l{7&H0B30MnNXvj6}9 diff --git a/app/agents/__pycache__/contas_prompting.cpython-313.pyc b/app/agents/__pycache__/contas_prompting.cpython-313.pyc index 9606a1a2a69253402fc4d0ce3d483440d6eff373..7dc294f05a1041ab4b04b06b1d5b74c164674814 100644 GIT binary patch delta 37 rcmZ3=v4n&BGcPX}0}%Y#IAJ6AWF~GG{oK3~{S)XgZnTf|$KR2&LKUv?gxU_ilN~UT?0MYRai~s-t diff --git a/app/agents/__pycache__/contestacao_agent.cpython-313.pyc b/app/agents/__pycache__/contestacao_agent.cpython-313.pyc index 8b263178f7f7c77213a9aa5f6a8f01d8d566c659..dda92579cbc546ac07c43f381b4311f005b70175 100644 GIT binary patch delta 37 rcmdm{xmA<)6-7yPX delta 38 scmdn0xlNP%GcPX}0}zyM>)XiP&BWuTpPN^rpRDg#Tw1(&A(My@0N%F?ivR!s diff --git a/app/agents/__pycache__/faturas_agent.cpython-313.pyc b/app/agents/__pycache__/faturas_agent.cpython-313.pyc index fde4c07e4ff5c16dbbf859170b3d0711e6178ca3..b4e19bcb50873be0548f3d048d3d87f8c1a9e745 100644 GIT binary patch delta 37 rcmaE(@mhoXGcPX}0}%Y#IAJ4qGZVL?er{fgeu})XiP%*5lQpPN^rpRDg#Tw1(&CetNB0Pcbeo&W#< diff --git a/app/agents/__pycache__/prompting.cpython-313.pyc b/app/agents/__pycache__/prompting.cpython-313.pyc index 82d86ddcdd10ac9e137997d1b1c52cfa2cac4290..8ed7c033b893760022ca4ab8d5fd1d4c727fa4e0 100644 GIT binary patch delta 37 rcmeyv@tcGDGcPX}0}%Y#IAJ5V05i9(er{fgeu})XgJz|3Q(pPN^rpRDg#Tw1(YjX9JN0Nx@C2><{9 diff --git a/app/agents/__pycache__/runtime.cpython-313.pyc b/app/agents/__pycache__/runtime.cpython-313.pyc index a4fbd5b60bbb82cf54226ca6090ec9942d12e587..323c858d68064716a6b53da822ebbee2da049bd2 100644 GIT binary patch delta 36 qcmdnYyos6nGcPX}0}%Y#IAJ5VJ|nlaer{fgeu})Xh!&&Xq=pPN^rpRDg#Tv|NYl`$6pzby)! diff --git a/app/agents/__pycache__/suporte_contas_agent.cpython-313.pyc b/app/agents/__pycache__/suporte_contas_agent.cpython-313.pyc index 9e59032d7e606e71754ad9a884c0ce4260d1117e..125586ca0bd3fc666c8b9f42143875bf2110f38e 100644 GIT binary patch delta 37 rcmeCu>(t}^%*)Hg00e(FPT0u3n~B>)KR2&LKSkd+*mLtGCJPY&*7*yU delta 38 scmeCw>(b-?%*)Hg00gDm`ZjX!X5#VG&&?~*Pu6!VE-l`Ck;y^?0N7*;#sB~S diff --git a/app/agents/__pycache__/vas_agent.cpython-313.pyc b/app/agents/__pycache__/vas_agent.cpython-313.pyc index 2a55feb49587df52d4164f67b340e51303640c9a..1b8ae6f4b759a41bb960a20bccdc82f417b61c68 100644 GIT binary patch delta 37 scmcbpb3upuGcPX}0}%Y#IAJ6AGA3?Y{oK3~{S0O*MfM*si- delta 38 scmcbhb5V!;GcPX}0}zyM>)Xh^jEToiKR2&LKUv?gxU_il9;PY60P0>0b^rhX diff --git a/app/domain/__pycache__/__init__.cpython-313.pyc b/app/domain/__pycache__/__init__.cpython-313.pyc index 983b8774be64452b2e4e5290c8b15afbaeba78b1..522a7c260399425582e7bafb2c075f709d41f6a4 100644 GIT binary patch delta 34 ocmaFK_=1u9GcPX}0}%Y#IAJ1pHMfm^ZeEFgioS2K=fp|j0KYy9Gynhq delta 35 pcmaFC_>z(PGcPX}0}zyM>zl}3&10*dn^&TrtnXM{T0C)LH~_%K3u6EP diff --git a/app/domain/contas/__pycache__/__init__.cpython-313.pyc b/app/domain/contas/__pycache__/__init__.cpython-313.pyc index e2b8dd5fe288c7746b93821cf9f64bf1a7eeb386..2614921bafdb6c59c0713b6a2209aed2e24adfc5 100644 GIT binary patch delta 34 ocmX@fbb^WdGcPX}0}%Y#IAJ39Np5HT+`JO~6n)=d&xsE*0lh8@s{jB1 delta 35 pcmX@XbdrhtGcPX}0}zyM>zl}ZlE+0qH?KrLS>Lg^w0PqEOaQ*j3)%nx diff --git a/app/domain/contas/__pycache__/client.cpython-313.pyc b/app/domain/contas/__pycache__/client.cpython-313.pyc index 11d57f1aa7b6a1c4dafd2decc9d618687349adf9..eb63b194fd3aa59778e3f44635800f8eecf42243 100644 GIT binary patch delta 39 ucmezKi|O|-ChpI?yj%=G@Mq(Mjoe3>xE=L#^Gftn^nHUpH{W4eunPb;Jr6Pf delta 40 vcmezUi|NlVChpI?yj%=GP`0gaBll4z9w+_Wyb}FneaGU`;?1|27VH85J3|j* diff --git a/app/domain/contas/__pycache__/contestation_rules.cpython-313.pyc b/app/domain/contas/__pycache__/contestation_rules.cpython-313.pyc index 5a8d6ef0f1f999175e41a2777b5b51e59a06ac0e..b6d303a78ef1092a6e3367a41a20466a2eaf5688 100644 GIT binary patch delta 37 rcmeCo>d4~$%*)Hg00e(FPT0uJ%EIldpPN^rpQ7&@?73Nn<*fk#*uM*V delta 38 scmeCk>dfN)%*)Hg00d>*`ZjX2vheun=jN5@C+j;Fmlki9W_fD>0NM%*s{jB1 diff --git a/app/domain/contas/__pycache__/contestation_validation.cpython-313.pyc b/app/domain/contas/__pycache__/contestation_validation.cpython-313.pyc index 0cfae96612b7e218eee8a2f86ace922e51e1e091..7e8da73a8e8ca5b8518e82fc391647a6d9105d09 100644 GIT binary patch delta 39 ucmbQXiE-*CM()qNyj%=G@Mq(MjoePm+(G)ec_sQO`o6)QnyC delta 38 scmZ23y+WG%GcPX}0}zyL>)Xg}&cqX_pPN^rpRDg#Tw1)@mnn)H0MIlF_5c6? diff --git a/app/domain/contas/__pycache__/invoice_context.cpython-313.pyc b/app/domain/contas/__pycache__/invoice_context.cpython-313.pyc index d7ea45213cd21ef78b36cdb2f0ac04e39cea7112..bd121d29eeb36ec4548a214798be9457ee10616a 100644 GIT binary patch delta 39 tcmZph&)7Pjk^3_*FBbz4{Mk5RBX=_!x0ilyUWtB+zHhMS=2>iSJOK564D|p2 delta 40 ucmZpj&)7Dfk^3_*FBbz4lx^$V$lc7w*nMB%*)Hg00e(FPT0s@#mw!gpPN^rpQ7&@?74X&b2T#n$&3pQ delta 38 scmeC?>*3@6%*)Hg00gDm`ZjV`G4puo=jN5@C+j;FmlkiHz+BA?0Lpv|Jpcdz diff --git a/app/domain/contas/__pycache__/invoice_resolver.cpython-313.pyc b/app/domain/contas/__pycache__/invoice_resolver.cpython-313.pyc index 03fa0fa1ed9e1429b17603ce7c66052ee19e9562..3eedc42bf1b95a01f2337116139c988217913ea5 100644 GIT binary patch delta 39 ucmeykmHER~X710tyj%=G@Mq(Mjodc`xxMvs^Gftn^nHUpH@_ETItc(H0S;3D delta 40 vcmeycmHFdVX710tyj%=GP`0gaBlitK9v}VOyb}FneaGU`;?3^_nN9)#CY26@ diff --git a/app/domain/contas/__pycache__/item_matcher.cpython-313.pyc b/app/domain/contas/__pycache__/item_matcher.cpython-313.pyc index 75d1b5df58ae6531dd85a7e2885fe975ca034d39..535667c74d309160f48119a0f867d4ba978b982a 100644 GIT binary patch delta 37 rcmdn%yT_ONGcPX}0}%Y#IAJ4q4-2=uer{fgeu}3$2) delta 38 scmdnvyVsZdGcPX}0}zyL>)XiP!@}dCpPN^rpRDg#Tw1(&5sQ=(0PA=R00000 diff --git a/app/domain/contas/__pycache__/pro_rata_rules.cpython-313.pyc b/app/domain/contas/__pycache__/pro_rata_rules.cpython-313.pyc index 91ded5a0283562a74ad9aafd8c0f2a05feb39cea..b34aec274d7a3249629991ae0f9a57165b0a2912 100644 GIT binary patch delta 39 tcmeC`V(jc<P6o$nDI+?Wv!eSE8Sy?;Gs7If`Y20|4qX3<>}M delta 40 ucmeC|V(jW-)Xh^goVdfKR2&LKUv?gxU_ilE|xk;0O-REWdHyG diff --git a/app/domain/contas/__pycache__/rct_policy.cpython-313.pyc b/app/domain/contas/__pycache__/rct_policy.cpython-313.pyc index 1af2b4e4b4c3a07efdabb2afa7b6ea84f6107419..80a272eff1aa3be25f82f5f3573ebc0d5ba96f8b 100644 GIT binary patch delta 37 rcmdmGxYLmPGcPX}0}%Y#IAJ4qJ}0-Uer{fgeu})Xhk&&lJapPN^rpRDg#Tw1)jmD7YD0N`&6mjD0& diff --git a/app/domain/contas/__pycache__/service.cpython-313.pyc b/app/domain/contas/__pycache__/service.cpython-313.pyc index ee9119814ab802286ec38752577c11eab64e8923..a239bbda1cd4f215f4410c2a9312a9e120d98f54 100644 GIT binary patch delta 39 ucmbQafN{nGM()qNyj%=G@Mq(Mjoc5Jxt;WL^Gftn^nHUpH~(N(^Z@_?hz$e) delta 40 ucmbQSfN|ymM()qNyj%=GP`0gaBlkmQ9%udByb}FneaGU`;?3Wg6@35%Fby;S diff --git a/app/domain/contas/__pycache__/string_metrics.cpython-313.pyc b/app/domain/contas/__pycache__/string_metrics.cpython-313.pyc index b1bf41fbc3159bf5753fb8553b8123945588e86f..37156130ed94d10cbc602ce78949a73f63f31046 100644 GIT binary patch delta 37 rcmbPlIM0y#GcPX}0}%Y#IAJ4q7Bjb}er{fgeu})Xhk#mwWSpPN^rpRDg#Tw1)jfmu!z0N29{KL7v# diff --git a/app/domain/contas/__pycache__/vas_cancellation_message.cpython-313.pyc b/app/domain/contas/__pycache__/vas_cancellation_message.cpython-313.pyc index 8bbf65e1d247088224eaf68c592c3245708b85fd..c512d017d22cfd5c386ea1424748337bf20568ed 100644 GIT binary patch delta 37 rcmX?7f4H9eGcPX}0}%Y#IAJ4q11EQ|er{fgeu})XiPz{wM$pPN^rpRDg#Tw1(&8mF!q0Q=$$mjD0& diff --git a/app/domain/contas/__pycache__/vas_variation.cpython-313.pyc b/app/domain/contas/__pycache__/vas_variation.cpython-313.pyc index 1c16ff34ff6b787d049c66ed2cdea0e3b555a027..8506e24fb38ed0d550457f3f4a2995cbb3f72ed2 100644 GIT binary patch delta 39 tcmbPul4-(8ChpI?yj%=G@Mq(MjoiAD+#dS5c_sQO`o6)Qn_VP*y8->O41E9q delta 40 ucmbPml4;^eChpI?yj%=GP`a&eBe$+3kEecaUWtCPzGHD|@n&a9-);c^?F_5{ diff --git a/app/domain/contas/__pycache__/workflow_actions.cpython-313.pyc b/app/domain/contas/__pycache__/workflow_actions.cpython-313.pyc index fbe06715aa468d49f9df12310a79a9985d3a2831..abd0cd2b56a43df5beffbfc1f5ba036605ef7307 100644 GIT binary patch delta 43 ycmbRGgMG>mcJ9x-yj%=G@Mq(Mjobz7+}`@Rc_sQO`o6)Q&F$>l+u0fWz5oD9p$`%O delta 44 ycmbR8gMI1`cJ9x-yj%=GP`a&eBX)XhEiJ2!#KR2&LKUv?gxU_il3+6+t0N&FKj{pDw diff --git a/app/domain/contas/parsers/__pycache__/__init__.cpython-313.pyc b/app/domain/contas/parsers/__pycache__/__init__.cpython-313.pyc index d18992b7f58afbda19a30437c346b165178d57fc..513f66b99c633644214efb3c6a794ab3cd6d2929 100644 GIT binary patch delta 37 rcmZ3%zMP%=GcPX}0}%Y#IAJ6AKSpkE{oK3~{SOp_S_*M$pJ delta 38 scmZ3^zJi_mGcPX}0}zyL>)XivkCDemKR2&LKUv?gxU_h)2-9Rn0NFeXg#Z8m diff --git a/app/domain/contas/parsers/__pycache__/bill_parser.cpython-313.pyc b/app/domain/contas/parsers/__pycache__/bill_parser.cpython-313.pyc index de785cd355d3d6e804b0fd79ecb23b5f9daaf925..93f5e6879cfbb3b837fab61481e868ba739b1982 100644 GIT binary patch delta 39 ucmdn9lX3S>M()qNyj%=G@Mq(Mjokm(x&8EW^Gftn^nHUpH;ZyC4*>uZunk!N delta 40 ucmdnJlX1^ZM()qNyj%=GP`0gaBlkac9)JDZyb}FneaGU`;>{u)%R>Mb{SAo# diff --git a/app/domain/contas/parsers/__pycache__/bill_processor.cpython-313.pyc b/app/domain/contas/parsers/__pycache__/bill_processor.cpython-313.pyc index 65731eacdcacb97121bcb95d43410e9759c4bb4d..f381e52be00d4153a5e799abc1f0309ee595cd18 100644 GIT binary patch delta 39 ucmbO~n`z!`ChpI?yj%=G@Mq(MjocqNxC8Zb^Gftn^nHUpH?wojXaN8L{|xT{ delta 40 ucmbO?n`!=RChpI?yj%=GP`0gaBliamo*@0)yb}FneaGU`;>~QFGg<%y&J7;` diff --git a/app/extensions/__pycache__/__init__.cpython-313.pyc b/app/extensions/__pycache__/__init__.cpython-313.pyc index 81f2189633acec0b6bf80ce897a0109136b57525..89906b512bc716bd591ff38f4b9ba8758019979d 100644 GIT binary patch delta 34 ocmZ3_w2q1UGcPX}0}%Y#IAJ39Zf*zt+`JO~6n)=d&xw~}0kudAOaK4? delta 35 pcmZ3-w4RCkGcPX}0}zyM>zl~Eo5xWLg^w0PphSOB)63wr)XiP#l+*TpPN^rpRDg#Tw1(&0h5&?0P-yiMF0Q* diff --git a/app/extensions/__pycache__/tim_judges.cpython-313.pyc b/app/extensions/__pycache__/tim_judges.cpython-313.pyc index 15cdadd95c032f927d8b34351c338da8c60b8efe..4c28b9c37d08651067bfe3b19845591d7dc83a05 100644 GIT binary patch delta 37 rcmaE_^-hcXGcPX}0}%Y#IAJ3v delta 38 scmaE-^)Xi9$IRobpPN^rpRDg#Tw1(Yh1p980OSx0IsgCw diff --git a/app/extensions/tim_prompts/__pycache__/__init__.cpython-313.pyc b/app/extensions/tim_prompts/__pycache__/__init__.cpython-313.pyc index 662f4bc254414cb3f490419aa6bcb91a8ec0d397..4824e06ae0d10cf84b792eeefd8d8ef2b8cfd540 100644 GIT binary patch delta 34 ocmZ3-xR#OoGcPX}0}%Y#IAJ2UF}II?ZeEFgioS2K=R~g*0ITH+O8@`> delta 35 pcmZ3>xQ>zgGcPX}0}zyM>zl}J%;T${n^&TrtnXM{T0GG+1putR3VHwl diff --git a/app/extensions/tim_prompts/__pycache__/aluc.cpython-313.pyc b/app/extensions/tim_prompts/__pycache__/aluc.cpython-313.pyc index 39519f251a893d76737a9b55a246827c50d1a364..fd3dcc008efd9d18dc418fc7ae20887a82f414dd 100644 GIT binary patch delta 36 qcmexr_{EU>GcPX}0}%Y#IAJ3)Xi9E5YNbpPN^rpRDg#Tv|L?S>hr9-en8d diff --git a/app/extensions/tim_prompts/__pycache__/ausencia_oferta_proativa.cpython-313.pyc b/app/extensions/tim_prompts/__pycache__/ausencia_oferta_proativa.cpython-313.pyc index ee054fbde21debf31c6fd276c0a00137325935e3..c3588c1a055dd511784a824e25ee029a405897f1 100644 GIT binary patch delta 37 rcmccYbIFJMGcPX}0}%Y#IAJ5Vkt%nLer{fgeu}lO=a delta 38 scmccQbJ>UcGcPX}0}zyM>)Xg}q{n*aa+ diff --git a/app/extensions/tim_prompts/__pycache__/fraseologia.cpython-313.pyc b/app/extensions/tim_prompts/__pycache__/fraseologia.cpython-313.pyc index d7a73ac833cb980f5cbeeb80280d5b5771febb66..8f014b83f69893913ad576b2c8af8edc2b01b985 100644 GIT binary patch delta 37 rcmaE1_1ud4GcPX}0}%Y#IAJ5VrVO{ger{fgeu}GBI- delta 38 scmaEE^}>q#GcPX}0}zyM>)Xh!DZ>+>pPN^rpRDg#Tw1)@UPglv0PDaDjsO4v diff --git a/app/extensions/tim_prompts/__pycache__/out_of_scope.cpython-313.pyc b/app/extensions/tim_prompts/__pycache__/out_of_scope.cpython-313.pyc index 57ef7b6583d54d16c36711450d3b010b21658f5a..2c4e2fbd4e465adccb469812444d32e4923f4a40 100644 GIT binary patch delta 39 tcmey)Xh^MwrJ(KR2&LKUv?gxU_ilAz>Lt0PlnhJ^%m! diff --git a/app/extensions/tim_prompts/__pycache__/rqlt.cpython-313.pyc b/app/extensions/tim_prompts/__pycache__/rqlt.cpython-313.pyc index c95cb84a3e3b1bdd96daf7ed1bd8052db5a5ea21..706510f70d66bacf8176941a593045c8209a1731 100644 GIT binary patch delta 36 qcmX@Xah!wuGcPX}0}%Y#IAJ4q8Z))Xhk#?0fXpPN^rpRDg#Tv|N2hWRuA%!3Q9 diff --git a/app/observability/__pycache__/__init__.cpython-313.pyc b/app/observability/__pycache__/__init__.cpython-313.pyc index 6b207c7e8cd4aca36a62f60c362ceee62b0634fb..0108ccf96718f267d04a53b2971a4fd2373888bb 100644 GIT binary patch delta 34 ocmZ3=xP+1WGcPX}0}%Y#IAJ2UF}JgRZeEFgioS2K=R~h)0I3WLCjbBd delta 35 pcmZ3&xRjCmGcPX}0}zyM>zl}J%;Tb;n^&TrtnXM{T0GG+8UU%v3RVCB diff --git a/app/observability/__pycache__/telemetry_observer.cpython-313.pyc b/app/observability/__pycache__/telemetry_observer.cpython-313.pyc index ddbac9c36ff1586711856f149e33a36094331b8c..677bffa95ba8abe02b32e96dab7775322775d39b 100644 GIT binary patch delta 37 scmeyP_FIknGcPX}0}%Y#IAJ6AN=9y9{oK3~{S)Xh^l99(xKR2&LKUv?gxU_ile#Sk50QRg5`Tzg` diff --git a/app/presentation/__pycache__/__init__.cpython-313.pyc b/app/presentation/__pycache__/__init__.cpython-313.pyc index c79ce6442644fcea7ea6fd486d3bfd6938468dd8..e52c095420f2143128077c528a20e30ff455216e 100644 GIT binary patch delta 34 ocmZo@;K|~=9TCt>pK>g7Ehd=3IL{!3cUaT diff --git a/app/presentation/__pycache__/tool_renderers.cpython-313.pyc b/app/presentation/__pycache__/tool_renderers.cpython-313.pyc index 191cf84ff2c1f2f97e45d37f9071177320ceab5c..4ef11a494b96422e1f3919177d69df4a1d7b1384 100644 GIT binary patch delta 37 rcmdm{wN;DzGcPX}0}%Y#IAJ6AMMiE9{oK3~{S)XhEk&(w!KR2&LKUv?gxU_ilb4EX50OlbKRR910 diff --git a/app/workflows/__pycache__/agent_graph.cpython-313.pyc b/app/workflows/__pycache__/agent_graph.cpython-313.pyc index 84c390661b3ed4bd367ed5edea33ad4caad6e727..1cfee2a16637662dde0010c1d444073c798aeacc 100644 GIT binary patch delta 6870 zcma(#X>?Q9neSNt2_dUI^+oOgd|*rH5WUhDSwYn`=S*7ndo<;67p z0WHV%C-rd!OHPw{akFbUe&j04mMnF${K zl=7ozQQZXPT%4zib4#b41`CQF-m0bEoJ^YjUrYyuCs88fGtq#*B1+7h)?+qh&|_HN zV$CW8#nwlx+3fw1H3#1|{j|CcD|{)UUn-8XCfXEMLyfGK@8N4XkI|ZILp#NqKd2K+E%A0~o*yJN`Zbl|6$9KYuCJNyBk zsG53f`~q>iJdU9y;C4<_t!!!UY<*HxFYoMG(E$VPik9vbt(`chUD4Ck+u0iIgR#EH z)@ScoX}7NE>1`F~#0zkFfF%hGGtqkd^7!q(LDy!#m?>%Q^ScJNxjcf;hnfoRVZY!M zm26E^Nd#i*K!6aW4EO|McLT0tiy$V#Y>-V$*oJ8=iKX4B2NWwZ-El zASI!_yRUWaT3as~p@Csndv{BxnDY%}Q%)+1Uv7B4-MskN|7delg-3We#;NK8D zk6;mkZ2&~&kavebMES6HSd{w&zo-M?6gE2oLw-v-{c&k|@DSonC68P1J0Lq8qG499 zX#G3wQ&uNTr-t3XQ%v&-Zifc~XP*(#jJR0NSV;E`dILjFyUXVtazM5Yy8Z?Ovx}TW zl~186Dc)g$undJ@Ngm!MYC-srVBaR}B5xz+MFf`+Tt;vOfG-_De%wRvl&+U;R)m_$ z7V*K!Ib3Gm%jO@M!$tGP&GRSBP3L4Ih8xYT7d_Y3ZJ21@7-`;kEO)|O88KJBy84=V zVc0PM>y-=6dfstPRCYuvJARZKUSl0GTsP-Re3p)zmra;gUR?h5csEiruIrOV+xNGJ z(<_4G`pPdkSz_{aW6p%JAYv>yUOsND{8A26cZ^Ao)QU9Sml`g?w7=wqvZEyjOK91o zmeVFb)^QnG$CgZFRY$U_U)?&M)i|Es1dK9t=UkJVtdrM0@;rg&9?|MP~M8Uwh=85L-ggd?y*5v+fPS%u3V_U}cxy+y&wTy5H&xMr#fuUj8wr&eUntj~^Uaz05Y2!5gB zQcJ+xtb%a$l1S3hh-umNimFK^mzY1P;TANGtO%RxBKo=4=Pd#~<{NGm)E`Vdw;CuC zO<_}QL|+FSOeNPBcZ|uysf`g+(<6;C*D$7?)N@IxN7V<_$F#@ie_$&AJQ1cROf7d`(M#LrrKIp22M4hZUL*}cI#2(;t-JXQ5>8FPC=-@Md0pKT2U#2x3d3-7D?s)nM z1ELxMh$&kF4&o#Z*HE;w`=n5{0^v%FoKzrgCB4((&$|j!qI^j3ShO)G5o9LvZgPhD zIv4VH=`T8q_|DLOcfM%|CLk@-mT?(HU6NqVA{P~IuTvlwkRuj@?JjS?$4Y=el96f{ zaap7vzz7IbP&@{`PV!SE(G7S#n_W)9Gay)$q6&(%$M0iHq#3EvtE2&AXqn2qJvf83 zaR^O_ihT^k?!@%EX!Hf3LTrZ;LhQps4iCW!Mi5sttc3=o)oyL=Y+V7RJQiAzGAk&^ zuRTs6lQjpKD7N~%p3^*Ozz;OU@A3p({$0cb6Ql;{#KbmRS4+3Ot)=_Po|P+!o~L*I zwxKay(Z)%5(PlDwFk7NJU#GtmhF1SjZMn=)Eg;Yu3<3@Bml zMH?;3xYS@KDwq>nVa=xmdR9TDE%hng&|k#A7J9aSP}LI46($~&0C=rOiPb0p`x3Gp zfG8&c4^bjN8RI80yGP4}eAQ!|9;GdV>qDo6M%lOHx&v8TQOI9${fy=fX7m3?7Y!a! z*Z_lm^sDsH=r+RB{;e6`j{DAU=6;`EI-f$XZcS1tz!cv>&^w)eu{9Vk>Hz=k#O(TJ zF~6r9++`~KrDYI)rM|pnGlOH1NfgmQb;HaF zl;4ir*y)0K46`gR3_SgbFCc?gntz?FUPj&i{rL4~fA(T_9Oz@wmEyo6!W_rUie&*d zp`uFI3GKa;%%y7r>8f640d)sfA;wzq>=Bo^l)22eWuDEf4O%(mom>e`#Pka?RO9UbTh4FJ&??V+Wnn(fikI?2nD)%3z%%c?4LP5g#MCy7Sb zUw)Tcu;bYTu9loIYwu!>7PBNT(4=4*-$Cm~8bW*a3Cg-?w(L&bG3_CUm)!^dQ~2xX zMMW!s0SVw}J57FmxoRg4ze_hfZ}0ya7m#OhSr1?(Nd#z7NomFmN1MrB1k45OK-!0& ze+OXpq4P(YF_Oysw@#oz zY)c@Y-I+V+og-#BR5RLlsAy&>f9_D@JVp~^5u?T*eey$KA?k_XgC8k~0|bQ3;pu}z ztNBf|>2O{~C9ISAfC;6TX^hpJ9HhgC&HN}maJX4Dh7*&4aY=cBR0x!Dd^;5DV95sX%WJkR_ zt0x7DqtqVCOp6uN9%RFQ^quq{Lj@|y4*IX5;=)rPUNlW#bwG#4+AZ=HQfxzWkJ7({ zO0%%77E@*(hg$>AEkcz%wCG>{qD+ce#k>ppx1BFbW--Pr2mPl`qbni{;liWcMK5s2f%!DOUtscn$$G zsEU4hxuzDc6GR1GdPtr_O+>k{bHIm}*;rMiN2)EK(7r3>yf?JxN=@7`8rv@9GO&lX zXx0vS2Ze52qv{-tJwbQIoAGSr4tP4=$_h{s8ez>4_AqyJEVd zQ8OaIV*MT<&58j2MTw;|13yfEay5g0DfGtGr`2)Y{|P{ql69(2V8Qd4k3TBu?{1a_XQ~W8572jbgdw}jNj^fl zj{)p9MQbkn2yFLm6Tk#eAyIO)wXbC@y7}v!@LS}9tVAQb0mbq!`N6`ADth3S!8B6` z@-BV#RzCbUT)kCbnLz3u1k4}bMa$JwN?@zw9v%|#XX81Va=Y5}8$|pBfs|pi_jYRb zefXZ;TupJf7utI}K^bJH@5jKJ>_)&LgS$BT#%lrmft-D@@O9S$>~aCKnqbTbszQ2k zv<5*rf)bAE?k4eX(d@g$g*$j<%B!i99KO#MKVt7ka!!>zDZ{DHi9FPQmndXv8GZjV P!Psl$(?91BGG6}=azX3A delta 4941 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 list[dict[str, Any]]: def _recover_explicit_contestation_subject(args: dict[str, Any]) -> dict[str, Any] | None: """Recupera item explicitamente citado no texto original da contestação. - Na confirmação a mensagem corrente pode ser apenas ``sim``. O ``motivo``/ - ``descricao`` preserva a fala que abriu a transação e é uma fonte mais forte - que um ``subject`` residual. Só corrige quando há exatamente um nome canônico - da fatura explicitamente presente; não faz fuzzy matching. + Na confirmação a mensagem corrente pode ser apenas ``sim``. A fala que abriu + a transação pode chegar por campos diferentes conforme o runtime/provedor + (por exemplo ``query``, ``operator_instructions``, ``message``, ``text``, + ``motivo`` ou ``descricao``). Essas fontes textuais são mais fortes que um + ``subject`` residual. Só corrige quando há exatamente um nome canônico da + fatura explicitamente presente; não faz fuzzy matching. """ - original = " ".join(str(args.get(k) or "") for k in ("motivo", "descricao")).strip() + text_source_fields = ( + "query", + "operator_instructions", + "message", + "text", + "motivo", + "descricao", + ) + original = " ".join( + str(args.get(k) or "").strip() + for k in text_source_fields + if args.get(k) + ).strip() if not original: return None norm_original = f" {_norm_invoice_name(original)} " diff --git a/tests/migration/__pycache__/conftest.cpython-313-pytest-9.0.2.pyc b/tests/migration/__pycache__/conftest.cpython-313-pytest-9.0.2.pyc index 5ceea6bbadccee5bd7ad95f869ecc77980059094..3bad8daf3b87e9515bb24e2610dad637e4526c2e 100644 GIT binary patch delta 62 zcmX@icAky)FVi#H8w?pPN^rpORRTsGpdgnpYB^oS#>cSR9{Tnpl)l Ql$eJPxr)xc9Xi@ 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 LF_UeC58nR+M;3u% delta 2805 zcmZ{me^6A{700=|%Pz3;!;C)`rLZOtdJss5=#RrN(2)%0*__UmEC>h?oz}~ zWyqvrT6IDWF&U$_8Jejv84~kGGfC4wGE6dQMoil@P4W^)lUOr0olaxMUuj}{zHgBQ zCuQKn`E}1Z_wKvr?Tues|MQV0Kn>%iL9Z5-J)=4bW9YH6mQwK zS`@F|U^yhRe^MNd#ELuAm|EPc$*#_j*4ye21=NV1X}jnYJL!7n2V%AU=d3Mh&IdTB zybGwKyXMElc71gI!>OW$mgKjmsBBln&SLtiYd)RK&vkA@;3i-*oy}h>TB&%^fY?mO z7p)W#y0R!%7=tsO57G*t0@%hdoYmcZt(}?-tFdJ=NCyh?MK8Txuu=5ua~2=5ia|PY z=XlB^9I9C4ApNqiJrzm=YkTQ(VYPD)QtbmCr|Ke)eE{MBbr;QTnkT3B+!zu$? zWe2QoAPATTR?gDYv+~J$_{?M71*sCiiOOo4xhIF7UG5Vn^^cd|X8+OeVf_K{BJe!$ z0-!LA)R^q?tD#Up%GXT2Ta{{9?cu|Eopr?_Um@ZCS|lpprcVZ4;*a#+JuAhy?pk>|nV+dI>MF$$ z<<~D*rXe97FL?}@-ldGd76uX<>88H=68oRnXk^nfN3-ee`kXvdwfbW_ZaKW04O>^O z6KC|MRg~&Hhjhn*m+4Z|gW?>mZT8MHt>(F!2S4R->B;66aZ$h0oaLO=z{`vz#U|Hc z{W_qL=BYokH$iNsr_~(i28d?6_tPKL1@yW4f$Ltj)yB8!XHm(N$%yLU(s!u zPL_RYWs+@8;5j*`d#UFwyI9Ab?H|A2Ce~q}LkNV$t*uR8zEj`+` zFza6sr#Cm3{@OKL{G0yKRU^z^3KDJbz4-rC>7jRK5rwM6RsFrtv!ee~KQK0vX2V|DWeENq|4%1pn?i9@Peb2q8sc1>#1s_)Z2v{=t3CDD=0vP_>6 zmFKYh8gQLP<-C&k2!;LygKu5j2g5m_9H;~0vy-mLDv_+0N2`T$n9a`#!{OH=F&=Ul zln6}YhN2dhxVed8_e`v;HkHj7pK!}X2>cCj%XD+V3#9O0)WH$Eldf7sa$bA_Iw-g2 zAtU(cmDB&xZ*ofJKtzFYXe1OB))%Oi^7t%Zh?=5>yha;Wp zc6co5g4|;+ecz79lk*x8dLOW!VWjv&YBU<`>`UBjSITAf@OyEo`CjbXl^4H7Gh`>0 zni$oc(bV1A9!MuU6hjk^ig|-8B6M+gPh^pLmoROr>vyH z!-}&OzPkY*wH@}&Hg&T?8G_;!=-A^!2~pZ(aW`ESphx1JDHA4{QV;gV!AQpR;6G zLxIS|+XW5}Lzy8zf{b^RG=Ns~a7_IZ=->a|893S|+UT>Rr%0Z1=crtapL%mXnAi6@ zRzgyIGyt z3Ajq$(|Ik)*t9t&%zNWz)o`fMzKB1l$r3o10@XkxumxxXrr$dwWkp!)=m`bxmJhL) Wf0Lpf{k7AJMcUVkonnbOasCHzlF}9c diff --git a/tests/migration/__pycache__/test_contestation_business_rules_full.cpython-313-pytest-9.0.2.pyc b/tests/migration/__pycache__/test_contestation_business_rules_full.cpython-313-pytest-9.0.2.pyc index 191a54c9484120c8bb2cea5d7014a512aa013c39..d7051bf576ceb2ad4bf455e81ff59da5be6fd006 100644 GIT binary patch delta 65 zcmbQam2v4-M()qNyj%=G(7vo^BljLA)kOW=yb}GC#F9k)#Prm>lKABOypqJ?`1I1m UqLiY<%$)e-l8Vg_n0AH(0Oar(UjP6A delta 53 zcmZ3wm2u`)M()qNyj%=G5Ruupk$Vr5WT<{_UWtB6Vo9QYd45rLT26j>d~!}|V&3LA HOgqB?(^?Y< diff --git a/tests/migration/__pycache__/test_contestation_failure_mapping.cpython-313-pytest-9.0.2.pyc b/tests/migration/__pycache__/test_contestation_failure_mapping.cpython-313-pytest-9.0.2.pyc index 1af436458bc10c10ab91bd35a5d6e5e9e9c6b98f..25ac0f0d2b0e4060002a497f62bbc594d1d4d8a6 100644 GIT binary patch delta 63 zcmexn-DJc4nU|M~0SMZc^=#x`!l)XnpPN^rpORRTsGpdgnpYB^oS#>cSR9{Tnpl)l Rl$e8`!;efVU!Hi&&?~*Pf09E)GyC3%1+D4FON^oNlnb#e1%a@ F1^}hu5m5jD diff --git a/tests/migration/__pycache__/test_contestation_prompt_terminal_out_of_scope.cpython-313-pytest-9.0.2.pyc b/tests/migration/__pycache__/test_contestation_prompt_terminal_out_of_scope.cpython-313-pytest-9.0.2.pyc new file mode 100644 index 0000000000000000000000000000000000000000..47993b948afb65e4e2b655ff3c8bf1210864ab01 GIT binary patch literal 3525 zcmeHK&ube;6yBBAlI^wK!~r*H4jlxA2wcf+>{8Mnv=sZ`fYoMeQZQyR-W{o{&hBhy zW*s}H9Qp?oO71PCgr4&!_>!Y!yVxv+7JAC9;D4ZR_Ln5cwLW&um(+bnsTwOcog@9`<-Z{18Wi2a$5qiSt_>`YL=b8ely$cFbbXG1qcCgcbPp zZQ~;t;*C2w!TZfHb_$io1FMJ|^$pOoU0F39>ziwE>3#(ylm+LxHJJW^# zL7J%oWqrd~%N<&ocY8w5+$2{cnA<4!RP2H*O+>w3Q5n@Sohhf*s=N!luFw%@ znIdcFjbg>I9bPMZqaIXPg^Hr5P}fh)XwjLu%CpYY|DNaBt2|#yp6#nVUrL_muJU{t zdF~m_`K@Hm<)NZd5#{qR-hhQ2iU?AiGbE_uA|wKJw!g-m4eWf;`Eq?3?J@p+Onr`c zj9j81?`ALM=vCz2NCmK5X(`( zmA}v9Z3s?P@h%ng=s5wwAP|wG=b&{tMI8Bx2FtJyScRn%!U$oCih>sMeS(TCrJ?aw zF*CULeUHMLF7q=nDb){SP~!3cbp?@BYLlaeq{yR^_K9dLqlQZ)M>>;&G-3y)To3dX zW2T4)siY$CL&8AKXyYE;r^SdsAt`p9%0dt|iYF>2tks+m`h_T&{VY1vWyVA#*Re|& z!-7TvWJN^KWCly3lN5<$4w!f^_L=fSs1)NsmdQ;lzvVIW(kR?xe2*|3LcWrP&(pfW z=~)+oi{u9GauE=PbwNm&o~!1R(645Rt>@0_yfO~n&p;NqIu1UNQxJ&smGs*|sM;RX zy-j+MY^;kyB`fMDos{Vbv;QD;xY~eeSIW;>?=r<(p=)gA*48@2MS9CnY{@c(XWm26}*Z*HU6A` z`{#v|`S#O|zinq=?G7I94(;7DD{sf(v7HQ_j@czaJ0Fht!%0}uPORN?dwpPaUM>yo z&Y6|BW2-Z;*E4uJW|stTzFaENZ~~R?6RUG>?+q+A=(3^B&aAv0gU8;>;OUrM611~B z;twZbNjtIFxxF*6=m689P0y^n9fQZ-$>8ajT@thtkNCq$Skg``dTu`&Sp9+5AKLvh zD{sf(u^(mdbj&UZ+Ubq>!$~+!yMT%t&6#Anc%;MvIFeg9dmdZa(*WnICFo-TUq;DH z=}PLkPuM!Efu*I7?WcuTPdoiP*3ItI91(G-5 Z_HWfR&A$xe2jdUp-bJl$erKjZ{{dbT&m;f< literal 0 HcmV?d00001 diff --git a/tests/migration/__pycache__/test_external_guardrails_judges_spi.cpython-313-pytest-9.0.2.pyc b/tests/migration/__pycache__/test_external_guardrails_judges_spi.cpython-313-pytest-9.0.2.pyc index b7f9c1bd586546d72cc8fb535069f51f3d1a5d5d..c9a05f97dc5c80a31441472da335f50b68971e98 100644 GIT binary patch delta 63 zcmbR2Ki{AGGcPX}0}!+?>)FW7!lxRqpPN^rpORRTsGpdgnpYB^oS#>cSR9{Tnpl)l Rl$e5;gby3&&?~*Pf09E)GyC3%1+D4FON^oNlnb#Y{Hi< F2>^?Q5J&(3 diff --git a/tests/migration/__pycache__/test_guardrail_binary_parity.cpython-313-pytest-9.0.2.pyc b/tests/migration/__pycache__/test_guardrail_binary_parity.cpython-313-pytest-9.0.2.pyc index 7e81c6a992b58955aadeef8dfc587103bf0e881e..bfb516550fcf33c6431eed1392d9246a234866e4 100644 GIT binary patch delta 63 zcmX>Ye>R@`GcPX}0}!+?>)FVi%cL5ipPN^rpORRTsGpdgnpYB^oS#>cSR9{Tnpl)l Rl$ebe=wf=GcPX}0}w=H_HE?OWs>yK&&?~*Pf09E)GyC3%1+D4FON^oNlnb#JeSEp F7XYvF5l{dC diff --git a/tests/migration/__pycache__/test_guardrail_context_dict_history.cpython-313-pytest-9.0.2.pyc b/tests/migration/__pycache__/test_guardrail_context_dict_history.cpython-313-pytest-9.0.2.pyc index 3467c1501ec6412b8a8909f69cff86b0c508fe44..f42a41afb282f875905a8cde4dc80b4a27d42114 100644 GIT binary patch delta 63 zcmdnbf102BGcPX}0}!+?>)FVi%BmW#pPN^rpORRTsGpdgnpYB^oS#>cSR9{Tnpl)l Rl$e_A+725y+ delta 51 zcmX@jzn`D`GcPX}0}w=H_HE=&Wt9xp&&?~*Pf09E)GyC3%1+D4FON^oNlnb#JeAdq F2>_6O5QG2# diff --git a/tests/migration/__pycache__/test_guardrail_original_defaults_parity.cpython-313-pytest-9.0.2.pyc b/tests/migration/__pycache__/test_guardrail_original_defaults_parity.cpython-313-pytest-9.0.2.pyc index 5a7ab7b6f6468c47454aadf6b46dc4e556af4b70..5719508998d892d9e6053783194e1712f0be759b 100644 GIT binary patch delta 63 zcmZ2)wA+aLGcPX}0}!+?>)FWtfJZf1KR2&LKP9mwQ9m&~HLoN-IX|x?u{b`xG_fe9 RC^0i9KDne~GYhXa4*;-X76||V delta 51 zcmdmOwBCsOGcPX}0}w=J_HE>Tz#|#1pPN^rpORRTs9&C6l%1B7Uml;FlbV>fS%6oY F2LPt^5VHUP diff --git a/tests/migration/__pycache__/test_mcp_contestation_subject_guard.cpython-313-pytest-9.0.2.pyc b/tests/migration/__pycache__/test_mcp_contestation_subject_guard.cpython-313-pytest-9.0.2.pyc index 5a836db8e89e5fd31e91f3157e4a3e6f42849e4c..03ad0c3d5f9dfcda615496e263d28b6cd930917e 100644 GIT binary patch delta 4508 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 Vu5dBuna8zN%-%2Bc&1C!^Ka8!(a8V+ delta 770 zcmbV~%TE(g6vjQaQk<3+F{EM&t&sq?K1TWog$8uv3u`H1AYx-CQ~Ge|W7<1I2rQ}# z*JyKAF5J3sW5{e=`VXKRH_XPB(SwIcW`!OMXon2xu{v1ylwDmxn^vu8?}&Na3OP7?$lrUqe~ATjLdz zE2P~e+#}p4JRm$IED|0OGT090Aa8#S<~)Ndq)ZT|2nx#KccG`EWaqkh_$4Q-d=tq+(f%I!>75N;Ay32V4N)e;}$ zDoghy7@bQA1M~e?fX|FW)s9Es_QNb5#71Baf5vt}$3nc^_na=)@k=}kb^H?_hX#%% zLOs`q1|6TVWvND4H8+fAiF0fv!Y}Hyw;|y46-$<;*Laf@nvUbW)7()t(=2f-aXOps zsFujkone8h$AnGt`^aB5cwMumr%xxErDjIJydV(iT^s|+C1~4f@&^nv;6uX10#1Kn zORrga!xXlKABOypqJ?`1I1m TqLiY<%$)e-l8Vhw*z&^w1xpyC delta 53 zcmcb=i}CUd~!}|V&3Kt HZ24gT?NSp= diff --git a/tests/migration/__pycache__/test_original_vas_variation.cpython-313-pytest-9.0.2.pyc b/tests/migration/__pycache__/test_original_vas_variation.cpython-313-pytest-9.0.2.pyc index 1d685993be34f0842f54ee743920e6730e860998..30ba8aa03c711d7c5d8bd31167e612dc96a11b02 100644 GIT binary patch delta 73 zcmdmgi{tby4(`vqyj%=G(7vo^Bll}g)o}gXyb}GC#F9k)#Prm>lKABOypqJ?`1I1m bqLiY<%$)e-l8R=2u6BMd#_jxEOa{sT)6W>} delta 61 zcmX?oi(~&S4(`vqyj%=G5SiJxk^42Lq_=)d~!}|VqUW} PSGzP9<92B-CIe*vj+Yaz diff --git a/tests/migration/__pycache__/test_original_vas_variation_adversarial.cpython-313-pytest-9.0.2.pyc b/tests/migration/__pycache__/test_original_vas_variation_adversarial.cpython-313-pytest-9.0.2.pyc index b83f684cd0db612cd060c2e9f9cd655a84bf9d8d..db50ba2db31c05346d8813192a1a781a33b046a6 100644 GIT binary patch delta 65 zcmZ2|iD~;KChpI?yj%=G(7vo^BljFJ)nxtLyb}GC#F9k)#Prm>lKABOypqJ?`1I1m UqLiY<%$)e-l8Vg-#Ih#=0QvzKmH+?% delta 53 zcmdmfiD~sEChpI?yj%=G5SiJxk$aAqWVn8AUWtB6Vo9QYd45rLT26j>d~!}|V&3L6 HV%d`bvI#=72jR0o-4l*U>lQ-O=;PQIU3?yDJ0E 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 literal 0 HcmV?d00001 diff --git a/tests/migration/__pycache__/test_vas_response_renderer.cpython-313-pytest-9.0.2.pyc b/tests/migration/__pycache__/test_vas_response_renderer.cpython-313-pytest-9.0.2.pyc index 0e32b184dc8e7f7bf84fb0eff8d57acd1293e635..481b290c3c2ac67b38cb28e5f44ba508ab143e2d 100644 GIT binary patch delta 63 zcmdn1bW(}?GcPX}0}!+?>)FUH#;F>npPN^rpORRTsGpdgnpYB^oS#>cSR9{Tnpl)l Rl$e