agno 0.1.2__py3-none-any.whl → 2.3.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 +44 -5
- agno/agent/agent.py +10531 -2975
- agno/api/agent.py +14 -53
- agno/api/api.py +7 -46
- agno/api/evals.py +22 -0
- agno/api/os.py +17 -0
- agno/api/routes.py +6 -25
- agno/api/schemas/__init__.py +9 -0
- agno/api/schemas/agent.py +6 -9
- agno/api/schemas/evals.py +16 -0
- agno/api/schemas/os.py +14 -0
- agno/api/schemas/team.py +10 -10
- agno/api/schemas/utils.py +21 -0
- agno/api/schemas/workflows.py +16 -0
- agno/api/settings.py +53 -0
- agno/api/team.py +22 -26
- 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/compression/__init__.py +3 -0
- agno/compression/manager.py +247 -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 +946 -0
- agno/db/dynamo/__init__.py +3 -0
- agno/db/dynamo/dynamo.py +2781 -0
- agno/db/dynamo/schemas.py +442 -0
- agno/db/dynamo/utils.py +743 -0
- agno/db/firestore/__init__.py +3 -0
- agno/db/firestore/firestore.py +2379 -0
- agno/db/firestore/schemas.py +181 -0
- agno/db/firestore/utils.py +376 -0
- agno/db/gcs_json/__init__.py +3 -0
- agno/db/gcs_json/gcs_json_db.py +1791 -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 +1312 -0
- agno/db/in_memory/utils.py +230 -0
- agno/db/json/__init__.py +3 -0
- agno/db/json/json_db.py +1777 -0
- agno/db/json/utils.py +230 -0
- agno/db/migrations/manager.py +199 -0
- agno/db/migrations/v1_to_v2.py +635 -0
- agno/db/migrations/versions/v2_3_0.py +938 -0
- agno/db/mongo/__init__.py +17 -0
- agno/db/mongo/async_mongo.py +2760 -0
- agno/db/mongo/mongo.py +2597 -0
- agno/db/mongo/schemas.py +119 -0
- agno/db/mongo/utils.py +276 -0
- agno/db/mysql/__init__.py +4 -0
- agno/db/mysql/async_mysql.py +2912 -0
- agno/db/mysql/mysql.py +2923 -0
- agno/db/mysql/schemas.py +186 -0
- agno/db/mysql/utils.py +488 -0
- agno/db/postgres/__init__.py +4 -0
- agno/db/postgres/async_postgres.py +2579 -0
- agno/db/postgres/postgres.py +2870 -0
- agno/db/postgres/schemas.py +187 -0
- agno/db/postgres/utils.py +442 -0
- agno/db/redis/__init__.py +3 -0
- agno/db/redis/redis.py +2141 -0
- agno/db/redis/schemas.py +159 -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 +34 -0
- agno/db/schemas/knowledge.py +40 -0
- agno/db/schemas/memory.py +61 -0
- agno/db/singlestore/__init__.py +3 -0
- agno/db/singlestore/schemas.py +179 -0
- agno/db/singlestore/singlestore.py +2877 -0
- agno/db/singlestore/utils.py +384 -0
- agno/db/sqlite/__init__.py +4 -0
- agno/db/sqlite/async_sqlite.py +2911 -0
- agno/db/sqlite/schemas.py +181 -0
- agno/db/sqlite/sqlite.py +2908 -0
- agno/db/sqlite/utils.py +429 -0
- agno/db/surrealdb/__init__.py +3 -0
- agno/db/surrealdb/metrics.py +292 -0
- agno/db/surrealdb/models.py +334 -0
- agno/db/surrealdb/queries.py +71 -0
- agno/db/surrealdb/surrealdb.py +1908 -0
- agno/db/surrealdb/utils.py +147 -0
- agno/db/utils.py +118 -0
- agno/eval/__init__.py +24 -0
- agno/eval/accuracy.py +666 -276
- agno/eval/agent_as_judge.py +861 -0
- agno/eval/base.py +29 -0
- agno/eval/performance.py +779 -0
- agno/eval/reliability.py +241 -62
- agno/eval/utils.py +120 -0
- agno/exceptions.py +143 -1
- 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/hooks/__init__.py +3 -0
- agno/hooks/decorator.py +164 -0
- agno/integrations/discord/__init__.py +3 -0
- agno/integrations/discord/client.py +203 -0
- agno/knowledge/__init__.py +5 -1
- agno/{document → knowledge}/chunking/agentic.py +22 -14
- agno/{document → knowledge}/chunking/document.py +2 -2
- agno/{document → knowledge}/chunking/fixed.py +7 -6
- agno/knowledge/chunking/markdown.py +151 -0
- agno/{document → knowledge}/chunking/recursive.py +15 -3
- agno/knowledge/chunking/row.py +39 -0
- agno/knowledge/chunking/semantic.py +91 -0
- agno/knowledge/chunking/strategy.py +165 -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/knowledge/embedder/aws_bedrock.py +343 -0
- agno/knowledge/embedder/azure_openai.py +210 -0
- agno/{embedder → knowledge/embedder}/base.py +8 -0
- agno/knowledge/embedder/cohere.py +323 -0
- agno/knowledge/embedder/fastembed.py +62 -0
- agno/{embedder → knowledge/embedder}/fireworks.py +1 -1
- 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/{embedder → knowledge/embedder}/together.py +1 -1
- agno/knowledge/embedder/vllm.py +262 -0
- agno/knowledge/embedder/voyageai.py +165 -0
- agno/knowledge/knowledge.py +3006 -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 +164 -0
- agno/knowledge/reader/docx_reader.py +82 -0
- agno/knowledge/reader/field_labeled_csv_reader.py +290 -0
- agno/knowledge/reader/firecrawl_reader.py +201 -0
- agno/knowledge/reader/json_reader.py +88 -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 +193 -0
- agno/knowledge/reader/text_reader.py +127 -0
- agno/knowledge/reader/web_search_reader.py +325 -0
- agno/knowledge/reader/website_reader.py +455 -0
- agno/knowledge/reader/wikipedia_reader.py +91 -0
- agno/knowledge/reader/youtube_reader.py +78 -0
- agno/knowledge/remote_content/remote_content.py +88 -0
- agno/knowledge/reranker/__init__.py +3 -0
- agno/{reranker → knowledge/reranker}/base.py +1 -1
- agno/{reranker → knowledge/reranker}/cohere.py +2 -2
- 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 +234 -0
- agno/media.py +439 -95
- agno/memory/__init__.py +16 -3
- agno/memory/manager.py +1474 -123
- agno/memory/strategies/__init__.py +15 -0
- agno/memory/strategies/base.py +66 -0
- agno/memory/strategies/summarize.py +196 -0
- agno/memory/strategies/types.py +37 -0
- agno/models/aimlapi/__init__.py +5 -0
- agno/models/aimlapi/aimlapi.py +62 -0
- agno/models/anthropic/__init__.py +4 -0
- agno/models/anthropic/claude.py +960 -496
- agno/models/aws/__init__.py +15 -0
- agno/models/aws/bedrock.py +686 -451
- agno/models/aws/claude.py +190 -183
- agno/models/azure/__init__.py +18 -1
- agno/models/azure/ai_foundry.py +489 -0
- agno/models/azure/openai_chat.py +89 -40
- agno/models/base.py +2477 -550
- agno/models/cerebras/__init__.py +12 -0
- agno/models/cerebras/cerebras.py +565 -0
- agno/models/cerebras/cerebras_openai.py +131 -0
- agno/models/cohere/__init__.py +4 -0
- agno/models/cohere/chat.py +306 -492
- agno/models/cometapi/__init__.py +5 -0
- agno/models/cometapi/cometapi.py +74 -0
- agno/models/dashscope/__init__.py +5 -0
- agno/models/dashscope/dashscope.py +90 -0
- agno/models/deepinfra/__init__.py +5 -0
- agno/models/deepinfra/deepinfra.py +45 -0
- agno/models/deepseek/__init__.py +4 -0
- agno/models/deepseek/deepseek.py +110 -9
- agno/models/fireworks/__init__.py +4 -0
- agno/models/fireworks/fireworks.py +19 -22
- agno/models/google/__init__.py +3 -7
- agno/models/google/gemini.py +1717 -662
- agno/models/google/utils.py +22 -0
- agno/models/groq/__init__.py +4 -0
- agno/models/groq/groq.py +391 -666
- agno/models/huggingface/__init__.py +4 -0
- agno/models/huggingface/huggingface.py +266 -538
- agno/models/ibm/__init__.py +5 -0
- agno/models/ibm/watsonx.py +432 -0
- agno/models/internlm/__init__.py +3 -0
- agno/models/internlm/internlm.py +20 -3
- agno/models/langdb/__init__.py +1 -0
- agno/models/langdb/langdb.py +60 -0
- agno/models/litellm/__init__.py +14 -0
- agno/models/litellm/chat.py +503 -0
- agno/models/litellm/litellm_openai.py +42 -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 +361 -39
- agno/models/meta/__init__.py +12 -0
- agno/models/meta/llama.py +502 -0
- agno/models/meta/llama_openai.py +79 -0
- agno/models/metrics.py +120 -0
- agno/models/mistral/__init__.py +4 -0
- agno/models/mistral/mistral.py +293 -393
- agno/models/nebius/__init__.py +3 -0
- agno/models/nebius/nebius.py +53 -0
- agno/models/nexus/__init__.py +3 -0
- agno/models/nexus/nexus.py +22 -0
- agno/models/nvidia/__init__.py +4 -0
- agno/models/nvidia/nvidia.py +22 -3
- agno/models/ollama/__init__.py +4 -2
- agno/models/ollama/chat.py +257 -492
- agno/models/openai/__init__.py +7 -0
- agno/models/openai/chat.py +725 -770
- agno/models/openai/like.py +16 -2
- agno/models/openai/responses.py +1121 -0
- agno/models/openrouter/__init__.py +4 -0
- agno/models/openrouter/openrouter.py +62 -5
- agno/models/perplexity/__init__.py +5 -0
- agno/models/perplexity/perplexity.py +203 -0
- agno/models/portkey/__init__.py +3 -0
- agno/models/portkey/portkey.py +82 -0
- agno/models/requesty/__init__.py +5 -0
- agno/models/requesty/requesty.py +69 -0
- agno/models/response.py +177 -7
- agno/models/sambanova/__init__.py +4 -0
- agno/models/sambanova/sambanova.py +23 -4
- agno/models/siliconflow/__init__.py +5 -0
- agno/models/siliconflow/siliconflow.py +42 -0
- agno/models/together/__init__.py +4 -0
- agno/models/together/together.py +21 -164
- agno/models/utils.py +266 -0
- agno/models/vercel/__init__.py +3 -0
- agno/models/vercel/v0.py +43 -0
- agno/models/vertexai/__init__.py +0 -1
- agno/models/vertexai/claude.py +190 -0
- agno/models/vllm/__init__.py +3 -0
- agno/models/vllm/vllm.py +83 -0
- agno/models/xai/__init__.py +2 -0
- agno/models/xai/xai.py +111 -7
- agno/os/__init__.py +3 -0
- agno/os/app.py +1027 -0
- agno/os/auth.py +244 -0
- agno/os/config.py +126 -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 +249 -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 +147 -0
- agno/os/interfaces/agui/utils.py +574 -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 +210 -0
- agno/os/interfaces/whatsapp/security.py +55 -0
- agno/os/interfaces/whatsapp/whatsapp.py +36 -0
- agno/os/mcp.py +293 -0
- agno/os/middleware/__init__.py +9 -0
- agno/os/middleware/jwt.py +797 -0
- agno/os/router.py +258 -0
- agno/os/routers/__init__.py +3 -0
- agno/os/routers/agents/__init__.py +3 -0
- agno/os/routers/agents/router.py +599 -0
- agno/os/routers/agents/schema.py +261 -0
- agno/os/routers/evals/__init__.py +3 -0
- agno/os/routers/evals/evals.py +450 -0
- agno/os/routers/evals/schemas.py +174 -0
- agno/os/routers/evals/utils.py +231 -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 +1008 -0
- agno/os/routers/knowledge/schemas.py +178 -0
- agno/os/routers/memory/__init__.py +3 -0
- agno/os/routers/memory/memory.py +661 -0
- agno/os/routers/memory/schemas.py +88 -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/routers/teams/__init__.py +3 -0
- agno/os/routers/teams/router.py +512 -0
- agno/os/routers/teams/schema.py +257 -0
- agno/os/routers/traces/__init__.py +3 -0
- agno/os/routers/traces/schemas.py +414 -0
- agno/os/routers/traces/traces.py +499 -0
- agno/os/routers/workflows/__init__.py +3 -0
- agno/os/routers/workflows/router.py +624 -0
- agno/os/routers/workflows/schema.py +75 -0
- agno/os/schema.py +534 -0
- agno/os/scopes.py +469 -0
- agno/{playground → os}/settings.py +7 -15
- agno/os/utils.py +973 -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 +24 -1
- agno/reasoning/ollama.py +67 -0
- agno/reasoning/openai.py +86 -0
- agno/reasoning/step.py +2 -1
- agno/reasoning/vertexai.py +76 -0
- agno/run/__init__.py +6 -0
- agno/run/agent.py +822 -0
- agno/run/base.py +247 -0
- agno/run/cancel.py +81 -0
- agno/run/requirement.py +181 -0
- agno/run/team.py +767 -0
- agno/run/workflow.py +708 -0
- agno/session/__init__.py +10 -0
- agno/session/agent.py +260 -0
- agno/session/summary.py +265 -0
- agno/session/team.py +342 -0
- agno/session/workflow.py +501 -0
- agno/table.py +10 -0
- agno/team/__init__.py +37 -0
- agno/team/team.py +9536 -0
- agno/tools/__init__.py +7 -0
- agno/tools/agentql.py +120 -0
- agno/tools/airflow.py +22 -12
- agno/tools/api.py +122 -0
- agno/tools/apify.py +276 -83
- agno/tools/{arxiv_toolkit.py → arxiv.py} +20 -12
- agno/tools/aws_lambda.py +28 -7
- agno/tools/aws_ses.py +66 -0
- agno/tools/baidusearch.py +11 -4
- 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 +32 -23
- agno/tools/calculator.py +24 -37
- agno/tools/cartesia.py +187 -0
- agno/tools/{clickup_tool.py → clickup.py} +17 -28
- agno/tools/confluence.py +91 -26
- agno/tools/crawl4ai.py +139 -43
- agno/tools/csv_toolkit.py +28 -22
- agno/tools/dalle.py +36 -22
- agno/tools/daytona.py +475 -0
- agno/tools/decorator.py +169 -14
- agno/tools/desi_vocal.py +23 -11
- agno/tools/discord.py +32 -29
- agno/tools/docker.py +716 -0
- agno/tools/duckdb.py +76 -81
- agno/tools/duckduckgo.py +43 -40
- agno/tools/e2b.py +703 -0
- agno/tools/eleven_labs.py +65 -54
- agno/tools/email.py +13 -5
- agno/tools/evm.py +129 -0
- agno/tools/exa.py +324 -42
- agno/tools/fal.py +39 -35
- agno/tools/file.py +196 -30
- agno/tools/file_generation.py +356 -0
- agno/tools/financial_datasets.py +288 -0
- agno/tools/firecrawl.py +108 -33
- agno/tools/function.py +960 -122
- agno/tools/giphy.py +34 -12
- agno/tools/github.py +1294 -97
- agno/tools/gmail.py +922 -0
- agno/tools/google_bigquery.py +117 -0
- agno/tools/google_drive.py +271 -0
- agno/tools/google_maps.py +253 -0
- agno/tools/googlecalendar.py +607 -107
- agno/tools/googlesheets.py +377 -0
- agno/tools/hackernews.py +20 -12
- agno/tools/jina.py +24 -14
- agno/tools/jira.py +48 -19
- agno/tools/knowledge.py +218 -0
- agno/tools/linear.py +82 -43
- agno/tools/linkup.py +58 -0
- agno/tools/local_file_system.py +15 -7
- agno/tools/lumalab.py +41 -26
- 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/memory.py +419 -0
- agno/tools/mlx_transcribe.py +11 -9
- 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 +163 -82
- agno/tools/moviepy_video.py +18 -13
- agno/tools/nano_banana.py +151 -0
- agno/tools/neo4j.py +134 -0
- agno/tools/newspaper.py +15 -4
- agno/tools/newspaper4k.py +19 -6
- agno/tools/notion.py +204 -0
- agno/tools/openai.py +181 -17
- agno/tools/openbb.py +27 -20
- agno/tools/opencv.py +321 -0
- agno/tools/openweather.py +233 -0
- agno/tools/oxylabs.py +385 -0
- agno/tools/pandas.py +25 -15
- agno/tools/parallel.py +314 -0
- agno/tools/postgres.py +238 -185
- agno/tools/pubmed.py +125 -13
- agno/tools/python.py +48 -35
- agno/tools/reasoning.py +283 -0
- agno/tools/reddit.py +207 -29
- agno/tools/redshift.py +406 -0
- agno/tools/replicate.py +69 -26
- agno/tools/resend.py +11 -6
- agno/tools/scrapegraph.py +179 -19
- agno/tools/searxng.py +23 -31
- agno/tools/serpapi.py +15 -10
- agno/tools/serper.py +255 -0
- agno/tools/shell.py +23 -12
- agno/tools/shopify.py +1519 -0
- agno/tools/slack.py +56 -14
- agno/tools/sleep.py +8 -6
- agno/tools/spider.py +35 -11
- agno/tools/spotify.py +919 -0
- agno/tools/sql.py +34 -19
- agno/tools/tavily.py +158 -8
- agno/tools/telegram.py +18 -8
- agno/tools/todoist.py +218 -0
- agno/tools/toolkit.py +134 -9
- agno/tools/trafilatura.py +388 -0
- agno/tools/trello.py +25 -28
- agno/tools/twilio.py +18 -9
- 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 +23 -19
- agno/tools/webtools.py +45 -0
- agno/tools/whatsapp.py +286 -0
- agno/tools/wikipedia.py +28 -19
- agno/tools/workflow.py +285 -0
- agno/tools/{twitter.py → x.py} +142 -46
- agno/tools/yfinance.py +41 -39
- agno/tools/youtube.py +34 -17
- agno/tools/zendesk.py +15 -5
- agno/tools/zep.py +454 -0
- agno/tools/zoom.py +86 -37
- agno/tracing/__init__.py +12 -0
- agno/tracing/exporter.py +157 -0
- agno/tracing/schemas.py +276 -0
- agno/tracing/setup.py +111 -0
- agno/utils/agent.py +938 -0
- agno/utils/audio.py +37 -1
- agno/utils/certs.py +27 -0
- agno/utils/code_execution.py +11 -0
- agno/utils/common.py +103 -20
- agno/utils/cryptography.py +22 -0
- agno/utils/dttm.py +33 -0
- agno/utils/events.py +700 -0
- agno/utils/functions.py +107 -37
- agno/utils/gemini.py +426 -0
- agno/utils/hooks.py +171 -0
- agno/utils/http.py +185 -0
- agno/utils/json_schema.py +159 -37
- agno/utils/knowledge.py +36 -0
- agno/utils/location.py +19 -0
- agno/utils/log.py +221 -8
- agno/utils/mcp.py +214 -0
- agno/utils/media.py +335 -14
- agno/utils/merge_dict.py +22 -1
- agno/utils/message.py +77 -2
- agno/utils/models/ai_foundry.py +50 -0
- agno/utils/models/claude.py +373 -0
- agno/utils/models/cohere.py +94 -0
- agno/utils/models/llama.py +85 -0
- agno/utils/models/mistral.py +100 -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 +1 -1
- agno/utils/pprint.py +124 -8
- agno/utils/print_response/agent.py +930 -0
- agno/utils/print_response/team.py +1914 -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/serialize.py +32 -0
- agno/utils/shell.py +4 -4
- agno/utils/streamlit.py +487 -0
- agno/utils/string.py +204 -51
- agno/utils/team.py +139 -0
- agno/utils/timer.py +9 -2
- agno/utils/tokens.py +657 -0
- agno/utils/tools.py +19 -1
- agno/utils/whatsapp.py +305 -0
- agno/utils/yaml_io.py +3 -3
- agno/vectordb/__init__.py +2 -0
- agno/vectordb/base.py +87 -9
- agno/vectordb/cassandra/__init__.py +5 -1
- agno/vectordb/cassandra/cassandra.py +383 -27
- agno/vectordb/chroma/__init__.py +4 -0
- agno/vectordb/chroma/chromadb.py +748 -83
- agno/vectordb/clickhouse/__init__.py +7 -1
- agno/vectordb/clickhouse/clickhousedb.py +554 -53
- agno/vectordb/couchbase/__init__.py +3 -0
- agno/vectordb/couchbase/couchbase.py +1446 -0
- agno/vectordb/lancedb/__init__.py +5 -0
- agno/vectordb/lancedb/lance_db.py +730 -98
- 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 +3 -0
- agno/vectordb/milvus/milvus.py +966 -78
- agno/vectordb/mongodb/__init__.py +9 -1
- agno/vectordb/mongodb/mongodb.py +1175 -172
- agno/vectordb/pgvector/__init__.py +8 -0
- agno/vectordb/pgvector/pgvector.py +599 -115
- agno/vectordb/pineconedb/__init__.py +5 -1
- agno/vectordb/pineconedb/pineconedb.py +406 -43
- agno/vectordb/qdrant/__init__.py +4 -0
- agno/vectordb/qdrant/qdrant.py +914 -61
- agno/vectordb/redis/__init__.py +9 -0
- agno/vectordb/redis/redisdb.py +682 -0
- agno/vectordb/singlestore/__init__.py +8 -1
- agno/vectordb/singlestore/singlestore.py +771 -0
- agno/vectordb/surrealdb/__init__.py +3 -0
- agno/vectordb/surrealdb/surrealdb.py +663 -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 +1009 -0
- agno/workflow/__init__.py +23 -1
- agno/workflow/agent.py +299 -0
- agno/workflow/condition.py +759 -0
- agno/workflow/loop.py +756 -0
- agno/workflow/parallel.py +853 -0
- agno/workflow/router.py +723 -0
- agno/workflow/step.py +1564 -0
- agno/workflow/steps.py +613 -0
- agno/workflow/types.py +556 -0
- agno/workflow/workflow.py +4327 -514
- agno-2.3.13.dist-info/METADATA +639 -0
- agno-2.3.13.dist-info/RECORD +613 -0
- {agno-0.1.2.dist-info → agno-2.3.13.dist-info}/WHEEL +1 -1
- agno-2.3.13.dist-info/licenses/LICENSE +201 -0
- agno/api/playground.py +0 -91
- agno/api/schemas/playground.py +0 -22
- agno/api/schemas/user.py +0 -22
- agno/api/schemas/workspace.py +0 -46
- agno/api/user.py +0 -160
- agno/api/workspace.py +0 -151
- agno/cli/auth_server.py +0 -118
- agno/cli/config.py +0 -275
- agno/cli/console.py +0 -88
- agno/cli/credentials.py +0 -23
- agno/cli/entrypoint.py +0 -571
- agno/cli/operator.py +0 -355
- agno/cli/settings.py +0 -85
- agno/cli/ws/ws_cli.py +0 -817
- agno/constants.py +0 -13
- agno/document/__init__.py +0 -1
- agno/document/chunking/semantic.py +0 -47
- agno/document/chunking/strategy.py +0 -31
- agno/document/reader/__init__.py +0 -1
- agno/document/reader/arxiv_reader.py +0 -41
- agno/document/reader/base.py +0 -22
- agno/document/reader/csv_reader.py +0 -84
- agno/document/reader/docx_reader.py +0 -46
- agno/document/reader/firecrawl_reader.py +0 -99
- agno/document/reader/json_reader.py +0 -43
- agno/document/reader/pdf_reader.py +0 -219
- agno/document/reader/s3/pdf_reader.py +0 -46
- agno/document/reader/s3/text_reader.py +0 -51
- agno/document/reader/text_reader.py +0 -41
- agno/document/reader/website_reader.py +0 -175
- agno/document/reader/youtube_reader.py +0 -50
- agno/embedder/__init__.py +0 -1
- agno/embedder/azure_openai.py +0 -86
- agno/embedder/cohere.py +0 -72
- agno/embedder/fastembed.py +0 -37
- agno/embedder/google.py +0 -73
- agno/embedder/huggingface.py +0 -54
- agno/embedder/mistral.py +0 -80
- agno/embedder/ollama.py +0 -57
- agno/embedder/openai.py +0 -74
- agno/embedder/sentence_transformer.py +0 -38
- agno/embedder/voyageai.py +0 -64
- agno/eval/perf.py +0 -201
- agno/file/__init__.py +0 -1
- 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 -230
- agno/knowledge/arxiv.py +0 -22
- agno/knowledge/combined.py +0 -22
- agno/knowledge/csv.py +0 -28
- agno/knowledge/csv_url.py +0 -19
- agno/knowledge/document.py +0 -20
- agno/knowledge/docx.py +0 -30
- agno/knowledge/json.py +0 -28
- agno/knowledge/langchain.py +0 -71
- agno/knowledge/llamaindex.py +0 -66
- agno/knowledge/pdf.py +0 -28
- agno/knowledge/pdf_url.py +0 -26
- agno/knowledge/s3/base.py +0 -60
- agno/knowledge/s3/pdf.py +0 -21
- agno/knowledge/s3/text.py +0 -23
- agno/knowledge/text.py +0 -30
- agno/knowledge/website.py +0 -88
- agno/knowledge/wikipedia.py +0 -31
- agno/knowledge/youtube.py +0 -22
- agno/memory/agent.py +0 -392
- agno/memory/classifier.py +0 -104
- agno/memory/db/__init__.py +0 -1
- 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 -15
- agno/memory/row.py +0 -36
- agno/memory/summarizer.py +0 -192
- agno/memory/summary.py +0 -19
- agno/memory/workflow.py +0 -38
- agno/models/google/gemini_openai.py +0 -26
- agno/models/ollama/hermes.py +0 -221
- agno/models/ollama/tools.py +0 -362
- agno/models/vertexai/gemini.py +0 -595
- agno/playground/__init__.py +0 -3
- agno/playground/async_router.py +0 -421
- agno/playground/deploy.py +0 -249
- agno/playground/operator.py +0 -92
- agno/playground/playground.py +0 -91
- agno/playground/schemas.py +0 -76
- agno/playground/serve.py +0 -55
- agno/playground/sync_router.py +0 -405
- agno/reasoning/agent.py +0 -68
- agno/run/response.py +0 -112
- agno/storage/agent/__init__.py +0 -0
- agno/storage/agent/base.py +0 -38
- agno/storage/agent/dynamodb.py +0 -350
- agno/storage/agent/json.py +0 -92
- agno/storage/agent/mongodb.py +0 -228
- agno/storage/agent/postgres.py +0 -367
- agno/storage/agent/session.py +0 -79
- agno/storage/agent/singlestore.py +0 -303
- agno/storage/agent/sqlite.py +0 -357
- agno/storage/agent/yaml.py +0 -93
- agno/storage/workflow/__init__.py +0 -0
- agno/storage/workflow/base.py +0 -40
- agno/storage/workflow/mongodb.py +0 -233
- agno/storage/workflow/postgres.py +0 -366
- agno/storage/workflow/session.py +0 -60
- agno/storage/workflow/sqlite.py +0 -359
- agno/tools/googlesearch.py +0 -88
- 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/vectordb/singlestore/s2vectordb.py +0 -390
- agno/vectordb/singlestore/s2vectordb2.py +0 -355
- agno/workspace/__init__.py +0 -0
- agno/workspace/config.py +0 -325
- agno/workspace/enums.py +0 -6
- agno/workspace/helpers.py +0 -48
- agno/workspace/operator.py +0 -758
- agno/workspace/settings.py +0 -63
- agno-0.1.2.dist-info/LICENSE +0 -375
- agno-0.1.2.dist-info/METADATA +0 -502
- agno-0.1.2.dist-info/RECORD +0 -352
- agno-0.1.2.dist-info/entry_points.txt +0 -3
- /agno/{cli → db/migrations}/__init__.py +0 -0
- /agno/{cli/ws → db/migrations/versions}/__init__.py +0 -0
- /agno/{document/chunking/__init__.py → db/schemas/metrics.py} +0 -0
- /agno/{document/reader/s3 → integrations}/__init__.py +0 -0
- /agno/{file/local → knowledge/chunking}/__init__.py +0 -0
- /agno/{infra → knowledge/remote_content}/__init__.py +0 -0
- /agno/{knowledge/s3 → tools/models}/__init__.py +0 -0
- /agno/{reranker → utils/models}/__init__.py +0 -0
- /agno/{storage → utils/print_response}/__init__.py +0 -0
- {agno-0.1.2.dist-info → agno-2.3.13.dist-info}/top_level.txt +0 -0
agno/infra/resources.py
DELETED
|
@@ -1,55 +0,0 @@
|
|
|
1
|
-
from typing import Any, List, Optional, Tuple
|
|
2
|
-
|
|
3
|
-
from agno.infra.base import InfraBase
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
class InfraResources(InfraBase):
|
|
7
|
-
"""InfraResources is a group of InfraResource and InfraApp objects
|
|
8
|
-
that are managed together.
|
|
9
|
-
"""
|
|
10
|
-
|
|
11
|
-
apps: Optional[List[Any]] = None
|
|
12
|
-
resources: Optional[List[Any]] = None
|
|
13
|
-
|
|
14
|
-
def create_resources(
|
|
15
|
-
self,
|
|
16
|
-
group_filter: Optional[str] = None,
|
|
17
|
-
name_filter: Optional[str] = None,
|
|
18
|
-
type_filter: Optional[str] = None,
|
|
19
|
-
dry_run: Optional[bool] = False,
|
|
20
|
-
auto_confirm: Optional[bool] = False,
|
|
21
|
-
force: Optional[bool] = None,
|
|
22
|
-
pull: Optional[bool] = None,
|
|
23
|
-
) -> Tuple[int, int]:
|
|
24
|
-
raise NotImplementedError
|
|
25
|
-
|
|
26
|
-
def delete_resources(
|
|
27
|
-
self,
|
|
28
|
-
group_filter: Optional[str] = None,
|
|
29
|
-
name_filter: Optional[str] = None,
|
|
30
|
-
type_filter: Optional[str] = None,
|
|
31
|
-
dry_run: Optional[bool] = False,
|
|
32
|
-
auto_confirm: Optional[bool] = False,
|
|
33
|
-
force: Optional[bool] = None,
|
|
34
|
-
) -> Tuple[int, int]:
|
|
35
|
-
raise NotImplementedError
|
|
36
|
-
|
|
37
|
-
def update_resources(
|
|
38
|
-
self,
|
|
39
|
-
group_filter: Optional[str] = None,
|
|
40
|
-
name_filter: Optional[str] = None,
|
|
41
|
-
type_filter: Optional[str] = None,
|
|
42
|
-
dry_run: Optional[bool] = False,
|
|
43
|
-
auto_confirm: Optional[bool] = False,
|
|
44
|
-
force: Optional[bool] = None,
|
|
45
|
-
pull: Optional[bool] = None,
|
|
46
|
-
) -> Tuple[int, int]:
|
|
47
|
-
raise NotImplementedError
|
|
48
|
-
|
|
49
|
-
def save_resources(
|
|
50
|
-
self,
|
|
51
|
-
group_filter: Optional[str] = None,
|
|
52
|
-
name_filter: Optional[str] = None,
|
|
53
|
-
type_filter: Optional[str] = None,
|
|
54
|
-
) -> Tuple[int, int]:
|
|
55
|
-
raise NotImplementedError
|
agno/knowledge/agent.py
DELETED
|
@@ -1,230 +0,0 @@
|
|
|
1
|
-
from typing import Any, Dict, Iterator, List, Optional
|
|
2
|
-
|
|
3
|
-
from pydantic import BaseModel, ConfigDict, Field, model_validator
|
|
4
|
-
|
|
5
|
-
from agno.document import Document
|
|
6
|
-
from agno.document.chunking.fixed import FixedSizeChunking
|
|
7
|
-
from agno.document.chunking.strategy import ChunkingStrategy
|
|
8
|
-
from agno.document.reader.base import Reader
|
|
9
|
-
from agno.utils.log import logger
|
|
10
|
-
from agno.vectordb import VectorDb
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
class AgentKnowledge(BaseModel):
|
|
14
|
-
"""Base class for Agent knowledge"""
|
|
15
|
-
|
|
16
|
-
# Reader for reading documents from files, pdfs, urls, etc.
|
|
17
|
-
reader: Optional[Reader] = None
|
|
18
|
-
# Vector db for storing knowledge
|
|
19
|
-
vector_db: Optional[VectorDb] = None
|
|
20
|
-
# Number of relevant documents to return on search
|
|
21
|
-
num_documents: int = 5
|
|
22
|
-
# Number of documents to optimize the vector db on
|
|
23
|
-
optimize_on: Optional[int] = 1000
|
|
24
|
-
|
|
25
|
-
chunking_strategy: ChunkingStrategy = Field(default_factory=FixedSizeChunking)
|
|
26
|
-
|
|
27
|
-
model_config = ConfigDict(arbitrary_types_allowed=True)
|
|
28
|
-
|
|
29
|
-
@model_validator(mode="after")
|
|
30
|
-
def update_reader(self) -> "AgentKnowledge":
|
|
31
|
-
if self.reader is not None:
|
|
32
|
-
self.reader.chunking_strategy = self.chunking_strategy
|
|
33
|
-
return self
|
|
34
|
-
|
|
35
|
-
@property
|
|
36
|
-
def document_lists(self) -> Iterator[List[Document]]:
|
|
37
|
-
"""Iterator that yields lists of documents in the knowledge base
|
|
38
|
-
Each object yielded by the iterator is a list of documents.
|
|
39
|
-
"""
|
|
40
|
-
raise NotImplementedError
|
|
41
|
-
|
|
42
|
-
def search(
|
|
43
|
-
self, query: str, num_documents: Optional[int] = None, filters: Optional[Dict[str, Any]] = None
|
|
44
|
-
) -> List[Document]:
|
|
45
|
-
"""Returns relevant documents matching a query"""
|
|
46
|
-
try:
|
|
47
|
-
if self.vector_db is None:
|
|
48
|
-
logger.warning("No vector db provided")
|
|
49
|
-
return []
|
|
50
|
-
|
|
51
|
-
_num_documents = num_documents or self.num_documents
|
|
52
|
-
logger.debug(f"Getting {_num_documents} relevant documents for query: {query}")
|
|
53
|
-
return self.vector_db.search(query=query, limit=_num_documents, filters=filters)
|
|
54
|
-
except Exception as e:
|
|
55
|
-
logger.error(f"Error searching for documents: {e}")
|
|
56
|
-
return []
|
|
57
|
-
|
|
58
|
-
def load(
|
|
59
|
-
self,
|
|
60
|
-
recreate: bool = False,
|
|
61
|
-
upsert: bool = False,
|
|
62
|
-
skip_existing: bool = True,
|
|
63
|
-
filters: Optional[Dict[str, Any]] = None,
|
|
64
|
-
) -> None:
|
|
65
|
-
"""Load the knowledge base to the vector db
|
|
66
|
-
|
|
67
|
-
Args:
|
|
68
|
-
recreate (bool): If True, recreates the collection in the vector db. Defaults to False.
|
|
69
|
-
upsert (bool): If True, upserts documents to the vector db. Defaults to False.
|
|
70
|
-
skip_existing (bool): If True, skips documents which already exist in the vector db when inserting. Defaults to True.
|
|
71
|
-
filters (Optional[Dict[str, Any]]): Filters to add to each row that can be used to limit results during querying. Defaults to None.
|
|
72
|
-
"""
|
|
73
|
-
|
|
74
|
-
if self.vector_db is None:
|
|
75
|
-
logger.warning("No vector db provided")
|
|
76
|
-
return
|
|
77
|
-
|
|
78
|
-
if recreate:
|
|
79
|
-
logger.info("Dropping collection")
|
|
80
|
-
self.vector_db.drop()
|
|
81
|
-
|
|
82
|
-
logger.info("Creating collection")
|
|
83
|
-
self.vector_db.create()
|
|
84
|
-
|
|
85
|
-
logger.info("Loading knowledge base")
|
|
86
|
-
num_documents = 0
|
|
87
|
-
for document_list in self.document_lists:
|
|
88
|
-
documents_to_load = document_list
|
|
89
|
-
# Upsert documents if upsert is True and vector db supports upsert
|
|
90
|
-
if upsert and self.vector_db.upsert_available():
|
|
91
|
-
self.vector_db.upsert(documents=documents_to_load, filters=filters)
|
|
92
|
-
# Insert documents
|
|
93
|
-
else:
|
|
94
|
-
# Filter out documents which already exist in the vector db
|
|
95
|
-
if skip_existing:
|
|
96
|
-
# Use set for O(1) lookups
|
|
97
|
-
seen_content = set()
|
|
98
|
-
documents_to_load = []
|
|
99
|
-
for doc in document_list:
|
|
100
|
-
if doc.content not in seen_content and not self.vector_db.doc_exists(doc):
|
|
101
|
-
seen_content.add(doc.content)
|
|
102
|
-
documents_to_load.append(doc)
|
|
103
|
-
self.vector_db.insert(documents=documents_to_load, filters=filters)
|
|
104
|
-
num_documents += len(documents_to_load)
|
|
105
|
-
logger.info(f"Added {len(documents_to_load)} documents to knowledge base")
|
|
106
|
-
|
|
107
|
-
def load_documents(
|
|
108
|
-
self,
|
|
109
|
-
documents: List[Document],
|
|
110
|
-
upsert: bool = False,
|
|
111
|
-
skip_existing: bool = True,
|
|
112
|
-
filters: Optional[Dict[str, Any]] = None,
|
|
113
|
-
) -> None:
|
|
114
|
-
"""Load documents to the knowledge base
|
|
115
|
-
|
|
116
|
-
Args:
|
|
117
|
-
documents (List[Document]): List of documents to load
|
|
118
|
-
upsert (bool): If True, upserts documents to the vector db. Defaults to False.
|
|
119
|
-
skip_existing (bool): If True, skips documents which already exist in the vector db when inserting. Defaults to True.
|
|
120
|
-
filters (Optional[Dict[str, Any]]): Filters to add to each row that can be used to limit results during querying. Defaults to None.
|
|
121
|
-
"""
|
|
122
|
-
|
|
123
|
-
logger.info("Loading knowledge base")
|
|
124
|
-
if self.vector_db is None:
|
|
125
|
-
logger.warning("No vector db provided")
|
|
126
|
-
return
|
|
127
|
-
|
|
128
|
-
logger.debug("Creating collection")
|
|
129
|
-
self.vector_db.create()
|
|
130
|
-
|
|
131
|
-
# Upsert documents if upsert is True
|
|
132
|
-
if upsert and self.vector_db.upsert_available():
|
|
133
|
-
self.vector_db.upsert(documents=documents, filters=filters)
|
|
134
|
-
logger.info(f"Loaded {len(documents)} documents to knowledge base")
|
|
135
|
-
return
|
|
136
|
-
|
|
137
|
-
# Filter out documents which already exist in the vector db
|
|
138
|
-
documents_to_load = (
|
|
139
|
-
[document for document in documents if not self.vector_db.doc_exists(document)]
|
|
140
|
-
if skip_existing
|
|
141
|
-
else documents
|
|
142
|
-
)
|
|
143
|
-
|
|
144
|
-
# Insert documents
|
|
145
|
-
if len(documents_to_load) > 0:
|
|
146
|
-
self.vector_db.insert(documents=documents_to_load, filters=filters)
|
|
147
|
-
logger.info(f"Loaded {len(documents_to_load)} documents to knowledge base")
|
|
148
|
-
else:
|
|
149
|
-
logger.info("No new documents to load")
|
|
150
|
-
|
|
151
|
-
def load_document(
|
|
152
|
-
self,
|
|
153
|
-
document: Document,
|
|
154
|
-
upsert: bool = False,
|
|
155
|
-
skip_existing: bool = True,
|
|
156
|
-
filters: Optional[Dict[str, Any]] = None,
|
|
157
|
-
) -> None:
|
|
158
|
-
"""Load a document to the knowledge base
|
|
159
|
-
|
|
160
|
-
Args:
|
|
161
|
-
document (Document): Document to load
|
|
162
|
-
upsert (bool): If True, upserts documents to the vector db. Defaults to False.
|
|
163
|
-
skip_existing (bool): If True, skips documents which already exist in the vector db. Defaults to True.
|
|
164
|
-
filters (Optional[Dict[str, Any]]): Filters to add to each row that can be used to limit results during querying. Defaults to None.
|
|
165
|
-
"""
|
|
166
|
-
self.load_documents(documents=[document], upsert=upsert, skip_existing=skip_existing, filters=filters)
|
|
167
|
-
|
|
168
|
-
def load_dict(
|
|
169
|
-
self,
|
|
170
|
-
document: Dict[str, Any],
|
|
171
|
-
upsert: bool = False,
|
|
172
|
-
skip_existing: bool = True,
|
|
173
|
-
filters: Optional[Dict[str, Any]] = None,
|
|
174
|
-
) -> None:
|
|
175
|
-
"""Load a dictionary representation of a document to the knowledge base
|
|
176
|
-
|
|
177
|
-
Args:
|
|
178
|
-
document (Dict[str, Any]): Dictionary representation of a document
|
|
179
|
-
upsert (bool): If True, upserts documents to the vector db. Defaults to False.
|
|
180
|
-
skip_existing (bool): If True, skips documents which already exist in the vector db. Defaults to True.
|
|
181
|
-
filters (Optional[Dict[str, Any]]): Filters to add to each row that can be used to limit results during querying. Defaults to None.
|
|
182
|
-
"""
|
|
183
|
-
self.load_documents(
|
|
184
|
-
documents=[Document.from_dict(document)], upsert=upsert, skip_existing=skip_existing, filters=filters
|
|
185
|
-
)
|
|
186
|
-
|
|
187
|
-
def load_json(
|
|
188
|
-
self, document: str, upsert: bool = False, skip_existing: bool = True, filters: Optional[Dict[str, Any]] = None
|
|
189
|
-
) -> None:
|
|
190
|
-
"""Load a json representation of a document to the knowledge base
|
|
191
|
-
|
|
192
|
-
Args:
|
|
193
|
-
document (str): Json representation of a document
|
|
194
|
-
upsert (bool): If True, upserts documents to the vector db. Defaults to False.
|
|
195
|
-
skip_existing (bool): If True, skips documents which already exist in the vector db. Defaults to True.
|
|
196
|
-
filters (Optional[Dict[str, Any]]): Filters to add to each row that can be used to limit results during querying. Defaults to None.
|
|
197
|
-
"""
|
|
198
|
-
self.load_documents(
|
|
199
|
-
documents=[Document.from_json(document)], upsert=upsert, skip_existing=skip_existing, filters=filters
|
|
200
|
-
)
|
|
201
|
-
|
|
202
|
-
def load_text(
|
|
203
|
-
self, text: str, upsert: bool = False, skip_existing: bool = True, filters: Optional[Dict[str, Any]] = None
|
|
204
|
-
) -> None:
|
|
205
|
-
"""Load a text to the knowledge base
|
|
206
|
-
|
|
207
|
-
Args:
|
|
208
|
-
text (str): Text to load to the knowledge base
|
|
209
|
-
upsert (bool): If True, upserts documents to the vector db. Defaults to False.
|
|
210
|
-
skip_existing (bool): If True, skips documents which already exist in the vector db. Defaults to True.
|
|
211
|
-
filters (Optional[Dict[str, Any]]): Filters to add to each row that can be used to limit results during querying. Defaults to None.
|
|
212
|
-
"""
|
|
213
|
-
self.load_documents(
|
|
214
|
-
documents=[Document(content=text)], upsert=upsert, skip_existing=skip_existing, filters=filters
|
|
215
|
-
)
|
|
216
|
-
|
|
217
|
-
def exists(self) -> bool:
|
|
218
|
-
"""Returns True if the knowledge base exists"""
|
|
219
|
-
if self.vector_db is None:
|
|
220
|
-
logger.warning("No vector db provided")
|
|
221
|
-
return False
|
|
222
|
-
return self.vector_db.exists()
|
|
223
|
-
|
|
224
|
-
def delete(self) -> bool:
|
|
225
|
-
"""Clear the knowledge base"""
|
|
226
|
-
if self.vector_db is None:
|
|
227
|
-
logger.warning("No vector db available")
|
|
228
|
-
return True
|
|
229
|
-
|
|
230
|
-
return self.vector_db.delete()
|
agno/knowledge/arxiv.py
DELETED
|
@@ -1,22 +0,0 @@
|
|
|
1
|
-
from typing import 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)
|
agno/knowledge/combined.py
DELETED
|
@@ -1,22 +0,0 @@
|
|
|
1
|
-
from typing import Iterator, List
|
|
2
|
-
|
|
3
|
-
from agno.document import Document
|
|
4
|
-
from agno.knowledge.agent import AgentKnowledge
|
|
5
|
-
from agno.utils.log import logger
|
|
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
|
-
logger.debug(f"Loading documents from {kb.__class__.__name__}")
|
|
22
|
-
yield from kb.document_lists
|
agno/knowledge/csv.py
DELETED
|
@@ -1,28 +0,0 @@
|
|
|
1
|
-
from pathlib import Path
|
|
2
|
-
from typing import Iterator, List, Union
|
|
3
|
-
|
|
4
|
-
from agno.document import Document
|
|
5
|
-
from agno.document.reader.csv_reader import CSVReader
|
|
6
|
-
from agno.knowledge.agent import AgentKnowledge
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
class CSVKnowledgeBase(AgentKnowledge):
|
|
10
|
-
path: Union[str, Path]
|
|
11
|
-
reader: CSVReader = CSVReader()
|
|
12
|
-
|
|
13
|
-
@property
|
|
14
|
-
def document_lists(self) -> Iterator[List[Document]]:
|
|
15
|
-
"""Iterate over CSVs and yield lists of documents.
|
|
16
|
-
Each object yielded by the iterator is a list of documents.
|
|
17
|
-
|
|
18
|
-
Returns:
|
|
19
|
-
Iterator[List[Document]]: Iterator yielding list of documents
|
|
20
|
-
"""
|
|
21
|
-
|
|
22
|
-
_csv_path: Path = Path(self.path) if isinstance(self.path, str) else self.path
|
|
23
|
-
|
|
24
|
-
if _csv_path.exists() and _csv_path.is_dir():
|
|
25
|
-
for _csv in _csv_path.glob("**/*.csv"):
|
|
26
|
-
yield self.reader.read(file=_csv)
|
|
27
|
-
elif _csv_path.exists() and _csv_path.is_file() and _csv_path.suffix == ".csv":
|
|
28
|
-
yield self.reader.read(file=_csv_path)
|
agno/knowledge/csv_url.py
DELETED
|
@@ -1,19 +0,0 @@
|
|
|
1
|
-
from typing import Iterator, List
|
|
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 logger
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
class CSVUrlKnowledgeBase(AgentKnowledge):
|
|
10
|
-
urls: List[str]
|
|
11
|
-
reader: CSVUrlReader = CSVUrlReader()
|
|
12
|
-
|
|
13
|
-
@property
|
|
14
|
-
def document_lists(self) -> Iterator[List[Document]]:
|
|
15
|
-
for url in self.urls:
|
|
16
|
-
if url.endswith(".csv"):
|
|
17
|
-
yield self.reader.read(url=url)
|
|
18
|
-
else:
|
|
19
|
-
logger.error(f"Unsupported URL: {url}")
|
agno/knowledge/document.py
DELETED
|
@@ -1,20 +0,0 @@
|
|
|
1
|
-
from typing import Iterator, List
|
|
2
|
-
|
|
3
|
-
from agno.document import Document
|
|
4
|
-
from agno.knowledge.agent import AgentKnowledge
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
class DocumentKnowledgeBase(AgentKnowledge):
|
|
8
|
-
documents: List[Document]
|
|
9
|
-
|
|
10
|
-
@property
|
|
11
|
-
def document_lists(self) -> Iterator[List[Document]]:
|
|
12
|
-
"""Iterate over documents and yield lists of documents.
|
|
13
|
-
Each object yielded by the iterator is a list of documents.
|
|
14
|
-
|
|
15
|
-
Returns:
|
|
16
|
-
Iterator[List[Document]]: Iterator yielding list of documents
|
|
17
|
-
"""
|
|
18
|
-
|
|
19
|
-
for _document in self.documents:
|
|
20
|
-
yield [_document]
|
agno/knowledge/docx.py
DELETED
|
@@ -1,30 +0,0 @@
|
|
|
1
|
-
from pathlib import Path
|
|
2
|
-
from typing import Iterator, List, Union
|
|
3
|
-
|
|
4
|
-
from agno.document import Document
|
|
5
|
-
from agno.document.reader.docx_reader import DocxReader
|
|
6
|
-
from agno.knowledge.agent import AgentKnowledge
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
class DocxKnowledgeBase(AgentKnowledge):
|
|
10
|
-
path: Union[str, Path]
|
|
11
|
-
formats: List[str] = [".doc", ".docx"]
|
|
12
|
-
reader: DocxReader = DocxReader()
|
|
13
|
-
|
|
14
|
-
@property
|
|
15
|
-
def document_lists(self) -> Iterator[List[Document]]:
|
|
16
|
-
"""Iterate over doc/docx files and yield lists of documents.
|
|
17
|
-
Each object yielded by the iterator is a list of documents.
|
|
18
|
-
|
|
19
|
-
Returns:
|
|
20
|
-
Iterator[List[Document]]: Iterator yielding list of documents
|
|
21
|
-
"""
|
|
22
|
-
|
|
23
|
-
_file_path: Path = Path(self.path) if isinstance(self.path, str) else self.path
|
|
24
|
-
|
|
25
|
-
if _file_path.exists() and _file_path.is_dir():
|
|
26
|
-
for _file in _file_path.glob("**/*"):
|
|
27
|
-
if _file.suffix in self.formats:
|
|
28
|
-
yield self.reader.read(file=_file)
|
|
29
|
-
elif _file_path.exists() and _file_path.is_file() and _file_path.suffix in self.formats:
|
|
30
|
-
yield self.reader.read(file=_file_path)
|
agno/knowledge/json.py
DELETED
|
@@ -1,28 +0,0 @@
|
|
|
1
|
-
from pathlib import Path
|
|
2
|
-
from typing import Iterator, List, Union
|
|
3
|
-
|
|
4
|
-
from agno.document import Document
|
|
5
|
-
from agno.document.reader.json_reader import JSONReader
|
|
6
|
-
from agno.knowledge.agent import AgentKnowledge
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
class JSONKnowledgeBase(AgentKnowledge):
|
|
10
|
-
path: Union[str, Path]
|
|
11
|
-
reader: JSONReader = JSONReader()
|
|
12
|
-
|
|
13
|
-
@property
|
|
14
|
-
def document_lists(self) -> Iterator[List[Document]]:
|
|
15
|
-
"""Iterate over Json files and yield lists of documents.
|
|
16
|
-
Each object yielded by the iterator is a list of documents.
|
|
17
|
-
|
|
18
|
-
Returns:
|
|
19
|
-
Iterator[List[Document]]: Iterator yielding list of documents
|
|
20
|
-
"""
|
|
21
|
-
|
|
22
|
-
_json_path: Path = Path(self.path) if isinstance(self.path, str) else self.path
|
|
23
|
-
|
|
24
|
-
if _json_path.exists() and _json_path.is_dir():
|
|
25
|
-
for _pdf in _json_path.glob("*.json"):
|
|
26
|
-
yield self.reader.read(path=_pdf)
|
|
27
|
-
elif _json_path.exists() and _json_path.is_file() and _json_path.suffix == ".json":
|
|
28
|
-
yield self.reader.read(path=_json_path)
|
agno/knowledge/langchain.py
DELETED
|
@@ -1,71 +0,0 @@
|
|
|
1
|
-
from typing import Any, Callable, Dict, List, Optional
|
|
2
|
-
|
|
3
|
-
from agno.document import Document
|
|
4
|
-
from agno.knowledge.agent import AgentKnowledge
|
|
5
|
-
from agno.utils.log import logger
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
class LangChainKnowledgeBase(AgentKnowledge):
|
|
9
|
-
loader: Optional[Callable] = None
|
|
10
|
-
|
|
11
|
-
vectorstore: Optional[Any] = None
|
|
12
|
-
search_kwargs: Optional[dict] = None
|
|
13
|
-
|
|
14
|
-
retriever: Optional[Any] = None
|
|
15
|
-
|
|
16
|
-
def search(
|
|
17
|
-
self, query: str, num_documents: Optional[int] = None, filters: Optional[Dict[str, Any]] = None
|
|
18
|
-
) -> List[Document]:
|
|
19
|
-
"""Returns relevant documents matching the query"""
|
|
20
|
-
|
|
21
|
-
try:
|
|
22
|
-
from langchain_core.documents import Document as LangChainDocument
|
|
23
|
-
from langchain_core.retrievers import BaseRetriever
|
|
24
|
-
except ImportError:
|
|
25
|
-
raise ImportError(
|
|
26
|
-
"The `langchain` package is not installed. Please install it via `pip install langchain`."
|
|
27
|
-
)
|
|
28
|
-
|
|
29
|
-
if self.vectorstore is not None and self.retriever is None:
|
|
30
|
-
logger.debug("Creating retriever")
|
|
31
|
-
if self.search_kwargs is None:
|
|
32
|
-
self.search_kwargs = {"k": self.num_documents}
|
|
33
|
-
if filters is not None:
|
|
34
|
-
self.search_kwargs.update(filters)
|
|
35
|
-
self.retriever = self.vectorstore.as_retriever(search_kwargs=self.search_kwargs)
|
|
36
|
-
|
|
37
|
-
if self.retriever is None:
|
|
38
|
-
logger.error("No retriever provided")
|
|
39
|
-
return []
|
|
40
|
-
|
|
41
|
-
if not isinstance(self.retriever, BaseRetriever):
|
|
42
|
-
raise ValueError(f"Retriever is not of type BaseRetriever: {self.retriever}")
|
|
43
|
-
|
|
44
|
-
_num_documents = num_documents or self.num_documents
|
|
45
|
-
logger.debug(f"Getting {_num_documents} relevant documents for query: {query}")
|
|
46
|
-
lc_documents: List[LangChainDocument] = self.retriever.invoke(input=query)
|
|
47
|
-
documents = []
|
|
48
|
-
for lc_doc in lc_documents:
|
|
49
|
-
documents.append(
|
|
50
|
-
Document(
|
|
51
|
-
content=lc_doc.page_content,
|
|
52
|
-
meta_data=lc_doc.metadata,
|
|
53
|
-
)
|
|
54
|
-
)
|
|
55
|
-
return documents
|
|
56
|
-
|
|
57
|
-
def load(
|
|
58
|
-
self,
|
|
59
|
-
recreate: bool = False,
|
|
60
|
-
upsert: bool = True,
|
|
61
|
-
skip_existing: bool = True,
|
|
62
|
-
filters: Optional[Dict[str, Any]] = None,
|
|
63
|
-
) -> None:
|
|
64
|
-
if self.loader is None:
|
|
65
|
-
logger.error("No loader provided for LangChainKnowledgeBase")
|
|
66
|
-
return
|
|
67
|
-
self.loader()
|
|
68
|
-
|
|
69
|
-
def exists(self) -> bool:
|
|
70
|
-
logger.warning("LangChainKnowledgeBase.exists() not supported - please check the vectorstore manually.")
|
|
71
|
-
return True
|
agno/knowledge/llamaindex.py
DELETED
|
@@ -1,66 +0,0 @@
|
|
|
1
|
-
from typing import Any, Callable, Dict, List, Optional
|
|
2
|
-
|
|
3
|
-
from agno.document import Document
|
|
4
|
-
from agno.knowledge.agent import AgentKnowledge
|
|
5
|
-
from agno.utils.log import logger
|
|
6
|
-
|
|
7
|
-
try:
|
|
8
|
-
from llama_index.core.retrievers import BaseRetriever
|
|
9
|
-
from llama_index.core.schema import NodeWithScore
|
|
10
|
-
except ImportError:
|
|
11
|
-
raise ImportError(
|
|
12
|
-
"The `llama-index-core` package is not installed. Please install it via `pip install llama-index-core`."
|
|
13
|
-
)
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
class LlamaIndexKnowledgeBase(AgentKnowledge):
|
|
17
|
-
retriever: BaseRetriever
|
|
18
|
-
loader: Optional[Callable] = None
|
|
19
|
-
|
|
20
|
-
def search(
|
|
21
|
-
self, query: str, num_documents: Optional[int] = None, filters: Optional[Dict[str, Any]] = None
|
|
22
|
-
) -> List[Document]:
|
|
23
|
-
"""
|
|
24
|
-
Returns relevant documents matching the query.
|
|
25
|
-
|
|
26
|
-
Args:
|
|
27
|
-
query (str): The query string to search for.
|
|
28
|
-
num_documents (Optional[int]): The maximum number of documents to return. Defaults to None.
|
|
29
|
-
filters (Optional[Dict[str, Any]]): Filters to apply to the search. Defaults to None.
|
|
30
|
-
|
|
31
|
-
Returns:
|
|
32
|
-
List[Document]: A list of relevant documents matching the query.
|
|
33
|
-
Raises:
|
|
34
|
-
ValueError: If the retriever is not of type BaseRetriever.
|
|
35
|
-
"""
|
|
36
|
-
if not isinstance(self.retriever, BaseRetriever):
|
|
37
|
-
raise ValueError(f"Retriever is not of type BaseRetriever: {self.retriever}")
|
|
38
|
-
|
|
39
|
-
lc_documents: List[NodeWithScore] = self.retriever.retrieve(query)
|
|
40
|
-
if num_documents is not None:
|
|
41
|
-
lc_documents = lc_documents[:num_documents]
|
|
42
|
-
documents = []
|
|
43
|
-
for lc_doc in lc_documents:
|
|
44
|
-
documents.append(
|
|
45
|
-
Document(
|
|
46
|
-
content=lc_doc.text,
|
|
47
|
-
meta_data=lc_doc.metadata,
|
|
48
|
-
)
|
|
49
|
-
)
|
|
50
|
-
return documents
|
|
51
|
-
|
|
52
|
-
def load(
|
|
53
|
-
self,
|
|
54
|
-
recreate: bool = False,
|
|
55
|
-
upsert: bool = True,
|
|
56
|
-
skip_existing: bool = True,
|
|
57
|
-
filters: Optional[Dict[str, Any]] = None,
|
|
58
|
-
) -> None:
|
|
59
|
-
if self.loader is None:
|
|
60
|
-
logger.error("No loader provided for LlamaIndexKnowledgeBase")
|
|
61
|
-
return
|
|
62
|
-
self.loader()
|
|
63
|
-
|
|
64
|
-
def exists(self) -> bool:
|
|
65
|
-
logger.warning("LlamaIndexKnowledgeBase.exists() not supported - please check the vectorstore manually.")
|
|
66
|
-
return True
|
agno/knowledge/pdf.py
DELETED
|
@@ -1,28 +0,0 @@
|
|
|
1
|
-
from pathlib import Path
|
|
2
|
-
from typing import Iterator, List, Union
|
|
3
|
-
|
|
4
|
-
from agno.document import Document
|
|
5
|
-
from agno.document.reader.pdf_reader import PDFImageReader, PDFReader
|
|
6
|
-
from agno.knowledge.agent import AgentKnowledge
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
class PDFKnowledgeBase(AgentKnowledge):
|
|
10
|
-
path: Union[str, Path]
|
|
11
|
-
reader: Union[PDFReader, PDFImageReader] = PDFReader()
|
|
12
|
-
|
|
13
|
-
@property
|
|
14
|
-
def document_lists(self) -> Iterator[List[Document]]:
|
|
15
|
-
"""Iterate over PDFs and yield lists of documents.
|
|
16
|
-
Each object yielded by the iterator is a list of documents.
|
|
17
|
-
|
|
18
|
-
Returns:
|
|
19
|
-
Iterator[List[Document]]: Iterator yielding list of documents
|
|
20
|
-
"""
|
|
21
|
-
|
|
22
|
-
_pdf_path: Path = Path(self.path) if isinstance(self.path, str) else self.path
|
|
23
|
-
|
|
24
|
-
if _pdf_path.exists() and _pdf_path.is_dir():
|
|
25
|
-
for _pdf in _pdf_path.glob("**/*.pdf"):
|
|
26
|
-
yield self.reader.read(pdf=_pdf)
|
|
27
|
-
elif _pdf_path.exists() and _pdf_path.is_file() and _pdf_path.suffix == ".pdf":
|
|
28
|
-
yield self.reader.read(pdf=_pdf_path)
|
agno/knowledge/pdf_url.py
DELETED
|
@@ -1,26 +0,0 @@
|
|
|
1
|
-
from typing import Iterator, List, Union
|
|
2
|
-
|
|
3
|
-
from agno.document import Document
|
|
4
|
-
from agno.document.reader.pdf_reader import PDFUrlImageReader, PDFUrlReader
|
|
5
|
-
from agno.knowledge.agent import AgentKnowledge
|
|
6
|
-
from agno.utils.log import logger
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
class PDFUrlKnowledgeBase(AgentKnowledge):
|
|
10
|
-
urls: List[str] = []
|
|
11
|
-
reader: Union[PDFUrlReader, PDFUrlImageReader] = PDFUrlReader()
|
|
12
|
-
|
|
13
|
-
@property
|
|
14
|
-
def document_lists(self) -> Iterator[List[Document]]:
|
|
15
|
-
"""Iterate over PDF urls and yield lists of documents.
|
|
16
|
-
Each object yielded by the iterator is a list of documents.
|
|
17
|
-
|
|
18
|
-
Returns:
|
|
19
|
-
Iterator[List[Document]]: Iterator yielding list of documents
|
|
20
|
-
"""
|
|
21
|
-
|
|
22
|
-
for url in self.urls:
|
|
23
|
-
if url.endswith(".pdf"):
|
|
24
|
-
yield self.reader.read(url=url)
|
|
25
|
-
else:
|
|
26
|
-
logger.error(f"Unsupported URL: {url}")
|