agno 1.8.1__py3-none-any.whl → 2.0.0__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- agno/__init__.py +8 -0
- agno/agent/__init__.py +19 -27
- agno/agent/agent.py +3143 -4170
- agno/api/agent.py +11 -67
- agno/api/api.py +5 -46
- agno/api/evals.py +8 -19
- 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 +11 -66
- 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 +1743 -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 +1432 -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 +882 -0
- agno/db/in_memory/utils.py +172 -0
- agno/db/json/__init__.py +3 -0
- agno/db/json/json_db.py +1045 -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 +1416 -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 +297 -0
- agno/db/postgres/__init__.py +3 -0
- agno/db/postgres/postgres.py +1710 -0
- agno/db/postgres/schemas.py +124 -0
- agno/db/postgres/utils.py +280 -0
- agno/db/redis/__init__.py +3 -0
- agno/db/redis/redis.py +1367 -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 +1712 -0
- agno/db/singlestore/utils.py +326 -0
- agno/db/sqlite/__init__.py +3 -0
- agno/db/sqlite/schemas.py +119 -0
- agno/db/sqlite/sqlite.py +1676 -0
- agno/db/sqlite/utils.py +268 -0
- agno/db/utils.py +88 -0
- agno/eval/__init__.py +14 -0
- agno/eval/accuracy.py +154 -48
- 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 +15 -11
- 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 +1551 -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 +47 -65
- agno/knowledge/reader/docx_reader.py +83 -0
- agno/{document → knowledge}/reader/firecrawl_reader.py +42 -21
- agno/{document → knowledge}/reader/json_reader.py +30 -9
- agno/{document → knowledge}/reader/markdown_reader.py +58 -9
- agno/{document → knowledge}/reader/pdf_reader.py +71 -126
- agno/knowledge/reader/reader_factory.py +268 -0
- agno/knowledge/reader/s3_reader.py +101 -0
- agno/{document → knowledge}/reader/text_reader.py +31 -10
- agno/knowledge/reader/url_reader.py +128 -0
- agno/knowledge/reader/web_search_reader.py +366 -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 +269 -268
- 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 +131 -131
- agno/models/aws/bedrock.py +110 -182
- agno/models/aws/claude.py +64 -18
- agno/models/azure/ai_foundry.py +73 -23
- agno/models/base.py +346 -290
- agno/models/cerebras/cerebras.py +84 -27
- agno/models/cohere/chat.py +106 -98
- agno/models/google/gemini.py +105 -46
- 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 +46 -151
- 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 +85 -47
- agno/models/openai/chat.py +154 -37
- agno/models/openai/responses.py +178 -105
- agno/models/perplexity/perplexity.py +26 -2
- agno/models/portkey/portkey.py +0 -7
- agno/models/response.py +15 -9
- 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 +497 -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 +77 -33
- 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 +32 -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 +29 -0
- agno/os/mcp.py +235 -0
- agno/os/router.py +1400 -0
- agno/os/routers/__init__.py +3 -0
- agno/os/routers/evals/__init__.py +3 -0
- agno/os/routers/evals/evals.py +393 -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 +850 -0
- agno/os/routers/knowledge/schemas.py +118 -0
- agno/os/routers/memory/__init__.py +3 -0
- agno/os/routers/memory/memory.py +410 -0
- agno/os/routers/memory/schemas.py +58 -0
- agno/os/routers/metrics/__init__.py +3 -0
- agno/os/routers/metrics/metrics.py +178 -0
- agno/os/routers/metrics/schemas.py +47 -0
- agno/os/routers/session/__init__.py +3 -0
- agno/os/routers/session/session.py +536 -0
- agno/os/schema.py +945 -0
- agno/{app/playground → os}/settings.py +7 -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/agent.py +633 -0
- agno/run/base.py +53 -77
- agno/run/cancel.py +81 -0
- agno/run/team.py +243 -96
- agno/run/workflow.py +550 -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 +3260 -4824
- 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 +43 -23
- agno/tools/browserbase.py +13 -4
- agno/tools/calcom.py +12 -10
- agno/tools/calculator.py +10 -27
- agno/tools/cartesia.py +20 -17
- agno/tools/{clickup_tool.py → clickup.py} +12 -25
- agno/tools/confluence.py +8 -8
- agno/tools/crawl4ai.py +7 -1
- agno/tools/csv_toolkit.py +9 -8
- agno/tools/dalle.py +22 -12
- agno/tools/daytona.py +13 -16
- agno/tools/decorator.py +6 -3
- agno/tools/desi_vocal.py +17 -8
- 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 +36 -29
- agno/tools/email.py +4 -1
- agno/tools/evm.py +7 -1
- agno/tools/exa.py +19 -14
- agno/tools/fal.py +30 -30
- agno/tools/file.py +9 -8
- agno/tools/financial_datasets.py +25 -44
- agno/tools/firecrawl.py +22 -22
- agno/tools/function.py +127 -18
- agno/tools/giphy.py +23 -11
- agno/tools/github.py +48 -126
- agno/tools/gmail.py +45 -61
- 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 +19 -34
- agno/tools/linkup.py +5 -1
- agno/tools/local_file_system.py +8 -5
- agno/tools/lumalab.py +32 -20
- agno/tools/mcp.py +1 -2
- 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 +33 -15
- agno/tools/models/gemini.py +59 -32
- agno/tools/models/groq.py +30 -23
- agno/tools/models/nebius.py +28 -12
- agno/tools/models_labs.py +40 -16
- agno/tools/moviepy_video.py +7 -6
- agno/tools/neo4j.py +10 -8
- agno/tools/newspaper.py +7 -2
- agno/tools/newspaper4k.py +8 -3
- agno/tools/openai.py +58 -32
- agno/tools/openbb.py +12 -11
- agno/tools/opencv.py +63 -47
- 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 +55 -42
- 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 +100 -123
- agno/utils/gemini.py +32 -2
- agno/utils/knowledge.py +29 -0
- agno/utils/log.py +54 -4
- agno/utils/mcp.py +68 -10
- agno/utils/media.py +39 -0
- agno/utils/message.py +12 -1
- agno/utils/models/aws_claude.py +1 -1
- agno/utils/models/claude.py +47 -4
- agno/utils/models/cohere.py +1 -1
- agno/utils/models/mistral.py +8 -7
- agno/utils/models/schema_utils.py +3 -3
- agno/utils/models/watsonx.py +1 -1
- agno/utils/openai.py +1 -1
- agno/utils/pprint.py +33 -32
- agno/utils/print_response/agent.py +779 -0
- agno/utils/print_response/team.py +1669 -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/streamlit.py +481 -0
- 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 +334 -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} +207 -49
- agno/workflow/{v2/steps.py → steps.py} +147 -66
- agno/workflow/types.py +482 -0
- agno/workflow/workflow.py +2410 -696
- agno-2.0.0.dist-info/METADATA +494 -0
- agno-2.0.0.dist-info/RECORD +515 -0
- agno-2.0.0.dist-info/licenses/LICENSE +201 -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 -702
- 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/response.py +0 -467
- 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.1.dist-info/METADATA +0 -982
- agno-1.8.1.dist-info/RECORD +0 -566
- agno-1.8.1.dist-info/entry_points.txt +0 -3
- agno-1.8.1.dist-info/licenses/LICENSE +0 -375
- /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.1.dist-info → agno-2.0.0.dist-info}/WHEEL +0 -0
- {agno-1.8.1.dist-info → agno-2.0.0.dist-info}/top_level.txt +0 -0
|
@@ -22,10 +22,10 @@ except ImportError:
|
|
|
22
22
|
raise ImportError("The `pinecone` package is not installed, please install using `pip install pinecone`.")
|
|
23
23
|
|
|
24
24
|
|
|
25
|
-
from agno.document import Document
|
|
26
|
-
from agno.embedder import Embedder
|
|
27
|
-
from agno.reranker.base import Reranker
|
|
28
|
-
from agno.utils.log import log_debug, log_info, logger
|
|
25
|
+
from agno.knowledge.document import Document
|
|
26
|
+
from agno.knowledge.embedder import Embedder
|
|
27
|
+
from agno.knowledge.reranker.base import Reranker
|
|
28
|
+
from agno.utils.log import log_debug, log_info, log_warning, logger
|
|
29
29
|
from agno.vectordb.base import VectorDb
|
|
30
30
|
|
|
31
31
|
|
|
@@ -114,7 +114,7 @@ class PineconeDb(VectorDb):
|
|
|
114
114
|
# Embedder for embedding the document contents
|
|
115
115
|
_embedder = embedder
|
|
116
116
|
if _embedder is None:
|
|
117
|
-
from agno.embedder.openai import OpenAIEmbedder
|
|
117
|
+
from agno.knowledge.embedder.openai import OpenAIEmbedder
|
|
118
118
|
|
|
119
119
|
_embedder = OpenAIEmbedder()
|
|
120
120
|
log_info("Embedder not provided, using OpenAIEmbedder as default.")
|
|
@@ -177,6 +177,9 @@ class PineconeDb(VectorDb):
|
|
|
177
177
|
if self.use_hybrid_search:
|
|
178
178
|
self.metric = "dotproduct"
|
|
179
179
|
|
|
180
|
+
if self.dimension is None:
|
|
181
|
+
raise ValueError("Dimension is not set for this Pinecone index")
|
|
182
|
+
|
|
180
183
|
self.client.create_index(
|
|
181
184
|
name=self.name,
|
|
182
185
|
dimension=self.dimension,
|
|
@@ -234,6 +237,17 @@ class PineconeDb(VectorDb):
|
|
|
234
237
|
|
|
235
238
|
def upsert(
|
|
236
239
|
self,
|
|
240
|
+
content_hash: str,
|
|
241
|
+
documents: List[Document],
|
|
242
|
+
filters: Optional[Dict[str, Any]] = None,
|
|
243
|
+
) -> None:
|
|
244
|
+
if self.content_hash_exists(content_hash):
|
|
245
|
+
self._delete_by_content_hash(content_hash)
|
|
246
|
+
self._upsert(content_hash=content_hash, documents=documents, filters=filters)
|
|
247
|
+
|
|
248
|
+
def _upsert(
|
|
249
|
+
self,
|
|
250
|
+
content_hash: str,
|
|
237
251
|
documents: List[Document],
|
|
238
252
|
filters: Optional[Dict[str, Any]] = None,
|
|
239
253
|
namespace: Optional[str] = None,
|
|
@@ -255,10 +269,22 @@ class PineconeDb(VectorDb):
|
|
|
255
269
|
for document in documents:
|
|
256
270
|
document.embed(embedder=self.embedder)
|
|
257
271
|
document.meta_data["text"] = document.content
|
|
272
|
+
# Include name and content_id in metadata
|
|
273
|
+
metadata = document.meta_data.copy()
|
|
274
|
+
if filters:
|
|
275
|
+
metadata.update(filters)
|
|
276
|
+
|
|
277
|
+
if document.name:
|
|
278
|
+
metadata["name"] = document.name
|
|
279
|
+
if document.content_id:
|
|
280
|
+
metadata["content_id"] = document.content_id
|
|
281
|
+
|
|
282
|
+
metadata["content_hash"] = content_hash
|
|
283
|
+
|
|
258
284
|
data_to_upsert = {
|
|
259
285
|
"id": document.id,
|
|
260
286
|
"values": document.embedding,
|
|
261
|
-
"metadata":
|
|
287
|
+
"metadata": metadata,
|
|
262
288
|
}
|
|
263
289
|
if self.use_hybrid_search:
|
|
264
290
|
data_to_upsert["sparse_values"] = self.sparse_encoder.encode_documents(document.content)
|
|
@@ -273,6 +299,7 @@ class PineconeDb(VectorDb):
|
|
|
273
299
|
|
|
274
300
|
async def async_upsert(
|
|
275
301
|
self,
|
|
302
|
+
content_hash: str,
|
|
276
303
|
documents: List[Document],
|
|
277
304
|
filters: Optional[Dict[str, Any]] = None,
|
|
278
305
|
namespace: Optional[str] = None,
|
|
@@ -293,7 +320,7 @@ class PineconeDb(VectorDb):
|
|
|
293
320
|
|
|
294
321
|
# Process each batch in parallel
|
|
295
322
|
async def process_batch(batch_docs):
|
|
296
|
-
return await
|
|
323
|
+
return await self._prepare_vectors(batch_docs)
|
|
297
324
|
|
|
298
325
|
# Run all batches in parallel
|
|
299
326
|
batch_vectors = await asyncio.gather(*[process_batch(batch) for batch in batches])
|
|
@@ -308,16 +335,25 @@ class PineconeDb(VectorDb):
|
|
|
308
335
|
|
|
309
336
|
log_debug(f"Finished async upsert of {len(documents)} documents")
|
|
310
337
|
|
|
311
|
-
def _prepare_vectors(self, documents):
|
|
338
|
+
async def _prepare_vectors(self, documents: List[Document]) -> List[Dict[str, Any]]:
|
|
312
339
|
"""Prepare vectors for upsert."""
|
|
313
340
|
vectors = []
|
|
341
|
+
embed_tasks = [document.async_embed(embedder=self.embedder) for document in documents]
|
|
342
|
+
await asyncio.gather(*embed_tasks, return_exceptions=True)
|
|
343
|
+
|
|
314
344
|
for doc in documents:
|
|
315
|
-
doc.embed(embedder=self.embedder)
|
|
316
345
|
doc.meta_data["text"] = doc.content
|
|
346
|
+
# Include name and content_id in metadata
|
|
347
|
+
metadata = doc.meta_data.copy()
|
|
348
|
+
if doc.name:
|
|
349
|
+
metadata["name"] = doc.name
|
|
350
|
+
if doc.content_id:
|
|
351
|
+
metadata["content_id"] = doc.content_id
|
|
352
|
+
|
|
317
353
|
data_to_upsert = {
|
|
318
354
|
"id": doc.id,
|
|
319
355
|
"values": doc.embedding,
|
|
320
|
-
"metadata":
|
|
356
|
+
"metadata": metadata,
|
|
321
357
|
}
|
|
322
358
|
if self.use_hybrid_search:
|
|
323
359
|
data_to_upsert["sparse_values"] = self.sparse_encoder.encode_documents(doc.content)
|
|
@@ -333,9 +369,11 @@ class PineconeDb(VectorDb):
|
|
|
333
369
|
show_progress=show_progress,
|
|
334
370
|
)
|
|
335
371
|
|
|
336
|
-
async def async_insert(
|
|
337
|
-
|
|
338
|
-
|
|
372
|
+
async def async_insert(
|
|
373
|
+
self, content_hash: str, documents: List[Document], filters: Optional[Dict[str, Any]] = None
|
|
374
|
+
) -> None:
|
|
375
|
+
log_warning("Pinecone does not support insert operations. Redirecting to async_upsert instead.")
|
|
376
|
+
await self.async_upsert(content_hash=content_hash, documents=documents, filters=filters)
|
|
339
377
|
|
|
340
378
|
def upsert_available(self) -> bool:
|
|
341
379
|
"""Check if upsert operation is available.
|
|
@@ -346,20 +384,9 @@ class PineconeDb(VectorDb):
|
|
|
346
384
|
"""
|
|
347
385
|
return True
|
|
348
386
|
|
|
349
|
-
def insert(self, documents: List[Document], filters: Optional[Dict[str, Any]] = None) -> None:
|
|
350
|
-
"
|
|
351
|
-
|
|
352
|
-
This method is not supported by Pinecone. Use `upsert` instead.
|
|
353
|
-
|
|
354
|
-
Args:
|
|
355
|
-
documents (List[Document]): The documents to insert.
|
|
356
|
-
filters (Optional[Dict[str, Any]], optional): The filters for the insert. Defaults to None.
|
|
357
|
-
|
|
358
|
-
Raises:
|
|
359
|
-
NotImplementedError: This method is not supported by Pinecone.
|
|
360
|
-
|
|
361
|
-
"""
|
|
362
|
-
raise NotImplementedError("Pinecone does not support insert operations. Use upsert instead.")
|
|
387
|
+
def insert(self, content_hash: str, documents: List[Document], filters: Optional[Dict[str, Any]] = None) -> None:
|
|
388
|
+
log_warning("Pinecone does not support insert operations. Redirecting to upsert instead.")
|
|
389
|
+
self.upsert(content_hash=content_hash, documents=documents, filters=filters)
|
|
363
390
|
|
|
364
391
|
def _hybrid_scale(self, dense: List[float], sparse: Dict[str, Any], alpha: float):
|
|
365
392
|
"""Hybrid vector scaling using a convex combination
|
|
@@ -479,3 +506,170 @@ class PineconeDb(VectorDb):
|
|
|
479
506
|
|
|
480
507
|
async def async_drop(self) -> None:
|
|
481
508
|
raise NotImplementedError(f"Async not supported on {self.__class__.__name__}.")
|
|
509
|
+
|
|
510
|
+
def delete_by_id(self, id: str) -> bool:
|
|
511
|
+
"""Delete a document by ID."""
|
|
512
|
+
try:
|
|
513
|
+
self.index.delete(ids=[id])
|
|
514
|
+
return True
|
|
515
|
+
except Exception as e:
|
|
516
|
+
log_warning(f"Error deleting document with ID {id}: {e}")
|
|
517
|
+
return False
|
|
518
|
+
|
|
519
|
+
def delete_by_name(self, name: str) -> bool:
|
|
520
|
+
"""Delete documents by name (stored in metadata)."""
|
|
521
|
+
try:
|
|
522
|
+
# Delete all documents where metadata.name equals the given name
|
|
523
|
+
self.index.delete(filter={"name": {"$eq": name}})
|
|
524
|
+
return True
|
|
525
|
+
except Exception as e:
|
|
526
|
+
log_warning(f"Error deleting documents with name {name}: {e}")
|
|
527
|
+
return False
|
|
528
|
+
|
|
529
|
+
def delete_by_metadata(self, metadata: Dict[str, Any]) -> bool:
|
|
530
|
+
"""Delete documents by metadata."""
|
|
531
|
+
try:
|
|
532
|
+
# Build filter for metadata matching
|
|
533
|
+
filter_conditions = {}
|
|
534
|
+
for key, value in metadata.items():
|
|
535
|
+
filter_conditions[key] = {"$eq": value}
|
|
536
|
+
|
|
537
|
+
self.index.delete(filter=filter_conditions)
|
|
538
|
+
return True
|
|
539
|
+
except Exception as e:
|
|
540
|
+
log_warning(f"Error deleting documents with metadata {metadata}: {e}")
|
|
541
|
+
return False
|
|
542
|
+
|
|
543
|
+
def delete_by_content_id(self, content_id: str) -> bool:
|
|
544
|
+
"""Delete documents by content ID (stored in metadata)."""
|
|
545
|
+
try:
|
|
546
|
+
# Delete all documents where metadata.content_id equals the given content_id
|
|
547
|
+
self.index.delete(filter={"content_id": {"$eq": content_id}})
|
|
548
|
+
return True
|
|
549
|
+
except Exception as e:
|
|
550
|
+
log_warning(f"Error deleting documents with content_id {content_id}: {e}")
|
|
551
|
+
return False
|
|
552
|
+
|
|
553
|
+
def get_count(self) -> int:
|
|
554
|
+
"""Get the count of documents in the index."""
|
|
555
|
+
try:
|
|
556
|
+
# Pinecone doesn't have a direct count method, so we use describe_index_stats
|
|
557
|
+
stats = self.index.describe_index_stats()
|
|
558
|
+
# The stats include total_vector_count which gives us the count
|
|
559
|
+
return stats.total_vector_count
|
|
560
|
+
except Exception as e:
|
|
561
|
+
log_warning(f"Error getting document count: {e}")
|
|
562
|
+
return 0
|
|
563
|
+
|
|
564
|
+
def id_exists(self, id: str) -> bool:
|
|
565
|
+
"""Check if a document with the given ID exists in the index.
|
|
566
|
+
|
|
567
|
+
Args:
|
|
568
|
+
id (str): The ID to check.
|
|
569
|
+
|
|
570
|
+
Returns:
|
|
571
|
+
bool: True if the document exists, False otherwise.
|
|
572
|
+
"""
|
|
573
|
+
try:
|
|
574
|
+
response = self.index.fetch(ids=[id], namespace=self.namespace)
|
|
575
|
+
return len(response.vectors) > 0
|
|
576
|
+
except Exception as e:
|
|
577
|
+
log_warning(f"Error checking if ID {id} exists: {e}")
|
|
578
|
+
return False
|
|
579
|
+
|
|
580
|
+
def content_hash_exists(self, content_hash: str) -> bool:
|
|
581
|
+
"""Check if documents with the given content hash exist in the index.
|
|
582
|
+
|
|
583
|
+
Args:
|
|
584
|
+
content_hash (str): The content hash to check.
|
|
585
|
+
|
|
586
|
+
Returns:
|
|
587
|
+
bool: True if documents with the content hash exist, False otherwise.
|
|
588
|
+
"""
|
|
589
|
+
try:
|
|
590
|
+
# Use a dummy vector to perform a minimal query with filter
|
|
591
|
+
# We only need to check if any results exist
|
|
592
|
+
if self.dimension is None:
|
|
593
|
+
raise ValueError("Dimension is not set for this Pinecone index")
|
|
594
|
+
dummy_vector = [0.0] * self.dimension
|
|
595
|
+
response = self.index.query(
|
|
596
|
+
vector=dummy_vector,
|
|
597
|
+
top_k=1,
|
|
598
|
+
namespace=self.namespace,
|
|
599
|
+
filter={"content_hash": {"$eq": content_hash}},
|
|
600
|
+
include_metadata=False,
|
|
601
|
+
include_values=False,
|
|
602
|
+
)
|
|
603
|
+
return len(response.matches) > 0
|
|
604
|
+
except Exception as e:
|
|
605
|
+
log_warning(f"Error checking if content_hash {content_hash} exists: {e}")
|
|
606
|
+
return False
|
|
607
|
+
|
|
608
|
+
def _delete_by_content_hash(self, content_hash: str) -> bool:
|
|
609
|
+
"""Delete documents by content hash (stored in metadata).
|
|
610
|
+
|
|
611
|
+
Args:
|
|
612
|
+
content_hash (str): The content hash to delete.
|
|
613
|
+
|
|
614
|
+
Returns:
|
|
615
|
+
bool: True if documents were deleted, False otherwise.
|
|
616
|
+
"""
|
|
617
|
+
try:
|
|
618
|
+
# Delete all documents where metadata.content_hash equals the given content_hash
|
|
619
|
+
self.index.delete(filter={"content_hash": {"$eq": content_hash}}, namespace=self.namespace)
|
|
620
|
+
return True
|
|
621
|
+
except Exception as e:
|
|
622
|
+
log_warning(f"Error deleting documents with content_hash {content_hash}: {e}")
|
|
623
|
+
return False
|
|
624
|
+
|
|
625
|
+
def update_metadata(self, content_id: str, metadata: Dict[str, Any]) -> None:
|
|
626
|
+
"""
|
|
627
|
+
Update the metadata for documents with the given content_id.
|
|
628
|
+
|
|
629
|
+
Args:
|
|
630
|
+
content_id (str): The content ID to update
|
|
631
|
+
metadata (Dict[str, Any]): The metadata to update
|
|
632
|
+
"""
|
|
633
|
+
try:
|
|
634
|
+
# Query for vectors with the given content_id
|
|
635
|
+
query_response = self.index.query(
|
|
636
|
+
filter={"content_id": {"$eq": content_id}},
|
|
637
|
+
top_k=10000, # Get all matching vectors
|
|
638
|
+
include_metadata=True,
|
|
639
|
+
namespace=self.namespace,
|
|
640
|
+
)
|
|
641
|
+
|
|
642
|
+
if not query_response.matches:
|
|
643
|
+
logger.debug(f"No documents found with content_id: {content_id}")
|
|
644
|
+
return
|
|
645
|
+
|
|
646
|
+
# Prepare updates for each matching vector
|
|
647
|
+
update_data = []
|
|
648
|
+
for match in query_response.matches:
|
|
649
|
+
vector_id = match.id
|
|
650
|
+
current_metadata = match.metadata or {}
|
|
651
|
+
|
|
652
|
+
# Merge existing metadata with new metadata
|
|
653
|
+
updated_metadata = current_metadata.copy()
|
|
654
|
+
updated_metadata.update(metadata)
|
|
655
|
+
|
|
656
|
+
if "filters" not in updated_metadata:
|
|
657
|
+
updated_metadata["filters"] = {}
|
|
658
|
+
if isinstance(updated_metadata["filters"], dict):
|
|
659
|
+
updated_metadata["filters"].update(metadata)
|
|
660
|
+
else:
|
|
661
|
+
updated_metadata["filters"] = metadata
|
|
662
|
+
|
|
663
|
+
update_data.append({"id": vector_id, "metadata": updated_metadata})
|
|
664
|
+
|
|
665
|
+
# Update vectors in batches
|
|
666
|
+
batch_size = 100
|
|
667
|
+
for i in range(0, len(update_data), batch_size):
|
|
668
|
+
batch = update_data[i : i + batch_size]
|
|
669
|
+
self.index.update(vectors=batch, namespace=self.namespace)
|
|
670
|
+
|
|
671
|
+
logger.debug(f"Updated metadata for {len(update_data)} documents with content_id: {content_id}")
|
|
672
|
+
|
|
673
|
+
except Exception as e:
|
|
674
|
+
logger.error(f"Error updating metadata for content_id '{content_id}': {e}")
|
|
675
|
+
raise
|