agent-engine-runner-shared 0.11.12__tar.gz → 0.11.14__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.
Files changed (259) hide show
  1. {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.14}/CHANGELOG.md +6 -0
  2. {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.14}/Dockerfile +1 -1
  3. {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.14}/PKG-INFO +3 -3
  4. {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.14}/pyproject.toml +3 -3
  5. {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.14}/src/agent_engine_runner_shared/connectors/generate/authoring.py +8 -6
  6. {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.14}/src/agent_engine_runner_shared/server/tool.py +31 -23
  7. {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.14}/src/agent_engine_runner_shared/tracing/conversation.py +59 -0
  8. {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.14}/src/agent_engine_runner_shared/tracing/exporters.py +93 -5
  9. {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.14}/src/agent_engine_runner_shared/tracing/setup.py +29 -19
  10. {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.14}/tests/unit/connectors/test_generate.py +1 -0
  11. {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.14}/tests/unit/test_llm_routing.py +57 -0
  12. agent_engine_runner_shared-0.11.14/tests/unit/test_platform_trace_payload_parity.py +124 -0
  13. {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.14}/tests/unit/test_platform_tracing_exporter.py +256 -21
  14. {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.14}/tests/unit/test_trace_conversation.py +68 -0
  15. {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.14}/tests/unit/test_tracing_exporter.py +41 -0
  16. {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.14}/LICENSE +0 -0
  17. {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.14}/Makefile +0 -0
  18. {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.14}/README.md +0 -0
  19. {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.14}/docs/api.md +0 -0
  20. {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.14}/pydoc-markdown.yml +0 -0
  21. {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.14}/pyrightconfig.json +0 -0
  22. {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.14}/scripts/agentic-vendored-wheel-check.sh +0 -0
  23. {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.14}/src/agent_engine_runner_shared/__init__.py +0 -0
  24. {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.14}/src/agent_engine_runner_shared/__main__.py +0 -0
  25. {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.14}/src/agent_engine_runner_shared/a2a.py +0 -0
  26. {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.14}/src/agent_engine_runner_shared/a2a_auth.py +0 -0
  27. {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.14}/src/agent_engine_runner_shared/agent_config.py +0 -0
  28. {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.14}/src/agent_engine_runner_shared/async_utils.py +0 -0
  29. {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.14}/src/agent_engine_runner_shared/caller_trace.py +0 -0
  30. {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.14}/src/agent_engine_runner_shared/checkpoint_workspace.py +0 -0
  31. {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.14}/src/agent_engine_runner_shared/connectors/README.md +0 -0
  32. {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.14}/src/agent_engine_runner_shared/connectors/__init__.py +0 -0
  33. {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.14}/src/agent_engine_runner_shared/connectors/bundle.py +0 -0
  34. {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.14}/src/agent_engine_runner_shared/connectors/create_tool.py +0 -0
  35. {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.14}/src/agent_engine_runner_shared/connectors/definitions.py +0 -0
  36. {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.14}/src/agent_engine_runner_shared/connectors/executor.py +0 -0
  37. {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.14}/src/agent_engine_runner_shared/connectors/generate/README.md +0 -0
  38. {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.14}/src/agent_engine_runner_shared/connectors/generate/__init__.py +0 -0
  39. {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.14}/src/agent_engine_runner_shared/connectors/generate/catalog.py +0 -0
  40. {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.14}/src/agent_engine_runner_shared/connectors/generate/modes.py +0 -0
  41. {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.14}/src/agent_engine_runner_shared/connectors/generate/naming.py +0 -0
  42. {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.14}/src/agent_engine_runner_shared/connectors/generate/parameters.py +0 -0
  43. {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.14}/src/agent_engine_runner_shared/connectors/generate/security.py +0 -0
  44. {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.14}/src/agent_engine_runner_shared/connectors/generate/spec.py +0 -0
  45. {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.14}/src/agent_engine_runner_shared/connectors/materialize.py +0 -0
  46. {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.14}/src/agent_engine_runner_shared/connectors/runtime.py +0 -0
  47. {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.14}/src/agent_engine_runner_shared/context.py +0 -0
  48. {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.14}/src/agent_engine_runner_shared/custom_events.py +0 -0
  49. {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.14}/src/agent_engine_runner_shared/db_config.py +0 -0
  50. {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.14}/src/agent_engine_runner_shared/db_naming.py +0 -0
  51. {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.14}/src/agent_engine_runner_shared/error_reporting.py +0 -0
  52. {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.14}/src/agent_engine_runner_shared/execution.py +0 -0
  53. {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.14}/src/agent_engine_runner_shared/generated/__init__.py +0 -0
  54. {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.14}/src/agent_engine_runner_shared/generated/workflow/__init__.py +0 -0
  55. {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.14}/src/agent_engine_runner_shared/generated/workflow/v1/__init__.py +0 -0
  56. {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.14}/src/agent_engine_runner_shared/generated/workflow/v1/activity_pb2.py +0 -0
  57. {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.14}/src/agent_engine_runner_shared/generated/workflow/v1/activity_pb2.pyi +0 -0
  58. {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.14}/src/agent_engine_runner_shared/generated/workflow/v1/common_pb2.py +0 -0
  59. {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.14}/src/agent_engine_runner_shared/generated/workflow/v1/common_pb2.pyi +0 -0
  60. {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.14}/src/agent_engine_runner_shared/generated/workflow/v1/runtime_pb2.py +0 -0
  61. {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.14}/src/agent_engine_runner_shared/generated/workflow/v1/runtime_pb2.pyi +0 -0
  62. {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.14}/src/agent_engine_runner_shared/generated/workflow/v1/state_pb2.py +0 -0
  63. {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.14}/src/agent_engine_runner_shared/generated/workflow/v1/state_pb2.pyi +0 -0
  64. {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.14}/src/agent_engine_runner_shared/guardrails_evaluator/__init__.py +0 -0
  65. {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.14}/src/agent_engine_runner_shared/guardrails_evaluator/core.py +0 -0
  66. {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.14}/src/agent_engine_runner_shared/guardrails_evaluator/regex.py +0 -0
  67. {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.14}/src/agent_engine_runner_shared/hooks.py +0 -0
  68. {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.14}/src/agent_engine_runner_shared/http_path.py +0 -0
  69. {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.14}/src/agent_engine_runner_shared/launcher.py +0 -0
  70. {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.14}/src/agent_engine_runner_shared/mcp_oauth.py +0 -0
  71. {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.14}/src/agent_engine_runner_shared/mcp_oauth_cache_lock.py +0 -0
  72. {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.14}/src/agent_engine_runner_shared/mcp_oauth_cache_name.py +0 -0
  73. {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.14}/src/agent_engine_runner_shared/mcp_oauth_cli.py +0 -0
  74. {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.14}/src/agent_engine_runner_shared/mcp_oauth_secret.py +0 -0
  75. {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.14}/src/agent_engine_runner_shared/mcp_tools.py +0 -0
  76. {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.14}/src/agent_engine_runner_shared/memory.py +0 -0
  77. {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.14}/src/agent_engine_runner_shared/memory_appbound.py +0 -0
  78. {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.14}/src/agent_engine_runner_shared/metrics.py +0 -0
  79. {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.14}/src/agent_engine_runner_shared/models.py +0 -0
  80. {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.14}/src/agent_engine_runner_shared/node_logger.py +0 -0
  81. {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.14}/src/agent_engine_runner_shared/owner_callback.py +0 -0
  82. {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.14}/src/agent_engine_runner_shared/progress.py +0 -0
  83. {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.14}/src/agent_engine_runner_shared/py.typed +0 -0
  84. {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.14}/src/agent_engine_runner_shared/runtime.py +0 -0
  85. {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.14}/src/agent_engine_runner_shared/secure_llm_proxy.py +0 -0
  86. {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.14}/src/agent_engine_runner_shared/secure_wrapper.py +0 -0
  87. {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.14}/src/agent_engine_runner_shared/server/__init__.py +0 -0
  88. {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.14}/src/agent_engine_runner_shared/server/aer.py +0 -0
  89. {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.14}/src/agent_engine_runner_shared/server/atlas_dns.py +0 -0
  90. {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.14}/src/agent_engine_runner_shared/server/auth.py +0 -0
  91. {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.14}/src/agent_engine_runner_shared/server/base.py +0 -0
  92. {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.14}/src/agent_engine_runner_shared/server/call_interrupt.py +0 -0
  93. {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.14}/src/agent_engine_runner_shared/server/callback_delivery.py +0 -0
  94. {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.14}/src/agent_engine_runner_shared/server/chunk_types.py +0 -0
  95. {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.14}/src/agent_engine_runner_shared/server/cors.py +0 -0
  96. {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.14}/src/agent_engine_runner_shared/server/drain.py +0 -0
  97. {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.14}/src/agent_engine_runner_shared/server/graph_warm.py +0 -0
  98. {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.14}/src/agent_engine_runner_shared/server/http_retry.py +0 -0
  99. {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.14}/src/agent_engine_runner_shared/server/metadata.py +0 -0
  100. {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.14}/src/agent_engine_runner_shared/server/oe_url.py +0 -0
  101. {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.14}/src/agent_engine_runner_shared/server/owner_url.py +0 -0
  102. {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.14}/src/agent_engine_runner_shared/server/query.py +0 -0
  103. {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.14}/src/agent_engine_runner_shared/span_kinds.py +0 -0
  104. {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.14}/src/agent_engine_runner_shared/span_names.py +0 -0
  105. {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.14}/src/agent_engine_runner_shared/startup_state.py +0 -0
  106. {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.14}/src/agent_engine_runner_shared/structured_logging.py +0 -0
  107. {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.14}/src/agent_engine_runner_shared/tls_client.py +0 -0
  108. {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.14}/src/agent_engine_runner_shared/tool_api_error.py +0 -0
  109. {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.14}/src/agent_engine_runner_shared/tool_memory_ownership.py +0 -0
  110. {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.14}/src/agent_engine_runner_shared/toolpod_handlers.py +0 -0
  111. {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.14}/src/agent_engine_runner_shared/tracing/__init__.py +0 -0
  112. {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.14}/src/agent_engine_runner_shared/types.py +0 -0
  113. {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.14}/src/agent_engine_runner_shared/utils.py +0 -0
  114. {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.14}/src/agent_engine_runner_shared/workflow/__init__.py +0 -0
  115. {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.14}/src/agent_engine_runner_shared/workflow/activity.py +0 -0
  116. {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.14}/src/agent_engine_runner_shared/workflow/attempt.py +0 -0
  117. {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.14}/src/agent_engine_runner_shared/workflow/cancelled_history.py +0 -0
  118. {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.14}/src/agent_engine_runner_shared/workflow/client.py +0 -0
  119. {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.14}/src/agent_engine_runner_shared/workflow/context.py +0 -0
  120. {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.14}/src/agent_engine_runner_shared/workflow/heartbeat.py +0 -0
  121. {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.14}/src/agent_engine_runner_shared/workflow/memory.py +0 -0
  122. {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.14}/src/agent_engine_runner_shared/workflow/protojson.py +0 -0
  123. {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.14}/src/agent_engine_runner_shared/workflow/settlement.py +0 -0
  124. {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.14}/tests/__init__.py +0 -0
  125. {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.14}/tests/conftest.py +0 -0
  126. {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.14}/tests/corpus/.gitignore +0 -0
  127. {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.14}/tests/corpus/README.md +0 -0
  128. {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.14}/tests/corpus/__init__.py +0 -0
  129. {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.14}/tests/corpus/fetch_corpus.py +0 -0
  130. {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.14}/tests/corpus/manifest.json +0 -0
  131. {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.14}/tests/corpus/test_api_corpus.py +0 -0
  132. {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.14}/tests/integration/__init__.py +0 -0
  133. {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.14}/tests/integration/mock_embedder.py +0 -0
  134. {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.14}/tests/integration/test_a2a_trace_propagation.py +0 -0
  135. {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.14}/tests/integration/test_runtime.py +0 -0
  136. {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.14}/tests/integration/test_secure_async.py +0 -0
  137. {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.14}/tests/integration/test_secure_sync.py +0 -0
  138. {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.14}/tests/integration/test_tracing_otlp_wire_format.py +0 -0
  139. {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.14}/tests/pact/conftest.py +0 -0
  140. {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.14}/tests/pact/test_oe_provider_verification.py +0 -0
  141. {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.14}/tests/unit/__init__.py +0 -0
  142. {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.14}/tests/unit/connectors/__init__.py +0 -0
  143. {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.14}/tests/unit/connectors/fixtures/auth_cases.yaml +0 -0
  144. {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.14}/tests/unit/connectors/fixtures/jira.tool_defs.yaml +0 -0
  145. {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.14}/tests/unit/connectors/test_auth.py +0 -0
  146. {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.14}/tests/unit/connectors/test_bundle.py +0 -0
  147. {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.14}/tests/unit/connectors/test_core.py +0 -0
  148. {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.14}/tests/unit/connectors/test_create_tool.py +0 -0
  149. {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.14}/tests/unit/connectors/test_materialize.py +0 -0
  150. {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.14}/tests/unit/test_a2a.py +0 -0
  151. {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.14}/tests/unit/test_a2a_auth.py +0 -0
  152. {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.14}/tests/unit/test_aer_a2a_registration.py +0 -0
  153. {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.14}/tests/unit/test_aer_build_agent_span.py +0 -0
  154. {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.14}/tests/unit/test_aer_cancelled_turn.py +0 -0
  155. {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.14}/tests/unit/test_aer_capability_advertise.py +0 -0
  156. {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.14}/tests/unit/test_aer_chunk_delivery_reliability.py +0 -0
  157. {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.14}/tests/unit/test_aer_chunk_emission.py +0 -0
  158. {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.14}/tests/unit/test_aer_durable_attempt.py +0 -0
  159. {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.14}/tests/unit/test_aer_llm_invocation_signal.py +0 -0
  160. {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.14}/tests/unit/test_aer_metadata_payload.py +0 -0
  161. {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.14}/tests/unit/test_aer_policy_denied.py +0 -0
  162. {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.14}/tests/unit/test_aer_session_finish.py +0 -0
  163. {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.14}/tests/unit/test_aer_timeout_signal.py +0 -0
  164. {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.14}/tests/unit/test_aer_trace_context.py +0 -0
  165. {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.14}/tests/unit/test_aer_workspace_scope.py +0 -0
  166. {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.14}/tests/unit/test_agent_config.py +0 -0
  167. {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.14}/tests/unit/test_async_utils.py +0 -0
  168. {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.14}/tests/unit/test_atlas_dns.py +0 -0
  169. {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.14}/tests/unit/test_call_interrupt.py +0 -0
  170. {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.14}/tests/unit/test_call_interrupt_contract.py +0 -0
  171. {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.14}/tests/unit/test_checkpoint_workspace.py +0 -0
  172. {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.14}/tests/unit/test_cors.py +0 -0
  173. {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.14}/tests/unit/test_create_memory_client_headers.py +0 -0
  174. {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.14}/tests/unit/test_custom_headers_context.py +0 -0
  175. {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.14}/tests/unit/test_custom_headers_models.py +0 -0
  176. {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.14}/tests/unit/test_db_naming.py +0 -0
  177. {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.14}/tests/unit/test_debug_hook.py +0 -0
  178. {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.14}/tests/unit/test_drain.py +0 -0
  179. {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.14}/tests/unit/test_drain_contract.py +0 -0
  180. {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.14}/tests/unit/test_durable_guardrail_review.py +0 -0
  181. {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.14}/tests/unit/test_durable_oauth.py +0 -0
  182. {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.14}/tests/unit/test_durable_proxies.py +0 -0
  183. {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.14}/tests/unit/test_emit_custom_event.py +0 -0
  184. {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.14}/tests/unit/test_emit_progress.py +0 -0
  185. {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.14}/tests/unit/test_error_reporting.py +0 -0
  186. {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.14}/tests/unit/test_execution.py +0 -0
  187. {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.14}/tests/unit/test_extract_turn_messages.py +0 -0
  188. {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.14}/tests/unit/test_format_llm_error.py +0 -0
  189. {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.14}/tests/unit/test_graph_warm.py +0 -0
  190. {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.14}/tests/unit/test_guardrails_protocol.py +0 -0
  191. {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.14}/tests/unit/test_hitl_interrupt.py +0 -0
  192. {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.14}/tests/unit/test_hooks.py +0 -0
  193. {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.14}/tests/unit/test_http_path.py +0 -0
  194. {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.14}/tests/unit/test_http_retry.py +0 -0
  195. {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.14}/tests/unit/test_launcher.py +0 -0
  196. {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.14}/tests/unit/test_launcher_reports.py +0 -0
  197. {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.14}/tests/unit/test_listen_host.py +0 -0
  198. {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.14}/tests/unit/test_llm_credential_classification.py +0 -0
  199. {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.14}/tests/unit/test_mcp_era_compat.py +0 -0
  200. {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.14}/tests/unit/test_mcp_oauth.py +0 -0
  201. {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.14}/tests/unit/test_mcp_oauth_cli.py +0 -0
  202. {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.14}/tests/unit/test_mcp_oauth_secret.py +0 -0
  203. {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.14}/tests/unit/test_mcp_tools.py +0 -0
  204. {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.14}/tests/unit/test_memory_appbound.py +0 -0
  205. {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.14}/tests/unit/test_memory_search_metadata.py +0 -0
  206. {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.14}/tests/unit/test_memory_writer_context.py +0 -0
  207. {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.14}/tests/unit/test_metadata.py +0 -0
  208. {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.14}/tests/unit/test_metrics.py +0 -0
  209. {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.14}/tests/unit/test_models.py +0 -0
  210. {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.14}/tests/unit/test_no_lc_imports.py +0 -0
  211. {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.14}/tests/unit/test_node_logger.py +0 -0
  212. {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.14}/tests/unit/test_oe_url.py +0 -0
  213. {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.14}/tests/unit/test_owner_callback.py +0 -0
  214. {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.14}/tests/unit/test_owner_url.py +0 -0
  215. {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.14}/tests/unit/test_payload_context.py +0 -0
  216. {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.14}/tests/unit/test_query_routes.py +0 -0
  217. {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.14}/tests/unit/test_request_id_context.py +0 -0
  218. {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.14}/tests/unit/test_resume_payload.py +0 -0
  219. {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.14}/tests/unit/test_runtime_build_context_from_sources.py +0 -0
  220. {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.14}/tests/unit/test_runtime_checkpoint_workspace.py +0 -0
  221. {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.14}/tests/unit/test_runtime_custom_memory.py +0 -0
  222. {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.14}/tests/unit/test_runtime_memory_context.py +0 -0
  223. {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.14}/tests/unit/test_runtime_models.py +0 -0
  224. {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.14}/tests/unit/test_runtime_register_tool.py +0 -0
  225. {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.14}/tests/unit/test_secure_llm_proxy.py +0 -0
  226. {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.14}/tests/unit/test_secure_wrapper.py +0 -0
  227. {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.14}/tests/unit/test_server_auth.py +0 -0
  228. {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.14}/tests/unit/test_server_health.py +0 -0
  229. {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.14}/tests/unit/test_server_shutdown.py +0 -0
  230. {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.14}/tests/unit/test_server_startup_failures.py +0 -0
  231. {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.14}/tests/unit/test_session_filesystem_isolation.py +0 -0
  232. {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.14}/tests/unit/test_session_finish_context.py +0 -0
  233. {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.14}/tests/unit/test_shared_client.py +0 -0
  234. {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.14}/tests/unit/test_structured_logging.py +0 -0
  235. {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.14}/tests/unit/test_thinking_tokens.py +0 -0
  236. {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.14}/tests/unit/test_tls_client.py +0 -0
  237. {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.14}/tests/unit/test_tls_client_integration.py +0 -0
  238. {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.14}/tests/unit/test_token_capture.py +0 -0
  239. {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.14}/tests/unit/test_tool.py +0 -0
  240. {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.14}/tests/unit/test_tool_api_error.py +0 -0
  241. {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.14}/tests/unit/test_tool_authorization.py +0 -0
  242. {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.14}/tests/unit/test_tool_cancellation_boundary.py +0 -0
  243. {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.14}/tests/unit/test_tool_deserialization.py +0 -0
  244. {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.14}/tests/unit/test_tool_log_redaction.py +0 -0
  245. {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.14}/tests/unit/test_tool_memory_ownership.py +0 -0
  246. {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.14}/tests/unit/test_tool_server_startup.py +0 -0
  247. {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.14}/tests/unit/test_tool_trace_context.py +0 -0
  248. {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.14}/tests/unit/test_toolpod_handlers.py +0 -0
  249. {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.14}/tests/unit/test_tracing_retry.py +0 -0
  250. {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.14}/tests/unit/workflow/test_activity.py +0 -0
  251. {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.14}/tests/unit/workflow/test_attempt.py +0 -0
  252. {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.14}/tests/unit/workflow/test_cancelled_history.py +0 -0
  253. {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.14}/tests/unit/workflow/test_client.py +0 -0
  254. {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.14}/tests/unit/workflow/test_context.py +0 -0
  255. {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.14}/tests/unit/workflow/test_heartbeat.py +0 -0
  256. {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.14}/tests/unit/workflow/test_memory.py +0 -0
  257. {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.14}/tests/unit/workflow/test_protojson.py +0 -0
  258. {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.14}/tests/unit/workflow/test_protojson_helpers.py +0 -0
  259. {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.14}/tests/unit/workflow/test_settlement.py +0 -0
@@ -8,6 +8,12 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
8
8
  ## [Unreleased]
9
9
 
10
10
  ### Changed
11
+ - Spans go to the platform trace endpoint (`POST /internal/traces`) by default
12
+ whenever `OE_URL` is set, so the OE can redact PII in them. `AGENTIC_TRACE_EXPORTER`
13
+ no longer needs to be `1`; set it to `0` or `false` to keep the direct MongoDB
14
+ path, which stores spans without redaction. `0.11.14` is the Python floor
15
+ for span redaction. Earlier releases write spans straight to MongoDB unless
16
+ `AGENTIC_TRACE_EXPORTER=1`, and the platform cannot detect this.
11
17
  - **Breaking:** the connector `tool.yaml` `auth` block no longer takes `type`.
12
18
  It names exactly one credential: `bearer: <secret>`, `basic: {username,
13
19
  password}`, `api_keys: [{env, location, name, prefix}]`, or
@@ -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-202610292259-5f96580@sha256:25c595ee77900889cc75ece11461542ab2b7251d3d0febf1b107b225ac7cac03
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.12
3
+ Version: 0.11.14
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.12
9
- Requires-Dist: agent-engine-sdk==0.11.12
8
+ Requires-Dist: agent-engine-sdk-memory==0.11.14
9
+ Requires-Dist: agent-engine-sdk==0.11.14
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.12"
3
+ version = "0.11.14"
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.12",
30
+ "agent-engine-sdk==0.11.14",
31
31
  # Memory models and the MemoryClient HTTP client
32
- "agent-engine-sdk-memory==0.11.12",
32
+ "agent-engine-sdk-memory==0.11.14",
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
- Platform policy stays explicit and developer-owned: nothing here writes or
273
- derives agent.yaml. The egress hint is a command so it adapts to whichever
274
- egress shape the manifest already uses, and every interpolated value passes
275
- the generator's control-byte sanitizer so no value can escape the comment.
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; this file enables no",
282
- "# platform policy. Declare the connector's requirements in agent.yaml:",
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
- # Usually a no-op after startup; keep any registry load inside the
1176
- # request's credential isolation, as with model execution below.
1177
- async with self._credential_isolation():
1178
- await self._ensure_llm_registry_loaded()
1179
- chunks = [chunk async for chunk in self._stream_llm_chunks(request)]
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
- # See the gate + metadata-env ordering rationale in
1281
- # _handle_invoke_llm above.
1282
- async with self._credential_isolation():
1283
- await self._ensure_llm_registry_loaded()
1284
- async for stream_chunk in self._stream_llm_chunks(request):
1285
- if not _stream_chunk_has_payload(stream_chunk):
1286
- if stream_chunk.usage is not None:
1287
- usage = stream_chunk.usage
1288
- continue
1289
- chunk_event = LLMPodStreamEvent(
1290
- content=stream_chunk.content,
1291
- tool_call_chunks=stream_chunk.tool_calls,
1292
- id=stream_chunk.id,
1293
- name=stream_chunk.name,
1294
- response_metadata=stream_chunk.response_metadata,
1295
- additional_kwargs=stream_chunk.additional_kwargs,
1296
- )
1297
- yield f"data: {chunk_event.model_dump_json(exclude_none=True)}\n\n"
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 or not has_input_messages(attributes):
144
+ if not attributes:
116
145
  return doc
117
- doc["attributes"] = tracker.trim(
146
+ trimmed = _conversation_attributes(
118
147
  attributes,
119
148
  trace_id=doc["trace_id"],
120
- stream_id=trace_stream(doc.get("resource") or {}),
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
- if not self._export_chunk(chunk, deadline):
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,
@@ -62,16 +63,17 @@ _retry_thread: Optional[threading.Thread] = None
62
63
  # clients.
63
64
  _tracing_mongo_client: Optional["MongoClient"] = None
64
65
 
65
- # Platform trace-exporter state. The exporter is off by default and enabled
66
- # per workspace with the flag named by `_PLATFORM_TRACE_EXPORTER_ENV`; when on
67
- # (and OE_URL is set) the guest sends spans to the OE instead of writing
68
- # MongoDB directly. `_platform_exporter` is retained so /health can report its
69
- # recent export results and shutdown can reset it.
66
+ # Platform trace-exporter state. The exporter is on whenever OE_URL is set; the
67
+ # flag named by `_PLATFORM_TRACE_EXPORTER_ENV` only turns it off. When on, the
68
+ # guest sends spans to the OE instead of writing MongoDB directly.
69
+ # `_platform_exporter` is retained so /health can report its recent export
70
+ # results and shutdown can reset it.
70
71
  _platform_exporter: Optional[PlatformSpanExporter] = None
71
72
  _platform_exporter_attached: bool = False
72
73
 
73
- # Feature flag: route runner spans to the OE platform trace endpoint. Off by
74
- # default, so an unset value keeps the MongoDB trace-store path. Deliberately
74
+ # Opt-out for routing runner spans to the OE platform trace endpoint. Unset
75
+ # means on. Setting it to "0" or "false" keeps the MongoDB trace-store path: the
76
+ # OE never sees those spans, so PII redaction cannot apply to them. Deliberately
75
77
  # avoids the reserved tenant-secret prefix, which a workspace secret cannot use
76
78
  # (pkg/tenantsecrets), so a workspace can set this one directly.
77
79
  _PLATFORM_TRACE_EXPORTER_ENV = "AGENTIC_TRACE_EXPORTER"
@@ -145,13 +147,12 @@ def _otlp_endpoint_configured() -> bool:
145
147
  def platform_trace_exporter_enabled() -> bool:
146
148
  """Whether the OE platform trace exporter is enabled.
147
149
 
148
- Off by default: the flag gates the rollout, so an unset (or unrecognized)
149
- value keeps the MongoDB trace-store path. A workspace enables it by setting
150
- the env var named by ``_PLATFORM_TRACE_EXPORTER_ENV`` to ``1`` or ``true``.
151
- It is only half the condition — the exporter also needs ``OE_URL`` to know
152
- where to send spans.
150
+ On unless the env var named by ``_PLATFORM_TRACE_EXPORTER_ENV`` is ``0`` or
151
+ ``false``. Any other value, including an unrecognized one, keeps it on so a
152
+ typo cannot silently route spans past the OE. It is only half the
153
+ condition — the exporter also needs ``OE_URL`` to know where to send spans.
153
154
  """
154
- return os.getenv(_PLATFORM_TRACE_EXPORTER_ENV, "").strip().lower() in ("1", "true")
155
+ return os.getenv(_PLATFORM_TRACE_EXPORTER_ENV, "").strip().lower() not in ("0", "false")
155
156
 
156
157
 
157
158
  class ExecutionContextSpanProcessor(SpanProcessor):
@@ -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(),
@@ -234,13 +237,20 @@ def setup_tracing(
234
237
 
235
238
  provider.add_span_processor(ExecutionContextSpanProcessor())
236
239
 
237
- # Destination: the OE platform trace endpoint when the feature flag is on
238
- # and OE_URL is set, otherwise the caller-supplied MongoDB collection. With
239
- # the flag on the OE is the platform trace path and takes precedence — a
240
- # guest with both must not keep writing MongoDB directly.
240
+ # Destination: the OE platform trace endpoint whenever OE_URL is set,
241
+ # otherwise the caller-supplied MongoDB collection. The OE is the platform
242
+ # trace path and takes precedence — a guest with both must not keep writing
243
+ # MongoDB directly.
241
244
  oe_url = os.getenv("OE_URL", "").strip()
242
245
  otlp_configured = _otlp_endpoint_configured()
243
- if oe_url and platform_trace_exporter_enabled():
246
+ use_platform = bool(oe_url) and platform_trace_exporter_enabled()
247
+ if oe_url and not use_platform:
248
+ logger.warning(
249
+ "Tracing: %s disables the platform trace exporter; spans go to the "
250
+ "trace store without PII redaction",
251
+ _PLATFORM_TRACE_EXPORTER_ENV,
252
+ )
253
+ if use_platform:
244
254
  _attach_platform_exporter(provider, oe_url)
245
255
  elif mongodb_collection is not None:
246
256
  provider.add_span_processor(BatchSpanProcessor(MongoDBSpanExporter(mongodb_collection)))
@@ -396,7 +406,7 @@ def tracing_status() -> dict[str, str]:
396
406
 
397
407
  ``platform_exporter`` is ``attached`` (spans are sent to the OE),
398
408
  ``degraded`` (the most recent export did not fully succeed), or
399
- ``disabled`` (the feature flag is off or OE_URL unset; OTLP may still be
409
+ ``disabled`` (the opt-out is set or OE_URL unset; OTLP may still be
400
410
  configured).
401
411
  """
402
412
  if _platform_exporter_attached:
@@ -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()