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
agno/knowledge/arxiv.py
DELETED
|
@@ -1,33 +0,0 @@
|
|
|
1
|
-
from typing import AsyncIterator, Iterator, List
|
|
2
|
-
|
|
3
|
-
from agno.document import Document
|
|
4
|
-
from agno.document.reader.arxiv_reader import ArxivReader
|
|
5
|
-
from agno.knowledge.agent import AgentKnowledge
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
class ArxivKnowledgeBase(AgentKnowledge):
|
|
9
|
-
queries: List[str] = []
|
|
10
|
-
reader: ArxivReader = ArxivReader()
|
|
11
|
-
|
|
12
|
-
@property
|
|
13
|
-
def document_lists(self) -> Iterator[List[Document]]:
|
|
14
|
-
"""Iterate over urls and yield lists of documents.
|
|
15
|
-
Each object yielded by the iterator is a list of documents.
|
|
16
|
-
|
|
17
|
-
Returns:
|
|
18
|
-
Iterator[List[Document]]: Iterator yielding list of documents
|
|
19
|
-
"""
|
|
20
|
-
|
|
21
|
-
for _query in self.queries:
|
|
22
|
-
yield self.reader.read(query=_query)
|
|
23
|
-
|
|
24
|
-
@property
|
|
25
|
-
async def async_document_lists(self) -> AsyncIterator[List[Document]]:
|
|
26
|
-
"""Iterate over queries and yield lists of documents asynchronously.
|
|
27
|
-
Each object yielded by the iterator is a list of documents.
|
|
28
|
-
|
|
29
|
-
Returns:
|
|
30
|
-
AsyncIterator[List[Document]]: Async iterator yielding list of documents
|
|
31
|
-
"""
|
|
32
|
-
for _query in self.queries:
|
|
33
|
-
yield await self.reader.async_read(query=_query)
|
agno/knowledge/combined.py
DELETED
|
@@ -1,36 +0,0 @@
|
|
|
1
|
-
from typing import AsyncIterator, Iterator, List
|
|
2
|
-
|
|
3
|
-
from agno.document import Document
|
|
4
|
-
from agno.knowledge.agent import AgentKnowledge
|
|
5
|
-
from agno.utils.log import log_debug
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
class CombinedKnowledgeBase(AgentKnowledge):
|
|
9
|
-
sources: List[AgentKnowledge] = []
|
|
10
|
-
|
|
11
|
-
@property
|
|
12
|
-
def document_lists(self) -> Iterator[List[Document]]:
|
|
13
|
-
"""Iterate over knowledge bases and yield lists of documents.
|
|
14
|
-
Each object yielded by the iterator is a list of documents.
|
|
15
|
-
|
|
16
|
-
Returns:
|
|
17
|
-
Iterator[List[Document]]: Iterator yielding list of documents
|
|
18
|
-
"""
|
|
19
|
-
|
|
20
|
-
for kb in self.sources:
|
|
21
|
-
log_debug(f"Loading documents from {kb.__class__.__name__}")
|
|
22
|
-
yield from kb.document_lists
|
|
23
|
-
|
|
24
|
-
@property
|
|
25
|
-
async def async_document_lists(self) -> AsyncIterator[List[Document]]:
|
|
26
|
-
"""Iterate over knowledge bases and yield lists of documents.
|
|
27
|
-
Each object yielded by the iterator is a list of documents.
|
|
28
|
-
|
|
29
|
-
Returns:
|
|
30
|
-
Iterator[List[Document]]: Iterator yielding list of documents
|
|
31
|
-
"""
|
|
32
|
-
|
|
33
|
-
for kb in self.sources:
|
|
34
|
-
log_debug(f"Loading documents from {kb.__class__.__name__}")
|
|
35
|
-
async for document in kb.async_document_lists: # type: ignore
|
|
36
|
-
yield document
|
agno/knowledge/csv.py
DELETED
|
@@ -1,144 +0,0 @@
|
|
|
1
|
-
from pathlib import Path
|
|
2
|
-
from typing import Any, AsyncIterator, Dict, Iterator, List, Optional, Union
|
|
3
|
-
|
|
4
|
-
from pydantic import Field
|
|
5
|
-
|
|
6
|
-
from agno.document import Document
|
|
7
|
-
from agno.document.reader.csv_reader import CSVReader
|
|
8
|
-
from agno.knowledge.agent import AgentKnowledge
|
|
9
|
-
from agno.utils.log import log_info, logger
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
class CSVKnowledgeBase(AgentKnowledge):
|
|
13
|
-
path: Optional[Union[str, Path, List[Dict[str, Union[str, Dict[str, Any]]]]]] = None
|
|
14
|
-
formats: List[str] = [".csv"]
|
|
15
|
-
exclude_files: List[str] = Field(default_factory=list)
|
|
16
|
-
reader: CSVReader = CSVReader()
|
|
17
|
-
|
|
18
|
-
@property
|
|
19
|
-
def document_lists(self) -> Iterator[List[Document]]:
|
|
20
|
-
"""Iterate over CSV files and yield lists of documents."""
|
|
21
|
-
if self.path is None:
|
|
22
|
-
raise ValueError("Path is not set")
|
|
23
|
-
|
|
24
|
-
if isinstance(self.path, list):
|
|
25
|
-
for item in self.path:
|
|
26
|
-
if isinstance(item, dict) and "path" in item:
|
|
27
|
-
# Handle path with metadata
|
|
28
|
-
file_path = item["path"]
|
|
29
|
-
config = item.get("metadata", {})
|
|
30
|
-
_csv_path = Path(file_path) # type: ignore
|
|
31
|
-
if self._is_valid_csv(_csv_path):
|
|
32
|
-
documents = self.reader.read(file=_csv_path)
|
|
33
|
-
if config:
|
|
34
|
-
for doc in documents:
|
|
35
|
-
log_info(f"Adding metadata {config} to document: {doc.name}")
|
|
36
|
-
doc.meta_data.update(config) # type: ignore
|
|
37
|
-
yield documents
|
|
38
|
-
else:
|
|
39
|
-
# Handle single path
|
|
40
|
-
_csv_path = Path(self.path)
|
|
41
|
-
if _csv_path.is_dir():
|
|
42
|
-
for _csv in _csv_path.glob("**/*.csv"):
|
|
43
|
-
if _csv.name not in self.exclude_files:
|
|
44
|
-
yield self.reader.read(file=_csv)
|
|
45
|
-
elif self._is_valid_csv(_csv_path):
|
|
46
|
-
yield self.reader.read(file=_csv_path)
|
|
47
|
-
|
|
48
|
-
def _is_valid_csv(self, path: Path) -> bool:
|
|
49
|
-
"""Helper to check if path is a valid CSV file."""
|
|
50
|
-
return path.exists() and path.is_file() and path.suffix == ".csv" and path.name not in self.exclude_files
|
|
51
|
-
|
|
52
|
-
@property
|
|
53
|
-
async def async_document_lists(self) -> AsyncIterator[List[Document]]:
|
|
54
|
-
"""Iterate over CSV files and yield lists of documents asynchronously."""
|
|
55
|
-
if self.path is None:
|
|
56
|
-
raise ValueError("Path is not set")
|
|
57
|
-
|
|
58
|
-
if isinstance(self.path, list):
|
|
59
|
-
for item in self.path:
|
|
60
|
-
if isinstance(item, dict) and "path" in item:
|
|
61
|
-
# Handle path with metadata
|
|
62
|
-
file_path = item["path"]
|
|
63
|
-
config = item.get("metadata", {})
|
|
64
|
-
_csv_path = Path(file_path) # type: ignore
|
|
65
|
-
if self._is_valid_csv(_csv_path):
|
|
66
|
-
documents = await self.reader.async_read(file=_csv_path)
|
|
67
|
-
if config:
|
|
68
|
-
for doc in documents:
|
|
69
|
-
log_info(f"Adding metadata {config} to document: {doc.name}")
|
|
70
|
-
doc.meta_data.update(config) # type: ignore
|
|
71
|
-
yield documents
|
|
72
|
-
else:
|
|
73
|
-
# Handle single path
|
|
74
|
-
_csv_path = Path(self.path)
|
|
75
|
-
if _csv_path.is_dir():
|
|
76
|
-
for _csv in _csv_path.glob("**/*.csv"):
|
|
77
|
-
if _csv.name not in self.exclude_files:
|
|
78
|
-
yield await self.reader.async_read(file=_csv)
|
|
79
|
-
elif self._is_valid_csv(_csv_path):
|
|
80
|
-
yield await self.reader.async_read(file=_csv_path)
|
|
81
|
-
|
|
82
|
-
def load_document(
|
|
83
|
-
self,
|
|
84
|
-
path: Union[str, Path],
|
|
85
|
-
metadata: Optional[Dict[str, Any]] = None,
|
|
86
|
-
recreate: bool = False,
|
|
87
|
-
upsert: bool = False,
|
|
88
|
-
skip_existing: bool = True,
|
|
89
|
-
) -> None:
|
|
90
|
-
"""Load documents from a single CSV file with specific metadata into the vector DB."""
|
|
91
|
-
|
|
92
|
-
_file_path = Path(path) if isinstance(path, str) else path
|
|
93
|
-
|
|
94
|
-
# Validate file and prepare collection in one step
|
|
95
|
-
if not self.prepare_load(_file_path, self.formats, metadata, recreate):
|
|
96
|
-
return
|
|
97
|
-
|
|
98
|
-
# Read documents
|
|
99
|
-
try:
|
|
100
|
-
documents = self.reader.read(file=_file_path)
|
|
101
|
-
except Exception as e:
|
|
102
|
-
logger.exception(f"Failed to read documents from file {_file_path}: {e}")
|
|
103
|
-
return
|
|
104
|
-
|
|
105
|
-
# Process documents
|
|
106
|
-
self.process_documents(
|
|
107
|
-
documents=documents,
|
|
108
|
-
metadata=metadata,
|
|
109
|
-
upsert=upsert,
|
|
110
|
-
skip_existing=skip_existing,
|
|
111
|
-
source_info=str(_file_path),
|
|
112
|
-
)
|
|
113
|
-
|
|
114
|
-
async def aload_document(
|
|
115
|
-
self,
|
|
116
|
-
path: Union[str, Path],
|
|
117
|
-
metadata: Optional[Dict[str, Any]] = None,
|
|
118
|
-
recreate: bool = False,
|
|
119
|
-
upsert: bool = False,
|
|
120
|
-
skip_existing: bool = True,
|
|
121
|
-
) -> None:
|
|
122
|
-
"""Load documents from a single CSV file with specific metadata into the vector DB."""
|
|
123
|
-
|
|
124
|
-
_file_path = Path(path) if isinstance(path, str) else path
|
|
125
|
-
|
|
126
|
-
# Validate file and prepare collection in one step
|
|
127
|
-
if not await self.aprepare_load(_file_path, self.formats, metadata, recreate):
|
|
128
|
-
return
|
|
129
|
-
|
|
130
|
-
# Read documents
|
|
131
|
-
try:
|
|
132
|
-
documents = await self.reader.async_read(file=_file_path)
|
|
133
|
-
except Exception as e:
|
|
134
|
-
logger.exception(f"Failed to read documents from file {_file_path}: {e}")
|
|
135
|
-
return
|
|
136
|
-
|
|
137
|
-
# Process documents
|
|
138
|
-
await self.aprocess_documents(
|
|
139
|
-
documents=documents,
|
|
140
|
-
metadata=metadata,
|
|
141
|
-
upsert=upsert,
|
|
142
|
-
skip_existing=skip_existing,
|
|
143
|
-
source_info=str(_file_path),
|
|
144
|
-
)
|
agno/knowledge/csv_url.py
DELETED
|
@@ -1,124 +0,0 @@
|
|
|
1
|
-
from typing import Any, AsyncIterator, Dict, Iterator, List, Optional, Union
|
|
2
|
-
|
|
3
|
-
from agno.document import Document
|
|
4
|
-
from agno.document.reader.csv_reader import CSVUrlReader
|
|
5
|
-
from agno.knowledge.agent import AgentKnowledge
|
|
6
|
-
from agno.utils.log import log_info, logger
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
class CSVUrlKnowledgeBase(AgentKnowledge):
|
|
10
|
-
urls: Optional[Union[List[str], List[Dict[str, Union[str, Dict[str, Any]]]]]] = None
|
|
11
|
-
formats: List[str] = [".csv"]
|
|
12
|
-
reader: CSVUrlReader = CSVUrlReader()
|
|
13
|
-
|
|
14
|
-
@property
|
|
15
|
-
def document_lists(self) -> Iterator[List[Document]]:
|
|
16
|
-
"""Iterate over CSV URLs and yield lists of documents."""
|
|
17
|
-
if self.urls is None:
|
|
18
|
-
raise ValueError("URLs are not set")
|
|
19
|
-
|
|
20
|
-
for item in self.urls:
|
|
21
|
-
if isinstance(item, dict) and "url" in item:
|
|
22
|
-
# Handle URL with metadata
|
|
23
|
-
url = item["url"]
|
|
24
|
-
if isinstance(url, str): # Type guard
|
|
25
|
-
config = item.get("metadata", {})
|
|
26
|
-
if self._is_valid_csv_url(url):
|
|
27
|
-
documents = self.reader.read(url=url)
|
|
28
|
-
if config and isinstance(config, dict):
|
|
29
|
-
for doc in documents:
|
|
30
|
-
log_info(f"Adding metadata {config} to document: {doc.name}")
|
|
31
|
-
doc.meta_data.update(config) # type: ignore
|
|
32
|
-
yield documents
|
|
33
|
-
elif isinstance(item, str):
|
|
34
|
-
# Handle plain URL string
|
|
35
|
-
if self._is_valid_csv_url(item):
|
|
36
|
-
yield self.reader.read(url=item)
|
|
37
|
-
|
|
38
|
-
def _is_valid_csv_url(self, url: str) -> bool:
|
|
39
|
-
"""Helper to check if URL is a valid CSV URL."""
|
|
40
|
-
return url.endswith(".csv")
|
|
41
|
-
|
|
42
|
-
@property
|
|
43
|
-
async def async_document_lists(self) -> AsyncIterator[List[Document]]:
|
|
44
|
-
"""Iterate over CSV URLs and yield lists of documents asynchronously."""
|
|
45
|
-
if self.urls is None:
|
|
46
|
-
raise ValueError("URLs are not set")
|
|
47
|
-
|
|
48
|
-
for item in self.urls:
|
|
49
|
-
if isinstance(item, dict) and "url" in item:
|
|
50
|
-
# Handle URL with metadata
|
|
51
|
-
url = item["url"]
|
|
52
|
-
if isinstance(url, str): # Type guard
|
|
53
|
-
config = item.get("metadata", {})
|
|
54
|
-
if self._is_valid_csv_url(url):
|
|
55
|
-
documents = await self.reader.async_read(url=url)
|
|
56
|
-
if config and isinstance(config, dict):
|
|
57
|
-
for doc in documents:
|
|
58
|
-
log_info(f"Adding metadata {config} to document: {doc.name}")
|
|
59
|
-
doc.meta_data.update(config) # type: ignore
|
|
60
|
-
yield documents
|
|
61
|
-
elif isinstance(item, str):
|
|
62
|
-
# Handle plain URL string
|
|
63
|
-
if self._is_valid_csv_url(item):
|
|
64
|
-
yield await self.reader.async_read(url=item)
|
|
65
|
-
|
|
66
|
-
def load_document(
|
|
67
|
-
self,
|
|
68
|
-
url: str,
|
|
69
|
-
metadata: Optional[Dict[str, Any]] = None,
|
|
70
|
-
recreate: bool = False,
|
|
71
|
-
upsert: bool = False,
|
|
72
|
-
skip_existing: bool = True,
|
|
73
|
-
) -> None:
|
|
74
|
-
"""Load documents from a single CSV URL with specific metadata into the vector DB."""
|
|
75
|
-
|
|
76
|
-
# Validate URL and prepare collection in one step
|
|
77
|
-
if not self.prepare_load(url, self.formats, metadata, recreate, is_url=True): # type: ignore
|
|
78
|
-
return
|
|
79
|
-
|
|
80
|
-
# Read documents
|
|
81
|
-
try:
|
|
82
|
-
documents = self.reader.read(url=url)
|
|
83
|
-
except Exception as e:
|
|
84
|
-
logger.exception(f"Failed to read documents from URL {url}: {e}")
|
|
85
|
-
return
|
|
86
|
-
|
|
87
|
-
# Process documents
|
|
88
|
-
self.process_documents(
|
|
89
|
-
documents=documents,
|
|
90
|
-
metadata=metadata,
|
|
91
|
-
upsert=upsert,
|
|
92
|
-
skip_existing=skip_existing,
|
|
93
|
-
source_info=url,
|
|
94
|
-
)
|
|
95
|
-
|
|
96
|
-
async def aload_document(
|
|
97
|
-
self,
|
|
98
|
-
url: str,
|
|
99
|
-
metadata: Optional[Dict[str, Any]] = None,
|
|
100
|
-
recreate: bool = False,
|
|
101
|
-
upsert: bool = False,
|
|
102
|
-
skip_existing: bool = True,
|
|
103
|
-
) -> None:
|
|
104
|
-
"""Load documents from a single CSV URL with specific metadata into the vector DB."""
|
|
105
|
-
|
|
106
|
-
# Validate URL and prepare collection in one step
|
|
107
|
-
if not await self.aprepare_load(url, self.formats, metadata, recreate, is_url=True): # type: ignore
|
|
108
|
-
return
|
|
109
|
-
|
|
110
|
-
# Read documents
|
|
111
|
-
try:
|
|
112
|
-
documents = await self.reader.async_read(url=url)
|
|
113
|
-
except Exception as e:
|
|
114
|
-
logger.exception(f"Failed to read documents from URL {url}: {e}")
|
|
115
|
-
return
|
|
116
|
-
|
|
117
|
-
# Process documents
|
|
118
|
-
await self.aprocess_documents(
|
|
119
|
-
documents=documents,
|
|
120
|
-
metadata=metadata,
|
|
121
|
-
upsert=upsert,
|
|
122
|
-
skip_existing=skip_existing,
|
|
123
|
-
source_info=url,
|
|
124
|
-
)
|
agno/knowledge/document.py
DELETED
|
@@ -1,223 +0,0 @@
|
|
|
1
|
-
from typing import Any, AsyncIterator, Dict, Iterator, List, Optional, Union
|
|
2
|
-
|
|
3
|
-
from agno.document import Document
|
|
4
|
-
from agno.knowledge.agent import AgentKnowledge
|
|
5
|
-
from agno.utils.log import log_info, logger
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
class DocumentKnowledgeBase(AgentKnowledge):
|
|
9
|
-
documents: Optional[Union[List[Document], List[Dict[str, Any]]]] = None
|
|
10
|
-
|
|
11
|
-
@property
|
|
12
|
-
def document_lists(self) -> Iterator[List[Document]]:
|
|
13
|
-
"""Iterate over documents and yield lists of documents.
|
|
14
|
-
Each object yielded by the iterator is a list of documents.
|
|
15
|
-
|
|
16
|
-
Returns:
|
|
17
|
-
Iterator[List[Document]]: Iterator yielding list of documents
|
|
18
|
-
"""
|
|
19
|
-
if self.documents is None:
|
|
20
|
-
# Return empty iterator when no documents are set
|
|
21
|
-
return
|
|
22
|
-
|
|
23
|
-
for item in self.documents:
|
|
24
|
-
if isinstance(item, dict) and "document" in item:
|
|
25
|
-
# Handle document with metadata
|
|
26
|
-
document: Document = item["document"]
|
|
27
|
-
config = item.get("metadata", {})
|
|
28
|
-
if config:
|
|
29
|
-
log_info(f"Adding metadata {config} to document: {document.name}")
|
|
30
|
-
# Create a copy of the document with updated metadata
|
|
31
|
-
updated_document = Document(
|
|
32
|
-
content=document.content,
|
|
33
|
-
id=document.id,
|
|
34
|
-
name=document.name,
|
|
35
|
-
meta_data={**document.meta_data, **config},
|
|
36
|
-
embedder=document.embedder,
|
|
37
|
-
embedding=document.embedding,
|
|
38
|
-
usage=document.usage,
|
|
39
|
-
reranking_score=document.reranking_score,
|
|
40
|
-
)
|
|
41
|
-
yield [updated_document]
|
|
42
|
-
else:
|
|
43
|
-
yield [document]
|
|
44
|
-
elif isinstance(item, Document):
|
|
45
|
-
# Handle direct document
|
|
46
|
-
yield [item]
|
|
47
|
-
else:
|
|
48
|
-
raise ValueError(f"Invalid document format: {type(item)}")
|
|
49
|
-
|
|
50
|
-
@property
|
|
51
|
-
async def async_document_lists(self) -> AsyncIterator[List[Document]]:
|
|
52
|
-
"""Iterate over documents and yield lists of documents asynchronously.
|
|
53
|
-
Each object yielded by the iterator is a list of documents.
|
|
54
|
-
|
|
55
|
-
Returns:
|
|
56
|
-
AsyncIterator[List[Document]]: Iterator yielding list of documents
|
|
57
|
-
"""
|
|
58
|
-
if self.documents is None:
|
|
59
|
-
# Return empty iterator when no documents are set
|
|
60
|
-
return
|
|
61
|
-
|
|
62
|
-
for item in self.documents:
|
|
63
|
-
if isinstance(item, dict) and "document" in item:
|
|
64
|
-
# Handle document with metadata
|
|
65
|
-
document: Document = item["document"]
|
|
66
|
-
config = item.get("metadata", {})
|
|
67
|
-
if config:
|
|
68
|
-
log_info(f"Adding metadata {config} to document: {document.name}")
|
|
69
|
-
# Create a copy of the document with updated metadata
|
|
70
|
-
updated_document = Document(
|
|
71
|
-
content=document.content,
|
|
72
|
-
id=document.id,
|
|
73
|
-
name=document.name,
|
|
74
|
-
meta_data={**document.meta_data, **config},
|
|
75
|
-
embedder=document.embedder,
|
|
76
|
-
embedding=document.embedding,
|
|
77
|
-
usage=document.usage,
|
|
78
|
-
reranking_score=document.reranking_score,
|
|
79
|
-
)
|
|
80
|
-
yield [updated_document]
|
|
81
|
-
else:
|
|
82
|
-
yield [document]
|
|
83
|
-
elif isinstance(item, Document):
|
|
84
|
-
# Handle direct document
|
|
85
|
-
yield [item]
|
|
86
|
-
else:
|
|
87
|
-
raise ValueError(f"Invalid document format: {type(item)}")
|
|
88
|
-
|
|
89
|
-
def _prepare_document_load(
|
|
90
|
-
self,
|
|
91
|
-
metadata: Optional[Dict[str, Any]] = None,
|
|
92
|
-
recreate: bool = False,
|
|
93
|
-
) -> bool:
|
|
94
|
-
"""Prepare collection for loading documents (no file validation needed).
|
|
95
|
-
Args:
|
|
96
|
-
metadata (Optional[Dict[str, Any]]): Metadata to track
|
|
97
|
-
recreate (bool): Whether to recreate the collection
|
|
98
|
-
Returns:
|
|
99
|
-
bool: True if preparation succeeded, False otherwise
|
|
100
|
-
"""
|
|
101
|
-
# 1. Track metadata
|
|
102
|
-
if metadata:
|
|
103
|
-
self._track_metadata_structure(metadata)
|
|
104
|
-
|
|
105
|
-
# 2. Prepare vector DB
|
|
106
|
-
if self.vector_db is None:
|
|
107
|
-
logger.warning("Cannot load document: No vector db provided.")
|
|
108
|
-
return False
|
|
109
|
-
|
|
110
|
-
# Recreate collection if requested
|
|
111
|
-
if recreate:
|
|
112
|
-
self.vector_db.drop()
|
|
113
|
-
|
|
114
|
-
# Create collection if it doesn't exist
|
|
115
|
-
if not self.vector_db.exists():
|
|
116
|
-
self.vector_db.create()
|
|
117
|
-
|
|
118
|
-
return True
|
|
119
|
-
|
|
120
|
-
async def _aprepare_document_load(
|
|
121
|
-
self,
|
|
122
|
-
metadata: Optional[Dict[str, Any]] = None,
|
|
123
|
-
recreate: bool = False,
|
|
124
|
-
) -> bool:
|
|
125
|
-
"""Prepare collection for loading documents asynchronously (no file validation needed).
|
|
126
|
-
Args:
|
|
127
|
-
metadata (Optional[Dict[str, Any]]): Metadata to track
|
|
128
|
-
recreate (bool): Whether to recreate the collection
|
|
129
|
-
Returns:
|
|
130
|
-
bool: True if preparation succeeded, False otherwise
|
|
131
|
-
"""
|
|
132
|
-
# 1. Track metadata
|
|
133
|
-
if metadata:
|
|
134
|
-
self._track_metadata_structure(metadata)
|
|
135
|
-
|
|
136
|
-
# 2. Prepare vector DB
|
|
137
|
-
if self.vector_db is None:
|
|
138
|
-
logger.warning("Cannot load document: No vector db provided.")
|
|
139
|
-
return False
|
|
140
|
-
|
|
141
|
-
# Recreate collection if requested
|
|
142
|
-
if recreate:
|
|
143
|
-
await self.vector_db.async_drop()
|
|
144
|
-
|
|
145
|
-
# Create collection if it doesn't exist
|
|
146
|
-
if not await self.vector_db.async_exists():
|
|
147
|
-
await self.vector_db.async_create()
|
|
148
|
-
|
|
149
|
-
return True
|
|
150
|
-
|
|
151
|
-
def load_document(
|
|
152
|
-
self,
|
|
153
|
-
document: Document,
|
|
154
|
-
metadata: Optional[Dict[str, Any]] = None,
|
|
155
|
-
recreate: bool = False,
|
|
156
|
-
upsert: bool = False,
|
|
157
|
-
skip_existing: bool = True,
|
|
158
|
-
) -> None:
|
|
159
|
-
"""Load a single document with specific metadata into the vector DB."""
|
|
160
|
-
|
|
161
|
-
# Use our document-specific preparation method
|
|
162
|
-
if not self._prepare_document_load(metadata, recreate):
|
|
163
|
-
return
|
|
164
|
-
|
|
165
|
-
# Apply metadata if provided
|
|
166
|
-
if metadata:
|
|
167
|
-
# Create a copy of the document with updated metadata
|
|
168
|
-
document = Document(
|
|
169
|
-
content=document.content,
|
|
170
|
-
id=document.id,
|
|
171
|
-
name=document.name,
|
|
172
|
-
meta_data={**document.meta_data, **metadata},
|
|
173
|
-
embedder=document.embedder,
|
|
174
|
-
embedding=document.embedding,
|
|
175
|
-
usage=document.usage,
|
|
176
|
-
reranking_score=document.reranking_score,
|
|
177
|
-
)
|
|
178
|
-
|
|
179
|
-
# Process documents
|
|
180
|
-
self.process_documents(
|
|
181
|
-
documents=[document],
|
|
182
|
-
metadata=metadata,
|
|
183
|
-
upsert=upsert,
|
|
184
|
-
skip_existing=skip_existing,
|
|
185
|
-
source_info=f"document: {document.name or document.id}",
|
|
186
|
-
)
|
|
187
|
-
|
|
188
|
-
async def aload_document(
|
|
189
|
-
self,
|
|
190
|
-
document: Document,
|
|
191
|
-
metadata: Optional[Dict[str, Any]] = None,
|
|
192
|
-
recreate: bool = False,
|
|
193
|
-
upsert: bool = False,
|
|
194
|
-
skip_existing: bool = True,
|
|
195
|
-
) -> None:
|
|
196
|
-
"""Load a single document with specific metadata into the vector DB asynchronously."""
|
|
197
|
-
|
|
198
|
-
# Use our document-specific preparation method
|
|
199
|
-
if not await self._aprepare_document_load(metadata, recreate):
|
|
200
|
-
return
|
|
201
|
-
|
|
202
|
-
# Apply metadata if provided
|
|
203
|
-
if metadata:
|
|
204
|
-
# Create a copy of the document with updated metadata
|
|
205
|
-
document = Document(
|
|
206
|
-
content=document.content,
|
|
207
|
-
id=document.id,
|
|
208
|
-
name=document.name,
|
|
209
|
-
meta_data={**document.meta_data, **metadata},
|
|
210
|
-
embedder=document.embedder,
|
|
211
|
-
embedding=document.embedding,
|
|
212
|
-
usage=document.usage,
|
|
213
|
-
reranking_score=document.reranking_score,
|
|
214
|
-
)
|
|
215
|
-
|
|
216
|
-
# Process documents
|
|
217
|
-
await self.aprocess_documents(
|
|
218
|
-
documents=[document],
|
|
219
|
-
metadata=metadata,
|
|
220
|
-
upsert=upsert,
|
|
221
|
-
skip_existing=skip_existing,
|
|
222
|
-
source_info=f"document: {document.name or document.id}",
|
|
223
|
-
)
|