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
@@ -0,0 +1,536 @@
1
+ import logging
2
+ from typing import List, Optional, Union
3
+
4
+ from fastapi import APIRouter, Body, Depends, HTTPException, Path, Query
5
+
6
+ from agno.db.base import BaseDb, SessionType
7
+ from agno.os.auth import get_authentication_dependency
8
+ from agno.os.schema import (
9
+ AgentSessionDetailSchema,
10
+ BadRequestResponse,
11
+ DeleteSessionRequest,
12
+ InternalServerErrorResponse,
13
+ NotFoundResponse,
14
+ PaginatedResponse,
15
+ PaginationInfo,
16
+ RunSchema,
17
+ SessionSchema,
18
+ SortOrder,
19
+ TeamRunSchema,
20
+ TeamSessionDetailSchema,
21
+ UnauthenticatedResponse,
22
+ ValidationErrorResponse,
23
+ WorkflowRunSchema,
24
+ WorkflowSessionDetailSchema,
25
+ )
26
+ from agno.os.settings import AgnoAPISettings
27
+ from agno.os.utils import get_db
28
+
29
+ logger = logging.getLogger(__name__)
30
+
31
+
32
+ def get_session_router(dbs: dict[str, BaseDb], settings: AgnoAPISettings = AgnoAPISettings()) -> APIRouter:
33
+ """Create session router with comprehensive OpenAPI documentation for session management endpoints."""
34
+ session_router = APIRouter(
35
+ dependencies=[Depends(get_authentication_dependency(settings))],
36
+ tags=["Sessions"],
37
+ responses={
38
+ 400: {"description": "Bad Request", "model": BadRequestResponse},
39
+ 401: {"description": "Unauthorized", "model": UnauthenticatedResponse},
40
+ 404: {"description": "Not Found", "model": NotFoundResponse},
41
+ 422: {"description": "Validation Error", "model": ValidationErrorResponse},
42
+ 500: {"description": "Internal Server Error", "model": InternalServerErrorResponse},
43
+ },
44
+ )
45
+ return attach_routes(router=session_router, dbs=dbs)
46
+
47
+
48
+ def attach_routes(router: APIRouter, dbs: dict[str, BaseDb]) -> APIRouter:
49
+ @router.get(
50
+ "/sessions",
51
+ response_model=PaginatedResponse[SessionSchema],
52
+ status_code=200,
53
+ operation_id="get_sessions",
54
+ summary="List Sessions",
55
+ description=(
56
+ "Retrieve paginated list of sessions with filtering and sorting options. "
57
+ "Supports filtering by session type (agent, team, workflow), component, user, and name. "
58
+ "Sessions represent conversation histories and execution contexts."
59
+ ),
60
+ responses={
61
+ 200: {
62
+ "description": "Sessions retrieved successfully",
63
+ "content": {
64
+ "application/json": {
65
+ "example": {
66
+ "session_example": {
67
+ "summary": "Example session response",
68
+ "value": {
69
+ "data": [
70
+ {
71
+ "session_id": "6f6cfbfd-9643-479a-ae47-b8f32eb4d710",
72
+ "session_name": "What tools do you have?",
73
+ "session_state": {},
74
+ "created_at": "2025-09-05T16:02:09Z",
75
+ "updated_at": "2025-09-05T16:02:09Z",
76
+ }
77
+ ]
78
+ },
79
+ }
80
+ }
81
+ }
82
+ },
83
+ },
84
+ 400: {"description": "Invalid session type or filter parameters", "model": BadRequestResponse},
85
+ 422: {"description": "Validation error in query parameters", "model": ValidationErrorResponse},
86
+ },
87
+ )
88
+ async def get_sessions(
89
+ session_type: SessionType = Query(
90
+ default=SessionType.AGENT,
91
+ alias="type",
92
+ description="Type of sessions to retrieve (agent, team, or workflow)",
93
+ ),
94
+ component_id: Optional[str] = Query(
95
+ default=None, description="Filter sessions by component ID (agent/team/workflow ID)"
96
+ ),
97
+ user_id: Optional[str] = Query(default=None, description="Filter sessions by user ID"),
98
+ session_name: Optional[str] = Query(default=None, description="Filter sessions by name (partial match)"),
99
+ limit: Optional[int] = Query(default=20, description="Number of sessions to return per page"),
100
+ page: Optional[int] = Query(default=1, description="Page number for pagination"),
101
+ sort_by: Optional[str] = Query(default="created_at", description="Field to sort sessions by"),
102
+ sort_order: Optional[SortOrder] = Query(default="desc", description="Sort order (asc or desc)"),
103
+ db_id: Optional[str] = Query(default=None, description="Database ID to query sessions from"),
104
+ ) -> PaginatedResponse[SessionSchema]:
105
+ db = get_db(dbs, db_id)
106
+ sessions, total_count = db.get_sessions(
107
+ session_type=session_type,
108
+ component_id=component_id,
109
+ user_id=user_id,
110
+ session_name=session_name,
111
+ limit=limit,
112
+ page=page,
113
+ sort_by=sort_by,
114
+ sort_order=sort_order,
115
+ deserialize=False,
116
+ )
117
+
118
+ return PaginatedResponse(
119
+ data=[SessionSchema.from_dict(session) for session in sessions], # type: ignore
120
+ meta=PaginationInfo(
121
+ page=page,
122
+ limit=limit,
123
+ total_count=total_count, # type: ignore
124
+ total_pages=(total_count + limit - 1) // limit if limit is not None and limit > 0 else 0, # type: ignore
125
+ ),
126
+ )
127
+
128
+ @router.get(
129
+ "/sessions/{session_id}",
130
+ response_model=Union[AgentSessionDetailSchema, TeamSessionDetailSchema, WorkflowSessionDetailSchema],
131
+ status_code=200,
132
+ operation_id="get_session_by_id",
133
+ summary="Get Session by ID",
134
+ description=(
135
+ "Retrieve detailed information about a specific session including metadata, configuration, "
136
+ "and run history. Response schema varies based on session type (agent, team, or workflow)."
137
+ ),
138
+ responses={
139
+ 200: {
140
+ "description": "Session details retrieved successfully",
141
+ "content": {
142
+ "application/json": {
143
+ "examples": {
144
+ "agent_session_example": {
145
+ "summary": "Example agent session response",
146
+ "value": {
147
+ "user_id": "123",
148
+ "agent_session_id": "6f6cfbfd-9643-479a-ae47-b8f32eb4d710",
149
+ "session_id": "6f6cfbfd-9643-479a-ae47-b8f32eb4d710",
150
+ "session_name": "What tools do you have?",
151
+ "session_summary": {
152
+ "summary": "The user and assistant engaged in a conversation about the tools the agent has available.",
153
+ "updated_at": "2025-09-05T18:02:12.269392",
154
+ },
155
+ "session_state": {},
156
+ "agent_id": "basic-agent",
157
+ "total_tokens": 160,
158
+ "agent_data": {
159
+ "name": "Basic Agent",
160
+ "agent_id": "basic-agent",
161
+ "model": {"provider": "OpenAI", "name": "OpenAIChat", "id": "gpt-4o"},
162
+ },
163
+ "metrics": {
164
+ "input_tokens": 134,
165
+ "output_tokens": 26,
166
+ "total_tokens": 160,
167
+ "audio_input_tokens": 0,
168
+ "audio_output_tokens": 0,
169
+ "audio_total_tokens": 0,
170
+ "cache_read_tokens": 0,
171
+ "cache_write_tokens": 0,
172
+ "reasoning_tokens": 0,
173
+ "timer": None,
174
+ "time_to_first_token": None,
175
+ "duration": None,
176
+ "provider_metrics": None,
177
+ "additional_metrics": None,
178
+ },
179
+ "chat_history": [
180
+ {
181
+ "content": "<additional_information>\n- Use markdown to format your answers.\n- The current time is 2025-09-05 18:02:09.171627.\n</additional_information>\n\nYou have access to memories from previous interactions with the user that you can use:\n\n<memories_from_previous_interactions>\n- User really likes Digimon and Japan.\n- User really likes Japan.\n- User likes coffee.\n</memories_from_previous_interactions>\n\nNote: this information is from previous interactions and may be updated in this conversation. You should always prefer information from this conversation over the past memories.",
182
+ "from_history": False,
183
+ "stop_after_tool_call": False,
184
+ "role": "system",
185
+ "created_at": 1757088129,
186
+ },
187
+ {
188
+ "content": "What tools do you have?",
189
+ "from_history": False,
190
+ "stop_after_tool_call": False,
191
+ "role": "user",
192
+ "created_at": 1757088129,
193
+ },
194
+ {
195
+ "content": "I don't have access to external tools or the internet. However, I can assist you with a wide range of topics by providing information, answering questions, and offering suggestions based on the knowledge I've been trained on. If there's anything specific you need help with, feel free to ask!",
196
+ "from_history": False,
197
+ "stop_after_tool_call": False,
198
+ "role": "assistant",
199
+ "metrics": {"input_tokens": 134, "output_tokens": 26, "total_tokens": 160},
200
+ "created_at": 1757088129,
201
+ },
202
+ ],
203
+ "created_at": "2025-09-05T16:02:09Z",
204
+ "updated_at": "2025-09-05T16:02:09Z",
205
+ },
206
+ }
207
+ }
208
+ }
209
+ },
210
+ },
211
+ 404: {"description": "Session not found", "model": NotFoundResponse},
212
+ 422: {"description": "Invalid session type", "model": ValidationErrorResponse},
213
+ },
214
+ )
215
+ async def get_session_by_id(
216
+ session_id: str = Path(description="Session ID to retrieve"),
217
+ session_type: SessionType = Query(
218
+ default=SessionType.AGENT, description="Session type (agent, team, or workflow)", alias="type"
219
+ ),
220
+ db_id: Optional[str] = Query(default=None, description="Database ID to query session from"),
221
+ ) -> Union[AgentSessionDetailSchema, TeamSessionDetailSchema, WorkflowSessionDetailSchema]:
222
+ db = get_db(dbs, db_id)
223
+ session = db.get_session(session_id=session_id, session_type=session_type)
224
+ if not session:
225
+ raise HTTPException(status_code=404, detail=f"Session with id '{session_id}' not found")
226
+
227
+ if session_type == SessionType.AGENT:
228
+ return AgentSessionDetailSchema.from_session(session) # type: ignore
229
+ elif session_type == SessionType.TEAM:
230
+ return TeamSessionDetailSchema.from_session(session) # type: ignore
231
+ else:
232
+ return WorkflowSessionDetailSchema.from_session(session) # type: ignore
233
+
234
+ @router.get(
235
+ "/sessions/{session_id}/runs",
236
+ response_model=Union[List[RunSchema], List[TeamRunSchema], List[WorkflowRunSchema]],
237
+ status_code=200,
238
+ operation_id="get_session_runs",
239
+ summary="Get Session Runs",
240
+ description=(
241
+ "Retrieve all runs (executions) for a specific session. Runs represent individual "
242
+ "interactions or executions within a session. Response schema varies based on session type."
243
+ ),
244
+ responses={
245
+ 200: {
246
+ "description": "Session runs retrieved successfully",
247
+ "content": {
248
+ "application/json": {
249
+ "examples": {
250
+ "completed_run": {
251
+ "summary": "Example completed run",
252
+ "value": {
253
+ "run_id": "fcdf50f0-7c32-4593-b2ef-68a558774340",
254
+ "agent_session_id": "80056af0-c7a5-4d69-b6a2-c3eba9f040e0",
255
+ "user_id": "",
256
+ "run_input": "Which tools do you have access to?",
257
+ "content": "I don't have access to external tools or the internet. However, I can assist you with a wide range of topics by providing information, answering questions, and offering suggestions based on the knowledge I've been trained on. If there's anything specific you need help with, feel free to ask!",
258
+ "run_response_format": "text",
259
+ "reasoning_content": "",
260
+ "metrics": {
261
+ "input_tokens": 82,
262
+ "output_tokens": 56,
263
+ "total_tokens": 138,
264
+ "time_to_first_token": 0.047505500027909875,
265
+ "duration": 4.840060166025069,
266
+ },
267
+ "messages": [
268
+ {
269
+ "content": "<additional_information>\n- Use markdown to format your answers.\n- The current time is 2025-09-08 17:52:10.101003.\n</additional_information>\n\nYou have the capability to retain memories from previous interactions with the user, but have not had any interactions with the user yet.",
270
+ "from_history": False,
271
+ "stop_after_tool_call": False,
272
+ "role": "system",
273
+ "created_at": 1757346730,
274
+ },
275
+ {
276
+ "content": "Which tools do you have access to?",
277
+ "from_history": False,
278
+ "stop_after_tool_call": False,
279
+ "role": "user",
280
+ "created_at": 1757346730,
281
+ },
282
+ {
283
+ "content": "I don't have access to external tools or the internet. However, I can assist you with a wide range of topics by providing information, answering questions, and offering suggestions based on the knowledge I've been trained on. If there's anything specific you need help with, feel free to ask!",
284
+ "from_history": False,
285
+ "stop_after_tool_call": False,
286
+ "role": "assistant",
287
+ "metrics": {"input_tokens": 82, "output_tokens": 56, "total_tokens": 138},
288
+ "created_at": 1757346730,
289
+ },
290
+ ],
291
+ "tools": None,
292
+ "events": [
293
+ {
294
+ "created_at": 1757346730,
295
+ "event": "RunStarted",
296
+ "agent_id": "basic-agent",
297
+ "agent_name": "Basic Agent",
298
+ "run_id": "fcdf50f0-7c32-4593-b2ef-68a558774340",
299
+ "session_id": "80056af0-c7a5-4d69-b6a2-c3eba9f040e0",
300
+ "model": "gpt-4o",
301
+ "model_provider": "OpenAI",
302
+ },
303
+ {
304
+ "created_at": 1757346733,
305
+ "event": "MemoryUpdateStarted",
306
+ "agent_id": "basic-agent",
307
+ "agent_name": "Basic Agent",
308
+ "run_id": "fcdf50f0-7c32-4593-b2ef-68a558774340",
309
+ "session_id": "80056af0-c7a5-4d69-b6a2-c3eba9f040e0",
310
+ },
311
+ {
312
+ "created_at": 1757346734,
313
+ "event": "MemoryUpdateCompleted",
314
+ "agent_id": "basic-agent",
315
+ "agent_name": "Basic Agent",
316
+ "run_id": "fcdf50f0-7c32-4593-b2ef-68a558774340",
317
+ "session_id": "80056af0-c7a5-4d69-b6a2-c3eba9f040e0",
318
+ },
319
+ {
320
+ "created_at": 1757346734,
321
+ "event": "RunCompleted",
322
+ "agent_id": "basic-agent",
323
+ "agent_name": "Basic Agent",
324
+ "run_id": "fcdf50f0-7c32-4593-b2ef-68a558774340",
325
+ "session_id": "80056af0-c7a5-4d69-b6a2-c3eba9f040e0",
326
+ "content": "I don't have access to external tools or the internet. However, I can assist you with a wide range of topics by providing information, answering questions, and offering suggestions based on the knowledge I've been trained on. If there's anything specific you need help with, feel free to ask!",
327
+ "content_type": "str",
328
+ "metrics": {
329
+ "input_tokens": 82,
330
+ "output_tokens": 56,
331
+ "total_tokens": 138,
332
+ "time_to_first_token": 0.047505500027909875,
333
+ "duration": 4.840060166025069,
334
+ },
335
+ },
336
+ ],
337
+ "created_at": "2025-09-08T15:52:10Z",
338
+ },
339
+ }
340
+ }
341
+ }
342
+ },
343
+ },
344
+ 404: {"description": "Session not found or has no runs", "model": NotFoundResponse},
345
+ 422: {"description": "Invalid session type", "model": ValidationErrorResponse},
346
+ },
347
+ )
348
+ async def get_session_runs(
349
+ session_id: str = Path(description="Session ID to get runs from"),
350
+ session_type: SessionType = Query(
351
+ default=SessionType.AGENT, description="Session type (agent, team, or workflow)", alias="type"
352
+ ),
353
+ db_id: Optional[str] = Query(default=None, description="Database ID to query runs from"),
354
+ ) -> Union[List[RunSchema], List[TeamRunSchema], List[WorkflowRunSchema]]:
355
+ db = get_db(dbs, db_id)
356
+ session = db.get_session(session_id=session_id, session_type=session_type, deserialize=False)
357
+ if not session:
358
+ raise HTTPException(status_code=404, detail=f"Session with ID {session_id} not found")
359
+
360
+ runs = session.get("runs") # type: ignore
361
+ if not runs:
362
+ raise HTTPException(status_code=404, detail=f"Session with ID {session_id} has no runs")
363
+
364
+ if session_type == SessionType.AGENT:
365
+ return [RunSchema.from_dict(run) for run in runs]
366
+
367
+ elif session_type == SessionType.TEAM:
368
+ return [TeamRunSchema.from_dict(run) for run in runs]
369
+
370
+ elif session_type == SessionType.WORKFLOW:
371
+ return [WorkflowRunSchema.from_dict(run) for run in runs]
372
+
373
+ else:
374
+ return [RunSchema.from_dict(run) for run in runs]
375
+
376
+ @router.delete(
377
+ "/sessions/{session_id}",
378
+ status_code=204,
379
+ operation_id="delete_session",
380
+ summary="Delete Session",
381
+ description=(
382
+ "Permanently delete a specific session and all its associated runs. "
383
+ "This action cannot be undone and will remove all conversation history."
384
+ ),
385
+ responses={
386
+ 204: {},
387
+ 500: {"description": "Failed to delete session", "model": InternalServerErrorResponse},
388
+ },
389
+ )
390
+ async def delete_session(
391
+ session_id: str = Path(description="Session ID to delete"),
392
+ db_id: Optional[str] = Query(default=None, description="Database ID to use for deletion"),
393
+ ) -> None:
394
+ db = get_db(dbs, db_id)
395
+ db.delete_session(session_id=session_id)
396
+
397
+ @router.delete(
398
+ "/sessions",
399
+ status_code=204,
400
+ operation_id="delete_sessions",
401
+ summary="Delete Multiple Sessions",
402
+ description=(
403
+ "Delete multiple sessions by their IDs in a single operation. "
404
+ "This action cannot be undone and will permanently remove all specified sessions and their runs."
405
+ ),
406
+ responses={
407
+ 204: {"description": "Sessions deleted successfully"},
408
+ 400: {
409
+ "description": "Invalid request - session IDs and types length mismatch",
410
+ "model": BadRequestResponse,
411
+ },
412
+ 500: {"description": "Failed to delete sessions", "model": InternalServerErrorResponse},
413
+ },
414
+ )
415
+ async def delete_sessions(
416
+ request: DeleteSessionRequest,
417
+ session_type: SessionType = Query(
418
+ default=SessionType.AGENT, description="Default session type filter", alias="type"
419
+ ),
420
+ db_id: Optional[str] = Query(default=None, description="Database ID to use for deletion"),
421
+ ) -> None:
422
+ if len(request.session_ids) != len(request.session_types):
423
+ raise HTTPException(status_code=400, detail="Session IDs and session types must have the same length")
424
+
425
+ db = get_db(dbs, db_id)
426
+ db.delete_sessions(session_ids=request.session_ids)
427
+
428
+ @router.post(
429
+ "/sessions/{session_id}/rename",
430
+ response_model=Union[AgentSessionDetailSchema, TeamSessionDetailSchema, WorkflowSessionDetailSchema],
431
+ status_code=200,
432
+ operation_id="rename_session",
433
+ summary="Rename Session",
434
+ description=(
435
+ "Update the name of an existing session. Useful for organizing and categorizing "
436
+ "sessions with meaningful names for better identification and management."
437
+ ),
438
+ responses={
439
+ 200: {
440
+ "description": "Session renamed successfully",
441
+ "content": {
442
+ "application/json": {
443
+ "examples": {
444
+ "agent_session_example": {
445
+ "summary": "Example agent session response",
446
+ "value": {
447
+ "user_id": "123",
448
+ "agent_session_id": "6f6cfbfd-9643-479a-ae47-b8f32eb4d710",
449
+ "session_id": "6f6cfbfd-9643-479a-ae47-b8f32eb4d710",
450
+ "session_name": "What tools do you have?",
451
+ "session_summary": {
452
+ "summary": "The user and assistant engaged in a conversation about the tools the agent has available.",
453
+ "updated_at": "2025-09-05T18:02:12.269392",
454
+ },
455
+ "session_state": {},
456
+ "agent_id": "basic-agent",
457
+ "total_tokens": 160,
458
+ "agent_data": {
459
+ "name": "Basic Agent",
460
+ "agent_id": "basic-agent",
461
+ "model": {"provider": "OpenAI", "name": "OpenAIChat", "id": "gpt-4o"},
462
+ },
463
+ "metrics": {
464
+ "input_tokens": 134,
465
+ "output_tokens": 26,
466
+ "total_tokens": 160,
467
+ "audio_input_tokens": 0,
468
+ "audio_output_tokens": 0,
469
+ "audio_total_tokens": 0,
470
+ "cache_read_tokens": 0,
471
+ "cache_write_tokens": 0,
472
+ "reasoning_tokens": 0,
473
+ "timer": None,
474
+ "time_to_first_token": None,
475
+ "duration": None,
476
+ "provider_metrics": None,
477
+ "additional_metrics": None,
478
+ },
479
+ "chat_history": [
480
+ {
481
+ "content": "<additional_information>\n- Use markdown to format your answers.\n- The current time is 2025-09-05 18:02:09.171627.\n</additional_information>\n\nYou have access to memories from previous interactions with the user that you can use:\n\n<memories_from_previous_interactions>\n- User really likes Digimon and Japan.\n- User really likes Japan.\n- User likes coffee.\n</memories_from_previous_interactions>\n\nNote: this information is from previous interactions and may be updated in this conversation. You should always prefer information from this conversation over the past memories.",
482
+ "from_history": False,
483
+ "stop_after_tool_call": False,
484
+ "role": "system",
485
+ "created_at": 1757088129,
486
+ },
487
+ {
488
+ "content": "What tools do you have?",
489
+ "from_history": False,
490
+ "stop_after_tool_call": False,
491
+ "role": "user",
492
+ "created_at": 1757088129,
493
+ },
494
+ {
495
+ "content": "I don't have access to external tools or the internet. However, I can assist you with a wide range of topics by providing information, answering questions, and offering suggestions based on the knowledge I've been trained on. If there's anything specific you need help with, feel free to ask!",
496
+ "from_history": False,
497
+ "stop_after_tool_call": False,
498
+ "role": "assistant",
499
+ "metrics": {"input_tokens": 134, "output_tokens": 26, "total_tokens": 160},
500
+ "created_at": 1757088129,
501
+ },
502
+ ],
503
+ "created_at": "2025-09-05T16:02:09Z",
504
+ "updated_at": "2025-09-05T16:02:09Z",
505
+ },
506
+ }
507
+ }
508
+ }
509
+ },
510
+ },
511
+ 400: {"description": "Invalid session name", "model": BadRequestResponse},
512
+ 404: {"description": "Session not found", "model": NotFoundResponse},
513
+ 422: {"description": "Invalid session type or validation error", "model": ValidationErrorResponse},
514
+ },
515
+ )
516
+ async def rename_session(
517
+ session_id: str = Path(description="Session ID to rename"),
518
+ session_type: SessionType = Query(
519
+ default=SessionType.AGENT, description="Session type (agent, team, or workflow)", alias="type"
520
+ ),
521
+ session_name: str = Body(embed=True, description="New name for the session"),
522
+ db_id: Optional[str] = Query(default=None, description="Database ID to use for rename operation"),
523
+ ) -> Union[AgentSessionDetailSchema, TeamSessionDetailSchema, WorkflowSessionDetailSchema]:
524
+ db = get_db(dbs, db_id)
525
+ session = db.rename_session(session_id=session_id, session_type=session_type, session_name=session_name)
526
+ if not session:
527
+ raise HTTPException(status_code=404, detail=f"Session with id '{session_id}' not found")
528
+
529
+ if session_type == SessionType.AGENT:
530
+ return AgentSessionDetailSchema.from_session(session) # type: ignore
531
+ elif session_type == SessionType.TEAM:
532
+ return TeamSessionDetailSchema.from_session(session) # type: ignore
533
+ else:
534
+ return WorkflowSessionDetailSchema.from_session(session) # type: ignore
535
+
536
+ return router