agentkernel 0.7.0__tar.gz → 0.8.1__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 (245) hide show
  1. {agentkernel-0.7.0 → agentkernel-0.8.1}/PKG-INFO +19 -5
  2. {agentkernel-0.7.0 → agentkernel-0.8.1}/README.md +14 -4
  3. {agentkernel-0.7.0 → agentkernel-0.8.1}/pyproject.toml +9 -3
  4. {agentkernel-0.7.0 → agentkernel-0.8.1}/src/agentkernel/cli/cli.py +28 -2
  5. {agentkernel-0.7.0 → agentkernel-0.8.1}/src/agentkernel/core/base.py +134 -1
  6. {agentkernel-0.7.0 → agentkernel-0.8.1}/src/agentkernel/core/config.py +32 -3
  7. {agentkernel-0.7.0 → agentkernel-0.8.1}/src/agentkernel/deployment/azure/akfunction.py +2 -0
  8. {agentkernel-0.7.0 → agentkernel-0.8.1}/src/agentkernel/framework/adk/adk.py +89 -36
  9. {agentkernel-0.7.0 → agentkernel-0.8.1}/src/agentkernel/framework/crewai/crewai.py +8 -6
  10. {agentkernel-0.7.0 → agentkernel-0.8.1}/src/agentkernel/framework/langgraph/langgraph.py +33 -2
  11. {agentkernel-0.7.0 → agentkernel-0.8.1}/src/agentkernel/framework/openai/openai.py +20 -8
  12. {agentkernel-0.7.0 → agentkernel-0.8.1}/src/agentkernel/framework/pydanticai/pydanticai.py +20 -2
  13. {agentkernel-0.7.0 → agentkernel-0.8.1}/src/agentkernel/framework/smolagents/smolagents.py +14 -1
  14. {agentkernel-0.7.0 → agentkernel-0.8.1}/src/agentkernel/sandbox/__init__.py +7 -5
  15. {agentkernel-0.7.0 → agentkernel-0.8.1}/src/agentkernel/sandbox/base.py +44 -2
  16. {agentkernel-0.7.0 → agentkernel-0.8.1}/src/agentkernel/sandbox/broker/__init__.py +2 -2
  17. {agentkernel-0.7.0 → agentkernel-0.8.1}/src/agentkernel/sandbox/broker/base.py +13 -13
  18. {agentkernel-0.7.0 → agentkernel-0.8.1}/src/agentkernel/sandbox/broker/embedded.py +7 -5
  19. {agentkernel-0.7.0 → agentkernel-0.8.1}/src/agentkernel/sandbox/broker/thread.py +11 -11
  20. {agentkernel-0.7.0 → agentkernel-0.8.1}/src/agentkernel/sandbox/broker/worker.py +32 -15
  21. {agentkernel-0.7.0 → agentkernel-0.8.1}/src/agentkernel/sandbox/errors.py +1 -1
  22. {agentkernel-0.7.0 → agentkernel-0.8.1}/src/agentkernel/sandbox/factory.py +67 -7
  23. {agentkernel-0.7.0 → agentkernel-0.8.1}/src/agentkernel/sandbox/hooks.py +8 -8
  24. {agentkernel-0.7.0 → agentkernel-0.8.1}/src/agentkernel/sandbox/manager.py +23 -16
  25. {agentkernel-0.7.0 → agentkernel-0.8.1}/src/agentkernel/sandbox/model.py +4 -2
  26. agentkernel-0.8.1/src/agentkernel/sandbox/providers/daytona.py +196 -0
  27. {agentkernel-0.7.0 → agentkernel-0.8.1}/src/agentkernel/sandbox/providers/docker.py +1 -0
  28. agentkernel-0.8.1/src/agentkernel/sandbox/providers/e2b.py +138 -0
  29. agentkernel-0.8.1/src/agentkernel/sandbox/providers/ec2_ssm.py +234 -0
  30. {agentkernel-0.7.0 → agentkernel-0.8.1}/src/agentkernel/sandbox/tools.py +28 -10
  31. {agentkernel-0.7.0 → agentkernel-0.8.1}/src/agentkernel/skills/ak-add-capabilities/SKILL.md +59 -23
  32. {agentkernel-0.7.0 → agentkernel-0.8.1}/src/agentkernel/skills/ak-add-capabilities/evals/evals.json +33 -1
  33. {agentkernel-0.7.0 → agentkernel-0.8.1}/src/agentkernel/skills/ak-add-integration/SKILL.md +8 -8
  34. {agentkernel-0.7.0 → agentkernel-0.8.1}/src/agentkernel/skills/ak-add-integration/evals/evals.json +1 -1
  35. {agentkernel-0.7.0 → agentkernel-0.8.1}/src/agentkernel/skills/ak-build/SKILL.md +1 -1
  36. {agentkernel-0.7.0 → agentkernel-0.8.1}/src/agentkernel/skills/ak-build/evals/evals.json +1 -1
  37. {agentkernel-0.7.0 → agentkernel-0.8.1}/src/agentkernel/skills/ak-cloud-deploy/SKILL.md +19 -19
  38. {agentkernel-0.7.0 → agentkernel-0.8.1}/src/agentkernel/skills/ak-cloud-deploy/evals/evals.json +1 -1
  39. {agentkernel-0.7.0 → agentkernel-0.8.1}/src/agentkernel/skills/ak-init/SKILL.md +2 -2
  40. {agentkernel-0.7.0 → agentkernel-0.8.1}/src/agentkernel/skills/ak-init/evals/evals.json +2 -2
  41. {agentkernel-0.7.0 → agentkernel-0.8.1}/src/agentkernel/skills/ak-test/SKILL.md +2 -2
  42. {agentkernel-0.7.0 → agentkernel-0.8.1}/src/agentkernel/skills/ak-test/evals/evals.json +1 -1
  43. agentkernel-0.8.1/src/agentkernel/trace/langfuse/langgraph.py +49 -0
  44. agentkernel-0.7.0/src/agentkernel/trace/langfuse/langgraph.py +0 -70
  45. {agentkernel-0.7.0 → agentkernel-0.8.1}/src/agentkernel/__init__.py +0 -0
  46. {agentkernel-0.7.0 → agentkernel-0.8.1}/src/agentkernel/adk.py +0 -0
  47. {agentkernel-0.7.0 → agentkernel-0.8.1}/src/agentkernel/api/__init__.py +0 -0
  48. {agentkernel-0.7.0 → agentkernel-0.8.1}/src/agentkernel/api/a2a/__init__.py +0 -0
  49. {agentkernel-0.7.0 → agentkernel-0.8.1}/src/agentkernel/api/a2a/a2a.py +0 -0
  50. {agentkernel-0.7.0 → agentkernel-0.8.1}/src/agentkernel/api/a2a/handler.py +0 -0
  51. {agentkernel-0.7.0 → agentkernel-0.8.1}/src/agentkernel/api/handler.py +0 -0
  52. {agentkernel-0.7.0 → agentkernel-0.8.1}/src/agentkernel/api/http.py +0 -0
  53. {agentkernel-0.7.0 → agentkernel-0.8.1}/src/agentkernel/api/mcp/__init__.py +0 -0
  54. {agentkernel-0.7.0 → agentkernel-0.8.1}/src/agentkernel/api/mcp/akmcp.py +0 -0
  55. {agentkernel-0.7.0 → agentkernel-0.8.1}/src/agentkernel/api/thread.py +0 -0
  56. {agentkernel-0.7.0 → agentkernel-0.8.1}/src/agentkernel/auth/__init__.py +0 -0
  57. {agentkernel-0.7.0 → agentkernel-0.8.1}/src/agentkernel/auth/handler.py +0 -0
  58. {agentkernel-0.7.0 → agentkernel-0.8.1}/src/agentkernel/auth.py +0 -0
  59. {agentkernel-0.7.0 → agentkernel-0.8.1}/src/agentkernel/aws.py +0 -0
  60. {agentkernel-0.7.0 → agentkernel-0.8.1}/src/agentkernel/azure.py +0 -0
  61. {agentkernel-0.7.0 → agentkernel-0.8.1}/src/agentkernel/cli/__init__.py +0 -0
  62. {agentkernel-0.7.0 → agentkernel-0.8.1}/src/agentkernel/cli/ak.py +0 -0
  63. {agentkernel-0.7.0 → agentkernel-0.8.1}/src/agentkernel/core/__init__.py +0 -0
  64. {agentkernel-0.7.0 → agentkernel-0.8.1}/src/agentkernel/core/builder.py +0 -0
  65. {agentkernel-0.7.0 → agentkernel-0.8.1}/src/agentkernel/core/chat_service.py +0 -0
  66. {agentkernel-0.7.0 → agentkernel-0.8.1}/src/agentkernel/core/hooks.py +0 -0
  67. {agentkernel-0.7.0 → agentkernel-0.8.1}/src/agentkernel/core/logger.py +0 -0
  68. {agentkernel-0.7.0 → agentkernel-0.8.1}/src/agentkernel/core/model.py +0 -0
  69. {agentkernel-0.7.0 → agentkernel-0.8.1}/src/agentkernel/core/module.py +0 -0
  70. {agentkernel-0.7.0 → agentkernel-0.8.1}/src/agentkernel/core/multimodal/__init__.py +0 -0
  71. {agentkernel-0.7.0 → agentkernel-0.8.1}/src/agentkernel/core/multimodal/factory.py +0 -0
  72. {agentkernel-0.7.0 → agentkernel-0.8.1}/src/agentkernel/core/multimodal/hooks.py +0 -0
  73. {agentkernel-0.7.0 → agentkernel-0.8.1}/src/agentkernel/core/multimodal/storage/__init__.py +0 -0
  74. {agentkernel-0.7.0 → agentkernel-0.8.1}/src/agentkernel/core/multimodal/storage/base.py +0 -0
  75. {agentkernel-0.7.0 → agentkernel-0.8.1}/src/agentkernel/core/multimodal/storage/dynamodb.py +0 -0
  76. {agentkernel-0.7.0 → agentkernel-0.8.1}/src/agentkernel/core/multimodal/storage/in_memory.py +0 -0
  77. {agentkernel-0.7.0 → agentkernel-0.8.1}/src/agentkernel/core/multimodal/storage/redis.py +0 -0
  78. {agentkernel-0.7.0 → agentkernel-0.8.1}/src/agentkernel/core/multimodal/storage/session_cache.py +0 -0
  79. {agentkernel-0.7.0 → agentkernel-0.8.1}/src/agentkernel/core/multimodal/storage/storage_manager.py +0 -0
  80. {agentkernel-0.7.0 → agentkernel-0.8.1}/src/agentkernel/core/multimodal/tools.py +0 -0
  81. {agentkernel-0.7.0 → agentkernel-0.8.1}/src/agentkernel/core/runtime.py +0 -0
  82. {agentkernel-0.7.0 → agentkernel-0.8.1}/src/agentkernel/core/service.py +0 -0
  83. {agentkernel-0.7.0 → agentkernel-0.8.1}/src/agentkernel/core/session/__init__.py +0 -0
  84. {agentkernel-0.7.0 → agentkernel-0.8.1}/src/agentkernel/core/session/base.py +0 -0
  85. {agentkernel-0.7.0 → agentkernel-0.8.1}/src/agentkernel/core/session/cosmosdb.py +0 -0
  86. {agentkernel-0.7.0 → agentkernel-0.8.1}/src/agentkernel/core/session/dynamodb.py +0 -0
  87. {agentkernel-0.7.0 → agentkernel-0.8.1}/src/agentkernel/core/session/firestore.py +0 -0
  88. {agentkernel-0.7.0 → agentkernel-0.8.1}/src/agentkernel/core/session/in_memory.py +0 -0
  89. {agentkernel-0.7.0 → agentkernel-0.8.1}/src/agentkernel/core/session/redis.py +0 -0
  90. {agentkernel-0.7.0 → agentkernel-0.8.1}/src/agentkernel/core/session/serde.py +0 -0
  91. {agentkernel-0.7.0 → agentkernel-0.8.1}/src/agentkernel/core/session/valkey.py +0 -0
  92. {agentkernel-0.7.0 → agentkernel-0.8.1}/src/agentkernel/core/thread/__init__.py +0 -0
  93. {agentkernel-0.7.0 → agentkernel-0.8.1}/src/agentkernel/core/thread/authoriser.py +0 -0
  94. {agentkernel-0.7.0 → agentkernel-0.8.1}/src/agentkernel/core/thread/manager.py +0 -0
  95. {agentkernel-0.7.0 → agentkernel-0.8.1}/src/agentkernel/core/thread/model.py +0 -0
  96. {agentkernel-0.7.0 → agentkernel-0.8.1}/src/agentkernel/core/thread/naming.py +0 -0
  97. {agentkernel-0.7.0 → agentkernel-0.8.1}/src/agentkernel/core/thread/store/__init__.py +0 -0
  98. {agentkernel-0.7.0 → agentkernel-0.8.1}/src/agentkernel/core/thread/store/base.py +0 -0
  99. {agentkernel-0.7.0 → agentkernel-0.8.1}/src/agentkernel/core/thread/store/cosmosdb.py +0 -0
  100. {agentkernel-0.7.0 → agentkernel-0.8.1}/src/agentkernel/core/thread/store/dynamodb.py +0 -0
  101. {agentkernel-0.7.0 → agentkernel-0.8.1}/src/agentkernel/core/thread/store/firestore.py +0 -0
  102. {agentkernel-0.7.0 → agentkernel-0.8.1}/src/agentkernel/core/thread/store/in_memory.py +0 -0
  103. {agentkernel-0.7.0 → agentkernel-0.8.1}/src/agentkernel/core/thread/store/redis.py +0 -0
  104. {agentkernel-0.7.0 → agentkernel-0.8.1}/src/agentkernel/core/tool.py +0 -0
  105. {agentkernel-0.7.0 → agentkernel-0.8.1}/src/agentkernel/core/util/config_yaml_util.py +0 -0
  106. {agentkernel-0.7.0 → agentkernel-0.8.1}/src/agentkernel/core/util/driver/__init__.py +0 -0
  107. {agentkernel-0.7.0 → agentkernel-0.8.1}/src/agentkernel/core/util/driver/base.py +0 -0
  108. {agentkernel-0.7.0 → agentkernel-0.8.1}/src/agentkernel/core/util/driver/cosmosdb.py +0 -0
  109. {agentkernel-0.7.0 → agentkernel-0.8.1}/src/agentkernel/core/util/driver/dynamodb.py +0 -0
  110. {agentkernel-0.7.0 → agentkernel-0.8.1}/src/agentkernel/core/util/driver/firestore.py +0 -0
  111. {agentkernel-0.7.0 → agentkernel-0.8.1}/src/agentkernel/core/util/driver/redis.py +0 -0
  112. {agentkernel-0.7.0 → agentkernel-0.8.1}/src/agentkernel/core/util/driver/redis_like.py +0 -0
  113. {agentkernel-0.7.0 → agentkernel-0.8.1}/src/agentkernel/core/util/driver/valkey.py +0 -0
  114. {agentkernel-0.7.0 → agentkernel-0.8.1}/src/agentkernel/core/util/error_util.py +0 -0
  115. {agentkernel-0.7.0 → agentkernel-0.8.1}/src/agentkernel/core/util/factory.py +0 -0
  116. {agentkernel-0.7.0 → agentkernel-0.8.1}/src/agentkernel/core/util/key_value_cache.py +0 -0
  117. {agentkernel-0.7.0 → agentkernel-0.8.1}/src/agentkernel/crewai.py +0 -0
  118. {agentkernel-0.7.0 → agentkernel-0.8.1}/src/agentkernel/deployment/__init__.py +0 -0
  119. {agentkernel-0.7.0 → agentkernel-0.8.1}/src/agentkernel/deployment/aws/__init__.py +0 -0
  120. {agentkernel-0.7.0 → agentkernel-0.8.1}/src/agentkernel/deployment/aws/containerized/__init__.py +0 -0
  121. {agentkernel-0.7.0 → agentkernel-0.8.1}/src/agentkernel/deployment/aws/containerized/akagentrunner.py +0 -0
  122. {agentkernel-0.7.0 → agentkernel-0.8.1}/src/agentkernel/deployment/aws/containerized/akoutputconsumer.py +0 -0
  123. {agentkernel-0.7.0 → agentkernel-0.8.1}/src/agentkernel/deployment/aws/containerized/core/__init__.py +0 -0
  124. {agentkernel-0.7.0 → agentkernel-0.8.1}/src/agentkernel/deployment/aws/containerized/core/sqs_consumer.py +0 -0
  125. {agentkernel-0.7.0 → agentkernel-0.8.1}/src/agentkernel/deployment/aws/containerized/ecs_io_handler.py +0 -0
  126. {agentkernel-0.7.0 → agentkernel-0.8.1}/src/agentkernel/deployment/aws/containerized/ecs_queue_handler.py +0 -0
  127. {agentkernel-0.7.0 → agentkernel-0.8.1}/src/agentkernel/deployment/aws/core/__init__.py +0 -0
  128. {agentkernel-0.7.0 → agentkernel-0.8.1}/src/agentkernel/deployment/aws/core/response_store/__init__.py +0 -0
  129. {agentkernel-0.7.0 → agentkernel-0.8.1}/src/agentkernel/deployment/aws/core/response_store/dynamodb.py +0 -0
  130. {agentkernel-0.7.0 → agentkernel-0.8.1}/src/agentkernel/deployment/aws/core/response_store/handler.py +0 -0
  131. {agentkernel-0.7.0 → agentkernel-0.8.1}/src/agentkernel/deployment/aws/core/response_store/redis.py +0 -0
  132. {agentkernel-0.7.0 → agentkernel-0.8.1}/src/agentkernel/deployment/aws/core/response_store/valkey.py +0 -0
  133. {agentkernel-0.7.0 → agentkernel-0.8.1}/src/agentkernel/deployment/aws/core/sqs_handler.py +0 -0
  134. {agentkernel-0.7.0 → agentkernel-0.8.1}/src/agentkernel/deployment/aws/core/websocket_service.py +0 -0
  135. {agentkernel-0.7.0 → agentkernel-0.8.1}/src/agentkernel/deployment/aws/serverless/__init__.py +0 -0
  136. {agentkernel-0.7.0 → agentkernel-0.8.1}/src/agentkernel/deployment/aws/serverless/akagentrunner.py +0 -0
  137. {agentkernel-0.7.0 → agentkernel-0.8.1}/src/agentkernel/deployment/aws/serverless/akauthorizer.py +0 -0
  138. {agentkernel-0.7.0 → agentkernel-0.8.1}/src/agentkernel/deployment/aws/serverless/aklambda.py +0 -0
  139. {agentkernel-0.7.0 → agentkernel-0.8.1}/src/agentkernel/deployment/aws/serverless/akresponsehandler.py +0 -0
  140. {agentkernel-0.7.0 → agentkernel-0.8.1}/src/agentkernel/deployment/aws/serverless/akwsconnectionhandler.py +0 -0
  141. {agentkernel-0.7.0 → agentkernel-0.8.1}/src/agentkernel/deployment/aws/serverless/core/__init__.py +0 -0
  142. {agentkernel-0.7.0 → agentkernel-0.8.1}/src/agentkernel/deployment/aws/serverless/core/router/__init__.py +0 -0
  143. {agentkernel-0.7.0 → agentkernel-0.8.1}/src/agentkernel/deployment/aws/serverless/core/router/common.py +0 -0
  144. {agentkernel-0.7.0 → agentkernel-0.8.1}/src/agentkernel/deployment/aws/serverless/core/router/rest_lambda.py +0 -0
  145. {agentkernel-0.7.0 → agentkernel-0.8.1}/src/agentkernel/deployment/aws/serverless/core/router/ws_lambda.py +0 -0
  146. {agentkernel-0.7.0 → agentkernel-0.8.1}/src/agentkernel/deployment/aws/serverless/core/sqs_consumer.py +0 -0
  147. {agentkernel-0.7.0 → agentkernel-0.8.1}/src/agentkernel/deployment/azure/__init__.py +0 -0
  148. {agentkernel-0.7.0 → agentkernel-0.8.1}/src/agentkernel/deployment/common/__init__.py +0 -0
  149. {agentkernel-0.7.0 → agentkernel-0.8.1}/src/agentkernel/deployment/common/queue_consumer.py +0 -0
  150. {agentkernel-0.7.0 → agentkernel-0.8.1}/src/agentkernel/deployment/common/queue_handler.py +0 -0
  151. {agentkernel-0.7.0 → agentkernel-0.8.1}/src/agentkernel/deployment/common/queue_request_handler.py +0 -0
  152. {agentkernel-0.7.0 → agentkernel-0.8.1}/src/agentkernel/deployment/common/response_store.py +0 -0
  153. {agentkernel-0.7.0 → agentkernel-0.8.1}/src/agentkernel/deployment/common/thread_runner.py +0 -0
  154. {agentkernel-0.7.0 → agentkernel-0.8.1}/src/agentkernel/deployment/common/websocket_connection_store.py +0 -0
  155. {agentkernel-0.7.0 → agentkernel-0.8.1}/src/agentkernel/deployment/gcp/__init__.py +0 -0
  156. {agentkernel-0.7.0 → agentkernel-0.8.1}/src/agentkernel/deployment/gcp/akauthorizer.py +0 -0
  157. {agentkernel-0.7.0 → agentkernel-0.8.1}/src/agentkernel/deployment/gcp/akcloudrun.py +0 -0
  158. {agentkernel-0.7.0 → agentkernel-0.8.1}/src/agentkernel/framework/__init__.py +0 -0
  159. {agentkernel-0.7.0 → agentkernel-0.8.1}/src/agentkernel/framework/adk/__init__.py +0 -0
  160. {agentkernel-0.7.0 → agentkernel-0.8.1}/src/agentkernel/framework/crewai/__init__.py +0 -0
  161. {agentkernel-0.7.0 → agentkernel-0.8.1}/src/agentkernel/framework/langgraph/__init__.py +0 -0
  162. {agentkernel-0.7.0 → agentkernel-0.8.1}/src/agentkernel/framework/openai/__init__.py +0 -0
  163. {agentkernel-0.7.0 → agentkernel-0.8.1}/src/agentkernel/framework/pydanticai/__init__.py +0 -0
  164. {agentkernel-0.7.0 → agentkernel-0.8.1}/src/agentkernel/framework/smolagents/__init__.py +0 -0
  165. {agentkernel-0.7.0 → agentkernel-0.8.1}/src/agentkernel/gcp.py +0 -0
  166. {agentkernel-0.7.0 → agentkernel-0.8.1}/src/agentkernel/gmail.py +0 -0
  167. {agentkernel-0.7.0 → agentkernel-0.8.1}/src/agentkernel/guardrail/__init__.py +0 -0
  168. {agentkernel-0.7.0 → agentkernel-0.8.1}/src/agentkernel/guardrail/bedrock.py +0 -0
  169. {agentkernel-0.7.0 → agentkernel-0.8.1}/src/agentkernel/guardrail/guardrail.py +0 -0
  170. {agentkernel-0.7.0 → agentkernel-0.8.1}/src/agentkernel/guardrail/openai.py +0 -0
  171. {agentkernel-0.7.0 → agentkernel-0.8.1}/src/agentkernel/guardrail/walledai.py +0 -0
  172. {agentkernel-0.7.0 → agentkernel-0.8.1}/src/agentkernel/instagram.py +0 -0
  173. {agentkernel-0.7.0 → agentkernel-0.8.1}/src/agentkernel/integration/__init__.py +0 -0
  174. {agentkernel-0.7.0 → agentkernel-0.8.1}/src/agentkernel/integration/gmail/README.md +0 -0
  175. {agentkernel-0.7.0 → agentkernel-0.8.1}/src/agentkernel/integration/gmail/__init__.py +0 -0
  176. {agentkernel-0.7.0 → agentkernel-0.8.1}/src/agentkernel/integration/gmail/gmail_chat.py +0 -0
  177. {agentkernel-0.7.0 → agentkernel-0.8.1}/src/agentkernel/integration/instagram/README.md +0 -0
  178. {agentkernel-0.7.0 → agentkernel-0.8.1}/src/agentkernel/integration/instagram/__init__.py +0 -0
  179. {agentkernel-0.7.0 → agentkernel-0.8.1}/src/agentkernel/integration/instagram/instagram_chat.py +0 -0
  180. {agentkernel-0.7.0 → agentkernel-0.8.1}/src/agentkernel/integration/messenger/README.md +0 -0
  181. {agentkernel-0.7.0 → agentkernel-0.8.1}/src/agentkernel/integration/messenger/__init__.py +0 -0
  182. {agentkernel-0.7.0 → agentkernel-0.8.1}/src/agentkernel/integration/messenger/messenger_chat.py +0 -0
  183. {agentkernel-0.7.0 → agentkernel-0.8.1}/src/agentkernel/integration/slack/README.md +0 -0
  184. {agentkernel-0.7.0 → agentkernel-0.8.1}/src/agentkernel/integration/slack/__init__.py +0 -0
  185. {agentkernel-0.7.0 → agentkernel-0.8.1}/src/agentkernel/integration/slack/slack_chat.py +0 -0
  186. {agentkernel-0.7.0 → agentkernel-0.8.1}/src/agentkernel/integration/teams/README.md +0 -0
  187. {agentkernel-0.7.0 → agentkernel-0.8.1}/src/agentkernel/integration/teams/__init__.py +0 -0
  188. {agentkernel-0.7.0 → agentkernel-0.8.1}/src/agentkernel/integration/teams/teams_chat.py +0 -0
  189. {agentkernel-0.7.0 → agentkernel-0.8.1}/src/agentkernel/integration/telegram/README.md +0 -0
  190. {agentkernel-0.7.0 → agentkernel-0.8.1}/src/agentkernel/integration/telegram/__init__.py +0 -0
  191. {agentkernel-0.7.0 → agentkernel-0.8.1}/src/agentkernel/integration/telegram/telegram_chat.py +0 -0
  192. {agentkernel-0.7.0 → agentkernel-0.8.1}/src/agentkernel/integration/whatsapp/README.md +0 -0
  193. {agentkernel-0.7.0 → agentkernel-0.8.1}/src/agentkernel/integration/whatsapp/__init__.py +0 -0
  194. {agentkernel-0.7.0 → agentkernel-0.8.1}/src/agentkernel/integration/whatsapp/whatsapp_chat.py +0 -0
  195. {agentkernel-0.7.0 → agentkernel-0.8.1}/src/agentkernel/knowledgebase/__init__.py +0 -0
  196. {agentkernel-0.7.0 → agentkernel-0.8.1}/src/agentkernel/knowledgebase/base.py +0 -0
  197. {agentkernel-0.7.0 → agentkernel-0.8.1}/src/agentkernel/knowledgebase/chroma.py +0 -0
  198. {agentkernel-0.7.0 → agentkernel-0.8.1}/src/agentkernel/knowledgebase/knowledgebuilder.py +0 -0
  199. {agentkernel-0.7.0 → agentkernel-0.8.1}/src/agentkernel/knowledgebase/neo4j.py +0 -0
  200. {agentkernel-0.7.0 → agentkernel-0.8.1}/src/agentkernel/knowledgebase/starburst.py +0 -0
  201. {agentkernel-0.7.0 → agentkernel-0.8.1}/src/agentkernel/langgraph.py +0 -0
  202. {agentkernel-0.7.0 → agentkernel-0.8.1}/src/agentkernel/mcp.py +0 -0
  203. {agentkernel-0.7.0 → agentkernel-0.8.1}/src/agentkernel/messenger.py +0 -0
  204. {agentkernel-0.7.0 → agentkernel-0.8.1}/src/agentkernel/openai.py +0 -0
  205. {agentkernel-0.7.0 → agentkernel-0.8.1}/src/agentkernel/pydanticai.py +0 -0
  206. {agentkernel-0.7.0 → agentkernel-0.8.1}/src/agentkernel/sandbox/principal.py +0 -0
  207. {agentkernel-0.7.0 → agentkernel-0.8.1}/src/agentkernel/sandbox/providers/__init__.py +0 -0
  208. {agentkernel-0.7.0 → agentkernel-0.8.1}/src/agentkernel/sandbox/providers/local_subprocess.py +0 -0
  209. {agentkernel-0.7.0 → agentkernel-0.8.1}/src/agentkernel/sandbox/testing.py +0 -0
  210. {agentkernel-0.7.0 → agentkernel-0.8.1}/src/agentkernel/skills/__init__.py +0 -0
  211. {agentkernel-0.7.0 → agentkernel-0.8.1}/src/agentkernel/skills/skills.py +0 -0
  212. {agentkernel-0.7.0 → agentkernel-0.8.1}/src/agentkernel/slack.py +0 -0
  213. {agentkernel-0.7.0 → agentkernel-0.8.1}/src/agentkernel/smolagents.py +0 -0
  214. {agentkernel-0.7.0 → agentkernel-0.8.1}/src/agentkernel/teams.py +0 -0
  215. {agentkernel-0.7.0 → agentkernel-0.8.1}/src/agentkernel/telegram.py +0 -0
  216. {agentkernel-0.7.0 → agentkernel-0.8.1}/src/agentkernel/test/__init__.py +0 -0
  217. {agentkernel-0.7.0 → agentkernel-0.8.1}/src/agentkernel/test/config.py +0 -0
  218. {agentkernel-0.7.0 → agentkernel-0.8.1}/src/agentkernel/test/test.py +0 -0
  219. {agentkernel-0.7.0 → agentkernel-0.8.1}/src/agentkernel/trace/__init__.py +0 -0
  220. {agentkernel-0.7.0 → agentkernel-0.8.1}/src/agentkernel/trace/base.py +0 -0
  221. {agentkernel-0.7.0 → agentkernel-0.8.1}/src/agentkernel/trace/langfuse/__init__.py +0 -0
  222. {agentkernel-0.7.0 → agentkernel-0.8.1}/src/agentkernel/trace/langfuse/adk.py +0 -0
  223. {agentkernel-0.7.0 → agentkernel-0.8.1}/src/agentkernel/trace/langfuse/crewai.py +0 -0
  224. {agentkernel-0.7.0 → agentkernel-0.8.1}/src/agentkernel/trace/langfuse/langfuse.py +0 -0
  225. {agentkernel-0.7.0 → agentkernel-0.8.1}/src/agentkernel/trace/langfuse/openai.py +0 -0
  226. {agentkernel-0.7.0 → agentkernel-0.8.1}/src/agentkernel/trace/langfuse/pydanticai.py +0 -0
  227. {agentkernel-0.7.0 → agentkernel-0.8.1}/src/agentkernel/trace/langfuse/smolagents.py +0 -0
  228. {agentkernel-0.7.0 → agentkernel-0.8.1}/src/agentkernel/trace/logfire/__init__.py +0 -0
  229. {agentkernel-0.7.0 → agentkernel-0.8.1}/src/agentkernel/trace/logfire/adk.py +0 -0
  230. {agentkernel-0.7.0 → agentkernel-0.8.1}/src/agentkernel/trace/logfire/crewai.py +0 -0
  231. {agentkernel-0.7.0 → agentkernel-0.8.1}/src/agentkernel/trace/logfire/langgraph.py +0 -0
  232. {agentkernel-0.7.0 → agentkernel-0.8.1}/src/agentkernel/trace/logfire/logfire.py +0 -0
  233. {agentkernel-0.7.0 → agentkernel-0.8.1}/src/agentkernel/trace/logfire/openai.py +0 -0
  234. {agentkernel-0.7.0 → agentkernel-0.8.1}/src/agentkernel/trace/logfire/pydanticai.py +0 -0
  235. {agentkernel-0.7.0 → agentkernel-0.8.1}/src/agentkernel/trace/logfire/smolagents.py +0 -0
  236. {agentkernel-0.7.0 → agentkernel-0.8.1}/src/agentkernel/trace/openllmetry/__init__.py +0 -0
  237. {agentkernel-0.7.0 → agentkernel-0.8.1}/src/agentkernel/trace/openllmetry/adk.py +0 -0
  238. {agentkernel-0.7.0 → agentkernel-0.8.1}/src/agentkernel/trace/openllmetry/crewai.py +0 -0
  239. {agentkernel-0.7.0 → agentkernel-0.8.1}/src/agentkernel/trace/openllmetry/langgraph.py +0 -0
  240. {agentkernel-0.7.0 → agentkernel-0.8.1}/src/agentkernel/trace/openllmetry/openai.py +0 -0
  241. {agentkernel-0.7.0 → agentkernel-0.8.1}/src/agentkernel/trace/openllmetry/openllmetry.py +0 -0
  242. {agentkernel-0.7.0 → agentkernel-0.8.1}/src/agentkernel/trace/openllmetry/pydanticai.py +0 -0
  243. {agentkernel-0.7.0 → agentkernel-0.8.1}/src/agentkernel/trace/openllmetry/smolagents.py +0 -0
  244. {agentkernel-0.7.0 → agentkernel-0.8.1}/src/agentkernel/trace/trace.py +0 -0
  245. {agentkernel-0.7.0 → agentkernel-0.8.1}/src/agentkernel/whatsapp.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.3
2
2
  Name: agentkernel
3
- Version: 0.7.0
3
+ Version: 0.8.1
4
4
  Summary: Agent Kernel - Unified AI Agents Runtime
5
5
  Author: Yaala Labs
6
6
  Author-email: Yaala Labs <agentkernel@yaalalabs.com>
@@ -26,6 +26,8 @@ Requires-Dist: chromadb>=0.4.0 ; extra == 'chromadb'
26
26
  Requires-Dist: crewai>=1.15.0 ; extra == 'crewai'
27
27
  Requires-Dist: openinference-instrumentation-crewai>=0.1.16 ; extra == 'crewai'
28
28
  Requires-Dist: openinference-instrumentation-litellm>=0.1.28 ; extra == 'crewai'
29
+ Requires-Dist: daytona>=0.198.0,<0.199 ; extra == 'daytona'
30
+ Requires-Dist: e2b-code-interpreter>=2.8.0 ; extra == 'e2b'
29
31
  Requires-Dist: google-cloud-firestore>=2.19.0 ; extra == 'gcp'
30
32
  Requires-Dist: google-auth>=2.0.0 ; extra == 'gmail'
31
33
  Requires-Dist: google-auth-oauthlib>=1.0.0 ; extra == 'gmail'
@@ -86,6 +88,8 @@ Provides-Extra: azure
86
88
  Provides-Extra: chromadb
87
89
  Provides-Extra: cli
88
90
  Provides-Extra: crewai
91
+ Provides-Extra: daytona
92
+ Provides-Extra: e2b
89
93
  Provides-Extra: gcp
90
94
  Provides-Extra: gmail
91
95
  Provides-Extra: instagram
@@ -126,7 +130,7 @@ Agent Kernel is a lightweight **AI agent runtime** and adapter layer for buildin
126
130
  - **Multi-Framework Support**: OpenAI Agents SDK, CrewAI, LangGraph, Google ADK, Smolagents, and Pydantic AI
127
131
  - **Session Management**: Built-in session abstraction with pluggable storage backends
128
132
  - **Knowledge Bases**: Unified `KnowledgeBase` interface with ChromaDB, Neo4j, and Starburst/Trino backends via `KnowledgeBuilder`
129
- - **Sandbox**: Execute agent-generated code and shell commands in an isolated, permission-bounded environment with pluggable providers (`local_subprocess`, `docker`), workload profiles, policy enforcement, and per-user identity
133
+ - **Sandbox**: Execute agent-generated code and shell commands in an isolated, permission-bounded environment with pluggable providers (`local_subprocess`, `docker`, `e2b`, `daytona`, `ec2_ssm`), workload profiles, policy enforcement, and per-user identity
130
134
  - **Flexible Deployment**: Interactive CLI, REST API, serverless, or containerized deployment — see the "Multi-Cloud Deployment" section below
131
135
  - **Pluggable Architecture**: Easy to extend with custom framework adapters
132
136
  - **MCP Server**: Built-in Model Context Protocol server for exposing agents as MCP tools and exposing any custom tool
@@ -154,10 +158,14 @@ For LLM-based thread naming with Conversation Thread Support:
154
158
  pip install "agentkernel[thread]"
155
159
  ```
156
160
 
157
- For the Docker sandbox provider (the `local_subprocess` provider needs no extra):
161
+ For the sandbox providers (the `local_subprocess` provider needs no extra; `ec2_ssm` rides
162
+ the `aws` extra):
158
163
 
159
164
  ```bash
160
- pip install "agentkernel[sandbox-docker]"
165
+ pip install "agentkernel[sandbox-docker]" # docker provider
166
+ pip install "agentkernel[e2b]" # e2b cloud provider
167
+ pip install "agentkernel[daytona]" # daytona cloud provider
168
+ pip install "agentkernel[aws]" # ec2_ssm provider (boto3)
161
169
  ```
162
170
 
163
171
  **Requirements:**
@@ -1124,9 +1132,15 @@ Key fields:
1124
1132
  - **`enabled`** (`AK_SANDBOX__ENABLED`, default `false`) — master switch; inert when off.
1125
1133
  - **`agents`** — agent names the tools/prompt attach to; omit for all agents.
1126
1134
  - **`type`** (per profile) — `local_subprocess` (no isolation; dev/test), `docker`
1127
- (container isolation; `sandbox-docker` extra), or a dotted path to your own `SandboxProvider`.
1135
+ (container isolation; `sandbox-docker` extra), `e2b` (managed micro-VMs; `e2b` extra),
1136
+ `daytona` (cloud containers; `daytona` extra), `ec2_ssm` (attach to an existing EC2
1137
+ instance via SSM; `aws` extra), or a dotted path to your own `SandboxProvider`.
1128
1138
  - **`scope`** — `per_call` (fresh per execution), `per_session` (persists across turns),
1129
1139
  `per_runtime` (one shared sandbox per profile).
1140
+ - **`environment`** — `managed` (default; the provider creates and disposes sandboxes) or
1141
+ `attached` (deliberately connect to an existing environment the framework never owns,
1142
+ e.g. an EC2 instance via `ec2_ssm`; requires the provider's `attach_to` and is validated
1143
+ against the provider's lifecycle capabilities at startup).
1130
1144
  - **`policy`** — network egress, filesystem paths, cpu/memory, timeout; enforced per provider,
1131
1145
  fail-closed under `strict`.
1132
1146
  - **`identity.mode`** + **`principal_resolver`** — run code under the agent's or the invoking
@@ -11,7 +11,7 @@ Agent Kernel is a lightweight **AI agent runtime** and adapter layer for buildin
11
11
  - **Multi-Framework Support**: OpenAI Agents SDK, CrewAI, LangGraph, Google ADK, Smolagents, and Pydantic AI
12
12
  - **Session Management**: Built-in session abstraction with pluggable storage backends
13
13
  - **Knowledge Bases**: Unified `KnowledgeBase` interface with ChromaDB, Neo4j, and Starburst/Trino backends via `KnowledgeBuilder`
14
- - **Sandbox**: Execute agent-generated code and shell commands in an isolated, permission-bounded environment with pluggable providers (`local_subprocess`, `docker`), workload profiles, policy enforcement, and per-user identity
14
+ - **Sandbox**: Execute agent-generated code and shell commands in an isolated, permission-bounded environment with pluggable providers (`local_subprocess`, `docker`, `e2b`, `daytona`, `ec2_ssm`), workload profiles, policy enforcement, and per-user identity
15
15
  - **Flexible Deployment**: Interactive CLI, REST API, serverless, or containerized deployment — see the "Multi-Cloud Deployment" section below
16
16
  - **Pluggable Architecture**: Easy to extend with custom framework adapters
17
17
  - **MCP Server**: Built-in Model Context Protocol server for exposing agents as MCP tools and exposing any custom tool
@@ -39,10 +39,14 @@ For LLM-based thread naming with Conversation Thread Support:
39
39
  pip install "agentkernel[thread]"
40
40
  ```
41
41
 
42
- For the Docker sandbox provider (the `local_subprocess` provider needs no extra):
42
+ For the sandbox providers (the `local_subprocess` provider needs no extra; `ec2_ssm` rides
43
+ the `aws` extra):
43
44
 
44
45
  ```bash
45
- pip install "agentkernel[sandbox-docker]"
46
+ pip install "agentkernel[sandbox-docker]" # docker provider
47
+ pip install "agentkernel[e2b]" # e2b cloud provider
48
+ pip install "agentkernel[daytona]" # daytona cloud provider
49
+ pip install "agentkernel[aws]" # ec2_ssm provider (boto3)
46
50
  ```
47
51
 
48
52
  **Requirements:**
@@ -1009,9 +1013,15 @@ Key fields:
1009
1013
  - **`enabled`** (`AK_SANDBOX__ENABLED`, default `false`) — master switch; inert when off.
1010
1014
  - **`agents`** — agent names the tools/prompt attach to; omit for all agents.
1011
1015
  - **`type`** (per profile) — `local_subprocess` (no isolation; dev/test), `docker`
1012
- (container isolation; `sandbox-docker` extra), or a dotted path to your own `SandboxProvider`.
1016
+ (container isolation; `sandbox-docker` extra), `e2b` (managed micro-VMs; `e2b` extra),
1017
+ `daytona` (cloud containers; `daytona` extra), `ec2_ssm` (attach to an existing EC2
1018
+ instance via SSM; `aws` extra), or a dotted path to your own `SandboxProvider`.
1013
1019
  - **`scope`** — `per_call` (fresh per execution), `per_session` (persists across turns),
1014
1020
  `per_runtime` (one shared sandbox per profile).
1021
+ - **`environment`** — `managed` (default; the provider creates and disposes sandboxes) or
1022
+ `attached` (deliberately connect to an existing environment the framework never owns,
1023
+ e.g. an EC2 instance via `ec2_ssm`; requires the provider's `attach_to` and is validated
1024
+ against the provider's lifecycle capabilities at startup).
1015
1025
  - **`policy`** — network egress, filesystem paths, cpu/memory, timeout; enforced per provider,
1016
1026
  fail-closed under `strict`.
1017
1027
  - **`identity.mode`** + **`principal_resolver`** — run code under the agent's or the invoking
@@ -4,7 +4,7 @@ build-backend = "uv_build"
4
4
 
5
5
  [project]
6
6
  name = "agentkernel"
7
- version = "0.7.0"
7
+ version = "0.8.1"
8
8
  description = "Agent Kernel - Unified AI Agents Runtime"
9
9
  readme = "README.md"
10
10
  requires-python = ">=3.12,<3.14"
@@ -162,8 +162,14 @@ multimodal = [
162
162
  sandbox-docker = [
163
163
  "docker>=7.0.0",
164
164
  ]
165
- # The e2b, daytona, and kubernetes sandbox extras land with their providers in post-merge
166
- # iterations 9-10 (version floors confirmed against current SDKs at that point).
165
+ e2b = [
166
+ "e2b-code-interpreter>=2.8.0",
167
+ ]
168
+ daytona = [
169
+ # <0.199: from 0.199 the daytona api clients require pydantic>=2.13.4, which conflicts
170
+ # with crewai's pydantic<2.13 pin; 0.198 accepts pydantic>=2.11 and has the same SDK surface.
171
+ "daytona>=0.198.0,<0.199",
172
+ ]
167
173
 
168
174
  [project.scripts]
169
175
  ak = "agentkernel.cli.ak:main"
@@ -1,9 +1,9 @@
1
1
  import asyncio
2
2
  import logging
3
3
  import readline # Enables line editing and history features for input() in the CLI
4
+ import threading
4
5
 
5
6
  from ..core import AgentService
6
- from ..core.config import AKConfig
7
7
 
8
8
  ak_cli_logger = logging.getLogger("ak.cli")
9
9
 
@@ -47,6 +47,32 @@ class CLI:
47
47
  self._print(f" {agent.name}")
48
48
  self._print()
49
49
 
50
+ @staticmethod
51
+ async def _ainput(prompt: str) -> str:
52
+ """
53
+ Reads a line of input without blocking the event loop, so background tasks keep running between turns.
54
+ The reader is a daemon thread, so Ctrl+C exits instead of waiting on a thread parked in `input()`.
55
+ :param prompt: The prompt to display to the user.
56
+ :return: The line entered by the user.
57
+ """
58
+ loop = asyncio.get_running_loop()
59
+ future: asyncio.Future[str] = loop.create_future()
60
+
61
+ def resolve(setter, value):
62
+ if not future.done():
63
+ setter(value)
64
+
65
+ def read():
66
+ try:
67
+ line = input(prompt)
68
+ except BaseException as e: # noqa: BLE001 - relayed to the awaiting caller
69
+ loop.call_soon_threadsafe(resolve, future.set_exception, e)
70
+ else:
71
+ loop.call_soon_threadsafe(resolve, future.set_result, line)
72
+
73
+ threading.Thread(target=read, daemon=True, name="ak-cli-input").start()
74
+ return await future
75
+
50
76
  async def run(self):
51
77
  self._print("AgentKernel CLI (type !help for commands or !quit to exit):")
52
78
  self._service.select()
@@ -57,7 +83,7 @@ class CLI:
57
83
  while True:
58
84
  try:
59
85
  name = self._service.agent.name if self._service.agent else "none"
60
- prompt = input(f"({name}) >> ")
86
+ prompt = await self._ainput(f"({name}) >> ")
61
87
  if not prompt.strip():
62
88
  continue
63
89
  if prompt.startswith("!"):
@@ -1,8 +1,10 @@
1
1
  import asyncio
2
2
  import contextvars
3
+ import copy
3
4
  import logging
5
+ import pickle
4
6
  from abc import ABC, abstractmethod
5
- from collections.abc import AsyncGenerator, Iterator
7
+ from collections.abc import AsyncGenerator, Iterator, Mapping
6
8
  from enum import Enum
7
9
  from typing import Any, ClassVar, Self, cast
8
10
 
@@ -10,6 +12,8 @@ from .hooks import PostHook, PreHook
10
12
  from .model import AgentReply, AgentRequest
11
13
  from .util.key_value_cache import KeyValueCache
12
14
 
15
+ _log = logging.getLogger("ak.core.runner")
16
+
13
17
 
14
18
  class Session:
15
19
  """
@@ -39,6 +43,7 @@ class Session:
39
43
 
40
44
  VOLATILE_CACHE = "v_cache"
41
45
  NON_VOLATILE_CACHE = "nv_cache"
46
+ FRAMEWORK_CONTEXT = "framework_context"
42
47
 
43
48
  current_session: ClassVar[contextvars.ContextVar[Self | None]] = contextvars.ContextVar("current_session", default=None)
44
49
 
@@ -157,6 +162,35 @@ class Session:
157
162
  """
158
163
  return cast(KeyValueCache, self.get(Session.Keys.NON_VOLATILE_CACHE.value))
159
164
 
165
+ def get_framework_context(self) -> dict | None:
166
+ """
167
+ Returns the live per-run framework context dict, so hooks can edit it in place.
168
+ Never auto-creates the key: absent means "nothing injected", {} means "injected but empty".
169
+ :return: The stored framework context dict, or None when the key is absent.
170
+ """
171
+ return self.get(Session.Keys.FRAMEWORK_CONTEXT.value)
172
+
173
+ def set_framework_context(self, context: dict) -> dict:
174
+ """
175
+ Seeds or replaces the per-run framework context carried across turns.
176
+ :param context: The context dict to store. Must be picklable, since sessions are persisted with pickle.
177
+ :return: The stored context dict.
178
+ :raises TypeError: If context is not a dict.
179
+ """
180
+ if not isinstance(context, dict):
181
+ raise TypeError(
182
+ f"Session '{self._id}' framework_context must be a dict, got "
183
+ f"{type(context).__name__}. The reserved framework_context key carries a "
184
+ f"per-run context/state dict; wrap the value in a dict before setting it."
185
+ )
186
+ return self.set(Session.Keys.FRAMEWORK_CONTEXT.value, context)
187
+
188
+ def clear_framework_context(self) -> None:
189
+ """
190
+ Deletes the per-run framework context, so nothing is injected on the next turn.
191
+ """
192
+ self.delete(Session.Keys.FRAMEWORK_CONTEXT.value)
193
+
160
194
  def set(self, key: str, value: Any) -> Any:
161
195
  """
162
196
  Sets a session data object for the specified key.
@@ -220,6 +254,92 @@ class Runner(ABC):
220
254
  """
221
255
  return self._name
222
256
 
257
+ def _load_framework_context(self, session: Session | None) -> dict | None:
258
+ """
259
+ Loads the per-run framework context to inject into this run.
260
+ Returns a deep copy, so a failed run leaves the stored context intact.
261
+ :param session: The session to read the framework context from, or None.
262
+ :return: A deep copy of the stored dict, or None when nothing is stored.
263
+ :raises TypeError: If the stored value is not a dict.
264
+ """
265
+ if session is None:
266
+ return None
267
+ stored = session.get_framework_context()
268
+ if stored is None:
269
+ return None
270
+ if not isinstance(stored, dict):
271
+ raise TypeError(
272
+ f"Session '{session.id}' framework_context must be a dict, got "
273
+ f"{type(stored).__name__}. The reserved framework_context key carries a "
274
+ f"per-run context/state dict; wrap the value in a dict before setting it."
275
+ )
276
+ return copy.deepcopy(stored)
277
+
278
+ def _store_framework_context(self, session: Session | None, incoming: dict | None, produced: Mapping[str, Any] | None) -> None:
279
+ """
280
+ Merges the framework's post-run state over the context loaded this turn and stores the result.
281
+ Keys the framework touched win; untouched caller keys are preserved. No-op when nothing was loaded.
282
+ :param session: The session to write the merged context back to, or None.
283
+ :param incoming: The context loaded this turn, or None when nothing was stored.
284
+ :param produced: The framework's post-run state, or None.
285
+ """
286
+ if session is None or incoming is None:
287
+ return
288
+ merged = dict(incoming)
289
+ if produced:
290
+ merged.update(produced)
291
+ self._ensure_framework_context_picklable(session, merged)
292
+ session.set_framework_context(merged)
293
+
294
+ @staticmethod
295
+ def _not_picklable(value: Any) -> bool:
296
+ """
297
+ Checks whether the given value can be pickled.
298
+ :param value: The value to test.
299
+ :return: True if the value cannot be pickled.
300
+ """
301
+ try:
302
+ pickle.dumps(value)
303
+ return False
304
+ except Exception:
305
+ return True
306
+
307
+ @classmethod
308
+ def _ensure_framework_context_picklable(cls, session: Session, ctx: Mapping[str, Any]) -> None:
309
+ """
310
+ Fails fast if the context cannot be pickled, before it can break the session store.
311
+ :param session: The session whose id is named in the error.
312
+ :param ctx: The framework context to validate.
313
+ :raises TypeError: If any value in ctx is not pickle-serializable.
314
+ """
315
+ try:
316
+ pickle.dumps(ctx)
317
+ except Exception as exc:
318
+ offender = next(
319
+ (f"{k!r} ({type(v).__name__})" for k, v in ctx.items() if cls._not_picklable(v)),
320
+ "<unknown key>",
321
+ )
322
+ raise TypeError(
323
+ f"Session '{session.id}' framework_context is not picklable; "
324
+ f"offending entry: {offender}. framework_context values must be "
325
+ f"pickle-serializable so the session can be persisted."
326
+ ) from exc
327
+
328
+ @staticmethod
329
+ def _log_framework_context_stream_failure(session: Session | None, error: Exception) -> None:
330
+ """
331
+ Logs a framework context write-back failure at the end of a streamed run instead of raising it.
332
+ Raising here would surface as a transport error and skip the turn's session store.
333
+ :param session: The session whose write-back failed.
334
+ :param error: The exception raised while producing or storing the context.
335
+ """
336
+ session_id = session.id if session is not None else "<none>"
337
+ _log.error(
338
+ f"Session '{session_id}': framework_context write-back was skipped at the end of a "
339
+ f"streamed run; the previously stored context is left intact. Error: {error}",
340
+ exc_info=error,
341
+ )
342
+
223
343
  @abstractmethod
224
344
  async def run(self, agent: Any, session: Session, requests: list[AgentRequest]) -> AgentReply:
225
345
  """
@@ -351,3 +471,16 @@ class Agent(ABC):
351
471
 
352
472
  for tool in SystemToolFactory.get_all(self.name):
353
473
  self.attach_tool(tool.func)
474
+
475
+ @staticmethod
476
+ def _append_tools(agent: Any, wrapped: list[Any]) -> None:
477
+ """
478
+ Appends already-wrapped tools to a framework agent's list-based `tools` attribute, skipping duplicates.
479
+ :param agent: The framework-native agent holding the `tools` attribute.
480
+ :param wrapped: The wrapped tools to attach.
481
+ """
482
+ for w in wrapped:
483
+ if not hasattr(agent, "tools") or agent.tools is None:
484
+ agent.tools = []
485
+ if w not in agent.tools:
486
+ agent.tools.append(w)
@@ -427,6 +427,22 @@ class _SandboxE2BConfig(BaseModel):
427
427
  class _SandboxDaytonaConfig(BaseModel):
428
428
  api_key_env: str = Field(default="DAYTONA_API_KEY", description="Name of the environment variable holding the Daytona API key")
429
429
  target: Optional[str] = Field(default=None, description="Daytona target/region; None uses the SDK default")
430
+ image: Optional[str] = Field(
431
+ default=None,
432
+ description="Container image for the sandbox (e.g. 'python:3.12-slim' or a registry image). Mutually exclusive with 'snapshot'; when neither is set Daytona uses its default snapshot.",
433
+ )
434
+ snapshot: Optional[str] = Field(
435
+ default=None,
436
+ description="Named Daytona snapshot to launch from. Mutually exclusive with 'image'; when neither is set Daytona uses its default snapshot.",
437
+ )
438
+ env_vars: dict[str, str] = Field(default_factory=dict, description="Environment variables set inside the sandbox")
439
+
440
+ @model_validator(mode="after")
441
+ def _image_snapshot_exclusive(self) -> "_SandboxDaytonaConfig":
442
+ """A sandbox launches from exactly one base — reject configuring both."""
443
+ if self.image and self.snapshot:
444
+ raise ValueError("daytona config sets both 'image' and 'snapshot'; they are mutually exclusive — pick one")
445
+ return self
430
446
 
431
447
 
432
448
  class _SandboxBedrockAgentCoreConfig(BaseModel):
@@ -446,10 +462,10 @@ class _SandboxEC2SSMConfig(BaseModel):
446
462
  attach_to: Optional[str] = Field(default=None, description="EC2 instance id to run commands against via SSM (attach-only)")
447
463
 
448
464
 
449
- class _SandboxBrokerConfig(BaseModel):
465
+ class _ExecutionBrokerConfig(BaseModel):
450
466
  flavor: str = Field(
451
467
  default="thread",
452
- description="Broker flavor: 'embedded' | 'thread' (in-process, available now) | a dotted path to a SandboxBroker subclass. The AWS 'sqs' flavor is planned in a later iteration.",
468
+ description="Broker flavor: 'embedded' | 'thread' (in-process, available now) | a dotted path to an ExecutionBroker subclass. The AWS 'sqs' flavor is planned in a later iteration.",
453
469
  )
454
470
  wait_timeout: float = Field(default=60.0, description="Max seconds a synchronous wait blocks before promotion to a task (0 = always promote)")
455
471
  inline_payload_max_bytes: int = Field(
@@ -478,6 +494,12 @@ class _SandboxProfileConfig(BaseModel):
478
494
  pattern="^(per_call|per_session|per_runtime)$",
479
495
  description="Sandbox lifetime: 'per_call' (new per execution), 'per_session' (per AK session), or 'per_runtime' (shared)",
480
496
  )
497
+ environment: str = Field(
498
+ default="managed",
499
+ pattern="^(managed|attached)$",
500
+ description="Environment lifecycle: 'managed' (the provider creates and disposes sandboxes) or 'attached' "
501
+ "(deliberately connect to an existing environment the framework never owns; requires the provider's attach_to)",
502
+ )
481
503
  idle_timeout: int = Field(default=1800, description="Seconds of inactivity before a sandbox session is closed on next touch")
482
504
  identity: _SandboxIdentityConfig = Field(default_factory=_SandboxIdentityConfig, description="Execution identity configuration")
483
505
  policy: _SandboxPolicyConfig = Field(
@@ -508,7 +530,7 @@ class _SandboxConfig(BaseModel):
508
530
  default=None, description="Dotted path to a PrincipalResolver mapping the session/agent to a SandboxPrincipal"
509
531
  )
510
532
  tool_output_max_chars: int = Field(default=8000, description="Maximum characters of tool output returned to the agent before truncation")
511
- broker: _SandboxBrokerConfig = Field(default_factory=_SandboxBrokerConfig, description="Sandbox broker configuration")
533
+ broker: _ExecutionBrokerConfig = Field(default_factory=_ExecutionBrokerConfig, description="Sandbox broker configuration")
512
534
  profiles: dict[str, _SandboxProfileConfig] = Field(
513
535
  default_factory=dict, description="Named workload profiles, each selecting a provider and its policy/identity"
514
536
  )
@@ -522,6 +544,11 @@ class _SandboxConfig(BaseModel):
522
544
  pattern="^(per_call|per_session|per_runtime)$",
523
545
  description="Single-backend sugar: scope for the synthesized default profile",
524
546
  )
547
+ environment: Optional[str] = Field(
548
+ default=None,
549
+ pattern="^(managed|attached)$",
550
+ description="Single-backend sugar: environment lifecycle for the synthesized default profile",
551
+ )
525
552
  local_subprocess: Optional[_SandboxLocalSubprocessConfig] = Field(
526
553
  default=None, description="Single-backend sugar: 'local_subprocess' provider configuration"
527
554
  )
@@ -554,6 +581,8 @@ class _SandboxConfig(BaseModel):
554
581
  }
555
582
  if self.scope is not None:
556
583
  profile_kwargs["scope"] = self.scope
584
+ if self.environment is not None:
585
+ profile_kwargs["environment"] = self.environment
557
586
  self.profiles = {self.default_profile: _SandboxProfileConfig(**profile_kwargs)}
558
587
  return self
559
588
 
@@ -41,6 +41,8 @@ class AzureFunctions:
41
41
 
42
42
  if isinstance(body, dict) and body.get("body") is not None:
43
43
  body = BaseRunRequest.model_validate(body["body"])
44
+ elif isinstance(body, dict) and body:
45
+ body = BaseRunRequest.model_validate(body)
44
46
  else:
45
47
  raise ValueError("Invalid request, request body cannot be empty or null")
46
48