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