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