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/crawl4ai.py
CHANGED
|
@@ -1,10 +1,11 @@
|
|
|
1
1
|
import asyncio
|
|
2
|
-
from typing import Optional
|
|
2
|
+
from typing import Any, Dict, List, Optional, Union
|
|
3
3
|
|
|
4
4
|
from agno.tools import Toolkit
|
|
5
|
+
from agno.utils.log import log_debug, log_warning
|
|
5
6
|
|
|
6
7
|
try:
|
|
7
|
-
from crawl4ai import AsyncWebCrawler,
|
|
8
|
+
from crawl4ai import AsyncWebCrawler, BrowserConfig, CrawlerRunConfig
|
|
8
9
|
except ImportError:
|
|
9
10
|
raise ImportError("`crawl4ai` not installed. Please install using `pip install crawl4ai`")
|
|
10
11
|
|
|
@@ -12,51 +13,146 @@ except ImportError:
|
|
|
12
13
|
class Crawl4aiTools(Toolkit):
|
|
13
14
|
def __init__(
|
|
14
15
|
self,
|
|
15
|
-
max_length: Optional[int] =
|
|
16
|
+
max_length: Optional[int] = 5000,
|
|
17
|
+
timeout: int = 60,
|
|
18
|
+
use_pruning: bool = False,
|
|
19
|
+
pruning_threshold: float = 0.48,
|
|
20
|
+
bm25_threshold: float = 1.0,
|
|
21
|
+
headless: bool = True,
|
|
22
|
+
wait_until: str = "domcontentloaded",
|
|
23
|
+
enable_crawl: bool = True,
|
|
24
|
+
all: bool = False,
|
|
25
|
+
**kwargs,
|
|
16
26
|
):
|
|
17
|
-
|
|
27
|
+
tools = []
|
|
28
|
+
if all or enable_crawl:
|
|
29
|
+
tools.append(self.crawl)
|
|
18
30
|
|
|
31
|
+
super().__init__(name="crawl4ai_tools", tools=tools, **kwargs)
|
|
19
32
|
self.max_length = max_length
|
|
20
|
-
|
|
21
|
-
self.
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
33
|
+
self.timeout = timeout
|
|
34
|
+
self.use_pruning = use_pruning
|
|
35
|
+
self.pruning_threshold = pruning_threshold
|
|
36
|
+
self.bm25_threshold = bm25_threshold
|
|
37
|
+
self.wait_until = wait_until
|
|
38
|
+
self.headless = headless
|
|
39
|
+
|
|
40
|
+
def _build_config(self, search_query: Optional[str] = None) -> Dict[str, Any]:
|
|
41
|
+
"""Build CrawlerRunConfig parameters from toolkit settings."""
|
|
42
|
+
config_params = {
|
|
43
|
+
"page_timeout": self.timeout * 1000, # Convert to milliseconds
|
|
44
|
+
"wait_until": self.wait_until,
|
|
45
|
+
"cache_mode": "bypass", # Don't use cache for fresh results
|
|
46
|
+
"verbose": False,
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
# Handle content filtering
|
|
50
|
+
if self.use_pruning or search_query:
|
|
51
|
+
try:
|
|
52
|
+
from crawl4ai.content_filter_strategy import BM25ContentFilter, PruningContentFilter
|
|
53
|
+
from crawl4ai.markdown_generation_strategy import DefaultMarkdownGenerator
|
|
54
|
+
|
|
55
|
+
if search_query:
|
|
56
|
+
# Use BM25 for query-specific extraction
|
|
57
|
+
content_filter = BM25ContentFilter(user_query=search_query, bm25_threshold=self.bm25_threshold)
|
|
58
|
+
log_debug(f"Using BM25ContentFilter for query: {search_query}")
|
|
59
|
+
else:
|
|
60
|
+
# Use pruning for general cleanup
|
|
61
|
+
content_filter = PruningContentFilter(
|
|
62
|
+
threshold=self.pruning_threshold, threshold_type="fixed", min_word_threshold=2
|
|
63
|
+
)
|
|
64
|
+
log_debug("Using PruningContentFilter for general cleanup")
|
|
65
|
+
|
|
66
|
+
config_params["markdown_generator"] = DefaultMarkdownGenerator(content_filter=content_filter)
|
|
67
|
+
log_debug("Using DefaultMarkdownGenerator with content_filter")
|
|
68
|
+
except ImportError:
|
|
69
|
+
# If advanced features not available, continue without them
|
|
70
|
+
log_warning("crawl4ai.content_filter_strategy or crawl4ai.markdown_generation_strategy not installed")
|
|
71
|
+
pass
|
|
72
|
+
|
|
73
|
+
return config_params
|
|
74
|
+
|
|
75
|
+
def crawl(self, url: Union[str, List[str]], search_query: Optional[str] = None) -> Union[str, Dict[str, str]]:
|
|
39
76
|
"""
|
|
40
|
-
|
|
77
|
+
Crawl URLs and extract their text content.
|
|
41
78
|
|
|
42
|
-
:
|
|
79
|
+
Args:
|
|
80
|
+
url: Single URL string or list of URLs to crawl
|
|
81
|
+
search_query: Optional query string to filter content using BM25 algorithm
|
|
43
82
|
|
|
44
|
-
:
|
|
83
|
+
Returns:
|
|
84
|
+
The extracted text content from the URL(s)
|
|
45
85
|
"""
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
86
|
+
if not url:
|
|
87
|
+
return "Error: No URL provided"
|
|
88
|
+
|
|
89
|
+
# Handle single URL
|
|
90
|
+
if isinstance(url, str):
|
|
91
|
+
return asyncio.run(self._async_crawl(url, search_query))
|
|
92
|
+
|
|
93
|
+
# Handle multiple URLs
|
|
94
|
+
results = {}
|
|
95
|
+
for single_url in url:
|
|
96
|
+
results[single_url] = asyncio.run(self._async_crawl(single_url, search_query))
|
|
97
|
+
return results
|
|
98
|
+
|
|
99
|
+
async def _async_crawl(self, url: str, search_query: Optional[str] = None) -> str:
|
|
100
|
+
"""Crawl a single URL and extract content."""
|
|
101
|
+
try:
|
|
102
|
+
# Use BrowserConfig to suppress crawl4ai logs
|
|
103
|
+
browser_config = BrowserConfig(
|
|
104
|
+
headless=self.headless,
|
|
105
|
+
verbose=False,
|
|
106
|
+
)
|
|
107
|
+
|
|
108
|
+
async with AsyncWebCrawler(config=browser_config) as crawler:
|
|
109
|
+
# Build configuration from parameters
|
|
110
|
+
config_params = self._build_config(search_query)
|
|
111
|
+
|
|
112
|
+
config = CrawlerRunConfig(**config_params)
|
|
113
|
+
log_debug(f"Crawling {url} with config: {config}")
|
|
114
|
+
result = await crawler.arun(url=url, config=config)
|
|
115
|
+
|
|
116
|
+
# Process the result
|
|
117
|
+
if not result:
|
|
118
|
+
return "Error: No content found"
|
|
119
|
+
|
|
120
|
+
log_debug(f"Result attributes: {dir(result)}")
|
|
121
|
+
log_debug(f"Result success: {getattr(result, 'success', 'N/A')}")
|
|
122
|
+
|
|
123
|
+
# Try to get markdown content
|
|
124
|
+
content = ""
|
|
125
|
+
if hasattr(result, "fit_markdown") and result.fit_markdown:
|
|
126
|
+
content = result.fit_markdown
|
|
127
|
+
log_debug("Using fit_markdown")
|
|
128
|
+
elif hasattr(result, "markdown") and result.markdown:
|
|
129
|
+
if hasattr(result.markdown, "raw_markdown"):
|
|
130
|
+
content = result.markdown.raw_markdown
|
|
131
|
+
log_debug("Using markdown.raw_markdown")
|
|
132
|
+
else:
|
|
133
|
+
content = str(result.markdown)
|
|
134
|
+
log_debug("Using str(markdown)")
|
|
135
|
+
else:
|
|
136
|
+
# Try to get any text content
|
|
137
|
+
if hasattr(result, "text"):
|
|
138
|
+
content = result.text
|
|
139
|
+
log_debug("Using text attribute")
|
|
140
|
+
elif hasattr(result, "html"):
|
|
141
|
+
log_warning("Only HTML available, no markdown extracted")
|
|
142
|
+
return "Error: Could not extract markdown from page"
|
|
143
|
+
|
|
144
|
+
if not content:
|
|
145
|
+
log_warning(f"No content extracted. Result type: {type(result)}")
|
|
146
|
+
return "Error: No readable content extracted"
|
|
147
|
+
|
|
148
|
+
log_debug(f"Extracted content length: {len(content)}")
|
|
149
|
+
|
|
150
|
+
# Truncate if needed
|
|
151
|
+
if self.max_length and len(content) > self.max_length:
|
|
152
|
+
content = content[: self.max_length] + "..."
|
|
153
|
+
|
|
154
|
+
return content
|
|
155
|
+
|
|
156
|
+
except Exception as e:
|
|
157
|
+
log_warning(f"Exception during crawl: {str(e)}")
|
|
158
|
+
return f"Error crawling {url}: {str(e)}"
|
agno/tools/csv_toolkit.py
CHANGED
|
@@ -4,7 +4,7 @@ from pathlib import Path
|
|
|
4
4
|
from typing import Any, Dict, List, Optional, Union
|
|
5
5
|
|
|
6
6
|
from agno.tools import Toolkit
|
|
7
|
-
from agno.utils.log import logger
|
|
7
|
+
from agno.utils.log import log_debug, log_info, logger
|
|
8
8
|
|
|
9
9
|
|
|
10
10
|
class CsvTools(Toolkit):
|
|
@@ -12,15 +12,15 @@ class CsvTools(Toolkit):
|
|
|
12
12
|
self,
|
|
13
13
|
csvs: Optional[List[Union[str, Path]]] = None,
|
|
14
14
|
row_limit: Optional[int] = None,
|
|
15
|
-
read_csvs: bool = True,
|
|
16
|
-
list_csvs: bool = True,
|
|
17
|
-
query_csvs: bool = True,
|
|
18
|
-
read_column_names: bool = True,
|
|
19
15
|
duckdb_connection: Optional[Any] = None,
|
|
20
16
|
duckdb_kwargs: Optional[Dict[str, Any]] = None,
|
|
17
|
+
enable_read_csv_file: bool = True,
|
|
18
|
+
enable_list_csv_files: bool = True,
|
|
19
|
+
enable_get_columns: bool = True,
|
|
20
|
+
enable_query_csv_file: bool = True,
|
|
21
|
+
all: bool = False,
|
|
22
|
+
**kwargs,
|
|
21
23
|
):
|
|
22
|
-
super().__init__(name="csv_tools")
|
|
23
|
-
|
|
24
24
|
self.csvs: List[Path] = []
|
|
25
25
|
if csvs:
|
|
26
26
|
for _csv in csvs:
|
|
@@ -34,18 +34,22 @@ class CsvTools(Toolkit):
|
|
|
34
34
|
self.duckdb_connection: Optional[Any] = duckdb_connection
|
|
35
35
|
self.duckdb_kwargs: Optional[Dict[str, Any]] = duckdb_kwargs
|
|
36
36
|
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
37
|
+
tools: List[Any] = []
|
|
38
|
+
if all or enable_read_csv_file:
|
|
39
|
+
tools.append(self.read_csv_file)
|
|
40
|
+
if all or enable_list_csv_files:
|
|
41
|
+
tools.append(self.list_csv_files)
|
|
42
|
+
if all or enable_get_columns:
|
|
43
|
+
tools.append(self.get_columns)
|
|
44
|
+
if all or enable_query_csv_file:
|
|
44
45
|
try:
|
|
45
46
|
import duckdb # noqa: F401
|
|
47
|
+
|
|
48
|
+
tools.append(self.query_csv_file)
|
|
46
49
|
except ImportError:
|
|
47
|
-
|
|
48
|
-
|
|
50
|
+
logger.warning("`duckdb` not installed. Query functionality disabled.")
|
|
51
|
+
|
|
52
|
+
super().__init__(name="csv_tools", tools=tools, **kwargs)
|
|
49
53
|
|
|
50
54
|
def list_csv_files(self) -> str:
|
|
51
55
|
"""Returns a list of available csv files
|
|
@@ -69,7 +73,7 @@ class CsvTools(Toolkit):
|
|
|
69
73
|
if csv_name not in [_csv.stem for _csv in self.csvs]:
|
|
70
74
|
return f"File: {csv_name} not found, please use one of {self.list_csv_files()}"
|
|
71
75
|
|
|
72
|
-
|
|
76
|
+
log_info(f"Reading file: {csv_name}")
|
|
73
77
|
file_path = [_csv for _csv in self.csvs if _csv.stem == csv_name][0]
|
|
74
78
|
|
|
75
79
|
# Read the csv file
|
|
@@ -99,7 +103,7 @@ class CsvTools(Toolkit):
|
|
|
99
103
|
if csv_name not in [_csv.stem for _csv in self.csvs]:
|
|
100
104
|
return f"File: {csv_name} not found, please use one of {self.list_csv_files()}"
|
|
101
105
|
|
|
102
|
-
|
|
106
|
+
log_info(f"Reading columns from file: {csv_name}")
|
|
103
107
|
file_path = [_csv for _csv in self.csvs if _csv.stem == csv_name][0]
|
|
104
108
|
|
|
105
109
|
# Get the columns of the csv file
|
|
@@ -134,7 +138,7 @@ class CsvTools(Toolkit):
|
|
|
134
138
|
return f"File: {csv_name} not found, please use one of {self.list_csv_files()}"
|
|
135
139
|
|
|
136
140
|
# Load the csv file into duckdb
|
|
137
|
-
|
|
141
|
+
log_info(f"Loading csv file: {csv_name}")
|
|
138
142
|
file_path = [_csv for _csv in self.csvs if _csv.stem == csv_name][0]
|
|
139
143
|
|
|
140
144
|
# Create duckdb connection
|
|
@@ -146,7 +150,9 @@ class CsvTools(Toolkit):
|
|
|
146
150
|
return "Error connecting to DuckDB, please check the connection."
|
|
147
151
|
|
|
148
152
|
# Create a table from the csv file
|
|
149
|
-
con.execute(
|
|
153
|
+
con.execute(
|
|
154
|
+
f"CREATE TABLE {csv_name} AS SELECT * FROM read_csv('{file_path}', ignore_errors=false, auto_detect=true)"
|
|
155
|
+
)
|
|
150
156
|
|
|
151
157
|
# -*- Format the SQL Query
|
|
152
158
|
# Remove backticks
|
|
@@ -154,7 +160,7 @@ class CsvTools(Toolkit):
|
|
|
154
160
|
# If there are multiple statements, only run the first one
|
|
155
161
|
formatted_sql = formatted_sql.split(";")[0]
|
|
156
162
|
# -*- Run the SQL Query
|
|
157
|
-
|
|
163
|
+
log_info(f"Running query: {formatted_sql}")
|
|
158
164
|
query_result = con.sql(formatted_sql)
|
|
159
165
|
result_output = "No output"
|
|
160
166
|
if query_result is not None:
|
|
@@ -172,7 +178,7 @@ class CsvTools(Toolkit):
|
|
|
172
178
|
except AttributeError:
|
|
173
179
|
result_output = str(query_result)
|
|
174
180
|
|
|
175
|
-
|
|
181
|
+
log_debug(f"Query result: {result_output}")
|
|
176
182
|
return result_output
|
|
177
183
|
except Exception as e:
|
|
178
184
|
logger.error(f"Error querying csv: {e}")
|
agno/tools/dalle.py
CHANGED
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
from os import getenv
|
|
2
|
-
from typing import Literal, Optional
|
|
2
|
+
from typing import Any, List, Literal, Optional
|
|
3
3
|
from uuid import uuid4
|
|
4
4
|
|
|
5
|
-
from agno.
|
|
6
|
-
from agno.media import ImageArtifact
|
|
5
|
+
from agno.media import Image
|
|
7
6
|
from agno.tools import Toolkit
|
|
8
|
-
from agno.
|
|
7
|
+
from agno.tools.function import ToolResult
|
|
8
|
+
from agno.utils.log import log_debug, logger
|
|
9
9
|
|
|
10
10
|
try:
|
|
11
11
|
from openai import OpenAI
|
|
@@ -23,9 +23,10 @@ class DalleTools(Toolkit):
|
|
|
23
23
|
quality: Literal["standard", "hd"] = "standard",
|
|
24
24
|
style: Literal["vivid", "natural"] = "vivid",
|
|
25
25
|
api_key: Optional[str] = None,
|
|
26
|
+
enable_create_image: bool = True,
|
|
27
|
+
all: bool = False,
|
|
28
|
+
**kwargs,
|
|
26
29
|
):
|
|
27
|
-
super().__init__(name="dalle")
|
|
28
|
-
|
|
29
30
|
self.model = model
|
|
30
31
|
self.n = n
|
|
31
32
|
self.size = size
|
|
@@ -50,27 +51,32 @@ class DalleTools(Toolkit):
|
|
|
50
51
|
if not self.api_key:
|
|
51
52
|
logger.error("OPENAI_API_KEY not set. Please set the OPENAI_API_KEY environment variable.")
|
|
52
53
|
|
|
53
|
-
|
|
54
|
+
tools: List[Any] = []
|
|
55
|
+
if all or enable_create_image:
|
|
56
|
+
tools.append(self.create_image)
|
|
57
|
+
|
|
58
|
+
super().__init__(name="dalle", tools=tools, **kwargs)
|
|
59
|
+
|
|
54
60
|
# TODO:
|
|
55
61
|
# - Add support for response_format
|
|
56
62
|
# - Add support for saving images
|
|
57
63
|
# - Add support for editing images
|
|
58
64
|
|
|
59
|
-
def create_image(self,
|
|
65
|
+
def create_image(self, prompt: str) -> ToolResult:
|
|
60
66
|
"""Use this function to generate an image for a prompt.
|
|
61
67
|
|
|
62
68
|
Args:
|
|
63
69
|
prompt (str): A text description of the desired image.
|
|
64
70
|
|
|
65
71
|
Returns:
|
|
66
|
-
|
|
72
|
+
ToolResult: Result containing the message and generated images.
|
|
67
73
|
"""
|
|
68
74
|
if not self.api_key:
|
|
69
|
-
return "Please set the OPENAI_API_KEY"
|
|
75
|
+
return ToolResult(content="Please set the OPENAI_API_KEY")
|
|
70
76
|
|
|
71
77
|
try:
|
|
72
78
|
client = OpenAI(api_key=self.api_key)
|
|
73
|
-
|
|
79
|
+
log_debug(f"Generating image using prompt: {prompt}")
|
|
74
80
|
response: ImagesResponse = client.images.generate(
|
|
75
81
|
prompt=prompt,
|
|
76
82
|
model=self.model,
|
|
@@ -79,18 +85,26 @@ class DalleTools(Toolkit):
|
|
|
79
85
|
size=self.size,
|
|
80
86
|
style=self.style,
|
|
81
87
|
)
|
|
82
|
-
|
|
88
|
+
log_debug("Image generated successfully")
|
|
83
89
|
|
|
84
|
-
|
|
90
|
+
generated_images = []
|
|
85
91
|
response_str = ""
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
92
|
+
if response.data:
|
|
93
|
+
for img in response.data:
|
|
94
|
+
if img.url:
|
|
95
|
+
image = Image(
|
|
96
|
+
id=str(uuid4()),
|
|
97
|
+
url=img.url,
|
|
98
|
+
original_prompt=prompt,
|
|
99
|
+
revised_prompt=img.revised_prompt,
|
|
100
|
+
)
|
|
101
|
+
generated_images.append(image)
|
|
102
|
+
response_str += f"Image has been generated at the URL {img.url}\n"
|
|
103
|
+
|
|
104
|
+
return ToolResult(
|
|
105
|
+
content=response_str or "No images were generated",
|
|
106
|
+
images=generated_images if generated_images else None,
|
|
107
|
+
)
|
|
94
108
|
except Exception as e:
|
|
95
109
|
logger.error(f"Failed to generate image: {e}")
|
|
96
|
-
return f"Error: {e}"
|
|
110
|
+
return ToolResult(content=f"Error: {e}")
|