From de0eb5e28a775728b4156d51a61976dee95422c4 Mon Sep 17 00:00:00 2001 From: "cristiano.hoshikawa" Date: Thu, 5 Nov 2026 07:58:58 -0300 Subject: [PATCH] new feature: JEV Integration. Now there are a current (native) LLM decision model and a JEV decision model --- .env.jev.example | 56 ++++ JEV_INTEGRATION.md | 84 +++++ .../src/agent_framework.egg-info/PKG-INFO | 2 + .../src/agent_framework.egg-info/SOURCES.txt | 12 + .../src/agent_framework.egg-info/requires.txt | 3 + .../__pycache__/__init__.cpython-313.pyc | Bin 389 -> 396 bytes .../__pycache__/idempotency.cpython-313.pyc | Bin 8890 -> 8897 bytes .../__pycache__/localization.cpython-313.pyc | Bin 0 -> 13626 bytes .../__pycache__/observer.cpython-313.pyc | Bin 17542 -> 17540 bytes .../__pycache__/__init__.cpython-313.pyc | Bin 534 -> 532 bytes .../composite_publisher.cpython-313.pyc | Bin 2489 -> 2487 bytes .../__pycache__/event_builder.cpython-313.pyc | Bin 1247 -> 1245 bytes .../__pycache__/factory.cpython-313.pyc | Bin 3983 -> 3981 bytes .../__pycache__/publisher.cpython-313.pyc | Bin 1859 -> 1857 bytes .../tim_payload_mapper.cpython-313.pyc | Bin 9532 -> 9530 bytes .../__pycache__/tim_sequence.cpython-313.pyc | Bin 17548 -> 17546 bytes .../__pycache__/__init__.cpython-313.pyc | Bin 501 -> 499 bytes .../__pycache__/kafka.cpython-313.pyc | Bin 1799 -> 1797 bytes .../__pycache__/langfuse.cpython-313.pyc | Bin 23159 -> 23157 bytes .../__pycache__/oci_streaming.cpython-313.pyc | Bin 1808 -> 1806 bytes .../__pycache__/pubsub.cpython-313.pyc | Bin 7427 -> 7425 bytes .../__pycache__/__init__.cpython-313.pyc | Bin 390 -> 388 bytes .../usage_repository.cpython-313.pyc | Bin 15673 -> 15671 bytes .../__pycache__/__init__.cpython-313.pyc | Bin 191 -> 198 bytes .../cache/__pycache__/cache.cpython-313.pyc | Bin 16501 -> 16508 bytes .../__pycache__/__init__.cpython-313.pyc | Bin 203 -> 201 bytes .../__pycache__/adapters.cpython-313.pyc | Bin 4159 -> 4157 bytes .../channels/__pycache__/base.cpython-313.pyc | Bin 1783 -> 1781 bytes .../__pycache__/gateway.cpython-313.pyc | Bin 5758 -> 5756 bytes .../__pycache__/interruption.cpython-313.pyc | Bin 6407 -> 6893 bytes .../__pycache__/transcription.cpython-313.pyc | Bin 1416 -> 1414 bytes .../agent_framework/channels/interruption.py | 7 +- .../__pycache__/__init__.cpython-313.pyc | Bin 910 -> 908 bytes .../checkpoint_repository.cpython-313.pyc | Bin 27150 -> 27148 bytes .../langgraph_saver.cpython-313.pyc | Bin 33252 -> 33250 bytes .../__pycache__/__init__.cpython-313.pyc | Bin 192 -> 199 bytes .../agent_registry.cpython-313.pyc | Bin 6934 -> 6932 bytes .../__pycache__/settings.cpython-313.pyc | Bin 13926 -> 14638 bytes .../src/agent_framework/decisions/__init__.py | 2 + .../__pycache__/__init__.cpython-313.pyc | Bin 0 -> 436 bytes .../__pycache__/client.cpython-313.pyc | Bin 0 -> 25274 bytes .../decisions/adapters/__init__.py | 1 + .../__pycache__/__init__.cpython-313.pyc | Bin 0 -> 296 bytes .../__pycache__/typesafe.cpython-313.pyc | Bin 0 -> 6713 bytes .../decisions/adapters/typesafe.py | 97 ++++++ .../src/agent_framework/decisions/client.py | 298 ++++++++++++++++++ .../__pycache__/__init__.cpython-313.pyc | Bin 284 -> 291 bytes .../mcp_gateway_client.cpython-313.pyc | Bin 3310 -> 3317 bytes .../global_supervisor/router.py | 8 +- .../__pycache__/__init__.cpython-313.pyc | Bin 1479 -> 1486 bytes .../__pycache__/base.cpython-313.pyc | Bin 1353 -> 1360 bytes .../__pycache__/config_loader.cpython-313.pyc | Bin 9138 -> 9145 bytes .../__pycache__/custom_rails.cpython-313.pyc | Bin 4382 -> 4389 bytes .../dlex_sanitizer.cpython-313.pyc | Bin 8474 -> 8472 bytes .../framework_llm_client.cpython-313.pyc | Bin 19651 -> 20563 bytes .../__pycache__/llm_rails.cpython-313.pyc | Bin 5910 -> 6373 bytes .../output_supervisor.cpython-313.pyc | Bin 24284 -> 25190 bytes .../parallel_executor.cpython-313.pyc | Bin 21840 -> 21847 bytes .../__pycache__/pipeline.cpython-313.pyc | Bin 10867 -> 10900 bytes .../__pycache__/rail_action.cpython-313.pyc | Bin 632 -> 639 bytes .../__pycache__/rail_decision.cpython-313.pyc | Bin 1583 -> 1702 bytes .../__pycache__/rail_result.cpython-313.pyc | Bin 982 -> 989 bytes .../__pycache__/rails.cpython-313.pyc | Bin 45164 -> 43547 bytes .../__pycache__/__init__.cpython-313.pyc | Bin 2972 -> 2979 bytes .../__pycache__/_compat.cpython-313.pyc | Bin 2423 -> 2430 bytes .../contestation_validation.cpython-313.pyc | Bin 2155 -> 2162 bytes .../__pycache__/contracts.cpython-313.pyc | Bin 6879 -> 6886 bytes .../__pycache__/input_size.cpython-313.pyc | Bin 3627 -> 3634 bytes .../__pycache__/llm_adapter.cpython-313.pyc | Bin 3777 -> 3784 bytes .../__pycache__/llm_client.cpython-313.pyc | Bin 7432 -> 6870 bytes .../__pycache__/llm_rails.cpython-313.pyc | Bin 8872 -> 8598 bytes .../output_sanitization.cpython-313.pyc | Bin 13888 -> 13871 bytes .../__pycache__/pipeline.cpython-313.pyc | Bin 12639 -> 10765 bytes .../guardrails/calibrated/llm_client.py | 4 +- .../__pycache__/__init__.cpython-313.pyc | Bin 451 -> 458 bytes .../__pycache__/_context.cpython-313.pyc | Bin 5849 -> 5856 bytes .../ausencia_oferta_proativa.cpython-313.pyc | Bin 12183 -> 12190 bytes .../__pycache__/coerencia.cpython-313.pyc | Bin 4135 -> 4142 bytes .../__pycache__/dlex_in.cpython-313.pyc | Bin 1282 -> 1289 bytes .../__pycache__/dlex_out.cpython-313.pyc | Bin 1793 -> 1800 bytes .../__pycache__/fallback.cpython-313.pyc | Bin 17630 -> 6114 bytes .../__pycache__/fraseologia.cpython-313.pyc | Bin 7611 -> 7618 bytes .../__pycache__/out_of_scope.cpython-313.pyc | Bin 17471 -> 17478 bytes .../prompts/__pycache__/pinj.cpython-313.pyc | Bin 8402 -> 8409 bytes .../__pycache__/ragsec.cpython-313.pyc | Bin 1098 -> 1105 bytes .../__pycache__/revprec.cpython-313.pyc | Bin 3128 -> 3135 bytes .../prompts/__pycache__/tox.cpython-313.pyc | Bin 622 -> 629 bytes .../toxicidade_output.cpython-313.pyc | Bin 906 -> 913 bytes .../__pycache__/__init__.cpython-313.pyc | Bin 1641 -> 1648 bytes .../rails/__pycache__/alcada.cpython-313.pyc | Bin 4977 -> 4984 bytes .../rails/__pycache__/anatel.cpython-313.pyc | Bin 9126 -> 7292 bytes .../__pycache__/confirmation.cpython-313.pyc | Bin 11020 -> 11027 bytes .../rails/__pycache__/dlex_in.cpython-313.pyc | Bin 3257 -> 3264 bytes .../__pycache__/dlex_out.cpython-313.pyc | Bin 3309 -> 3316 bytes .../rails/__pycache__/ragsec.cpython-313.pyc | Bin 5440 -> 5390 bytes .../rails/__pycache__/revprec.cpython-313.pyc | Bin 5448 -> 5400 bytes .../rails/__pycache__/tox.cpython-313.pyc | Bin 8271 -> 8238 bytes .../__pycache__/__init__.cpython-313.pyc | Bin 511 -> 518 bytes .../rules/__pycache__/alcada.cpython-313.pyc | Bin 1859 -> 1866 bytes .../__pycache__/pinj_patterns.cpython-313.pyc | Bin 3708 -> 2792 bytes .../__pycache__/tox_blocklist.cpython-313.pyc | Bin 1484 -> 1640 bytes .../guardrails/framework_llm_client.py | 12 +- .../agent_framework/guardrails/llm_rails.py | 6 +- .../__pycache__/__init__.cpython-313.pyc | Bin 386 -> 393 bytes .../__pycache__/mcp_mapper.cpython-313.pyc | Bin 4670 -> 4677 bytes .../__pycache__/models.cpython-313.pyc | Bin 3122 -> 3129 bytes .../__pycache__/resolver.cpython-313.pyc | Bin 4691 -> 4698 bytes .../__pycache__/__init__.cpython-313.pyc | Bin 605 -> 603 bytes .../judges/__pycache__/judge.cpython-313.pyc | Bin 43971 -> 44500 bytes .../__pycache__/__init__.cpython-313.pyc | Bin 212 -> 210 bytes .../__pycache__/llm_client.cpython-313.pyc | Bin 5391 -> 6259 bytes .../judges/calibrated/llm_client.py | 28 +- .../__pycache__/__init__.cpython-313.pyc | Bin 220 -> 218 bytes .../prompts/__pycache__/aluc.cpython-313.pyc | Bin 6516 -> 6514 bytes .../prompts/__pycache__/csi.cpython-313.pyc | Bin 1319 -> 1317 bytes .../__pycache__/fallback.cpython-313.pyc | Bin 8022 -> 3156 bytes .../prompts/__pycache__/rqlt.cpython-313.pyc | Bin 1152 -> 1150 bytes .../prompts/__pycache__/vctn.cpython-313.pyc | Bin 613 -> 611 bytes .../src/agent_framework/judges/judge.py | 7 +- .../llm/__pycache__/__init__.cpython-313.pyc | Bin 454 -> 461 bytes .../llm/__pycache__/base.cpython-313.pyc | Bin 1601 -> 1608 bytes .../profile_resolver.cpython-313.pyc | Bin 12071 -> 12114 bytes .../llm/__pycache__/providers.cpython-313.pyc | Bin 47183 -> 47241 bytes .../structured_output.cpython-313.pyc | Bin 7437 -> 7444 bytes .../llm/__pycache__/types.cpython-313.pyc | Bin 1252 -> 1259 bytes .../src/agent_framework/llm/providers.py | 2 +- .../mcp/__pycache__/__init__.cpython-313.pyc | Bin 451 -> 458 bytes .../mcp/__pycache__/client.cpython-313.pyc | Bin 18404 -> 18411 bytes .../mcp/__pycache__/models.cpython-313.pyc | Bin 2114 -> 2121 bytes .../mcp/__pycache__/registry.cpython-313.pyc | Bin 4718 -> 4725 bytes .../__pycache__/tool_policy.cpython-313.pyc | Bin 5663 -> 5670 bytes .../__pycache__/tool_router.cpython-313.pyc | Bin 14167 -> 14362 bytes .../__pycache__/__init__.cpython-313.pyc | Bin 1113 -> 1120 bytes .../long_term_extractor.cpython-313.pyc | Bin 2500 -> 1797 bytes .../long_term_memory.cpython-313.pyc | Bin 6826 -> 7392 bytes .../long_term_models.cpython-313.pyc | Bin 1735 -> 1733 bytes .../long_term_store.cpython-313.pyc | Bin 29173 -> 29171 bytes .../message_history.cpython-313.pyc | Bin 8337 -> 8344 bytes .../summary_memory.cpython-313.pyc | Bin 12498 -> 12505 bytes .../__pycache__/summary_store.cpython-313.pyc | Bin 9498 -> 9505 bytes .../__pycache__/__init__.cpython-313.pyc | Bin 192 -> 199 bytes .../__pycache__/identity.cpython-313.pyc | Bin 3452 -> 3450 bytes .../__pycache__/session.cpython-313.pyc | Bin 2686 -> 2693 bytes .../__pycache__/__init__.cpython-313.pyc | Bin 1372 -> 1379 bytes .../__pycache__/code_mapper.cpython-313.pyc | Bin 21425 -> 21432 bytes .../__pycache__/context.cpython-313.pyc | Bin 7364 -> 7371 bytes .../__pycache__/event_bus.cpython-313.pyc | Bin 3610 -> 3617 bytes .../guardrail_events.cpython-313.pyc | Bin 2028 -> 2089 bytes .../__pycache__/ic_events.cpython-313.pyc | Bin 603 -> 610 bytes .../__pycache__/judge_events.cpython-313.pyc | Bin 1388 -> 1863 bytes .../langgraph_telemetry.cpython-313.pyc | Bin 4941 -> 4948 bytes .../__pycache__/llm_advisors.cpython-313.pyc | Bin 2915 -> 2922 bytes .../__pycache__/noc_contract.cpython-313.pyc | Bin 5052 -> 5059 bytes .../__pycache__/noc_otel.cpython-313.pyc | Bin 6308 -> 6306 bytes .../__pycache__/observer.cpython-313.pyc | Bin 5091 -> 5089 bytes .../__pycache__/otel.cpython-313.pyc | Bin 3389 -> 3396 bytes .../severity_policy.cpython-313.pyc | Bin 0 -> 3259 bytes .../streaming_events.cpython-313.pyc | Bin 1812 -> 1819 bytes .../__pycache__/telemetry.cpython-313.pyc | Bin 52405 -> 54123 bytes .../__pycache__/token_cost.cpython-313.pyc | Bin 8668 -> 8675 bytes .../workflow_events.cpython-313.pyc | Bin 3307 -> 3314 bytes .../oci/__pycache__/__init__.cpython-313.pyc | Bin 198 -> 196 bytes .../oci/__pycache__/auth.cpython-313.pyc | Bin 3230 -> 3228 bytes .../__pycache__/__init__.cpython-313.pyc | Bin 197 -> 204 bytes .../__pycache__/oracle_store.cpython-313.pyc | Bin 45918 -> 45916 bytes .../__pycache__/sqlite_store.cpython-313.pyc | Bin 14996 -> 15003 bytes .../__pycache__/__init__.cpython-313.pyc | Bin 432 -> 439 bytes .../__pycache__/renderers.cpython-313.pyc | Bin 4295 -> 4302 bytes .../rag/__pycache__/__init__.cpython-313.pyc | Bin 696 -> 694 bytes .../embedding_provider.cpython-313.pyc | Bin 6503 -> 6501 bytes .../__pycache__/graph_store.cpython-313.pyc | Bin 5514 -> 5512 bytes .../rag/__pycache__/ingest.cpython-313.pyc | Bin 12567 -> 12565 bytes .../__pycache__/rag_service.cpython-313.pyc | Bin 10848 -> 10891 bytes .../__pycache__/vector_store.cpython-313.pyc | Bin 18642 -> 18640 bytes .../__pycache__/__init__.cpython-313.pyc | Bin 207 -> 205 bytes .../session_repository.cpython-313.pyc | Bin 8576 -> 8574 bytes .../__pycache__/__init__.cpython-313.pyc | Bin 625 -> 632 bytes .../__pycache__/config_loader.cpython-313.pyc | Bin 2667 -> 2674 bytes .../__pycache__/continuity.cpython-313.pyc | Bin 15911 -> 16103 bytes .../enterprise_router.cpython-313.pyc | Bin 87602 -> 88464 bytes .../__pycache__/models.cpython-313.pyc | Bin 2424 -> 2431 bytes .../__pycache__/multi_intent.cpython-313.pyc | Bin 20244 -> 21515 bytes .../pending_topics.cpython-313.pyc | Bin 16110 -> 16117 bytes .../src/agent_framework/routing/continuity.py | 6 +- .../routing/enterprise_router.py | 30 +- .../__pycache__/__init__.cpython-313.pyc | Bin 326 -> 333 bytes .../__pycache__/agent_runtime.cpython-313.pyc | Bin 211766 -> 212343 bytes .../transaction_parameters.cpython-313.pyc | Bin 19561 -> 21566 bytes .../runtime/transaction_parameters.py | 27 ++ .../sse/__pycache__/__init__.cpython-313.pyc | Bin 198 -> 196 bytes .../sse/__pycache__/events.cpython-313.pyc | Bin 9574 -> 9572 bytes .../__pycache__/__init__.cpython-313.pyc | Bin 196 -> 203 bytes .../__pycache__/supervisor.cpython-313.pyc | Bin 5381 -> 5388 bytes .../__pycache__/__init__.cpython-313.pyc | Bin 856 -> 863 bytes .../__pycache__/graph.cpython-313.pyc | Bin 1393 -> 1400 bytes .../input_contract.cpython-313.pyc | Bin 8768 -> 8838 bytes .../__pycache__/models.cpython-313.pyc | Bin 7647 -> 7654 bytes .../__pycache__/registry.cpython-313.pyc | Bin 2339 -> 2346 bytes .../__pycache__/repository.cpython-313.pyc | Bin 2692 -> 2699 bytes .../__pycache__/runtime.cpython-313.pyc | Bin 36130 -> 36137 bytes .../__pycache__/tool_executor.cpython-313.pyc | Bin 1944 -> 1951 bytes ...ev_choice_fix.cpython-313-pytest-9.0.2.pyc | Bin 0 -> 5787 bytes .../test_jev_endpoint.cpython-313.pyc | Bin 0 -> 3465 bytes ...esafe_adapter.cpython-313-pytest-9.0.2.pyc | Bin 0 -> 21644 bytes tests/test_jev_choice_fix.py | 28 ++ tests/test_jev_decisions.py | 133 ++++++++ tests/test_jev_endpoint.py | 33 ++ tests/test_jev_transport_standalone.py | 210 ++++++++++++ tests/test_jev_typesafe_adapter.py | 176 +++++++++++ tests/test_jev_typesafe_direct.py | 28 ++ 210 files changed, 1275 insertions(+), 25 deletions(-) create mode 100644 .env.jev.example create mode 100644 JEV_INTEGRATION.md create mode 100644 libs/agent_framework/src/agent_framework/__pycache__/localization.cpython-313.pyc create mode 100644 libs/agent_framework/src/agent_framework/decisions/__init__.py create mode 100644 libs/agent_framework/src/agent_framework/decisions/__pycache__/__init__.cpython-313.pyc create mode 100644 libs/agent_framework/src/agent_framework/decisions/__pycache__/client.cpython-313.pyc create mode 100644 libs/agent_framework/src/agent_framework/decisions/adapters/__init__.py create mode 100644 libs/agent_framework/src/agent_framework/decisions/adapters/__pycache__/__init__.cpython-313.pyc create mode 100644 libs/agent_framework/src/agent_framework/decisions/adapters/__pycache__/typesafe.cpython-313.pyc create mode 100644 libs/agent_framework/src/agent_framework/decisions/adapters/typesafe.py create mode 100644 libs/agent_framework/src/agent_framework/decisions/client.py create mode 100644 libs/agent_framework/src/agent_framework/observability/__pycache__/severity_policy.cpython-313.pyc create mode 100644 tests/__pycache__/test_jev_choice_fix.cpython-313-pytest-9.0.2.pyc create mode 100644 tests/__pycache__/test_jev_endpoint.cpython-313.pyc create mode 100644 tests/__pycache__/test_jev_typesafe_adapter.cpython-313-pytest-9.0.2.pyc create mode 100644 tests/test_jev_choice_fix.py create mode 100644 tests/test_jev_decisions.py create mode 100644 tests/test_jev_endpoint.py create mode 100644 tests/test_jev_transport_standalone.py create mode 100644 tests/test_jev_typesafe_adapter.py create mode 100644 tests/test_jev_typesafe_direct.py diff --git a/.env.jev.example b/.env.jev.example new file mode 100644 index 0000000..cc13d33 --- /dev/null +++ b/.env.jev.example @@ -0,0 +1,56 @@ +# Copy these settings into the .env loaded by the running backend/gateway. +# Existing feature flags (ENABLE_LLM_ROUTER, ENABLE_ROUTE_STICKINESS, etc.) still apply. +# Global default; each individual setting below takes precedence. +DECISION_PROVIDER=current +DECISION_FALLBACK_TO_CURRENT=true +JEV_ENDPOINT=https://api.typesafe.ai/v1/systemone +AI_GATEWAY_API_KEY= +JEV_MODEL=jev-latest +JEV_TIMEOUT_SECONDS=15 +JEV_MIN_CONFIDENCE=0.7 +JEV_DECISION_DIAGNOSTICS=true + +# All options: current | jev. No existing behavior changes by default. +DECISION_ROUTE_CONTINUITY_PROVIDER=current +DECISION_ROUTER_PROVIDER=current +DECISION_WORKFLOW_EXPECTED_INPUT_PROVIDER=current +DECISION_WORKFLOW_REENTRY_PROVIDER=current +DECISION_TRANSACTION_CONFIRMATION_PROVIDER=current +DECISION_TRANSACTION_PARAMETER_RELEVANCE_PROVIDER=current +DECISION_TRANSACTION_INTENT_SHIFT_PROVIDER=current +DECISION_MULTI_INTENT_PROVIDER=current +DECISION_TRANSACTION_PARAMETER_RECONCILIATION_PROVIDER=current +DECISION_GLOBAL_SUPERVISOR_PROVIDER=current +DECISION_PROCESSING_INTERRUPTION_PROVIDER=current + +# Generic LLM guardrail and output supervisor (existing profile names). +DECISION_GUARDRAIL_GUARDRAIL_PROVIDER=current +DECISION_GUARDRAIL_GRL_PROVIDER=current +# Calibrated guardrails, independently by task. +DECISION_GUARDRAIL_PINJ_PROVIDER=current +DECISION_GUARDRAIL_COER_PROVIDER=current +DECISION_GUARDRAIL_TOX_PROVIDER=current +DECISION_GUARDRAIL_REVPREC_PROVIDER=current +DECISION_GUARDRAIL_AOFERTA_PROVIDER=current +DECISION_GUARDRAIL_OOS_PROVIDER=current +DECISION_GUARDRAIL_FRASEOLOGIA_PROVIDER=current +DECISION_GUARDRAIL_RAGSEC_PROVIDER=current +DECISION_GUARDRAIL_DLEX_IN_PROVIDER=current +DECISION_GUARDRAIL_DLEX_OUT_PROVIDER=current + +# Calibrated judges, by task; generic judges, by configured name. +DECISION_JUDGE_CSI_PROVIDER=current +DECISION_JUDGE_VCTN_PROVIDER=current +DECISION_JUDGE_ALUC_PROVIDER=current +DECISION_JUDGE_RQLT_PROVIDER=current +DECISION_JUDGE_LLM_JUDGE_PROVIDER=current + +# Optional threshold per point, independent from the provider choice. +# DECISION_ROUTE_CONTINUITY_MIN_CONFIDENCE=0.90 +# DECISION_TRANSACTION_CONFIRMATION_MIN_CONFIDENCE=0.95 + +# Named calibrated judge overrides its task group (optional). +# DECISION_JUDGE_GROUNDEDNESS_PROVIDER=jev +# DECISION_JUDGE_RESPONSE_QUALITY_PROVIDER=current +# Optional individual guardrail recheck override. +# DECISION_GUARDRAIL_DLEX_OUT_PROTOCOL_AUTHORIZATION_RECHECK_PROVIDER=jev diff --git a/JEV_INTEGRATION.md b/JEV_INTEGRATION.md new file mode 100644 index 0000000..a635528 --- /dev/null +++ b/JEV_INTEGRATION.md @@ -0,0 +1,84 @@ +# Seleção individual de decisões: modelo atual ou JEV + +Implementação opt-in para o projeto do ZIP de 03/11/2026. O padrão continua sendo `current`; nenhum modelo foi ativado e nenhuma chave foi incluída. + +## Configuração + +Copie as variáveis de `.env.jev.example` para o `.env` utilizado pelo processo. Se usar contêiner/Kubernetes, passe as variáveis também para o ambiente do processo e guarde a chave no mecanismo de secrets do ambiente. Reinicie o serviço após alterar a configuração. Substitua os arquivos de código e refaça o build/redeploy caso o framework esteja instalado em pacote ou imagem; reiniciar sem atualizar o pacote instalado não aplica mudanças de código. + +Exemplo: ativar somente continuidade e intenção, mantendo o restante atual: + +```dotenv +DECISION_PROVIDER=current +DECISION_ROUTE_CONTINUITY_PROVIDER=jev +DECISION_ROUTER_PROVIDER=jev +AI_GATEWAY_API_KEY= +JEV_MODEL=typesafe-ai/jev +DECISION_FALLBACK_TO_CURRENT=true +JEV_MIN_CONFIDENCE=0.7 +DECISION_ROUTE_CONTINUITY_MIN_CONFIDENCE=0.90 +``` + +A variável individual prevalece sobre `DECISION_PROVIDER`. Uma variável individual ausente herda o padrão global. Como o exemplo define todas como `current`, mudar somente a variável global não altera os pontos explicitamente definidos. Os valores válidos são `current` e `jev`. + +A seleção não habilita funcionalidades desativadas: `ENABLE_LLM_ROUTER`, `ENABLE_ROUTE_STICKINESS`, configuração de semantic classifiers e configuração dos guardrails/judges continuam controlando se cada ponto é executado. Para não tornar `current` incompatível, não foram alteradas as regras determinísticas nem os controles de execução. + +## Pontos disponíveis + +Cada sufixo abaixo corresponde a `DECISION__PROVIDER`: + +| Sufixo | Função | +|---|---| +| ROUTE_CONTINUITY | CONTINUE, ROUTE, HUMAN_HANDOFF, END_SESSION; inclui sondagem de controles globais que usa o mesmo classificador | +| ROUTER | Intenção semântica; agente, domínio e ferramentas derivados do catálogo local | +| WORKFLOW_EXPECTED_INPUT | Opção permitida para retomada de workflow; opção sem correspondência não retoma | +| WORKFLOW_REENTRY | REENTER ou RESUME | +| TRANSACTION_CONFIRMATION | Confirmação semântica, usando as opções configuradas; parser explícito permanece | +| TRANSACTION_PARAMETER_RELEVANCE | RELEVANT ou NOT_RELEVANT | +| TRANSACTION_INTENT_SHIFT | CONTINUE, REPLACE, SHIFT ou ABANDON e intenção de destino | +| MULTI_INTENT | Intenção de cada objetivo extraído, com preservação de ordem e trechos literais | +| TRANSACTION_PARAMETER_RECONCILIATION | resolved, preserve, clear ou unresolved por parâmetro | +| GLOBAL_SUPERVISOR | Backend permitido no registro do supervisor global | +| PROCESSING_INTERRUPTION | Regenerar resposta de voz ou repetir | +| GUARDRAIL_GUARDRAIL / GUARDRAIL_GRL | Guardrails LLM genéricos com os perfis padrão; perfis personalizados usam GUARDRAIL_ | +| GUARDRAIL_PINJ, COER, TOX, REVPREC, AOFERTA, OOS, FRASEOLOGIA, RAGSEC, DLEX_IN, DLEX_OUT | Cada tarefa calibrada tem sua própria variável GUARDRAIL_ | +| JUDGE_CSI, JUDGE_VCTN, JUDGE_ALUC, JUDGE_RQLT | Cada tarefa de judge calibrado, como padrão de grupo | +| JUDGE_ | Judge genérico, usando seu `name`; o padrão é JUDGE_LLM_JUDGE | + +Um judge calibrado também aceita `DECISION_JUDGE__PROVIDER`, que prevalece sobre o grupo da tarefa (por exemplo `DECISION_JUDGE_GROUNDEDNESS_PROVIDER` prevalece sobre `DECISION_JUDGE_ALUC_PROVIDER`). Rechecagens de guardrail aceitam o nome completo do componente, por exemplo `DECISION_GUARDRAIL_DLEX_OUT_PROTOCOL_AUTHORIZATION_RECHECK_PROVIDER`, prevalecendo sobre `DECISION_GUARDRAIL_DLEX_OUT_PROVIDER`. + +Caracteres diferentes de letras/números são convertidos em `_`, com nome em maiúsculas. O mesmo ponto pode definir `DECISION__MIN_CONFIDENCE`; esse valor é independente dos limites já existentes no componente. Os limites existentes continuam sendo aplicados depois da integração. + +## O que é híbrido + +- Multi-intenção: o modelo atual extrai os objetivos e seus trechos, mantendo a ordem. O JEV escolhe a intenção de cada objetivo. Não há geração de trechos pelo JEV; trechos não literais são rejeitados. Isso pode custar mais que uma chamada atual isolada, por ser uma etapa adicional. +- Reconciliação: o modelo atual extrai candidatos e proveniência. JEV decide o tratamento de cada campo. A decisão não inventa valores e não substitui validação de negócio. +- Geração final, extração livre, resumos, RAG rewrite/compression, TOXOUT e FALLBACK de texto seguem no provedor atual. Autorização, alçadas, idempotência, pré-validação de negócio e execução seguem nas implementações existentes. +- Guardrail LLM genérico no JEV avalia se o texto original pode passar sem alteração. Se precisar de sanitização, deve bloquear; o JEV não fornece `sanitized_text` ou instruções textuais de reescrita. Reescritas já separadas no fluxo continuam generativas. +- Judges JEV não inventam rótulos ou justificativas de prosa: o retorno contém os campos necessários à decisão e motivo técnico fixo. RQLT/CSI usam score 0–10; judge genérico converte para 0–1. Os limites precisam de calibração antes de produção. + +## Transporte, falhas e observabilidade + +O cliente usa `POST https://ai-gateway.vercel.sh/v1/decisions` com `typesafe-ai/jev`, API key em `Authorization`, timeout de 15 segundos por padrão e perguntas choice/predicate/score. Usa a biblioteca padrão do Python; não adiciona dependências de produção. A chamada bloqueante roda em thread para não bloquear o event loop. + +Respostas incompletas, tipos incompatíveis, opções não declaradas, números inválidos, confiança abaixo do limite e erros de transporte acionam o provedor atual uma vez quando `DECISION_FALLBACK_TO_CURRENT=true`. Sem fallback, a exceção chega ao tratamento de falha já existente do componente; isso não redefine automaticamente cada política fail-open/fail-closed. Confiança ausente em choice/score é zero e aciona fallback no limite padrão. Para predicates usa-se a probabilidade do resultado selecionado. Para várias perguntas usa-se o mínimo das confianças. + +O custo de uma chamada JEV seguida de fallback inclui ambas as etapas. Respostas recebidas são contabilizadas no repositório de uso e no evento `decision.jev` quando o provedor original oferece esses recursos, mesmo quando a validação rejeita a resposta. Logs registram ponto, modelo, duração, uso e falha/fallback, sem imprimir prompts, chave ou corpo de erro HTTP. Não há geração Langfuse de chat para chamadas JEV; a integração publica evento de decisão. + +## Validação + +Teste isolado, sem dependências do projeto ou API real: + +```sh +python3 tests/test_jev_transport_standalone.py +``` + +Testes adicionais de integração em ambiente com dependências instaladas: + +```sh +PYTHONPATH=libs/agent_framework/src python -m pytest tests/test_jev_decisions.py tests/test_expected_input_semantic_classifier.py tests/unit/test_semantic_route_stickiness.py +``` + +O teste isolado cobre contratos, seleção, precedência de configuração, fallback, erros, confiança, transporte e análise sintática dos módulos. Resultado local: 17 testes isolados passaram, incluindo execução dos corpos reais de continuidade, roteamento, reconciliação e judge calibrado com transporte simulado. A suíte completa não foi executada: as dependências do projeto não estavam disponíveis e a tentativa de instalação não conseguiu obtê-las. A suíte completa e a qualidade/latência do modelo real precisam ser verificadas no ambiente de execução. Não foi feita chamada real ao JEV. + +Fontes de protocolo consultadas: https://vercel.com/docs/ai-gateway/sdks-and-apis/openai-decisions e https://vercel.com/ai-gateway/models/jev. diff --git a/libs/agent_framework/src/agent_framework.egg-info/PKG-INFO b/libs/agent_framework/src/agent_framework.egg-info/PKG-INFO index a25a9f9..8dbcc58 100644 --- a/libs/agent_framework/src/agent_framework.egg-info/PKG-INFO +++ b/libs/agent_framework/src/agent_framework.egg-info/PKG-INFO @@ -24,3 +24,5 @@ Requires-Dist: motor>=3.6.0 Requires-Dist: google-cloud-pubsub>=2.28.0 Requires-Dist: mcp>=1.9.0 Requires-Dist: PyJWT[crypto]>=2.9.0 +Provides-Extra: a2a +Requires-Dist: a2a-sdk[http-server]==1.2.2; extra == "a2a" diff --git a/libs/agent_framework/src/agent_framework.egg-info/SOURCES.txt b/libs/agent_framework/src/agent_framework.egg-info/SOURCES.txt index f524a57..d1dd3a7 100644 --- a/libs/agent_framework/src/agent_framework.egg-info/SOURCES.txt +++ b/libs/agent_framework/src/agent_framework.egg-info/SOURCES.txt @@ -3,6 +3,7 @@ src/agent_framework/__init__.py src/agent_framework/extensions.py src/agent_framework/gateway_policy_context.py src/agent_framework/idempotency.py +src/agent_framework/localization.py src/agent_framework/observer.py src/agent_framework/runtime_mcp_gateway_adapter.py src/agent_framework.egg-info/PKG-INFO @@ -10,6 +11,10 @@ src/agent_framework.egg-info/SOURCES.txt src/agent_framework.egg-info/dependency_links.txt src/agent_framework.egg-info/requires.txt src/agent_framework.egg-info/top_level.txt +src/agent_framework/a2a/__init__.py +src/agent_framework/a2a/client.py +src/agent_framework/a2a/progress.py +src/agent_framework/a2a/server.py src/agent_framework/analytics/__init__.py src/agent_framework/analytics/composite_publisher.py src/agent_framework/analytics/event_builder.py @@ -39,6 +44,10 @@ src/agent_framework/config/__init__.py src/agent_framework/config/agent_registry.py src/agent_framework/config/observability_mapping.yaml src/agent_framework/config/settings.py +src/agent_framework/decisions/__init__.py +src/agent_framework/decisions/client.py +src/agent_framework/decisions/adapters/__init__.py +src/agent_framework/decisions/adapters/typesafe.py src/agent_framework/events/__init__.py src/agent_framework/events/oci_streaming.py src/agent_framework/gateways/__init__.py @@ -138,6 +147,8 @@ 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/locales/en.json +src/agent_framework/locales/pt-BR.json src/agent_framework/mcp/__init__.py src/agent_framework/mcp/client.py src/agent_framework/mcp/models.py @@ -174,6 +185,7 @@ src/agent_framework/observability/noc_events.py src/agent_framework/observability/noc_otel.py src/agent_framework/observability/observer.py src/agent_framework/observability/otel.py +src/agent_framework/observability/severity_policy.py src/agent_framework/observability/streaming_events.py src/agent_framework/observability/streaming_exporter.py src/agent_framework/observability/telemetry.py diff --git a/libs/agent_framework/src/agent_framework.egg-info/requires.txt b/libs/agent_framework/src/agent_framework.egg-info/requires.txt index 199445b..ee253b1 100644 --- a/libs/agent_framework/src/agent_framework.egg-info/requires.txt +++ b/libs/agent_framework/src/agent_framework.egg-info/requires.txt @@ -19,3 +19,6 @@ motor>=3.6.0 google-cloud-pubsub>=2.28.0 mcp>=1.9.0 PyJWT[crypto]>=2.9.0 + +[a2a] +a2a-sdk[http-server]==1.2.2 diff --git a/libs/agent_framework/src/agent_framework/__pycache__/__init__.cpython-313.pyc b/libs/agent_framework/src/agent_framework/__pycache__/__init__.cpython-313.pyc index e26dd07becf057fb7d7586542363f1ecb6aafc7b..e2c503c703523d03e0c9a38d787ff85d1fb50ae4 100644 GIT binary patch delta 63 zcmZo=?qTNs%*)Hg00iqquTA8BuO6?Tn^&TrqVF5*86QxTpOuE455NF+DY} TB)%Xgu_P_OD0g!qv!^@&wG0*} delta 58 zcmX@;y33XOGcPX}0}zzoSiONzyJUM diff --git a/libs/agent_framework/src/agent_framework/__pycache__/localization.cpython-313.pyc b/libs/agent_framework/src/agent_framework/__pycache__/localization.cpython-313.pyc new file mode 100644 index 0000000000000000000000000000000000000000..a13d29bd6f7832f0691e62fbb576f5c3209c4275 GIT binary patch literal 13626 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

aJkRY7mZcZ!j|N;?@|M0MAcd&GUBvn zIH$p1aFsuRK5u+rN9jJ5NS|*pR!O~L__LDbh;QObYiUPZwyh|=Rkp&?k8^hy-+Ze7 zg_}?8T(nnZD@47-2%_v75a<$0c2f=y6ZfY4+e3Mw?B#9t;{Eo2@iNXgAo9L`-q+5{ z0m@5yE}>3MWeJDA3=aLvRyYSe1qc54bzm0|e9vf=Z`gPDKhVyu`iUEC4kclHcnEPv72pYPRF* z@Y{(u6En`ay7k$*^{9IEfHwA(#%A#s73QGfcw!W9OaEWD&)&x}*dNiF7w(q*F=}s6 zOK~^7x3~5z-c8RVb_;Ns;!cv$VI`?$?0DaoalbrB@BKm<&ydy{da0xBm5gm@IO7}| zrq+C%b3bAbjGMe ziz_v5beDlfyzS$QU_^j;v@_0MW)aqlQHM$s_2zl9AEBLiTDyu29&TCXl{1&mYm7MIFqY8lO2ra>Y~~BXs&Mb zPU3~R#8@sdmiMb!hiYhrQvGE~9I`H+7vB;#l{~n)5*w-nJ;cfgVuN-`cQMj}P-YEO{&Qpo`|aav(W@3MgZ%|y-Xpku$bJsWtT=XceRlbVe06KK z;@G?Av)hj5H+G>odGxNo{L1#r+watze0R(2#P@d2weHHb?z+>uCtq_i??0J!oHTS- z3r51i*5T(DxQ#cTV3#OcqtOVZk_yh0cj3tBh4&zTtc~8=P|Yav%e(!eoPt;Mp1V!L zi}2?Fz<0>E%tydmN#6ckNaTTA-2HI~KMlce{dkEFYxU9{G#z-K)@m$g$SQH$;IHsm z*bDnhYAV*cis1yKf3cmW!l);$vH18_d!~ZlYZ%)Jhr`cdu}i^nImDOEXQgFhEtZ{9 zf>2jU?fkj;su!WluzA|J&p@G#kqJaV5ZYkGBYH*AvDd=U;TR+7#)unqAL6ML+s310 z=AsIJq2fHA<1shY;8C=S%hpsQcr%ahI%w!mKbmPTzC?KU;z)r zF!E51m$3-2l>BD{1XvK28Nrhel)MyW;2|3JC4z6JEKC`kaO3HR@qpub`V3JvLK%gU z`5lQ7S$>f|FH*+sc@orIVsq|T;6Le}-9{j2FS`Rc5r5jhA-iuEMe#G6Q*``$KoA@M zMQH!2(EL-O;itmdj|Kn7g7>FFJVWlXZ7C-k?;(^`I)(bZO z)RQ@}?t#rKRuSZ~`&9b8-X`{lpZgprmOI4y`{lyMEnf(tcu;)kv5A{M_c_JNhm`@b ndFu2-0Y4AdQ28t`f3e0VZuyyj?6Vb4F(v+crA>TBqM_@F delta 69 zcmZqaWNhnXt`pWBE455NF+DY} SB)%Xgu_P_OD0lKa#tHy)0Tq`3 delta 66 zcmbQjGL41%GcPX}0}!a2uHDF;#i*IBpPN^rpQ7&@>=_?Wl%JKFTvDu`os^QKpO~JS UR}!CAl$e`Zo?nzbc@AR*0Dun_zyJUM diff --git a/libs/agent_framework/src/agent_framework/analytics/__pycache__/composite_publisher.cpython-313.pyc b/libs/agent_framework/src/agent_framework/analytics/__pycache__/composite_publisher.cpython-313.pyc index b27cca736871426a849733a59afbb7dc8aea0277..4ea8cd757d79757f2657a7a47549ab2ec33db393 100644 GIT binary patch delta 65 zcmdlfyj__4GcPX}0}!key|$5iIg@&cer{fgeu}J1HeeKQTQu VuOvRLC^0v+JijP=^G&9EYyiKx7dHR^ diff --git a/libs/agent_framework/src/agent_framework/analytics/__pycache__/event_builder.cpython-313.pyc b/libs/agent_framework/src/agent_framework/analytics/__pycache__/event_builder.cpython-313.pyc index 99dc601ed341b1219e5c15fef32614c7ddfbf7e2..a28e0ca340776158483016a708fd36d3eee392c6 100644 GIT binary patch delta 65 zcmcc5d6$#>GcPX}0}!key|$721(SN7er{fgeu}J1HeeKQTQu VuOvRLC^0v+JijP=vlR1TMgZ1k7R&$u diff --git a/libs/agent_framework/src/agent_framework/analytics/__pycache__/factory.cpython-313.pyc b/libs/agent_framework/src/agent_framework/analytics/__pycache__/factory.cpython-313.pyc index e629146924ec127e9574811f9c12e60ae3dfe60c..41113e123ecfe7281e2b6b33f10a8b938b8fd05c 100644 GIT binary patch delta 50 zcmeB|@0I8N%*)Hg00iqquWjUZVPedf9Ka+Zl$BbhpO~JSR}x>4lUS0LUzEGKf=Qeg E0A;5SBme*a delta 52 zcmeB`@0aKP%*)Hg00io$Yd3PcFfnFL4qy@y$xcd1(oalJ%`1sdD@x2wEzd8?-dx5c G&IJ1HeeKQTQu VuOvRLC^0v+JijP=^A{#x768Ql7TN#+ diff --git a/libs/agent_framework/src/agent_framework/analytics/__pycache__/tim_payload_mapper.cpython-313.pyc b/libs/agent_framework/src/agent_framework/analytics/__pycache__/tim_payload_mapper.cpython-313.pyc index 53839a5e05f1ebaec5d3d47ad9f7af8c6c9d7884..00cce0dae88502e5ef9eafe9b6a0a69951a645f4 100644 GIT binary patch delta 65 zcmdnvwabh9GcPX}0}!key|$6Nj8VNE455NF+DY} TB)%Xgu_P_OD0lNJ#!1Qm!ygvz delta 67 zcmdnxwa1J5GcPX}0}!a2uHDF8#;94UpPN^rpQ7&@>=_?Wl%JKFTvDu`os^QKpO~JS VR}!CAl$e`Zo?n!`c?IJnWdPDL7Z(5k diff --git a/libs/agent_framework/src/agent_framework/analytics/__pycache__/tim_sequence.cpython-313.pyc b/libs/agent_framework/src/agent_framework/analytics/__pycache__/tim_sequence.cpython-313.pyc index d730909abd00e7994cbc855343898db766407001..88ee4ff2852c19030a58c88982cfc91dc586dfa0 100644 GIT binary patch delta 67 zcmeC_WbEo>qM_@ZWTqax=1M=IiI?mFTDF`v!Z)2NdOJr6!jY>t`pWB9G6KR2&LKSkd+*fTz$C_gJTxujS>E455NF+DY} SB)%Xgu_P_OD0gx(V-o=_?Wl%JKFTvDu`os^QKpO~JS UR}!CAl$e`Zo?nzbxsb650I59|I{*Lx diff --git a/libs/agent_framework/src/agent_framework/analytics/providers/__pycache__/kafka.cpython-313.pyc b/libs/agent_framework/src/agent_framework/analytics/providers/__pycache__/kafka.cpython-313.pyc index 1c8ddcb8aac1dc2942767624bf37fd896249b11e..46fc6e0b93a5b7a2b9453cc601f7c36587f4d30d 100644 GIT binary patch delta 65 zcmZqYYvtqq%*)Hg00iqquWjUZU{Wv8&&?~*Pto@c_KXiG%FjwoE-BW}N-fh*Oi#@# Ti7&`WEJ@2R%H3STG?@hef8`Z{ delta 67 zcmZqWYv<$s%*)Hg00bJQYd3N`FliR)=jN5@r|A0zd&UP8>c#rGc_sQO`o6)Q@c~8oS*gh-#rj#PW%`Nf Wsd**w1v!Z&Y57IDn~yPX3E455NF+DY} TB)%Xgu_P_OD0lNyCT$h~n|Kx# delta 67 zcmeC=_?Wl%JKFTvDu`os^QKpO~JS VR}!CAl$e`Zo?n!``7x6=3jnF37C!(0 diff --git a/libs/agent_framework/src/agent_framework/analytics/providers/__pycache__/pubsub.cpython-313.pyc b/libs/agent_framework/src/agent_framework/analytics/providers/__pycache__/pubsub.cpython-313.pyc index 2b7b58104990a1f12576bd9f7dbdc93bc6f331b5..bb10194f593e1fc7b7d80b4bd957f40bb342c1c6 100644 GIT binary patch delta 65 zcmZp+YP911%*)Hg00iqquWjUh$Dv-RpPN^rpQ7&@>=_?Wl%JKFTvDu`m0G5sn4X$f T5?_#$Sdx}sl)G7p^Pw;Rv^N%* delta 67 zcmZp)YPRD3%*)Hg00bJQYd3PgE455NF+DY} TB)%Xgu_P_OD0lNB_UWbo*f|$h delta 67 zcmdm9wX=%*GcPX}0}yDKuHDF;$F5nZpPN^rpQ7&@>=_?Wl%JKFTvDu`os^QKpO~JS VR}!CAl$e`Zo?n!`c>()$Qvm2H7l8l( diff --git a/libs/agent_framework/src/agent_framework/cache/__pycache__/__init__.cpython-313.pyc b/libs/agent_framework/src/agent_framework/cache/__pycache__/__init__.cpython-313.pyc index 5a03014000e73f8f85461c935406182dcb0de346..3d2b5dcec1565b0e99c4512f87187180ef7bbef2 100644 GIT binary patch delta 62 zcmdnbc#M(zGcPX}0}!key*82CSUpugH?KrLMc+5rGd`dwKPxr4q*y;IwM;)TJvFZ+ Qz91*DBrU%vcVb*309b>KSU)SZOg}L_ VHLoPTASbaTEx#ytvmKMU9RTVc7P$Zb delta 60 zcmeyGcPX}0}yDKuARtjteK^sn^&TrqVF5*86QxTpOu9KR2&LKSkd+*fTz$C_gJTxujS>J1HeeKQTQu VuOvRLC^0v+JijP=^M58gUI5M>7X<(S diff --git a/libs/agent_framework/src/agent_framework/channels/__pycache__/base.cpython-313.pyc b/libs/agent_framework/src/agent_framework/channels/__pycache__/base.cpython-313.pyc index d2b66476276a908f6c139941ba30d5181cbaf64b..6672c1c7d8be92b0d2d387557f421c614761c420 100644 GIT binary patch delta 65 zcmey)`<0jbGcPX}0}!key|$6tib*|1KR2&LKSkd+*fTz$C_gJTxujS>E455NF+DY} TB)%Xgu_P_OD0g!nQzr`mv=J6P delta 67 zcmey$`<<8jGcPX}0}yDKuHDFO#iW_0pPN^rpQ7&@>=_?Wl%JKFTvDu`os^QKpO~JS VR}!CAl$e`Zo?n!`Ifto}1pvan7H0qe diff --git a/libs/agent_framework/src/agent_framework/channels/__pycache__/gateway.cpython-313.pyc b/libs/agent_framework/src/agent_framework/channels/__pycache__/gateway.cpython-313.pyc index 8e6f6ff81dd4ead87400343aaf1592bdfdfaaebb..b123509d25718a2e443755794e197d5e8e0840d4 100644 GIT binary patch delta 65 zcmeyT^GApKGcPX}0}!key|$5iKD&Cler{fgeu}J1HeeKQTQu VuOvRLC^0v+JijP=^F{X6d;sj&7q$QZ diff --git a/libs/agent_framework/src/agent_framework/channels/__pycache__/interruption.cpython-313.pyc b/libs/agent_framework/src/agent_framework/channels/__pycache__/interruption.cpython-313.pyc index 70d9720f2495105274f2cda8937e549412e05e82..377ead59721f0a4e59c36b5f67742602cab588a9 100644 GIT binary patch delta 1968 zcmZ`(O>7fK6rS0&ckT7s4*tW5!8johHf?PZa3CcD8U+cG5)l@k(ss4jli=V#X4gSb zq*SWZ_R<5IqPC(3!~x|}afnpWs+B4ZJ*Vo$U8UzLhgNPw)k;0kdF#aCP-eB?e)Ha& zw=?s8J{?p&Oa zre!L-+%w~w_EUcby(JGI-K$IEIEgru`;hL-3*a50eCLCxqDOUqA6oLzfUfW-psQIi zjk?duE=77w4}$5EKvixU(!*JyYxsg)8tHMpXWKHEL;9XMOhbziEwKr|)vyyVYqh#< z+U0u9(ga5;*Ou$oiQ{ijQYsfsn{XR{$+XSl-RDoRpFP2k<2`&S-2)H>hylde9U(QA z;B$f@M2H9J?zUDPiamuP*76m2WFM3!^rBB|L%qhi_%by_v*#d3~46ebn8Yzp9K zzYFK3{qA&aLi`#_A>d*5uV(h>WL2&l6jI?*fQ7GY8ODK=o?UPe= zVrA@WBvY>0gwkdM0-T}bMzc%_|885BYm2TGC02tc06A0a-U;6TWGIg?-hvChhxjdF zIM@;X!Z5jB7Y30o4kGP@XO@n0p@T;pe3U{W@XWy_3mk5T$Tv|jt5-|rX=k)pF)gdS zaLaJ_o}H-Fi)O_-%}K}NEMH|sIJ}2e=T`4LHXan$51;$~AP4HE2JCIq$Kkf8QmJM& zpA#yPV%g%yG#Yh&YA4d2-)IucO>igNl~GbF5$XhNQf;s=l>K;=eWM&2JHb8DFu*Ae zn*73wPGwNI0Y_dWyk=}lRWKc5QegD;qd-RhM!`gC(0a9DJHDN}bwq03q;Bf^xq+Ly zo%Cfia9Ek+vVQ(rE%q=lHPhpbZ}c8njkXf$)v+IgqwDIiR_gdhMq7P#{UrSstgY5dgkw2nJpYk_SV#-IpX9+f_9+y*m^3St<%usvt zQT)k~NfCXEC$Zq-1E@?YX}2et9j{5jZVVqI5VP|zL(m>+2_$qmv_~>Jtq#{g(v@Hzwl z$>a7Dw-?YuFg?sc3({eBDmEzTAi2Uw>@~^Ve~f(=8}D~}Nt`U3l_oDFiE#EyT6Tt}yQxbNo)O@9+aQ0nv|fSV<5ez?p{5|=@ybhOuj!Jajh4g+5T zFacc4tL)vqsTFt6?)*wuTXJ|$Qy*|!?JL3GXmKcE+&tdvGi9Jfb?SVl22SD_%5C8xG delta 1449 zcmZ`(&2Jk;6rb5|?}wAvUdLZD8#h+EA~p_+cDL4Tw%ra*;(aXB1N@B{WLh!; zFa{6;2-DBGq!wZHh`q=w(%-p7RRI-%Oy~I}Dd|sp_xbO!qysl-Nz7oCx?+9`1Rarq z1%sp*^Ym)7-fC3co%(vCL#CN1M1K@N9Xc}TrgTRQFyVU$;iD)$kX{rjsEp~ev2aPQ zh>nuuW-vsnB2)xNs|Z1KfpheNbdBZZ4v)}X{D5B(b>vEGY&IMf$uTNY{=c~^uZi?s zIjIHnc&IPS^m-^MDix(1U@N86Nu;2aD-&oqBC6y%i{3_N_^mOQ!Ebnmt|8=k!0VBzi(0@Xya^ap)*AqR8@;2iuQZIkxa zcGpu#qqEKO((rgvdz<*tgIM^{JBgr0zt${`yuvguu($JszG+;UH$<}^PkomBB-xLq zznFVw%s$mG^keb9HPMe}`^l+(I`i<-!`#!<`GJ8F*#VLh>YqrCs2?cDqx3i9W!Yqt zzmB7HIvCFf@W<(50ey>$7lmGtXLNrKF9z`bMGU;4E=v4ko@0{7A_gw;i-F#5@KD4C ztw&aIh(3y>7c{m({~+YF3bUBj7RmFBym5Njh~Y4enO5R?MyyQB=Bwos^+^?n!9924 z-d2W5$iSwu0HXkYMMEKyGXRqeY=fMo$L6GT6(mbE9eqji4-lfO(E?7<52H!(CevN( zeHlH%3FrcwA9{kk5YVmI0`u}+%-*{UBIpBB1n?`tuK}O=h2S%&hN1QrFxZ`~le569 z0Ivb~maj9mYu1~$yK9{;nYN1Vy&Kj$)=JxL5P#3U)zZ*@kNtHED4f*RJhfVVYp1(I z8r3R+p76AKty{a@s&zW7B?XX3-Fw?jcYV0&lK}mHHczfrYpoV@0QUp&Zvnr(l}lUg z`cA7cPZ~@C{nhyiax>sD#s?@v#}ji4Q`qbW^a0Pl0|}Y2fecJR(fA+$OhvKeKm(?u XaCBe*3nEGVV+7budOvYPfF=J0*zOyv diff --git a/libs/agent_framework/src/agent_framework/channels/__pycache__/transcription.cpython-313.pyc b/libs/agent_framework/src/agent_framework/channels/__pycache__/transcription.cpython-313.pyc index b4d951698e0e45878417a0b99bebd49b10465ef3..7b95ef0cd7f3fedca638fec664afbf4e5d4b0939 100644 GIT binary patch delta 65 zcmeC+ZsX?u%*)Hg00iqquWjVkWmeDC&&?~*Pto@c_KXiG%FjwoE-BW}N-fh*Oi#@# Ti7&`WEJ@2R%H5pEtj+`gdG!?N delta 67 zcmZqU?%?MB%*)Hg00bJQYd3Q1GHd4R=jN5@r|A0zd&UP8=_?Wl%JKFTvDu`m0G5sn4X$f S5?_#$Sdx}slslP?xdQ-#1Ql`s delta 66 zcmeBS?_=lw%*)Hg00f$*Yd3OVV$#gj&&?~*Pto@c_KXiG%FjwoE-BW}PD)AAPfSnE UD~V4lO3Y0y&o9cJ%);CO0FXWvod5s; diff --git a/libs/agent_framework/src/agent_framework/checkpoints/__pycache__/checkpoint_repository.cpython-313.pyc b/libs/agent_framework/src/agent_framework/checkpoints/__pycache__/checkpoint_repository.cpython-313.pyc index f71ef5ce9d382be87e55c4e2e4c35bc5b7b67ae1..08e24c18568fc9b9db98e64b11785a8d43743f8e 100644 GIT binary patch delta 67 zcmeCX!q{_#k^3_*FBbz4tP{Pqkz1Kry+S`XuS7pZ-#6GZKAb>KSU)SZOg}L_ VHLoPTASbaTEx#ytb2#(%GyvuD7jpmr delta 69 zcmeCV!q|6(k^3_*FBbz4Xqv9w$gRw*S*4$wSE8Sy?;GqHA5fH^m6}{qte>5flBA!Q Xo|;z@pH`HZn_8YxT7FUP=2uL=>Hr2`82A7H delta 69 zcmaFV%=Dz0iTg7zFBbz4Xqv9w$i0n8vqV2PuS7pZ-#6GZKAb>KSU)={B}qRq XJvFZ+KCLJ*H?=&!D0}k@reAdc7w8!y diff --git a/libs/agent_framework/src/agent_framework/config/__pycache__/__init__.cpython-313.pyc b/libs/agent_framework/src/agent_framework/config/__pycache__/__init__.cpython-313.pyc index 5644525b3ca6abb769165025a998292b390d145c..f1524ee717ccac1e8545b75303bf6049df4cd4c5 100644 GIT binary patch delta 62 zcmX@Wc$|^@GcPX}0}!key*82CSUpWYH?KrLMc+5rGd`dwKPxr4q*y;IwM;)TJvFZ+ Qz91*DBrU%vcVb);09^|eIsgCw delta 55 zcmX@kcz}`nGcPX}0}vG7SUr*3SRr0NH?KrLC9xz?KQXP`&_X{kJvFZ+KCLJ*H?=&! JD0^aR5&+?y63_qu diff --git a/libs/agent_framework/src/agent_framework/config/__pycache__/agent_registry.cpython-313.pyc b/libs/agent_framework/src/agent_framework/config/__pycache__/agent_registry.cpython-313.pyc index 191cf79f0378caa0dc127588d4698dd5ddbd485b..d84a0ae7311eb679a4cbb8e9735ad67ba731339d 100644 GIT binary patch delta 65 zcmbPcHpPtlGcPX}0}!key|$6tky$-QKR2&LKSkd+*fTz$C_gJTxujS>E455NF+DY} TB)%Xgu_P_OD0g!y^Fna|n)ntF delta 67 zcmbPYHqDItGcPX}0}!a1uHDG($gG*CpPN^rpQ7&@>=_?Wl%JKFTvDu`os^QKpO~JS VR}!CAl$e`Zo?n!`xtMvOH~^?a7B>I@ diff --git a/libs/agent_framework/src/agent_framework/config/__pycache__/settings.cpython-313.pyc b/libs/agent_framework/src/agent_framework/config/__pycache__/settings.cpython-313.pyc index a7ebf2c605c3912c6d82433edd82ceffa3ec1328..903a14a5740bfe9c83f5afdcad47731ce5c38591 100644 GIT binary patch delta 5325 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 delta 4625 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 X$l=HLJnxg;ezDO98@;m;9XRzDLyUyf literal 0 HcmV?d00001 diff --git a/libs/agent_framework/src/agent_framework/decisions/__pycache__/client.cpython-313.pyc b/libs/agent_framework/src/agent_framework/decisions/__pycache__/client.cpython-313.pyc new file mode 100644 index 0000000000000000000000000000000000000000..6894fe3419fac5a41e5d834ebcea6eb71d082be7 GIT binary patch literal 25274 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

; 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 literal 0 HcmV?d00001 diff --git a/libs/agent_framework/src/agent_framework/decisions/adapters/typesafe.py b/libs/agent_framework/src/agent_framework/decisions/adapters/typesafe.py new file mode 100644 index 0000000..810a951 --- /dev/null +++ b/libs/agent_framework/src/agent_framework/decisions/adapters/typesafe.py @@ -0,0 +1,97 @@ +"""Isolated TypeSafe API adapter. Uses the verified `noul` wire primitive. + +Choice is implemented as independent binary evaluations with strict rejection of +ambiguous outcomes. This is an adapter strategy, NOT a native TypeSafe choice +contract. The framework's original decision engine is never changed. +""" +from __future__ import annotations +import os +import logging +import json + +logger = logging.getLogger("agent_framework.decisions") + +class TypeSafeContractError(ValueError): + def __init__(self, code: str): + self.code = code + super().__init__(code) + + +def _wire_name(index: int, option: int | None = None) -> str: + return f"__jev_q{index}" if option is None else f"__jev_q{index}_o{option}" + + +def build_request(state: str, questions: list[dict]) -> dict: + converted = {} + for i, question in enumerate(questions): + kind = question["type"] + if kind == "predicate": + converted[_wire_name(i)] = {"type": "noul", "instructions": question["instructions"]} + elif kind == "choice": + options = question["choices"] + if not options: + raise TypeSafeContractError("EMPTY_CHOICE") + for j, option in enumerate(options): + # Do not interpolate the user's state into the instruction. + converted[_wire_name(i, j)] = { + "type": "noul", + "instructions": ( + f"Assess whether '{option['value']}' is the correct selection for " + f"the decision described here: {question['instructions']}. " + "Evaluate the supplied state and policy; answer yes only if this " + "specific option is appropriate." + ), + } + elif kind == "score": + # The direct API score contract has not been verified. Fail closed. + raise TypeSafeContractError("UNSUPPORTED_DIRECT_SCORE") + else: + raise TypeSafeContractError("UNSUPPORTED_QUESTION_TYPE") + return {"model": os.getenv("JEV_MODEL", "jev-latest"), "state": state, "questions": converted} + + +def _probability(answer: object) -> float: + if not isinstance(answer, dict) or answer.get("type") not in (None, "noul", "predicate"): + raise TypeSafeContractError("INVALID_NOUL_ANSWER") + value = answer.get("noul", answer.get("probability")) + if isinstance(value, bool) or not isinstance(value, (int, float)) or not 0 <= value <= 1: + raise TypeSafeContractError("INVALID_NOUL_PROBABILITY") + return float(value) + + +def normalize_answers(response: dict, questions: list[dict]) -> list[dict]: + if not isinstance(response, dict) or not isinstance(response.get("answers"), dict): + raise TypeSafeContractError("INVALID_ANSWERS_CONTAINER") + answers = response["answers"] + expected = set() + for i, q in enumerate(questions): + if q["type"] == "choice": + expected.update(_wire_name(i, j) for j in range(len(q["choices"]))) + else: + expected.add(_wire_name(i)) + if set(answers) != expected: + raise TypeSafeContractError("MISSING_OR_EXTRA_ANSWER") + result = [] + for i, q in enumerate(questions): + kind = q["type"] + if kind == "predicate": + result.append({"name": q["name"], "type": "predicate", "probability": _probability(answers[_wire_name(i)])}) + elif kind == "choice": + probabilities = [_probability(answers[_wire_name(i, j)]) for j in range(len(q["choices"]))] + ranked = sorted(range(len(probabilities)), key=lambda j: probabilities[j], reverse=True) + winner, runner_up = probabilities[ranked[0]], probabilities[ranked[1]] if len(ranked) > 1 else 0.0 + # Require a single positive, unambiguous choice. Low confidence + # remains subject to the unchanged JEV_MIN_CONFIDENCE in client.py. + if os.getenv("JEV_DECISION_DIAGNOSTICS", "false").strip().lower() == "true": + logger.info("jev.choice.diagnostics question_index=%d probabilities=%s winner_index=%d winner=%.4f runner_up=%.4f margin=%.4f status=%s", + i, json.dumps([round(v, 4) for v in probabilities]), ranked[0], + winner, runner_up, winner - runner_up, + "ambiguous" if winner <= 0.5 or winner - runner_up < 0.15 else "candidate") + if winner <= 0.5 or winner - runner_up < 0.15: + raise TypeSafeContractError("AMBIGUOUS_DIRECT_CHOICE") + result.append({"name": q["name"], "type": "choice", + "choice": q["choices"][ranked[0]]["value"], "confidence": winner, + "option_probabilities": probabilities}) + else: + raise TypeSafeContractError("UNSUPPORTED_DIRECT_QUESTION_TYPE") + return result diff --git a/libs/agent_framework/src/agent_framework/decisions/client.py b/libs/agent_framework/src/agent_framework/decisions/client.py new file mode 100644 index 0000000..0dbcb82 --- /dev/null +++ b/libs/agent_framework/src/agent_framework/decisions/client.py @@ -0,0 +1,298 @@ +from __future__ import annotations + +import asyncio +import json +import logging +import math +import os +import re +import time +import urllib.request +import urllib.error +import urllib.parse +from typing import Any + +logger = logging.getLogger("agent_framework.decisions") + + +def env_key(point: str) -> str: + return "DECISION_" + re.sub(r"[^A-Z0-9]+", "_", point.upper()).strip("_") + "_PROVIDER" + + +def selected(point: str, group: str | None = None) -> bool: + default = os.getenv(env_key(group), os.getenv("DECISION_PROVIDER", "current")) if group else os.getenv("DECISION_PROVIDER", "current") + value = os.getenv(env_key(point), default).strip().lower() + if value not in {"current", "jev"}: + raise ValueError(f"{env_key(point)} must be current or jev") + return value == "jev" + + +def choice(name: str, values: list, instructions: str = "") -> dict: + values = list(dict.fromkeys(str(v) for v in values)) + return {"type": "choice", "name": name, "instructions": instructions or f"Select {name} following the supplied policy.", + "choices": [{"value": v, "description": v} for v in values]} + + +def predicate(name: str, instructions: str = "") -> dict: + return {"type": "predicate", "name": name, "instructions": instructions or f"Is {name} true under the supplied policy?"} + + +def score(name: str, instructions: str = "") -> dict: + return {"type": "score", "name": name, "instructions": instructions or "Apply the supplied rubric on a 0 to 10 scale.", + "levels": [{"label": str(i)} for i in range(11)]} + + +def _number(value: Any, low: float, high: float) -> float: + if isinstance(value, bool) or not isinstance(value, (int, float)) or not math.isfinite(value) or not low <= value <= high: + raise _validation_error("INVALID_PROBABILITY_OR_SCORE") + return float(value) + + +def _jev_endpoint() -> str: + """Return a trusted HTTPS decision endpoint configured by the deployer. + + The endpoint is an operator setting, never derived from model output. + Set JEV_ALLOWED_HOSTS in production to restrict credential destinations. + """ + endpoint = os.getenv("JEV_ENDPOINT", "https://ai-gateway.vercel.sh/v1/decisions").strip() + parsed = urllib.parse.urlsplit(endpoint) + if (parsed.scheme != "https" or not parsed.hostname or parsed.username or + parsed.password or parsed.fragment or not parsed.path): + raise ValueError("JEV_ENDPOINT must be a valid HTTPS endpoint URL") + allowed = [host.strip().lower() for host in os.getenv( + "JEV_ALLOWED_HOSTS", "ai-gateway.vercel.sh,api.typesafe.ai").split(",") if host.strip()] + if parsed.hostname.lower() not in allowed: + raise ValueError("JEV_ENDPOINT host is not in JEV_ALLOWED_HOSTS") + return endpoint + + +def _post(body: dict) -> dict: + key = (os.getenv("JEV_API_KEY") or os.getenv("AI_GATEWAY_API_KEY") or "").strip() + if not key: + raise ValueError("JEV_API_KEY or AI_GATEWAY_API_KEY is required for JEV") + timeout = float(os.getenv("JEV_TIMEOUT_SECONDS", "15")) + if not math.isfinite(timeout) or timeout <= 0: + raise ValueError("JEV_TIMEOUT_SECONDS must be positive") + request = urllib.request.Request(_jev_endpoint(), + data=json.dumps(body, ensure_ascii=False).encode("utf-8"), method="POST", + headers={"Authorization": "Bearer " + key, "Content-Type": "application/json"}) + # urllib does not automatically follow redirects for POST in all cases; + # disable redirects to avoid sending credentials to another host. + class NoRedirect(urllib.request.HTTPRedirectHandler): + def redirect_request(self, req, fp, code, msg, headers, newurl): + return None + + opener = urllib.request.build_opener(NoRedirect) + with opener.open(request, timeout=timeout) as response: + return json.load(response) + + +def _safe_http_diagnostic(exc: urllib.error.HTTPError) -> str: + """Extract only structural validation hints; never log echoed inputs or tokens.""" + if exc.code not in (400, 422): + return "unavailable" + try: + raw = exc.read(16384) + payload = json.loads(raw) + except (ValueError, TypeError, OSError, UnicodeError): + return "unavailable" + if not isinstance(payload, dict): + return "unavailable" + detail = payload.get("detail") + if not isinstance(detail, list): + return "unavailable" + safe = [] + for item in detail[:5]: + if not isinstance(item, dict): + continue + # Only the Pydantic error *type* is safe to expose, not message/input/context. + kind = item.get("type") + if not isinstance(kind, str) or not re.fullmatch(r"[a-z][a-z0-9_]{0,63}", kind): + continue + loc = item.get("loc") + # Restrict locations to known schema tokens; never echo dynamic names. + known = {"body", "model", "state", "questions", "type", "instructions", + "choices", "levels", "value", "description", "label"} + path = ".".join(part for part in loc if isinstance(part, str) and part in known) if isinstance(loc, list) else "" + safe.append(kind + (":" + path if path else "")) + return ",".join(safe) or "unavailable" + + +def _diagnostics_enabled() -> bool: + """Opt-in numeric decision diagnostics; never expose state, prompts or choice text.""" + return os.getenv("JEV_DECISION_DIAGNOSTICS", "false").strip().lower() == "true" + + +def _validation_error(code: str) -> ValueError: + # Explicit, stable codes for logs; existing fallback/exception behavior stays unchanged. + return ValueError(code) + + +async def evaluate(point: str, messages: list, questions: list[dict], *, llm=None, operation=None, group=None) -> dict: + if not questions or len({q["name"] for q in questions}) != len(questions): + raise ValueError("Decision questions must have unique names") + if any(q["type"] == "choice" and not q["choices"] for q in questions): + raise ValueError("Decision choice requires options") + started = time.monotonic() + state = json.dumps({"policy_and_context": messages}, ensure_ascii=False, default=str) + # The default Vercel wire contract remains byte-for-byte equivalent. + direct_typesafe = urllib.parse.urlsplit(_jev_endpoint()).hostname == "api.typesafe.ai" + if direct_typesafe: + from .adapters.typesafe import build_request, normalize_answers + request_body = build_request(state, questions) + else: + request_body = {"model": os.getenv("JEV_MODEL", "typesafe-ai/jev"), + "input": state, "questions": questions} + response = await asyncio.to_thread(_post, request_body) + await _record(llm, point, response, operation) + answers = normalize_answers(response, questions) if direct_typesafe else response.get("answers") + if not isinstance(answers, list) or len(answers) != len(questions): + raise _validation_error("MISSING_DECISION_ANSWERS") + indexed = {a.get("name"): a for a in answers if isinstance(a, dict)} + if len(indexed) != len(questions): + raise _validation_error("DUPLICATE_OR_INVALID_ANSWERS") + result, confidences, predicate_probabilities = {}, [], [] + diagnostic_questions = [] + for q in questions: + a = indexed.get(q["name"], {}) + if a.get("type") != q["type"]: + raise _validation_error("ANSWER_TYPE_MISMATCH") + if q["type"] == "choice": + value = a.get("choice") + if value not in {v["value"] for v in q["choices"]}: + raise _validation_error("UNDECLARED_CHOICE") + # Missing confidence must never be promoted to certainty. + confidences.append(_number(a.get("confidence", 0), 0, 1)) + if _diagnostics_enabled(): + options = [v["value"] for v in q["choices"]] + detail = {"question_index": len(diagnostic_questions), "type": "choice", + "selected_option_index": options.index(value), + "confidence": round(confidences[-1], 4)} + if isinstance(a.get("option_probabilities"), list): + detail["option_probabilities"] = [round(_number(v, 0, 1), 4) for v in a["option_probabilities"]] + diagnostic_questions.append(detail) + elif q["type"] == "predicate": + probability = _number(a.get("probability"), 0, 1) + value = probability >= 0.5 + confidences.append(max(probability, 1-probability)) + predicate_probabilities.append((q["name"], probability)) + if _diagnostics_enabled(): + diagnostic_questions.append({"question_index": len(diagnostic_questions), "type": "predicate", + "decision": value, "probability_true": round(probability, 4), + "confidence": round(confidences[-1], 4)}) + else: + value = _number(a.get("score"), 0, len(q["levels"])-1) + confidences.append(_number(a.get("confidence", 0), 0, 1)) + if _diagnostics_enabled(): + diagnostic_questions.append({"question_index": len(diagnostic_questions), "type": "score", + "score": value, "confidence": round(confidences[-1], 4)}) + result[q["name"]] = value + confidence = min(confidences) + default_minimum = os.getenv(env_key(group).replace("_PROVIDER", "_MIN_CONFIDENCE"), os.getenv("JEV_MIN_CONFIDENCE", "0.7")) if group else os.getenv("JEV_MIN_CONFIDENCE", "0.7") + minimum = float(os.getenv(env_key(point).replace("_PROVIDER", "_MIN_CONFIDENCE"), default_minimum)) + _number(minimum, 0, 1) + if _diagnostics_enabled(): + logger.info("jev.decision.diagnostics point=%s status=%s confidence=%.4f minimum_confidence=%.4f questions=%s", + point, "accepted" if confidence >= minimum else "rejected_low_confidence", + confidence, minimum, json.dumps(diagnostic_questions, separators=(",", ":"))) + if confidence < minimum: + # A NOUL value is P(True), not confidence in the True answer. + # Log only numeric calibration data, never decision input or question text. + logger.warning("decision point=%s provider=jev confidence=%.4f minimum_confidence=%.4f status=rejected predicate_probabilities=%s", + point, confidence, minimum, + [(name, round(probability, 4)) for name, probability in predicate_probabilities]) + raise _validation_error("CONFIDENCE_BELOW_THRESHOLD") + result["confidence"] = confidence + result["reason"] = "JEV typed decision (no generated explanation)." + logger.info("decision point=%s provider=jev model=%s elapsed_ms=%.1f usage=%s gateway=%s", + point, response.get("model"), (time.monotonic()-started)*1000, + response.get("usage"), response.get("provider_metadata", {}).get("gateway", {})) + return result + + +async def invoke(llm: Any, messages: list, *, decision_point: str, decision_questions: list, + decision_render=None, decision_generative: bool = False, decision_group: str | None = None, **kwargs: Any) -> str: + if decision_generative or not selected(decision_point, decision_group): + return await llm.ainvoke(messages, **kwargs) + try: + result = await evaluate(decision_point, messages, decision_questions, llm=llm, operation=kwargs.get("generation_name"), group=decision_group) + return decision_render(result) if decision_render else json.dumps(result, ensure_ascii=False) + except Exception as exc: + # Do not log exception text, input, response bodies or credentials. + from urllib.error import HTTPError + from .adapters.typesafe import TypeSafeContractError + category = (exc.code if isinstance(exc, TypeSafeContractError) else + "HTTP_ERROR" if isinstance(exc, HTTPError) else + "VALIDATION_ERROR" if isinstance(exc, ValueError) else + "TRANSPORT_ERROR") + http_status = exc.code if isinstance(exc, HTTPError) else None + error_code = (exc.code if isinstance(exc, TypeSafeContractError) else + str(exc) if isinstance(exc, ValueError) and + str(exc) in {"MISSING_DECISION_ANSWERS", "DUPLICATE_OR_INVALID_ANSWERS", + "ANSWER_TYPE_MISMATCH", "UNDECLARED_CHOICE", + "CONFIDENCE_BELOW_THRESHOLD", "INVALID_PROBABILITY_OR_SCORE"} + else "UNCLASSIFIED") + http_detail = _safe_http_diagnostic(exc) if isinstance(exc, HTTPError) else "not_applicable" + logger.warning("decision point=%s provider=jev failure=%s category=%s http_status=%s " + "error_code=%s http_schema=%s question_types=%s", + decision_point, type(exc).__name__, category, http_status, + error_code, http_detail, ",".join(sorted({q.get("type", "unknown") for q in decision_questions if isinstance(q, dict)}))) + fallback = os.getenv("DECISION_FALLBACK_TO_CURRENT", "true").strip().lower() + if fallback not in {"true", "false"}: + raise ValueError("DECISION_FALLBACK_TO_CURRENT must be true or false") + if fallback != "true": + raise + logger.info("decision point=%s provider=current fallback=true", decision_point) + return await llm.ainvoke(messages, **kwargs) + + +async def multi_intent(llm, messages, *, intents, text, **kwargs): + """Keep source-fragment extraction and request order; JEV selects each intent.""" + raw = await llm.ainvoke(messages, **kwargs) + if not selected("multi_intent"): + return raw + from agent_framework.llm.structured_output import parse_json_object + candidates = parse_json_object(raw).get("operations") + if not isinstance(candidates, list) or not candidates: + raise ValueError("Multi-intent extraction returned no candidates") + if any(not isinstance(c, dict) or not str(c.get("source_text") or "").strip() + or str(c["source_text"]) not in text for c in candidates): + raise ValueError("Multi-intent source must be a literal user-message fragment") + questions = [choice("operation_" + str(n), [i.name for i in intents] + ["__unsupported__"], + "Classify ONLY this extracted objective: " + c["source_text"] + ". Use __unsupported__ for an objective outside the intent catalog.") for n, c in enumerate(candidates)] + + class ExtractedProvider: + usage_repository = getattr(llm, "usage_repository", None) + telemetry = getattr(llm, "telemetry", None) + + async def ainvoke(self, messages, **kwargs): + return raw + + return await invoke(ExtractedProvider(), messages, decision_point="multi_intent", decision_questions=questions, + decision_render=lambda d: json.dumps({"confidence": d["confidence"], "operations": [ + {"intent": None if d["operation_" + str(n)] == "__unsupported__" else d["operation_" + str(n)], + "unsupported": d["operation_" + str(n)] == "__unsupported__", "source_text": c["source_text"]} + for n, c in enumerate(candidates)]})) + + +async def _record(llm, point, response, operation): + """Account for billed responses even if validation later rejects them.""" + if llm is None: + return + usage = response.get("usage") or {} + gateway = (response.get("provider_metadata") or {}).get("gateway") or {} + model = response.get("model") or os.getenv("JEV_MODEL", "typesafe-ai/jev") + metadata = {"provider": "jev", "model": model, "decision_point": point, + "generation_id": gateway.get("generationId"), "gateway_cost": gateway.get("cost")} + try: + repository = getattr(llm, "usage_repository", None) + if repository is not None: + from agent_framework.billing.usage_repository import UsageRecord + await repository.record(UsageRecord.from_usage("jev", model, operation or "decision." + point, + {"prompt_tokens": usage.get("input_tokens", 0), "completion_tokens": usage.get("output_tokens", 0), + "total_tokens": usage.get("total_tokens", 0), "cost_usd": gateway.get("cost", 0)}, metadata)) + telemetry = getattr(llm, "telemetry", None) + if telemetry is not None: + await telemetry.event("decision.jev", {**metadata, "usage": usage}) + except Exception as exc: + logger.warning("decision accounting point=%s failure=%s", point, type(exc).__name__) diff --git a/libs/agent_framework/src/agent_framework/gateways/__pycache__/__init__.cpython-313.pyc b/libs/agent_framework/src/agent_framework/gateways/__pycache__/__init__.cpython-313.pyc index 9063960d70b46d0c213ab4e1b995aa6ec616ebfe..01c0689efeba72ad4bd444f6b25ab5fa42016a52 100644 GIT binary patch delta 62 zcmbQkw3vzeGcPX}0}!key*81%Nj*b9H?KrLMc+5rGd`dwKPxr4q*y;IwM;)TJvFZ+ Qz91*DBrU%vcjDT709x)9p#T5? delta 55 zcmZ3?G>3`%GcPX}0}vG7SUr)uNg+``H?KrLC9xz?KQXP`&_X{kJvFZ+KCLJ*H?=&! JD0||Td;s4w6E^?= diff --git a/libs/agent_framework/src/agent_framework/gateways/__pycache__/mcp_gateway_client.cpython-313.pyc b/libs/agent_framework/src/agent_framework/gateways/__pycache__/mcp_gateway_client.cpython-313.pyc index df983509bade4a252bd6dd0b5061461e38e86e37..3eada9ed7093ad495701fd798c884e1d1a137ac8 100644 GIT binary patch delta 65 zcmaDS`BjqpGcPX}0}!key|$721fzP9er{fgeu}er{fgeoA6VqJCmpxuJ!AVtQ&`NqkySVs2`A Meo^-3UyQ%G08RfDc>n+a diff --git a/libs/agent_framework/src/agent_framework/global_supervisor/router.py b/libs/agent_framework/src/agent_framework/global_supervisor/router.py index 39e99ef..905d7ef 100644 --- a/libs/agent_framework/src/agent_framework/global_supervisor/router.py +++ b/libs/agent_framework/src/agent_framework/global_supervisor/router.py @@ -1,5 +1,7 @@ from __future__ import annotations +from agent_framework.decisions import invoke as decision_invoke, choice + from agent_framework.localization import terms from agent_framework.llm.structured_output import parse_json_object @@ -162,10 +164,12 @@ class GlobalSupervisorRouter: return fallback or self._route_by_rules(text, mode) prompt = self._build_supervisor_prompt(text, request) try: - raw = await self.llm.ainvoke([ + raw = await decision_invoke(self.llm, [ {"role": "system", "content": "Você é um supervisor global de backends. Responda somente JSON válido."}, {"role": "user", "content": prompt}, - ], temperature=0, profile_name="supervisor", component_name="supervisor", generation_name="llm.supervisor") + ], temperature=0, decision_point='global_supervisor', + decision_questions=[choice("backend_id", list(self.registry.backends))], + profile_name="supervisor", component_name="supervisor", generation_name="llm.supervisor") data = self._parse_json(raw) backend_id = str(data.get("backend") or data.get("backend_id") or "").strip() if backend_id not in self.registry.backends: diff --git a/libs/agent_framework/src/agent_framework/guardrails/__pycache__/__init__.cpython-313.pyc b/libs/agent_framework/src/agent_framework/guardrails/__pycache__/__init__.cpython-313.pyc index e9f5f7ccf55d0fe39c60389ee7184b9df9e2c9c5..a5f818573324294afd63328a8a509e2c986251d3 100644 GIT binary patch delta 64 zcmX@keU6*^GcPX}0}!key|$72Ba3>Ler{fgeu}E455NF+DY} TB)%Xgu_P_OD0j03lOQtylo}NZ delta 58 zcmcb>b&`wwGcPX}0}zzlSiO;(mq{UBKR2&LKP9mwQ9m)Q+|WWlF+DY}BtESuF*mh5 MzbJdNJ(D0a027fCp#T5? diff --git a/libs/agent_framework/src/agent_framework/guardrails/__pycache__/config_loader.cpython-313.pyc b/libs/agent_framework/src/agent_framework/guardrails/__pycache__/config_loader.cpython-313.pyc index a20c3996a07365c670dd62e5ccda5eac80801122..5056a8562b12e662795d70be08af7279530c33be 100644 GIT binary patch delta 65 zcmdnwzSEuiGcPX}0}!key|$6tfk{1IKR2&LKSkd+*fTz$C_gJTxujS>E455NF+DY} TB)%Xgu_P_OD0g!E455NF+DY} TB)%Xgu_P_OD0lNjmR=qJp6C`Q delta 58 zcmZ3gG*5~9GcPX}0}zzoSiO-ujYT0{KR2&LKP9mwQ9m)Q+|WWlF+DY}BtESuF*mh5 MzbJe243=IV03ACM!2kdN diff --git a/libs/agent_framework/src/agent_framework/guardrails/__pycache__/dlex_sanitizer.cpython-313.pyc b/libs/agent_framework/src/agent_framework/guardrails/__pycache__/dlex_sanitizer.cpython-313.pyc index 7c7d0c9c3bcc6e68e6f03a5899dbb15a5fac5569..af5981b345aae49769cc9d9ea0698878592cb44a 100644 GIT binary patch delta 65 zcmbQ`G{cGeGcPX}0}!key|$72BddCWer{fgeu}|_c delta 67 zcmbQ?G|P$mGcPX}0}!a0uHDG}kyW!uKR2&LKSkd+*fTz$C_gJTxujS>J1HeeKQTQu VuOvRLC^0v+JijP=vohOPDFD*l7Z?Bl diff --git a/libs/agent_framework/src/agent_framework/guardrails/__pycache__/framework_llm_client.cpython-313.pyc b/libs/agent_framework/src/agent_framework/guardrails/__pycache__/framework_llm_client.cpython-313.pyc index 1e24755eabd5ae5a1b9291f0ad365a1c6b614adc..ecfc2e969fc56709e5ffb623724b4fb5464e1f53 100644 GIT binary patch delta 8806 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 D8-Lj( delta 7899 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 diff --git a/libs/agent_framework/src/agent_framework/guardrails/__pycache__/llm_rails.cpython-313.pyc b/libs/agent_framework/src/agent_framework/guardrails/__pycache__/llm_rails.cpython-313.pyc index f10be6190fea3e6144a26becb57086fc95175b82..2b9a861044c10534c3ea59d2042344ef97d434e6 100644 GIT binary patch delta 2344 zcmZ7%TWlQF_1>MwzQ=3tuI=~{j~{ug`~pEpf&z)_1hea4f~TfIn|3=2Fi-H*a(q*#WdJ(}IyRv=A#c9UqPzFLz_}a0#J|Qb z6u<&43Ntd7ed4Ure!tu7*Y7jRtTaFd1 zdbG(tlh*MNE6LNTENp!fA$;%C8$Xq&u~zK{M)<9uWyE$9dG;%%xMUQ7?CFRetkZy2 zg=^tw6ph|vu?VmB-De`BZx$K-FW`=3HpaeIrttyxUuAH5;AFB4iCu%}ZsPZ(B_)Gg zrFx*VcSX6M4&4s$HSq{5W6ksHKz}!0d~`%chCU-3qbHRKlt4?r9YxiHozvsUdIcdjS=Bq7<#7l} zf&DE$jVD-B9#AI{1SUjtmV%HmzLM0?W3lJ4F#)&ilakAa*{+huM@1-=Lo+esFuR@@ z$472_ofwGi@KmF1(K@wk$E0I$%GI~#EmsfLi2nR?d7->CcU}+3l|a8tbjxwPEmGH4 zmgb+GTUt1GR&Tp?LPKT0-D){D2=~qDEzhxQ+o$#Ns_t8^9oSdH;?q5yRmjvcAVx+ zDbD_$8avFjI;q({)VSI5Y&YON`}E6g;)lgg3oM_WV5ic@7ZQ!OUANpCvHuGBFG24> z1n86iCjoGcT3aTVH!auSBDAE?Q6Up?q9+76F2FeZD!s8IwsMVJsgagA#tgPw1S~$Z zVH~td#i)NWVzZEQsX+odAuxH}_gt>j+s&5Gv!-vY60_#HA_cr_|1MGQM&3fw5mgcU zD08wb8i6NGv*uX7Z<;(|ny%F(rddi+QPNxv4aM(UjE+=W)N8f^F2QBFT(<&?jxjwu zjtAJ;>`_%X=)cHl_QTBKq;{wO$Tj)riR%eAq>Y>znY>p2{mkjx@Q<9nGckS5zKhV4 z^U^(p4xN?u5PC*BF9GX0=_TnqXc6gEA$mr7O)w{3m)Miqxb}~}%mM9RD3jOTp5Gf_ zE$!3zAt3&}cZ!X7UD+uY@NbH9QwtgNCB_RW`ODaR9Eh7q43e8EEbvUK+%4VgoqMF5 zk#4CNh+A<5#J4hvz`G^DOHw$(9*nM~k{S_75y3F?^8yn=q(1-v@-l(}Lqm22IRDXL zR0dT)pi}ysyZvLXMiom%Dj~+tvW47yK*8Anxz<5pt%SQjX^<)JVt(pjxGS%nZIvD2Mn?^JqPhm znAxN6gqB|tcI59}_Q4gwXJPM$0;~w|q5wY<;Gt_=1RhjmR9iLTI8arXhR0(Nor%t_ zik$)ob^j3iUr$L5eW>1;&cBKmL@2o=I#XG7JS&I-EmIL)cw3;{xwJvHxw2_F(6F6{ zB{F^*l&Aog+1MU|<~%IE@J5d|%n6wQt`LZ)<_&ZwJ@kR`yY%Qc z@@N=$2#h$KE(>6EFyIPfG^~vW++LnC&DAzcDQGGxfyNX+5WQ`y6gq9oqZ>1wHub4+ zpPmsQ>QXk;JGqk(^iu$M-0>O>n1Wn|VF7D+8ka9yKB4fUps=iX5{AQhP=pdVCzxUV zgmDhz5#CW`II1F1VmxuG>DAi~d754YQUt^odA%!PjFW#vV}C)*x6v}Y)jKwM4rA@z g?L8#cy$i88Uc}$@9oa(y*()S*?w|b_kA=4X56pcak^lez delta 1809 zcmZ8hU2GIp6ux)oXJ@C~>9*VMPiec`rN~a9T>&cvMT;a@cCknY5<(k?p`9+dp;P}?#JUQf$z(IKA-y#}+Z#2^N(kTPX7k8-3EDGN*pWT7H55jdeD zF$qSoBA25q3OdPOIyNEz`y%`- z9?&Y#Ez|LUMpiR4qqUpNi>%FPGva}is0w=GH;krJzr}K#hG%)ThU4;H`W@BQ@6zkE z+>YKIXe0WfYuD#k7c!4%SA=OEK7Y2f=y;`B%d<+>+{&KOl2x@G&zxh{qP@~!3;YjZ zo_2Ff98z1s=S@QB{R``B;t=JZimAwCJHI6+`L9wJzpbSCIXOi;xhbdiYGhx;=sF-D zgJNEQG%wPt!i3aH9BB%-5`3qnW?3A0D$T!=b2P-I&v z?km;h+N|Zw*tNS*OJ)WI6tZwwG?$YQ28-ayp<{PD{VRMw-u82k|e9&BWhOrlc-7Uts|Q$ zt|qQU`(g6e<|x0OxU@RHmwwZASUoyOZsh3EqIe^JBnp$8J1J;x7AeYu>Uc@G`PAVj z#|MRt0Sc3i9TKQF1|^hB0?4`$T&=AuHKEJlM24M)jX8i4UO+Yq0Q%<%)Q|=A7{A`$ zqhLvOl|9FQX&+4lrN^qW48l>acl37RS!8JhxB($({A@>2-79Gu4t4>uU>=nzbs55Vi;0vYZn`{-HzcQU^kL_UFW#Q$Wq zl?&_{Z9#oTFa*LY{O#0bc&^0s(@%6FiSHb& z`2q|su9*+l+>bhhd44XP8pGuv+c9Lv5soz_V9}Qao!w&FebqGQmc38n8^Ts& zp1$(zVqZa>EwFvWb_mjUhxlv3emQs8Tu!mcBfYVTd%Bsgv!k3?yOexKgCNl@7A OjM2pJ8A=O5)PDis;&VO# diff --git a/libs/agent_framework/src/agent_framework/guardrails/__pycache__/output_supervisor.cpython-313.pyc b/libs/agent_framework/src/agent_framework/guardrails/__pycache__/output_supervisor.cpython-313.pyc index df216a0728baf1989db7ed337db68a6489842d6e..df5af3788d3f6eefb0278c23a2cc2a6493535f33 100644 GIT binary patch delta 5128 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 delta 4306 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 NBLNZpLLth2{sV-Z@mc@? diff --git a/libs/agent_framework/src/agent_framework/guardrails/__pycache__/parallel_executor.cpython-313.pyc b/libs/agent_framework/src/agent_framework/guardrails/__pycache__/parallel_executor.cpython-313.pyc index 39f9b8b389b404917a09a39270c5dda8aaddb46b..7f43504b381e2864e906bfebcbf9fe51eaa70e44 100644 GIT binary patch delta 67 zcmcbxit+j?M()qNyj%=Guuk;aMs7D&^)87x@4H delta 60 zcmcb7%g5Z-669mkICv}uX!CTU_PG21kDe-cvE(l#jlv(>a@8?~sko2|W0oI1N^ zb{(1k3Q|=G3K1=@{1py}6F(A2_`-n$5<=p@PX&m>3M3A2fK#R3N)ODuP1+Q(hi~W2 zyf<%V-hA)fK6!mIdOI2oOZa`V@t4`xu0=OpaB=Xuq)I9)NO=aVn`B?Xm-mBT$o_&1 zGV0_)ARmMv>H=!8(3B5BNXSiv=6o2!LJk!o`4(u&MB`K-VVIRdONzga#S6crfQDJUGH%-gYor-1JIBc3T zY+Ii;8Zq{}FEg8)Go4&1cT7F1od9drC^~j-)|k)X4AaqSRoy9DFvnx^cwi9yr5n1O zVQirBQlJ*<8=}p2(l!|g;m=(+UDu%mdZlV>MawK#rlFsA#j;CnG_#$ciy%p`o*+s< zo?V}1yTNJ0G0b^4sMl(SS%M8@XtC-}t?p>TEo`I(4-vEwY$8Yy#0cU9tq5)$3_yB{yVTG>Ub{0;R>3ZKGO-QJQd& z;1I!Ko{RS+U^mJ(Mb*9LgKfMRSJ|?|H{f-&6h7*-$n8BYo z1~+UQPRS_im;~%6?PCb8T+^Ky?_f@oat=WW{(n^bY-b0Sb+NODeb#ul^C}wn$RUT%ZG${}HdZp7t zgdu5saKv9`N?_a#dL0Wj&bx1PisPEX6^hUGWw*mA6m6oa*e>6*pMA}*^z4~h?77dL ztW`5Wa2ER)d$>{(14Z_7pw@H!y14){`3?Lh8#swtm_)Dx2$+}HYAQ7t{EC!C&QtrE z|7dN$nb`AF>t6nIDicYvkJxBJ{y00D$7q<67z`Q7voTWaj+ZDWJNhwPp2Jo@kwI85GF!oEt{YXlSg>Ap5RxyyYD`+tK`DKSCmJK<4tq5HY+amzGB7u|`R$2(wE zBe?!1xfI^sAc=O(f>4goxSxP1z8JP0SXrrr1VJD}#tDA2e?w3(;{gA=KRZU;Suv6H z7J+9biP+;=-zMn>!7&6pZ=R;#qlH)D=SlY> z!7{;h{!eD}CWFK*!8U^Jt1!TG4}Z5L45U-oA>@|02&jKxfI#FgA|*-bcf*=it~+%w zG!2M8Zin}1ltG^}p0VIUwrUlzbr(hJicW>cXSIJSm{zB%o_pTvl#`Zf#93(sKq8Qmg#Ba_)e5Rt9M-l6o*vH?()oD%GpTKKKBq a5PNO9>u&iOW4}qMKc($_>(+xZ72sb&Varbd delta 2039 zcmZvdO>7%Q6vubgYsax;yQwKnOrkg+PS_?*Xp@jiL`kE55Nu@Hx}~MiE?ax;x^;HV z+ub((5TPd!pQ)yW(gPAgYDFU?B;R^KpxlrOf)g4EsTU4N9FTfI3K!lRH=#vX@^9a~ znR)x>&HQJt9eHp#_8=CEDEK@7%gUK+S7V)(AFy#TE|Aqg zL!VX%=7QM}grptHwPeE(mUc_7H5-9QHVRSM4(HmkF^EaKH5bn&Ad%e!SFi4yMpvv5 zFGNzx8SM;%z7C~NDMV9Bp>0y7oD>E6E2^IOolKpHsA=1dXL?n~b{iRXUriUs7Hn^< zWP0Y9Sw6pG*O*zcY|kizxnP}l;4B}}^1%_D-P>5wh8WWuw}bU?W}HIrprAw0f)CMN z@l7a!S*^K7(Xq?b3S{_nd~|6ujeL^OP3R=F6WRzAS*VUHLKVxi>~kVy*6WsCf+Tgc zIlfo-Jwt|tCuqVJLX^-!*h+{I;)Dc3B*5~ZYMnD{II)BY!Bf?Fv=h0zjWYtbtDo&$QD&|IrlhTSw^FJT{HKVb)-PxK~TT2T6t9}M#=37t(f zRua2aw!QI3dyKI?d~I_No9C%yjt%p2a*ADPe3tw^vtAIri9pmhS zM!fS9W5*lsrY2Q3!N2V~U2t%q-U=0b$ZZf2*YZkM*~CS_40)#!LaUqJ>E^~9C1(wx zhyFh+eyO_)%X*``mwny1+r7+&wt>ulCW z(+A{4Yq4Id7I7X%g4M=ibpZ_%LyqDKpV#3v((NIrVtk+t_Kfi>R~A*7^F^G%vzje`6`YWN#iR|G$l35 ze;XX#dw>RQjD%09DHS(M7Rj#JdxNY`2`?ga4c^=6I>?U>b*E(gWFT2Y8A$5)CjW3~ z@39wX_=cXE<-bh6w+ZhPI6`bO43|C_MZ@&)Rz2l=mTMSLq5<0p!-TPQ=zQDL_m*S_ z`E<4)r7G_g6q5qm2(m~rf3oxe5iyLi@A+V1U{WK@Awj2~Zx2v09KCBJ6P az%3lY@b6M_{|qq3epUK-ZreVMmi7;CLfI(* diff --git a/libs/agent_framework/src/agent_framework/guardrails/__pycache__/rail_action.cpython-313.pyc b/libs/agent_framework/src/agent_framework/guardrails/__pycache__/rail_action.cpython-313.pyc index a12b1423adb67c098ac086ef48d7c4508e44e261..caa6943562792c5163ee9749b439131ebe1492f4 100644 GIT binary patch delta 64 zcmeyt@}GtKGcPX}0}!key|$4%pHV$mKR2&LKSkd+*fTz$C_gJTxujS>E455NF+DY} SB)%Xgu_P_OD0lKK#(My#R~F9z delta 57 zcmey*@`Hu@GcPX}0}zzoSiO-upHU%AKR2&LKP9mwQ9m)Q+|WWlF+DY}BtESuF*mh5 LzbJe1LdJUlB&8H- diff --git a/libs/agent_framework/src/agent_framework/guardrails/__pycache__/rail_decision.cpython-313.pyc b/libs/agent_framework/src/agent_framework/guardrails/__pycache__/rail_decision.cpython-313.pyc index 6d5d22a53cfd0236087438035e66fa0e7288b135..8108ff76524a72c04f908a26751f1f08d2f7defc 100644 GIT binary patch delta 816 zcmY*W&ui2`6rS1q*z6{0Rjh4w)!JIhD(p(3YPD1;f|%GM272j2oK0qzU9+3zC0l7P z^-r)3y?OE=R6#*J`X_j3Q3L}XJ%|^fXTdjV_h2AzzW3{!_r7^=yf)24(<~DF-i>@~ zf7mw1x7N|wB@S_@O)Ls@Lg1X8vm}r*EZMT9fMThjX1;9aEe$lpilf>Es|dvm=WX3G zz?dL4Ws*3WQ<$e?1X1xUarC*IxRj8&ql19iG|J{LLP~^`X{xhsH;h@_3cJxBP4gWd zMXbrU-_+<%lBahnHFdx=Pa*H9HQ6y{kjueIGS3vAsHznlJ!#Y1s(}G0CU5D|mUnz> zc1URPr-x$*cF7tYBpo_;j4zXNZe_F7>@)CzwSuU!&VrVo&F3~Sz16!8dD!6xQS)p(=V>NY{kYQ(d+C<00cLaS8I yBEauPs1N9(Et~fL4N`5P6Z-vtFTxEh5$_${MDs_Yl>Q)-KgqS^uTqi468`{nI>T!K delta 705 zcmY*X&ui2`6rRbiX0yBgpcQRpOIj*YgDMHtJFD^bL0 zE(#_4^`(SonclQ}^ElDPSR}m4RFv?El5n6O* zz^7OyN`U8LU&3>JY>o7`vqBg2GiTE~!&LH7zjdD8nm1Jz3|ukbBGgWtP83`<)SrQz z2~Y>Htb6YD#T8=;4fG6j{z9OixHm4JTBOIUAI`#?32xysOTTpchmGAhch);~5JgF) zDiBcwHm=oe)Ac0dWhqK8B g_i`C8RhhUC8|b0E455NF+DY} TB)%Xgu_P_OD0g!olLsRJtKt?0 delta 58 zcmcc1evO^`GcPX}0}zzoSiO-unMol{KR2&LKP9mwQ9m)Q+|WWlF+DY}BtESuF*mh5 MzbJe2R3;Bb04T{5pa1{> diff --git a/libs/agent_framework/src/agent_framework/guardrails/__pycache__/rails.cpython-313.pyc b/libs/agent_framework/src/agent_framework/guardrails/__pycache__/rails.cpython-313.pyc index eb54420a05ff2d977dd3aa07b315caf7af544503..ed1424b5aff3f82df83c259518cfa66877dff383 100644 GIT binary patch delta 10401 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 MWtU$$qD7AX2UiSd4*&oF delta 11856 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


ga3uGWbgQ#9WYR=BYp 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 diff --git a/libs/agent_framework/src/agent_framework/guardrails/calibrated/__pycache__/__init__.cpython-313.pyc b/libs/agent_framework/src/agent_framework/guardrails/calibrated/__pycache__/__init__.cpython-313.pyc index fd957fa565ae1a77c714513f01cd6e76ee71ee9a..42476beeab83ff7029a2d28d6d9cc171b229c0f6 100644 GIT binary patch delta 65 zcmbOuzF3_5GcPX}0}!key|$4%fK$CxKR2&LKSkd+*fTz$C_gJTxujS>E455NF+DY} TB)%Xgu_P_OD0g!;ry>&om17lr delta 58 zcmZ21K1ZDUGcPX}0}zzlSiO-ufKwq)KR2&LKP9mwQ9m)Q+|WWlF+DY}BtESuF*mh5 MzbJci6Q?2*02C_|6951J diff --git a/libs/agent_framework/src/agent_framework/guardrails/calibrated/__pycache__/_compat.cpython-313.pyc b/libs/agent_framework/src/agent_framework/guardrails/calibrated/__pycache__/_compat.cpython-313.pyc index 1d169a793c2c9fc1052e222f9a9cd9c8a2fdfaa8..69fc03e65ddd9d47e0b474640e27c5a09c4ce8d5 100644 GIT binary patch delta 65 zcmew^^iPQUGcPX}0}!key|$5i4x4(3er{fgeu}E455NF+DY} TB)%Xgu_P_OD0g!ps}wT;vep&3 delta 58 zcmew)@LGWTGcPX}0}zzlSiO;3ja8vmKR2&LKP9mwQ9m)Q+|WWlF+DY}BtESuF*mh5 MzbJci1gjJ?04|3UPyhe` diff --git a/libs/agent_framework/src/agent_framework/guardrails/calibrated/__pycache__/contracts.cpython-313.pyc b/libs/agent_framework/src/agent_framework/guardrails/calibrated/__pycache__/contracts.cpython-313.pyc index 0cf8fdbb0bf3e1742e4770c292e9f969b4dd303e..991b01996bc4ea35de5ac5a5c0642e32eafaea5b 100644 GIT binary patch delta 65 zcmca_`plI3GcPX}0}!key|$726q|aPer{fgeu}A delta 58 zcmdlavs#AxGcPX}0}zzlSiO<^FN;Efer{fgeoA6VqJCmpxuJ!AVtQ&`NqkySVs2`A Meo^*jeO6{p05%H~cK`qY diff --git a/libs/agent_framework/src/agent_framework/guardrails/calibrated/__pycache__/llm_adapter.cpython-313.pyc b/libs/agent_framework/src/agent_framework/guardrails/calibrated/__pycache__/llm_adapter.cpython-313.pyc index 198614295727c1c673dfae0500ec0473a0c7f145..df8ad87468e4327eca3699ba85070e9029b9b546 100644 GIT binary patch delta 65 zcmX>odqS4`GcPX}0}!key|$6NfJ41PKR2&LKSkd+*fTz$C_gJTxujS>E455NF+DY} TB)%Xgu_P_OD0lO04mCCav6vPd delta 58 zcmX>hdr+49GcPX}0}zzlSiOo4Bu(8w0)_N5MTsB@-AxJ2l1q!&Zr2;*#NKt^tlI>E z5($C0RcM67AJ76qLPA8MtvFPOBjQjA3M{Axq#i19DC&h%#hWo!TQP?>zxln7dGF1e z50BlRNj!+hBLvr{-`v}{JNQu|ztckr`Iw9ojc8OQ3I#eWaF^Pp_`oNzPxXTzIiDJU z0PcRZTM0rCbpfqg4Jly=OB_@qN))0Jht!x7hq%OHHK8OSDRD$iDQQSc994UioeX5; zA*S{!S;$HpSNoJ44$!aQ))>WfB}iq>Yy?NLlXC>!^#MZAkJvL zT2||u^1-Nv+jYmNcz)Mlo6LvY?(QzS zUWqT!P5xJWfp+tQiTB2YCsyNwmR;@wYypue zmV40v2DAK5vTxxi@^D0m86jqcS@1tIFJx_5X3KRzrU&98StJW1I(Kdu*WBD3)^;?t zOyA@mq<)VCP=hto2Vd~b^jPK~A!kJkIM_siX;6BdbAv zJw5105JoUWyY_xfuLd+PQf(Pf0i#ye%K^Z+1pGoghr&zf4aeNn&AP!@ZG9V7kSzN_ z%o{wa@H8Hoa1x1Q*45mB@{ZtMMzKro&yrZ`@`=kQuH-*|`g-rp;*H|BrCSFUei>Q3 zHL}RB=EmtH{~@<{{B<vw`f_?0!j-fZgzl!(rbNM*E%I$n{Yz1%G;@O;dL_CqZQCt&~rl|$_c&k905q|}RA-;UO6%pHDbSOk5{ zBk6^7-8LE)4;K#8Q9fVD8fCQiLQQa*7P#B8zg~=qPiHnP_bsO)dkSmf7Ezs-)%CVo zH(VEL=UcADbX^t$vMlkeQ0j=|{956Y(^4V0@;)!3>+L~BFEJusq5TEd0W-Vgz~)rN zGHXnHdim0xe}g$TObgR)ce`1$s}SJ3#eIdKpwgIoqv^6K)3NXum^A}J{ARJQBxcp? z?P#5rt2^sDGew~h{&z9k9~B0fjsafJET`^NF+hxu^bhUCg+AKRyUrFQ1e5GAmAbX1 z*K9}%HuVIHw}JS%UaUi7+8cm_jx*b#z^F3Igq|nd*NuApykTxa<|Oiv7s3#tD1>aQ wn43qf_Cm7_r_!ohFTzDsh`+^JDDL|xrFY2aT{6Wll%A(A@E=Qu{o*111?)Yg_y7O^ delta 2255 zcmZWqU1%It6rS1L>~41UCx5$1Hfb_Vf9z;Y`a^$|#wLVq+MTp1JFylGj+5D&?WD7F z*E2I|vR&DLAPPb$gCGiG@j*liLVeIaD6-&_4}B1kQS6Hk3O)n`@ku;)Hd|61m~+4T zopaB*=bU?IemL>wv*|xmsRW0Q^W&#$H^tlOp=O@vxOcb%oWd!*%oTayMTSFi2tvUa zhA@s{Ia2I`F4RSoE;(9^K`g*gIbQ6B?f}Q+L{R`Cz;QWQOhGEZ-Ez8^flPoCa!;`r zdIK!TeZ^)!^aqoqJW$L+Hoz%4R~&@F0H@`l;xG&cI3wqaBQO%+9(lC52lfQGR~{>l z!#LtT5S4z|s|>(|l7)Rr4)!a9%8)XwDSJ+u@3Z7Qy5ZZ~RoCapVlVNDa6EwLTVO`&S7b*Dox^`kH% zVUuP%DB9OE?P#K|SvoN_aC>ky<1pMKQtGY`?if^wI|2XuCSW9sBV%O$sUqbfN~tHp{?5oBP@`>pG|SevR^&Qw`* zv?*=%#?jMLS_MO?t5|k&gTi(1h3E#q?mdX!O+JmQY`oT-2vgo$u_yVP-sdQf-Fq0b z!l|d2&%-FBFid+d3M2fKw=T@{Z+l+}1-{FRBwydpZ1BW~!L_6i%;LRvsA7ygFKvN;tUgWDE!!t znI9(`M0Xu*0o!j72&NI)?2f(iiipq5%na^ZNH6eB?`ry|L;63f}H(2xP>5MT>Ma|YLHBDj)0X7_I1Rv_t)UNM}vGBCrN%nRomwX zS7Adj_cfbZaFW5Ovsp8&3PikzLkEYWjOxX`RcnqtsZ)Z7P&YJ)d1J%5(Kyo%bhOlU zRJy9#I!mP6yF8p7VLwm5zhi)x&nDEQ6?7nYTf^hcB-0BWy+b#Eea8Jvhry4*hH6-l zW^B)6EJg$Nv+$E08n?X$J&a0sD9|c4(E(5DuH~zmX|8Dcb?9p{zE_=HJXa_!&8kbK z3-j}ZlH&KMrNWiVrNW$gakeBgCaW$jUR`{CNxir@C##odmzD~pON!s8E-or?u!U0|U;8~2+hLyPf8i#)O8&SM rNoGS2xZdrF!~l*x+xhS?j@j*GG>2o~_E2OD$NYBAdq00F!hHV=`X+~) diff --git a/libs/agent_framework/src/agent_framework/guardrails/calibrated/__pycache__/llm_rails.cpython-313.pyc b/libs/agent_framework/src/agent_framework/guardrails/calibrated/__pycache__/llm_rails.cpython-313.pyc index e728acc0ef8a7e42d1a68f331eac0d333da01ec9..865f0d32d1c1da5192e59ed4bb3f800636e9bb32 100644 GIT binary patch delta 1970 zcmb7FU1%d!6rRaU{{Q>mCfjD~DjShT)C#U$muyX!Cf&4jS}YVI33~^xZxv3-Q$l6?efGSqcgRE-0exTcv`qPo8rpO=|I_xAbu5JNJI~JLleW z@_Fgw`NUB?9^r6&Is8-eaPn4StexdK?jug(B)-CxdEj$2_f>pl0fe#$V%ZOVh6$Ab z1SC=NSAyjbgvwzEBQ8pTN~9cxXpVa=I?c@zISzdux(iWN4CO`~rGXGr}Y{$+gM+ z_fHy@(%uG?HoPU|M;=m0dESjGhGE)@-7pO+FSx;$W?9OX=B9SQv`y925-7B;VyHG1!mlov}Fq@icTZN{! zS3seLE$`@xT{od6n`)z=H#V&?plD%~%orIKq_}CC zI*ilzL;`IuEI8*>!jt|yVrj<+e>kf8aC$uGNedjuAKmTTiTL;k>0@KI^Hnq?@JZ+E z#KtfQ_VhkZvnR-;oF|iI{(`fce5Swzv9mobdc(5eBCYbHaRZj7fckpg-%W(`dva#_ z9C^~J+1k+?ilJ(9Yn_i`S&m{26(ru^ImrTZ|s=& z?s%fq=MBERRN9ait7judN;l*Dm>F>j69NBK{B)d46W$4j#Xft8u`jQ$osHi4Av5hS zA?qj3Um0Ru$zJ4RotxPkzV-?7h2qlE)#7|5?-jmReG9k^u94}zh<^5~KVg-Dh+#SQ7V$$ z+qtS~Xl?*Bdlw8=%Etn#4J)*bsjt$k&obgh zWVybJ$7-?+*aJ8>>oq!TXf5px6Sik`uNAYl4b&%DJp-k{^?^nm7wcECnJ(6r+=#BX zx_uZTTphQtMn%mLs0Xq7X2k*YsDWM}&?5o5QDKhKXPym#|x)1jk`ghzQOovCJ$}%OrB|KwVwbBe;=Q@RYn9 zA$X6{sO5u=4>mqa`j4{6U!n?en|h}lAOx=D2hYG!`WPgQ7YYbbA&ALQa7VaMH(aQj z*e)AGyShjZMn;z@)YFA}x14&rNO%hg_Y+nC3M_p_KN;B<6L{MO-`aPHO2&W386`>6 zE7fYMF6kAurfqygo*`o{FqlrMT2-$rWz&HaNmFYkvCblg@dw49WwD*Ur0DAm3Ru3f zTGN&Hb>y}zYF*bD&=Rmrb$GR=50@of8kUx>zcw~3T~cbgxP+ut<+_SijPvvo8v}3e z#zXoarscB;Q~Bw1p_p2ytN>^?fC#6Bf*__*2&=n5tUD~k0!&VmY8AcGP|70C#$;r* ztRO$QnG8-KmvkTpKG};!7z^uDm_=2sqCULmIgs7tQPgyi$*T&c-wQ&YgCDZ0{BE4tdOsn?WbgT`l_&3S34 zv5;)IO4`BXjbn#yHmK5Kd3V)v8)roG)o5Vd2Keq0y0>6L7M0qt? z-4rp3ixow%z_+1cJFeISih^ePpo&G+za(n1dPPBFfL+^|=>32^=>^qJiJ6 zM@l`|kq5D}pq_=3>^2E5z`zN+p9fi~xAwBt$yx;PN*;By#sqvJ5 z&U+xjrMG#VQ?u!F;!N)4h=J0K86&YiP7$V(`&fUtykZA_D~sGR@NmXF8N^sE=uwW%7D+h@v#3^pEd1hXa$Q9rbtH^*T~S z5ka35CWTsx=@eyk^$Lt29LgGWrl(q673FFLCN6Sf)S7&F+9EvE%z!vGb7rO}zLzgd z31T5_21Q{mpH1h)q9p<8d5(139zZ9KRH-Ux1XJNA&sZITaAhN0h6q;*!Vha-AF&B4 zVYim+%~iEruPUd|1;FrsqxKfa4o#Beuf%}yePUehWJrQNO?GI440c=uAH6%=j=XyB zK)dHin+SFsgv;CZ#@e3v-Awzy8}0pL-%)Mm1a|KQW0?OWvzF;l4%Xk{2!EpOO+02? Zosf%lZ_=JH)h0rJMUB4`pEKtn`oBxD)vy2n diff --git a/libs/agent_framework/src/agent_framework/guardrails/calibrated/__pycache__/output_sanitization.cpython-313.pyc b/libs/agent_framework/src/agent_framework/guardrails/calibrated/__pycache__/output_sanitization.cpython-313.pyc index 2d1dd3c8be9e60f511400055237709f6ca5fb748..83fba96c74f05e2ee0f7c9bdf16fcef9293b546d 100644 GIT binary patch delta 2155 zcmZuyTWnKx81Mh|v|Zbkc9*V{Lf3U;qmi{h83-AdF*am#1NI*QWO6*VhjO;IXMQ~h zE)pQ#qLBphe^4>L`5+hX92CE*XA5Iy~sZx?l$+UaYXeO zLc>a@JTayf4cmZbX;v!)fwhF*ou;#kWDbQ+1q>sMN4l}iIX%@_)UNo?5 zM-AA6y6=%bwe^haUc}|e-3}(-wQmJ`ZmK=tHd3%C(C300nhWeA9R7^b|$n1w*e{RoF!z zYQZWRa7eVpIPXEcl83CxbJ@m?!d#__BYDO$$$UAA43D z$gbZh0vo=#BpSl(*3g^a;3%MZjpF#l%&Rf@kM?$%ZuCjc&}{9V?y%$#sl|K z-Xl`$6Q`Fu%lRni72|{jb6L4M%mv*xaT=&`4PV(RmCS0%S#&sap%EyT zD>%g_Zh2@ThQDOkPot3mjV4X2qH9fa#zrnoT5^rBrs>t{Y0H);)lgv&+0a8|3z4lv z=+8m!eCQ=qAR_OVY%6UukTWR|fLi2CU(;a4DjqKzTR|W%!I0F# zNbk5AV}B}9rrulaV%@*F)`)X(jHPpRjc|`sfR{Ya;Q`(rz-Lx?WI4bmj2|>L)Ff#Ng!+Kd*96L z?9R^2u0PYi*4=-(-A)sX(*0X&hi z$8TD*uohsAf^D|a5N#6FOZTw06-U^V*xrS;Q<*jkn~!$V7Qy^9Oj`vD0P_mAmquut zU>z{8U9cdPs4qr>rbj=zkNVNFW@aJUMW3Pplx%B+$yDMC#3yyaSBGynD^*@6%a+Qo z)}%x%Jm#2}FAd}irGboEQU}!43xfv+)T~x0DXUD)YZnZ*&Odf&);0+IaHYZd6^SFQ zO1VNQN>~%{BBn`ZUQ{;NdLtL)L2Qxje%k)yz z!g_(QK7gvNsHrS{p2a|jn%NKh_qK?zR$^tDV%DrTFx1U&Qc&$?W(RD7a-cBAhBZz#}N(!Kx5#6b~lD& zCqaw6H}JOkn#4D|VwGP4Z*umzSU%srl6Lsfjt|M3T~pqsgePR_i64=GtJ;$yix9Yl1ICLeM-Lks!HJc_)$} zww{~4_dE%HZy%lNm2P>Hz0&PwGTkZNZk>!L$IN#u9n(Y7onB}1Y5SeA;B?S>H(&Qn%qI9$rDBO;GD~Gv5RrjlA9uy~k|Ev`54VY~x(YMdH3WsyX1ouOWynggwIli3c|Ax{=N13fbD* zV^`8fenTzQvSY(#ow}ZfPRzmM%4*wB~ZGc-6A>>bUE3rK6Gm!}IPn>mc)tjs*$(Cdy{y&`j&BQ>*$bF}K eOByC4TQ*Z;V9SoI&SYzS=m5sQPb^z-qyGVXe%Xuw diff --git a/libs/agent_framework/src/agent_framework/guardrails/calibrated/__pycache__/pipeline.cpython-313.pyc b/libs/agent_framework/src/agent_framework/guardrails/calibrated/__pycache__/pipeline.cpython-313.pyc index 85eed0488094df88df84c8b25a8dfde36f63692d..515f4f4971cf0aa53eb77baf05350c23f18ca4af 100644 GIT binary patch delta 2408 zcmZWqOKclu5Z-mxuf&NTi64m*+i}t)ZXQn3q>oUF(ln*4lQwt@DT>?e#@@P4*N@Jw zLz`A|5fWS|qWmCn1}+>ZND(I_gg9|RMMwy(kSIdjKx(PDa4G-%>!c}clyB#sotb~$ z{$>64+0jSs?X4Vr?goF{$Ywb1H$3b-c8lO2b=f%X{X65~hA4oL;3QrWGIp@Dw*wsX zZO=GG7q~<>xY>6{rd4c%Hqiqfc6Mgk#SZ8Yz2K#1m*md)L_he&00h{%HPb0}K^LRj zGC?r}Ax3*LVKD*`u^YO@9%%H4QHYAY&@1*qpBRIf7>Br+fCLk6&-9B)NHV%3GawGa zAfvsRec})dQ5qc|hT+^$lACQt2_w1Co>MAk&z{{$z>{~9%Z<+R4T}L|IU&hOzFEF` z9*=R>pA?t;J=}%>6FF}#o%2co%wcXa-6D0)*pP;)UD<@x#bl?Y;MD_CzZ7DpnOs|h zqt?ScoD`X*iN~ku>@o+lF-}TKg48|1?-*)cJs|a^p=j0OvQn#+D#h)`_OJMWzpU!I zQdIScONyqgEBPzi9`7JOTu+xPM!Jw*mR^uopt_;v4L!Y~Zl7VqB_1nXLHM z?4vZaY4W-6g2O{8@Q^P5=00Sm1Q%kLu*W47o!@~1CG@Kl-sJAL`(I!F zDI6u=g)cjp_w(CFBOlpbGM(AQmshfj3n`l^80s~{bmprSBw!WooS<+Pn8S;dOgR|G zVld}fKx_09%_Xh>X)4i9CZpjOS*;fELrYOLXzI^X8ZIE5W87-p*eMmwHnPI#3bT2_oYD1eb{ZhsK{#@6UV12GCIyX6Y=g5_;DWvO1kvOpXmfq-SS64Q@V z4+YaNpPXM>IzGRUk&nM3FPu5C2snDCL$9xwO9phJWCy|sW7D=)E5ilr)(G-3Ev9?% zT3)RgrD_G{kogS4QSw*p;9*wcZakxtseqLN6&bq@o4#79rfQ{%inRqpEx;tX7_afC z$oKImzn}aW58H206++yJ>$D4BPxzdBvhcrx>{@2sLofYLDp-54EIdoCn)ZUaUN4$0 znp&~4#MaMc^f7?oL%;+;2?6^7imbL6eaZ{xNo*t1^pr*omsJ|n zwpx_UAol528xCgTW`YT$9$@se%~?MmV=5TAgl4#`{+> zcUwW+L~C>fj3wqP*U#@*U@3hM71-6xmIK~G4L3TrhQe@r*CLa`sY}g~FUO2qbY0cKiC4Ig?J%z6 zeg`*lT9Mx-I!i@~8@~p@FXfD8! zn-kGq!0|FWo9&@1m6Abs0&}^W+@0udumN^6?FplL4Wg*b#=VTxMO1gwwX;M+QvtA( z0NWjk2>9D!6@ZobT|BZ4aRezgFKkM1?Euam>rKF}vzG0FF(g?hyN;Htg}SC5gO4eX zr~mqg6d$zkJpa%Z;Dx`3IDX)F?hv_=UiCe6aKV9l0|$TTI&_coKX7bMP44FfwDvD_ CoD%2& delta 4341 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 Hn$-UV-Sy!q diff --git a/libs/agent_framework/src/agent_framework/guardrails/calibrated/llm_client.py b/libs/agent_framework/src/agent_framework/guardrails/calibrated/llm_client.py index 0cce3a2..dd8dcf9 100644 --- a/libs/agent_framework/src/agent_framework/guardrails/calibrated/llm_client.py +++ b/libs/agent_framework/src/agent_framework/guardrails/calibrated/llm_client.py @@ -1,5 +1,7 @@ from __future__ import annotations +from agent_framework.decisions import selected + import json import os from typing import Any @@ -152,7 +154,7 @@ class GuardrailLLMClient: injete o `LangfuseCallbackHandler` para que o `ChatLLM` da reescrita apareca como span no Langfuse. """ - if self.use_mock: + if self.use_mock and not selected("guardrail_" + task.lower()): return self._mock_classify(task, payload) # O caminho real usa exclusivamente o provider oficial do framework. diff --git a/libs/agent_framework/src/agent_framework/guardrails/calibrated/prompts/__pycache__/__init__.cpython-313.pyc b/libs/agent_framework/src/agent_framework/guardrails/calibrated/prompts/__pycache__/__init__.cpython-313.pyc index 50f0402387c6338a778a0b4ffad361f8daf46565..6de369ed3abb67820b42b75023727c704828f789 100644 GIT binary patch delta 64 zcmX@ie2SU-GcPX}0}!key|$5?pHaP5KR2&LKSkd+*fTz$C_gJTxujS>E455NF+DY} SB)%Xgu_P_OD0i|IVE455NF+DY} TB)%Xgu_P_OD0g#(o;)J}!0HxT delta 58 zcmbOiKRurNGcPX}0}zzmSiOg3}7%*)Hg00iqquWjW1%dB3bpPN^rpQ7&@>=_?Wl%JKFTvDu`m0G5sn4X$f S5?_#$Sdx}slsj32R&V6~%dAkUpPN^rpORRTsGpctZfK#On4X$f5}#I-n44Oj LUz9yrpXC++3L_J= diff --git a/libs/agent_framework/src/agent_framework/guardrails/calibrated/prompts/__pycache__/dlex_out.cpython-313.pyc b/libs/agent_framework/src/agent_framework/guardrails/calibrated/prompts/__pycache__/dlex_out.cpython-313.pyc index cda4abbb3a6aa3243ed30c5f886c320cf1dc3c49..93cf17be915a5450b28e8a05169ee46fafdd0c31 100644 GIT binary patch delta 65 zcmZqV>)_-5%*)Hg00iqquWjT$&#GRlpPN^rpQ7&@>=_?Wl%JKFTvDu`m0G5sn4X$f T5?_#$Sdx}sl)L#CD?1|qohcR< delta 58 zcmeC+Yvkkp%*)Hg00d<>R&V4!&#F+SpPN^rpORRTsGpctZfK#On4X$f5}#I-n44Oj MUzEL>k&T@Z02Z+lu>b%7 diff --git a/libs/agent_framework/src/agent_framework/guardrails/calibrated/prompts/__pycache__/fallback.cpython-313.pyc b/libs/agent_framework/src/agent_framework/guardrails/calibrated/prompts/__pycache__/fallback.cpython-313.pyc index bd3c7bcb8cddb002a49a41d75767a04a68e13138..51575e8e372ba9ef62d2caa2a6c554a2f7c37cf5 100644 GIT binary patch delta 1712 zcmah}*-sls7@x7%yFTy*HfO*~umcV)%MqY$N+NTLE3_Ug5s0*P?FAX^U1xSlQmYm8 zsjAwCN+Vt?^&t;YtG@8sKVl_IRb?SmwTgN?g(j5}RjN9(#wKk*oz;H(&3DXq?Qf1h zg+EDqPrY6@pzGW4_uId=0`N22)D~A|;8T+_2LJ&K5Ja{`xM0IJk@5CL`vQl#1qXJ} zJ%=2N{DOc55!~S}1H_NQ>Iv9s?S=Z@g&L8w9c=G$*o|D+gWR~G3v>b0#OT?BLa2e7 zaoZ4ksf(BK*oQpU;~TJ_S=KldMt;k~hW%F1Ks{*SP5=ibfP(Kr+_>e5H}8IO_&NL% zw#RK1-&ER2=e4cnbg`IIw<>&I({^@?ssJb7E5TA7|9cO#+RkEDWXNLgta&CBm#ZClA0 zy0op_lhV}Lkc;`Wv8mw#c^Jt${IrFa4t?V99CVQv(KYBN$=C$+k}qN-9X_h8__0FW z}^MRX6Z1&0bS+H#JyfmgAJ{gJX~X$R9SF2h08;(>ZkH=_8T8C>Nkgk{q1sdrl8L zIJcaaO0zeh@;jL5nNy|Y&b~wP$3EDGYj!@c1bHmTI|3KH}WbVDhW zLa!(cLnjYLi}ZK?ZS--w)A~y)JO!SjX07RC);Qcu{vPY`TxM(!BT@3&_%!s9yW<_P zAu3p>uiiYDOgZ+or3EO!f~Mz zo=q$*O(v!m<<*(B)fzx6LAfqJ#Vlr5Bo-NAfiZ)m1+qAYy`(46qp(roYmCr4^ptC> zbEAwKqa^Oe{WTt2m03Pkc@`I?+L9-m%NXK^;w_D$>dd!^e4XgnyHvd*HgUS3+}H5V zKwitF^SM&m!VbqyXQ-<<<&35p$^)a?Opz(9GOXm;Y;g-C?5?Ob-70OEZAU1n2(nCX zJ6V1NFl%8IvCjFo3tDzJuiU^BRLHQbA5rqe4k0|T36T3U0ASBA;O1j+^@IoAk}1uX z#RU^|o-~4%m>HWWH{UQp(=(ntpPY8^kbe>-D^t_mC+jxQ)@$~@Rc^g*g76QaxCw%P Ma88fyW5G(`A9SQ&=Kufz literal 17630 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 diff --git a/libs/agent_framework/src/agent_framework/guardrails/calibrated/prompts/__pycache__/fraseologia.cpython-313.pyc b/libs/agent_framework/src/agent_framework/guardrails/calibrated/prompts/__pycache__/fraseologia.cpython-313.pyc index 324f3c5ed86248fa1c140c068c17d05198ece48f..baa9c69f66c644f8c794343d21362a4c46e48119 100644 GIT binary patch delta 65 zcmdmOeaM>oGcPX}0}!key|$4%SVp};KR2&LKSkd+*fTz$C_gJTxujS>E455NF+DY} TB)%Xgu_P_OD0g$6j4dMoyz&-Q delta 58 zcmX?Pz1y1mGcPX}0}zzmSiO-uSVo~zKR2&LKP9mwQ9m)Q+|WWlF+DY}BtESuF*mh5 MzbJcitBfrp05^jZ?EnA( diff --git a/libs/agent_framework/src/agent_framework/guardrails/calibrated/prompts/__pycache__/out_of_scope.cpython-313.pyc b/libs/agent_framework/src/agent_framework/guardrails/calibrated/prompts/__pycache__/out_of_scope.cpython-313.pyc index 77abe50c317262f20f357ced0e3180139049ee1b..cea72ea7f63e8243695ffbebef7230bebbf1fecd 100644 GIT binary patch delta 67 zcmdnr!Fa5Lk^3_*FBbz4tP{Pqk^7#LdZT`BUWtB+zHhK+d_YltR%&udv3^!+nSNq= VYFxT7FUPW=>}_MgRz07gYcN delta 60 zcmX@s!MMMJk^3_*FBbz4l-*dpk^7#LLY01QUWtB6Vo9QYVp_SOg??gsYFE455NF+DY} TB)%Xgu_P_OD0lNxd0j>T(rOmV delta 58 zcmccVc*&9bGcPX}0}zzmSiOpF diff --git a/libs/agent_framework/src/agent_framework/guardrails/calibrated/prompts/__pycache__/ragsec.cpython-313.pyc b/libs/agent_framework/src/agent_framework/guardrails/calibrated/prompts/__pycache__/ragsec.cpython-313.pyc index 8019c7d414f7c999e57d81c5d9c8603437732491..0928c7f0ad04921a1c7d5feb5fdfa7a440d9914d 100644 GIT binary patch delta 65 zcmX@bagl@jGcPX}0}!key|$5ChFQH@KR2&LKSkd+*fTz$C_gJTxujS>E455NF+DY} TB)%Xgu_P_OD0j0vGczLqno1Qd delta 58 zcmcb}af*ZcGcPX}0}zzmSiO;3hFPIRKR2&LKP9mwQ9m)Q+|WWlF+DY}BtESuF*mh5 MzbJdNA2Tx}02w9{#sB~S diff --git a/libs/agent_framework/src/agent_framework/guardrails/calibrated/prompts/__pycache__/revprec.cpython-313.pyc b/libs/agent_framework/src/agent_framework/guardrails/calibrated/prompts/__pycache__/revprec.cpython-313.pyc index 0c8b7a81d592e0fe0dd3fb9f20f0dffc1c203528..7c3c1283869c3f178d7ea450ba598c0e2dd9694b 100644 GIT binary patch delta 65 zcmdlXv0sAwGcPX}0}!key|$72HkW#her{fgeu}E455NF+DY} SB)%Xgu_P_OD0lK4#!CRCnijqQ delta 57 zcmey$@{Wc3GcPX}0}zzmSiO$fVw;pPN^rpQ7&@>=_?Wl%JKFTvDu`m0G5sn4X$f S5?_#$Sdx}slsmbH=^p@edlnb~ delta 57 zcmbQp-o?)SnU|M~0SL-&tlr3-$fQuOpPN^rpORRTsGpctZfK#On4X$f5}#I-n44Oj LUz9z0GSfc*_Y@Pc diff --git a/libs/agent_framework/src/agent_framework/guardrails/calibrated/rails/__pycache__/__init__.cpython-313.pyc b/libs/agent_framework/src/agent_framework/guardrails/calibrated/rails/__pycache__/__init__.cpython-313.pyc index 5630abdc26e6e9126984dec9c45740fe7f1c3bf1..f3acdd74941171a64608767e1dd11949802b484a 100644 GIT binary patch delta 64 zcmaFK^MQx^GcPX}0}!key|$5iA**_|er{fgeu}=Z6umItz4!dw zbMF1lna^hbI)1ntk4G7fulC(utd26aMVtN*dkfzE5EpA7JvqEu5K`YNwX@AqS;umQSMF*sF^|ZK8c?lM|g+* z8q0oM-i+mMig~v?@C`rJ`7)jtc-;Ldkx7=(q>EQZySs_KkZ_BsygQn_klKeb*pJXl z2IB7f$%&y0BnbKDI}%Iw9ON{E7@7aq=YDcL`5O83L+tTGjQ`K^wbVpxflkQ~B-~F@ zBmDEux2Xb;CQ#y!sm}J$rvaYsT-$%0XCf#AdRk938@A(#3zlU9MRHH1U*N;;)%5Fl z&8>7!s-e)Xxv>#l88T{sq~aV4;l=+{U=Z?%kO6`2nA zMZ`XJfFgK8A%4W;woP>@%lPCs9yz`GBW`SL8TK1;w8Ml<)SE7Cym5W@=HACP`0atG zzni;n(*ak9N4OFMV&9W`aXfL+YBW6wYzG=GFX&H77>3aXo+CI+aDrR{pkMJMyJcNA z(8F%mYK=ExhG7ZVVbsgJ1E{EA(!F-z5MOt{K2Q^;OKx`Tm`No06)=Z4k-%`;*d+ms zs0c8Rx|Jxd<+tTIt7+_t;3S;FJsUd%CZnEruT;l^=-m^jFFdyn<^ls%f=0 z-o(%}pls67=I4kj=fd*u~O0s^!m69T&%ACj(Lz}## z_l~kd)1lH9sEwqxTE?g!T2yXX`&`$G*dG%6U(G!!b+_ZHfj@5*c9?^2YWJhps;-qBEpkL)IqGY zp4h_mZba((P1Fgp6J)!Aj(!Vuh0US%C+^!)2O{-h7g##`O1bx&E%P&gL+9zxPi3p2lqZi{KOx@q%BX{Vc1D_0q!Ou;2yFEu!D30?j_Fx?j!pF zyGR#cfE)lkNV)-gND#1>^Z_0shXMOZKi~iv1Uy2H0uGU3a*P}&&ylZ?6XYcMDj5md zM=@@VM&w-iRKUHQy0 znCv=vEGttrmr3PfYC_BDbfI)dUet0IGm;MaXhMmqIZcKsP1fa{n$XppqOQn+tcm;D zatl&Vb}^8x3u^}hR|dPUW`*!lcDUvRB(A;jO~5kM`1E$=iD(K+3*uO}9sW-oZkIP~zZ7Va2O^jUhykrB zpg1*;P(6Zr~PLqMQ=bQc_xh7jbs3=Ts=@aD?P^G7*(TRg9{sv`Td;B`dnhqv`TxJ(AHA zNiDddMx|sTD@S4ph^lpqDF~saWh#l9xLtkYHh5!JDV>&;7(KyXpn?(#I9OJsWJYFIUA-VH z8WW{J8NHCWS|h zFT+kpd>z&|z(CarV6W~w$+FPo@ihY3ai67n)m_h2gV>*IJJzp|2t18%_ghE0y&Oh5G}72L#GbIqLvf z%!$*gB5$c^3iJUp&2U$q5r!e0bYb1!)@mf5LCRn}#b-Dq3Lp5tJzz}mS6F_GPZ$dj1L6b9N_PDH{Q{!>y4d3N{7rD~2bz}4EnnXgQ%o`!IGn1p!aC>nCjc;4? zI5|OSYhufu}o4v zL4N{fyjZoL0#;2JW{g%lVx><@R9le0g}hJT&p!j&k!<8TlSHHUDtp2NPAn zYH>lQaf#)6v0|>PHq=?{ni>)^o;}v_uE!+C?y(1O7XKnd2o4G?+ zb+5TMkr@kBx2;pCm~Gd5RTG!o4Qqon$-nbfrkXdD`vS!+<>A45nlb$dTy|6~;PS}p zTbr**?Yq~TYf_-Q7_CYDNA6n<3EGvV4t#9j19C$Xcx}l$#r4N}@O-Qv9E#od)r{(D z&UWrx$DLoOZpod2;>!Keiru+3c>{dN%yEc&x3x93$;r1`O&kA_| UXNY5U&WxNb*MhIxC{N6P0}A_N`~Uy| diff --git a/libs/agent_framework/src/agent_framework/guardrails/calibrated/rails/__pycache__/confirmation.cpython-313.pyc b/libs/agent_framework/src/agent_framework/guardrails/calibrated/rails/__pycache__/confirmation.cpython-313.pyc index 3dcc28bbe931ad0880f90cb06f59016bb5462f40..347178e82c618f7be408885160dd174f8ea86abb 100644 GIT binary patch delta 65 zcmeAPn;gddnU|M~0SMNKUfalREUsR!pPN^rpQ7&@>=_?Wl%JKFTvDu`m0G5sn4X$f T5?_#$Sdx}sl)E`je4Q`=tS=U1 delta 58 zcmbOn))U74nU|M~0SL-&tlr3NEUr+YpPN^rpORRTsGpctZfK#On4X$f5}#I-n44Oj MUzEK$ReYT=04U-U{Qv*} diff --git a/libs/agent_framework/src/agent_framework/guardrails/calibrated/rails/__pycache__/dlex_in.cpython-313.pyc b/libs/agent_framework/src/agent_framework/guardrails/calibrated/rails/__pycache__/dlex_in.cpython-313.pyc index befde91c40e44e1ec947f81eb7b4b87e32162649..2985800854f6a38fc21bd8ab5a9146bb0d6e92cf 100644 GIT binary patch delta 65 zcmdlfc|el;GcPX}0}!key|$72Agg+ner{fgeu}< delta 58 zcmX>gxl@w+GcPX}0}zzmSiO<^Age;Ler{fgeoA6VqJCmpxuJ!AVtQ&`NqkySVs2`A Meo^-3&#Y(J05>QU;s5{u diff --git a/libs/agent_framework/src/agent_framework/guardrails/calibrated/rails/__pycache__/dlex_out.cpython-313.pyc b/libs/agent_framework/src/agent_framework/guardrails/calibrated/rails/__pycache__/dlex_out.cpython-313.pyc index 6d00e20a2c61a9921ae45936e4da5d0e7e01c7c6..effd39237c7e38fedfe1d656ea9a0aa8c10b4fa5 100644 GIT binary patch delta 65 zcmaDW`9+fZGcPX}0}!key|$722&;Over{fgeu};~=08d*Lf&c&j diff --git a/libs/agent_framework/src/agent_framework/guardrails/calibrated/rails/__pycache__/ragsec.cpython-313.pyc b/libs/agent_framework/src/agent_framework/guardrails/calibrated/rails/__pycache__/ragsec.cpython-313.pyc index 196107e255a2432786a84cf598558dc961c11764..0a8069ec2716ff0202d105f661478f93b7a4a90e 100644 GIT binary patch delta 1107 zcmY*YOKclO7@k=__ThE>j2s7QZ{0SDli)29Aqb+1Hg=;rB?WH}AO)?q&c@ngy=(ou zZD|h_1c#oGs<|K}E}TF-B$N|^LnX=qaR3Pkr0u0r)qAT7aiE9JzmA1El0VOU|3BaS zuf4ta$zt|#HmeZ6zMKAQ@0(lMD*f!%{QQk>8qyjusFB(fL5%+;kc_k;ZpvK+lx_wx zT@_UBlQyKyYYLM;x3LSG$m>~^f$g{*yR)j;YXec^`(je8$T>g}k zJ?r~lz7-^KXa|8cu$iCOW4+{8v~lnx`IA5u_Jg=Ee@!2Hp}wQPVVpDH1b@%&hk?Fl zU(xvuFEmH474G^lWK;tB0t=-JYMwtAU>q70+3(V9eiexnhY!fTTm`1tJ^3w~W}9+V zuW+`Rh@_D-vR%is;Rq+9#J~=l0-#V#1ek$_a!g*Pud&;5oyICh(s-XnC9~Jr=xmv1 z&!65f&%9%dc)|fH*kLO|q$GhV1 z+YrksPT+V!XnB1*N(3Q5ihYz{T$0f-dCB+PxEPUm)dJ7)29V^2raZ3oG72xT`}sz7 z91K4PcvG7!-hx`8kv@lp7CT$`Q9SX--0GjTSC~+IZ()`EysC6);tpMDuO;rhOmV-K z;@G5sp*HCj&!oV{;&=sJ4i6KQ(nms$CjZe0J@$Z{d_dOOlXCsJf0b=Yl}7~e;rjwn MXKuDW6yxc83hX-Yk^lez delta 1190 zcmY*XO>7%Q6yEXrXLoJKzcg_K&eUm>*bO$VlBTFptE5g^IaW%uJy0pqYOu%dlJ&0j zcHO|Gp$8DBN@Wn@Oawh}LJ<;(9+2D%r%FgjXir?YAvJAFT7UYm1>*d`8!52(sO9IX?KBlUth>MGO#z#(>)@8t!!GR(fY`(Pq>A5j+7!2`N35F!aF1Fy9pEAayN<<$JfXYqTxrpM+m)Oxm8YZH&uNN4x-xf<#6yNwQz9^G|dhkX+RRAp}{R}(2N z;fft#$gsXLnLa0o2!~Ikzf$9nXLrrH~Z8wZ3=I4!k4?$D~CV` z1%xX$hlSjNI**naQKwL#@|I97BR^+stzBN*G}fCdmyOjM#-*$EH8{o|s}seN5GjhX zSAv50U+|uc{{FRMqpJtgj_urJf4!ciMMc2y2|WPIh1(xqraB<9%j^evVd;a*z!zhYW4`m6Zo+q{u V(w;~H4{wL0#Kh;-JF(z_{RjN^7OemP diff --git a/libs/agent_framework/src/agent_framework/guardrails/calibrated/rails/__pycache__/revprec.cpython-313.pyc b/libs/agent_framework/src/agent_framework/guardrails/calibrated/rails/__pycache__/revprec.cpython-313.pyc index 0961bfe8e123b0b6fd474cf9d46a49f1cb245ba9..eb7a7a0a403ee9f67111d37756d3af970038680c 100644 GIT binary patch delta 1184 zcmY*YO>7%g5Z-66z3a6dum5P$LSj2j94D?WZR5RnL9p$8r%V}P4Ad{i6QUTvrLmUdm=2B%NEo?GkF zgBsqjJ$+~y-mU`!mXkeliG3n(*HujC@;VBTLG;D0vqOEgLl1^PyB)){s+_sP-69Bg zgg;V~kY{S_o$FE5E5uLh*Vb>`*jV3e>l^Run{PLoaE@ETzC1LC)G}=fFCpQFd(^9h zfTs)ym-kx0#OyeBnXIzY*bE6GlPGH`7wTtG)FC*7q32e24a>S^boXGEN0>nvN8`l* z(LPto#n(CW0>T~PiM)E6D*cw4|0Okl|Muh5@*{Z}JNQz*n7sy*=mJyR`Rozch4|&g z1}Dbt<{*!1_iQjI3WAKkupp49AD=+HLC72IyM&o91~vpOF&?d!WJ}4P$i&IBtu&t=eh6x7}%OR>YB=Ux6Bj0&A+pi>V-lX&*Ry6oPn) z>6*6d8FrWYVb=qQuus*+r5JYL1qbM*x(Rjxol%5iy|%!I715F?Vvp>jb`--mb?tA+{bscbGg8$;^Q`iM#Ko1?*t6EOi zu*@UFGaVa5b~U%O#wYKKeVmdnSx&Eq&*sOvj_rYg9~1;-^A&*Lk>i#%(2X5q=urTL z-OuIPb#CNk_>!*U)?)JK>-OcffwQx3(bwQzbmP0{wh;ab6GHwDO%UIatZ{8^XJ>uw>b9|d)42M2YXhD|ix|iQ zXJGdn*M{dg5r|#euSNh%hJ=SZ)_7sIqb!lj>^)_kgqcZ{{jNOMJjs$70PPQauii0x zz1ya>4`s|y;xNsI#A&uGYK6SYIx1${lo#^XU={=B(CK7U_N}^9+dyJEQ~?THwXmh> zi*rE~1oHI#qe7xZc!xKWPC}cS^(6Z#`2$HEeUkc{6pEYIm~p%$!}A2?HE=ME7k7qgBUqT+cUM%ML`(2awonnc5{89i`ip_QIKi_<;$o z<936Y)5YJ|c4X%3%2W|TJ#-C))#WvBf$Vm1Z@&X%Y-&wpM zj4!CIRdKw!(rStimkF02HlrM?1hC&K+2!M8n3cOoF0#A1((KE~N)XnJaT(STWcFjO zHJ{@mzX6~F8~k^}8DSpH3kVhVVqPnTe+D-no*yJoLMSsQzn=&Vs8;jrm;5X%7Aizy zYlYHbSPOp;gzHK4dVRxen*-klz*z%@AKMP?cDdd{w@V0@5inm6Hw=DFhA}yf{~8G7 z)jn+xd-fI3xf@=Kcb&trNC^2OGDD<4O9DCf8~eF%HhCN)(N~T|fu#RRvVRKCNSNkd D)`A?U diff --git a/libs/agent_framework/src/agent_framework/guardrails/calibrated/rails/__pycache__/tox.cpython-313.pyc b/libs/agent_framework/src/agent_framework/guardrails/calibrated/rails/__pycache__/tox.cpython-313.pyc index 53cbcc884256c3b2bea04fba19ce55a5a053c482..0f52a2e05181b9e4b14d5623cbefc45e9fde14f6 100644 GIT binary patch delta 1327 zcmZuwO>7%Q6yEW!?X}l-{O{O~y^d4YU1;r4u%c85#ZB$Dwn^J;f?8T>wY4{vleO18 zZ=28_%7FvoR?P{J5Zo$+B2_tXL%p;o5C^0l_CS$PrJgEK1Q#yMtnE}FM%r)R-@I?; zy*EFt?63F_{eCY))_&~i_Otu`B>Lulv3RfH0#}Zak?d@`!EOI};ANNWZh9JC@HPYx z8b0um7?;d9{fz(wY}wPCX#^pdV{Y*4d7Ag%E6>~rSJ2o75!nmTStifOLW+@n701LL zlij{Df_T^Y@Q2GB@9t}(k=oU8(s}Q|>)PVc=D`O6-GRLLm*9!w?Q(x$mOJHl<%`N? zFt)X}IVx{!x65S9z*L61YHk_O$HzlDQZNp+-V70*5j{i>A_Oh2ZFDrtw_)t9t3AC$ zwH~n_IthHl{5lhbIQ}bq<)Vw|60$-{z1nJ>t*$nev)7c>OXq4ZOFgW`4|_vR?+r8% ziNRvKnkhMe(%FU)yf@(j5!spLN#=;MUOQh~Q|hhi`Tyn)4#DUT%~5Gf z)%BZddj|?M?>vDi2Q|Fn_&lO;uP!VyvIk#?ea8l50XyOn zJ0k~iDL$VJ$-!xl2i{Ho#3WItO7hO5Fn$zG;IHGS3;)Zo%pGH{3rE}nei=_9Kjsrl zWDZsmr;vaLi3IDD{rHoFh$06M5&_539pAKErHxBhCC+k_>KVIQ2ht>!~~YMFI{-#n+J&uZY=n;qHu-+WwqRjLYl28b#KjPVw4fGR3@=0=vJi#nf&>ylj0-Qu z7G#ipJF*yGNI-(1o1v8o*Lr%5pqr^le8|Co7KOAXL8gF4kQOT;O`Z%K`Ldc^!;o7S z)vtbgU8J?(ot+MI&2=54+qB5Lu0agj)`{JATz&8U-e(rsdq7&?+79R}s7l_jY}+D^ zLG%r`sRPl;Z3Eh^c7xe{0cY=1qBkrS-|%G{R)^TGPB^7k-EYGPjgnVf9h#u;eiOVA z!Pj=v2{VABbSHJ1ShY^qsWo*+uj#Grb1&5Nb))OlTcCH0Z3{N(&nXkXLoW_2J(psa zxA_kzkY?zK4XbH*@~YKa(c5N~pEekO5M=NHdXmgSj((DU69=iBF4hJas|sFZtG#8I z?XCg5wVtqUIBEd6v`^T)d4v_9t7#Q?>HBE~_f_`OWjsjbOrbKy!wG|aDkqLpFK0%v zORMFW^hGlpm(+ z+2vTmcQepJ^vCSUSa=F|h3lhdkrttUXCDf2O`>1tR3V`y>66@WF{LH@1JRYPMou54 zH>bHG9-!0tE9L)bPKjgat=NAxBx>dh0Zpdg=g+eT`zL?qqI4Cl$o+uhU5jb*lwb!G zqy@U++3?uW-oh>PqM)D_R@1x9!9+k+MK7$IrnPM}p~M8d5E!~`bzzttRP2e4(Q{M* zYV<*IGk1oOei&4_hrTpOP6O~TCA_mU0AY@Wfk|Wgb3b>~I3kaj_bQv$RkiA&1rYd4hq>`$CQv8Jj6(Nl|zI+9C}&FFq6$JSX%}-?;SRR_X(cipwd!>6#e1i6Xbsuz#qql zYgDV472m-*H4n>d^Q3yc=_?Wl%JKFTvDu`m0G5sn4X$f S5?_#$Sdx}slsmbZu?7H%8x`6B delta 57 zcmZo;`OnP#nU|M~0SL-&tlr2S!KhH8pPN^rpORRTsGpctZfK#On4X$f5}#I-n44Oj LUz9z$i?Id(2%{5o diff --git a/libs/agent_framework/src/agent_framework/guardrails/calibrated/rules/__pycache__/alcada.cpython-313.pyc b/libs/agent_framework/src/agent_framework/guardrails/calibrated/rules/__pycache__/alcada.cpython-313.pyc index 5c94377924593ed0f8d5b79ab59db438bde55c5b..38f73289f7c171178554958fb29ead39da6c8c91 100644 GIT binary patch delta 65 zcmX@icZ!euGcPX}0}!key|$4%iB-K)KR2&LKSkd+*fTz$C_gJTxujS>E455NF+DY} TB)%Xgu_P_OD0g!&>o!IJsUQ|? delta 58 zcmX@bcbJd+GcPX}0}zzoSiO-uiB+LUKR2&LKP9mwQ9m)Q+|WWlF+DY}BtESuF*mh5 MzbJe26xMBw047Zo1^@s6 diff --git a/libs/agent_framework/src/agent_framework/guardrails/calibrated/rules/__pycache__/pinj_patterns.cpython-313.pyc b/libs/agent_framework/src/agent_framework/guardrails/calibrated/rules/__pycache__/pinj_patterns.cpython-313.pyc index fcf5250751f08999ac4af4976f3267dd6130af60..b1f9e5f2a0cefac2a10b5d80a90f2eaa495479fa 100644 GIT binary patch delta 1556 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 diff --git a/libs/agent_framework/src/agent_framework/guardrails/calibrated/rules/__pycache__/tox_blocklist.cpython-313.pyc b/libs/agent_framework/src/agent_framework/guardrails/calibrated/rules/__pycache__/tox_blocklist.cpython-313.pyc index c910508deffb99935a33a8a69886bb7605b3e0f6..d608d9fa9b82b983b6f9100ae3404f3b77d0ee70 100644 GIT binary patch literal 1640 zcmd5+Pj4GV6n`^oJO7)sPC-Bwwh0oo5Z;I+a0!+Y$55w9WU>ybl8EiZ9=n^Ycih=^ zNI0M%BtAgZh#olf8i@iQfLp(S+eB2_3o3Bw&EQJVo_MqVQ<{DOM)G^}e(%lu?`;kZ z^#h(C&i}H#paJ}@gwBbyFU@tl9D)fZxdMwsl0_=%q9!#R#uQ4gL}X-B8wXRHA+0wu z8p@Hb95bVvJ!WjPcRFJBybjwD*=P0|MD~|yqVKVKl+c2hBg9Uv8VskI&m2+CG2iFX z^@1}m0xQqPJXYfVeve_e9sTOGV>5JY^w=La##{hD+O z?X1Jxdy!%%p!pq=&#>-|u69G=;aP)eViK&QcO%-tOxme74l`}AgM3IXwUOc&fDWfT zX{S7O`}VS@j>oqk5v^TCr>oo-(q(#H*0|29+-06#Ws>Q>*u&NoS&{3u%Wu@~-Q5)h zmekYC6Q0g0TlemkYk2$Zo16Ma%<;H>X=!O$FLHdu6Ui5v62m}K_-j^?q{sx8a0qJ< zhs*B(xMTy-)>);U+jBk+Ya~zqW7Aoz=O!@IZtX4{Ms-+z7hnKml;H!dM2^VHkrq(N zgP6yeEL;yrRsqS$AiB$(8kcHjp7NmU2f=|+aebp`ESp&?C&e}|_@1%NcMVqNF7ATE z{F0CrOB8IwvA4W7UXrZBKNoVx@MPg7tXyNVD4FeeMuFig$$VZkWX<88fsMAd98uVD zY|l?t_k+G!jD)KxQ^ADoSz>F~7B$Zb2a=pcOYC+k*)=+=vVR-NKab%6>hbb}ROzR+ zTl3#$Z)R`vJNfV5`*Hec`r+tgeRL94Pn)WLUr)VHq#DcrXHIeu(~(1pgeA2HB1aW+ zUXfRjgetYTVYLkaK^C;X0M=<*L+KOxDLoN49*VsOVz0jcB|>vFL!SVAOtbWF#jeml zTMVTtS)yp7Slh=_`Kk)lg9JY*ku4#dKx6K{ROuv0Ygg1?`dXM+FmifA@(olDyAQbrjgm-n5J>-{b9(*a-0`{jgW*T&u<$=6rQ!$cCtwo3j#W~DyYxYp9@)95rC_IHq#hDi1$*F?RV zI#am*zep8%6*6OGT3IXG%3aZ|+}r4u&S$Kdvc_k7sp4$-9O_^9m~-2sLYgj-g!?oY z9tuevZ1yq7reyonp)PibIegL?P;3(4+-Y3CUN0HO1{U&iAIsgd+y>jPW9pU6b=;RB zfN`G$SeOnLOqetvcf#S}fH`15Io2hCz{|!y4SLuofn+8NP0;Z0du+Ot6NyzRg~fhn zc-RX;D+tV?p3j!eE)Rv|kUf0NmW|%%rJF^_x|QR+)YIi>?#Y<0d|h4c2$s;I6UPT_*F7pXBj z1r`xn1UFu7i6u$>N!{sZpg^okvM=K-Tt>(PM^l5GtPJcxel#9{cz~KOV$BI{5vr@4 zbL$Iqb&~n9R+z-xHxM#W^97M#jho`%MMW*V2_@=8!tAlx;31iE?mT(_Vc&m{>bI{B z%nj@bVitfeKu%yhDVBjMUAVO2z5j=zFYPKS$5%W%DB7t{)c7U0|MAx4&&cr{I<;;TJ~s1oDY-*cmCz; zg_yf=vz{nB7*HHb;+A>n5mAO`YImkDxzxWK=c%w6yjKY|)5ww(T;E455NF+DY} TB)%Xgu_P_OD0g!%^F=-Ys9_dk delta 58 zcmX@AvQLHkGcPX}0}zzoSiOE455NF+DY} TB)%Xgu_P_OD0lNB<_R1CrO*~q delta 58 zcmdlfu}OmaGcPX}0}zzoSiO;M1& diff --git a/libs/agent_framework/src/agent_framework/identity/__pycache__/resolver.cpython-313.pyc b/libs/agent_framework/src/agent_framework/identity/__pycache__/resolver.cpython-313.pyc index eb6deb85da35a6a493f064abf2bdf63f5ed4e1e7..56109ee31bf95398f8177d23eb15ddcea44686cc 100644 GIT binary patch delta 65 zcmcbta!ZB#GcPX}0}!key|$4%m{~nTKR2&LKSkd+*fTz$C_gJTxujS>E455NF+DY} TB)%Xgu_P_OD0g!m^Hn|owe%LT delta 58 zcmcbma#@A@GcPX}0}zzoSiO-um{}oFKR2&LKP9mwQ9m)Q+|WWlF+DY}BtESuF*mh5 MzbJciEAv%805SU%O8@`> diff --git a/libs/agent_framework/src/agent_framework/judges/__pycache__/__init__.cpython-313.pyc b/libs/agent_framework/src/agent_framework/judges/__pycache__/__init__.cpython-313.pyc index 1807483c7fdf6317be9c49acb879d5eb04114fdc..d501d6a199dcd116d169e272a88906da2fa4648c 100644 GIT binary patch delta 64 zcmcc1a+`(wGcPX}0}!key|$5iBcpnner{fgeu}T*2^O#b delta 66 zcmcc3a+ihsGcPX}0}!a1uHDGJkx?^4KR2&LKSkd+*fTz$C_gJTxujS>J1HeeKQTQu UuOvRLC^0v+JijP=@?*vd0I^XP*8l(j diff --git a/libs/agent_framework/src/agent_framework/judges/__pycache__/judge.cpython-313.pyc b/libs/agent_framework/src/agent_framework/judges/__pycache__/judge.cpython-313.pyc index 6a632a9c68f1aa906bbb75d908666ef1bf52a456..25632a3e40f6ac7f7dd4ec6d2d678f8aa6eeab09 100644 GIT binary patch delta 9696 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 MmpP9;!-@X?0d&J-NB{r; delta 9259 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 diff --git a/libs/agent_framework/src/agent_framework/judges/calibrated/llm_client.py b/libs/agent_framework/src/agent_framework/judges/calibrated/llm_client.py index 26f9b5f..f282c6f 100644 --- a/libs/agent_framework/src/agent_framework/judges/calibrated/llm_client.py +++ b/libs/agent_framework/src/agent_framework/judges/calibrated/llm_client.py @@ -1,5 +1,7 @@ from __future__ import annotations +from agent_framework.decisions import invoke as decision_invoke, predicate, choice, score + from agent_framework.llm.structured_output import parse_json_object import json @@ -45,15 +47,23 @@ class CalibratedJudgeLLMClient: component = component_name or f'judge.{task.lower()}' generation = generation_name or f'llm.{component}' - raw = await self.llm.ainvoke( - [ - {'role': 'system', 'content': 'Responda apenas JSON válido, sem markdown.'}, - {'role': 'user', 'content': prompt}, - ], - profile_name=profile, - component_name=component, - generation_name=generation, - ) + messages = [ + {'role': 'system', 'content': 'Responda apenas JSON válido, sem markdown.'}, + {'role': 'user', 'content': prompt}, + ] + kwargs = dict(profile_name=profile, component_name=component, generation_name=generation) + if task == 'FALLBACK': + raw = await self.llm.ainvoke(messages, **kwargs) + else: + questions = [predicate('allowed', 'Under the supplied rubric, should the answer pass?')] + if task in {'CSI', 'RQLT'}: + questions.append(score('score')) + if task == 'CSI': + questions.append(choice('sentimento', ['Negativo', 'Neutro', 'Positivo'])) + raw = await decision_invoke( + self.llm, messages, decision_point=component, decision_group='judge_' + task.lower(), + decision_questions=questions, **kwargs, + ) return _parse_json(raw) def _build_prompt(self, task: str, payload: dict[str, Any]) -> str: diff --git a/libs/agent_framework/src/agent_framework/judges/calibrated/prompts/__pycache__/__init__.cpython-313.pyc b/libs/agent_framework/src/agent_framework/judges/calibrated/prompts/__pycache__/__init__.cpython-313.pyc index 2ec04b1116f8433737393870fe1fd63e8b05e6b8..0f0f5b123469c41ba0ba64e62496dee56e06b83f 100644 GIT binary patch delta 62 zcmcb^c#DzyGcPX}0}!key*82CSiMp|H?KrLMc+5rGd`dwKPxr4q*y;IwM;)TJvFZ+ Qz91*DBrU%vcVc=e0BedBm;e9( delta 64 zcmcb`c!!buGcPX}0}!a1uARtjtXZv}n^&TrqVF5*86QxTpOuE455NF+DY} SB)%Xgu_P_OD0lKCiAMmt=odQx delta 66 zcmexl^u>t#GcPX}0}!a1uHDETC!txcpPN^rpQ7&@>=_?Wl%JKFTvDu`os^QKpO~JS UR}!CAl$e`Zo?nzbd4j|v0LtnYVgLXD diff --git a/libs/agent_framework/src/agent_framework/judges/calibrated/prompts/__pycache__/csi.cpython-313.pyc b/libs/agent_framework/src/agent_framework/judges/calibrated/prompts/__pycache__/csi.cpython-313.pyc index 9a409f139f227661bb50e0a402f6e04c23f77c9f..dd6ff581a889b7c2766a4692718339aef6809a36 100644 GIT binary patch delta 49 zcmZ3^wUmqdGcPX}0}!key|$5Cm4&fnvLTCzP*!T0eqwrRUP*jGPGU(~eo^k^NS1Q| DQi2a@ delta 51 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 diff --git a/libs/agent_framework/src/agent_framework/judges/calibrated/prompts/__pycache__/rqlt.cpython-313.pyc b/libs/agent_framework/src/agent_framework/judges/calibrated/prompts/__pycache__/rqlt.cpython-313.pyc index de1c2322e4bc3b19a30fd2fc7f31638e17166511..b479d9271496cdb9619ff7d0fb71814c1ec1b2f4 100644 GIT binary patch delta 64 zcmZqR{KvulnU|M~0SMNKUfalBz^q=XpPN^rpQ7&@>=_?Wl%JKFTvDu`m0G5sn4X$f S5?_#$Sdx}slskC|^Bn+E455NF+DY} SB)%Xgu_P_OD0lKy#tQ(Nh8Bka delta 66 zcmaFN@|1=9GcPX}0}!a1uHDF;$f#MapPN^rpQ7&@>=_?Wl%JKFTvDu`os^QKpO~JS UR}!CAl$e`Zo?nzbc{1Y#0H|yht^fc4 diff --git a/libs/agent_framework/src/agent_framework/judges/judge.py b/libs/agent_framework/src/agent_framework/judges/judge.py index d4be8ad..6b7c392 100644 --- a/libs/agent_framework/src/agent_framework/judges/judge.py +++ b/libs/agent_framework/src/agent_framework/judges/judge.py @@ -1,5 +1,7 @@ from __future__ import annotations +from agent_framework.decisions import invoke as decision_invoke, score as decision_score, predicate + from agent_framework.llm.structured_output import parse_json_object import json @@ -349,11 +351,14 @@ class LLMJudge(CalibratedJudge): f'Contexto/evidência:\n{json.dumps(_safe_context(context), ensure_ascii=False)[: self.max_context_chars]}' ) try: - raw = await self.llm.ainvoke( + raw = await decision_invoke(self.llm, [ {'role': 'system', 'content': 'Responda apenas JSON válido, sem markdown.'}, {'role': 'user', 'content': prompt}, ], + decision_point="judge_" + self.name, + decision_questions=[decision_score("score"), predicate("passed")], + decision_render=lambda d: json.dumps({**d, "score": d["score"] / 10}), profile_name=self.profile_name, component_name=self.profile_name, generation_name=f"llm.{self.profile_name}", diff --git a/libs/agent_framework/src/agent_framework/llm/__pycache__/__init__.cpython-313.pyc b/libs/agent_framework/src/agent_framework/llm/__pycache__/__init__.cpython-313.pyc index 575501df3120bbdaa99f024645b338bf2ee83951..0218e6c80e2175a39e10ea83348ca32ace61d970 100644 GIT binary patch delta 64 zcmX@ce3qH}GcPX}0}!key|$5ClTkfcKR2&LKSkd+*fTz$C_gJTxujS>E455NF+DY} SB)%Xgu_P_OD0gxQV-Wy;zZGWy delta 57 zcmX@he2kgE455NF+DY} YB)%Xgu_P_OC^tSoIa7agKl2Q207s7);{X5v delta 27 hcmcZ*yfGcPX}0}%ZAxppIWGc%*Z=3UG)v;m4W39tYF diff --git a/libs/agent_framework/src/agent_framework/llm/__pycache__/providers.cpython-313.pyc b/libs/agent_framework/src/agent_framework/llm/__pycache__/providers.cpython-313.pyc index 2ef52d57fe7b959bc695a12c4cde00db918edd05..503484f86ba7cb998a9fbc34b52b142682ae455d 100644 GIT binary patch delta 5177 zcmaJ_Yj9Q773SPm5<*Nuk`f*v2{$2J8h0y){d&YyV5)c+lnTe z3+gt+37l2>IXQx0QhW{q%grjQ?|bg(v?Z=(hk?0e%A5 z2G|aGRNg-GFXLfjx!VldkH~>qmov&VMab=CzDXt&4*)g;*xw_NdgLF~OniyX{=kG3Mhg>+fIe7<-^;2f#z}%i2Qn0A<=u{08&k$IdKdi1*YnIe4tW_5- zuT_^WsTYmXHE-!egGLP(K>_{Q%OM)8Nd7UL7vD1Ps!Ms{NcWwJ=N;0Dw`5P%t;!p6 zplYgeQNB|((ZhLZm6xh!r^CWZif%Aezu6%!#w!*cbS!#-ly`}9gg&=;3qCRcoQ+o@ zeS{&8U_Urt@k_w-fSG`cGGlSJ=XDaT62v5H7Jo4j+_uJB z@hcdmo58RiZ8KFv_eUcEL;RMspK?6B1*F{G$8Y2ZYo@GWc7SP?t5XYyETh?L{IiDPv?iqs$;JHAgLT>@MNd<9?+pFtWq89JN4kWNeI+6vEl zh-YQx+SUntU@kihX1%?Rys&nD1-^YLVkNA(nmCW&zLcCknOG@Cg zQyyq2DB?=te#1<22TeU}SgAyU&JDV1#I%UmFF$U`?|K7s-Uk!{(gCvp^8w!jyb0(7 zyh31ks8I#|&6cMv7SK#x9K^^IfJ1=8fK`No*Zn~haF8K3tUkutWjWAj?j&0s9g`JF%fMFhIBQeg>^B4E1;+4Gy*N+HAuGz z`OW(21v}y8DBvk*UF0ezuHbtX;Fzp#tf#iu*BDL9L5*9Ub}iJV89HB3>k zxu7l@(e2`%hUlJ`2P3yOc_D&XzBKU*`iBD$Cm@|9u#!|Y5cN}F-0DAq9z+{#`jD_o zkqRe8a1`EM2@-UUP3f{3@MN}<$Oq^-A1z4+?CFL6cK_uMO>DZZSPJ+m!&i2 z@~)r&d@jrB4;l7im*c+nMGoal8R`g)M>46M+=eJQlvm|HItrD!a$M(BwGvw9Ar~&( zQN*0T%OqQwLzSXO0@qx*dRLfsssrq1b8kQ0k)$#Jp^PS39GSs!$w*XF-0k})8AXAYE;I5R2?;iQ*uE`l39%qpI{Ia;K zyTP5dl%`WgY`qL^DfU#u;bQr-E$RgBAx!ZLaJvGwPH{=5^^{B)Qv0$+B9P^BX-{6) z8n_sbDboRK@wpDL8nB9h9!)Xu4=%0L>SoPcteaYpj^b`;GOMG_y3nCtp|?^WFnyWB z+FD{4e0dFp!tTT}&UFL)jH8#O8rBUw&!qp+-Wx`<7FhiaXns1^|GQb)AZyv49X@c?nfO*)14{#;kuw#!SH8FHWe*O5ANkLd8lvCIgurXe?^DZS1O#IfT zhupoZz|#eb?)bS~FQv=|gZKqz-^aYUmq~Yj?>_v!dFSBUf>gmV#2&FiKHYmzxg?kD zubA`@CO-^#1h56r1K28e?yv7kWNJQQzJtJ*G_3bCGrk;}32#=4)@C-V;b=e?U(+`g z#Yz|?&VcQCVP38So)Zf(X_D-B@Pfpo(GKo0_(ii3y8(Lul3*3J)4lYsJaiyC*GeZg z1jBSK22}guy$^P}ym-Ld)e5m5kYN8rd}aZ-EV!Z_h>^RgAJTprwNlKeYBmd>$$`FEtC27J zO~xtZW8@P&g2|lgosf zGtS;TENzCfJLUuHkPFM*L=|Z=(=8|ZC#U7Q$Lm4(vi|?oV~sOR%?$d(I-P7ZAkgxy zRKD=TI%}8>Oa$~Du^hmZNSywI2(%M$3ZMff0dfJ?Y>?ikKK4NNJLT@w?0DYO#Y)D| zeJg5VwL`8rHe+5K;sAheK%S2~K)eX}9e`h&V<;55loLlI)Ar3k}c`kr0E?&lMG#KXeH|%e%0)xo}La@4s*kZAoj|-*-+=*#%sb(wj4V8{D-B!Z6C&Q3^1~Ck9u%uJNybiQ z%Z!tAy*C)ZxR=0i5L~}~pO7sly~^P|r%GnrWSle7_z)?qDe}HkIcZdb^j6m{Imszz zkH2a5PFZZpXCfW}21f~%{DK1qwfuI2=SezSodk);I-Bb|-cpOVAv z5Yx@GxkZfdnSx@ubL2a7u>7!&%l*gZ$rRcuw0R7G)9kx1WTEqlqJgeAhX)yO#{1?+mR2tjhM=r*wt|k1(0ycgxE>C8>u-v zK1Z3l2c{D6Qy5_Tw8r2fd*#EYi);2_w3mP~oN&quVck074XZhI`(Zqy-f>mX@48E; zy&e_=GWSfrryrJHdB>U32}2!{R^Ug2eG0PsOimY%af@_`+u$g1LfqP1qH+{%vVGxl zb6kaSZkVfwB=*WbB><2qNmOv4}^)OL#+(Zza@1TIOY3a97B>{-e4=^fD)(ieyq<>qtm{SSrB;)4JH delta 5169 zcmai2YjjlA70#W>OcFxmkp$AnBaj5RmRDpgH9P`H0;ZOz4GNKj%gy8t88eS??wv>w z4K5|1qDGHc1riYi35p2mMH^@?s66#hh+xQfO?BXGQW zv{m(r)u1ziF;O3CXfUEems^XbDG~cb(OM-_Ksy^?%IhY5pcv9WdAt(0CrzH|AO8UO z?SN%~hX4-)9sz8X@oArpgpT8joBA3<5QrV9V9nL$hBQL^20j6vfgf=G0i*rdw!B!^;T6?b$iI?_pYs;(*le40oD^Z zxteBLx)lm&x@Cz_ecUokO%p*V~j}pI|f+jz| zq5ZPxY$$zUTsWdkL|k_c6pY+LCnSC7lf)$yib3`Z~%wuT~Ox;RKIIyH5ji0P5`C>u(atX zfUlRlJ!5O-BbBiR6j}lIK+EfDxf{AqK2|Z!zY)Uw?YAq=4lhlfET_wZ5N!r*A#k#T zdN^FK2b#2qzD~1ZO-9rd??C*vJatE5TMv|mS)qs#i(8s$1Y*$!Q~a8^e_IEw)c}Ou z-N3Jiaz+VbZQL*|qd{vHv0x}{Xi+_4xJioqbW&UONZ9cj(H1vp`D8tbWQVb>1Zuii zR)|4z2kiG1skvo&bV&~s+3&xDIuGatTm-O%FF*~P44#|zppMFUD`xuZKpvOoinXKp z1XJA_<6`N7>>c^din%i}Rx?C3I9!Ar-~YXoTvJo54kqS#u3^~X3Vuu;t+_A;1*Z-f z)ctmO>dx}aZ!qCoz;-!uWo1?n6J|Ny=2){hDH~T-s67yJV3HYF1|DZ6mzs&;dijTy z1)23AxlNssN^PF9Q|8x>_n!s#PjY_k*tYjTb^%TiIDTqcp+KYKk2g2ymLZ;lWEbFh zz-~Y$U=JV-@G0Ok0(G*R{)09lDE$TS0s+-vFlYp

cMmc4%%7_`D^qm(>`)F2Ak4 zI)A_sBdr{-+0Z0T%aXdO1s%}b3)lxqsxZuE(T8yfV86V#uExI}qN(z&rm^yHh2Q?J zZb{a1l&s@#(ZiJ1jxP{4bRkY-3S#P{2dIYh`miBJfX5r;knt|vB6rdP;gAuvOm|+k zLW()EvuTWyW1nd9dGcV+$;8bHsBr% zaWDdB+U=>T5(kK&Mzfm!^bIjBQLv$)Di$@|axH`#C*-HmYl1}}krQf`c$xmN1L74> zhX|ZBO>2k+$T4o|=fFP$=x^>K2Nntdham_8@&S2(BMh=JcB68{eko=uOTPqXDS_&B zd}h4a5Uy?PiMpoSVxf}_;3OSK)=eJ`(Gxc&S~v}z2~RfX$p_ZXyJI5O=RKznwhb`} za^3=*bg~iw4;bOFrm2eH6-Xy#fopvV^ry&CqDYw{=ZHQ}ieg`H-l;4yNQXL9GWP7? zFNy0mgA7o76nuDt-97SmR>v^5qlgI1DWX@J@sG!$pVHYQxkL#$pr$(BK-hE_>$L+d zH+qx{a^Je}NCcT0#C7nJU3pg)wN6k<<>JEu zpp3M{&j4H&t3V~asUj68`<7_A5z(U!)rM#ZMb|8iH5h8D>mn!lMNC?1mu+0>%lawJ zps2Wfxo=akzZ}a{$d5K@qq&LnK$|P18oFL_UM^{$%y$^G)f|y@?>0f3J=AI|}?8p?$yo zRmaJUYkNWSdw`Fw2gA1r)@*+kzq9k*y}nJXPzt4)sFvrpcPZy(+m4y}4?z1tz$QRD zfUo>5^6ZY92&XTqA3p~tO8Ekb!EzNRtN%3%7uFfZ2%%RR8s zeOsAF;0=8b>~b7>p>z?@19(S%-dS=hYQcSbaYXqP`2b&l4j)YisJ(#G1WsB* zqGn6TiHK+VL3zHPp61sHP*!%_+oG}`MCfVaX33TG0=eoH#km_WH#If z|JMT!1A>5j0N>Fmn3kf*y1nOc&&}UAPZ{2SON&bAJu0`pIA!*0Addj}e&l($GsK&K z-vD9&1u^n{|B{sdd~v$6S&rS`r+8&vcg@1YS?~$w&>Y8yPear31R|Gif_|BJnCxBg z1$U%-u0kKjUmh5xLM|R5aE54_PR}hvXj-?zS!@zJC2^ZQZcl${f-;dc>CL4Z>p~VO zx;KxLPG5YQ)k@8MxLo`4C}o@6^0Lv^Z(G1kF3KwMkOzF$tdL5w?!liP{OWid9&Q5+ zb^u-o0KfOrMsYc{r(E=;`bJ+ED#Hh_@^}^b+x>a+se^Y(8p=qYK~hb z`uwF^`#D+i%58-MRRumPF4Nm3_r6l7?3S|+O}Dj&~{Rzu~;)bEfDjh!sQ>~E%vTgpHSvt>vVZ= z`tn2LAUgv{8s&uOAl~Kq8MbFB<0Mp{0z3@`?4KTFi5%W0Prg>XWILog2q>6Iqr4E- zt)lGc&r7ir$^&X1*N50C)uV+!W|Fs_?mEo@PbN4Y%>mdbl6N1SI<3E<(%Ss+NFERh zg1C5YBo0%4crBmee7=fPfywLsk7=K#2ei0TSq`8Tia%M#kI*E455NF+DY} TB)%Xgu_P_OD0lO7W;ICwvJe)7 delta 58 zcmbPY)oaE5nU|M~0SGE?tlr4Ihgl(2KR2&LKP9mwQ9m)Q+|WWlF+DY}BtESuF*mh5 MzbJe2J7zUW04?bh9smFU diff --git a/libs/agent_framework/src/agent_framework/llm/__pycache__/types.cpython-313.pyc b/libs/agent_framework/src/agent_framework/llm/__pycache__/types.cpython-313.pyc index e2e30be5e34466489d5abdb36e60b36bd1e1a355..53862680362974b3f6a329c3c7dfc1b5f2c55672 100644 GIT binary patch delta 65 zcmaFD`I?jaGcPX}0}!key|$6Nf>}L5KR2&LKSkd+*fTz$C_gJTxujS>E455NF+DY} TB)%Xgu_P_OD0lN>W=BQ|L_KR2&LKP9mwQ9m)Q+|WWlF+DY}BtESuF*mh5 MzbJe2DrQGU05Rzk*#H0l diff --git a/libs/agent_framework/src/agent_framework/llm/providers.py b/libs/agent_framework/src/agent_framework/llm/providers.py index eb15700..c662abb 100644 --- a/libs/agent_framework/src/agent_framework/llm/providers.py +++ b/libs/agent_framework/src/agent_framework/llm/providers.py @@ -187,7 +187,7 @@ def _validate_openai_base_url(base_url: str | None, *, provider: str) -> str: "Para OpenAI-compatible, use o endpoint terminando com /openai/v1." ) cleaned = cleaned.rstrip('/') - if '/openai/v1' not in cleaned: + if '/api.openai.com/v1' not in cleaned: raise RuntimeError( f"Endpoint inválido para LLM_PROVIDER={provider}: {cleaned}. " "OCI_GENAI_BASE_URL precisa conter/terminar com /openai/v1." diff --git a/libs/agent_framework/src/agent_framework/mcp/__pycache__/__init__.cpython-313.pyc b/libs/agent_framework/src/agent_framework/mcp/__pycache__/__init__.cpython-313.pyc index 951ffa94d474494802e0755f5e25a214e83f9bae..d731e187771deb12749c0531a9c7bacbeaf8452a 100644 GIT binary patch delta 64 zcmX@ie2SU-GcPX}0}!key|$5Ci%~sUKR2&LKSkd+*fTz$C_gJTxujS>E455NF+DY} SB)%Xgu_P_OD0gxwV;%r~aur_y delta 57 zcmX@be3+U0GcPX}0}xc)SiO;3i%}s)KR2&LKP9mwQ9m)Q+|WWlF+DY}BtESuF*mh5 LzbJch3}YSu00|QM diff --git a/libs/agent_framework/src/agent_framework/mcp/__pycache__/client.cpython-313.pyc b/libs/agent_framework/src/agent_framework/mcp/__pycache__/client.cpython-313.pyc index 98b5443051faee972abc02937a82c3d6ab79b370..934164dd70c01377940d2ed9301956a62e57d479 100644 GIT binary patch delta 67 zcmaFT&-l8Zk^3_*FBbz4tP{Pqk$WMtdZK=AUWtB+zHhK+d_YltR%&udv3^!+nSNq= VYFxT7FUP<}=I^E&v4}7r6ic delta 60 zcmaFe&-kRDk^3_*FBbz4RNPp-k$WMtLX>`PUWtB6Vo9QYVp_SOg??gsYFka8iK#GcPX}0}!key|$6tgGoJ6KR2&LKSkd+*fTz$C_gJTxujS>E455NF+DY} TB)%Xgu_P_OD0g!)(|J|^pYaws delta 58 zcmX>pa7cjrGcPX}0}xc)SiOPZVGcPX}0}!key|$5Cgh@SFKR2&LKSkd+*fTz$C_gJTxujS>E455NF+DY} TB)%Xgu_P_OD0j0xlfD1|w2&3P delta 58 zcmeyW@=k^OGcPX}0}xc)SiO;3gh?SrKR2&LKP9mwQ9m)Q+|WWlF+DY}BtESuF*mh5 MzbJdN8E455NF+DY} TB)%Xgu_P_OD0lN*rY2zkq~{hz delta 58 zcmZ3cGhc`MGcPX}0}xc)SiOUr19?9LLYkdGD@so7-HQO>I|m+SIvCnVM;TG`$G9$;P5Wu+e5EbF;gvpf5cn z{dowAQwa5v4?=<%W~c;Gq_~F&B_z$K{=F0g8wsLMopU80daB>U=YD_Ze80bQ4tG8F zs9*C-qfsGJ($44JuhW_ZRauX-FD5y|&W=EPcc&Qdja-rv&fdtNGjur;le+t(A*m-W z_RaiIeK*6mnYH3P06qSBxH?mSkO>!+JTHkc!OUXhp>s*Kqk#H~0--^8sPHms6k~&| z--z917A|Z7jf(sUpfuLp=8x>Ta$QF!>B^3x-b}75rLYie82s(DT zl%cvpEws2`xef#ayIh|`5=kWpRhdbSp;`;Xl+?*I09`S%LWMGE0ijTx%vV!g#tAO` z-Z{ojlN;DMJY8VH*wv5$fLB~|Fo|!uOJNpIxp|^j-1)j$;uFtP%u!6@U3VMVI#peC z?ys%>ebcplHA&SxfnBxtr~V~_UsiXLJ7m{b8)#INhh+WlkZ?^@ex&$f=0lAWT+P7n zpK?tphKdx6^n6MwOAh7RQ(3Z9A(eS6Tb5qz@w{W+kW-CVSzAn=TwXhGrM>u?qJg50 iV3TX?i-!lIk>lc940R{WCo`b~(n$Vnw{ZaVviUb2eF9_v delta 849 zcmb7=OH30%7{_N?cGxa#OL?@E2D?C8Sp!`t<*g_n8$*II0TLfkY@`?z3M>`GL>`fN zGckVgAbR1zsRyIQ#|2|T*+dhKi3bcOhN}mYR!LAUITrmtb_+9s~eQ?ckU? z&!vSJ+hD6KNWz;4^&ptFv+3p_e`2d4cUI46$$xX1*ZNV`SH z*5)Z>0`5SOxJczVp}0sFoCq}FQJ4$NL#CqIzavs;OPSzH2r7Ddyivm!ll%*Z35@@^*VjZN#fhSS=u{ z&1R-sveaU8(t=edNeZoAx>*Zg)kW46j_FXg+TMtDgjF}uv5hA59IV!7=yr~2C#ELd zWzdaTrI@IpOuY=N{%qZw&2$y7Hp2a?Me>;a1RlCdT+mzHZ2FDhUiAwcht8lMFT+?+ zs)$p^j{bE6G9|0u~5Z?4JOK=*_3VFvOo3hg0`0$ z6BUoRA@Rt`s4;r*LgEQS;!y|&$qFaqft!JY@#cF=OPpk9zWHX}ym_;;*7PJ&J!otU z0hRYBw~Ajez)$AXh5Ag;!8NLvKn59QU>p&YWSGlvx zkfg0lqk2$ALp3~EYquU@cBtkwL3#vWjsqy6DI{|OJuJX}*>Zlj7of zb7YG9kC7J5M0FmPge2VT2M7bTR}XCgF5^5(@e`hCsD?$#o>WpCM;E#iI=I=JUXP}~HKY$PwD#;{NDTh9 zMOyRm=$X;8C`adcB<=_wL=`v9n;~|!FGC+!_$w$xg481ss$PhFg5RAxEZ&xnXmXs! zJi$<$+&yxdVw)``eQ{052^McvA38+IIa%E@3t2i{BYQY)lA_@TcI=aTCvbt^Y43jJ zJ_|fWJ#Ivbh3W2qhi!+DbMAmNTumGfFHaOhePEH<9^J|*x>ixx(EWcz!t99XluMdf zAZ$1Mru}=~0O?|c-;y+JSTl3FIzs4109!;mLDg@J5ZZUeiQ>1!rISyfN9jmDR%7I%|ggwndq=WiuRU2)a*& zpjL?yhk6#=zF3}JTXm>zRsqp1>NmJW^%H;yg+QjxI6z&xZE?MQm@T?J|5|ab zIF~J!!#*ffqoxc;O%GIIvUCD?{B$0;djv|Z6X}ty*|b{7NkAK6o6_dYyWE|MwZG-M zdNm?G@Td>^F^gt(K|N--f28i(y}e5_t+gWCeelNo;*u(zHo47MAsn1pf9n5eN{qRm~MH>zKVKiFdq8Y{xXfyaMzBm}BN?YqYJ8x~@GJ;>? zx9_BZDkforha*x_!NP{*O41mbOc8Eky`Limc|Ej|+uTI|->J8x!3%N2 N!_R-6SwL$;@ diff --git a/libs/agent_framework/src/agent_framework/memory/__pycache__/long_term_memory.cpython-313.pyc b/libs/agent_framework/src/agent_framework/memory/__pycache__/long_term_memory.cpython-313.pyc index 9236ac0cc4456ba42790e7d7e2426e0b1c486c74..a86e6f3c1988bcb232a5e79d86c338ade1753533 100644 GIT binary patch delta 1146 zcmZ`%O>7%Q7@g1SwX?g9XLS z_sweF_to$(BhDx7?K~pO`2E-UjPs5&Zt2scs%A(9DJxITT-0mx>a5X_=G7%hDXE$< zQ?DpSv8Gp7G)u}3=I6IL;I1H~v3Znp;qSPhTZth=547*m!r$=SOG0zUe5tmun zHeiwMa@zyJwI8%fuj}Q3QC$5I7YPF`nKTxS@r5QujtAr_qfud5bsD(G8mL{v}dQES(6_rZm ziZZ*iFVgr;?&tQBxlh(bFq3xmD7ll&1eERna+`zW_nYNe8@H#zmaS+#DIYg*KX zzZL>QlOdIcjcCI7p)d&h_)j4QHXL)zUAJ=LUWez_wOiNr#NemeN7}B~za{pYFHP>` zr_4*2xASkC3$?9tb#wW;DfT}?$d|G_MW{1nd3=aJJKVdD(3T@)zA&-lNbh;PA5Q-9 zh$DTUHFD(28-wXyxI31LqtzIshOMiE4CSYQlvjt(13kp~bc9)h(R4SnHU<+(+gjon z;p=`N_4NQtr0d-*PA_Px*t@sYtyYg~-fZ?iS4mc8hh|WPskq+k| z)Uy1u=Xz+ENw@5o7FyN(-_gcE?vlO#GZ5jHJ{O@qK*V*|aq!`fT@mo(d#)^;!Pd_E zr_T_bo+WU#=U?g9RlQMe7|#blKSiadDa7$losw{9rNyWl^X`kmQTmC-u8&bjP;efMWzU%{RiA#UY{{yX*ao69>>)8^%w z?WuRo3yL{cC!w3-;;w6P%e9EV?+QCfv_sDtCDQapTFBtvx=toCov`78vp%%pW-0pk zjFZ_o{z`^p9vp+$x@`|aeS~i^KTIyiwx10S#&`I5#Pfo0d>leAGGt?3n< a4f?^r#bB&!1j3IIfrBLg7zf=$1b+dJejhym delta 634 zcmW+zO=uHA7@cn?+jf)9Hp%8cF-^5da?tHkW2`pXq>xah5b7~tXq!z;+hpS=QqL6x zJqh1Y4}#!9@Q?IZgam0$f`Xs~51ynq|7b53bf(|o@p$jeH}jZpv(Hn?AE(n!*d$Xg z)?LmwN?J&^v_`X|RkWq+i{+wat{ZEewzjcaS=Cl*Mzd3{S}P4>%d|GSn?iOJ=AXWl zz#S$ePD(DmiqEo&S%->$ZBj5!G}0C($P}rP44oiVNYg4LMZD{{isNz;>^LjyzTwEG zS*sb=P%`eU8Ldv;Y_iNlIV844wh(t@9lH2ko(3BRoHt8?~ru zEX%Z#E<99=j`Q41bGU#duRea9u+=+8V@O$9eB{lKCYas+0l4pd0%G^RF9B4LW^msh zS6HK&qjre}wig@)^arN&f*bZ+kPnbOkH|4#FDP_x@?=4x0}6}}Y$D4HB$0E47H})@ z8nT!OzK0?n2Cu;-%!PI#kN-j$NMk14bIkGwE^{cO6uDuyi~iq1r#N#E!&{MiVx2ix x@F=pCJZ>_^gIu#}98?bc_lIM14YP84)3|Jz_&7T4O+ow@VQ|m{fO$Ah{s+;Epl1L8 diff --git a/libs/agent_framework/src/agent_framework/memory/__pycache__/long_term_models.cpython-313.pyc b/libs/agent_framework/src/agent_framework/memory/__pycache__/long_term_models.cpython-313.pyc index 2a984f32c017010c7a152a91263b9efa4ebe5f5c..5812fbd7918b4ec07d2bcb8cf686e89247d6ec73 100644 GIT binary patch delta 65 zcmX@kdz6>^GcPX}0}!key|$6Ni%~sKKR2&LKSkd+*fTz$C_gJTxujS>E455NF+DY} TB)%Xgu_P_OD0lNdMov}$tcex| delta 67 zcmX@gdz_d1GcPX}0}yDMuHDGp#i&`JpPN^rpQ7&@>=_?Wl%JKFTvDu`os^QKpO~JS VR}!CAl$e`Zo?n!`c@HBeD*(G*7BK(- diff --git a/libs/agent_framework/src/agent_framework/memory/__pycache__/long_term_store.cpython-313.pyc b/libs/agent_framework/src/agent_framework/memory/__pycache__/long_term_store.cpython-313.pyc index af4743f78a06066e83ab303a75ce5d2497452028..3f7186a56ae471e04df1730b6c801a903848b81a 100644 GIT binary patch delta 67 zcmezRnDO&tM()qNyj%=Guuk;aM()Q<>bd&4c_sQO`o6)Q@c~8oS*gh-#rj#PW%`Nf Wsd**w1v!Z&Y57IDo5h*$_~ diff --git a/libs/agent_framework/src/agent_framework/memory/__pycache__/message_history.cpython-313.pyc b/libs/agent_framework/src/agent_framework/memory/__pycache__/message_history.cpython-313.pyc index b709239776cbe39883eeb09cbe7e4affa168b786..9fbcefc83287b99c97c6b6e018cbcc5f6c48eb48 100644 GIT binary patch delta 65 zcmbQ}IKz?qGcPX}0}!key|$72AESD%er{fgeu}&GcPX}0}xc)SiO<^AEQE=er{fgeoA6VqJCmpxuJ!AVtQ&`NqkySVs2`A Meo^*j1Evf)06KOP{Qv*} diff --git a/libs/agent_framework/src/agent_framework/memory/__pycache__/summary_memory.cpython-313.pyc b/libs/agent_framework/src/agent_framework/memory/__pycache__/summary_memory.cpython-313.pyc index 66b0a437552c334ec63ac3b0ab366e5455feeb25..6e0ab12975646b49eba0f948a252f0e955eb10f7 100644 GIT binary patch delta 65 zcmcbVcr%gvGcPX}0}!key|$72D6@Kwer{fgeu}lhe3 delta 58 zcmcbacqx(lGcPX}0}$-{wRR)-QD%iy{oK3~{glL#ME%6HazhLK#Prm>lK8Zu#N5>K N{G#m5-E455NF+DY} TB)%Xgu_P_OD0j05(lwn)Vz}Tw4%h^)bjkI?9Ja9 Go4EnHjuHj{ diff --git a/libs/agent_framework/src/agent_framework/models/__pycache__/session.cpython-313.pyc b/libs/agent_framework/src/agent_framework/models/__pycache__/session.cpython-313.pyc index 1450b3c693b8e75839b8dd5badce4327527bb97e..0ed8ac6e9fcc8e498c03ca7e739b6aeba2e8b881 100644 GIT binary patch delta 65 zcmew-(kjaRnU|M~0SMNKUfamc%&eZOpPN^rpQ7&@>=_?Wl%JKFTvDu`m0G5sn4X$f T5?_#$Sdx}sl)G7vIe;AilFb!4 delta 58 zcmZn_{U^fxnU|M~0SGE?tlr4Y%&ZWnpPN^rpORRTsGpctZfK#On4X$f5}#I-n44Oj MUzEMslsSMM01`(M)Bpeg diff --git a/libs/agent_framework/src/agent_framework/observability/__pycache__/__init__.cpython-313.pyc b/libs/agent_framework/src/agent_framework/observability/__pycache__/__init__.cpython-313.pyc index 234770783c161bf3802015a4ba47010e74e6b0e7..c9dd2ea96911f57e7f4495ddc7e62b11aa6fb468 100644 GIT binary patch delta 64 zcmcb^^_YwMGcPX}0}!key|$4%l0`jNKR2&LKSkd+*fTz$C_gJTxujS>E455NF+DY} SB)%Xgu_P_OD0gxT%MAdS$QE}1 delta 57 zcmaFNb%%@lGcPX}0}xc)SiO-ul0_j+KR2&LKP9mwQ9m)Q+|WWlF+DY}BtESuF*mh5 LzbJchH_HtG7yA?v diff --git a/libs/agent_framework/src/agent_framework/observability/__pycache__/code_mapper.cpython-313.pyc b/libs/agent_framework/src/agent_framework/observability/__pycache__/code_mapper.cpython-313.pyc index 45c14f9faa6f5972dbfd57f23aeaf845c8c655e4..3da42594446c1d4b1fcc4d92fffadd0d31cabaa5 100644 GIT binary patch delta 66 zcmdnEoN>o;M()qNyj%=Guuk;aM((Su>IM3_c_sQO`o6)Q@c~8oS*gh-#rj#PW%`Nf Vsd**w1v!Z&Y57IDo7gt`0s!j&7oY$D delta 60 zcmdn7oN?oFM()qNyj%=GP- Pspa`a*_+wfHu?epbl4R= diff --git a/libs/agent_framework/src/agent_framework/observability/__pycache__/context.cpython-313.pyc b/libs/agent_framework/src/agent_framework/observability/__pycache__/context.cpython-313.pyc index 209d6224e2958248585bee1e5dbb5b600300bdce..2aa7a9d28cc94eaa7d94ddbe488bf1e1e8c5ee82 100644 GIT binary patch delta 65 zcmX?NdD@cuGcPX}0}!key|$72G@E*ker{fgeu}b>KSU)SZOg}L_ zHLoPTASbaTEx#ytvo9kj6QkzlaArP6#^T9oEINz=lixEIO=e|nWC`Z9WSQK-D$B?< zc^Rvw{w?-!#~?pXKX*;0B1xcSw^(yh%TjZSq=0NqmLeV?RU`}|6hMUHzo2Vq-jL$LPeua?qX) z$SwkTs)!RvXtIHgzQtTzQdFccc`ut9qr&7TY_5z-leO4=ncSErSF)$^x-orX;AC`T JDiQ!{0RUC#NC5x< delta 218 zcmZ1}@P?oFGcPX}0}xc+Se@mzkyn9HAx}RyuS7p3u_RGHF|FLtLO(G*HLoN-ttc@! zwLHHldvgdQCllk!&2h|pjEtWr=d$Qb{>oT9nTNHJ$&z{UL{?cw&dKXpHD!w=fyNd| z0|`x*A|4Q17(^(72&KvFY}SmWlfN;WPp)D!(YnB=bb+trI!DQ6j*_26svspGR~2yr z2~9Sz##_wAB}GMwlYg BIhX(d diff --git a/libs/agent_framework/src/agent_framework/observability/__pycache__/ic_events.cpython-313.pyc b/libs/agent_framework/src/agent_framework/observability/__pycache__/ic_events.cpython-313.pyc index 5115402d3ac795880665ec38e49fbd2583542d8f..f9c9fba2255c4a3f1a5dcdc9fa0d232599dc8fa6 100644 GIT binary patch delta 64 zcmcc3@`#1|GcPX}0}!key|$5i5~F&aer{fgeu}8YNk|+U8R(gO{LnT5CNmF%6ilD8~ZEK7PWYaE%vTfJdr4bL7 zgsTUW30M6SjQ#^AT)Y{*Zsg$6gacX)^yZrujdS?E_uhVQ-jAK5$j4~3H82nXJbwFI z#h~w^=gGv=c(vxoOYyY1xVFse6}#wr@rvDuTV=cEuepxpuh)51+$OIE!kv&-ZbTPHeAWpom-vhC|Epi?&jvK92Y){avjvq~Pri!^PQ4 z=JI54O}u8q&8dV_FItY5oci}guE;YHPQSx090R22efASzgDx@jinK(L7HEc^NXpV5 zUBaMAbF?MByp%kqtMs?@R_R%K+mk!k(_#cWRV~+@=JkeM3VK}2^N>}mShQUqt=>m> zvzf)rf=&ZvYqM4gLXO?A9bFZ3Z1OtCg+aiq+K#U9erfk`+uL@0K7O2+7&#RmSh@KNV4kKZk{k_clR8Hzb1-`_hb8l5 zL1tM-&dK`B&Rm*|w^*_>^HMa~CtqdJ(7wf-o?4>GQp5u^=@wg2YH?{!Ns%y!!(NbB znUkNGQp^J6DFDG_O;&xD5+G-CENi;a1wN$W0arV#pcA3&-jsnnKhqr@)b5iDK(HH0T96pByMro d{#@KR2&LKSkd+*fTz$C_gJTxujS>E455NF+DY} TB)%Xgu_P_OD0g!f^J9Jhve6cx delta 58 zcmcbjc2`$#KR2&LKP9mwQ9m)Q+|WWlF+DY}BtESuF*mh5 MzbJciA@gH?0566VJOBUy diff --git a/libs/agent_framework/src/agent_framework/observability/__pycache__/llm_advisors.cpython-313.pyc b/libs/agent_framework/src/agent_framework/observability/__pycache__/llm_advisors.cpython-313.pyc index 06486b4a86b134a53ed8b44a4884e9b77984b90f..732d55a82ef0dc6535bb911ab2315c9404645557 100644 GIT binary patch delta 65 zcmaDX_DYQVGcPX}0}!key|$5i5uE455NF+DY} TB)%Xgu_P_OD0g!%lfNJUsNEIo delta 58 zcmX@CzDJ$=GcPX}0}xc+SiOJ1HeeKQTQu VuOvRLC^0v+JijP=^8@BXA^^l&7eoL6 diff --git a/libs/agent_framework/src/agent_framework/observability/__pycache__/observer.cpython-313.pyc b/libs/agent_framework/src/agent_framework/observability/__pycache__/observer.cpython-313.pyc index d70b01393545aeb330f750328b5193ac39efeaab..cf83357d2c250edb21b6c55cb90dfe1b693411cb 100644 GIT binary patch delta 65 zcmaE?{!pF!GcPX}0}!key|$5iA+vg}er{fgeu}%rzFX delta 67 zcmaE;{#c#+GcPX}0}!a2uHDGJkXbWdKR2&LKSkd+*fTz$C_gJTxujS>J1HeeKQTQu VuOvRLC^0v+JijP=^JQi}0RY>k7Tf>; diff --git a/libs/agent_framework/src/agent_framework/observability/__pycache__/otel.cpython-313.pyc b/libs/agent_framework/src/agent_framework/observability/__pycache__/otel.cpython-313.pyc index 4e40e8bad52122875ad3c82ce385dee26c1b4148..c59a7a7e95c24ed528b380a9bb8fe857d4a52e4a 100644 GIT binary patch delta 65 zcmdlhbwrB$GcPX}0}!key|$5i6`Ojder{fgeu}lQF delta 58 zcmX>iwO5M!GcPX}0}xc+SiO;Z6`Mkmer{fgeoA6VqJCmpxuJ!AVtQ&`NqkySVs2`A Meo^-3J8T(j05aYbO#lD@ diff --git a/libs/agent_framework/src/agent_framework/observability/__pycache__/severity_policy.cpython-313.pyc b/libs/agent_framework/src/agent_framework/observability/__pycache__/severity_policy.cpython-313.pyc new file mode 100644 index 0000000000000000000000000000000000000000..4709466f53469e996f55825d050ea25deca02d6b GIT binary patch literal 3259 zcmcf@OKjZ6b;$jY+O>Dp$g&I-Q5Z|Ivv#~|pfZfsk`vpC70Z_Fic)Mz8xdS`w4%f% z*F&!4T{Ml07D$R7qDuhhCIJQHoGKJKB&Ry3D5r3}Kxq(e(4eQ>)Cz6UTi2$+C7n@HR?bRdv5y+W`h;0I;k&}_irWlhC~f>ohF7uc`` zLoQ(}SC*@~DXW$s6D(jIg8^90CdN%t0^N$NEMTFeSr)cl7jUTzW|VNrBvpZ6pUY4M zqe)A!O*G)wo3aek7FJ|pXhsn%`=0tL!+33~Y|Dx+TNW%LSB&Z;eB<-PtbuibKmAW6 zSnLb{@G;6G!a$r@ks*99WTad2)+F5*v7hWB_$qK=RxFCj@KQ?2L}J|ao?E3zK!q$O!yBbKde1~yFCj#xJF z04p1CN*fu%)st+YsTBWGY%t*9umEpC@4Dib-IwVRi%owSeG1+pJfP0WX zQBPQ%FnxgjoJ{?4^jUY$!;ufg)q!8n{4v@?Izqbf4C|%B1d@EudF`!r;6X1+J>+pg z5)mqw9EZt^LpD^1p#)b2(J#FZG^{(nkJ6CNG64Hy3Jo!@1+WT~^a@@Gb|=C_2=?hG zym$thV)k;LM+P$$*@YdZ@^`)8% zeNul4798xCwvbj#+(Igtd88*N zPuICm-v8%x2j}APeb)Ssr`vU7xt4JJbrQt!vZCNJ)aBX_M=237(Xs)>yeTY@5G^U?tjC&5UhJ)jiQ5yk^w_mKf^C|* z-x2_Ol*q+wjmy#w0jn9dmLhlsdJ7z2YH7tRmBAz{B#G3ZTGD!-t;PLjAX`g9OQ0;3 zP0g^u+Id;m3$n80al>z2zcO`eG7~55@FqdEHCHh4B1LEm=zHfSpe_>ITG8wUkH?1U zLzx)qf=zOQPOb9cmr{$q(*hj?-UsBR{I)@xuS$OZLe2m(1%K;XC>0OU^JMBn`=i<_ z`OO<{Qm7||M)Kst;b*DNk4leTdN}ed)#IiLzwKQsZY-@YZJutN`iXmL`t#x+mcCfp zdaZF;gq3r5x^Z#_$eg(XaB!Vfpgul~&C`s!TY<72;j z`O}v-Yi{OhJ#&@PwXI!rd#9c3bR#|E@G~L(1D6x(oDgU}(>OKsr1R;i>szP4Is5fl z=bgF6sN^UMPe&IV-E#Gny1ufFP?fpHLc>sEhFMs>&5p5uqpLBtrRb)Uz1c|La`;=J zqGgxssdGJR7dI}gUwUjedIvs_J?$N$9Nb!$`|6PM`cNZ%+2Jqm}~(1k+9gu_w0uC6Degc?Kf%9&-gE)Xu!}sAHRc*6hdEHai}_ lz5a85xz+33nf&^U4?8AtD%HAK^;f`qogHWYL79B>{tdbF-=P2i literal 0 HcmV?d00001 diff --git a/libs/agent_framework/src/agent_framework/observability/__pycache__/streaming_events.cpython-313.pyc b/libs/agent_framework/src/agent_framework/observability/__pycache__/streaming_events.cpython-313.pyc index 8051bfe12e06561df43f10cf9abb64e439b3bf5a..760da83161522a9a824551871f88478066f3d4a4 100644 GIT binary patch delta 65 zcmbQjH=B?9GcPX}0}!key|$6tfKk0vKR2&LKSkd+*fTz$C_gJTxujS>E455NF+DY} TB)%Xgu_P_OD0g!-<4#rphCmgi delta 58 zcmbQuH-(S;GcPX}0}xc+SiOz>% diff --git a/libs/agent_framework/src/agent_framework/observability/__pycache__/telemetry.cpython-313.pyc b/libs/agent_framework/src/agent_framework/observability/__pycache__/telemetry.cpython-313.pyc index d83b77675decafb10683ca5b706bbac76135ba67..4adef72318b6cedb7778ff3da83301a9784c72d1 100644 GIT binary patch delta 8391 zcmb_hd3;pW^?&!h*)my3GBeqi$wHFJMnWJPiwOisSQ5-*NFWL044H&%lkjE&1S!F# ziv1x~PqhWy&{m~V1xJ)$D{2)ji?x%Y4IM$i+SdN+&mU+jZLMw3xi1^&@AK;)zX$ow zdFPya?z#7#d(XZ19oZxO@d+v7v+!`EfRFF5m%6`m_;5tBKHD>+&*PiXK4XPk=UA!q zce~g7yfeDpn`SsW-5#G~px5c^=vVsu%k=HBtQ8KW#4HPy!(>f@(5>laidGJl!)5K* zn+_#9q7}UyA?rD1kf+H8PKC&katNo4vQY``lx$HTrS`!`)0dXZf?ep2>rE`UVDlN)B<;2@2q?)M|J%E8UVdeWzxZ@oaA4PR+Z9M5Pp^ z>m}I#E%R^A>i0N%tsTy;-a*A}-Q4BdfDT#}XP39j(@ARXE$iLG1Eg0tUxSu{ z+L}cR>`Q{$MU9OOjX{0QqQ%wr<*S1Frs~G}y80!5i>vc&a`tw$TbDaMogIT-x3$;3 z$=zFNt+z=*<7#K`pnH*`^ebbnN0T;5*^WP)5!Cm&y&!wPEUKUyKs{K4i@m*5OxR`Ln8xmRcAu0&P68$Qp=8N4{Z)4-*6_n zDiBt6){=mooH8A|7y?-{pv_vx-h(Htd)WI>o%R;n1rg~^_5lo}{|xE!j5hXLcp#%P zO{Z)dcTyd_iGfuLNU#fjpOM*v1I|ZvKCyNp{LSd~Db{V)`hJgFIY`_eAso=~kWlo* zn9AjG@fEI>)VN8mOLAKnG-TFT?jp%1Y;`va>=yC)qs+*jtIvk)4rt zA8~--I|$blAt!=Kkd_@A%H#a6r1f2RD|<~mRb&&D7UCRJX+G-5V17;+`w}+g1TwfY zdr0F!1TV!Kh5(NNwQa!^v>gM(Hbba@F|O<<-N#@}+VeTwzN8cqXD`7%1e-<;EzW(2 zxDSITw?UK`ypp?!Jq9D$@sN_YUhRhOlfn}S*R<(LcqlJjr=#i)z#Dm)vE;qNUHu_Z z&mv$w$L`Bd96m@48erv+%H zqHrmTge!$_h5nKlYLvl=87UUt&NIY(mtd422w%)7*PcT%%wJygTgHA3DKm?sM@Yu2 z5c%LL?}2k>uJ!|D=lSoM35*XdPV_cX;|PlvMwLeF4b} z8rc>YSn!sCCIODR8EO_5vnOEF!W-E(II(a5y{@RKWw*esHQlN;Q3)qQa|y!XA2qq` zcCalf3(1KRgbcwd+z%tmZT|ZfZP#n;`o?`NPzwUt)y?Pg{l?PQu0fChkQ(`u1*dy)n zauTP6#s&y1GsCMZ(p6WYI!$PBCAk!xT%ofHb`331^f;Fa@ZZbIH1;?-1&Zo(zEZ%L zT&VRJ?Gdi|0$jK;Hd;=#$IPbX1s^mt)>4CY4!%2+xQ?BD8t>T;cIfruL`SQgaYxQtQv+NN8+ zt`>Q`k7o-)ieQg`fd(^te&aOw&5b6r93yKdJG>#1JDlIRjAg@?#$x!g(adt-<;INU zRpajK1!o)$PD{c#r?HK?Hqj<)<=hI4*| zk?~U60xAX1;QRP!n5W89r&w*!jN8N!ti%DB9Kpz_EUIVRBlIyIK55KgdGN?!e8~Uj z;8xkSQ~ewBf2%!_6~Y7dj}n#J(21bd&37-~B-+sK?o^!Z?snL|dI{7wB@`VHl{A#7 z**%A0rWX}bvkWH)ZA_}Nv+N3>jHyw(Y8Pxc? z`rHa_gO$HSMso%;!;g>ZhNI0bW=g3+{lK8Bx68Xh36MA)(%0l``3?u_*JO)2=HI+V!*pXS_AP5ub>y&; z4Nt61(;1QUCPC!W7Pz?92p_La(BDa{0)s!iWu3^@LT}rLg?Yu#&OI>qXxW*(1^e}Z z)vcqeT_dYqfsXz&tNTwH1A{}C1!0-ETD&3%F-;;gt?Qn?ar5ZLZ;WjG21*)4yNHW? zgV;_A^b-inL@L}3FWfYHWyT||ds@$C<&S2~8OfS+B~+Ig9f-7Eju0Z_N2X<-jf@|S z%pQr%ek%OX&F@4mJZp;o?%aFl1~SUdn99zYlSj>YBj&t7{td6j{4D9GN$;5JApopDUHt*@SZyDQ$_;`BzcOb({GATXpauoOqS{z9rqbQ&W%T}O0|$uU=RVGh@sYrQE|e=&)4 zE~YS|Q_GRQ6l-$kX)fiG&ZWE*SD5~T5YqV|lo1^!5j~CStq*F4@lfIM;mj%FVM;)= zWj!4m=%HVlAvkB*X9<`>c&Zg-CX362rOd;VnahkzjYgIxPF1L1 z(ev0?0*n^gF_~F~BB6PatgX;^^md4vZGp0%nPFeMNix_CaJb#1H{hx-wuHjz_G}gg zH@K5@vd+$0qTqM6sqlQc8G?6OGxYrf>B-|=i@WTxG>IkEr!kLu376r> z-7)`$?%@ZLAZ~ZWO=VICv&GjdA!xgQt>U`0ne#cvX@1WMnKJ* zl681OqJ*brC0?%{Eh$+9dGPRt%2@3b8&itIZ#U!(#|Ec)u}-DSH{=-TM>mHQJC(eX zO#U4q80EoB8N4aj>UIn`hkE;+?P^M!NMi~GwL(crp#WCQ1k~qB1i>bPbpA?$GJ>7- zIuEJ&N-vT8)P|cQJT9xJ04s5uN%h)wgF6>AjJpiq?n)b`s_6JR{;0<+84Cxet#bFe z``kWdsE~JT1g-_%O9+1ub_nMUC1*n;M?#YxwFC-RpGjN&HMbDIHl;n9`E2;1nXkG> zOno~IcXB#}&otrhVWprTs$iQ|?kt@Y!N|7tYnv&piQqyXinpWFHWIDxe@iR)Y-NalVE+giE=%b$%Y>aOhaoI9-%l7cHHfCL-q~mO?t3^iNuhbs74Slc^G#IGIibPG)dAD|M+sI;Euor}T_y z0~NsZ#OK8^|82dkMs^G?ZmMK1NZec^-X_4x&CcjTj3(5|ps;jNSZ2cOn^z4N6FYru zi$}6qBx@yV9s!+_>A){2*Uc8byW>-V&gjYq1f^7#-zO;a8bvTUJC4ySzoy`>ZlhOQ zCLztEDbufwc>H=`E(xj#7Qic8GO=ABZb`E&CdMLyKGIx5R2?J?tx&gx7QQXKb!Zlw z<9~6eO|M>~P{r8(Zc@IViXDf%Tgc+dTjsFS{$00tSS-yr+!6EJA}i_illA~a-B!jf zLEUX1$12xrY$UbKs1XP4w`Z^qVdw3Yc!+=f_Jh$}ckEh-TiXV=e6xoA9^U-sJT~ap z+;OwWcEFCE#fZ=CENQ&1gD00G>gu2#?{u9$pQ3z8HQq*!-AXXgzt=ckO-eh^tyodH z6;|G5X8+}P-}Qu8&xh@HD#-27rg_T9P8d_dQQ*ZtVeC$f6sImm9le9z4S(^k*%c$s zzs}~juC>Xl_}>kG3x2daR`*X@*1BNbt{DHt-J6Yg@NV9-iQNmo*yE^~LG~u&_9!}K zOH@x6^Qf7$#;ak=V}?gh3-KnKxet`R1vb8{uOrEN0w2NMWPF4uo-bsgcEgFiHXR?1 zYPh<0-uM}$a$hE%UmW|atPFPSOB3~y|M7i)(z3nqz5RJD+)eJBj^7BX)$b*Py!EO* ztPV3Gk1!s*4w64a@G!w#1g{Q3O$BNqmxA9gJ0bZ!PI|6Ywi5K4*DU@Q&Muf}rH| z3@LX)?GMw3zfV2&0|MU71}gV4!9n8vh~N=|iFPW_&?~jwW}4FCnZ&hHL27$Y*YEN= zy4sa;;ygsMhY2RTWUO8jGM^?1P13PC;qN~zVhf<)X&Ye*@FyQ|XuB!RO~*W1d@nmCLR-|BvSrEVM=N(rJK?xH{k!P;exPJ>Xw@cn-3{xUt|4&jX|3RI?$DEJ! zl*Xck@f%DlDcwN8hk-}Z5%}v*N?0Wnyo9%qe#c7(Sr)g&XWu_bS0MMeRYnxW6pq3{ zD1O-ze~=U?-jKsXUOz5%ylkDli(ZUsQ1Ia5`=*~$nGyodODF0X0@`yc&%mQEmsz;Z zF?#0|&n`cQk6+GYry%MT)9}~IQQc;kQd>W{%j*~*DnRCVo2j%-tgpXDo3Hp>doyZp z4R!VR_l|#dnJlI5dY7nXw@p+qsW8=nYO3)P!4A^ojhxifC^O;8D+$9VQHB@6X{7fw z0iWhXA=gR_?iC+5uAB6=H~+(=$(L-t9>!6Pi3BMG8j{8m@Oj45Wh%XT*O7RLU^@X% zK74KG>pkBI@I1bNq~!z^1eF9Yk_B3{rhG;CgkA}jpoVu4K6*93q(;;>vCkwy7k^pg z^yTH6Jndo@XmJI$Y{R`;D{e8b3dFjs;#&W_pQh3$rnc7>>j5owjYv>z&DX2nP40&C zugzn>gv8hD5-G~m4^Y=9w^A5>J%^p~KlS=DM*F2dA1_@+Q)jVFudd>KRCI(|!n^po zS)=CopaH*NI($R;wbO{2LDA>B?z>VI48M`h-hn6Ic(m?rv`BIF99i}gJWp_hfR7O0 zOI1;oU)OomQiWgy?s+qjf&bu}&#(qsvQ-b45XDb5$59E_i)v&9b$w26kGp+xaSe*S zJ=ZTjycEGXIB>#0%!83nU*2>+RW<73z$X_MkrD@528=A^yToDki)-c%gmNm83$jny+!mF#yAh%X>J@OWX)!$!JYLe`vAVrI>k1^JK1h_4)QF=k^b7!#LmOK z@f8WOb~~BPB^c>I+X&B(w^TnX^X@b~3HK8G8UeXn`zKtLG^P`9U6R`(pdzO_`YvML zPw)`I;{Z96qcf1aTR11*@U1NCCVVpvKF&GFF8a4vCC2^)+jEztZY1SR1nUvJB7&-F zlZbH_#Mp9_uZX-G-n5ya>qIy_kd>9D-Ala91ot6~X>>n4X3JCtNVWwVEl#2iY@+5Q z&Pzdh1E*nPUOD>)R_66(b0@YEcL#!3Mo{q=bc4bPq{D7oys6XUb5mk`N2^4Z5RW24s z`xnf5L2s~|9r5<~La{3W-k28;?Q^5x&iN*IV6KT>2mR~JB}tCxW|JT|=b#1tb3{*O zLsXJI!HT3K+L2^WwvEUGEm?NQvbtQBEcFvCpPaW!MI&5ESg4^m6 zv3dsPPfJO6Fl;Lgw@nuu;pDj^ynZ26g`1$eJ~~{-Il2)}B5QzwH{xJdeRz?rP;?lo zSs6o@!V6w0)IF9dIOjp0-Px4kj2UU2 zGTa)+TE&nPF|N28MzIz%jP3tE#`D*jB*mTy|7D-bvY>Rq9L5LKn)!3R+OrFFe3&N- z0**>#y&bTIHW)R$0M`82r`qrWv^o7BZh9%wlz4Ef*@K3}HFrT@^3lCNuNM zD?CZ@YSDr;^IsSJC9z9s#fZ!8x|Zchp~ zG{<8PLjC_oR$%AKa$&T8qXSzm3E7TI3WAl zIz1Ylm9(!R*O|=>aDy|g> z-Oe<27yQQQjQW;T^{ZAlceHs|Xh$KxF&~;5t>WJV|J{u;Q-BEKlUWTK$9N6Z%Wp0AeLY6PhGM^WH-TWOFz@AmP5{da}{iHx9i4P`p31ywaZG? zLA`8=?Tc0i3_^5Lf0X5Hbkc{>*8XVgKI5U=-jALMdz$|mxn301Zua#g!8nf%=KG&$ zc}4758qZFQH##zv6J=?L?IvCNSE zSeM?EqyIQtBzim}I!7To-?T)KKb}E4p9t!bZ2c!H>3ovKh|ZpZ^o10Yt4O|3NIDma z(w9c-KQ)rhr%{aPXo+YO^;;LvSv_kopR`g;n3kaePH7;7;a@yJvP*wNZnmJpc1sfc zYhE1Ox5AVrkJ?xiVR)~Qv7U-f9lXB6iW%0mB2}?72XjWi+3Pdl=o=;|*%7BKigieK z5pLd+0HsC~^vw(dwLMI6+NC1%%QV~PnDr~WeWQTri^jJen-1?f?$upCgXxzBlVMmL1&M+IpRDj8K+9T=W*0C zs2#~--4&SLG2WCutd2!8krzn?{`-kk(Qeq$84u6>ZyJ$1I#a}`I#|$1 z3vy$JI2#qSdBX*B0@M#k zLUj5dC|Xkw9rQO=O`m0By#lM5Cik+cB>Z?QCA~IMcx!50O{Mgr+cA|8&B#h{(5(lG2>3B9ZI6j^cokI=q6iunFz2rB08x0B_w{3bDSf34#t&e5( zaA5sJF^j>)_3qeg95qy@EY#|0>@&f!VL?w0v9pHu8b)<{$(L4bf?EUwCf&`h5u z6*}H)6R0g-Tm(%cpflH~6d><{S2ynS?euB05b|6JB^JLJ@XJRD8Kgz6mBaiV3wsIH z^kkZ+5u<{jlUiRx)O6V2b0ZVrN>3fj^UuDcNuMy%ABNpPI`@ub_;=z zU_BWhxwL9_;%$J2JvN1pN*Qe4Q#pJ(I)j~BckQypaF0aq6`CQ%2UXQlM z?Q84q`d0K$-usP?ZG*gh6P!E*?zqAqEi~@hHtLLzOt3FBYEy!V$Wz-zav<1AKo>_Z z?ykbJEo#%qi#uV;s};)A#C`^Dc{PXK0lQzFk`oGA36?k>+kR3TH52f|tJZjOM4Rd2`DOD?jv-t_LDqd@M-QAkE;uxPVtfBf8LyA423yPlVL`0 zdc`+1D137Hl#U7(E!e_G)xQ~}$!CFA>ZjnBy%Sjxoa`-O5BY!S-OqBkExzn7lP)h> z+$z78Q1aj`?1lGmgWO9Blvv2&`K%w7{_wV%NePQ7ui`(!EaK;aUizHKc~F0}+|0ju zJ?9jERO^K&j#_$Nr-9*{2+u+8@6T$ZF+6{$+$I69@x0AaGI5l6Bdu*>UELUMUhBDb zD{9{w(cInLL2rJ|^yn9AHad_FGCS6(F(#|1#}5fsq2?6>z9kO7B8CjgniX~(OYS+0 zD)`2fN$PtDc*sN{S0x7TiBBBYP5s&D#U9d>(N^&A#&3!-^chDWla$Vg!G*^6%nbT$ zSwiAAf-VBS1M#ZPD}Cs^S5DFbfA}2V^ zS1q03W*-Ri+|uImty|^M1hOsqn!PllD*l3NdoqJ(PpEp&Ep0xR>n&(J^`vJLDp009 zLoV(k2)zaK$>K*UeggWrais7yg5OCvjz(;Mw-AtL2IS()qM|bgM|_jt{reYKAyx07 z`?HA3qoyw-U`44yMnLIwdsljv4OL&Ld@sSkbqG$vlK1>QN2tl(5i>Nln0-9wdWp+L zq=Z~DIqLs9I9Ca-f6C9RTMgwmA7`o$AzRvOL4z*|;m8j51CRElMTE-1UU;+5GAZN& zQB;1&4lRqHy2DG*6zzFP>bK%!Q&oRCi-UFjWjF9b7Do+vA)||@#>-qhQi1SRkMD-= z)>eGy;d@#Mi8oR>biE1aTe>?}wRL#3*~B-(_x<@cesn%f-~5CeAnGCkUjlso_$VKM zd8ZQ%@1rgJBX|cuJAKd)&x!^Ggzrir|BRY(t%1c23WVQP$AvTVpnz~W-oRq`ME@NN CYkEfj diff --git a/libs/agent_framework/src/agent_framework/observability/__pycache__/token_cost.cpython-313.pyc b/libs/agent_framework/src/agent_framework/observability/__pycache__/token_cost.cpython-313.pyc index ed16a563b5cc70483263726324881f06980f2267..b170f72045536f9f9c7f3a67e9856f431ec8eb37 100644 GIT binary patch delta 65 zcmccP{MecMGcPX}0}!key|$6tj8i>dKR2&LKSkd+*fTz$C_gJTxujS>E455NF+DY} TB)%Xgu_P_OD0g!rXSD)KR2&LKP9mwQ9m)Q+|WWlF+DY}BtESuF*mh5 MzbJci24}Sd06;(#CIA2c diff --git a/libs/agent_framework/src/agent_framework/observability/__pycache__/workflow_events.cpython-313.pyc b/libs/agent_framework/src/agent_framework/observability/__pycache__/workflow_events.cpython-313.pyc index 48a7cf4658d188a4427c7e80364e794e9c89e884..e73bf1a51bebb0e9d901cd789068d80e242520d2 100644 GIT binary patch delta 65 zcmaDY`AL%dGcPX}0}!key|$6tmr=b$KR2&LKSkd+*fTz$C_gJTxujS>E455NF+DY} TB)%Xgu_P_OD0g!OV=*@XygwFV delta 58 zcmew)`C5|uGcPX}0}xc+SiOE455NF+DY} TB)%Xgu_P_OD0lNl&bLeeoD&w5 delta 67 zcmbOuIZu-NGcPX}0}yDKuHDF8%c+^DpPN^rpQ7&@>=_?Wl%JKFTvDu`os^QKpO~JS VR}!CAl$e`Zo?n!`c|GS_CIG4y7QO%g diff --git a/libs/agent_framework/src/agent_framework/persistence/__pycache__/__init__.cpython-313.pyc b/libs/agent_framework/src/agent_framework/persistence/__pycache__/__init__.cpython-313.pyc index 1b0e5f16ec5d71df7d4d32ff1630d21f29e04de0..88ee9ecb6cf13cbd158404312848039f5477c67f 100644 GIT binary patch delta 62 zcmX@gc!rVtGcPX}0}!key*82CSUp=mH?KrLMc+5rGd`dwKPxr4q*y;IwM;)TJvFZ+ Qz91*DBrU%vcVb*R0ANHFP5=M^ delta 55 zcmX@Zc$AU*GcPX}0}xc+SUr*3SRq9}H?KrLC9xz?KQXP`&_X{kJvFZ+KCLJ*H?=&! JD0^aRIsoNq66yc| diff --git a/libs/agent_framework/src/agent_framework/persistence/__pycache__/oracle_store.cpython-313.pyc b/libs/agent_framework/src/agent_framework/persistence/__pycache__/oracle_store.cpython-313.pyc index e5661200175138ae96a5615ac36feef0af2b199f..3f53e2e3349822db11e227de05337f7283b33ee8 100644 GIT binary patch delta 67 zcmccjjOorZChpI?yj%=Guuk;aMs9W{^?d!@yb}Esecxcu_<*APtkmR^V*RYtGX2E# V)Vz}Tf}F&XwEUvn&DKoH8vzhh7p(vQ delta 69 zcmccfjOpGpChpI?yj%=GplP~xBR4yfW}$v=UWtB+zHhK+d_YltR%&udv3_<^N|JtJ XdTL%td|FXrZfbdcQTAp_CgqI)A?+8~ diff --git a/libs/agent_framework/src/agent_framework/persistence/__pycache__/sqlite_store.cpython-313.pyc b/libs/agent_framework/src/agent_framework/persistence/__pycache__/sqlite_store.cpython-313.pyc index 839ae1fb8b45a0eeaad2deab03246d37fcd4dd28..4a50682c7936f05c533353d38b1895832714f7d6 100644 GIT binary patch delta 65 zcmbPII=htnGcPX}0}!key|$4%g;70UKR2&LKSkd+*fTz$C_gJTxujS>E455NF+DY} TB)%Xgu_P_OD0g!|Bda9E455NF+DY} SB)%Xgu_P_OD0i|sVEv|pPN^rpORRTsGpLbY-p~Zn4X$f5}#I-n44Oj LUz9!BjE455NF+DY} SB)%Xgu_P_OD0i|gQ#Al^*cBQ8 delta 66 zcmdnSx`UPbGcPX}0}yDKuHDGZ$)uU8pPN^rpQ7&@>=_?Wl%JKFTvDu`os^QKpO~JS UR}!CAl$e`Zo?nzb*_x>u0DapPL;wH) diff --git a/libs/agent_framework/src/agent_framework/rag/__pycache__/embedding_provider.cpython-313.pyc b/libs/agent_framework/src/agent_framework/rag/__pycache__/embedding_provider.cpython-313.pyc index 775e6dc7c3b53a22ff77d271d5ab661f8cd34d34..ebf6ab4170a8799736f24931c1660b98cc15ba1c 100644 GIT binary patch delta 65 zcmaEE^wfy^GcPX}0}!key|$6tmr*@eKR2&LKSkd+*fTz$C_gJTxujS>E455NF+DY} TB)%Xgu_P_OD0g!s<1=vp#5flO delta 67 zcmaEA^xTO1GcPX}0}yDKuHDG(%cz;JpPN^rpQ7&@>=_?Wl%JKFTvDu`os^QKpO~JS VR}!CAl$e`Zo?n!`xt{TvH~`ac7cKw* diff --git a/libs/agent_framework/src/agent_framework/rag/__pycache__/graph_store.cpython-313.pyc b/libs/agent_framework/src/agent_framework/rag/__pycache__/graph_store.cpython-313.pyc index d629751d358ee641435b45dafa6a4cb5f5677408..9fc473278d4ef586c1c032f1ca2ffadd760dbeec 100644 GIT binary patch delta 65 zcmeCu?$GA`%*)Hg00iqquWjV^W>inp&&?~*Pto@c_KXiG%FjwoE-BW}N-fh*Oi#@# Ti7&`WEJ@2R%H3Sg$Snc@j`I~$ delta 67 zcmeCs?$YM|%*)Hg00bJQYd3OxGiqk&=jN5@r|A0zd&UP8E455NF+DY} TB)%Xgu_P_OD0j0f^CevXrX&_d delta 67 zcmbQ5G(Cy?GcPX}0}yDKuHDEj$gG*HpPN^rpQ7&@>=_?Wl%JKFTvDu`os^QKpO~JS VR}!CAl$e`Zo?n!`*_rv0E&#Mo7H|Ln diff --git a/libs/agent_framework/src/agent_framework/rag/__pycache__/rag_service.cpython-313.pyc b/libs/agent_framework/src/agent_framework/rag/__pycache__/rag_service.cpython-313.pyc index 0aa1f22415058256960ebf64e434480aed594c81..2cd346277cd143efd5a5e10176e15f3970f1434c 100644 GIT binary patch delta 70 zcmaD5(jChEnU|M~0SMNKUfam+%A%8|pPN^rpQ7&@>=_?Wl%JKFTvDu`m0G5sn4X$f Y5?_#$Sdx}slpCL)oT8UTVH2!a3r diff --git a/libs/agent_framework/src/agent_framework/rag/__pycache__/vector_store.cpython-313.pyc b/libs/agent_framework/src/agent_framework/rag/__pycache__/vector_store.cpython-313.pyc index eb077b66ae46653cc8a7457803a67c58fb82efc5..f40a11a794fc5e11ddf48f9e27583d0ea0d2c420 100644 GIT binary patch delta 67 zcmcaKk@3PrM()qNyj%=Guuk;aM(*cK>goEqc_sQO`o6)Q@c~8oS*gh-#rj#PW%`Nf Wsd**w1v!Z&Y57IDo28kzy8-|P+ZW0J delta 69 zcmcaGk@3<*M()qNyj%=GpkcapBlmMA%}o8=yb}Esecxcu_<*APtkmR^V*Tu-lqCJc X^whkP__U(L+|=^?qU_C*%-dZ77-kpr diff --git a/libs/agent_framework/src/agent_framework/repositories/__pycache__/__init__.cpython-313.pyc b/libs/agent_framework/src/agent_framework/repositories/__pycache__/__init__.cpython-313.pyc index 641c1b4edc5ad74a4f0c57ebf3d14ff9433bb13c..67f5c17efa30c357266653556e3111cb7d8cd7cb 100644 GIT binary patch delta 62 zcmX@lc$Sg-GcPX}0}!key*82CSUpESH?KrLMc+5rGd`dwKPxr4q*y;IwM;)TJvFZ+ Qz91*DBrU%vcVc=50Anc?WB>pF delta 64 zcmX@hc%G5_GcPX}0}yDKuARtjteK~un^&TrqVF5*86QxTpOu=_?Wl%JKFTvDu`m0G5sn4X$f T5?_#$Sdx}sl)E{QNnaiSuOAiD delta 67 zcmez8)ZonhnU|M~0SGiq*KXvNWzwwB&&?~*Pto@c_KXiG%FjwoE-BW}PD)AAPfSnE VD~V4lO3Y0y&o9c}?9Zex4*=zFJ delta 57 zcmeyt@{xu6GcPX}0}xc*SiO<^6r)0der{fgeoA6VqJCmpxuJ!AVtQ&`NqkySVs2`A Leo^-1Ka4d1FU=IJ diff --git a/libs/agent_framework/src/agent_framework/routing/__pycache__/config_loader.cpython-313.pyc b/libs/agent_framework/src/agent_framework/routing/__pycache__/config_loader.cpython-313.pyc index 0c65b288db96b50bb02d2372e27b6770fa149896..36d54f00069d4e7cfbf2aed04a227aa6da9e1db1 100644 GIT binary patch delta 65 zcmaDY@=1jIGcPX}0}!key|$5iCZl?eer{fgeu}+!ZGcPX}0}xc*SiO;ZCZj^Cer{fgeoA6VqJCmpxuJ!AVtQ&`NqkySVs2`A Meo^-3(~QeG074iPwg3PC diff --git a/libs/agent_framework/src/agent_framework/routing/__pycache__/continuity.cpython-313.pyc b/libs/agent_framework/src/agent_framework/routing/__pycache__/continuity.cpython-313.pyc index d5cc794d7286cc74e2e6ef7fbae210470d8b66b7..ad05f31bab48ee832b3f951d3d8c767356a87714 100644 GIT binary patch delta 3144 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 delta 16015 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 TB)%Xgu_P_OD0g!pvpO39w7C_; delta 58 zcmew_^h1dIGcPX}0}xc*SiO;3jaea1KR2&LKP9mwQ9m)Q+|WWlF+DY}BtESuF*mh5 MzbJci1hYCD05OddVE_OC diff --git a/libs/agent_framework/src/agent_framework/routing/__pycache__/multi_intent.cpython-313.pyc b/libs/agent_framework/src/agent_framework/routing/__pycache__/multi_intent.cpython-313.pyc index 03882ae1716552127ae1686d207d426dba72e01f..fd2e381d7ac63bdd7eed62b719c3b89b9308ebd2 100644 GIT binary patch delta 7135 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 delta 6158 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 TB)%Xgu_P_OD0j0y^L}dp;9?gS delta 58 zcmexb`>vMzGcPX}0}xc*SiO;(g;^m@KR2&LKP9mwQ9m)Q+|WWlF+DY}BtESuF*mh5 MzbJdN8S{Q?09c+Bv;Y7A diff --git a/libs/agent_framework/src/agent_framework/routing/continuity.py b/libs/agent_framework/src/agent_framework/routing/continuity.py index 34d1cd6..05f0fe2 100644 --- a/libs/agent_framework/src/agent_framework/routing/continuity.py +++ b/libs/agent_framework/src/agent_framework/routing/continuity.py @@ -1,5 +1,7 @@ from __future__ import annotations +from agent_framework.decisions import invoke as decision_invoke, choice + from agent_framework.llm.structured_output import parse_json_object import json @@ -293,11 +295,13 @@ class SemanticRouteContinuity: "recent_history": history, "current_message": text, } - answer = await self.llm.ainvoke( + answer = await decision_invoke(self.llm, [ {"role": "system", "content": system}, {"role": "user", "content": json.dumps(payload, ensure_ascii=False)}, ], + decision_point='route_continuity', + decision_questions=[choice("decision", ["CONTINUE", "ROUTE", "HUMAN_HANDOFF", "END_SESSION"])], profile_name=self.profile_name, component_name="route_continuity", generation_name="llm.route_continuity", diff --git a/libs/agent_framework/src/agent_framework/routing/enterprise_router.py b/libs/agent_framework/src/agent_framework/routing/enterprise_router.py index 91f6846..a44a6da 100644 --- a/libs/agent_framework/src/agent_framework/routing/enterprise_router.py +++ b/libs/agent_framework/src/agent_framework/routing/enterprise_router.py @@ -1,5 +1,8 @@ from __future__ import annotations +from agent_framework.decisions import invoke as decision_invoke, choice +from agent_framework.decisions.client import multi_intent as decide_multi_intent + import json import logging import re @@ -228,11 +231,14 @@ class EnterpriseRouter: f"opções permitidas, sem explicação adicional: {json.dumps(protocol_options, ensure_ascii=False)}." ) try: - answer = await self.llm.ainvoke( + answer = await decision_invoke(self.llm, [ {"role": "system", "content": rendered + protocol}, {"role": "user", "content": str(text or "")}, ], + decision_point=("transaction_confirmation" if component_name == "transaction.confirmation" else "workflow_expected_input"), + decision_questions=[choice("value", protocol_options + ["__unmatched__"], "Choose an allowed option only when the ENTIRE message fits the supplied policy; otherwise __unmatched__.")], + decision_render=lambda d: d["value"], profile_name=profile_name, component_name=component_name, generation_name=generation_name, @@ -314,11 +320,14 @@ class EnterpriseRouter: "à pergunta pendente, admitindo somente cortesia sem nova demanda." ) try: - answer = await self.llm.ainvoke( + answer = await decision_invoke(self.llm, [ {"role": "system", "content": prompt}, {"role": "user", "content": str(text or "")}, ], + decision_point='workflow_reentry', + decision_questions=[choice("decision", ["REENTER", "RESUME"])], + decision_render=lambda d: d["decision"], profile_name="router", component_name="workflow.expected_input.precedence", generation_name="workflow.expected_input.contextual_reentry_precedence", @@ -1145,13 +1154,15 @@ class EnterpriseRouter: "válido: {\"relevance\":\"RELEVANT|NOT_RELEVANT\",\"confidence\":0.0,\"reason\":\"...\"}." ) try: - answer = await self.llm.ainvoke( + answer = await decision_invoke(self.llm, [ {"role": "system", "content": system}, {"role": "user", "content": json.dumps(payload, ensure_ascii=False)}, ], temperature=0.0, fallback_max_tokens=256, + decision_point='transaction_parameter_relevance', + decision_questions=[choice("relevance", ["RELEVANT", "NOT_RELEVANT"])], profile_name="router", component_name="router.transaction_parameter_relevance", generation_name="llm.transaction_parameter_relevance", @@ -1428,13 +1439,16 @@ class EnterpriseRouter: "session_context": (state.get("context") or {}).get("session", {}), } try: - answer = await self.llm.ainvoke( + answer = await decision_invoke(self.llm, [ {"role": "system", "content": system}, {"role": "user", "content": json.dumps(user, ensure_ascii=False)}, ], temperature=0.0, fallback_max_tokens=512, + decision_point='transaction_intent_shift', + decision_questions=[choice("decision", ["CONTINUE", "ABANDON"] if abandon_only else ["CONTINUE", "REPLACE", "SHIFT", "ABANDON"]), choice("intent", [i.name for i in allowed] + ["__none__"], "Select the explicitly requested target intent, or __none__ for no new target.")], + decision_render=lambda d: json.dumps({**d, "intent": None if d["intent"] == "__none__" else d["intent"], "agent": self._agent_for_intent(d["intent"])}), profile_name="router", component_name="router", generation_name="llm.transaction_intent_shift", @@ -1774,11 +1788,13 @@ class EnterpriseRouter: "tool_name": active_tx.get("tool_name"), } if active_tx else None), } - answer = await self.llm.ainvoke( + answer = await decide_multi_intent(self.llm, [ {"role": "system", "content": system}, {"role": "user", "content": json.dumps(payload, ensure_ascii=False)}, ], + intents=allowed, + text=text, temperature=0.0, fallback_max_tokens=768, profile_name="router", @@ -1830,13 +1846,15 @@ class EnterpriseRouter: "session_context": ({} if state.get("operational_context_reset") else (state.get("context") or {}).get("session", {})), "transaction_context": transaction_context, } - answer = await self.llm.ainvoke( + answer = await decision_invoke(self.llm, [ {"role": "system", "content": system}, {"role": "user", "content": json.dumps(user, ensure_ascii=False)}, ], temperature=0.0, fallback_max_tokens=512, + decision_point='router', + decision_questions=[choice("intent", [i.name for i in allowed] + ["fallback"])], profile_name="router", component_name="router", generation_name="llm.router", diff --git a/libs/agent_framework/src/agent_framework/runtime/__pycache__/__init__.cpython-313.pyc b/libs/agent_framework/src/agent_framework/runtime/__pycache__/__init__.cpython-313.pyc index 91b827a38850646e4792f72375a2ea751fc1a9b6..29b6f0994f1c282a5ee53425c934f7d7b721f1df 100644 GIT binary patch delta 62 zcmX@cbe4(xGcPX}0}!key*811t$MnCZeEFgioS2KXM8|WepYI7NwI!bYMFjwdTL%t Qd_hiPNm_nU?!+5;0Cs^ENdN!< delta 55 zcmX@hbc~7nGcPX}0}xc*SUr(@twMr+ZeEFgN@7W(eqvg=p@n{8dTL%td|FXrZfbdc JQTD|9c>wr&6XpN_ diff --git a/libs/agent_framework/src/agent_framework/runtime/__pycache__/agent_runtime.cpython-313.pyc b/libs/agent_framework/src/agent_framework/runtime/__pycache__/agent_runtime.cpython-313.pyc index e75e35c494433ad0769f477a6d1a95e25c2c9ef2..07cfc717176b29638efa71fbd1b91b15e8c442da 100644 GIT binary patch delta 30369 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 delta 29789 zcmaJ~34GMW_0RlvvpF_*NJ2;;OE?1|oZ-GAB-{ZF;K8x1$pVoi8)p-ac&ul^i;BPE zv{saVsR9ZWO?9i)3LgE}wrWsY@aF|;>tC^mRXp(E|GsZF``ZLsJ|7;lbG&))&6_uG z-pu^?`b^3bU!|mdk(!zuM}M9JX!2c%7MEch`FKKSFOrGnOZf+MpFJ*43Or4u1)8?kj zbk1|l%b1%fGv{W>EdHG^FO)sEhwL#oN9N4UmARamI4^H*PubHGx7>BnC=lEAPjTGx zUgbnI{>XwFM@`a*xZ!bQoU(9aTut&iA$!xmZu+;+^5o*Unv|N<38H5lrP6xE)ufjj zx@EckC$2&kabX4(W_A`z59ei3UUoFE?;1x*kB`x;L|ATLQ&XVD*HRy7YB$CGh8Wa7 z+IgE08ST%;D`V(DswD>i6a(}F=nvo_U?tZF>zjftzNT8gOfs)e^oUaPSBXPC{^5;H zEyL@4ExzHt)f+~RAMRV@Z))+bmcB;+hJajWewpYK6Wf<2^>Qw-QBDKi=>U@fCJ`u! z=Z@rXWN=L;0~C}PawKw5HwamHJaVl0OzLE@sQpapa4~8E*{M;y0gq;V1W!q^%8&~0OJ5=m>;JXz4+cRz#E6wSdxAyl?xs~K?^aq0^qF^Ua$hLVpnK>}uhnzG5*To&p z>2-VZ(cvSvIPXZ46U;~b`R1kBSC|K~3aS=U1fjWSYtG9Z>8YV#C5Gi}s1LSCh^s^}-XP{78s3}h z5gW~Ca(ji)kOl;mSP84?hX+53P~eo1sa7j!Pg};Iu5uVuk|?i;R$+Rfc}%q3O!KA{ z@JtU-wG67aEZDM2mU@WB6)Q?o)&p9tv59R0BXWKs7)&ja-C0 zfR*MGd84#OE^0rS*P1AD7l@<^vNz#+rLut!V+p;mn;%H3f*8>KLv1ZZ0X<|#e zcVMeXz&KUQp=v~;(Zl>~(1jy0%W14a^bb!>>WVFe2N`SvU=e~&0ugPwa_|)KYx9x8 zrKELl4<0Tm+EYr7I6@U@FdEDN&xAE3(Uuljk{UzOO~7?C0PtIhb^g`9)`pg#Avc?K!xj^_PY#W@M{7=7Xb_!Px5=qOI#LmZ#Pel8_<5L{9Z9~7ya(+CXu^o3g~|1LsTRmM*S{W zo*6e(d|-Y&?ib<_vt-QaQSw|AYh(kH`kzodG-0UwQ(*rsz$5L)CVVM;ptpLld;nQI zAP-WCY){(dt+Z;A<@Ng4lT4U7vO*hB8n5N!1mW69>_qebKzaG(3URu9!{q0jv-hEz zEvv3SNk^kIOwT&j&G?qqW-_I)u2wuLZeviknAcbI7Ukys6+>LSfIVlvT2U%e+rO_^ z;t28F>55wJrq(5H8^7heJP>Hmz1$9>o&$R46~RE06<^od*c{Y+-GQ>F(Ks^Zv?2#d z>-DIcD18Af-K*=H*7#+!tZykUO_`ok;27u`0djPNw zY%%0PvwGo0ecJH*Zva0d5Cn6q^%2eg!@?Mj8zxM%Y1!aV zH)6r8EgCDnmHZj0B@`7M+0=#x(z_@#RwDVKE#!LyHCvcY@*98-0B~t#*Voa6t6yF3 z4|?H-u5JiyAZm#h`2&>)-2|di_Dm;lpltcYqPhJi%a;i4M;!VE`4OjA{N4o~Wrq30 z%08o+dYk6qD8ZOo@r2$l_X?(<)4@PNZ*#o2x7pu2QfxPudgqg%$%$)!+MDGJLB!Qs zf(h{ANO7kcz?dKiBobI0S#fNwkLV3**$U-G{Uie9hOm%4C{IIfIsx*d0?qZcR(znD z%)aFcwgkw9lG)%Zm`I>g4kUzCbr*|Yn!l_2hNi-!{`Pp0X8P9+3PHkER&sy_hqn(w zy(qFYSOg@{FU}7rOj~U!YT9%08yW(5H ztZTiILKZIRhGji@4wFgt!EPru%fNb?J5ru7ufAbe&M1g)G{D$SLCP`aA8y!4E62DS zi~CNdT?a1+-$qC*gc&H(Zg11?!IwV@pLM(5~P2FB(rVBQ*QxDabm}HXn>e(~W|;zy;x0$qnRRHPvqNI%z3hX1?;1J3@XGt_D~G0K_F8b`tcA zIRy--0di1Y1mFZI9z6Ge4Ox|q7J7sMoE8Mh+Jr~Q-;BT^$I^__QE6`{q&>3W3;)AthUwBwb z3S(T~Qq&p-z`6`uVP#3*8t;{@e!0mTAS$KVyrs5mJnGy>#aimn64aO>s+k&c!HR2Ed~QsRs*H-&LZ>pjqB<%M5X*{lG1sxy0u7op;W0iZ=6;pY?WC zpuq)Z>h|K$B%r<#zc(Xw4W&pYSf-Gqycb{~z#)JU0OJ4x0K5(~piQi=4nm|r|-GfsLTMZ%K$c^W0$WfNQ)LZ zqTGy;V(2wHm_`&cA{7dfLr-fh;pbiRjvZ6TL3(S4sW+6B?Jf89cdpuq>PcE#>p==* z+KUt;J`_a^k}XGbpqZ9*-m5`QRuajCr&Ulsh~F+5p!p=Nc-h)O>-=c*n_o>JZbt1| zBdqp&cI|T)?4fGawB%9`m4uwMvY}Bvgr6Ht-y;*rxZV56#o}r6OM3h5&bPF}L5`6Vd>jUfjau;ekf$brH`{-v$ku7Ms59J;dJ%LmhU_Zcb2=H(R z8rG8`gKS{eY8zVX=qJxd46=L@l^+Fo3@uVtttR`?8P<|dp@4nuKcF!%xqpWwG#? z&xF`xrabEt!fblBq1;CH12vOB0J`%MV_tQzkGbaHC~>WM&q0g2Z#~p2)y=ENc8EH|yyulFagBNWmEo@4$mlS0 zUv0~{23=>8t0=PpI?SD~<`2lBq?PSoz1mNn!FoRn!`nnbSec7Tc>q1lcVC?~&~Dxf znOuzRM3t4a+E?G;C7-HEerL|>$QQj#e@C&48|*Xh=*TOw+j7@1w6X|T;8YVO&v(c| zyAGH1pc1k%X{eQ9UU+!MWau$%qFheK*iRopZVbHBYD4W6`2`t6q(<@K3Z&TAMwWZNd*O{1xgl69$7u+ zKwe@lFnX$0#YUp}={u>j+0K-KGFD|V?NMOLcoeX@&?L4^AGo&M5tq^1($XNmpd5`G{R9(OB5VUC zY0dI4CW(jJfBr?HF$cwRDFBej#Yin7K(?ESxC9y8D`Z3jckMM2c7U)yK3yqZHHUw- zzEc%X%^_8M_N$d*dX!1RIvWTXYm}ib>qK<6$F37AzNr*%n!CPPLW=S3Hj&?+_3b-` z2a|_FdMD|hP8W%iR^sFaU*qL^Hn0ukWwLbb zIf!wmO*$C@vH^$a2Rj2+FY~+adzIV!|4w>&t-Tpyd!OpY(2JI2GoeAJ%% zgU2zeo2Idn-G-{nhdy|TQ8HJM^sCV)(LwB?%l2zTjrjKQ!=l--2y@WNf=}z!wY?N| zX{Zabt3i6ZE;@SbyfRD7E~x9YG4@2hNo{kA>|rh<%1Wi^y4Us$Z8p2Drs}X$REmUf zUc5Lg`u~}lwmHeZPdpRf+Om4sc-ll?2_jwrqpvczDkVV-8Di^^?H27oIaIgHWKydV zM7bEO?oJRi{^3s(#50E2qaI2YLqb?QwanNd1Z4dh#K>sd z*wjJ`n&hn(D59{rvyp<}MCDdsV)u~!#%n<|n#&mg(ajktO$_C{{CQAeKT)l>7%n=P zqYagnfrzNTE=Go28w*!3nLyMdp~<7}af?Y}nEJb09M=IswQG?vEc|1N_(^;SO)M8V z<;|@v*t#Qt8UgYX>))Kq2NFIsZK5jF#fab(`pH z!bd?coI3>N7UJAWphz(3-X?63aw0|S6I$^U;H|HdCsogEQ7Fc$@@#RTm>b@lE$$Mr zGe0~!NBqk<@m9!@N9hptUrh!CBu|-`)NSC^ z5o~RgEFBO;v*Ht=*CJAV3Pt|l1c;7(f*nYq=kqz0ebtq{L|=7XA*t*7@Dqh%xX7PC zbt!6{9#PCXuhtHEQ~1Z;;%i3=R_Q8vHKcTn62+o-C^{X_Wa{&LNwJRlMt>R2Dn19W zQrU^>#3(~(993y~J$}AK-M00ZGouX4<>G}4=X)zJshqK7apg=N49l&_&|WI^l584x z{3cI<{lLN58G2&uhe%*F^sZ_jQm9F1NaWC+Z=z@^KY)r25E^UaYt$rm?-{ct+Jl-m z8F3DpORA`!=u^P^9-b~;BgU97m-G{}#NP1EeqvDSOb|+X#PlOA9|o@7Ah{YpHzQSn zt{r;&70u9ML%2tc%on+;??~YQQ2#o2LL%I98DdkmqJX(X*VV{%4e^7rT{vwCL}`$jP6n z^3h`GAg=!hVx}!Sb|`07&Rnvnawc)3E2zz*#kf>XV_lnJP3M?icFKp0>pntcpZCjcJB&rJZlbd&*Avi7&UwAthn zE4hrytzn(nAi8I)Wdfmru24M)pU%{S+`Ry| z0$>v_GYA8_^(BV(?vYEuT=q2VQQ@gK2z7ZF7zunx$=(OVt53%;G_;Si*SEei&@;Qd z$#8ii9trP;I3S*i)znwp;?D?m0Uii$Q3S6;9Ylbuj)J5k)r}tB0*JF ziIE}@-cTj>855)Ikm@n@OfGbaGHilCitTbzsnuI;og;dywmF3C0kv zZ|J5?U9?c4yo%`h-La9<#K8kS#~Y4v8#Op-}A(GYR*bA zco@P>VGy_V2t8ego}T;zy8r8BJLB@hp3J0=b8fdpiJTQb`}ulWh9oK@JPi z>7dlVRJB+16{A(NSM-^p#RU4kBoq{fWdh_Cz{guT4vr;r1e5}6G_K#Eh(!>u{^AuQ z`och4>2^ec?_b!#1}RkGDltg!Yx}BeDS)P~SVbPepTav=i9~k@GO3oI1Fe=EQaqER z`k*`g76p0`!4gJeZ_H>&TSsg>@x*dTnqITJ4Fk)4LEIID$_2sL!*V{6r%;!jJADtj z@1~ZCK#>B_RdzBJc`PrXwl#=cQu;j&;!2Si?$sy?(`==er&PsNVyUf@lGgrnms>u@ z&NdG`k*J;^bUGM3U;S{E=zFmPeS!IE`E^u^JYd~qcLt^30elbe1Hg{}unLkAk=SZ3 z5WcNiuNIT_ak;IwtZ1xqtd~$=Ek|2=U3FC^02ym4gsI2m7&=Wtr^k_EuM-1P(ob7C z4{EZgOYPxhkwWd{Vrq#?m2?1K#~VZ5dCJjh`8A@~tn&>=jQWC{G=Ow~41i1kHvub= zZVz2fCasQa)ic+KMJ`_Z%T?n{V@PVmC5Pr(BO_sXJse_k`08uL!NdYqU>$NokXPOX za-HB&sEap?t)prvgRBk<4+0>&ew?y!LcWfIo;xV3+Z_fq*q+KrEQJ@|34)ysKk*%j~ zfhyY~3eeZWGUoB@k>|^0Ji`!!8>!Y{H76@_#W32{lU=En0ZdV%h*j z7bY180sMmiwltU19jIizf#6UyZ>y;(Z?M#7cZg}?H8p&z@Y}I5^_#8YH|`1u=K_Gy zYRylDr-X&eQlCKF?TxI*9@M}JWUrj+z)vX@@TR(Ln;5Uk?i9WL8|s2>qIdRGh-(^w z7$ozy5ozxL$whX1#|=iDdHswb;r@4thXrnKC#(}qF8Vi-{!O@K=_Dejj`oF1;?=P+ zMvnSyt;otGQLIV6jh2}|_DfP7?}$WKOat@P_mi@49E3kUG)$%Y+i7aqcHs$G z#3q~QwuEJ6eW$G$+J7o`@RkV5Z4kG!J{Szp4GD@QSn;(DJ{iD4ilif8O3-;VZkR;R zcUo~%k52X0wAQztNkkh@u)c9BZi85&N!|^FiB0}BblYQnK>nP5hEBtPG(Ep7;E5nR zjTMhGBF;eT8F!N}T6`u2KRS!roP^(FIcnxCXpQe|*XBeO%TZmikTztz7VzrKgPl&b zcWlm}U2+^o4fcz|COpR=XgQm5acb2}ry!);BT)&nTHXb)oj|u6FDmip zVxH@G0u>nQ(w~dRmsn{{TO3wu;}+wnJLh$G;m+hEp7O(<@&l`nc%~foOgWm}lM4!d z-gcyD%;BOj2QEHRH05y7l!LvFR4hGQv9#mj6-O#o91O@(Y=o8Adh_m zE7j|*r!kSTm5$!M)!O`*6QeX!?M0EL5diy#02p|=k&W@lXF_4hCd)iPU|*)9Q3j60^7s{>4OArM~~5N`0D!LKZOw~xz9Ap7bdIf;H&wm7pt)Py>D~LgQ_z&&&=RG7=h@s)V4+-4F z3qSg>c+XXYYVunEUVE4_h$%vcdgL*3`-1B5W1_b>qdt2~6u6m84jv_|oOUrS7i(;l zga%#!TonMD0g3^BL4Z7B?)3~ZZdB>N6%#|OTv;egmKz|3ZhB;o z1rH7TU&GLsAHs;axnQ|*lIo?Yi%Xh3Vm6-wn3rQVVZvFNk(+B?zxvZ}#eBVVc~te| z!lNcWF2;zeaNuz<$JOg9wA17wbrXR0HPvgs7lT4zhnC|gS5^k~-yEP_jkh(}>XY>W z9sJ?}#$lgiR%36I@oZr(R{;AERANEgK|ed!V-F;@34jd-+#D;7_DLI`7RCKJ3d}kN zuFr{(QY))Seg3p4Qtv!XihpZ3^BM87u`sHYR(5q|<;)uIjQJH8&8eC*qhj%#h1IlJ zb=5v%lUu9@l~6f*;Xx0BRK-i8hr0Tp$X1IFQb=~cy7Qp8p0GxL%hWyB1ON& z7f02h1;zlgZcLUs^Jn1>2M!6RFcTB=>nxEedyS_e9`}{+mD_iS>o;r#{$Z52&vm3}_;lo@slsiE8bpSbpLh{M0OWuPF zTjkhlMMq=;S!v!ud(dJFs@j-2;?78+T;1)~o6ifc>q%Off`3p`Ul1D;F76n2@#{S= zQO~^~X1j;w&lr^Qd~!NLQ~a149{Qpvbhz|dsTTZ6^a~vV$q*M^()3;K*OzQ)x#6Y7 zo)cY{7di@WrTZj&d4Z3h4gw2%%CLu>YYr35>&sRuw;c6#8!1N4_uJ(zFj*d#c@9T+ zzeEP^mGJVHL@5l(Eq@m8Ir_0Ufo^e?mJB3K7V1sNi>KQ)>b6%zeyKeIY;o+Nxli{; zt&D1IjdrPyS43gxAN_61< zk-GFX^6$P=_rE5FMwSPhlEG|ov2S8o4?floN?PHV`ZF}|WVvabAw*8Wp9Zp}? zk+_VWRnevDu=@>hr(^mxR9TBZgw(YFEMcZ>Gf}WN-b&+>dL1dC3$-zd{GEF1h$yIO zM>AeFZK;AC%h}qB3vz&C$WON?1YB6l)jeCwLRg#RA>UJbyqXZ_$i0el<4-q`aVl=o!3CH+?2e@v9SpGHHlD5tCU zj)}e@M%Outk)sE$#GycYyU*yJLu*#3j2I)p^Pk1>G7$5aK7*Qn0AST(=Z>RoyklYQ z+ltCVIsSs}Y)N*EsJaovME*lPbezm_ntJ!R=LantsDt1v2cF2J#aQk`Q4W}7*bDMBo9cAP zjg7<|z`~r~fy&IwL8P#6C!28+Y2MR*p(cJJCUQVhzUNR)yNz6x@hQa+fAfh*69M(i zC&HS|W9-ze6411YfaR>F_cb*1jMJ%|zIPzbcLClbpfzav^y&JVQE#>F6T| zdpjSi>rab*`TqyPQab4*^$7AdSeC12PK$Bc^XbiknD&)OQh8sIynh{@^A#P=h~)5% zUyE181UQKL3TsA#FGyF`?4Tprt&c!Rv`V$)S=%UR@dAdr34r4sfwI9JKjU$b#o;bPc(F8I!I}(f`WEB3CV5}jG^qw-`D0Qeu zXN&&fK%$Z8FxI%kcesu9q9+W!<;F|j$W8H1=b|9hCB`los-!{|qmzjrf?UJIj&FK?h~R(|xsi+z&>z0iSVBb9ei zbdF47wTV%5H7nDYC92dcCbYsq!=P{p~%<`BgY=ry~@^`gk1J;3>59~VJ&d>c8yCB2LnCbDM+Dbn<3F2OI^20m5d<$N?{ zblGmop+uTBj2z4!YEprbPp6?v3XEc*w+)bHl^g)!Mea7lA)TmQV>b3YUUu}t)^#^Y zZ*SxfpZmsYL&QvnkojWcUnoV9jPsepzVXzLELPtY8pZCh)KHd!&Qg^*nDk~!ZzE5v zS4(;uE&8UCah;(KY!&@gQXk_zC~$(Jw;wMS(27>$UgAoN8*MBUHO{6)d|IO>t;}dj zGLOy7Q@5=)k_Ja3uBjBBO^E)Y=ub_?l7uw+#>Qwz|F|Vd=Aphlj7w&!Q^Q40D9irJ zMmbT2KTXLsJ(eV=#VtwXHqQQWB{|jFK4ep|Uc^|(S#U7kt$9@7qa8RstkYJo)8Nr% zAr@K(q;(&Gwsa3$$bg3~bk&FI0-jdv;C)?9B+P4_e|?~#mC?2KJb#rI8L0J9a6Y@U zJL%P}YJCAK-Ol8C{6wYJPa$P*>kz`Xl;Q-ThhVBH?nqWVKsP(cbE6B7f<@j+}7kw4LL34mq4T?00gD>sY@TM~fzW z9`DFX-r_oy8<&!E#9egQU9{7E#9eyWUHU}cv8>6zyZCo=PQ{5TFdI~1XcoG``M&p!@vfR7DPnZ=vc%@_abI@E1djn}mM;{Dr!v)aZ2)`mjVPy?7%Brjgd& zQMx;}v+?@jRWad{zo3fp9soAG`pr2-lHlUBP^>@dhpCTCjYzU zm;UHgCktK!KkQQJBaPwWxSBT7I3ykmQygYyT5gOA;c}GtlHk%Q>e1;&Z}(JWV2zby)SJ_d@$QpIbG1XNu)-MJA89(W!gES1 zDTuqXKHB^7a!xTjzT$GPT3cZ}&hO7Vm$ngvCZfldSk3$3^Jp<%@+G@Z4rh^6=ra<+>t39Z1O$L$dgh_sUOV%$-fxY3JxebJlGh5Z+JmsOUg|Dw$yv zhh~7yhrk-^!ZiFG3BU@;{Igba?42D{_A_ol3uYy9_|DSh$S{k@gYx|t0zNsmV;dL| zD>d>#9O<3I=c`P_{b(`;T_2(p1-B_kfsf|k6AAR#vzNyzo`>Bm1Y$a7Wp zOr!tU+mN15wJc|l4%6hlERYRr>69E=MY^c(c*E_nT(xThK`P;s`cl0U?xPORH2SD# zW*Vc!m*G=0jlU+0V72&xS}c~ofGKh6NbnyiN1qAppj7PC{B%CelNL25`#_cHoL4CBum_CaYhLwyDFIdx9@t|&&i=KJ=Ws5#%f0=SRqp?h* z4|w=^&7+!@8ihq5T3!Lp(8am&*S$-P1>(-|*Gp+m@* zHYCKtsi#y-E81ca!YeUI>7AIp`T+nh;U0Z;gl*M%ER_8KTYb|=3-~MH=}pE{DPwsH zjDx_c$oU`Gxf4WeMhcU}isv;&AAJ4n0)DwuifRV6Av1fmatb^ubDdz!t7^0 zptI9up(_WCyNwIzR?dOl#;#IsbvdM~zxAM>DA8|fV0*Fhmqgl!DzwMwn~IBiWYw9~ z8`SKc$}7YxE5s4FXw3rHO$@c=#6DTLsPe)kl{I*NVxWsiK*On~>@$Yd!5wHzqw4&2Vn)UM`BZN| z5b-04mmurNaX9zfwWuw-dST2vm#T_6X#O~w!@ZXeKnEUIuk161^kqpz23wCEs@d`# ztn&98r7^F{Z2mE3BpO>_954rxl2O{nW^ds;%FuyQ+b*$5V(;cIh;u)xYzJWb#baOUB0pkzx!a+S~##1Z`4L zeUtj-Zw$|+cT$Fx5xql2-ZA2~>>ldZZH;t&Y#$n6xU5u)UazkYv=z}8Kl&W0^4Ena9`sRQ!M_d`c;8CL~Z)gfhfabu9kj$6FC>a?$5C@^zVM6uR zpNtAILiK*hxR@^6w!UNp63d2B=hgh>*6trCoucPY*5o)Gqxn+ zB@D%6f2&@7&A2Q7NerMvz6C;%=7%y={Abnnx-p5KBt7xE;pxx*QHYT0z-B+BSWzeh zqpxex#hEMLF!J&m0wiHLEOd9i5od^R0Q2i=@EgVqaa1+DVGON#6In+9uw{$BjEg?b zd=*8|Hp@-l%hB2NO~cF>5lu$Fe?~n>Lf)r7A;hCPC2{SzvN}q;syH^q(DyA0Du7X@e}tJPHX=?6ytLC>PubtHwzRW#anc{}U% zr?UF%rc#AJhR1zqtaDKSY1b#l1pS3L9uXdggTTS2@dHA{hSPF1`Znqq8V_2MNFTZtFwc;MBObf)vi6Go;u89sW#*da2?sj?*|(#-n{h%8k%|I64HV(}&* z!$ocN^ZP3NL>?`GuOR&@029vv4{Ty6fE86X`2*;%DZ)TWkRp=_@cph;9?z;(p3WNz zSv0|z4X-+Il7dlhhmV~!-V)jgt3<~-UP)h%@k#o|4R1dp=IOeKvj^uePyKkx7)qxA zLq0bO$DGv-wU8mZM$qYy{2dyaqQInskr7nWX%e=5PA0OKdf{_pES-yf_c{6H9ctLW zjZ56Wqc}8;Ve^`0@#^eFMv=O1smNE&Ptsx7$CgM@i8T~vr9-rQ^~z`?SrvX^yd$1c zXTC5N7rlVqc~0@v;W^`jP%Z&Dq#D08emksfk zp;C-jH=d>spgZDK$7y3~#idkKl1Qpn-=t5rqG+TO1Mw?pBX2%g@AMfL_R>NAIJNAl z7Jg-naBoBpO!#H$)~^iuo|Jm>D~fsyR7qb`r@v4OzovtjZEDTe#?MkQ*T@~^o%D%t z;y1>%3G|wL^I1AC{JZ+iSz}@PW~$Ma;Ngc&Q)I>V6vqtl!}djvaV~a7cWl4IF@ack z{7;T)hPxa>8v!sfoaJy_XN1;L^ZE?pq|Hc9F6p5k%6|kBzl6fEmD!4)Y=!&+scT3;6tdInz5cK?Y`D79<-i5$ zhh2_xF(Z83<+$2GI=V91aa;L38c$M|DEFl1O!teR4uugFk8F*eryPsk`;DbX#H&&q zPA46I+^#0M9j{i5BicJL!En)>w=sbX{a}}IQdMlvIyYP|bj6w=?gGj_;h&^9#yWkh z+F0MM47wJunm%!Z5HubUN_h;!%*@B*O9&0}1Jp|(!@~N+Iqx6Zo(vZ5oBU;<=LnCC+96y_W)r~t@tnbVX;iU%W5E@Aq~zi^Liip9d$H6(xDN6)~0$ zdXtvKPZ2N$_)|xnc<6t0pnN)ZK5u@?=p^+@ks~jZ8VOeNeh^;1{^nYI1qdG}!(W&5(ZOo7zaij>{@)5^o;e%}o9JO>Z_6q3ET&ydknhgWCppNP2PS%~ z1o|HLTDor2*0Zx5m-a){i$6G=W*^mQg;tb#D)3&1FWq~1TjJs8J*xxt^yWv_(}x;s z>H8d-i23suc<5_Yl;>F+XkG93toAjm)%SNOpiQ5W_u#wNJ`X)#ZT6Lsda{CHfFrI# zCVOD|njObAuT{++M`89Z5_$JK;P-nR^IZQ(r-BdEDUW08yklwUcgAnoKu4u{c}MdK z)uwHmcJ_QdZ%9Y(P|7PUK3Y8FNb$Hm^&Nf3)9(objt&@kWWdw|mv;1@M!%R>-dagkk(XBIQL8BIBLtrGnm148^YPL_l%HJh7C3N0KHs$GKaRkCQE3R)g~s7ah?qJ@LnsVl){OqDuwVe;x^2CMoCTKH7oYLu1yK zO!KePc-(|Rw5g2YC#3Cytt2)UyFaIXCB=HpxfqQuRI!7=|xhGQC;y5A(YKoDe z*dog;)+pLT%U?{Wg~tEuJRF?A4Tq!uV;fftD~Jw;&Sda^zXBELlvXT@96@Akn?P|l z5jfewi!lz&%Q*`K=f?KT_m5ayTK^->d}MlKbb*J-sbAgM8W7R%Zh8S^G$I}l$#waF z)o#U>I<`E*PKfF=zl5TInX>e|*1)2eZ&)30sQE~qs zQnBYhcp@!|ncu4C5J%xO4;nDTe0Ltb=<`4xGZq);F}LT4KOcYG6Y~-?Dj|I{nJMN95yh~1vzwjMZDdl~rn}o{L5s<|wsDFOt3G!c5gCWi&o?0$y^HT2>DfIT9+N$82{b;Wq4v0qJGVTImQcQ~!V*}oib@@M zVyYTf>gc0~hIvfZ3d5-R$eBl-9Y=1*9NJ^eZ6fze>|CU%H(MIEKVoBI#&w@p#8hRY zPzMF$!&e_t-PTFgp>u}l9L?g$F*Cy9V_xQ~)YM_Ld$k3{RICQQ=OAREC&vht<88cw z;-DL+I2On$#uU*h#J==CigVelxb${O(oltDPq1Y-LuN@F7O@9|ank_=b)lC7I?9axh~W-j2W`W1_lT+PGJw3@V|r#10c}Za z*WrX}1IKK~%r$MgxqcA{W*TgTpsCPJBbXUmf-V2~|K|#Uj~f8)2G|L(AK)>7Fu>CU ztP~ve)YsB?ebxr*4dCwtLYAAp+z<>#3Qr;bGys3+-;Ke`0pM@{^Hq|o@RJYV z?n7!908Yg8DV+VTZY<_CpTf;VYBs=y0G9wP1E3F}5&x@^TnBI^z$Sp30k#1=0PrXP zAK~#C-5dDHpPe~@R5mPk9snO5^5qsjsKbXl^yP0p2wZ`met>2GzUvga14%xXDns?O4SakGxY! zoJ@{OPW{r2r26T2hcBT|e7*Q`x(I(Yo+7Hn$??hmjw7J417}Gweaz0gx|RN8M8DT7 z9qQUij-ktlk2uNUtyd^zB{T%q&^Jrh@U2vSTt(marOza=ic$oVNT-oNO;^h%{J%?j z2}ndXVkh!A1jA=kZsnZp7~@VsZYn^Unlaf?wwku|bXkC+kMpT33PsF9*~ie|5lB6X zvF3weY`6LUveT#15SA?~`r0mq4e37$m@2O%qNsUX5L?|-4k5%lamDJL$&TC7gHr^F I0gzk%KWiLjSpWb4 diff --git a/libs/agent_framework/src/agent_framework/runtime/__pycache__/transaction_parameters.cpython-313.pyc b/libs/agent_framework/src/agent_framework/runtime/__pycache__/transaction_parameters.cpython-313.pyc index 38810d18a1e5aafef11d2e9e6a0ac4c497f1f5fc..f3950447c5fbb0deff0e61a335431984c91ccde0 100644 GIT binary patch delta 5865 zcmahtX>c3ob>Fv(lK?>wAP9ix61)UbJS35nc!&}uQ3q+s5|>LIkOafPk^%)TsBb}0 zV$*=B+leed{=_r3Q%-1|0t{U&uiC@n1^(Ej>I_hx@P`kX5;+d>JsMnodg zaWY036%gmfxiOxZ#>~t-W?>eC#*bUaY|Lihrg8gN2`e#h^SFaKK*l`oWKQE-%1YsD z8F!79v9d8Ya|`6Gb0VbO@2%K-*3%0Hu`#b`7OmZ+i}aXSh3FD(RbPUx2Sg>*75-=exNo>r!lY|dbgCggZh1*w&T^oNu>wU4>U)`hM) zCDWDYIw~HC9%t!U(4cnB%9p!hGqRG2&ZlCT=`@?u()?5A0ND4gyvKiwr(W%%wYI|p z1l_D=SaM!Br_zfuV>LixbqLB4G$7cDz^na(RrLA+)veKZT4r&X^+T_ArP{Vgvpk^i zM<1Y(Yb282RYD|E*x@Ev{L=6dB_p$WCT9fs%6uvrPiBNi7b#?5FBDZsDnjOhEEM)c zNTuVkl-$Xzpgv4l8GKZg;Ik7kjX_N$ppz0a~JM zD;xDYrkpC@O;pZH4%ZU0z!5V4kCIdS(k`!dz06hXC@flXM!BQ)ggA&mlv2f^I42vm zk)C?c6YJS+z)Ee8yA-e!y?xpfRo+F*v}pNW z4mvl=+wk*FdAru>snDFB5G~cZJU+ACMZ`+&2YsX3*F7P38Mv{#pL3BN9>rY;OS$a{ zP`9?>X)G;|zyfkjD%a9Go149LBmz^;)4YYHC>0S$ky@c;d#W|XTSF_f`;|WJx_3(v zv)4RHMQ$!M8Hyhwq?-WN2>Y~$5XB}{z`E#xFaDiKFf8_QA3zDe0 zi-=oKP_aX@8Fo4m_TtThRg>e~QBZ+?rt*qS2}&WU5!TaXtf#x*d<6XI0x(~u*Z5;* zCsC>*E)X-?L>ojyUw>7>m}oNteJ<2Zlxp~^fxp@=qSWCz9-@cO;7NYs43i;nhAK-8 zA_kyvydF3xPO1NdL#ju2skXr8ghWoHcw{h6^X3VRgA>v1+WWqscHY-Qw`sJpx)qOq z#~^SS$8WfURFgaC&&c+G?4Gb+@)r*omLU11+8jS<>NOn63)H%a9a?#B%|3w~g`iyY zG1!j02U-DJ$1RYm^M3U|24B;_B1{H0@en-lnRl8XXF=iy05UAl2CM} z2C3l@ug8VK9grFdRzRzSTU1yi^v~svG=gE(XcIfNZ9Z?;PKlFhA{c;;CRG=$)k(Fz zFgI)h&c6n>piaBt_w!E0p}nyy5In>mYi%GAxNx~H4_Y|L zitg$jp&CSWQ|9WttUD628ixdj>Gl@KMqz{<)DqPa?Ol1T`nL{xOna^MW$Icvz2yky z^d{~6mdYU}Lr#h(Q%NK7#`BZG2@&*)moU-6%*ilqgnff_ha*Ot;IOX9igc3ehD#vw z{ah0|o1j%Xe0FgIB67Vo{k!pH`YB_5)cxmB~nN2h^`wSnp=!3swF^{h$ zi=_Z8W`AK1pzgVxOvvos3K-Sh3%HF@CeNqUWG2n79@Fg^D6L>G*wtGkT%y~eQ3bXp z8r4gp(YbVDA%(az8ojg-OXWw(qERTk)J!U=$VxgIWjL3bpk`%3kYK+LV98%HdIh`z z%SquAUl|Z|%XCssC8A*ylacvp0J=Gzl4Fd;QLyO%6qyNGD4av?1_)3?3I&JCGGQs& z2^?xVbs6+C`O-oXdO}Q4(n^OsH=nr*#ocGj4+>EBsWQ8a+6y8Ia37t=@eHi)F46|g_=j=y2&Iz zVbyN*U~GBc7sz&#QMj%W5&4L{pa?=l{^nz3LjB!zltMkXvzTW&g?1OYn&51Wa0k?B z63$e%JZ#o!LZ^yuLN_!bfNn-qRnfcv zks$9lwxLvP?&(BqSl?basz>hs<5wnsV+t~_gD&+o03R)r?>GIR?R#z6S1vpxWQvP& zn}j^Y$(+%f#?J_y;Xc5zY3@EDGZ-1qLlTLY_8XYPzg?vBS+ zqp|$JYC>6^zqHDhK+PBF2nz1w_Hz%gcL24ixz8n<9mOsx15^9p13k0|J+u#keHU;t z?Md!8AdWO+M{W#_v^XJpx(aWj=zKbA}} zaX9De#b;J@I+jd!GiLD3=D5_WfJvu(l!O!f@jko6$Iqkm-fxk$slghQC<@#z*zsJYa( zfYj|swZ!J9lT9(+na)xS4$c*~+vx+JwLmqPr0cBY-NMus;N#(RM%W z)q?FE6PU1dUcM67c@|sLt@E*~Xi_hkhUaC}xUo4eH#PwS5PJqiY)rnKlo#a$8$sGW z1p5&j(7w`M<1_r5{Sgw3z}O7fQ`+CRS82D~t>(RZ_cFisPJ4^%uYisdRR0r}`|LTP*wF zFg2!X2R$D>tRPO`1H$1p*<9aneZ{rvm)<)WSv?!QbMmRXCzER@lkeGP*Q;u7Zhv)R z^@O-qHu*2M$&WY9DDvNGIfTJ4yUsZ23!$k}(`#h_-ms7K0pXwaxTidpAA1ehXa&lT z+xE3j1+u0$eb{@mrhKZ_@@B`r9ng8Jp=zp`yfsLtLZ-KdOn|>lfcPB-Bml+3kBhxyEOzY-tr~3KzJ`V9+6!Ct8K4b+u8|IQT zc7CI*>x_xt7^aBtK@Gae47hFw&Xv^mm+X~JaLi*23(kCPiP)i)+My-O>2buL0FW#C z*pt{lj^G3W5x`Pe$pYlWXukRz5ZELR!83rcDFi1GoJMd40alvqthTxD50n_7Vb5b> zhJ6(ox)FSSkipSELGU#MUq|p*$iat2IG7I;IR1k6ulob?=f#TLCH@vNzKG!42q4`O z_NNHGg8+(V!oG_D!wLH{1TQ1_a|A|!_zT4TQag7bME%2Qb8kk|ll}N@j5s=v`j3`&n{lAvr z_XxuN7J;$FhVsudlVwFa?C(G%T!nS)^a5-O)Uk{Qk{-T>t-d{*1Hb>8(Y`I9rwK{jw*EB?%d=JY|}y< zu1#wWw-L8@)1JdiNM-$|BZoUlW#?vT4tEiM*JfD`cN2fZW_b?xklNPGoc7HMVyXDh Tm*Om7YID}C-5<}Ga0&kh%w}}N delta 3669 zcmai1eQX@X6`#4?+xzl;`F!WQ^Vj+-@sZeP*D;B0u#=z?VkaT-X4}w9Fq^xzbLMW> z%%0=eAUQxwTPP7Q0#edaD*gc4e_FY!R8^{!MoI;!6_JBtt=du~T9rR44xy-$CDgvR z=Y)i|>iG7zZ{EB&@6DSxZ`QwglYV@jhCT}h{RGgoCd9_- z6hU$KlPuXGvY=9@NNF-BvXBx~JPs9BLWN9Si1*{Ea-T1CrhGm8Vevf8X}RHkQ` zR@N6y_Aq}}c*q@tIl`;`;!6Sz@!xq`dV|2Q-ByJa=WTb%T+|tB1Qtsn)FCt@Y()t1 zs8@;A18IAv^QO-7I@f$5rX4jODKT?-Y+=#D1bIw+x_*5MR-wVNVsdPx-?@1kl234sdj>4!0HfP3IyLd{Un=nJyQN3Pi2fI#ryh$jn@* z6ph(FzyIi|q9xj+Fy*|H6tD=GC127kt2k5C3$li@8T#U;-+g|Y%FF{{TK44n+Q(N; zZ0j2HL6@}w*xpTd%@^uRjv zdPxUY9YSMl3-GUF78~H$O@BA)4DE}aE!Fn49tMombL3*V4n+(&Jas<7??XYtg-DC;k|Xy_|R(k!Bj_A4XdFPwq-f zT9gnKyB$d*p(gVC2^a*N0^8Iv%S{HDCTixd)UxcqY=4NvWwDl}>Ym8!5H9rUUEEIO~PF zthP*b^S_KXkICd9)cTvD2;B@69Nc4n2YsTZH<$mpBiA*u2o4DZmV8j+uZ|D%hvId? zwj4&tX|>hdeaDS*sUWKO-3)9V4*FF&?oYq-F=PwT!+kdl7pSEH4o7`K#>1^SQ(=LJ&J6#>X4m+^xqlYK;FQ(Za9q?&l+oJ-!CTrN|Ilwv&N2<#U05j3Teb)4{b{J`td9r#<(-fOgrP~6MQ{p}q|MLkM!~sfZLw&~ zn6_k@tfCh(?Y2-Vm6@Nv*e}Zys46R5G;!`x^57GbODueOfCm=uQY~>%1T5JdAJzVG1QhT%YYN;C;jN0+wt1 zA}Cnx{DaA6{<8r|bgJgB2et$`DBK5+^#-Ib|72jmefF#G)g4~#{>q@Ry6?`%scS{x z@9fO+o?Q>ESQkO^iI6%*pX*Q};xC~Li5J~_hJf+gk%$tPE`=Oy^#JEm_ug$vlXy9T zoy(0;MV2o2>>Y&8+s$dEhrE3!Rl3EucZx`lrhxxWJfM2WJMw-vbk@2l46OBZsG@My zPmczrtM>-n*og=*d^P4ny1C`(xNvotB0Yj?SI1H2eGz5e_YA0`!uz{iNRLpYM}fck z@$dy-0*)*>#4wpzE%T64S6{hjS$g0Bq@hHSdsz<269^9?Oe1Ij%VGb5rL$?+Knp(S zMr3vphw=yo1RY@(;S@p(z~%+!A=DcNZhxIHBq6c57AAS@yDAuJ<2itrf1 zmogJCz)Xsr#UbaOd>kmdzFdUw4r6wD9zK4!G3n9&OH#5YQR$lq-$Hl_;oAuP2;V{Y zF2d6Y&mdsFvhN{0i*OFXNyz7sdV$-M9kiZ*KH24d2^fD~-E!bLam7)>T8VdmWr5YM z{ESpHg9B^;!J%HhL1o0+dVUs61SiDK;E6Gut~ojkN_PaWch8D<@MhKiGZ*JopT^tb>EIq^WF<-?)g5GDXdQl?Th}wapT-myHR!spt_t7&Kvg9Y2vt2b+Djs_ zs;@@-NusS9sL^#K(N_)D=n!elR>L(qLK@qv(HdP(TDDeevsW94)NnnnxFj@iM&y^3 Iiin>78`T17{r~^~ diff --git a/libs/agent_framework/src/agent_framework/runtime/transaction_parameters.py b/libs/agent_framework/src/agent_framework/runtime/transaction_parameters.py index 902470a..85649da 100644 --- a/libs/agent_framework/src/agent_framework/runtime/transaction_parameters.py +++ b/libs/agent_framework/src/agent_framework/runtime/transaction_parameters.py @@ -1,5 +1,7 @@ from __future__ import annotations +from agent_framework.decisions import invoke as decision_invoke, selected, choice + from agent_framework.localization import confirmation_decision from agent_framework.llm.structured_output import parse_json_object @@ -168,6 +170,31 @@ async def reconcile_transaction_parameters( source = "current" fields[name] = {"decision": decision, "value": flat_value, "source": source} + try: + if selected("transaction_parameter_reconciliation"): + # Candidate values/provenance are never invented by the decision adapter. + async def original_candidates(messages, **kwargs): + return json.dumps({"fields": fields}, ensure_ascii=False) + + class CandidateProvider: + usage_repository = getattr(llm, "usage_repository", None) + telemetry = getattr(llm, "telemetry", None) + ainvoke = staticmethod(original_candidates) + + reviewed = await decision_invoke( + CandidateProvider(), + [{"role": "user", "content": prompt + "\nExtracted candidates: " + json.dumps(fields, ensure_ascii=False)}], + decision_point="transaction_parameter_reconciliation", + decision_questions=[choice("field_" + str(n), ["resolved", "preserve", "clear", "unresolved"], + "Decide reconciliation for parameter " + name + ". resolved requires a non-empty extracted candidate; preserve requires an existing known value.") for n, name in enumerate(names)], + decision_render=lambda d: json.dumps({"fields": {name: {**(fields.get(name) or {}), "decision": d["field_" + str(n)]} for n, name in enumerate(names)}}), + ) + fields = json.loads(reviewed)["fields"] + + except Exception as exc: + logger.warning("transaction.parameter.reconciliation_decision_failed type=%s", type(exc).__name__) + return {"values": {}, "decisions": {}, "provenance": {}, "clear_fields": []} + values: dict[str, Any] = {} decisions: dict[str, str] = {} provenance: dict[str, str] = {} diff --git a/libs/agent_framework/src/agent_framework/sse/__pycache__/__init__.cpython-313.pyc b/libs/agent_framework/src/agent_framework/sse/__pycache__/__init__.cpython-313.pyc index 5ac50c81998768d0172c06869df0191163c415fa..aee3900be2e9cf93ad320f75303d7fde7cb7bce2 100644 GIT binary patch delta 62 zcmX@cc!ZJrGcPX}0}!key*82CSUp)kH?KrLMc+5rGd`dwKPxr4q*y;IwM;)TJvFZ+ Qz91*DBrU%vcVc=x09{-aKmY&$ delta 64 zcmX@Yc#M(zGcPX}0}yDKuARtjteL8xn^&TrqVF5*86QxTpOuTed_ delta 67 zcmaFj^~{U=GcPX}0}yDKuHDG}omn$kKR2&LKSkd+*fTz$C_gJTxujS>J1HeeKQTQu VuOvRLC^0v+JijP=vnGqRA^`hB7YG0V diff --git a/libs/agent_framework/src/agent_framework/supervisor/__pycache__/__init__.cpython-313.pyc b/libs/agent_framework/src/agent_framework/supervisor/__pycache__/__init__.cpython-313.pyc index 486ab59da889723633663028fd40b469e770819a..103b01eae4d40502d397c78d2a6bc05b1920727c 100644 GIT binary patch delta 62 zcmX@Yc$$&>GcPX}0}!key*82CSUpQWH?KrLMc+5rGd`dwKPxr4q*y;IwM;)TJvFZ+ Qz91*DBrU%vcVb)`0AHUKN&o-= delta 55 zcmX@jc!ZJrGcPX}0}yDKuARtjtdOjqn^&Trl30?cpOT+!Xs(}_o|;z@pH`HZn_8Y< Jlsz#u4FJ6l5$gZ| diff --git a/libs/agent_framework/src/agent_framework/supervisor/__pycache__/supervisor.cpython-313.pyc b/libs/agent_framework/src/agent_framework/supervisor/__pycache__/supervisor.cpython-313.pyc index 35dd1f3e64642cec377b54850b9e72bdc4f89cf6..35a37ad5bcf890c5752d7e3c04ee6e70738aa8d7 100644 GIT binary patch delta 65 zcmZqG>e1r<%*)Hg00iqquWjV+V^+`6&&?~*Pto@c_KXiG%FjwoE-BW}N-fh*Oi#@# Ti7&`WEJ@2R%H6z^*+&onok|uJ delta 58 zcmeCtYSrTY%*)Hg00bJQYd3QDF)O6%=jN5@rzDmn>Zjx<8=C7Url;nW#HSS{=BAeC M7iDig!0aOk0P!Ibwg3PC diff --git a/libs/agent_framework/src/agent_framework/workflows/__pycache__/__init__.cpython-313.pyc b/libs/agent_framework/src/agent_framework/workflows/__pycache__/__init__.cpython-313.pyc index c5632dd80cdf93b2bc728658fd744e0d42f74474..3ee094a7a74c2063dddb7f6007fa1fbb5bc8d0c8 100644 GIT binary patch delta 64 zcmcb?cAt&=GcPX}0}!key|$5iK9hQ;er{fgeu}E455NF+DY} SB)%Xgu_P_OD0guoGZO%vi508> delta 57 zcmeyt^^uGFGcPX}0}xc*SiO9IF#a diff --git a/libs/agent_framework/src/agent_framework/workflows/__pycache__/input_contract.cpython-313.pyc b/libs/agent_framework/src/agent_framework/workflows/__pycache__/input_contract.cpython-313.pyc index ae9ed74c69d220409157a95a089482dec31c1ef2..222ae192f369f049d527aeb35da7766e7e21aaf4 100644 GIT binary patch delta 1790 zcmY*ZU1%It6rMXfvopJ!$>wi≶0lY)LmslOTp#T4HKaf7`TnC|H9`r#rLh#@(6a z&Ln9TA$d^gi;yrr_@;$|2vw8?@y#E6@WF?KfWe`P5B5QkQZ*tLA3Wzy+D&HJ!@1|@ zo^!r)?)h@|tuxABiW2AG`#AOeqPMAZk#{$T`qnrt@}ls9NJW*?nl&NIEebTMB{h+8 zk`~pZF`~6-GM*QCDr>D;jOk*1T;r#;X>lfvgFeByL_^!hY3*7QlQwA`n!-3`A(~J1 z|B5N)NsusX+wlyqT=ZA!oc|d*kN#IqiA<0(BOxg6EDe zTFc{LW_xl*(jGx z-Kiohh)T%0wbUaUYI$^3uTrN{^}r$;a<%5e26>5gVUR2m#34jP1}+fR7M+q!1>o~C zZAGPua=GBx9yJPHAe&a9Y*5P#$aUJobkwp<3nVlLM;Gr=_dnW!1{v#m6&hrjddaRX zc{;Vi#ON?+kD<@cK-RgvW^TZ*H*LIfCz;;LOniQHJ2|r@&)iX3HhOkj2j6eoQF6P= z@U}9%ql~UU^OK}7!?916x06#_^3$To;#EgqSU~LHp4L=3Fqawzn$)c z*YsQZhuyX%V@jM7`)F=B#NLw1%hiip(t<|UM;2N@r z#UP*;kh}!sLEQDI`no#j*cO2+TBGV|d-c`OKm$#_If(0eamibvmafwXh=QJQ z>lUd|v2fRnm7M}Cs~X$juuLF+5cO88C3}Hl&nVl&xN6x7V9$i&{DtE%jU0mdAx9C= z@R7-$8XK1{!FDb0ef?f-_ct=|jjBXpSC#Y?!j!WIT zWAm?n`AQOF-sQ*(WO>rE-N`C-=_IYK9e!q#E}6Dlt}$wvYYuzMyC114JrE<>UXcHi z3dph~k^}~hvJCQBuMwLTbKbRBQ7M5S?|m2BlG2j*Lu#~rQ+-tw3tmzi(hTKnG%Xm> zBN6W%-rT@4uJ|y zyIP+h^CoXPc9oKfW096cNtJTqG&jH4yl(QN#1|)8>Hj&kp8Ai7@D?QuLvfc*kkbw$ zHM;7sv10`CxF)fkRe%Gy3Ape<@MgV85P=Yj7;wJ4;?!+jWmyytcyA{A4)vj2Wl*fi z%&H%4GRJDV9Ir(l{#efYIN7i1AR2{_?|8S9A7ysCrf*!hv9cv@XHIOZC%k&9Z+N$B z;FIWw7q&Aa+v><}V&?C=86iVOj@|g?iNRS(zI~v7R%%~QeT#UnXNERLK*ccIzPi!D zmlqwU5nchS*QKCtU#m1I=k;3MWLyF{AuNaHg=Nai+_b3e)+^#+r*rQ(CbK~MM96kv&kgn;6h=`la*wA^OP z4NHqxC^Q{L)nte(dkhH7b)(^|nbopIo2&>DjzRXYMH6CCx8i-C>sO}Wc(T2f`$KvS zLGk0z^p<6oDQDeqp4(T^-jK7PtP~jNk+8WqK)z;~)UMl0wN`^iKma+Rmx;n5mnygS*Kyr;gA2s%5$qx0^kO{&K(~db$?oKj_^m_2*|m^2ki% z&aiRsZfP+8GP17#*_T!y7*Xaxc&UAEU{vhR0}I#%PeIVgtml!(H;~;g1_3*TrY-9-SFJ2H1*Y3t>w0uSuQi|w;y#cHlhDah64-U zMSS`gZgQ{{=NZmh*lX+&L&Uxm7@`#}mHMpZR9g*mnwQ1H{rm& eXj1IGSLzXG#XDodqF58}3*B(=rUvI^4D=76Uvj1Z diff --git a/libs/agent_framework/src/agent_framework/workflows/__pycache__/models.cpython-313.pyc b/libs/agent_framework/src/agent_framework/workflows/__pycache__/models.cpython-313.pyc index 7f21b403bd682020b2d3ce818ad7529cdf1908cc..ad4ddf08f69cefce16eada225e0b2b4f205812ce 100644 GIT binary patch delta 65 zcmca_{mh#CGcPX}0}!key|$726O($ner{fgeu}?H1+!%*)Hg00iqquWjVM$*7*KpPN^rpQ7&@>=_?Wl%JKFTvDu`m0G5sn4X$f T5?_#$Sdx}sl)IUQseuCkojDbz delta 58 zcmeAcZ4u@E%*)Hg00dPxR&V6K$*7Q`pPN^rpORRTsGpctZfK#On4X$f5}#I-n44Oj MUzEL>o2h{V02?|JLjV8( diff --git a/libs/agent_framework/src/agent_framework/workflows/__pycache__/runtime.cpython-313.pyc b/libs/agent_framework/src/agent_framework/workflows/__pycache__/runtime.cpython-313.pyc index 6b6fb96767e81c2937cdcdf3c6ddc0fea0097a3f..564919f33b3dfd6f2ef9609fe3c16a31e1f7ac81 100644 GIT binary patch delta 67 zcmZ29i)rO7ChpI?yj%=Guuk;aM($W<^$h*oyb}Esecxcu_<*APtkmR^V*RYtGX2E# V)Vz}Tf}F&XwEUvn%^l3MIsx8B7n1-0 delta 60 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 literal 0 HcmV?d00001 diff --git a/tests/__pycache__/test_jev_endpoint.cpython-313.pyc b/tests/__pycache__/test_jev_endpoint.cpython-313.pyc new file mode 100644 index 0000000000000000000000000000000000000000..16a0c8cf36255dd8abd61ad8750afcf09cb2e167 GIT binary patch literal 3465 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 Yixvy62U`}zI{8Ctt>3etlg_aJ4}0b)MgRZ+ literal 0 HcmV?d00001 diff --git a/tests/test_jev_choice_fix.py b/tests/test_jev_choice_fix.py new file mode 100644 index 0000000..14c4e97 --- /dev/null +++ b/tests/test_jev_choice_fix.py @@ -0,0 +1,28 @@ +import pytest +from agent_framework.decisions.adapters.typesafe import build_request, normalize_answers, TypeSafeContractError +from agent_framework.decisions import client + + +def test_choice_wire_uses_verified_noul(): + questions = [client.choice('decision', ['CONTINUE','ROUTE','END_SESSION'])] + body = build_request('state', questions) + assert len(body['questions']) == 3 + assert all(x['type'] == 'noul' for x in body['questions'].values()) + answer = {'answers': {'__jev_q0_o0': {'noul': .12}, '__jev_q0_o1': {'noul': .94}, '__jev_q0_o2': {'noul': .07}}} + assert normalize_answers(answer, questions) == [{'name': 'decision', 'type': 'choice', 'choice': 'ROUTE', 'confidence': .94}] + + +def test_ambiguous_choice_fails_closed(): + questions = [client.choice('decision', ['CONTINUE','ROUTE'])] + with pytest.raises(TypeSafeContractError, match='AMBIGUOUS_DIRECT_CHOICE'): + normalize_answers({'answers': {'__jev_q0_o0': {'noul': .81}, '__jev_q0_o1': {'noul': .78}}}, questions) + + +def test_predicate_wire(): + questions = [client.predicate('allowed')] + assert normalize_answers({'answers': {'__jev_q0': {'noul': .9}}}, questions)[0]['probability'] == .9 + + +def test_score_fails_closed(): + with pytest.raises(TypeSafeContractError, match='UNSUPPORTED_DIRECT_SCORE'): + build_request('state', [client.score('score')]) diff --git a/tests/test_jev_decisions.py b/tests/test_jev_decisions.py new file mode 100644 index 0000000..10dc5d1 --- /dev/null +++ b/tests/test_jev_decisions.py @@ -0,0 +1,133 @@ +"""Offline JEV transport/contract tests; no live API key or network required.""" +import json +from unittest.mock import AsyncMock + +import pytest + +from agent_framework.decisions import client + + +@pytest.fixture(autouse=True) +def clean_environment(monkeypatch): + import os + for key in list(os.environ): + if key.startswith(('DECISION_', 'JEV_')) or key == 'AI_GATEWAY_API_KEY': + monkeypatch.delenv(key) + + +def answer(questions, *, confidence=.95): + return {'model': 'typesafe-ai/jev', 'answers': [ + {'name': q['name'], 'type': q['type'], **( + {'choice': q['choices'][0]['value'], 'confidence': confidence} if q['type'] == 'choice' else + {'probability': confidence} if q['type'] == 'predicate' else + {'score': 8.0, 'confidence': confidence})} for q in questions]} + + +@pytest.mark.asyncio +async def test_default_preserves_current_call_and_kwargs(monkeypatch): + current = AsyncMock(return_value='legacy response') + monkeypatch.setattr(client, '_post', lambda body: pytest.fail('JEV must not run')) + result = await client.invoke(type('LLM', (), {'ainvoke': current})(), [{'content': 'x'}], + decision_point='router', decision_questions=[], profile_name='router', temperature=0) + assert result == 'legacy response' + current.assert_awaited_once_with([{'content': 'x'}], profile_name='router', temperature=0) + + +@pytest.mark.asyncio +async def test_individual_selection_and_override(monkeypatch): + monkeypatch.setenv('DECISION_PROVIDER', 'jev') + monkeypatch.setenv('DECISION_ROUTER_PROVIDER', 'current') + assert not client.selected('router') + assert client.selected('route_continuity') + monkeypatch.setenv('DECISION_PROVIDER', 'current') + monkeypatch.setenv('DECISION_ROUTE_CONTINUITY_PROVIDER', 'jev') + assert client.selected('route_continuity') + assert not client.selected('router') + + +@pytest.mark.asyncio +async def test_typed_contract_and_shared_request(monkeypatch): + monkeypatch.setenv('DECISION_ROUTER_PROVIDER', 'jev') + requests = [] + def transport(body): + requests.append(body) + return answer(body['questions']) + monkeypatch.setattr(client, '_post', transport) + llm = type('LLM', (), {'ainvoke': AsyncMock()})() + result = json.loads(await client.invoke(llm, [{'content': 'context'}], decision_point='router', + decision_questions=[client.choice('intent', ['billing', 'orders']), client.predicate('allowed'), client.score('score')])) + assert result['intent'] == 'billing' and result['allowed'] is True and result['score'] == 8 + assert len(requests) == 1 and requests[0]['model'] == 'typesafe-ai/jev' + assert 'context' in requests[0]['input'] + llm.ainvoke.assert_not_awaited() + + +@pytest.mark.asyncio +@pytest.mark.parametrize('failure', ['network', 'unknown_choice', 'missing', 'duplicate', 'nan', 'low', 'no_confidence', 'wrong_type']) +async def test_invalid_or_uncertain_jev_falls_back_once(monkeypatch, failure): + monkeypatch.setenv('DECISION_ROUTER_PROVIDER', 'jev') + def transport(body): + if failure == 'network': raise TimeoutError() + response = answer(body['questions']) + a = response['answers'][0] + if failure == 'unknown_choice': a['choice'] = 'undeclared' + if failure == 'missing': response['answers'] = [] + if failure == 'duplicate': response['answers'] *= 2 + if failure == 'nan': a['confidence'] = float('nan') + if failure == 'low': a['confidence'] = .4 + if failure == 'no_confidence': a.pop('confidence') + if failure == 'wrong_type': a['type'] = 'predicate' + return response + monkeypatch.setattr(client, '_post', transport) + llm = type('LLM', (), {'ainvoke': AsyncMock(return_value='legacy')})() + assert await client.invoke(llm, [], decision_point='router', decision_questions=[client.choice('intent', ['a'])]) == 'legacy' + llm.ainvoke.assert_awaited_once() + + +@pytest.mark.asyncio +async def test_disabled_fallback_surfaces_failure(monkeypatch): + monkeypatch.setenv('DECISION_ROUTER_PROVIDER', 'jev') + monkeypatch.setenv('DECISION_FALLBACK_TO_CURRENT', 'false') + monkeypatch.setattr(client, '_post', lambda body: {'answers': []}) + llm = type('LLM', (), {'ainvoke': AsyncMock()})() + with pytest.raises(ValueError): + await client.invoke(llm, [], decision_point='router', decision_questions=[client.predicate('allowed')]) + llm.ainvoke.assert_not_awaited() + + +@pytest.mark.asyncio +async def test_generative_bypass_even_with_global_jev(monkeypatch): + monkeypatch.setenv('DECISION_PROVIDER', 'jev') + monkeypatch.setattr(client, '_post', lambda body: pytest.fail('rewrite must use current')) + llm = type('LLM', (), {'ainvoke': AsyncMock(return_value='rewritten')})() + assert await client.invoke(llm, [], decision_point='rewrite', decision_questions=[], decision_generative=True) == 'rewritten' + + +@pytest.mark.asyncio +async def test_multi_intent_preserves_order_literal_fragments(monkeypatch): + from types import SimpleNamespace + monkeypatch.setenv('DECISION_MULTI_INTENT_PROVIDER', 'jev') + candidates = {'operations': [{'source_text': 'pedido', 'intent': 'x'}, {'source_text': 'fatura', 'intent': 'y'}]} + llm = type('LLM', (), {'ainvoke': AsyncMock(return_value=json.dumps(candidates))})() + monkeypatch.setattr(client, '_post', lambda body: answer(body['questions'])) + result = json.loads(await client.multi_intent(llm, [], intents=[SimpleNamespace(name='billing')], text='pedido e fatura')) + assert [o['source_text'] for o in result['operations']] == ['pedido', 'fatura'] + llm.ainvoke.assert_awaited_once() + + +@pytest.mark.asyncio +async def test_legacy_semantic_classifier_and_jev_are_independent(monkeypatch, tmp_path): + from types import SimpleNamespace + from agent_framework.routing.enterprise_router import EnterpriseRouter + config = tmp_path / 'routing.yaml' + config.write_text('router: {fallback_agent: fallback}\nintents: []\n') + llm = type('LLM', (), {'ainvoke': AsyncMock(return_value='NO')})() + router = EnterpriseRouter(SimpleNamespace(ROUTING_CONFIG_PATH=str(config), ENABLE_LLM_ROUTER=False, ENABLE_ROUTE_STICKINESS=False), llm=llm) + expected = {'allowed_values': ['YES', 'NO'], 'semantic_classifier': {'enabled': True, 'prompt': 'Use meaning: {{ user_input }}'}} + monkeypatch.setenv('DECISION_WORKFLOW_EXPECTED_INPUT_PROVIDER', 'jev') + monkeypatch.setattr(client, '_post', lambda body: answer(body['questions'])) + value, _ = await router._classify_expected_input_semantically(text='yes', expected_input=expected, pause_prompt='Confirm?') + assert value == 'YES' + value, _ = await router._classify_expected_input_semantically(text='no', expected_input=expected, pause_prompt='Confirm?', component_name='transaction.confirmation') + assert value == 'NO' + llm.ainvoke.assert_awaited_once() diff --git a/tests/test_jev_endpoint.py b/tests/test_jev_endpoint.py new file mode 100644 index 0000000..93d29e9 --- /dev/null +++ b/tests/test_jev_endpoint.py @@ -0,0 +1,33 @@ +"""Offline regression tests: python -m unittest discover -s tests -p test_jev_endpoint.py""" +import importlib.util +import os +from pathlib import Path +import unittest +from unittest.mock import patch + +CLIENT = Path(__file__).resolve().parents[1] / 'libs/agent_framework/src/agent_framework/decisions/client.py' +spec = importlib.util.spec_from_file_location('jev_client_patch', CLIENT) +module = importlib.util.module_from_spec(spec) +spec.loader.exec_module(module) + +class EndpointTests(unittest.TestCase): + def test_default(self): + with patch.dict(os.environ, {}, clear=True): + self.assertEqual(module._jev_endpoint(), 'https://ai-gateway.vercel.sh/v1/decisions') + + def test_typesafe_endpoint(self): + with patch.dict(os.environ, {'JEV_ENDPOINT': 'https://api.typesafe.ai/v1/systemone'}, clear=True): + self.assertEqual(module._jev_endpoint(), 'https://api.typesafe.ai/v1/systemone') + + def test_reject_untrusted_host(self): + with patch.dict(os.environ, {'JEV_ENDPOINT': 'https://evil.example/v1/decisions'}, clear=True): + with self.assertRaises(ValueError): + module._jev_endpoint() + + def test_reject_http(self): + with patch.dict(os.environ, {'JEV_ENDPOINT': 'http://api.typesafe.ai/v1/systemone'}, clear=True): + with self.assertRaises(ValueError): + module._jev_endpoint() + +if __name__ == '__main__': + unittest.main() diff --git a/tests/test_jev_transport_standalone.py b/tests/test_jev_transport_standalone.py new file mode 100644 index 0000000..4b0d1f6 --- /dev/null +++ b/tests/test_jev_transport_standalone.py @@ -0,0 +1,210 @@ +"""Run without project dependencies: python3 tests/test_jev_transport_standalone.py.""" +import ast +import asyncio +import importlib.util +import json +import os +import logging +from types import SimpleNamespace +from pathlib import Path +import unittest +from unittest.mock import AsyncMock, patch + +ROOT = Path(__file__).resolve().parents[1] +MODULE = ROOT / 'libs/agent_framework/src/agent_framework/decisions/client.py' +spec = importlib.util.spec_from_file_location('jev_transport', MODULE) +client = importlib.util.module_from_spec(spec) +spec.loader.exec_module(client) + + +def response(questions, confidence=.95): + return {'model': 'typesafe-ai/jev', 'answers': [ + {'type': q['type'], 'name': q['name'], **( + {'choice': q['choices'][0]['value'], 'confidence': confidence} if q['type'] == 'choice' else + {'probability': confidence} if q['type'] == 'predicate' else + {'score': 8, 'confidence': confidence})} for q in questions]} + + +class DecisionTransportTests(unittest.IsolatedAsyncioTestCase): + def setUp(self): + self.env = patch.dict(os.environ, {k: v for k, v in os.environ.items() if not k.startswith(('DECISION_', 'JEV_'))}, clear=True) + self.env.start() + self.addCleanup(self.env.stop) + self.llm = type('LLM', (), {'ainvoke': AsyncMock(return_value='legacy')})() + + async def call(self, **kwargs): + return await client.invoke(self.llm, [{'content': 'test context'}], decision_point='router', + decision_questions=[client.choice('intent', ['billing', 'orders'])], **kwargs) + + async def test_default_passes_original_kwargs_without_network(self): + with patch.object(client, '_post', side_effect=AssertionError('network')): + self.assertEqual(await self.call(profile_name='router'), 'legacy') + self.llm.ainvoke.assert_awaited_once_with([{'content': 'test context'}], profile_name='router') + + async def test_individual_override(self): + os.environ.update(DECISION_PROVIDER='jev', DECISION_ROUTER_PROVIDER='current') + self.assertFalse(client.selected('router')) + self.assertTrue(client.selected('route_continuity')) + os.environ.update(DECISION_PROVIDER='current', DECISION_ROUTER_PROVIDER='jev') + self.assertTrue(client.selected('router')) + self.assertFalse(client.selected('route_continuity')) + os.environ['DECISION_JUDGE_ALUC_PROVIDER'] = 'jev' + self.assertTrue(client.selected('judge.groundedness', 'judge_aluc')) + os.environ['DECISION_JUDGE_GROUNDEDNESS_PROVIDER'] = 'current' + self.assertFalse(client.selected('judge.groundedness', 'judge_aluc')) + + async def test_typed_choices_predicates_scores_shared_request(self): + os.environ['DECISION_ROUTER_PROVIDER'] = 'jev' + with patch.object(client, '_post', side_effect=lambda b: response(b['questions'])) as post: + result = json.loads(await client.invoke(self.llm, [], decision_point='router', + decision_questions=[client.choice('intent', ['billing']), client.predicate('allowed'), client.score('score')])) + self.assertEqual((result['intent'], result['allowed'], result['score']), ('billing', True, 8)) + self.assertEqual(post.call_count, 1) + self.llm.ainvoke.assert_not_awaited() + + async def test_invalid_response_falls_back_once(self): + os.environ['DECISION_ROUTER_PROVIDER'] = 'jev' + for failure in ['missing', 'duplicate', 'choice', 'nan', 'missing_confidence', 'low_confidence', 'type', 'network']: + with self.subTest(failure=failure): + self.llm.ainvoke.reset_mock() + def transport(body): + if failure == 'network': raise TimeoutError() + r = response(body['questions']); a = r['answers'][0] + if failure == 'missing': r['answers'] = [] + if failure == 'duplicate': r['answers'] *= 2 + if failure == 'choice': a['choice'] = 'unknown' + if failure == 'nan': a['confidence'] = float('nan') + if failure == 'missing_confidence': a.pop('confidence') + if failure == 'low_confidence': a['confidence'] = .1 + if failure == 'type': a['type'] = 'predicate' + return r + with patch.object(client, '_post', side_effect=transport): + self.assertEqual(await self.call(), 'legacy') + self.llm.ainvoke.assert_awaited_once() + + async def test_no_fallback_surfaces_error(self): + os.environ.update(DECISION_ROUTER_PROVIDER='jev', DECISION_FALLBACK_TO_CURRENT='false') + with patch.object(client, '_post', return_value={'answers': []}): + with self.assertRaises(ValueError): await self.call() + self.llm.ainvoke.assert_not_awaited() + + async def test_generative_bypass(self): + os.environ['DECISION_PROVIDER'] = 'jev' + with patch.object(client, '_post', side_effect=AssertionError('network')): + self.assertEqual(await self.call(decision_generative=True), 'legacy') + + async def test_invalid_provider_rejected(self): + os.environ['DECISION_ROUTER_PROVIDER'] = 'typo' + with self.assertRaises(ValueError): await self.call() + + async def test_custom_renderer_failure_falls_back(self): + os.environ['DECISION_ROUTER_PROVIDER'] = 'jev' + with patch.object(client, '_post', side_effect=lambda b: response(b['questions'])): + self.assertEqual(await self.call(decision_render=lambda d: d['missing']), 'legacy') + + async def test_threshold_override(self): + os.environ.update(DECISION_ROUTER_PROVIDER='jev', DECISION_ROUTER_MIN_CONFIDENCE='.99') + with patch.object(client, '_post', side_effect=lambda b: response(b['questions'])): + self.assertEqual(await self.call(), 'legacy') + + async def test_predicate_rejects_bool_and_out_of_range(self): + for probability in [True, -1, 2, float('inf'), None]: + with self.subTest(probability=probability): + with patch.object(client, '_post', return_value={'answers': [{'type': 'predicate', 'name': 'allowed', 'probability': probability}]}): + with self.assertRaises(ValueError): + await client.evaluate('guardrail', [], [client.predicate('allowed')]) + + async def test_transport_requires_key_before_request(self): + os.environ.pop('AI_GATEWAY_API_KEY', None) + with patch.object(client.urllib.request, 'urlopen') as request: + with self.assertRaises(ValueError): client._post({}) + request.assert_not_called() + + async def test_transport_endpoint_auth_and_timeout(self): + os.environ.update(AI_GATEWAY_API_KEY='test-key', JEV_TIMEOUT_SECONDS='3') + import io + with patch.object(client.urllib.request, 'urlopen', return_value=io.StringIO('{"answers": []}')) as request: + self.assertEqual(client._post({'model': 'typesafe-ai/jev'}), {'answers': []}) + req = request.call_args.args[0] + self.assertEqual(req.full_url, 'https://ai-gateway.vercel.sh/v1/decisions') + self.assertEqual(req.get_header('Authorization'), 'Bearer test-key') + self.assertEqual(request.call_args.kwargs['timeout'], 3) + + async def test_integrated_modules_compile(self): + for path in (ROOT / 'libs/agent_framework/src/agent_framework').rglob('*.py'): + with self.subTest(path=path): ast.parse(path.read_text(), filename=str(path)) + + + +def load_functions(relative_path, names, namespace): + """Execute actual function bodies in isolation from unavailable optional dependencies.""" + path = ROOT / 'libs/agent_framework/src/agent_framework' / relative_path + tree = ast.parse(path.read_text()) + nodes = [node for node in ast.walk(tree) if isinstance(node, (ast.FunctionDef, ast.AsyncFunctionDef)) and node.name in names] + module = ast.Module(body=[ast.ImportFrom(module='__future__', names=[ast.alias(name='annotations')], level=0)] + nodes, type_ignores=[]) + exec(compile(ast.fix_missing_locations(module), str(path), 'exec'), namespace) + return namespace + + +class DecisionCallsiteTests(unittest.IsolatedAsyncioTestCase): + setUp = DecisionTransportTests.setUp + + async def test_actual_continuity_classifier_jev(self): + os.environ['DECISION_ROUTE_CONTINUITY_PROVIDER'] = 'jev' + ns = load_functions('routing/continuity.py', {'_classify'}, { + 'json': json, 'decision_invoke': client.invoke, 'choice': client.choice, + 'ContinuityEvaluation': SimpleNamespace}) + self_obj = SimpleNamespace(llm=self.llm, profile_name='route_continuity', + _agent_capabilities=lambda intents: {'billing': ['invoices']}, + _compact_history=lambda history: history, _parse_json=json.loads) + with patch.object(client, '_post', side_effect=lambda b: response(b['questions'])): + result = await ns['_classify'](self_obj, {}, text='continue', active_agent='billing', intents=[]) + self.assertEqual(result.decision, 'CONTINUE') + self.assertGreater(result.confidence, .9) + self.llm.ainvoke.assert_not_awaited() + + async def test_actual_router_derives_agent_from_catalog(self): + os.environ['DECISION_ROUTER_PROVIDER'] = 'jev' + ns = load_functions('routing/enterprise_router.py', {'_route_by_llm'}, { + 'json': json, 'decision_invoke': client.invoke, 'choice': client.choice, 'RouteDecision': SimpleNamespace}) + intent = SimpleNamespace(enabled=True, name='invoice', agent='billing', description='Invoice', examples=[], mcp_tools=[], domain='telecom') + self_obj = SimpleNamespace(llm=self.llm, intents=[intent], fallback_agent='fallback', _parse_json=json.loads, + _agent_for_intent=lambda name: 'billing', _domain_for_intent=lambda name: 'telecom', _tools_for_intent=lambda name: ['read_invoice']) + with patch.object(client, '_post', side_effect=lambda b: response(b['questions'])): + result = await ns['_route_by_llm'](self_obj, 'invoice', {}) + self.assertEqual((result.intent, result.agent, result.mcp_tools), ('invoice', 'billing', ['read_invoice'])) + + async def test_actual_reconciliation_preserves_candidate_values(self): + os.environ['DECISION_TRANSACTION_PARAMETER_RECONCILIATION_PROVIDER'] = 'jev' + ns = load_functions('runtime/transaction_parameters.py', {'reconcile_transaction_parameters', '_response_text', '_coerce'}, { + 'json': json, 'logger': logging.getLogger('test'), 'parse_json_object': json.loads, + 'decision_invoke': client.invoke, 'selected': client.selected, 'choice': client.choice, + '_EMPTY_VALUES': (None, '', {}, [])}) + self.llm.ainvoke.return_value = json.dumps({'fields': { + 'id': {'value': '42', 'decision': 'resolved', 'source': 'current'}, + 'empty': {'value': None, 'decision': 'unresolved', 'source': ''}}}) + with patch.object(client, '_post', side_effect=lambda b: response(b['questions'])): + result = await ns['reconcile_transaction_parameters'](self.llm, text='42', tool_name='read', parameter_names=['id', 'empty']) + self.assertEqual(result['values'], {'id': '42'}) + self.assertEqual(result['decisions']['empty'], 'unresolved') + self.llm.ainvoke.assert_awaited_once() + + async def test_actual_calibrated_judge_and_generative_fallback(self): + os.environ['DECISION_JUDGE_RQLT_PROVIDER'] = 'jev' + ns = load_functions('judges/calibrated/llm_client.py', {'classify'}, { + 'decision_invoke': client.invoke, 'predicate': client.predicate, 'score': client.score, + 'choice': client.choice, '_parse_json': json.loads}) + self_obj = SimpleNamespace(llm=self.llm, default_profile='judge', _build_prompt=lambda task, payload: 'quality rubric') + with patch.object(client, '_post', side_effect=lambda b: response(b['questions'])): + result = await ns['classify'](self_obj, 'RQLT', {}) + self.assertTrue(result['allowed']) + self.assertEqual(result['score'], 8) + self.llm.ainvoke.assert_not_awaited() + self.llm.ainvoke.return_value = '{"text":"fallback response"}' + os.environ['DECISION_PROVIDER'] = 'jev' + with patch.object(client, '_post', side_effect=AssertionError('no generative JEV')): + self.assertEqual(await ns['classify'](self_obj, 'FALLBACK', {}), {'text': 'fallback response'}) + + +if __name__ == '__main__': + unittest.main(verbosity=2) diff --git a/tests/test_jev_typesafe_adapter.py b/tests/test_jev_typesafe_adapter.py new file mode 100644 index 0000000..074b3ef --- /dev/null +++ b/tests/test_jev_typesafe_adapter.py @@ -0,0 +1,176 @@ +import json +from unittest.mock import AsyncMock +from urllib.error import HTTPError +import pytest +from agent_framework.decisions import client +from agent_framework.decisions.adapters.typesafe import build_request, normalize_answers, TypeSafeContractError + +@pytest.mark.asyncio +async def test_default_provider_unchanged(monkeypatch): + monkeypatch.delenv("DECISION_PROVIDER", raising=False) + llm = type("LLM", (), {"ainvoke": AsyncMock(return_value="legacy")})() + monkeypatch.setattr(client, "_post", lambda body: pytest.fail("JEV transport called")) + assert await client.invoke(llm, [{"content": "x"}], decision_point="route_continuity", + decision_questions=[], profile_name="route_continuity") == "legacy" + llm.ainvoke.assert_awaited_once_with([{"content": "x"}], profile_name="route_continuity") + +@pytest.mark.asyncio +async def test_typesafe_noul(monkeypatch): + monkeypatch.setenv("JEV_ENDPOINT", "https://api.typesafe.ai/v1/systemone") + monkeypatch.setenv("JEV_MODEL", "jev-latest") + captured = [] + def transport(body): + captured.append(body) + return {"model": "jev-1.14.0", "answers": {"__jev_q0": {"type": "noul", "noul": .98}}} + monkeypatch.setattr(client, "_post", transport) + result = await client.evaluate("guardrail.pinj", [], [client.predicate("allowed")]) + assert result["allowed"] is True and result["confidence"] == pytest.approx(.98) + assert captured[0]["questions"]["__jev_q0"]["type"] == "noul" + assert "state" in captured[0] and "input" not in captured[0] + +@pytest.mark.asyncio +async def test_vercel_contract_not_modified(monkeypatch): + monkeypatch.setenv("JEV_ENDPOINT", "https://ai-gateway.vercel.sh/v1/decisions") + captured = [] + def transport(body): + captured.append(body) + return {"answers": [{"name": "allowed", "type": "predicate", "probability": .95}]} + monkeypatch.setattr(client, "_post", transport) + result = await client.evaluate("guardrail.pinj", [], [client.predicate("allowed")]) + assert result["allowed"] is True + assert "input" in captured[0] and "state" not in captured[0] + assert isinstance(captured[0]["questions"], list) + +@pytest.mark.asyncio +async def test_invalid_direct_response_falls_back_once(monkeypatch): + monkeypatch.setenv("DECISION_PROVIDER", "jev") + monkeypatch.setenv("JEV_ENDPOINT", "https://api.typesafe.ai/v1/systemone") + monkeypatch.setattr(client, "_post", lambda body: {"answers": {}}) + llm = type("LLM", (), {"ainvoke": AsyncMock(return_value="original")})() + assert await client.invoke(llm, [], decision_point="guardrail.revprec", + decision_questions=[client.predicate("allowed")]) == "original" + llm.ainvoke.assert_awaited_once() + +@pytest.mark.asyncio +async def test_http_error_diagnostic_without_body(monkeypatch, caplog): + monkeypatch.setenv("DECISION_PROVIDER", "jev") + monkeypatch.setenv("JEV_ENDPOINT", "https://api.typesafe.ai/v1/systemone") + def reject(body): + raise HTTPError("https://api.typesafe.ai/v1/systemone", 400, "SECRET_BODY", {}, None) + monkeypatch.setattr(client, "_post", reject) + llm = type("LLM", (), {"ainvoke": AsyncMock(return_value="original")})() + assert await client.invoke(llm, [], decision_point="route_continuity", + decision_questions=[client.choice("decision", ["CONTINUE", "ROUTE"])]) == "original" + assert "http_status=400" in caplog.text + assert "SECRET_BODY" not in caplog.text + +@pytest.mark.asyncio +async def test_fallback_disabled_raises(monkeypatch): + monkeypatch.setenv("DECISION_PROVIDER", "jev") + monkeypatch.setenv("DECISION_FALLBACK_TO_CURRENT", "false") + monkeypatch.setenv("JEV_ENDPOINT", "https://api.typesafe.ai/v1/systemone") + monkeypatch.setattr(client, "_post", lambda body: {"answers": {}}) + llm = type("LLM", (), {"ainvoke": AsyncMock()})() + with pytest.raises(TypeSafeContractError): + await client.invoke(llm, [], decision_point="guardrail.pinj", decision_questions=[client.predicate("allowed")]) + llm.ainvoke.assert_not_awaited() + +@pytest.mark.asyncio +async def test_http_422_schema_diagnostic_redacts_user_data(monkeypatch, caplog): + import io + monkeypatch.setenv("DECISION_PROVIDER", "jev") + monkeypatch.setenv("JEV_ENDPOINT", "https://api.typesafe.ai/v1/systemone") + def reject(body): + error = {"detail": [{"type": "missing", "loc": ["body", "questions", "private-user-input", "choices"], + "msg": "SECRET_PASSWORD", "input": "SECRET_PASSWORD"}]} + raise HTTPError("https://api.typesafe.ai/v1/systemone", 422, "invalid", {}, + io.BytesIO(json.dumps(error).encode())) + monkeypatch.setattr(client, "_post", reject) + llm = type("LLM", (), {"ainvoke": AsyncMock(return_value="original")})() + assert await client.invoke(llm, [], decision_point="route_continuity", + decision_questions=[client.choice("decision", ["CONTINUE", "ROUTE"])]) == "original" + assert "http_status=422" in caplog.text + assert "http_schema=missing:body.questions.choices" in caplog.text + assert "SECRET_PASSWORD" not in caplog.text + assert "private-user-input" not in caplog.text + +@pytest.mark.asyncio +async def test_low_confidence_has_specific_error_code(monkeypatch, caplog): + monkeypatch.setenv("DECISION_PROVIDER", "jev") + monkeypatch.setenv("JEV_ENDPOINT", "https://api.typesafe.ai/v1/systemone") + monkeypatch.setenv("JEV_MIN_CONFIDENCE", "0.9") + monkeypatch.setattr(client, "_post", lambda body: {"answers": {"__jev_q0": {"type": "noul", "noul": 0.6}}}) + llm = type("LLM", (), {"ainvoke": AsyncMock(return_value="original")})() + assert await client.invoke(llm, [], decision_point="guardrail.revprec", + decision_questions=[client.predicate("allowed")]) == "original" + assert "error_code=CONFIDENCE_BELOW_THRESHOLD" in caplog.text + +@pytest.mark.asyncio +async def test_revprec_noul_probability_not_misread_as_confidence(monkeypatch, caplog): + monkeypatch.setenv("JEV_ENDPOINT", "https://api.typesafe.ai/v1/systemone") + monkeypatch.setenv("JEV_MIN_CONFIDENCE", "0.7") + monkeypatch.setattr(client, "_post", lambda body: {"answers": {"__jev_q0": {"type": "noul", "noul": .61}}}) + with pytest.raises(ValueError, match="CONFIDENCE_BELOW_THRESHOLD"): + await client.evaluate("guardrail.revprec", [], [client.predicate("allowed")]) + assert "('allowed', 0.61)" in caplog.text + assert "confidence=0.6100" in caplog.text + +@pytest.mark.asyncio +async def test_revprec_negative_predicate_confidence(monkeypatch): + monkeypatch.setenv("JEV_ENDPOINT", "https://api.typesafe.ai/v1/systemone") + monkeypatch.setenv("JEV_MIN_CONFIDENCE", "0.7") + monkeypatch.setattr(client, "_post", lambda body: {"answers": {"__jev_q0": {"type": "noul", "noul": .12}}}) + result = await client.evaluate("guardrail.revprec", [], [client.predicate("allowed")]) + assert result["allowed"] is False + assert result["confidence"] == pytest.approx(.88) + +@pytest.mark.asyncio +async def test_opt_in_choice_diagnostics_rejected_and_fallback(monkeypatch, caplog): + import logging + monkeypatch.setenv("DECISION_PROVIDER", "jev") + monkeypatch.setenv("JEV_ENDPOINT", "https://api.typesafe.ai/v1/systemone") + monkeypatch.setenv("JEV_DECISION_DIAGNOSTICS", "true") + monkeypatch.setenv("JEV_MIN_CONFIDENCE", "0.60") + monkeypatch.setattr(client, "_post", lambda body: {"model": "jev-1.14.0", "answers": { + "__jev_q0_o0": {"type": "noul", "noul": .56}, + "__jev_q0_o1": {"type": "noul", "noul": .35}}}) + llm = type("LLM", (), {"ainvoke": AsyncMock(return_value="current-result")})() + with caplog.at_level(logging.INFO, logger="agent_framework.decisions"): + output = await client.invoke(llm, [{"content": "PRIVATE_CUSTOMER_TEXT"}], + decision_point="transaction_intent_shift", + decision_questions=[client.choice("decision", ["CONTINUE", "SHIFT"])]) + assert output == "current-result" + assert "jev.choice.diagnostics" in caplog.text + assert '"option_probabilities":[0.56,0.35]' in caplog.text + assert "status=rejected_low_confidence" in caplog.text + assert "PRIVATE_CUSTOMER_TEXT" not in caplog.text + +@pytest.mark.asyncio +async def test_opt_in_choice_diagnostics_accepted(monkeypatch, caplog): + import logging + monkeypatch.setenv("JEV_ENDPOINT", "https://api.typesafe.ai/v1/systemone") + monkeypatch.setenv("JEV_DECISION_DIAGNOSTICS", "true") + monkeypatch.setenv("JEV_MIN_CONFIDENCE", "0.60") + monkeypatch.setattr(client, "_post", lambda body: {"model": "jev-1.14.0", "answers": { + "__jev_q0_o0": {"type": "noul", "noul": .2}, + "__jev_q0_o1": {"type": "noul", "noul": .88}}}) + with caplog.at_level(logging.INFO, logger="agent_framework.decisions"): + result = await client.evaluate("transaction_intent_shift", [], + [client.choice("decision", ["CONTINUE", "SHIFT"])]) + assert result["decision"] == "SHIFT" + assert result["confidence"] == pytest.approx(.88) + assert '"selected_option_index":1' in caplog.text + assert "status=accepted" in caplog.text + +@pytest.mark.asyncio +async def test_diagnostics_off_by_default(monkeypatch, caplog): + import logging + monkeypatch.delenv("JEV_DECISION_DIAGNOSTICS", raising=False) + monkeypatch.setenv("JEV_ENDPOINT", "https://api.typesafe.ai/v1/systemone") + monkeypatch.setenv("JEV_MIN_CONFIDENCE", "0.6") + monkeypatch.setattr(client, "_post", lambda body: {"answers": { + "__jev_q0_o0": {"noul": .9}, "__jev_q0_o1": {"noul": .1}}}) + with caplog.at_level(logging.INFO, logger="agent_framework.decisions"): + await client.evaluate("transaction_intent_shift", [], [client.choice("decision", ["A", "B"])]) + assert "jev.choice.diagnostics" not in caplog.text + assert "jev.decision.diagnostics" not in caplog.text diff --git a/tests/test_jev_typesafe_direct.py b/tests/test_jev_typesafe_direct.py new file mode 100644 index 0000000..741884f --- /dev/null +++ b/tests/test_jev_typesafe_direct.py @@ -0,0 +1,28 @@ +import json +from unittest.mock import patch +import pytest +from agent_framework.decisions import client + +@pytest.mark.asyncio +async def test_direct_predicate_contract(monkeypatch): + monkeypatch.setenv('JEV_ENDPOINT','https://api.typesafe.ai/v1/systemone') + monkeypatch.setenv('JEV_MODEL','jev-latest') + monkeypatch.setenv('JEV_MIN_CONFIDENCE','0.7') + captured=[] + def fake_post(body): + captured.append(body) + return {'model':'jev-latest','answers':{'billing':{'type':'noul','noul':0.98}}} + monkeypatch.setattr(client,'_post',fake_post) + result=await client.evaluate('test',[{'role':'user','content':'fatura'}],[client.predicate('billing')]) + assert result['billing'] is True + assert result['confidence'] == pytest.approx(.98) + assert captured[0]['model']=='jev-latest' + assert 'state' in captured[0] and 'input' not in captured[0] + assert captured[0]['questions']['billing']['type']=='noul' + +@pytest.mark.asyncio +async def test_direct_missing_answers_rejected(monkeypatch): + monkeypatch.setenv('JEV_ENDPOINT','https://api.typesafe.ai/v1/systemone') + monkeypatch.setattr(client,'_post',lambda body:{'answers':{}}) + with pytest.raises(ValueError): + await client.evaluate('test',[],[client.predicate('billing')])