agno 1.8.0__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 (583) hide show
  1. agno/__init__.py +8 -0
  2. agno/agent/__init__.py +19 -27
  3. agno/agent/agent.py +2781 -4126
  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/media.py +2 -2
  137. agno/memory/__init__.py +2 -10
  138. agno/memory/manager.py +1003 -148
  139. agno/models/aimlapi/__init__.py +2 -2
  140. agno/models/aimlapi/aimlapi.py +6 -6
  141. agno/models/anthropic/claude.py +129 -82
  142. agno/models/aws/bedrock.py +107 -175
  143. agno/models/aws/claude.py +64 -18
  144. agno/models/azure/ai_foundry.py +73 -23
  145. agno/models/base.py +347 -287
  146. agno/models/cerebras/cerebras.py +84 -27
  147. agno/models/cohere/chat.py +106 -98
  148. agno/models/dashscope/dashscope.py +14 -5
  149. agno/models/google/gemini.py +123 -53
  150. agno/models/groq/groq.py +97 -35
  151. agno/models/huggingface/huggingface.py +92 -27
  152. agno/models/ibm/watsonx.py +72 -13
  153. agno/models/litellm/chat.py +85 -13
  154. agno/models/message.py +38 -144
  155. agno/models/meta/llama.py +85 -49
  156. agno/models/metrics.py +120 -0
  157. agno/models/mistral/mistral.py +90 -21
  158. agno/models/ollama/__init__.py +0 -2
  159. agno/models/ollama/chat.py +84 -46
  160. agno/models/openai/chat.py +135 -27
  161. agno/models/openai/responses.py +233 -115
  162. agno/models/perplexity/perplexity.py +26 -2
  163. agno/models/portkey/portkey.py +0 -7
  164. agno/models/response.py +14 -8
  165. agno/models/utils.py +20 -0
  166. agno/models/vercel/__init__.py +2 -2
  167. agno/models/vercel/v0.py +1 -1
  168. agno/models/vllm/__init__.py +2 -2
  169. agno/models/vllm/vllm.py +3 -3
  170. agno/models/xai/xai.py +10 -10
  171. agno/os/__init__.py +3 -0
  172. agno/os/app.py +393 -0
  173. agno/os/auth.py +47 -0
  174. agno/os/config.py +103 -0
  175. agno/os/interfaces/agui/__init__.py +3 -0
  176. agno/os/interfaces/agui/agui.py +31 -0
  177. agno/{app/agui/async_router.py → os/interfaces/agui/router.py} +16 -16
  178. agno/{app → os/interfaces}/agui/utils.py +65 -28
  179. agno/os/interfaces/base.py +21 -0
  180. agno/os/interfaces/slack/__init__.py +3 -0
  181. agno/{app/slack/async_router.py → os/interfaces/slack/router.py} +3 -5
  182. agno/os/interfaces/slack/slack.py +33 -0
  183. agno/os/interfaces/whatsapp/__init__.py +3 -0
  184. agno/{app/whatsapp/async_router.py → os/interfaces/whatsapp/router.py} +4 -7
  185. agno/os/interfaces/whatsapp/whatsapp.py +30 -0
  186. agno/os/router.py +843 -0
  187. agno/os/routers/__init__.py +3 -0
  188. agno/os/routers/evals/__init__.py +3 -0
  189. agno/os/routers/evals/evals.py +204 -0
  190. agno/os/routers/evals/schemas.py +142 -0
  191. agno/os/routers/evals/utils.py +161 -0
  192. agno/os/routers/knowledge/__init__.py +3 -0
  193. agno/os/routers/knowledge/knowledge.py +413 -0
  194. agno/os/routers/knowledge/schemas.py +118 -0
  195. agno/os/routers/memory/__init__.py +3 -0
  196. agno/os/routers/memory/memory.py +179 -0
  197. agno/os/routers/memory/schemas.py +58 -0
  198. agno/os/routers/metrics/__init__.py +3 -0
  199. agno/os/routers/metrics/metrics.py +58 -0
  200. agno/os/routers/metrics/schemas.py +47 -0
  201. agno/os/routers/session/__init__.py +3 -0
  202. agno/os/routers/session/session.py +163 -0
  203. agno/os/schema.py +892 -0
  204. agno/{app/playground → os}/settings.py +8 -15
  205. agno/os/utils.py +270 -0
  206. agno/reasoning/azure_ai_foundry.py +4 -4
  207. agno/reasoning/deepseek.py +4 -4
  208. agno/reasoning/default.py +6 -11
  209. agno/reasoning/groq.py +4 -4
  210. agno/reasoning/helpers.py +4 -6
  211. agno/reasoning/ollama.py +4 -4
  212. agno/reasoning/openai.py +4 -4
  213. agno/run/{response.py → agent.py} +144 -72
  214. agno/run/base.py +44 -58
  215. agno/run/cancel.py +83 -0
  216. agno/run/team.py +133 -77
  217. agno/run/workflow.py +537 -12
  218. agno/session/__init__.py +10 -0
  219. agno/session/agent.py +244 -0
  220. agno/session/summary.py +225 -0
  221. agno/session/team.py +262 -0
  222. agno/{storage/session/v2 → session}/workflow.py +47 -24
  223. agno/team/__init__.py +15 -16
  224. agno/team/team.py +2967 -4243
  225. agno/tools/agentql.py +14 -5
  226. agno/tools/airflow.py +9 -4
  227. agno/tools/api.py +7 -3
  228. agno/tools/apify.py +2 -46
  229. agno/tools/arxiv.py +8 -3
  230. agno/tools/aws_lambda.py +7 -5
  231. agno/tools/aws_ses.py +7 -1
  232. agno/tools/baidusearch.py +4 -1
  233. agno/tools/bitbucket.py +4 -4
  234. agno/tools/brandfetch.py +14 -11
  235. agno/tools/bravesearch.py +4 -1
  236. agno/tools/brightdata.py +42 -22
  237. agno/tools/browserbase.py +13 -4
  238. agno/tools/calcom.py +12 -10
  239. agno/tools/calculator.py +10 -27
  240. agno/tools/cartesia.py +18 -13
  241. agno/tools/{clickup_tool.py → clickup.py} +12 -25
  242. agno/tools/confluence.py +71 -18
  243. agno/tools/crawl4ai.py +7 -1
  244. agno/tools/csv_toolkit.py +9 -8
  245. agno/tools/dalle.py +18 -11
  246. agno/tools/daytona.py +13 -16
  247. agno/tools/decorator.py +6 -3
  248. agno/tools/desi_vocal.py +16 -7
  249. agno/tools/discord.py +11 -8
  250. agno/tools/docker.py +30 -42
  251. agno/tools/duckdb.py +34 -53
  252. agno/tools/duckduckgo.py +8 -7
  253. agno/tools/e2b.py +62 -62
  254. agno/tools/eleven_labs.py +35 -28
  255. agno/tools/email.py +4 -1
  256. agno/tools/evm.py +7 -1
  257. agno/tools/exa.py +19 -14
  258. agno/tools/fal.py +29 -29
  259. agno/tools/file.py +9 -8
  260. agno/tools/financial_datasets.py +25 -44
  261. agno/tools/firecrawl.py +22 -22
  262. agno/tools/function.py +68 -17
  263. agno/tools/giphy.py +22 -10
  264. agno/tools/github.py +48 -126
  265. agno/tools/gmail.py +46 -62
  266. agno/tools/google_bigquery.py +7 -6
  267. agno/tools/google_maps.py +11 -26
  268. agno/tools/googlesearch.py +7 -2
  269. agno/tools/googlesheets.py +21 -17
  270. agno/tools/hackernews.py +9 -5
  271. agno/tools/jina.py +5 -4
  272. agno/tools/jira.py +18 -9
  273. agno/tools/knowledge.py +31 -32
  274. agno/tools/linear.py +18 -33
  275. agno/tools/linkup.py +5 -1
  276. agno/tools/local_file_system.py +8 -5
  277. agno/tools/lumalab.py +31 -19
  278. agno/tools/mem0.py +18 -12
  279. agno/tools/memori.py +14 -10
  280. agno/tools/mlx_transcribe.py +3 -2
  281. agno/tools/models/azure_openai.py +32 -14
  282. agno/tools/models/gemini.py +58 -31
  283. agno/tools/models/groq.py +29 -20
  284. agno/tools/models/nebius.py +27 -11
  285. agno/tools/models_labs.py +39 -15
  286. agno/tools/moviepy_video.py +7 -6
  287. agno/tools/neo4j.py +134 -0
  288. agno/tools/newspaper.py +7 -2
  289. agno/tools/newspaper4k.py +8 -3
  290. agno/tools/openai.py +57 -26
  291. agno/tools/openbb.py +12 -11
  292. agno/tools/opencv.py +62 -46
  293. agno/tools/openweather.py +14 -12
  294. agno/tools/pandas.py +11 -3
  295. agno/tools/postgres.py +4 -12
  296. agno/tools/pubmed.py +4 -1
  297. agno/tools/python.py +9 -22
  298. agno/tools/reasoning.py +35 -27
  299. agno/tools/reddit.py +11 -26
  300. agno/tools/replicate.py +54 -41
  301. agno/tools/resend.py +4 -1
  302. agno/tools/scrapegraph.py +15 -14
  303. agno/tools/searxng.py +10 -23
  304. agno/tools/serpapi.py +6 -3
  305. agno/tools/serper.py +13 -4
  306. agno/tools/shell.py +9 -2
  307. agno/tools/slack.py +12 -11
  308. agno/tools/sleep.py +3 -2
  309. agno/tools/spider.py +24 -4
  310. agno/tools/sql.py +7 -6
  311. agno/tools/tavily.py +6 -4
  312. agno/tools/telegram.py +12 -4
  313. agno/tools/todoist.py +11 -31
  314. agno/tools/toolkit.py +1 -1
  315. agno/tools/trafilatura.py +22 -6
  316. agno/tools/trello.py +9 -22
  317. agno/tools/twilio.py +10 -3
  318. agno/tools/user_control_flow.py +6 -1
  319. agno/tools/valyu.py +34 -5
  320. agno/tools/visualization.py +19 -28
  321. agno/tools/webbrowser.py +4 -3
  322. agno/tools/webex.py +11 -7
  323. agno/tools/website.py +15 -46
  324. agno/tools/webtools.py +12 -4
  325. agno/tools/whatsapp.py +5 -9
  326. agno/tools/wikipedia.py +20 -13
  327. agno/tools/x.py +14 -13
  328. agno/tools/yfinance.py +13 -40
  329. agno/tools/youtube.py +26 -20
  330. agno/tools/zendesk.py +7 -2
  331. agno/tools/zep.py +10 -7
  332. agno/tools/zoom.py +10 -9
  333. agno/utils/common.py +1 -19
  334. agno/utils/events.py +95 -118
  335. agno/utils/knowledge.py +29 -0
  336. agno/utils/location.py +2 -2
  337. agno/utils/log.py +2 -2
  338. agno/utils/mcp.py +11 -5
  339. agno/utils/media.py +39 -0
  340. agno/utils/message.py +12 -1
  341. agno/utils/models/claude.py +6 -4
  342. agno/utils/models/mistral.py +8 -7
  343. agno/utils/models/schema_utils.py +3 -3
  344. agno/utils/pprint.py +33 -32
  345. agno/utils/print_response/agent.py +779 -0
  346. agno/utils/print_response/team.py +1565 -0
  347. agno/utils/print_response/workflow.py +1451 -0
  348. agno/utils/prompts.py +14 -14
  349. agno/utils/reasoning.py +87 -0
  350. agno/utils/response.py +42 -42
  351. agno/utils/string.py +8 -22
  352. agno/utils/team.py +50 -0
  353. agno/utils/timer.py +2 -2
  354. agno/vectordb/base.py +33 -21
  355. agno/vectordb/cassandra/cassandra.py +287 -23
  356. agno/vectordb/chroma/chromadb.py +482 -59
  357. agno/vectordb/clickhouse/clickhousedb.py +270 -63
  358. agno/vectordb/couchbase/couchbase.py +309 -29
  359. agno/vectordb/lancedb/lance_db.py +360 -21
  360. agno/vectordb/langchaindb/__init__.py +5 -0
  361. agno/vectordb/langchaindb/langchaindb.py +145 -0
  362. agno/vectordb/lightrag/__init__.py +5 -0
  363. agno/vectordb/lightrag/lightrag.py +374 -0
  364. agno/vectordb/llamaindex/llamaindexdb.py +127 -0
  365. agno/vectordb/milvus/milvus.py +242 -32
  366. agno/vectordb/mongodb/mongodb.py +200 -24
  367. agno/vectordb/pgvector/pgvector.py +319 -37
  368. agno/vectordb/pineconedb/pineconedb.py +221 -27
  369. agno/vectordb/qdrant/qdrant.py +356 -14
  370. agno/vectordb/singlestore/singlestore.py +286 -29
  371. agno/vectordb/surrealdb/surrealdb.py +187 -7
  372. agno/vectordb/upstashdb/upstashdb.py +342 -26
  373. agno/vectordb/weaviate/weaviate.py +227 -165
  374. agno/workflow/__init__.py +17 -13
  375. agno/workflow/{v2/condition.py → condition.py} +135 -32
  376. agno/workflow/{v2/loop.py → loop.py} +115 -28
  377. agno/workflow/{v2/parallel.py → parallel.py} +138 -108
  378. agno/workflow/{v2/router.py → router.py} +133 -32
  379. agno/workflow/{v2/step.py → step.py} +200 -42
  380. agno/workflow/{v2/steps.py → steps.py} +147 -66
  381. agno/workflow/types.py +482 -0
  382. agno/workflow/workflow.py +2394 -696
  383. agno-2.0.0a1.dist-info/METADATA +355 -0
  384. agno-2.0.0a1.dist-info/RECORD +514 -0
  385. agno/agent/metrics.py +0 -107
  386. agno/api/app.py +0 -35
  387. agno/api/playground.py +0 -92
  388. agno/api/schemas/app.py +0 -12
  389. agno/api/schemas/playground.py +0 -22
  390. agno/api/schemas/user.py +0 -35
  391. agno/api/schemas/workspace.py +0 -46
  392. agno/api/user.py +0 -160
  393. agno/api/workflows.py +0 -33
  394. agno/api/workspace.py +0 -175
  395. agno/app/agui/__init__.py +0 -3
  396. agno/app/agui/app.py +0 -17
  397. agno/app/agui/sync_router.py +0 -120
  398. agno/app/base.py +0 -186
  399. agno/app/discord/__init__.py +0 -3
  400. agno/app/fastapi/__init__.py +0 -3
  401. agno/app/fastapi/app.py +0 -107
  402. agno/app/fastapi/async_router.py +0 -457
  403. agno/app/fastapi/sync_router.py +0 -448
  404. agno/app/playground/app.py +0 -228
  405. agno/app/playground/async_router.py +0 -1050
  406. agno/app/playground/deploy.py +0 -249
  407. agno/app/playground/operator.py +0 -183
  408. agno/app/playground/schemas.py +0 -220
  409. agno/app/playground/serve.py +0 -55
  410. agno/app/playground/sync_router.py +0 -1042
  411. agno/app/playground/utils.py +0 -46
  412. agno/app/settings.py +0 -15
  413. agno/app/slack/__init__.py +0 -3
  414. agno/app/slack/app.py +0 -19
  415. agno/app/slack/sync_router.py +0 -92
  416. agno/app/utils.py +0 -54
  417. agno/app/whatsapp/__init__.py +0 -3
  418. agno/app/whatsapp/app.py +0 -15
  419. agno/app/whatsapp/sync_router.py +0 -197
  420. agno/cli/auth_server.py +0 -249
  421. agno/cli/config.py +0 -274
  422. agno/cli/console.py +0 -88
  423. agno/cli/credentials.py +0 -23
  424. agno/cli/entrypoint.py +0 -571
  425. agno/cli/operator.py +0 -357
  426. agno/cli/settings.py +0 -96
  427. agno/cli/ws/ws_cli.py +0 -817
  428. agno/constants.py +0 -13
  429. agno/document/__init__.py +0 -5
  430. agno/document/chunking/semantic.py +0 -45
  431. agno/document/chunking/strategy.py +0 -31
  432. agno/document/reader/__init__.py +0 -5
  433. agno/document/reader/base.py +0 -47
  434. agno/document/reader/docx_reader.py +0 -60
  435. agno/document/reader/gcs/pdf_reader.py +0 -44
  436. agno/document/reader/s3/pdf_reader.py +0 -59
  437. agno/document/reader/s3/text_reader.py +0 -63
  438. agno/document/reader/url_reader.py +0 -59
  439. agno/document/reader/youtube_reader.py +0 -58
  440. agno/embedder/__init__.py +0 -5
  441. agno/embedder/langdb.py +0 -80
  442. agno/embedder/mistral.py +0 -82
  443. agno/embedder/openai.py +0 -78
  444. agno/file/__init__.py +0 -5
  445. agno/file/file.py +0 -16
  446. agno/file/local/csv.py +0 -32
  447. agno/file/local/txt.py +0 -19
  448. agno/infra/app.py +0 -240
  449. agno/infra/base.py +0 -144
  450. agno/infra/context.py +0 -20
  451. agno/infra/db_app.py +0 -52
  452. agno/infra/resource.py +0 -205
  453. agno/infra/resources.py +0 -55
  454. agno/knowledge/agent.py +0 -698
  455. agno/knowledge/arxiv.py +0 -33
  456. agno/knowledge/combined.py +0 -36
  457. agno/knowledge/csv.py +0 -144
  458. agno/knowledge/csv_url.py +0 -124
  459. agno/knowledge/document.py +0 -223
  460. agno/knowledge/docx.py +0 -137
  461. agno/knowledge/firecrawl.py +0 -34
  462. agno/knowledge/gcs/__init__.py +0 -0
  463. agno/knowledge/gcs/base.py +0 -39
  464. agno/knowledge/gcs/pdf.py +0 -125
  465. agno/knowledge/json.py +0 -137
  466. agno/knowledge/langchain.py +0 -71
  467. agno/knowledge/light_rag.py +0 -273
  468. agno/knowledge/llamaindex.py +0 -66
  469. agno/knowledge/markdown.py +0 -154
  470. agno/knowledge/pdf.py +0 -164
  471. agno/knowledge/pdf_bytes.py +0 -42
  472. agno/knowledge/pdf_url.py +0 -148
  473. agno/knowledge/s3/__init__.py +0 -0
  474. agno/knowledge/s3/base.py +0 -64
  475. agno/knowledge/s3/pdf.py +0 -33
  476. agno/knowledge/s3/text.py +0 -34
  477. agno/knowledge/text.py +0 -141
  478. agno/knowledge/url.py +0 -46
  479. agno/knowledge/website.py +0 -179
  480. agno/knowledge/wikipedia.py +0 -32
  481. agno/knowledge/youtube.py +0 -35
  482. agno/memory/agent.py +0 -423
  483. agno/memory/classifier.py +0 -104
  484. agno/memory/db/__init__.py +0 -5
  485. agno/memory/db/base.py +0 -42
  486. agno/memory/db/mongodb.py +0 -189
  487. agno/memory/db/postgres.py +0 -203
  488. agno/memory/db/sqlite.py +0 -193
  489. agno/memory/memory.py +0 -22
  490. agno/memory/row.py +0 -36
  491. agno/memory/summarizer.py +0 -201
  492. agno/memory/summary.py +0 -19
  493. agno/memory/team.py +0 -415
  494. agno/memory/v2/__init__.py +0 -2
  495. agno/memory/v2/db/__init__.py +0 -1
  496. agno/memory/v2/db/base.py +0 -42
  497. agno/memory/v2/db/firestore.py +0 -339
  498. agno/memory/v2/db/mongodb.py +0 -196
  499. agno/memory/v2/db/postgres.py +0 -214
  500. agno/memory/v2/db/redis.py +0 -187
  501. agno/memory/v2/db/schema.py +0 -54
  502. agno/memory/v2/db/sqlite.py +0 -209
  503. agno/memory/v2/manager.py +0 -437
  504. agno/memory/v2/memory.py +0 -1097
  505. agno/memory/v2/schema.py +0 -55
  506. agno/memory/v2/summarizer.py +0 -215
  507. agno/memory/workflow.py +0 -38
  508. agno/models/ollama/tools.py +0 -430
  509. agno/models/qwen/__init__.py +0 -5
  510. agno/playground/__init__.py +0 -10
  511. agno/playground/deploy.py +0 -3
  512. agno/playground/playground.py +0 -3
  513. agno/playground/serve.py +0 -3
  514. agno/playground/settings.py +0 -3
  515. agno/reranker/__init__.py +0 -0
  516. agno/run/v2/__init__.py +0 -0
  517. agno/run/v2/workflow.py +0 -567
  518. agno/storage/__init__.py +0 -0
  519. agno/storage/agent/__init__.py +0 -0
  520. agno/storage/agent/dynamodb.py +0 -1
  521. agno/storage/agent/json.py +0 -1
  522. agno/storage/agent/mongodb.py +0 -1
  523. agno/storage/agent/postgres.py +0 -1
  524. agno/storage/agent/singlestore.py +0 -1
  525. agno/storage/agent/sqlite.py +0 -1
  526. agno/storage/agent/yaml.py +0 -1
  527. agno/storage/base.py +0 -60
  528. agno/storage/dynamodb.py +0 -673
  529. agno/storage/firestore.py +0 -297
  530. agno/storage/gcs_json.py +0 -261
  531. agno/storage/in_memory.py +0 -234
  532. agno/storage/json.py +0 -237
  533. agno/storage/mongodb.py +0 -328
  534. agno/storage/mysql.py +0 -685
  535. agno/storage/postgres.py +0 -682
  536. agno/storage/redis.py +0 -336
  537. agno/storage/session/__init__.py +0 -16
  538. agno/storage/session/agent.py +0 -64
  539. agno/storage/session/team.py +0 -63
  540. agno/storage/session/v2/__init__.py +0 -5
  541. agno/storage/session/workflow.py +0 -61
  542. agno/storage/singlestore.py +0 -606
  543. agno/storage/sqlite.py +0 -646
  544. agno/storage/workflow/__init__.py +0 -0
  545. agno/storage/workflow/mongodb.py +0 -1
  546. agno/storage/workflow/postgres.py +0 -1
  547. agno/storage/workflow/sqlite.py +0 -1
  548. agno/storage/yaml.py +0 -241
  549. agno/tools/thinking.py +0 -73
  550. agno/utils/defaults.py +0 -57
  551. agno/utils/filesystem.py +0 -39
  552. agno/utils/git.py +0 -52
  553. agno/utils/json_io.py +0 -30
  554. agno/utils/load_env.py +0 -19
  555. agno/utils/py_io.py +0 -19
  556. agno/utils/pyproject.py +0 -18
  557. agno/utils/resource_filter.py +0 -31
  558. agno/workflow/v2/__init__.py +0 -21
  559. agno/workflow/v2/types.py +0 -357
  560. agno/workflow/v2/workflow.py +0 -3312
  561. agno/workspace/__init__.py +0 -0
  562. agno/workspace/config.py +0 -325
  563. agno/workspace/enums.py +0 -6
  564. agno/workspace/helpers.py +0 -52
  565. agno/workspace/operator.py +0 -757
  566. agno/workspace/settings.py +0 -158
  567. agno-1.8.0.dist-info/METADATA +0 -979
  568. agno-1.8.0.dist-info/RECORD +0 -565
  569. agno-1.8.0.dist-info/entry_points.txt +0 -3
  570. /agno/{app → db/migrations}/__init__.py +0 -0
  571. /agno/{app/playground/__init__.py → db/schemas/metrics.py} +0 -0
  572. /agno/{cli → integrations}/__init__.py +0 -0
  573. /agno/{cli/ws → knowledge/chunking}/__init__.py +0 -0
  574. /agno/{document/chunking → knowledge/remote_content}/__init__.py +0 -0
  575. /agno/{document/reader/gcs → knowledge/reranker}/__init__.py +0 -0
  576. /agno/{document/reader/s3 → os/interfaces}/__init__.py +0 -0
  577. /agno/{app → os/interfaces}/slack/security.py +0 -0
  578. /agno/{app → os/interfaces}/whatsapp/security.py +0 -0
  579. /agno/{file/local → utils/print_response}/__init__.py +0 -0
  580. /agno/{infra → vectordb/llamaindex}/__init__.py +0 -0
  581. {agno-1.8.0.dist-info → agno-2.0.0a1.dist-info}/WHEEL +0 -0
  582. {agno-1.8.0.dist-info → agno-2.0.0a1.dist-info}/licenses/LICENSE +0 -0
  583. {agno-1.8.0.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