agno 1.8.1__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 +2778 -4123
- 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/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/google/gemini.py +100 -42
- 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 +121 -23
- agno/models/openai/responses.py +178 -105
- 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 +2961 -4253
- 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 +8 -8
- 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 +61 -61
- 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 +45 -61
- 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 +10 -8
- 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/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 +334 -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 -702
- 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.1.dist-info/METADATA +0 -982
- agno-1.8.1.dist-info/RECORD +0 -566
- agno-1.8.1.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.1.dist-info → agno-2.0.0a1.dist-info}/WHEEL +0 -0
- {agno-1.8.1.dist-info → agno-2.0.0a1.dist-info}/licenses/LICENSE +0 -0
- {agno-1.8.1.dist-info → agno-2.0.0a1.dist-info}/top_level.txt +0 -0
agno/tools/duckduckgo.py
CHANGED
|
@@ -7,7 +7,7 @@ from agno.utils.log import log_debug
|
|
|
7
7
|
try:
|
|
8
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):
|
|
@@ -25,8 +25,9 @@ class DuckDuckGoTools(Toolkit):
|
|
|
25
25
|
|
|
26
26
|
def __init__(
|
|
27
27
|
self,
|
|
28
|
-
|
|
29
|
-
|
|
28
|
+
enable_search: bool = True,
|
|
29
|
+
enable_news: bool = True,
|
|
30
|
+
all: bool = False,
|
|
30
31
|
modifier: Optional[str] = None,
|
|
31
32
|
fixed_max_results: Optional[int] = None,
|
|
32
33
|
proxy: Optional[str] = None,
|
|
@@ -41,9 +42,9 @@ class DuckDuckGoTools(Toolkit):
|
|
|
41
42
|
self.verify_ssl: bool = verify_ssl
|
|
42
43
|
|
|
43
44
|
tools: List[Any] = []
|
|
44
|
-
if
|
|
45
|
+
if all or enable_search:
|
|
45
46
|
tools.append(self.duckduckgo_search)
|
|
46
|
-
if
|
|
47
|
+
if all or enable_news:
|
|
47
48
|
tools.append(self.duckduckgo_news)
|
|
48
49
|
|
|
49
50
|
super().__init__(name="duckduckgo", tools=tools, **kwargs)
|
|
@@ -63,7 +64,7 @@ class DuckDuckGoTools(Toolkit):
|
|
|
63
64
|
|
|
64
65
|
log_debug(f"Searching DDG for: {search_query}")
|
|
65
66
|
with DDGS(proxy=self.proxy, timeout=self.timeout, verify=self.verify_ssl) as ddgs:
|
|
66
|
-
results = ddgs.text(search_query, max_results=actual_max_results)
|
|
67
|
+
results = ddgs.text(query=search_query, max_results=actual_max_results)
|
|
67
68
|
|
|
68
69
|
return json.dumps(results, indent=2)
|
|
69
70
|
|
|
@@ -81,6 +82,6 @@ class DuckDuckGoTools(Toolkit):
|
|
|
81
82
|
|
|
82
83
|
log_debug(f"Searching DDG news for: {query}")
|
|
83
84
|
with DDGS(proxy=self.proxy, timeout=self.timeout, verify=self.verify_ssl) as ddgs:
|
|
84
|
-
results = ddgs.news(query, max_results=actual_max_results)
|
|
85
|
+
results = ddgs.news(query=query, max_results=actual_max_results)
|
|
85
86
|
|
|
86
87
|
return json.dumps(results, indent=2)
|
agno/tools/e2b.py
CHANGED
|
@@ -11,6 +11,7 @@ from agno.agent import Agent
|
|
|
11
11
|
from agno.media import ImageArtifact
|
|
12
12
|
from agno.team.team import Team
|
|
13
13
|
from agno.tools import Toolkit
|
|
14
|
+
from agno.tools.function import ToolResult
|
|
14
15
|
from agno.utils.code_execution import prepare_python_code
|
|
15
16
|
from agno.utils.log import logger
|
|
16
17
|
|
|
@@ -24,27 +25,14 @@ class E2BTools(Toolkit):
|
|
|
24
25
|
def __init__(
|
|
25
26
|
self,
|
|
26
27
|
api_key: Optional[str] = None,
|
|
27
|
-
run_code: bool = True,
|
|
28
|
-
upload_file: bool = True,
|
|
29
|
-
download_result: bool = True,
|
|
30
|
-
filesystem: bool = False,
|
|
31
|
-
internet_access: bool = False,
|
|
32
|
-
sandbox_management: bool = False,
|
|
33
28
|
timeout: int = 300, # 5 minutes default timeout
|
|
34
29
|
sandbox_options: Optional[Dict[str, Any]] = None,
|
|
35
|
-
command_execution: bool = False,
|
|
36
30
|
**kwargs,
|
|
37
31
|
):
|
|
38
32
|
"""Initialize E2B toolkit for code interpretation and running Python code in a sandbox.
|
|
39
33
|
|
|
40
34
|
Args:
|
|
41
35
|
api_key: E2B API key (defaults to E2B_API_KEY environment variable)
|
|
42
|
-
run_code: Whether to register the run_code function
|
|
43
|
-
upload_file: Whether to register the upload_file function
|
|
44
|
-
download_result: Whether to register the download_result function
|
|
45
|
-
filesystem: Whether to register filesystem operations
|
|
46
|
-
internet_access: Whether to register internet access functions
|
|
47
|
-
sandbox_management: Whether to register sandbox management functions
|
|
48
36
|
timeout: Timeout in seconds for the sandbox (default: 5 minutes)
|
|
49
37
|
sandbox_options: Additional options to pass to the Sandbox constructor
|
|
50
38
|
"""
|
|
@@ -67,26 +55,33 @@ class E2BTools(Toolkit):
|
|
|
67
55
|
self.last_execution = None
|
|
68
56
|
self.downloaded_files: Dict[int, str] = {}
|
|
69
57
|
|
|
70
|
-
tools: List[Any] = [
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
58
|
+
tools: List[Any] = [
|
|
59
|
+
# Code execution
|
|
60
|
+
self.run_python_code,
|
|
61
|
+
# File operations
|
|
62
|
+
self.upload_file,
|
|
63
|
+
self.download_png_result,
|
|
64
|
+
self.download_chart_data,
|
|
65
|
+
self.download_file_from_sandbox,
|
|
66
|
+
# Filesystem operations
|
|
67
|
+
self.list_files,
|
|
68
|
+
self.read_file_content,
|
|
69
|
+
self.write_file_content,
|
|
70
|
+
self.watch_directory,
|
|
71
|
+
# Internet access
|
|
72
|
+
self.get_public_url,
|
|
73
|
+
self.run_server,
|
|
74
|
+
# Sandbox management
|
|
75
|
+
self.set_sandbox_timeout,
|
|
76
|
+
self.get_sandbox_status,
|
|
77
|
+
self.shutdown_sandbox,
|
|
78
|
+
self.list_running_sandboxes,
|
|
79
|
+
# Command execution
|
|
80
|
+
self.run_command,
|
|
81
|
+
self.stream_command,
|
|
82
|
+
self.run_background_command,
|
|
83
|
+
self.kill_background_command,
|
|
84
|
+
]
|
|
90
85
|
|
|
91
86
|
super().__init__(name="e2b_tools", tools=tools, **kwargs)
|
|
92
87
|
|
|
@@ -164,9 +159,9 @@ class E2BTools(Toolkit):
|
|
|
164
159
|
|
|
165
160
|
def download_png_result(
|
|
166
161
|
self, agent: Union[Agent, Team], result_index: int = 0, output_path: Optional[str] = None
|
|
167
|
-
) ->
|
|
162
|
+
) -> ToolResult:
|
|
168
163
|
"""
|
|
169
|
-
Add a PNG image result from the last code execution as an ImageArtifact
|
|
164
|
+
Add a PNG image result from the last code execution as an ImageArtifact.
|
|
170
165
|
|
|
171
166
|
Args:
|
|
172
167
|
agent: The agent to add the image artifact to
|
|
@@ -174,21 +169,23 @@ class E2BTools(Toolkit):
|
|
|
174
169
|
output_path (str, optional): Optional path to also save the PNG file. If not provided, image is only added as artifact.
|
|
175
170
|
|
|
176
171
|
Returns:
|
|
177
|
-
|
|
172
|
+
ToolResult: Contains the PNG image or error message.
|
|
178
173
|
"""
|
|
179
174
|
if not self.last_execution:
|
|
180
|
-
return "No code has been executed yet"
|
|
175
|
+
return ToolResult(content="No code has been executed yet")
|
|
181
176
|
|
|
182
177
|
try:
|
|
183
178
|
# Check if the result exists
|
|
184
179
|
if result_index >= len(self.last_execution.results):
|
|
185
|
-
return
|
|
180
|
+
return ToolResult(
|
|
181
|
+
content=f"Result index {result_index} is out of range. Only {len(self.last_execution.results)} results available."
|
|
182
|
+
)
|
|
186
183
|
|
|
187
184
|
result = self.last_execution.results[result_index]
|
|
188
185
|
|
|
189
186
|
# Check if the result has a PNG
|
|
190
187
|
if not result.png:
|
|
191
|
-
return f"Result at index {result_index} is not a PNG image"
|
|
188
|
+
return ToolResult(content=f"Result at index {result_index} is not a PNG image")
|
|
192
189
|
|
|
193
190
|
# Decode PNG data from base64
|
|
194
191
|
png_data = base64.b64decode(result.png)
|
|
@@ -200,7 +197,6 @@ class E2BTools(Toolkit):
|
|
|
200
197
|
self.downloaded_files[result_index] = output_path
|
|
201
198
|
|
|
202
199
|
# Create a temporary file to store the image for URL access
|
|
203
|
-
|
|
204
200
|
# Create a temp file with .png extension
|
|
205
201
|
fd, temp_path = tempfile.mkstemp(suffix=".png")
|
|
206
202
|
with fdopen(fd, "wb") as tmp:
|
|
@@ -209,28 +205,28 @@ class E2BTools(Toolkit):
|
|
|
209
205
|
# Generate a file:// URL for the temp file
|
|
210
206
|
file_url = f"file://{temp_path}"
|
|
211
207
|
|
|
212
|
-
#
|
|
208
|
+
# Create ImageArtifact
|
|
213
209
|
image_id = str(uuid4())
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
id=image_id, url=file_url, original_prompt=f"Generated from code execution result {result_index}"
|
|
217
|
-
)
|
|
210
|
+
image_artifact = ImageArtifact(
|
|
211
|
+
id=image_id, url=file_url, original_prompt=f"Generated from code execution result {result_index}"
|
|
218
212
|
)
|
|
219
213
|
|
|
220
214
|
if output_path:
|
|
221
|
-
|
|
215
|
+
content_msg = f"Image added as artifact with ID {image_id} and saved to {output_path}"
|
|
222
216
|
else:
|
|
223
|
-
|
|
217
|
+
content_msg = f"Image added as artifact with ID {image_id}"
|
|
218
|
+
|
|
219
|
+
return ToolResult(content=content_msg, images=[image_artifact])
|
|
224
220
|
|
|
225
221
|
except Exception as e:
|
|
226
|
-
return
|
|
222
|
+
return ToolResult(content=f"Error processing PNG: {str(e)}")
|
|
227
223
|
|
|
228
224
|
def download_chart_data(
|
|
229
225
|
self, agent: Agent, result_index: int = 0, output_path: Optional[str] = None, add_as_artifact: bool = True
|
|
230
|
-
) ->
|
|
226
|
+
) -> ToolResult:
|
|
231
227
|
"""
|
|
232
228
|
Extract chart data from an interactive chart in the execution results.
|
|
233
|
-
Optionally add the chart as an image artifact
|
|
229
|
+
Optionally add the chart as an image artifact.
|
|
234
230
|
|
|
235
231
|
Args:
|
|
236
232
|
agent: The agent to add the chart artifact to
|
|
@@ -239,21 +235,23 @@ class E2BTools(Toolkit):
|
|
|
239
235
|
add_as_artifact (bool): Whether to add the chart as an image artifact (default: True)
|
|
240
236
|
|
|
241
237
|
Returns:
|
|
242
|
-
|
|
238
|
+
ToolResult: Contains chart information and optionally the chart image.
|
|
243
239
|
"""
|
|
244
240
|
if not self.last_execution:
|
|
245
|
-
return "No code has been executed yet"
|
|
241
|
+
return ToolResult(content="No code has been executed yet")
|
|
246
242
|
|
|
247
243
|
try:
|
|
248
244
|
# Check if the result exists
|
|
249
245
|
if result_index >= len(self.last_execution.results):
|
|
250
|
-
return
|
|
246
|
+
return ToolResult(
|
|
247
|
+
content=f"Result index {result_index} is out of range. Only {len(self.last_execution.results)} results available."
|
|
248
|
+
)
|
|
251
249
|
|
|
252
250
|
result = self.last_execution.results[result_index]
|
|
253
251
|
|
|
254
252
|
# Check if the result has chart data
|
|
255
253
|
if not result.chart:
|
|
256
|
-
return f"Result at index {result_index} does not contain interactive chart data"
|
|
254
|
+
return ToolResult(content=f"Result at index {result_index} does not contain interactive chart data")
|
|
257
255
|
|
|
258
256
|
# Format chart data
|
|
259
257
|
chart_data = result.chart
|
|
@@ -276,6 +274,7 @@ class E2BTools(Toolkit):
|
|
|
276
274
|
if "y_label" in chart_data:
|
|
277
275
|
summary += f"Y-axis: {chart_data['y_label']}\n"
|
|
278
276
|
|
|
277
|
+
image_artifact = None
|
|
279
278
|
# Add as an image artifact if requested
|
|
280
279
|
if add_as_artifact and result.png:
|
|
281
280
|
# Decode PNG data from base64
|
|
@@ -293,20 +292,21 @@ class E2BTools(Toolkit):
|
|
|
293
292
|
# Generate a file:// URL for the temp file
|
|
294
293
|
file_url = f"file://{temp_path}"
|
|
295
294
|
|
|
296
|
-
#
|
|
295
|
+
# Create ImageArtifact
|
|
297
296
|
image_id = str(uuid4())
|
|
298
|
-
|
|
299
|
-
|
|
300
|
-
id=image_id, url=file_url, original_prompt=f"Interactive {chart_type} chart from code execution"
|
|
301
|
-
)
|
|
297
|
+
image_artifact = ImageArtifact(
|
|
298
|
+
id=image_id, url=file_url, original_prompt=f"Interactive {chart_type} chart from code execution"
|
|
302
299
|
)
|
|
303
300
|
|
|
304
301
|
summary += f"\nChart image added as artifact with ID {image_id}"
|
|
305
302
|
|
|
306
|
-
|
|
303
|
+
if image_artifact:
|
|
304
|
+
return ToolResult(content=summary, images=[image_artifact])
|
|
305
|
+
else:
|
|
306
|
+
return ToolResult(content=summary)
|
|
307
307
|
|
|
308
308
|
except Exception as e:
|
|
309
|
-
return
|
|
309
|
+
return ToolResult(content=f"Error extracting chart data: {str(e)}")
|
|
310
310
|
|
|
311
311
|
def download_file_from_sandbox(self, sandbox_path: str, local_path: Optional[str] = None) -> str:
|
|
312
312
|
"""
|
agno/tools/eleven_labs.py
CHANGED
|
@@ -9,6 +9,7 @@ from agno.agent import Agent
|
|
|
9
9
|
from agno.media import AudioArtifact
|
|
10
10
|
from agno.team.team import Team
|
|
11
11
|
from agno.tools import Toolkit
|
|
12
|
+
from agno.tools.function import ToolResult
|
|
12
13
|
from agno.utils.log import logger
|
|
13
14
|
|
|
14
15
|
try:
|
|
@@ -39,6 +40,10 @@ class ElevenLabsTools(Toolkit):
|
|
|
39
40
|
target_directory: Optional[str] = None,
|
|
40
41
|
model_id: str = "eleven_multilingual_v2",
|
|
41
42
|
output_format: ElevenLabsAudioOutputFormat = "mp3_44100_64",
|
|
43
|
+
enable_get_voices: bool = True,
|
|
44
|
+
enable_generate_sound_effect: bool = True,
|
|
45
|
+
enable_text_to_speech: bool = True,
|
|
46
|
+
all: bool = False,
|
|
42
47
|
**kwargs,
|
|
43
48
|
):
|
|
44
49
|
self.api_key = api_key or getenv("ELEVEN_LABS_API_KEY")
|
|
@@ -57,10 +62,12 @@ class ElevenLabsTools(Toolkit):
|
|
|
57
62
|
self.eleven_labs_client = ElevenLabs(api_key=self.api_key)
|
|
58
63
|
|
|
59
64
|
tools: List[Any] = []
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
65
|
+
if all or enable_get_voices:
|
|
66
|
+
tools.append(self.get_voices)
|
|
67
|
+
if all or enable_generate_sound_effect:
|
|
68
|
+
tools.append(self.generate_sound_effect)
|
|
69
|
+
if all or enable_text_to_speech:
|
|
70
|
+
tools.append(self.text_to_speech)
|
|
64
71
|
|
|
65
72
|
super().__init__(name="elevenlabs_tools", tools=tools, **kwargs)
|
|
66
73
|
|
|
@@ -122,9 +129,7 @@ class ElevenLabsTools(Toolkit):
|
|
|
122
129
|
|
|
123
130
|
return base64_audio
|
|
124
131
|
|
|
125
|
-
def generate_sound_effect(
|
|
126
|
-
self, agent: Union[Agent, Team], prompt: str, duration_seconds: Optional[float] = None
|
|
127
|
-
) -> str:
|
|
132
|
+
def generate_sound_effect(self, prompt: str, duration_seconds: Optional[float] = None) -> ToolResult:
|
|
128
133
|
"""
|
|
129
134
|
Use this function to generate sound effect audio from a text prompt.
|
|
130
135
|
|
|
@@ -132,7 +137,7 @@ class ElevenLabsTools(Toolkit):
|
|
|
132
137
|
prompt (str): Text to generate audio from.
|
|
133
138
|
duration_seconds (Optional[float]): Duration in seconds to generate audio from. Has to be between 0.5 and 22.
|
|
134
139
|
Returns:
|
|
135
|
-
|
|
140
|
+
ToolResult: A ToolResult containing the generated audio or error message.
|
|
136
141
|
"""
|
|
137
142
|
try:
|
|
138
143
|
audio_generator = self.eleven_labs_client.text_to_sound_effects.convert(
|
|
@@ -141,29 +146,30 @@ class ElevenLabsTools(Toolkit):
|
|
|
141
146
|
|
|
142
147
|
base64_audio = self._process_audio(audio_generator)
|
|
143
148
|
|
|
144
|
-
#
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
mime_type="audio/mpeg",
|
|
150
|
-
)
|
|
149
|
+
# Create AudioArtifact
|
|
150
|
+
audio_artifact = AudioArtifact(
|
|
151
|
+
id=str(uuid4()),
|
|
152
|
+
base64_audio=base64_audio,
|
|
153
|
+
mime_type="audio/mpeg",
|
|
151
154
|
)
|
|
152
155
|
|
|
153
|
-
return
|
|
156
|
+
return ToolResult(
|
|
157
|
+
content="Audio generated successfully",
|
|
158
|
+
audios=[audio_artifact],
|
|
159
|
+
)
|
|
154
160
|
|
|
155
161
|
except Exception as e:
|
|
156
162
|
logger.error(f"Failed to generate audio: {e}")
|
|
157
|
-
return f"Error: {e}"
|
|
163
|
+
return ToolResult(content=f"Error: {e}")
|
|
158
164
|
|
|
159
|
-
def text_to_speech(self, agent: Union[Agent, Team], prompt: str) ->
|
|
165
|
+
def text_to_speech(self, agent: Union[Agent, Team], prompt: str) -> ToolResult:
|
|
160
166
|
"""
|
|
161
167
|
Use this function to convert text to speech audio.
|
|
162
168
|
|
|
163
169
|
Args:
|
|
164
170
|
prompt (str): Text to generate audio from.
|
|
165
171
|
Returns:
|
|
166
|
-
|
|
172
|
+
ToolResult: A ToolResult containing the generated audio or error message.
|
|
167
173
|
"""
|
|
168
174
|
try:
|
|
169
175
|
audio_generator = self.eleven_labs_client.text_to_speech.convert(
|
|
@@ -175,17 +181,18 @@ class ElevenLabsTools(Toolkit):
|
|
|
175
181
|
|
|
176
182
|
base64_audio = self._process_audio(audio_generator)
|
|
177
183
|
|
|
178
|
-
#
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
mime_type="audio/mpeg",
|
|
184
|
-
)
|
|
184
|
+
# Create AudioArtifact
|
|
185
|
+
audio_artifact = AudioArtifact(
|
|
186
|
+
id=str(uuid4()),
|
|
187
|
+
base64_audio=base64_audio,
|
|
188
|
+
mime_type="audio/mpeg",
|
|
185
189
|
)
|
|
186
190
|
|
|
187
|
-
return
|
|
191
|
+
return ToolResult(
|
|
192
|
+
content="Audio generated successfully",
|
|
193
|
+
audios=[audio_artifact],
|
|
194
|
+
)
|
|
188
195
|
|
|
189
196
|
except Exception as e:
|
|
190
197
|
logger.error(f"Failed to generate audio: {e}")
|
|
191
|
-
return f"Error: {e}"
|
|
198
|
+
return ToolResult(content=f"Error: {e}")
|
agno/tools/email.py
CHANGED
|
@@ -11,6 +11,8 @@ class EmailTools(Toolkit):
|
|
|
11
11
|
sender_name: Optional[str] = None,
|
|
12
12
|
sender_email: Optional[str] = None,
|
|
13
13
|
sender_passkey: Optional[str] = None,
|
|
14
|
+
enable_email_user: bool = True,
|
|
15
|
+
all: bool = False,
|
|
14
16
|
**kwargs,
|
|
15
17
|
):
|
|
16
18
|
self.receiver_email: Optional[str] = receiver_email
|
|
@@ -19,7 +21,8 @@ class EmailTools(Toolkit):
|
|
|
19
21
|
self.sender_passkey: Optional[str] = sender_passkey
|
|
20
22
|
|
|
21
23
|
tools = []
|
|
22
|
-
|
|
24
|
+
if all or enable_email_user:
|
|
25
|
+
tools.append(self.email_user)
|
|
23
26
|
|
|
24
27
|
# Call superclass with tools list
|
|
25
28
|
super().__init__(name="email_tools", tools=tools, **kwargs)
|
agno/tools/evm.py
CHANGED
|
@@ -21,6 +21,8 @@ class EvmTools(Toolkit):
|
|
|
21
21
|
self,
|
|
22
22
|
private_key: Optional[str] = None,
|
|
23
23
|
rpc_url: Optional[str] = None,
|
|
24
|
+
enable_send_transaction: bool = True,
|
|
25
|
+
all: bool = False,
|
|
24
26
|
**kwargs,
|
|
25
27
|
):
|
|
26
28
|
"""Initialize EVM tools for blockchain interactions.
|
|
@@ -50,7 +52,11 @@ class EvmTools(Toolkit):
|
|
|
50
52
|
self.account: "LocalAccount" = self.web3_client.eth.account.from_key(self.private_key)
|
|
51
53
|
log_debug(f"Your wallet address is: {self.account.address}")
|
|
52
54
|
|
|
53
|
-
|
|
55
|
+
tools = []
|
|
56
|
+
if all or enable_send_transaction:
|
|
57
|
+
tools.append(self.send_transaction)
|
|
58
|
+
|
|
59
|
+
super().__init__(name="evm_tools", tools=tools, **kwargs)
|
|
54
60
|
|
|
55
61
|
def get_max_priority_fee_per_gas(self) -> int:
|
|
56
62
|
"""Get the max priority fee per gas for the transaction.
|
agno/tools/exa.py
CHANGED
|
@@ -19,11 +19,15 @@ class ExaTools(Toolkit):
|
|
|
19
19
|
functionalities to perform categorized searches and retrieve structured results.
|
|
20
20
|
|
|
21
21
|
Args:
|
|
22
|
+
enable_search (bool): Enable search functionality. Default is True.
|
|
23
|
+
enable_get_contents (bool): Enable get contents functionality. Default is True.
|
|
24
|
+
enable_find_similar (bool): Enable find similar functionality. Default is True.
|
|
25
|
+
enable_answer (bool): Enable answer generation. Default is True.
|
|
26
|
+
enable_research (bool): Enable research tool functionality. Default is False.
|
|
27
|
+
all (bool): Enable all tools. Overrides individual flags when True. Default is False.
|
|
22
28
|
text (bool): Retrieve text content from results. Default is True.
|
|
23
29
|
text_length_limit (int): Max length of text content per result. Default is 1000.
|
|
24
30
|
highlights (bool): Include highlighted snippets. Default is True.
|
|
25
|
-
answer (bool): Enable answer generation. Default is True.
|
|
26
|
-
research (bool): Enable research tool functionality. Default is True.
|
|
27
31
|
api_key (Optional[str]): Exa API key. Retrieved from `EXA_API_KEY` env variable if not provided.
|
|
28
32
|
num_results (Optional[int]): Default number of search results. Overrides individual searches if set.
|
|
29
33
|
start_crawl_date (Optional[str]): Include results crawled on/after this date (`YYYY-MM-DD`).
|
|
@@ -42,11 +46,12 @@ class ExaTools(Toolkit):
|
|
|
42
46
|
|
|
43
47
|
def __init__(
|
|
44
48
|
self,
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
49
|
+
enable_search: bool = True,
|
|
50
|
+
enable_get_contents: bool = True,
|
|
51
|
+
enable_find_similar: bool = True,
|
|
52
|
+
enable_answer: bool = True,
|
|
53
|
+
enable_research: bool = False,
|
|
54
|
+
all: bool = False,
|
|
50
55
|
text: bool = True,
|
|
51
56
|
text_length_limit: int = 1000,
|
|
52
57
|
highlights: bool = True,
|
|
@@ -96,15 +101,15 @@ class ExaTools(Toolkit):
|
|
|
96
101
|
self.research_model: Literal["exa-research", "exa-research-pro"] = research_model
|
|
97
102
|
|
|
98
103
|
tools: List[Any] = []
|
|
99
|
-
if
|
|
104
|
+
if all or enable_search:
|
|
100
105
|
tools.append(self.search_exa)
|
|
101
|
-
if
|
|
106
|
+
if all or enable_get_contents:
|
|
102
107
|
tools.append(self.get_contents)
|
|
103
|
-
if
|
|
108
|
+
if all or enable_find_similar:
|
|
104
109
|
tools.append(self.find_similar)
|
|
105
|
-
if
|
|
110
|
+
if all or enable_answer:
|
|
106
111
|
tools.append(self.exa_answer)
|
|
107
|
-
if
|
|
112
|
+
if all or enable_research:
|
|
108
113
|
tools.append(self.research)
|
|
109
114
|
|
|
110
115
|
super().__init__(name="exa", tools=tools, **kwargs)
|
|
@@ -353,14 +358,14 @@ class ExaTools(Toolkit):
|
|
|
353
358
|
else:
|
|
354
359
|
task_kwargs["output_infer_schema"] = True
|
|
355
360
|
|
|
356
|
-
task_result = self._execute_with_timeout(self.exa.research.create_task, **task_kwargs)
|
|
361
|
+
task_result = self._execute_with_timeout(self.exa.research.create_task, **task_kwargs) # type: ignore
|
|
357
362
|
task_id = task_result.id
|
|
358
363
|
|
|
359
364
|
if self.show_results:
|
|
360
365
|
log_info(f"Research task created with ID: {task_id}")
|
|
361
366
|
|
|
362
367
|
# Step 2: Poll until complete (using default polling settings)
|
|
363
|
-
task = self.exa.research.poll_task(task_id)
|
|
368
|
+
task = self.exa.research.poll_task(task_id) # type: ignore
|
|
364
369
|
|
|
365
370
|
# Step 3: Format and return results
|
|
366
371
|
result: Dict[str, Any] = {"data": task.data, "citations": {}}
|
agno/tools/fal.py
CHANGED
|
@@ -10,6 +10,7 @@ from agno.agent import Agent
|
|
|
10
10
|
from agno.media import ImageArtifact, VideoArtifact
|
|
11
11
|
from agno.team.team import Team
|
|
12
12
|
from agno.tools import Toolkit
|
|
13
|
+
from agno.tools.function import ToolResult
|
|
13
14
|
from agno.utils.log import log_info, logger
|
|
14
15
|
|
|
15
16
|
try:
|
|
@@ -23,16 +24,22 @@ class FalTools(Toolkit):
|
|
|
23
24
|
self,
|
|
24
25
|
api_key: Optional[str] = None,
|
|
25
26
|
model: str = "fal-ai/hunyuan-video",
|
|
27
|
+
enable_generate_media: bool = True,
|
|
28
|
+
enable_image_to_image: bool = False,
|
|
29
|
+
all: bool = False,
|
|
26
30
|
**kwargs,
|
|
27
31
|
):
|
|
28
|
-
self.api_key = api_key or getenv("
|
|
32
|
+
self.api_key = api_key or getenv("FAL_API_KEY")
|
|
29
33
|
if not self.api_key:
|
|
30
|
-
logger.error("
|
|
34
|
+
logger.error("FAL_API_KEY not set. Please set the FAL_API_KEY environment variable.")
|
|
31
35
|
self.model = model
|
|
32
36
|
self.seen_logs: set[str] = set()
|
|
33
37
|
|
|
34
38
|
tools = []
|
|
35
|
-
|
|
39
|
+
if all or enable_generate_media:
|
|
40
|
+
tools.append(self.generate_media)
|
|
41
|
+
if all or enable_image_to_image:
|
|
42
|
+
tools.append(self.image_to_image)
|
|
36
43
|
|
|
37
44
|
super().__init__(name="fal-tools", tools=tools, **kwargs)
|
|
38
45
|
|
|
@@ -44,14 +51,14 @@ class FalTools(Toolkit):
|
|
|
44
51
|
log_info(message)
|
|
45
52
|
self.seen_logs.add(message)
|
|
46
53
|
|
|
47
|
-
def generate_media(self, agent: Union[Agent, Team], prompt: str) ->
|
|
54
|
+
def generate_media(self, agent: Union[Agent, Team], prompt: str) -> ToolResult:
|
|
48
55
|
"""
|
|
49
56
|
Use this function to run a model with a given prompt.
|
|
50
57
|
|
|
51
58
|
Args:
|
|
52
59
|
prompt (str): A text description of the task.
|
|
53
60
|
Returns:
|
|
54
|
-
|
|
61
|
+
ToolResult: Contains the generated media and success message.
|
|
55
62
|
"""
|
|
56
63
|
try:
|
|
57
64
|
result = fal_client.subscribe(
|
|
@@ -65,32 +72,27 @@ class FalTools(Toolkit):
|
|
|
65
72
|
|
|
66
73
|
if "image" in result:
|
|
67
74
|
url = result.get("image", {}).get("url", "")
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
url=url,
|
|
72
|
-
)
|
|
75
|
+
image_artifact = ImageArtifact(
|
|
76
|
+
id=media_id,
|
|
77
|
+
url=url,
|
|
73
78
|
)
|
|
74
|
-
|
|
79
|
+
return ToolResult(content=f"Image generated successfully at {url}", images=[image_artifact])
|
|
75
80
|
elif "video" in result:
|
|
76
81
|
url = result.get("video", {}).get("url", "")
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
url=url,
|
|
81
|
-
)
|
|
82
|
+
video_artifact = VideoArtifact(
|
|
83
|
+
id=media_id,
|
|
84
|
+
url=url,
|
|
82
85
|
)
|
|
83
|
-
|
|
86
|
+
return ToolResult(content=f"Video generated successfully at {url}", videos=[video_artifact])
|
|
84
87
|
else:
|
|
85
88
|
logger.error(f"Unsupported type in result: {result}")
|
|
86
|
-
return f"Unsupported type in result: {result}"
|
|
89
|
+
return ToolResult(content=f"Unsupported type in result: {result}")
|
|
87
90
|
|
|
88
|
-
return f"{media_type.capitalize()} generated successfully at {url}"
|
|
89
91
|
except Exception as e:
|
|
90
92
|
logger.error(f"Failed to run model: {e}")
|
|
91
|
-
return f"Error: {e}"
|
|
93
|
+
return ToolResult(content=f"Error: {e}")
|
|
92
94
|
|
|
93
|
-
def image_to_image(self, agent: Union[Agent, Team], prompt: str, image_url: Optional[str] = None) ->
|
|
95
|
+
def image_to_image(self, agent: Union[Agent, Team], prompt: str, image_url: Optional[str] = None) -> ToolResult:
|
|
94
96
|
"""
|
|
95
97
|
Use this function to transform an input image based on a text prompt using the Fal AI image-to-image model.
|
|
96
98
|
The model takes an existing image and generates a new version modified according to your prompt.
|
|
@@ -101,7 +103,7 @@ class FalTools(Toolkit):
|
|
|
101
103
|
image_url (str): The URL of the image to use for the generation.
|
|
102
104
|
|
|
103
105
|
Returns:
|
|
104
|
-
|
|
106
|
+
ToolResult: Contains the generated image and success message.
|
|
105
107
|
"""
|
|
106
108
|
|
|
107
109
|
try:
|
|
@@ -113,15 +115,13 @@ class FalTools(Toolkit):
|
|
|
113
115
|
)
|
|
114
116
|
url = result.get("images", [{}])[0].get("url", "")
|
|
115
117
|
media_id = str(uuid4())
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
url=url,
|
|
120
|
-
)
|
|
118
|
+
image_artifact = ImageArtifact(
|
|
119
|
+
id=media_id,
|
|
120
|
+
url=url,
|
|
121
121
|
)
|
|
122
122
|
|
|
123
|
-
return f"Image generated successfully at {url}"
|
|
123
|
+
return ToolResult(content=f"Image generated successfully at {url}", images=[image_artifact])
|
|
124
124
|
|
|
125
125
|
except Exception as e:
|
|
126
126
|
logger.error(f"Failed to generate image: {e}")
|
|
127
|
-
return f"Error: {e}"
|
|
127
|
+
return ToolResult(content=f"Error: {e}")
|