agno 1.8.1__py3-none-any.whl → 2.0.0a1__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 (580) hide show
  1. agno/__init__.py +8 -0
  2. agno/agent/__init__.py +19 -27
  3. agno/agent/agent.py +2778 -4123
  4. agno/api/agent.py +9 -65
  5. agno/api/api.py +5 -46
  6. agno/api/evals.py +6 -17
  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 +9 -64
  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 +1749 -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 +1438 -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 +888 -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 +1051 -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 +1417 -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 +298 -0
  52. agno/db/postgres/__init__.py +3 -0
  53. agno/db/postgres/postgres.py +1720 -0
  54. agno/db/postgres/schemas.py +124 -0
  55. agno/db/postgres/utils.py +281 -0
  56. agno/db/redis/__init__.py +3 -0
  57. agno/db/redis/redis.py +1371 -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 +1722 -0
  67. agno/db/singlestore/utils.py +327 -0
  68. agno/db/sqlite/__init__.py +3 -0
  69. agno/db/sqlite/schemas.py +119 -0
  70. agno/db/sqlite/sqlite.py +1680 -0
  71. agno/db/sqlite/utils.py +269 -0
  72. agno/db/utils.py +88 -0
  73. agno/eval/__init__.py +14 -0
  74. agno/eval/accuracy.py +142 -43
  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 +10 -10
  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 +1515 -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 +68 -15
  115. agno/knowledge/reader/docx_reader.py +83 -0
  116. agno/{document → knowledge}/reader/firecrawl_reader.py +42 -21
  117. agno/knowledge/reader/gcs_reader.py +67 -0
  118. agno/{document → knowledge}/reader/json_reader.py +30 -9
  119. agno/{document → knowledge}/reader/markdown_reader.py +36 -9
  120. agno/{document → knowledge}/reader/pdf_reader.py +79 -21
  121. agno/knowledge/reader/reader_factory.py +275 -0
  122. agno/knowledge/reader/s3_reader.py +171 -0
  123. agno/{document → knowledge}/reader/text_reader.py +31 -10
  124. agno/knowledge/reader/url_reader.py +84 -0
  125. agno/knowledge/reader/web_search_reader.py +389 -0
  126. agno/{document → knowledge}/reader/website_reader.py +37 -10
  127. agno/knowledge/reader/wikipedia_reader.py +59 -0
  128. agno/knowledge/reader/youtube_reader.py +78 -0
  129. agno/knowledge/remote_content/remote_content.py +88 -0
  130. agno/{reranker → knowledge/reranker}/base.py +1 -1
  131. agno/{reranker → knowledge/reranker}/cohere.py +2 -2
  132. agno/{reranker → knowledge/reranker}/infinity.py +2 -2
  133. agno/{reranker → knowledge/reranker}/sentence_transformer.py +2 -2
  134. agno/knowledge/types.py +30 -0
  135. agno/knowledge/utils.py +169 -0
  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 +129 -82
  141. agno/models/aws/bedrock.py +107 -175
  142. agno/models/aws/claude.py +64 -18
  143. agno/models/azure/ai_foundry.py +73 -23
  144. agno/models/base.py +347 -287
  145. agno/models/cerebras/cerebras.py +84 -27
  146. agno/models/cohere/chat.py +106 -98
  147. agno/models/google/gemini.py +100 -42
  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 +38 -144
  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 +84 -46
  158. agno/models/openai/chat.py +121 -23
  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 +14 -8
  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 +393 -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 +65 -28
  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 +33 -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 +30 -0
  184. agno/os/router.py +843 -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 +204 -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 +413 -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 +179 -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 +58 -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 +163 -0
  201. agno/os/schema.py +892 -0
  202. agno/{app/playground → os}/settings.py +8 -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/{response.py → agent.py} +144 -72
  212. agno/run/base.py +44 -58
  213. agno/run/cancel.py +83 -0
  214. agno/run/team.py +133 -77
  215. agno/run/workflow.py +537 -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 +2961 -4253
  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 +42 -22
  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 +18 -13
  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 +18 -11
  244. agno/tools/daytona.py +13 -16
  245. agno/tools/decorator.py +6 -3
  246. agno/tools/desi_vocal.py +16 -7
  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 +61 -61
  252. agno/tools/eleven_labs.py +35 -28
  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 +29 -29
  257. agno/tools/file.py +9 -8
  258. agno/tools/financial_datasets.py +25 -44
  259. agno/tools/firecrawl.py +22 -22
  260. agno/tools/function.py +68 -17
  261. agno/tools/giphy.py +22 -10
  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 +31 -19
  276. agno/tools/mem0.py +18 -12
  277. agno/tools/memori.py +14 -10
  278. agno/tools/mlx_transcribe.py +3 -2
  279. agno/tools/models/azure_openai.py +32 -14
  280. agno/tools/models/gemini.py +58 -31
  281. agno/tools/models/groq.py +29 -20
  282. agno/tools/models/nebius.py +27 -11
  283. agno/tools/models_labs.py +39 -15
  284. agno/tools/moviepy_video.py +7 -6
  285. agno/tools/neo4j.py +10 -8
  286. agno/tools/newspaper.py +7 -2
  287. agno/tools/newspaper4k.py +8 -3
  288. agno/tools/openai.py +57 -26
  289. agno/tools/openbb.py +12 -11
  290. agno/tools/opencv.py +62 -46
  291. agno/tools/openweather.py +14 -12
  292. agno/tools/pandas.py +11 -3
  293. agno/tools/postgres.py +4 -12
  294. agno/tools/pubmed.py +4 -1
  295. agno/tools/python.py +9 -22
  296. agno/tools/reasoning.py +35 -27
  297. agno/tools/reddit.py +11 -26
  298. agno/tools/replicate.py +54 -41
  299. agno/tools/resend.py +4 -1
  300. agno/tools/scrapegraph.py +15 -14
  301. agno/tools/searxng.py +10 -23
  302. agno/tools/serpapi.py +6 -3
  303. agno/tools/serper.py +13 -4
  304. agno/tools/shell.py +9 -2
  305. agno/tools/slack.py +12 -11
  306. agno/tools/sleep.py +3 -2
  307. agno/tools/spider.py +24 -4
  308. agno/tools/sql.py +7 -6
  309. agno/tools/tavily.py +6 -4
  310. agno/tools/telegram.py +12 -4
  311. agno/tools/todoist.py +11 -31
  312. agno/tools/toolkit.py +1 -1
  313. agno/tools/trafilatura.py +22 -6
  314. agno/tools/trello.py +9 -22
  315. agno/tools/twilio.py +10 -3
  316. agno/tools/user_control_flow.py +6 -1
  317. agno/tools/valyu.py +34 -5
  318. agno/tools/visualization.py +19 -28
  319. agno/tools/webbrowser.py +4 -3
  320. agno/tools/webex.py +11 -7
  321. agno/tools/website.py +15 -46
  322. agno/tools/webtools.py +12 -4
  323. agno/tools/whatsapp.py +5 -9
  324. agno/tools/wikipedia.py +20 -13
  325. agno/tools/x.py +14 -13
  326. agno/tools/yfinance.py +13 -40
  327. agno/tools/youtube.py +26 -20
  328. agno/tools/zendesk.py +7 -2
  329. agno/tools/zep.py +10 -7
  330. agno/tools/zoom.py +10 -9
  331. agno/utils/common.py +1 -19
  332. agno/utils/events.py +95 -118
  333. agno/utils/knowledge.py +29 -0
  334. agno/utils/log.py +2 -2
  335. agno/utils/mcp.py +11 -5
  336. agno/utils/media.py +39 -0
  337. agno/utils/message.py +12 -1
  338. agno/utils/models/claude.py +6 -4
  339. agno/utils/models/mistral.py +8 -7
  340. agno/utils/models/schema_utils.py +3 -3
  341. agno/utils/pprint.py +33 -32
  342. agno/utils/print_response/agent.py +779 -0
  343. agno/utils/print_response/team.py +1565 -0
  344. agno/utils/print_response/workflow.py +1451 -0
  345. agno/utils/prompts.py +14 -14
  346. agno/utils/reasoning.py +87 -0
  347. agno/utils/response.py +42 -42
  348. agno/utils/string.py +8 -22
  349. agno/utils/team.py +50 -0
  350. agno/utils/timer.py +2 -2
  351. agno/vectordb/base.py +33 -21
  352. agno/vectordb/cassandra/cassandra.py +287 -23
  353. agno/vectordb/chroma/chromadb.py +482 -59
  354. agno/vectordb/clickhouse/clickhousedb.py +270 -63
  355. agno/vectordb/couchbase/couchbase.py +309 -29
  356. agno/vectordb/lancedb/lance_db.py +360 -21
  357. agno/vectordb/langchaindb/__init__.py +5 -0
  358. agno/vectordb/langchaindb/langchaindb.py +145 -0
  359. agno/vectordb/lightrag/__init__.py +5 -0
  360. agno/vectordb/lightrag/lightrag.py +374 -0
  361. agno/vectordb/llamaindex/llamaindexdb.py +127 -0
  362. agno/vectordb/milvus/milvus.py +242 -32
  363. agno/vectordb/mongodb/mongodb.py +200 -24
  364. agno/vectordb/pgvector/pgvector.py +319 -37
  365. agno/vectordb/pineconedb/pineconedb.py +221 -27
  366. agno/vectordb/qdrant/qdrant.py +334 -14
  367. agno/vectordb/singlestore/singlestore.py +286 -29
  368. agno/vectordb/surrealdb/surrealdb.py +187 -7
  369. agno/vectordb/upstashdb/upstashdb.py +342 -26
  370. agno/vectordb/weaviate/weaviate.py +227 -165
  371. agno/workflow/__init__.py +17 -13
  372. agno/workflow/{v2/condition.py → condition.py} +135 -32
  373. agno/workflow/{v2/loop.py → loop.py} +115 -28
  374. agno/workflow/{v2/parallel.py → parallel.py} +138 -108
  375. agno/workflow/{v2/router.py → router.py} +133 -32
  376. agno/workflow/{v2/step.py → step.py} +200 -42
  377. agno/workflow/{v2/steps.py → steps.py} +147 -66
  378. agno/workflow/types.py +482 -0
  379. agno/workflow/workflow.py +2394 -696
  380. agno-2.0.0a1.dist-info/METADATA +355 -0
  381. agno-2.0.0a1.dist-info/RECORD +514 -0
  382. agno/agent/metrics.py +0 -107
  383. agno/api/app.py +0 -35
  384. agno/api/playground.py +0 -92
  385. agno/api/schemas/app.py +0 -12
  386. agno/api/schemas/playground.py +0 -22
  387. agno/api/schemas/user.py +0 -35
  388. agno/api/schemas/workspace.py +0 -46
  389. agno/api/user.py +0 -160
  390. agno/api/workflows.py +0 -33
  391. agno/api/workspace.py +0 -175
  392. agno/app/agui/__init__.py +0 -3
  393. agno/app/agui/app.py +0 -17
  394. agno/app/agui/sync_router.py +0 -120
  395. agno/app/base.py +0 -186
  396. agno/app/discord/__init__.py +0 -3
  397. agno/app/fastapi/__init__.py +0 -3
  398. agno/app/fastapi/app.py +0 -107
  399. agno/app/fastapi/async_router.py +0 -457
  400. agno/app/fastapi/sync_router.py +0 -448
  401. agno/app/playground/app.py +0 -228
  402. agno/app/playground/async_router.py +0 -1050
  403. agno/app/playground/deploy.py +0 -249
  404. agno/app/playground/operator.py +0 -183
  405. agno/app/playground/schemas.py +0 -220
  406. agno/app/playground/serve.py +0 -55
  407. agno/app/playground/sync_router.py +0 -1042
  408. agno/app/playground/utils.py +0 -46
  409. agno/app/settings.py +0 -15
  410. agno/app/slack/__init__.py +0 -3
  411. agno/app/slack/app.py +0 -19
  412. agno/app/slack/sync_router.py +0 -92
  413. agno/app/utils.py +0 -54
  414. agno/app/whatsapp/__init__.py +0 -3
  415. agno/app/whatsapp/app.py +0 -15
  416. agno/app/whatsapp/sync_router.py +0 -197
  417. agno/cli/auth_server.py +0 -249
  418. agno/cli/config.py +0 -274
  419. agno/cli/console.py +0 -88
  420. agno/cli/credentials.py +0 -23
  421. agno/cli/entrypoint.py +0 -571
  422. agno/cli/operator.py +0 -357
  423. agno/cli/settings.py +0 -96
  424. agno/cli/ws/ws_cli.py +0 -817
  425. agno/constants.py +0 -13
  426. agno/document/__init__.py +0 -5
  427. agno/document/chunking/semantic.py +0 -45
  428. agno/document/chunking/strategy.py +0 -31
  429. agno/document/reader/__init__.py +0 -5
  430. agno/document/reader/base.py +0 -47
  431. agno/document/reader/docx_reader.py +0 -60
  432. agno/document/reader/gcs/pdf_reader.py +0 -44
  433. agno/document/reader/s3/pdf_reader.py +0 -59
  434. agno/document/reader/s3/text_reader.py +0 -63
  435. agno/document/reader/url_reader.py +0 -59
  436. agno/document/reader/youtube_reader.py +0 -58
  437. agno/embedder/__init__.py +0 -5
  438. agno/embedder/langdb.py +0 -80
  439. agno/embedder/mistral.py +0 -82
  440. agno/embedder/openai.py +0 -78
  441. agno/file/__init__.py +0 -5
  442. agno/file/file.py +0 -16
  443. agno/file/local/csv.py +0 -32
  444. agno/file/local/txt.py +0 -19
  445. agno/infra/app.py +0 -240
  446. agno/infra/base.py +0 -144
  447. agno/infra/context.py +0 -20
  448. agno/infra/db_app.py +0 -52
  449. agno/infra/resource.py +0 -205
  450. agno/infra/resources.py +0 -55
  451. agno/knowledge/agent.py +0 -702
  452. agno/knowledge/arxiv.py +0 -33
  453. agno/knowledge/combined.py +0 -36
  454. agno/knowledge/csv.py +0 -144
  455. agno/knowledge/csv_url.py +0 -124
  456. agno/knowledge/document.py +0 -223
  457. agno/knowledge/docx.py +0 -137
  458. agno/knowledge/firecrawl.py +0 -34
  459. agno/knowledge/gcs/__init__.py +0 -0
  460. agno/knowledge/gcs/base.py +0 -39
  461. agno/knowledge/gcs/pdf.py +0 -125
  462. agno/knowledge/json.py +0 -137
  463. agno/knowledge/langchain.py +0 -71
  464. agno/knowledge/light_rag.py +0 -273
  465. agno/knowledge/llamaindex.py +0 -66
  466. agno/knowledge/markdown.py +0 -154
  467. agno/knowledge/pdf.py +0 -164
  468. agno/knowledge/pdf_bytes.py +0 -42
  469. agno/knowledge/pdf_url.py +0 -148
  470. agno/knowledge/s3/__init__.py +0 -0
  471. agno/knowledge/s3/base.py +0 -64
  472. agno/knowledge/s3/pdf.py +0 -33
  473. agno/knowledge/s3/text.py +0 -34
  474. agno/knowledge/text.py +0 -141
  475. agno/knowledge/url.py +0 -46
  476. agno/knowledge/website.py +0 -179
  477. agno/knowledge/wikipedia.py +0 -32
  478. agno/knowledge/youtube.py +0 -35
  479. agno/memory/agent.py +0 -423
  480. agno/memory/classifier.py +0 -104
  481. agno/memory/db/__init__.py +0 -5
  482. agno/memory/db/base.py +0 -42
  483. agno/memory/db/mongodb.py +0 -189
  484. agno/memory/db/postgres.py +0 -203
  485. agno/memory/db/sqlite.py +0 -193
  486. agno/memory/memory.py +0 -22
  487. agno/memory/row.py +0 -36
  488. agno/memory/summarizer.py +0 -201
  489. agno/memory/summary.py +0 -19
  490. agno/memory/team.py +0 -415
  491. agno/memory/v2/__init__.py +0 -2
  492. agno/memory/v2/db/__init__.py +0 -1
  493. agno/memory/v2/db/base.py +0 -42
  494. agno/memory/v2/db/firestore.py +0 -339
  495. agno/memory/v2/db/mongodb.py +0 -196
  496. agno/memory/v2/db/postgres.py +0 -214
  497. agno/memory/v2/db/redis.py +0 -187
  498. agno/memory/v2/db/schema.py +0 -54
  499. agno/memory/v2/db/sqlite.py +0 -209
  500. agno/memory/v2/manager.py +0 -437
  501. agno/memory/v2/memory.py +0 -1097
  502. agno/memory/v2/schema.py +0 -55
  503. agno/memory/v2/summarizer.py +0 -215
  504. agno/memory/workflow.py +0 -38
  505. agno/models/ollama/tools.py +0 -430
  506. agno/models/qwen/__init__.py +0 -5
  507. agno/playground/__init__.py +0 -10
  508. agno/playground/deploy.py +0 -3
  509. agno/playground/playground.py +0 -3
  510. agno/playground/serve.py +0 -3
  511. agno/playground/settings.py +0 -3
  512. agno/reranker/__init__.py +0 -0
  513. agno/run/v2/__init__.py +0 -0
  514. agno/run/v2/workflow.py +0 -567
  515. agno/storage/__init__.py +0 -0
  516. agno/storage/agent/__init__.py +0 -0
  517. agno/storage/agent/dynamodb.py +0 -1
  518. agno/storage/agent/json.py +0 -1
  519. agno/storage/agent/mongodb.py +0 -1
  520. agno/storage/agent/postgres.py +0 -1
  521. agno/storage/agent/singlestore.py +0 -1
  522. agno/storage/agent/sqlite.py +0 -1
  523. agno/storage/agent/yaml.py +0 -1
  524. agno/storage/base.py +0 -60
  525. agno/storage/dynamodb.py +0 -673
  526. agno/storage/firestore.py +0 -297
  527. agno/storage/gcs_json.py +0 -261
  528. agno/storage/in_memory.py +0 -234
  529. agno/storage/json.py +0 -237
  530. agno/storage/mongodb.py +0 -328
  531. agno/storage/mysql.py +0 -685
  532. agno/storage/postgres.py +0 -682
  533. agno/storage/redis.py +0 -336
  534. agno/storage/session/__init__.py +0 -16
  535. agno/storage/session/agent.py +0 -64
  536. agno/storage/session/team.py +0 -63
  537. agno/storage/session/v2/__init__.py +0 -5
  538. agno/storage/session/workflow.py +0 -61
  539. agno/storage/singlestore.py +0 -606
  540. agno/storage/sqlite.py +0 -646
  541. agno/storage/workflow/__init__.py +0 -0
  542. agno/storage/workflow/mongodb.py +0 -1
  543. agno/storage/workflow/postgres.py +0 -1
  544. agno/storage/workflow/sqlite.py +0 -1
  545. agno/storage/yaml.py +0 -241
  546. agno/tools/thinking.py +0 -73
  547. agno/utils/defaults.py +0 -57
  548. agno/utils/filesystem.py +0 -39
  549. agno/utils/git.py +0 -52
  550. agno/utils/json_io.py +0 -30
  551. agno/utils/load_env.py +0 -19
  552. agno/utils/py_io.py +0 -19
  553. agno/utils/pyproject.py +0 -18
  554. agno/utils/resource_filter.py +0 -31
  555. agno/workflow/v2/__init__.py +0 -21
  556. agno/workflow/v2/types.py +0 -357
  557. agno/workflow/v2/workflow.py +0 -3312
  558. agno/workspace/__init__.py +0 -0
  559. agno/workspace/config.py +0 -325
  560. agno/workspace/enums.py +0 -6
  561. agno/workspace/helpers.py +0 -52
  562. agno/workspace/operator.py +0 -757
  563. agno/workspace/settings.py +0 -158
  564. agno-1.8.1.dist-info/METADATA +0 -982
  565. agno-1.8.1.dist-info/RECORD +0 -566
  566. agno-1.8.1.dist-info/entry_points.txt +0 -3
  567. /agno/{app → db/migrations}/__init__.py +0 -0
  568. /agno/{app/playground/__init__.py → db/schemas/metrics.py} +0 -0
  569. /agno/{cli → integrations}/__init__.py +0 -0
  570. /agno/{cli/ws → knowledge/chunking}/__init__.py +0 -0
  571. /agno/{document/chunking → knowledge/remote_content}/__init__.py +0 -0
  572. /agno/{document/reader/gcs → knowledge/reranker}/__init__.py +0 -0
  573. /agno/{document/reader/s3 → os/interfaces}/__init__.py +0 -0
  574. /agno/{app → os/interfaces}/slack/security.py +0 -0
  575. /agno/{app → os/interfaces}/whatsapp/security.py +0 -0
  576. /agno/{file/local → utils/print_response}/__init__.py +0 -0
  577. /agno/{infra → vectordb/llamaindex}/__init__.py +0 -0
  578. {agno-1.8.1.dist-info → agno-2.0.0a1.dist-info}/WHEEL +0 -0
  579. {agno-1.8.1.dist-info → agno-2.0.0a1.dist-info}/licenses/LICENSE +0 -0
  580. {agno-1.8.1.dist-info → agno-2.0.0a1.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