agno 1.8.0__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.
- agno/__init__.py +8 -0
- agno/agent/__init__.py +19 -27
- agno/agent/agent.py +2781 -4126
- agno/api/agent.py +9 -65
- agno/api/api.py +5 -46
- agno/api/evals.py +6 -17
- agno/api/os.py +17 -0
- agno/api/routes.py +6 -41
- agno/api/schemas/__init__.py +9 -0
- agno/api/schemas/agent.py +5 -21
- agno/api/schemas/evals.py +7 -16
- agno/api/schemas/os.py +14 -0
- agno/api/schemas/team.py +5 -21
- agno/api/schemas/utils.py +21 -0
- agno/api/schemas/workflows.py +11 -7
- agno/api/settings.py +53 -0
- agno/api/team.py +9 -64
- 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/db/__init__.py +24 -0
- agno/db/base.py +245 -0
- agno/db/dynamo/__init__.py +3 -0
- agno/db/dynamo/dynamo.py +1749 -0
- agno/db/dynamo/schemas.py +278 -0
- agno/db/dynamo/utils.py +684 -0
- agno/db/firestore/__init__.py +3 -0
- agno/db/firestore/firestore.py +1438 -0
- agno/db/firestore/schemas.py +130 -0
- agno/db/firestore/utils.py +278 -0
- agno/db/gcs_json/__init__.py +3 -0
- agno/db/gcs_json/gcs_json_db.py +1001 -0
- agno/db/gcs_json/utils.py +194 -0
- agno/db/in_memory/__init__.py +3 -0
- agno/db/in_memory/in_memory_db.py +888 -0
- agno/db/in_memory/utils.py +172 -0
- agno/db/json/__init__.py +3 -0
- agno/db/json/json_db.py +1051 -0
- agno/db/json/utils.py +196 -0
- agno/db/migrations/v1_to_v2.py +162 -0
- agno/db/mongo/__init__.py +3 -0
- agno/db/mongo/mongo.py +1417 -0
- agno/db/mongo/schemas.py +77 -0
- agno/db/mongo/utils.py +204 -0
- agno/db/mysql/__init__.py +3 -0
- agno/db/mysql/mysql.py +1719 -0
- agno/db/mysql/schemas.py +124 -0
- agno/db/mysql/utils.py +298 -0
- agno/db/postgres/__init__.py +3 -0
- agno/db/postgres/postgres.py +1720 -0
- agno/db/postgres/schemas.py +124 -0
- agno/db/postgres/utils.py +281 -0
- agno/db/redis/__init__.py +3 -0
- agno/db/redis/redis.py +1371 -0
- agno/db/redis/schemas.py +109 -0
- agno/db/redis/utils.py +288 -0
- agno/db/schemas/__init__.py +3 -0
- agno/db/schemas/evals.py +33 -0
- agno/db/schemas/knowledge.py +40 -0
- agno/db/schemas/memory.py +46 -0
- agno/db/singlestore/__init__.py +3 -0
- agno/db/singlestore/schemas.py +116 -0
- agno/db/singlestore/singlestore.py +1722 -0
- agno/db/singlestore/utils.py +327 -0
- agno/db/sqlite/__init__.py +3 -0
- agno/db/sqlite/schemas.py +119 -0
- agno/db/sqlite/sqlite.py +1680 -0
- agno/db/sqlite/utils.py +269 -0
- agno/db/utils.py +88 -0
- agno/eval/__init__.py +14 -0
- agno/eval/accuracy.py +142 -43
- agno/eval/performance.py +88 -23
- agno/eval/reliability.py +73 -20
- agno/eval/utils.py +23 -13
- agno/integrations/discord/__init__.py +3 -0
- agno/{app → integrations}/discord/client.py +10 -10
- agno/knowledge/__init__.py +2 -2
- agno/{document → knowledge}/chunking/agentic.py +2 -2
- agno/{document → knowledge}/chunking/document.py +2 -2
- agno/{document → knowledge}/chunking/fixed.py +3 -3
- agno/{document → knowledge}/chunking/markdown.py +2 -2
- agno/{document → knowledge}/chunking/recursive.py +2 -2
- agno/{document → knowledge}/chunking/row.py +2 -2
- agno/knowledge/chunking/semantic.py +59 -0
- agno/knowledge/chunking/strategy.py +121 -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/{embedder → knowledge/embedder}/aws_bedrock.py +127 -1
- agno/{embedder → knowledge/embedder}/azure_openai.py +65 -1
- agno/{embedder → knowledge/embedder}/base.py +6 -0
- agno/{embedder → knowledge/embedder}/cohere.py +72 -1
- agno/{embedder → knowledge/embedder}/fastembed.py +17 -1
- agno/{embedder → knowledge/embedder}/fireworks.py +1 -1
- agno/{embedder → knowledge/embedder}/google.py +74 -1
- agno/{embedder → knowledge/embedder}/huggingface.py +36 -2
- agno/{embedder → knowledge/embedder}/jina.py +48 -2
- agno/knowledge/embedder/langdb.py +22 -0
- agno/knowledge/embedder/mistral.py +139 -0
- agno/{embedder → knowledge/embedder}/nebius.py +1 -1
- agno/{embedder → knowledge/embedder}/ollama.py +54 -3
- agno/knowledge/embedder/openai.py +223 -0
- agno/{embedder → knowledge/embedder}/sentence_transformer.py +16 -1
- agno/{embedder → knowledge/embedder}/together.py +1 -1
- agno/{embedder → knowledge/embedder}/voyageai.py +49 -1
- agno/knowledge/knowledge.py +1515 -0
- agno/knowledge/reader/__init__.py +7 -0
- agno/{document → knowledge}/reader/arxiv_reader.py +32 -4
- agno/knowledge/reader/base.py +88 -0
- agno/{document → knowledge}/reader/csv_reader.py +68 -15
- agno/knowledge/reader/docx_reader.py +83 -0
- agno/{document → knowledge}/reader/firecrawl_reader.py +42 -21
- agno/knowledge/reader/gcs_reader.py +67 -0
- agno/{document → knowledge}/reader/json_reader.py +30 -9
- agno/{document → knowledge}/reader/markdown_reader.py +36 -9
- agno/{document → knowledge}/reader/pdf_reader.py +79 -21
- agno/knowledge/reader/reader_factory.py +275 -0
- agno/knowledge/reader/s3_reader.py +171 -0
- agno/{document → knowledge}/reader/text_reader.py +31 -10
- agno/knowledge/reader/url_reader.py +84 -0
- agno/knowledge/reader/web_search_reader.py +389 -0
- agno/{document → knowledge}/reader/website_reader.py +37 -10
- agno/knowledge/reader/wikipedia_reader.py +59 -0
- agno/knowledge/reader/youtube_reader.py +78 -0
- agno/knowledge/remote_content/remote_content.py +88 -0
- agno/{reranker → knowledge/reranker}/base.py +1 -1
- agno/{reranker → knowledge/reranker}/cohere.py +2 -2
- agno/{reranker → knowledge/reranker}/infinity.py +2 -2
- agno/{reranker → knowledge/reranker}/sentence_transformer.py +2 -2
- agno/knowledge/types.py +30 -0
- agno/knowledge/utils.py +169 -0
- agno/media.py +2 -2
- agno/memory/__init__.py +2 -10
- agno/memory/manager.py +1003 -148
- agno/models/aimlapi/__init__.py +2 -2
- agno/models/aimlapi/aimlapi.py +6 -6
- agno/models/anthropic/claude.py +129 -82
- agno/models/aws/bedrock.py +107 -175
- agno/models/aws/claude.py +64 -18
- agno/models/azure/ai_foundry.py +73 -23
- agno/models/base.py +347 -287
- agno/models/cerebras/cerebras.py +84 -27
- agno/models/cohere/chat.py +106 -98
- agno/models/dashscope/dashscope.py +14 -5
- agno/models/google/gemini.py +123 -53
- agno/models/groq/groq.py +97 -35
- agno/models/huggingface/huggingface.py +92 -27
- agno/models/ibm/watsonx.py +72 -13
- agno/models/litellm/chat.py +85 -13
- agno/models/message.py +38 -144
- agno/models/meta/llama.py +85 -49
- agno/models/metrics.py +120 -0
- agno/models/mistral/mistral.py +90 -21
- agno/models/ollama/__init__.py +0 -2
- agno/models/ollama/chat.py +84 -46
- agno/models/openai/chat.py +135 -27
- agno/models/openai/responses.py +233 -115
- agno/models/perplexity/perplexity.py +26 -2
- agno/models/portkey/portkey.py +0 -7
- agno/models/response.py +14 -8
- agno/models/utils.py +20 -0
- agno/models/vercel/__init__.py +2 -2
- agno/models/vercel/v0.py +1 -1
- agno/models/vllm/__init__.py +2 -2
- agno/models/vllm/vllm.py +3 -3
- agno/models/xai/xai.py +10 -10
- agno/os/__init__.py +3 -0
- agno/os/app.py +393 -0
- agno/os/auth.py +47 -0
- agno/os/config.py +103 -0
- agno/os/interfaces/agui/__init__.py +3 -0
- agno/os/interfaces/agui/agui.py +31 -0
- agno/{app/agui/async_router.py → os/interfaces/agui/router.py} +16 -16
- agno/{app → os/interfaces}/agui/utils.py +65 -28
- agno/os/interfaces/base.py +21 -0
- agno/os/interfaces/slack/__init__.py +3 -0
- agno/{app/slack/async_router.py → os/interfaces/slack/router.py} +3 -5
- agno/os/interfaces/slack/slack.py +33 -0
- agno/os/interfaces/whatsapp/__init__.py +3 -0
- agno/{app/whatsapp/async_router.py → os/interfaces/whatsapp/router.py} +4 -7
- agno/os/interfaces/whatsapp/whatsapp.py +30 -0
- agno/os/router.py +843 -0
- agno/os/routers/__init__.py +3 -0
- agno/os/routers/evals/__init__.py +3 -0
- agno/os/routers/evals/evals.py +204 -0
- agno/os/routers/evals/schemas.py +142 -0
- agno/os/routers/evals/utils.py +161 -0
- agno/os/routers/knowledge/__init__.py +3 -0
- agno/os/routers/knowledge/knowledge.py +413 -0
- agno/os/routers/knowledge/schemas.py +118 -0
- agno/os/routers/memory/__init__.py +3 -0
- agno/os/routers/memory/memory.py +179 -0
- agno/os/routers/memory/schemas.py +58 -0
- agno/os/routers/metrics/__init__.py +3 -0
- agno/os/routers/metrics/metrics.py +58 -0
- agno/os/routers/metrics/schemas.py +47 -0
- agno/os/routers/session/__init__.py +3 -0
- agno/os/routers/session/session.py +163 -0
- agno/os/schema.py +892 -0
- agno/{app/playground → os}/settings.py +8 -15
- agno/os/utils.py +270 -0
- agno/reasoning/azure_ai_foundry.py +4 -4
- agno/reasoning/deepseek.py +4 -4
- agno/reasoning/default.py +6 -11
- agno/reasoning/groq.py +4 -4
- agno/reasoning/helpers.py +4 -6
- agno/reasoning/ollama.py +4 -4
- agno/reasoning/openai.py +4 -4
- agno/run/{response.py → agent.py} +144 -72
- agno/run/base.py +44 -58
- agno/run/cancel.py +83 -0
- agno/run/team.py +133 -77
- agno/run/workflow.py +537 -12
- agno/session/__init__.py +10 -0
- agno/session/agent.py +244 -0
- agno/session/summary.py +225 -0
- agno/session/team.py +262 -0
- agno/{storage/session/v2 → session}/workflow.py +47 -24
- agno/team/__init__.py +15 -16
- agno/team/team.py +2967 -4243
- agno/tools/agentql.py +14 -5
- agno/tools/airflow.py +9 -4
- agno/tools/api.py +7 -3
- agno/tools/apify.py +2 -46
- agno/tools/arxiv.py +8 -3
- agno/tools/aws_lambda.py +7 -5
- agno/tools/aws_ses.py +7 -1
- agno/tools/baidusearch.py +4 -1
- agno/tools/bitbucket.py +4 -4
- agno/tools/brandfetch.py +14 -11
- agno/tools/bravesearch.py +4 -1
- agno/tools/brightdata.py +42 -22
- agno/tools/browserbase.py +13 -4
- agno/tools/calcom.py +12 -10
- agno/tools/calculator.py +10 -27
- agno/tools/cartesia.py +18 -13
- agno/tools/{clickup_tool.py → clickup.py} +12 -25
- agno/tools/confluence.py +71 -18
- agno/tools/crawl4ai.py +7 -1
- agno/tools/csv_toolkit.py +9 -8
- agno/tools/dalle.py +18 -11
- agno/tools/daytona.py +13 -16
- agno/tools/decorator.py +6 -3
- agno/tools/desi_vocal.py +16 -7
- agno/tools/discord.py +11 -8
- agno/tools/docker.py +30 -42
- agno/tools/duckdb.py +34 -53
- agno/tools/duckduckgo.py +8 -7
- agno/tools/e2b.py +62 -62
- agno/tools/eleven_labs.py +35 -28
- agno/tools/email.py +4 -1
- agno/tools/evm.py +7 -1
- agno/tools/exa.py +19 -14
- agno/tools/fal.py +29 -29
- agno/tools/file.py +9 -8
- agno/tools/financial_datasets.py +25 -44
- agno/tools/firecrawl.py +22 -22
- agno/tools/function.py +68 -17
- agno/tools/giphy.py +22 -10
- agno/tools/github.py +48 -126
- agno/tools/gmail.py +46 -62
- agno/tools/google_bigquery.py +7 -6
- agno/tools/google_maps.py +11 -26
- agno/tools/googlesearch.py +7 -2
- agno/tools/googlesheets.py +21 -17
- agno/tools/hackernews.py +9 -5
- agno/tools/jina.py +5 -4
- agno/tools/jira.py +18 -9
- agno/tools/knowledge.py +31 -32
- agno/tools/linear.py +18 -33
- agno/tools/linkup.py +5 -1
- agno/tools/local_file_system.py +8 -5
- agno/tools/lumalab.py +31 -19
- agno/tools/mem0.py +18 -12
- agno/tools/memori.py +14 -10
- agno/tools/mlx_transcribe.py +3 -2
- agno/tools/models/azure_openai.py +32 -14
- agno/tools/models/gemini.py +58 -31
- agno/tools/models/groq.py +29 -20
- agno/tools/models/nebius.py +27 -11
- agno/tools/models_labs.py +39 -15
- agno/tools/moviepy_video.py +7 -6
- agno/tools/neo4j.py +134 -0
- agno/tools/newspaper.py +7 -2
- agno/tools/newspaper4k.py +8 -3
- agno/tools/openai.py +57 -26
- agno/tools/openbb.py +12 -11
- agno/tools/opencv.py +62 -46
- agno/tools/openweather.py +14 -12
- agno/tools/pandas.py +11 -3
- agno/tools/postgres.py +4 -12
- agno/tools/pubmed.py +4 -1
- agno/tools/python.py +9 -22
- agno/tools/reasoning.py +35 -27
- agno/tools/reddit.py +11 -26
- agno/tools/replicate.py +54 -41
- agno/tools/resend.py +4 -1
- agno/tools/scrapegraph.py +15 -14
- agno/tools/searxng.py +10 -23
- agno/tools/serpapi.py +6 -3
- agno/tools/serper.py +13 -4
- agno/tools/shell.py +9 -2
- agno/tools/slack.py +12 -11
- agno/tools/sleep.py +3 -2
- agno/tools/spider.py +24 -4
- agno/tools/sql.py +7 -6
- agno/tools/tavily.py +6 -4
- agno/tools/telegram.py +12 -4
- agno/tools/todoist.py +11 -31
- agno/tools/toolkit.py +1 -1
- agno/tools/trafilatura.py +22 -6
- agno/tools/trello.py +9 -22
- agno/tools/twilio.py +10 -3
- agno/tools/user_control_flow.py +6 -1
- agno/tools/valyu.py +34 -5
- agno/tools/visualization.py +19 -28
- agno/tools/webbrowser.py +4 -3
- agno/tools/webex.py +11 -7
- agno/tools/website.py +15 -46
- agno/tools/webtools.py +12 -4
- agno/tools/whatsapp.py +5 -9
- agno/tools/wikipedia.py +20 -13
- agno/tools/x.py +14 -13
- agno/tools/yfinance.py +13 -40
- agno/tools/youtube.py +26 -20
- agno/tools/zendesk.py +7 -2
- agno/tools/zep.py +10 -7
- agno/tools/zoom.py +10 -9
- agno/utils/common.py +1 -19
- agno/utils/events.py +95 -118
- agno/utils/knowledge.py +29 -0
- agno/utils/location.py +2 -2
- agno/utils/log.py +2 -2
- agno/utils/mcp.py +11 -5
- agno/utils/media.py +39 -0
- agno/utils/message.py +12 -1
- agno/utils/models/claude.py +6 -4
- agno/utils/models/mistral.py +8 -7
- agno/utils/models/schema_utils.py +3 -3
- agno/utils/pprint.py +33 -32
- agno/utils/print_response/agent.py +779 -0
- agno/utils/print_response/team.py +1565 -0
- agno/utils/print_response/workflow.py +1451 -0
- agno/utils/prompts.py +14 -14
- agno/utils/reasoning.py +87 -0
- agno/utils/response.py +42 -42
- agno/utils/string.py +8 -22
- agno/utils/team.py +50 -0
- agno/utils/timer.py +2 -2
- agno/vectordb/base.py +33 -21
- agno/vectordb/cassandra/cassandra.py +287 -23
- agno/vectordb/chroma/chromadb.py +482 -59
- agno/vectordb/clickhouse/clickhousedb.py +270 -63
- agno/vectordb/couchbase/couchbase.py +309 -29
- agno/vectordb/lancedb/lance_db.py +360 -21
- agno/vectordb/langchaindb/__init__.py +5 -0
- agno/vectordb/langchaindb/langchaindb.py +145 -0
- agno/vectordb/lightrag/__init__.py +5 -0
- agno/vectordb/lightrag/lightrag.py +374 -0
- agno/vectordb/llamaindex/llamaindexdb.py +127 -0
- agno/vectordb/milvus/milvus.py +242 -32
- agno/vectordb/mongodb/mongodb.py +200 -24
- agno/vectordb/pgvector/pgvector.py +319 -37
- agno/vectordb/pineconedb/pineconedb.py +221 -27
- agno/vectordb/qdrant/qdrant.py +356 -14
- agno/vectordb/singlestore/singlestore.py +286 -29
- agno/vectordb/surrealdb/surrealdb.py +187 -7
- agno/vectordb/upstashdb/upstashdb.py +342 -26
- agno/vectordb/weaviate/weaviate.py +227 -165
- agno/workflow/__init__.py +17 -13
- agno/workflow/{v2/condition.py → condition.py} +135 -32
- agno/workflow/{v2/loop.py → loop.py} +115 -28
- agno/workflow/{v2/parallel.py → parallel.py} +138 -108
- agno/workflow/{v2/router.py → router.py} +133 -32
- agno/workflow/{v2/step.py → step.py} +200 -42
- agno/workflow/{v2/steps.py → steps.py} +147 -66
- agno/workflow/types.py +482 -0
- agno/workflow/workflow.py +2394 -696
- agno-2.0.0a1.dist-info/METADATA +355 -0
- agno-2.0.0a1.dist-info/RECORD +514 -0
- agno/agent/metrics.py +0 -107
- agno/api/app.py +0 -35
- agno/api/playground.py +0 -92
- agno/api/schemas/app.py +0 -12
- agno/api/schemas/playground.py +0 -22
- agno/api/schemas/user.py +0 -35
- agno/api/schemas/workspace.py +0 -46
- agno/api/user.py +0 -160
- agno/api/workflows.py +0 -33
- agno/api/workspace.py +0 -175
- agno/app/agui/__init__.py +0 -3
- agno/app/agui/app.py +0 -17
- agno/app/agui/sync_router.py +0 -120
- agno/app/base.py +0 -186
- agno/app/discord/__init__.py +0 -3
- agno/app/fastapi/__init__.py +0 -3
- agno/app/fastapi/app.py +0 -107
- agno/app/fastapi/async_router.py +0 -457
- agno/app/fastapi/sync_router.py +0 -448
- agno/app/playground/app.py +0 -228
- agno/app/playground/async_router.py +0 -1050
- agno/app/playground/deploy.py +0 -249
- agno/app/playground/operator.py +0 -183
- agno/app/playground/schemas.py +0 -220
- agno/app/playground/serve.py +0 -55
- agno/app/playground/sync_router.py +0 -1042
- agno/app/playground/utils.py +0 -46
- agno/app/settings.py +0 -15
- agno/app/slack/__init__.py +0 -3
- agno/app/slack/app.py +0 -19
- agno/app/slack/sync_router.py +0 -92
- agno/app/utils.py +0 -54
- agno/app/whatsapp/__init__.py +0 -3
- agno/app/whatsapp/app.py +0 -15
- agno/app/whatsapp/sync_router.py +0 -197
- agno/cli/auth_server.py +0 -249
- agno/cli/config.py +0 -274
- agno/cli/console.py +0 -88
- agno/cli/credentials.py +0 -23
- agno/cli/entrypoint.py +0 -571
- agno/cli/operator.py +0 -357
- agno/cli/settings.py +0 -96
- agno/cli/ws/ws_cli.py +0 -817
- agno/constants.py +0 -13
- agno/document/__init__.py +0 -5
- agno/document/chunking/semantic.py +0 -45
- agno/document/chunking/strategy.py +0 -31
- agno/document/reader/__init__.py +0 -5
- agno/document/reader/base.py +0 -47
- agno/document/reader/docx_reader.py +0 -60
- agno/document/reader/gcs/pdf_reader.py +0 -44
- agno/document/reader/s3/pdf_reader.py +0 -59
- agno/document/reader/s3/text_reader.py +0 -63
- agno/document/reader/url_reader.py +0 -59
- agno/document/reader/youtube_reader.py +0 -58
- agno/embedder/__init__.py +0 -5
- agno/embedder/langdb.py +0 -80
- agno/embedder/mistral.py +0 -82
- agno/embedder/openai.py +0 -78
- agno/file/__init__.py +0 -5
- 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 -698
- agno/knowledge/arxiv.py +0 -33
- agno/knowledge/combined.py +0 -36
- agno/knowledge/csv.py +0 -144
- agno/knowledge/csv_url.py +0 -124
- agno/knowledge/document.py +0 -223
- agno/knowledge/docx.py +0 -137
- agno/knowledge/firecrawl.py +0 -34
- agno/knowledge/gcs/__init__.py +0 -0
- agno/knowledge/gcs/base.py +0 -39
- agno/knowledge/gcs/pdf.py +0 -125
- agno/knowledge/json.py +0 -137
- agno/knowledge/langchain.py +0 -71
- agno/knowledge/light_rag.py +0 -273
- agno/knowledge/llamaindex.py +0 -66
- agno/knowledge/markdown.py +0 -154
- agno/knowledge/pdf.py +0 -164
- agno/knowledge/pdf_bytes.py +0 -42
- agno/knowledge/pdf_url.py +0 -148
- agno/knowledge/s3/__init__.py +0 -0
- agno/knowledge/s3/base.py +0 -64
- agno/knowledge/s3/pdf.py +0 -33
- agno/knowledge/s3/text.py +0 -34
- agno/knowledge/text.py +0 -141
- agno/knowledge/url.py +0 -46
- agno/knowledge/website.py +0 -179
- agno/knowledge/wikipedia.py +0 -32
- agno/knowledge/youtube.py +0 -35
- agno/memory/agent.py +0 -423
- agno/memory/classifier.py +0 -104
- agno/memory/db/__init__.py +0 -5
- 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 -22
- agno/memory/row.py +0 -36
- agno/memory/summarizer.py +0 -201
- agno/memory/summary.py +0 -19
- agno/memory/team.py +0 -415
- agno/memory/v2/__init__.py +0 -2
- agno/memory/v2/db/__init__.py +0 -1
- agno/memory/v2/db/base.py +0 -42
- agno/memory/v2/db/firestore.py +0 -339
- agno/memory/v2/db/mongodb.py +0 -196
- agno/memory/v2/db/postgres.py +0 -214
- agno/memory/v2/db/redis.py +0 -187
- agno/memory/v2/db/schema.py +0 -54
- agno/memory/v2/db/sqlite.py +0 -209
- agno/memory/v2/manager.py +0 -437
- agno/memory/v2/memory.py +0 -1097
- agno/memory/v2/schema.py +0 -55
- agno/memory/v2/summarizer.py +0 -215
- agno/memory/workflow.py +0 -38
- agno/models/ollama/tools.py +0 -430
- agno/models/qwen/__init__.py +0 -5
- agno/playground/__init__.py +0 -10
- agno/playground/deploy.py +0 -3
- agno/playground/playground.py +0 -3
- agno/playground/serve.py +0 -3
- agno/playground/settings.py +0 -3
- agno/reranker/__init__.py +0 -0
- agno/run/v2/__init__.py +0 -0
- agno/run/v2/workflow.py +0 -567
- agno/storage/__init__.py +0 -0
- agno/storage/agent/__init__.py +0 -0
- agno/storage/agent/dynamodb.py +0 -1
- agno/storage/agent/json.py +0 -1
- agno/storage/agent/mongodb.py +0 -1
- agno/storage/agent/postgres.py +0 -1
- agno/storage/agent/singlestore.py +0 -1
- agno/storage/agent/sqlite.py +0 -1
- agno/storage/agent/yaml.py +0 -1
- agno/storage/base.py +0 -60
- agno/storage/dynamodb.py +0 -673
- agno/storage/firestore.py +0 -297
- agno/storage/gcs_json.py +0 -261
- agno/storage/in_memory.py +0 -234
- agno/storage/json.py +0 -237
- agno/storage/mongodb.py +0 -328
- agno/storage/mysql.py +0 -685
- agno/storage/postgres.py +0 -682
- agno/storage/redis.py +0 -336
- agno/storage/session/__init__.py +0 -16
- agno/storage/session/agent.py +0 -64
- agno/storage/session/team.py +0 -63
- agno/storage/session/v2/__init__.py +0 -5
- agno/storage/session/workflow.py +0 -61
- agno/storage/singlestore.py +0 -606
- agno/storage/sqlite.py +0 -646
- agno/storage/workflow/__init__.py +0 -0
- agno/storage/workflow/mongodb.py +0 -1
- agno/storage/workflow/postgres.py +0 -1
- agno/storage/workflow/sqlite.py +0 -1
- agno/storage/yaml.py +0 -241
- agno/tools/thinking.py +0 -73
- 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/workflow/v2/__init__.py +0 -21
- agno/workflow/v2/types.py +0 -357
- agno/workflow/v2/workflow.py +0 -3312
- agno/workspace/__init__.py +0 -0
- agno/workspace/config.py +0 -325
- agno/workspace/enums.py +0 -6
- agno/workspace/helpers.py +0 -52
- agno/workspace/operator.py +0 -757
- agno/workspace/settings.py +0 -158
- agno-1.8.0.dist-info/METADATA +0 -979
- agno-1.8.0.dist-info/RECORD +0 -565
- agno-1.8.0.dist-info/entry_points.txt +0 -3
- /agno/{app → db/migrations}/__init__.py +0 -0
- /agno/{app/playground/__init__.py → db/schemas/metrics.py} +0 -0
- /agno/{cli → integrations}/__init__.py +0 -0
- /agno/{cli/ws → knowledge/chunking}/__init__.py +0 -0
- /agno/{document/chunking → knowledge/remote_content}/__init__.py +0 -0
- /agno/{document/reader/gcs → knowledge/reranker}/__init__.py +0 -0
- /agno/{document/reader/s3 → os/interfaces}/__init__.py +0 -0
- /agno/{app → os/interfaces}/slack/security.py +0 -0
- /agno/{app → os/interfaces}/whatsapp/security.py +0 -0
- /agno/{file/local → utils/print_response}/__init__.py +0 -0
- /agno/{infra → vectordb/llamaindex}/__init__.py +0 -0
- {agno-1.8.0.dist-info → agno-2.0.0a1.dist-info}/WHEEL +0 -0
- {agno-1.8.0.dist-info → agno-2.0.0a1.dist-info}/licenses/LICENSE +0 -0
- {agno-1.8.0.dist-info → agno-2.0.0a1.dist-info}/top_level.txt +0 -0
|
@@ -0,0 +1,171 @@
|
|
|
1
|
+
import asyncio
|
|
2
|
+
from io import BytesIO
|
|
3
|
+
from pathlib import Path
|
|
4
|
+
from typing import List, Optional
|
|
5
|
+
from uuid import uuid4
|
|
6
|
+
|
|
7
|
+
from agno.knowledge.chunking.fixed import FixedSizeChunking
|
|
8
|
+
from agno.knowledge.chunking.strategy import ChunkingStrategy, ChunkingStrategyType
|
|
9
|
+
from agno.knowledge.document.base import Document
|
|
10
|
+
from agno.knowledge.reader.base import Reader
|
|
11
|
+
from agno.knowledge.types import ContentType
|
|
12
|
+
from agno.utils.log import log_debug, log_info, logger
|
|
13
|
+
|
|
14
|
+
try:
|
|
15
|
+
from agno.aws.resource.s3.object import S3Object # type: ignore
|
|
16
|
+
except (ModuleNotFoundError, ImportError):
|
|
17
|
+
raise ImportError("`agno-aws` not installed. Please install using `pip install agno-aws`")
|
|
18
|
+
|
|
19
|
+
try:
|
|
20
|
+
import textract # noqa: F401
|
|
21
|
+
except ImportError:
|
|
22
|
+
raise ImportError("`textract` not installed. Please install it via `pip install textract`.")
|
|
23
|
+
|
|
24
|
+
try:
|
|
25
|
+
from pypdf import PdfReader as DocumentReader # noqa: F401
|
|
26
|
+
except ImportError:
|
|
27
|
+
raise ImportError("`pypdf` not installed. Please install it via `pip install pypdf`.")
|
|
28
|
+
|
|
29
|
+
|
|
30
|
+
class S3Reader(Reader):
|
|
31
|
+
"""Reader for S3 files"""
|
|
32
|
+
|
|
33
|
+
def __init__(self, chunking_strategy: Optional[ChunkingStrategy] = FixedSizeChunking(), **kwargs):
|
|
34
|
+
super().__init__(chunking_strategy=chunking_strategy, **kwargs)
|
|
35
|
+
|
|
36
|
+
@classmethod
|
|
37
|
+
def get_supported_chunking_strategies(self) -> List[ChunkingStrategyType]:
|
|
38
|
+
"""Get the list of supported chunking strategies for S3 readers."""
|
|
39
|
+
return [
|
|
40
|
+
ChunkingStrategyType.FIXED_SIZE_CHUNKING,
|
|
41
|
+
ChunkingStrategyType.AGENTIC_CHUNKING,
|
|
42
|
+
ChunkingStrategyType.DOCUMENT_CHUNKING,
|
|
43
|
+
ChunkingStrategyType.RECURSIVE_CHUNKING,
|
|
44
|
+
ChunkingStrategyType.SEMANTIC_CHUNKING,
|
|
45
|
+
]
|
|
46
|
+
|
|
47
|
+
@classmethod
|
|
48
|
+
def get_supported_content_types(self) -> List[ContentType]:
|
|
49
|
+
return [ContentType.FILE, ContentType.URL, ContentType.TEXT]
|
|
50
|
+
|
|
51
|
+
def read(self, name: Optional[str], s3_object: S3Object) -> List[Document]:
|
|
52
|
+
try:
|
|
53
|
+
log_info(f"Reading S3 file: {s3_object.uri}")
|
|
54
|
+
|
|
55
|
+
if s3_object.uri.endswith(".pdf"):
|
|
56
|
+
return S3PDFReader().read(name, s3_object)
|
|
57
|
+
else:
|
|
58
|
+
return S3TextReader().read(name, s3_object)
|
|
59
|
+
|
|
60
|
+
except Exception as e:
|
|
61
|
+
logger.error(f"Error reading: {s3_object.uri}: {e}")
|
|
62
|
+
return []
|
|
63
|
+
|
|
64
|
+
async def async_read(self, name: Optional[str], s3_object: S3Object) -> List[Document]:
|
|
65
|
+
"""Asynchronously read S3 files by running the synchronous read operation in a thread."""
|
|
66
|
+
return await asyncio.to_thread(self.read, name, s3_object)
|
|
67
|
+
|
|
68
|
+
|
|
69
|
+
class S3TextReader(Reader):
|
|
70
|
+
"""Reader for text files on S3"""
|
|
71
|
+
|
|
72
|
+
def get_supported_chunking_strategies(self) -> List[ChunkingStrategyType]:
|
|
73
|
+
"""Get the list of supported chunking strategies for S3 text readers."""
|
|
74
|
+
return [
|
|
75
|
+
ChunkingStrategyType.AGENTIC_CHUNKING,
|
|
76
|
+
ChunkingStrategyType.DOCUMENT_CHUNKING,
|
|
77
|
+
ChunkingStrategyType.RECURSIVE_CHUNKING,
|
|
78
|
+
]
|
|
79
|
+
|
|
80
|
+
def get_supported_content_types(self) -> List[ContentType]:
|
|
81
|
+
return [ContentType.TEXT]
|
|
82
|
+
|
|
83
|
+
def read(self, name: Optional[str], s3_object: S3Object) -> List[Document]:
|
|
84
|
+
try:
|
|
85
|
+
log_info(f"Reading text file: {s3_object.uri}")
|
|
86
|
+
|
|
87
|
+
doc_name = s3_object.name.split("/")[-1].split(".")[0].replace("/", "_").replace(" ", "_")
|
|
88
|
+
if name is not None:
|
|
89
|
+
doc_name = name
|
|
90
|
+
obj_name = s3_object.name.split("/")[-1]
|
|
91
|
+
temporary_file = Path("storage").joinpath(obj_name)
|
|
92
|
+
s3_object.download(temporary_file)
|
|
93
|
+
|
|
94
|
+
log_info(f"Parsing: {temporary_file}")
|
|
95
|
+
doc_content = textract.process(temporary_file)
|
|
96
|
+
documents = [
|
|
97
|
+
Document(
|
|
98
|
+
name=doc_name,
|
|
99
|
+
id=doc_name,
|
|
100
|
+
content=doc_content.decode("utf-8"),
|
|
101
|
+
)
|
|
102
|
+
]
|
|
103
|
+
if self.chunk:
|
|
104
|
+
chunked_documents = []
|
|
105
|
+
for document in documents:
|
|
106
|
+
chunked_documents.extend(self.chunk_document(document))
|
|
107
|
+
return chunked_documents
|
|
108
|
+
|
|
109
|
+
log_debug(f"Deleting: {temporary_file}")
|
|
110
|
+
temporary_file.unlink()
|
|
111
|
+
return documents
|
|
112
|
+
except Exception as e:
|
|
113
|
+
logger.error(f"Error reading: {s3_object.uri}: {e}")
|
|
114
|
+
return []
|
|
115
|
+
|
|
116
|
+
async def async_read(self, name: Optional[str], s3_object: S3Object) -> List[Document]:
|
|
117
|
+
"""Asynchronously read text files from S3 by running the synchronous read operation in a thread.
|
|
118
|
+
|
|
119
|
+
Args:
|
|
120
|
+
s3_object (S3Object): The S3 object to read
|
|
121
|
+
|
|
122
|
+
Returns:
|
|
123
|
+
List[Document]: List of documents from the text file
|
|
124
|
+
"""
|
|
125
|
+
return await asyncio.to_thread(self.read, name, s3_object)
|
|
126
|
+
|
|
127
|
+
|
|
128
|
+
class S3PDFReader(Reader):
|
|
129
|
+
"""Reader for PDF files on S3"""
|
|
130
|
+
|
|
131
|
+
def get_supported_content_types(self) -> List[ContentType]:
|
|
132
|
+
return [ContentType.FILE]
|
|
133
|
+
|
|
134
|
+
def read(self, name: Optional[str], s3_object: S3Object) -> List[Document]:
|
|
135
|
+
try:
|
|
136
|
+
log_info(f"Reading PDF file: {s3_object.uri}")
|
|
137
|
+
|
|
138
|
+
object_resource = s3_object.get_resource()
|
|
139
|
+
object_body = object_resource.get()["Body"]
|
|
140
|
+
doc_name = s3_object.name.split("/")[-1].split(".")[0].replace("/", "_").replace(" ", "_")
|
|
141
|
+
if name is not None:
|
|
142
|
+
doc_name = name
|
|
143
|
+
doc_reader = DocumentReader(BytesIO(object_body.read()))
|
|
144
|
+
documents = [
|
|
145
|
+
Document(
|
|
146
|
+
name=doc_name,
|
|
147
|
+
id=str(uuid4()),
|
|
148
|
+
meta_data={"page": page_number},
|
|
149
|
+
content=page.extract_text(),
|
|
150
|
+
)
|
|
151
|
+
for page_number, page in enumerate(doc_reader.pages, start=1)
|
|
152
|
+
]
|
|
153
|
+
if self.chunk:
|
|
154
|
+
chunked_documents = []
|
|
155
|
+
for document in documents:
|
|
156
|
+
chunked_documents.extend(self.chunk_document(document))
|
|
157
|
+
return chunked_documents
|
|
158
|
+
return documents
|
|
159
|
+
except Exception:
|
|
160
|
+
raise
|
|
161
|
+
|
|
162
|
+
async def async_read(self, name: Optional[str], s3_object: S3Object) -> List[Document]:
|
|
163
|
+
"""Asynchronously read PDF files from S3 by running the synchronous read operation in a thread.
|
|
164
|
+
|
|
165
|
+
Args:
|
|
166
|
+
s3_object (S3Object): The S3 object to read
|
|
167
|
+
|
|
168
|
+
Returns:
|
|
169
|
+
List[Document]: List of documents from the PDF file
|
|
170
|
+
"""
|
|
171
|
+
return await asyncio.to_thread(self.read, name, s3_object)
|
|
@@ -1,27 +1,48 @@
|
|
|
1
1
|
import asyncio
|
|
2
2
|
import uuid
|
|
3
3
|
from pathlib import Path
|
|
4
|
-
from typing import IO, Any, List, Union
|
|
4
|
+
from typing import IO, Any, List, Optional, Union
|
|
5
5
|
|
|
6
|
-
from agno.
|
|
7
|
-
from agno.
|
|
6
|
+
from agno.knowledge.chunking.fixed import FixedSizeChunking
|
|
7
|
+
from agno.knowledge.chunking.strategy import ChunkingStrategy, ChunkingStrategyType
|
|
8
|
+
from agno.knowledge.document.base import Document
|
|
9
|
+
from agno.knowledge.reader.base import Reader
|
|
10
|
+
from agno.knowledge.types import ContentType
|
|
8
11
|
from agno.utils.log import log_info, logger
|
|
9
12
|
|
|
10
13
|
|
|
11
14
|
class TextReader(Reader):
|
|
12
15
|
"""Reader for Text files"""
|
|
13
16
|
|
|
14
|
-
def
|
|
17
|
+
def __init__(self, chunking_strategy: Optional[ChunkingStrategy] = FixedSizeChunking(), **kwargs):
|
|
18
|
+
super().__init__(chunking_strategy=chunking_strategy, **kwargs)
|
|
19
|
+
|
|
20
|
+
@classmethod
|
|
21
|
+
def get_supported_chunking_strategies(self) -> List[ChunkingStrategyType]:
|
|
22
|
+
"""Get the list of supported chunking strategies for Text readers."""
|
|
23
|
+
return [
|
|
24
|
+
ChunkingStrategyType.FIXED_SIZE_CHUNKING,
|
|
25
|
+
ChunkingStrategyType.AGENTIC_CHUNKING,
|
|
26
|
+
ChunkingStrategyType.DOCUMENT_CHUNKING,
|
|
27
|
+
ChunkingStrategyType.RECURSIVE_CHUNKING,
|
|
28
|
+
ChunkingStrategyType.SEMANTIC_CHUNKING,
|
|
29
|
+
]
|
|
30
|
+
|
|
31
|
+
@classmethod
|
|
32
|
+
def get_supported_content_types(self) -> List[ContentType]:
|
|
33
|
+
return [ContentType.TXT]
|
|
34
|
+
|
|
35
|
+
def read(self, file: Union[Path, IO[Any]], name: Optional[str] = None) -> List[Document]:
|
|
15
36
|
try:
|
|
16
37
|
if isinstance(file, Path):
|
|
17
38
|
if not file.exists():
|
|
18
39
|
raise FileNotFoundError(f"Could not find file: {file}")
|
|
19
40
|
log_info(f"Reading: {file}")
|
|
20
|
-
file_name = file.stem
|
|
41
|
+
file_name = name or file.stem
|
|
21
42
|
file_contents = file.read_text("utf-8")
|
|
22
43
|
else:
|
|
23
|
-
|
|
24
|
-
|
|
44
|
+
file_name = name or file.name.split(".")[0]
|
|
45
|
+
log_info(f"Reading uploaded file: {file_name}")
|
|
25
46
|
file.seek(0)
|
|
26
47
|
file_contents = file.read().decode("utf-8")
|
|
27
48
|
|
|
@@ -42,14 +63,14 @@ class TextReader(Reader):
|
|
|
42
63
|
logger.error(f"Error reading: {file}: {e}")
|
|
43
64
|
return []
|
|
44
65
|
|
|
45
|
-
async def async_read(self, file: Union[Path, IO[Any]]) -> List[Document]:
|
|
66
|
+
async def async_read(self, file: Union[Path, IO[Any]], name: Optional[str] = None) -> List[Document]:
|
|
46
67
|
try:
|
|
47
68
|
if isinstance(file, Path):
|
|
48
69
|
if not file.exists():
|
|
49
70
|
raise FileNotFoundError(f"Could not find file: {file}")
|
|
50
71
|
|
|
51
72
|
log_info(f"Reading asynchronously: {file}")
|
|
52
|
-
file_name = file.stem
|
|
73
|
+
file_name = name or file.stem
|
|
53
74
|
|
|
54
75
|
try:
|
|
55
76
|
import aiofiles
|
|
@@ -61,7 +82,7 @@ class TextReader(Reader):
|
|
|
61
82
|
file_contents = file.read_text("utf-8")
|
|
62
83
|
else:
|
|
63
84
|
log_info(f"Reading uploaded file asynchronously: {file.name}")
|
|
64
|
-
file_name = file.name.split(".")[0]
|
|
85
|
+
file_name = name or file.name.split(".")[0]
|
|
65
86
|
file.seek(0)
|
|
66
87
|
file_contents = file.read().decode("utf-8")
|
|
67
88
|
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
from typing import List, Optional
|
|
2
|
+
from urllib.parse import urlparse
|
|
3
|
+
|
|
4
|
+
import httpx
|
|
5
|
+
|
|
6
|
+
from agno.knowledge.chunking.fixed import FixedSizeChunking
|
|
7
|
+
from agno.knowledge.chunking.strategy import ChunkingStrategy, ChunkingStrategyType
|
|
8
|
+
from agno.knowledge.document.base import Document
|
|
9
|
+
from agno.knowledge.reader.base import Reader
|
|
10
|
+
from agno.knowledge.types import ContentType
|
|
11
|
+
from agno.utils.http import async_fetch_with_retry, fetch_with_retry
|
|
12
|
+
from agno.utils.log import log_debug
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
class URLReader(Reader):
|
|
16
|
+
"""Reader for general URL content"""
|
|
17
|
+
|
|
18
|
+
def __init__(
|
|
19
|
+
self, chunking_strategy: Optional[ChunkingStrategy] = FixedSizeChunking(), proxy: Optional[str] = None, **kwargs
|
|
20
|
+
):
|
|
21
|
+
super().__init__(chunking_strategy=chunking_strategy, **kwargs)
|
|
22
|
+
self.proxy = proxy
|
|
23
|
+
|
|
24
|
+
@classmethod
|
|
25
|
+
def get_supported_chunking_strategies(self) -> List[ChunkingStrategyType]:
|
|
26
|
+
"""Get the list of supported chunking strategies for URL readers."""
|
|
27
|
+
return [
|
|
28
|
+
ChunkingStrategyType.FIXED_SIZE_CHUNKING,
|
|
29
|
+
ChunkingStrategyType.AGENTIC_CHUNKING,
|
|
30
|
+
ChunkingStrategyType.DOCUMENT_CHUNKING,
|
|
31
|
+
ChunkingStrategyType.RECURSIVE_CHUNKING,
|
|
32
|
+
ChunkingStrategyType.SEMANTIC_CHUNKING,
|
|
33
|
+
]
|
|
34
|
+
|
|
35
|
+
@classmethod
|
|
36
|
+
def get_supported_content_types(self) -> List[ContentType]:
|
|
37
|
+
return [ContentType.URL]
|
|
38
|
+
|
|
39
|
+
def read(self, url: str, id: Optional[str] = None, name: Optional[str] = None) -> List[Document]:
|
|
40
|
+
if not url:
|
|
41
|
+
raise ValueError("No url provided")
|
|
42
|
+
|
|
43
|
+
log_debug(f"Reading: {url}")
|
|
44
|
+
# Retry the request up to 3 times with exponential backoff
|
|
45
|
+
response = fetch_with_retry(url, proxy=self.proxy)
|
|
46
|
+
|
|
47
|
+
document = self._create_document(url, response.text, id, name)
|
|
48
|
+
if self.chunk:
|
|
49
|
+
return self.chunk_document(document)
|
|
50
|
+
return [document]
|
|
51
|
+
|
|
52
|
+
async def async_read(self, url: str, id: Optional[str] = None, name: Optional[str] = None) -> List[Document]:
|
|
53
|
+
"""Async version of read method"""
|
|
54
|
+
if not url:
|
|
55
|
+
raise ValueError("No url provided")
|
|
56
|
+
|
|
57
|
+
log_debug(f"Reading async: {url}")
|
|
58
|
+
client_args = {"proxy": self.proxy} if self.proxy else {}
|
|
59
|
+
async with httpx.AsyncClient(**client_args) as client: # type: ignore
|
|
60
|
+
response = await async_fetch_with_retry(url, client=client)
|
|
61
|
+
|
|
62
|
+
document = self._create_document(url, response.text, id, name)
|
|
63
|
+
if self.chunk:
|
|
64
|
+
return await self.chunk_documents_async([document])
|
|
65
|
+
return [document]
|
|
66
|
+
|
|
67
|
+
def _create_document(
|
|
68
|
+
self, url: str, content: str, id: Optional[str] = None, name: Optional[str] = None
|
|
69
|
+
) -> Document:
|
|
70
|
+
"""Helper method to create a document from URL content"""
|
|
71
|
+
parsed_url = urlparse(url)
|
|
72
|
+
doc_name = name or parsed_url.path.strip("/").replace("/", "_").replace(" ", "_")
|
|
73
|
+
if not doc_name:
|
|
74
|
+
doc_name = parsed_url.netloc
|
|
75
|
+
if not doc_name:
|
|
76
|
+
doc_name = url
|
|
77
|
+
|
|
78
|
+
return Document(
|
|
79
|
+
name=doc_name,
|
|
80
|
+
id=id or doc_name,
|
|
81
|
+
meta_data={"url": url},
|
|
82
|
+
content=content,
|
|
83
|
+
size=len(content),
|
|
84
|
+
)
|