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/tools/duckdb.py
CHANGED
|
@@ -1,7 +1,8 @@
|
|
|
1
|
+
from pathlib import Path
|
|
1
2
|
from typing import Any, Dict, List, Optional, Tuple
|
|
2
3
|
|
|
3
4
|
from agno.tools import Toolkit
|
|
4
|
-
from agno.utils.log import logger
|
|
5
|
+
from agno.utils.log import log_debug, log_info, logger
|
|
5
6
|
|
|
6
7
|
try:
|
|
7
8
|
import duckdb
|
|
@@ -17,32 +18,31 @@ class DuckDbTools(Toolkit):
|
|
|
17
18
|
init_commands: Optional[List] = None,
|
|
18
19
|
read_only: bool = False,
|
|
19
20
|
config: Optional[dict] = None,
|
|
20
|
-
|
|
21
|
-
inspect_queries: bool = False,
|
|
22
|
-
create_tables: bool = True,
|
|
23
|
-
summarize_tables: bool = True,
|
|
24
|
-
export_tables: bool = False,
|
|
21
|
+
**kwargs,
|
|
25
22
|
):
|
|
26
|
-
super().__init__(name="duckdb_tools")
|
|
27
|
-
|
|
28
23
|
self.db_path: Optional[str] = db_path
|
|
29
24
|
self.read_only: bool = read_only
|
|
30
25
|
self.config: Optional[dict] = config
|
|
31
26
|
self._connection: Optional[duckdb.DuckDBPyConnection] = connection
|
|
32
27
|
self.init_commands: Optional[List] = init_commands
|
|
33
28
|
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
self.
|
|
38
|
-
|
|
39
|
-
self.
|
|
40
|
-
|
|
41
|
-
self.
|
|
42
|
-
|
|
43
|
-
self.
|
|
44
|
-
|
|
45
|
-
self.
|
|
29
|
+
tools: List[Any] = [
|
|
30
|
+
self.show_tables,
|
|
31
|
+
self.describe_table,
|
|
32
|
+
self.inspect_query,
|
|
33
|
+
self.run_query,
|
|
34
|
+
self.create_table_from_path,
|
|
35
|
+
self.summarize_table,
|
|
36
|
+
self.export_table_to_path,
|
|
37
|
+
self.load_local_path_to_table,
|
|
38
|
+
self.load_local_csv_to_table,
|
|
39
|
+
self.load_s3_path_to_table,
|
|
40
|
+
self.load_s3_csv_to_table,
|
|
41
|
+
self.create_fts_index,
|
|
42
|
+
self.full_text_search,
|
|
43
|
+
]
|
|
44
|
+
|
|
45
|
+
super().__init__(name="duckdb_tools", tools=tools, **kwargs)
|
|
46
46
|
|
|
47
47
|
@property
|
|
48
48
|
def connection(self) -> duckdb.DuckDBPyConnection:
|
|
@@ -79,7 +79,7 @@ class DuckDbTools(Toolkit):
|
|
|
79
79
|
if show_tables:
|
|
80
80
|
stmt = "SHOW TABLES;"
|
|
81
81
|
tables = self.run_query(stmt)
|
|
82
|
-
|
|
82
|
+
log_debug(f"Tables: {tables}")
|
|
83
83
|
return tables
|
|
84
84
|
return "No tables to show"
|
|
85
85
|
|
|
@@ -92,7 +92,7 @@ class DuckDbTools(Toolkit):
|
|
|
92
92
|
stmt = f"DESCRIBE {table};"
|
|
93
93
|
table_description = self.run_query(stmt)
|
|
94
94
|
|
|
95
|
-
|
|
95
|
+
log_debug(f"Table description: {table_description}")
|
|
96
96
|
return f"{table}\n{table_description}"
|
|
97
97
|
|
|
98
98
|
def inspect_query(self, query: str) -> str:
|
|
@@ -104,7 +104,7 @@ class DuckDbTools(Toolkit):
|
|
|
104
104
|
stmt = f"explain {query};"
|
|
105
105
|
explain_plan = self.run_query(stmt)
|
|
106
106
|
|
|
107
|
-
|
|
107
|
+
log_debug(f"Explain plan: {explain_plan}")
|
|
108
108
|
return explain_plan
|
|
109
109
|
|
|
110
110
|
def run_query(self, query: str) -> str:
|
|
@@ -121,7 +121,7 @@ class DuckDbTools(Toolkit):
|
|
|
121
121
|
formatted_sql = formatted_sql.split(";")[0]
|
|
122
122
|
|
|
123
123
|
try:
|
|
124
|
-
|
|
124
|
+
log_info(f"Running: {formatted_sql}")
|
|
125
125
|
|
|
126
126
|
query_result = self.connection.sql(formatted_sql)
|
|
127
127
|
result_output = "No output"
|
|
@@ -140,7 +140,7 @@ class DuckDbTools(Toolkit):
|
|
|
140
140
|
except AttributeError:
|
|
141
141
|
result_output = str(query_result)
|
|
142
142
|
|
|
143
|
-
|
|
143
|
+
log_debug(f"Query result: {result_output}")
|
|
144
144
|
return result_output
|
|
145
145
|
except duckdb.ProgrammingError as e:
|
|
146
146
|
return str(e)
|
|
@@ -159,7 +159,7 @@ class DuckDbTools(Toolkit):
|
|
|
159
159
|
"""
|
|
160
160
|
table_summary = self.run_query(f"SUMMARIZE {table};")
|
|
161
161
|
|
|
162
|
-
|
|
162
|
+
log_debug(f"Table description: {table_summary}")
|
|
163
163
|
return table_summary
|
|
164
164
|
|
|
165
165
|
def get_table_name_from_path(self, path: str) -> str:
|
|
@@ -168,12 +168,10 @@ class DuckDbTools(Toolkit):
|
|
|
168
168
|
:param path: Path to get the table name from
|
|
169
169
|
:return: Table name
|
|
170
170
|
"""
|
|
171
|
-
import os
|
|
172
|
-
|
|
173
171
|
# Get the file name from the path
|
|
174
|
-
|
|
172
|
+
path_obj = Path(path)
|
|
175
173
|
# Get the file name without extension from the path
|
|
176
|
-
table
|
|
174
|
+
table = path_obj.stem
|
|
177
175
|
# If the table isn't a valid SQL identifier, we'll need to use something else
|
|
178
176
|
table = table.replace("-", "_").replace(".", "_").replace(" ", "_").replace("/", "_")
|
|
179
177
|
|
|
@@ -191,14 +189,19 @@ class DuckDbTools(Toolkit):
|
|
|
191
189
|
if table is None:
|
|
192
190
|
table = self.get_table_name_from_path(path)
|
|
193
191
|
|
|
194
|
-
|
|
192
|
+
log_debug(f"Creating table {table} from {path}")
|
|
195
193
|
create_statement = "CREATE TABLE IF NOT EXISTS"
|
|
196
194
|
if replace:
|
|
197
195
|
create_statement = "CREATE OR REPLACE TABLE"
|
|
198
196
|
|
|
199
|
-
|
|
197
|
+
# Check if the file is a CSV
|
|
198
|
+
if path.lower().endswith(".csv"):
|
|
199
|
+
create_statement += f" {table} AS SELECT * FROM read_csv('{path}', ignore_errors=false, auto_detect=true);"
|
|
200
|
+
else:
|
|
201
|
+
create_statement += f" {table} AS SELECT * FROM '{path}';"
|
|
202
|
+
|
|
200
203
|
self.run_query(create_statement)
|
|
201
|
-
|
|
204
|
+
log_debug(f"Created table {table} from {path}")
|
|
202
205
|
return table
|
|
203
206
|
|
|
204
207
|
def export_table_to_path(self, table: str, format: Optional[str] = "PARQUET", path: Optional[str] = None) -> str:
|
|
@@ -215,14 +218,14 @@ class DuckDbTools(Toolkit):
|
|
|
215
218
|
if format is None:
|
|
216
219
|
format = "PARQUET"
|
|
217
220
|
|
|
218
|
-
|
|
221
|
+
log_debug(f"Exporting Table {table} as {format.upper()} to path {path}")
|
|
219
222
|
if path is None:
|
|
220
223
|
path = f"{table}.{format}"
|
|
221
224
|
else:
|
|
222
225
|
path = f"{path}/{table}.{format}"
|
|
223
226
|
export_statement = f"COPY (SELECT * FROM {table}) TO '{path}' (FORMAT {format.upper()});"
|
|
224
227
|
result = self.run_query(export_statement)
|
|
225
|
-
|
|
228
|
+
log_debug(f"Exported {table} to {path}/{table}")
|
|
226
229
|
return result
|
|
227
230
|
|
|
228
231
|
def load_local_path_to_table(self, path: str, table: Optional[str] = None) -> Tuple[str, str]:
|
|
@@ -232,22 +235,20 @@ class DuckDbTools(Toolkit):
|
|
|
232
235
|
:param table: Optional table name to use
|
|
233
236
|
:return: Table name, SQL statement used to load the file
|
|
234
237
|
"""
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
logger.debug(f"Loading {path} into duckdb")
|
|
238
|
+
log_debug(f"Loading {path} into duckdb")
|
|
238
239
|
|
|
239
240
|
if table is None:
|
|
240
|
-
# Get the file name from the
|
|
241
|
-
|
|
242
|
-
# Get the file name without extension from the
|
|
243
|
-
table
|
|
241
|
+
# Get the file name from the path
|
|
242
|
+
path_obj = Path(path)
|
|
243
|
+
# Get the file name without extension from the path
|
|
244
|
+
table = path_obj.stem
|
|
244
245
|
# If the table isn't a valid SQL identifier, we'll need to use something else
|
|
245
246
|
table = table.replace("-", "_").replace(".", "_").replace(" ", "_").replace("/", "_")
|
|
246
247
|
|
|
247
|
-
create_statement = f"CREATE OR REPLACE TABLE
|
|
248
|
+
create_statement = f"CREATE OR REPLACE TABLE {table} AS SELECT * FROM '{path}';"
|
|
248
249
|
self.run_query(create_statement)
|
|
249
250
|
|
|
250
|
-
|
|
251
|
+
log_debug(f"Loaded {path} into duckdb as {table}")
|
|
251
252
|
return table, create_statement
|
|
252
253
|
|
|
253
254
|
def load_local_csv_to_table(
|
|
@@ -260,28 +261,26 @@ class DuckDbTools(Toolkit):
|
|
|
260
261
|
:param delimiter: Optional delimiter to use
|
|
261
262
|
:return: Table name, SQL statement used to load the file
|
|
262
263
|
"""
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
logger.debug(f"Loading {path} into duckdb")
|
|
264
|
+
log_debug(f"Loading {path} into duckdb")
|
|
266
265
|
|
|
267
266
|
if table is None:
|
|
268
|
-
# Get the file name from the
|
|
269
|
-
|
|
270
|
-
# Get the file name without extension from the
|
|
271
|
-
table
|
|
267
|
+
# Get the file name from the path
|
|
268
|
+
path_obj = Path(path)
|
|
269
|
+
# Get the file name without extension from the path
|
|
270
|
+
table = path_obj.stem
|
|
272
271
|
# If the table isn't a valid SQL identifier, we'll need to use something else
|
|
273
272
|
table = table.replace("-", "_").replace(".", "_").replace(" ", "_").replace("/", "_")
|
|
274
273
|
|
|
275
|
-
select_statement = f"SELECT * FROM read_csv('{path}'"
|
|
274
|
+
select_statement = f"SELECT * FROM read_csv('{path}', ignore_errors=false, auto_detect=true"
|
|
276
275
|
if delimiter is not None:
|
|
277
276
|
select_statement += f", delim='{delimiter}')"
|
|
278
277
|
else:
|
|
279
278
|
select_statement += ")"
|
|
280
279
|
|
|
281
|
-
create_statement = f"CREATE OR REPLACE TABLE
|
|
280
|
+
create_statement = f"CREATE OR REPLACE TABLE {table} AS {select_statement};"
|
|
282
281
|
self.run_query(create_statement)
|
|
283
282
|
|
|
284
|
-
|
|
283
|
+
log_debug(f"Loaded CSV {path} into duckdb as {table}")
|
|
285
284
|
return table, create_statement
|
|
286
285
|
|
|
287
286
|
def load_s3_path_to_table(self, path: str, table: Optional[str] = None) -> Tuple[str, str]:
|
|
@@ -291,22 +290,20 @@ class DuckDbTools(Toolkit):
|
|
|
291
290
|
:param table: Optional table name to use
|
|
292
291
|
:return: Table name, SQL statement used to load the file
|
|
293
292
|
"""
|
|
294
|
-
|
|
295
|
-
|
|
296
|
-
logger.debug(f"Loading {path} into duckdb")
|
|
293
|
+
log_debug(f"Loading {path} into duckdb")
|
|
297
294
|
|
|
298
295
|
if table is None:
|
|
299
|
-
# Get the file name from the
|
|
300
|
-
|
|
301
|
-
# Get the file name without extension from the
|
|
302
|
-
table
|
|
296
|
+
# Get the file name from the path
|
|
297
|
+
path_obj = Path(path)
|
|
298
|
+
# Get the file name without extension from the path
|
|
299
|
+
table = path_obj.stem
|
|
303
300
|
# If the table isn't a valid SQL identifier, we'll need to use something else
|
|
304
301
|
table = table.replace("-", "_").replace(".", "_").replace(" ", "_").replace("/", "_")
|
|
305
302
|
|
|
306
|
-
create_statement = f"CREATE OR REPLACE TABLE
|
|
303
|
+
create_statement = f"CREATE OR REPLACE TABLE {table} AS SELECT * FROM '{path}';"
|
|
307
304
|
self.run_query(create_statement)
|
|
308
305
|
|
|
309
|
-
|
|
306
|
+
log_debug(f"Loaded {path} into duckdb as {table}")
|
|
310
307
|
return table, create_statement
|
|
311
308
|
|
|
312
309
|
def load_s3_csv_to_table(
|
|
@@ -318,28 +315,26 @@ class DuckDbTools(Toolkit):
|
|
|
318
315
|
:param table: Optional table name to use
|
|
319
316
|
:return: Table name, SQL statement used to load the file
|
|
320
317
|
"""
|
|
321
|
-
|
|
322
|
-
|
|
323
|
-
logger.debug(f"Loading {path} into duckdb")
|
|
318
|
+
log_debug(f"Loading {path} into duckdb")
|
|
324
319
|
|
|
325
320
|
if table is None:
|
|
326
|
-
# Get the file name from the
|
|
327
|
-
|
|
328
|
-
# Get the file name without extension from the
|
|
329
|
-
table
|
|
321
|
+
# Get the file name from the path
|
|
322
|
+
path_obj = Path(path)
|
|
323
|
+
# Get the file name without extension from the path
|
|
324
|
+
table = path_obj.stem
|
|
330
325
|
# If the table isn't a valid SQL identifier, we'll need to use something else
|
|
331
326
|
table = table.replace("-", "_").replace(".", "_").replace(" ", "_").replace("/", "_")
|
|
332
327
|
|
|
333
|
-
select_statement = f"SELECT * FROM read_csv('{path}'"
|
|
328
|
+
select_statement = f"SELECT * FROM read_csv('{path}', ignore_errors=false, auto_detect=true"
|
|
334
329
|
if delimiter is not None:
|
|
335
330
|
select_statement += f", delim='{delimiter}')"
|
|
336
331
|
else:
|
|
337
332
|
select_statement += ")"
|
|
338
333
|
|
|
339
|
-
create_statement = f"CREATE OR REPLACE TABLE
|
|
334
|
+
create_statement = f"CREATE OR REPLACE TABLE {table} AS {select_statement};"
|
|
340
335
|
self.run_query(create_statement)
|
|
341
336
|
|
|
342
|
-
|
|
337
|
+
log_debug(f"Loaded CSV {path} into duckdb as {table}")
|
|
343
338
|
return table, create_statement
|
|
344
339
|
|
|
345
340
|
def create_fts_index(self, table: str, unique_key: str, input_values: list[str]) -> str:
|
|
@@ -350,16 +345,16 @@ class DuckDbTools(Toolkit):
|
|
|
350
345
|
:param input_values: Values to index
|
|
351
346
|
:return: None
|
|
352
347
|
"""
|
|
353
|
-
|
|
348
|
+
log_debug(f"Creating FTS index on {table} for {input_values}")
|
|
354
349
|
self.run_query("INSTALL fts;")
|
|
355
|
-
|
|
350
|
+
log_debug("Installed FTS extension")
|
|
356
351
|
self.run_query("LOAD fts;")
|
|
357
|
-
|
|
352
|
+
log_debug("Loaded FTS extension")
|
|
358
353
|
|
|
359
354
|
create_fts_index_statement = f"PRAGMA create_fts_index('{table}', '{unique_key}', '{input_values}');"
|
|
360
|
-
|
|
355
|
+
log_debug(f"Running {create_fts_index_statement}")
|
|
361
356
|
result = self.run_query(create_fts_index_statement)
|
|
362
|
-
|
|
357
|
+
log_debug(f"Created FTS index on {table} for {input_values}")
|
|
363
358
|
|
|
364
359
|
return result
|
|
365
360
|
|
|
@@ -371,14 +366,14 @@ class DuckDbTools(Toolkit):
|
|
|
371
366
|
:param search_text: Text to search
|
|
372
367
|
:return: None
|
|
373
368
|
"""
|
|
374
|
-
|
|
369
|
+
log_debug(f"Running full_text_search for {search_text} in {table}")
|
|
375
370
|
search_text_statement = f"""SELECT fts_main_corpus.match_bm25({unique_key}, '{search_text}') AS score,*
|
|
376
371
|
FROM {table}
|
|
377
372
|
WHERE score IS NOT NULL
|
|
378
373
|
ORDER BY score;"""
|
|
379
374
|
|
|
380
|
-
|
|
375
|
+
log_debug(f"Running {search_text_statement}")
|
|
381
376
|
result = self.run_query(search_text_statement)
|
|
382
|
-
|
|
377
|
+
log_debug(f"Search results for {search_text} in {table}")
|
|
383
378
|
|
|
384
379
|
return result
|
agno/tools/duckduckgo.py
CHANGED
|
@@ -1,88 +1,91 @@
|
|
|
1
1
|
import json
|
|
2
|
-
from typing import Any, Optional
|
|
2
|
+
from typing import Any, List, Optional
|
|
3
3
|
|
|
4
4
|
from agno.tools import Toolkit
|
|
5
|
-
from agno.utils.log import
|
|
5
|
+
from agno.utils.log import log_debug
|
|
6
6
|
|
|
7
7
|
try:
|
|
8
|
-
from
|
|
8
|
+
from ddgs import DDGS
|
|
9
9
|
except ImportError:
|
|
10
|
-
raise ImportError("`
|
|
10
|
+
raise ImportError("`ddgs` not installed. Please install using `pip install ddgs`")
|
|
11
11
|
|
|
12
12
|
|
|
13
13
|
class DuckDuckGoTools(Toolkit):
|
|
14
14
|
"""
|
|
15
|
-
DuckDuckGo is a toolkit for searching DuckDuckGo easily.
|
|
15
|
+
DuckDuckGo is a toolkit for searching using DuckDuckGo easily.
|
|
16
|
+
It uses the meta-search library DDGS, so it also has access to other backends.
|
|
16
17
|
Args:
|
|
17
|
-
|
|
18
|
-
|
|
18
|
+
enable_search (bool): Enable DDGS search function.
|
|
19
|
+
enable_news (bool): Enable DDGS news function.
|
|
20
|
+
modifier (Optional[str]): A modifier to be used in the search request.
|
|
19
21
|
fixed_max_results (Optional[int]): A fixed number of maximum results.
|
|
20
|
-
headers (Optional[Any]): Headers to be used in the search request.
|
|
21
22
|
proxy (Optional[str]): Proxy to be used in the search request.
|
|
22
|
-
proxies (Optional[Any]): A list of proxies to be used in the search request.
|
|
23
23
|
timeout (Optional[int]): The maximum number of seconds to wait for a response.
|
|
24
|
+
backend (Optional[str]): The backend to be used in the search request.
|
|
25
|
+
|
|
24
26
|
"""
|
|
25
27
|
|
|
26
28
|
def __init__(
|
|
27
29
|
self,
|
|
28
|
-
|
|
29
|
-
|
|
30
|
+
enable_search: bool = True,
|
|
31
|
+
enable_news: bool = True,
|
|
32
|
+
all: bool = False,
|
|
33
|
+
backend: str = "duckduckgo",
|
|
30
34
|
modifier: Optional[str] = None,
|
|
31
35
|
fixed_max_results: Optional[int] = None,
|
|
32
|
-
headers: Optional[Any] = None,
|
|
33
36
|
proxy: Optional[str] = None,
|
|
34
|
-
proxies: Optional[Any] = None,
|
|
35
37
|
timeout: Optional[int] = 10,
|
|
36
38
|
verify_ssl: bool = True,
|
|
39
|
+
**kwargs,
|
|
37
40
|
):
|
|
38
|
-
super().__init__(name="duckduckgo")
|
|
39
|
-
|
|
40
|
-
self.headers: Optional[Any] = headers
|
|
41
41
|
self.proxy: Optional[str] = proxy
|
|
42
|
-
self.proxies: Optional[Any] = proxies
|
|
43
42
|
self.timeout: Optional[int] = timeout
|
|
44
43
|
self.fixed_max_results: Optional[int] = fixed_max_results
|
|
45
44
|
self.modifier: Optional[str] = modifier
|
|
46
45
|
self.verify_ssl: bool = verify_ssl
|
|
46
|
+
self.backend: str = backend
|
|
47
47
|
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
48
|
+
tools: List[Any] = []
|
|
49
|
+
if all or enable_search:
|
|
50
|
+
tools.append(self.duckduckgo_search)
|
|
51
|
+
if all or enable_news:
|
|
52
|
+
tools.append(self.duckduckgo_news)
|
|
53
|
+
|
|
54
|
+
super().__init__(name="duckduckgo", tools=tools, **kwargs)
|
|
52
55
|
|
|
53
56
|
def duckduckgo_search(self, query: str, max_results: int = 5) -> str:
|
|
54
|
-
"""Use this function to search
|
|
57
|
+
"""Use this function to search DDGS for a query.
|
|
55
58
|
|
|
56
59
|
Args:
|
|
57
60
|
query(str): The query to search for.
|
|
58
61
|
max_results (optional, default=5): The maximum number of results to return.
|
|
59
62
|
|
|
60
63
|
Returns:
|
|
61
|
-
The result from
|
|
64
|
+
The result from DDGS.
|
|
62
65
|
"""
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
)
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
indent=2,
|
|
72
|
-
)
|
|
66
|
+
actual_max_results = self.fixed_max_results or max_results
|
|
67
|
+
search_query = f"{self.modifier} {query}" if self.modifier else query
|
|
68
|
+
|
|
69
|
+
log_debug(f"Searching DDG for: {search_query} using backend: {self.backend}")
|
|
70
|
+
with DDGS(proxy=self.proxy, timeout=self.timeout, verify=self.verify_ssl) as ddgs:
|
|
71
|
+
results = ddgs.text(query=search_query, max_results=actual_max_results, backend=self.backend)
|
|
72
|
+
|
|
73
|
+
return json.dumps(results, indent=2)
|
|
73
74
|
|
|
74
75
|
def duckduckgo_news(self, query: str, max_results: int = 5) -> str:
|
|
75
|
-
"""Use this function to get the latest news from
|
|
76
|
+
"""Use this function to get the latest news from DDGS.
|
|
76
77
|
|
|
77
78
|
Args:
|
|
78
79
|
query(str): The query to search for.
|
|
79
80
|
max_results (optional, default=5): The maximum number of results to return.
|
|
80
81
|
|
|
81
82
|
Returns:
|
|
82
|
-
The latest news from
|
|
83
|
+
The latest news from DDGS.
|
|
83
84
|
"""
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
)
|
|
88
|
-
|
|
85
|
+
actual_max_results = self.fixed_max_results or max_results
|
|
86
|
+
|
|
87
|
+
log_debug(f"Searching DDG news for: {query} using backend: {self.backend}")
|
|
88
|
+
with DDGS(proxy=self.proxy, timeout=self.timeout, verify=self.verify_ssl) as ddgs:
|
|
89
|
+
results = ddgs.news(query=query, max_results=actual_max_results, backend=self.backend)
|
|
90
|
+
|
|
91
|
+
return json.dumps(results, indent=2)
|