agno 2.2.13__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- agno/__init__.py +8 -0
- agno/agent/__init__.py +51 -0
- agno/agent/agent.py +10405 -0
- agno/api/__init__.py +0 -0
- agno/api/agent.py +28 -0
- agno/api/api.py +40 -0
- agno/api/evals.py +22 -0
- agno/api/os.py +17 -0
- agno/api/routes.py +13 -0
- agno/api/schemas/__init__.py +9 -0
- agno/api/schemas/agent.py +16 -0
- agno/api/schemas/evals.py +16 -0
- agno/api/schemas/os.py +14 -0
- agno/api/schemas/response.py +6 -0
- agno/api/schemas/team.py +16 -0
- agno/api/schemas/utils.py +21 -0
- agno/api/schemas/workflows.py +16 -0
- agno/api/settings.py +53 -0
- agno/api/team.py +30 -0
- 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/culture/__init__.py +3 -0
- agno/culture/manager.py +956 -0
- agno/db/__init__.py +24 -0
- agno/db/async_postgres/__init__.py +3 -0
- agno/db/base.py +598 -0
- agno/db/dynamo/__init__.py +3 -0
- agno/db/dynamo/dynamo.py +2042 -0
- agno/db/dynamo/schemas.py +314 -0
- agno/db/dynamo/utils.py +743 -0
- agno/db/firestore/__init__.py +3 -0
- agno/db/firestore/firestore.py +1795 -0
- agno/db/firestore/schemas.py +140 -0
- agno/db/firestore/utils.py +376 -0
- agno/db/gcs_json/__init__.py +3 -0
- agno/db/gcs_json/gcs_json_db.py +1335 -0
- agno/db/gcs_json/utils.py +228 -0
- agno/db/in_memory/__init__.py +3 -0
- agno/db/in_memory/in_memory_db.py +1160 -0
- agno/db/in_memory/utils.py +230 -0
- agno/db/json/__init__.py +3 -0
- agno/db/json/json_db.py +1328 -0
- agno/db/json/utils.py +230 -0
- agno/db/migrations/__init__.py +0 -0
- agno/db/migrations/v1_to_v2.py +635 -0
- agno/db/mongo/__init__.py +17 -0
- agno/db/mongo/async_mongo.py +2026 -0
- agno/db/mongo/mongo.py +1982 -0
- agno/db/mongo/schemas.py +87 -0
- agno/db/mongo/utils.py +259 -0
- agno/db/mysql/__init__.py +3 -0
- agno/db/mysql/mysql.py +2308 -0
- agno/db/mysql/schemas.py +138 -0
- agno/db/mysql/utils.py +355 -0
- agno/db/postgres/__init__.py +4 -0
- agno/db/postgres/async_postgres.py +1927 -0
- agno/db/postgres/postgres.py +2260 -0
- agno/db/postgres/schemas.py +139 -0
- agno/db/postgres/utils.py +442 -0
- agno/db/redis/__init__.py +3 -0
- agno/db/redis/redis.py +1660 -0
- agno/db/redis/schemas.py +123 -0
- agno/db/redis/utils.py +346 -0
- agno/db/schemas/__init__.py +4 -0
- agno/db/schemas/culture.py +120 -0
- agno/db/schemas/evals.py +33 -0
- agno/db/schemas/knowledge.py +40 -0
- agno/db/schemas/memory.py +46 -0
- agno/db/schemas/metrics.py +0 -0
- agno/db/singlestore/__init__.py +3 -0
- agno/db/singlestore/schemas.py +130 -0
- agno/db/singlestore/singlestore.py +2272 -0
- agno/db/singlestore/utils.py +384 -0
- agno/db/sqlite/__init__.py +4 -0
- agno/db/sqlite/async_sqlite.py +2293 -0
- agno/db/sqlite/schemas.py +133 -0
- agno/db/sqlite/sqlite.py +2288 -0
- agno/db/sqlite/utils.py +431 -0
- agno/db/surrealdb/__init__.py +3 -0
- agno/db/surrealdb/metrics.py +292 -0
- agno/db/surrealdb/models.py +309 -0
- agno/db/surrealdb/queries.py +71 -0
- agno/db/surrealdb/surrealdb.py +1353 -0
- agno/db/surrealdb/utils.py +147 -0
- agno/db/utils.py +116 -0
- agno/debug.py +18 -0
- agno/eval/__init__.py +14 -0
- agno/eval/accuracy.py +834 -0
- agno/eval/performance.py +773 -0
- agno/eval/reliability.py +306 -0
- agno/eval/utils.py +119 -0
- agno/exceptions.py +161 -0
- agno/filters.py +354 -0
- agno/guardrails/__init__.py +6 -0
- agno/guardrails/base.py +19 -0
- agno/guardrails/openai.py +144 -0
- agno/guardrails/pii.py +94 -0
- agno/guardrails/prompt_injection.py +52 -0
- agno/integrations/__init__.py +0 -0
- agno/integrations/discord/__init__.py +3 -0
- agno/integrations/discord/client.py +203 -0
- agno/knowledge/__init__.py +5 -0
- agno/knowledge/chunking/__init__.py +0 -0
- agno/knowledge/chunking/agentic.py +79 -0
- agno/knowledge/chunking/document.py +91 -0
- agno/knowledge/chunking/fixed.py +57 -0
- agno/knowledge/chunking/markdown.py +151 -0
- agno/knowledge/chunking/recursive.py +63 -0
- agno/knowledge/chunking/row.py +39 -0
- agno/knowledge/chunking/semantic.py +86 -0
- agno/knowledge/chunking/strategy.py +165 -0
- agno/knowledge/content.py +74 -0
- agno/knowledge/document/__init__.py +5 -0
- agno/knowledge/document/base.py +58 -0
- agno/knowledge/embedder/__init__.py +5 -0
- agno/knowledge/embedder/aws_bedrock.py +343 -0
- agno/knowledge/embedder/azure_openai.py +210 -0
- agno/knowledge/embedder/base.py +23 -0
- agno/knowledge/embedder/cohere.py +323 -0
- agno/knowledge/embedder/fastembed.py +62 -0
- agno/knowledge/embedder/fireworks.py +13 -0
- agno/knowledge/embedder/google.py +258 -0
- agno/knowledge/embedder/huggingface.py +94 -0
- agno/knowledge/embedder/jina.py +182 -0
- agno/knowledge/embedder/langdb.py +22 -0
- agno/knowledge/embedder/mistral.py +206 -0
- agno/knowledge/embedder/nebius.py +13 -0
- agno/knowledge/embedder/ollama.py +154 -0
- agno/knowledge/embedder/openai.py +195 -0
- agno/knowledge/embedder/sentence_transformer.py +63 -0
- agno/knowledge/embedder/together.py +13 -0
- agno/knowledge/embedder/vllm.py +262 -0
- agno/knowledge/embedder/voyageai.py +165 -0
- agno/knowledge/knowledge.py +1988 -0
- agno/knowledge/reader/__init__.py +7 -0
- agno/knowledge/reader/arxiv_reader.py +81 -0
- agno/knowledge/reader/base.py +95 -0
- agno/knowledge/reader/csv_reader.py +166 -0
- agno/knowledge/reader/docx_reader.py +82 -0
- agno/knowledge/reader/field_labeled_csv_reader.py +292 -0
- agno/knowledge/reader/firecrawl_reader.py +201 -0
- agno/knowledge/reader/json_reader.py +87 -0
- agno/knowledge/reader/markdown_reader.py +137 -0
- agno/knowledge/reader/pdf_reader.py +431 -0
- agno/knowledge/reader/pptx_reader.py +101 -0
- agno/knowledge/reader/reader_factory.py +313 -0
- agno/knowledge/reader/s3_reader.py +89 -0
- agno/knowledge/reader/tavily_reader.py +194 -0
- agno/knowledge/reader/text_reader.py +115 -0
- agno/knowledge/reader/web_search_reader.py +372 -0
- agno/knowledge/reader/website_reader.py +455 -0
- agno/knowledge/reader/wikipedia_reader.py +59 -0
- agno/knowledge/reader/youtube_reader.py +78 -0
- agno/knowledge/remote_content/__init__.py +0 -0
- agno/knowledge/remote_content/remote_content.py +88 -0
- agno/knowledge/reranker/__init__.py +3 -0
- agno/knowledge/reranker/base.py +14 -0
- agno/knowledge/reranker/cohere.py +64 -0
- agno/knowledge/reranker/infinity.py +195 -0
- agno/knowledge/reranker/sentence_transformer.py +54 -0
- agno/knowledge/types.py +39 -0
- agno/knowledge/utils.py +189 -0
- agno/media.py +462 -0
- agno/memory/__init__.py +3 -0
- agno/memory/manager.py +1327 -0
- agno/models/__init__.py +0 -0
- agno/models/aimlapi/__init__.py +5 -0
- agno/models/aimlapi/aimlapi.py +45 -0
- agno/models/anthropic/__init__.py +5 -0
- agno/models/anthropic/claude.py +757 -0
- agno/models/aws/__init__.py +15 -0
- agno/models/aws/bedrock.py +701 -0
- agno/models/aws/claude.py +378 -0
- agno/models/azure/__init__.py +18 -0
- agno/models/azure/ai_foundry.py +485 -0
- agno/models/azure/openai_chat.py +131 -0
- agno/models/base.py +2175 -0
- agno/models/cerebras/__init__.py +12 -0
- agno/models/cerebras/cerebras.py +501 -0
- agno/models/cerebras/cerebras_openai.py +112 -0
- agno/models/cohere/__init__.py +5 -0
- agno/models/cohere/chat.py +389 -0
- agno/models/cometapi/__init__.py +5 -0
- agno/models/cometapi/cometapi.py +57 -0
- agno/models/dashscope/__init__.py +5 -0
- agno/models/dashscope/dashscope.py +91 -0
- agno/models/deepinfra/__init__.py +5 -0
- agno/models/deepinfra/deepinfra.py +28 -0
- agno/models/deepseek/__init__.py +5 -0
- agno/models/deepseek/deepseek.py +61 -0
- agno/models/defaults.py +1 -0
- agno/models/fireworks/__init__.py +5 -0
- agno/models/fireworks/fireworks.py +26 -0
- agno/models/google/__init__.py +5 -0
- agno/models/google/gemini.py +1085 -0
- agno/models/groq/__init__.py +5 -0
- agno/models/groq/groq.py +556 -0
- agno/models/huggingface/__init__.py +5 -0
- agno/models/huggingface/huggingface.py +491 -0
- agno/models/ibm/__init__.py +5 -0
- agno/models/ibm/watsonx.py +422 -0
- agno/models/internlm/__init__.py +3 -0
- agno/models/internlm/internlm.py +26 -0
- agno/models/langdb/__init__.py +1 -0
- agno/models/langdb/langdb.py +48 -0
- agno/models/litellm/__init__.py +14 -0
- agno/models/litellm/chat.py +468 -0
- agno/models/litellm/litellm_openai.py +25 -0
- agno/models/llama_cpp/__init__.py +5 -0
- agno/models/llama_cpp/llama_cpp.py +22 -0
- agno/models/lmstudio/__init__.py +5 -0
- agno/models/lmstudio/lmstudio.py +25 -0
- agno/models/message.py +434 -0
- agno/models/meta/__init__.py +12 -0
- agno/models/meta/llama.py +475 -0
- agno/models/meta/llama_openai.py +78 -0
- agno/models/metrics.py +120 -0
- agno/models/mistral/__init__.py +5 -0
- agno/models/mistral/mistral.py +432 -0
- agno/models/nebius/__init__.py +3 -0
- agno/models/nebius/nebius.py +54 -0
- agno/models/nexus/__init__.py +3 -0
- agno/models/nexus/nexus.py +22 -0
- agno/models/nvidia/__init__.py +5 -0
- agno/models/nvidia/nvidia.py +28 -0
- agno/models/ollama/__init__.py +5 -0
- agno/models/ollama/chat.py +441 -0
- agno/models/openai/__init__.py +9 -0
- agno/models/openai/chat.py +883 -0
- agno/models/openai/like.py +27 -0
- agno/models/openai/responses.py +1050 -0
- agno/models/openrouter/__init__.py +5 -0
- agno/models/openrouter/openrouter.py +66 -0
- agno/models/perplexity/__init__.py +5 -0
- agno/models/perplexity/perplexity.py +187 -0
- agno/models/portkey/__init__.py +3 -0
- agno/models/portkey/portkey.py +81 -0
- agno/models/requesty/__init__.py +5 -0
- agno/models/requesty/requesty.py +52 -0
- agno/models/response.py +199 -0
- agno/models/sambanova/__init__.py +5 -0
- agno/models/sambanova/sambanova.py +28 -0
- agno/models/siliconflow/__init__.py +5 -0
- agno/models/siliconflow/siliconflow.py +25 -0
- agno/models/together/__init__.py +5 -0
- agno/models/together/together.py +25 -0
- agno/models/utils.py +266 -0
- agno/models/vercel/__init__.py +3 -0
- agno/models/vercel/v0.py +26 -0
- agno/models/vertexai/__init__.py +0 -0
- agno/models/vertexai/claude.py +70 -0
- agno/models/vllm/__init__.py +3 -0
- agno/models/vllm/vllm.py +78 -0
- agno/models/xai/__init__.py +3 -0
- agno/models/xai/xai.py +113 -0
- agno/os/__init__.py +3 -0
- agno/os/app.py +876 -0
- agno/os/auth.py +57 -0
- agno/os/config.py +104 -0
- agno/os/interfaces/__init__.py +1 -0
- agno/os/interfaces/a2a/__init__.py +3 -0
- agno/os/interfaces/a2a/a2a.py +42 -0
- agno/os/interfaces/a2a/router.py +250 -0
- agno/os/interfaces/a2a/utils.py +924 -0
- agno/os/interfaces/agui/__init__.py +3 -0
- agno/os/interfaces/agui/agui.py +47 -0
- agno/os/interfaces/agui/router.py +144 -0
- agno/os/interfaces/agui/utils.py +534 -0
- agno/os/interfaces/base.py +25 -0
- agno/os/interfaces/slack/__init__.py +3 -0
- agno/os/interfaces/slack/router.py +148 -0
- agno/os/interfaces/slack/security.py +30 -0
- agno/os/interfaces/slack/slack.py +47 -0
- agno/os/interfaces/whatsapp/__init__.py +3 -0
- agno/os/interfaces/whatsapp/router.py +211 -0
- agno/os/interfaces/whatsapp/security.py +53 -0
- agno/os/interfaces/whatsapp/whatsapp.py +36 -0
- agno/os/mcp.py +292 -0
- agno/os/middleware/__init__.py +7 -0
- agno/os/middleware/jwt.py +233 -0
- agno/os/router.py +1763 -0
- agno/os/routers/__init__.py +3 -0
- agno/os/routers/evals/__init__.py +3 -0
- agno/os/routers/evals/evals.py +430 -0
- agno/os/routers/evals/schemas.py +142 -0
- agno/os/routers/evals/utils.py +162 -0
- agno/os/routers/health.py +31 -0
- agno/os/routers/home.py +52 -0
- agno/os/routers/knowledge/__init__.py +3 -0
- agno/os/routers/knowledge/knowledge.py +997 -0
- agno/os/routers/knowledge/schemas.py +178 -0
- agno/os/routers/memory/__init__.py +3 -0
- agno/os/routers/memory/memory.py +515 -0
- agno/os/routers/memory/schemas.py +62 -0
- agno/os/routers/metrics/__init__.py +3 -0
- agno/os/routers/metrics/metrics.py +190 -0
- agno/os/routers/metrics/schemas.py +47 -0
- agno/os/routers/session/__init__.py +3 -0
- agno/os/routers/session/session.py +997 -0
- agno/os/schema.py +1055 -0
- agno/os/settings.py +43 -0
- agno/os/utils.py +630 -0
- agno/py.typed +0 -0
- agno/reasoning/__init__.py +0 -0
- agno/reasoning/anthropic.py +80 -0
- agno/reasoning/azure_ai_foundry.py +67 -0
- agno/reasoning/deepseek.py +63 -0
- agno/reasoning/default.py +97 -0
- agno/reasoning/gemini.py +73 -0
- agno/reasoning/groq.py +71 -0
- agno/reasoning/helpers.py +63 -0
- agno/reasoning/ollama.py +67 -0
- agno/reasoning/openai.py +86 -0
- agno/reasoning/step.py +31 -0
- agno/reasoning/vertexai.py +76 -0
- agno/run/__init__.py +6 -0
- agno/run/agent.py +787 -0
- agno/run/base.py +229 -0
- agno/run/cancel.py +81 -0
- agno/run/messages.py +32 -0
- agno/run/team.py +753 -0
- agno/run/workflow.py +708 -0
- agno/session/__init__.py +10 -0
- agno/session/agent.py +295 -0
- agno/session/summary.py +265 -0
- agno/session/team.py +392 -0
- agno/session/workflow.py +205 -0
- agno/team/__init__.py +37 -0
- agno/team/team.py +8793 -0
- agno/tools/__init__.py +10 -0
- agno/tools/agentql.py +120 -0
- agno/tools/airflow.py +69 -0
- agno/tools/api.py +122 -0
- agno/tools/apify.py +314 -0
- agno/tools/arxiv.py +127 -0
- agno/tools/aws_lambda.py +53 -0
- agno/tools/aws_ses.py +66 -0
- agno/tools/baidusearch.py +89 -0
- agno/tools/bitbucket.py +292 -0
- agno/tools/brandfetch.py +213 -0
- agno/tools/bravesearch.py +106 -0
- agno/tools/brightdata.py +367 -0
- agno/tools/browserbase.py +209 -0
- agno/tools/calcom.py +255 -0
- agno/tools/calculator.py +151 -0
- agno/tools/cartesia.py +187 -0
- agno/tools/clickup.py +244 -0
- agno/tools/confluence.py +240 -0
- agno/tools/crawl4ai.py +158 -0
- agno/tools/csv_toolkit.py +185 -0
- agno/tools/dalle.py +110 -0
- agno/tools/daytona.py +475 -0
- agno/tools/decorator.py +262 -0
- agno/tools/desi_vocal.py +108 -0
- agno/tools/discord.py +161 -0
- agno/tools/docker.py +716 -0
- agno/tools/duckdb.py +379 -0
- agno/tools/duckduckgo.py +91 -0
- agno/tools/e2b.py +703 -0
- agno/tools/eleven_labs.py +196 -0
- agno/tools/email.py +67 -0
- agno/tools/evm.py +129 -0
- agno/tools/exa.py +396 -0
- agno/tools/fal.py +127 -0
- agno/tools/file.py +240 -0
- agno/tools/file_generation.py +350 -0
- agno/tools/financial_datasets.py +288 -0
- agno/tools/firecrawl.py +143 -0
- agno/tools/function.py +1187 -0
- agno/tools/giphy.py +93 -0
- agno/tools/github.py +1760 -0
- agno/tools/gmail.py +922 -0
- agno/tools/google_bigquery.py +117 -0
- agno/tools/google_drive.py +270 -0
- agno/tools/google_maps.py +253 -0
- agno/tools/googlecalendar.py +674 -0
- agno/tools/googlesearch.py +98 -0
- agno/tools/googlesheets.py +377 -0
- agno/tools/hackernews.py +77 -0
- agno/tools/jina.py +101 -0
- agno/tools/jira.py +170 -0
- agno/tools/knowledge.py +218 -0
- agno/tools/linear.py +426 -0
- agno/tools/linkup.py +58 -0
- agno/tools/local_file_system.py +90 -0
- agno/tools/lumalab.py +183 -0
- agno/tools/mcp/__init__.py +10 -0
- agno/tools/mcp/mcp.py +331 -0
- agno/tools/mcp/multi_mcp.py +347 -0
- agno/tools/mcp/params.py +24 -0
- agno/tools/mcp_toolbox.py +284 -0
- agno/tools/mem0.py +193 -0
- agno/tools/memori.py +339 -0
- agno/tools/memory.py +419 -0
- agno/tools/mlx_transcribe.py +139 -0
- agno/tools/models/__init__.py +0 -0
- agno/tools/models/azure_openai.py +190 -0
- agno/tools/models/gemini.py +203 -0
- agno/tools/models/groq.py +158 -0
- agno/tools/models/morph.py +186 -0
- agno/tools/models/nebius.py +124 -0
- agno/tools/models_labs.py +195 -0
- agno/tools/moviepy_video.py +349 -0
- agno/tools/neo4j.py +134 -0
- agno/tools/newspaper.py +46 -0
- agno/tools/newspaper4k.py +93 -0
- agno/tools/notion.py +204 -0
- agno/tools/openai.py +202 -0
- agno/tools/openbb.py +160 -0
- agno/tools/opencv.py +321 -0
- agno/tools/openweather.py +233 -0
- agno/tools/oxylabs.py +385 -0
- agno/tools/pandas.py +102 -0
- agno/tools/parallel.py +314 -0
- agno/tools/postgres.py +257 -0
- agno/tools/pubmed.py +188 -0
- agno/tools/python.py +205 -0
- agno/tools/reasoning.py +283 -0
- agno/tools/reddit.py +467 -0
- agno/tools/replicate.py +117 -0
- agno/tools/resend.py +62 -0
- agno/tools/scrapegraph.py +222 -0
- agno/tools/searxng.py +152 -0
- agno/tools/serpapi.py +116 -0
- agno/tools/serper.py +255 -0
- agno/tools/shell.py +53 -0
- agno/tools/slack.py +136 -0
- agno/tools/sleep.py +20 -0
- agno/tools/spider.py +116 -0
- agno/tools/sql.py +154 -0
- agno/tools/streamlit/__init__.py +0 -0
- agno/tools/streamlit/components.py +113 -0
- agno/tools/tavily.py +254 -0
- agno/tools/telegram.py +48 -0
- agno/tools/todoist.py +218 -0
- agno/tools/tool_registry.py +1 -0
- agno/tools/toolkit.py +146 -0
- agno/tools/trafilatura.py +388 -0
- agno/tools/trello.py +274 -0
- agno/tools/twilio.py +186 -0
- agno/tools/user_control_flow.py +78 -0
- agno/tools/valyu.py +228 -0
- agno/tools/visualization.py +467 -0
- agno/tools/webbrowser.py +28 -0
- agno/tools/webex.py +76 -0
- agno/tools/website.py +54 -0
- agno/tools/webtools.py +45 -0
- agno/tools/whatsapp.py +286 -0
- agno/tools/wikipedia.py +63 -0
- agno/tools/workflow.py +278 -0
- agno/tools/x.py +335 -0
- agno/tools/yfinance.py +257 -0
- agno/tools/youtube.py +184 -0
- agno/tools/zendesk.py +82 -0
- agno/tools/zep.py +454 -0
- agno/tools/zoom.py +382 -0
- agno/utils/__init__.py +0 -0
- agno/utils/agent.py +820 -0
- agno/utils/audio.py +49 -0
- agno/utils/certs.py +27 -0
- agno/utils/code_execution.py +11 -0
- agno/utils/common.py +132 -0
- agno/utils/dttm.py +13 -0
- agno/utils/enum.py +22 -0
- agno/utils/env.py +11 -0
- agno/utils/events.py +696 -0
- agno/utils/format_str.py +16 -0
- agno/utils/functions.py +166 -0
- agno/utils/gemini.py +426 -0
- agno/utils/hooks.py +57 -0
- agno/utils/http.py +74 -0
- agno/utils/json_schema.py +234 -0
- agno/utils/knowledge.py +36 -0
- agno/utils/location.py +19 -0
- agno/utils/log.py +255 -0
- agno/utils/mcp.py +214 -0
- agno/utils/media.py +352 -0
- agno/utils/merge_dict.py +41 -0
- agno/utils/message.py +118 -0
- agno/utils/models/__init__.py +0 -0
- agno/utils/models/ai_foundry.py +43 -0
- agno/utils/models/claude.py +358 -0
- agno/utils/models/cohere.py +87 -0
- agno/utils/models/llama.py +78 -0
- agno/utils/models/mistral.py +98 -0
- agno/utils/models/openai_responses.py +140 -0
- agno/utils/models/schema_utils.py +153 -0
- agno/utils/models/watsonx.py +41 -0
- agno/utils/openai.py +257 -0
- agno/utils/pickle.py +32 -0
- agno/utils/pprint.py +178 -0
- agno/utils/print_response/__init__.py +0 -0
- agno/utils/print_response/agent.py +842 -0
- agno/utils/print_response/team.py +1724 -0
- agno/utils/print_response/workflow.py +1668 -0
- agno/utils/prompts.py +111 -0
- agno/utils/reasoning.py +108 -0
- agno/utils/response.py +163 -0
- agno/utils/response_iterator.py +17 -0
- agno/utils/safe_formatter.py +24 -0
- agno/utils/serialize.py +32 -0
- agno/utils/shell.py +22 -0
- agno/utils/streamlit.py +487 -0
- agno/utils/string.py +231 -0
- agno/utils/team.py +139 -0
- agno/utils/timer.py +41 -0
- agno/utils/tools.py +102 -0
- agno/utils/web.py +23 -0
- agno/utils/whatsapp.py +305 -0
- agno/utils/yaml_io.py +25 -0
- agno/vectordb/__init__.py +3 -0
- agno/vectordb/base.py +127 -0
- agno/vectordb/cassandra/__init__.py +5 -0
- agno/vectordb/cassandra/cassandra.py +501 -0
- agno/vectordb/cassandra/extra_param_mixin.py +11 -0
- agno/vectordb/cassandra/index.py +13 -0
- agno/vectordb/chroma/__init__.py +5 -0
- agno/vectordb/chroma/chromadb.py +929 -0
- agno/vectordb/clickhouse/__init__.py +9 -0
- agno/vectordb/clickhouse/clickhousedb.py +835 -0
- agno/vectordb/clickhouse/index.py +9 -0
- agno/vectordb/couchbase/__init__.py +3 -0
- agno/vectordb/couchbase/couchbase.py +1442 -0
- agno/vectordb/distance.py +7 -0
- agno/vectordb/lancedb/__init__.py +6 -0
- agno/vectordb/lancedb/lance_db.py +995 -0
- agno/vectordb/langchaindb/__init__.py +5 -0
- agno/vectordb/langchaindb/langchaindb.py +163 -0
- agno/vectordb/lightrag/__init__.py +5 -0
- agno/vectordb/lightrag/lightrag.py +388 -0
- agno/vectordb/llamaindex/__init__.py +3 -0
- agno/vectordb/llamaindex/llamaindexdb.py +166 -0
- agno/vectordb/milvus/__init__.py +4 -0
- agno/vectordb/milvus/milvus.py +1182 -0
- agno/vectordb/mongodb/__init__.py +9 -0
- agno/vectordb/mongodb/mongodb.py +1417 -0
- agno/vectordb/pgvector/__init__.py +12 -0
- agno/vectordb/pgvector/index.py +23 -0
- agno/vectordb/pgvector/pgvector.py +1462 -0
- agno/vectordb/pineconedb/__init__.py +5 -0
- agno/vectordb/pineconedb/pineconedb.py +747 -0
- agno/vectordb/qdrant/__init__.py +5 -0
- agno/vectordb/qdrant/qdrant.py +1134 -0
- agno/vectordb/redis/__init__.py +9 -0
- agno/vectordb/redis/redisdb.py +694 -0
- agno/vectordb/search.py +7 -0
- agno/vectordb/singlestore/__init__.py +10 -0
- agno/vectordb/singlestore/index.py +41 -0
- agno/vectordb/singlestore/singlestore.py +763 -0
- agno/vectordb/surrealdb/__init__.py +3 -0
- agno/vectordb/surrealdb/surrealdb.py +699 -0
- agno/vectordb/upstashdb/__init__.py +5 -0
- agno/vectordb/upstashdb/upstashdb.py +718 -0
- agno/vectordb/weaviate/__init__.py +8 -0
- agno/vectordb/weaviate/index.py +15 -0
- agno/vectordb/weaviate/weaviate.py +1005 -0
- agno/workflow/__init__.py +23 -0
- agno/workflow/agent.py +299 -0
- agno/workflow/condition.py +738 -0
- agno/workflow/loop.py +735 -0
- agno/workflow/parallel.py +824 -0
- agno/workflow/router.py +702 -0
- agno/workflow/step.py +1432 -0
- agno/workflow/steps.py +592 -0
- agno/workflow/types.py +520 -0
- agno/workflow/workflow.py +4321 -0
- agno-2.2.13.dist-info/METADATA +614 -0
- agno-2.2.13.dist-info/RECORD +575 -0
- agno-2.2.13.dist-info/WHEEL +5 -0
- agno-2.2.13.dist-info/licenses/LICENSE +201 -0
- agno-2.2.13.dist-info/top_level.txt +1 -0
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
import asyncio
|
|
2
|
+
from typing import List, Optional
|
|
3
|
+
|
|
4
|
+
from agno.knowledge.chunking.fixed import FixedSizeChunking
|
|
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
|
+
|
|
10
|
+
try:
|
|
11
|
+
import arxiv # noqa: F401
|
|
12
|
+
except ImportError:
|
|
13
|
+
raise ImportError("The `arxiv` package is not installed. Please install it via `pip install arxiv`.")
|
|
14
|
+
|
|
15
|
+
|
|
16
|
+
class ArxivReader(Reader):
|
|
17
|
+
sort_by: arxiv.SortCriterion = arxiv.SortCriterion.Relevance
|
|
18
|
+
|
|
19
|
+
@classmethod
|
|
20
|
+
def get_supported_chunking_strategies(self) -> List[ChunkingStrategyType]:
|
|
21
|
+
"""Get the list of supported chunking strategies for Arxiv readers."""
|
|
22
|
+
return [
|
|
23
|
+
ChunkingStrategyType.FIXED_SIZE_CHUNKER,
|
|
24
|
+
ChunkingStrategyType.AGENTIC_CHUNKER,
|
|
25
|
+
ChunkingStrategyType.DOCUMENT_CHUNKER,
|
|
26
|
+
ChunkingStrategyType.RECURSIVE_CHUNKER,
|
|
27
|
+
ChunkingStrategyType.SEMANTIC_CHUNKER,
|
|
28
|
+
]
|
|
29
|
+
|
|
30
|
+
@classmethod
|
|
31
|
+
def get_supported_content_types(self) -> List[ContentType]:
|
|
32
|
+
return [ContentType.TOPIC]
|
|
33
|
+
|
|
34
|
+
def __init__(
|
|
35
|
+
self,
|
|
36
|
+
chunking_strategy: Optional[ChunkingStrategy] = FixedSizeChunking(),
|
|
37
|
+
sort_by: arxiv.SortCriterion = arxiv.SortCriterion.Relevance,
|
|
38
|
+
**kwargs,
|
|
39
|
+
) -> None:
|
|
40
|
+
super().__init__(chunking_strategy=chunking_strategy, **kwargs)
|
|
41
|
+
|
|
42
|
+
# ArxivReader-specific attributes
|
|
43
|
+
self.sort_by = sort_by
|
|
44
|
+
|
|
45
|
+
def read(self, query: str) -> List[Document]:
|
|
46
|
+
"""
|
|
47
|
+
Search a query from arXiv database
|
|
48
|
+
|
|
49
|
+
This function gets the top_k articles based on a user's query, sorted by relevance from arxiv
|
|
50
|
+
|
|
51
|
+
@param query:
|
|
52
|
+
@return: List of documents
|
|
53
|
+
"""
|
|
54
|
+
|
|
55
|
+
documents = []
|
|
56
|
+
search = arxiv.Search(query=query, max_results=self.max_results, sort_by=self.sort_by)
|
|
57
|
+
|
|
58
|
+
for result in search.results():
|
|
59
|
+
links = ", ".join([x.href for x in result.links])
|
|
60
|
+
|
|
61
|
+
documents.append(
|
|
62
|
+
Document(
|
|
63
|
+
name=result.title,
|
|
64
|
+
id=result.title,
|
|
65
|
+
meta_data={"pdf_url": str(result.pdf_url), "article_links": links},
|
|
66
|
+
content=result.summary,
|
|
67
|
+
)
|
|
68
|
+
)
|
|
69
|
+
|
|
70
|
+
return documents
|
|
71
|
+
|
|
72
|
+
async def async_read(self, query: str) -> List[Document]:
|
|
73
|
+
"""
|
|
74
|
+
Search a query from arXiv database asynchronously
|
|
75
|
+
|
|
76
|
+
This function gets the top_k articles based on a user's query, sorted by relevance from arxiv
|
|
77
|
+
|
|
78
|
+
@param query: Search query string
|
|
79
|
+
@return: List of documents
|
|
80
|
+
"""
|
|
81
|
+
return await asyncio.to_thread(self.read, query)
|
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
import asyncio
|
|
2
|
+
from dataclasses import dataclass, field
|
|
3
|
+
from typing import Any, List, Optional
|
|
4
|
+
|
|
5
|
+
from agno.knowledge.chunking.fixed import FixedSizeChunking
|
|
6
|
+
from agno.knowledge.chunking.strategy import ChunkingStrategy, ChunkingStrategyFactory, ChunkingStrategyType
|
|
7
|
+
from agno.knowledge.document.base import Document
|
|
8
|
+
from agno.knowledge.types import ContentType
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
@dataclass
|
|
12
|
+
class Reader:
|
|
13
|
+
"""Base class for reading documents"""
|
|
14
|
+
|
|
15
|
+
chunk: bool = True
|
|
16
|
+
chunk_size: int = 5000
|
|
17
|
+
separators: List[str] = field(default_factory=lambda: ["\n", "\n\n", "\r", "\r\n", "\n\r", "\t", " ", " "])
|
|
18
|
+
chunking_strategy: Optional[ChunkingStrategy] = None
|
|
19
|
+
name: Optional[str] = None
|
|
20
|
+
description: Optional[str] = None
|
|
21
|
+
max_results: int = 5 # Maximum number of results to return (useful for search-based readers)
|
|
22
|
+
encoding: Optional[str] = None
|
|
23
|
+
|
|
24
|
+
def __init__(
|
|
25
|
+
self,
|
|
26
|
+
chunk: bool = True,
|
|
27
|
+
chunk_size: int = 5000,
|
|
28
|
+
separators: Optional[List[str]] = None,
|
|
29
|
+
chunking_strategy: Optional[ChunkingStrategy] = None,
|
|
30
|
+
name: Optional[str] = None,
|
|
31
|
+
description: Optional[str] = None,
|
|
32
|
+
max_results: int = 5,
|
|
33
|
+
encoding: Optional[str] = None,
|
|
34
|
+
**kwargs,
|
|
35
|
+
) -> None:
|
|
36
|
+
self.chunk = chunk
|
|
37
|
+
self.chunk_size = chunk_size
|
|
38
|
+
self.separators = (
|
|
39
|
+
separators if separators is not None else ["\n", "\n\n", "\r", "\r\n", "\n\r", "\t", " ", " "]
|
|
40
|
+
)
|
|
41
|
+
self.chunking_strategy = chunking_strategy
|
|
42
|
+
self.name = name
|
|
43
|
+
self.description = description
|
|
44
|
+
self.max_results = max_results
|
|
45
|
+
self.encoding = encoding
|
|
46
|
+
|
|
47
|
+
def set_chunking_strategy_from_string(
|
|
48
|
+
self, strategy_name: str, chunk_size: Optional[int] = None, overlap: Optional[int] = None, **kwargs
|
|
49
|
+
) -> None:
|
|
50
|
+
"""Set the chunking strategy from a string name."""
|
|
51
|
+
try:
|
|
52
|
+
strategy_type = ChunkingStrategyType.from_string(strategy_name)
|
|
53
|
+
self.chunking_strategy = ChunkingStrategyFactory.create_strategy(
|
|
54
|
+
strategy_type, chunk_size=chunk_size, overlap=overlap, **kwargs
|
|
55
|
+
)
|
|
56
|
+
except ValueError as e:
|
|
57
|
+
raise ValueError(f"Failed to set chunking strategy: {e}")
|
|
58
|
+
|
|
59
|
+
def read(self, obj: Any, name: Optional[str] = None, password: Optional[str] = None) -> List[Document]:
|
|
60
|
+
raise NotImplementedError
|
|
61
|
+
|
|
62
|
+
async def async_read(self, obj: Any, name: Optional[str] = None, password: Optional[str] = None) -> List[Document]:
|
|
63
|
+
raise NotImplementedError
|
|
64
|
+
|
|
65
|
+
@classmethod
|
|
66
|
+
def get_supported_chunking_strategies(cls) -> List[ChunkingStrategyType]:
|
|
67
|
+
raise NotImplementedError
|
|
68
|
+
|
|
69
|
+
@classmethod
|
|
70
|
+
def get_supported_content_types(cls) -> List[ContentType]:
|
|
71
|
+
raise NotImplementedError
|
|
72
|
+
|
|
73
|
+
def chunk_document(self, document: Document) -> List[Document]:
|
|
74
|
+
if self.chunking_strategy is None:
|
|
75
|
+
self.chunking_strategy = FixedSizeChunking(chunk_size=self.chunk_size)
|
|
76
|
+
return self.chunking_strategy.chunk(document) # type: ignore
|
|
77
|
+
|
|
78
|
+
async def chunk_documents_async(self, documents: List[Document]) -> List[Document]:
|
|
79
|
+
"""
|
|
80
|
+
Asynchronously chunk a list of documents using the instance's chunk_document method.
|
|
81
|
+
|
|
82
|
+
Args:
|
|
83
|
+
documents: List of documents to be chunked.
|
|
84
|
+
|
|
85
|
+
Returns:
|
|
86
|
+
A flattened list of chunked documents.
|
|
87
|
+
"""
|
|
88
|
+
|
|
89
|
+
async def _chunk_document_async(doc: Document) -> List[Document]:
|
|
90
|
+
return await asyncio.to_thread(self.chunk_document, doc)
|
|
91
|
+
|
|
92
|
+
# Process chunking in parallel for all documents
|
|
93
|
+
chunked_lists = await asyncio.gather(*[_chunk_document_async(doc) for doc in documents])
|
|
94
|
+
# Flatten the result
|
|
95
|
+
return [chunk for sublist in chunked_lists for chunk in sublist]
|
|
@@ -0,0 +1,166 @@
|
|
|
1
|
+
import asyncio
|
|
2
|
+
import csv
|
|
3
|
+
import io
|
|
4
|
+
from pathlib import Path
|
|
5
|
+
from typing import IO, Any, List, Optional, Union
|
|
6
|
+
from uuid import uuid4
|
|
7
|
+
|
|
8
|
+
try:
|
|
9
|
+
import aiofiles
|
|
10
|
+
except ImportError:
|
|
11
|
+
raise ImportError("`aiofiles` not installed. Please install it with `pip install aiofiles`")
|
|
12
|
+
|
|
13
|
+
from agno.knowledge.chunking.row import RowChunking
|
|
14
|
+
from agno.knowledge.chunking.strategy import ChunkingStrategy, ChunkingStrategyType
|
|
15
|
+
from agno.knowledge.document.base import Document
|
|
16
|
+
from agno.knowledge.reader.base import Reader
|
|
17
|
+
from agno.knowledge.types import ContentType
|
|
18
|
+
from agno.utils.log import logger
|
|
19
|
+
|
|
20
|
+
|
|
21
|
+
class CSVReader(Reader):
|
|
22
|
+
"""Reader for CSV files"""
|
|
23
|
+
|
|
24
|
+
def __init__(self, chunking_strategy: Optional[ChunkingStrategy] = RowChunking(), **kwargs):
|
|
25
|
+
super().__init__(chunking_strategy=chunking_strategy, **kwargs)
|
|
26
|
+
|
|
27
|
+
@classmethod
|
|
28
|
+
def get_supported_chunking_strategies(self) -> List[ChunkingStrategyType]:
|
|
29
|
+
"""Get the list of supported chunking strategies for CSV readers."""
|
|
30
|
+
return [
|
|
31
|
+
ChunkingStrategyType.ROW_CHUNKER,
|
|
32
|
+
ChunkingStrategyType.FIXED_SIZE_CHUNKER,
|
|
33
|
+
ChunkingStrategyType.AGENTIC_CHUNKER,
|
|
34
|
+
ChunkingStrategyType.DOCUMENT_CHUNKER,
|
|
35
|
+
ChunkingStrategyType.RECURSIVE_CHUNKER,
|
|
36
|
+
]
|
|
37
|
+
|
|
38
|
+
@classmethod
|
|
39
|
+
def get_supported_content_types(self) -> List[ContentType]:
|
|
40
|
+
return [ContentType.CSV, ContentType.XLSX, ContentType.XLS]
|
|
41
|
+
|
|
42
|
+
def read(
|
|
43
|
+
self, file: Union[Path, IO[Any]], delimiter: str = ",", quotechar: str = '"', name: Optional[str] = None
|
|
44
|
+
) -> List[Document]:
|
|
45
|
+
try:
|
|
46
|
+
if isinstance(file, Path):
|
|
47
|
+
if not file.exists():
|
|
48
|
+
raise FileNotFoundError(f"Could not find file: {file}")
|
|
49
|
+
logger.info(f"Reading: {file}")
|
|
50
|
+
file_content = file.open(newline="", mode="r", encoding=self.encoding or "utf-8")
|
|
51
|
+
else:
|
|
52
|
+
logger.info(f"Reading retrieved file: {name or file.name}")
|
|
53
|
+
file.seek(0)
|
|
54
|
+
file_content = io.StringIO(file.read().decode("utf-8")) # type: ignore
|
|
55
|
+
|
|
56
|
+
csv_name = name or (
|
|
57
|
+
Path(file.name).stem
|
|
58
|
+
if isinstance(file, Path)
|
|
59
|
+
else (getattr(file, "name", "csv_file").split(".")[0] if hasattr(file, "name") else "csv_file")
|
|
60
|
+
)
|
|
61
|
+
csv_content = ""
|
|
62
|
+
with file_content as csvfile:
|
|
63
|
+
csv_reader = csv.reader(csvfile, delimiter=delimiter, quotechar=quotechar)
|
|
64
|
+
for row in csv_reader:
|
|
65
|
+
csv_content += ", ".join(row) + "\n"
|
|
66
|
+
|
|
67
|
+
documents = [
|
|
68
|
+
Document(
|
|
69
|
+
name=csv_name,
|
|
70
|
+
id=str(uuid4()),
|
|
71
|
+
content=csv_content,
|
|
72
|
+
)
|
|
73
|
+
]
|
|
74
|
+
if self.chunk:
|
|
75
|
+
chunked_documents = []
|
|
76
|
+
for document in documents:
|
|
77
|
+
chunked_documents.extend(self.chunk_document(document))
|
|
78
|
+
return chunked_documents
|
|
79
|
+
return documents
|
|
80
|
+
except Exception as e:
|
|
81
|
+
logger.error(f"Error reading: {getattr(file, 'name', str(file)) if isinstance(file, IO) else file}: {e}")
|
|
82
|
+
return []
|
|
83
|
+
|
|
84
|
+
async def async_read(
|
|
85
|
+
self,
|
|
86
|
+
file: Union[Path, IO[Any]],
|
|
87
|
+
delimiter: str = ",",
|
|
88
|
+
quotechar: str = '"',
|
|
89
|
+
page_size: int = 1000,
|
|
90
|
+
name: Optional[str] = None,
|
|
91
|
+
) -> List[Document]:
|
|
92
|
+
"""
|
|
93
|
+
Read a CSV file asynchronously, processing batches of rows concurrently.
|
|
94
|
+
|
|
95
|
+
Args:
|
|
96
|
+
file: Path or file-like object
|
|
97
|
+
delimiter: CSV delimiter
|
|
98
|
+
quotechar: CSV quote character
|
|
99
|
+
page_size: Number of rows per page
|
|
100
|
+
|
|
101
|
+
Returns:
|
|
102
|
+
List of Document objects
|
|
103
|
+
"""
|
|
104
|
+
try:
|
|
105
|
+
if isinstance(file, Path):
|
|
106
|
+
if not file.exists():
|
|
107
|
+
raise FileNotFoundError(f"Could not find file: {file}")
|
|
108
|
+
logger.info(f"Reading async: {file}")
|
|
109
|
+
async with aiofiles.open(file, mode="r", encoding="utf-8", newline="") as file_content:
|
|
110
|
+
content = await file_content.read()
|
|
111
|
+
file_content_io = io.StringIO(content)
|
|
112
|
+
else:
|
|
113
|
+
logger.info(f"Reading retrieved file async: {file.name}")
|
|
114
|
+
file.seek(0)
|
|
115
|
+
file_content_io = io.StringIO(file.read().decode("utf-8")) # type: ignore
|
|
116
|
+
|
|
117
|
+
csv_name = name or (
|
|
118
|
+
Path(file.name).stem
|
|
119
|
+
if isinstance(file, Path)
|
|
120
|
+
else (getattr(file, "name", "csv_file").split(".")[0] if hasattr(file, "name") else "csv_file")
|
|
121
|
+
)
|
|
122
|
+
|
|
123
|
+
file_content_io.seek(0)
|
|
124
|
+
csv_reader = csv.reader(file_content_io, delimiter=delimiter, quotechar=quotechar)
|
|
125
|
+
rows = list(csv_reader)
|
|
126
|
+
total_rows = len(rows)
|
|
127
|
+
|
|
128
|
+
if total_rows <= 10:
|
|
129
|
+
csv_content = " ".join(", ".join(row) for row in rows)
|
|
130
|
+
documents = [
|
|
131
|
+
Document(
|
|
132
|
+
name=csv_name,
|
|
133
|
+
id=str(uuid4()),
|
|
134
|
+
content=csv_content,
|
|
135
|
+
)
|
|
136
|
+
]
|
|
137
|
+
else:
|
|
138
|
+
pages = []
|
|
139
|
+
for i in range(0, total_rows, page_size):
|
|
140
|
+
pages.append(rows[i : i + page_size])
|
|
141
|
+
|
|
142
|
+
async def _process_page(page_number: int, page_rows: List[List[str]]) -> Document:
|
|
143
|
+
"""Process a page of rows into a document"""
|
|
144
|
+
start_row = (page_number - 1) * page_size + 1
|
|
145
|
+
page_content = " ".join(", ".join(row) for row in page_rows)
|
|
146
|
+
|
|
147
|
+
return Document(
|
|
148
|
+
name=csv_name,
|
|
149
|
+
id=str(uuid4()),
|
|
150
|
+
meta_data={"page": page_number, "start_row": start_row, "rows": len(page_rows)},
|
|
151
|
+
content=page_content,
|
|
152
|
+
)
|
|
153
|
+
|
|
154
|
+
documents = await asyncio.gather(
|
|
155
|
+
*[_process_page(page_number, page) for page_number, page in enumerate(pages, start=1)]
|
|
156
|
+
)
|
|
157
|
+
|
|
158
|
+
if self.chunk:
|
|
159
|
+
documents = await self.chunk_documents_async(documents)
|
|
160
|
+
|
|
161
|
+
return documents
|
|
162
|
+
except Exception as e:
|
|
163
|
+
logger.error(
|
|
164
|
+
f"Error reading async: {getattr(file, 'name', str(file)) if isinstance(file, IO) else file}: {e}"
|
|
165
|
+
)
|
|
166
|
+
return []
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
import asyncio
|
|
2
|
+
from pathlib import Path
|
|
3
|
+
from typing import IO, Any, List, Optional, Union
|
|
4
|
+
from uuid import uuid4
|
|
5
|
+
|
|
6
|
+
from agno.knowledge.chunking.document import DocumentChunking
|
|
7
|
+
from agno.knowledge.chunking.strategy import ChunkingStrategy, ChunkingStrategyType
|
|
8
|
+
from agno.knowledge.document.base import Document
|
|
9
|
+
from agno.knowledge.reader.base import Reader
|
|
10
|
+
from agno.knowledge.types import ContentType
|
|
11
|
+
from agno.utils.log import log_info, logger
|
|
12
|
+
|
|
13
|
+
try:
|
|
14
|
+
from docx import Document as DocxDocument # type: ignore
|
|
15
|
+
except ImportError:
|
|
16
|
+
raise ImportError("The `python-docx` package is not installed. Please install it via `pip install python-docx`.")
|
|
17
|
+
|
|
18
|
+
|
|
19
|
+
class DocxReader(Reader):
|
|
20
|
+
"""Reader for Doc/Docx files"""
|
|
21
|
+
|
|
22
|
+
def __init__(self, chunking_strategy: Optional[ChunkingStrategy] = DocumentChunking(), **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 DOCX readers."""
|
|
28
|
+
return [
|
|
29
|
+
ChunkingStrategyType.DOCUMENT_CHUNKER,
|
|
30
|
+
ChunkingStrategyType.FIXED_SIZE_CHUNKER,
|
|
31
|
+
ChunkingStrategyType.SEMANTIC_CHUNKER,
|
|
32
|
+
ChunkingStrategyType.AGENTIC_CHUNKER,
|
|
33
|
+
ChunkingStrategyType.RECURSIVE_CHUNKER,
|
|
34
|
+
]
|
|
35
|
+
|
|
36
|
+
@classmethod
|
|
37
|
+
def get_supported_content_types(self) -> List[ContentType]:
|
|
38
|
+
return [ContentType.DOCX, ContentType.DOC]
|
|
39
|
+
|
|
40
|
+
def read(self, file: Union[Path, IO[Any]], name: Optional[str] = None) -> List[Document]:
|
|
41
|
+
"""Read a docx file and return a list of documents"""
|
|
42
|
+
try:
|
|
43
|
+
if isinstance(file, Path):
|
|
44
|
+
if not file.exists():
|
|
45
|
+
raise FileNotFoundError(f"Could not find file: {file}")
|
|
46
|
+
log_info(f"Reading: {file}")
|
|
47
|
+
docx_document = DocxDocument(str(file))
|
|
48
|
+
doc_name = name or file.stem
|
|
49
|
+
else:
|
|
50
|
+
log_info(f"Reading uploaded file: {getattr(file, 'name', 'docx_file')}")
|
|
51
|
+
docx_document = DocxDocument(file)
|
|
52
|
+
doc_name = name or (
|
|
53
|
+
getattr(file, "name", "docx_file").split(".")[0] if hasattr(file, "name") else "docx_file"
|
|
54
|
+
)
|
|
55
|
+
|
|
56
|
+
doc_content = "\n\n".join([para.text for para in docx_document.paragraphs])
|
|
57
|
+
|
|
58
|
+
documents = [
|
|
59
|
+
Document(
|
|
60
|
+
name=doc_name,
|
|
61
|
+
id=str(uuid4()),
|
|
62
|
+
content=doc_content,
|
|
63
|
+
)
|
|
64
|
+
]
|
|
65
|
+
if self.chunk:
|
|
66
|
+
chunked_documents = []
|
|
67
|
+
for document in documents:
|
|
68
|
+
chunked_documents.extend(self.chunk_document(document))
|
|
69
|
+
return chunked_documents
|
|
70
|
+
return documents
|
|
71
|
+
|
|
72
|
+
except Exception as e:
|
|
73
|
+
logger.error(f"Error reading file: {e}")
|
|
74
|
+
return []
|
|
75
|
+
|
|
76
|
+
async def async_read(self, file: Union[Path, IO[Any]], name: Optional[str] = None) -> List[Document]:
|
|
77
|
+
"""Asynchronously read a docx file and return a list of documents"""
|
|
78
|
+
try:
|
|
79
|
+
return await asyncio.to_thread(self.read, file, name)
|
|
80
|
+
except Exception as e:
|
|
81
|
+
logger.error(f"Error reading file asynchronously: {e}")
|
|
82
|
+
return []
|