agent-engine-runner-shared 0.11.10__tar.gz → 0.11.11__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {agent_engine_runner_shared-0.11.10 → agent_engine_runner_shared-0.11.11}/CHANGELOG.md +14 -0
- {agent_engine_runner_shared-0.11.10 → agent_engine_runner_shared-0.11.11}/Makefile +12 -2
- {agent_engine_runner_shared-0.11.10 → agent_engine_runner_shared-0.11.11}/PKG-INFO +5 -4
- {agent_engine_runner_shared-0.11.10 → agent_engine_runner_shared-0.11.11}/docs/api.md +39 -1
- {agent_engine_runner_shared-0.11.10 → agent_engine_runner_shared-0.11.11}/pyproject.toml +6 -4
- {agent_engine_runner_shared-0.11.10 → agent_engine_runner_shared-0.11.11}/src/agent_engine_runner_shared/connectors/README.md +6 -10
- {agent_engine_runner_shared-0.11.10 → agent_engine_runner_shared-0.11.11}/src/agent_engine_runner_shared/connectors/__init__.py +1 -5
- agent_engine_runner_shared-0.11.11/src/agent_engine_runner_shared/connectors/bundle.py +93 -0
- {agent_engine_runner_shared-0.11.10 → agent_engine_runner_shared-0.11.11}/src/agent_engine_runner_shared/connectors/create_tool.py +35 -3
- {agent_engine_runner_shared-0.11.10 → agent_engine_runner_shared-0.11.11}/src/agent_engine_runner_shared/connectors/definitions.py +1 -1
- {agent_engine_runner_shared-0.11.10 → agent_engine_runner_shared-0.11.11}/src/agent_engine_runner_shared/connectors/generate/README.md +1 -1
- {agent_engine_runner_shared-0.11.10 → agent_engine_runner_shared-0.11.11}/src/agent_engine_runner_shared/connectors/generate/authoring.py +4 -1
- {agent_engine_runner_shared-0.11.10 → agent_engine_runner_shared-0.11.11}/src/agent_engine_runner_shared/connectors/generate/modes.py +25 -8
- {agent_engine_runner_shared-0.11.10 → agent_engine_runner_shared-0.11.11}/src/agent_engine_runner_shared/connectors/materialize.py +3 -12
- {agent_engine_runner_shared-0.11.10 → agent_engine_runner_shared-0.11.11}/src/agent_engine_runner_shared/custom_events.py +7 -0
- {agent_engine_runner_shared-0.11.10 → agent_engine_runner_shared-0.11.11}/src/agent_engine_runner_shared/mcp_oauth.py +66 -45
- {agent_engine_runner_shared-0.11.10 → agent_engine_runner_shared-0.11.11}/src/agent_engine_runner_shared/mcp_oauth_cli.py +52 -33
- {agent_engine_runner_shared-0.11.10 → agent_engine_runner_shared-0.11.11}/src/agent_engine_runner_shared/mcp_tools.py +198 -78
- {agent_engine_runner_shared-0.11.10 → agent_engine_runner_shared-0.11.11}/src/agent_engine_runner_shared/models.py +10 -0
- {agent_engine_runner_shared-0.11.10 → agent_engine_runner_shared-0.11.11}/src/agent_engine_runner_shared/progress.py +7 -0
- {agent_engine_runner_shared-0.11.10 → agent_engine_runner_shared-0.11.11}/src/agent_engine_runner_shared/runtime.py +42 -2
- {agent_engine_runner_shared-0.11.10 → agent_engine_runner_shared-0.11.11}/src/agent_engine_runner_shared/server/aer.py +20 -1
- {agent_engine_runner_shared-0.11.10 → agent_engine_runner_shared-0.11.11}/src/agent_engine_runner_shared/server/tool.py +84 -20
- {agent_engine_runner_shared-0.11.10 → agent_engine_runner_shared-0.11.11}/src/agent_engine_runner_shared/structured_logging.py +33 -1
- {agent_engine_runner_shared-0.11.10 → agent_engine_runner_shared-0.11.11}/src/agent_engine_runner_shared/workflow/client.py +68 -24
- {agent_engine_runner_shared-0.11.10 → agent_engine_runner_shared-0.11.11}/tests/corpus/README.md +5 -3
- agent_engine_runner_shared-0.11.11/tests/corpus/fetch_corpus.py +78 -0
- {agent_engine_runner_shared-0.11.10 → agent_engine_runner_shared-0.11.11}/tests/corpus/manifest.json +102 -100
- {agent_engine_runner_shared-0.11.10 → agent_engine_runner_shared-0.11.11}/tests/corpus/test_api_corpus.py +2 -1
- {agent_engine_runner_shared-0.11.10 → agent_engine_runner_shared-0.11.11}/tests/pact/test_oe_provider_verification.py +9 -1
- agent_engine_runner_shared-0.11.11/tests/unit/connectors/test_bundle.py +99 -0
- {agent_engine_runner_shared-0.11.10 → agent_engine_runner_shared-0.11.11}/tests/unit/connectors/test_create_tool.py +174 -0
- {agent_engine_runner_shared-0.11.10 → agent_engine_runner_shared-0.11.11}/tests/unit/connectors/test_materialize.py +4 -58
- {agent_engine_runner_shared-0.11.10 → agent_engine_runner_shared-0.11.11}/tests/unit/test_aer_a2a_registration.py +2 -1
- {agent_engine_runner_shared-0.11.10 → agent_engine_runner_shared-0.11.11}/tests/unit/test_aer_cancelled_turn.py +3 -0
- {agent_engine_runner_shared-0.11.10 → agent_engine_runner_shared-0.11.11}/tests/unit/test_aer_capability_advertise.py +2 -1
- {agent_engine_runner_shared-0.11.10 → agent_engine_runner_shared-0.11.11}/tests/unit/test_aer_chunk_delivery_reliability.py +1 -0
- {agent_engine_runner_shared-0.11.10 → agent_engine_runner_shared-0.11.11}/tests/unit/test_aer_durable_attempt.py +72 -1
- {agent_engine_runner_shared-0.11.10 → agent_engine_runner_shared-0.11.11}/tests/unit/test_aer_llm_invocation_signal.py +3 -1
- {agent_engine_runner_shared-0.11.10 → agent_engine_runner_shared-0.11.11}/tests/unit/test_aer_metadata_payload.py +1 -0
- {agent_engine_runner_shared-0.11.10 → agent_engine_runner_shared-0.11.11}/tests/unit/test_aer_policy_denied.py +3 -1
- {agent_engine_runner_shared-0.11.10 → agent_engine_runner_shared-0.11.11}/tests/unit/test_aer_session_finish.py +1 -0
- {agent_engine_runner_shared-0.11.10 → agent_engine_runner_shared-0.11.11}/tests/unit/test_aer_timeout_signal.py +3 -1
- {agent_engine_runner_shared-0.11.10 → agent_engine_runner_shared-0.11.11}/tests/unit/test_aer_trace_context.py +1 -0
- {agent_engine_runner_shared-0.11.10 → agent_engine_runner_shared-0.11.11}/tests/unit/test_drain.py +2 -1
- {agent_engine_runner_shared-0.11.10 → agent_engine_runner_shared-0.11.11}/tests/unit/test_emit_custom_event.py +46 -10
- {agent_engine_runner_shared-0.11.10 → agent_engine_runner_shared-0.11.11}/tests/unit/test_emit_progress.py +65 -0
- {agent_engine_runner_shared-0.11.10 → agent_engine_runner_shared-0.11.11}/tests/unit/test_graph_warm.py +1 -0
- {agent_engine_runner_shared-0.11.10 → agent_engine_runner_shared-0.11.11}/tests/unit/test_hitl_interrupt.py +1 -0
- agent_engine_runner_shared-0.11.11/tests/unit/test_mcp_era_compat.py +352 -0
- {agent_engine_runner_shared-0.11.10 → agent_engine_runner_shared-0.11.11}/tests/unit/test_mcp_oauth.py +89 -36
- {agent_engine_runner_shared-0.11.10 → agent_engine_runner_shared-0.11.11}/tests/unit/test_mcp_oauth_cli.py +93 -38
- {agent_engine_runner_shared-0.11.10 → agent_engine_runner_shared-0.11.11}/tests/unit/test_mcp_tools.py +184 -171
- {agent_engine_runner_shared-0.11.10 → agent_engine_runner_shared-0.11.11}/tests/unit/test_runtime_models.py +72 -0
- {agent_engine_runner_shared-0.11.10 → agent_engine_runner_shared-0.11.11}/tests/unit/test_structured_logging.py +172 -0
- {agent_engine_runner_shared-0.11.10 → agent_engine_runner_shared-0.11.11}/tests/unit/test_tls_client_integration.py +3 -1
- {agent_engine_runner_shared-0.11.10 → agent_engine_runner_shared-0.11.11}/tests/unit/test_tool.py +126 -9
- {agent_engine_runner_shared-0.11.10 → agent_engine_runner_shared-0.11.11}/tests/unit/test_tool_server_startup.py +50 -106
- {agent_engine_runner_shared-0.11.10 → agent_engine_runner_shared-0.11.11}/tests/unit/workflow/test_client.py +115 -2
- agent_engine_runner_shared-0.11.10/src/agent_engine_runner_shared/connectors/bundle.py +0 -194
- agent_engine_runner_shared-0.11.10/tests/corpus/fetch_corpus.py +0 -52
- agent_engine_runner_shared-0.11.10/tests/unit/connectors/test_bundle.py +0 -174
- {agent_engine_runner_shared-0.11.10 → agent_engine_runner_shared-0.11.11}/Dockerfile +0 -0
- {agent_engine_runner_shared-0.11.10 → agent_engine_runner_shared-0.11.11}/LICENSE +0 -0
- {agent_engine_runner_shared-0.11.10 → agent_engine_runner_shared-0.11.11}/README.md +0 -0
- {agent_engine_runner_shared-0.11.10 → agent_engine_runner_shared-0.11.11}/pydoc-markdown.yml +0 -0
- {agent_engine_runner_shared-0.11.10 → agent_engine_runner_shared-0.11.11}/pyrightconfig.json +0 -0
- {agent_engine_runner_shared-0.11.10 → agent_engine_runner_shared-0.11.11}/scripts/agentic-vendored-wheel-check.sh +0 -0
- {agent_engine_runner_shared-0.11.10 → agent_engine_runner_shared-0.11.11}/src/agent_engine_runner_shared/__init__.py +0 -0
- {agent_engine_runner_shared-0.11.10 → agent_engine_runner_shared-0.11.11}/src/agent_engine_runner_shared/__main__.py +0 -0
- {agent_engine_runner_shared-0.11.10 → agent_engine_runner_shared-0.11.11}/src/agent_engine_runner_shared/a2a.py +0 -0
- {agent_engine_runner_shared-0.11.10 → agent_engine_runner_shared-0.11.11}/src/agent_engine_runner_shared/a2a_auth.py +0 -0
- {agent_engine_runner_shared-0.11.10 → agent_engine_runner_shared-0.11.11}/src/agent_engine_runner_shared/agent_config.py +0 -0
- {agent_engine_runner_shared-0.11.10 → agent_engine_runner_shared-0.11.11}/src/agent_engine_runner_shared/async_utils.py +0 -0
- {agent_engine_runner_shared-0.11.10 → agent_engine_runner_shared-0.11.11}/src/agent_engine_runner_shared/caller_trace.py +0 -0
- {agent_engine_runner_shared-0.11.10 → agent_engine_runner_shared-0.11.11}/src/agent_engine_runner_shared/checkpoint_workspace.py +0 -0
- {agent_engine_runner_shared-0.11.10 → agent_engine_runner_shared-0.11.11}/src/agent_engine_runner_shared/connectors/executor.py +0 -0
- {agent_engine_runner_shared-0.11.10 → agent_engine_runner_shared-0.11.11}/src/agent_engine_runner_shared/connectors/generate/__init__.py +0 -0
- {agent_engine_runner_shared-0.11.10 → agent_engine_runner_shared-0.11.11}/src/agent_engine_runner_shared/connectors/generate/catalog.py +0 -0
- {agent_engine_runner_shared-0.11.10 → agent_engine_runner_shared-0.11.11}/src/agent_engine_runner_shared/connectors/generate/naming.py +0 -0
- {agent_engine_runner_shared-0.11.10 → agent_engine_runner_shared-0.11.11}/src/agent_engine_runner_shared/connectors/generate/parameters.py +0 -0
- {agent_engine_runner_shared-0.11.10 → agent_engine_runner_shared-0.11.11}/src/agent_engine_runner_shared/connectors/generate/security.py +0 -0
- {agent_engine_runner_shared-0.11.10 → agent_engine_runner_shared-0.11.11}/src/agent_engine_runner_shared/connectors/generate/spec.py +0 -0
- {agent_engine_runner_shared-0.11.10 → agent_engine_runner_shared-0.11.11}/src/agent_engine_runner_shared/connectors/runtime.py +0 -0
- {agent_engine_runner_shared-0.11.10 → agent_engine_runner_shared-0.11.11}/src/agent_engine_runner_shared/context.py +0 -0
- {agent_engine_runner_shared-0.11.10 → agent_engine_runner_shared-0.11.11}/src/agent_engine_runner_shared/db_config.py +0 -0
- {agent_engine_runner_shared-0.11.10 → agent_engine_runner_shared-0.11.11}/src/agent_engine_runner_shared/db_naming.py +0 -0
- {agent_engine_runner_shared-0.11.10 → agent_engine_runner_shared-0.11.11}/src/agent_engine_runner_shared/error_reporting.py +0 -0
- {agent_engine_runner_shared-0.11.10 → agent_engine_runner_shared-0.11.11}/src/agent_engine_runner_shared/execution.py +0 -0
- {agent_engine_runner_shared-0.11.10 → agent_engine_runner_shared-0.11.11}/src/agent_engine_runner_shared/generated/__init__.py +0 -0
- {agent_engine_runner_shared-0.11.10 → agent_engine_runner_shared-0.11.11}/src/agent_engine_runner_shared/generated/workflow/__init__.py +0 -0
- {agent_engine_runner_shared-0.11.10 → agent_engine_runner_shared-0.11.11}/src/agent_engine_runner_shared/generated/workflow/v1/__init__.py +0 -0
- {agent_engine_runner_shared-0.11.10 → agent_engine_runner_shared-0.11.11}/src/agent_engine_runner_shared/generated/workflow/v1/activity_pb2.py +0 -0
- {agent_engine_runner_shared-0.11.10 → agent_engine_runner_shared-0.11.11}/src/agent_engine_runner_shared/generated/workflow/v1/activity_pb2.pyi +0 -0
- {agent_engine_runner_shared-0.11.10 → agent_engine_runner_shared-0.11.11}/src/agent_engine_runner_shared/generated/workflow/v1/common_pb2.py +0 -0
- {agent_engine_runner_shared-0.11.10 → agent_engine_runner_shared-0.11.11}/src/agent_engine_runner_shared/generated/workflow/v1/common_pb2.pyi +0 -0
- {agent_engine_runner_shared-0.11.10 → agent_engine_runner_shared-0.11.11}/src/agent_engine_runner_shared/generated/workflow/v1/runtime_pb2.py +0 -0
- {agent_engine_runner_shared-0.11.10 → agent_engine_runner_shared-0.11.11}/src/agent_engine_runner_shared/generated/workflow/v1/runtime_pb2.pyi +0 -0
- {agent_engine_runner_shared-0.11.10 → agent_engine_runner_shared-0.11.11}/src/agent_engine_runner_shared/generated/workflow/v1/state_pb2.py +0 -0
- {agent_engine_runner_shared-0.11.10 → agent_engine_runner_shared-0.11.11}/src/agent_engine_runner_shared/generated/workflow/v1/state_pb2.pyi +0 -0
- {agent_engine_runner_shared-0.11.10 → agent_engine_runner_shared-0.11.11}/src/agent_engine_runner_shared/guardrails_evaluator/__init__.py +0 -0
- {agent_engine_runner_shared-0.11.10 → agent_engine_runner_shared-0.11.11}/src/agent_engine_runner_shared/guardrails_evaluator/core.py +0 -0
- {agent_engine_runner_shared-0.11.10 → agent_engine_runner_shared-0.11.11}/src/agent_engine_runner_shared/guardrails_evaluator/regex.py +0 -0
- {agent_engine_runner_shared-0.11.10 → agent_engine_runner_shared-0.11.11}/src/agent_engine_runner_shared/hooks.py +0 -0
- {agent_engine_runner_shared-0.11.10 → agent_engine_runner_shared-0.11.11}/src/agent_engine_runner_shared/http_path.py +0 -0
- {agent_engine_runner_shared-0.11.10 → agent_engine_runner_shared-0.11.11}/src/agent_engine_runner_shared/launcher.py +0 -0
- {agent_engine_runner_shared-0.11.10 → agent_engine_runner_shared-0.11.11}/src/agent_engine_runner_shared/mcp_oauth_cache_lock.py +0 -0
- {agent_engine_runner_shared-0.11.10 → agent_engine_runner_shared-0.11.11}/src/agent_engine_runner_shared/mcp_oauth_cache_name.py +0 -0
- {agent_engine_runner_shared-0.11.10 → agent_engine_runner_shared-0.11.11}/src/agent_engine_runner_shared/mcp_oauth_secret.py +0 -0
- {agent_engine_runner_shared-0.11.10 → agent_engine_runner_shared-0.11.11}/src/agent_engine_runner_shared/memory.py +0 -0
- {agent_engine_runner_shared-0.11.10 → agent_engine_runner_shared-0.11.11}/src/agent_engine_runner_shared/memory_appbound.py +0 -0
- {agent_engine_runner_shared-0.11.10 → agent_engine_runner_shared-0.11.11}/src/agent_engine_runner_shared/metrics.py +0 -0
- {agent_engine_runner_shared-0.11.10 → agent_engine_runner_shared-0.11.11}/src/agent_engine_runner_shared/node_logger.py +0 -0
- {agent_engine_runner_shared-0.11.10 → agent_engine_runner_shared-0.11.11}/src/agent_engine_runner_shared/owner_callback.py +0 -0
- {agent_engine_runner_shared-0.11.10 → agent_engine_runner_shared-0.11.11}/src/agent_engine_runner_shared/py.typed +0 -0
- {agent_engine_runner_shared-0.11.10 → agent_engine_runner_shared-0.11.11}/src/agent_engine_runner_shared/secure_llm_proxy.py +0 -0
- {agent_engine_runner_shared-0.11.10 → agent_engine_runner_shared-0.11.11}/src/agent_engine_runner_shared/secure_wrapper.py +0 -0
- {agent_engine_runner_shared-0.11.10 → agent_engine_runner_shared-0.11.11}/src/agent_engine_runner_shared/server/__init__.py +0 -0
- {agent_engine_runner_shared-0.11.10 → agent_engine_runner_shared-0.11.11}/src/agent_engine_runner_shared/server/atlas_dns.py +0 -0
- {agent_engine_runner_shared-0.11.10 → agent_engine_runner_shared-0.11.11}/src/agent_engine_runner_shared/server/auth.py +0 -0
- {agent_engine_runner_shared-0.11.10 → agent_engine_runner_shared-0.11.11}/src/agent_engine_runner_shared/server/base.py +0 -0
- {agent_engine_runner_shared-0.11.10 → agent_engine_runner_shared-0.11.11}/src/agent_engine_runner_shared/server/call_interrupt.py +0 -0
- {agent_engine_runner_shared-0.11.10 → agent_engine_runner_shared-0.11.11}/src/agent_engine_runner_shared/server/callback_delivery.py +0 -0
- {agent_engine_runner_shared-0.11.10 → agent_engine_runner_shared-0.11.11}/src/agent_engine_runner_shared/server/chunk_types.py +0 -0
- {agent_engine_runner_shared-0.11.10 → agent_engine_runner_shared-0.11.11}/src/agent_engine_runner_shared/server/cors.py +0 -0
- {agent_engine_runner_shared-0.11.10 → agent_engine_runner_shared-0.11.11}/src/agent_engine_runner_shared/server/drain.py +0 -0
- {agent_engine_runner_shared-0.11.10 → agent_engine_runner_shared-0.11.11}/src/agent_engine_runner_shared/server/function.py +0 -0
- {agent_engine_runner_shared-0.11.10 → agent_engine_runner_shared-0.11.11}/src/agent_engine_runner_shared/server/graph_warm.py +0 -0
- {agent_engine_runner_shared-0.11.10 → agent_engine_runner_shared-0.11.11}/src/agent_engine_runner_shared/server/http_retry.py +0 -0
- {agent_engine_runner_shared-0.11.10 → agent_engine_runner_shared-0.11.11}/src/agent_engine_runner_shared/server/metadata.py +0 -0
- {agent_engine_runner_shared-0.11.10 → agent_engine_runner_shared-0.11.11}/src/agent_engine_runner_shared/server/oe_url.py +0 -0
- {agent_engine_runner_shared-0.11.10 → agent_engine_runner_shared-0.11.11}/src/agent_engine_runner_shared/server/owner_url.py +0 -0
- {agent_engine_runner_shared-0.11.10 → agent_engine_runner_shared-0.11.11}/src/agent_engine_runner_shared/server/query.py +0 -0
- {agent_engine_runner_shared-0.11.10 → agent_engine_runner_shared-0.11.11}/src/agent_engine_runner_shared/span_kinds.py +0 -0
- {agent_engine_runner_shared-0.11.10 → agent_engine_runner_shared-0.11.11}/src/agent_engine_runner_shared/span_names.py +0 -0
- {agent_engine_runner_shared-0.11.10 → agent_engine_runner_shared-0.11.11}/src/agent_engine_runner_shared/startup_state.py +0 -0
- {agent_engine_runner_shared-0.11.10 → agent_engine_runner_shared-0.11.11}/src/agent_engine_runner_shared/tls_client.py +0 -0
- {agent_engine_runner_shared-0.11.10 → agent_engine_runner_shared-0.11.11}/src/agent_engine_runner_shared/tool_api_error.py +0 -0
- {agent_engine_runner_shared-0.11.10 → agent_engine_runner_shared-0.11.11}/src/agent_engine_runner_shared/tool_memory_ownership.py +0 -0
- {agent_engine_runner_shared-0.11.10 → agent_engine_runner_shared-0.11.11}/src/agent_engine_runner_shared/toolpod_handlers.py +0 -0
- {agent_engine_runner_shared-0.11.10 → agent_engine_runner_shared-0.11.11}/src/agent_engine_runner_shared/tracing/__init__.py +0 -0
- {agent_engine_runner_shared-0.11.10 → agent_engine_runner_shared-0.11.11}/src/agent_engine_runner_shared/tracing/exporters.py +0 -0
- {agent_engine_runner_shared-0.11.10 → agent_engine_runner_shared-0.11.11}/src/agent_engine_runner_shared/tracing/setup.py +0 -0
- {agent_engine_runner_shared-0.11.10 → agent_engine_runner_shared-0.11.11}/src/agent_engine_runner_shared/types.py +0 -0
- {agent_engine_runner_shared-0.11.10 → agent_engine_runner_shared-0.11.11}/src/agent_engine_runner_shared/utils.py +0 -0
- {agent_engine_runner_shared-0.11.10 → agent_engine_runner_shared-0.11.11}/src/agent_engine_runner_shared/workflow/__init__.py +0 -0
- {agent_engine_runner_shared-0.11.10 → agent_engine_runner_shared-0.11.11}/src/agent_engine_runner_shared/workflow/activity.py +0 -0
- {agent_engine_runner_shared-0.11.10 → agent_engine_runner_shared-0.11.11}/src/agent_engine_runner_shared/workflow/attempt.py +0 -0
- {agent_engine_runner_shared-0.11.10 → agent_engine_runner_shared-0.11.11}/src/agent_engine_runner_shared/workflow/cancelled_history.py +0 -0
- {agent_engine_runner_shared-0.11.10 → agent_engine_runner_shared-0.11.11}/src/agent_engine_runner_shared/workflow/context.py +0 -0
- {agent_engine_runner_shared-0.11.10 → agent_engine_runner_shared-0.11.11}/src/agent_engine_runner_shared/workflow/heartbeat.py +0 -0
- {agent_engine_runner_shared-0.11.10 → agent_engine_runner_shared-0.11.11}/src/agent_engine_runner_shared/workflow/memory.py +0 -0
- {agent_engine_runner_shared-0.11.10 → agent_engine_runner_shared-0.11.11}/src/agent_engine_runner_shared/workflow/protojson.py +0 -0
- {agent_engine_runner_shared-0.11.10 → agent_engine_runner_shared-0.11.11}/src/agent_engine_runner_shared/workflow/settlement.py +0 -0
- {agent_engine_runner_shared-0.11.10 → agent_engine_runner_shared-0.11.11}/tests/__init__.py +0 -0
- {agent_engine_runner_shared-0.11.10 → agent_engine_runner_shared-0.11.11}/tests/conftest.py +0 -0
- {agent_engine_runner_shared-0.11.10 → agent_engine_runner_shared-0.11.11}/tests/corpus/.gitignore +0 -0
- {agent_engine_runner_shared-0.11.10 → agent_engine_runner_shared-0.11.11}/tests/corpus/__init__.py +0 -0
- {agent_engine_runner_shared-0.11.10 → agent_engine_runner_shared-0.11.11}/tests/integration/__init__.py +0 -0
- {agent_engine_runner_shared-0.11.10 → agent_engine_runner_shared-0.11.11}/tests/integration/mock_embedder.py +0 -0
- {agent_engine_runner_shared-0.11.10 → agent_engine_runner_shared-0.11.11}/tests/integration/test_a2a_trace_propagation.py +0 -0
- {agent_engine_runner_shared-0.11.10 → agent_engine_runner_shared-0.11.11}/tests/integration/test_runtime.py +0 -0
- {agent_engine_runner_shared-0.11.10 → agent_engine_runner_shared-0.11.11}/tests/integration/test_secure_async.py +0 -0
- {agent_engine_runner_shared-0.11.10 → agent_engine_runner_shared-0.11.11}/tests/integration/test_secure_sync.py +0 -0
- {agent_engine_runner_shared-0.11.10 → agent_engine_runner_shared-0.11.11}/tests/integration/test_tracing_otlp_wire_format.py +0 -0
- {agent_engine_runner_shared-0.11.10 → agent_engine_runner_shared-0.11.11}/tests/pact/conftest.py +0 -0
- {agent_engine_runner_shared-0.11.10 → agent_engine_runner_shared-0.11.11}/tests/unit/__init__.py +0 -0
- {agent_engine_runner_shared-0.11.10 → agent_engine_runner_shared-0.11.11}/tests/unit/connectors/__init__.py +0 -0
- {agent_engine_runner_shared-0.11.10 → agent_engine_runner_shared-0.11.11}/tests/unit/connectors/fixtures/jira.tool_defs.yaml +0 -0
- {agent_engine_runner_shared-0.11.10 → agent_engine_runner_shared-0.11.11}/tests/unit/connectors/test_core.py +0 -0
- {agent_engine_runner_shared-0.11.10 → agent_engine_runner_shared-0.11.11}/tests/unit/connectors/test_generate.py +0 -0
- {agent_engine_runner_shared-0.11.10 → agent_engine_runner_shared-0.11.11}/tests/unit/test_a2a.py +0 -0
- {agent_engine_runner_shared-0.11.10 → agent_engine_runner_shared-0.11.11}/tests/unit/test_a2a_auth.py +0 -0
- {agent_engine_runner_shared-0.11.10 → agent_engine_runner_shared-0.11.11}/tests/unit/test_aer_build_agent_span.py +0 -0
- {agent_engine_runner_shared-0.11.10 → agent_engine_runner_shared-0.11.11}/tests/unit/test_aer_chunk_emission.py +0 -0
- {agent_engine_runner_shared-0.11.10 → agent_engine_runner_shared-0.11.11}/tests/unit/test_aer_workspace_scope.py +0 -0
- {agent_engine_runner_shared-0.11.10 → agent_engine_runner_shared-0.11.11}/tests/unit/test_agent_config.py +0 -0
- {agent_engine_runner_shared-0.11.10 → agent_engine_runner_shared-0.11.11}/tests/unit/test_async_utils.py +0 -0
- {agent_engine_runner_shared-0.11.10 → agent_engine_runner_shared-0.11.11}/tests/unit/test_atlas_dns.py +0 -0
- {agent_engine_runner_shared-0.11.10 → agent_engine_runner_shared-0.11.11}/tests/unit/test_call_interrupt.py +0 -0
- {agent_engine_runner_shared-0.11.10 → agent_engine_runner_shared-0.11.11}/tests/unit/test_call_interrupt_contract.py +0 -0
- {agent_engine_runner_shared-0.11.10 → agent_engine_runner_shared-0.11.11}/tests/unit/test_checkpoint_workspace.py +0 -0
- {agent_engine_runner_shared-0.11.10 → agent_engine_runner_shared-0.11.11}/tests/unit/test_cors.py +0 -0
- {agent_engine_runner_shared-0.11.10 → agent_engine_runner_shared-0.11.11}/tests/unit/test_create_memory_client_headers.py +0 -0
- {agent_engine_runner_shared-0.11.10 → agent_engine_runner_shared-0.11.11}/tests/unit/test_custom_headers_context.py +0 -0
- {agent_engine_runner_shared-0.11.10 → agent_engine_runner_shared-0.11.11}/tests/unit/test_custom_headers_models.py +0 -0
- {agent_engine_runner_shared-0.11.10 → agent_engine_runner_shared-0.11.11}/tests/unit/test_db_naming.py +0 -0
- {agent_engine_runner_shared-0.11.10 → agent_engine_runner_shared-0.11.11}/tests/unit/test_debug_hook.py +0 -0
- {agent_engine_runner_shared-0.11.10 → agent_engine_runner_shared-0.11.11}/tests/unit/test_drain_contract.py +0 -0
- {agent_engine_runner_shared-0.11.10 → agent_engine_runner_shared-0.11.11}/tests/unit/test_durable_guardrail_review.py +0 -0
- {agent_engine_runner_shared-0.11.10 → agent_engine_runner_shared-0.11.11}/tests/unit/test_durable_oauth.py +0 -0
- {agent_engine_runner_shared-0.11.10 → agent_engine_runner_shared-0.11.11}/tests/unit/test_durable_proxies.py +0 -0
- {agent_engine_runner_shared-0.11.10 → agent_engine_runner_shared-0.11.11}/tests/unit/test_error_reporting.py +0 -0
- {agent_engine_runner_shared-0.11.10 → agent_engine_runner_shared-0.11.11}/tests/unit/test_execution.py +0 -0
- {agent_engine_runner_shared-0.11.10 → agent_engine_runner_shared-0.11.11}/tests/unit/test_extract_turn_messages.py +0 -0
- {agent_engine_runner_shared-0.11.10 → agent_engine_runner_shared-0.11.11}/tests/unit/test_format_llm_error.py +0 -0
- {agent_engine_runner_shared-0.11.10 → agent_engine_runner_shared-0.11.11}/tests/unit/test_function_mode.py +0 -0
- {agent_engine_runner_shared-0.11.10 → agent_engine_runner_shared-0.11.11}/tests/unit/test_guardrails_protocol.py +0 -0
- {agent_engine_runner_shared-0.11.10 → agent_engine_runner_shared-0.11.11}/tests/unit/test_hooks.py +0 -0
- {agent_engine_runner_shared-0.11.10 → agent_engine_runner_shared-0.11.11}/tests/unit/test_http_path.py +0 -0
- {agent_engine_runner_shared-0.11.10 → agent_engine_runner_shared-0.11.11}/tests/unit/test_http_retry.py +0 -0
- {agent_engine_runner_shared-0.11.10 → agent_engine_runner_shared-0.11.11}/tests/unit/test_launcher.py +0 -0
- {agent_engine_runner_shared-0.11.10 → agent_engine_runner_shared-0.11.11}/tests/unit/test_launcher_reports.py +0 -0
- {agent_engine_runner_shared-0.11.10 → agent_engine_runner_shared-0.11.11}/tests/unit/test_listen_host.py +0 -0
- {agent_engine_runner_shared-0.11.10 → agent_engine_runner_shared-0.11.11}/tests/unit/test_llm_credential_classification.py +0 -0
- {agent_engine_runner_shared-0.11.10 → agent_engine_runner_shared-0.11.11}/tests/unit/test_llm_routing.py +0 -0
- {agent_engine_runner_shared-0.11.10 → agent_engine_runner_shared-0.11.11}/tests/unit/test_mcp_oauth_secret.py +0 -0
- {agent_engine_runner_shared-0.11.10 → agent_engine_runner_shared-0.11.11}/tests/unit/test_memory_appbound.py +0 -0
- {agent_engine_runner_shared-0.11.10 → agent_engine_runner_shared-0.11.11}/tests/unit/test_memory_search_metadata.py +0 -0
- {agent_engine_runner_shared-0.11.10 → agent_engine_runner_shared-0.11.11}/tests/unit/test_memory_writer_context.py +0 -0
- {agent_engine_runner_shared-0.11.10 → agent_engine_runner_shared-0.11.11}/tests/unit/test_metadata.py +0 -0
- {agent_engine_runner_shared-0.11.10 → agent_engine_runner_shared-0.11.11}/tests/unit/test_metrics.py +0 -0
- {agent_engine_runner_shared-0.11.10 → agent_engine_runner_shared-0.11.11}/tests/unit/test_models.py +0 -0
- {agent_engine_runner_shared-0.11.10 → agent_engine_runner_shared-0.11.11}/tests/unit/test_no_lc_imports.py +0 -0
- {agent_engine_runner_shared-0.11.10 → agent_engine_runner_shared-0.11.11}/tests/unit/test_node_logger.py +0 -0
- {agent_engine_runner_shared-0.11.10 → agent_engine_runner_shared-0.11.11}/tests/unit/test_oe_url.py +0 -0
- {agent_engine_runner_shared-0.11.10 → agent_engine_runner_shared-0.11.11}/tests/unit/test_owner_callback.py +0 -0
- {agent_engine_runner_shared-0.11.10 → agent_engine_runner_shared-0.11.11}/tests/unit/test_owner_url.py +0 -0
- {agent_engine_runner_shared-0.11.10 → agent_engine_runner_shared-0.11.11}/tests/unit/test_payload_context.py +0 -0
- {agent_engine_runner_shared-0.11.10 → agent_engine_runner_shared-0.11.11}/tests/unit/test_query_routes.py +0 -0
- {agent_engine_runner_shared-0.11.10 → agent_engine_runner_shared-0.11.11}/tests/unit/test_request_id_context.py +0 -0
- {agent_engine_runner_shared-0.11.10 → agent_engine_runner_shared-0.11.11}/tests/unit/test_resume_payload.py +0 -0
- {agent_engine_runner_shared-0.11.10 → agent_engine_runner_shared-0.11.11}/tests/unit/test_runtime_build_context_from_sources.py +0 -0
- {agent_engine_runner_shared-0.11.10 → agent_engine_runner_shared-0.11.11}/tests/unit/test_runtime_checkpoint_workspace.py +0 -0
- {agent_engine_runner_shared-0.11.10 → agent_engine_runner_shared-0.11.11}/tests/unit/test_runtime_custom_memory.py +0 -0
- {agent_engine_runner_shared-0.11.10 → agent_engine_runner_shared-0.11.11}/tests/unit/test_runtime_memory_context.py +0 -0
- {agent_engine_runner_shared-0.11.10 → agent_engine_runner_shared-0.11.11}/tests/unit/test_runtime_register_tool.py +0 -0
- {agent_engine_runner_shared-0.11.10 → agent_engine_runner_shared-0.11.11}/tests/unit/test_secure_llm_proxy.py +0 -0
- {agent_engine_runner_shared-0.11.10 → agent_engine_runner_shared-0.11.11}/tests/unit/test_secure_wrapper.py +0 -0
- {agent_engine_runner_shared-0.11.10 → agent_engine_runner_shared-0.11.11}/tests/unit/test_server_auth.py +0 -0
- {agent_engine_runner_shared-0.11.10 → agent_engine_runner_shared-0.11.11}/tests/unit/test_server_health.py +0 -0
- {agent_engine_runner_shared-0.11.10 → agent_engine_runner_shared-0.11.11}/tests/unit/test_server_shutdown.py +0 -0
- {agent_engine_runner_shared-0.11.10 → agent_engine_runner_shared-0.11.11}/tests/unit/test_server_startup_failures.py +0 -0
- {agent_engine_runner_shared-0.11.10 → agent_engine_runner_shared-0.11.11}/tests/unit/test_session_filesystem_isolation.py +0 -0
- {agent_engine_runner_shared-0.11.10 → agent_engine_runner_shared-0.11.11}/tests/unit/test_session_finish_context.py +0 -0
- {agent_engine_runner_shared-0.11.10 → agent_engine_runner_shared-0.11.11}/tests/unit/test_shared_client.py +0 -0
- {agent_engine_runner_shared-0.11.10 → agent_engine_runner_shared-0.11.11}/tests/unit/test_thinking_tokens.py +0 -0
- {agent_engine_runner_shared-0.11.10 → agent_engine_runner_shared-0.11.11}/tests/unit/test_tls_client.py +0 -0
- {agent_engine_runner_shared-0.11.10 → agent_engine_runner_shared-0.11.11}/tests/unit/test_token_capture.py +0 -0
- {agent_engine_runner_shared-0.11.10 → agent_engine_runner_shared-0.11.11}/tests/unit/test_tool_api_error.py +0 -0
- {agent_engine_runner_shared-0.11.10 → agent_engine_runner_shared-0.11.11}/tests/unit/test_tool_authorization.py +0 -0
- {agent_engine_runner_shared-0.11.10 → agent_engine_runner_shared-0.11.11}/tests/unit/test_tool_cancellation_boundary.py +0 -0
- {agent_engine_runner_shared-0.11.10 → agent_engine_runner_shared-0.11.11}/tests/unit/test_tool_deserialization.py +0 -0
- {agent_engine_runner_shared-0.11.10 → agent_engine_runner_shared-0.11.11}/tests/unit/test_tool_log_redaction.py +0 -0
- {agent_engine_runner_shared-0.11.10 → agent_engine_runner_shared-0.11.11}/tests/unit/test_tool_memory_ownership.py +0 -0
- {agent_engine_runner_shared-0.11.10 → agent_engine_runner_shared-0.11.11}/tests/unit/test_tool_trace_context.py +0 -0
- {agent_engine_runner_shared-0.11.10 → agent_engine_runner_shared-0.11.11}/tests/unit/test_toolpod_handlers.py +0 -0
- {agent_engine_runner_shared-0.11.10 → agent_engine_runner_shared-0.11.11}/tests/unit/test_tracing_exporter.py +0 -0
- {agent_engine_runner_shared-0.11.10 → agent_engine_runner_shared-0.11.11}/tests/unit/test_tracing_retry.py +0 -0
- {agent_engine_runner_shared-0.11.10 → agent_engine_runner_shared-0.11.11}/tests/unit/workflow/test_activity.py +0 -0
- {agent_engine_runner_shared-0.11.10 → agent_engine_runner_shared-0.11.11}/tests/unit/workflow/test_attempt.py +0 -0
- {agent_engine_runner_shared-0.11.10 → agent_engine_runner_shared-0.11.11}/tests/unit/workflow/test_cancelled_history.py +0 -0
- {agent_engine_runner_shared-0.11.10 → agent_engine_runner_shared-0.11.11}/tests/unit/workflow/test_context.py +0 -0
- {agent_engine_runner_shared-0.11.10 → agent_engine_runner_shared-0.11.11}/tests/unit/workflow/test_heartbeat.py +0 -0
- {agent_engine_runner_shared-0.11.10 → agent_engine_runner_shared-0.11.11}/tests/unit/workflow/test_memory.py +0 -0
- {agent_engine_runner_shared-0.11.10 → agent_engine_runner_shared-0.11.11}/tests/unit/workflow/test_protojson.py +0 -0
- {agent_engine_runner_shared-0.11.10 → agent_engine_runner_shared-0.11.11}/tests/unit/workflow/test_protojson_helpers.py +0 -0
- {agent_engine_runner_shared-0.11.10 → agent_engine_runner_shared-0.11.11}/tests/unit/workflow/test_settlement.py +0 -0
|
@@ -7,7 +7,21 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
|
|
|
7
7
|
|
|
8
8
|
## [Unreleased]
|
|
9
9
|
|
|
10
|
+
### Removed
|
|
11
|
+
- Removed the unused pre-materialized connector bundle override
|
|
12
|
+
(`AGENTIC_CONNECTOR_BUNDLE_PATH`) and the `load_connector_bundle` /
|
|
13
|
+
`CONNECTOR_BUNDLE_PATH_ENV` exports. Connectors resolve only from
|
|
14
|
+
`agent.yaml` and its local connector authoring files.
|
|
15
|
+
|
|
10
16
|
### Changed
|
|
17
|
+
- Remote MCP servers now use MCP Python SDK 2.x (`mcp==2.3.0`). Each call
|
|
18
|
+
negotiates the protocol automatically: it probes `server/discover` and falls
|
|
19
|
+
back to the legacy `initialize` handshake, so servers on `2025-11-25` and
|
|
20
|
+
older keep working while `2026-07-28` servers are reached directly. Tool
|
|
21
|
+
result content keeps its wire field names (`mimeType`, `readOnlyHint`) and
|
|
22
|
+
failed HTTP calls keep reporting their status in error messages. OAuth caches
|
|
23
|
+
written by the previous SDK still load; new entries record the authorization
|
|
24
|
+
server's `issuer` when it provides one.
|
|
11
25
|
- Reuse a process-wide keep-alive mTLS client for OE callbacks (tool
|
|
12
26
|
execute/result, node events, progress and custom events) and drain callback
|
|
13
27
|
response bodies so connections return to the pool; removes a full TLS
|
|
@@ -13,6 +13,16 @@ PYDOC_MARKDOWN := uv tool run --from 'pydoc-markdown>=4.8' pydoc-markdown
|
|
|
13
13
|
# pydoc-markdown emits trailing spaces on blank lines and an extra trailing
|
|
14
14
|
# blank line; strip both so docs-check only fails on content changes.
|
|
15
15
|
NORMALIZE_DOCS := perl -0pe 's/[^\S\n]+$$//mg; s/\n+\z/\n/'
|
|
16
|
+
# ruff formats the Python inside Markdown fences, so the generated reference has
|
|
17
|
+
# to go through it too. Without this stage the pre-commit ruff-format hook
|
|
18
|
+
# rewrites api.md and docs-check then fails on the unformatted generator output.
|
|
19
|
+
# Ruff runs from the uv workspace root so it resolves from the workspace lock,
|
|
20
|
+
# the same version the hook and CI pin.
|
|
21
|
+
# $(CURDIR) rather than $(abspath ...): abspath splits its argument on
|
|
22
|
+
# whitespace, so a checkout whose path contains a space would break. Both paths
|
|
23
|
+
# are quoted at the point of use for the same reason.
|
|
24
|
+
PYTHON_WORKSPACE := $(CURDIR)/../..
|
|
25
|
+
FORMAT_DOCS := uv run --directory "$(PYTHON_WORKSPACE)" ruff format --stdin-filename "$(CURDIR)/docs/api.md" -
|
|
16
26
|
|
|
17
27
|
# Output path for the generated reference. Defaults to the committed file;
|
|
18
28
|
# override (e.g. DOCS_OUT=/tmp/api.md) to generate elsewhere without clobbering
|
|
@@ -21,11 +31,11 @@ DOCS_OUT ?= docs/api.md
|
|
|
21
31
|
|
|
22
32
|
# Regenerate API reference from docstrings.
|
|
23
33
|
docs:
|
|
24
|
-
$(PYDOC_MARKDOWN) pydoc-markdown.yml | $(NORMALIZE_DOCS) > $(DOCS_OUT)
|
|
34
|
+
$(PYDOC_MARKDOWN) pydoc-markdown.yml | $(NORMALIZE_DOCS) | $(FORMAT_DOCS) > $(DOCS_OUT)
|
|
25
35
|
|
|
26
36
|
# CI: fail if docs/api.md is stale.
|
|
27
37
|
docs-check:
|
|
28
|
-
@$(PYDOC_MARKDOWN) pydoc-markdown.yml | $(NORMALIZE_DOCS) > /tmp/api-docs-check.md
|
|
38
|
+
@$(PYDOC_MARKDOWN) pydoc-markdown.yml | $(NORMALIZE_DOCS) | $(FORMAT_DOCS) > /tmp/api-docs-check.md
|
|
29
39
|
@diff -u docs/api.md /tmp/api-docs-check.md || { \
|
|
30
40
|
echo ""; \
|
|
31
41
|
echo "ERROR: docs/api.md is stale. Run 'make docs' to regenerate."; \
|
|
@@ -1,18 +1,19 @@
|
|
|
1
1
|
Metadata-Version: 2.5
|
|
2
2
|
Name: agent-engine-runner-shared
|
|
3
|
-
Version: 0.11.
|
|
3
|
+
Version: 0.11.11
|
|
4
4
|
Summary: Runner SDK - Framework-agnostic agent runtime
|
|
5
5
|
License: Apache-2.0
|
|
6
6
|
License-File: LICENSE
|
|
7
7
|
Requires-Python: >=3.11
|
|
8
|
-
Requires-Dist: agent-engine-sdk-memory==0.11.
|
|
9
|
-
Requires-Dist: agent-engine-sdk==0.11.
|
|
8
|
+
Requires-Dist: agent-engine-sdk-memory==0.11.11
|
|
9
|
+
Requires-Dist: agent-engine-sdk==0.11.11
|
|
10
10
|
Requires-Dist: fastapi>=0.141.1
|
|
11
11
|
Requires-Dist: filelock>=3.0.0
|
|
12
12
|
Requires-Dist: httpx-sse>=0.4.0
|
|
13
|
+
Requires-Dist: httpx2>=2.5.0
|
|
13
14
|
Requires-Dist: httpx>=0.27.0
|
|
14
15
|
Requires-Dist: jsonschema>=4.26.0
|
|
15
|
-
Requires-Dist: mcp==
|
|
16
|
+
Requires-Dist: mcp==2.3.0
|
|
16
17
|
Requires-Dist: msgpack>=1.0.0
|
|
17
18
|
Requires-Dist: protobuf<7,>=6.33.6
|
|
18
19
|
Requires-Dist: pydantic>=2.0.0
|
|
@@ -6,6 +6,8 @@
|
|
|
6
6
|
* [agent\_config](#agent_engine_runner_shared.runtime.TenantRuntime.agent_config)
|
|
7
7
|
* [memory\_enabled](#agent_engine_runner_shared.runtime.TenantRuntime.memory_enabled)
|
|
8
8
|
* [get\_agent](#agent_engine_runner_shared.runtime.TenantRuntime.get_agent)
|
|
9
|
+
* [build\_graph](#agent_engine_runner_shared.runtime.TenantRuntime.build_graph)
|
|
10
|
+
* [uses\_per\_invocation\_build](#agent_engine_runner_shared.runtime.TenantRuntime.uses_per_invocation_build)
|
|
9
11
|
* [warm\_up\_agent](#agent_engine_runner_shared.runtime.TenantRuntime.warm_up_agent)
|
|
10
12
|
* [memory\_engine](#agent_engine_runner_shared.runtime.TenantRuntime.memory_engine)
|
|
11
13
|
* [memory\_writer](#agent_engine_runner_shared.runtime.TenantRuntime.memory_writer)
|
|
@@ -347,7 +349,9 @@ Return the resolved agent.yaml Memory feature setting.
|
|
|
347
349
|
#### get\_agent
|
|
348
350
|
|
|
349
351
|
```python
|
|
350
|
-
def get_agent(callbacks: List[Any] | None = None
|
|
352
|
+
def get_agent(callbacks: List[Any] | None = None,
|
|
353
|
+
*,
|
|
354
|
+
graph: Any = None) -> BaseAgent
|
|
351
355
|
```
|
|
352
356
|
|
|
353
357
|
Get a BaseAgent instance from the registered App.
|
|
@@ -359,6 +363,9 @@ framework-specific graph building and callback adaptation.
|
|
|
359
363
|
|
|
360
364
|
- `callbacks` - Framework-neutral callbacks for observability
|
|
361
365
|
(e.g., NodeExecutionLogger)
|
|
366
|
+
- `graph` - A graph already built by ``build_graph`` for this
|
|
367
|
+
invocation (a per-execution agent). Only forwarded when
|
|
368
|
+
present, so an App that does not accept it keeps working.
|
|
362
369
|
|
|
363
370
|
|
|
364
371
|
**Returns**:
|
|
@@ -370,6 +377,37 @@ framework-specific graph building and callback adaptation.
|
|
|
370
377
|
|
|
371
378
|
- `RuntimeError` - If no App has been registered via register_and_run()
|
|
372
379
|
|
|
380
|
+
<a id="agent_engine_runner_shared.runtime.TenantRuntime.build_graph"></a>
|
|
381
|
+
|
|
382
|
+
#### build\_graph
|
|
383
|
+
|
|
384
|
+
```python
|
|
385
|
+
async def build_graph(agent_input: Any = None, ctx: Any = None) -> Any
|
|
386
|
+
```
|
|
387
|
+
|
|
388
|
+
Build the graph for this invocation before ``get_agent``.
|
|
389
|
+
|
|
390
|
+
The AER awaits this so a per-execution agent's builder -- which may do
|
|
391
|
+
its own async I/O -- runs off the build path. Returns ``None`` when the
|
|
392
|
+
registered App declares no per-execution build (every global agent),
|
|
393
|
+
which tells the caller to use the cached build path unchanged. A
|
|
394
|
+
context-free discovery call passes ``(None, None)``.
|
|
395
|
+
|
|
396
|
+
<a id="agent_engine_runner_shared.runtime.TenantRuntime.uses_per_invocation_build"></a>
|
|
397
|
+
|
|
398
|
+
#### uses\_per\_invocation\_build
|
|
399
|
+
|
|
400
|
+
```python
|
|
401
|
+
def uses_per_invocation_build() -> bool
|
|
402
|
+
```
|
|
403
|
+
|
|
404
|
+
Whether the registered App builds its graph per invocation.
|
|
405
|
+
|
|
406
|
+
True only for an App that opted into ``load_strategy="per-execution"``.
|
|
407
|
+
The Tool Pod reads this to decide whether a failed context-free
|
|
408
|
+
discovery build should keep the registrations the builder made before
|
|
409
|
+
it raised, rather than discarding them.
|
|
410
|
+
|
|
373
411
|
<a id="agent_engine_runner_shared.runtime.TenantRuntime.warm_up_agent"></a>
|
|
374
412
|
|
|
375
413
|
#### warm\_up\_agent
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
[project]
|
|
2
2
|
name = "agent-engine-runner-shared"
|
|
3
|
-
version = "0.11.
|
|
3
|
+
version = "0.11.11"
|
|
4
4
|
description = "Runner SDK - Framework-agnostic agent runtime"
|
|
5
5
|
readme = "README.md"
|
|
6
6
|
license = {text = "Apache-2.0"}
|
|
@@ -18,16 +18,18 @@ dependencies = [
|
|
|
18
18
|
"pydantic>=2.0.0",
|
|
19
19
|
"protobuf>=6.33.6,<7",
|
|
20
20
|
"httpx>=0.27.0",
|
|
21
|
+
# MCP 2.x talks httpx2; the two clients install side by side.
|
|
22
|
+
"httpx2>=2.5.0",
|
|
21
23
|
"httpx-sse>=0.4.0",
|
|
22
|
-
"mcp==
|
|
24
|
+
"mcp==2.3.0",
|
|
23
25
|
"python-dotenv>=1.0.0",
|
|
24
26
|
"PyYAML>=6.0",
|
|
25
27
|
"jsonschema>=4.26.0",
|
|
26
28
|
"sentry-sdk>=2.27.0",
|
|
27
29
|
# BaseAgent protocol and AgentInput/AgentEvent models
|
|
28
|
-
"agent-engine-sdk==0.11.
|
|
30
|
+
"agent-engine-sdk==0.11.11",
|
|
29
31
|
# Memory models and the MemoryClient HTTP client
|
|
30
|
-
"agent-engine-sdk-memory==0.11.
|
|
32
|
+
"agent-engine-sdk-memory==0.11.11",
|
|
31
33
|
# Required for checkpoint message decoding (query/sessions endpoints)
|
|
32
34
|
"msgpack>=1.0.0",
|
|
33
35
|
# Required by guardrails_evaluator/regex.py for advanced regex matching
|
|
@@ -5,20 +5,17 @@ opt-in registration. It is not exposed through the CLI. Connector tools use the
|
|
|
5
5
|
AER → OE → Tool Pod execution path.
|
|
6
6
|
|
|
7
7
|
Runtime integration follows the platform's config → discover → register flow: each
|
|
8
|
-
process derives its own view from the same manifest. Resolution
|
|
8
|
+
process derives its own view from the same manifest. Resolution in
|
|
9
9
|
`resolve_runtime_bundle`:
|
|
10
10
|
|
|
11
|
-
1.
|
|
12
|
-
platform-owned `AGENTIC_CONNECTOR_BUNDLE_PATH` environment variable (the
|
|
13
|
-
deployment contract for hosted builds).
|
|
14
|
-
2. Otherwise, the `connectors` entries in `agent.yaml` are materialized in memory at
|
|
11
|
+
1. The `connectors` entries in `agent.yaml` are materialized in memory at
|
|
15
12
|
startup: each entry names a `tool.yaml` (resolved relative to `agent.yaml`) that
|
|
16
13
|
selects operations from a local catalog file (resolved relative to the
|
|
17
14
|
`tool.yaml`, contained within the agent workspace) and binds the endpoint and
|
|
18
15
|
credential environment reference. Catalogs are local files only — HTTPS catalog
|
|
19
16
|
references fail; there is no network fetch.
|
|
20
|
-
|
|
21
|
-
network access.
|
|
17
|
+
2. With no connectors configured, loading is an immediate no-op without filesystem
|
|
18
|
+
or network access.
|
|
22
19
|
|
|
23
20
|
```yaml
|
|
24
21
|
version: 1
|
|
@@ -61,9 +58,8 @@ Existing static auth modes continue to use their configured environment bindings
|
|
|
61
58
|
Catalog regeneration preserves the authored OAuth binding and records only
|
|
62
59
|
secret-free Bearer presentation in the catalog.
|
|
63
60
|
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
same materialized view and owns one `ConnectorExecutor` per connector.
|
|
61
|
+
AER loads the materialized schemas as ordinary remote tools. Tool Pod startup
|
|
62
|
+
materializes the same view and owns one `ConnectorExecutor` per connector.
|
|
67
63
|
|
|
68
64
|
`load_tool_defs(path)` reads a local compiled YAML artifact into `ToolDefinitions`.
|
|
69
65
|
`tool_schemas()` returns detached name, description and `inputSchema` dictionaries.
|
|
@@ -1,12 +1,10 @@
|
|
|
1
|
-
"""Compiled OpenAPI connector core
|
|
1
|
+
"""Compiled OpenAPI connector core and authoring materialization."""
|
|
2
2
|
|
|
3
3
|
from agent_engine_runner_shared.connectors.bundle import (
|
|
4
|
-
CONNECTOR_BUNDLE_PATH_ENV,
|
|
5
4
|
BundledConnector,
|
|
6
5
|
BundledTool,
|
|
7
6
|
ConnectorBundle,
|
|
8
7
|
ConnectorBundleError,
|
|
9
|
-
load_connector_bundle,
|
|
10
8
|
)
|
|
11
9
|
from agent_engine_runner_shared.connectors.definitions import (
|
|
12
10
|
Auth,
|
|
@@ -33,7 +31,6 @@ from agent_engine_runner_shared.connectors.runtime import (
|
|
|
33
31
|
)
|
|
34
32
|
|
|
35
33
|
__all__ = [
|
|
36
|
-
"CONNECTOR_BUNDLE_PATH_ENV",
|
|
37
34
|
"BundledConnector",
|
|
38
35
|
"BundledTool",
|
|
39
36
|
"CompileResult",
|
|
@@ -48,7 +45,6 @@ __all__ = [
|
|
|
48
45
|
"Auth",
|
|
49
46
|
"ToolDefinitions",
|
|
50
47
|
"compile_catalog",
|
|
51
|
-
"load_connector_bundle",
|
|
52
48
|
"load_tool_defs",
|
|
53
49
|
"materialize_connectors",
|
|
54
50
|
"regenerate_catalog",
|
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
"""Validated runtime views shared by AER and Tool Pod connector registration.
|
|
2
|
+
|
|
3
|
+
The authoring materializer builds these objects from ``agent.yaml``,
|
|
4
|
+
``tool.yaml``, and the local compiled catalog. AER consumes each tool's schema
|
|
5
|
+
and registration metadata; Tool Pod consumes the same views to bind executor
|
|
6
|
+
callables. Nothing here reads files or performs I/O.
|
|
7
|
+
"""
|
|
8
|
+
|
|
9
|
+
from __future__ import annotations
|
|
10
|
+
|
|
11
|
+
from dataclasses import dataclass
|
|
12
|
+
from typing import Any
|
|
13
|
+
from urllib.parse import urlsplit
|
|
14
|
+
|
|
15
|
+
from agent_engine_runner_shared.connectors.definitions import (
|
|
16
|
+
Operation,
|
|
17
|
+
ToolDefinitions,
|
|
18
|
+
)
|
|
19
|
+
from agent_engine_runner_shared.connectors.executor import DEFAULT_EXECUTION_TIMEOUT_SECONDS
|
|
20
|
+
|
|
21
|
+
__all__ = [
|
|
22
|
+
"BundledConnector",
|
|
23
|
+
"BundledTool",
|
|
24
|
+
"ConnectorBundle",
|
|
25
|
+
"ConnectorBundleError",
|
|
26
|
+
]
|
|
27
|
+
|
|
28
|
+
|
|
29
|
+
class ConnectorBundleError(ValueError):
|
|
30
|
+
"""Raised when a connector bundle cannot be registered safely."""
|
|
31
|
+
|
|
32
|
+
|
|
33
|
+
@dataclass(frozen=True)
|
|
34
|
+
class BundledConnector:
|
|
35
|
+
"""One validated compiled connector from the materialized runtime view."""
|
|
36
|
+
|
|
37
|
+
name: str
|
|
38
|
+
definitions: ToolDefinitions
|
|
39
|
+
|
|
40
|
+
|
|
41
|
+
@dataclass(frozen=True)
|
|
42
|
+
class BundledTool:
|
|
43
|
+
"""One operation and the connector definitions needed to execute it."""
|
|
44
|
+
|
|
45
|
+
connector: BundledConnector
|
|
46
|
+
operation: Operation
|
|
47
|
+
|
|
48
|
+
@property
|
|
49
|
+
def schema(self) -> dict[str, Any]:
|
|
50
|
+
"""Return a detached SDK-visible schema."""
|
|
51
|
+
return self.operation.model_dump(include={"name", "description", "inputSchema"})
|
|
52
|
+
|
|
53
|
+
@property
|
|
54
|
+
def network(self) -> list[str]:
|
|
55
|
+
"""Return the single outbound host declared by this connector."""
|
|
56
|
+
hostname = urlsplit(self.connector.definitions.source.base_url).hostname
|
|
57
|
+
assert hostname is not None # ToolDefinitions validated the URL.
|
|
58
|
+
return [hostname]
|
|
59
|
+
|
|
60
|
+
@property
|
|
61
|
+
def registration_metadata(self) -> dict[str, Any]:
|
|
62
|
+
"""Return detached AER/Tool Pod policy, with delegated binding outside the schema."""
|
|
63
|
+
operation = self.operation
|
|
64
|
+
auth = self.connector.definitions.auth
|
|
65
|
+
delegated = auth if auth is not None and auth.type == "oauth" else None
|
|
66
|
+
return {
|
|
67
|
+
"name": operation.name,
|
|
68
|
+
"description": operation.description.strip() or f"REST connector tool {operation.name}",
|
|
69
|
+
"is_local": False,
|
|
70
|
+
"provider_type": delegated.provider_type if delegated else None,
|
|
71
|
+
"scopes": list(delegated.scopes) if delegated else [],
|
|
72
|
+
"network": self.network,
|
|
73
|
+
"timeout_seconds": DEFAULT_EXECUTION_TIMEOUT_SECONDS,
|
|
74
|
+
"redact_fields": [],
|
|
75
|
+
"connector": self.connector.name,
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
|
|
79
|
+
@dataclass(frozen=True)
|
|
80
|
+
class ConnectorBundle:
|
|
81
|
+
"""Fully validated runtime bundle shared by AER and Tool Pod startup."""
|
|
82
|
+
|
|
83
|
+
connectors: tuple[BundledConnector, ...] = ()
|
|
84
|
+
tools: tuple[BundledTool, ...] = ()
|
|
85
|
+
|
|
86
|
+
def require_available_names(self, registered_names: set[str]) -> None:
|
|
87
|
+
"""Reject all name collisions before a caller mutates its registry."""
|
|
88
|
+
collisions = sorted({tool.operation.name for tool in self.tools} & registered_names)
|
|
89
|
+
if collisions:
|
|
90
|
+
raise ConnectorBundleError(
|
|
91
|
+
"connector tool names collide with registered or reserved tools: "
|
|
92
|
+
+ ", ".join(collisions)
|
|
93
|
+
)
|
|
@@ -51,13 +51,20 @@ def _parser() -> argparse.ArgumentParser:
|
|
|
51
51
|
parser.add_argument("--base-url", help="Tenant API base URL recorded in the authoring file")
|
|
52
52
|
parser.add_argument(
|
|
53
53
|
"--auth",
|
|
54
|
-
choices=("none", "bearer", "api_key"),
|
|
54
|
+
choices=("none", "bearer", "api_key", "oauth"),
|
|
55
55
|
help="Credential presentation; the authority over the spec's own security schemes",
|
|
56
56
|
)
|
|
57
57
|
parser.add_argument(
|
|
58
58
|
"--auth-env", help="Workspace secret environment reference for the credential"
|
|
59
59
|
)
|
|
60
60
|
parser.add_argument("--auth-header", help="Header name for API key credentials")
|
|
61
|
+
parser.add_argument(
|
|
62
|
+
"--provider-type",
|
|
63
|
+
help="Credential provider key registered in the project (with --auth oauth)",
|
|
64
|
+
)
|
|
65
|
+
parser.add_argument(
|
|
66
|
+
"--scopes", help="Comma-separated delegated OAuth scopes (with --auth oauth)"
|
|
67
|
+
)
|
|
61
68
|
parser.add_argument("--allow", help="Comma-separated operation allow list (default: allow_all)")
|
|
62
69
|
parser.add_argument(
|
|
63
70
|
"--out-dir",
|
|
@@ -73,6 +80,17 @@ def _parser() -> argparse.ArgumentParser:
|
|
|
73
80
|
|
|
74
81
|
|
|
75
82
|
def _auth(args: argparse.Namespace) -> Auth | None:
|
|
83
|
+
"""Build the credential presentation the flags select, or None to let the
|
|
84
|
+
spec's own security schemes govern. Flag-combination refusals live here;
|
|
85
|
+
the shared ``Auth`` model validates the values themselves."""
|
|
86
|
+
if args.auth != "oauth" and (args.provider_type is not None or args.scopes is not None):
|
|
87
|
+
raise GenerateError("--provider-type and --scopes require --auth oauth")
|
|
88
|
+
if args.auth == "oauth":
|
|
89
|
+
if args.auth_env or args.auth_header:
|
|
90
|
+
raise GenerateError("--auth oauth cannot take --auth-env or --auth-header")
|
|
91
|
+
if not args.provider_type:
|
|
92
|
+
raise GenerateError("--auth oauth requires --provider-type")
|
|
93
|
+
return Auth(type="oauth", provider_type=args.provider_type, scopes=_scopes(args.scopes))
|
|
76
94
|
if args.auth == "none":
|
|
77
95
|
if args.auth_env or args.auth_header:
|
|
78
96
|
raise GenerateError("--auth none cannot take --auth-env or --auth-header")
|
|
@@ -86,6 +104,17 @@ def _auth(args: argparse.Namespace) -> Auth | None:
|
|
|
86
104
|
return Auth(type=args.auth, env=args.auth_env, header=args.auth_header)
|
|
87
105
|
|
|
88
106
|
|
|
107
|
+
def _scopes(raw: str | None) -> list[str]:
|
|
108
|
+
"""Split ``--scopes``; omitted means no scopes. An empty entry is refused
|
|
109
|
+
rather than dropped, so a typo cannot silently narrow the grant."""
|
|
110
|
+
if raw is None:
|
|
111
|
+
return []
|
|
112
|
+
scopes = [scope.strip() for scope in raw.split(",")]
|
|
113
|
+
if not all(scopes):
|
|
114
|
+
raise GenerateError("--scopes must not contain empty entries")
|
|
115
|
+
return scopes
|
|
116
|
+
|
|
117
|
+
|
|
89
118
|
def _allow(raw: str | None) -> list[str] | None:
|
|
90
119
|
if raw is None:
|
|
91
120
|
return None
|
|
@@ -127,6 +156,8 @@ def main(argv: list[str] | None = None) -> int:
|
|
|
127
156
|
args.auth
|
|
128
157
|
or args.auth_env
|
|
129
158
|
or args.auth_header
|
|
159
|
+
or args.provider_type is not None
|
|
160
|
+
or args.scopes is not None
|
|
130
161
|
or args.allow is not None
|
|
131
162
|
or args.base_url
|
|
132
163
|
or args.name
|
|
@@ -134,8 +165,9 @@ def main(argv: list[str] | None = None) -> int:
|
|
|
134
165
|
):
|
|
135
166
|
raise GenerateError(
|
|
136
167
|
"--config regeneration preserves the authored settings from "
|
|
137
|
-
"tool.yaml and writes beside it; --auth, --auth-env, "
|
|
138
|
-
"--
|
|
168
|
+
"tool.yaml and writes beside it; --auth, --auth-env, --auth-header, "
|
|
169
|
+
"--provider-type, --scopes, --allow, --base-url, --name and --out-dir "
|
|
170
|
+
"do not apply"
|
|
139
171
|
)
|
|
140
172
|
result = regenerate_catalog(args.config, skip_unsupported=args.skip_unsupported)
|
|
141
173
|
written = [str(result.catalog)]
|
|
@@ -47,7 +47,7 @@ CONNECTOR_NAME_PATTERN = r"^[A-Za-z0-9_-]{1,64}$"
|
|
|
47
47
|
|
|
48
48
|
|
|
49
49
|
def validate_connector_name(value: str) -> str:
|
|
50
|
-
"""Connector names key connector identity
|
|
50
|
+
"""Connector names key connector identity in runtime registration."""
|
|
51
51
|
if re.fullmatch(r"[A-Za-z0-9_-]{1,64}", value) is None:
|
|
52
52
|
raise ValueError(f"connector name must match {CONNECTOR_NAME_PATTERN}")
|
|
53
53
|
return value
|
|
@@ -187,7 +187,7 @@ concerns.
|
|
|
187
187
|
|
|
188
188
|
## Acceptance corpus
|
|
189
189
|
|
|
190
|
-
`tests/corpus/manifest.json` pins 100 real-world APIs.guru documents by
|
|
190
|
+
`tests/corpus/manifest.json` pins 100 real-world APIs.guru documents by path and SHA-256 within one GitHub commit.
|
|
191
191
|
The set contains 10,059 declared operations and requires at least 9,512 generated tools
|
|
192
192
|
overall, at least 80% for every API, and named Pinecone data-plane operations. The
|
|
193
193
|
current implementation produces 9,880 tools (98.22%) for the pinned inputs.
|
|
@@ -136,7 +136,10 @@ def _guidance_comment(base_url: str, auth: Auth | None) -> str:
|
|
|
136
136
|
lines.append(f"# secret grant {granted} to the tool sandbox under")
|
|
137
137
|
lines.append("# sandboxes.tool.secrets (sandboxes requires an agent block)")
|
|
138
138
|
elif auth is not None and auth.type == "oauth":
|
|
139
|
-
lines.append(
|
|
139
|
+
lines.append(
|
|
140
|
+
"# auth delegated OAuth; register a credential provider with provider "
|
|
141
|
+
f"type {_quote(auth.provider_type)} in this project"
|
|
142
|
+
)
|
|
140
143
|
lines.append("# secret none required in the tool sandbox; tokens are request-local")
|
|
141
144
|
else:
|
|
142
145
|
lines.append("# secret none required; this connector authenticates anonymously")
|
|
@@ -8,6 +8,7 @@ coordinates the focused parser, compiler, and writer modules.
|
|
|
8
8
|
|
|
9
9
|
from __future__ import annotations
|
|
10
10
|
|
|
11
|
+
import difflib
|
|
11
12
|
from dataclasses import dataclass
|
|
12
13
|
from pathlib import Path
|
|
13
14
|
from typing import Any, Sequence
|
|
@@ -39,6 +40,28 @@ from agent_engine_runner_shared.connectors.generate.spec import (
|
|
|
39
40
|
_quote,
|
|
40
41
|
)
|
|
41
42
|
|
|
43
|
+
# Catalogs up to this size list every operation when an allow rule misses.
|
|
44
|
+
_LISTED_OPERATIONS = 20
|
|
45
|
+
|
|
46
|
+
|
|
47
|
+
def _unmatched_allow_error(unmatched: list[str], available: set[str]) -> GenerateError:
|
|
48
|
+
"""Name the allow rules that match no operation and point at the fix.
|
|
49
|
+
|
|
50
|
+
Small catalogs list every operation. Large ones, which can run to
|
|
51
|
+
thousands of operations, report the count and the closest names, so a
|
|
52
|
+
typo does not flood the terminal.
|
|
53
|
+
"""
|
|
54
|
+
if len(available) <= _LISTED_OPERATIONS:
|
|
55
|
+
hint = f"available: {sorted(available)}"
|
|
56
|
+
else:
|
|
57
|
+
closest = sorted(
|
|
58
|
+
{match for name in unmatched for match in difflib.get_close_matches(name, available)}
|
|
59
|
+
)
|
|
60
|
+
hint = f"{len(available)} operations available"
|
|
61
|
+
if closest:
|
|
62
|
+
hint += f"; closest: {closest}"
|
|
63
|
+
return GenerateError(f"allow rules match no catalog operation: {unmatched}; {hint}")
|
|
64
|
+
|
|
42
65
|
|
|
43
66
|
@dataclass(frozen=True)
|
|
44
67
|
class CompileResult:
|
|
@@ -89,10 +112,7 @@ def compile_catalog(
|
|
|
89
112
|
available = {operation.name for operation in catalog.tools}
|
|
90
113
|
unmatched = sorted(set(allow) - available)
|
|
91
114
|
if unmatched:
|
|
92
|
-
raise
|
|
93
|
-
f"allow rules match no catalog operation: {unmatched}; "
|
|
94
|
-
f"available: {sorted(available)}"
|
|
95
|
-
)
|
|
115
|
+
raise _unmatched_allow_error(unmatched, available)
|
|
96
116
|
|
|
97
117
|
catalog_path = _ensure_output(out, _CATALOG_NAME)
|
|
98
118
|
catalog.write(catalog_path)
|
|
@@ -146,10 +166,7 @@ def scaffold_tool_yaml(
|
|
|
146
166
|
if allow is not None:
|
|
147
167
|
unmatched = sorted(set(allow) - available)
|
|
148
168
|
if unmatched:
|
|
149
|
-
raise
|
|
150
|
-
f"allow rules match no catalog operation: {unmatched}; "
|
|
151
|
-
f"available: {sorted(available)}"
|
|
152
|
-
)
|
|
169
|
+
raise _unmatched_allow_error(unmatched, available)
|
|
153
170
|
return _write_tool_yaml(
|
|
154
171
|
out,
|
|
155
172
|
name=catalog.source.name,
|
|
@@ -23,18 +23,15 @@ and load-bearing:
|
|
|
23
23
|
|
|
24
24
|
from __future__ import annotations
|
|
25
25
|
|
|
26
|
-
import os
|
|
27
26
|
from pathlib import Path
|
|
28
27
|
from typing import TYPE_CHECKING, Any, Sequence
|
|
29
28
|
|
|
30
29
|
import yaml
|
|
31
30
|
|
|
32
31
|
from agent_engine_runner_shared.connectors.bundle import (
|
|
33
|
-
CONNECTOR_BUNDLE_PATH_ENV,
|
|
34
32
|
BundledConnector,
|
|
35
33
|
BundledTool,
|
|
36
34
|
ConnectorBundle,
|
|
37
|
-
load_connector_bundle,
|
|
38
35
|
)
|
|
39
36
|
from agent_engine_runner_shared.connectors.definitions import (
|
|
40
37
|
Auth,
|
|
@@ -311,16 +308,10 @@ def materialize_connectors(connector_paths: Sequence[str | Path], *, root: Path)
|
|
|
311
308
|
def resolve_runtime_bundle(agent_config: RuntimeAgentConfig) -> ConnectorBundle:
|
|
312
309
|
"""Resolve the connector bundle for this process.
|
|
313
310
|
|
|
314
|
-
|
|
315
|
-
|
|
316
|
-
|
|
317
|
-
neither configured this is an immediate no-op without file or network
|
|
318
|
-
I/O, matching the no-connector contract.
|
|
311
|
+
The ``agent.yaml`` ``connectors`` entries are materialized in memory from
|
|
312
|
+
local files. With none configured this is an immediate no-op without file
|
|
313
|
+
or network I/O, matching the no-connector contract.
|
|
319
314
|
"""
|
|
320
|
-
configured = os.environ.get(CONNECTOR_BUNDLE_PATH_ENV)
|
|
321
|
-
if configured:
|
|
322
|
-
return load_connector_bundle(configured)
|
|
323
|
-
|
|
324
315
|
# Shape check, not truthiness: mocked runtime configs auto-create
|
|
325
316
|
# truthy attributes, and only a real list/tuple of references counts.
|
|
326
317
|
references = getattr(agent_config, "connectors", None)
|
|
@@ -18,6 +18,7 @@ from __future__ import annotations
|
|
|
18
18
|
|
|
19
19
|
import asyncio
|
|
20
20
|
import logging
|
|
21
|
+
import uuid
|
|
21
22
|
from collections.abc import Mapping
|
|
22
23
|
from contextlib import contextmanager
|
|
23
24
|
from contextvars import ContextVar, Token
|
|
@@ -157,6 +158,11 @@ class OEHTTPCustomEventTransport:
|
|
|
157
158
|
return
|
|
158
159
|
try:
|
|
159
160
|
client = get_shared_client(oe_url)
|
|
161
|
+
# delivery_id is minted once per event and reused verbatim by the
|
|
162
|
+
# owner-first helper across both attempts, so a fallback after a
|
|
163
|
+
# lost owner response carries the same stable identity and the
|
|
164
|
+
# platform can dedup the redelivered event. Regenerated per emit —
|
|
165
|
+
# two intentionally identical events must remain distinct.
|
|
160
166
|
_post_chunk_owner_first(
|
|
161
167
|
client,
|
|
162
168
|
service_url=f"{oe_url.rstrip('/')}/stream/chunk",
|
|
@@ -165,6 +171,7 @@ class OEHTTPCustomEventTransport:
|
|
|
165
171
|
"execution_id": execution_id,
|
|
166
172
|
"chunk_type": CUSTOM_EVENT,
|
|
167
173
|
"custom_event": dict(payload),
|
|
174
|
+
"delivery_id": uuid.uuid4().hex,
|
|
168
175
|
},
|
|
169
176
|
on_owner_failure=report_oe_owner_url_failure,
|
|
170
177
|
timeout=PROGRESS_TIMEOUT_SECS,
|