agno 1.8.2__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/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 +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 +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 +128 -72
- 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 +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 +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 +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 +17 -18
- 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 +18 -33
- 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 +1 -1
- 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 +6 -12
- 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 -110
- 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 -1053
- agno/app/playground/deploy.py +0 -249
- agno/app/playground/operator.py +0 -183
- agno/app/playground/schemas.py +0 -223
- agno/app/playground/serve.py +0 -55
- agno/app/playground/sync_router.py +0 -1045
- 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 -3313
- 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.2.dist-info/METADATA +0 -982
- agno-1.8.2.dist-info/RECORD +0 -566
- agno-1.8.2.dist-info/entry_points.txt +0 -3
- agno-1.8.2.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.2.dist-info → agno-2.0.0.dist-info}/WHEEL +0 -0
- {agno-1.8.2.dist-info → agno-2.0.0.dist-info}/top_level.txt +0 -0
|
@@ -7,8 +7,11 @@ from urllib.parse import urljoin, urlparse
|
|
|
7
7
|
|
|
8
8
|
import httpx
|
|
9
9
|
|
|
10
|
-
from agno.
|
|
11
|
-
from agno.
|
|
10
|
+
from agno.knowledge.chunking.semantic import SemanticChunking
|
|
11
|
+
from agno.knowledge.chunking.strategy import ChunkingStrategy, ChunkingStrategyType
|
|
12
|
+
from agno.knowledge.document.base import Document
|
|
13
|
+
from agno.knowledge.reader.base import Reader
|
|
14
|
+
from agno.knowledge.types import ContentType
|
|
12
15
|
from agno.utils.log import log_debug, logger
|
|
13
16
|
|
|
14
17
|
try:
|
|
@@ -28,9 +31,15 @@ class WebsiteReader(Reader):
|
|
|
28
31
|
_urls_to_crawl: List[Tuple[str, int]] = field(default_factory=list)
|
|
29
32
|
|
|
30
33
|
def __init__(
|
|
31
|
-
self,
|
|
34
|
+
self,
|
|
35
|
+
chunking_strategy: Optional[ChunkingStrategy] = SemanticChunking(),
|
|
36
|
+
max_depth: int = 3,
|
|
37
|
+
max_links: int = 10,
|
|
38
|
+
timeout: int = 10,
|
|
39
|
+
proxy: Optional[str] = None,
|
|
40
|
+
**kwargs,
|
|
32
41
|
):
|
|
33
|
-
super().__init__(**kwargs)
|
|
42
|
+
super().__init__(chunking_strategy=chunking_strategy, **kwargs)
|
|
34
43
|
self.max_depth = max_depth
|
|
35
44
|
self.max_links = max_links
|
|
36
45
|
self.proxy = proxy
|
|
@@ -39,6 +48,21 @@ class WebsiteReader(Reader):
|
|
|
39
48
|
self._visited = set()
|
|
40
49
|
self._urls_to_crawl = []
|
|
41
50
|
|
|
51
|
+
@classmethod
|
|
52
|
+
def get_supported_chunking_strategies(self) -> List[ChunkingStrategyType]:
|
|
53
|
+
"""Get the list of supported chunking strategies for Website readers."""
|
|
54
|
+
return [
|
|
55
|
+
ChunkingStrategyType.AGENTIC_CHUNKER,
|
|
56
|
+
ChunkingStrategyType.DOCUMENT_CHUNKER,
|
|
57
|
+
ChunkingStrategyType.RECURSIVE_CHUNKER,
|
|
58
|
+
ChunkingStrategyType.SEMANTIC_CHUNKER,
|
|
59
|
+
ChunkingStrategyType.FIXED_SIZE_CHUNKER,
|
|
60
|
+
]
|
|
61
|
+
|
|
62
|
+
@classmethod
|
|
63
|
+
def get_supported_content_types(self) -> List[ContentType]:
|
|
64
|
+
return [ContentType.URL]
|
|
65
|
+
|
|
42
66
|
def delay(self, min_seconds=1, max_seconds=3):
|
|
43
67
|
"""
|
|
44
68
|
Introduce a random delay.
|
|
@@ -316,7 +340,7 @@ class WebsiteReader(Reader):
|
|
|
316
340
|
|
|
317
341
|
return crawler_result
|
|
318
342
|
|
|
319
|
-
def read(self, url: str) -> List[Document]:
|
|
343
|
+
def read(self, url: str, name: Optional[str] = None) -> List[Document]:
|
|
320
344
|
"""
|
|
321
345
|
Reads a website and returns a list of documents.
|
|
322
346
|
|
|
@@ -338,7 +362,7 @@ class WebsiteReader(Reader):
|
|
|
338
362
|
documents.extend(
|
|
339
363
|
self.chunk_document(
|
|
340
364
|
Document(
|
|
341
|
-
name=url,
|
|
365
|
+
name=name or url,
|
|
342
366
|
id=str(crawled_url),
|
|
343
367
|
meta_data={"url": str(crawled_url)},
|
|
344
368
|
content=crawled_content,
|
|
@@ -348,7 +372,7 @@ class WebsiteReader(Reader):
|
|
|
348
372
|
else:
|
|
349
373
|
documents.append(
|
|
350
374
|
Document(
|
|
351
|
-
name=url,
|
|
375
|
+
name=name or url,
|
|
352
376
|
id=str(crawled_url),
|
|
353
377
|
meta_data={"url": str(crawled_url)},
|
|
354
378
|
content=crawled_content,
|
|
@@ -359,7 +383,7 @@ class WebsiteReader(Reader):
|
|
|
359
383
|
logger.error(f"Error reading website {url}: {e}")
|
|
360
384
|
raise
|
|
361
385
|
|
|
362
|
-
async def async_read(self, url: str) -> List[Document]:
|
|
386
|
+
async def async_read(self, url: str, name: Optional[str] = None) -> List[Document]:
|
|
363
387
|
"""
|
|
364
388
|
Asynchronously reads a website and returns a list of documents.
|
|
365
389
|
|
|
@@ -380,13 +404,16 @@ class WebsiteReader(Reader):
|
|
|
380
404
|
async def process_document(crawled_url, crawled_content):
|
|
381
405
|
if self.chunk:
|
|
382
406
|
doc = Document(
|
|
383
|
-
name=
|
|
407
|
+
name=name or url,
|
|
408
|
+
id=str(crawled_url),
|
|
409
|
+
meta_data={"url": str(crawled_url)},
|
|
410
|
+
content=crawled_content,
|
|
384
411
|
)
|
|
385
412
|
return self.chunk_document(doc)
|
|
386
413
|
else:
|
|
387
414
|
return [
|
|
388
415
|
Document(
|
|
389
|
-
name=url,
|
|
416
|
+
name=name or url,
|
|
390
417
|
id=str(crawled_url),
|
|
391
418
|
meta_data={"url": str(crawled_url)},
|
|
392
419
|
content=crawled_content,
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
from typing import List, Optional
|
|
2
|
+
|
|
3
|
+
from agno.knowledge.chunking.fixed import FixedSizeChunking
|
|
4
|
+
from agno.knowledge.chunking.strategy import ChunkingStrategy, ChunkingStrategyType
|
|
5
|
+
from agno.knowledge.document import Document
|
|
6
|
+
from agno.knowledge.reader.base import Reader
|
|
7
|
+
from agno.knowledge.types import ContentType
|
|
8
|
+
from agno.utils.log import log_debug, log_info
|
|
9
|
+
|
|
10
|
+
try:
|
|
11
|
+
import wikipedia # noqa: F401
|
|
12
|
+
except ImportError:
|
|
13
|
+
raise ImportError("The `wikipedia` package is not installed. Please install it via `pip install wikipedia`.")
|
|
14
|
+
|
|
15
|
+
|
|
16
|
+
class WikipediaReader(Reader):
|
|
17
|
+
auto_suggest: bool = True
|
|
18
|
+
|
|
19
|
+
def __init__(
|
|
20
|
+
self, chunking_strategy: Optional[ChunkingStrategy] = FixedSizeChunking(), auto_suggest: bool = True, **kwargs
|
|
21
|
+
):
|
|
22
|
+
super().__init__(chunking_strategy=chunking_strategy, **kwargs)
|
|
23
|
+
self.auto_suggest = auto_suggest
|
|
24
|
+
|
|
25
|
+
@classmethod
|
|
26
|
+
def get_supported_chunking_strategies(self) -> List[ChunkingStrategyType]:
|
|
27
|
+
"""Get the list of supported chunking strategies for Wikipedia readers."""
|
|
28
|
+
return [
|
|
29
|
+
ChunkingStrategyType.FIXED_SIZE_CHUNKER,
|
|
30
|
+
ChunkingStrategyType.AGENTIC_CHUNKER,
|
|
31
|
+
ChunkingStrategyType.DOCUMENT_CHUNKER,
|
|
32
|
+
ChunkingStrategyType.RECURSIVE_CHUNKER,
|
|
33
|
+
ChunkingStrategyType.SEMANTIC_CHUNKER,
|
|
34
|
+
]
|
|
35
|
+
|
|
36
|
+
@classmethod
|
|
37
|
+
def get_supported_content_types(self) -> List[ContentType]:
|
|
38
|
+
return [ContentType.TOPIC]
|
|
39
|
+
|
|
40
|
+
def read(self, topic: str) -> List[Document]:
|
|
41
|
+
log_debug(f"Reading Wikipedia topic: {topic}")
|
|
42
|
+
summary = None
|
|
43
|
+
try:
|
|
44
|
+
summary = wikipedia.summary(topic, auto_suggest=self.auto_suggest)
|
|
45
|
+
|
|
46
|
+
except wikipedia.exceptions.PageError:
|
|
47
|
+
summary = None
|
|
48
|
+
log_info("PageError: Page not found.")
|
|
49
|
+
|
|
50
|
+
# Only create Document if we successfully got a summary
|
|
51
|
+
if summary:
|
|
52
|
+
return [
|
|
53
|
+
Document(
|
|
54
|
+
name=topic,
|
|
55
|
+
meta_data={"topic": topic},
|
|
56
|
+
content=summary,
|
|
57
|
+
)
|
|
58
|
+
]
|
|
59
|
+
return []
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
import asyncio
|
|
2
|
+
from typing import List, Optional
|
|
3
|
+
|
|
4
|
+
from agno.knowledge.chunking.recursive import RecursiveChunking
|
|
5
|
+
from agno.knowledge.chunking.strategy import ChunkingStrategy, ChunkingStrategyType
|
|
6
|
+
from agno.knowledge.document.base import Document
|
|
7
|
+
from agno.knowledge.reader.base import Reader
|
|
8
|
+
from agno.knowledge.types import ContentType
|
|
9
|
+
from agno.utils.log import log_debug, log_error, log_info
|
|
10
|
+
|
|
11
|
+
try:
|
|
12
|
+
from youtube_transcript_api import YouTubeTranscriptApi
|
|
13
|
+
except ImportError:
|
|
14
|
+
raise ImportError(
|
|
15
|
+
"`youtube_transcript_api` not installed. Please install it via `pip install youtube_transcript_api`."
|
|
16
|
+
)
|
|
17
|
+
|
|
18
|
+
|
|
19
|
+
class YouTubeReader(Reader):
|
|
20
|
+
"""Reader for YouTube video transcripts"""
|
|
21
|
+
|
|
22
|
+
def __init__(self, chunking_strategy: Optional[ChunkingStrategy] = RecursiveChunking(), **kwargs):
|
|
23
|
+
super().__init__(chunking_strategy=chunking_strategy, **kwargs)
|
|
24
|
+
|
|
25
|
+
@classmethod
|
|
26
|
+
def get_supported_chunking_strategies(self) -> List[ChunkingStrategyType]:
|
|
27
|
+
"""Get the list of supported chunking strategies for YouTube readers."""
|
|
28
|
+
return [
|
|
29
|
+
ChunkingStrategyType.RECURSIVE_CHUNKER,
|
|
30
|
+
ChunkingStrategyType.AGENTIC_CHUNKER,
|
|
31
|
+
ChunkingStrategyType.DOCUMENT_CHUNKER,
|
|
32
|
+
ChunkingStrategyType.SEMANTIC_CHUNKER,
|
|
33
|
+
ChunkingStrategyType.FIXED_SIZE_CHUNKER,
|
|
34
|
+
]
|
|
35
|
+
|
|
36
|
+
@classmethod
|
|
37
|
+
def get_supported_content_types(self) -> List[ContentType]:
|
|
38
|
+
return [ContentType.YOUTUBE]
|
|
39
|
+
|
|
40
|
+
def read(self, url: str, name: Optional[str] = None) -> List[Document]:
|
|
41
|
+
try:
|
|
42
|
+
# Extract video ID from URL
|
|
43
|
+
video_id = url.split("v=")[-1].split("&")[0]
|
|
44
|
+
log_info(f"Reading transcript for video: {video_id}")
|
|
45
|
+
|
|
46
|
+
# Get transcript
|
|
47
|
+
log_debug(f"Fetching transcript for video: {video_id}")
|
|
48
|
+
# Create an instance of YouTubeTranscriptApi
|
|
49
|
+
ytt_api = YouTubeTranscriptApi()
|
|
50
|
+
transcript_data = ytt_api.fetch(video_id)
|
|
51
|
+
|
|
52
|
+
# Combine transcript segments into full text
|
|
53
|
+
transcript_text = ""
|
|
54
|
+
for segment in transcript_data:
|
|
55
|
+
transcript_text += f"{segment.text} "
|
|
56
|
+
|
|
57
|
+
documents = [
|
|
58
|
+
Document(
|
|
59
|
+
name=name or f"youtube_{video_id}",
|
|
60
|
+
id=f"youtube_{video_id}",
|
|
61
|
+
meta_data={"video_url": url, "video_id": video_id},
|
|
62
|
+
content=transcript_text.strip(),
|
|
63
|
+
)
|
|
64
|
+
]
|
|
65
|
+
|
|
66
|
+
if self.chunk:
|
|
67
|
+
chunked_documents = []
|
|
68
|
+
for document in documents:
|
|
69
|
+
chunked_documents.extend(self.chunk_document(document))
|
|
70
|
+
return chunked_documents
|
|
71
|
+
return documents
|
|
72
|
+
|
|
73
|
+
except Exception as e:
|
|
74
|
+
log_error(f"Error reading transcript for {url}: {e}")
|
|
75
|
+
return []
|
|
76
|
+
|
|
77
|
+
async def async_read(self, url: str) -> List[Document]:
|
|
78
|
+
return await asyncio.get_event_loop().run_in_executor(None, self.read, url)
|
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
from dataclasses import dataclass
|
|
2
|
+
from typing import Optional, Union
|
|
3
|
+
|
|
4
|
+
from agno.cloud.aws.s3.bucket import S3Bucket
|
|
5
|
+
from agno.cloud.aws.s3.object import S3Object
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
@dataclass
|
|
9
|
+
class S3Content:
|
|
10
|
+
def __init__(
|
|
11
|
+
self,
|
|
12
|
+
bucket_name: Optional[str] = None,
|
|
13
|
+
bucket: Optional[S3Bucket] = None,
|
|
14
|
+
key: Optional[str] = None,
|
|
15
|
+
object: Optional[S3Object] = None,
|
|
16
|
+
prefix: Optional[str] = None,
|
|
17
|
+
):
|
|
18
|
+
self.bucket_name = bucket_name
|
|
19
|
+
self.bucket = bucket
|
|
20
|
+
self.key = key
|
|
21
|
+
self.object = object
|
|
22
|
+
self.prefix = prefix
|
|
23
|
+
|
|
24
|
+
if bucket_name is None and bucket is None:
|
|
25
|
+
raise ValueError("Either bucket_name or bucket must be provided")
|
|
26
|
+
if key is None and object is None:
|
|
27
|
+
raise ValueError("Either key or object must be provided")
|
|
28
|
+
if bucket_name is not None and bucket is not None:
|
|
29
|
+
raise ValueError("Either bucket_name or bucket must be provided, not both")
|
|
30
|
+
if key is not None and object is not None:
|
|
31
|
+
raise ValueError("Either key or object must be provided, not both")
|
|
32
|
+
|
|
33
|
+
if self.bucket_name is not None:
|
|
34
|
+
self.bucket = S3Bucket(name=self.bucket_name)
|
|
35
|
+
|
|
36
|
+
def get_config(self):
|
|
37
|
+
return {
|
|
38
|
+
"bucket_name": self.bucket_name,
|
|
39
|
+
"bucket": self.bucket,
|
|
40
|
+
"key": self.key,
|
|
41
|
+
"object": self.object,
|
|
42
|
+
"prefix": self.prefix,
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
|
|
46
|
+
@dataclass
|
|
47
|
+
class GCSContent:
|
|
48
|
+
def __init__(
|
|
49
|
+
self,
|
|
50
|
+
bucket=None, # Type hint removed to avoid import issues
|
|
51
|
+
bucket_name: Optional[str] = None,
|
|
52
|
+
blob_name: Optional[str] = None,
|
|
53
|
+
prefix: Optional[str] = None,
|
|
54
|
+
):
|
|
55
|
+
# Import Google Cloud Storage only when actually needed
|
|
56
|
+
try:
|
|
57
|
+
from google.cloud import storage # type: ignore
|
|
58
|
+
except ImportError:
|
|
59
|
+
raise ImportError(
|
|
60
|
+
"The `google-cloud-storage` package is not installed. Please install it via `pip install google-cloud-storage`."
|
|
61
|
+
)
|
|
62
|
+
|
|
63
|
+
self.bucket = bucket
|
|
64
|
+
self.bucket_name = bucket_name
|
|
65
|
+
self.blob_name = blob_name
|
|
66
|
+
self.prefix = prefix
|
|
67
|
+
|
|
68
|
+
if self.bucket is None and self.bucket_name is None:
|
|
69
|
+
raise ValueError("No bucket or bucket_name provided")
|
|
70
|
+
if self.bucket is not None and self.bucket_name is not None:
|
|
71
|
+
raise ValueError("Provide either bucket or bucket_name")
|
|
72
|
+
if self.blob_name is None and self.prefix is None:
|
|
73
|
+
raise ValueError("Either blob_name or prefix must be provided")
|
|
74
|
+
|
|
75
|
+
if self.bucket is None:
|
|
76
|
+
client = storage.Client()
|
|
77
|
+
self.bucket = client.bucket(self.bucket_name)
|
|
78
|
+
|
|
79
|
+
def get_config(self):
|
|
80
|
+
return {
|
|
81
|
+
"bucket": self.bucket,
|
|
82
|
+
"bucket_name": self.bucket_name,
|
|
83
|
+
"blob_name": self.blob_name,
|
|
84
|
+
"prefix": self.prefix,
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
|
|
88
|
+
RemoteContent = Union[S3Content, GCSContent]
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
from typing import Any, Dict, List, Optional
|
|
2
2
|
|
|
3
|
-
from agno.document import Document
|
|
4
|
-
from agno.reranker.base import Reranker
|
|
3
|
+
from agno.knowledge.document import Document
|
|
4
|
+
from agno.knowledge.reranker.base import Reranker
|
|
5
5
|
from agno.utils.log import logger
|
|
6
6
|
|
|
7
7
|
try:
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
from typing import Any, List, Optional
|
|
2
2
|
from urllib.parse import urlparse
|
|
3
3
|
|
|
4
|
-
from agno.document import Document
|
|
5
|
-
from agno.reranker.base import Reranker
|
|
4
|
+
from agno.knowledge.document import Document
|
|
5
|
+
from agno.knowledge.reranker.base import Reranker
|
|
6
6
|
from agno.utils.log import logger
|
|
7
7
|
|
|
8
8
|
try:
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
from typing import Any, Dict, List, Optional
|
|
2
2
|
|
|
3
|
-
from agno.document import Document
|
|
4
|
-
from agno.reranker.base import Reranker
|
|
3
|
+
from agno.knowledge.document import Document
|
|
4
|
+
from agno.knowledge.reranker.base import Reranker
|
|
5
5
|
from agno.utils.log import logger
|
|
6
6
|
|
|
7
7
|
try:
|
agno/knowledge/types.py
ADDED
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
from enum import Enum
|
|
2
|
+
|
|
3
|
+
|
|
4
|
+
class ContentType(str, Enum):
|
|
5
|
+
"""Enum for content types supported by knowledge readers."""
|
|
6
|
+
|
|
7
|
+
# Generic types
|
|
8
|
+
FILE = "file"
|
|
9
|
+
URL = "url"
|
|
10
|
+
TEXT = "text"
|
|
11
|
+
TOPIC = "topic"
|
|
12
|
+
YOUTUBE = "youtube"
|
|
13
|
+
|
|
14
|
+
# Document file extensions
|
|
15
|
+
PDF = ".pdf"
|
|
16
|
+
TXT = ".txt"
|
|
17
|
+
MARKDOWN = ".md"
|
|
18
|
+
DOCX = ".docx"
|
|
19
|
+
DOC = ".doc"
|
|
20
|
+
JSON = ".json"
|
|
21
|
+
|
|
22
|
+
# Spreadsheet file extensions
|
|
23
|
+
CSV = ".csv"
|
|
24
|
+
XLSX = ".xlsx"
|
|
25
|
+
XLS = ".xls"
|
|
26
|
+
|
|
27
|
+
|
|
28
|
+
def get_content_type_enum(content_type_str: str) -> ContentType:
|
|
29
|
+
"""Convert a content type string to ContentType enum."""
|
|
30
|
+
return ContentType(content_type_str)
|
agno/knowledge/utils.py
ADDED
|
@@ -0,0 +1,169 @@
|
|
|
1
|
+
from typing import Dict, List
|
|
2
|
+
|
|
3
|
+
from agno.knowledge.reader.reader_factory import ReaderFactory
|
|
4
|
+
from agno.knowledge.types import ContentType
|
|
5
|
+
from agno.utils.log import log_debug
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
def _get_chunker_class(strategy_type):
|
|
9
|
+
"""Get the chunker class for a given strategy type without instantiation."""
|
|
10
|
+
from agno.knowledge.chunking.strategy import ChunkingStrategyType
|
|
11
|
+
|
|
12
|
+
# Map strategy types to their corresponding classes
|
|
13
|
+
strategy_class_mapping = {
|
|
14
|
+
ChunkingStrategyType.AGENTIC_CHUNKER: lambda: _import_class(
|
|
15
|
+
"agno.knowledge.chunking.agentic", "AgenticChunking"
|
|
16
|
+
),
|
|
17
|
+
ChunkingStrategyType.DOCUMENT_CHUNKER: lambda: _import_class(
|
|
18
|
+
"agno.knowledge.chunking.document", "DocumentChunking"
|
|
19
|
+
),
|
|
20
|
+
ChunkingStrategyType.RECURSIVE_CHUNKER: lambda: _import_class(
|
|
21
|
+
"agno.knowledge.chunking.recursive", "RecursiveChunking"
|
|
22
|
+
),
|
|
23
|
+
ChunkingStrategyType.SEMANTIC_CHUNKER: lambda: _import_class(
|
|
24
|
+
"agno.knowledge.chunking.semantic", "SemanticChunking"
|
|
25
|
+
),
|
|
26
|
+
ChunkingStrategyType.FIXED_SIZE_CHUNKER: lambda: _import_class(
|
|
27
|
+
"agno.knowledge.chunking.fixed", "FixedSizeChunking"
|
|
28
|
+
),
|
|
29
|
+
ChunkingStrategyType.ROW_CHUNKER: lambda: _import_class("agno.knowledge.chunking.row", "RowChunking"),
|
|
30
|
+
ChunkingStrategyType.MARKDOWN_CHUNKER: lambda: _import_class(
|
|
31
|
+
"agno.knowledge.chunking.markdown", "MarkdownChunking"
|
|
32
|
+
),
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
if strategy_type not in strategy_class_mapping:
|
|
36
|
+
raise ValueError(f"Unknown strategy type: {strategy_type}")
|
|
37
|
+
|
|
38
|
+
return strategy_class_mapping[strategy_type]()
|
|
39
|
+
|
|
40
|
+
|
|
41
|
+
def _import_class(module_name: str, class_name: str):
|
|
42
|
+
"""Dynamically import a class from a module."""
|
|
43
|
+
import importlib
|
|
44
|
+
|
|
45
|
+
module = importlib.import_module(module_name)
|
|
46
|
+
return getattr(module, class_name)
|
|
47
|
+
|
|
48
|
+
|
|
49
|
+
def get_reader_info(reader_key: str) -> Dict:
|
|
50
|
+
"""Get information about a reader without instantiating it."""
|
|
51
|
+
# Try to create the reader to get its info, but don't cache it
|
|
52
|
+
try:
|
|
53
|
+
reader_factory_method = ReaderFactory._get_reader_method(reader_key)
|
|
54
|
+
|
|
55
|
+
# Create an instance to get the class, then call class methods
|
|
56
|
+
reader_instance = reader_factory_method()
|
|
57
|
+
reader_class = reader_instance.__class__
|
|
58
|
+
|
|
59
|
+
supported_strategies = reader_class.get_supported_chunking_strategies()
|
|
60
|
+
supported_content_types = reader_class.get_supported_content_types()
|
|
61
|
+
|
|
62
|
+
return {
|
|
63
|
+
"id": reader_key,
|
|
64
|
+
"name": "".join(word.capitalize() for word in reader_key.split("_")) + "Reader",
|
|
65
|
+
"description": reader_instance.description,
|
|
66
|
+
"chunking_strategies": [
|
|
67
|
+
strategy.value for strategy in supported_strategies
|
|
68
|
+
], # Convert enums to string values
|
|
69
|
+
"content_types": [ct.value for ct in supported_content_types], # Convert enums to string values
|
|
70
|
+
}
|
|
71
|
+
except ImportError as e:
|
|
72
|
+
# Skip readers with missing dependencies
|
|
73
|
+
raise ValueError(f"Reader '{reader_key}' has missing dependencies: {str(e)}")
|
|
74
|
+
except Exception as e:
|
|
75
|
+
raise ValueError(f"Unknown reader: {reader_key}. Error: {str(e)}")
|
|
76
|
+
|
|
77
|
+
|
|
78
|
+
def get_all_readers_info() -> List[Dict]:
|
|
79
|
+
"""Get information about all available readers."""
|
|
80
|
+
readers_info = []
|
|
81
|
+
keys = ReaderFactory.get_all_reader_keys()
|
|
82
|
+
for key in keys:
|
|
83
|
+
try:
|
|
84
|
+
reader_info = get_reader_info(key)
|
|
85
|
+
readers_info.append(reader_info)
|
|
86
|
+
except ValueError as e:
|
|
87
|
+
# Skip readers with missing dependencies or other issues
|
|
88
|
+
# Log the error but don't fail the entire request
|
|
89
|
+
log_debug(f"Skipping reader '{key}': {e}")
|
|
90
|
+
continue
|
|
91
|
+
return readers_info
|
|
92
|
+
|
|
93
|
+
|
|
94
|
+
def get_content_types_to_readers_mapping() -> Dict[str, List[str]]:
|
|
95
|
+
"""Get mapping of content types to list of reader IDs that support them.
|
|
96
|
+
|
|
97
|
+
Returns:
|
|
98
|
+
Dictionary mapping content type strings (ContentType enum values) to list of reader IDs.
|
|
99
|
+
"""
|
|
100
|
+
content_type_mapping: Dict[str, List[str]] = {}
|
|
101
|
+
readers_info = get_all_readers_info()
|
|
102
|
+
|
|
103
|
+
for reader_info in readers_info:
|
|
104
|
+
reader_id = reader_info["id"]
|
|
105
|
+
content_types = reader_info.get("content_types", [])
|
|
106
|
+
|
|
107
|
+
for content_type in content_types:
|
|
108
|
+
if content_type not in content_type_mapping:
|
|
109
|
+
content_type_mapping[content_type] = []
|
|
110
|
+
content_type_mapping[content_type].append(reader_id)
|
|
111
|
+
|
|
112
|
+
return content_type_mapping
|
|
113
|
+
|
|
114
|
+
|
|
115
|
+
def get_chunker_info(chunker_key: str) -> Dict:
|
|
116
|
+
"""Get information about a chunker without instantiating it."""
|
|
117
|
+
try:
|
|
118
|
+
# Use chunking strategies directly
|
|
119
|
+
from agno.knowledge.chunking.strategy import ChunkingStrategyType
|
|
120
|
+
|
|
121
|
+
try:
|
|
122
|
+
# Use the chunker key directly as the strategy type value
|
|
123
|
+
strategy_type = ChunkingStrategyType.from_string(chunker_key)
|
|
124
|
+
|
|
125
|
+
# Get class directly without instantiation
|
|
126
|
+
chunker_class = _get_chunker_class(strategy_type)
|
|
127
|
+
|
|
128
|
+
# Extract class information
|
|
129
|
+
class_name = chunker_class.__name__
|
|
130
|
+
docstring = chunker_class.__doc__ or f"{class_name} chunking strategy"
|
|
131
|
+
|
|
132
|
+
return {
|
|
133
|
+
"key": chunker_key,
|
|
134
|
+
"class_name": class_name,
|
|
135
|
+
"name": chunker_key,
|
|
136
|
+
"description": docstring.strip(),
|
|
137
|
+
"strategy_type": strategy_type.value,
|
|
138
|
+
}
|
|
139
|
+
except ValueError:
|
|
140
|
+
raise ValueError(f"Unknown chunker key: {chunker_key}")
|
|
141
|
+
|
|
142
|
+
except ImportError as e:
|
|
143
|
+
# Skip chunkers with missing dependencies
|
|
144
|
+
raise ValueError(f"Chunker '{chunker_key}' has missing dependencies: {str(e)}")
|
|
145
|
+
except Exception as e:
|
|
146
|
+
raise ValueError(f"Unknown chunker: {chunker_key}. Error: {str(e)}")
|
|
147
|
+
|
|
148
|
+
|
|
149
|
+
def get_all_content_types() -> List[ContentType]:
|
|
150
|
+
"""Get all available content types as ContentType enums."""
|
|
151
|
+
return list(ContentType)
|
|
152
|
+
|
|
153
|
+
|
|
154
|
+
def get_all_chunkers_info() -> List[Dict]:
|
|
155
|
+
"""Get information about all available chunkers."""
|
|
156
|
+
chunkers_info = []
|
|
157
|
+
|
|
158
|
+
from agno.knowledge.chunking.strategy import ChunkingStrategyType
|
|
159
|
+
|
|
160
|
+
keys = [strategy_type.value for strategy_type in ChunkingStrategyType]
|
|
161
|
+
|
|
162
|
+
for key in keys:
|
|
163
|
+
try:
|
|
164
|
+
chunker_info = get_chunker_info(key)
|
|
165
|
+
chunkers_info.append(chunker_info)
|
|
166
|
+
except ValueError as e:
|
|
167
|
+
log_debug(f"Skipping chunker '{key}': {e}")
|
|
168
|
+
continue
|
|
169
|
+
return chunkers_info
|