agent-engine-runner-shared 0.11.12__tar.gz → 0.11.13__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.12 → agent_engine_runner_shared-0.11.13}/Dockerfile +1 -1
- {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.13}/PKG-INFO +3 -3
- {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.13}/pyproject.toml +3 -3
- {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.13}/src/agent_engine_runner_shared/connectors/generate/authoring.py +8 -6
- {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.13}/src/agent_engine_runner_shared/server/tool.py +31 -23
- {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.13}/src/agent_engine_runner_shared/tracing/conversation.py +59 -0
- {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.13}/src/agent_engine_runner_shared/tracing/exporters.py +93 -5
- {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.13}/src/agent_engine_runner_shared/tracing/setup.py +3 -0
- {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.13}/tests/unit/connectors/test_generate.py +1 -0
- {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.13}/tests/unit/test_llm_routing.py +57 -0
- {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.13}/tests/unit/test_platform_tracing_exporter.py +188 -0
- {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.13}/tests/unit/test_trace_conversation.py +68 -0
- {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.13}/tests/unit/test_tracing_exporter.py +41 -0
- {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.13}/CHANGELOG.md +0 -0
- {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.13}/LICENSE +0 -0
- {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.13}/Makefile +0 -0
- {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.13}/README.md +0 -0
- {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.13}/docs/api.md +0 -0
- {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.13}/pydoc-markdown.yml +0 -0
- {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.13}/pyrightconfig.json +0 -0
- {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.13}/scripts/agentic-vendored-wheel-check.sh +0 -0
- {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.13}/src/agent_engine_runner_shared/__init__.py +0 -0
- {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.13}/src/agent_engine_runner_shared/__main__.py +0 -0
- {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.13}/src/agent_engine_runner_shared/a2a.py +0 -0
- {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.13}/src/agent_engine_runner_shared/a2a_auth.py +0 -0
- {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.13}/src/agent_engine_runner_shared/agent_config.py +0 -0
- {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.13}/src/agent_engine_runner_shared/async_utils.py +0 -0
- {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.13}/src/agent_engine_runner_shared/caller_trace.py +0 -0
- {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.13}/src/agent_engine_runner_shared/checkpoint_workspace.py +0 -0
- {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.13}/src/agent_engine_runner_shared/connectors/README.md +0 -0
- {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.13}/src/agent_engine_runner_shared/connectors/__init__.py +0 -0
- {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.13}/src/agent_engine_runner_shared/connectors/bundle.py +0 -0
- {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.13}/src/agent_engine_runner_shared/connectors/create_tool.py +0 -0
- {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.13}/src/agent_engine_runner_shared/connectors/definitions.py +0 -0
- {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.13}/src/agent_engine_runner_shared/connectors/executor.py +0 -0
- {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.13}/src/agent_engine_runner_shared/connectors/generate/README.md +0 -0
- {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.13}/src/agent_engine_runner_shared/connectors/generate/__init__.py +0 -0
- {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.13}/src/agent_engine_runner_shared/connectors/generate/catalog.py +0 -0
- {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.13}/src/agent_engine_runner_shared/connectors/generate/modes.py +0 -0
- {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.13}/src/agent_engine_runner_shared/connectors/generate/naming.py +0 -0
- {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.13}/src/agent_engine_runner_shared/connectors/generate/parameters.py +0 -0
- {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.13}/src/agent_engine_runner_shared/connectors/generate/security.py +0 -0
- {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.13}/src/agent_engine_runner_shared/connectors/generate/spec.py +0 -0
- {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.13}/src/agent_engine_runner_shared/connectors/materialize.py +0 -0
- {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.13}/src/agent_engine_runner_shared/connectors/runtime.py +0 -0
- {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.13}/src/agent_engine_runner_shared/context.py +0 -0
- {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.13}/src/agent_engine_runner_shared/custom_events.py +0 -0
- {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.13}/src/agent_engine_runner_shared/db_config.py +0 -0
- {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.13}/src/agent_engine_runner_shared/db_naming.py +0 -0
- {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.13}/src/agent_engine_runner_shared/error_reporting.py +0 -0
- {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.13}/src/agent_engine_runner_shared/execution.py +0 -0
- {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.13}/src/agent_engine_runner_shared/generated/__init__.py +0 -0
- {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.13}/src/agent_engine_runner_shared/generated/workflow/__init__.py +0 -0
- {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.13}/src/agent_engine_runner_shared/generated/workflow/v1/__init__.py +0 -0
- {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.13}/src/agent_engine_runner_shared/generated/workflow/v1/activity_pb2.py +0 -0
- {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.13}/src/agent_engine_runner_shared/generated/workflow/v1/activity_pb2.pyi +0 -0
- {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.13}/src/agent_engine_runner_shared/generated/workflow/v1/common_pb2.py +0 -0
- {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.13}/src/agent_engine_runner_shared/generated/workflow/v1/common_pb2.pyi +0 -0
- {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.13}/src/agent_engine_runner_shared/generated/workflow/v1/runtime_pb2.py +0 -0
- {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.13}/src/agent_engine_runner_shared/generated/workflow/v1/runtime_pb2.pyi +0 -0
- {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.13}/src/agent_engine_runner_shared/generated/workflow/v1/state_pb2.py +0 -0
- {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.13}/src/agent_engine_runner_shared/generated/workflow/v1/state_pb2.pyi +0 -0
- {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.13}/src/agent_engine_runner_shared/guardrails_evaluator/__init__.py +0 -0
- {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.13}/src/agent_engine_runner_shared/guardrails_evaluator/core.py +0 -0
- {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.13}/src/agent_engine_runner_shared/guardrails_evaluator/regex.py +0 -0
- {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.13}/src/agent_engine_runner_shared/hooks.py +0 -0
- {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.13}/src/agent_engine_runner_shared/http_path.py +0 -0
- {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.13}/src/agent_engine_runner_shared/launcher.py +0 -0
- {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.13}/src/agent_engine_runner_shared/mcp_oauth.py +0 -0
- {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.13}/src/agent_engine_runner_shared/mcp_oauth_cache_lock.py +0 -0
- {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.13}/src/agent_engine_runner_shared/mcp_oauth_cache_name.py +0 -0
- {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.13}/src/agent_engine_runner_shared/mcp_oauth_cli.py +0 -0
- {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.13}/src/agent_engine_runner_shared/mcp_oauth_secret.py +0 -0
- {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.13}/src/agent_engine_runner_shared/mcp_tools.py +0 -0
- {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.13}/src/agent_engine_runner_shared/memory.py +0 -0
- {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.13}/src/agent_engine_runner_shared/memory_appbound.py +0 -0
- {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.13}/src/agent_engine_runner_shared/metrics.py +0 -0
- {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.13}/src/agent_engine_runner_shared/models.py +0 -0
- {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.13}/src/agent_engine_runner_shared/node_logger.py +0 -0
- {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.13}/src/agent_engine_runner_shared/owner_callback.py +0 -0
- {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.13}/src/agent_engine_runner_shared/progress.py +0 -0
- {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.13}/src/agent_engine_runner_shared/py.typed +0 -0
- {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.13}/src/agent_engine_runner_shared/runtime.py +0 -0
- {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.13}/src/agent_engine_runner_shared/secure_llm_proxy.py +0 -0
- {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.13}/src/agent_engine_runner_shared/secure_wrapper.py +0 -0
- {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.13}/src/agent_engine_runner_shared/server/__init__.py +0 -0
- {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.13}/src/agent_engine_runner_shared/server/aer.py +0 -0
- {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.13}/src/agent_engine_runner_shared/server/atlas_dns.py +0 -0
- {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.13}/src/agent_engine_runner_shared/server/auth.py +0 -0
- {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.13}/src/agent_engine_runner_shared/server/base.py +0 -0
- {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.13}/src/agent_engine_runner_shared/server/call_interrupt.py +0 -0
- {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.13}/src/agent_engine_runner_shared/server/callback_delivery.py +0 -0
- {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.13}/src/agent_engine_runner_shared/server/chunk_types.py +0 -0
- {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.13}/src/agent_engine_runner_shared/server/cors.py +0 -0
- {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.13}/src/agent_engine_runner_shared/server/drain.py +0 -0
- {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.13}/src/agent_engine_runner_shared/server/graph_warm.py +0 -0
- {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.13}/src/agent_engine_runner_shared/server/http_retry.py +0 -0
- {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.13}/src/agent_engine_runner_shared/server/metadata.py +0 -0
- {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.13}/src/agent_engine_runner_shared/server/oe_url.py +0 -0
- {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.13}/src/agent_engine_runner_shared/server/owner_url.py +0 -0
- {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.13}/src/agent_engine_runner_shared/server/query.py +0 -0
- {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.13}/src/agent_engine_runner_shared/span_kinds.py +0 -0
- {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.13}/src/agent_engine_runner_shared/span_names.py +0 -0
- {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.13}/src/agent_engine_runner_shared/startup_state.py +0 -0
- {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.13}/src/agent_engine_runner_shared/structured_logging.py +0 -0
- {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.13}/src/agent_engine_runner_shared/tls_client.py +0 -0
- {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.13}/src/agent_engine_runner_shared/tool_api_error.py +0 -0
- {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.13}/src/agent_engine_runner_shared/tool_memory_ownership.py +0 -0
- {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.13}/src/agent_engine_runner_shared/toolpod_handlers.py +0 -0
- {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.13}/src/agent_engine_runner_shared/tracing/__init__.py +0 -0
- {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.13}/src/agent_engine_runner_shared/types.py +0 -0
- {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.13}/src/agent_engine_runner_shared/utils.py +0 -0
- {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.13}/src/agent_engine_runner_shared/workflow/__init__.py +0 -0
- {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.13}/src/agent_engine_runner_shared/workflow/activity.py +0 -0
- {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.13}/src/agent_engine_runner_shared/workflow/attempt.py +0 -0
- {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.13}/src/agent_engine_runner_shared/workflow/cancelled_history.py +0 -0
- {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.13}/src/agent_engine_runner_shared/workflow/client.py +0 -0
- {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.13}/src/agent_engine_runner_shared/workflow/context.py +0 -0
- {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.13}/src/agent_engine_runner_shared/workflow/heartbeat.py +0 -0
- {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.13}/src/agent_engine_runner_shared/workflow/memory.py +0 -0
- {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.13}/src/agent_engine_runner_shared/workflow/protojson.py +0 -0
- {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.13}/src/agent_engine_runner_shared/workflow/settlement.py +0 -0
- {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.13}/tests/__init__.py +0 -0
- {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.13}/tests/conftest.py +0 -0
- {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.13}/tests/corpus/.gitignore +0 -0
- {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.13}/tests/corpus/README.md +0 -0
- {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.13}/tests/corpus/__init__.py +0 -0
- {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.13}/tests/corpus/fetch_corpus.py +0 -0
- {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.13}/tests/corpus/manifest.json +0 -0
- {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.13}/tests/corpus/test_api_corpus.py +0 -0
- {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.13}/tests/integration/__init__.py +0 -0
- {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.13}/tests/integration/mock_embedder.py +0 -0
- {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.13}/tests/integration/test_a2a_trace_propagation.py +0 -0
- {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.13}/tests/integration/test_runtime.py +0 -0
- {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.13}/tests/integration/test_secure_async.py +0 -0
- {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.13}/tests/integration/test_secure_sync.py +0 -0
- {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.13}/tests/integration/test_tracing_otlp_wire_format.py +0 -0
- {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.13}/tests/pact/conftest.py +0 -0
- {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.13}/tests/pact/test_oe_provider_verification.py +0 -0
- {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.13}/tests/unit/__init__.py +0 -0
- {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.13}/tests/unit/connectors/__init__.py +0 -0
- {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.13}/tests/unit/connectors/fixtures/auth_cases.yaml +0 -0
- {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.13}/tests/unit/connectors/fixtures/jira.tool_defs.yaml +0 -0
- {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.13}/tests/unit/connectors/test_auth.py +0 -0
- {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.13}/tests/unit/connectors/test_bundle.py +0 -0
- {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.13}/tests/unit/connectors/test_core.py +0 -0
- {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.13}/tests/unit/connectors/test_create_tool.py +0 -0
- {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.13}/tests/unit/connectors/test_materialize.py +0 -0
- {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.13}/tests/unit/test_a2a.py +0 -0
- {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.13}/tests/unit/test_a2a_auth.py +0 -0
- {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.13}/tests/unit/test_aer_a2a_registration.py +0 -0
- {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.13}/tests/unit/test_aer_build_agent_span.py +0 -0
- {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.13}/tests/unit/test_aer_cancelled_turn.py +0 -0
- {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.13}/tests/unit/test_aer_capability_advertise.py +0 -0
- {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.13}/tests/unit/test_aer_chunk_delivery_reliability.py +0 -0
- {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.13}/tests/unit/test_aer_chunk_emission.py +0 -0
- {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.13}/tests/unit/test_aer_durable_attempt.py +0 -0
- {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.13}/tests/unit/test_aer_llm_invocation_signal.py +0 -0
- {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.13}/tests/unit/test_aer_metadata_payload.py +0 -0
- {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.13}/tests/unit/test_aer_policy_denied.py +0 -0
- {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.13}/tests/unit/test_aer_session_finish.py +0 -0
- {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.13}/tests/unit/test_aer_timeout_signal.py +0 -0
- {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.13}/tests/unit/test_aer_trace_context.py +0 -0
- {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.13}/tests/unit/test_aer_workspace_scope.py +0 -0
- {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.13}/tests/unit/test_agent_config.py +0 -0
- {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.13}/tests/unit/test_async_utils.py +0 -0
- {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.13}/tests/unit/test_atlas_dns.py +0 -0
- {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.13}/tests/unit/test_call_interrupt.py +0 -0
- {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.13}/tests/unit/test_call_interrupt_contract.py +0 -0
- {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.13}/tests/unit/test_checkpoint_workspace.py +0 -0
- {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.13}/tests/unit/test_cors.py +0 -0
- {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.13}/tests/unit/test_create_memory_client_headers.py +0 -0
- {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.13}/tests/unit/test_custom_headers_context.py +0 -0
- {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.13}/tests/unit/test_custom_headers_models.py +0 -0
- {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.13}/tests/unit/test_db_naming.py +0 -0
- {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.13}/tests/unit/test_debug_hook.py +0 -0
- {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.13}/tests/unit/test_drain.py +0 -0
- {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.13}/tests/unit/test_drain_contract.py +0 -0
- {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.13}/tests/unit/test_durable_guardrail_review.py +0 -0
- {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.13}/tests/unit/test_durable_oauth.py +0 -0
- {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.13}/tests/unit/test_durable_proxies.py +0 -0
- {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.13}/tests/unit/test_emit_custom_event.py +0 -0
- {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.13}/tests/unit/test_emit_progress.py +0 -0
- {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.13}/tests/unit/test_error_reporting.py +0 -0
- {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.13}/tests/unit/test_execution.py +0 -0
- {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.13}/tests/unit/test_extract_turn_messages.py +0 -0
- {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.13}/tests/unit/test_format_llm_error.py +0 -0
- {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.13}/tests/unit/test_graph_warm.py +0 -0
- {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.13}/tests/unit/test_guardrails_protocol.py +0 -0
- {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.13}/tests/unit/test_hitl_interrupt.py +0 -0
- {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.13}/tests/unit/test_hooks.py +0 -0
- {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.13}/tests/unit/test_http_path.py +0 -0
- {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.13}/tests/unit/test_http_retry.py +0 -0
- {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.13}/tests/unit/test_launcher.py +0 -0
- {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.13}/tests/unit/test_launcher_reports.py +0 -0
- {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.13}/tests/unit/test_listen_host.py +0 -0
- {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.13}/tests/unit/test_llm_credential_classification.py +0 -0
- {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.13}/tests/unit/test_mcp_era_compat.py +0 -0
- {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.13}/tests/unit/test_mcp_oauth.py +0 -0
- {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.13}/tests/unit/test_mcp_oauth_cli.py +0 -0
- {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.13}/tests/unit/test_mcp_oauth_secret.py +0 -0
- {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.13}/tests/unit/test_mcp_tools.py +0 -0
- {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.13}/tests/unit/test_memory_appbound.py +0 -0
- {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.13}/tests/unit/test_memory_search_metadata.py +0 -0
- {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.13}/tests/unit/test_memory_writer_context.py +0 -0
- {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.13}/tests/unit/test_metadata.py +0 -0
- {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.13}/tests/unit/test_metrics.py +0 -0
- {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.13}/tests/unit/test_models.py +0 -0
- {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.13}/tests/unit/test_no_lc_imports.py +0 -0
- {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.13}/tests/unit/test_node_logger.py +0 -0
- {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.13}/tests/unit/test_oe_url.py +0 -0
- {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.13}/tests/unit/test_owner_callback.py +0 -0
- {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.13}/tests/unit/test_owner_url.py +0 -0
- {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.13}/tests/unit/test_payload_context.py +0 -0
- {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.13}/tests/unit/test_query_routes.py +0 -0
- {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.13}/tests/unit/test_request_id_context.py +0 -0
- {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.13}/tests/unit/test_resume_payload.py +0 -0
- {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.13}/tests/unit/test_runtime_build_context_from_sources.py +0 -0
- {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.13}/tests/unit/test_runtime_checkpoint_workspace.py +0 -0
- {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.13}/tests/unit/test_runtime_custom_memory.py +0 -0
- {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.13}/tests/unit/test_runtime_memory_context.py +0 -0
- {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.13}/tests/unit/test_runtime_models.py +0 -0
- {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.13}/tests/unit/test_runtime_register_tool.py +0 -0
- {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.13}/tests/unit/test_secure_llm_proxy.py +0 -0
- {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.13}/tests/unit/test_secure_wrapper.py +0 -0
- {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.13}/tests/unit/test_server_auth.py +0 -0
- {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.13}/tests/unit/test_server_health.py +0 -0
- {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.13}/tests/unit/test_server_shutdown.py +0 -0
- {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.13}/tests/unit/test_server_startup_failures.py +0 -0
- {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.13}/tests/unit/test_session_filesystem_isolation.py +0 -0
- {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.13}/tests/unit/test_session_finish_context.py +0 -0
- {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.13}/tests/unit/test_shared_client.py +0 -0
- {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.13}/tests/unit/test_structured_logging.py +0 -0
- {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.13}/tests/unit/test_thinking_tokens.py +0 -0
- {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.13}/tests/unit/test_tls_client.py +0 -0
- {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.13}/tests/unit/test_tls_client_integration.py +0 -0
- {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.13}/tests/unit/test_token_capture.py +0 -0
- {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.13}/tests/unit/test_tool.py +0 -0
- {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.13}/tests/unit/test_tool_api_error.py +0 -0
- {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.13}/tests/unit/test_tool_authorization.py +0 -0
- {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.13}/tests/unit/test_tool_cancellation_boundary.py +0 -0
- {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.13}/tests/unit/test_tool_deserialization.py +0 -0
- {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.13}/tests/unit/test_tool_log_redaction.py +0 -0
- {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.13}/tests/unit/test_tool_memory_ownership.py +0 -0
- {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.13}/tests/unit/test_tool_server_startup.py +0 -0
- {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.13}/tests/unit/test_tool_trace_context.py +0 -0
- {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.13}/tests/unit/test_toolpod_handlers.py +0 -0
- {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.13}/tests/unit/test_tracing_retry.py +0 -0
- {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.13}/tests/unit/workflow/test_activity.py +0 -0
- {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.13}/tests/unit/workflow/test_attempt.py +0 -0
- {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.13}/tests/unit/workflow/test_cancelled_history.py +0 -0
- {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.13}/tests/unit/workflow/test_client.py +0 -0
- {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.13}/tests/unit/workflow/test_context.py +0 -0
- {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.13}/tests/unit/workflow/test_heartbeat.py +0 -0
- {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.13}/tests/unit/workflow/test_memory.py +0 -0
- {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.13}/tests/unit/workflow/test_protojson.py +0 -0
- {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.13}/tests/unit/workflow/test_protojson_helpers.py +0 -0
- {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.13}/tests/unit/workflow/test_settlement.py +0 -0
|
@@ -5,7 +5,7 @@
|
|
|
5
5
|
# Usage: docker buildx build -t runner:latest -f packages/python/packages/agent-engine-runner-shared/Dockerfile .
|
|
6
6
|
|
|
7
7
|
ARG BASE_TARGETPLATFORM=linux/amd64
|
|
8
|
-
ARG RUNNER_BASE_IMAGE=664315256653.dkr.ecr.us-east-1.amazonaws.com/base/amazonlinux2023-python:v3.11-
|
|
8
|
+
ARG RUNNER_BASE_IMAGE=664315256653.dkr.ecr.us-east-1.amazonaws.com/base/amazonlinux2023-python:v3.11-202611021131-0cb5df7@sha256:059f4396b31473f85e83c9219255b37f7b24e3caaef1c129363d50bc50383ceb
|
|
9
9
|
|
|
10
10
|
FROM --platform=${BASE_TARGETPLATFORM} ghcr.io/astral-sh/uv@sha256:ff07b86af50d4d9391d9daf4ff89ce427bc544f9aae87057e69a1cc0aa369946 AS uv
|
|
11
11
|
|
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
Metadata-Version: 2.5
|
|
2
2
|
Name: agent-engine-runner-shared
|
|
3
|
-
Version: 0.11.
|
|
3
|
+
Version: 0.11.13
|
|
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.13
|
|
9
|
+
Requires-Dist: agent-engine-sdk==0.11.13
|
|
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
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
[project]
|
|
2
2
|
name = "agent-engine-runner-shared"
|
|
3
|
-
version = "0.11.
|
|
3
|
+
version = "0.11.13"
|
|
4
4
|
description = "Runner SDK - Framework-agnostic agent runtime"
|
|
5
5
|
readme = "README.md"
|
|
6
6
|
license = {text = "Apache-2.0"}
|
|
@@ -27,9 +27,9 @@ dependencies = [
|
|
|
27
27
|
"jsonschema>=4.26.0",
|
|
28
28
|
"sentry-sdk>=2.27.0",
|
|
29
29
|
# BaseAgent protocol and AgentInput/AgentEvent models
|
|
30
|
-
"agent-engine-sdk==0.11.
|
|
30
|
+
"agent-engine-sdk==0.11.13",
|
|
31
31
|
# Memory models and the MemoryClient HTTP client
|
|
32
|
-
"agent-engine-sdk-memory==0.11.
|
|
32
|
+
"agent-engine-sdk-memory==0.11.13",
|
|
33
33
|
# Required for checkpoint message decoding (query/sessions endpoints)
|
|
34
34
|
"msgpack>=1.0.0",
|
|
35
35
|
# Required by guardrails_evaluator/regex.py for advanced regex matching
|
|
@@ -269,17 +269,17 @@ def _egress_target(base_url: str) -> tuple[str, int]:
|
|
|
269
269
|
def _guidance_comment(base_url: str, auth: Auth | None) -> str:
|
|
270
270
|
"""Report the agent.yaml policy this connector needs, as a file comment.
|
|
271
271
|
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
|
|
272
|
+
The generator never edits agent.yaml; the CLI's create-tool does that after it
|
|
273
|
+
returns. The egress hint is a command so it adapts to whichever egress shape
|
|
274
|
+
the manifest already uses, and every interpolated value passes the generator's
|
|
275
|
+
control-byte sanitizer so no value can escape the comment.
|
|
276
276
|
"""
|
|
277
277
|
host, port = _egress_target(base_url)
|
|
278
278
|
envs = auth.secret_names() if auth is not None else []
|
|
279
279
|
target = f"{_quote(host)}:{port}"
|
|
280
280
|
lines = [
|
|
281
|
-
"# Connector operations execute in the tool sandbox
|
|
282
|
-
"#
|
|
281
|
+
"# Connector operations execute in the tool sandbox. agent.yaml needs these;",
|
|
282
|
+
"# agentengine agent create-tool and agent validate --fix can add them:",
|
|
283
283
|
f"# egress allow {target} from the tool sandbox, e.g.",
|
|
284
284
|
f"# agentengine agent egress add --component tool {shlex.quote(target)}",
|
|
285
285
|
]
|
|
@@ -297,6 +297,8 @@ def _guidance_comment(base_url: str, auth: Auth | None) -> str:
|
|
|
297
297
|
lines.append("# secret none required in the tool sandbox; tokens are request-local")
|
|
298
298
|
else:
|
|
299
299
|
lines.append("# secret none required; this connector authenticates anonymously")
|
|
300
|
+
lines.append("# tools list this connector's tools under sandboxes.tool.tools when")
|
|
301
|
+
lines.append("# agent.yaml has a sandboxes block")
|
|
300
302
|
return "\n".join(lines) + "\n"
|
|
301
303
|
|
|
302
304
|
|
|
@@ -66,6 +66,7 @@ from agent_engine_runner_shared.tool_api_error import (
|
|
|
66
66
|
request_named_credential_values,
|
|
67
67
|
)
|
|
68
68
|
from agent_engine_runner_shared.toolpod_handlers import BUILTIN_TOOL_NAMES
|
|
69
|
+
from agent_engine_runner_shared.tracing.conversation import caller_records_conversation
|
|
69
70
|
from agent_engine_runner_shared.utils import (
|
|
70
71
|
LLM_BACKOFF_MULTIPLIER,
|
|
71
72
|
LLM_INITIAL_BACKOFF,
|
|
@@ -1172,11 +1173,15 @@ class ToolServer(ToolExecution, BaseServer):
|
|
|
1172
1173
|
trace_id=request.platform_trace_id,
|
|
1173
1174
|
)
|
|
1174
1175
|
try:
|
|
1175
|
-
#
|
|
1176
|
-
#
|
|
1177
|
-
|
|
1178
|
-
|
|
1179
|
-
|
|
1176
|
+
# The calling agent's span stores this prompt; the model span this
|
|
1177
|
+
# call produces would be a second copy of it.
|
|
1178
|
+
with caller_records_conversation():
|
|
1179
|
+
# Usually a no-op after startup; keep any registry load inside
|
|
1180
|
+
# the request's credential isolation, as with model execution
|
|
1181
|
+
# below.
|
|
1182
|
+
async with self._credential_isolation():
|
|
1183
|
+
await self._ensure_llm_registry_loaded()
|
|
1184
|
+
chunks = [chunk async for chunk in self._stream_llm_chunks(request)]
|
|
1180
1185
|
llm_response = SecureLLMProxy.response_from_stream_chunks(chunks)
|
|
1181
1186
|
duration_ms = (time.time() - start_time) * 1000
|
|
1182
1187
|
return LLMPodInvokeResponse(
|
|
@@ -1277,24 +1282,27 @@ class ToolServer(ToolExecution, BaseServer):
|
|
|
1277
1282
|
)
|
|
1278
1283
|
try:
|
|
1279
1284
|
usage = None
|
|
1280
|
-
#
|
|
1281
|
-
#
|
|
1282
|
-
|
|
1283
|
-
|
|
1284
|
-
|
|
1285
|
-
|
|
1286
|
-
|
|
1287
|
-
|
|
1288
|
-
|
|
1289
|
-
|
|
1290
|
-
|
|
1291
|
-
|
|
1292
|
-
|
|
1293
|
-
|
|
1294
|
-
|
|
1295
|
-
|
|
1296
|
-
|
|
1297
|
-
|
|
1285
|
+
# The calling agent's span stores this prompt; the model span this
|
|
1286
|
+
# call produces would be a second copy of it.
|
|
1287
|
+
with caller_records_conversation():
|
|
1288
|
+
# See the gate + metadata-env ordering rationale in
|
|
1289
|
+
# _handle_invoke_llm above.
|
|
1290
|
+
async with self._credential_isolation():
|
|
1291
|
+
await self._ensure_llm_registry_loaded()
|
|
1292
|
+
async for stream_chunk in self._stream_llm_chunks(request):
|
|
1293
|
+
if not _stream_chunk_has_payload(stream_chunk):
|
|
1294
|
+
if stream_chunk.usage is not None:
|
|
1295
|
+
usage = stream_chunk.usage
|
|
1296
|
+
continue
|
|
1297
|
+
chunk_event = LLMPodStreamEvent(
|
|
1298
|
+
content=stream_chunk.content,
|
|
1299
|
+
tool_call_chunks=stream_chunk.tool_calls,
|
|
1300
|
+
id=stream_chunk.id,
|
|
1301
|
+
name=stream_chunk.name,
|
|
1302
|
+
response_metadata=stream_chunk.response_metadata,
|
|
1303
|
+
additional_kwargs=stream_chunk.additional_kwargs,
|
|
1304
|
+
)
|
|
1305
|
+
yield f"data: {chunk_event.model_dump_json(exclude_none=True)}\n\n"
|
|
1298
1306
|
|
|
1299
1307
|
# Final summary event
|
|
1300
1308
|
duration_ms = (time.time() - start_time) * 1000
|
|
@@ -10,6 +10,11 @@ the previous call in the same trace and stream, and records where that slice
|
|
|
10
10
|
starts. A reader replays the slices to rebuild the full context. Spans
|
|
11
11
|
written before this existed carry no offset and read as a full list, so old
|
|
12
12
|
and new traces read the same way.
|
|
13
|
+
|
|
14
|
+
The platform forwards an agent's LLM call to a tool pod that makes the
|
|
15
|
+
provider request, and both processes instrument it. The caller's span stores
|
|
16
|
+
the conversation for that call, so the tool-pod copy is dropped outright
|
|
17
|
+
(``omit_input_messages``) instead of being trimmed a second time.
|
|
13
18
|
"""
|
|
14
19
|
|
|
15
20
|
from __future__ import annotations
|
|
@@ -18,6 +23,9 @@ import hashlib
|
|
|
18
23
|
import os
|
|
19
24
|
import re
|
|
20
25
|
from collections import OrderedDict
|
|
26
|
+
from collections.abc import Iterator
|
|
27
|
+
from contextlib import contextmanager
|
|
28
|
+
from contextvars import ContextVar
|
|
21
29
|
from typing import Any, Dict, List, Mapping
|
|
22
30
|
|
|
23
31
|
# The trace UI reads these; keep the names in sync with
|
|
@@ -25,6 +33,11 @@ from typing import Any, Dict, List, Mapping
|
|
|
25
33
|
ATTR_INPUT_MESSAGES_OFFSET = "agent_engine.internal.input_messages.offset"
|
|
26
34
|
ATTR_INPUT_MESSAGES_TOTAL = "agent_engine.internal.input_messages.total"
|
|
27
35
|
ATTR_INPUT_MESSAGES_STREAM = "agent_engine.internal.input_messages.stream"
|
|
36
|
+
# Written on a span whose prompt the calling pod stores itself. The platform
|
|
37
|
+
# forwards an agent's LLM call to a tool pod that makes the provider request, so
|
|
38
|
+
# both processes record the same conversation; the tool-pod copy is redundant.
|
|
39
|
+
ATTR_INPUT_MESSAGES_RECORDED_BY = "agent_engine.internal.input_messages.recorded_by"
|
|
40
|
+
RECORDED_BY_CALLER = "caller"
|
|
28
41
|
|
|
29
42
|
# Resource attribute carrying the pod's role. The name predates the product
|
|
30
43
|
# rename and is the contract the runner already emits on every span, not
|
|
@@ -39,6 +52,52 @@ _INPUT_MESSAGES_KEY = re.compile(r"^llm\.input_messages\.(\d+)\.(.+)$")
|
|
|
39
52
|
# correctness, since a missing entry reads as "store the full list".
|
|
40
53
|
MAX_TRACKED_CONVERSATIONS = 256
|
|
41
54
|
|
|
55
|
+
# True while the tool pod runs an LLM call the agent made and already records.
|
|
56
|
+
# A span ends — and is exported — before the request span that names the call,
|
|
57
|
+
# so the trace tree cannot say at write time where a prompt is stored; the
|
|
58
|
+
# process that forwards the call is the only one that knows.
|
|
59
|
+
_CALLER_RECORDED: ContextVar[bool] = ContextVar("caller_recorded_conversation", default=False)
|
|
60
|
+
|
|
61
|
+
|
|
62
|
+
@contextmanager
|
|
63
|
+
def caller_records_conversation() -> Iterator[None]:
|
|
64
|
+
"""Mark spans started in this block as a call the caller already stores.
|
|
65
|
+
|
|
66
|
+
Scoped to the tool pod's platform-forwarded LLM routes. A prompt recorded
|
|
67
|
+
only here — a tool that calls a provider itself — stays unmarked and keeps
|
|
68
|
+
its messages.
|
|
69
|
+
"""
|
|
70
|
+
token = _CALLER_RECORDED.set(True)
|
|
71
|
+
try:
|
|
72
|
+
yield
|
|
73
|
+
finally:
|
|
74
|
+
_CALLER_RECORDED.reset(token)
|
|
75
|
+
|
|
76
|
+
|
|
77
|
+
def mark_recorded_by_caller(span: Any) -> None:
|
|
78
|
+
"""Attribute a span whose prompt the calling pod already stores.
|
|
79
|
+
|
|
80
|
+
Called for every span as it starts; only spans carrying a prompt use the
|
|
81
|
+
attribute, which is how the trace store and its readers find the copy.
|
|
82
|
+
"""
|
|
83
|
+
if _CALLER_RECORDED.get():
|
|
84
|
+
span.set_attribute(ATTR_INPUT_MESSAGES_RECORDED_BY, RECORDED_BY_CALLER)
|
|
85
|
+
|
|
86
|
+
|
|
87
|
+
def omit_input_messages(attributes: Mapping[str, Any]) -> Dict[str, Any]:
|
|
88
|
+
"""Drop a span's prompt, keeping the marker that says where it lives."""
|
|
89
|
+
omitted = {
|
|
90
|
+
name: value
|
|
91
|
+
for name, value in attributes.items()
|
|
92
|
+
if not name.startswith(_INPUT_MESSAGES_PREFIX)
|
|
93
|
+
}
|
|
94
|
+
# OpenInference also serializes the prompt into input.value; leaving it
|
|
95
|
+
# would store the conversation the marker says is stored elsewhere.
|
|
96
|
+
omitted.pop("input.value", None)
|
|
97
|
+
omitted.pop("input.mime_type", None)
|
|
98
|
+
omitted[ATTR_INPUT_MESSAGES_RECORDED_BY] = RECORDED_BY_CALLER
|
|
99
|
+
return omitted
|
|
100
|
+
|
|
42
101
|
|
|
43
102
|
def _fingerprint(message: Mapping[str, Any]) -> bytes:
|
|
44
103
|
"""Stable digest of one message's fields, for prefix comparison.
|
|
@@ -22,15 +22,18 @@ import random
|
|
|
22
22
|
import threading
|
|
23
23
|
import time
|
|
24
24
|
from pathlib import Path
|
|
25
|
-
from typing import TYPE_CHECKING, Any, Awaitable, Callable, Dict, Sequence
|
|
25
|
+
from typing import TYPE_CHECKING, Any, Awaitable, Callable, Dict, Mapping, Sequence
|
|
26
26
|
|
|
27
27
|
import httpx
|
|
28
28
|
from opentelemetry.sdk.trace import Event, ReadableSpan
|
|
29
29
|
from opentelemetry.sdk.trace.export import SpanExporter, SpanExportResult
|
|
30
30
|
|
|
31
31
|
from agent_engine_runner_shared.tracing.conversation import (
|
|
32
|
+
ATTR_INPUT_MESSAGES_RECORDED_BY,
|
|
33
|
+
RECORDED_BY_CALLER,
|
|
32
34
|
ConversationDeltaTracker,
|
|
33
35
|
has_input_messages,
|
|
36
|
+
omit_input_messages,
|
|
34
37
|
trace_stream,
|
|
35
38
|
)
|
|
36
39
|
|
|
@@ -109,16 +112,45 @@ def _span_to_dict(span: ReadableSpan) -> Dict[str, Any]:
|
|
|
109
112
|
return doc
|
|
110
113
|
|
|
111
114
|
|
|
115
|
+
def _conversation_attributes(
|
|
116
|
+
attributes: Mapping[str, Any],
|
|
117
|
+
*,
|
|
118
|
+
trace_id: str,
|
|
119
|
+
resource: Mapping[str, Any],
|
|
120
|
+
tracker: ConversationDeltaTracker,
|
|
121
|
+
) -> Dict[str, Any] | None:
|
|
122
|
+
"""Return the attributes to store for one span, or None to keep them as-is.
|
|
123
|
+
|
|
124
|
+
Shared by both export destinations so a span's conversation is deduplicated
|
|
125
|
+
the same way whichever store it reaches.
|
|
126
|
+
"""
|
|
127
|
+
if attributes.get(ATTR_INPUT_MESSAGES_RECORDED_BY) == RECORDED_BY_CALLER:
|
|
128
|
+
# The caller's span holds this prompt. Dropping it here and leaving the
|
|
129
|
+
# tracker alone keeps a later tool-pod span — one that records its own
|
|
130
|
+
# conversation — starting from a full list rather than a bogus offset.
|
|
131
|
+
return omit_input_messages(attributes)
|
|
132
|
+
if not has_input_messages(attributes):
|
|
133
|
+
return None
|
|
134
|
+
return tracker.trim(
|
|
135
|
+
attributes,
|
|
136
|
+
trace_id=trace_id,
|
|
137
|
+
stream_id=trace_stream(resource),
|
|
138
|
+
)
|
|
139
|
+
|
|
140
|
+
|
|
112
141
|
def _trim_conversation(doc: Dict[str, Any], tracker: ConversationDeltaTracker) -> Dict[str, Any]:
|
|
113
142
|
"""Keep only the input messages this call added (see tracing.conversation)."""
|
|
114
143
|
attributes = doc.get("attributes")
|
|
115
|
-
if not attributes
|
|
144
|
+
if not attributes:
|
|
116
145
|
return doc
|
|
117
|
-
|
|
146
|
+
trimmed = _conversation_attributes(
|
|
118
147
|
attributes,
|
|
119
148
|
trace_id=doc["trace_id"],
|
|
120
|
-
|
|
149
|
+
resource=doc.get("resource") or {},
|
|
150
|
+
tracker=tracker,
|
|
121
151
|
)
|
|
152
|
+
if trimmed is not None:
|
|
153
|
+
doc["attributes"] = trimmed
|
|
122
154
|
return doc
|
|
123
155
|
|
|
124
156
|
|
|
@@ -372,6 +404,51 @@ def _redact_span(span: ReadableSpan) -> ReadableSpan:
|
|
|
372
404
|
)
|
|
373
405
|
|
|
374
406
|
|
|
407
|
+
def _with_attributes(span: ReadableSpan, attributes: Dict[str, Any]) -> ReadableSpan:
|
|
408
|
+
"""Return a copy of ``span`` carrying ``attributes`` in place of its own.
|
|
409
|
+
|
|
410
|
+
The OTLP encoder reads ``dropped_attributes`` off the container, so a plain
|
|
411
|
+
dict goes into the same wrapper the redaction path builds.
|
|
412
|
+
"""
|
|
413
|
+
return _RedactedReadableSpan(
|
|
414
|
+
dropped_attributes=span.dropped_attributes,
|
|
415
|
+
dropped_events=span.dropped_events,
|
|
416
|
+
name=span.name,
|
|
417
|
+
context=span.context,
|
|
418
|
+
parent=span.parent,
|
|
419
|
+
resource=span.resource,
|
|
420
|
+
attributes=attributes,
|
|
421
|
+
events=span.events,
|
|
422
|
+
links=span.links,
|
|
423
|
+
kind=span.kind,
|
|
424
|
+
status=span.status,
|
|
425
|
+
start_time=span.start_time,
|
|
426
|
+
end_time=span.end_time,
|
|
427
|
+
instrumentation_scope=span.instrumentation_scope,
|
|
428
|
+
)
|
|
429
|
+
|
|
430
|
+
|
|
431
|
+
def _trim_span(span: ReadableSpan, tracker: ConversationDeltaTracker) -> ReadableSpan | None:
|
|
432
|
+
"""Return ``span`` with only this call's new messages, or None if unchanged.
|
|
433
|
+
|
|
434
|
+
The span-level form of ``_trim_conversation``, for destinations that encode
|
|
435
|
+
the span rather than building a document from it.
|
|
436
|
+
"""
|
|
437
|
+
attributes = span.attributes
|
|
438
|
+
if not attributes:
|
|
439
|
+
return None
|
|
440
|
+
context = span.get_span_context()
|
|
441
|
+
trimmed = _conversation_attributes(
|
|
442
|
+
attributes,
|
|
443
|
+
trace_id=format(context.trace_id, "032x"), # type: ignore[union-attr] # ctx is set by get_span_context()
|
|
444
|
+
resource=dict(span.resource.attributes) if span.resource else {},
|
|
445
|
+
tracker=tracker,
|
|
446
|
+
)
|
|
447
|
+
if trimmed is None:
|
|
448
|
+
return None
|
|
449
|
+
return _with_attributes(span, trimmed)
|
|
450
|
+
|
|
451
|
+
|
|
375
452
|
class ContentPolicyOTLPSpanExporter(SpanExporter):
|
|
376
453
|
"""Wraps an OTLP SpanExporter, enforcing AGENTIC_PLATFORM_OTEL_CONTENT_CAPTURE.
|
|
377
454
|
|
|
@@ -653,6 +730,7 @@ class PlatformSpanExporter(SpanExporter):
|
|
|
653
730
|
self._sleep = sleep
|
|
654
731
|
self._clock = clock
|
|
655
732
|
self._lock = threading.Lock()
|
|
733
|
+
self._conversations = ConversationDeltaTracker()
|
|
656
734
|
self._dropped_spans = 0
|
|
657
735
|
self._failed_batches = 0
|
|
658
736
|
self._last_error: str | None = None
|
|
@@ -675,7 +753,17 @@ class PlatformSpanExporter(SpanExporter):
|
|
|
675
753
|
dropped_before = self.dropped_spans
|
|
676
754
|
ok = True
|
|
677
755
|
for chunk in self._chunk_by_size(list(spans)):
|
|
678
|
-
|
|
756
|
+
# Stage per chunk and commit only what the OE stored, so a batch it
|
|
757
|
+
# refused does not advance past messages the store never received.
|
|
758
|
+
staged = self._conversations.copy()
|
|
759
|
+
trimmed = [_trim_span(span, staged) or span for span in chunk]
|
|
760
|
+
dropped_before_chunk = self.dropped_spans
|
|
761
|
+
if self._export_chunk(trimmed, deadline):
|
|
762
|
+
# A partial success drops spans without naming them, so the
|
|
763
|
+
# next call restates those messages instead of leaving a gap.
|
|
764
|
+
if self.dropped_spans == dropped_before_chunk:
|
|
765
|
+
self._conversations = staged
|
|
766
|
+
else:
|
|
679
767
|
ok = False
|
|
680
768
|
|
|
681
769
|
if ok:
|
|
@@ -27,6 +27,7 @@ from opentelemetry.sdk.trace import ReadableSpan, Span, SpanProcessor, TracerPro
|
|
|
27
27
|
from opentelemetry.sdk.trace.export import BatchSpanProcessor
|
|
28
28
|
from opentelemetry.trace.propagation.tracecontext import TraceContextTextMapPropagator
|
|
29
29
|
|
|
30
|
+
from .conversation import mark_recorded_by_caller
|
|
30
31
|
from .exporters import (
|
|
31
32
|
ContentPolicyOTLPSpanExporter,
|
|
32
33
|
MongoDBSpanExporter,
|
|
@@ -164,6 +165,8 @@ class ExecutionContextSpanProcessor(SpanProcessor):
|
|
|
164
165
|
get_current_workspace_id,
|
|
165
166
|
)
|
|
166
167
|
|
|
168
|
+
mark_recorded_by_caller(span)
|
|
169
|
+
|
|
167
170
|
session_id = get_current_session_id()
|
|
168
171
|
attrs = {
|
|
169
172
|
"execution.id": get_current_execution_id(),
|
|
@@ -2236,6 +2236,7 @@ class TestAuthoringGuidance:
|
|
|
2236
2236
|
)
|
|
2237
2237
|
assert "# secret grant WEATHER_TOKEN to the tool sandbox under" in text
|
|
2238
2238
|
assert "# sandboxes.tool.secrets (sandboxes requires an agent block)" in text
|
|
2239
|
+
assert "# tools list this connector's tools under sandboxes.tool.tools when" in text
|
|
2239
2240
|
# Guidance is a comment only: the parsed authoring file is unchanged.
|
|
2240
2241
|
assert yaml.safe_load(text) == {
|
|
2241
2242
|
"name": "weather",
|
|
@@ -1585,3 +1585,60 @@ class TestNamedLLMRouting:
|
|
|
1585
1585
|
)
|
|
1586
1586
|
_ = [chunk async for chunk in server._stream_llm_chunks(request)]
|
|
1587
1587
|
assert captured["llm_id"] == "secondary"
|
|
1588
|
+
|
|
1589
|
+
|
|
1590
|
+
class TestCallerRecordedConversation:
|
|
1591
|
+
"""The tool pod does not store a prompt the calling agent already stores."""
|
|
1592
|
+
|
|
1593
|
+
@pytest.mark.asyncio
|
|
1594
|
+
@pytest.mark.parametrize("streaming", [False, True])
|
|
1595
|
+
async def test_the_platform_forwarded_call_marks_its_spans(self, streaming):
|
|
1596
|
+
from agent_engine_runner_shared.tracing.conversation import (
|
|
1597
|
+
ATTR_INPUT_MESSAGES_RECORDED_BY,
|
|
1598
|
+
RECORDED_BY_CALLER,
|
|
1599
|
+
mark_recorded_by_caller,
|
|
1600
|
+
)
|
|
1601
|
+
|
|
1602
|
+
server = _make_tool_server()
|
|
1603
|
+
markers: list[object] = []
|
|
1604
|
+
|
|
1605
|
+
async def provider_stream(*args, **kwargs):
|
|
1606
|
+
# Stands in for the framework instrumentor creating the model span.
|
|
1607
|
+
span = MagicMock()
|
|
1608
|
+
mark_recorded_by_caller(span)
|
|
1609
|
+
markers.append(span.set_attribute.call_args)
|
|
1610
|
+
yield LLMStreamChunk(content="ok")
|
|
1611
|
+
|
|
1612
|
+
request = LLMPodInvokeRequest(
|
|
1613
|
+
execution_id="exec-1",
|
|
1614
|
+
arguments=InvokeLLMRequestArguments(
|
|
1615
|
+
model="gpt-4o",
|
|
1616
|
+
messages=[{"role": "user", "content": "Hi"}],
|
|
1617
|
+
),
|
|
1618
|
+
)
|
|
1619
|
+
with patch.object(
|
|
1620
|
+
server,
|
|
1621
|
+
"_create_llm_for_pod",
|
|
1622
|
+
return_value=SimpleNamespace(astream=provider_stream),
|
|
1623
|
+
):
|
|
1624
|
+
if streaming:
|
|
1625
|
+
_ = [frame async for frame in server._handle_invoke_llm_stream(request)]
|
|
1626
|
+
else:
|
|
1627
|
+
await server._handle_invoke_llm(request)
|
|
1628
|
+
|
|
1629
|
+
assert markers == [
|
|
1630
|
+
((ATTR_INPUT_MESSAGES_RECORDED_BY, RECORDED_BY_CALLER),),
|
|
1631
|
+
]
|
|
1632
|
+
|
|
1633
|
+
@pytest.mark.asyncio
|
|
1634
|
+
async def test_a_direct_tool_llm_call_is_not_marked(self):
|
|
1635
|
+
from agent_engine_runner_shared.tracing.conversation import (
|
|
1636
|
+
mark_recorded_by_caller,
|
|
1637
|
+
)
|
|
1638
|
+
|
|
1639
|
+
# No platform route wrapped this call: the tool pod is the only
|
|
1640
|
+
# recorder, so it keeps the conversation.
|
|
1641
|
+
span = MagicMock()
|
|
1642
|
+
mark_recorded_by_caller(span)
|
|
1643
|
+
|
|
1644
|
+
span.set_attribute.assert_not_called()
|