agentkernel 0.9.0__tar.gz → 0.9.2__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 (333) hide show
  1. {agentkernel-0.9.0 → agentkernel-0.9.2}/PKG-INFO +10 -6
  2. {agentkernel-0.9.0 → agentkernel-0.9.2}/README.md +6 -4
  3. {agentkernel-0.9.0 → agentkernel-0.9.2}/pyproject.toml +5 -2
  4. {agentkernel-0.9.0 → agentkernel-0.9.2}/src/agentkernel/api/handler.py +2 -0
  5. {agentkernel-0.9.0 → agentkernel-0.9.2}/src/agentkernel/api/http.py +20 -0
  6. {agentkernel-0.9.0 → agentkernel-0.9.2}/src/agentkernel/core/__init__.py +1 -1
  7. {agentkernel-0.9.0 → agentkernel-0.9.2}/src/agentkernel/core/chat_service.py +48 -40
  8. {agentkernel-0.9.0 → agentkernel-0.9.2}/src/agentkernel/core/config.py +28 -0
  9. {agentkernel-0.9.0 → agentkernel-0.9.2}/src/agentkernel/core/hooks.py +47 -7
  10. {agentkernel-0.9.0 → agentkernel-0.9.2}/src/agentkernel/core/model.py +15 -2
  11. {agentkernel-0.9.0 → agentkernel-0.9.2}/src/agentkernel/core/multimodal/storage/__init__.py +10 -8
  12. {agentkernel-0.9.0 → agentkernel-0.9.2}/src/agentkernel/core/multimodal/storage/base.py +78 -69
  13. {agentkernel-0.9.0 → agentkernel-0.9.2}/src/agentkernel/core/multimodal/storage/dynamodb.py +3 -0
  14. {agentkernel-0.9.0 → agentkernel-0.9.2}/src/agentkernel/core/multimodal/storage/redis.py +3 -0
  15. agentkernel-0.9.2/src/agentkernel/core/multimodal/storage/storage_manager.py +307 -0
  16. {agentkernel-0.9.0 → agentkernel-0.9.2}/src/agentkernel/core/runtime.py +106 -22
  17. agentkernel-0.9.2/src/agentkernel/core/util/async_bridge.py +150 -0
  18. {agentkernel-0.9.0 → agentkernel-0.9.2}/src/agentkernel/deployment/aws/containerized/ecs_io_handler.py +13 -3
  19. agentkernel-0.9.2/src/agentkernel/integration/adapter/__init__.py +46 -0
  20. agentkernel-0.9.2/src/agentkernel/integration/adapter/base.py +218 -0
  21. agentkernel-0.9.2/src/agentkernel/integration/adapter/factory.py +99 -0
  22. agentkernel-0.9.2/src/agentkernel/integration/adapter/meta.py +142 -0
  23. agentkernel-0.9.2/src/agentkernel/integration/adapter/poller.py +105 -0
  24. agentkernel-0.9.2/src/agentkernel/integration/adapter/producer.py +100 -0
  25. agentkernel-0.9.2/src/agentkernel/integration/adapter/testing.py +157 -0
  26. agentkernel-0.9.2/src/agentkernel/integration/adapter/webhook.py +82 -0
  27. {agentkernel-0.9.0 → agentkernel-0.9.2}/src/agentkernel/integration/gmail/README.md +307 -307
  28. {agentkernel-0.9.0 → agentkernel-0.9.2}/src/agentkernel/integration/gmail/__init__.py +10 -10
  29. agentkernel-0.9.2/src/agentkernel/integration/gmail/adapter.py +497 -0
  30. {agentkernel-0.9.0 → agentkernel-0.9.2}/src/agentkernel/integration/instagram/README.md +5 -5
  31. {agentkernel-0.9.0 → agentkernel-0.9.2}/src/agentkernel/integration/instagram/__init__.py +1 -1
  32. agentkernel-0.9.2/src/agentkernel/integration/instagram/adapter.py +190 -0
  33. {agentkernel-0.9.0 → agentkernel-0.9.2}/src/agentkernel/integration/messenger/README.md +7 -7
  34. {agentkernel-0.9.0 → agentkernel-0.9.2}/src/agentkernel/integration/messenger/__init__.py +1 -1
  35. agentkernel-0.9.2/src/agentkernel/integration/messenger/adapter.py +183 -0
  36. {agentkernel-0.9.0 → agentkernel-0.9.2}/src/agentkernel/integration/slack/README.md +9 -8
  37. {agentkernel-0.9.0 → agentkernel-0.9.2}/src/agentkernel/integration/slack/__init__.py +1 -1
  38. agentkernel-0.9.2/src/agentkernel/integration/slack/adapter.py +285 -0
  39. {agentkernel-0.9.0 → agentkernel-0.9.2}/src/agentkernel/integration/teams/README.md +1 -1
  40. {agentkernel-0.9.0 → agentkernel-0.9.2}/src/agentkernel/integration/teams/__init__.py +1 -1
  41. agentkernel-0.9.0/src/agentkernel/integration/teams/teams_chat.py → agentkernel-0.9.2/src/agentkernel/integration/teams/adapter.py +246 -268
  42. {agentkernel-0.9.0 → agentkernel-0.9.2}/src/agentkernel/integration/telegram/README.md +241 -241
  43. {agentkernel-0.9.0 → agentkernel-0.9.2}/src/agentkernel/integration/telegram/__init__.py +10 -10
  44. agentkernel-0.9.2/src/agentkernel/integration/telegram/adapter.py +309 -0
  45. {agentkernel-0.9.0 → agentkernel-0.9.2}/src/agentkernel/integration/thread/__init__.py +4 -3
  46. {agentkernel-0.9.0 → agentkernel-0.9.2}/src/agentkernel/integration/thread/manager.py +17 -44
  47. {agentkernel-0.9.0 → agentkernel-0.9.2}/src/agentkernel/integration/thread/thread_chat.py +104 -4
  48. {agentkernel-0.9.0 → agentkernel-0.9.2}/src/agentkernel/integration/whatsapp/README.md +9 -9
  49. {agentkernel-0.9.0 → agentkernel-0.9.2}/src/agentkernel/integration/whatsapp/__init__.py +1 -1
  50. agentkernel-0.9.2/src/agentkernel/integration/whatsapp/adapter.py +287 -0
  51. {agentkernel-0.9.0 → agentkernel-0.9.2}/src/agentkernel/pipeline/__init__.py +2 -0
  52. {agentkernel-0.9.0 → agentkernel-0.9.2}/src/agentkernel/pipeline/agent_runner.py +81 -6
  53. {agentkernel-0.9.0 → agentkernel-0.9.2}/src/agentkernel/pipeline/envelope.py +3 -0
  54. {agentkernel-0.9.0 → agentkernel-0.9.2}/src/agentkernel/pipeline/io_handler.py +63 -8
  55. agentkernel-0.9.2/src/agentkernel/pipeline/producer.py +50 -0
  56. {agentkernel-0.9.0 → agentkernel-0.9.2}/src/agentkernel/pipeline/request_handler.py +35 -18
  57. {agentkernel-0.9.0 → agentkernel-0.9.2}/src/agentkernel/pipeline/response_handler.py +64 -3
  58. {agentkernel-0.9.0 → agentkernel-0.9.2}/src/agentkernel/skills/ak-add-capabilities/SKILL.md +35 -31
  59. {agentkernel-0.9.0 → agentkernel-0.9.2}/src/agentkernel/skills/ak-add-capabilities/evals/evals.json +1 -1
  60. {agentkernel-0.9.0 → agentkernel-0.9.2}/src/agentkernel/skills/ak-add-integration/SKILL.md +48 -38
  61. {agentkernel-0.9.0 → agentkernel-0.9.2}/src/agentkernel/skills/ak-add-integration/evals/evals.json +40 -22
  62. {agentkernel-0.9.0 → agentkernel-0.9.2}/src/agentkernel/skills/ak-build/SKILL.md +1 -1
  63. {agentkernel-0.9.0 → agentkernel-0.9.2}/src/agentkernel/skills/ak-build/evals/evals.json +1 -1
  64. {agentkernel-0.9.0 → agentkernel-0.9.2}/src/agentkernel/skills/ak-cloud-deploy/SKILL.md +50 -76
  65. {agentkernel-0.9.0 → agentkernel-0.9.2}/src/agentkernel/skills/ak-cloud-deploy/evals/evals.json +2 -1
  66. {agentkernel-0.9.0 → agentkernel-0.9.2}/src/agentkernel/skills/ak-init/SKILL.md +2 -2
  67. {agentkernel-0.9.0 → agentkernel-0.9.2}/src/agentkernel/skills/ak-init/evals/evals.json +2 -2
  68. {agentkernel-0.9.0 → agentkernel-0.9.2}/src/agentkernel/skills/ak-test/SKILL.md +86 -11
  69. {agentkernel-0.9.0 → agentkernel-0.9.2}/src/agentkernel/skills/ak-test/evals/evals.json +3 -3
  70. {agentkernel-0.9.0 → agentkernel-0.9.2}/src/agentkernel/test/config.py +1 -1
  71. {agentkernel-0.9.0/src/agentkernel/test/core/akevaluators → agentkernel-0.9.2/src/agentkernel/test/core/evaluator}/base.py +2 -2
  72. {agentkernel-0.9.0/src/agentkernel/test/core/akevaluators → agentkernel-0.9.2/src/agentkernel/test/core/evaluator}/deepeval.py +4 -4
  73. agentkernel-0.9.2/src/agentkernel/test/core/evaluator/opik.py +92 -0
  74. {agentkernel-0.9.0 → agentkernel-0.9.2}/src/agentkernel/test/test.py +14 -10
  75. agentkernel-0.9.0/src/agentkernel/core/multimodal/storage/storage_manager.py +0 -172
  76. agentkernel-0.9.0/src/agentkernel/integration/gmail/gmail_chat.py +0 -625
  77. agentkernel-0.9.0/src/agentkernel/integration/instagram/instagram_chat.py +0 -410
  78. agentkernel-0.9.0/src/agentkernel/integration/messenger/messenger_chat.py +0 -396
  79. agentkernel-0.9.0/src/agentkernel/integration/slack/slack_chat.py +0 -317
  80. agentkernel-0.9.0/src/agentkernel/integration/telegram/telegram_chat.py +0 -499
  81. agentkernel-0.9.0/src/agentkernel/integration/whatsapp/whatsapp_chat.py +0 -447
  82. {agentkernel-0.9.0 → agentkernel-0.9.2}/src/agentkernel/__init__.py +0 -0
  83. {agentkernel-0.9.0 → agentkernel-0.9.2}/src/agentkernel/adk.py +0 -0
  84. {agentkernel-0.9.0 → agentkernel-0.9.2}/src/agentkernel/agui.py +0 -0
  85. {agentkernel-0.9.0 → agentkernel-0.9.2}/src/agentkernel/api/__init__.py +0 -0
  86. {agentkernel-0.9.0 → agentkernel-0.9.2}/src/agentkernel/api/a2a/__init__.py +0 -0
  87. {agentkernel-0.9.0 → agentkernel-0.9.2}/src/agentkernel/api/a2a/a2a.py +0 -0
  88. {agentkernel-0.9.0 → agentkernel-0.9.2}/src/agentkernel/api/a2a/handler.py +0 -0
  89. {agentkernel-0.9.0 → agentkernel-0.9.2}/src/agentkernel/api/mcp/__init__.py +0 -0
  90. {agentkernel-0.9.0 → agentkernel-0.9.2}/src/agentkernel/api/mcp/akmcp.py +0 -0
  91. {agentkernel-0.9.0 → agentkernel-0.9.2}/src/agentkernel/auth/__init__.py +0 -0
  92. {agentkernel-0.9.0 → agentkernel-0.9.2}/src/agentkernel/auth/authoriser.py +0 -0
  93. {agentkernel-0.9.0 → agentkernel-0.9.2}/src/agentkernel/auth/handler.py +0 -0
  94. {agentkernel-0.9.0 → agentkernel-0.9.2}/src/agentkernel/auth.py +0 -0
  95. {agentkernel-0.9.0 → agentkernel-0.9.2}/src/agentkernel/aws.py +0 -0
  96. {agentkernel-0.9.0 → agentkernel-0.9.2}/src/agentkernel/azure.py +0 -0
  97. {agentkernel-0.9.0 → agentkernel-0.9.2}/src/agentkernel/cli/__init__.py +0 -0
  98. {agentkernel-0.9.0 → agentkernel-0.9.2}/src/agentkernel/cli/ak.py +0 -0
  99. {agentkernel-0.9.0 → agentkernel-0.9.2}/src/agentkernel/cli/cli.py +0 -0
  100. {agentkernel-0.9.0 → agentkernel-0.9.2}/src/agentkernel/core/base.py +0 -0
  101. {agentkernel-0.9.0 → agentkernel-0.9.2}/src/agentkernel/core/builder.py +0 -0
  102. {agentkernel-0.9.0 → agentkernel-0.9.2}/src/agentkernel/core/event.py +0 -0
  103. {agentkernel-0.9.0 → agentkernel-0.9.2}/src/agentkernel/core/logger.py +0 -0
  104. {agentkernel-0.9.0 → agentkernel-0.9.2}/src/agentkernel/core/module.py +0 -0
  105. {agentkernel-0.9.0 → agentkernel-0.9.2}/src/agentkernel/core/multimodal/__init__.py +0 -0
  106. {agentkernel-0.9.0 → agentkernel-0.9.2}/src/agentkernel/core/multimodal/factory.py +0 -0
  107. {agentkernel-0.9.0 → agentkernel-0.9.2}/src/agentkernel/core/multimodal/hooks.py +0 -0
  108. {agentkernel-0.9.0 → agentkernel-0.9.2}/src/agentkernel/core/multimodal/source.py +0 -0
  109. {agentkernel-0.9.0 → agentkernel-0.9.2}/src/agentkernel/core/multimodal/storage/in_memory.py +0 -0
  110. {agentkernel-0.9.0 → agentkernel-0.9.2}/src/agentkernel/core/multimodal/storage/session_cache.py +0 -0
  111. {agentkernel-0.9.0 → agentkernel-0.9.2}/src/agentkernel/core/multimodal/tools.py +0 -0
  112. {agentkernel-0.9.0 → agentkernel-0.9.2}/src/agentkernel/core/service.py +0 -0
  113. {agentkernel-0.9.0 → agentkernel-0.9.2}/src/agentkernel/core/session/__init__.py +0 -0
  114. {agentkernel-0.9.0 → agentkernel-0.9.2}/src/agentkernel/core/session/base.py +0 -0
  115. {agentkernel-0.9.0 → agentkernel-0.9.2}/src/agentkernel/core/session/cosmosdb.py +0 -0
  116. {agentkernel-0.9.0 → agentkernel-0.9.2}/src/agentkernel/core/session/dynamodb.py +0 -0
  117. {agentkernel-0.9.0 → agentkernel-0.9.2}/src/agentkernel/core/session/firestore.py +0 -0
  118. {agentkernel-0.9.0 → agentkernel-0.9.2}/src/agentkernel/core/session/in_memory.py +0 -0
  119. {agentkernel-0.9.0 → agentkernel-0.9.2}/src/agentkernel/core/session/redis.py +0 -0
  120. {agentkernel-0.9.0 → agentkernel-0.9.2}/src/agentkernel/core/session/redis_like.py +0 -0
  121. {agentkernel-0.9.0 → agentkernel-0.9.2}/src/agentkernel/core/session/serde.py +0 -0
  122. {agentkernel-0.9.0 → agentkernel-0.9.2}/src/agentkernel/core/session/valkey.py +0 -0
  123. {agentkernel-0.9.0 → agentkernel-0.9.2}/src/agentkernel/core/tool.py +0 -0
  124. {agentkernel-0.9.0 → agentkernel-0.9.2}/src/agentkernel/core/util/config_yaml_util.py +0 -0
  125. {agentkernel-0.9.0 → agentkernel-0.9.2}/src/agentkernel/core/util/driver/__init__.py +0 -0
  126. {agentkernel-0.9.0 → agentkernel-0.9.2}/src/agentkernel/core/util/driver/base.py +0 -0
  127. {agentkernel-0.9.0 → agentkernel-0.9.2}/src/agentkernel/core/util/driver/cosmosdb.py +0 -0
  128. {agentkernel-0.9.0 → agentkernel-0.9.2}/src/agentkernel/core/util/driver/dynamodb.py +0 -0
  129. {agentkernel-0.9.0 → agentkernel-0.9.2}/src/agentkernel/core/util/driver/firestore.py +0 -0
  130. {agentkernel-0.9.0 → agentkernel-0.9.2}/src/agentkernel/core/util/driver/redis.py +0 -0
  131. {agentkernel-0.9.0 → agentkernel-0.9.2}/src/agentkernel/core/util/driver/redis_like.py +0 -0
  132. {agentkernel-0.9.0 → agentkernel-0.9.2}/src/agentkernel/core/util/driver/valkey.py +0 -0
  133. {agentkernel-0.9.0 → agentkernel-0.9.2}/src/agentkernel/core/util/error_util.py +0 -0
  134. {agentkernel-0.9.0 → agentkernel-0.9.2}/src/agentkernel/core/util/factory.py +0 -0
  135. {agentkernel-0.9.0 → agentkernel-0.9.2}/src/agentkernel/core/util/key_value_cache.py +0 -0
  136. {agentkernel-0.9.0 → agentkernel-0.9.2}/src/agentkernel/core/util/pagination.py +0 -0
  137. {agentkernel-0.9.0 → agentkernel-0.9.2}/src/agentkernel/crewai.py +0 -0
  138. {agentkernel-0.9.0 → agentkernel-0.9.2}/src/agentkernel/deployment/__init__.py +0 -0
  139. {agentkernel-0.9.0 → agentkernel-0.9.2}/src/agentkernel/deployment/aws/__init__.py +0 -0
  140. {agentkernel-0.9.0 → agentkernel-0.9.2}/src/agentkernel/deployment/aws/containerized/__init__.py +0 -0
  141. {agentkernel-0.9.0 → agentkernel-0.9.2}/src/agentkernel/deployment/aws/containerized/akagentrunner.py +0 -0
  142. {agentkernel-0.9.0 → agentkernel-0.9.2}/src/agentkernel/deployment/aws/containerized/akoutputconsumer.py +0 -0
  143. {agentkernel-0.9.0 → agentkernel-0.9.2}/src/agentkernel/deployment/aws/containerized/core/__init__.py +0 -0
  144. {agentkernel-0.9.0 → agentkernel-0.9.2}/src/agentkernel/deployment/aws/containerized/core/api/__init__.py +0 -0
  145. {agentkernel-0.9.0 → agentkernel-0.9.2}/src/agentkernel/deployment/aws/containerized/core/api/rest_api.py +0 -0
  146. {agentkernel-0.9.0 → agentkernel-0.9.2}/src/agentkernel/deployment/aws/containerized/core/api/websocket_api.py +0 -0
  147. {agentkernel-0.9.0 → agentkernel-0.9.2}/src/agentkernel/deployment/aws/containerized/core/sqs_consumer.py +0 -0
  148. {agentkernel-0.9.0 → agentkernel-0.9.2}/src/agentkernel/deployment/aws/core/__init__.py +0 -0
  149. {agentkernel-0.9.0 → agentkernel-0.9.2}/src/agentkernel/deployment/aws/core/raw_queue_consumer.py +0 -0
  150. {agentkernel-0.9.0 → agentkernel-0.9.2}/src/agentkernel/deployment/aws/core/response_store/__init__.py +0 -0
  151. {agentkernel-0.9.0 → agentkernel-0.9.2}/src/agentkernel/deployment/aws/core/response_store/dynamodb.py +0 -0
  152. {agentkernel-0.9.0 → agentkernel-0.9.2}/src/agentkernel/deployment/aws/core/response_store/factory.py +0 -0
  153. {agentkernel-0.9.0 → agentkernel-0.9.2}/src/agentkernel/deployment/aws/core/response_store/redis.py +0 -0
  154. {agentkernel-0.9.0 → agentkernel-0.9.2}/src/agentkernel/deployment/aws/core/response_store/valkey.py +0 -0
  155. {agentkernel-0.9.0 → agentkernel-0.9.2}/src/agentkernel/deployment/aws/core/sqs_handler.py +0 -0
  156. {agentkernel-0.9.0 → agentkernel-0.9.2}/src/agentkernel/deployment/aws/core/websocket_service.py +0 -0
  157. {agentkernel-0.9.0 → agentkernel-0.9.2}/src/agentkernel/deployment/aws/serverless/__init__.py +0 -0
  158. {agentkernel-0.9.0 → agentkernel-0.9.2}/src/agentkernel/deployment/aws/serverless/akagentrunner.py +0 -0
  159. {agentkernel-0.9.0 → agentkernel-0.9.2}/src/agentkernel/deployment/aws/serverless/akauthorizer.py +0 -0
  160. {agentkernel-0.9.0 → agentkernel-0.9.2}/src/agentkernel/deployment/aws/serverless/aklambda.py +0 -0
  161. {agentkernel-0.9.0 → agentkernel-0.9.2}/src/agentkernel/deployment/aws/serverless/akresponsehandler.py +0 -0
  162. {agentkernel-0.9.0 → agentkernel-0.9.2}/src/agentkernel/deployment/aws/serverless/akwsconnectionhandler.py +0 -0
  163. {agentkernel-0.9.0 → agentkernel-0.9.2}/src/agentkernel/deployment/aws/serverless/core/__init__.py +0 -0
  164. {agentkernel-0.9.0 → agentkernel-0.9.2}/src/agentkernel/deployment/aws/serverless/core/router/__init__.py +0 -0
  165. {agentkernel-0.9.0 → agentkernel-0.9.2}/src/agentkernel/deployment/aws/serverless/core/router/common.py +0 -0
  166. {agentkernel-0.9.0 → agentkernel-0.9.2}/src/agentkernel/deployment/aws/serverless/core/router/rest_lambda.py +0 -0
  167. {agentkernel-0.9.0 → agentkernel-0.9.2}/src/agentkernel/deployment/aws/serverless/core/router/ws_lambda.py +0 -0
  168. {agentkernel-0.9.0 → agentkernel-0.9.2}/src/agentkernel/deployment/aws/serverless/core/sqs_consumer.py +0 -0
  169. {agentkernel-0.9.0 → agentkernel-0.9.2}/src/agentkernel/deployment/azure/__init__.py +0 -0
  170. {agentkernel-0.9.0 → agentkernel-0.9.2}/src/agentkernel/deployment/azure/akfunction.py +0 -0
  171. {agentkernel-0.9.0 → agentkernel-0.9.2}/src/agentkernel/deployment/common/__init__.py +0 -0
  172. {agentkernel-0.9.0 → agentkernel-0.9.2}/src/agentkernel/deployment/common/response_store.py +0 -0
  173. {agentkernel-0.9.0 → agentkernel-0.9.2}/src/agentkernel/deployment/common/rest_handler.py +0 -0
  174. {agentkernel-0.9.0 → agentkernel-0.9.2}/src/agentkernel/deployment/common/thread_runner.py +0 -0
  175. {agentkernel-0.9.0 → agentkernel-0.9.2}/src/agentkernel/deployment/common/websocket_service.py +0 -0
  176. {agentkernel-0.9.0 → agentkernel-0.9.2}/src/agentkernel/deployment/gcp/__init__.py +0 -0
  177. {agentkernel-0.9.0 → agentkernel-0.9.2}/src/agentkernel/deployment/gcp/akauthorizer.py +0 -0
  178. {agentkernel-0.9.0 → agentkernel-0.9.2}/src/agentkernel/deployment/gcp/akcloudrun.py +0 -0
  179. {agentkernel-0.9.0 → agentkernel-0.9.2}/src/agentkernel/framework/__init__.py +0 -0
  180. {agentkernel-0.9.0 → agentkernel-0.9.2}/src/agentkernel/framework/adk/__init__.py +0 -0
  181. {agentkernel-0.9.0 → agentkernel-0.9.2}/src/agentkernel/framework/adk/adk.py +0 -0
  182. {agentkernel-0.9.0 → agentkernel-0.9.2}/src/agentkernel/framework/crewai/__init__.py +0 -0
  183. {agentkernel-0.9.0 → agentkernel-0.9.2}/src/agentkernel/framework/crewai/crewai.py +0 -0
  184. {agentkernel-0.9.0 → agentkernel-0.9.2}/src/agentkernel/framework/langgraph/__init__.py +0 -0
  185. {agentkernel-0.9.0 → agentkernel-0.9.2}/src/agentkernel/framework/langgraph/langgraph.py +0 -0
  186. {agentkernel-0.9.0 → agentkernel-0.9.2}/src/agentkernel/framework/openai/__init__.py +0 -0
  187. {agentkernel-0.9.0 → agentkernel-0.9.2}/src/agentkernel/framework/openai/openai.py +0 -0
  188. {agentkernel-0.9.0 → agentkernel-0.9.2}/src/agentkernel/framework/pydanticai/__init__.py +0 -0
  189. {agentkernel-0.9.0 → agentkernel-0.9.2}/src/agentkernel/framework/pydanticai/pydanticai.py +0 -0
  190. {agentkernel-0.9.0 → agentkernel-0.9.2}/src/agentkernel/framework/smolagents/__init__.py +0 -0
  191. {agentkernel-0.9.0 → agentkernel-0.9.2}/src/agentkernel/framework/smolagents/smolagents.py +0 -0
  192. {agentkernel-0.9.0 → agentkernel-0.9.2}/src/agentkernel/gcp.py +0 -0
  193. {agentkernel-0.9.0 → agentkernel-0.9.2}/src/agentkernel/gmail.py +0 -0
  194. {agentkernel-0.9.0 → agentkernel-0.9.2}/src/agentkernel/guardrail/__init__.py +0 -0
  195. {agentkernel-0.9.0 → agentkernel-0.9.2}/src/agentkernel/guardrail/bedrock.py +0 -0
  196. {agentkernel-0.9.0 → agentkernel-0.9.2}/src/agentkernel/guardrail/guardrail.py +0 -0
  197. {agentkernel-0.9.0 → agentkernel-0.9.2}/src/agentkernel/guardrail/openai.py +0 -0
  198. {agentkernel-0.9.0 → agentkernel-0.9.2}/src/agentkernel/guardrail/walledai.py +0 -0
  199. {agentkernel-0.9.0 → agentkernel-0.9.2}/src/agentkernel/instagram.py +0 -0
  200. {agentkernel-0.9.0 → agentkernel-0.9.2}/src/agentkernel/integration/__init__.py +0 -0
  201. {agentkernel-0.9.0 → agentkernel-0.9.2}/src/agentkernel/integration/agui/__init__.py +0 -0
  202. {agentkernel-0.9.0 → agentkernel-0.9.2}/src/agentkernel/integration/agui/handler.py +0 -0
  203. {agentkernel-0.9.0 → agentkernel-0.9.2}/src/agentkernel/integration/agui/mapping.py +0 -0
  204. {agentkernel-0.9.0 → agentkernel-0.9.2}/src/agentkernel/integration/agui/run_input.py +0 -0
  205. {agentkernel-0.9.0 → agentkernel-0.9.2}/src/agentkernel/integration/agui/state.py +0 -0
  206. {agentkernel-0.9.0 → agentkernel-0.9.2}/src/agentkernel/integration/thread/model.py +0 -0
  207. {agentkernel-0.9.0 → agentkernel-0.9.2}/src/agentkernel/integration/thread/naming.py +0 -0
  208. {agentkernel-0.9.0 → agentkernel-0.9.2}/src/agentkernel/integration/thread/recorder.py +0 -0
  209. {agentkernel-0.9.0 → agentkernel-0.9.2}/src/agentkernel/integration/thread/store/__init__.py +0 -0
  210. {agentkernel-0.9.0 → agentkernel-0.9.2}/src/agentkernel/integration/thread/store/base.py +0 -0
  211. {agentkernel-0.9.0 → agentkernel-0.9.2}/src/agentkernel/integration/thread/store/cosmosdb.py +0 -0
  212. {agentkernel-0.9.0 → agentkernel-0.9.2}/src/agentkernel/integration/thread/store/dynamodb.py +0 -0
  213. {agentkernel-0.9.0 → agentkernel-0.9.2}/src/agentkernel/integration/thread/store/firestore.py +0 -0
  214. {agentkernel-0.9.0 → agentkernel-0.9.2}/src/agentkernel/integration/thread/store/in_memory.py +0 -0
  215. {agentkernel-0.9.0 → agentkernel-0.9.2}/src/agentkernel/integration/thread/store/redis.py +0 -0
  216. {agentkernel-0.9.0 → agentkernel-0.9.2}/src/agentkernel/integration/thread/store/redis_like.py +0 -0
  217. {agentkernel-0.9.0 → agentkernel-0.9.2}/src/agentkernel/integration/thread/store/valkey.py +0 -0
  218. {agentkernel-0.9.0 → agentkernel-0.9.2}/src/agentkernel/knowledgebase/__init__.py +0 -0
  219. {agentkernel-0.9.0 → agentkernel-0.9.2}/src/agentkernel/knowledgebase/base.py +0 -0
  220. {agentkernel-0.9.0 → agentkernel-0.9.2}/src/agentkernel/knowledgebase/chroma.py +0 -0
  221. {agentkernel-0.9.0 → agentkernel-0.9.2}/src/agentkernel/knowledgebase/knowledgebuilder.py +0 -0
  222. {agentkernel-0.9.0 → agentkernel-0.9.2}/src/agentkernel/knowledgebase/neo4j.py +0 -0
  223. {agentkernel-0.9.0 → agentkernel-0.9.2}/src/agentkernel/knowledgebase/starburst.py +0 -0
  224. {agentkernel-0.9.0 → agentkernel-0.9.2}/src/agentkernel/langgraph.py +0 -0
  225. {agentkernel-0.9.0 → agentkernel-0.9.2}/src/agentkernel/mcp.py +0 -0
  226. {agentkernel-0.9.0 → agentkernel-0.9.2}/src/agentkernel/messenger.py +0 -0
  227. {agentkernel-0.9.0 → agentkernel-0.9.2}/src/agentkernel/openai.py +0 -0
  228. {agentkernel-0.9.0 → agentkernel-0.9.2}/src/agentkernel/pipeline/consumer.py +0 -0
  229. {agentkernel-0.9.0 → agentkernel-0.9.2}/src/agentkernel/pipeline/response_store/__init__.py +0 -0
  230. {agentkernel-0.9.0 → agentkernel-0.9.2}/src/agentkernel/pipeline/response_store/base.py +0 -0
  231. {agentkernel-0.9.0 → agentkernel-0.9.2}/src/agentkernel/pipeline/response_store/dynamodb.py +0 -0
  232. {agentkernel-0.9.0 → agentkernel-0.9.2}/src/agentkernel/pipeline/response_store/factory.py +0 -0
  233. {agentkernel-0.9.0 → agentkernel-0.9.2}/src/agentkernel/pipeline/response_store/in_memory.py +0 -0
  234. {agentkernel-0.9.0 → agentkernel-0.9.2}/src/agentkernel/pipeline/response_store/redis.py +0 -0
  235. {agentkernel-0.9.0 → agentkernel-0.9.2}/src/agentkernel/pipeline/response_store/valkey.py +0 -0
  236. {agentkernel-0.9.0 → agentkernel-0.9.2}/src/agentkernel/pipeline/testing.py +0 -0
  237. {agentkernel-0.9.0 → agentkernel-0.9.2}/src/agentkernel/pipeline/thread_runner.py +0 -0
  238. {agentkernel-0.9.0 → agentkernel-0.9.2}/src/agentkernel/pipeline/transport/__init__.py +0 -0
  239. {agentkernel-0.9.0 → agentkernel-0.9.2}/src/agentkernel/pipeline/transport/base.py +0 -0
  240. {agentkernel-0.9.0 → agentkernel-0.9.2}/src/agentkernel/pipeline/transport/bookkeeping.py +0 -0
  241. {agentkernel-0.9.0 → agentkernel-0.9.2}/src/agentkernel/pipeline/transport/in_memory.py +0 -0
  242. {agentkernel-0.9.0 → agentkernel-0.9.2}/src/agentkernel/pipeline/transport/kafka.py +0 -0
  243. {agentkernel-0.9.0 → agentkernel-0.9.2}/src/agentkernel/pipeline/transport/nats.py +0 -0
  244. {agentkernel-0.9.0 → agentkernel-0.9.2}/src/agentkernel/pipeline/transport/sqs.py +0 -0
  245. {agentkernel-0.9.0 → agentkernel-0.9.2}/src/agentkernel/pipeline/ws/__init__.py +0 -0
  246. {agentkernel-0.9.0 → agentkernel-0.9.2}/src/agentkernel/pipeline/ws/base.py +0 -0
  247. {agentkernel-0.9.0 → agentkernel-0.9.2}/src/agentkernel/pipeline/ws/endpoint.py +0 -0
  248. {agentkernel-0.9.0 → agentkernel-0.9.2}/src/agentkernel/pipeline/ws/gateway.py +0 -0
  249. {agentkernel-0.9.0 → agentkernel-0.9.2}/src/agentkernel/pipeline/ws/handler.py +0 -0
  250. {agentkernel-0.9.0 → agentkernel-0.9.2}/src/agentkernel/pipeline/ws/push.py +0 -0
  251. {agentkernel-0.9.0 → agentkernel-0.9.2}/src/agentkernel/pipeline/ws/registry.py +0 -0
  252. {agentkernel-0.9.0 → agentkernel-0.9.2}/src/agentkernel/pydanticai.py +0 -0
  253. {agentkernel-0.9.0 → agentkernel-0.9.2}/src/agentkernel/sandbox/__init__.py +0 -0
  254. {agentkernel-0.9.0 → agentkernel-0.9.2}/src/agentkernel/sandbox/base.py +0 -0
  255. {agentkernel-0.9.0 → agentkernel-0.9.2}/src/agentkernel/sandbox/broker/__init__.py +0 -0
  256. {agentkernel-0.9.0 → agentkernel-0.9.2}/src/agentkernel/sandbox/broker/base.py +0 -0
  257. {agentkernel-0.9.0 → agentkernel-0.9.2}/src/agentkernel/sandbox/broker/embedded.py +0 -0
  258. {agentkernel-0.9.0 → agentkernel-0.9.2}/src/agentkernel/sandbox/broker/queue.py +0 -0
  259. {agentkernel-0.9.0 → agentkernel-0.9.2}/src/agentkernel/sandbox/broker/queue_worker.py +0 -0
  260. {agentkernel-0.9.0 → agentkernel-0.9.2}/src/agentkernel/sandbox/broker/thread.py +0 -0
  261. {agentkernel-0.9.0 → agentkernel-0.9.2}/src/agentkernel/sandbox/broker/wire.py +0 -0
  262. {agentkernel-0.9.0 → agentkernel-0.9.2}/src/agentkernel/sandbox/broker/worker.py +0 -0
  263. {agentkernel-0.9.0 → agentkernel-0.9.2}/src/agentkernel/sandbox/errors.py +0 -0
  264. {agentkernel-0.9.0 → agentkernel-0.9.2}/src/agentkernel/sandbox/factory.py +0 -0
  265. {agentkernel-0.9.0 → agentkernel-0.9.2}/src/agentkernel/sandbox/hooks.py +0 -0
  266. {agentkernel-0.9.0 → agentkernel-0.9.2}/src/agentkernel/sandbox/manager.py +0 -0
  267. {agentkernel-0.9.0 → agentkernel-0.9.2}/src/agentkernel/sandbox/model.py +0 -0
  268. {agentkernel-0.9.0 → agentkernel-0.9.2}/src/agentkernel/sandbox/principal.py +0 -0
  269. {agentkernel-0.9.0 → agentkernel-0.9.2}/src/agentkernel/sandbox/providers/__init__.py +0 -0
  270. {agentkernel-0.9.0 → agentkernel-0.9.2}/src/agentkernel/sandbox/providers/daytona.py +0 -0
  271. {agentkernel-0.9.0 → agentkernel-0.9.2}/src/agentkernel/sandbox/providers/docker.py +0 -0
  272. {agentkernel-0.9.0 → agentkernel-0.9.2}/src/agentkernel/sandbox/providers/e2b.py +0 -0
  273. {agentkernel-0.9.0 → agentkernel-0.9.2}/src/agentkernel/sandbox/providers/ec2_ssm.py +0 -0
  274. {agentkernel-0.9.0 → agentkernel-0.9.2}/src/agentkernel/sandbox/providers/kubernetes.py +0 -0
  275. {agentkernel-0.9.0 → agentkernel-0.9.2}/src/agentkernel/sandbox/providers/local_subprocess.py +0 -0
  276. {agentkernel-0.9.0 → agentkernel-0.9.2}/src/agentkernel/sandbox/testing.py +0 -0
  277. {agentkernel-0.9.0 → agentkernel-0.9.2}/src/agentkernel/sandbox/tools.py +0 -0
  278. {agentkernel-0.9.0 → agentkernel-0.9.2}/src/agentkernel/schedule/__init__.py +0 -0
  279. {agentkernel-0.9.0 → agentkernel-0.9.2}/src/agentkernel/schedule/errors.py +0 -0
  280. {agentkernel-0.9.0 → agentkernel-0.9.2}/src/agentkernel/schedule/handler.py +0 -0
  281. {agentkernel-0.9.0 → agentkernel-0.9.2}/src/agentkernel/schedule/manager.py +0 -0
  282. {agentkernel-0.9.0 → agentkernel-0.9.2}/src/agentkernel/schedule/model.py +0 -0
  283. {agentkernel-0.9.0 → agentkernel-0.9.2}/src/agentkernel/schedule/provider/__init__.py +0 -0
  284. {agentkernel-0.9.0 → agentkernel-0.9.2}/src/agentkernel/schedule/provider/base.py +0 -0
  285. {agentkernel-0.9.0 → agentkernel-0.9.2}/src/agentkernel/schedule/provider/eventbridge.py +0 -0
  286. {agentkernel-0.9.0 → agentkernel-0.9.2}/src/agentkernel/schedule/provider/local.py +0 -0
  287. {agentkernel-0.9.0 → agentkernel-0.9.2}/src/agentkernel/schedule/store/__init__.py +0 -0
  288. {agentkernel-0.9.0 → agentkernel-0.9.2}/src/agentkernel/schedule/store/base.py +0 -0
  289. {agentkernel-0.9.0 → agentkernel-0.9.2}/src/agentkernel/schedule/store/dynamodb.py +0 -0
  290. {agentkernel-0.9.0 → agentkernel-0.9.2}/src/agentkernel/schedule/store/in_memory.py +0 -0
  291. {agentkernel-0.9.0 → agentkernel-0.9.2}/src/agentkernel/schedule/store/redis.py +0 -0
  292. {agentkernel-0.9.0 → agentkernel-0.9.2}/src/agentkernel/schedule/store/redis_like.py +0 -0
  293. {agentkernel-0.9.0 → agentkernel-0.9.2}/src/agentkernel/schedule/store/valkey.py +0 -0
  294. {agentkernel-0.9.0 → agentkernel-0.9.2}/src/agentkernel/schedule/timing.py +0 -0
  295. {agentkernel-0.9.0 → agentkernel-0.9.2}/src/agentkernel/schedule/tools.py +0 -0
  296. {agentkernel-0.9.0 → agentkernel-0.9.2}/src/agentkernel/skills/__init__.py +0 -0
  297. {agentkernel-0.9.0 → agentkernel-0.9.2}/src/agentkernel/skills/skills.py +0 -0
  298. {agentkernel-0.9.0 → agentkernel-0.9.2}/src/agentkernel/slack.py +0 -0
  299. {agentkernel-0.9.0 → agentkernel-0.9.2}/src/agentkernel/smolagents.py +0 -0
  300. {agentkernel-0.9.0 → agentkernel-0.9.2}/src/agentkernel/teams.py +0 -0
  301. {agentkernel-0.9.0 → agentkernel-0.9.2}/src/agentkernel/telegram.py +0 -0
  302. {agentkernel-0.9.0 → agentkernel-0.9.2}/src/agentkernel/test/__init__.py +0 -0
  303. {agentkernel-0.9.0 → agentkernel-0.9.2}/src/agentkernel/test/core/__init__.py +0 -0
  304. {agentkernel-0.9.0/src/agentkernel/test/core/akevaluators → agentkernel-0.9.2/src/agentkernel/test/core/evaluator}/__init__.py +0 -0
  305. {agentkernel-0.9.0 → agentkernel-0.9.2}/src/agentkernel/thread.py +0 -0
  306. {agentkernel-0.9.0 → agentkernel-0.9.2}/src/agentkernel/trace/__init__.py +0 -0
  307. {agentkernel-0.9.0 → agentkernel-0.9.2}/src/agentkernel/trace/base.py +0 -0
  308. {agentkernel-0.9.0 → agentkernel-0.9.2}/src/agentkernel/trace/langfuse/__init__.py +0 -0
  309. {agentkernel-0.9.0 → agentkernel-0.9.2}/src/agentkernel/trace/langfuse/adk.py +0 -0
  310. {agentkernel-0.9.0 → agentkernel-0.9.2}/src/agentkernel/trace/langfuse/crewai.py +0 -0
  311. {agentkernel-0.9.0 → agentkernel-0.9.2}/src/agentkernel/trace/langfuse/langfuse.py +0 -0
  312. {agentkernel-0.9.0 → agentkernel-0.9.2}/src/agentkernel/trace/langfuse/langgraph.py +0 -0
  313. {agentkernel-0.9.0 → agentkernel-0.9.2}/src/agentkernel/trace/langfuse/openai.py +0 -0
  314. {agentkernel-0.9.0 → agentkernel-0.9.2}/src/agentkernel/trace/langfuse/pydanticai.py +0 -0
  315. {agentkernel-0.9.0 → agentkernel-0.9.2}/src/agentkernel/trace/langfuse/smolagents.py +0 -0
  316. {agentkernel-0.9.0 → agentkernel-0.9.2}/src/agentkernel/trace/logfire/__init__.py +0 -0
  317. {agentkernel-0.9.0 → agentkernel-0.9.2}/src/agentkernel/trace/logfire/adk.py +0 -0
  318. {agentkernel-0.9.0 → agentkernel-0.9.2}/src/agentkernel/trace/logfire/crewai.py +0 -0
  319. {agentkernel-0.9.0 → agentkernel-0.9.2}/src/agentkernel/trace/logfire/langgraph.py +0 -0
  320. {agentkernel-0.9.0 → agentkernel-0.9.2}/src/agentkernel/trace/logfire/logfire.py +0 -0
  321. {agentkernel-0.9.0 → agentkernel-0.9.2}/src/agentkernel/trace/logfire/openai.py +0 -0
  322. {agentkernel-0.9.0 → agentkernel-0.9.2}/src/agentkernel/trace/logfire/pydanticai.py +0 -0
  323. {agentkernel-0.9.0 → agentkernel-0.9.2}/src/agentkernel/trace/logfire/smolagents.py +0 -0
  324. {agentkernel-0.9.0 → agentkernel-0.9.2}/src/agentkernel/trace/openllmetry/__init__.py +0 -0
  325. {agentkernel-0.9.0 → agentkernel-0.9.2}/src/agentkernel/trace/openllmetry/adk.py +0 -0
  326. {agentkernel-0.9.0 → agentkernel-0.9.2}/src/agentkernel/trace/openllmetry/crewai.py +0 -0
  327. {agentkernel-0.9.0 → agentkernel-0.9.2}/src/agentkernel/trace/openllmetry/langgraph.py +0 -0
  328. {agentkernel-0.9.0 → agentkernel-0.9.2}/src/agentkernel/trace/openllmetry/openai.py +0 -0
  329. {agentkernel-0.9.0 → agentkernel-0.9.2}/src/agentkernel/trace/openllmetry/openllmetry.py +0 -0
  330. {agentkernel-0.9.0 → agentkernel-0.9.2}/src/agentkernel/trace/openllmetry/pydanticai.py +0 -0
  331. {agentkernel-0.9.0 → agentkernel-0.9.2}/src/agentkernel/trace/openllmetry/smolagents.py +0 -0
  332. {agentkernel-0.9.0 → agentkernel-0.9.2}/src/agentkernel/trace/trace.py +0 -0
  333. {agentkernel-0.9.0 → agentkernel-0.9.2}/src/agentkernel/whatsapp.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.3
2
2
  Name: agentkernel
3
- Version: 0.9.0
3
+ Version: 0.9.2
4
4
  Summary: Agent Kernel - Unified AI Agents Runtime
5
5
  Author: Yaala Labs
6
6
  Author-email: Yaala Labs <agentkernel@yaalalabs.com>
@@ -44,7 +44,7 @@ Requires-Dist: nest-asyncio>=1.6.0 ; extra == 'langfuse'
44
44
  Requires-Dist: langgraph~=1.2.10 ; extra == 'langgraph'
45
45
  Requires-Dist: langgraph-prebuilt~=1.1.0 ; extra == 'langgraph'
46
46
  Requires-Dist: langchain~=1.3.10 ; extra == 'langgraph'
47
- Requires-Dist: langchain-community==0.4.1 ; extra == 'langgraph'
47
+ Requires-Dist: langchain-community~=0.4.1 ; extra == 'langgraph'
48
48
  Requires-Dist: litellm~=1.89.2 ; extra == 'langgraph'
49
49
  Requires-Dist: logfire>=3.0 ; extra == 'logfire'
50
50
  Requires-Dist: fastmcp>=3.2.0,<4.0.0 ; extra == 'mcp'
@@ -57,6 +57,7 @@ Requires-Dist: openai-agents>=0.7.0 ; extra == 'openai'
57
57
  Requires-Dist: openinference-instrumentation-openai-agents>=1.4.0 ; extra == 'openai'
58
58
  Requires-Dist: openai-guardrails>=0.2.1 ; extra == 'openai'
59
59
  Requires-Dist: traceloop-sdk>=0.61.0 ; extra == 'openllmetry'
60
+ Requires-Dist: opik>=1.7.0 ; extra == 'opik'
60
61
  Requires-Dist: pydantic-ai-slim~=2.13.0 ; extra == 'pydanticai'
61
62
  Requires-Dist: openinference-instrumentation-pydantic-ai>=0.1.17 ; extra == 'pydanticai'
62
63
  Requires-Dist: redis>=7.1.0 ; extra == 'redis'
@@ -111,6 +112,7 @@ Provides-Extra: nats
111
112
  Provides-Extra: neo4j
112
113
  Provides-Extra: openai
113
114
  Provides-Extra: openllmetry
115
+ Provides-Extra: opik
114
116
  Provides-Extra: pydanticai
115
117
  Provides-Extra: redis
116
118
  Provides-Extra: sandbox-docker
@@ -1261,7 +1263,7 @@ Configure test comparison modes for automated testing. Test configuration is sep
1261
1263
  - **Evaluator**
1262
1264
  - **Field**: `evaluator`
1263
1265
  - **Default**: `deepeval`
1264
- - **Description**: Built-in evaluator short name, or a dotted path to your own `AKEvaluator` subclass
1266
+ - **Description**: Built-in evaluator short name (`deepeval` or `opik`), or a dotted path to your own `AKEvaluator` subclass
1265
1267
  - **Environment Variable**: `AK_TEST__EVALUATOR`
1266
1268
 
1267
1269
  - **Llm Model**
@@ -1283,8 +1285,8 @@ Configure test comparison modes for automated testing. Test configuration is sep
1283
1285
  - **Environment Variable**: `AK_TEST__LLM__EMBEDDING_MODEL`
1284
1286
 
1285
1287
  **Test Modes:**
1286
- - `score`: Deterministic, offline string-match scoring via the configured evaluator (built-in DeepEval evaluator: `Scorer.quasi_exact_match_score`)
1287
- - `llm`: LLM-as-judge evaluation via the configured evaluator (built-in DeepEval evaluator: `GEval`) for semantic similarity
1288
+ - `score`: Deterministic, offline string-match scoring via the configured evaluator (built-in `deepeval`: `Scorer.quasi_exact_match_score`; built-in `opik`: `LevenshteinRatio`, requires `pip install "agentkernel[opik]"`)
1289
+ - `llm`: LLM-as-judge evaluation via the configured evaluator (built-in `deepeval` or `opik`: `GEval`) for semantic similarity
1288
1290
  - `fallback`: Tries score first, falls back to llm if score fails
1289
1291
 
1290
1292
  ```yaml
@@ -1646,7 +1648,7 @@ export AK_TRACE__TYPE=langfuse # or openllmetry, logfire
1646
1648
  # export LOGFIRE_TOKEN=your-write-token
1647
1649
  # Test harness (loaded from the separate test-config.yaml — see Test Configuration)
1648
1650
  export AK_TEST__MODE=fallback # Options: score, llm, fallback
1649
- export AK_TEST__EVALUATOR=deepeval # Built-in short name, or a dotted path to your own AKEvaluator subclass
1651
+ export AK_TEST__EVALUATOR=deepeval # Built-in short name (deepeval or opik), or a dotted path to your own AKEvaluator subclass
1650
1652
  export AK_TEST__LLM__MODEL=gpt-4o-mini
1651
1653
  export AK_TEST__LLM__PROVIDER=openai
1652
1654
  export AK_TEST__LLM__EMBEDDING_MODEL=text-embedding-3-small
@@ -1916,6 +1918,8 @@ gmail:
1916
1918
 
1917
1919
  Test harness configuration (comparison mode, evaluator backend, llm models) is separate from the application configuration. It is not part of `config.yaml` — it lives in its own `test-config.yaml` file, resolved from the current working directory, and is only loaded when the testing utilities (`agentkernel.test`) are used. A legacy `test:` section in `config.yaml` is ignored. See [Test Configuration](#test-configuration) under Configuration Options for the full list of fields and defaults.
1918
1920
 
1921
+ The `evaluator` field accepts two built-in short names — `deepeval` (default, `pip install "agentkernel[test]"`) or `opik` (`pip install "agentkernel[opik]"`, [Opik](https://www.comet.com/docs/opik/) by Comet, runs entirely locally with `OPIK_TRACK_DISABLE` set so no Opik Cloud account or API key is needed) — or a dotted path to your own `AKEvaluator` subclass.
1922
+
1919
1923
  **test-config.yaml:**
1920
1924
 
1921
1925
  ```yaml
@@ -1133,7 +1133,7 @@ Configure test comparison modes for automated testing. Test configuration is sep
1133
1133
  - **Evaluator**
1134
1134
  - **Field**: `evaluator`
1135
1135
  - **Default**: `deepeval`
1136
- - **Description**: Built-in evaluator short name, or a dotted path to your own `AKEvaluator` subclass
1136
+ - **Description**: Built-in evaluator short name (`deepeval` or `opik`), or a dotted path to your own `AKEvaluator` subclass
1137
1137
  - **Environment Variable**: `AK_TEST__EVALUATOR`
1138
1138
 
1139
1139
  - **Llm Model**
@@ -1155,8 +1155,8 @@ Configure test comparison modes for automated testing. Test configuration is sep
1155
1155
  - **Environment Variable**: `AK_TEST__LLM__EMBEDDING_MODEL`
1156
1156
 
1157
1157
  **Test Modes:**
1158
- - `score`: Deterministic, offline string-match scoring via the configured evaluator (built-in DeepEval evaluator: `Scorer.quasi_exact_match_score`)
1159
- - `llm`: LLM-as-judge evaluation via the configured evaluator (built-in DeepEval evaluator: `GEval`) for semantic similarity
1158
+ - `score`: Deterministic, offline string-match scoring via the configured evaluator (built-in `deepeval`: `Scorer.quasi_exact_match_score`; built-in `opik`: `LevenshteinRatio`, requires `pip install "agentkernel[opik]"`)
1159
+ - `llm`: LLM-as-judge evaluation via the configured evaluator (built-in `deepeval` or `opik`: `GEval`) for semantic similarity
1160
1160
  - `fallback`: Tries score first, falls back to llm if score fails
1161
1161
 
1162
1162
  ```yaml
@@ -1518,7 +1518,7 @@ export AK_TRACE__TYPE=langfuse # or openllmetry, logfire
1518
1518
  # export LOGFIRE_TOKEN=your-write-token
1519
1519
  # Test harness (loaded from the separate test-config.yaml — see Test Configuration)
1520
1520
  export AK_TEST__MODE=fallback # Options: score, llm, fallback
1521
- export AK_TEST__EVALUATOR=deepeval # Built-in short name, or a dotted path to your own AKEvaluator subclass
1521
+ export AK_TEST__EVALUATOR=deepeval # Built-in short name (deepeval or opik), or a dotted path to your own AKEvaluator subclass
1522
1522
  export AK_TEST__LLM__MODEL=gpt-4o-mini
1523
1523
  export AK_TEST__LLM__PROVIDER=openai
1524
1524
  export AK_TEST__LLM__EMBEDDING_MODEL=text-embedding-3-small
@@ -1788,6 +1788,8 @@ gmail:
1788
1788
 
1789
1789
  Test harness configuration (comparison mode, evaluator backend, llm models) is separate from the application configuration. It is not part of `config.yaml` — it lives in its own `test-config.yaml` file, resolved from the current working directory, and is only loaded when the testing utilities (`agentkernel.test`) are used. A legacy `test:` section in `config.yaml` is ignored. See [Test Configuration](#test-configuration) under Configuration Options for the full list of fields and defaults.
1790
1790
 
1791
+ The `evaluator` field accepts two built-in short names — `deepeval` (default, `pip install "agentkernel[test]"`) or `opik` (`pip install "agentkernel[opik]"`, [Opik](https://www.comet.com/docs/opik/) by Comet, runs entirely locally with `OPIK_TRACK_DISABLE` set so no Opik Cloud account or API key is needed) — or a dotted path to your own `AKEvaluator` subclass.
1792
+
1791
1793
  **test-config.yaml:**
1792
1794
 
1793
1795
  ```yaml
@@ -4,7 +4,7 @@ build-backend = "uv_build"
4
4
 
5
5
  [project]
6
6
  name = "agentkernel"
7
- version = "0.9.0"
7
+ version = "0.9.2"
8
8
  description = "Agent Kernel - Unified AI Agents Runtime"
9
9
  readme = "README.md"
10
10
  requires-python = ">=3.12,<3.14"
@@ -43,7 +43,7 @@ langgraph = [
43
43
  "langgraph~=1.2.10",
44
44
  "langgraph-prebuilt~=1.1.0",
45
45
  "langchain~=1.3.10",
46
- "langchain_community==0.4.1",
46
+ "langchain_community~=0.4.1",
47
47
  "litellm~=1.89.2"
48
48
  ]
49
49
  smolagents = [
@@ -188,6 +188,9 @@ daytona = [
188
188
  kubernetes = [
189
189
  "kubernetes>=29.0.0",
190
190
  ]
191
+ opik = [
192
+ "opik>=1.7.0",
193
+ ]
191
194
 
192
195
  [project.scripts]
193
196
  ak = "agentkernel.cli.ak:main"
@@ -14,6 +14,8 @@ from ..core.runtime import Runtime
14
14
 
15
15
 
16
16
  class RESTRequestHandler(ABC):
17
+ requires_pipeline: bool = False
18
+
17
19
  @abstractmethod
18
20
  def get_router(self) -> APIRouter:
19
21
  """
@@ -105,11 +105,31 @@ class RESTAPI:
105
105
  cls._log.info("in_memory queue transport resolved: starting the single-process pipeline topology")
106
106
  return IOHandler.run()
107
107
 
108
+ handlers = handlers if handlers is not None else cls.get_default_handlers()
109
+ cls._reject_pipeline_only_handlers(handlers)
110
+
108
111
  host = AKConfig.get().api.host
109
112
  port = AKConfig.get().api.port
110
113
  cls._log.info(f"Agent Kernel REST API listening on http://{host}:{port}")
111
114
  uvicorn.run(app=cls.build_app(handlers), host=host, port=port, reload=False)
112
115
 
116
+ @classmethod
117
+ def _reject_pipeline_only_handlers(cls, handlers: list[RESTRequestHandler] = None) -> None:
118
+ """Refuse to serve a handler that only works inside the queue pipeline.
119
+
120
+ :param handlers: The handlers this run was asked to serve.
121
+ :raises AKConfigError: If any of them declares ``requires_pipeline``.
122
+ """
123
+ offenders = sorted({type(handler).__name__ for handler in handlers or [] if getattr(handler, "requires_pipeline", False) is True})
124
+ if offenders:
125
+ from ..core.util.factory import AKConfigError
126
+
127
+ raise AKConfigError(
128
+ f"{', '.join(offenders)} require the queue pipeline: serve them with "
129
+ "IOHandler.run(handlers=[...]) instead of RESTAPI.run([...]), which builds a bare "
130
+ "API with no runner to drain what they enqueue"
131
+ )
132
+
113
133
  @classmethod
114
134
  def build_app(cls, handlers: list[RESTRequestHandler] = None) -> FastAPI:
115
135
  """Assemble the complete FastAPI app (handlers, A2A/MCP mounts, custom routers) without serving it.
@@ -44,7 +44,7 @@ from .config import AKConfig as Config
44
44
  from .module import Module
45
45
  from .runtime import ACTING_USER_CACHE_KEY, Runtime
46
46
  from .service import AgentService
47
- from .hooks import PreHook, PostHook
47
+ from .hooks import PreHook, PostHook, StreamHalt
48
48
  from .tool import ToolContext, ToolBuilder
49
49
  from .util.key_value_cache import KeyValueCache
50
50
  from .chat_service import ChatService
@@ -1,8 +1,8 @@
1
- import asyncio
2
1
  import base64
2
+ import contextlib
3
3
  import json
4
4
  import logging
5
- from collections.abc import AsyncGenerator, Generator
5
+ from collections.abc import AsyncGenerator, Generator, Iterator
6
6
  from typing import Any, Dict, List, Optional, Union
7
7
 
8
8
  from .config import AKConfig
@@ -21,6 +21,7 @@ from .model import (
21
21
  StreamChunk,
22
22
  )
23
23
  from .service import AgentService
24
+ from .util.async_bridge import iterate_async_sync, run_async_sync
24
25
 
25
26
 
26
27
  class RequestBuilder:
@@ -138,6 +139,7 @@ class RequestBuilder:
138
139
  "schedule",
139
140
  "scheduled_task_id",
140
141
  "scheduled_time",
142
+ "requests",
141
143
  }
142
144
  for key, value in req.model_dump().items():
143
145
  if key in known_fields:
@@ -225,21 +227,25 @@ class AgentHandler:
225
227
  def _run_async_sync(coro) -> Any:
226
228
  """Run an async coroutine from sync code, handling event loop state.
227
229
 
228
- Only a RuntimeError from get_event_loop() itself (no loop in this thread) falls back to
229
- asyncio.run: a RuntimeError raised by the coroutine must propagate as-is, not trigger a
230
- second await of the already-consumed coroutine.
230
+ Kept as a method because callers (and their tests) reach the bridge through it; the
231
+ loop handling itself is shared with the pipeline's synchronous consumers.
231
232
 
232
233
  :param coro: Coroutine to execute
233
234
  :return: Result of the coroutine
234
235
  """
235
- try:
236
- loop = asyncio.get_event_loop()
237
- except RuntimeError:
238
- return asyncio.run(coro)
239
- if loop.is_closed():
240
- asyncio.set_event_loop(asyncio.new_event_loop())
241
- return asyncio.run(coro)
242
- return loop.run_until_complete(coro)
236
+ return run_async_sync(coro)
237
+
238
+ @staticmethod
239
+ def _iterate_async_sync(agen) -> Iterator[Any]:
240
+ """Consume an async generator from sync code, handling event loop state.
241
+
242
+ The streaming sibling of _run_async_sync, and a method for the same reason: callers
243
+ (and their tests) reach the bridge through the handler.
244
+
245
+ :param agen: Async generator to consume
246
+ :return: Iterator over the generator's items
247
+ """
248
+ return iterate_async_sync(agen)
243
249
 
244
250
  def run_sync(self, requests: List[Any], acting_user_id: Optional[str] = None) -> Any:
245
251
  """Run agent requests synchronously.
@@ -259,23 +265,17 @@ class AgentHandler:
259
265
  """
260
266
  return await self.service.run_multi(requests=requests, acting_user_id=acting_user_id)
261
267
 
262
- def run_stream_sync(self, requests: List[Any], acting_user_id: Optional[str] = None) -> List[Any]:
268
+ def run_stream_sync(self, requests: List[Any], acting_user_id: Optional[str] = None) -> Iterator[Any]:
263
269
  """Run agent streaming requests synchronously.
264
270
 
265
- Manages event loop lifecycle internally and returns all chunks as a list.
271
+ Manages event loop lifecycle internally and hands over each chunk as the run produces
272
+ it, so a sync consumer streams live instead of receiving the whole run at once.
266
273
 
267
274
  :param requests: List of AgentRequest objects to process
268
275
  :param acting_user_id: When given, published as the run's acting user (see Runtime.stream)
269
- :return: List of StreamChunk objects
276
+ :return: Iterator of StreamChunk objects
270
277
  """
271
-
272
- async def _collect():
273
- chunks = []
274
- async for chunk in self.service.stream_multi(requests=requests, acting_user_id=acting_user_id):
275
- chunks.append(chunk)
276
- return chunks
277
-
278
- return AgentHandler._run_async_sync(_collect())
278
+ return AgentHandler._iterate_async_sync(self.service.stream_multi(requests=requests, acting_user_id=acting_user_id))
279
279
 
280
280
  async def run_stream_async(self, requests: List[Any], acting_user_id: Optional[str] = None) -> AsyncGenerator[Any, None]:
281
281
  """Run agent streaming requests asynchronously.
@@ -444,8 +444,9 @@ class ChatService:
444
444
  def execute_stream_sync(self, req: BaseRunRequest, requests: Optional[List[AgentRequest]] = None) -> Generator[StreamChunk, None, None]:
445
445
  """Synchronous counterpart of execute_stream().
446
446
 
447
- Preserves the sync path's buffering semantics: AgentHandler.run_stream_sync collects
448
- all chunks before this generator yields the first one.
447
+ Chunks arrive as the run produces them: AgentHandler.run_stream_sync pumps the async
448
+ stream one chunk at a time, so an exception mid-run reaches the caller as an error
449
+ chunk after the chunks already yielded, exactly as on the async path.
449
450
 
450
451
  :param req: Run request carrying prompt, agent, and session_id
451
452
  :param requests: Optional prebuilt AgentRequest list (see execute())
@@ -460,11 +461,12 @@ class ChatService:
460
461
  handler = self.prepare_agent_handler(req.session_id, req.agent)
461
462
 
462
463
  def _stream() -> Generator[StreamChunk, None, None]:
463
- try:
464
- for chunk in handler.run_stream_sync(requests, acting_user_id=req.user_id):
465
- yield chunk
466
- except Exception as e:
467
- yield StreamChunk(error=str(e), done=True)
464
+ with contextlib.closing(handler.run_stream_sync(requests, acting_user_id=req.user_id)) as chunks:
465
+ try:
466
+ for chunk in chunks:
467
+ yield chunk
468
+ except Exception as e:
469
+ yield StreamChunk(error=str(e), done=True)
468
470
 
469
471
  return _stream()
470
472
 
@@ -575,15 +577,18 @@ class ChatService:
575
577
  self._validate(req, requests)
576
578
  return RequestBuilder.from_base_request_sync(req) if requests is None else requests
577
579
 
578
- def process_chat_request(self, req: BaseRunRequest) -> Union[tuple[int, Dict[str, Any]], Dict[str, Any]]:
580
+ def process_chat_request(
581
+ self, req: BaseRunRequest, requests: Optional[List[AgentRequest]] = None
582
+ ) -> Union[tuple[int, Dict[str, Any]], Dict[str, Any]]:
579
583
  """Process a chat request synchronously.
580
584
 
581
585
  :param req: Base run request with prompt, session_id, agent, and attachments
586
+ :param requests: Optional prebuilt AgentRequest list (see execute_sync())
582
587
  :return: When rest_api_mode=False: tuple of (status_code, response_dict).
583
588
  When rest_api_mode=True: response_dict only.
584
589
  """
585
590
  try:
586
- result, session_id = self.execute_sync(req)
591
+ result, session_id = self.execute_sync(req, requests)
587
592
  return ResponseBuilder.build_response(self._success_status(req), session_id, self.rest_api_mode, result=result)
588
593
  except ValueError as ve:
589
594
  self._log.error(f"ValueError processing request: {ve}")
@@ -642,6 +647,7 @@ class ChatService:
642
647
  self,
643
648
  req: BaseRunRequest,
644
649
  sse_format: bool = False,
650
+ requests: Optional[List[AgentRequest]] = None,
645
651
  ) -> Generator[str, None, None]:
646
652
  """Process a streaming chat request synchronously.
647
653
 
@@ -652,19 +658,21 @@ class ChatService:
652
658
  :param req: Base run request with prompt, session_id, agent, and attachments
653
659
  :param sse_format: When True, yield Server-Sent Events formatted frames.
654
660
  When False, yield raw StreamChunk JSON payloads.
661
+ :param requests: Optional prebuilt AgentRequest list (see execute_stream_sync())
655
662
  :return: Generator yielding StreamChunk payloads as JSON or SSE-formatted strings
656
663
  :raises ValueError: If session_id or prompt is missing, or no agent is available
657
664
  """
658
665
  session_id = req.session_id
659
- chunks = self.execute_stream_sync(req)
666
+ chunks = self.execute_stream_sync(req, requests)
660
667
 
661
668
  def _stream() -> Generator[str, None, None]:
662
- try:
663
- for chunk in chunks:
664
- yield ResponseBuilder.stream_chunk(chunk, session_id, sse_format=sse_format)
665
- except Exception as e:
666
- error_chunk = StreamChunk(error=str(e), done=True)
667
- yield ResponseBuilder.stream_chunk(error_chunk, session_id, sse_format=sse_format)
669
+ with contextlib.closing(chunks) as raw_chunks:
670
+ try:
671
+ for chunk in raw_chunks:
672
+ yield ResponseBuilder.stream_chunk(chunk, session_id, sse_format=sse_format)
673
+ except Exception as e:
674
+ error_chunk = StreamChunk(error=str(e), done=True)
675
+ yield ResponseBuilder.stream_chunk(error_chunk, session_id, sse_format=sse_format)
668
676
 
669
677
  return _stream()
670
678
 
@@ -161,6 +161,10 @@ class _SlackConfig(BaseModel):
161
161
  default="",
162
162
  description="The message to send as an acknowledgement when a Slack message is received",
163
163
  )
164
+ outbound_adapter: str = Field(
165
+ default="",
166
+ description="Dotted path to an OutboundAdapter subclass replacing the built-in Slack outbound adapter",
167
+ )
164
168
 
165
169
 
166
170
  class _WhatsAppConfig(BaseModel):
@@ -174,6 +178,10 @@ class _WhatsAppConfig(BaseModel):
174
178
  app_secret: str = Field(default="", description="WhatsApp app secret for signature verification")
175
179
  phone_number_id: str = Field(default="", description="WhatsApp Business phone number ID")
176
180
  api_version: str = Field(default="v24.0", description="WhatsApp API version")
181
+ outbound_adapter: str = Field(
182
+ default="",
183
+ description="Dotted path to an OutboundAdapter subclass replacing the built-in WhatsApp outbound adapter",
184
+ )
177
185
 
178
186
 
179
187
  class _MessengerConfig(BaseModel):
@@ -182,6 +190,10 @@ class _MessengerConfig(BaseModel):
182
190
  access_token: str = Field(default="", description="Facebook Page access token")
183
191
  app_secret: str = Field(default="", description="Facebook app secret for signature verification")
184
192
  api_version: str = Field(default="v24.0", description="Facebook Graph API version")
193
+ outbound_adapter: str = Field(
194
+ default="",
195
+ description="Dotted path to an OutboundAdapter subclass replacing the built-in Facebook Messenger outbound adapter",
196
+ )
185
197
 
186
198
 
187
199
  class _InstagramConfig(BaseModel):
@@ -191,6 +203,10 @@ class _InstagramConfig(BaseModel):
191
203
  app_secret: str = Field(default="", description="Instagram app secret for signature verification")
192
204
  instagram_account_id: str = Field(default="", description="Instagram Business Account ID (IGSID)")
193
205
  api_version: str = Field(default="v21.0", description="Instagram Graph API version")
206
+ outbound_adapter: str = Field(
207
+ default="",
208
+ description="Dotted path to an OutboundAdapter subclass replacing the built-in Instagram outbound adapter",
209
+ )
194
210
 
195
211
 
196
212
  class _TelegramConfig(BaseModel):
@@ -198,6 +214,10 @@ class _TelegramConfig(BaseModel):
198
214
  bot_token: str = Field(default="", description="Telegram bot token from BotFather")
199
215
  webhook_secret: str = Field(default="", description="Optional secret token for webhook security")
200
216
  api_version: str = Field(default="bot", description="Telegram Bot API version prefix")
217
+ outbound_adapter: str = Field(
218
+ default="",
219
+ description="Dotted path to an OutboundAdapter subclass replacing the built-in Telegram outbound adapter",
220
+ )
201
221
 
202
222
 
203
223
  class _TeamsConfig(BaseModel):
@@ -212,6 +232,10 @@ class _TeamsConfig(BaseModel):
212
232
  default="",
213
233
  description="Entra ID tenant that owns the bot's app registration. Required only for a single-tenant registration, whose channel tokens must be issued by its own tenant; leave empty for a multi-tenant bot. Also the fallback tenant for the app-only token used to download attachments whose URL is not pre-authenticated, when the incoming activity carries none",
214
234
  )
235
+ outbound_adapter: str = Field(
236
+ default="",
237
+ description="Dotted path to an OutboundAdapter subclass replacing the built-in Microsoft Teams outbound adapter",
238
+ )
215
239
 
216
240
 
217
241
  class _GmailConfig(BaseModel):
@@ -219,6 +243,10 @@ class _GmailConfig(BaseModel):
219
243
  token_file: str = Field(default="token.pickle", description="Path to store OAuth2 token")
220
244
  poll_interval: int = Field(default=30, description="Email polling interval in seconds")
221
245
  label_filter: str = Field(default="INBOX", description="Gmail label to monitor (e.g., INBOX, UNREAD)")
246
+ outbound_adapter: str = Field(
247
+ default="",
248
+ description="Dotted path to an OutboundAdapter subclass replacing the built-in Gmail outbound adapter",
249
+ )
222
250
 
223
251
 
224
252
  class _MultimodalStorageRedisConfig(_RedisConfig):
@@ -6,6 +6,7 @@ from typing import TYPE_CHECKING
6
6
  if TYPE_CHECKING:
7
7
  from .base import Agent, Session
8
8
 
9
+ from .event import StreamEvent
9
10
  from .model import AgentReply, AgentRequest
10
11
 
11
12
  """
@@ -16,6 +17,26 @@ Currently, they will get only called for the initial execution of an agent when
16
17
  """
17
18
 
18
19
 
20
+ class StreamHalt(Exception):
21
+ """
22
+ Raised by a post-hook to end a streamed run early.
23
+
24
+ Runtime.stream catches it, emits the closing event for any boundary the stream left open, and
25
+ yields one terminal StreamChunk carrying `reason` as its error. The session is not stored, so a
26
+ halted turn leaves no trace in conversation state.
27
+
28
+ The partial response is invalid rather than merely truncated: a client must discard what it has
29
+ already rendered instead of presenting it as a short answer.
30
+ """
31
+
32
+ def __init__(self, reason: str):
33
+ """
34
+ :param reason: Why the run was halted. Reaches the client verbatim as StreamChunk.error.
35
+ """
36
+ super().__init__(reason)
37
+ self.reason = reason
38
+
39
+
19
40
  class PreHook(ABC):
20
41
  @abstractmethod
21
42
  async def on_run(self, session: "Session", agent: "Agent", requests: list[AgentRequest]) -> list[AgentRequest] | AgentReply:
@@ -70,19 +91,38 @@ class PostHook(ABC):
70
91
  """
71
92
  raise NotImplementedError
72
93
 
73
- async def on_stream_chunk(
94
+ async def on_stream_event(
74
95
  self,
75
96
  session: "Session",
76
97
  requests: list[AgentRequest],
77
98
  agent: "Agent",
78
- delta: str,
79
- ) -> str | None:
99
+ event: StreamEvent,
100
+ ) -> StreamEvent | list[StreamEvent] | None:
80
101
  """
81
- Called for each streaming token delta before it is sent to the client.
82
- Return the (optionally modified) delta string, or None to drop the token.
83
- Default implementation passes the delta through unchanged.
102
+ Hook method called for every event a streamed run produces, before it reaches the client.
103
+
104
+ Unlike on_run, this sees the whole stream: message and reasoning text, tool call names,
105
+ arguments and results, and the boundaries that pair them.
106
+
107
+ Returning a list emits several events in place of one, which is what makes hold-and-release
108
+ possible: return None per fragment while accumulating in the session's volatile cache, then
109
+ return [rewritten_payload, closing_event] at the boundary. Accumulate there, not on `self` —
110
+ one hook instance serves every concurrent request. A returned list is emitted as-is and ends
111
+ the chain for that event, so `return event` and `return [event]` are not equivalent.
112
+
113
+ :param: session (Session): The session instance.
114
+ :param: requests (list[AgentRequest]): The requests provided to the agent, after pre-hooks.
115
+ :param: agent (Agent): The agent being streamed.
116
+ :param: event (StreamEvent): The event to process, as produced by the runner or by an
117
+ earlier hook in the chain.
118
+ :return:
119
+ - StreamEvent: The event, or a modified event of the same `type`, to pass on. A
120
+ different `type` raises TypeError; use a list to emit another type.
121
+ - list[StreamEvent]: Emitted in order, in place of `event`, ending the chain for it.
122
+ - None: Drops the event; nothing is sent to the client for it.
123
+ :raises StreamHalt: To end the run without emitting anything further.
84
124
  """
85
- return delta
125
+ return event
86
126
 
87
127
  @abstractmethod
88
128
  def name(self) -> str:
@@ -1,9 +1,9 @@
1
1
  import json
2
2
  import uuid
3
3
  from enum import Enum
4
- from typing import Any, Callable, List, Literal, Optional, Union
4
+ from typing import Annotated, Any, Callable, List, Literal, Optional, Union
5
5
 
6
- from pydantic import BaseModel, ConfigDict, model_validator
6
+ from pydantic import BaseModel, ConfigDict, Field, model_validator
7
7
 
8
8
  from .event import StreamEvent
9
9
 
@@ -125,6 +125,11 @@ class AgentReplyImage(AgentRequestImage):
125
125
  type AgentRequest = Union[AgentRequestText, AgentRequestFile, AgentRequestImage, AgentRequestAny, AgentRequestAttachmentRef]
126
126
  type AgentReply = Union[AgentReplyText, AgentReplyImage, AgentReplyAny]
127
127
 
128
+ AgentRequestUnion = Annotated[
129
+ Union[AgentRequestText, AgentRequestFile, AgentRequestImage, AgentRequestAny, AgentRequestAttachmentRef],
130
+ Field(discriminator="type"),
131
+ ]
132
+
128
133
 
129
134
  class AgentReplyAny(BaseModel):
130
135
  """
@@ -268,10 +273,18 @@ class BaseRunRequest(BaseChatRequest):
268
273
  it delivers, identifying the task and the occurrence this run belongs to. They are
269
274
  typed fields (not extras) so an occurrence's metadata never reaches the agent as
270
275
  additional context.
276
+
277
+ requests carries an already-built AgentRequest list, for producers that compose it
278
+ themselves rather than leaving it to RequestBuilder: a messaging integration downloads
279
+ its attachments at the edge and stores them, so what reaches the queue is a request list
280
+ (including AgentRequestAttachmentRef entries, which files/images cannot express). Typed
281
+ for the same reason as the scheduling fields: an extra would reach the agent as
282
+ AgentRequestAny context.
271
283
  """
272
284
 
273
285
  files: Optional[List[FileData]] = None
274
286
  images: Optional[List[ImageData]] = None
287
+ requests: Optional[List[AgentRequestUnion]] = None
275
288
  scheduled_task_id: Optional[str] = None
276
289
  scheduled_time: Optional[str] = None
277
290
  model_config = ConfigDict(extra="allow")
@@ -1,8 +1,10 @@
1
- """
2
- Storage sub-package for multimodal attachments.
3
-
4
- Provides pluggable storage backends (in_memory, session_cache, redis, dynamodb)
5
- and the ``AttachmentStorageManager`` high-level API.
6
- """
7
-
8
- from .storage_manager import AttachmentStorageManager
1
+ """
2
+ Storage sub-package for multimodal attachments.
3
+
4
+ Provides pluggable storage backends (in_memory, session_cache, redis, dynamodb)
5
+ and the ``AttachmentStorageManager`` high-level API.
6
+ """
7
+
8
+ from .storage_manager import AttachmentStorageManager, StoredAttachment
9
+
10
+ __all__ = ["AttachmentStorageManager", "StoredAttachment"]