agno 1.7.3__tar.gz → 1.7.4__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 (553) hide show
  1. {agno-1.7.3 → agno-1.7.4}/PKG-INFO +1 -1
  2. {agno-1.7.3 → agno-1.7.4}/agno/agent/agent.py +87 -19
  3. {agno-1.7.3 → agno-1.7.4}/agno/api/schemas/agent.py +1 -0
  4. {agno-1.7.3 → agno-1.7.4}/agno/api/schemas/team.py +1 -0
  5. {agno-1.7.3 → agno-1.7.4}/agno/app/playground/app.py +2 -1
  6. {agno-1.7.3 → agno-1.7.4}/agno/app/playground/async_router.py +97 -28
  7. {agno-1.7.3 → agno-1.7.4}/agno/app/playground/operator.py +25 -19
  8. {agno-1.7.3 → agno-1.7.4}/agno/app/playground/schemas.py +1 -0
  9. {agno-1.7.3 → agno-1.7.4}/agno/app/playground/sync_router.py +93 -26
  10. {agno-1.7.3 → agno-1.7.4}/agno/run/base.py +2 -0
  11. {agno-1.7.3 → agno-1.7.4}/agno/run/response.py +4 -4
  12. {agno-1.7.3 → agno-1.7.4}/agno/run/team.py +6 -6
  13. agno-1.7.4/agno/run/v2/workflow.py +563 -0
  14. {agno-1.7.3 → agno-1.7.4}/agno/storage/base.py +4 -4
  15. {agno-1.7.3 → agno-1.7.4}/agno/storage/dynamodb.py +74 -10
  16. {agno-1.7.3 → agno-1.7.4}/agno/storage/firestore.py +6 -1
  17. {agno-1.7.3 → agno-1.7.4}/agno/storage/gcs_json.py +8 -2
  18. {agno-1.7.3 → agno-1.7.4}/agno/storage/json.py +20 -5
  19. {agno-1.7.3 → agno-1.7.4}/agno/storage/mongodb.py +14 -5
  20. {agno-1.7.3 → agno-1.7.4}/agno/storage/mysql.py +56 -17
  21. {agno-1.7.3 → agno-1.7.4}/agno/storage/postgres.py +55 -13
  22. {agno-1.7.3 → agno-1.7.4}/agno/storage/redis.py +25 -5
  23. {agno-1.7.3 → agno-1.7.4}/agno/storage/session/__init__.py +3 -1
  24. {agno-1.7.3 → agno-1.7.4}/agno/storage/session/agent.py +3 -0
  25. {agno-1.7.3 → agno-1.7.4}/agno/storage/session/team.py +3 -0
  26. agno-1.7.4/agno/storage/session/v2/__init__.py +5 -0
  27. agno-1.7.4/agno/storage/session/v2/workflow.py +89 -0
  28. {agno-1.7.3 → agno-1.7.4}/agno/storage/singlestore.py +74 -12
  29. {agno-1.7.3 → agno-1.7.4}/agno/storage/sqlite.py +64 -18
  30. {agno-1.7.3 → agno-1.7.4}/agno/storage/yaml.py +26 -6
  31. {agno-1.7.3 → agno-1.7.4}/agno/team/team.py +85 -16
  32. {agno-1.7.3 → agno-1.7.4}/agno/utils/log.py +12 -0
  33. {agno-1.7.3 → agno-1.7.4}/agno/utils/message.py +5 -1
  34. {agno-1.7.3 → agno-1.7.4}/agno/utils/openai.py +20 -5
  35. {agno-1.7.3 → agno-1.7.4}/agno/utils/pprint.py +32 -8
  36. agno-1.7.4/agno/workflow/v2/__init__.py +21 -0
  37. agno-1.7.4/agno/workflow/v2/condition.py +554 -0
  38. agno-1.7.4/agno/workflow/v2/loop.py +602 -0
  39. agno-1.7.4/agno/workflow/v2/parallel.py +659 -0
  40. agno-1.7.4/agno/workflow/v2/router.py +521 -0
  41. agno-1.7.4/agno/workflow/v2/step.py +861 -0
  42. agno-1.7.4/agno/workflow/v2/steps.py +465 -0
  43. agno-1.7.4/agno/workflow/v2/types.py +347 -0
  44. agno-1.7.4/agno/workflow/v2/workflow.py +3134 -0
  45. agno-1.7.4/agno/workspace/__init__.py +0 -0
  46. {agno-1.7.3 → agno-1.7.4}/agno.egg-info/PKG-INFO +1 -1
  47. {agno-1.7.3 → agno-1.7.4}/agno.egg-info/SOURCES.txt +13 -0
  48. {agno-1.7.3 → agno-1.7.4}/pyproject.toml +1 -1
  49. {agno-1.7.3 → agno-1.7.4}/LICENSE +0 -0
  50. {agno-1.7.3 → agno-1.7.4}/README.md +0 -0
  51. {agno-1.7.3 → agno-1.7.4}/agno/__init__.py +0 -0
  52. {agno-1.7.3 → agno-1.7.4}/agno/agent/__init__.py +0 -0
  53. {agno-1.7.3 → agno-1.7.4}/agno/agent/metrics.py +0 -0
  54. {agno-1.7.3 → agno-1.7.4}/agno/api/__init__.py +0 -0
  55. {agno-1.7.3 → agno-1.7.4}/agno/api/agent.py +0 -0
  56. {agno-1.7.3 → agno-1.7.4}/agno/api/api.py +0 -0
  57. {agno-1.7.3 → agno-1.7.4}/agno/api/app.py +0 -0
  58. {agno-1.7.3 → agno-1.7.4}/agno/api/evals.py +0 -0
  59. {agno-1.7.3 → agno-1.7.4}/agno/api/playground.py +0 -0
  60. {agno-1.7.3 → agno-1.7.4}/agno/api/routes.py +0 -0
  61. {agno-1.7.3 → agno-1.7.4}/agno/api/schemas/__init__.py +0 -0
  62. {agno-1.7.3 → agno-1.7.4}/agno/api/schemas/app.py +0 -0
  63. {agno-1.7.3 → agno-1.7.4}/agno/api/schemas/evals.py +0 -0
  64. {agno-1.7.3 → agno-1.7.4}/agno/api/schemas/playground.py +0 -0
  65. {agno-1.7.3 → agno-1.7.4}/agno/api/schemas/response.py +0 -0
  66. {agno-1.7.3 → agno-1.7.4}/agno/api/schemas/user.py +0 -0
  67. {agno-1.7.3 → agno-1.7.4}/agno/api/schemas/workflows.py +0 -0
  68. {agno-1.7.3 → agno-1.7.4}/agno/api/schemas/workspace.py +0 -0
  69. {agno-1.7.3 → agno-1.7.4}/agno/api/team.py +0 -0
  70. {agno-1.7.3 → agno-1.7.4}/agno/api/user.py +0 -0
  71. {agno-1.7.3 → agno-1.7.4}/agno/api/workflows.py +0 -0
  72. {agno-1.7.3 → agno-1.7.4}/agno/api/workspace.py +0 -0
  73. {agno-1.7.3 → agno-1.7.4}/agno/app/__init__.py +0 -0
  74. {agno-1.7.3 → agno-1.7.4}/agno/app/agui/__init__.py +0 -0
  75. {agno-1.7.3 → agno-1.7.4}/agno/app/agui/app.py +0 -0
  76. {agno-1.7.3 → agno-1.7.4}/agno/app/agui/async_router.py +0 -0
  77. {agno-1.7.3 → agno-1.7.4}/agno/app/agui/sync_router.py +0 -0
  78. {agno-1.7.3 → agno-1.7.4}/agno/app/agui/utils.py +0 -0
  79. {agno-1.7.3 → agno-1.7.4}/agno/app/base.py +0 -0
  80. {agno-1.7.3 → agno-1.7.4}/agno/app/discord/__init__.py +0 -0
  81. {agno-1.7.3 → agno-1.7.4}/agno/app/discord/client.py +0 -0
  82. {agno-1.7.3 → agno-1.7.4}/agno/app/fastapi/__init__.py +0 -0
  83. {agno-1.7.3 → agno-1.7.4}/agno/app/fastapi/app.py +0 -0
  84. {agno-1.7.3 → agno-1.7.4}/agno/app/fastapi/async_router.py +0 -0
  85. {agno-1.7.3 → agno-1.7.4}/agno/app/fastapi/sync_router.py +0 -0
  86. {agno-1.7.3 → agno-1.7.4}/agno/app/playground/__init__.py +0 -0
  87. {agno-1.7.3 → agno-1.7.4}/agno/app/playground/deploy.py +0 -0
  88. {agno-1.7.3 → agno-1.7.4}/agno/app/playground/serve.py +0 -0
  89. {agno-1.7.3 → agno-1.7.4}/agno/app/playground/settings.py +0 -0
  90. {agno-1.7.3 → agno-1.7.4}/agno/app/playground/utils.py +0 -0
  91. {agno-1.7.3 → agno-1.7.4}/agno/app/settings.py +0 -0
  92. {agno-1.7.3 → agno-1.7.4}/agno/app/slack/__init__.py +0 -0
  93. {agno-1.7.3 → agno-1.7.4}/agno/app/slack/app.py +0 -0
  94. {agno-1.7.3 → agno-1.7.4}/agno/app/slack/async_router.py +0 -0
  95. {agno-1.7.3 → agno-1.7.4}/agno/app/slack/security.py +0 -0
  96. {agno-1.7.3 → agno-1.7.4}/agno/app/slack/sync_router.py +0 -0
  97. {agno-1.7.3 → agno-1.7.4}/agno/app/utils.py +0 -0
  98. {agno-1.7.3 → agno-1.7.4}/agno/app/whatsapp/__init__.py +0 -0
  99. {agno-1.7.3 → agno-1.7.4}/agno/app/whatsapp/app.py +0 -0
  100. {agno-1.7.3 → agno-1.7.4}/agno/app/whatsapp/async_router.py +0 -0
  101. {agno-1.7.3 → agno-1.7.4}/agno/app/whatsapp/security.py +0 -0
  102. {agno-1.7.3 → agno-1.7.4}/agno/app/whatsapp/sync_router.py +0 -0
  103. {agno-1.7.3 → agno-1.7.4}/agno/cli/__init__.py +0 -0
  104. {agno-1.7.3 → agno-1.7.4}/agno/cli/auth_server.py +0 -0
  105. {agno-1.7.3 → agno-1.7.4}/agno/cli/config.py +0 -0
  106. {agno-1.7.3 → agno-1.7.4}/agno/cli/console.py +0 -0
  107. {agno-1.7.3 → agno-1.7.4}/agno/cli/credentials.py +0 -0
  108. {agno-1.7.3 → agno-1.7.4}/agno/cli/entrypoint.py +0 -0
  109. {agno-1.7.3 → agno-1.7.4}/agno/cli/operator.py +0 -0
  110. {agno-1.7.3 → agno-1.7.4}/agno/cli/settings.py +0 -0
  111. {agno-1.7.3 → agno-1.7.4}/agno/cli/ws/__init__.py +0 -0
  112. {agno-1.7.3 → agno-1.7.4}/agno/cli/ws/ws_cli.py +0 -0
  113. {agno-1.7.3 → agno-1.7.4}/agno/constants.py +0 -0
  114. {agno-1.7.3 → agno-1.7.4}/agno/debug.py +0 -0
  115. {agno-1.7.3 → agno-1.7.4}/agno/document/__init__.py +0 -0
  116. {agno-1.7.3 → agno-1.7.4}/agno/document/base.py +0 -0
  117. {agno-1.7.3 → agno-1.7.4}/agno/document/chunking/__init__.py +0 -0
  118. {agno-1.7.3 → agno-1.7.4}/agno/document/chunking/agentic.py +0 -0
  119. {agno-1.7.3 → agno-1.7.4}/agno/document/chunking/document.py +0 -0
  120. {agno-1.7.3 → agno-1.7.4}/agno/document/chunking/fixed.py +0 -0
  121. {agno-1.7.3 → agno-1.7.4}/agno/document/chunking/markdown.py +0 -0
  122. {agno-1.7.3 → agno-1.7.4}/agno/document/chunking/recursive.py +0 -0
  123. {agno-1.7.3 → agno-1.7.4}/agno/document/chunking/semantic.py +0 -0
  124. {agno-1.7.3 → agno-1.7.4}/agno/document/chunking/strategy.py +0 -0
  125. {agno-1.7.3 → agno-1.7.4}/agno/document/reader/__init__.py +0 -0
  126. {agno-1.7.3 → agno-1.7.4}/agno/document/reader/arxiv_reader.py +0 -0
  127. {agno-1.7.3 → agno-1.7.4}/agno/document/reader/base.py +0 -0
  128. {agno-1.7.3 → agno-1.7.4}/agno/document/reader/csv_reader.py +0 -0
  129. {agno-1.7.3 → agno-1.7.4}/agno/document/reader/docx_reader.py +0 -0
  130. {agno-1.7.3 → agno-1.7.4}/agno/document/reader/firecrawl_reader.py +0 -0
  131. {agno-1.7.3 → agno-1.7.4}/agno/document/reader/gcs/__init__.py +0 -0
  132. {agno-1.7.3 → agno-1.7.4}/agno/document/reader/gcs/pdf_reader.py +0 -0
  133. {agno-1.7.3 → agno-1.7.4}/agno/document/reader/json_reader.py +0 -0
  134. {agno-1.7.3 → agno-1.7.4}/agno/document/reader/markdown_reader.py +0 -0
  135. {agno-1.7.3 → agno-1.7.4}/agno/document/reader/pdf_reader.py +0 -0
  136. {agno-1.7.3 → agno-1.7.4}/agno/document/reader/s3/__init__.py +0 -0
  137. {agno-1.7.3 → agno-1.7.4}/agno/document/reader/s3/pdf_reader.py +0 -0
  138. {agno-1.7.3 → agno-1.7.4}/agno/document/reader/s3/text_reader.py +0 -0
  139. {agno-1.7.3 → agno-1.7.4}/agno/document/reader/text_reader.py +0 -0
  140. {agno-1.7.3 → agno-1.7.4}/agno/document/reader/url_reader.py +0 -0
  141. {agno-1.7.3 → agno-1.7.4}/agno/document/reader/website_reader.py +0 -0
  142. {agno-1.7.3 → agno-1.7.4}/agno/document/reader/youtube_reader.py +0 -0
  143. {agno-1.7.3 → agno-1.7.4}/agno/embedder/__init__.py +0 -0
  144. {agno-1.7.3 → agno-1.7.4}/agno/embedder/aws_bedrock.py +0 -0
  145. {agno-1.7.3 → agno-1.7.4}/agno/embedder/azure_openai.py +0 -0
  146. {agno-1.7.3 → agno-1.7.4}/agno/embedder/base.py +0 -0
  147. {agno-1.7.3 → agno-1.7.4}/agno/embedder/cohere.py +0 -0
  148. {agno-1.7.3 → agno-1.7.4}/agno/embedder/fastembed.py +0 -0
  149. {agno-1.7.3 → agno-1.7.4}/agno/embedder/fireworks.py +0 -0
  150. {agno-1.7.3 → agno-1.7.4}/agno/embedder/google.py +0 -0
  151. {agno-1.7.3 → agno-1.7.4}/agno/embedder/huggingface.py +0 -0
  152. {agno-1.7.3 → agno-1.7.4}/agno/embedder/langdb.py +0 -0
  153. {agno-1.7.3 → agno-1.7.4}/agno/embedder/mistral.py +0 -0
  154. {agno-1.7.3 → agno-1.7.4}/agno/embedder/nebius.py +0 -0
  155. {agno-1.7.3 → agno-1.7.4}/agno/embedder/ollama.py +0 -0
  156. {agno-1.7.3 → agno-1.7.4}/agno/embedder/openai.py +0 -0
  157. {agno-1.7.3 → agno-1.7.4}/agno/embedder/sentence_transformer.py +0 -0
  158. {agno-1.7.3 → agno-1.7.4}/agno/embedder/together.py +0 -0
  159. {agno-1.7.3 → agno-1.7.4}/agno/embedder/voyageai.py +0 -0
  160. {agno-1.7.3 → agno-1.7.4}/agno/eval/__init__.py +0 -0
  161. {agno-1.7.3 → agno-1.7.4}/agno/eval/accuracy.py +0 -0
  162. {agno-1.7.3 → agno-1.7.4}/agno/eval/performance.py +0 -0
  163. {agno-1.7.3 → agno-1.7.4}/agno/eval/reliability.py +0 -0
  164. {agno-1.7.3 → agno-1.7.4}/agno/eval/utils.py +0 -0
  165. {agno-1.7.3 → agno-1.7.4}/agno/exceptions.py +0 -0
  166. {agno-1.7.3 → agno-1.7.4}/agno/file/__init__.py +0 -0
  167. {agno-1.7.3 → agno-1.7.4}/agno/file/file.py +0 -0
  168. {agno-1.7.3 → agno-1.7.4}/agno/file/local/__init__.py +0 -0
  169. {agno-1.7.3 → agno-1.7.4}/agno/file/local/csv.py +0 -0
  170. {agno-1.7.3 → agno-1.7.4}/agno/file/local/txt.py +0 -0
  171. {agno-1.7.3 → agno-1.7.4}/agno/infra/__init__.py +0 -0
  172. {agno-1.7.3 → agno-1.7.4}/agno/infra/app.py +0 -0
  173. {agno-1.7.3 → agno-1.7.4}/agno/infra/base.py +0 -0
  174. {agno-1.7.3 → agno-1.7.4}/agno/infra/context.py +0 -0
  175. {agno-1.7.3 → agno-1.7.4}/agno/infra/db_app.py +0 -0
  176. {agno-1.7.3 → agno-1.7.4}/agno/infra/resource.py +0 -0
  177. {agno-1.7.3 → agno-1.7.4}/agno/infra/resources.py +0 -0
  178. {agno-1.7.3 → agno-1.7.4}/agno/knowledge/__init__.py +0 -0
  179. {agno-1.7.3 → agno-1.7.4}/agno/knowledge/agent.py +0 -0
  180. {agno-1.7.3 → agno-1.7.4}/agno/knowledge/arxiv.py +0 -0
  181. {agno-1.7.3 → agno-1.7.4}/agno/knowledge/combined.py +0 -0
  182. {agno-1.7.3 → agno-1.7.4}/agno/knowledge/csv.py +0 -0
  183. {agno-1.7.3 → agno-1.7.4}/agno/knowledge/csv_url.py +0 -0
  184. {agno-1.7.3 → agno-1.7.4}/agno/knowledge/document.py +0 -0
  185. {agno-1.7.3 → agno-1.7.4}/agno/knowledge/docx.py +0 -0
  186. {agno-1.7.3 → agno-1.7.4}/agno/knowledge/firecrawl.py +0 -0
  187. {agno-1.7.3 → agno-1.7.4}/agno/knowledge/gcs/__init__.py +0 -0
  188. {agno-1.7.3 → agno-1.7.4}/agno/knowledge/gcs/base.py +0 -0
  189. {agno-1.7.3 → agno-1.7.4}/agno/knowledge/gcs/pdf.py +0 -0
  190. {agno-1.7.3 → agno-1.7.4}/agno/knowledge/json.py +0 -0
  191. {agno-1.7.3 → agno-1.7.4}/agno/knowledge/langchain.py +0 -0
  192. {agno-1.7.3 → agno-1.7.4}/agno/knowledge/light_rag.py +0 -0
  193. {agno-1.7.3 → agno-1.7.4}/agno/knowledge/llamaindex.py +0 -0
  194. {agno-1.7.3 → agno-1.7.4}/agno/knowledge/markdown.py +0 -0
  195. {agno-1.7.3 → agno-1.7.4}/agno/knowledge/pdf.py +0 -0
  196. {agno-1.7.3 → agno-1.7.4}/agno/knowledge/pdf_bytes.py +0 -0
  197. {agno-1.7.3 → agno-1.7.4}/agno/knowledge/pdf_url.py +0 -0
  198. {agno-1.7.3 → agno-1.7.4}/agno/knowledge/s3/__init__.py +0 -0
  199. {agno-1.7.3 → agno-1.7.4}/agno/knowledge/s3/base.py +0 -0
  200. {agno-1.7.3 → agno-1.7.4}/agno/knowledge/s3/pdf.py +0 -0
  201. {agno-1.7.3 → agno-1.7.4}/agno/knowledge/s3/text.py +0 -0
  202. {agno-1.7.3 → agno-1.7.4}/agno/knowledge/text.py +0 -0
  203. {agno-1.7.3 → agno-1.7.4}/agno/knowledge/url.py +0 -0
  204. {agno-1.7.3 → agno-1.7.4}/agno/knowledge/website.py +0 -0
  205. {agno-1.7.3 → agno-1.7.4}/agno/knowledge/wikipedia.py +0 -0
  206. {agno-1.7.3 → agno-1.7.4}/agno/knowledge/youtube.py +0 -0
  207. {agno-1.7.3 → agno-1.7.4}/agno/media.py +0 -0
  208. {agno-1.7.3 → agno-1.7.4}/agno/memory/__init__.py +0 -0
  209. {agno-1.7.3 → agno-1.7.4}/agno/memory/agent.py +0 -0
  210. {agno-1.7.3 → agno-1.7.4}/agno/memory/classifier.py +0 -0
  211. {agno-1.7.3 → agno-1.7.4}/agno/memory/db/__init__.py +0 -0
  212. {agno-1.7.3 → agno-1.7.4}/agno/memory/db/base.py +0 -0
  213. {agno-1.7.3 → agno-1.7.4}/agno/memory/db/mongodb.py +0 -0
  214. {agno-1.7.3 → agno-1.7.4}/agno/memory/db/postgres.py +0 -0
  215. {agno-1.7.3 → agno-1.7.4}/agno/memory/db/sqlite.py +0 -0
  216. {agno-1.7.3 → agno-1.7.4}/agno/memory/manager.py +0 -0
  217. {agno-1.7.3 → agno-1.7.4}/agno/memory/memory.py +0 -0
  218. {agno-1.7.3 → agno-1.7.4}/agno/memory/row.py +0 -0
  219. {agno-1.7.3 → agno-1.7.4}/agno/memory/summarizer.py +0 -0
  220. {agno-1.7.3 → agno-1.7.4}/agno/memory/summary.py +0 -0
  221. {agno-1.7.3 → agno-1.7.4}/agno/memory/team.py +0 -0
  222. {agno-1.7.3 → agno-1.7.4}/agno/memory/v2/__init__.py +0 -0
  223. {agno-1.7.3 → agno-1.7.4}/agno/memory/v2/db/__init__.py +0 -0
  224. {agno-1.7.3 → agno-1.7.4}/agno/memory/v2/db/base.py +0 -0
  225. {agno-1.7.3 → agno-1.7.4}/agno/memory/v2/db/firestore.py +0 -0
  226. {agno-1.7.3 → agno-1.7.4}/agno/memory/v2/db/mongodb.py +0 -0
  227. {agno-1.7.3 → agno-1.7.4}/agno/memory/v2/db/postgres.py +0 -0
  228. {agno-1.7.3 → agno-1.7.4}/agno/memory/v2/db/redis.py +0 -0
  229. {agno-1.7.3 → agno-1.7.4}/agno/memory/v2/db/schema.py +0 -0
  230. {agno-1.7.3 → agno-1.7.4}/agno/memory/v2/db/sqlite.py +0 -0
  231. {agno-1.7.3 → agno-1.7.4}/agno/memory/v2/manager.py +0 -0
  232. {agno-1.7.3 → agno-1.7.4}/agno/memory/v2/memory.py +0 -0
  233. {agno-1.7.3 → agno-1.7.4}/agno/memory/v2/schema.py +0 -0
  234. {agno-1.7.3 → agno-1.7.4}/agno/memory/v2/summarizer.py +0 -0
  235. {agno-1.7.3 → agno-1.7.4}/agno/memory/workflow.py +0 -0
  236. {agno-1.7.3 → agno-1.7.4}/agno/models/__init__.py +0 -0
  237. {agno-1.7.3 → agno-1.7.4}/agno/models/aimlapi/__init__.py +0 -0
  238. {agno-1.7.3 → agno-1.7.4}/agno/models/aimlapi/aimlapi.py +0 -0
  239. {agno-1.7.3 → agno-1.7.4}/agno/models/anthropic/__init__.py +0 -0
  240. {agno-1.7.3 → agno-1.7.4}/agno/models/anthropic/claude.py +0 -0
  241. {agno-1.7.3 → agno-1.7.4}/agno/models/aws/__init__.py +0 -0
  242. {agno-1.7.3 → agno-1.7.4}/agno/models/aws/bedrock.py +0 -0
  243. {agno-1.7.3 → agno-1.7.4}/agno/models/aws/claude.py +0 -0
  244. {agno-1.7.3 → agno-1.7.4}/agno/models/azure/__init__.py +0 -0
  245. {agno-1.7.3 → agno-1.7.4}/agno/models/azure/ai_foundry.py +0 -0
  246. {agno-1.7.3 → agno-1.7.4}/agno/models/azure/openai_chat.py +0 -0
  247. {agno-1.7.3 → agno-1.7.4}/agno/models/base.py +0 -0
  248. {agno-1.7.3 → agno-1.7.4}/agno/models/cerebras/__init__.py +0 -0
  249. {agno-1.7.3 → agno-1.7.4}/agno/models/cerebras/cerebras.py +0 -0
  250. {agno-1.7.3 → agno-1.7.4}/agno/models/cerebras/cerebras_openai.py +0 -0
  251. {agno-1.7.3 → agno-1.7.4}/agno/models/cohere/__init__.py +0 -0
  252. {agno-1.7.3 → agno-1.7.4}/agno/models/cohere/chat.py +0 -0
  253. {agno-1.7.3 → agno-1.7.4}/agno/models/deepinfra/__init__.py +0 -0
  254. {agno-1.7.3 → agno-1.7.4}/agno/models/deepinfra/deepinfra.py +0 -0
  255. {agno-1.7.3 → agno-1.7.4}/agno/models/deepseek/__init__.py +0 -0
  256. {agno-1.7.3 → agno-1.7.4}/agno/models/deepseek/deepseek.py +0 -0
  257. {agno-1.7.3 → agno-1.7.4}/agno/models/defaults.py +0 -0
  258. {agno-1.7.3 → agno-1.7.4}/agno/models/fireworks/__init__.py +0 -0
  259. {agno-1.7.3 → agno-1.7.4}/agno/models/fireworks/fireworks.py +0 -0
  260. {agno-1.7.3 → agno-1.7.4}/agno/models/google/__init__.py +0 -0
  261. {agno-1.7.3 → agno-1.7.4}/agno/models/google/gemini.py +0 -0
  262. {agno-1.7.3 → agno-1.7.4}/agno/models/groq/__init__.py +0 -0
  263. {agno-1.7.3 → agno-1.7.4}/agno/models/groq/groq.py +0 -0
  264. {agno-1.7.3 → agno-1.7.4}/agno/models/huggingface/__init__.py +0 -0
  265. {agno-1.7.3 → agno-1.7.4}/agno/models/huggingface/huggingface.py +0 -0
  266. {agno-1.7.3 → agno-1.7.4}/agno/models/ibm/__init__.py +0 -0
  267. {agno-1.7.3 → agno-1.7.4}/agno/models/ibm/watsonx.py +0 -0
  268. {agno-1.7.3 → agno-1.7.4}/agno/models/internlm/__init__.py +0 -0
  269. {agno-1.7.3 → agno-1.7.4}/agno/models/internlm/internlm.py +0 -0
  270. {agno-1.7.3 → agno-1.7.4}/agno/models/langdb/__init__.py +0 -0
  271. {agno-1.7.3 → agno-1.7.4}/agno/models/langdb/langdb.py +0 -0
  272. {agno-1.7.3 → agno-1.7.4}/agno/models/litellm/__init__.py +0 -0
  273. {agno-1.7.3 → agno-1.7.4}/agno/models/litellm/chat.py +0 -0
  274. {agno-1.7.3 → agno-1.7.4}/agno/models/litellm/litellm_openai.py +0 -0
  275. {agno-1.7.3 → agno-1.7.4}/agno/models/lmstudio/__init__.py +0 -0
  276. {agno-1.7.3 → agno-1.7.4}/agno/models/lmstudio/lmstudio.py +0 -0
  277. {agno-1.7.3 → agno-1.7.4}/agno/models/message.py +0 -0
  278. {agno-1.7.3 → agno-1.7.4}/agno/models/meta/__init__.py +0 -0
  279. {agno-1.7.3 → agno-1.7.4}/agno/models/meta/llama.py +0 -0
  280. {agno-1.7.3 → agno-1.7.4}/agno/models/meta/llama_openai.py +0 -0
  281. {agno-1.7.3 → agno-1.7.4}/agno/models/mistral/__init__.py +0 -0
  282. {agno-1.7.3 → agno-1.7.4}/agno/models/mistral/mistral.py +0 -0
  283. {agno-1.7.3 → agno-1.7.4}/agno/models/nebius/__init__.py +0 -0
  284. {agno-1.7.3 → agno-1.7.4}/agno/models/nebius/nebius.py +0 -0
  285. {agno-1.7.3 → agno-1.7.4}/agno/models/nvidia/__init__.py +0 -0
  286. {agno-1.7.3 → agno-1.7.4}/agno/models/nvidia/nvidia.py +0 -0
  287. {agno-1.7.3 → agno-1.7.4}/agno/models/ollama/__init__.py +0 -0
  288. {agno-1.7.3 → agno-1.7.4}/agno/models/ollama/chat.py +0 -0
  289. {agno-1.7.3 → agno-1.7.4}/agno/models/ollama/tools.py +0 -0
  290. {agno-1.7.3 → agno-1.7.4}/agno/models/openai/__init__.py +0 -0
  291. {agno-1.7.3 → agno-1.7.4}/agno/models/openai/chat.py +0 -0
  292. {agno-1.7.3 → agno-1.7.4}/agno/models/openai/like.py +0 -0
  293. {agno-1.7.3 → agno-1.7.4}/agno/models/openai/responses.py +0 -0
  294. {agno-1.7.3 → agno-1.7.4}/agno/models/openrouter/__init__.py +0 -0
  295. {agno-1.7.3 → agno-1.7.4}/agno/models/openrouter/openrouter.py +0 -0
  296. {agno-1.7.3 → agno-1.7.4}/agno/models/perplexity/__init__.py +0 -0
  297. {agno-1.7.3 → agno-1.7.4}/agno/models/perplexity/perplexity.py +0 -0
  298. {agno-1.7.3 → agno-1.7.4}/agno/models/response.py +0 -0
  299. {agno-1.7.3 → agno-1.7.4}/agno/models/sambanova/__init__.py +0 -0
  300. {agno-1.7.3 → agno-1.7.4}/agno/models/sambanova/sambanova.py +0 -0
  301. {agno-1.7.3 → agno-1.7.4}/agno/models/together/__init__.py +0 -0
  302. {agno-1.7.3 → agno-1.7.4}/agno/models/together/together.py +0 -0
  303. {agno-1.7.3 → agno-1.7.4}/agno/models/vercel/__init__.py +0 -0
  304. {agno-1.7.3 → agno-1.7.4}/agno/models/vercel/v0.py +0 -0
  305. {agno-1.7.3 → agno-1.7.4}/agno/models/vllm/__init__.py +0 -0
  306. {agno-1.7.3 → agno-1.7.4}/agno/models/vllm/vllm.py +0 -0
  307. {agno-1.7.3 → agno-1.7.4}/agno/models/xai/__init__.py +0 -0
  308. {agno-1.7.3 → agno-1.7.4}/agno/models/xai/xai.py +0 -0
  309. {agno-1.7.3 → agno-1.7.4}/agno/playground/__init__.py +0 -0
  310. {agno-1.7.3 → agno-1.7.4}/agno/playground/deploy.py +0 -0
  311. {agno-1.7.3 → agno-1.7.4}/agno/playground/playground.py +0 -0
  312. {agno-1.7.3 → agno-1.7.4}/agno/playground/serve.py +0 -0
  313. {agno-1.7.3 → agno-1.7.4}/agno/playground/settings.py +0 -0
  314. {agno-1.7.3 → agno-1.7.4}/agno/py.typed +0 -0
  315. {agno-1.7.3 → agno-1.7.4}/agno/reasoning/__init__.py +0 -0
  316. {agno-1.7.3 → agno-1.7.4}/agno/reasoning/azure_ai_foundry.py +0 -0
  317. {agno-1.7.3 → agno-1.7.4}/agno/reasoning/deepseek.py +0 -0
  318. {agno-1.7.3 → agno-1.7.4}/agno/reasoning/default.py +0 -0
  319. {agno-1.7.3 → agno-1.7.4}/agno/reasoning/groq.py +0 -0
  320. {agno-1.7.3 → agno-1.7.4}/agno/reasoning/helpers.py +0 -0
  321. {agno-1.7.3 → agno-1.7.4}/agno/reasoning/ollama.py +0 -0
  322. {agno-1.7.3 → agno-1.7.4}/agno/reasoning/openai.py +0 -0
  323. {agno-1.7.3 → agno-1.7.4}/agno/reasoning/step.py +0 -0
  324. {agno-1.7.3 → agno-1.7.4}/agno/reranker/__init__.py +0 -0
  325. {agno-1.7.3 → agno-1.7.4}/agno/reranker/base.py +0 -0
  326. {agno-1.7.3 → agno-1.7.4}/agno/reranker/cohere.py +0 -0
  327. {agno-1.7.3 → agno-1.7.4}/agno/reranker/infinity.py +0 -0
  328. {agno-1.7.3 → agno-1.7.4}/agno/reranker/sentence_transformer.py +0 -0
  329. {agno-1.7.3 → agno-1.7.4}/agno/run/__init__.py +0 -0
  330. {agno-1.7.3 → agno-1.7.4}/agno/run/messages.py +0 -0
  331. {agno-1.7.3/agno/storage → agno-1.7.4/agno/run/v2}/__init__.py +0 -0
  332. {agno-1.7.3 → agno-1.7.4}/agno/run/workflow.py +0 -0
  333. {agno-1.7.3/agno/storage/agent → agno-1.7.4/agno/storage}/__init__.py +0 -0
  334. {agno-1.7.3/agno/storage/workflow → agno-1.7.4/agno/storage/agent}/__init__.py +0 -0
  335. {agno-1.7.3 → agno-1.7.4}/agno/storage/agent/dynamodb.py +0 -0
  336. {agno-1.7.3 → agno-1.7.4}/agno/storage/agent/json.py +0 -0
  337. {agno-1.7.3 → agno-1.7.4}/agno/storage/agent/mongodb.py +0 -0
  338. {agno-1.7.3 → agno-1.7.4}/agno/storage/agent/postgres.py +0 -0
  339. {agno-1.7.3 → agno-1.7.4}/agno/storage/agent/singlestore.py +0 -0
  340. {agno-1.7.3 → agno-1.7.4}/agno/storage/agent/sqlite.py +0 -0
  341. {agno-1.7.3 → agno-1.7.4}/agno/storage/agent/yaml.py +0 -0
  342. {agno-1.7.3 → agno-1.7.4}/agno/storage/session/workflow.py +0 -0
  343. {agno-1.7.3/agno/tools/models → agno-1.7.4/agno/storage/workflow}/__init__.py +0 -0
  344. {agno-1.7.3 → agno-1.7.4}/agno/storage/workflow/mongodb.py +0 -0
  345. {agno-1.7.3 → agno-1.7.4}/agno/storage/workflow/postgres.py +0 -0
  346. {agno-1.7.3 → agno-1.7.4}/agno/storage/workflow/sqlite.py +0 -0
  347. {agno-1.7.3 → agno-1.7.4}/agno/team/__init__.py +0 -0
  348. {agno-1.7.3 → agno-1.7.4}/agno/tools/__init__.py +0 -0
  349. {agno-1.7.3 → agno-1.7.4}/agno/tools/agentql.py +0 -0
  350. {agno-1.7.3 → agno-1.7.4}/agno/tools/airflow.py +0 -0
  351. {agno-1.7.3 → agno-1.7.4}/agno/tools/api.py +0 -0
  352. {agno-1.7.3 → agno-1.7.4}/agno/tools/apify.py +0 -0
  353. {agno-1.7.3 → agno-1.7.4}/agno/tools/arxiv.py +0 -0
  354. {agno-1.7.3 → agno-1.7.4}/agno/tools/aws_lambda.py +0 -0
  355. {agno-1.7.3 → agno-1.7.4}/agno/tools/aws_ses.py +0 -0
  356. {agno-1.7.3 → agno-1.7.4}/agno/tools/baidusearch.py +0 -0
  357. {agno-1.7.3 → agno-1.7.4}/agno/tools/bravesearch.py +0 -0
  358. {agno-1.7.3 → agno-1.7.4}/agno/tools/brightdata.py +0 -0
  359. {agno-1.7.3 → agno-1.7.4}/agno/tools/browserbase.py +0 -0
  360. {agno-1.7.3 → agno-1.7.4}/agno/tools/calcom.py +0 -0
  361. {agno-1.7.3 → agno-1.7.4}/agno/tools/calculator.py +0 -0
  362. {agno-1.7.3 → agno-1.7.4}/agno/tools/cartesia.py +0 -0
  363. {agno-1.7.3 → agno-1.7.4}/agno/tools/clickup_tool.py +0 -0
  364. {agno-1.7.3 → agno-1.7.4}/agno/tools/confluence.py +0 -0
  365. {agno-1.7.3 → agno-1.7.4}/agno/tools/crawl4ai.py +0 -0
  366. {agno-1.7.3 → agno-1.7.4}/agno/tools/csv_toolkit.py +0 -0
  367. {agno-1.7.3 → agno-1.7.4}/agno/tools/dalle.py +0 -0
  368. {agno-1.7.3 → agno-1.7.4}/agno/tools/daytona.py +0 -0
  369. {agno-1.7.3 → agno-1.7.4}/agno/tools/decorator.py +0 -0
  370. {agno-1.7.3 → agno-1.7.4}/agno/tools/desi_vocal.py +0 -0
  371. {agno-1.7.3 → agno-1.7.4}/agno/tools/discord.py +0 -0
  372. {agno-1.7.3 → agno-1.7.4}/agno/tools/docker.py +0 -0
  373. {agno-1.7.3 → agno-1.7.4}/agno/tools/duckdb.py +0 -0
  374. {agno-1.7.3 → agno-1.7.4}/agno/tools/duckduckgo.py +0 -0
  375. {agno-1.7.3 → agno-1.7.4}/agno/tools/e2b.py +0 -0
  376. {agno-1.7.3 → agno-1.7.4}/agno/tools/eleven_labs.py +0 -0
  377. {agno-1.7.3 → agno-1.7.4}/agno/tools/email.py +0 -0
  378. {agno-1.7.3 → agno-1.7.4}/agno/tools/exa.py +0 -0
  379. {agno-1.7.3 → agno-1.7.4}/agno/tools/fal.py +0 -0
  380. {agno-1.7.3 → agno-1.7.4}/agno/tools/file.py +0 -0
  381. {agno-1.7.3 → agno-1.7.4}/agno/tools/financial_datasets.py +0 -0
  382. {agno-1.7.3 → agno-1.7.4}/agno/tools/firecrawl.py +0 -0
  383. {agno-1.7.3 → agno-1.7.4}/agno/tools/function.py +0 -0
  384. {agno-1.7.3 → agno-1.7.4}/agno/tools/giphy.py +0 -0
  385. {agno-1.7.3 → agno-1.7.4}/agno/tools/github.py +0 -0
  386. {agno-1.7.3 → agno-1.7.4}/agno/tools/gmail.py +0 -0
  387. {agno-1.7.3 → agno-1.7.4}/agno/tools/google_bigquery.py +0 -0
  388. {agno-1.7.3 → agno-1.7.4}/agno/tools/google_maps.py +0 -0
  389. {agno-1.7.3 → agno-1.7.4}/agno/tools/googlecalendar.py +0 -0
  390. {agno-1.7.3 → agno-1.7.4}/agno/tools/googlesearch.py +0 -0
  391. {agno-1.7.3 → agno-1.7.4}/agno/tools/googlesheets.py +0 -0
  392. {agno-1.7.3 → agno-1.7.4}/agno/tools/hackernews.py +0 -0
  393. {agno-1.7.3 → agno-1.7.4}/agno/tools/jina.py +0 -0
  394. {agno-1.7.3 → agno-1.7.4}/agno/tools/jira.py +0 -0
  395. {agno-1.7.3 → agno-1.7.4}/agno/tools/knowledge.py +0 -0
  396. {agno-1.7.3 → agno-1.7.4}/agno/tools/linear.py +0 -0
  397. {agno-1.7.3 → agno-1.7.4}/agno/tools/local_file_system.py +0 -0
  398. {agno-1.7.3 → agno-1.7.4}/agno/tools/lumalab.py +0 -0
  399. {agno-1.7.3 → agno-1.7.4}/agno/tools/mcp.py +0 -0
  400. {agno-1.7.3 → agno-1.7.4}/agno/tools/mem0.py +0 -0
  401. {agno-1.7.3 → agno-1.7.4}/agno/tools/mlx_transcribe.py +0 -0
  402. {agno-1.7.3/agno/tools/streamlit → agno-1.7.4/agno/tools/models}/__init__.py +0 -0
  403. {agno-1.7.3 → agno-1.7.4}/agno/tools/models/azure_openai.py +0 -0
  404. {agno-1.7.3 → agno-1.7.4}/agno/tools/models/gemini.py +0 -0
  405. {agno-1.7.3 → agno-1.7.4}/agno/tools/models/groq.py +0 -0
  406. {agno-1.7.3 → agno-1.7.4}/agno/tools/models/nebius.py +0 -0
  407. {agno-1.7.3 → agno-1.7.4}/agno/tools/models_labs.py +0 -0
  408. {agno-1.7.3 → agno-1.7.4}/agno/tools/moviepy_video.py +0 -0
  409. {agno-1.7.3 → agno-1.7.4}/agno/tools/newspaper.py +0 -0
  410. {agno-1.7.3 → agno-1.7.4}/agno/tools/newspaper4k.py +0 -0
  411. {agno-1.7.3 → agno-1.7.4}/agno/tools/openai.py +0 -0
  412. {agno-1.7.3 → agno-1.7.4}/agno/tools/openbb.py +0 -0
  413. {agno-1.7.3 → agno-1.7.4}/agno/tools/opencv.py +0 -0
  414. {agno-1.7.3 → agno-1.7.4}/agno/tools/openweather.py +0 -0
  415. {agno-1.7.3 → agno-1.7.4}/agno/tools/oxylabs.py +0 -0
  416. {agno-1.7.3 → agno-1.7.4}/agno/tools/pandas.py +0 -0
  417. {agno-1.7.3 → agno-1.7.4}/agno/tools/postgres.py +0 -0
  418. {agno-1.7.3 → agno-1.7.4}/agno/tools/pubmed.py +0 -0
  419. {agno-1.7.3 → agno-1.7.4}/agno/tools/python.py +0 -0
  420. {agno-1.7.3 → agno-1.7.4}/agno/tools/reasoning.py +0 -0
  421. {agno-1.7.3 → agno-1.7.4}/agno/tools/reddit.py +0 -0
  422. {agno-1.7.3 → agno-1.7.4}/agno/tools/replicate.py +0 -0
  423. {agno-1.7.3 → agno-1.7.4}/agno/tools/resend.py +0 -0
  424. {agno-1.7.3 → agno-1.7.4}/agno/tools/scrapegraph.py +0 -0
  425. {agno-1.7.3 → agno-1.7.4}/agno/tools/searxng.py +0 -0
  426. {agno-1.7.3 → agno-1.7.4}/agno/tools/serpapi.py +0 -0
  427. {agno-1.7.3 → agno-1.7.4}/agno/tools/serper.py +0 -0
  428. {agno-1.7.3 → agno-1.7.4}/agno/tools/shell.py +0 -0
  429. {agno-1.7.3 → agno-1.7.4}/agno/tools/slack.py +0 -0
  430. {agno-1.7.3 → agno-1.7.4}/agno/tools/sleep.py +0 -0
  431. {agno-1.7.3 → agno-1.7.4}/agno/tools/spider.py +0 -0
  432. {agno-1.7.3 → agno-1.7.4}/agno/tools/sql.py +0 -0
  433. {agno-1.7.3/agno/utils → agno-1.7.4/agno/tools/streamlit}/__init__.py +0 -0
  434. {agno-1.7.3 → agno-1.7.4}/agno/tools/streamlit/components.py +0 -0
  435. {agno-1.7.3 → agno-1.7.4}/agno/tools/tavily.py +0 -0
  436. {agno-1.7.3 → agno-1.7.4}/agno/tools/telegram.py +0 -0
  437. {agno-1.7.3 → agno-1.7.4}/agno/tools/thinking.py +0 -0
  438. {agno-1.7.3 → agno-1.7.4}/agno/tools/todoist.py +0 -0
  439. {agno-1.7.3 → agno-1.7.4}/agno/tools/tool_registry.py +0 -0
  440. {agno-1.7.3 → agno-1.7.4}/agno/tools/toolkit.py +0 -0
  441. {agno-1.7.3 → agno-1.7.4}/agno/tools/trello.py +0 -0
  442. {agno-1.7.3 → agno-1.7.4}/agno/tools/twilio.py +0 -0
  443. {agno-1.7.3 → agno-1.7.4}/agno/tools/user_control_flow.py +0 -0
  444. {agno-1.7.3 → agno-1.7.4}/agno/tools/valyu.py +0 -0
  445. {agno-1.7.3 → agno-1.7.4}/agno/tools/visualization.py +0 -0
  446. {agno-1.7.3 → agno-1.7.4}/agno/tools/webbrowser.py +0 -0
  447. {agno-1.7.3 → agno-1.7.4}/agno/tools/webex.py +0 -0
  448. {agno-1.7.3 → agno-1.7.4}/agno/tools/website.py +0 -0
  449. {agno-1.7.3 → agno-1.7.4}/agno/tools/webtools.py +0 -0
  450. {agno-1.7.3 → agno-1.7.4}/agno/tools/whatsapp.py +0 -0
  451. {agno-1.7.3 → agno-1.7.4}/agno/tools/wikipedia.py +0 -0
  452. {agno-1.7.3 → agno-1.7.4}/agno/tools/x.py +0 -0
  453. {agno-1.7.3 → agno-1.7.4}/agno/tools/yfinance.py +0 -0
  454. {agno-1.7.3 → agno-1.7.4}/agno/tools/youtube.py +0 -0
  455. {agno-1.7.3 → agno-1.7.4}/agno/tools/zendesk.py +0 -0
  456. {agno-1.7.3 → agno-1.7.4}/agno/tools/zep.py +0 -0
  457. {agno-1.7.3 → agno-1.7.4}/agno/tools/zoom.py +0 -0
  458. {agno-1.7.3/agno/utils/models → agno-1.7.4/agno/utils}/__init__.py +0 -0
  459. {agno-1.7.3 → agno-1.7.4}/agno/utils/audio.py +0 -0
  460. {agno-1.7.3 → agno-1.7.4}/agno/utils/certs.py +0 -0
  461. {agno-1.7.3 → agno-1.7.4}/agno/utils/code_execution.py +0 -0
  462. {agno-1.7.3 → agno-1.7.4}/agno/utils/common.py +0 -0
  463. {agno-1.7.3 → agno-1.7.4}/agno/utils/defaults.py +0 -0
  464. {agno-1.7.3 → agno-1.7.4}/agno/utils/dttm.py +0 -0
  465. {agno-1.7.3 → agno-1.7.4}/agno/utils/enum.py +0 -0
  466. {agno-1.7.3 → agno-1.7.4}/agno/utils/env.py +0 -0
  467. {agno-1.7.3 → agno-1.7.4}/agno/utils/events.py +0 -0
  468. {agno-1.7.3 → agno-1.7.4}/agno/utils/filesystem.py +0 -0
  469. {agno-1.7.3 → agno-1.7.4}/agno/utils/format_str.py +0 -0
  470. {agno-1.7.3 → agno-1.7.4}/agno/utils/functions.py +0 -0
  471. {agno-1.7.3 → agno-1.7.4}/agno/utils/gemini.py +0 -0
  472. {agno-1.7.3 → agno-1.7.4}/agno/utils/git.py +0 -0
  473. {agno-1.7.3 → agno-1.7.4}/agno/utils/http.py +0 -0
  474. {agno-1.7.3 → agno-1.7.4}/agno/utils/json_io.py +0 -0
  475. {agno-1.7.3 → agno-1.7.4}/agno/utils/json_schema.py +0 -0
  476. {agno-1.7.3 → agno-1.7.4}/agno/utils/load_env.py +0 -0
  477. {agno-1.7.3 → agno-1.7.4}/agno/utils/location.py +0 -0
  478. {agno-1.7.3 → agno-1.7.4}/agno/utils/mcp.py +0 -0
  479. {agno-1.7.3 → agno-1.7.4}/agno/utils/media.py +0 -0
  480. {agno-1.7.3 → agno-1.7.4}/agno/utils/merge_dict.py +0 -0
  481. {agno-1.7.3/agno/workspace → agno-1.7.4/agno/utils/models}/__init__.py +0 -0
  482. {agno-1.7.3 → agno-1.7.4}/agno/utils/models/ai_foundry.py +0 -0
  483. {agno-1.7.3 → agno-1.7.4}/agno/utils/models/aws_claude.py +0 -0
  484. {agno-1.7.3 → agno-1.7.4}/agno/utils/models/claude.py +0 -0
  485. {agno-1.7.3 → agno-1.7.4}/agno/utils/models/cohere.py +0 -0
  486. {agno-1.7.3 → agno-1.7.4}/agno/utils/models/llama.py +0 -0
  487. {agno-1.7.3 → agno-1.7.4}/agno/utils/models/mistral.py +0 -0
  488. {agno-1.7.3 → agno-1.7.4}/agno/utils/models/openai_responses.py +0 -0
  489. {agno-1.7.3 → agno-1.7.4}/agno/utils/models/schema_utils.py +0 -0
  490. {agno-1.7.3 → agno-1.7.4}/agno/utils/models/watsonx.py +0 -0
  491. {agno-1.7.3 → agno-1.7.4}/agno/utils/pickle.py +0 -0
  492. {agno-1.7.3 → agno-1.7.4}/agno/utils/prompts.py +0 -0
  493. {agno-1.7.3 → agno-1.7.4}/agno/utils/py_io.py +0 -0
  494. {agno-1.7.3 → agno-1.7.4}/agno/utils/pyproject.py +0 -0
  495. {agno-1.7.3 → agno-1.7.4}/agno/utils/resource_filter.py +0 -0
  496. {agno-1.7.3 → agno-1.7.4}/agno/utils/response.py +0 -0
  497. {agno-1.7.3 → agno-1.7.4}/agno/utils/response_iterator.py +0 -0
  498. {agno-1.7.3 → agno-1.7.4}/agno/utils/safe_formatter.py +0 -0
  499. {agno-1.7.3 → agno-1.7.4}/agno/utils/shell.py +0 -0
  500. {agno-1.7.3 → agno-1.7.4}/agno/utils/string.py +0 -0
  501. {agno-1.7.3 → agno-1.7.4}/agno/utils/timer.py +0 -0
  502. {agno-1.7.3 → agno-1.7.4}/agno/utils/tools.py +0 -0
  503. {agno-1.7.3 → agno-1.7.4}/agno/utils/web.py +0 -0
  504. {agno-1.7.3 → agno-1.7.4}/agno/utils/whatsapp.py +0 -0
  505. {agno-1.7.3 → agno-1.7.4}/agno/utils/yaml_io.py +0 -0
  506. {agno-1.7.3 → agno-1.7.4}/agno/vectordb/__init__.py +0 -0
  507. {agno-1.7.3 → agno-1.7.4}/agno/vectordb/base.py +0 -0
  508. {agno-1.7.3 → agno-1.7.4}/agno/vectordb/cassandra/__init__.py +0 -0
  509. {agno-1.7.3 → agno-1.7.4}/agno/vectordb/cassandra/cassandra.py +0 -0
  510. {agno-1.7.3 → agno-1.7.4}/agno/vectordb/cassandra/extra_param_mixin.py +0 -0
  511. {agno-1.7.3 → agno-1.7.4}/agno/vectordb/cassandra/index.py +0 -0
  512. {agno-1.7.3 → agno-1.7.4}/agno/vectordb/chroma/__init__.py +0 -0
  513. {agno-1.7.3 → agno-1.7.4}/agno/vectordb/chroma/chromadb.py +0 -0
  514. {agno-1.7.3 → agno-1.7.4}/agno/vectordb/clickhouse/__init__.py +0 -0
  515. {agno-1.7.3 → agno-1.7.4}/agno/vectordb/clickhouse/clickhousedb.py +0 -0
  516. {agno-1.7.3 → agno-1.7.4}/agno/vectordb/clickhouse/index.py +0 -0
  517. {agno-1.7.3 → agno-1.7.4}/agno/vectordb/couchbase/__init__.py +0 -0
  518. {agno-1.7.3 → agno-1.7.4}/agno/vectordb/couchbase/couchbase.py +0 -0
  519. {agno-1.7.3 → agno-1.7.4}/agno/vectordb/distance.py +0 -0
  520. {agno-1.7.3 → agno-1.7.4}/agno/vectordb/lancedb/__init__.py +0 -0
  521. {agno-1.7.3 → agno-1.7.4}/agno/vectordb/lancedb/lance_db.py +0 -0
  522. {agno-1.7.3 → agno-1.7.4}/agno/vectordb/milvus/__init__.py +0 -0
  523. {agno-1.7.3 → agno-1.7.4}/agno/vectordb/milvus/milvus.py +0 -0
  524. {agno-1.7.3 → agno-1.7.4}/agno/vectordb/mongodb/__init__.py +0 -0
  525. {agno-1.7.3 → agno-1.7.4}/agno/vectordb/mongodb/mongodb.py +0 -0
  526. {agno-1.7.3 → agno-1.7.4}/agno/vectordb/pgvector/__init__.py +0 -0
  527. {agno-1.7.3 → agno-1.7.4}/agno/vectordb/pgvector/index.py +0 -0
  528. {agno-1.7.3 → agno-1.7.4}/agno/vectordb/pgvector/pgvector.py +0 -0
  529. {agno-1.7.3 → agno-1.7.4}/agno/vectordb/pineconedb/__init__.py +0 -0
  530. {agno-1.7.3 → agno-1.7.4}/agno/vectordb/pineconedb/pineconedb.py +0 -0
  531. {agno-1.7.3 → agno-1.7.4}/agno/vectordb/qdrant/__init__.py +0 -0
  532. {agno-1.7.3 → agno-1.7.4}/agno/vectordb/qdrant/qdrant.py +0 -0
  533. {agno-1.7.3 → agno-1.7.4}/agno/vectordb/search.py +0 -0
  534. {agno-1.7.3 → agno-1.7.4}/agno/vectordb/singlestore/__init__.py +0 -0
  535. {agno-1.7.3 → agno-1.7.4}/agno/vectordb/singlestore/index.py +0 -0
  536. {agno-1.7.3 → agno-1.7.4}/agno/vectordb/singlestore/singlestore.py +0 -0
  537. {agno-1.7.3 → agno-1.7.4}/agno/vectordb/upstashdb/__init__.py +0 -0
  538. {agno-1.7.3 → agno-1.7.4}/agno/vectordb/upstashdb/upstashdb.py +0 -0
  539. {agno-1.7.3 → agno-1.7.4}/agno/vectordb/weaviate/__init__.py +0 -0
  540. {agno-1.7.3 → agno-1.7.4}/agno/vectordb/weaviate/index.py +0 -0
  541. {agno-1.7.3 → agno-1.7.4}/agno/vectordb/weaviate/weaviate.py +0 -0
  542. {agno-1.7.3 → agno-1.7.4}/agno/workflow/__init__.py +0 -0
  543. {agno-1.7.3 → agno-1.7.4}/agno/workflow/workflow.py +0 -0
  544. {agno-1.7.3 → agno-1.7.4}/agno/workspace/config.py +0 -0
  545. {agno-1.7.3 → agno-1.7.4}/agno/workspace/enums.py +0 -0
  546. {agno-1.7.3 → agno-1.7.4}/agno/workspace/helpers.py +0 -0
  547. {agno-1.7.3 → agno-1.7.4}/agno/workspace/operator.py +0 -0
  548. {agno-1.7.3 → agno-1.7.4}/agno/workspace/settings.py +0 -0
  549. {agno-1.7.3 → agno-1.7.4}/agno.egg-info/dependency_links.txt +0 -0
  550. {agno-1.7.3 → agno-1.7.4}/agno.egg-info/entry_points.txt +0 -0
  551. {agno-1.7.3 → agno-1.7.4}/agno.egg-info/requires.txt +0 -0
  552. {agno-1.7.3 → agno-1.7.4}/agno.egg-info/top_level.txt +0 -0
  553. {agno-1.7.3 → agno-1.7.4}/setup.cfg +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: agno
3
- Version: 1.7.3
3
+ Version: 1.7.4
4
4
  Summary: Agno: a lightweight library for building Multi-Agent Systems
5
5
  Author-email: Ashpreet Bedi <ashpreet@agno.com>
6
6
  License: Copyright (c) Agno, Inc.
@@ -318,9 +318,13 @@ class Agent:
318
318
 
319
319
  # Optional workflow ID. Indicates this agent is part of a workflow.
320
320
  workflow_id: Optional[str] = None
321
+ # Set when this agent is part of a workflow.
322
+ workflow_session_id: Optional[str] = None
321
323
 
322
324
  # Optional team session state. Set by the team leader agent.
323
325
  team_session_state: Optional[Dict[str, Any]] = None
326
+ # Optional workflow session state. Set by the workflow.
327
+ workflow_session_state: Optional[Dict[str, Any]] = None
324
328
 
325
329
  # --- Debug & Monitoring ---
326
330
  # Enable debug logs
@@ -543,7 +547,7 @@ class Agent:
543
547
  self.session_metrics: Optional[SessionMetrics] = None
544
548
 
545
549
  self.run_id: Optional[str] = None
546
- self.run_input: Optional[Union[str, List, Dict, Message]] = None
550
+ self.run_input: Optional[Union[str, List, Dict, Message, BaseModel]] = None
547
551
  self.run_messages: Optional[RunMessages] = None
548
552
  self.run_response: Optional[RunResponse] = None
549
553
 
@@ -695,10 +699,14 @@ class Agent:
695
699
  self.session_state["current_user_id"] = user_id
696
700
  if self.team_session_state is not None:
697
701
  self.team_session_state["current_user_id"] = user_id
702
+ if self.workflow_session_state is not None:
703
+ self.workflow_session_state["current_user_id"] = user_id
698
704
  if session_id is not None:
699
705
  self.session_state["current_session_id"] = session_id
700
706
  if self.team_session_state is not None:
701
707
  self.team_session_state["current_session_id"] = session_id
708
+ if self.workflow_session_state is not None:
709
+ self.workflow_session_state["current_user_id"] = user_id
702
710
 
703
711
  def _reset_session_state(self) -> None:
704
712
  """Reset the session state for the agent."""
@@ -929,7 +937,7 @@ class Agent:
929
937
  @overload
930
938
  def run(
931
939
  self,
932
- message: Optional[Union[str, List, Dict, Message]] = None,
940
+ message: Optional[Union[str, List, Dict, Message, BaseModel]] = None,
933
941
  *,
934
942
  stream: Literal[False] = False,
935
943
  stream_intermediate_steps: Optional[bool] = None,
@@ -950,7 +958,7 @@ class Agent:
950
958
  @overload
951
959
  def run(
952
960
  self,
953
- message: Optional[Union[str, List, Dict, Message]] = None,
961
+ message: Optional[Union[str, List, Dict, Message, BaseModel]] = None,
954
962
  *,
955
963
  stream: Literal[True] = True,
956
964
  stream_intermediate_steps: Optional[bool] = None,
@@ -970,7 +978,7 @@ class Agent:
970
978
 
971
979
  def run(
972
980
  self,
973
- message: Optional[Union[str, List, Dict, Message]] = None,
981
+ message: Optional[Union[str, List, Dict, Message, BaseModel]] = None,
974
982
  *,
975
983
  stream: Optional[bool] = None,
976
984
  stream_intermediate_steps: Optional[bool] = None,
@@ -1346,7 +1354,7 @@ class Agent:
1346
1354
 
1347
1355
  async def arun(
1348
1356
  self,
1349
- message: Optional[Union[str, List, Dict, Message]] = None,
1357
+ message: Optional[Union[str, List, Dict, Message, BaseModel]] = None,
1350
1358
  *,
1351
1359
  stream: Optional[bool] = None,
1352
1360
  user_id: Optional[str] = None,
@@ -3869,6 +3877,8 @@ class Agent:
3869
3877
  session_data["session_state"] = self.session_state
3870
3878
  if self.team_session_state is not None and len(self.team_session_state) > 0:
3871
3879
  session_data["team_session_state"] = self.team_session_state
3880
+ if self.workflow_session_state is not None and len(self.workflow_session_state) > 0:
3881
+ session_data["workflow_session_state"] = self.workflow_session_state
3872
3882
  if self.session_metrics is not None:
3873
3883
  session_data["session_metrics"] = asdict(self.session_metrics) if self.session_metrics is not None else None
3874
3884
  if self.team_data is not None:
@@ -3905,12 +3915,15 @@ class Agent:
3905
3915
  memory_dict = None
3906
3916
 
3907
3917
  self.team_session_id = cast(str, self.team_session_id)
3918
+ self.workflow_session_id = cast(str, self.workflow_session_id)
3919
+
3908
3920
  self.agent_id = cast(str, self.agent_id)
3909
3921
  return AgentSession(
3910
3922
  session_id=session_id,
3911
3923
  agent_id=self.agent_id,
3912
3924
  user_id=user_id,
3913
3925
  team_session_id=self.team_session_id,
3926
+ workflow_session_id=self.workflow_session_id,
3914
3927
  memory=memory_dict,
3915
3928
  agent_data=self.get_agent_data(),
3916
3929
  session_data=self.get_session_data(),
@@ -3921,6 +3934,9 @@ class Agent:
3921
3934
  def load_agent_session(self, session: AgentSession):
3922
3935
  """Load the existing Agent from an AgentSession (from the database)"""
3923
3936
 
3937
+ if not hasattr(session, "memory"):
3938
+ return
3939
+
3924
3940
  from agno.utils.merge_dict import merge_dictionaries
3925
3941
 
3926
3942
  # Get the agent_id, user_id and session_id from the database
@@ -3977,6 +3993,22 @@ class Agent:
3977
3993
  # Update the current team_session_state
3978
3994
  self.team_session_state = team_session_state_from_db
3979
3995
 
3996
+ if "workflow_session_state" in session.session_data:
3997
+ workflow_session_state_from_db = session.session_data.get("workflow_session_state")
3998
+ if (
3999
+ workflow_session_state_from_db is not None
4000
+ and isinstance(workflow_session_state_from_db, dict)
4001
+ and len(workflow_session_state_from_db) > 0
4002
+ ):
4003
+ # If the workflow_session_state is already set, merge the workflow_session_state from the database with the current workflow_session_state
4004
+ if self.workflow_session_state is not None and len(self.workflow_session_state) > 0:
4005
+ # This updates workflow_session_state_from_db
4006
+ # If there are conflicting keys, values from workflow_session_state_from_db will take precedence
4007
+ merge_dictionaries(self.workflow_session_state, workflow_session_state_from_db)
4008
+ else:
4009
+ # Update the current workflow_session_state
4010
+ self.workflow_session_state = workflow_session_state_from_db
4011
+
3980
4012
  # Get the session_metrics from the database
3981
4013
  if "session_metrics" in session.session_data:
3982
4014
  session_metrics_from_db = session.session_data.get("session_metrics")
@@ -4147,10 +4179,10 @@ class Agent:
4147
4179
  if not self.storage:
4148
4180
  return
4149
4181
 
4150
- agent_session_from_db = self.storage.read(session_id=session_id)
4182
+ agent_session_from_db = self.storage.read(session_id=session_id) # type: ignore
4151
4183
  if (
4152
4184
  agent_session_from_db is not None
4153
- and agent_session_from_db.memory is not None
4185
+ and agent_session_from_db.memory is not None # type: ignore
4154
4186
  and "runs" in agent_session_from_db.memory # type: ignore
4155
4187
  ):
4156
4188
  if isinstance(self.memory, AgentMemory):
@@ -4278,6 +4310,7 @@ class Agent:
4278
4310
  format_variables = ChainMap(
4279
4311
  self.session_state or {},
4280
4312
  self.team_session_state or {},
4313
+ self.workflow_session_state or {},
4281
4314
  self.context or {},
4282
4315
  self.extra_data or {},
4283
4316
  {"user_id": self.user_id} if self.user_id is not None else {},
@@ -4614,7 +4647,7 @@ class Agent:
4614
4647
  def get_user_message(
4615
4648
  self,
4616
4649
  *,
4617
- message: Optional[Union[str, List]],
4650
+ message: Optional[Union[str, List, Dict, Message, BaseModel]] = None,
4618
4651
  audio: Optional[Sequence[Audio]] = None,
4619
4652
  images: Optional[Sequence[Image]] = None,
4620
4653
  videos: Optional[Sequence[Video]] = None,
@@ -4687,7 +4720,7 @@ class Agent:
4687
4720
  )
4688
4721
 
4689
4722
  # 2. If create_default_user_message is False or message is a list, return the message as is.
4690
- if not self.create_default_user_message or isinstance(message, list):
4723
+ if not self.create_default_user_message:
4691
4724
  return Message(
4692
4725
  role=self.user_message_role,
4693
4726
  content=message,
@@ -4698,6 +4731,24 @@ class Agent:
4698
4731
  **kwargs,
4699
4732
  )
4700
4733
 
4734
+ # Handle list messages by converting to string
4735
+ if isinstance(message, list):
4736
+ # Convert list to string (join with newlines if all elements are strings)
4737
+ if all(isinstance(item, str) for item in message):
4738
+ message_content = "\n".join(message)
4739
+ else:
4740
+ message_content = str(message)
4741
+
4742
+ return Message(
4743
+ role=self.user_message_role,
4744
+ content=message_content,
4745
+ images=images,
4746
+ audio=audio,
4747
+ videos=videos,
4748
+ files=files,
4749
+ **kwargs,
4750
+ )
4751
+
4701
4752
  # 3. Build the default user message for the Agent
4702
4753
  if message is None:
4703
4754
  # If we have any media, return a message with empty content
@@ -4719,6 +4770,10 @@ class Agent:
4719
4770
  # Format the message with the session state variables
4720
4771
  if self.add_state_in_messages:
4721
4772
  user_msg_content = self.format_message_with_state_variables(message)
4773
+
4774
+ # Convert to string for concatenation operations
4775
+ user_msg_content_str = get_text_from_message(user_msg_content) if user_msg_content is not None else ""
4776
+
4722
4777
  # 4.1 Add references to user message
4723
4778
  if (
4724
4779
  self.add_references
@@ -4726,15 +4781,18 @@ class Agent:
4726
4781
  and references.references is not None
4727
4782
  and len(references.references) > 0
4728
4783
  ):
4729
- user_msg_content += "\n\nUse the following references from the knowledge base if it helps:\n"
4730
- user_msg_content += "<references>\n"
4731
- user_msg_content += self.convert_documents_to_string(references.references) + "\n"
4732
- user_msg_content += "</references>"
4784
+ user_msg_content_str += "\n\nUse the following references from the knowledge base if it helps:\n"
4785
+ user_msg_content_str += "<references>\n"
4786
+ user_msg_content_str += self.convert_documents_to_string(references.references) + "\n"
4787
+ user_msg_content_str += "</references>"
4733
4788
  # 4.2 Add context to user message
4734
4789
  if self.add_context and self.context is not None:
4735
- user_msg_content += "\n\n<context>\n"
4736
- user_msg_content += self.convert_context_to_string(self.context) + "\n"
4737
- user_msg_content += "</context>"
4790
+ user_msg_content_str += "\n\n<context>\n"
4791
+ user_msg_content_str += self.convert_context_to_string(self.context) + "\n"
4792
+ user_msg_content_str += "</context>"
4793
+
4794
+ # Use the string version for the final content
4795
+ user_msg_content = user_msg_content_str
4738
4796
 
4739
4797
  # Return the user message
4740
4798
  return Message(
@@ -4750,7 +4808,7 @@ class Agent:
4750
4808
  def get_run_messages(
4751
4809
  self,
4752
4810
  *,
4753
- message: Optional[Union[str, List, Dict, Message]] = None,
4811
+ message: Optional[Union[str, List, Dict, Message, BaseModel]] = None,
4754
4812
  session_id: str,
4755
4813
  user_id: Optional[str] = None,
4756
4814
  audio: Optional[Sequence[Audio]] = None,
@@ -4877,6 +4935,14 @@ class Agent:
4877
4935
  user_message = Message.model_validate(message)
4878
4936
  except Exception as e:
4879
4937
  log_warning(f"Failed to validate message: {e}")
4938
+ # 4.4 If message is provided as a BaseModel, convert it to a Message
4939
+ elif isinstance(message, BaseModel):
4940
+ try:
4941
+ # Create a user message with the BaseModel content
4942
+ content = message.model_dump_json(indent=2, exclude_none=True)
4943
+ user_message = Message(role=self.user_message_role, content=content)
4944
+ except Exception as e:
4945
+ log_warning(f"Failed to convert BaseModel to message: {e}")
4880
4946
  # Add user message to run_messages
4881
4947
  if user_message is not None:
4882
4948
  run_messages.user_message = user_message
@@ -6731,6 +6797,7 @@ class Agent:
6731
6797
  session_id=agent_session.session_id,
6732
6798
  agent_data=agent_session.to_dict() if self.monitoring else agent_session.telemetry_data(),
6733
6799
  team_session_id=agent_session.team_session_id,
6800
+ workflow_session_id=agent_session.workflow_session_id,
6734
6801
  ),
6735
6802
  monitor=self.monitoring,
6736
6803
  )
@@ -6758,6 +6825,7 @@ class Agent:
6758
6825
  session_id=agent_session.session_id,
6759
6826
  agent_data=agent_session.to_dict() if self.monitoring else agent_session.telemetry_data(),
6760
6827
  team_session_id=agent_session.team_session_id,
6828
+ workflow_session_id=agent_session.workflow_session_id,
6761
6829
  ),
6762
6830
  monitor=self.monitoring,
6763
6831
  )
@@ -6770,7 +6838,7 @@ class Agent:
6770
6838
 
6771
6839
  def print_response(
6772
6840
  self,
6773
- message: Optional[Union[List, Dict, str, Message]] = None,
6841
+ message: Optional[Union[List, Dict, str, Message, BaseModel]] = None,
6774
6842
  *,
6775
6843
  session_id: Optional[str] = None,
6776
6844
  session_state: Optional[Dict[str, Any]] = None,
@@ -7219,7 +7287,7 @@ class Agent:
7219
7287
 
7220
7288
  async def aprint_response(
7221
7289
  self,
7222
- message: Optional[Union[List, Dict, str, Message]] = None,
7290
+ message: Optional[Union[List, Dict, str, Message, BaseModel]] = None,
7223
7291
  *,
7224
7292
  messages: Optional[List[Union[Dict, Message]]] = None,
7225
7293
  session_id: Optional[str] = None,
@@ -15,6 +15,7 @@ class AgentRunCreate(BaseModel):
15
15
 
16
16
  session_id: str
17
17
  team_session_id: Optional[str] = None
18
+ workflow_session_id: Optional[str] = None
18
19
  run_id: Optional[str] = None
19
20
  run_data: Optional[Dict[str, Any]] = None
20
21
  agent_data: Optional[Dict[str, Any]] = None
@@ -15,6 +15,7 @@ class TeamRunCreate(BaseModel):
15
15
 
16
16
  session_id: str
17
17
  team_session_id: Optional[str] = None
18
+ workflow_session_id: Optional[str] = None
18
19
  run_id: Optional[str] = None
19
20
  run_data: Optional[Dict[str, Any]] = None
20
21
  team_data: Optional[Dict[str, Any]] = None
@@ -83,7 +83,7 @@ class Playground:
83
83
 
84
84
  if self.workflows:
85
85
  for workflow in self.workflows:
86
- if not workflow.app_id:
86
+ if hasattr(workflow, "app_id") and not workflow.app_id:
87
87
  workflow.app_id = self.app_id
88
88
  if not workflow.workflow_id:
89
89
  workflow.workflow_id = generate_id(workflow.name)
@@ -197,6 +197,7 @@ class Playground:
197
197
  # Print the panel
198
198
  console.print(panel)
199
199
  self.set_app_id()
200
+
200
201
  self.register_app_on_platform()
201
202
 
202
203
  uvicorn.run(app=app, host=host, port=port, reload=reload, **kwargs)
@@ -38,11 +38,13 @@ from agno.memory.agent import AgentMemory
38
38
  from agno.memory.v2 import Memory
39
39
  from agno.run.response import RunResponseErrorEvent, RunResponseEvent
40
40
  from agno.run.team import RunResponseErrorEvent as TeamRunResponseErrorEvent
41
+ from agno.run.v2.workflow import WorkflowErrorEvent
41
42
  from agno.storage.session.agent import AgentSession
42
43
  from agno.storage.session.team import TeamSession
43
44
  from agno.storage.session.workflow import WorkflowSession
44
45
  from agno.team.team import Team
45
46
  from agno.utils.log import logger
47
+ from agno.workflow.v2.workflow import Workflow as WorkflowV2
46
48
  from agno.workflow.workflow import Workflow
47
49
 
48
50
 
@@ -146,6 +148,31 @@ async def team_chat_response_streamer(
146
148
  return
147
149
 
148
150
 
151
+ async def workflow_response_streamer(
152
+ workflow: WorkflowV2,
153
+ body: WorkflowRunRequest,
154
+ ) -> AsyncGenerator:
155
+ try:
156
+ run_response = await workflow.arun(
157
+ **body.input,
158
+ user_id=body.user_id,
159
+ session_id=body.session_id or str(uuid4()),
160
+ stream=True,
161
+ stream_intermediate_steps=True,
162
+ )
163
+ async for run_response_chunk in run_response:
164
+ yield run_response_chunk.to_json()
165
+ except Exception as e:
166
+ import traceback
167
+
168
+ traceback.print_exc(limit=3)
169
+ error_response = WorkflowErrorEvent(
170
+ error=str(e),
171
+ )
172
+ yield error_response.to_json()
173
+ return
174
+
175
+
149
176
  def get_async_playground_router(
150
177
  agents: Optional[List[Agent]] = None,
151
178
  workflows: Optional[List[Workflow]] = None,
@@ -616,13 +643,22 @@ def get_async_playground_router(
616
643
  if workflow is None:
617
644
  raise HTTPException(status_code=404, detail="Workflow not found")
618
645
 
619
- return WorkflowGetResponse(
620
- workflow_id=workflow.workflow_id,
621
- name=workflow.name,
622
- description=workflow.description,
623
- parameters=workflow._run_parameters or {},
624
- storage=workflow.storage.__class__.__name__ if workflow.storage else None,
625
- )
646
+ if isinstance(workflow, Workflow):
647
+ return WorkflowGetResponse(
648
+ workflow_id=workflow.workflow_id,
649
+ name=workflow.name,
650
+ description=workflow.description,
651
+ parameters=workflow._run_parameters or {},
652
+ storage=workflow.storage.__class__.__name__ if workflow.storage else None,
653
+ )
654
+ else:
655
+ return WorkflowGetResponse(
656
+ workflow_id=workflow.workflow_id,
657
+ name=workflow.name,
658
+ description=workflow.description,
659
+ parameters=workflow.run_parameters,
660
+ storage=workflow.storage.__class__.__name__ if workflow.storage else None,
661
+ )
626
662
 
627
663
  @playground_router.post("/workflows/{workflow_id}/runs")
628
664
  async def create_workflow_run(workflow_id: str, body: WorkflowRunRequest):
@@ -637,24 +673,54 @@ def get_async_playground_router(
637
673
  logger.debug("Creating new session")
638
674
 
639
675
  # Create a new instance of this workflow
640
- new_workflow_instance = workflow.deep_copy(update={"workflow_id": workflow_id, "session_id": body.session_id})
641
- new_workflow_instance.user_id = body.user_id
642
- new_workflow_instance.session_name = None
676
+ if isinstance(workflow, Workflow):
677
+ new_workflow_instance = workflow.deep_copy(
678
+ update={"workflow_id": workflow_id, "session_id": body.session_id}
679
+ )
680
+ new_workflow_instance.user_id = body.user_id
681
+ new_workflow_instance.session_name = None
643
682
 
644
- # Return based on the response type
645
- try:
646
- if new_workflow_instance._run_return_type == "RunResponse":
647
- # Return as a normal response
648
- return new_workflow_instance.run(**body.input)
649
- else:
650
- # Return as a streaming response
651
- return StreamingResponse(
652
- (result.to_json() for result in new_workflow_instance.run(**body.input)),
653
- media_type="text/event-stream",
654
- )
655
- except Exception as e:
656
- # Handle unexpected runtime errors
657
- raise HTTPException(status_code=500, detail=f"Error running workflow: {str(e)}")
683
+ # Return based on the response type
684
+ try:
685
+ if new_workflow_instance._run_return_type == "RunResponse":
686
+ # Return as a normal response
687
+ return new_workflow_instance.run(**body.input)
688
+ else:
689
+ # Return as a streaming response
690
+ return StreamingResponse(
691
+ (result.to_json() for result in new_workflow_instance.run(**body.input)),
692
+ media_type="text/event-stream",
693
+ headers={
694
+ "Access-Control-Allow-Origin": "*",
695
+ "Access-Control-Allow-Methods": "POST, OPTIONS",
696
+ "Access-Control-Allow-Headers": "Content-Type, Authorization",
697
+ },
698
+ )
699
+ except Exception as e:
700
+ # Handle unexpected runtime errors
701
+ raise HTTPException(status_code=500, detail=f"Error running workflow: {str(e)}")
702
+ else:
703
+ # Return based on the response type
704
+ try:
705
+ if body.stream:
706
+ # Return as a streaming response
707
+ return StreamingResponse(
708
+ workflow_response_streamer(workflow, body),
709
+ media_type="text/event-stream",
710
+ headers={
711
+ "Access-Control-Allow-Origin": "*",
712
+ "Access-Control-Allow-Methods": "POST, OPTIONS",
713
+ "Access-Control-Allow-Headers": "Content-Type, Authorization",
714
+ },
715
+ )
716
+ else:
717
+ # Return as a normal response
718
+ return await workflow.arun(
719
+ **body.input, session_id=body.session_id or str(uuid4()), user_id=body.user_id
720
+ )
721
+ except Exception as e:
722
+ # Handle unexpected runtime errors
723
+ raise HTTPException(status_code=500, detail=f"Error running workflow: {str(e)}")
658
724
 
659
725
  @playground_router.get("/workflows/{workflow_id}/sessions")
660
726
  async def get_all_workflow_sessions(workflow_id: str, user_id: Optional[str] = Query(None, min_length=1)):
@@ -689,7 +755,7 @@ def get_async_playground_router(
689
755
  )
690
756
  return workflow_sessions
691
757
 
692
- @playground_router.get("/workflows/{workflow_id}/sessions/{session_id}", response_model=WorkflowSession)
758
+ @playground_router.get("/workflows/{workflow_id}/sessions/{session_id}")
693
759
  async def get_workflow_session(
694
760
  workflow_id: str, session_id: str, user_id: Optional[str] = Query(None, min_length=1)
695
761
  ):
@@ -704,15 +770,18 @@ def get_async_playground_router(
704
770
 
705
771
  # Retrieve the specific session
706
772
  try:
707
- workflow_session: Optional[WorkflowSession] = workflow.storage.read(session_id, user_id) # type: ignore
773
+ workflow_session = workflow.storage.read(session_id, user_id) # type: ignore
708
774
  except Exception as e:
709
775
  raise HTTPException(status_code=500, detail=f"Error retrieving session: {str(e)}")
710
776
 
711
777
  if not workflow_session:
712
778
  raise HTTPException(status_code=404, detail="Session not found")
713
779
 
714
- # Return the session
715
- return workflow_session
780
+ workflow_session_dict = workflow_session.to_dict()
781
+ if "memory" not in workflow_session_dict:
782
+ workflow_session_dict["memory"] = {"runs": workflow_session_dict.pop("runs", [])}
783
+
784
+ return JSONResponse(content=workflow_session_dict)
716
785
 
717
786
  @playground_router.post("/workflows/{workflow_id}/sessions/{session_id}/rename")
718
787
  async def rename_workflow_session(workflow_id: str, session_id: str, body: WorkflowRenameRequest):
@@ -92,30 +92,36 @@ def get_session_title_from_workflow_session(workflow_session: WorkflowSession) -
92
92
  )
93
93
  if session_name is not None:
94
94
  return session_name
95
- memory = workflow_session.memory
96
- if memory is not None:
97
- runs = memory.get("runs")
98
- runs = cast(List[Any], runs)
99
- for _run in runs:
100
- try:
101
- # Try to get content directly from the run first (workflow structure)
102
- content = _run.get("content")
103
- if content:
104
- # Split content by newlines and take first line, but limit to 100 chars
105
- first_line = content.split("\n")[0]
106
- return first_line[:100] + "..." if len(first_line) > 100 else first_line
107
-
108
- # Fallback to response.content structure (if it exists)
109
- response = _run.get("response")
110
- if response:
111
- content = response.get("content")
95
+ if hasattr(workflow_session, "memory"):
96
+ memory = workflow_session.memory
97
+ if memory is not None:
98
+ runs = memory.get("runs")
99
+ runs = cast(List[Any], runs)
100
+ for _run in runs:
101
+ try:
102
+ # Try to get content directly from the run first (workflow structure)
103
+ content = _run.get("content")
112
104
  if content:
113
105
  # Split content by newlines and take first line, but limit to 100 chars
114
106
  first_line = content.split("\n")[0]
115
107
  return first_line[:100] + "..." if len(first_line) > 100 else first_line
116
108
 
117
- except Exception as e:
118
- logger.error(f"Error parsing workflow session: {e}")
109
+ # Fallback to response.content structure (if it exists)
110
+ response = _run.get("response")
111
+ if response:
112
+ content = response.get("content")
113
+ if content:
114
+ # Split content by newlines and take first line, but limit to 100 chars
115
+ first_line = content.split("\n")[0]
116
+ return first_line[:100] + "..." if len(first_line) > 100 else first_line
117
+
118
+ except Exception as e:
119
+ logger.error(f"Error parsing workflow session: {e}")
120
+ if hasattr(workflow_session, "runs"):
121
+ if workflow_session.runs is not None and len(workflow_session.runs) > 0:
122
+ for _run in workflow_session.runs:
123
+ if _run.content:
124
+ return _run.content[:100] + "..." if len(_run.content) > 100 else _run.content
119
125
  return "Unnamed session"
120
126
 
121
127
 
@@ -107,6 +107,7 @@ class WorkflowRunRequest(BaseModel):
107
107
  input: Dict[str, Any]
108
108
  user_id: Optional[str] = None
109
109
  session_id: Optional[str] = None
110
+ stream: bool = True
110
111
 
111
112
 
112
113
  class WorkflowSessionResponse(BaseModel):