agno 1.8.0__py3-none-any.whl → 2.0.0a1__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 +19 -27
- agno/agent/agent.py +2781 -4126
- agno/api/agent.py +9 -65
- agno/api/api.py +5 -46
- agno/api/evals.py +6 -17
- agno/api/os.py +17 -0
- agno/api/routes.py +6 -41
- agno/api/schemas/__init__.py +9 -0
- agno/api/schemas/agent.py +5 -21
- agno/api/schemas/evals.py +7 -16
- agno/api/schemas/os.py +14 -0
- agno/api/schemas/team.py +5 -21
- agno/api/schemas/utils.py +21 -0
- agno/api/schemas/workflows.py +11 -7
- agno/api/settings.py +53 -0
- agno/api/team.py +9 -64
- agno/api/workflow.py +28 -0
- agno/cloud/aws/base.py +214 -0
- agno/cloud/aws/s3/__init__.py +2 -0
- agno/cloud/aws/s3/api_client.py +43 -0
- agno/cloud/aws/s3/bucket.py +195 -0
- agno/cloud/aws/s3/object.py +57 -0
- agno/db/__init__.py +24 -0
- agno/db/base.py +245 -0
- agno/db/dynamo/__init__.py +3 -0
- agno/db/dynamo/dynamo.py +1749 -0
- agno/db/dynamo/schemas.py +278 -0
- agno/db/dynamo/utils.py +684 -0
- agno/db/firestore/__init__.py +3 -0
- agno/db/firestore/firestore.py +1438 -0
- agno/db/firestore/schemas.py +130 -0
- agno/db/firestore/utils.py +278 -0
- agno/db/gcs_json/__init__.py +3 -0
- agno/db/gcs_json/gcs_json_db.py +1001 -0
- agno/db/gcs_json/utils.py +194 -0
- agno/db/in_memory/__init__.py +3 -0
- agno/db/in_memory/in_memory_db.py +888 -0
- agno/db/in_memory/utils.py +172 -0
- agno/db/json/__init__.py +3 -0
- agno/db/json/json_db.py +1051 -0
- agno/db/json/utils.py +196 -0
- agno/db/migrations/v1_to_v2.py +162 -0
- agno/db/mongo/__init__.py +3 -0
- agno/db/mongo/mongo.py +1417 -0
- agno/db/mongo/schemas.py +77 -0
- agno/db/mongo/utils.py +204 -0
- agno/db/mysql/__init__.py +3 -0
- agno/db/mysql/mysql.py +1719 -0
- agno/db/mysql/schemas.py +124 -0
- agno/db/mysql/utils.py +298 -0
- agno/db/postgres/__init__.py +3 -0
- agno/db/postgres/postgres.py +1720 -0
- agno/db/postgres/schemas.py +124 -0
- agno/db/postgres/utils.py +281 -0
- agno/db/redis/__init__.py +3 -0
- agno/db/redis/redis.py +1371 -0
- agno/db/redis/schemas.py +109 -0
- agno/db/redis/utils.py +288 -0
- agno/db/schemas/__init__.py +3 -0
- agno/db/schemas/evals.py +33 -0
- agno/db/schemas/knowledge.py +40 -0
- agno/db/schemas/memory.py +46 -0
- agno/db/singlestore/__init__.py +3 -0
- agno/db/singlestore/schemas.py +116 -0
- agno/db/singlestore/singlestore.py +1722 -0
- agno/db/singlestore/utils.py +327 -0
- agno/db/sqlite/__init__.py +3 -0
- agno/db/sqlite/schemas.py +119 -0
- agno/db/sqlite/sqlite.py +1680 -0
- agno/db/sqlite/utils.py +269 -0
- agno/db/utils.py +88 -0
- agno/eval/__init__.py +14 -0
- agno/eval/accuracy.py +142 -43
- agno/eval/performance.py +88 -23
- agno/eval/reliability.py +73 -20
- agno/eval/utils.py +23 -13
- agno/integrations/discord/__init__.py +3 -0
- agno/{app → integrations}/discord/client.py +10 -10
- agno/knowledge/__init__.py +2 -2
- agno/{document → knowledge}/chunking/agentic.py +2 -2
- agno/{document → knowledge}/chunking/document.py +2 -2
- agno/{document → knowledge}/chunking/fixed.py +3 -3
- agno/{document → knowledge}/chunking/markdown.py +2 -2
- agno/{document → knowledge}/chunking/recursive.py +2 -2
- agno/{document → knowledge}/chunking/row.py +2 -2
- agno/knowledge/chunking/semantic.py +59 -0
- agno/knowledge/chunking/strategy.py +121 -0
- agno/knowledge/content.py +74 -0
- agno/knowledge/document/__init__.py +5 -0
- agno/{document → knowledge/document}/base.py +12 -2
- agno/knowledge/embedder/__init__.py +5 -0
- agno/{embedder → knowledge/embedder}/aws_bedrock.py +127 -1
- agno/{embedder → knowledge/embedder}/azure_openai.py +65 -1
- agno/{embedder → knowledge/embedder}/base.py +6 -0
- agno/{embedder → knowledge/embedder}/cohere.py +72 -1
- agno/{embedder → knowledge/embedder}/fastembed.py +17 -1
- agno/{embedder → knowledge/embedder}/fireworks.py +1 -1
- agno/{embedder → knowledge/embedder}/google.py +74 -1
- agno/{embedder → knowledge/embedder}/huggingface.py +36 -2
- agno/{embedder → knowledge/embedder}/jina.py +48 -2
- agno/knowledge/embedder/langdb.py +22 -0
- agno/knowledge/embedder/mistral.py +139 -0
- agno/{embedder → knowledge/embedder}/nebius.py +1 -1
- agno/{embedder → knowledge/embedder}/ollama.py +54 -3
- agno/knowledge/embedder/openai.py +223 -0
- agno/{embedder → knowledge/embedder}/sentence_transformer.py +16 -1
- agno/{embedder → knowledge/embedder}/together.py +1 -1
- agno/{embedder → knowledge/embedder}/voyageai.py +49 -1
- agno/knowledge/knowledge.py +1515 -0
- agno/knowledge/reader/__init__.py +7 -0
- agno/{document → knowledge}/reader/arxiv_reader.py +32 -4
- agno/knowledge/reader/base.py +88 -0
- agno/{document → knowledge}/reader/csv_reader.py +68 -15
- agno/knowledge/reader/docx_reader.py +83 -0
- agno/{document → knowledge}/reader/firecrawl_reader.py +42 -21
- agno/knowledge/reader/gcs_reader.py +67 -0
- agno/{document → knowledge}/reader/json_reader.py +30 -9
- agno/{document → knowledge}/reader/markdown_reader.py +36 -9
- agno/{document → knowledge}/reader/pdf_reader.py +79 -21
- agno/knowledge/reader/reader_factory.py +275 -0
- agno/knowledge/reader/s3_reader.py +171 -0
- agno/{document → knowledge}/reader/text_reader.py +31 -10
- agno/knowledge/reader/url_reader.py +84 -0
- agno/knowledge/reader/web_search_reader.py +389 -0
- agno/{document → knowledge}/reader/website_reader.py +37 -10
- agno/knowledge/reader/wikipedia_reader.py +59 -0
- agno/knowledge/reader/youtube_reader.py +78 -0
- agno/knowledge/remote_content/remote_content.py +88 -0
- agno/{reranker → knowledge/reranker}/base.py +1 -1
- agno/{reranker → knowledge/reranker}/cohere.py +2 -2
- agno/{reranker → knowledge/reranker}/infinity.py +2 -2
- agno/{reranker → knowledge/reranker}/sentence_transformer.py +2 -2
- agno/knowledge/types.py +30 -0
- agno/knowledge/utils.py +169 -0
- agno/media.py +2 -2
- agno/memory/__init__.py +2 -10
- agno/memory/manager.py +1003 -148
- agno/models/aimlapi/__init__.py +2 -2
- agno/models/aimlapi/aimlapi.py +6 -6
- agno/models/anthropic/claude.py +129 -82
- agno/models/aws/bedrock.py +107 -175
- agno/models/aws/claude.py +64 -18
- agno/models/azure/ai_foundry.py +73 -23
- agno/models/base.py +347 -287
- agno/models/cerebras/cerebras.py +84 -27
- agno/models/cohere/chat.py +106 -98
- agno/models/dashscope/dashscope.py +14 -5
- agno/models/google/gemini.py +123 -53
- agno/models/groq/groq.py +97 -35
- agno/models/huggingface/huggingface.py +92 -27
- agno/models/ibm/watsonx.py +72 -13
- agno/models/litellm/chat.py +85 -13
- agno/models/message.py +38 -144
- agno/models/meta/llama.py +85 -49
- agno/models/metrics.py +120 -0
- agno/models/mistral/mistral.py +90 -21
- agno/models/ollama/__init__.py +0 -2
- agno/models/ollama/chat.py +84 -46
- agno/models/openai/chat.py +135 -27
- agno/models/openai/responses.py +233 -115
- agno/models/perplexity/perplexity.py +26 -2
- agno/models/portkey/portkey.py +0 -7
- agno/models/response.py +14 -8
- agno/models/utils.py +20 -0
- agno/models/vercel/__init__.py +2 -2
- agno/models/vercel/v0.py +1 -1
- agno/models/vllm/__init__.py +2 -2
- agno/models/vllm/vllm.py +3 -3
- agno/models/xai/xai.py +10 -10
- agno/os/__init__.py +3 -0
- agno/os/app.py +393 -0
- agno/os/auth.py +47 -0
- agno/os/config.py +103 -0
- agno/os/interfaces/agui/__init__.py +3 -0
- agno/os/interfaces/agui/agui.py +31 -0
- agno/{app/agui/async_router.py → os/interfaces/agui/router.py} +16 -16
- agno/{app → os/interfaces}/agui/utils.py +65 -28
- agno/os/interfaces/base.py +21 -0
- agno/os/interfaces/slack/__init__.py +3 -0
- agno/{app/slack/async_router.py → os/interfaces/slack/router.py} +3 -5
- agno/os/interfaces/slack/slack.py +33 -0
- agno/os/interfaces/whatsapp/__init__.py +3 -0
- agno/{app/whatsapp/async_router.py → os/interfaces/whatsapp/router.py} +4 -7
- agno/os/interfaces/whatsapp/whatsapp.py +30 -0
- agno/os/router.py +843 -0
- agno/os/routers/__init__.py +3 -0
- agno/os/routers/evals/__init__.py +3 -0
- agno/os/routers/evals/evals.py +204 -0
- agno/os/routers/evals/schemas.py +142 -0
- agno/os/routers/evals/utils.py +161 -0
- agno/os/routers/knowledge/__init__.py +3 -0
- agno/os/routers/knowledge/knowledge.py +413 -0
- agno/os/routers/knowledge/schemas.py +118 -0
- agno/os/routers/memory/__init__.py +3 -0
- agno/os/routers/memory/memory.py +179 -0
- agno/os/routers/memory/schemas.py +58 -0
- agno/os/routers/metrics/__init__.py +3 -0
- agno/os/routers/metrics/metrics.py +58 -0
- agno/os/routers/metrics/schemas.py +47 -0
- agno/os/routers/session/__init__.py +3 -0
- agno/os/routers/session/session.py +163 -0
- agno/os/schema.py +892 -0
- agno/{app/playground → os}/settings.py +8 -15
- agno/os/utils.py +270 -0
- agno/reasoning/azure_ai_foundry.py +4 -4
- agno/reasoning/deepseek.py +4 -4
- agno/reasoning/default.py +6 -11
- agno/reasoning/groq.py +4 -4
- agno/reasoning/helpers.py +4 -6
- agno/reasoning/ollama.py +4 -4
- agno/reasoning/openai.py +4 -4
- agno/run/{response.py → agent.py} +144 -72
- agno/run/base.py +44 -58
- agno/run/cancel.py +83 -0
- agno/run/team.py +133 -77
- agno/run/workflow.py +537 -12
- agno/session/__init__.py +10 -0
- agno/session/agent.py +244 -0
- agno/session/summary.py +225 -0
- agno/session/team.py +262 -0
- agno/{storage/session/v2 → session}/workflow.py +47 -24
- agno/team/__init__.py +15 -16
- agno/team/team.py +2967 -4243
- agno/tools/agentql.py +14 -5
- agno/tools/airflow.py +9 -4
- agno/tools/api.py +7 -3
- agno/tools/apify.py +2 -46
- agno/tools/arxiv.py +8 -3
- agno/tools/aws_lambda.py +7 -5
- agno/tools/aws_ses.py +7 -1
- agno/tools/baidusearch.py +4 -1
- agno/tools/bitbucket.py +4 -4
- agno/tools/brandfetch.py +14 -11
- agno/tools/bravesearch.py +4 -1
- agno/tools/brightdata.py +42 -22
- agno/tools/browserbase.py +13 -4
- agno/tools/calcom.py +12 -10
- agno/tools/calculator.py +10 -27
- agno/tools/cartesia.py +18 -13
- agno/tools/{clickup_tool.py → clickup.py} +12 -25
- agno/tools/confluence.py +71 -18
- agno/tools/crawl4ai.py +7 -1
- agno/tools/csv_toolkit.py +9 -8
- agno/tools/dalle.py +18 -11
- agno/tools/daytona.py +13 -16
- agno/tools/decorator.py +6 -3
- agno/tools/desi_vocal.py +16 -7
- agno/tools/discord.py +11 -8
- agno/tools/docker.py +30 -42
- agno/tools/duckdb.py +34 -53
- agno/tools/duckduckgo.py +8 -7
- agno/tools/e2b.py +62 -62
- agno/tools/eleven_labs.py +35 -28
- agno/tools/email.py +4 -1
- agno/tools/evm.py +7 -1
- agno/tools/exa.py +19 -14
- agno/tools/fal.py +29 -29
- agno/tools/file.py +9 -8
- agno/tools/financial_datasets.py +25 -44
- agno/tools/firecrawl.py +22 -22
- agno/tools/function.py +68 -17
- agno/tools/giphy.py +22 -10
- agno/tools/github.py +48 -126
- agno/tools/gmail.py +46 -62
- agno/tools/google_bigquery.py +7 -6
- agno/tools/google_maps.py +11 -26
- agno/tools/googlesearch.py +7 -2
- agno/tools/googlesheets.py +21 -17
- agno/tools/hackernews.py +9 -5
- agno/tools/jina.py +5 -4
- agno/tools/jira.py +18 -9
- agno/tools/knowledge.py +31 -32
- agno/tools/linear.py +18 -33
- agno/tools/linkup.py +5 -1
- agno/tools/local_file_system.py +8 -5
- agno/tools/lumalab.py +31 -19
- agno/tools/mem0.py +18 -12
- agno/tools/memori.py +14 -10
- agno/tools/mlx_transcribe.py +3 -2
- agno/tools/models/azure_openai.py +32 -14
- agno/tools/models/gemini.py +58 -31
- agno/tools/models/groq.py +29 -20
- agno/tools/models/nebius.py +27 -11
- agno/tools/models_labs.py +39 -15
- agno/tools/moviepy_video.py +7 -6
- agno/tools/neo4j.py +134 -0
- agno/tools/newspaper.py +7 -2
- agno/tools/newspaper4k.py +8 -3
- agno/tools/openai.py +57 -26
- agno/tools/openbb.py +12 -11
- agno/tools/opencv.py +62 -46
- agno/tools/openweather.py +14 -12
- agno/tools/pandas.py +11 -3
- agno/tools/postgres.py +4 -12
- agno/tools/pubmed.py +4 -1
- agno/tools/python.py +9 -22
- agno/tools/reasoning.py +35 -27
- agno/tools/reddit.py +11 -26
- agno/tools/replicate.py +54 -41
- agno/tools/resend.py +4 -1
- agno/tools/scrapegraph.py +15 -14
- agno/tools/searxng.py +10 -23
- agno/tools/serpapi.py +6 -3
- agno/tools/serper.py +13 -4
- agno/tools/shell.py +9 -2
- agno/tools/slack.py +12 -11
- agno/tools/sleep.py +3 -2
- agno/tools/spider.py +24 -4
- agno/tools/sql.py +7 -6
- agno/tools/tavily.py +6 -4
- agno/tools/telegram.py +12 -4
- agno/tools/todoist.py +11 -31
- agno/tools/toolkit.py +1 -1
- agno/tools/trafilatura.py +22 -6
- agno/tools/trello.py +9 -22
- agno/tools/twilio.py +10 -3
- agno/tools/user_control_flow.py +6 -1
- agno/tools/valyu.py +34 -5
- agno/tools/visualization.py +19 -28
- agno/tools/webbrowser.py +4 -3
- agno/tools/webex.py +11 -7
- agno/tools/website.py +15 -46
- agno/tools/webtools.py +12 -4
- agno/tools/whatsapp.py +5 -9
- agno/tools/wikipedia.py +20 -13
- agno/tools/x.py +14 -13
- agno/tools/yfinance.py +13 -40
- agno/tools/youtube.py +26 -20
- agno/tools/zendesk.py +7 -2
- agno/tools/zep.py +10 -7
- agno/tools/zoom.py +10 -9
- agno/utils/common.py +1 -19
- agno/utils/events.py +95 -118
- agno/utils/knowledge.py +29 -0
- agno/utils/location.py +2 -2
- agno/utils/log.py +2 -2
- agno/utils/mcp.py +11 -5
- agno/utils/media.py +39 -0
- agno/utils/message.py +12 -1
- agno/utils/models/claude.py +6 -4
- agno/utils/models/mistral.py +8 -7
- agno/utils/models/schema_utils.py +3 -3
- agno/utils/pprint.py +33 -32
- agno/utils/print_response/agent.py +779 -0
- agno/utils/print_response/team.py +1565 -0
- agno/utils/print_response/workflow.py +1451 -0
- agno/utils/prompts.py +14 -14
- agno/utils/reasoning.py +87 -0
- agno/utils/response.py +42 -42
- agno/utils/string.py +8 -22
- agno/utils/team.py +50 -0
- agno/utils/timer.py +2 -2
- agno/vectordb/base.py +33 -21
- agno/vectordb/cassandra/cassandra.py +287 -23
- agno/vectordb/chroma/chromadb.py +482 -59
- agno/vectordb/clickhouse/clickhousedb.py +270 -63
- agno/vectordb/couchbase/couchbase.py +309 -29
- agno/vectordb/lancedb/lance_db.py +360 -21
- agno/vectordb/langchaindb/__init__.py +5 -0
- agno/vectordb/langchaindb/langchaindb.py +145 -0
- agno/vectordb/lightrag/__init__.py +5 -0
- agno/vectordb/lightrag/lightrag.py +374 -0
- agno/vectordb/llamaindex/llamaindexdb.py +127 -0
- agno/vectordb/milvus/milvus.py +242 -32
- agno/vectordb/mongodb/mongodb.py +200 -24
- agno/vectordb/pgvector/pgvector.py +319 -37
- agno/vectordb/pineconedb/pineconedb.py +221 -27
- agno/vectordb/qdrant/qdrant.py +356 -14
- agno/vectordb/singlestore/singlestore.py +286 -29
- agno/vectordb/surrealdb/surrealdb.py +187 -7
- agno/vectordb/upstashdb/upstashdb.py +342 -26
- agno/vectordb/weaviate/weaviate.py +227 -165
- agno/workflow/__init__.py +17 -13
- agno/workflow/{v2/condition.py → condition.py} +135 -32
- agno/workflow/{v2/loop.py → loop.py} +115 -28
- agno/workflow/{v2/parallel.py → parallel.py} +138 -108
- agno/workflow/{v2/router.py → router.py} +133 -32
- agno/workflow/{v2/step.py → step.py} +200 -42
- agno/workflow/{v2/steps.py → steps.py} +147 -66
- agno/workflow/types.py +482 -0
- agno/workflow/workflow.py +2394 -696
- agno-2.0.0a1.dist-info/METADATA +355 -0
- agno-2.0.0a1.dist-info/RECORD +514 -0
- agno/agent/metrics.py +0 -107
- agno/api/app.py +0 -35
- agno/api/playground.py +0 -92
- agno/api/schemas/app.py +0 -12
- agno/api/schemas/playground.py +0 -22
- agno/api/schemas/user.py +0 -35
- agno/api/schemas/workspace.py +0 -46
- agno/api/user.py +0 -160
- agno/api/workflows.py +0 -33
- agno/api/workspace.py +0 -175
- agno/app/agui/__init__.py +0 -3
- agno/app/agui/app.py +0 -17
- agno/app/agui/sync_router.py +0 -120
- agno/app/base.py +0 -186
- agno/app/discord/__init__.py +0 -3
- agno/app/fastapi/__init__.py +0 -3
- agno/app/fastapi/app.py +0 -107
- agno/app/fastapi/async_router.py +0 -457
- agno/app/fastapi/sync_router.py +0 -448
- agno/app/playground/app.py +0 -228
- agno/app/playground/async_router.py +0 -1050
- agno/app/playground/deploy.py +0 -249
- agno/app/playground/operator.py +0 -183
- agno/app/playground/schemas.py +0 -220
- agno/app/playground/serve.py +0 -55
- agno/app/playground/sync_router.py +0 -1042
- agno/app/playground/utils.py +0 -46
- agno/app/settings.py +0 -15
- agno/app/slack/__init__.py +0 -3
- agno/app/slack/app.py +0 -19
- agno/app/slack/sync_router.py +0 -92
- agno/app/utils.py +0 -54
- agno/app/whatsapp/__init__.py +0 -3
- agno/app/whatsapp/app.py +0 -15
- agno/app/whatsapp/sync_router.py +0 -197
- agno/cli/auth_server.py +0 -249
- agno/cli/config.py +0 -274
- agno/cli/console.py +0 -88
- agno/cli/credentials.py +0 -23
- agno/cli/entrypoint.py +0 -571
- agno/cli/operator.py +0 -357
- agno/cli/settings.py +0 -96
- agno/cli/ws/ws_cli.py +0 -817
- agno/constants.py +0 -13
- agno/document/__init__.py +0 -5
- agno/document/chunking/semantic.py +0 -45
- agno/document/chunking/strategy.py +0 -31
- agno/document/reader/__init__.py +0 -5
- agno/document/reader/base.py +0 -47
- agno/document/reader/docx_reader.py +0 -60
- agno/document/reader/gcs/pdf_reader.py +0 -44
- agno/document/reader/s3/pdf_reader.py +0 -59
- agno/document/reader/s3/text_reader.py +0 -63
- agno/document/reader/url_reader.py +0 -59
- agno/document/reader/youtube_reader.py +0 -58
- agno/embedder/__init__.py +0 -5
- agno/embedder/langdb.py +0 -80
- agno/embedder/mistral.py +0 -82
- agno/embedder/openai.py +0 -78
- agno/file/__init__.py +0 -5
- agno/file/file.py +0 -16
- agno/file/local/csv.py +0 -32
- agno/file/local/txt.py +0 -19
- agno/infra/app.py +0 -240
- agno/infra/base.py +0 -144
- agno/infra/context.py +0 -20
- agno/infra/db_app.py +0 -52
- agno/infra/resource.py +0 -205
- agno/infra/resources.py +0 -55
- agno/knowledge/agent.py +0 -698
- agno/knowledge/arxiv.py +0 -33
- agno/knowledge/combined.py +0 -36
- agno/knowledge/csv.py +0 -144
- agno/knowledge/csv_url.py +0 -124
- agno/knowledge/document.py +0 -223
- agno/knowledge/docx.py +0 -137
- agno/knowledge/firecrawl.py +0 -34
- agno/knowledge/gcs/__init__.py +0 -0
- agno/knowledge/gcs/base.py +0 -39
- agno/knowledge/gcs/pdf.py +0 -125
- agno/knowledge/json.py +0 -137
- agno/knowledge/langchain.py +0 -71
- agno/knowledge/light_rag.py +0 -273
- agno/knowledge/llamaindex.py +0 -66
- agno/knowledge/markdown.py +0 -154
- agno/knowledge/pdf.py +0 -164
- agno/knowledge/pdf_bytes.py +0 -42
- agno/knowledge/pdf_url.py +0 -148
- agno/knowledge/s3/__init__.py +0 -0
- agno/knowledge/s3/base.py +0 -64
- agno/knowledge/s3/pdf.py +0 -33
- agno/knowledge/s3/text.py +0 -34
- agno/knowledge/text.py +0 -141
- agno/knowledge/url.py +0 -46
- agno/knowledge/website.py +0 -179
- agno/knowledge/wikipedia.py +0 -32
- agno/knowledge/youtube.py +0 -35
- agno/memory/agent.py +0 -423
- agno/memory/classifier.py +0 -104
- agno/memory/db/__init__.py +0 -5
- agno/memory/db/base.py +0 -42
- agno/memory/db/mongodb.py +0 -189
- agno/memory/db/postgres.py +0 -203
- agno/memory/db/sqlite.py +0 -193
- agno/memory/memory.py +0 -22
- agno/memory/row.py +0 -36
- agno/memory/summarizer.py +0 -201
- agno/memory/summary.py +0 -19
- agno/memory/team.py +0 -415
- agno/memory/v2/__init__.py +0 -2
- agno/memory/v2/db/__init__.py +0 -1
- agno/memory/v2/db/base.py +0 -42
- agno/memory/v2/db/firestore.py +0 -339
- agno/memory/v2/db/mongodb.py +0 -196
- agno/memory/v2/db/postgres.py +0 -214
- agno/memory/v2/db/redis.py +0 -187
- agno/memory/v2/db/schema.py +0 -54
- agno/memory/v2/db/sqlite.py +0 -209
- agno/memory/v2/manager.py +0 -437
- agno/memory/v2/memory.py +0 -1097
- agno/memory/v2/schema.py +0 -55
- agno/memory/v2/summarizer.py +0 -215
- agno/memory/workflow.py +0 -38
- agno/models/ollama/tools.py +0 -430
- agno/models/qwen/__init__.py +0 -5
- agno/playground/__init__.py +0 -10
- agno/playground/deploy.py +0 -3
- agno/playground/playground.py +0 -3
- agno/playground/serve.py +0 -3
- agno/playground/settings.py +0 -3
- agno/reranker/__init__.py +0 -0
- agno/run/v2/__init__.py +0 -0
- agno/run/v2/workflow.py +0 -567
- agno/storage/__init__.py +0 -0
- agno/storage/agent/__init__.py +0 -0
- agno/storage/agent/dynamodb.py +0 -1
- agno/storage/agent/json.py +0 -1
- agno/storage/agent/mongodb.py +0 -1
- agno/storage/agent/postgres.py +0 -1
- agno/storage/agent/singlestore.py +0 -1
- agno/storage/agent/sqlite.py +0 -1
- agno/storage/agent/yaml.py +0 -1
- agno/storage/base.py +0 -60
- agno/storage/dynamodb.py +0 -673
- agno/storage/firestore.py +0 -297
- agno/storage/gcs_json.py +0 -261
- agno/storage/in_memory.py +0 -234
- agno/storage/json.py +0 -237
- agno/storage/mongodb.py +0 -328
- agno/storage/mysql.py +0 -685
- agno/storage/postgres.py +0 -682
- agno/storage/redis.py +0 -336
- agno/storage/session/__init__.py +0 -16
- agno/storage/session/agent.py +0 -64
- agno/storage/session/team.py +0 -63
- agno/storage/session/v2/__init__.py +0 -5
- agno/storage/session/workflow.py +0 -61
- agno/storage/singlestore.py +0 -606
- agno/storage/sqlite.py +0 -646
- agno/storage/workflow/__init__.py +0 -0
- agno/storage/workflow/mongodb.py +0 -1
- agno/storage/workflow/postgres.py +0 -1
- agno/storage/workflow/sqlite.py +0 -1
- agno/storage/yaml.py +0 -241
- agno/tools/thinking.py +0 -73
- agno/utils/defaults.py +0 -57
- agno/utils/filesystem.py +0 -39
- agno/utils/git.py +0 -52
- agno/utils/json_io.py +0 -30
- agno/utils/load_env.py +0 -19
- agno/utils/py_io.py +0 -19
- agno/utils/pyproject.py +0 -18
- agno/utils/resource_filter.py +0 -31
- agno/workflow/v2/__init__.py +0 -21
- agno/workflow/v2/types.py +0 -357
- agno/workflow/v2/workflow.py +0 -3312
- agno/workspace/__init__.py +0 -0
- agno/workspace/config.py +0 -325
- agno/workspace/enums.py +0 -6
- agno/workspace/helpers.py +0 -52
- agno/workspace/operator.py +0 -757
- agno/workspace/settings.py +0 -158
- agno-1.8.0.dist-info/METADATA +0 -979
- agno-1.8.0.dist-info/RECORD +0 -565
- agno-1.8.0.dist-info/entry_points.txt +0 -3
- /agno/{app → db/migrations}/__init__.py +0 -0
- /agno/{app/playground/__init__.py → db/schemas/metrics.py} +0 -0
- /agno/{cli → integrations}/__init__.py +0 -0
- /agno/{cli/ws → knowledge/chunking}/__init__.py +0 -0
- /agno/{document/chunking → knowledge/remote_content}/__init__.py +0 -0
- /agno/{document/reader/gcs → knowledge/reranker}/__init__.py +0 -0
- /agno/{document/reader/s3 → os/interfaces}/__init__.py +0 -0
- /agno/{app → os/interfaces}/slack/security.py +0 -0
- /agno/{app → os/interfaces}/whatsapp/security.py +0 -0
- /agno/{file/local → utils/print_response}/__init__.py +0 -0
- /agno/{infra → vectordb/llamaindex}/__init__.py +0 -0
- {agno-1.8.0.dist-info → agno-2.0.0a1.dist-info}/WHEEL +0 -0
- {agno-1.8.0.dist-info → agno-2.0.0a1.dist-info}/licenses/LICENSE +0 -0
- {agno-1.8.0.dist-info → agno-2.0.0a1.dist-info}/top_level.txt +0 -0
agno/tools/pandas.py
CHANGED
|
@@ -10,12 +10,20 @@ except ImportError:
|
|
|
10
10
|
|
|
11
11
|
|
|
12
12
|
class PandasTools(Toolkit):
|
|
13
|
-
def __init__(
|
|
13
|
+
def __init__(
|
|
14
|
+
self,
|
|
15
|
+
enable_create_pandas_dataframe: bool = True,
|
|
16
|
+
enable_run_dataframe_operation: bool = True,
|
|
17
|
+
all: bool = False,
|
|
18
|
+
**kwargs,
|
|
19
|
+
):
|
|
14
20
|
self.dataframes: Dict[str, pd.DataFrame] = {}
|
|
15
21
|
|
|
16
22
|
tools: List[Any] = []
|
|
17
|
-
|
|
18
|
-
|
|
23
|
+
if all or enable_create_pandas_dataframe:
|
|
24
|
+
tools.append(self.create_pandas_dataframe)
|
|
25
|
+
if all or enable_run_dataframe_operation:
|
|
26
|
+
tools.append(self.run_dataframe_operation)
|
|
19
27
|
|
|
20
28
|
super().__init__(name="pandas_tools", tools=tools, **kwargs)
|
|
21
29
|
|
agno/tools/postgres.py
CHANGED
|
@@ -22,10 +22,6 @@ class PostgresTools(Toolkit):
|
|
|
22
22
|
password: Optional[str] = None,
|
|
23
23
|
host: Optional[str] = None,
|
|
24
24
|
port: Optional[int] = None,
|
|
25
|
-
run_queries: bool = True,
|
|
26
|
-
inspect_queries: bool = False,
|
|
27
|
-
summarize_tables: bool = True,
|
|
28
|
-
export_tables: bool = False,
|
|
29
25
|
table_schema: str = "public",
|
|
30
26
|
**kwargs,
|
|
31
27
|
):
|
|
@@ -40,15 +36,11 @@ class PostgresTools(Toolkit):
|
|
|
40
36
|
tools: List[Any] = [
|
|
41
37
|
self.show_tables,
|
|
42
38
|
self.describe_table,
|
|
39
|
+
self.summarize_table,
|
|
40
|
+
self.inspect_query,
|
|
41
|
+
self.run_query,
|
|
42
|
+
self.export_table_to_path,
|
|
43
43
|
]
|
|
44
|
-
if inspect_queries:
|
|
45
|
-
tools.append(self.inspect_query)
|
|
46
|
-
if run_queries:
|
|
47
|
-
tools.append(self.run_query)
|
|
48
|
-
if summarize_tables:
|
|
49
|
-
tools.append(self.summarize_table)
|
|
50
|
-
if export_tables:
|
|
51
|
-
tools.append(self.export_table_to_path)
|
|
52
44
|
|
|
53
45
|
super().__init__(name="postgres_tools", tools=tools, **kwargs)
|
|
54
46
|
|
agno/tools/pubmed.py
CHANGED
|
@@ -14,6 +14,8 @@ class PubmedTools(Toolkit):
|
|
|
14
14
|
email: str = "your_email@example.com",
|
|
15
15
|
max_results: Optional[int] = None,
|
|
16
16
|
results_expanded: bool = False,
|
|
17
|
+
enable_search_pubmed: bool = True,
|
|
18
|
+
all: bool = False,
|
|
17
19
|
**kwargs,
|
|
18
20
|
):
|
|
19
21
|
self.max_results: Optional[int] = max_results
|
|
@@ -21,7 +23,8 @@ class PubmedTools(Toolkit):
|
|
|
21
23
|
self.results_expanded: bool = results_expanded
|
|
22
24
|
|
|
23
25
|
tools: List[Any] = []
|
|
24
|
-
|
|
26
|
+
if enable_search_pubmed or all:
|
|
27
|
+
tools.append(self.search_pubmed)
|
|
25
28
|
|
|
26
29
|
super().__init__(name="pubmed", tools=tools, **kwargs)
|
|
27
30
|
|
agno/tools/python.py
CHANGED
|
@@ -16,13 +16,6 @@ class PythonTools(Toolkit):
|
|
|
16
16
|
def __init__(
|
|
17
17
|
self,
|
|
18
18
|
base_dir: Optional[Path] = None,
|
|
19
|
-
save_and_run: bool = True,
|
|
20
|
-
pip_install: bool = False,
|
|
21
|
-
uv_pip_install: bool = False,
|
|
22
|
-
run_code: bool = False,
|
|
23
|
-
list_files: bool = False,
|
|
24
|
-
run_files: bool = False,
|
|
25
|
-
read_files: bool = False,
|
|
26
19
|
safe_globals: Optional[dict] = None,
|
|
27
20
|
safe_locals: Optional[dict] = None,
|
|
28
21
|
**kwargs,
|
|
@@ -33,21 +26,15 @@ class PythonTools(Toolkit):
|
|
|
33
26
|
self.safe_globals: dict = safe_globals or globals()
|
|
34
27
|
self.safe_locals: dict = safe_locals or locals()
|
|
35
28
|
|
|
36
|
-
tools: List[Any] = [
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
if run_files:
|
|
46
|
-
tools.append(self.run_python_file_return_variable)
|
|
47
|
-
if read_files:
|
|
48
|
-
tools.append(self.read_file)
|
|
49
|
-
if list_files:
|
|
50
|
-
tools.append(self.list_files)
|
|
29
|
+
tools: List[Any] = [
|
|
30
|
+
self.save_to_file_and_run,
|
|
31
|
+
self.run_python_code,
|
|
32
|
+
self.pip_install_package,
|
|
33
|
+
self.uv_pip_install_package,
|
|
34
|
+
self.run_python_file_return_variable,
|
|
35
|
+
self.read_file,
|
|
36
|
+
self.list_files,
|
|
37
|
+
]
|
|
51
38
|
|
|
52
39
|
super().__init__(name="python_tools", tools=tools, **kwargs)
|
|
53
40
|
|
agno/tools/reasoning.py
CHANGED
|
@@ -1,9 +1,7 @@
|
|
|
1
1
|
from textwrap import dedent
|
|
2
|
-
from typing import Any, List, Optional
|
|
2
|
+
from typing import Any, Dict, List, Optional
|
|
3
3
|
|
|
4
|
-
from agno.agent import Agent
|
|
5
4
|
from agno.reasoning.step import NextAction, ReasoningStep
|
|
6
|
-
from agno.team.team import Team
|
|
7
5
|
from agno.tools import Toolkit
|
|
8
6
|
from agno.utils.log import log_debug, log_error
|
|
9
7
|
|
|
@@ -11,8 +9,9 @@ from agno.utils.log import log_debug, log_error
|
|
|
11
9
|
class ReasoningTools(Toolkit):
|
|
12
10
|
def __init__(
|
|
13
11
|
self,
|
|
14
|
-
|
|
15
|
-
|
|
12
|
+
enable_think: bool = True,
|
|
13
|
+
enable_analyze: bool = True,
|
|
14
|
+
all: bool = False,
|
|
16
15
|
instructions: Optional[str] = None,
|
|
17
16
|
add_instructions: bool = False,
|
|
18
17
|
add_few_shot: bool = False,
|
|
@@ -34,9 +33,10 @@ class ReasoningTools(Toolkit):
|
|
|
34
33
|
self.instructions = instructions
|
|
35
34
|
|
|
36
35
|
tools: List[Any] = []
|
|
37
|
-
|
|
36
|
+
# Prefer new flags; fallback to legacy ones
|
|
37
|
+
if all or enable_think:
|
|
38
38
|
tools.append(self.think)
|
|
39
|
-
if
|
|
39
|
+
if all or enable_analyze:
|
|
40
40
|
tools.append(self.analyze)
|
|
41
41
|
|
|
42
42
|
super().__init__(
|
|
@@ -48,7 +48,12 @@ class ReasoningTools(Toolkit):
|
|
|
48
48
|
)
|
|
49
49
|
|
|
50
50
|
def think(
|
|
51
|
-
self,
|
|
51
|
+
self,
|
|
52
|
+
session_state: Dict[str, Any],
|
|
53
|
+
title: str,
|
|
54
|
+
thought: str,
|
|
55
|
+
action: Optional[str] = None,
|
|
56
|
+
confidence: float = 0.8,
|
|
52
57
|
) -> str:
|
|
53
58
|
"""Use this tool as a scratchpad to reason about the question and work through it step-by-step.
|
|
54
59
|
This tool will help you break down complex problems into logical steps and track the reasoning process.
|
|
@@ -75,19 +80,21 @@ class ReasoningTools(Toolkit):
|
|
|
75
80
|
confidence=confidence,
|
|
76
81
|
)
|
|
77
82
|
|
|
83
|
+
current_run_id = session_state.get("current_run_id", None)
|
|
84
|
+
|
|
78
85
|
# Add this step to the Agent's session state
|
|
79
|
-
if
|
|
80
|
-
|
|
81
|
-
if "reasoning_steps" not in
|
|
82
|
-
|
|
83
|
-
if
|
|
84
|
-
|
|
85
|
-
|
|
86
|
+
if session_state is None:
|
|
87
|
+
session_state = {}
|
|
88
|
+
if "reasoning_steps" not in session_state:
|
|
89
|
+
session_state["reasoning_steps"] = {}
|
|
90
|
+
if current_run_id not in session_state["reasoning_steps"]:
|
|
91
|
+
session_state["reasoning_steps"][current_run_id] = []
|
|
92
|
+
session_state["reasoning_steps"][current_run_id].append(reasoning_step.model_dump_json())
|
|
86
93
|
|
|
87
94
|
# Return all previous reasoning_steps and the new reasoning_step
|
|
88
|
-
if "reasoning_steps" in
|
|
95
|
+
if "reasoning_steps" in session_state and current_run_id in session_state["reasoning_steps"]:
|
|
89
96
|
formatted_reasoning_steps = ""
|
|
90
|
-
for i, step in enumerate(
|
|
97
|
+
for i, step in enumerate(session_state["reasoning_steps"][current_run_id], 1):
|
|
91
98
|
step_parsed = ReasoningStep.model_validate_json(step)
|
|
92
99
|
step_str = dedent(f"""\
|
|
93
100
|
Step {i}:
|
|
@@ -105,7 +112,7 @@ Confidence: {step_parsed.confidence}
|
|
|
105
112
|
|
|
106
113
|
def analyze(
|
|
107
114
|
self,
|
|
108
|
-
|
|
115
|
+
session_state: Dict[str, Any],
|
|
109
116
|
title: str,
|
|
110
117
|
result: str,
|
|
111
118
|
analysis: str,
|
|
@@ -143,19 +150,20 @@ Confidence: {step_parsed.confidence}
|
|
|
143
150
|
confidence=confidence,
|
|
144
151
|
)
|
|
145
152
|
|
|
153
|
+
current_run_id = session_state.get("current_run_id", None)
|
|
146
154
|
# Add this step to the Agent's session state
|
|
147
|
-
if
|
|
148
|
-
|
|
149
|
-
if "reasoning_steps" not in
|
|
150
|
-
|
|
151
|
-
if
|
|
152
|
-
|
|
153
|
-
|
|
155
|
+
if session_state is None:
|
|
156
|
+
session_state = {}
|
|
157
|
+
if "reasoning_steps" not in session_state:
|
|
158
|
+
session_state["reasoning_steps"] = {}
|
|
159
|
+
if current_run_id not in session_state["reasoning_steps"]:
|
|
160
|
+
session_state["reasoning_steps"][current_run_id] = []
|
|
161
|
+
session_state["reasoning_steps"][current_run_id].append(reasoning_step.model_dump_json())
|
|
154
162
|
|
|
155
163
|
# Return all previous reasoning_steps and the new reasoning_step
|
|
156
|
-
if "reasoning_steps" in
|
|
164
|
+
if "reasoning_steps" in session_state and current_run_id in session_state["reasoning_steps"]:
|
|
157
165
|
formatted_reasoning_steps = ""
|
|
158
|
-
for i, step in enumerate(
|
|
166
|
+
for i, step in enumerate(session_state["reasoning_steps"][current_run_id], 1):
|
|
159
167
|
step_parsed = ReasoningStep.model_validate_json(step)
|
|
160
168
|
step_str = dedent(f"""\
|
|
161
169
|
Step {i}:
|
agno/tools/reddit.py
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import json
|
|
2
2
|
from os import getenv
|
|
3
|
-
from typing import
|
|
3
|
+
from typing import Callable, Dict, List, Optional, Union
|
|
4
4
|
|
|
5
5
|
from agno.tools import Toolkit
|
|
6
6
|
from agno.utils.log import log_debug, log_info, logger
|
|
@@ -20,14 +20,6 @@ class RedditTools(Toolkit):
|
|
|
20
20
|
user_agent: Optional[str] = None,
|
|
21
21
|
username: Optional[str] = None,
|
|
22
22
|
password: Optional[str] = None,
|
|
23
|
-
get_user_info: bool = True,
|
|
24
|
-
get_top_posts: bool = True,
|
|
25
|
-
get_subreddit_info: bool = True,
|
|
26
|
-
get_trending_subreddits: bool = True,
|
|
27
|
-
get_subreddit_stats: bool = True,
|
|
28
|
-
create_post: bool = True,
|
|
29
|
-
reply_to_post: bool = True,
|
|
30
|
-
reply_to_comment: bool = True,
|
|
31
23
|
**kwargs,
|
|
32
24
|
):
|
|
33
25
|
if reddit_instance is not None:
|
|
@@ -65,23 +57,16 @@ class RedditTools(Toolkit):
|
|
|
65
57
|
else:
|
|
66
58
|
logger.warning("Missing Reddit API credentials")
|
|
67
59
|
|
|
68
|
-
tools: List[
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
tools.append(self.get_subreddit_stats)
|
|
79
|
-
if create_post:
|
|
80
|
-
tools.append(self.create_post)
|
|
81
|
-
if reply_to_post:
|
|
82
|
-
tools.append(self.reply_to_post)
|
|
83
|
-
if reply_to_comment:
|
|
84
|
-
tools.append(self.reply_to_comment)
|
|
60
|
+
tools: List[Callable] = [
|
|
61
|
+
self.get_user_info,
|
|
62
|
+
self.get_top_posts,
|
|
63
|
+
self.get_subreddit_info,
|
|
64
|
+
self.get_trending_subreddits,
|
|
65
|
+
self.get_subreddit_stats,
|
|
66
|
+
self.create_post,
|
|
67
|
+
self.reply_to_post,
|
|
68
|
+
self.reply_to_comment,
|
|
69
|
+
]
|
|
85
70
|
|
|
86
71
|
super().__init__(name="reddit", tools=tools, **kwargs)
|
|
87
72
|
|
agno/tools/replicate.py
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import os
|
|
2
1
|
from os import getenv
|
|
3
|
-
from
|
|
2
|
+
from pathlib import Path
|
|
3
|
+
from typing import Any, Iterable, Iterator, List, Optional, Tuple, Union
|
|
4
4
|
from urllib.parse import urlparse
|
|
5
5
|
from uuid import uuid4
|
|
6
6
|
|
|
@@ -8,6 +8,7 @@ from agno.agent import Agent
|
|
|
8
8
|
from agno.media import ImageArtifact, VideoArtifact
|
|
9
9
|
from agno.team.team import Team
|
|
10
10
|
from agno.tools import Toolkit
|
|
11
|
+
from agno.tools.function import ToolResult
|
|
11
12
|
from agno.utils.log import logger
|
|
12
13
|
|
|
13
14
|
try:
|
|
@@ -22,83 +23,95 @@ class ReplicateTools(Toolkit):
|
|
|
22
23
|
self,
|
|
23
24
|
api_key: Optional[str] = None,
|
|
24
25
|
model: str = "minimax/video-01",
|
|
26
|
+
enable_generate_media: bool = True,
|
|
27
|
+
all: bool = False,
|
|
25
28
|
**kwargs,
|
|
26
29
|
):
|
|
27
|
-
self.api_key = api_key or getenv("
|
|
30
|
+
self.api_key = api_key or getenv("REPLICATE_API_KEY")
|
|
28
31
|
if not self.api_key:
|
|
29
|
-
logger.error("
|
|
32
|
+
logger.error("REPLICATE_API_KEY not set. Please set the REPLICATE_API_KEY environment variable.")
|
|
30
33
|
self.model = model
|
|
31
34
|
|
|
32
35
|
tools: List[Any] = []
|
|
33
|
-
|
|
36
|
+
if all or enable_generate_media:
|
|
37
|
+
tools.append(self.generate_media)
|
|
34
38
|
|
|
35
39
|
super().__init__(name="replicate_toolkit", tools=tools, **kwargs)
|
|
36
40
|
|
|
37
|
-
def generate_media(self, agent: Union[Agent, Team], prompt: str) ->
|
|
41
|
+
def generate_media(self, agent: Union[Agent, Team], prompt: str) -> ToolResult:
|
|
38
42
|
"""
|
|
39
43
|
Use this function to generate an image or a video using a replicate model.
|
|
40
44
|
Args:
|
|
41
45
|
prompt (str): A text description of the content.
|
|
42
46
|
Returns:
|
|
43
|
-
|
|
47
|
+
ToolResult: A ToolResult containing the generated media or error message.
|
|
44
48
|
"""
|
|
45
49
|
if not self.api_key:
|
|
46
50
|
logger.error("API key is not set. Please provide a valid API key.")
|
|
47
|
-
return "API key is not set."
|
|
51
|
+
return ToolResult(content="API key is not set.")
|
|
48
52
|
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
outputs
|
|
52
|
-
|
|
53
|
-
outputs
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
53
|
+
try:
|
|
54
|
+
outputs = replicate.run(ref=self.model, input={"prompt": prompt})
|
|
55
|
+
if isinstance(outputs, FileOutput):
|
|
56
|
+
outputs = [outputs]
|
|
57
|
+
elif isinstance(outputs, (Iterable, Iterator)) and not isinstance(outputs, str):
|
|
58
|
+
outputs = list(outputs)
|
|
59
|
+
else:
|
|
60
|
+
logger.error(f"Unexpected output type: {type(outputs)}")
|
|
61
|
+
return ToolResult(content=f"Unexpected output type: {type(outputs)}")
|
|
62
|
+
|
|
63
|
+
images = []
|
|
64
|
+
videos = []
|
|
65
|
+
results = []
|
|
57
66
|
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
return f"Unexpected output type: {type(output)}"
|
|
67
|
+
for output in outputs:
|
|
68
|
+
if not isinstance(output, FileOutput):
|
|
69
|
+
logger.error(f"Unexpected output type: {type(output)}")
|
|
70
|
+
return ToolResult(content=f"Unexpected output type: {type(output)}")
|
|
63
71
|
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
return "\n".join(results)
|
|
72
|
+
result_msg, media_artifact = self._parse_output(output)
|
|
73
|
+
results.append(result_msg)
|
|
67
74
|
|
|
68
|
-
|
|
75
|
+
if isinstance(media_artifact, ImageArtifact):
|
|
76
|
+
images.append(media_artifact)
|
|
77
|
+
elif isinstance(media_artifact, VideoArtifact):
|
|
78
|
+
videos.append(media_artifact)
|
|
79
|
+
|
|
80
|
+
content = "\n".join(results)
|
|
81
|
+
return ToolResult(
|
|
82
|
+
content=content,
|
|
83
|
+
images=images if images else None,
|
|
84
|
+
videos=videos if videos else None,
|
|
85
|
+
)
|
|
86
|
+
except Exception as e:
|
|
87
|
+
logger.error(f"Failed to generate media: {e}")
|
|
88
|
+
return ToolResult(content=f"Error: {e}")
|
|
89
|
+
|
|
90
|
+
def _parse_output(self, output: FileOutput) -> Tuple[str, Union[ImageArtifact, VideoArtifact]]:
|
|
69
91
|
"""
|
|
70
92
|
Parse the outputs from the replicate model.
|
|
71
93
|
"""
|
|
72
94
|
# Parse the URL to extract the file extension
|
|
73
95
|
parsed_url = urlparse(output.url)
|
|
74
96
|
path = parsed_url.path
|
|
75
|
-
|
|
76
|
-
ext = ext.lower()
|
|
97
|
+
ext = Path(path).suffix.lower()
|
|
77
98
|
|
|
78
99
|
# Define supported extensions
|
|
79
100
|
image_extensions = {".jpg", ".jpeg", ".png", ".gif", ".bmp", ".tiff", ".webp"}
|
|
80
101
|
video_extensions = {".mp4", ".mov", ".avi", ".mkv", ".flv", ".wmv", ".webm"}
|
|
81
102
|
|
|
82
103
|
media_id = str(uuid4())
|
|
104
|
+
artifact: Union[ImageArtifact, VideoArtifact]
|
|
105
|
+
media_type: str
|
|
83
106
|
|
|
84
107
|
if ext in image_extensions:
|
|
85
|
-
|
|
86
|
-
ImageArtifact(
|
|
87
|
-
id=media_id,
|
|
88
|
-
url=output.url,
|
|
89
|
-
)
|
|
90
|
-
)
|
|
108
|
+
artifact = ImageArtifact(id=media_id, url=output.url)
|
|
91
109
|
media_type = "image"
|
|
92
110
|
elif ext in video_extensions:
|
|
93
|
-
|
|
94
|
-
VideoArtifact(
|
|
95
|
-
id=media_id,
|
|
96
|
-
url=output.url,
|
|
97
|
-
)
|
|
98
|
-
)
|
|
111
|
+
artifact = VideoArtifact(id=media_id, url=output.url)
|
|
99
112
|
media_type = "video"
|
|
100
113
|
else:
|
|
101
114
|
logger.error(f"Unsupported media type with extension '{ext}' for URL: {output.url}")
|
|
102
|
-
|
|
115
|
+
raise ValueError(f"Unsupported media type with extension '{ext}'.")
|
|
103
116
|
|
|
104
|
-
return f"{media_type.capitalize()} generated successfully at {output.url}"
|
|
117
|
+
return f"{media_type.capitalize()} generated successfully at {output.url}", artifact
|
agno/tools/resend.py
CHANGED
|
@@ -15,6 +15,8 @@ class ResendTools(Toolkit):
|
|
|
15
15
|
self,
|
|
16
16
|
api_key: Optional[str] = None,
|
|
17
17
|
from_email: Optional[str] = None,
|
|
18
|
+
enable_send_email: bool = True,
|
|
19
|
+
all: bool = False,
|
|
18
20
|
**kwargs,
|
|
19
21
|
):
|
|
20
22
|
self.from_email = from_email
|
|
@@ -23,7 +25,8 @@ class ResendTools(Toolkit):
|
|
|
23
25
|
logger.error("No Resend API key provided")
|
|
24
26
|
|
|
25
27
|
tools: List[Any] = []
|
|
26
|
-
|
|
28
|
+
if all or enable_send_email:
|
|
29
|
+
tools.append(self.send_email)
|
|
27
30
|
|
|
28
31
|
super().__init__(name="resend_tools", tools=tools, **kwargs)
|
|
29
32
|
|
agno/tools/scrapegraph.py
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import json
|
|
2
|
-
import
|
|
2
|
+
from os import getenv
|
|
3
3
|
from typing import Any, List, Optional
|
|
4
4
|
|
|
5
5
|
from agno.tools import Toolkit
|
|
@@ -18,31 +18,32 @@ class ScrapeGraphTools(Toolkit):
|
|
|
18
18
|
def __init__(
|
|
19
19
|
self,
|
|
20
20
|
api_key: Optional[str] = None,
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
21
|
+
enable_smartscraper: bool = True,
|
|
22
|
+
enable_markdownify: bool = False,
|
|
23
|
+
enable_crawl: bool = False,
|
|
24
|
+
enable_searchscraper: bool = False,
|
|
25
|
+
enable_agentic_crawler: bool = False,
|
|
26
|
+
all: bool = False,
|
|
26
27
|
**kwargs,
|
|
27
28
|
):
|
|
28
|
-
self.api_key: Optional[str] = api_key or
|
|
29
|
+
self.api_key: Optional[str] = api_key or getenv("SGAI_API_KEY")
|
|
29
30
|
self.client = Client(api_key=self.api_key)
|
|
30
31
|
|
|
31
32
|
# Start with smartscraper by default
|
|
32
33
|
# Only enable markdownify if smartscraper is False
|
|
33
|
-
if not
|
|
34
|
-
|
|
34
|
+
if not enable_smartscraper and not all:
|
|
35
|
+
enable_markdownify = True
|
|
35
36
|
|
|
36
37
|
tools: List[Any] = []
|
|
37
|
-
if
|
|
38
|
+
if enable_smartscraper or all:
|
|
38
39
|
tools.append(self.smartscraper)
|
|
39
|
-
if
|
|
40
|
+
if enable_markdownify or all:
|
|
40
41
|
tools.append(self.markdownify)
|
|
41
|
-
if
|
|
42
|
+
if enable_crawl or all:
|
|
42
43
|
tools.append(self.crawl)
|
|
43
|
-
if
|
|
44
|
+
if enable_searchscraper or all:
|
|
44
45
|
tools.append(self.searchscraper)
|
|
45
|
-
if
|
|
46
|
+
if enable_agentic_crawler or all:
|
|
46
47
|
tools.append(self.agentic_crawler)
|
|
47
48
|
|
|
48
49
|
super().__init__(name="scrapegraph_tools", tools=tools, **kwargs)
|
agno/tools/searxng.py
CHANGED
|
@@ -14,35 +14,22 @@ class Searxng(Toolkit):
|
|
|
14
14
|
host: str,
|
|
15
15
|
engines: List[str] = [],
|
|
16
16
|
fixed_max_results: Optional[int] = None,
|
|
17
|
-
images: bool = False,
|
|
18
|
-
it: bool = False,
|
|
19
|
-
map: bool = False,
|
|
20
|
-
music: bool = False,
|
|
21
|
-
news: bool = False,
|
|
22
|
-
science: bool = False,
|
|
23
|
-
videos: bool = False,
|
|
24
17
|
**kwargs,
|
|
25
18
|
):
|
|
26
19
|
self.host = host
|
|
27
20
|
self.engines = engines
|
|
28
21
|
self.fixed_max_results = fixed_max_results
|
|
29
22
|
|
|
30
|
-
tools: List[Any] = [
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
if news:
|
|
41
|
-
tools.append(self.news_search)
|
|
42
|
-
if science:
|
|
43
|
-
tools.append(self.science_search)
|
|
44
|
-
if videos:
|
|
45
|
-
tools.append(self.video_search)
|
|
23
|
+
tools: List[Any] = [
|
|
24
|
+
self.search,
|
|
25
|
+
self.image_search,
|
|
26
|
+
self.it_search,
|
|
27
|
+
self.map_search,
|
|
28
|
+
self.music_search,
|
|
29
|
+
self.news_search,
|
|
30
|
+
self.science_search,
|
|
31
|
+
self.video_search,
|
|
32
|
+
]
|
|
46
33
|
|
|
47
34
|
super().__init__(name="searxng", tools=tools, **kwargs)
|
|
48
35
|
|
agno/tools/serpapi.py
CHANGED
|
@@ -15,7 +15,9 @@ class SerpApiTools(Toolkit):
|
|
|
15
15
|
def __init__(
|
|
16
16
|
self,
|
|
17
17
|
api_key: Optional[str] = None,
|
|
18
|
-
|
|
18
|
+
enable_search_google: bool = True,
|
|
19
|
+
enable_search_youtube: bool = False,
|
|
20
|
+
all: bool = False,
|
|
19
21
|
**kwargs,
|
|
20
22
|
):
|
|
21
23
|
self.api_key = api_key or getenv("SERP_API_KEY")
|
|
@@ -23,8 +25,9 @@ class SerpApiTools(Toolkit):
|
|
|
23
25
|
logger.warning("No Serpapi API key provided")
|
|
24
26
|
|
|
25
27
|
tools: List[Any] = []
|
|
26
|
-
|
|
27
|
-
|
|
28
|
+
if all or enable_search_google:
|
|
29
|
+
tools.append(self.search_google)
|
|
30
|
+
if all or enable_search_youtube:
|
|
28
31
|
tools.append(self.search_youtube)
|
|
29
32
|
|
|
30
33
|
super().__init__(name="serpapi_tools", tools=tools, **kwargs)
|
agno/tools/serper.py
CHANGED
|
@@ -16,6 +16,11 @@ class SerperTools(Toolkit):
|
|
|
16
16
|
language: str = "en",
|
|
17
17
|
num_results: int = 10,
|
|
18
18
|
date_range: Optional[str] = None,
|
|
19
|
+
enable_search: bool = True,
|
|
20
|
+
enable_search_news: bool = True,
|
|
21
|
+
enable_search_scholar: bool = True,
|
|
22
|
+
enable_scrape_webpage: bool = True,
|
|
23
|
+
all: bool = False,
|
|
19
24
|
**kwargs,
|
|
20
25
|
):
|
|
21
26
|
"""
|
|
@@ -38,10 +43,14 @@ class SerperTools(Toolkit):
|
|
|
38
43
|
self.date_range = date_range
|
|
39
44
|
|
|
40
45
|
tools: List[Any] = []
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
46
|
+
if all or enable_search:
|
|
47
|
+
tools.append(self.search)
|
|
48
|
+
if all or enable_search_news:
|
|
49
|
+
tools.append(self.search_news)
|
|
50
|
+
if all or enable_search_scholar:
|
|
51
|
+
tools.append(self.search_scholar)
|
|
52
|
+
if all or enable_scrape_webpage:
|
|
53
|
+
tools.append(self.scrape_webpage)
|
|
45
54
|
|
|
46
55
|
super().__init__(name="serper_tools", tools=tools, **kwargs)
|
|
47
56
|
|
agno/tools/shell.py
CHANGED
|
@@ -6,13 +6,20 @@ from agno.utils.log import log_debug, log_info, logger
|
|
|
6
6
|
|
|
7
7
|
|
|
8
8
|
class ShellTools(Toolkit):
|
|
9
|
-
def __init__(
|
|
9
|
+
def __init__(
|
|
10
|
+
self,
|
|
11
|
+
base_dir: Optional[Union[Path, str]] = None,
|
|
12
|
+
enable_run_shell_command: bool = True,
|
|
13
|
+
all: bool = False,
|
|
14
|
+
**kwargs,
|
|
15
|
+
):
|
|
10
16
|
self.base_dir: Optional[Path] = None
|
|
11
17
|
if base_dir is not None:
|
|
12
18
|
self.base_dir = Path(base_dir) if isinstance(base_dir, str) else base_dir
|
|
13
19
|
|
|
14
20
|
tools = []
|
|
15
|
-
|
|
21
|
+
if all or enable_run_shell_command:
|
|
22
|
+
tools.append(self.run_shell_command)
|
|
16
23
|
|
|
17
24
|
super().__init__(name="shell_tools", tools=tools, **kwargs)
|
|
18
25
|
|