agno 0.1.2__py3-none-any.whl → 2.3.13__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.
- agno/__init__.py +8 -0
- agno/agent/__init__.py +44 -5
- agno/agent/agent.py +10531 -2975
- agno/api/agent.py +14 -53
- agno/api/api.py +7 -46
- agno/api/evals.py +22 -0
- agno/api/os.py +17 -0
- agno/api/routes.py +6 -25
- agno/api/schemas/__init__.py +9 -0
- agno/api/schemas/agent.py +6 -9
- agno/api/schemas/evals.py +16 -0
- agno/api/schemas/os.py +14 -0
- agno/api/schemas/team.py +10 -10
- agno/api/schemas/utils.py +21 -0
- agno/api/schemas/workflows.py +16 -0
- agno/api/settings.py +53 -0
- agno/api/team.py +22 -26
- agno/api/workflow.py +28 -0
- agno/cloud/aws/base.py +214 -0
- agno/cloud/aws/s3/__init__.py +2 -0
- agno/cloud/aws/s3/api_client.py +43 -0
- agno/cloud/aws/s3/bucket.py +195 -0
- agno/cloud/aws/s3/object.py +57 -0
- agno/compression/__init__.py +3 -0
- agno/compression/manager.py +247 -0
- agno/culture/__init__.py +3 -0
- agno/culture/manager.py +956 -0
- agno/db/__init__.py +24 -0
- agno/db/async_postgres/__init__.py +3 -0
- agno/db/base.py +946 -0
- agno/db/dynamo/__init__.py +3 -0
- agno/db/dynamo/dynamo.py +2781 -0
- agno/db/dynamo/schemas.py +442 -0
- agno/db/dynamo/utils.py +743 -0
- agno/db/firestore/__init__.py +3 -0
- agno/db/firestore/firestore.py +2379 -0
- agno/db/firestore/schemas.py +181 -0
- agno/db/firestore/utils.py +376 -0
- agno/db/gcs_json/__init__.py +3 -0
- agno/db/gcs_json/gcs_json_db.py +1791 -0
- agno/db/gcs_json/utils.py +228 -0
- agno/db/in_memory/__init__.py +3 -0
- agno/db/in_memory/in_memory_db.py +1312 -0
- agno/db/in_memory/utils.py +230 -0
- agno/db/json/__init__.py +3 -0
- agno/db/json/json_db.py +1777 -0
- agno/db/json/utils.py +230 -0
- agno/db/migrations/manager.py +199 -0
- agno/db/migrations/v1_to_v2.py +635 -0
- agno/db/migrations/versions/v2_3_0.py +938 -0
- agno/db/mongo/__init__.py +17 -0
- agno/db/mongo/async_mongo.py +2760 -0
- agno/db/mongo/mongo.py +2597 -0
- agno/db/mongo/schemas.py +119 -0
- agno/db/mongo/utils.py +276 -0
- agno/db/mysql/__init__.py +4 -0
- agno/db/mysql/async_mysql.py +2912 -0
- agno/db/mysql/mysql.py +2923 -0
- agno/db/mysql/schemas.py +186 -0
- agno/db/mysql/utils.py +488 -0
- agno/db/postgres/__init__.py +4 -0
- agno/db/postgres/async_postgres.py +2579 -0
- agno/db/postgres/postgres.py +2870 -0
- agno/db/postgres/schemas.py +187 -0
- agno/db/postgres/utils.py +442 -0
- agno/db/redis/__init__.py +3 -0
- agno/db/redis/redis.py +2141 -0
- agno/db/redis/schemas.py +159 -0
- agno/db/redis/utils.py +346 -0
- agno/db/schemas/__init__.py +4 -0
- agno/db/schemas/culture.py +120 -0
- agno/db/schemas/evals.py +34 -0
- agno/db/schemas/knowledge.py +40 -0
- agno/db/schemas/memory.py +61 -0
- agno/db/singlestore/__init__.py +3 -0
- agno/db/singlestore/schemas.py +179 -0
- agno/db/singlestore/singlestore.py +2877 -0
- agno/db/singlestore/utils.py +384 -0
- agno/db/sqlite/__init__.py +4 -0
- agno/db/sqlite/async_sqlite.py +2911 -0
- agno/db/sqlite/schemas.py +181 -0
- agno/db/sqlite/sqlite.py +2908 -0
- agno/db/sqlite/utils.py +429 -0
- agno/db/surrealdb/__init__.py +3 -0
- agno/db/surrealdb/metrics.py +292 -0
- agno/db/surrealdb/models.py +334 -0
- agno/db/surrealdb/queries.py +71 -0
- agno/db/surrealdb/surrealdb.py +1908 -0
- agno/db/surrealdb/utils.py +147 -0
- agno/db/utils.py +118 -0
- agno/eval/__init__.py +24 -0
- agno/eval/accuracy.py +666 -276
- agno/eval/agent_as_judge.py +861 -0
- agno/eval/base.py +29 -0
- agno/eval/performance.py +779 -0
- agno/eval/reliability.py +241 -62
- agno/eval/utils.py +120 -0
- agno/exceptions.py +143 -1
- agno/filters.py +354 -0
- agno/guardrails/__init__.py +6 -0
- agno/guardrails/base.py +19 -0
- agno/guardrails/openai.py +144 -0
- agno/guardrails/pii.py +94 -0
- agno/guardrails/prompt_injection.py +52 -0
- agno/hooks/__init__.py +3 -0
- agno/hooks/decorator.py +164 -0
- agno/integrations/discord/__init__.py +3 -0
- agno/integrations/discord/client.py +203 -0
- agno/knowledge/__init__.py +5 -1
- agno/{document → knowledge}/chunking/agentic.py +22 -14
- agno/{document → knowledge}/chunking/document.py +2 -2
- agno/{document → knowledge}/chunking/fixed.py +7 -6
- agno/knowledge/chunking/markdown.py +151 -0
- agno/{document → knowledge}/chunking/recursive.py +15 -3
- agno/knowledge/chunking/row.py +39 -0
- agno/knowledge/chunking/semantic.py +91 -0
- agno/knowledge/chunking/strategy.py +165 -0
- agno/knowledge/content.py +74 -0
- agno/knowledge/document/__init__.py +5 -0
- agno/{document → knowledge/document}/base.py +12 -2
- agno/knowledge/embedder/__init__.py +5 -0
- agno/knowledge/embedder/aws_bedrock.py +343 -0
- agno/knowledge/embedder/azure_openai.py +210 -0
- agno/{embedder → knowledge/embedder}/base.py +8 -0
- agno/knowledge/embedder/cohere.py +323 -0
- agno/knowledge/embedder/fastembed.py +62 -0
- agno/{embedder → knowledge/embedder}/fireworks.py +1 -1
- agno/knowledge/embedder/google.py +258 -0
- agno/knowledge/embedder/huggingface.py +94 -0
- agno/knowledge/embedder/jina.py +182 -0
- agno/knowledge/embedder/langdb.py +22 -0
- agno/knowledge/embedder/mistral.py +206 -0
- agno/knowledge/embedder/nebius.py +13 -0
- agno/knowledge/embedder/ollama.py +154 -0
- agno/knowledge/embedder/openai.py +195 -0
- agno/knowledge/embedder/sentence_transformer.py +63 -0
- agno/{embedder → knowledge/embedder}/together.py +1 -1
- agno/knowledge/embedder/vllm.py +262 -0
- agno/knowledge/embedder/voyageai.py +165 -0
- agno/knowledge/knowledge.py +3006 -0
- agno/knowledge/reader/__init__.py +7 -0
- agno/knowledge/reader/arxiv_reader.py +81 -0
- agno/knowledge/reader/base.py +95 -0
- agno/knowledge/reader/csv_reader.py +164 -0
- agno/knowledge/reader/docx_reader.py +82 -0
- agno/knowledge/reader/field_labeled_csv_reader.py +290 -0
- agno/knowledge/reader/firecrawl_reader.py +201 -0
- agno/knowledge/reader/json_reader.py +88 -0
- agno/knowledge/reader/markdown_reader.py +137 -0
- agno/knowledge/reader/pdf_reader.py +431 -0
- agno/knowledge/reader/pptx_reader.py +101 -0
- agno/knowledge/reader/reader_factory.py +313 -0
- agno/knowledge/reader/s3_reader.py +89 -0
- agno/knowledge/reader/tavily_reader.py +193 -0
- agno/knowledge/reader/text_reader.py +127 -0
- agno/knowledge/reader/web_search_reader.py +325 -0
- agno/knowledge/reader/website_reader.py +455 -0
- agno/knowledge/reader/wikipedia_reader.py +91 -0
- agno/knowledge/reader/youtube_reader.py +78 -0
- agno/knowledge/remote_content/remote_content.py +88 -0
- agno/knowledge/reranker/__init__.py +3 -0
- agno/{reranker → knowledge/reranker}/base.py +1 -1
- agno/{reranker → knowledge/reranker}/cohere.py +2 -2
- agno/knowledge/reranker/infinity.py +195 -0
- agno/knowledge/reranker/sentence_transformer.py +54 -0
- agno/knowledge/types.py +39 -0
- agno/knowledge/utils.py +234 -0
- agno/media.py +439 -95
- agno/memory/__init__.py +16 -3
- agno/memory/manager.py +1474 -123
- agno/memory/strategies/__init__.py +15 -0
- agno/memory/strategies/base.py +66 -0
- agno/memory/strategies/summarize.py +196 -0
- agno/memory/strategies/types.py +37 -0
- agno/models/aimlapi/__init__.py +5 -0
- agno/models/aimlapi/aimlapi.py +62 -0
- agno/models/anthropic/__init__.py +4 -0
- agno/models/anthropic/claude.py +960 -496
- agno/models/aws/__init__.py +15 -0
- agno/models/aws/bedrock.py +686 -451
- agno/models/aws/claude.py +190 -183
- agno/models/azure/__init__.py +18 -1
- agno/models/azure/ai_foundry.py +489 -0
- agno/models/azure/openai_chat.py +89 -40
- agno/models/base.py +2477 -550
- agno/models/cerebras/__init__.py +12 -0
- agno/models/cerebras/cerebras.py +565 -0
- agno/models/cerebras/cerebras_openai.py +131 -0
- agno/models/cohere/__init__.py +4 -0
- agno/models/cohere/chat.py +306 -492
- agno/models/cometapi/__init__.py +5 -0
- agno/models/cometapi/cometapi.py +74 -0
- agno/models/dashscope/__init__.py +5 -0
- agno/models/dashscope/dashscope.py +90 -0
- agno/models/deepinfra/__init__.py +5 -0
- agno/models/deepinfra/deepinfra.py +45 -0
- agno/models/deepseek/__init__.py +4 -0
- agno/models/deepseek/deepseek.py +110 -9
- agno/models/fireworks/__init__.py +4 -0
- agno/models/fireworks/fireworks.py +19 -22
- agno/models/google/__init__.py +3 -7
- agno/models/google/gemini.py +1717 -662
- agno/models/google/utils.py +22 -0
- agno/models/groq/__init__.py +4 -0
- agno/models/groq/groq.py +391 -666
- agno/models/huggingface/__init__.py +4 -0
- agno/models/huggingface/huggingface.py +266 -538
- agno/models/ibm/__init__.py +5 -0
- agno/models/ibm/watsonx.py +432 -0
- agno/models/internlm/__init__.py +3 -0
- agno/models/internlm/internlm.py +20 -3
- agno/models/langdb/__init__.py +1 -0
- agno/models/langdb/langdb.py +60 -0
- agno/models/litellm/__init__.py +14 -0
- agno/models/litellm/chat.py +503 -0
- agno/models/litellm/litellm_openai.py +42 -0
- agno/models/llama_cpp/__init__.py +5 -0
- agno/models/llama_cpp/llama_cpp.py +22 -0
- agno/models/lmstudio/__init__.py +5 -0
- agno/models/lmstudio/lmstudio.py +25 -0
- agno/models/message.py +361 -39
- agno/models/meta/__init__.py +12 -0
- agno/models/meta/llama.py +502 -0
- agno/models/meta/llama_openai.py +79 -0
- agno/models/metrics.py +120 -0
- agno/models/mistral/__init__.py +4 -0
- agno/models/mistral/mistral.py +293 -393
- agno/models/nebius/__init__.py +3 -0
- agno/models/nebius/nebius.py +53 -0
- agno/models/nexus/__init__.py +3 -0
- agno/models/nexus/nexus.py +22 -0
- agno/models/nvidia/__init__.py +4 -0
- agno/models/nvidia/nvidia.py +22 -3
- agno/models/ollama/__init__.py +4 -2
- agno/models/ollama/chat.py +257 -492
- agno/models/openai/__init__.py +7 -0
- agno/models/openai/chat.py +725 -770
- agno/models/openai/like.py +16 -2
- agno/models/openai/responses.py +1121 -0
- agno/models/openrouter/__init__.py +4 -0
- agno/models/openrouter/openrouter.py +62 -5
- agno/models/perplexity/__init__.py +5 -0
- agno/models/perplexity/perplexity.py +203 -0
- agno/models/portkey/__init__.py +3 -0
- agno/models/portkey/portkey.py +82 -0
- agno/models/requesty/__init__.py +5 -0
- agno/models/requesty/requesty.py +69 -0
- agno/models/response.py +177 -7
- agno/models/sambanova/__init__.py +4 -0
- agno/models/sambanova/sambanova.py +23 -4
- agno/models/siliconflow/__init__.py +5 -0
- agno/models/siliconflow/siliconflow.py +42 -0
- agno/models/together/__init__.py +4 -0
- agno/models/together/together.py +21 -164
- agno/models/utils.py +266 -0
- agno/models/vercel/__init__.py +3 -0
- agno/models/vercel/v0.py +43 -0
- agno/models/vertexai/__init__.py +0 -1
- agno/models/vertexai/claude.py +190 -0
- agno/models/vllm/__init__.py +3 -0
- agno/models/vllm/vllm.py +83 -0
- agno/models/xai/__init__.py +2 -0
- agno/models/xai/xai.py +111 -7
- agno/os/__init__.py +3 -0
- agno/os/app.py +1027 -0
- agno/os/auth.py +244 -0
- agno/os/config.py +126 -0
- agno/os/interfaces/__init__.py +1 -0
- agno/os/interfaces/a2a/__init__.py +3 -0
- agno/os/interfaces/a2a/a2a.py +42 -0
- agno/os/interfaces/a2a/router.py +249 -0
- agno/os/interfaces/a2a/utils.py +924 -0
- agno/os/interfaces/agui/__init__.py +3 -0
- agno/os/interfaces/agui/agui.py +47 -0
- agno/os/interfaces/agui/router.py +147 -0
- agno/os/interfaces/agui/utils.py +574 -0
- agno/os/interfaces/base.py +25 -0
- agno/os/interfaces/slack/__init__.py +3 -0
- agno/os/interfaces/slack/router.py +148 -0
- agno/os/interfaces/slack/security.py +30 -0
- agno/os/interfaces/slack/slack.py +47 -0
- agno/os/interfaces/whatsapp/__init__.py +3 -0
- agno/os/interfaces/whatsapp/router.py +210 -0
- agno/os/interfaces/whatsapp/security.py +55 -0
- agno/os/interfaces/whatsapp/whatsapp.py +36 -0
- agno/os/mcp.py +293 -0
- agno/os/middleware/__init__.py +9 -0
- agno/os/middleware/jwt.py +797 -0
- agno/os/router.py +258 -0
- agno/os/routers/__init__.py +3 -0
- agno/os/routers/agents/__init__.py +3 -0
- agno/os/routers/agents/router.py +599 -0
- agno/os/routers/agents/schema.py +261 -0
- agno/os/routers/evals/__init__.py +3 -0
- agno/os/routers/evals/evals.py +450 -0
- agno/os/routers/evals/schemas.py +174 -0
- agno/os/routers/evals/utils.py +231 -0
- agno/os/routers/health.py +31 -0
- agno/os/routers/home.py +52 -0
- agno/os/routers/knowledge/__init__.py +3 -0
- agno/os/routers/knowledge/knowledge.py +1008 -0
- agno/os/routers/knowledge/schemas.py +178 -0
- agno/os/routers/memory/__init__.py +3 -0
- agno/os/routers/memory/memory.py +661 -0
- agno/os/routers/memory/schemas.py +88 -0
- agno/os/routers/metrics/__init__.py +3 -0
- agno/os/routers/metrics/metrics.py +190 -0
- agno/os/routers/metrics/schemas.py +47 -0
- agno/os/routers/session/__init__.py +3 -0
- agno/os/routers/session/session.py +997 -0
- agno/os/routers/teams/__init__.py +3 -0
- agno/os/routers/teams/router.py +512 -0
- agno/os/routers/teams/schema.py +257 -0
- agno/os/routers/traces/__init__.py +3 -0
- agno/os/routers/traces/schemas.py +414 -0
- agno/os/routers/traces/traces.py +499 -0
- agno/os/routers/workflows/__init__.py +3 -0
- agno/os/routers/workflows/router.py +624 -0
- agno/os/routers/workflows/schema.py +75 -0
- agno/os/schema.py +534 -0
- agno/os/scopes.py +469 -0
- agno/{playground → os}/settings.py +7 -15
- agno/os/utils.py +973 -0
- agno/reasoning/anthropic.py +80 -0
- agno/reasoning/azure_ai_foundry.py +67 -0
- agno/reasoning/deepseek.py +63 -0
- agno/reasoning/default.py +97 -0
- agno/reasoning/gemini.py +73 -0
- agno/reasoning/groq.py +71 -0
- agno/reasoning/helpers.py +24 -1
- agno/reasoning/ollama.py +67 -0
- agno/reasoning/openai.py +86 -0
- agno/reasoning/step.py +2 -1
- agno/reasoning/vertexai.py +76 -0
- agno/run/__init__.py +6 -0
- agno/run/agent.py +822 -0
- agno/run/base.py +247 -0
- agno/run/cancel.py +81 -0
- agno/run/requirement.py +181 -0
- agno/run/team.py +767 -0
- agno/run/workflow.py +708 -0
- agno/session/__init__.py +10 -0
- agno/session/agent.py +260 -0
- agno/session/summary.py +265 -0
- agno/session/team.py +342 -0
- agno/session/workflow.py +501 -0
- agno/table.py +10 -0
- agno/team/__init__.py +37 -0
- agno/team/team.py +9536 -0
- agno/tools/__init__.py +7 -0
- agno/tools/agentql.py +120 -0
- agno/tools/airflow.py +22 -12
- agno/tools/api.py +122 -0
- agno/tools/apify.py +276 -83
- agno/tools/{arxiv_toolkit.py → arxiv.py} +20 -12
- agno/tools/aws_lambda.py +28 -7
- agno/tools/aws_ses.py +66 -0
- agno/tools/baidusearch.py +11 -4
- agno/tools/bitbucket.py +292 -0
- agno/tools/brandfetch.py +213 -0
- agno/tools/bravesearch.py +106 -0
- agno/tools/brightdata.py +367 -0
- agno/tools/browserbase.py +209 -0
- agno/tools/calcom.py +32 -23
- agno/tools/calculator.py +24 -37
- agno/tools/cartesia.py +187 -0
- agno/tools/{clickup_tool.py → clickup.py} +17 -28
- agno/tools/confluence.py +91 -26
- agno/tools/crawl4ai.py +139 -43
- agno/tools/csv_toolkit.py +28 -22
- agno/tools/dalle.py +36 -22
- agno/tools/daytona.py +475 -0
- agno/tools/decorator.py +169 -14
- agno/tools/desi_vocal.py +23 -11
- agno/tools/discord.py +32 -29
- agno/tools/docker.py +716 -0
- agno/tools/duckdb.py +76 -81
- agno/tools/duckduckgo.py +43 -40
- agno/tools/e2b.py +703 -0
- agno/tools/eleven_labs.py +65 -54
- agno/tools/email.py +13 -5
- agno/tools/evm.py +129 -0
- agno/tools/exa.py +324 -42
- agno/tools/fal.py +39 -35
- agno/tools/file.py +196 -30
- agno/tools/file_generation.py +356 -0
- agno/tools/financial_datasets.py +288 -0
- agno/tools/firecrawl.py +108 -33
- agno/tools/function.py +960 -122
- agno/tools/giphy.py +34 -12
- agno/tools/github.py +1294 -97
- agno/tools/gmail.py +922 -0
- agno/tools/google_bigquery.py +117 -0
- agno/tools/google_drive.py +271 -0
- agno/tools/google_maps.py +253 -0
- agno/tools/googlecalendar.py +607 -107
- agno/tools/googlesheets.py +377 -0
- agno/tools/hackernews.py +20 -12
- agno/tools/jina.py +24 -14
- agno/tools/jira.py +48 -19
- agno/tools/knowledge.py +218 -0
- agno/tools/linear.py +82 -43
- agno/tools/linkup.py +58 -0
- agno/tools/local_file_system.py +15 -7
- agno/tools/lumalab.py +41 -26
- agno/tools/mcp/__init__.py +10 -0
- agno/tools/mcp/mcp.py +331 -0
- agno/tools/mcp/multi_mcp.py +347 -0
- agno/tools/mcp/params.py +24 -0
- agno/tools/mcp_toolbox.py +284 -0
- agno/tools/mem0.py +193 -0
- agno/tools/memory.py +419 -0
- agno/tools/mlx_transcribe.py +11 -9
- agno/tools/models/azure_openai.py +190 -0
- agno/tools/models/gemini.py +203 -0
- agno/tools/models/groq.py +158 -0
- agno/tools/models/morph.py +186 -0
- agno/tools/models/nebius.py +124 -0
- agno/tools/models_labs.py +163 -82
- agno/tools/moviepy_video.py +18 -13
- agno/tools/nano_banana.py +151 -0
- agno/tools/neo4j.py +134 -0
- agno/tools/newspaper.py +15 -4
- agno/tools/newspaper4k.py +19 -6
- agno/tools/notion.py +204 -0
- agno/tools/openai.py +181 -17
- agno/tools/openbb.py +27 -20
- agno/tools/opencv.py +321 -0
- agno/tools/openweather.py +233 -0
- agno/tools/oxylabs.py +385 -0
- agno/tools/pandas.py +25 -15
- agno/tools/parallel.py +314 -0
- agno/tools/postgres.py +238 -185
- agno/tools/pubmed.py +125 -13
- agno/tools/python.py +48 -35
- agno/tools/reasoning.py +283 -0
- agno/tools/reddit.py +207 -29
- agno/tools/redshift.py +406 -0
- agno/tools/replicate.py +69 -26
- agno/tools/resend.py +11 -6
- agno/tools/scrapegraph.py +179 -19
- agno/tools/searxng.py +23 -31
- agno/tools/serpapi.py +15 -10
- agno/tools/serper.py +255 -0
- agno/tools/shell.py +23 -12
- agno/tools/shopify.py +1519 -0
- agno/tools/slack.py +56 -14
- agno/tools/sleep.py +8 -6
- agno/tools/spider.py +35 -11
- agno/tools/spotify.py +919 -0
- agno/tools/sql.py +34 -19
- agno/tools/tavily.py +158 -8
- agno/tools/telegram.py +18 -8
- agno/tools/todoist.py +218 -0
- agno/tools/toolkit.py +134 -9
- agno/tools/trafilatura.py +388 -0
- agno/tools/trello.py +25 -28
- agno/tools/twilio.py +18 -9
- agno/tools/user_control_flow.py +78 -0
- agno/tools/valyu.py +228 -0
- agno/tools/visualization.py +467 -0
- agno/tools/webbrowser.py +28 -0
- agno/tools/webex.py +76 -0
- agno/tools/website.py +23 -19
- agno/tools/webtools.py +45 -0
- agno/tools/whatsapp.py +286 -0
- agno/tools/wikipedia.py +28 -19
- agno/tools/workflow.py +285 -0
- agno/tools/{twitter.py → x.py} +142 -46
- agno/tools/yfinance.py +41 -39
- agno/tools/youtube.py +34 -17
- agno/tools/zendesk.py +15 -5
- agno/tools/zep.py +454 -0
- agno/tools/zoom.py +86 -37
- agno/tracing/__init__.py +12 -0
- agno/tracing/exporter.py +157 -0
- agno/tracing/schemas.py +276 -0
- agno/tracing/setup.py +111 -0
- agno/utils/agent.py +938 -0
- agno/utils/audio.py +37 -1
- agno/utils/certs.py +27 -0
- agno/utils/code_execution.py +11 -0
- agno/utils/common.py +103 -20
- agno/utils/cryptography.py +22 -0
- agno/utils/dttm.py +33 -0
- agno/utils/events.py +700 -0
- agno/utils/functions.py +107 -37
- agno/utils/gemini.py +426 -0
- agno/utils/hooks.py +171 -0
- agno/utils/http.py +185 -0
- agno/utils/json_schema.py +159 -37
- agno/utils/knowledge.py +36 -0
- agno/utils/location.py +19 -0
- agno/utils/log.py +221 -8
- agno/utils/mcp.py +214 -0
- agno/utils/media.py +335 -14
- agno/utils/merge_dict.py +22 -1
- agno/utils/message.py +77 -2
- agno/utils/models/ai_foundry.py +50 -0
- agno/utils/models/claude.py +373 -0
- agno/utils/models/cohere.py +94 -0
- agno/utils/models/llama.py +85 -0
- agno/utils/models/mistral.py +100 -0
- agno/utils/models/openai_responses.py +140 -0
- agno/utils/models/schema_utils.py +153 -0
- agno/utils/models/watsonx.py +41 -0
- agno/utils/openai.py +257 -0
- agno/utils/pickle.py +1 -1
- agno/utils/pprint.py +124 -8
- agno/utils/print_response/agent.py +930 -0
- agno/utils/print_response/team.py +1914 -0
- agno/utils/print_response/workflow.py +1668 -0
- agno/utils/prompts.py +111 -0
- agno/utils/reasoning.py +108 -0
- agno/utils/response.py +163 -0
- agno/utils/serialize.py +32 -0
- agno/utils/shell.py +4 -4
- agno/utils/streamlit.py +487 -0
- agno/utils/string.py +204 -51
- agno/utils/team.py +139 -0
- agno/utils/timer.py +9 -2
- agno/utils/tokens.py +657 -0
- agno/utils/tools.py +19 -1
- agno/utils/whatsapp.py +305 -0
- agno/utils/yaml_io.py +3 -3
- agno/vectordb/__init__.py +2 -0
- agno/vectordb/base.py +87 -9
- agno/vectordb/cassandra/__init__.py +5 -1
- agno/vectordb/cassandra/cassandra.py +383 -27
- agno/vectordb/chroma/__init__.py +4 -0
- agno/vectordb/chroma/chromadb.py +748 -83
- agno/vectordb/clickhouse/__init__.py +7 -1
- agno/vectordb/clickhouse/clickhousedb.py +554 -53
- agno/vectordb/couchbase/__init__.py +3 -0
- agno/vectordb/couchbase/couchbase.py +1446 -0
- agno/vectordb/lancedb/__init__.py +5 -0
- agno/vectordb/lancedb/lance_db.py +730 -98
- agno/vectordb/langchaindb/__init__.py +5 -0
- agno/vectordb/langchaindb/langchaindb.py +163 -0
- agno/vectordb/lightrag/__init__.py +5 -0
- agno/vectordb/lightrag/lightrag.py +388 -0
- agno/vectordb/llamaindex/__init__.py +3 -0
- agno/vectordb/llamaindex/llamaindexdb.py +166 -0
- agno/vectordb/milvus/__init__.py +3 -0
- agno/vectordb/milvus/milvus.py +966 -78
- agno/vectordb/mongodb/__init__.py +9 -1
- agno/vectordb/mongodb/mongodb.py +1175 -172
- agno/vectordb/pgvector/__init__.py +8 -0
- agno/vectordb/pgvector/pgvector.py +599 -115
- agno/vectordb/pineconedb/__init__.py +5 -1
- agno/vectordb/pineconedb/pineconedb.py +406 -43
- agno/vectordb/qdrant/__init__.py +4 -0
- agno/vectordb/qdrant/qdrant.py +914 -61
- agno/vectordb/redis/__init__.py +9 -0
- agno/vectordb/redis/redisdb.py +682 -0
- agno/vectordb/singlestore/__init__.py +8 -1
- agno/vectordb/singlestore/singlestore.py +771 -0
- agno/vectordb/surrealdb/__init__.py +3 -0
- agno/vectordb/surrealdb/surrealdb.py +663 -0
- agno/vectordb/upstashdb/__init__.py +5 -0
- agno/vectordb/upstashdb/upstashdb.py +718 -0
- agno/vectordb/weaviate/__init__.py +8 -0
- agno/vectordb/weaviate/index.py +15 -0
- agno/vectordb/weaviate/weaviate.py +1009 -0
- agno/workflow/__init__.py +23 -1
- agno/workflow/agent.py +299 -0
- agno/workflow/condition.py +759 -0
- agno/workflow/loop.py +756 -0
- agno/workflow/parallel.py +853 -0
- agno/workflow/router.py +723 -0
- agno/workflow/step.py +1564 -0
- agno/workflow/steps.py +613 -0
- agno/workflow/types.py +556 -0
- agno/workflow/workflow.py +4327 -514
- agno-2.3.13.dist-info/METADATA +639 -0
- agno-2.3.13.dist-info/RECORD +613 -0
- {agno-0.1.2.dist-info → agno-2.3.13.dist-info}/WHEEL +1 -1
- agno-2.3.13.dist-info/licenses/LICENSE +201 -0
- agno/api/playground.py +0 -91
- agno/api/schemas/playground.py +0 -22
- agno/api/schemas/user.py +0 -22
- agno/api/schemas/workspace.py +0 -46
- agno/api/user.py +0 -160
- agno/api/workspace.py +0 -151
- agno/cli/auth_server.py +0 -118
- agno/cli/config.py +0 -275
- agno/cli/console.py +0 -88
- agno/cli/credentials.py +0 -23
- agno/cli/entrypoint.py +0 -571
- agno/cli/operator.py +0 -355
- agno/cli/settings.py +0 -85
- agno/cli/ws/ws_cli.py +0 -817
- agno/constants.py +0 -13
- agno/document/__init__.py +0 -1
- agno/document/chunking/semantic.py +0 -47
- agno/document/chunking/strategy.py +0 -31
- agno/document/reader/__init__.py +0 -1
- agno/document/reader/arxiv_reader.py +0 -41
- agno/document/reader/base.py +0 -22
- agno/document/reader/csv_reader.py +0 -84
- agno/document/reader/docx_reader.py +0 -46
- agno/document/reader/firecrawl_reader.py +0 -99
- agno/document/reader/json_reader.py +0 -43
- agno/document/reader/pdf_reader.py +0 -219
- agno/document/reader/s3/pdf_reader.py +0 -46
- agno/document/reader/s3/text_reader.py +0 -51
- agno/document/reader/text_reader.py +0 -41
- agno/document/reader/website_reader.py +0 -175
- agno/document/reader/youtube_reader.py +0 -50
- agno/embedder/__init__.py +0 -1
- agno/embedder/azure_openai.py +0 -86
- agno/embedder/cohere.py +0 -72
- agno/embedder/fastembed.py +0 -37
- agno/embedder/google.py +0 -73
- agno/embedder/huggingface.py +0 -54
- agno/embedder/mistral.py +0 -80
- agno/embedder/ollama.py +0 -57
- agno/embedder/openai.py +0 -74
- agno/embedder/sentence_transformer.py +0 -38
- agno/embedder/voyageai.py +0 -64
- agno/eval/perf.py +0 -201
- agno/file/__init__.py +0 -1
- agno/file/file.py +0 -16
- agno/file/local/csv.py +0 -32
- agno/file/local/txt.py +0 -19
- agno/infra/app.py +0 -240
- agno/infra/base.py +0 -144
- agno/infra/context.py +0 -20
- agno/infra/db_app.py +0 -52
- agno/infra/resource.py +0 -205
- agno/infra/resources.py +0 -55
- agno/knowledge/agent.py +0 -230
- agno/knowledge/arxiv.py +0 -22
- agno/knowledge/combined.py +0 -22
- agno/knowledge/csv.py +0 -28
- agno/knowledge/csv_url.py +0 -19
- agno/knowledge/document.py +0 -20
- agno/knowledge/docx.py +0 -30
- agno/knowledge/json.py +0 -28
- agno/knowledge/langchain.py +0 -71
- agno/knowledge/llamaindex.py +0 -66
- agno/knowledge/pdf.py +0 -28
- agno/knowledge/pdf_url.py +0 -26
- agno/knowledge/s3/base.py +0 -60
- agno/knowledge/s3/pdf.py +0 -21
- agno/knowledge/s3/text.py +0 -23
- agno/knowledge/text.py +0 -30
- agno/knowledge/website.py +0 -88
- agno/knowledge/wikipedia.py +0 -31
- agno/knowledge/youtube.py +0 -22
- agno/memory/agent.py +0 -392
- agno/memory/classifier.py +0 -104
- agno/memory/db/__init__.py +0 -1
- agno/memory/db/base.py +0 -42
- agno/memory/db/mongodb.py +0 -189
- agno/memory/db/postgres.py +0 -203
- agno/memory/db/sqlite.py +0 -193
- agno/memory/memory.py +0 -15
- agno/memory/row.py +0 -36
- agno/memory/summarizer.py +0 -192
- agno/memory/summary.py +0 -19
- agno/memory/workflow.py +0 -38
- agno/models/google/gemini_openai.py +0 -26
- agno/models/ollama/hermes.py +0 -221
- agno/models/ollama/tools.py +0 -362
- agno/models/vertexai/gemini.py +0 -595
- agno/playground/__init__.py +0 -3
- agno/playground/async_router.py +0 -421
- agno/playground/deploy.py +0 -249
- agno/playground/operator.py +0 -92
- agno/playground/playground.py +0 -91
- agno/playground/schemas.py +0 -76
- agno/playground/serve.py +0 -55
- agno/playground/sync_router.py +0 -405
- agno/reasoning/agent.py +0 -68
- agno/run/response.py +0 -112
- agno/storage/agent/__init__.py +0 -0
- agno/storage/agent/base.py +0 -38
- agno/storage/agent/dynamodb.py +0 -350
- agno/storage/agent/json.py +0 -92
- agno/storage/agent/mongodb.py +0 -228
- agno/storage/agent/postgres.py +0 -367
- agno/storage/agent/session.py +0 -79
- agno/storage/agent/singlestore.py +0 -303
- agno/storage/agent/sqlite.py +0 -357
- agno/storage/agent/yaml.py +0 -93
- agno/storage/workflow/__init__.py +0 -0
- agno/storage/workflow/base.py +0 -40
- agno/storage/workflow/mongodb.py +0 -233
- agno/storage/workflow/postgres.py +0 -366
- agno/storage/workflow/session.py +0 -60
- agno/storage/workflow/sqlite.py +0 -359
- agno/tools/googlesearch.py +0 -88
- agno/utils/defaults.py +0 -57
- agno/utils/filesystem.py +0 -39
- agno/utils/git.py +0 -52
- agno/utils/json_io.py +0 -30
- agno/utils/load_env.py +0 -19
- agno/utils/py_io.py +0 -19
- agno/utils/pyproject.py +0 -18
- agno/utils/resource_filter.py +0 -31
- agno/vectordb/singlestore/s2vectordb.py +0 -390
- agno/vectordb/singlestore/s2vectordb2.py +0 -355
- agno/workspace/__init__.py +0 -0
- agno/workspace/config.py +0 -325
- agno/workspace/enums.py +0 -6
- agno/workspace/helpers.py +0 -48
- agno/workspace/operator.py +0 -758
- agno/workspace/settings.py +0 -63
- agno-0.1.2.dist-info/LICENSE +0 -375
- agno-0.1.2.dist-info/METADATA +0 -502
- agno-0.1.2.dist-info/RECORD +0 -352
- agno-0.1.2.dist-info/entry_points.txt +0 -3
- /agno/{cli → db/migrations}/__init__.py +0 -0
- /agno/{cli/ws → db/migrations/versions}/__init__.py +0 -0
- /agno/{document/chunking/__init__.py → db/schemas/metrics.py} +0 -0
- /agno/{document/reader/s3 → integrations}/__init__.py +0 -0
- /agno/{file/local → knowledge/chunking}/__init__.py +0 -0
- /agno/{infra → knowledge/remote_content}/__init__.py +0 -0
- /agno/{knowledge/s3 → tools/models}/__init__.py +0 -0
- /agno/{reranker → utils/models}/__init__.py +0 -0
- /agno/{storage → utils/print_response}/__init__.py +0 -0
- {agno-0.1.2.dist-info → agno-2.3.13.dist-info}/top_level.txt +0 -0
agno/api/workspace.py
DELETED
|
@@ -1,151 +0,0 @@
|
|
|
1
|
-
from typing import Dict, List, Optional, Union
|
|
2
|
-
|
|
3
|
-
from httpx import Response
|
|
4
|
-
|
|
5
|
-
from agno.api.api import api, invalid_response
|
|
6
|
-
from agno.api.routes import ApiRoutes
|
|
7
|
-
from agno.api.schemas.team import TeamIdentifier
|
|
8
|
-
from agno.api.schemas.user import UserSchema
|
|
9
|
-
from agno.api.schemas.workspace import (
|
|
10
|
-
WorkspaceCreate,
|
|
11
|
-
WorkspaceEvent,
|
|
12
|
-
WorkspaceSchema,
|
|
13
|
-
WorkspaceUpdate,
|
|
14
|
-
)
|
|
15
|
-
from agno.cli.settings import agno_cli_settings
|
|
16
|
-
from agno.utils.log import logger
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
def create_workspace_for_user(
|
|
20
|
-
user: UserSchema, workspace: WorkspaceCreate, team: Optional[TeamIdentifier] = None
|
|
21
|
-
) -> Optional[WorkspaceSchema]:
|
|
22
|
-
logger.debug("--**-- Creating workspace")
|
|
23
|
-
with api.AuthenticatedClient() as api_client:
|
|
24
|
-
try:
|
|
25
|
-
payload = {
|
|
26
|
-
"user": user.model_dump(include={"id_user", "email"}),
|
|
27
|
-
"workspace": workspace.model_dump(exclude_none=True),
|
|
28
|
-
}
|
|
29
|
-
if team is not None:
|
|
30
|
-
payload["team"] = team.model_dump(exclude_none=True)
|
|
31
|
-
|
|
32
|
-
r: Response = api_client.post(
|
|
33
|
-
ApiRoutes.WORKSPACE_CREATE,
|
|
34
|
-
json=payload,
|
|
35
|
-
timeout=2.0,
|
|
36
|
-
)
|
|
37
|
-
if invalid_response(r):
|
|
38
|
-
try:
|
|
39
|
-
error_msg = r.json().get("detail", "Permission denied")
|
|
40
|
-
except Exception:
|
|
41
|
-
error_msg = f"Could not create workspace: {r.text}"
|
|
42
|
-
logger.error(error_msg)
|
|
43
|
-
return None
|
|
44
|
-
|
|
45
|
-
response_json: Union[Dict, List] = r.json()
|
|
46
|
-
if response_json is None:
|
|
47
|
-
return None
|
|
48
|
-
|
|
49
|
-
created_workspace: WorkspaceSchema = WorkspaceSchema.model_validate(response_json)
|
|
50
|
-
if created_workspace is not None:
|
|
51
|
-
return created_workspace
|
|
52
|
-
except Exception as e:
|
|
53
|
-
logger.debug(f"Could not create workspace: {e}")
|
|
54
|
-
return None
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
def update_workspace_for_user(user: UserSchema, workspace: WorkspaceUpdate) -> Optional[WorkspaceSchema]:
|
|
58
|
-
logger.debug("--**-- Updating workspace for user")
|
|
59
|
-
with api.AuthenticatedClient() as api_client:
|
|
60
|
-
try:
|
|
61
|
-
payload = {
|
|
62
|
-
"user": user.model_dump(include={"id_user", "email"}),
|
|
63
|
-
"workspace": workspace.model_dump(exclude_none=True),
|
|
64
|
-
}
|
|
65
|
-
|
|
66
|
-
r: Response = api_client.post(
|
|
67
|
-
ApiRoutes.WORKSPACE_UPDATE,
|
|
68
|
-
json=payload,
|
|
69
|
-
)
|
|
70
|
-
if invalid_response(r):
|
|
71
|
-
try:
|
|
72
|
-
error_msg = r.json().get("detail", "Could not update workspace")
|
|
73
|
-
except Exception:
|
|
74
|
-
error_msg = f"Could not update workspace: {r.text}"
|
|
75
|
-
logger.error(error_msg)
|
|
76
|
-
return None
|
|
77
|
-
|
|
78
|
-
response_json: Union[Dict, List] = r.json()
|
|
79
|
-
if response_json is None:
|
|
80
|
-
return None
|
|
81
|
-
|
|
82
|
-
updated_workspace: WorkspaceSchema = WorkspaceSchema.model_validate(response_json)
|
|
83
|
-
if updated_workspace is not None:
|
|
84
|
-
return updated_workspace
|
|
85
|
-
except Exception as e:
|
|
86
|
-
logger.debug(f"Could not update workspace: {e}")
|
|
87
|
-
return None
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
def update_workspace_for_team(
|
|
91
|
-
user: UserSchema, workspace: WorkspaceUpdate, team: TeamIdentifier
|
|
92
|
-
) -> Optional[WorkspaceSchema]:
|
|
93
|
-
logger.debug("--**-- Updating workspace for team")
|
|
94
|
-
with api.AuthenticatedClient() as api_client:
|
|
95
|
-
try:
|
|
96
|
-
payload = {
|
|
97
|
-
"user": user.model_dump(include={"id_user", "email"}),
|
|
98
|
-
"team_workspace": workspace.model_dump(exclude_none=True).update({"id_team": team.id_team}),
|
|
99
|
-
}
|
|
100
|
-
|
|
101
|
-
r: Response = api_client.post(
|
|
102
|
-
ApiRoutes.WORKSPACE_UPDATE,
|
|
103
|
-
json=payload,
|
|
104
|
-
)
|
|
105
|
-
if invalid_response(r):
|
|
106
|
-
try:
|
|
107
|
-
error_msg = r.json().get("detail", "Could not update workspace")
|
|
108
|
-
except Exception:
|
|
109
|
-
error_msg = f"Could not update workspace: {r.text}"
|
|
110
|
-
logger.error(error_msg)
|
|
111
|
-
return None
|
|
112
|
-
|
|
113
|
-
response_json: Union[Dict, List] = r.json()
|
|
114
|
-
if response_json is None:
|
|
115
|
-
return None
|
|
116
|
-
|
|
117
|
-
updated_workspace: WorkspaceSchema = WorkspaceSchema.model_validate(response_json)
|
|
118
|
-
if updated_workspace is not None:
|
|
119
|
-
return updated_workspace
|
|
120
|
-
except Exception as e:
|
|
121
|
-
logger.debug(f"Could not update workspace: {e}")
|
|
122
|
-
return None
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
def log_workspace_event(user: UserSchema, workspace_event: WorkspaceEvent) -> bool:
|
|
126
|
-
if not agno_cli_settings.api_enabled:
|
|
127
|
-
return False
|
|
128
|
-
|
|
129
|
-
logger.debug("--**-- Log workspace event")
|
|
130
|
-
with api.AuthenticatedClient() as api_client:
|
|
131
|
-
try:
|
|
132
|
-
r: Response = api_client.post(
|
|
133
|
-
ApiRoutes.WORKSPACE_EVENT_CREATE,
|
|
134
|
-
json={
|
|
135
|
-
"user": user.model_dump(include={"id_user", "email"}),
|
|
136
|
-
"event": workspace_event.model_dump(exclude_none=True),
|
|
137
|
-
},
|
|
138
|
-
)
|
|
139
|
-
if invalid_response(r):
|
|
140
|
-
return False
|
|
141
|
-
|
|
142
|
-
response_json: Union[Dict, List] = r.json()
|
|
143
|
-
if response_json is None:
|
|
144
|
-
return False
|
|
145
|
-
|
|
146
|
-
if isinstance(response_json, dict) and response_json.get("status") == "success":
|
|
147
|
-
return True
|
|
148
|
-
return False
|
|
149
|
-
except Exception as e:
|
|
150
|
-
logger.debug(f"Could not log workspace event: {e}")
|
|
151
|
-
return False
|
agno/cli/auth_server.py
DELETED
|
@@ -1,118 +0,0 @@
|
|
|
1
|
-
from http.server import BaseHTTPRequestHandler, HTTPServer
|
|
2
|
-
from typing import Optional
|
|
3
|
-
|
|
4
|
-
from agno.cli.settings import agno_cli_settings
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
class CliAuthRequestHandler(BaseHTTPRequestHandler):
|
|
8
|
-
"""Request Handler to accept the CLI auth token after the web based auth flow.
|
|
9
|
-
References:
|
|
10
|
-
https://medium.com/@hasinthaindrajee/browser-sso-for-cli-applications-b0be743fa656
|
|
11
|
-
https://gist.github.com/mdonkers/63e115cc0c79b4f6b8b3a6b797e485c7
|
|
12
|
-
|
|
13
|
-
TODO:
|
|
14
|
-
* Fix the header and limit to only localhost or agno.com
|
|
15
|
-
"""
|
|
16
|
-
|
|
17
|
-
def _set_response(self):
|
|
18
|
-
self.send_response(204)
|
|
19
|
-
self.send_header("Access-Control-Allow-Origin", "*")
|
|
20
|
-
self.send_header("Access-Control-Allow-Headers", "*")
|
|
21
|
-
self.send_header("Access-Control-Allow-Methods", "POST")
|
|
22
|
-
self.end_headers()
|
|
23
|
-
|
|
24
|
-
# def do_GET(self):
|
|
25
|
-
# logger.info("GET request,\nPath: %s\nHeaders:\n%s\n", str(self.path), str(self.headers))
|
|
26
|
-
# self._set_response()
|
|
27
|
-
# self.wfile.write("GET request for {}".format(self.path).encode('utf-8'))
|
|
28
|
-
|
|
29
|
-
def do_OPTIONS(self):
|
|
30
|
-
# logger.debug(
|
|
31
|
-
# "OPTIONS request,\nPath: %s\nHeaders:\n%s\n",
|
|
32
|
-
# str(self.path),
|
|
33
|
-
# str(self.headers),
|
|
34
|
-
# )
|
|
35
|
-
self._set_response()
|
|
36
|
-
# self.wfile.write("OPTIONS request for {}".format(self.path).encode('utf-8'))
|
|
37
|
-
|
|
38
|
-
def do_POST(self):
|
|
39
|
-
content_length = int(self.headers["Content-Length"]) # <--- Gets the size of data
|
|
40
|
-
post_data = self.rfile.read(content_length) # <--- Gets the data itself
|
|
41
|
-
decoded_post_data = post_data.decode("utf-8")
|
|
42
|
-
# logger.debug(
|
|
43
|
-
# "POST request,\nPath: {}\nHeaders:\n{}\n\nBody:\n{}\n".format(
|
|
44
|
-
# str(self.path), str(self.headers), decoded_post_data
|
|
45
|
-
# )
|
|
46
|
-
# )
|
|
47
|
-
# logger.debug("Data: {}".format(decoded_post_data))
|
|
48
|
-
# logger.info("type: {}".format(type(post_data)))
|
|
49
|
-
agno_cli_settings.tmp_token_path.parent.mkdir(parents=True, exist_ok=True)
|
|
50
|
-
agno_cli_settings.tmp_token_path.touch(exist_ok=True)
|
|
51
|
-
agno_cli_settings.tmp_token_path.write_text(decoded_post_data)
|
|
52
|
-
# TODO: Add checks before shutting down the server
|
|
53
|
-
self.server.running = False # type: ignore
|
|
54
|
-
self._set_response()
|
|
55
|
-
|
|
56
|
-
def log_message(self, format, *args):
|
|
57
|
-
pass
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
class CliAuthServer:
|
|
61
|
-
"""
|
|
62
|
-
Source: https://stackoverflow.com/a/38196725/10953921
|
|
63
|
-
"""
|
|
64
|
-
|
|
65
|
-
def __init__(self, port: int = 9191):
|
|
66
|
-
import threading
|
|
67
|
-
|
|
68
|
-
self._server = HTTPServer(("", port), CliAuthRequestHandler)
|
|
69
|
-
self._thread = threading.Thread(target=self.run)
|
|
70
|
-
self._thread.daemon = True
|
|
71
|
-
self._server.running = False # type: ignore
|
|
72
|
-
|
|
73
|
-
def run(self):
|
|
74
|
-
self._server.running = True # type: ignore
|
|
75
|
-
while self._server.running: # type: ignore
|
|
76
|
-
self._server.handle_request()
|
|
77
|
-
|
|
78
|
-
def start(self):
|
|
79
|
-
self._thread.start()
|
|
80
|
-
|
|
81
|
-
def shut_down(self):
|
|
82
|
-
self._thread.close() # type: ignore
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
def check_port(port: int):
|
|
86
|
-
import socket
|
|
87
|
-
|
|
88
|
-
with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
|
|
89
|
-
try:
|
|
90
|
-
return s.connect_ex(("localhost", port)) == 0
|
|
91
|
-
except Exception as e:
|
|
92
|
-
print(f"Error occurred: {e}")
|
|
93
|
-
return False
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
def get_port_for_auth_server():
|
|
97
|
-
starting_port = 9191
|
|
98
|
-
for port in range(starting_port, starting_port + 100):
|
|
99
|
-
if not check_port(port):
|
|
100
|
-
return port
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
def get_auth_token_from_web_flow(port: int) -> Optional[str]:
|
|
104
|
-
"""
|
|
105
|
-
GET request: curl http://localhost:9191
|
|
106
|
-
POST request: curl -d "foo=bar&bin=baz" http://localhost:9191
|
|
107
|
-
"""
|
|
108
|
-
import json
|
|
109
|
-
|
|
110
|
-
server = CliAuthServer(port)
|
|
111
|
-
server.run()
|
|
112
|
-
|
|
113
|
-
if agno_cli_settings.tmp_token_path.exists() and agno_cli_settings.tmp_token_path.is_file():
|
|
114
|
-
auth_token_str = agno_cli_settings.tmp_token_path.read_text()
|
|
115
|
-
auth_token_json = json.loads(auth_token_str)
|
|
116
|
-
agno_cli_settings.tmp_token_path.unlink()
|
|
117
|
-
return auth_token_json.get("AuthToken", None)
|
|
118
|
-
return None
|
agno/cli/config.py
DELETED
|
@@ -1,275 +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.team import TeamSchema
|
|
6
|
-
from agno.api.schemas.user import UserSchema
|
|
7
|
-
from agno.api.schemas.workspace import WorkspaceSchema
|
|
8
|
-
from agno.cli.console import print_heading, print_info
|
|
9
|
-
from agno.cli.settings import agno_cli_settings
|
|
10
|
-
from agno.utils.json_io import read_json_file, write_json_file
|
|
11
|
-
from agno.utils.log import logger
|
|
12
|
-
from agno.workspace.config import WorkspaceConfig
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
class AgnoCliConfig:
|
|
16
|
-
"""The AgnoCliConfig class manages user data for the agno cli"""
|
|
17
|
-
|
|
18
|
-
def __init__(
|
|
19
|
-
self,
|
|
20
|
-
user: Optional[UserSchema] = None,
|
|
21
|
-
active_ws_dir: Optional[str] = None,
|
|
22
|
-
ws_config_map: Optional[Dict[str, WorkspaceConfig]] = None,
|
|
23
|
-
) -> None:
|
|
24
|
-
# Current user, populated after authenticating with the api
|
|
25
|
-
# To add a user, use the user setter
|
|
26
|
-
self._user: Optional[UserSchema] = user
|
|
27
|
-
|
|
28
|
-
# Active ws dir - used as the default for `ag` commands
|
|
29
|
-
# To add an active workspace, use the active_ws_dir setter
|
|
30
|
-
self._active_ws_dir: Optional[str] = active_ws_dir
|
|
31
|
-
|
|
32
|
-
# Mapping from ws_root_path to ws_config
|
|
33
|
-
self.ws_config_map: Dict[str, WorkspaceConfig] = ws_config_map or OrderedDict()
|
|
34
|
-
|
|
35
|
-
######################################################
|
|
36
|
-
## User functions
|
|
37
|
-
######################################################
|
|
38
|
-
|
|
39
|
-
@property
|
|
40
|
-
def user(self) -> Optional[UserSchema]:
|
|
41
|
-
return self._user
|
|
42
|
-
|
|
43
|
-
@user.setter
|
|
44
|
-
def user(self, user: Optional[UserSchema]) -> None:
|
|
45
|
-
"""Sets the user"""
|
|
46
|
-
if user is not None:
|
|
47
|
-
logger.debug(f"Setting user to: {user.email}")
|
|
48
|
-
clear_user_cache = (
|
|
49
|
-
self._user is not None # previous user is not None
|
|
50
|
-
and self._user.email != "anon" # previous user is not anon
|
|
51
|
-
and (user.email != self._user.email or user.id_user != self._user.id_user) # new user is different
|
|
52
|
-
)
|
|
53
|
-
self._user = user
|
|
54
|
-
if clear_user_cache:
|
|
55
|
-
self.clear_user_cache()
|
|
56
|
-
self.save_config()
|
|
57
|
-
|
|
58
|
-
def clear_user_cache(self) -> None:
|
|
59
|
-
"""Clears the user cache"""
|
|
60
|
-
logger.debug("Clearing user cache")
|
|
61
|
-
self.ws_config_map.clear()
|
|
62
|
-
self._active_ws_dir = None
|
|
63
|
-
agno_cli_settings.ai_conversations_path.unlink(missing_ok=True)
|
|
64
|
-
logger.info("Workspaces cleared, please setup again using `ag ws setup`")
|
|
65
|
-
|
|
66
|
-
######################################################
|
|
67
|
-
## Workspace functions
|
|
68
|
-
######################################################
|
|
69
|
-
|
|
70
|
-
@property
|
|
71
|
-
def active_ws_dir(self) -> Optional[str]:
|
|
72
|
-
return self._active_ws_dir
|
|
73
|
-
|
|
74
|
-
def set_active_ws_dir(self, ws_root_path: Optional[Path]) -> None:
|
|
75
|
-
if ws_root_path is not None:
|
|
76
|
-
logger.debug(f"Setting active workspace to: {str(ws_root_path)}")
|
|
77
|
-
self._active_ws_dir = str(ws_root_path)
|
|
78
|
-
self.save_config()
|
|
79
|
-
|
|
80
|
-
@property
|
|
81
|
-
def available_ws(self) -> List[WorkspaceConfig]:
|
|
82
|
-
return list(self.ws_config_map.values())
|
|
83
|
-
|
|
84
|
-
def _add_or_update_ws_config(
|
|
85
|
-
self,
|
|
86
|
-
ws_root_path: Path,
|
|
87
|
-
ws_schema: Optional[WorkspaceSchema] = None,
|
|
88
|
-
ws_team: Optional[TeamSchema] = None,
|
|
89
|
-
ws_api_key: Optional[str] = None,
|
|
90
|
-
) -> Optional[WorkspaceConfig]:
|
|
91
|
-
"""The main function to create, update or refresh a WorkspaceConfig.
|
|
92
|
-
|
|
93
|
-
This function does not call self.save_config(). Remember to save_config() after calling this function.
|
|
94
|
-
"""
|
|
95
|
-
|
|
96
|
-
# Validate ws_root_path
|
|
97
|
-
if ws_root_path is None or not isinstance(ws_root_path, Path):
|
|
98
|
-
raise ValueError(f"Invalid ws_root: {ws_root_path}")
|
|
99
|
-
ws_root_str = str(ws_root_path)
|
|
100
|
-
|
|
101
|
-
######################################################
|
|
102
|
-
# Create new ws_config if one does not exist
|
|
103
|
-
######################################################
|
|
104
|
-
if ws_root_str not in self.ws_config_map:
|
|
105
|
-
logger.debug(f"Creating workspace at: {ws_root_str}")
|
|
106
|
-
new_workspace_config = WorkspaceConfig(
|
|
107
|
-
ws_root_path=ws_root_path,
|
|
108
|
-
ws_schema=ws_schema,
|
|
109
|
-
ws_team=ws_team,
|
|
110
|
-
ws_api_key=ws_api_key,
|
|
111
|
-
)
|
|
112
|
-
self.ws_config_map[ws_root_str] = new_workspace_config
|
|
113
|
-
logger.debug(f"Workspace created at: {ws_root_str}")
|
|
114
|
-
|
|
115
|
-
# Return the new_workspace_config
|
|
116
|
-
return new_workspace_config
|
|
117
|
-
|
|
118
|
-
######################################################
|
|
119
|
-
# Update ws_config
|
|
120
|
-
######################################################
|
|
121
|
-
logger.debug(f"Updating workspace at: {ws_root_str}")
|
|
122
|
-
# By this point there should be a WorkspaceConfig object for this ws_name
|
|
123
|
-
existing_ws_config: Optional[WorkspaceConfig] = self.ws_config_map.get(ws_root_str, None)
|
|
124
|
-
if existing_ws_config is None:
|
|
125
|
-
logger.error(f"Could not find workspace at: {ws_root_str}, please run `ag ws setup`")
|
|
126
|
-
return None
|
|
127
|
-
|
|
128
|
-
# Update the ws_schema if it's not None and different from the existing one
|
|
129
|
-
if ws_schema is not None and existing_ws_config.ws_schema != ws_schema:
|
|
130
|
-
existing_ws_config.ws_schema = ws_schema
|
|
131
|
-
|
|
132
|
-
# Update the ws_team if it's not None and different from the existing one
|
|
133
|
-
if ws_team is not None and existing_ws_config.ws_team != ws_team:
|
|
134
|
-
existing_ws_config.ws_team = ws_team
|
|
135
|
-
|
|
136
|
-
# Update the ws_api_key if it's not None and different from the existing one
|
|
137
|
-
if ws_api_key is not None and existing_ws_config.ws_api_key != ws_api_key:
|
|
138
|
-
existing_ws_config.ws_api_key = ws_api_key
|
|
139
|
-
|
|
140
|
-
# Swap the existing ws_config with the updated one
|
|
141
|
-
self.ws_config_map[ws_root_str] = existing_ws_config
|
|
142
|
-
|
|
143
|
-
# Return the updated_ws_config
|
|
144
|
-
return existing_ws_config
|
|
145
|
-
|
|
146
|
-
def add_new_ws_to_config(
|
|
147
|
-
self, ws_root_path: Path, ws_team: Optional[TeamSchema] = None
|
|
148
|
-
) -> Optional[WorkspaceConfig]:
|
|
149
|
-
"""Adds a newly created workspace to the AgnoCliConfig"""
|
|
150
|
-
|
|
151
|
-
ws_config = self._add_or_update_ws_config(ws_root_path=ws_root_path, ws_team=ws_team)
|
|
152
|
-
self.save_config()
|
|
153
|
-
return ws_config
|
|
154
|
-
|
|
155
|
-
def create_or_update_ws_config(
|
|
156
|
-
self,
|
|
157
|
-
ws_root_path: Path,
|
|
158
|
-
ws_schema: Optional[WorkspaceSchema] = None,
|
|
159
|
-
ws_team: Optional[TeamSchema] = None,
|
|
160
|
-
set_as_active: bool = True,
|
|
161
|
-
) -> Optional[WorkspaceConfig]:
|
|
162
|
-
"""Creates or updates a WorkspaceConfig and returns the WorkspaceConfig"""
|
|
163
|
-
|
|
164
|
-
ws_config = self._add_or_update_ws_config(
|
|
165
|
-
ws_root_path=ws_root_path,
|
|
166
|
-
ws_schema=ws_schema,
|
|
167
|
-
ws_team=ws_team,
|
|
168
|
-
)
|
|
169
|
-
if set_as_active:
|
|
170
|
-
self._active_ws_dir = str(ws_root_path)
|
|
171
|
-
self.save_config()
|
|
172
|
-
return ws_config
|
|
173
|
-
|
|
174
|
-
def delete_ws(self, ws_root_path: Path) -> None:
|
|
175
|
-
"""Handles Deleting a workspace from the AgnoCliConfig and api"""
|
|
176
|
-
|
|
177
|
-
ws_root_str = str(ws_root_path)
|
|
178
|
-
print_heading(f"Deleting record for workspace: {ws_root_str}")
|
|
179
|
-
|
|
180
|
-
ws_config: Optional[WorkspaceConfig] = self.ws_config_map.pop(ws_root_str, None)
|
|
181
|
-
if ws_config is None:
|
|
182
|
-
logger.warning(f"No record of workspace at {ws_root_str}")
|
|
183
|
-
return
|
|
184
|
-
|
|
185
|
-
# Check if we're deleting the active workspace, if yes, unset the active ws
|
|
186
|
-
if self._active_ws_dir is not None and self._active_ws_dir == ws_root_str:
|
|
187
|
-
print_info(f"Removing {ws_root_str} as the active workspace")
|
|
188
|
-
self._active_ws_dir = None
|
|
189
|
-
self.save_config()
|
|
190
|
-
print_info("Workspace record deleted")
|
|
191
|
-
print_info("Note: this does not delete any data locally or from agno.com, please delete them manually\n")
|
|
192
|
-
|
|
193
|
-
def get_ws_config_by_dir_name(self, ws_dir_name: str) -> Optional[WorkspaceConfig]:
|
|
194
|
-
ws_root_str: Optional[str] = None
|
|
195
|
-
for k, v in self.ws_config_map.items():
|
|
196
|
-
if v.ws_root_path.stem == ws_dir_name:
|
|
197
|
-
ws_root_str = k
|
|
198
|
-
break
|
|
199
|
-
|
|
200
|
-
if ws_root_str is None or ws_root_str not in self.ws_config_map:
|
|
201
|
-
return None
|
|
202
|
-
|
|
203
|
-
return self.ws_config_map[ws_root_str]
|
|
204
|
-
|
|
205
|
-
def get_ws_config_by_path(self, ws_root_path: Path) -> Optional[WorkspaceConfig]:
|
|
206
|
-
return self.ws_config_map[str(ws_root_path)] if str(ws_root_path) in self.ws_config_map else None
|
|
207
|
-
|
|
208
|
-
def get_active_ws_config(self) -> Optional[WorkspaceConfig]:
|
|
209
|
-
if self.active_ws_dir is not None and self.active_ws_dir in self.ws_config_map:
|
|
210
|
-
return self.ws_config_map[self.active_ws_dir]
|
|
211
|
-
return None
|
|
212
|
-
|
|
213
|
-
######################################################
|
|
214
|
-
## Save AgnoCliConfig
|
|
215
|
-
######################################################
|
|
216
|
-
|
|
217
|
-
def save_config(self):
|
|
218
|
-
config_data = {
|
|
219
|
-
"user": self.user.model_dump() if self.user else None,
|
|
220
|
-
"active_ws_dir": self.active_ws_dir,
|
|
221
|
-
"ws_config_map": {k: v.to_dict() for k, v in self.ws_config_map.items()},
|
|
222
|
-
}
|
|
223
|
-
write_json_file(file_path=agno_cli_settings.config_file_path, data=config_data)
|
|
224
|
-
|
|
225
|
-
@classmethod
|
|
226
|
-
def from_saved_config(cls) -> Optional["AgnoCliConfig"]:
|
|
227
|
-
try:
|
|
228
|
-
config_data = read_json_file(file_path=agno_cli_settings.config_file_path)
|
|
229
|
-
if config_data is None or not isinstance(config_data, dict):
|
|
230
|
-
logger.debug("No config found")
|
|
231
|
-
return None
|
|
232
|
-
|
|
233
|
-
user_dict = config_data.get("user")
|
|
234
|
-
user_schema = UserSchema.model_validate(user_dict) if user_dict else None
|
|
235
|
-
active_ws_dir = config_data.get("active_ws_dir")
|
|
236
|
-
|
|
237
|
-
# Create a new config
|
|
238
|
-
new_config = cls(user_schema, active_ws_dir)
|
|
239
|
-
|
|
240
|
-
# Add all the workspaces
|
|
241
|
-
for k, v in config_data.get("ws_config_map", {}).items():
|
|
242
|
-
_ws_config = WorkspaceConfig.model_validate(v)
|
|
243
|
-
if _ws_config is not None:
|
|
244
|
-
new_config.ws_config_map[k] = _ws_config
|
|
245
|
-
return new_config
|
|
246
|
-
except Exception as e:
|
|
247
|
-
logger.warning(e)
|
|
248
|
-
logger.warning("Please setup the workspace using `ag ws setup`")
|
|
249
|
-
return None
|
|
250
|
-
|
|
251
|
-
######################################################
|
|
252
|
-
## Print AgnoCliConfig
|
|
253
|
-
######################################################
|
|
254
|
-
|
|
255
|
-
def print_to_cli(self, show_all: bool = False):
|
|
256
|
-
if self.user:
|
|
257
|
-
print_heading(f"User: {self.user.email}\n")
|
|
258
|
-
if self.active_ws_dir:
|
|
259
|
-
print_heading(f"Active workspace directory: {self.active_ws_dir}\n")
|
|
260
|
-
else:
|
|
261
|
-
print_info("No active workspace found.")
|
|
262
|
-
print_info(
|
|
263
|
-
"Please create a workspace using `ag ws create` or setup an existing workspace using `ag ws setup`"
|
|
264
|
-
)
|
|
265
|
-
|
|
266
|
-
if show_all and len(self.ws_config_map) > 0:
|
|
267
|
-
print_heading("Available workspaces:\n")
|
|
268
|
-
c = 1
|
|
269
|
-
for k, v in self.ws_config_map.items():
|
|
270
|
-
print_info(f" {c}. Path: {k}")
|
|
271
|
-
if v.ws_schema and v.ws_schema.ws_name:
|
|
272
|
-
print_info(f" Name: {v.ws_schema.ws_name}")
|
|
273
|
-
if v.ws_team and v.ws_team.name:
|
|
274
|
-
print_info(f" Team: {v.ws_team.name}")
|
|
275
|
-
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
|