agno 1.8.1__py3-none-any.whl → 2.0.0a1__py3-none-any.whl

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 (580) hide show
  1. agno/__init__.py +8 -0
  2. agno/agent/__init__.py +19 -27
  3. agno/agent/agent.py +2778 -4123
  4. agno/api/agent.py +9 -65
  5. agno/api/api.py +5 -46
  6. agno/api/evals.py +6 -17
  7. agno/api/os.py +17 -0
  8. agno/api/routes.py +6 -41
  9. agno/api/schemas/__init__.py +9 -0
  10. agno/api/schemas/agent.py +5 -21
  11. agno/api/schemas/evals.py +7 -16
  12. agno/api/schemas/os.py +14 -0
  13. agno/api/schemas/team.py +5 -21
  14. agno/api/schemas/utils.py +21 -0
  15. agno/api/schemas/workflows.py +11 -7
  16. agno/api/settings.py +53 -0
  17. agno/api/team.py +9 -64
  18. agno/api/workflow.py +28 -0
  19. agno/cloud/aws/base.py +214 -0
  20. agno/cloud/aws/s3/__init__.py +2 -0
  21. agno/cloud/aws/s3/api_client.py +43 -0
  22. agno/cloud/aws/s3/bucket.py +195 -0
  23. agno/cloud/aws/s3/object.py +57 -0
  24. agno/db/__init__.py +24 -0
  25. agno/db/base.py +245 -0
  26. agno/db/dynamo/__init__.py +3 -0
  27. agno/db/dynamo/dynamo.py +1749 -0
  28. agno/db/dynamo/schemas.py +278 -0
  29. agno/db/dynamo/utils.py +684 -0
  30. agno/db/firestore/__init__.py +3 -0
  31. agno/db/firestore/firestore.py +1438 -0
  32. agno/db/firestore/schemas.py +130 -0
  33. agno/db/firestore/utils.py +278 -0
  34. agno/db/gcs_json/__init__.py +3 -0
  35. agno/db/gcs_json/gcs_json_db.py +1001 -0
  36. agno/db/gcs_json/utils.py +194 -0
  37. agno/db/in_memory/__init__.py +3 -0
  38. agno/db/in_memory/in_memory_db.py +888 -0
  39. agno/db/in_memory/utils.py +172 -0
  40. agno/db/json/__init__.py +3 -0
  41. agno/db/json/json_db.py +1051 -0
  42. agno/db/json/utils.py +196 -0
  43. agno/db/migrations/v1_to_v2.py +162 -0
  44. agno/db/mongo/__init__.py +3 -0
  45. agno/db/mongo/mongo.py +1417 -0
  46. agno/db/mongo/schemas.py +77 -0
  47. agno/db/mongo/utils.py +204 -0
  48. agno/db/mysql/__init__.py +3 -0
  49. agno/db/mysql/mysql.py +1719 -0
  50. agno/db/mysql/schemas.py +124 -0
  51. agno/db/mysql/utils.py +298 -0
  52. agno/db/postgres/__init__.py +3 -0
  53. agno/db/postgres/postgres.py +1720 -0
  54. agno/db/postgres/schemas.py +124 -0
  55. agno/db/postgres/utils.py +281 -0
  56. agno/db/redis/__init__.py +3 -0
  57. agno/db/redis/redis.py +1371 -0
  58. agno/db/redis/schemas.py +109 -0
  59. agno/db/redis/utils.py +288 -0
  60. agno/db/schemas/__init__.py +3 -0
  61. agno/db/schemas/evals.py +33 -0
  62. agno/db/schemas/knowledge.py +40 -0
  63. agno/db/schemas/memory.py +46 -0
  64. agno/db/singlestore/__init__.py +3 -0
  65. agno/db/singlestore/schemas.py +116 -0
  66. agno/db/singlestore/singlestore.py +1722 -0
  67. agno/db/singlestore/utils.py +327 -0
  68. agno/db/sqlite/__init__.py +3 -0
  69. agno/db/sqlite/schemas.py +119 -0
  70. agno/db/sqlite/sqlite.py +1680 -0
  71. agno/db/sqlite/utils.py +269 -0
  72. agno/db/utils.py +88 -0
  73. agno/eval/__init__.py +14 -0
  74. agno/eval/accuracy.py +142 -43
  75. agno/eval/performance.py +88 -23
  76. agno/eval/reliability.py +73 -20
  77. agno/eval/utils.py +23 -13
  78. agno/integrations/discord/__init__.py +3 -0
  79. agno/{app → integrations}/discord/client.py +10 -10
  80. agno/knowledge/__init__.py +2 -2
  81. agno/{document → knowledge}/chunking/agentic.py +2 -2
  82. agno/{document → knowledge}/chunking/document.py +2 -2
  83. agno/{document → knowledge}/chunking/fixed.py +3 -3
  84. agno/{document → knowledge}/chunking/markdown.py +2 -2
  85. agno/{document → knowledge}/chunking/recursive.py +2 -2
  86. agno/{document → knowledge}/chunking/row.py +2 -2
  87. agno/knowledge/chunking/semantic.py +59 -0
  88. agno/knowledge/chunking/strategy.py +121 -0
  89. agno/knowledge/content.py +74 -0
  90. agno/knowledge/document/__init__.py +5 -0
  91. agno/{document → knowledge/document}/base.py +12 -2
  92. agno/knowledge/embedder/__init__.py +5 -0
  93. agno/{embedder → knowledge/embedder}/aws_bedrock.py +127 -1
  94. agno/{embedder → knowledge/embedder}/azure_openai.py +65 -1
  95. agno/{embedder → knowledge/embedder}/base.py +6 -0
  96. agno/{embedder → knowledge/embedder}/cohere.py +72 -1
  97. agno/{embedder → knowledge/embedder}/fastembed.py +17 -1
  98. agno/{embedder → knowledge/embedder}/fireworks.py +1 -1
  99. agno/{embedder → knowledge/embedder}/google.py +74 -1
  100. agno/{embedder → knowledge/embedder}/huggingface.py +36 -2
  101. agno/{embedder → knowledge/embedder}/jina.py +48 -2
  102. agno/knowledge/embedder/langdb.py +22 -0
  103. agno/knowledge/embedder/mistral.py +139 -0
  104. agno/{embedder → knowledge/embedder}/nebius.py +1 -1
  105. agno/{embedder → knowledge/embedder}/ollama.py +54 -3
  106. agno/knowledge/embedder/openai.py +223 -0
  107. agno/{embedder → knowledge/embedder}/sentence_transformer.py +16 -1
  108. agno/{embedder → knowledge/embedder}/together.py +1 -1
  109. agno/{embedder → knowledge/embedder}/voyageai.py +49 -1
  110. agno/knowledge/knowledge.py +1515 -0
  111. agno/knowledge/reader/__init__.py +7 -0
  112. agno/{document → knowledge}/reader/arxiv_reader.py +32 -4
  113. agno/knowledge/reader/base.py +88 -0
  114. agno/{document → knowledge}/reader/csv_reader.py +68 -15
  115. agno/knowledge/reader/docx_reader.py +83 -0
  116. agno/{document → knowledge}/reader/firecrawl_reader.py +42 -21
  117. agno/knowledge/reader/gcs_reader.py +67 -0
  118. agno/{document → knowledge}/reader/json_reader.py +30 -9
  119. agno/{document → knowledge}/reader/markdown_reader.py +36 -9
  120. agno/{document → knowledge}/reader/pdf_reader.py +79 -21
  121. agno/knowledge/reader/reader_factory.py +275 -0
  122. agno/knowledge/reader/s3_reader.py +171 -0
  123. agno/{document → knowledge}/reader/text_reader.py +31 -10
  124. agno/knowledge/reader/url_reader.py +84 -0
  125. agno/knowledge/reader/web_search_reader.py +389 -0
  126. agno/{document → knowledge}/reader/website_reader.py +37 -10
  127. agno/knowledge/reader/wikipedia_reader.py +59 -0
  128. agno/knowledge/reader/youtube_reader.py +78 -0
  129. agno/knowledge/remote_content/remote_content.py +88 -0
  130. agno/{reranker → knowledge/reranker}/base.py +1 -1
  131. agno/{reranker → knowledge/reranker}/cohere.py +2 -2
  132. agno/{reranker → knowledge/reranker}/infinity.py +2 -2
  133. agno/{reranker → knowledge/reranker}/sentence_transformer.py +2 -2
  134. agno/knowledge/types.py +30 -0
  135. agno/knowledge/utils.py +169 -0
  136. agno/memory/__init__.py +2 -10
  137. agno/memory/manager.py +1003 -148
  138. agno/models/aimlapi/__init__.py +2 -2
  139. agno/models/aimlapi/aimlapi.py +6 -6
  140. agno/models/anthropic/claude.py +129 -82
  141. agno/models/aws/bedrock.py +107 -175
  142. agno/models/aws/claude.py +64 -18
  143. agno/models/azure/ai_foundry.py +73 -23
  144. agno/models/base.py +347 -287
  145. agno/models/cerebras/cerebras.py +84 -27
  146. agno/models/cohere/chat.py +106 -98
  147. agno/models/google/gemini.py +100 -42
  148. agno/models/groq/groq.py +97 -35
  149. agno/models/huggingface/huggingface.py +92 -27
  150. agno/models/ibm/watsonx.py +72 -13
  151. agno/models/litellm/chat.py +85 -13
  152. agno/models/message.py +38 -144
  153. agno/models/meta/llama.py +85 -49
  154. agno/models/metrics.py +120 -0
  155. agno/models/mistral/mistral.py +90 -21
  156. agno/models/ollama/__init__.py +0 -2
  157. agno/models/ollama/chat.py +84 -46
  158. agno/models/openai/chat.py +121 -23
  159. agno/models/openai/responses.py +178 -105
  160. agno/models/perplexity/perplexity.py +26 -2
  161. agno/models/portkey/portkey.py +0 -7
  162. agno/models/response.py +14 -8
  163. agno/models/utils.py +20 -0
  164. agno/models/vercel/__init__.py +2 -2
  165. agno/models/vercel/v0.py +1 -1
  166. agno/models/vllm/__init__.py +2 -2
  167. agno/models/vllm/vllm.py +3 -3
  168. agno/models/xai/xai.py +10 -10
  169. agno/os/__init__.py +3 -0
  170. agno/os/app.py +393 -0
  171. agno/os/auth.py +47 -0
  172. agno/os/config.py +103 -0
  173. agno/os/interfaces/agui/__init__.py +3 -0
  174. agno/os/interfaces/agui/agui.py +31 -0
  175. agno/{app/agui/async_router.py → os/interfaces/agui/router.py} +16 -16
  176. agno/{app → os/interfaces}/agui/utils.py +65 -28
  177. agno/os/interfaces/base.py +21 -0
  178. agno/os/interfaces/slack/__init__.py +3 -0
  179. agno/{app/slack/async_router.py → os/interfaces/slack/router.py} +3 -5
  180. agno/os/interfaces/slack/slack.py +33 -0
  181. agno/os/interfaces/whatsapp/__init__.py +3 -0
  182. agno/{app/whatsapp/async_router.py → os/interfaces/whatsapp/router.py} +4 -7
  183. agno/os/interfaces/whatsapp/whatsapp.py +30 -0
  184. agno/os/router.py +843 -0
  185. agno/os/routers/__init__.py +3 -0
  186. agno/os/routers/evals/__init__.py +3 -0
  187. agno/os/routers/evals/evals.py +204 -0
  188. agno/os/routers/evals/schemas.py +142 -0
  189. agno/os/routers/evals/utils.py +161 -0
  190. agno/os/routers/knowledge/__init__.py +3 -0
  191. agno/os/routers/knowledge/knowledge.py +413 -0
  192. agno/os/routers/knowledge/schemas.py +118 -0
  193. agno/os/routers/memory/__init__.py +3 -0
  194. agno/os/routers/memory/memory.py +179 -0
  195. agno/os/routers/memory/schemas.py +58 -0
  196. agno/os/routers/metrics/__init__.py +3 -0
  197. agno/os/routers/metrics/metrics.py +58 -0
  198. agno/os/routers/metrics/schemas.py +47 -0
  199. agno/os/routers/session/__init__.py +3 -0
  200. agno/os/routers/session/session.py +163 -0
  201. agno/os/schema.py +892 -0
  202. agno/{app/playground → os}/settings.py +8 -15
  203. agno/os/utils.py +270 -0
  204. agno/reasoning/azure_ai_foundry.py +4 -4
  205. agno/reasoning/deepseek.py +4 -4
  206. agno/reasoning/default.py +6 -11
  207. agno/reasoning/groq.py +4 -4
  208. agno/reasoning/helpers.py +4 -6
  209. agno/reasoning/ollama.py +4 -4
  210. agno/reasoning/openai.py +4 -4
  211. agno/run/{response.py → agent.py} +144 -72
  212. agno/run/base.py +44 -58
  213. agno/run/cancel.py +83 -0
  214. agno/run/team.py +133 -77
  215. agno/run/workflow.py +537 -12
  216. agno/session/__init__.py +10 -0
  217. agno/session/agent.py +244 -0
  218. agno/session/summary.py +225 -0
  219. agno/session/team.py +262 -0
  220. agno/{storage/session/v2 → session}/workflow.py +47 -24
  221. agno/team/__init__.py +15 -16
  222. agno/team/team.py +2961 -4253
  223. agno/tools/agentql.py +14 -5
  224. agno/tools/airflow.py +9 -4
  225. agno/tools/api.py +7 -3
  226. agno/tools/apify.py +2 -46
  227. agno/tools/arxiv.py +8 -3
  228. agno/tools/aws_lambda.py +7 -5
  229. agno/tools/aws_ses.py +7 -1
  230. agno/tools/baidusearch.py +4 -1
  231. agno/tools/bitbucket.py +4 -4
  232. agno/tools/brandfetch.py +14 -11
  233. agno/tools/bravesearch.py +4 -1
  234. agno/tools/brightdata.py +42 -22
  235. agno/tools/browserbase.py +13 -4
  236. agno/tools/calcom.py +12 -10
  237. agno/tools/calculator.py +10 -27
  238. agno/tools/cartesia.py +18 -13
  239. agno/tools/{clickup_tool.py → clickup.py} +12 -25
  240. agno/tools/confluence.py +8 -8
  241. agno/tools/crawl4ai.py +7 -1
  242. agno/tools/csv_toolkit.py +9 -8
  243. agno/tools/dalle.py +18 -11
  244. agno/tools/daytona.py +13 -16
  245. agno/tools/decorator.py +6 -3
  246. agno/tools/desi_vocal.py +16 -7
  247. agno/tools/discord.py +11 -8
  248. agno/tools/docker.py +30 -42
  249. agno/tools/duckdb.py +34 -53
  250. agno/tools/duckduckgo.py +8 -7
  251. agno/tools/e2b.py +61 -61
  252. agno/tools/eleven_labs.py +35 -28
  253. agno/tools/email.py +4 -1
  254. agno/tools/evm.py +7 -1
  255. agno/tools/exa.py +19 -14
  256. agno/tools/fal.py +29 -29
  257. agno/tools/file.py +9 -8
  258. agno/tools/financial_datasets.py +25 -44
  259. agno/tools/firecrawl.py +22 -22
  260. agno/tools/function.py +68 -17
  261. agno/tools/giphy.py +22 -10
  262. agno/tools/github.py +48 -126
  263. agno/tools/gmail.py +45 -61
  264. agno/tools/google_bigquery.py +7 -6
  265. agno/tools/google_maps.py +11 -26
  266. agno/tools/googlesearch.py +7 -2
  267. agno/tools/googlesheets.py +21 -17
  268. agno/tools/hackernews.py +9 -5
  269. agno/tools/jina.py +5 -4
  270. agno/tools/jira.py +18 -9
  271. agno/tools/knowledge.py +31 -32
  272. agno/tools/linear.py +18 -33
  273. agno/tools/linkup.py +5 -1
  274. agno/tools/local_file_system.py +8 -5
  275. agno/tools/lumalab.py +31 -19
  276. agno/tools/mem0.py +18 -12
  277. agno/tools/memori.py +14 -10
  278. agno/tools/mlx_transcribe.py +3 -2
  279. agno/tools/models/azure_openai.py +32 -14
  280. agno/tools/models/gemini.py +58 -31
  281. agno/tools/models/groq.py +29 -20
  282. agno/tools/models/nebius.py +27 -11
  283. agno/tools/models_labs.py +39 -15
  284. agno/tools/moviepy_video.py +7 -6
  285. agno/tools/neo4j.py +10 -8
  286. agno/tools/newspaper.py +7 -2
  287. agno/tools/newspaper4k.py +8 -3
  288. agno/tools/openai.py +57 -26
  289. agno/tools/openbb.py +12 -11
  290. agno/tools/opencv.py +62 -46
  291. agno/tools/openweather.py +14 -12
  292. agno/tools/pandas.py +11 -3
  293. agno/tools/postgres.py +4 -12
  294. agno/tools/pubmed.py +4 -1
  295. agno/tools/python.py +9 -22
  296. agno/tools/reasoning.py +35 -27
  297. agno/tools/reddit.py +11 -26
  298. agno/tools/replicate.py +54 -41
  299. agno/tools/resend.py +4 -1
  300. agno/tools/scrapegraph.py +15 -14
  301. agno/tools/searxng.py +10 -23
  302. agno/tools/serpapi.py +6 -3
  303. agno/tools/serper.py +13 -4
  304. agno/tools/shell.py +9 -2
  305. agno/tools/slack.py +12 -11
  306. agno/tools/sleep.py +3 -2
  307. agno/tools/spider.py +24 -4
  308. agno/tools/sql.py +7 -6
  309. agno/tools/tavily.py +6 -4
  310. agno/tools/telegram.py +12 -4
  311. agno/tools/todoist.py +11 -31
  312. agno/tools/toolkit.py +1 -1
  313. agno/tools/trafilatura.py +22 -6
  314. agno/tools/trello.py +9 -22
  315. agno/tools/twilio.py +10 -3
  316. agno/tools/user_control_flow.py +6 -1
  317. agno/tools/valyu.py +34 -5
  318. agno/tools/visualization.py +19 -28
  319. agno/tools/webbrowser.py +4 -3
  320. agno/tools/webex.py +11 -7
  321. agno/tools/website.py +15 -46
  322. agno/tools/webtools.py +12 -4
  323. agno/tools/whatsapp.py +5 -9
  324. agno/tools/wikipedia.py +20 -13
  325. agno/tools/x.py +14 -13
  326. agno/tools/yfinance.py +13 -40
  327. agno/tools/youtube.py +26 -20
  328. agno/tools/zendesk.py +7 -2
  329. agno/tools/zep.py +10 -7
  330. agno/tools/zoom.py +10 -9
  331. agno/utils/common.py +1 -19
  332. agno/utils/events.py +95 -118
  333. agno/utils/knowledge.py +29 -0
  334. agno/utils/log.py +2 -2
  335. agno/utils/mcp.py +11 -5
  336. agno/utils/media.py +39 -0
  337. agno/utils/message.py +12 -1
  338. agno/utils/models/claude.py +6 -4
  339. agno/utils/models/mistral.py +8 -7
  340. agno/utils/models/schema_utils.py +3 -3
  341. agno/utils/pprint.py +33 -32
  342. agno/utils/print_response/agent.py +779 -0
  343. agno/utils/print_response/team.py +1565 -0
  344. agno/utils/print_response/workflow.py +1451 -0
  345. agno/utils/prompts.py +14 -14
  346. agno/utils/reasoning.py +87 -0
  347. agno/utils/response.py +42 -42
  348. agno/utils/string.py +8 -22
  349. agno/utils/team.py +50 -0
  350. agno/utils/timer.py +2 -2
  351. agno/vectordb/base.py +33 -21
  352. agno/vectordb/cassandra/cassandra.py +287 -23
  353. agno/vectordb/chroma/chromadb.py +482 -59
  354. agno/vectordb/clickhouse/clickhousedb.py +270 -63
  355. agno/vectordb/couchbase/couchbase.py +309 -29
  356. agno/vectordb/lancedb/lance_db.py +360 -21
  357. agno/vectordb/langchaindb/__init__.py +5 -0
  358. agno/vectordb/langchaindb/langchaindb.py +145 -0
  359. agno/vectordb/lightrag/__init__.py +5 -0
  360. agno/vectordb/lightrag/lightrag.py +374 -0
  361. agno/vectordb/llamaindex/llamaindexdb.py +127 -0
  362. agno/vectordb/milvus/milvus.py +242 -32
  363. agno/vectordb/mongodb/mongodb.py +200 -24
  364. agno/vectordb/pgvector/pgvector.py +319 -37
  365. agno/vectordb/pineconedb/pineconedb.py +221 -27
  366. agno/vectordb/qdrant/qdrant.py +334 -14
  367. agno/vectordb/singlestore/singlestore.py +286 -29
  368. agno/vectordb/surrealdb/surrealdb.py +187 -7
  369. agno/vectordb/upstashdb/upstashdb.py +342 -26
  370. agno/vectordb/weaviate/weaviate.py +227 -165
  371. agno/workflow/__init__.py +17 -13
  372. agno/workflow/{v2/condition.py → condition.py} +135 -32
  373. agno/workflow/{v2/loop.py → loop.py} +115 -28
  374. agno/workflow/{v2/parallel.py → parallel.py} +138 -108
  375. agno/workflow/{v2/router.py → router.py} +133 -32
  376. agno/workflow/{v2/step.py → step.py} +200 -42
  377. agno/workflow/{v2/steps.py → steps.py} +147 -66
  378. agno/workflow/types.py +482 -0
  379. agno/workflow/workflow.py +2394 -696
  380. agno-2.0.0a1.dist-info/METADATA +355 -0
  381. agno-2.0.0a1.dist-info/RECORD +514 -0
  382. agno/agent/metrics.py +0 -107
  383. agno/api/app.py +0 -35
  384. agno/api/playground.py +0 -92
  385. agno/api/schemas/app.py +0 -12
  386. agno/api/schemas/playground.py +0 -22
  387. agno/api/schemas/user.py +0 -35
  388. agno/api/schemas/workspace.py +0 -46
  389. agno/api/user.py +0 -160
  390. agno/api/workflows.py +0 -33
  391. agno/api/workspace.py +0 -175
  392. agno/app/agui/__init__.py +0 -3
  393. agno/app/agui/app.py +0 -17
  394. agno/app/agui/sync_router.py +0 -120
  395. agno/app/base.py +0 -186
  396. agno/app/discord/__init__.py +0 -3
  397. agno/app/fastapi/__init__.py +0 -3
  398. agno/app/fastapi/app.py +0 -107
  399. agno/app/fastapi/async_router.py +0 -457
  400. agno/app/fastapi/sync_router.py +0 -448
  401. agno/app/playground/app.py +0 -228
  402. agno/app/playground/async_router.py +0 -1050
  403. agno/app/playground/deploy.py +0 -249
  404. agno/app/playground/operator.py +0 -183
  405. agno/app/playground/schemas.py +0 -220
  406. agno/app/playground/serve.py +0 -55
  407. agno/app/playground/sync_router.py +0 -1042
  408. agno/app/playground/utils.py +0 -46
  409. agno/app/settings.py +0 -15
  410. agno/app/slack/__init__.py +0 -3
  411. agno/app/slack/app.py +0 -19
  412. agno/app/slack/sync_router.py +0 -92
  413. agno/app/utils.py +0 -54
  414. agno/app/whatsapp/__init__.py +0 -3
  415. agno/app/whatsapp/app.py +0 -15
  416. agno/app/whatsapp/sync_router.py +0 -197
  417. agno/cli/auth_server.py +0 -249
  418. agno/cli/config.py +0 -274
  419. agno/cli/console.py +0 -88
  420. agno/cli/credentials.py +0 -23
  421. agno/cli/entrypoint.py +0 -571
  422. agno/cli/operator.py +0 -357
  423. agno/cli/settings.py +0 -96
  424. agno/cli/ws/ws_cli.py +0 -817
  425. agno/constants.py +0 -13
  426. agno/document/__init__.py +0 -5
  427. agno/document/chunking/semantic.py +0 -45
  428. agno/document/chunking/strategy.py +0 -31
  429. agno/document/reader/__init__.py +0 -5
  430. agno/document/reader/base.py +0 -47
  431. agno/document/reader/docx_reader.py +0 -60
  432. agno/document/reader/gcs/pdf_reader.py +0 -44
  433. agno/document/reader/s3/pdf_reader.py +0 -59
  434. agno/document/reader/s3/text_reader.py +0 -63
  435. agno/document/reader/url_reader.py +0 -59
  436. agno/document/reader/youtube_reader.py +0 -58
  437. agno/embedder/__init__.py +0 -5
  438. agno/embedder/langdb.py +0 -80
  439. agno/embedder/mistral.py +0 -82
  440. agno/embedder/openai.py +0 -78
  441. agno/file/__init__.py +0 -5
  442. agno/file/file.py +0 -16
  443. agno/file/local/csv.py +0 -32
  444. agno/file/local/txt.py +0 -19
  445. agno/infra/app.py +0 -240
  446. agno/infra/base.py +0 -144
  447. agno/infra/context.py +0 -20
  448. agno/infra/db_app.py +0 -52
  449. agno/infra/resource.py +0 -205
  450. agno/infra/resources.py +0 -55
  451. agno/knowledge/agent.py +0 -702
  452. agno/knowledge/arxiv.py +0 -33
  453. agno/knowledge/combined.py +0 -36
  454. agno/knowledge/csv.py +0 -144
  455. agno/knowledge/csv_url.py +0 -124
  456. agno/knowledge/document.py +0 -223
  457. agno/knowledge/docx.py +0 -137
  458. agno/knowledge/firecrawl.py +0 -34
  459. agno/knowledge/gcs/__init__.py +0 -0
  460. agno/knowledge/gcs/base.py +0 -39
  461. agno/knowledge/gcs/pdf.py +0 -125
  462. agno/knowledge/json.py +0 -137
  463. agno/knowledge/langchain.py +0 -71
  464. agno/knowledge/light_rag.py +0 -273
  465. agno/knowledge/llamaindex.py +0 -66
  466. agno/knowledge/markdown.py +0 -154
  467. agno/knowledge/pdf.py +0 -164
  468. agno/knowledge/pdf_bytes.py +0 -42
  469. agno/knowledge/pdf_url.py +0 -148
  470. agno/knowledge/s3/__init__.py +0 -0
  471. agno/knowledge/s3/base.py +0 -64
  472. agno/knowledge/s3/pdf.py +0 -33
  473. agno/knowledge/s3/text.py +0 -34
  474. agno/knowledge/text.py +0 -141
  475. agno/knowledge/url.py +0 -46
  476. agno/knowledge/website.py +0 -179
  477. agno/knowledge/wikipedia.py +0 -32
  478. agno/knowledge/youtube.py +0 -35
  479. agno/memory/agent.py +0 -423
  480. agno/memory/classifier.py +0 -104
  481. agno/memory/db/__init__.py +0 -5
  482. agno/memory/db/base.py +0 -42
  483. agno/memory/db/mongodb.py +0 -189
  484. agno/memory/db/postgres.py +0 -203
  485. agno/memory/db/sqlite.py +0 -193
  486. agno/memory/memory.py +0 -22
  487. agno/memory/row.py +0 -36
  488. agno/memory/summarizer.py +0 -201
  489. agno/memory/summary.py +0 -19
  490. agno/memory/team.py +0 -415
  491. agno/memory/v2/__init__.py +0 -2
  492. agno/memory/v2/db/__init__.py +0 -1
  493. agno/memory/v2/db/base.py +0 -42
  494. agno/memory/v2/db/firestore.py +0 -339
  495. agno/memory/v2/db/mongodb.py +0 -196
  496. agno/memory/v2/db/postgres.py +0 -214
  497. agno/memory/v2/db/redis.py +0 -187
  498. agno/memory/v2/db/schema.py +0 -54
  499. agno/memory/v2/db/sqlite.py +0 -209
  500. agno/memory/v2/manager.py +0 -437
  501. agno/memory/v2/memory.py +0 -1097
  502. agno/memory/v2/schema.py +0 -55
  503. agno/memory/v2/summarizer.py +0 -215
  504. agno/memory/workflow.py +0 -38
  505. agno/models/ollama/tools.py +0 -430
  506. agno/models/qwen/__init__.py +0 -5
  507. agno/playground/__init__.py +0 -10
  508. agno/playground/deploy.py +0 -3
  509. agno/playground/playground.py +0 -3
  510. agno/playground/serve.py +0 -3
  511. agno/playground/settings.py +0 -3
  512. agno/reranker/__init__.py +0 -0
  513. agno/run/v2/__init__.py +0 -0
  514. agno/run/v2/workflow.py +0 -567
  515. agno/storage/__init__.py +0 -0
  516. agno/storage/agent/__init__.py +0 -0
  517. agno/storage/agent/dynamodb.py +0 -1
  518. agno/storage/agent/json.py +0 -1
  519. agno/storage/agent/mongodb.py +0 -1
  520. agno/storage/agent/postgres.py +0 -1
  521. agno/storage/agent/singlestore.py +0 -1
  522. agno/storage/agent/sqlite.py +0 -1
  523. agno/storage/agent/yaml.py +0 -1
  524. agno/storage/base.py +0 -60
  525. agno/storage/dynamodb.py +0 -673
  526. agno/storage/firestore.py +0 -297
  527. agno/storage/gcs_json.py +0 -261
  528. agno/storage/in_memory.py +0 -234
  529. agno/storage/json.py +0 -237
  530. agno/storage/mongodb.py +0 -328
  531. agno/storage/mysql.py +0 -685
  532. agno/storage/postgres.py +0 -682
  533. agno/storage/redis.py +0 -336
  534. agno/storage/session/__init__.py +0 -16
  535. agno/storage/session/agent.py +0 -64
  536. agno/storage/session/team.py +0 -63
  537. agno/storage/session/v2/__init__.py +0 -5
  538. agno/storage/session/workflow.py +0 -61
  539. agno/storage/singlestore.py +0 -606
  540. agno/storage/sqlite.py +0 -646
  541. agno/storage/workflow/__init__.py +0 -0
  542. agno/storage/workflow/mongodb.py +0 -1
  543. agno/storage/workflow/postgres.py +0 -1
  544. agno/storage/workflow/sqlite.py +0 -1
  545. agno/storage/yaml.py +0 -241
  546. agno/tools/thinking.py +0 -73
  547. agno/utils/defaults.py +0 -57
  548. agno/utils/filesystem.py +0 -39
  549. agno/utils/git.py +0 -52
  550. agno/utils/json_io.py +0 -30
  551. agno/utils/load_env.py +0 -19
  552. agno/utils/py_io.py +0 -19
  553. agno/utils/pyproject.py +0 -18
  554. agno/utils/resource_filter.py +0 -31
  555. agno/workflow/v2/__init__.py +0 -21
  556. agno/workflow/v2/types.py +0 -357
  557. agno/workflow/v2/workflow.py +0 -3312
  558. agno/workspace/__init__.py +0 -0
  559. agno/workspace/config.py +0 -325
  560. agno/workspace/enums.py +0 -6
  561. agno/workspace/helpers.py +0 -52
  562. agno/workspace/operator.py +0 -757
  563. agno/workspace/settings.py +0 -158
  564. agno-1.8.1.dist-info/METADATA +0 -982
  565. agno-1.8.1.dist-info/RECORD +0 -566
  566. agno-1.8.1.dist-info/entry_points.txt +0 -3
  567. /agno/{app → db/migrations}/__init__.py +0 -0
  568. /agno/{app/playground/__init__.py → db/schemas/metrics.py} +0 -0
  569. /agno/{cli → integrations}/__init__.py +0 -0
  570. /agno/{cli/ws → knowledge/chunking}/__init__.py +0 -0
  571. /agno/{document/chunking → knowledge/remote_content}/__init__.py +0 -0
  572. /agno/{document/reader/gcs → knowledge/reranker}/__init__.py +0 -0
  573. /agno/{document/reader/s3 → os/interfaces}/__init__.py +0 -0
  574. /agno/{app → os/interfaces}/slack/security.py +0 -0
  575. /agno/{app → os/interfaces}/whatsapp/security.py +0 -0
  576. /agno/{file/local → utils/print_response}/__init__.py +0 -0
  577. /agno/{infra → vectordb/llamaindex}/__init__.py +0 -0
  578. {agno-1.8.1.dist-info → agno-2.0.0a1.dist-info}/WHEEL +0 -0
  579. {agno-1.8.1.dist-info → agno-2.0.0a1.dist-info}/licenses/LICENSE +0 -0
  580. {agno-1.8.1.dist-info → agno-2.0.0a1.dist-info}/top_level.txt +0 -0
agno/os/schema.py ADDED
@@ -0,0 +1,892 @@
1
+ from datetime import datetime, timezone
2
+ from enum import Enum
3
+ from typing import Any, Dict, Generic, List, Optional, TypeVar, Union
4
+ from uuid import uuid4
5
+
6
+ from pydantic import BaseModel
7
+
8
+ from agno.agent import Agent
9
+ from agno.db.base import SessionType
10
+ from agno.models.message import Message
11
+ from agno.os.config import ChatConfig, EvalsConfig, KnowledgeConfig, MemoryConfig, MetricsConfig, SessionConfig
12
+ from agno.os.utils import (
13
+ format_team_tools,
14
+ format_tools,
15
+ get_run_input,
16
+ get_session_name,
17
+ get_workflow_input_schema_dict,
18
+ )
19
+ from agno.run.agent import RunOutput
20
+ from agno.run.team import TeamRunOutput
21
+ from agno.session import AgentSession, TeamSession, WorkflowSession
22
+ from agno.team.team import Team
23
+ from agno.workflow.workflow import Workflow
24
+
25
+
26
+ class InterfaceResponse(BaseModel):
27
+ type: str
28
+ version: str
29
+ route: str
30
+
31
+
32
+ class ManagerResponse(BaseModel):
33
+ type: str
34
+ name: str
35
+ version: str
36
+ route: str
37
+
38
+
39
+ class AgentSummaryResponse(BaseModel):
40
+ id: Optional[str] = None
41
+ name: Optional[str] = None
42
+ description: Optional[str] = None
43
+ db_id: Optional[str] = None
44
+
45
+ @classmethod
46
+ def from_agent(cls, agent: Agent) -> "AgentSummaryResponse":
47
+ return cls(id=agent.id, name=agent.name, description=agent.description, db_id=agent.db.id if agent.db else None)
48
+
49
+
50
+ class TeamSummaryResponse(BaseModel):
51
+ id: Optional[str] = None
52
+ name: Optional[str] = None
53
+ description: Optional[str] = None
54
+ db_id: Optional[str] = None
55
+
56
+ @classmethod
57
+ def from_team(cls, team: Team) -> "TeamSummaryResponse":
58
+ return cls(id=team.id, name=team.name, description=team.description, db_id=team.db.id if team.db else None)
59
+
60
+
61
+ class WorkflowSummaryResponse(BaseModel):
62
+ id: Optional[str] = None
63
+ name: Optional[str] = None
64
+ description: Optional[str] = None
65
+ db_id: Optional[str] = None
66
+
67
+ @classmethod
68
+ def from_workflow(cls, workflow: Workflow) -> "WorkflowSummaryResponse":
69
+ return cls(
70
+ id=workflow.id,
71
+ name=workflow.name,
72
+ description=workflow.description,
73
+ db_id=workflow.db.id if workflow.db else None,
74
+ )
75
+
76
+
77
+ class ConfigResponse(BaseModel):
78
+ """Response schema for the general config endpoint"""
79
+
80
+ os_id: str
81
+ name: Optional[str] = None
82
+ description: Optional[str] = None
83
+ available_models: Optional[List[str]] = None
84
+ databases: List[str]
85
+ chat: Optional[ChatConfig] = None
86
+
87
+ session: Optional[SessionConfig] = None
88
+ metrics: Optional[MetricsConfig] = None
89
+ memory: Optional[MemoryConfig] = None
90
+ knowledge: Optional[KnowledgeConfig] = None
91
+ evals: Optional[EvalsConfig] = None
92
+
93
+ agents: List[AgentSummaryResponse]
94
+ teams: List[TeamSummaryResponse]
95
+ workflows: List[WorkflowSummaryResponse]
96
+ interfaces: List[InterfaceResponse]
97
+
98
+
99
+ class Model(BaseModel):
100
+ id: Optional[str] = None
101
+ provider: Optional[str] = None
102
+
103
+
104
+ class ModelResponse(BaseModel):
105
+ name: Optional[str] = None
106
+ model: Optional[str] = None
107
+ provider: Optional[str] = None
108
+
109
+
110
+ class AgentResponse(BaseModel):
111
+ id: Optional[str] = None
112
+ name: Optional[str] = None
113
+ db_id: Optional[str] = None
114
+ model: Optional[ModelResponse] = None
115
+ tools: Optional[Dict[str, Any]] = None
116
+ sessions: Optional[Dict[str, Any]] = None
117
+ knowledge: Optional[Dict[str, Any]] = None
118
+ memory: Optional[Dict[str, Any]] = None
119
+ reasoning: Optional[Dict[str, Any]] = None
120
+ default_tools: Optional[Dict[str, Any]] = None
121
+ system_message: Optional[Dict[str, Any]] = None
122
+ extra_messages: Optional[Dict[str, Any]] = None
123
+ response_settings: Optional[Dict[str, Any]] = None
124
+ streaming: Optional[Dict[str, Any]] = None
125
+ metadata: Optional[Dict[str, Any]] = None
126
+
127
+ class Config:
128
+ exclude_none = True
129
+
130
+ @classmethod
131
+ def from_agent(cls, agent: Agent) -> "AgentResponse":
132
+ def filter_meaningful_config(d: Dict[str, Any], defaults: Dict[str, Any]) -> Optional[Dict[str, Any]]:
133
+ """Filter out fields that match their default values, keeping only meaningful user configurations"""
134
+ filtered = {}
135
+ for key, value in d.items():
136
+ if value is None:
137
+ continue
138
+ # Skip if value matches the default exactly
139
+ if key in defaults and value == defaults[key]:
140
+ continue
141
+ # Keep non-default values
142
+ filtered[key] = value
143
+ return filtered if filtered else None
144
+
145
+ # Define default values for filtering
146
+ agent_defaults = {
147
+ # Sessions defaults
148
+ "add_history_to_context": False,
149
+ "num_history_runs": 3,
150
+ "enable_session_summaries": False,
151
+ "search_session_history": False,
152
+ "cache_session": False,
153
+ # Knowledge defaults
154
+ "add_references": False,
155
+ "references_format": "json",
156
+ "enable_agentic_knowledge_filters": False,
157
+ # Memory defaults
158
+ "enable_agentic_memory": False,
159
+ "enable_user_memories": False,
160
+ # Reasoning defaults
161
+ "reasoning": False,
162
+ "reasoning_min_steps": 1,
163
+ "reasoning_max_steps": 10,
164
+ # Default tools defaults
165
+ "read_chat_history": False,
166
+ "search_knowledge": True,
167
+ "update_knowledge": False,
168
+ "read_tool_call_history": False,
169
+ # System message defaults
170
+ "system_message_role": "system",
171
+ "build_context": True,
172
+ "markdown": False,
173
+ "add_name_to_context": False,
174
+ "add_datetime_to_context": False,
175
+ "add_location_to_context": False,
176
+ "resolve_in_context": True,
177
+ # Extra messages defaults
178
+ "user_message_role": "user",
179
+ "build_user_context": True,
180
+ # Response settings defaults
181
+ "retries": 0,
182
+ "delay_between_retries": 1,
183
+ "exponential_backoff": False,
184
+ "parse_response": True,
185
+ "use_json_mode": False,
186
+ # Streaming defaults
187
+ "stream_intermediate_steps": False,
188
+ }
189
+
190
+ agent_tools = agent.get_tools(
191
+ session=AgentSession(session_id=str(uuid4()), session_data={}),
192
+ run_response=RunOutput(run_id=str(uuid4())),
193
+ async_mode=True,
194
+ )
195
+ formatted_tools = format_tools(agent_tools) if agent_tools else None
196
+
197
+ additional_input = agent.additional_input
198
+ if additional_input and isinstance(additional_input[0], Message):
199
+ additional_input = [message.to_dict() for message in additional_input] # type: ignore
200
+
201
+ # Build model only if it has at least one non-null field
202
+ model_name = agent.model.name if (agent.model and agent.model.name) else None
203
+ model_provider = agent.model.provider if (agent.model and agent.model.provider) else None
204
+ model_id = agent.model.id if (agent.model and agent.model.id) else None
205
+ _agent_model_data: Dict[str, Any] = {}
206
+ if model_name is not None:
207
+ _agent_model_data["name"] = model_name
208
+ if model_id is not None:
209
+ _agent_model_data["model"] = model_id
210
+ if model_provider is not None:
211
+ _agent_model_data["provider"] = model_provider
212
+
213
+ session_table = agent.db.session_table_name if agent.db else None
214
+ knowledge_table = agent.db.knowledge_table_name if agent.db and agent.knowledge else None
215
+
216
+ tools_info = {
217
+ "tools": formatted_tools,
218
+ "tool_call_limit": agent.tool_call_limit,
219
+ "tool_choice": agent.tool_choice,
220
+ }
221
+
222
+ sessions_info = {
223
+ "session_table": session_table,
224
+ "add_history_to_context": agent.add_history_to_context,
225
+ "enable_session_summaries": agent.enable_session_summaries,
226
+ "num_history_runs": agent.num_history_runs,
227
+ "search_session_history": agent.search_session_history,
228
+ "num_history_sessions": agent.num_history_sessions,
229
+ "cache_session": agent.cache_session,
230
+ }
231
+
232
+ knowledge_info = {
233
+ "knowledge_table": knowledge_table,
234
+ "enable_agentic_knowledge_filters": agent.enable_agentic_knowledge_filters,
235
+ "knowledge_filters": agent.knowledge_filters,
236
+ "references_format": agent.references_format,
237
+ }
238
+
239
+ memory_info: Optional[Dict[str, Any]] = None
240
+ if agent.memory_manager is not None:
241
+ memory_info = {
242
+ "enable_agentic_memory": agent.enable_agentic_memory,
243
+ "enable_user_memories": agent.enable_user_memories,
244
+ "metadata": agent.metadata,
245
+ "memory_table": agent.db.memory_table_name if agent.db and agent.enable_user_memories else None,
246
+ }
247
+
248
+ if agent.memory_manager.model is not None:
249
+ memory_info["model"] = ModelResponse(
250
+ name=agent.memory_manager.model.name,
251
+ model=agent.memory_manager.model.id,
252
+ provider=agent.memory_manager.model.provider,
253
+ ).model_dump()
254
+
255
+ reasoning_info: Dict[str, Any] = {
256
+ "reasoning": agent.reasoning,
257
+ "reasoning_agent_id": agent.reasoning_agent.id if agent.reasoning_agent else None,
258
+ "reasoning_min_steps": agent.reasoning_min_steps,
259
+ "reasoning_max_steps": agent.reasoning_max_steps,
260
+ }
261
+
262
+ if agent.reasoning_model:
263
+ reasoning_info["reasoning_model"] = ModelResponse(
264
+ name=agent.reasoning_model.name,
265
+ model=agent.reasoning_model.id,
266
+ provider=agent.reasoning_model.provider,
267
+ ).model_dump()
268
+
269
+ default_tools_info = {
270
+ "read_chat_history": agent.read_chat_history,
271
+ "search_knowledge": agent.search_knowledge,
272
+ "update_knowledge": agent.update_knowledge,
273
+ "read_tool_call_history": agent.read_tool_call_history,
274
+ }
275
+
276
+ system_message_info = {
277
+ "system_message": str(agent.system_message) if agent.system_message else None,
278
+ "system_message_role": agent.system_message_role,
279
+ "build_context": agent.build_context,
280
+ "description": agent.description,
281
+ "instructions": agent.instructions if agent.instructions else None,
282
+ "expected_output": agent.expected_output,
283
+ "additional_context": agent.additional_context,
284
+ "markdown": agent.markdown,
285
+ "add_name_to_context": agent.add_name_to_context,
286
+ "add_datetime_to_context": agent.add_datetime_to_context,
287
+ "add_location_to_context": agent.add_location_to_context,
288
+ "timezone_identifier": agent.timezone_identifier,
289
+ "resolve_in_context": agent.resolve_in_context,
290
+ }
291
+
292
+ extra_messages_info = {
293
+ "additional_input": additional_input, # type: ignore
294
+ "user_message_role": agent.user_message_role,
295
+ "build_user_context": agent.build_user_context,
296
+ }
297
+
298
+ response_settings_info: Dict[str, Any] = {
299
+ "retries": agent.retries,
300
+ "delay_between_retries": agent.delay_between_retries,
301
+ "exponential_backoff": agent.exponential_backoff,
302
+ "output_schema_name": agent.output_schema.__name__ if agent.output_schema else None,
303
+ "parser_model_prompt": agent.parser_model_prompt,
304
+ "parse_response": agent.parse_response,
305
+ "structured_outputs": agent.structured_outputs,
306
+ "use_json_mode": agent.use_json_mode,
307
+ "save_response_to_file": agent.save_response_to_file,
308
+ }
309
+
310
+ if agent.parser_model:
311
+ response_settings_info["parser_model"] = ModelResponse(
312
+ name=agent.parser_model.name,
313
+ model=agent.parser_model.id,
314
+ provider=agent.parser_model.provider,
315
+ ).model_dump()
316
+
317
+ streaming_info = {
318
+ "stream": agent.stream,
319
+ "stream_intermediate_steps": agent.stream_intermediate_steps,
320
+ }
321
+ return AgentResponse(
322
+ id=agent.id,
323
+ name=agent.name,
324
+ db_id=agent.db.id if agent.db else None,
325
+ model=ModelResponse(**_agent_model_data) if _agent_model_data else None,
326
+ tools=filter_meaningful_config(tools_info, {}),
327
+ sessions=filter_meaningful_config(sessions_info, agent_defaults),
328
+ knowledge=filter_meaningful_config(knowledge_info, agent_defaults),
329
+ memory=filter_meaningful_config(memory_info, agent_defaults) if memory_info else None,
330
+ reasoning=filter_meaningful_config(reasoning_info, agent_defaults),
331
+ default_tools=filter_meaningful_config(default_tools_info, agent_defaults),
332
+ system_message=filter_meaningful_config(system_message_info, agent_defaults),
333
+ extra_messages=filter_meaningful_config(extra_messages_info, agent_defaults),
334
+ response_settings=filter_meaningful_config(response_settings_info, agent_defaults),
335
+ streaming=filter_meaningful_config(streaming_info, agent_defaults),
336
+ metadata=agent.metadata,
337
+ )
338
+
339
+
340
+ class TeamResponse(BaseModel):
341
+ id: Optional[str] = None
342
+ name: Optional[str] = None
343
+ db_id: Optional[str] = None
344
+ description: Optional[str] = None
345
+ mode: Optional[str] = None
346
+ model: Optional[ModelResponse] = None
347
+ tools: Optional[Dict[str, Any]] = None
348
+ sessions: Optional[Dict[str, Any]] = None
349
+ knowledge: Optional[Dict[str, Any]] = None
350
+ memory: Optional[Dict[str, Any]] = None
351
+ reasoning: Optional[Dict[str, Any]] = None
352
+ default_tools: Optional[Dict[str, Any]] = None
353
+ system_message: Optional[Dict[str, Any]] = None
354
+ response_settings: Optional[Dict[str, Any]] = None
355
+ streaming: Optional[Dict[str, Any]] = None
356
+ members: Optional[List[Union[AgentResponse, "TeamResponse"]]] = None
357
+ metadata: Optional[Dict[str, Any]] = None
358
+
359
+ @classmethod
360
+ def from_team(cls, team: Team) -> "TeamResponse":
361
+ def filter_meaningful_config(d: Dict[str, Any], defaults: Dict[str, Any]) -> Optional[Dict[str, Any]]:
362
+ """Filter out fields that match their default values, keeping only meaningful user configurations"""
363
+ filtered = {}
364
+ for key, value in d.items():
365
+ if value is None:
366
+ continue
367
+ # Skip if value matches the default exactly
368
+ if key in defaults and value == defaults[key]:
369
+ continue
370
+ # Keep non-default values
371
+ filtered[key] = value
372
+ return filtered if filtered else None
373
+
374
+ # Define default values for filtering (similar to agent defaults)
375
+ team_defaults = {
376
+ # Sessions defaults
377
+ "add_history_to_context": False,
378
+ "num_history_runs": 3,
379
+ "enable_session_summaries": False,
380
+ "cache_session": False,
381
+ # Knowledge defaults
382
+ "add_references": False,
383
+ "references_format": "json",
384
+ "enable_agentic_knowledge_filters": False,
385
+ # Memory defaults
386
+ "enable_agentic_memory": False,
387
+ "enable_user_memories": False,
388
+ # Reasoning defaults
389
+ "reasoning": False,
390
+ "reasoning_min_steps": 1,
391
+ "reasoning_max_steps": 10,
392
+ # Default tools defaults
393
+ "search_knowledge": True,
394
+ "read_team_history": False,
395
+ "get_member_information_tool": False,
396
+ # System message defaults
397
+ "system_message_role": "system",
398
+ "markdown": False,
399
+ "add_datetime_to_context": False,
400
+ "add_location_to_context": False,
401
+ "resolve_in_context": True,
402
+ # Response settings defaults
403
+ "parse_response": True,
404
+ "use_json_mode": False,
405
+ # Streaming defaults
406
+ "stream_intermediate_steps": False,
407
+ "stream_member_events": False,
408
+ }
409
+
410
+ if team.model is None:
411
+ raise ValueError("Team model is required")
412
+
413
+ team.determine_tools_for_model(
414
+ model=team.model,
415
+ session=TeamSession(session_id=str(uuid4()), session_data={}),
416
+ run_response=TeamRunOutput(run_id=str(uuid4())),
417
+ async_mode=True,
418
+ session_state={},
419
+ team_run_context={},
420
+ )
421
+ team_tools = list(team._functions_for_model.values()) if team._functions_for_model else []
422
+ formatted_tools = format_team_tools(team_tools) if team_tools else None
423
+
424
+ model_name = team.model.name or team.model.__class__.__name__ if team.model else None
425
+ model_provider = team.model.provider or team.model.__class__.__name__ if team.model else ""
426
+ model_id = team.model.id if team.model else None
427
+
428
+ if model_provider and model_id:
429
+ model_provider = f"{model_provider} {model_id}"
430
+ elif model_name and model_id:
431
+ model_provider = f"{model_name} {model_id}"
432
+ elif model_id:
433
+ model_provider = model_id
434
+
435
+ session_table = team.db.session_table_name if team.db else None
436
+ knowledge_table = team.db.knowledge_table_name if team.db and team.knowledge else None
437
+
438
+ tools_info = {
439
+ "tools": formatted_tools,
440
+ "tool_call_limit": team.tool_call_limit,
441
+ "tool_choice": team.tool_choice,
442
+ }
443
+
444
+ sessions_info = {
445
+ "session_table": session_table,
446
+ "add_history_to_context": team.add_history_to_context,
447
+ "enable_session_summaries": team.enable_session_summaries,
448
+ "num_history_runs": team.num_history_runs,
449
+ "cache_session": team.cache_session,
450
+ }
451
+
452
+ knowledge_info = {
453
+ "knowledge_table": knowledge_table,
454
+ "enable_agentic_knowledge_filters": team.enable_agentic_knowledge_filters,
455
+ "knowledge_filters": team.knowledge_filters,
456
+ "references_format": team.references_format,
457
+ }
458
+
459
+ memory_info: Optional[Dict[str, Any]] = None
460
+ if team.memory_manager is not None:
461
+ memory_info = {
462
+ "enable_agentic_memory": team.enable_agentic_memory,
463
+ "enable_user_memories": team.enable_user_memories,
464
+ "metadata": team.metadata,
465
+ "memory_table": team.db.memory_table_name if team.db and team.enable_user_memories else None,
466
+ }
467
+
468
+ if team.memory_manager.model is not None:
469
+ memory_info["model"] = ModelResponse(
470
+ name=team.memory_manager.model.name,
471
+ model=team.memory_manager.model.id,
472
+ provider=team.memory_manager.model.provider,
473
+ ).model_dump()
474
+
475
+ reasoning_info: Dict[str, Any] = {
476
+ "reasoning": team.reasoning,
477
+ "reasoning_agent_id": team.reasoning_agent.id if team.reasoning_agent else None,
478
+ "reasoning_min_steps": team.reasoning_min_steps,
479
+ "reasoning_max_steps": team.reasoning_max_steps,
480
+ }
481
+
482
+ if team.reasoning_model:
483
+ reasoning_info["reasoning_model"] = ModelResponse(
484
+ name=team.reasoning_model.name,
485
+ model=team.reasoning_model.id,
486
+ provider=team.reasoning_model.provider,
487
+ ).model_dump()
488
+
489
+ default_tools_info = {
490
+ "search_knowledge": team.search_knowledge,
491
+ "read_team_history": team.read_team_history,
492
+ "get_member_information_tool": team.get_member_information_tool,
493
+ }
494
+
495
+ team_instructions = (
496
+ team.instructions() if team.instructions and callable(team.instructions) else team.instructions
497
+ )
498
+
499
+ system_message_info = {
500
+ "system_message": str(team.system_message) if team.system_message else None,
501
+ "system_message_role": team.system_message_role,
502
+ "description": team.description,
503
+ "instructions": team_instructions,
504
+ "expected_output": team.expected_output,
505
+ "additional_context": team.additional_context,
506
+ "markdown": team.markdown,
507
+ "add_datetime_to_context": team.add_datetime_to_context,
508
+ "add_location_to_context": team.add_location_to_context,
509
+ "resolve_in_context": team.resolve_in_context,
510
+ }
511
+
512
+ response_settings_info: Dict[str, Any] = {
513
+ "output_schema_name": team.output_schema.__name__ if team.output_schema else None,
514
+ "parser_model_prompt": team.parser_model_prompt,
515
+ "parse_response": team.parse_response,
516
+ "use_json_mode": team.use_json_mode,
517
+ }
518
+
519
+ if team.parser_model:
520
+ response_settings_info["parser_model"] = ModelResponse(
521
+ name=team.parser_model.name,
522
+ model=team.parser_model.id,
523
+ provider=team.parser_model.provider,
524
+ ).model_dump()
525
+
526
+ streaming_info = {
527
+ "stream": team.stream,
528
+ "stream_intermediate_steps": team.stream_intermediate_steps,
529
+ "stream_member_events": team.stream_member_events,
530
+ }
531
+
532
+ # Build team model only if it has at least one non-null field
533
+ _team_model_data: Dict[str, Any] = {}
534
+ if team.model and team.model.name is not None:
535
+ _team_model_data["name"] = team.model.name
536
+ if team.model and team.model.id is not None:
537
+ _team_model_data["model"] = team.model.id
538
+ if team.model and team.model.provider is not None:
539
+ _team_model_data["provider"] = team.model.provider
540
+
541
+ return TeamResponse(
542
+ id=team.id,
543
+ name=team.name,
544
+ mode=team.mode,
545
+ db_id=team.db.id if team.db else None,
546
+ model=ModelResponse(**_team_model_data) if _team_model_data else None,
547
+ tools=filter_meaningful_config(tools_info, {}),
548
+ sessions=filter_meaningful_config(sessions_info, team_defaults),
549
+ knowledge=filter_meaningful_config(knowledge_info, team_defaults),
550
+ memory=filter_meaningful_config(memory_info, team_defaults) if memory_info else None,
551
+ reasoning=filter_meaningful_config(reasoning_info, team_defaults),
552
+ default_tools=filter_meaningful_config(default_tools_info, team_defaults),
553
+ system_message=filter_meaningful_config(system_message_info, team_defaults),
554
+ response_settings=filter_meaningful_config(response_settings_info, team_defaults),
555
+ streaming=filter_meaningful_config(streaming_info, team_defaults),
556
+ members=[ # type: ignore
557
+ AgentResponse.from_agent(member)
558
+ if isinstance(member, Agent)
559
+ else TeamResponse.from_team(member)
560
+ if isinstance(member, Team)
561
+ else None
562
+ for member in team.members
563
+ ],
564
+ metadata=team.metadata,
565
+ )
566
+
567
+
568
+ class WorkflowResponse(BaseModel):
569
+ id: Optional[str] = None
570
+ name: Optional[str] = None
571
+ db_id: Optional[str] = None
572
+ description: Optional[str] = None
573
+ input_schema: Optional[Dict[str, Any]] = None
574
+ steps: Optional[List[Dict[str, Any]]] = None
575
+ agent: Optional[AgentResponse] = None
576
+ team: Optional[TeamResponse] = None
577
+ metadata: Optional[Dict[str, Any]] = None
578
+
579
+ class Config:
580
+ exclude_none = True
581
+
582
+ @classmethod
583
+ def _resolve_agents_and_teams_recursively(cls, steps: List[Dict[str, Any]]) -> List[Dict[str, Any]]:
584
+ """Parse Agents and Teams into AgentResponse and TeamResponse objects.
585
+
586
+ If the given steps have nested steps, recursively work on those."""
587
+ if not steps:
588
+ return steps
589
+
590
+ def _prune_none(value: Any) -> Any:
591
+ # Recursively remove None values from dicts and lists
592
+ if isinstance(value, dict):
593
+ return {k: _prune_none(v) for k, v in value.items() if v is not None}
594
+ if isinstance(value, list):
595
+ return [_prune_none(v) for v in value]
596
+ return value
597
+
598
+ for idx, step in enumerate(steps):
599
+ if step.get("agent"):
600
+ # Convert to dict and exclude fields that are None
601
+ step["agent"] = AgentResponse.from_agent(step["agent"]).model_dump(exclude_none=True)
602
+
603
+ if step.get("team"):
604
+ step["team"] = TeamResponse.from_team(step["team"]).model_dump(exclude_none=True)
605
+
606
+ if step.get("steps"):
607
+ step["steps"] = cls._resolve_agents_and_teams_recursively(step["steps"])
608
+
609
+ # Prune None values in the entire step
610
+ steps[idx] = _prune_none(step)
611
+
612
+ return steps
613
+
614
+ @classmethod
615
+ def from_workflow(cls, workflow: Workflow) -> "WorkflowResponse":
616
+ workflow_dict = workflow.to_dict()
617
+ steps = workflow_dict.get("steps")
618
+
619
+ if steps:
620
+ steps = cls._resolve_agents_and_teams_recursively(steps)
621
+
622
+ return cls(
623
+ id=workflow.id,
624
+ name=workflow.name,
625
+ db_id=workflow.db.id if workflow.db else None,
626
+ description=workflow.description,
627
+ steps=steps,
628
+ input_schema=get_workflow_input_schema_dict(workflow),
629
+ metadata=workflow.metadata,
630
+ )
631
+
632
+
633
+ class WorkflowRunRequest(BaseModel):
634
+ input: Dict[str, Any]
635
+ user_id: Optional[str] = None
636
+ session_id: Optional[str] = None
637
+
638
+
639
+ class SessionSchema(BaseModel):
640
+ session_id: str
641
+ session_name: str
642
+ session_state: Optional[dict]
643
+ created_at: Optional[datetime]
644
+ updated_at: Optional[datetime]
645
+
646
+ @classmethod
647
+ def from_dict(cls, session: Dict[str, Any]) -> "SessionSchema":
648
+ session_name = get_session_name(session)
649
+ return cls(
650
+ session_id=session.get("session_id", ""),
651
+ session_name=session_name,
652
+ session_state=session.get("session_data", {}).get("session_state", None),
653
+ created_at=datetime.fromtimestamp(session.get("created_at", 0), tz=timezone.utc)
654
+ if session.get("created_at")
655
+ else None,
656
+ updated_at=datetime.fromtimestamp(session.get("updated_at", 0), tz=timezone.utc)
657
+ if session.get("updated_at")
658
+ else None,
659
+ )
660
+
661
+
662
+ class DeleteSessionRequest(BaseModel):
663
+ session_ids: List[str]
664
+ session_types: List[SessionType]
665
+
666
+
667
+ class AgentSessionDetailSchema(BaseModel):
668
+ user_id: Optional[str]
669
+ agent_session_id: str
670
+ session_id: str
671
+ session_name: str
672
+ session_summary: Optional[dict]
673
+ session_state: Optional[dict]
674
+ agent_id: Optional[str]
675
+ total_tokens: Optional[int]
676
+ agent_data: Optional[dict]
677
+ metrics: Optional[dict]
678
+ chat_history: Optional[List[dict]]
679
+ created_at: Optional[datetime]
680
+ updated_at: Optional[datetime]
681
+
682
+ @classmethod
683
+ def from_session(cls, session: AgentSession) -> "AgentSessionDetailSchema":
684
+ session_name = get_session_name({**session.to_dict(), "session_type": "agent"})
685
+ return cls(
686
+ user_id=session.user_id,
687
+ agent_session_id=session.session_id,
688
+ session_id=session.session_id,
689
+ session_name=session_name,
690
+ session_summary=session.summary.to_dict() if session.summary else None,
691
+ session_state=session.session_data.get("session_state", None) if session.session_data else None,
692
+ agent_id=session.agent_id if session.agent_id else None,
693
+ agent_data=session.agent_data,
694
+ total_tokens=session.session_data.get("session_metrics", {}).get("total_tokens")
695
+ if session.session_data
696
+ else None,
697
+ metrics=session.session_data.get("session_metrics", {}) if session.session_data else None, # type: ignore
698
+ chat_history=[message.to_dict() for message in session.get_chat_history()],
699
+ created_at=datetime.fromtimestamp(session.created_at, tz=timezone.utc) if session.created_at else None,
700
+ updated_at=datetime.fromtimestamp(session.updated_at, tz=timezone.utc) if session.updated_at else None,
701
+ )
702
+
703
+
704
+ class TeamSessionDetailSchema(BaseModel):
705
+ session_id: str
706
+ session_name: str
707
+ user_id: Optional[str]
708
+ team_id: Optional[str]
709
+ session_summary: Optional[dict]
710
+ session_state: Optional[dict]
711
+ metrics: Optional[dict]
712
+ team_data: Optional[dict]
713
+ created_at: Optional[datetime]
714
+ updated_at: Optional[datetime]
715
+
716
+ @classmethod
717
+ def from_session(cls, session: TeamSession) -> "TeamSessionDetailSchema":
718
+ session_dict = session.to_dict()
719
+ session_name = get_session_name({**session_dict, "session_type": "team"})
720
+
721
+ return cls(
722
+ session_id=session.session_id,
723
+ team_id=session.team_id,
724
+ session_name=session_name,
725
+ session_summary=session_dict.get("summary") if session_dict.get("summary") else None,
726
+ user_id=session.user_id,
727
+ team_data=session.team_data,
728
+ session_state=session.session_data.get("session_state", None) if session.session_data else None,
729
+ total_tokens=session.session_data.get("session_metrics", {}).get("total_tokens")
730
+ if session.session_data
731
+ else None,
732
+ metrics=session.session_data.get("session_metrics", {}) if session.session_data else None,
733
+ created_at=datetime.fromtimestamp(session.created_at, tz=timezone.utc) if session.created_at else None,
734
+ updated_at=datetime.fromtimestamp(session.updated_at, tz=timezone.utc) if session.updated_at else None,
735
+ )
736
+
737
+
738
+ class WorkflowSessionDetailSchema(BaseModel):
739
+ user_id: Optional[str]
740
+ workflow_id: Optional[str]
741
+ workflow_name: Optional[str]
742
+
743
+ session_id: str
744
+ session_name: str
745
+
746
+ session_data: Optional[dict]
747
+ session_state: Optional[dict]
748
+ workflow_data: Optional[dict]
749
+ metadata: Optional[dict]
750
+
751
+ created_at: Optional[int]
752
+ updated_at: Optional[int]
753
+
754
+ @classmethod
755
+ def from_session(cls, session: WorkflowSession) -> "WorkflowSessionDetailSchema":
756
+ session_dict = session.to_dict()
757
+ session_name = get_session_name({**session_dict, "session_type": "workflow"})
758
+
759
+ return cls(
760
+ session_id=session.session_id,
761
+ user_id=session.user_id,
762
+ workflow_id=session.workflow_id,
763
+ workflow_name=session.workflow_name,
764
+ session_name=session_name,
765
+ session_data=session.session_data,
766
+ session_state=session.session_data.get("session_state", None) if session.session_data else None,
767
+ workflow_data=session.workflow_data,
768
+ metadata=session.metadata,
769
+ created_at=session.created_at,
770
+ updated_at=session.updated_at,
771
+ )
772
+
773
+
774
+ class RunSchema(BaseModel):
775
+ run_id: str
776
+ agent_session_id: Optional[str]
777
+ user_id: Optional[str]
778
+ run_input: Optional[str]
779
+ content: Optional[Union[str, dict]]
780
+ run_response_format: Optional[str]
781
+ reasoning_content: Optional[str]
782
+ metrics: Optional[dict]
783
+ messages: Optional[List[dict]]
784
+ tools: Optional[List[dict]]
785
+ events: Optional[List[dict]]
786
+ created_at: Optional[datetime]
787
+
788
+ @classmethod
789
+ def from_dict(cls, run_dict: Dict[str, Any]) -> "RunSchema":
790
+ run_input = get_run_input(run_dict)
791
+ run_response_format = "text" if run_dict.get("content_type", "str") == "str" else "json"
792
+ return cls(
793
+ run_id=run_dict.get("run_id", ""),
794
+ agent_session_id=run_dict.get("session_id", ""),
795
+ user_id=run_dict.get("user_id", ""),
796
+ run_input=run_input,
797
+ content=run_dict.get("content", ""),
798
+ run_response_format=run_response_format,
799
+ reasoning_content=run_dict.get("reasoning_content", ""),
800
+ metrics=run_dict.get("metrics", {}),
801
+ messages=[message for message in run_dict.get("messages", [])] if run_dict.get("messages") else None,
802
+ tools=[tool for tool in run_dict.get("tools", [])] if run_dict.get("tools") else None,
803
+ events=[event for event in run_dict["events"]] if run_dict.get("events") else None,
804
+ created_at=datetime.fromtimestamp(run_dict.get("created_at", 0), tz=timezone.utc)
805
+ if run_dict.get("created_at") is not None
806
+ else None,
807
+ )
808
+
809
+
810
+ class TeamRunSchema(BaseModel):
811
+ run_id: str
812
+ parent_run_id: Optional[str]
813
+ content: Optional[Union[str, dict]]
814
+ reasoning_content: Optional[str]
815
+ run_input: Optional[str]
816
+ run_response_format: Optional[str]
817
+ metrics: Optional[dict]
818
+ tools: Optional[List[dict]]
819
+ messages: Optional[List[dict]]
820
+ events: Optional[List[dict]]
821
+ created_at: Optional[datetime]
822
+
823
+ @classmethod
824
+ def from_dict(cls, run_dict: Dict[str, Any]) -> "TeamRunSchema":
825
+ run_input = get_run_input(run_dict)
826
+ run_response_format = "text" if run_dict.get("content_type", "str") == "str" else "json"
827
+ return cls(
828
+ run_id=run_dict.get("run_id", ""),
829
+ parent_run_id=run_dict.get("parent_run_id", ""),
830
+ run_input=run_input,
831
+ content=run_dict.get("content", ""),
832
+ run_response_format=run_response_format,
833
+ reasoning_content=run_dict.get("reasoning_content", ""),
834
+ metrics=run_dict.get("metrics", {}),
835
+ messages=[message for message in run_dict.get("messages", [])] if run_dict.get("messages") else None,
836
+ tools=[tool for tool in run_dict.get("tools", [])] if run_dict.get("tools") else None,
837
+ events=[event for event in run_dict["events"]] if run_dict.get("events") else None,
838
+ created_at=datetime.fromtimestamp(run_dict.get("created_at", 0), tz=timezone.utc)
839
+ if run_dict.get("created_at") is not None
840
+ else None,
841
+ )
842
+
843
+
844
+ class WorkflowRunSchema(BaseModel):
845
+ run_id: str
846
+ run_input: Optional[str]
847
+ user_id: Optional[str]
848
+ content: Optional[Union[str, dict]]
849
+ content_type: Optional[str]
850
+ status: Optional[str]
851
+ step_results: Optional[list[dict]]
852
+ step_executor_runs: Optional[list[dict]]
853
+ metrics: Optional[dict]
854
+ created_at: Optional[int]
855
+
856
+ @classmethod
857
+ def from_dict(cls, run_response: Dict[str, Any]) -> "WorkflowRunSchema":
858
+ run_input = get_run_input(run_response, is_workflow_run=True)
859
+ return cls(
860
+ run_id=run_response.get("run_id", ""),
861
+ run_input=run_input,
862
+ user_id=run_response.get("user_id", ""),
863
+ content=run_response.get("content", ""),
864
+ content_type=run_response.get("content_type", ""),
865
+ status=run_response.get("status", ""),
866
+ metrics=run_response.get("metrics", {}),
867
+ step_results=run_response.get("step_results", []),
868
+ step_executor_runs=run_response.get("step_executor_runs", []),
869
+ created_at=run_response["created_at"],
870
+ )
871
+
872
+
873
+ T = TypeVar("T")
874
+
875
+
876
+ class SortOrder(str, Enum):
877
+ ASC = "asc"
878
+ DESC = "desc"
879
+
880
+
881
+ class PaginationInfo(BaseModel):
882
+ page: Optional[int] = 0
883
+ limit: Optional[int] = 20
884
+ total_pages: Optional[int] = 0
885
+ total_count: Optional[int] = 0
886
+
887
+
888
+ class PaginatedResponse(BaseModel, Generic[T]):
889
+ """Wrapper to add pagination info to classes used as response models"""
890
+
891
+ data: List[T]
892
+ meta: PaginationInfo