agno 1.8.2__py3-none-any.whl → 2.0.0__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (589) hide show
  1. agno/agent/__init__.py +19 -27
  2. agno/agent/agent.py +3143 -4170
  3. agno/api/agent.py +11 -67
  4. agno/api/api.py +5 -46
  5. agno/api/evals.py +8 -19
  6. agno/api/os.py +17 -0
  7. agno/api/routes.py +6 -41
  8. agno/api/schemas/__init__.py +9 -0
  9. agno/api/schemas/agent.py +5 -21
  10. agno/api/schemas/evals.py +7 -16
  11. agno/api/schemas/os.py +14 -0
  12. agno/api/schemas/team.py +5 -21
  13. agno/api/schemas/utils.py +21 -0
  14. agno/api/schemas/workflows.py +11 -7
  15. agno/api/settings.py +53 -0
  16. agno/api/team.py +11 -66
  17. agno/api/workflow.py +28 -0
  18. agno/cloud/aws/base.py +214 -0
  19. agno/cloud/aws/s3/__init__.py +2 -0
  20. agno/cloud/aws/s3/api_client.py +43 -0
  21. agno/cloud/aws/s3/bucket.py +195 -0
  22. agno/cloud/aws/s3/object.py +57 -0
  23. agno/db/__init__.py +24 -0
  24. agno/db/base.py +245 -0
  25. agno/db/dynamo/__init__.py +3 -0
  26. agno/db/dynamo/dynamo.py +1743 -0
  27. agno/db/dynamo/schemas.py +278 -0
  28. agno/db/dynamo/utils.py +684 -0
  29. agno/db/firestore/__init__.py +3 -0
  30. agno/db/firestore/firestore.py +1432 -0
  31. agno/db/firestore/schemas.py +130 -0
  32. agno/db/firestore/utils.py +278 -0
  33. agno/db/gcs_json/__init__.py +3 -0
  34. agno/db/gcs_json/gcs_json_db.py +1001 -0
  35. agno/db/gcs_json/utils.py +194 -0
  36. agno/db/in_memory/__init__.py +3 -0
  37. agno/db/in_memory/in_memory_db.py +882 -0
  38. agno/db/in_memory/utils.py +172 -0
  39. agno/db/json/__init__.py +3 -0
  40. agno/db/json/json_db.py +1045 -0
  41. agno/db/json/utils.py +196 -0
  42. agno/db/migrations/v1_to_v2.py +162 -0
  43. agno/db/mongo/__init__.py +3 -0
  44. agno/db/mongo/mongo.py +1416 -0
  45. agno/db/mongo/schemas.py +77 -0
  46. agno/db/mongo/utils.py +204 -0
  47. agno/db/mysql/__init__.py +3 -0
  48. agno/db/mysql/mysql.py +1719 -0
  49. agno/db/mysql/schemas.py +124 -0
  50. agno/db/mysql/utils.py +297 -0
  51. agno/db/postgres/__init__.py +3 -0
  52. agno/db/postgres/postgres.py +1710 -0
  53. agno/db/postgres/schemas.py +124 -0
  54. agno/db/postgres/utils.py +280 -0
  55. agno/db/redis/__init__.py +3 -0
  56. agno/db/redis/redis.py +1367 -0
  57. agno/db/redis/schemas.py +109 -0
  58. agno/db/redis/utils.py +288 -0
  59. agno/db/schemas/__init__.py +3 -0
  60. agno/db/schemas/evals.py +33 -0
  61. agno/db/schemas/knowledge.py +40 -0
  62. agno/db/schemas/memory.py +46 -0
  63. agno/db/singlestore/__init__.py +3 -0
  64. agno/db/singlestore/schemas.py +116 -0
  65. agno/db/singlestore/singlestore.py +1712 -0
  66. agno/db/singlestore/utils.py +326 -0
  67. agno/db/sqlite/__init__.py +3 -0
  68. agno/db/sqlite/schemas.py +119 -0
  69. agno/db/sqlite/sqlite.py +1676 -0
  70. agno/db/sqlite/utils.py +268 -0
  71. agno/db/utils.py +88 -0
  72. agno/eval/__init__.py +14 -0
  73. agno/eval/accuracy.py +154 -48
  74. agno/eval/performance.py +88 -23
  75. agno/eval/reliability.py +73 -20
  76. agno/eval/utils.py +23 -13
  77. agno/integrations/discord/__init__.py +3 -0
  78. agno/{app → integrations}/discord/client.py +10 -10
  79. agno/knowledge/__init__.py +2 -2
  80. agno/{document → knowledge}/chunking/agentic.py +2 -2
  81. agno/{document → knowledge}/chunking/document.py +2 -2
  82. agno/{document → knowledge}/chunking/fixed.py +3 -3
  83. agno/{document → knowledge}/chunking/markdown.py +2 -2
  84. agno/{document → knowledge}/chunking/recursive.py +2 -2
  85. agno/{document → knowledge}/chunking/row.py +2 -2
  86. agno/knowledge/chunking/semantic.py +59 -0
  87. agno/knowledge/chunking/strategy.py +121 -0
  88. agno/knowledge/content.py +74 -0
  89. agno/knowledge/document/__init__.py +5 -0
  90. agno/{document → knowledge/document}/base.py +12 -2
  91. agno/knowledge/embedder/__init__.py +5 -0
  92. agno/{embedder → knowledge/embedder}/aws_bedrock.py +127 -1
  93. agno/{embedder → knowledge/embedder}/azure_openai.py +65 -1
  94. agno/{embedder → knowledge/embedder}/base.py +6 -0
  95. agno/{embedder → knowledge/embedder}/cohere.py +72 -1
  96. agno/{embedder → knowledge/embedder}/fastembed.py +17 -1
  97. agno/{embedder → knowledge/embedder}/fireworks.py +1 -1
  98. agno/{embedder → knowledge/embedder}/google.py +74 -1
  99. agno/{embedder → knowledge/embedder}/huggingface.py +36 -2
  100. agno/{embedder → knowledge/embedder}/jina.py +48 -2
  101. agno/knowledge/embedder/langdb.py +22 -0
  102. agno/knowledge/embedder/mistral.py +139 -0
  103. agno/{embedder → knowledge/embedder}/nebius.py +1 -1
  104. agno/{embedder → knowledge/embedder}/ollama.py +54 -3
  105. agno/knowledge/embedder/openai.py +223 -0
  106. agno/{embedder → knowledge/embedder}/sentence_transformer.py +16 -1
  107. agno/{embedder → knowledge/embedder}/together.py +1 -1
  108. agno/{embedder → knowledge/embedder}/voyageai.py +49 -1
  109. agno/knowledge/knowledge.py +1551 -0
  110. agno/knowledge/reader/__init__.py +7 -0
  111. agno/{document → knowledge}/reader/arxiv_reader.py +32 -4
  112. agno/knowledge/reader/base.py +88 -0
  113. agno/{document → knowledge}/reader/csv_reader.py +47 -65
  114. agno/knowledge/reader/docx_reader.py +83 -0
  115. agno/{document → knowledge}/reader/firecrawl_reader.py +42 -21
  116. agno/{document → knowledge}/reader/json_reader.py +30 -9
  117. agno/{document → knowledge}/reader/markdown_reader.py +58 -9
  118. agno/{document → knowledge}/reader/pdf_reader.py +71 -126
  119. agno/knowledge/reader/reader_factory.py +268 -0
  120. agno/knowledge/reader/s3_reader.py +101 -0
  121. agno/{document → knowledge}/reader/text_reader.py +31 -10
  122. agno/knowledge/reader/url_reader.py +128 -0
  123. agno/knowledge/reader/web_search_reader.py +366 -0
  124. agno/{document → knowledge}/reader/website_reader.py +37 -10
  125. agno/knowledge/reader/wikipedia_reader.py +59 -0
  126. agno/knowledge/reader/youtube_reader.py +78 -0
  127. agno/knowledge/remote_content/remote_content.py +88 -0
  128. agno/{reranker → knowledge/reranker}/base.py +1 -1
  129. agno/{reranker → knowledge/reranker}/cohere.py +2 -2
  130. agno/{reranker → knowledge/reranker}/infinity.py +2 -2
  131. agno/{reranker → knowledge/reranker}/sentence_transformer.py +2 -2
  132. agno/knowledge/types.py +30 -0
  133. agno/knowledge/utils.py +169 -0
  134. agno/media.py +269 -268
  135. agno/memory/__init__.py +2 -10
  136. agno/memory/manager.py +1003 -148
  137. agno/models/aimlapi/__init__.py +2 -2
  138. agno/models/aimlapi/aimlapi.py +6 -6
  139. agno/models/anthropic/claude.py +128 -72
  140. agno/models/aws/bedrock.py +107 -175
  141. agno/models/aws/claude.py +64 -18
  142. agno/models/azure/ai_foundry.py +73 -23
  143. agno/models/base.py +346 -290
  144. agno/models/cerebras/cerebras.py +84 -27
  145. agno/models/cohere/chat.py +106 -98
  146. agno/models/google/gemini.py +105 -46
  147. agno/models/groq/groq.py +97 -35
  148. agno/models/huggingface/huggingface.py +92 -27
  149. agno/models/ibm/watsonx.py +72 -13
  150. agno/models/litellm/chat.py +85 -13
  151. agno/models/message.py +46 -151
  152. agno/models/meta/llama.py +85 -49
  153. agno/models/metrics.py +120 -0
  154. agno/models/mistral/mistral.py +90 -21
  155. agno/models/ollama/__init__.py +0 -2
  156. agno/models/ollama/chat.py +85 -47
  157. agno/models/openai/chat.py +154 -37
  158. agno/models/openai/responses.py +178 -105
  159. agno/models/perplexity/perplexity.py +26 -2
  160. agno/models/portkey/portkey.py +0 -7
  161. agno/models/response.py +15 -9
  162. agno/models/utils.py +20 -0
  163. agno/models/vercel/__init__.py +2 -2
  164. agno/models/vercel/v0.py +1 -1
  165. agno/models/vllm/__init__.py +2 -2
  166. agno/models/vllm/vllm.py +3 -3
  167. agno/models/xai/xai.py +10 -10
  168. agno/os/__init__.py +3 -0
  169. agno/os/app.py +497 -0
  170. agno/os/auth.py +47 -0
  171. agno/os/config.py +103 -0
  172. agno/os/interfaces/agui/__init__.py +3 -0
  173. agno/os/interfaces/agui/agui.py +31 -0
  174. agno/{app/agui/async_router.py → os/interfaces/agui/router.py} +16 -16
  175. agno/{app → os/interfaces}/agui/utils.py +65 -28
  176. agno/os/interfaces/base.py +21 -0
  177. agno/os/interfaces/slack/__init__.py +3 -0
  178. agno/{app/slack/async_router.py → os/interfaces/slack/router.py} +3 -5
  179. agno/os/interfaces/slack/slack.py +32 -0
  180. agno/os/interfaces/whatsapp/__init__.py +3 -0
  181. agno/{app/whatsapp/async_router.py → os/interfaces/whatsapp/router.py} +4 -7
  182. agno/os/interfaces/whatsapp/whatsapp.py +29 -0
  183. agno/os/mcp.py +235 -0
  184. agno/os/router.py +1400 -0
  185. agno/os/routers/__init__.py +3 -0
  186. agno/os/routers/evals/__init__.py +3 -0
  187. agno/os/routers/evals/evals.py +393 -0
  188. agno/os/routers/evals/schemas.py +142 -0
  189. agno/os/routers/evals/utils.py +161 -0
  190. agno/os/routers/knowledge/__init__.py +3 -0
  191. agno/os/routers/knowledge/knowledge.py +850 -0
  192. agno/os/routers/knowledge/schemas.py +118 -0
  193. agno/os/routers/memory/__init__.py +3 -0
  194. agno/os/routers/memory/memory.py +410 -0
  195. agno/os/routers/memory/schemas.py +58 -0
  196. agno/os/routers/metrics/__init__.py +3 -0
  197. agno/os/routers/metrics/metrics.py +178 -0
  198. agno/os/routers/metrics/schemas.py +47 -0
  199. agno/os/routers/session/__init__.py +3 -0
  200. agno/os/routers/session/session.py +536 -0
  201. agno/os/schema.py +945 -0
  202. agno/{app/playground → os}/settings.py +7 -15
  203. agno/os/utils.py +270 -0
  204. agno/reasoning/azure_ai_foundry.py +4 -4
  205. agno/reasoning/deepseek.py +4 -4
  206. agno/reasoning/default.py +6 -11
  207. agno/reasoning/groq.py +4 -4
  208. agno/reasoning/helpers.py +4 -6
  209. agno/reasoning/ollama.py +4 -4
  210. agno/reasoning/openai.py +4 -4
  211. agno/run/agent.py +633 -0
  212. agno/run/base.py +53 -77
  213. agno/run/cancel.py +81 -0
  214. agno/run/team.py +243 -96
  215. agno/run/workflow.py +550 -12
  216. agno/session/__init__.py +10 -0
  217. agno/session/agent.py +244 -0
  218. agno/session/summary.py +225 -0
  219. agno/session/team.py +262 -0
  220. agno/{storage/session/v2 → session}/workflow.py +47 -24
  221. agno/team/__init__.py +15 -16
  222. agno/team/team.py +3260 -4824
  223. agno/tools/agentql.py +14 -5
  224. agno/tools/airflow.py +9 -4
  225. agno/tools/api.py +7 -3
  226. agno/tools/apify.py +2 -46
  227. agno/tools/arxiv.py +8 -3
  228. agno/tools/aws_lambda.py +7 -5
  229. agno/tools/aws_ses.py +7 -1
  230. agno/tools/baidusearch.py +4 -1
  231. agno/tools/bitbucket.py +4 -4
  232. agno/tools/brandfetch.py +14 -11
  233. agno/tools/bravesearch.py +4 -1
  234. agno/tools/brightdata.py +43 -23
  235. agno/tools/browserbase.py +13 -4
  236. agno/tools/calcom.py +12 -10
  237. agno/tools/calculator.py +10 -27
  238. agno/tools/cartesia.py +20 -17
  239. agno/tools/{clickup_tool.py → clickup.py} +12 -25
  240. agno/tools/confluence.py +8 -8
  241. agno/tools/crawl4ai.py +7 -1
  242. agno/tools/csv_toolkit.py +9 -8
  243. agno/tools/dalle.py +22 -12
  244. agno/tools/daytona.py +13 -16
  245. agno/tools/decorator.py +6 -3
  246. agno/tools/desi_vocal.py +17 -8
  247. agno/tools/discord.py +11 -8
  248. agno/tools/docker.py +30 -42
  249. agno/tools/duckdb.py +34 -53
  250. agno/tools/duckduckgo.py +8 -7
  251. agno/tools/e2b.py +62 -62
  252. agno/tools/eleven_labs.py +36 -29
  253. agno/tools/email.py +4 -1
  254. agno/tools/evm.py +7 -1
  255. agno/tools/exa.py +19 -14
  256. agno/tools/fal.py +30 -30
  257. agno/tools/file.py +9 -8
  258. agno/tools/financial_datasets.py +25 -44
  259. agno/tools/firecrawl.py +17 -18
  260. agno/tools/function.py +127 -18
  261. agno/tools/giphy.py +23 -11
  262. agno/tools/github.py +48 -126
  263. agno/tools/gmail.py +45 -61
  264. agno/tools/google_bigquery.py +7 -6
  265. agno/tools/google_maps.py +11 -26
  266. agno/tools/googlesearch.py +7 -2
  267. agno/tools/googlesheets.py +21 -17
  268. agno/tools/hackernews.py +9 -5
  269. agno/tools/jina.py +5 -4
  270. agno/tools/jira.py +18 -9
  271. agno/tools/knowledge.py +31 -32
  272. agno/tools/linear.py +18 -33
  273. agno/tools/linkup.py +5 -1
  274. agno/tools/local_file_system.py +8 -5
  275. agno/tools/lumalab.py +32 -20
  276. agno/tools/mcp.py +1 -2
  277. agno/tools/mem0.py +18 -12
  278. agno/tools/memori.py +14 -10
  279. agno/tools/mlx_transcribe.py +3 -2
  280. agno/tools/models/azure_openai.py +33 -15
  281. agno/tools/models/gemini.py +59 -32
  282. agno/tools/models/groq.py +30 -23
  283. agno/tools/models/nebius.py +28 -12
  284. agno/tools/models_labs.py +40 -16
  285. agno/tools/moviepy_video.py +7 -6
  286. agno/tools/neo4j.py +10 -8
  287. agno/tools/newspaper.py +7 -2
  288. agno/tools/newspaper4k.py +8 -3
  289. agno/tools/openai.py +58 -32
  290. agno/tools/openbb.py +12 -11
  291. agno/tools/opencv.py +63 -47
  292. agno/tools/openweather.py +14 -12
  293. agno/tools/pandas.py +11 -3
  294. agno/tools/postgres.py +4 -12
  295. agno/tools/pubmed.py +4 -1
  296. agno/tools/python.py +9 -22
  297. agno/tools/reasoning.py +35 -27
  298. agno/tools/reddit.py +11 -26
  299. agno/tools/replicate.py +55 -42
  300. agno/tools/resend.py +4 -1
  301. agno/tools/scrapegraph.py +15 -14
  302. agno/tools/searxng.py +10 -23
  303. agno/tools/serpapi.py +6 -3
  304. agno/tools/serper.py +13 -4
  305. agno/tools/shell.py +9 -2
  306. agno/tools/slack.py +12 -11
  307. agno/tools/sleep.py +3 -2
  308. agno/tools/spider.py +24 -4
  309. agno/tools/sql.py +7 -6
  310. agno/tools/tavily.py +6 -4
  311. agno/tools/telegram.py +12 -4
  312. agno/tools/todoist.py +11 -31
  313. agno/tools/toolkit.py +1 -1
  314. agno/tools/trafilatura.py +22 -6
  315. agno/tools/trello.py +9 -22
  316. agno/tools/twilio.py +10 -3
  317. agno/tools/user_control_flow.py +6 -1
  318. agno/tools/valyu.py +34 -5
  319. agno/tools/visualization.py +19 -28
  320. agno/tools/webbrowser.py +4 -3
  321. agno/tools/webex.py +11 -7
  322. agno/tools/website.py +15 -46
  323. agno/tools/webtools.py +12 -4
  324. agno/tools/whatsapp.py +5 -9
  325. agno/tools/wikipedia.py +20 -13
  326. agno/tools/x.py +14 -13
  327. agno/tools/yfinance.py +13 -40
  328. agno/tools/youtube.py +26 -20
  329. agno/tools/zendesk.py +7 -2
  330. agno/tools/zep.py +10 -7
  331. agno/tools/zoom.py +10 -9
  332. agno/utils/common.py +1 -19
  333. agno/utils/events.py +100 -123
  334. agno/utils/gemini.py +1 -1
  335. agno/utils/knowledge.py +29 -0
  336. agno/utils/log.py +54 -4
  337. agno/utils/mcp.py +68 -10
  338. agno/utils/media.py +39 -0
  339. agno/utils/message.py +12 -1
  340. agno/utils/models/aws_claude.py +1 -1
  341. agno/utils/models/claude.py +6 -12
  342. agno/utils/models/cohere.py +1 -1
  343. agno/utils/models/mistral.py +8 -7
  344. agno/utils/models/schema_utils.py +3 -3
  345. agno/utils/models/watsonx.py +1 -1
  346. agno/utils/openai.py +1 -1
  347. agno/utils/pprint.py +33 -32
  348. agno/utils/print_response/agent.py +779 -0
  349. agno/utils/print_response/team.py +1669 -0
  350. agno/utils/print_response/workflow.py +1451 -0
  351. agno/utils/prompts.py +14 -14
  352. agno/utils/reasoning.py +87 -0
  353. agno/utils/response.py +42 -42
  354. agno/utils/streamlit.py +481 -0
  355. agno/utils/string.py +8 -22
  356. agno/utils/team.py +50 -0
  357. agno/utils/timer.py +2 -2
  358. agno/vectordb/base.py +33 -21
  359. agno/vectordb/cassandra/cassandra.py +287 -23
  360. agno/vectordb/chroma/chromadb.py +482 -59
  361. agno/vectordb/clickhouse/clickhousedb.py +270 -63
  362. agno/vectordb/couchbase/couchbase.py +309 -29
  363. agno/vectordb/lancedb/lance_db.py +360 -21
  364. agno/vectordb/langchaindb/__init__.py +5 -0
  365. agno/vectordb/langchaindb/langchaindb.py +145 -0
  366. agno/vectordb/lightrag/__init__.py +5 -0
  367. agno/vectordb/lightrag/lightrag.py +374 -0
  368. agno/vectordb/llamaindex/llamaindexdb.py +127 -0
  369. agno/vectordb/milvus/milvus.py +242 -32
  370. agno/vectordb/mongodb/mongodb.py +200 -24
  371. agno/vectordb/pgvector/pgvector.py +319 -37
  372. agno/vectordb/pineconedb/pineconedb.py +221 -27
  373. agno/vectordb/qdrant/qdrant.py +334 -14
  374. agno/vectordb/singlestore/singlestore.py +286 -29
  375. agno/vectordb/surrealdb/surrealdb.py +187 -7
  376. agno/vectordb/upstashdb/upstashdb.py +342 -26
  377. agno/vectordb/weaviate/weaviate.py +227 -165
  378. agno/workflow/__init__.py +17 -13
  379. agno/workflow/{v2/condition.py → condition.py} +135 -32
  380. agno/workflow/{v2/loop.py → loop.py} +115 -28
  381. agno/workflow/{v2/parallel.py → parallel.py} +138 -108
  382. agno/workflow/{v2/router.py → router.py} +133 -32
  383. agno/workflow/{v2/step.py → step.py} +207 -49
  384. agno/workflow/{v2/steps.py → steps.py} +147 -66
  385. agno/workflow/types.py +482 -0
  386. agno/workflow/workflow.py +2410 -696
  387. agno-2.0.0.dist-info/METADATA +494 -0
  388. agno-2.0.0.dist-info/RECORD +515 -0
  389. agno-2.0.0.dist-info/licenses/LICENSE +201 -0
  390. agno/agent/metrics.py +0 -110
  391. agno/api/app.py +0 -35
  392. agno/api/playground.py +0 -92
  393. agno/api/schemas/app.py +0 -12
  394. agno/api/schemas/playground.py +0 -22
  395. agno/api/schemas/user.py +0 -35
  396. agno/api/schemas/workspace.py +0 -46
  397. agno/api/user.py +0 -160
  398. agno/api/workflows.py +0 -33
  399. agno/api/workspace.py +0 -175
  400. agno/app/agui/__init__.py +0 -3
  401. agno/app/agui/app.py +0 -17
  402. agno/app/agui/sync_router.py +0 -120
  403. agno/app/base.py +0 -186
  404. agno/app/discord/__init__.py +0 -3
  405. agno/app/fastapi/__init__.py +0 -3
  406. agno/app/fastapi/app.py +0 -107
  407. agno/app/fastapi/async_router.py +0 -457
  408. agno/app/fastapi/sync_router.py +0 -448
  409. agno/app/playground/app.py +0 -228
  410. agno/app/playground/async_router.py +0 -1053
  411. agno/app/playground/deploy.py +0 -249
  412. agno/app/playground/operator.py +0 -183
  413. agno/app/playground/schemas.py +0 -223
  414. agno/app/playground/serve.py +0 -55
  415. agno/app/playground/sync_router.py +0 -1045
  416. agno/app/playground/utils.py +0 -46
  417. agno/app/settings.py +0 -15
  418. agno/app/slack/__init__.py +0 -3
  419. agno/app/slack/app.py +0 -19
  420. agno/app/slack/sync_router.py +0 -92
  421. agno/app/utils.py +0 -54
  422. agno/app/whatsapp/__init__.py +0 -3
  423. agno/app/whatsapp/app.py +0 -15
  424. agno/app/whatsapp/sync_router.py +0 -197
  425. agno/cli/auth_server.py +0 -249
  426. agno/cli/config.py +0 -274
  427. agno/cli/console.py +0 -88
  428. agno/cli/credentials.py +0 -23
  429. agno/cli/entrypoint.py +0 -571
  430. agno/cli/operator.py +0 -357
  431. agno/cli/settings.py +0 -96
  432. agno/cli/ws/ws_cli.py +0 -817
  433. agno/constants.py +0 -13
  434. agno/document/__init__.py +0 -5
  435. agno/document/chunking/semantic.py +0 -45
  436. agno/document/chunking/strategy.py +0 -31
  437. agno/document/reader/__init__.py +0 -5
  438. agno/document/reader/base.py +0 -47
  439. agno/document/reader/docx_reader.py +0 -60
  440. agno/document/reader/gcs/pdf_reader.py +0 -44
  441. agno/document/reader/s3/pdf_reader.py +0 -59
  442. agno/document/reader/s3/text_reader.py +0 -63
  443. agno/document/reader/url_reader.py +0 -59
  444. agno/document/reader/youtube_reader.py +0 -58
  445. agno/embedder/__init__.py +0 -5
  446. agno/embedder/langdb.py +0 -80
  447. agno/embedder/mistral.py +0 -82
  448. agno/embedder/openai.py +0 -78
  449. agno/file/__init__.py +0 -5
  450. agno/file/file.py +0 -16
  451. agno/file/local/csv.py +0 -32
  452. agno/file/local/txt.py +0 -19
  453. agno/infra/app.py +0 -240
  454. agno/infra/base.py +0 -144
  455. agno/infra/context.py +0 -20
  456. agno/infra/db_app.py +0 -52
  457. agno/infra/resource.py +0 -205
  458. agno/infra/resources.py +0 -55
  459. agno/knowledge/agent.py +0 -702
  460. agno/knowledge/arxiv.py +0 -33
  461. agno/knowledge/combined.py +0 -36
  462. agno/knowledge/csv.py +0 -144
  463. agno/knowledge/csv_url.py +0 -124
  464. agno/knowledge/document.py +0 -223
  465. agno/knowledge/docx.py +0 -137
  466. agno/knowledge/firecrawl.py +0 -34
  467. agno/knowledge/gcs/__init__.py +0 -0
  468. agno/knowledge/gcs/base.py +0 -39
  469. agno/knowledge/gcs/pdf.py +0 -125
  470. agno/knowledge/json.py +0 -137
  471. agno/knowledge/langchain.py +0 -71
  472. agno/knowledge/light_rag.py +0 -273
  473. agno/knowledge/llamaindex.py +0 -66
  474. agno/knowledge/markdown.py +0 -154
  475. agno/knowledge/pdf.py +0 -164
  476. agno/knowledge/pdf_bytes.py +0 -42
  477. agno/knowledge/pdf_url.py +0 -148
  478. agno/knowledge/s3/__init__.py +0 -0
  479. agno/knowledge/s3/base.py +0 -64
  480. agno/knowledge/s3/pdf.py +0 -33
  481. agno/knowledge/s3/text.py +0 -34
  482. agno/knowledge/text.py +0 -141
  483. agno/knowledge/url.py +0 -46
  484. agno/knowledge/website.py +0 -179
  485. agno/knowledge/wikipedia.py +0 -32
  486. agno/knowledge/youtube.py +0 -35
  487. agno/memory/agent.py +0 -423
  488. agno/memory/classifier.py +0 -104
  489. agno/memory/db/__init__.py +0 -5
  490. agno/memory/db/base.py +0 -42
  491. agno/memory/db/mongodb.py +0 -189
  492. agno/memory/db/postgres.py +0 -203
  493. agno/memory/db/sqlite.py +0 -193
  494. agno/memory/memory.py +0 -22
  495. agno/memory/row.py +0 -36
  496. agno/memory/summarizer.py +0 -201
  497. agno/memory/summary.py +0 -19
  498. agno/memory/team.py +0 -415
  499. agno/memory/v2/__init__.py +0 -2
  500. agno/memory/v2/db/__init__.py +0 -1
  501. agno/memory/v2/db/base.py +0 -42
  502. agno/memory/v2/db/firestore.py +0 -339
  503. agno/memory/v2/db/mongodb.py +0 -196
  504. agno/memory/v2/db/postgres.py +0 -214
  505. agno/memory/v2/db/redis.py +0 -187
  506. agno/memory/v2/db/schema.py +0 -54
  507. agno/memory/v2/db/sqlite.py +0 -209
  508. agno/memory/v2/manager.py +0 -437
  509. agno/memory/v2/memory.py +0 -1097
  510. agno/memory/v2/schema.py +0 -55
  511. agno/memory/v2/summarizer.py +0 -215
  512. agno/memory/workflow.py +0 -38
  513. agno/models/ollama/tools.py +0 -430
  514. agno/models/qwen/__init__.py +0 -5
  515. agno/playground/__init__.py +0 -10
  516. agno/playground/deploy.py +0 -3
  517. agno/playground/playground.py +0 -3
  518. agno/playground/serve.py +0 -3
  519. agno/playground/settings.py +0 -3
  520. agno/reranker/__init__.py +0 -0
  521. agno/run/response.py +0 -467
  522. agno/run/v2/__init__.py +0 -0
  523. agno/run/v2/workflow.py +0 -567
  524. agno/storage/__init__.py +0 -0
  525. agno/storage/agent/__init__.py +0 -0
  526. agno/storage/agent/dynamodb.py +0 -1
  527. agno/storage/agent/json.py +0 -1
  528. agno/storage/agent/mongodb.py +0 -1
  529. agno/storage/agent/postgres.py +0 -1
  530. agno/storage/agent/singlestore.py +0 -1
  531. agno/storage/agent/sqlite.py +0 -1
  532. agno/storage/agent/yaml.py +0 -1
  533. agno/storage/base.py +0 -60
  534. agno/storage/dynamodb.py +0 -673
  535. agno/storage/firestore.py +0 -297
  536. agno/storage/gcs_json.py +0 -261
  537. agno/storage/in_memory.py +0 -234
  538. agno/storage/json.py +0 -237
  539. agno/storage/mongodb.py +0 -328
  540. agno/storage/mysql.py +0 -685
  541. agno/storage/postgres.py +0 -682
  542. agno/storage/redis.py +0 -336
  543. agno/storage/session/__init__.py +0 -16
  544. agno/storage/session/agent.py +0 -64
  545. agno/storage/session/team.py +0 -63
  546. agno/storage/session/v2/__init__.py +0 -5
  547. agno/storage/session/workflow.py +0 -61
  548. agno/storage/singlestore.py +0 -606
  549. agno/storage/sqlite.py +0 -646
  550. agno/storage/workflow/__init__.py +0 -0
  551. agno/storage/workflow/mongodb.py +0 -1
  552. agno/storage/workflow/postgres.py +0 -1
  553. agno/storage/workflow/sqlite.py +0 -1
  554. agno/storage/yaml.py +0 -241
  555. agno/tools/thinking.py +0 -73
  556. agno/utils/defaults.py +0 -57
  557. agno/utils/filesystem.py +0 -39
  558. agno/utils/git.py +0 -52
  559. agno/utils/json_io.py +0 -30
  560. agno/utils/load_env.py +0 -19
  561. agno/utils/py_io.py +0 -19
  562. agno/utils/pyproject.py +0 -18
  563. agno/utils/resource_filter.py +0 -31
  564. agno/workflow/v2/__init__.py +0 -21
  565. agno/workflow/v2/types.py +0 -357
  566. agno/workflow/v2/workflow.py +0 -3313
  567. agno/workspace/__init__.py +0 -0
  568. agno/workspace/config.py +0 -325
  569. agno/workspace/enums.py +0 -6
  570. agno/workspace/helpers.py +0 -52
  571. agno/workspace/operator.py +0 -757
  572. agno/workspace/settings.py +0 -158
  573. agno-1.8.2.dist-info/METADATA +0 -982
  574. agno-1.8.2.dist-info/RECORD +0 -566
  575. agno-1.8.2.dist-info/entry_points.txt +0 -3
  576. agno-1.8.2.dist-info/licenses/LICENSE +0 -375
  577. /agno/{app → db/migrations}/__init__.py +0 -0
  578. /agno/{app/playground/__init__.py → db/schemas/metrics.py} +0 -0
  579. /agno/{cli → integrations}/__init__.py +0 -0
  580. /agno/{cli/ws → knowledge/chunking}/__init__.py +0 -0
  581. /agno/{document/chunking → knowledge/remote_content}/__init__.py +0 -0
  582. /agno/{document/reader/gcs → knowledge/reranker}/__init__.py +0 -0
  583. /agno/{document/reader/s3 → os/interfaces}/__init__.py +0 -0
  584. /agno/{app → os/interfaces}/slack/security.py +0 -0
  585. /agno/{app → os/interfaces}/whatsapp/security.py +0 -0
  586. /agno/{file/local → utils/print_response}/__init__.py +0 -0
  587. /agno/{infra → vectordb/llamaindex}/__init__.py +0 -0
  588. {agno-1.8.2.dist-info → agno-2.0.0.dist-info}/WHEEL +0 -0
  589. {agno-1.8.2.dist-info → agno-2.0.0.dist-info}/top_level.txt +0 -0
agno/cli/auth_server.py DELETED
@@ -1,249 +0,0 @@
1
- import json
2
- from http.server import BaseHTTPRequestHandler, HTTPServer
3
- from typing import Optional
4
- from urllib.parse import parse_qs, quote, urlparse
5
-
6
- from agno.cli.settings import agno_cli_settings
7
-
8
-
9
- class CliAuthRequestHandler(BaseHTTPRequestHandler):
10
- """Request Handler to accept the CLI auth token after the web based auth flow.
11
- References:
12
- https://medium.com/@hasinthaindrajee/browser-sso-for-cli-applications-b0be743fa656
13
- https://gist.github.com/mdonkers/63e115cc0c79b4f6b8b3a6b797e485c7
14
-
15
- TODO:
16
- * Fix the header and limit to only localhost or agno.com
17
- """
18
-
19
- def _redirect_with_status(self, theme: str, redirect_uri, result: str, error_type: str = ""):
20
- """Render a simple HTML page with 'Authenticating...' and redirect with a loader."""
21
- redirect_url = f"{redirect_uri}?cli_auth={result}"
22
- if result == "error" and error_type:
23
- redirect_url += f"&type={quote(error_type)}"
24
-
25
- if theme == "dark":
26
- background_color = "#111113"
27
- text_color_large = "#FAFAFA"
28
- text_color_small = "#A1A1AA"
29
- loader_color = "#FAFAFA"
30
- auth_svg_link = "https://agno-public.s3.us-east-1.amazonaws.com/assets/Auth-darkmode.svg"
31
- else:
32
- background_color = "#FFFFFF"
33
- text_color_large = "#18181B"
34
- text_color_small = "rgba(113, 113, 122, 1)"
35
- loader_color = "#18181B"
36
- auth_svg_link = "https://agno-public.s3.us-east-1.amazonaws.com/assets/Auth-lightmode.svg"
37
-
38
- html = f"""
39
- <html>
40
- <head>
41
- <title>Agno Workspace</title>
42
- <meta http-equiv="refresh" content="1;url={redirect_url}" />
43
- <style>
44
- @import url('https://fonts.googleapis.com/css2?family=Inter:wght@400;700&display=swap');
45
- body {{
46
- font-family: 'Inter', sans-serif;
47
- display: flex;
48
- align-items: center;
49
- flex-direction: column;
50
- height: 100vh;
51
- width: 100vw;
52
- margin: 0;
53
- background-color: {background_color};
54
- position: relative;
55
- overflow: hidden;
56
- }}
57
- .container {{
58
- display: flex;
59
- flex-direction: column;
60
- align-items: center;
61
- text-align: center;
62
- gap: 12px;
63
- z-index: 1;
64
- margin-top: 120px;
65
- }}
66
- .message-large {{
67
- font-weight: 500;
68
- font-size: 26px;
69
- line-height: 100%;
70
- letter-spacing: -0.02em;
71
- text-align: center;
72
- vertical-align: middle;
73
- color: {text_color_large};
74
- }}
75
- .message-small {{
76
- font-weight: 400;
77
- font-size: 14px;
78
- line-height: 150%;
79
- letter-spacing: -0.02em;
80
- text-align: center;
81
- vertical-align: middle;
82
- color: {text_color_small};
83
- }}
84
- .loader {{
85
- width: 12px;
86
- height: 12px;
87
- border: 1px solid rgba(24, 24, 27, 0.2);
88
- border-top-color: {loader_color};
89
- border-radius: 50%;
90
- animation: spin 0.8s linear infinite;
91
- margin-bottom: 12px;
92
- }}
93
- .bottom-image {{
94
- position: absolute;
95
- bottom: 0;
96
- left: 0;
97
- right: 0;
98
- width: 100%;
99
- max-height: 50vh;
100
- z-index: 0;
101
- }}
102
- @keyframes spin {{
103
- 0% {{ transform: rotate(0deg); }}
104
- 100% {{ transform: rotate(360deg); }}
105
- }}
106
- </style>
107
- </head>
108
- <body>
109
- <div class="container">
110
- <div class="loader"></div>
111
- <div class="message-large">Authenticating your workspace...</div>
112
- <div class="message-small">You will be redirected shortly.</div>
113
- </div>
114
- <img src={auth_svg_link} class="bottom-image" alt="Background Image" />
115
- </body>
116
- </html>
117
- """
118
-
119
- self._set_html_response(html, status_code=200)
120
- self.server.running = False # type: ignore
121
-
122
- def _set_response(self):
123
- self.send_response(204)
124
- self.send_header("Access-Control-Allow-Origin", "*")
125
- self.send_header("Access-Control-Allow-Headers", "*")
126
- self.send_header("Access-Control-Allow-Methods", "POST")
127
- self.end_headers()
128
-
129
- def _set_html_response(self, html_content: str, status_code: int = 200):
130
- """Set the response headers and content type to HTML."""
131
- self.send_response(status_code)
132
- self.send_header("Content-type", "text/html")
133
- self.send_header("Access-Control-Allow-Origin", "*")
134
- self.send_header("Access-Control-Allow-Headers", "*")
135
- self.send_header("Access-Control-Allow-Methods", "GET, OPTIONS")
136
- self.send_header("Access-Control-Allow-Credentials", "true")
137
- self.end_headers()
138
- self.wfile.write(html_content.encode("utf-8"))
139
-
140
- def _store_token(self, auth_token: str):
141
- """Store the given token in a temporary file."""
142
- agno_cli_settings.tmp_token_path.parent.mkdir(parents=True, exist_ok=True)
143
- agno_cli_settings.tmp_token_path.touch(exist_ok=True)
144
- agno_cli_settings.tmp_token_path.write_text(json.dumps({"AuthToken": auth_token}))
145
-
146
- def do_GET(self):
147
- """Redirect to the provided redirect_uri after storing the auth token."""
148
- parsed_url = urlparse(self.path)
149
- query_params = parse_qs(parsed_url.query)
150
- auth_token = query_params.get("token", [""])[0]
151
- redirect_uri = query_params.get("redirect_uri", [""])[0]
152
- theme = query_params.get("theme", ["light"])[0]
153
-
154
- if not redirect_uri:
155
- self._set_html_response("<h2>Missing redirect_uri</h2>", status_code=400)
156
- return
157
-
158
- self._store_token(auth_token)
159
- self._redirect_with_status(theme, redirect_uri, "success")
160
-
161
- def do_OPTIONS(self):
162
- # logger.debug(
163
- # "OPTIONS request,\nPath: %s\nHeaders:\n%s\n",
164
- # str(self.path),
165
- # str(self.headers),
166
- # )
167
- self._set_response()
168
- # self.wfile.write("OPTIONS request for {}".format(self.path).encode('utf-8'))
169
-
170
- def do_POST(self):
171
- content_length = int(self.headers["Content-Length"]) # <--- Gets the size of data
172
- post_data = self.rfile.read(content_length) # <--- Gets the data itself
173
- decoded_post_data = post_data.decode("utf-8")
174
- # logger.debug(
175
- # "POST request,\nPath: {}\nHeaders:\n{}\n\nBody:\n{}\n".format(
176
- # str(self.path), str(self.headers), decoded_post_data
177
- # )
178
- # )
179
- # logger.debug("Data: {}".format(decoded_post_data))
180
- # logger.info("type: {}".format(type(post_data)))
181
- agno_cli_settings.tmp_token_path.parent.mkdir(parents=True, exist_ok=True)
182
- agno_cli_settings.tmp_token_path.touch(exist_ok=True)
183
- agno_cli_settings.tmp_token_path.write_text(decoded_post_data)
184
- # TODO: Add checks before shutting down the server
185
- self.server.running = False # type: ignore
186
- self._set_response()
187
-
188
- def log_message(self, format, *args):
189
- pass
190
-
191
-
192
- class CliAuthServer:
193
- """
194
- Source: https://stackoverflow.com/a/38196725/10953921
195
- """
196
-
197
- def __init__(self, port: int = 9191):
198
- import threading
199
-
200
- self._server = HTTPServer(("", port), CliAuthRequestHandler)
201
- self._thread = threading.Thread(target=self.run)
202
- self._thread.daemon = True
203
- self._server.running = False # type: ignore
204
-
205
- def run(self):
206
- self._server.running = True # type: ignore
207
- while self._server.running: # type: ignore
208
- self._server.handle_request()
209
-
210
- def start(self):
211
- self._thread.start()
212
-
213
- def shut_down(self):
214
- self._thread.close() # type: ignore
215
-
216
-
217
- def check_port(port: int):
218
- import socket
219
-
220
- with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
221
- try:
222
- return s.connect_ex(("localhost", port)) == 0
223
- except Exception as e:
224
- print(f"Error occurred: {e}")
225
- return False
226
-
227
-
228
- def get_port_for_auth_server():
229
- starting_port = 9191
230
- for port in range(starting_port, starting_port + 100):
231
- if not check_port(port):
232
- return port
233
-
234
-
235
- def get_auth_token_from_web_flow(port: int) -> Optional[str]:
236
- """
237
- GET request: curl http://localhost:9191
238
- POST request: curl -d "foo=bar&bin=baz" http://localhost:9191
239
- """
240
-
241
- server = CliAuthServer(port)
242
- server.run()
243
-
244
- if agno_cli_settings.tmp_token_path.exists() and agno_cli_settings.tmp_token_path.is_file():
245
- auth_token_str = agno_cli_settings.tmp_token_path.read_text()
246
- auth_token_json = json.loads(auth_token_str)
247
- agno_cli_settings.tmp_token_path.unlink()
248
- return auth_token_json.get("AuthToken", None)
249
- return None
agno/cli/config.py DELETED
@@ -1,274 +0,0 @@
1
- from collections import OrderedDict
2
- from pathlib import Path
3
- from typing import Dict, List, Optional
4
-
5
- from agno.api.schemas.user import TeamSchema, UserSchema
6
- from agno.api.schemas.workspace import WorkspaceSchema
7
- from agno.cli.console import print_heading, print_info
8
- from agno.cli.settings import agno_cli_settings
9
- from agno.utils.json_io import read_json_file, write_json_file
10
- from agno.utils.log import logger
11
- from agno.workspace.config import WorkspaceConfig
12
-
13
-
14
- class AgnoCliConfig:
15
- """The AgnoCliConfig class manages user data for the agno cli"""
16
-
17
- def __init__(
18
- self,
19
- user: Optional[UserSchema] = None,
20
- active_ws_dir: Optional[str] = None,
21
- ws_config_map: Optional[Dict[str, WorkspaceConfig]] = None,
22
- ) -> None:
23
- # Current user, populated after authenticating with the api
24
- # To add a user, use the user setter
25
- self._user: Optional[UserSchema] = user
26
-
27
- # Active ws dir - used as the default for `ag` commands
28
- # To add an active workspace, use the active_ws_dir setter
29
- self._active_ws_dir: Optional[str] = active_ws_dir
30
-
31
- # Mapping from ws_root_path to ws_config
32
- self.ws_config_map: Dict[str, WorkspaceConfig] = ws_config_map or OrderedDict()
33
-
34
- ######################################################
35
- ## User functions
36
- ######################################################
37
-
38
- @property
39
- def user(self) -> Optional[UserSchema]:
40
- return self._user
41
-
42
- @user.setter
43
- def user(self, user: Optional[UserSchema]) -> None:
44
- """Sets the user"""
45
- if user is not None:
46
- logger.debug(f"Setting user to: {user.email}")
47
- clear_user_cache = (
48
- self._user is not None # previous user is not None
49
- and self._user.email != "anon" # previous user is not anon
50
- and (user.email != self._user.email or user.id_user != self._user.id_user) # new user is different
51
- )
52
- self._user = user
53
- if clear_user_cache:
54
- self.clear_user_cache()
55
- self.save_config()
56
-
57
- def clear_user_cache(self) -> None:
58
- """Clears the user cache"""
59
- logger.debug("Clearing user cache")
60
- self.ws_config_map.clear()
61
- self._active_ws_dir = None
62
- agno_cli_settings.ai_conversations_path.unlink(missing_ok=True)
63
- logger.info("Workspaces cleared. If applicable, please setup your workspace using `ag ws setup`")
64
-
65
- ######################################################
66
- ## Workspace functions
67
- ######################################################
68
-
69
- @property
70
- def active_ws_dir(self) -> Optional[str]:
71
- return self._active_ws_dir
72
-
73
- def set_active_ws_dir(self, ws_root_path: Optional[Path]) -> None:
74
- if ws_root_path is not None:
75
- logger.debug(f"Setting active workspace to: {str(ws_root_path)}")
76
- self._active_ws_dir = str(ws_root_path)
77
- self.save_config()
78
-
79
- @property
80
- def available_ws(self) -> List[WorkspaceConfig]:
81
- return list(self.ws_config_map.values())
82
-
83
- def _add_or_update_ws_config(
84
- self,
85
- ws_root_path: Path,
86
- ws_schema: Optional[WorkspaceSchema] = None,
87
- ws_team: Optional[TeamSchema] = None,
88
- ws_api_key: Optional[str] = None,
89
- ) -> Optional[WorkspaceConfig]:
90
- """The main function to create, update or refresh a WorkspaceConfig.
91
-
92
- This function does not call self.save_config(). Remember to save_config() after calling this function.
93
- """
94
-
95
- # Validate ws_root_path
96
- if ws_root_path is None or not isinstance(ws_root_path, Path):
97
- raise ValueError(f"Invalid ws_root: {ws_root_path}")
98
- ws_root_str = str(ws_root_path)
99
-
100
- ######################################################
101
- # Create new ws_config if one does not exist
102
- ######################################################
103
- if ws_root_str not in self.ws_config_map:
104
- logger.debug(f"Creating workspace at: {ws_root_str}")
105
- new_workspace_config = WorkspaceConfig(
106
- ws_root_path=ws_root_path,
107
- ws_schema=ws_schema,
108
- ws_team=ws_team,
109
- ws_api_key=ws_api_key,
110
- )
111
- self.ws_config_map[ws_root_str] = new_workspace_config
112
- logger.debug(f"Workspace created at: {ws_root_str}")
113
-
114
- # Return the new_workspace_config
115
- return new_workspace_config
116
-
117
- ######################################################
118
- # Update ws_config
119
- ######################################################
120
- logger.debug(f"Updating workspace at: {ws_root_str}")
121
- # By this point there should be a WorkspaceConfig object for this ws_name
122
- existing_ws_config: Optional[WorkspaceConfig] = self.ws_config_map.get(ws_root_str, None)
123
- if existing_ws_config is None:
124
- logger.error(f"Could not find workspace at: {ws_root_str}, please run `ag ws setup`")
125
- return None
126
-
127
- # Update the ws_schema if it's not None and different from the existing one
128
- if ws_schema is not None and existing_ws_config.ws_schema != ws_schema:
129
- existing_ws_config.ws_schema = ws_schema
130
-
131
- # Update the ws_team if it's not None and different from the existing one
132
- if ws_team is not None and existing_ws_config.ws_team != ws_team:
133
- existing_ws_config.ws_team = ws_team
134
-
135
- # Update the ws_api_key if it's not None and different from the existing one
136
- if ws_api_key is not None and existing_ws_config.ws_api_key != ws_api_key:
137
- existing_ws_config.ws_api_key = ws_api_key
138
-
139
- # Swap the existing ws_config with the updated one
140
- self.ws_config_map[ws_root_str] = existing_ws_config
141
-
142
- # Return the updated_ws_config
143
- return existing_ws_config
144
-
145
- def add_new_ws_to_config(
146
- self, ws_root_path: Path, ws_team: Optional[TeamSchema] = None
147
- ) -> Optional[WorkspaceConfig]:
148
- """Adds a newly created workspace to the AgnoCliConfig"""
149
-
150
- ws_config = self._add_or_update_ws_config(ws_root_path=ws_root_path, ws_team=ws_team)
151
- self.save_config()
152
- return ws_config
153
-
154
- def create_or_update_ws_config(
155
- self,
156
- ws_root_path: Path,
157
- ws_schema: Optional[WorkspaceSchema] = None,
158
- ws_team: Optional[TeamSchema] = None,
159
- set_as_active: bool = True,
160
- ) -> Optional[WorkspaceConfig]:
161
- """Creates or updates a WorkspaceConfig and returns the WorkspaceConfig"""
162
-
163
- ws_config = self._add_or_update_ws_config(
164
- ws_root_path=ws_root_path,
165
- ws_schema=ws_schema,
166
- ws_team=ws_team,
167
- )
168
- if set_as_active:
169
- self._active_ws_dir = str(ws_root_path)
170
- self.save_config()
171
- return ws_config
172
-
173
- def delete_ws(self, ws_root_path: Path) -> None:
174
- """Handles Deleting a workspace from the AgnoCliConfig and api"""
175
-
176
- ws_root_str = str(ws_root_path)
177
- print_heading(f"Deleting record for workspace: {ws_root_str}")
178
-
179
- ws_config: Optional[WorkspaceConfig] = self.ws_config_map.pop(ws_root_str, None)
180
- if ws_config is None:
181
- logger.warning(f"No record of workspace at {ws_root_str}")
182
- return
183
-
184
- # Check if we're deleting the active workspace, if yes, unset the active ws
185
- if self._active_ws_dir is not None and self._active_ws_dir == ws_root_str:
186
- print_info(f"Removing {ws_root_str} as the active workspace")
187
- self._active_ws_dir = None
188
- self.save_config()
189
- print_info("Workspace record deleted")
190
- print_info("Note: this does not delete any data locally or from agno.com, please delete them manually\n")
191
-
192
- def get_ws_config_by_dir_name(self, ws_dir_name: str) -> Optional[WorkspaceConfig]:
193
- ws_root_str: Optional[str] = None
194
- for k, v in self.ws_config_map.items():
195
- if v.ws_root_path.stem == ws_dir_name:
196
- ws_root_str = k
197
- break
198
-
199
- if ws_root_str is None or ws_root_str not in self.ws_config_map:
200
- return None
201
-
202
- return self.ws_config_map[ws_root_str]
203
-
204
- def get_ws_config_by_path(self, ws_root_path: Path) -> Optional[WorkspaceConfig]:
205
- return self.ws_config_map[str(ws_root_path)] if str(ws_root_path) in self.ws_config_map else None
206
-
207
- def get_active_ws_config(self) -> Optional[WorkspaceConfig]:
208
- if self.active_ws_dir is not None and self.active_ws_dir in self.ws_config_map:
209
- return self.ws_config_map[self.active_ws_dir]
210
- return None
211
-
212
- ######################################################
213
- ## Save AgnoCliConfig
214
- ######################################################
215
-
216
- def save_config(self):
217
- config_data = {
218
- "user": self.user.model_dump() if self.user else None,
219
- "active_ws_dir": self.active_ws_dir,
220
- "ws_config_map": {k: v.to_dict() for k, v in self.ws_config_map.items()},
221
- }
222
- write_json_file(file_path=agno_cli_settings.config_file_path, data=config_data)
223
-
224
- @classmethod
225
- def from_saved_config(cls) -> Optional["AgnoCliConfig"]:
226
- try:
227
- config_data = read_json_file(file_path=agno_cli_settings.config_file_path)
228
- if config_data is None or not isinstance(config_data, dict):
229
- logger.debug("No config found")
230
- return None
231
-
232
- user_dict = config_data.get("user")
233
- user_schema = UserSchema.model_validate(user_dict) if user_dict else None
234
- active_ws_dir = config_data.get("active_ws_dir")
235
-
236
- # Create a new config
237
- new_config = cls(user_schema, active_ws_dir)
238
-
239
- # Add all the workspaces
240
- for k, v in config_data.get("ws_config_map", {}).items():
241
- _ws_config = WorkspaceConfig.model_validate(v)
242
- if _ws_config is not None:
243
- new_config.ws_config_map[k] = _ws_config
244
- return new_config
245
- except Exception as e:
246
- logger.warning(e)
247
- logger.warning("Please setup the workspace using `ag ws setup`")
248
- return None
249
-
250
- ######################################################
251
- ## Print AgnoCliConfig
252
- ######################################################
253
-
254
- def print_to_cli(self, show_all: bool = False):
255
- if self.user:
256
- print_heading(f"User: {self.user.email}\n")
257
- if self.active_ws_dir:
258
- print_heading(f"Active workspace directory: {self.active_ws_dir}\n")
259
- else:
260
- print_info("No active workspace found.")
261
- print_info(
262
- "Please create a workspace using `ag ws create` or setup an existing workspace using `ag ws setup`"
263
- )
264
-
265
- if show_all and len(self.ws_config_map) > 0:
266
- print_heading("Available workspaces:\n")
267
- c = 1
268
- for k, v in self.ws_config_map.items():
269
- print_info(f" {c}. Path: {k}")
270
- if v.ws_schema and v.ws_schema.ws_name:
271
- print_info(f" Name: {v.ws_schema.ws_name}")
272
- if v.ws_team and v.ws_team.name:
273
- print_info(f" Team: {v.ws_team.name}")
274
- c += 1
agno/cli/console.py DELETED
@@ -1,88 +0,0 @@
1
- from rich.console import Console
2
- from rich.style import Style
3
-
4
- from agno.utils.log import logger
5
-
6
- console = Console()
7
-
8
- ######################################################
9
- ## Styles
10
- # Standard Colors: https://rich.readthedocs.io/en/stable/appendix/colors.html#appendix-colors
11
- ######################################################
12
-
13
- heading_style = Style(
14
- color="green",
15
- bold=True,
16
- underline=True,
17
- )
18
- subheading_style = Style(
19
- color="chartreuse3",
20
- bold=True,
21
- )
22
- success_style = Style(color="chartreuse3")
23
- fail_style = Style(color="red")
24
- error_style = Style(color="red")
25
- info_style = Style()
26
- warn_style = Style(color="magenta")
27
-
28
-
29
- ######################################################
30
- ## Print functions
31
- ######################################################
32
-
33
-
34
- def print_heading(msg: str) -> None:
35
- console.print(msg, style=heading_style)
36
-
37
-
38
- def print_subheading(msg: str) -> None:
39
- console.print(msg, style=subheading_style)
40
-
41
-
42
- def print_info(msg: str) -> None:
43
- console.print(msg, style=info_style)
44
-
45
-
46
- def log_config_not_available_msg() -> None:
47
- logger.error("Agno config not found, please run `ag init` and try again")
48
-
49
-
50
- def log_active_workspace_not_available() -> None:
51
- logger.error("Could not find an active workspace. You can:")
52
- logger.error("- Run `ag ws setup` to setup a workspace at the current path")
53
- logger.error("- Run `ag ws create` to create a new workspace")
54
-
55
-
56
- def print_available_workspaces(avl_ws_list) -> None:
57
- avl_ws_names = [w.ws_root_path.stem for w in avl_ws_list] if avl_ws_list else []
58
- print_info("Available Workspaces:\n - {}".format("\n - ".join(avl_ws_names)))
59
-
60
-
61
- def confirm_yes_no(question, default: str = "yes") -> bool:
62
- """Ask a yes/no question via raw_input().
63
-
64
- "question" is a string that is presented to the user.
65
- "default" is the presumed answer if the user just hits <Enter>.
66
- It must be "yes" (the default), "no" or None (meaning
67
- an answer is required of the user).
68
-
69
- The "answer" return value is True for "yes" or False for "no".
70
- """
71
- inp_to_result_map = {"yes": True, "y": True, "ye": True, "no": False, "n": False}
72
- if default is None:
73
- prompt = " [y/n]: "
74
- elif default == "yes":
75
- prompt = " [Y/n]: "
76
- elif default == "no":
77
- prompt = " [y/N]: "
78
- else:
79
- raise ValueError(f"Invalid default answer: {default}")
80
-
81
- choice = console.input(prompt=(question + prompt)).lower()
82
- if default is not None and choice == "":
83
- return inp_to_result_map[default]
84
- elif choice in inp_to_result_map:
85
- return inp_to_result_map[choice]
86
- else:
87
- logger.error(f"{choice} invalid")
88
- return False
agno/cli/credentials.py DELETED
@@ -1,23 +0,0 @@
1
- from typing import Dict, Optional
2
-
3
- from agno.cli.settings import agno_cli_settings
4
- from agno.utils.json_io import read_json_file, write_json_file
5
-
6
-
7
- def save_auth_token(auth_token: str):
8
- # logger.debug(f"Storing {auth_token} to {str(agno_cli_settings.credentials_path)}")
9
- _data = {"token": auth_token}
10
- write_json_file(agno_cli_settings.credentials_path, _data)
11
-
12
-
13
- def read_auth_token() -> Optional[str]:
14
- # logger.debug(f"Reading token from {str(agno_cli_settings.credentials_path)}")
15
- _data: Dict = read_json_file(agno_cli_settings.credentials_path) # type: ignore
16
- if _data is None:
17
- return None
18
-
19
- try:
20
- return _data.get("token")
21
- except Exception:
22
- pass
23
- return None