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

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