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.
Files changed (258) hide show
  1. {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.13}/Dockerfile +1 -1
  2. {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.13}/PKG-INFO +3 -3
  3. {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.13}/pyproject.toml +3 -3
  4. {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
  5. {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.13}/src/agent_engine_runner_shared/server/tool.py +31 -23
  6. {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.13}/src/agent_engine_runner_shared/tracing/conversation.py +59 -0
  7. {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.13}/src/agent_engine_runner_shared/tracing/exporters.py +93 -5
  8. {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.13}/src/agent_engine_runner_shared/tracing/setup.py +3 -0
  9. {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.13}/tests/unit/connectors/test_generate.py +1 -0
  10. {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.13}/tests/unit/test_llm_routing.py +57 -0
  11. {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.13}/tests/unit/test_platform_tracing_exporter.py +188 -0
  12. {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.13}/tests/unit/test_trace_conversation.py +68 -0
  13. {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.13}/tests/unit/test_tracing_exporter.py +41 -0
  14. {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.13}/CHANGELOG.md +0 -0
  15. {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.13}/LICENSE +0 -0
  16. {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.13}/Makefile +0 -0
  17. {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.13}/README.md +0 -0
  18. {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.13}/docs/api.md +0 -0
  19. {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.13}/pydoc-markdown.yml +0 -0
  20. {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.13}/pyrightconfig.json +0 -0
  21. {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.13}/scripts/agentic-vendored-wheel-check.sh +0 -0
  22. {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.13}/src/agent_engine_runner_shared/__init__.py +0 -0
  23. {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.13}/src/agent_engine_runner_shared/__main__.py +0 -0
  24. {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.13}/src/agent_engine_runner_shared/a2a.py +0 -0
  25. {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.13}/src/agent_engine_runner_shared/a2a_auth.py +0 -0
  26. {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.13}/src/agent_engine_runner_shared/agent_config.py +0 -0
  27. {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.13}/src/agent_engine_runner_shared/async_utils.py +0 -0
  28. {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.13}/src/agent_engine_runner_shared/caller_trace.py +0 -0
  29. {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.13}/src/agent_engine_runner_shared/checkpoint_workspace.py +0 -0
  30. {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.13}/src/agent_engine_runner_shared/connectors/README.md +0 -0
  31. {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.13}/src/agent_engine_runner_shared/connectors/__init__.py +0 -0
  32. {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.13}/src/agent_engine_runner_shared/connectors/bundle.py +0 -0
  33. {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
  34. {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.13}/src/agent_engine_runner_shared/connectors/definitions.py +0 -0
  35. {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.13}/src/agent_engine_runner_shared/connectors/executor.py +0 -0
  36. {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
  37. {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
  38. {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
  39. {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
  40. {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
  41. {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
  42. {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
  43. {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
  44. {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.13}/src/agent_engine_runner_shared/connectors/materialize.py +0 -0
  45. {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.13}/src/agent_engine_runner_shared/connectors/runtime.py +0 -0
  46. {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.13}/src/agent_engine_runner_shared/context.py +0 -0
  47. {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.13}/src/agent_engine_runner_shared/custom_events.py +0 -0
  48. {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.13}/src/agent_engine_runner_shared/db_config.py +0 -0
  49. {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.13}/src/agent_engine_runner_shared/db_naming.py +0 -0
  50. {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.13}/src/agent_engine_runner_shared/error_reporting.py +0 -0
  51. {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.13}/src/agent_engine_runner_shared/execution.py +0 -0
  52. {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.13}/src/agent_engine_runner_shared/generated/__init__.py +0 -0
  53. {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
  54. {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
  55. {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
  56. {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
  57. {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
  58. {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
  59. {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
  60. {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
  61. {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
  62. {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
  63. {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
  64. {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
  65. {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
  66. {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.13}/src/agent_engine_runner_shared/hooks.py +0 -0
  67. {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.13}/src/agent_engine_runner_shared/http_path.py +0 -0
  68. {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.13}/src/agent_engine_runner_shared/launcher.py +0 -0
  69. {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.13}/src/agent_engine_runner_shared/mcp_oauth.py +0 -0
  70. {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
  71. {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
  72. {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
  73. {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
  74. {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.13}/src/agent_engine_runner_shared/mcp_tools.py +0 -0
  75. {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.13}/src/agent_engine_runner_shared/memory.py +0 -0
  76. {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.13}/src/agent_engine_runner_shared/memory_appbound.py +0 -0
  77. {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.13}/src/agent_engine_runner_shared/metrics.py +0 -0
  78. {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.13}/src/agent_engine_runner_shared/models.py +0 -0
  79. {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.13}/src/agent_engine_runner_shared/node_logger.py +0 -0
  80. {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.13}/src/agent_engine_runner_shared/owner_callback.py +0 -0
  81. {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.13}/src/agent_engine_runner_shared/progress.py +0 -0
  82. {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.13}/src/agent_engine_runner_shared/py.typed +0 -0
  83. {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.13}/src/agent_engine_runner_shared/runtime.py +0 -0
  84. {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
  85. {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.13}/src/agent_engine_runner_shared/secure_wrapper.py +0 -0
  86. {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.13}/src/agent_engine_runner_shared/server/__init__.py +0 -0
  87. {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.13}/src/agent_engine_runner_shared/server/aer.py +0 -0
  88. {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
  89. {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.13}/src/agent_engine_runner_shared/server/auth.py +0 -0
  90. {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.13}/src/agent_engine_runner_shared/server/base.py +0 -0
  91. {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
  92. {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
  93. {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
  94. {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.13}/src/agent_engine_runner_shared/server/cors.py +0 -0
  95. {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.13}/src/agent_engine_runner_shared/server/drain.py +0 -0
  96. {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
  97. {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
  98. {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.13}/src/agent_engine_runner_shared/server/metadata.py +0 -0
  99. {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
  100. {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
  101. {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.13}/src/agent_engine_runner_shared/server/query.py +0 -0
  102. {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.13}/src/agent_engine_runner_shared/span_kinds.py +0 -0
  103. {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.13}/src/agent_engine_runner_shared/span_names.py +0 -0
  104. {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.13}/src/agent_engine_runner_shared/startup_state.py +0 -0
  105. {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.13}/src/agent_engine_runner_shared/structured_logging.py +0 -0
  106. {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.13}/src/agent_engine_runner_shared/tls_client.py +0 -0
  107. {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
  108. {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
  109. {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.13}/src/agent_engine_runner_shared/toolpod_handlers.py +0 -0
  110. {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.13}/src/agent_engine_runner_shared/tracing/__init__.py +0 -0
  111. {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.13}/src/agent_engine_runner_shared/types.py +0 -0
  112. {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.13}/src/agent_engine_runner_shared/utils.py +0 -0
  113. {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.13}/src/agent_engine_runner_shared/workflow/__init__.py +0 -0
  114. {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.13}/src/agent_engine_runner_shared/workflow/activity.py +0 -0
  115. {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.13}/src/agent_engine_runner_shared/workflow/attempt.py +0 -0
  116. {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
  117. {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.13}/src/agent_engine_runner_shared/workflow/client.py +0 -0
  118. {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.13}/src/agent_engine_runner_shared/workflow/context.py +0 -0
  119. {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.13}/src/agent_engine_runner_shared/workflow/heartbeat.py +0 -0
  120. {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.13}/src/agent_engine_runner_shared/workflow/memory.py +0 -0
  121. {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.13}/src/agent_engine_runner_shared/workflow/protojson.py +0 -0
  122. {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.13}/src/agent_engine_runner_shared/workflow/settlement.py +0 -0
  123. {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.13}/tests/__init__.py +0 -0
  124. {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.13}/tests/conftest.py +0 -0
  125. {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.13}/tests/corpus/.gitignore +0 -0
  126. {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.13}/tests/corpus/README.md +0 -0
  127. {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.13}/tests/corpus/__init__.py +0 -0
  128. {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.13}/tests/corpus/fetch_corpus.py +0 -0
  129. {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.13}/tests/corpus/manifest.json +0 -0
  130. {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.13}/tests/corpus/test_api_corpus.py +0 -0
  131. {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.13}/tests/integration/__init__.py +0 -0
  132. {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.13}/tests/integration/mock_embedder.py +0 -0
  133. {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.13}/tests/integration/test_a2a_trace_propagation.py +0 -0
  134. {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.13}/tests/integration/test_runtime.py +0 -0
  135. {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.13}/tests/integration/test_secure_async.py +0 -0
  136. {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.13}/tests/integration/test_secure_sync.py +0 -0
  137. {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.13}/tests/integration/test_tracing_otlp_wire_format.py +0 -0
  138. {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.13}/tests/pact/conftest.py +0 -0
  139. {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.13}/tests/pact/test_oe_provider_verification.py +0 -0
  140. {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.13}/tests/unit/__init__.py +0 -0
  141. {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.13}/tests/unit/connectors/__init__.py +0 -0
  142. {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.13}/tests/unit/connectors/fixtures/auth_cases.yaml +0 -0
  143. {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.13}/tests/unit/connectors/fixtures/jira.tool_defs.yaml +0 -0
  144. {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.13}/tests/unit/connectors/test_auth.py +0 -0
  145. {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.13}/tests/unit/connectors/test_bundle.py +0 -0
  146. {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.13}/tests/unit/connectors/test_core.py +0 -0
  147. {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.13}/tests/unit/connectors/test_create_tool.py +0 -0
  148. {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.13}/tests/unit/connectors/test_materialize.py +0 -0
  149. {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.13}/tests/unit/test_a2a.py +0 -0
  150. {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.13}/tests/unit/test_a2a_auth.py +0 -0
  151. {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.13}/tests/unit/test_aer_a2a_registration.py +0 -0
  152. {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.13}/tests/unit/test_aer_build_agent_span.py +0 -0
  153. {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.13}/tests/unit/test_aer_cancelled_turn.py +0 -0
  154. {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.13}/tests/unit/test_aer_capability_advertise.py +0 -0
  155. {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.13}/tests/unit/test_aer_chunk_delivery_reliability.py +0 -0
  156. {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.13}/tests/unit/test_aer_chunk_emission.py +0 -0
  157. {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.13}/tests/unit/test_aer_durable_attempt.py +0 -0
  158. {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.13}/tests/unit/test_aer_llm_invocation_signal.py +0 -0
  159. {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.13}/tests/unit/test_aer_metadata_payload.py +0 -0
  160. {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.13}/tests/unit/test_aer_policy_denied.py +0 -0
  161. {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.13}/tests/unit/test_aer_session_finish.py +0 -0
  162. {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.13}/tests/unit/test_aer_timeout_signal.py +0 -0
  163. {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.13}/tests/unit/test_aer_trace_context.py +0 -0
  164. {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.13}/tests/unit/test_aer_workspace_scope.py +0 -0
  165. {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.13}/tests/unit/test_agent_config.py +0 -0
  166. {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.13}/tests/unit/test_async_utils.py +0 -0
  167. {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.13}/tests/unit/test_atlas_dns.py +0 -0
  168. {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.13}/tests/unit/test_call_interrupt.py +0 -0
  169. {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.13}/tests/unit/test_call_interrupt_contract.py +0 -0
  170. {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.13}/tests/unit/test_checkpoint_workspace.py +0 -0
  171. {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.13}/tests/unit/test_cors.py +0 -0
  172. {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.13}/tests/unit/test_create_memory_client_headers.py +0 -0
  173. {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.13}/tests/unit/test_custom_headers_context.py +0 -0
  174. {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.13}/tests/unit/test_custom_headers_models.py +0 -0
  175. {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.13}/tests/unit/test_db_naming.py +0 -0
  176. {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.13}/tests/unit/test_debug_hook.py +0 -0
  177. {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.13}/tests/unit/test_drain.py +0 -0
  178. {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.13}/tests/unit/test_drain_contract.py +0 -0
  179. {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.13}/tests/unit/test_durable_guardrail_review.py +0 -0
  180. {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.13}/tests/unit/test_durable_oauth.py +0 -0
  181. {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.13}/tests/unit/test_durable_proxies.py +0 -0
  182. {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.13}/tests/unit/test_emit_custom_event.py +0 -0
  183. {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.13}/tests/unit/test_emit_progress.py +0 -0
  184. {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.13}/tests/unit/test_error_reporting.py +0 -0
  185. {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.13}/tests/unit/test_execution.py +0 -0
  186. {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.13}/tests/unit/test_extract_turn_messages.py +0 -0
  187. {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.13}/tests/unit/test_format_llm_error.py +0 -0
  188. {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.13}/tests/unit/test_graph_warm.py +0 -0
  189. {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.13}/tests/unit/test_guardrails_protocol.py +0 -0
  190. {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.13}/tests/unit/test_hitl_interrupt.py +0 -0
  191. {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.13}/tests/unit/test_hooks.py +0 -0
  192. {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.13}/tests/unit/test_http_path.py +0 -0
  193. {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.13}/tests/unit/test_http_retry.py +0 -0
  194. {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.13}/tests/unit/test_launcher.py +0 -0
  195. {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.13}/tests/unit/test_launcher_reports.py +0 -0
  196. {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.13}/tests/unit/test_listen_host.py +0 -0
  197. {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.13}/tests/unit/test_llm_credential_classification.py +0 -0
  198. {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.13}/tests/unit/test_mcp_era_compat.py +0 -0
  199. {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.13}/tests/unit/test_mcp_oauth.py +0 -0
  200. {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.13}/tests/unit/test_mcp_oauth_cli.py +0 -0
  201. {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.13}/tests/unit/test_mcp_oauth_secret.py +0 -0
  202. {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.13}/tests/unit/test_mcp_tools.py +0 -0
  203. {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.13}/tests/unit/test_memory_appbound.py +0 -0
  204. {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.13}/tests/unit/test_memory_search_metadata.py +0 -0
  205. {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.13}/tests/unit/test_memory_writer_context.py +0 -0
  206. {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.13}/tests/unit/test_metadata.py +0 -0
  207. {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.13}/tests/unit/test_metrics.py +0 -0
  208. {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.13}/tests/unit/test_models.py +0 -0
  209. {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.13}/tests/unit/test_no_lc_imports.py +0 -0
  210. {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.13}/tests/unit/test_node_logger.py +0 -0
  211. {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.13}/tests/unit/test_oe_url.py +0 -0
  212. {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.13}/tests/unit/test_owner_callback.py +0 -0
  213. {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.13}/tests/unit/test_owner_url.py +0 -0
  214. {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.13}/tests/unit/test_payload_context.py +0 -0
  215. {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.13}/tests/unit/test_query_routes.py +0 -0
  216. {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.13}/tests/unit/test_request_id_context.py +0 -0
  217. {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.13}/tests/unit/test_resume_payload.py +0 -0
  218. {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
  219. {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.13}/tests/unit/test_runtime_checkpoint_workspace.py +0 -0
  220. {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.13}/tests/unit/test_runtime_custom_memory.py +0 -0
  221. {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.13}/tests/unit/test_runtime_memory_context.py +0 -0
  222. {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.13}/tests/unit/test_runtime_models.py +0 -0
  223. {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.13}/tests/unit/test_runtime_register_tool.py +0 -0
  224. {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.13}/tests/unit/test_secure_llm_proxy.py +0 -0
  225. {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.13}/tests/unit/test_secure_wrapper.py +0 -0
  226. {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.13}/tests/unit/test_server_auth.py +0 -0
  227. {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.13}/tests/unit/test_server_health.py +0 -0
  228. {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.13}/tests/unit/test_server_shutdown.py +0 -0
  229. {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.13}/tests/unit/test_server_startup_failures.py +0 -0
  230. {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.13}/tests/unit/test_session_filesystem_isolation.py +0 -0
  231. {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.13}/tests/unit/test_session_finish_context.py +0 -0
  232. {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.13}/tests/unit/test_shared_client.py +0 -0
  233. {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.13}/tests/unit/test_structured_logging.py +0 -0
  234. {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.13}/tests/unit/test_thinking_tokens.py +0 -0
  235. {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.13}/tests/unit/test_tls_client.py +0 -0
  236. {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.13}/tests/unit/test_tls_client_integration.py +0 -0
  237. {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.13}/tests/unit/test_token_capture.py +0 -0
  238. {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.13}/tests/unit/test_tool.py +0 -0
  239. {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.13}/tests/unit/test_tool_api_error.py +0 -0
  240. {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.13}/tests/unit/test_tool_authorization.py +0 -0
  241. {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.13}/tests/unit/test_tool_cancellation_boundary.py +0 -0
  242. {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.13}/tests/unit/test_tool_deserialization.py +0 -0
  243. {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.13}/tests/unit/test_tool_log_redaction.py +0 -0
  244. {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.13}/tests/unit/test_tool_memory_ownership.py +0 -0
  245. {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.13}/tests/unit/test_tool_server_startup.py +0 -0
  246. {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.13}/tests/unit/test_tool_trace_context.py +0 -0
  247. {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.13}/tests/unit/test_toolpod_handlers.py +0 -0
  248. {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.13}/tests/unit/test_tracing_retry.py +0 -0
  249. {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.13}/tests/unit/workflow/test_activity.py +0 -0
  250. {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.13}/tests/unit/workflow/test_attempt.py +0 -0
  251. {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.13}/tests/unit/workflow/test_cancelled_history.py +0 -0
  252. {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.13}/tests/unit/workflow/test_client.py +0 -0
  253. {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.13}/tests/unit/workflow/test_context.py +0 -0
  254. {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.13}/tests/unit/workflow/test_heartbeat.py +0 -0
  255. {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.13}/tests/unit/workflow/test_memory.py +0 -0
  256. {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.13}/tests/unit/workflow/test_protojson.py +0 -0
  257. {agent_engine_runner_shared-0.11.12 → agent_engine_runner_shared-0.11.13}/tests/unit/workflow/test_protojson_helpers.py +0 -0
  258. {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-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.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.12
9
- Requires-Dist: agent-engine-sdk==0.11.12
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.12"
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.12",
30
+ "agent-engine-sdk==0.11.13",
31
31
  # Memory models and the MemoryClient HTTP client
32
- "agent-engine-sdk-memory==0.11.12",
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
- 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,
@@ -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()