agno 1.8.1__py3-none-any.whl → 2.0.0__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 +3143 -4170
- agno/api/agent.py +11 -67
- agno/api/api.py +5 -46
- agno/api/evals.py +8 -19
- 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 +11 -66
- 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 +1743 -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 +1432 -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 +882 -0
- agno/db/in_memory/utils.py +172 -0
- agno/db/json/__init__.py +3 -0
- agno/db/json/json_db.py +1045 -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 +1416 -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 +297 -0
- agno/db/postgres/__init__.py +3 -0
- agno/db/postgres/postgres.py +1710 -0
- agno/db/postgres/schemas.py +124 -0
- agno/db/postgres/utils.py +280 -0
- agno/db/redis/__init__.py +3 -0
- agno/db/redis/redis.py +1367 -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 +1712 -0
- agno/db/singlestore/utils.py +326 -0
- agno/db/sqlite/__init__.py +3 -0
- agno/db/sqlite/schemas.py +119 -0
- agno/db/sqlite/sqlite.py +1676 -0
- agno/db/sqlite/utils.py +268 -0
- agno/db/utils.py +88 -0
- agno/eval/__init__.py +14 -0
- agno/eval/accuracy.py +154 -48
- 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 +15 -11
- 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 +1551 -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 +47 -65
- agno/knowledge/reader/docx_reader.py +83 -0
- agno/{document → knowledge}/reader/firecrawl_reader.py +42 -21
- agno/{document → knowledge}/reader/json_reader.py +30 -9
- agno/{document → knowledge}/reader/markdown_reader.py +58 -9
- agno/{document → knowledge}/reader/pdf_reader.py +71 -126
- agno/knowledge/reader/reader_factory.py +268 -0
- agno/knowledge/reader/s3_reader.py +101 -0
- agno/{document → knowledge}/reader/text_reader.py +31 -10
- agno/knowledge/reader/url_reader.py +128 -0
- agno/knowledge/reader/web_search_reader.py +366 -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 +269 -268
- 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 +131 -131
- agno/models/aws/bedrock.py +110 -182
- agno/models/aws/claude.py +64 -18
- agno/models/azure/ai_foundry.py +73 -23
- agno/models/base.py +346 -290
- agno/models/cerebras/cerebras.py +84 -27
- agno/models/cohere/chat.py +106 -98
- agno/models/google/gemini.py +105 -46
- 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 +46 -151
- 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 +85 -47
- agno/models/openai/chat.py +154 -37
- 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 +15 -9
- 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 +497 -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 +77 -33
- 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 +32 -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 +29 -0
- agno/os/mcp.py +235 -0
- agno/os/router.py +1400 -0
- agno/os/routers/__init__.py +3 -0
- agno/os/routers/evals/__init__.py +3 -0
- agno/os/routers/evals/evals.py +393 -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 +850 -0
- agno/os/routers/knowledge/schemas.py +118 -0
- agno/os/routers/memory/__init__.py +3 -0
- agno/os/routers/memory/memory.py +410 -0
- agno/os/routers/memory/schemas.py +58 -0
- agno/os/routers/metrics/__init__.py +3 -0
- agno/os/routers/metrics/metrics.py +178 -0
- agno/os/routers/metrics/schemas.py +47 -0
- agno/os/routers/session/__init__.py +3 -0
- agno/os/routers/session/session.py +536 -0
- agno/os/schema.py +945 -0
- agno/{app/playground → os}/settings.py +7 -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/agent.py +633 -0
- agno/run/base.py +53 -77
- agno/run/cancel.py +81 -0
- agno/run/team.py +243 -96
- agno/run/workflow.py +550 -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 +3260 -4824
- 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 +43 -23
- agno/tools/browserbase.py +13 -4
- agno/tools/calcom.py +12 -10
- agno/tools/calculator.py +10 -27
- agno/tools/cartesia.py +20 -17
- 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 +22 -12
- agno/tools/daytona.py +13 -16
- agno/tools/decorator.py +6 -3
- agno/tools/desi_vocal.py +17 -8
- 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 +36 -29
- agno/tools/email.py +4 -1
- agno/tools/evm.py +7 -1
- agno/tools/exa.py +19 -14
- agno/tools/fal.py +30 -30
- agno/tools/file.py +9 -8
- agno/tools/financial_datasets.py +25 -44
- agno/tools/firecrawl.py +22 -22
- agno/tools/function.py +127 -18
- agno/tools/giphy.py +23 -11
- 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 +19 -34
- agno/tools/linkup.py +5 -1
- agno/tools/local_file_system.py +8 -5
- agno/tools/lumalab.py +32 -20
- agno/tools/mcp.py +1 -2
- 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 +33 -15
- agno/tools/models/gemini.py +59 -32
- agno/tools/models/groq.py +30 -23
- agno/tools/models/nebius.py +28 -12
- agno/tools/models_labs.py +40 -16
- 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 +58 -32
- agno/tools/openbb.py +12 -11
- agno/tools/opencv.py +63 -47
- 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 +55 -42
- 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 +100 -123
- agno/utils/gemini.py +32 -2
- agno/utils/knowledge.py +29 -0
- agno/utils/log.py +54 -4
- agno/utils/mcp.py +68 -10
- agno/utils/media.py +39 -0
- agno/utils/message.py +12 -1
- agno/utils/models/aws_claude.py +1 -1
- agno/utils/models/claude.py +47 -4
- agno/utils/models/cohere.py +1 -1
- agno/utils/models/mistral.py +8 -7
- agno/utils/models/schema_utils.py +3 -3
- agno/utils/models/watsonx.py +1 -1
- agno/utils/openai.py +1 -1
- agno/utils/pprint.py +33 -32
- agno/utils/print_response/agent.py +779 -0
- agno/utils/print_response/team.py +1669 -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/streamlit.py +481 -0
- 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} +207 -49
- agno/workflow/{v2/steps.py → steps.py} +147 -66
- agno/workflow/types.py +482 -0
- agno/workflow/workflow.py +2410 -696
- agno-2.0.0.dist-info/METADATA +494 -0
- agno-2.0.0.dist-info/RECORD +515 -0
- agno-2.0.0.dist-info/licenses/LICENSE +201 -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/response.py +0 -467
- 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-1.8.1.dist-info/licenses/LICENSE +0 -375
- /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.0.dist-info}/WHEEL +0 -0
- {agno-1.8.1.dist-info → agno-2.0.0.dist-info}/top_level.txt +0 -0
agno/tools/duckdb.py
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
from pathlib import Path
|
|
1
2
|
from typing import Any, Dict, List, Optional, Tuple
|
|
2
3
|
|
|
3
4
|
from agno.tools import Toolkit
|
|
@@ -17,11 +18,6 @@ class DuckDbTools(Toolkit):
|
|
|
17
18
|
init_commands: Optional[List] = None,
|
|
18
19
|
read_only: bool = False,
|
|
19
20
|
config: Optional[dict] = None,
|
|
20
|
-
run_queries: bool = True,
|
|
21
|
-
inspect_queries: bool = False,
|
|
22
|
-
create_tables: bool = True,
|
|
23
|
-
summarize_tables: bool = True,
|
|
24
|
-
export_tables: bool = False,
|
|
25
21
|
**kwargs,
|
|
26
22
|
):
|
|
27
23
|
self.db_path: Optional[str] = db_path
|
|
@@ -30,26 +26,21 @@ class DuckDbTools(Toolkit):
|
|
|
30
26
|
self._connection: Optional[duckdb.DuckDBPyConnection] = connection
|
|
31
27
|
self.init_commands: Optional[List] = init_commands
|
|
32
28
|
|
|
33
|
-
tools: List[Any] = [
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
tools.append(self.load_local_csv_to_table)
|
|
49
|
-
tools.append(self.load_s3_path_to_table)
|
|
50
|
-
tools.append(self.load_s3_csv_to_table)
|
|
51
|
-
tools.append(self.create_fts_index)
|
|
52
|
-
tools.append(self.full_text_search)
|
|
29
|
+
tools: List[Any] = [
|
|
30
|
+
self.show_tables,
|
|
31
|
+
self.describe_table,
|
|
32
|
+
self.inspect_query,
|
|
33
|
+
self.run_query,
|
|
34
|
+
self.create_table_from_path,
|
|
35
|
+
self.summarize_table,
|
|
36
|
+
self.export_table_to_path,
|
|
37
|
+
self.load_local_path_to_table,
|
|
38
|
+
self.load_local_csv_to_table,
|
|
39
|
+
self.load_s3_path_to_table,
|
|
40
|
+
self.load_s3_csv_to_table,
|
|
41
|
+
self.create_fts_index,
|
|
42
|
+
self.full_text_search,
|
|
43
|
+
]
|
|
53
44
|
|
|
54
45
|
super().__init__(name="duckdb_tools", tools=tools, **kwargs)
|
|
55
46
|
|
|
@@ -177,12 +168,10 @@ class DuckDbTools(Toolkit):
|
|
|
177
168
|
:param path: Path to get the table name from
|
|
178
169
|
:return: Table name
|
|
179
170
|
"""
|
|
180
|
-
import os
|
|
181
|
-
|
|
182
171
|
# Get the file name from the path
|
|
183
|
-
|
|
172
|
+
path_obj = Path(path)
|
|
184
173
|
# Get the file name without extension from the path
|
|
185
|
-
table
|
|
174
|
+
table = path_obj.stem
|
|
186
175
|
# If the table isn't a valid SQL identifier, we'll need to use something else
|
|
187
176
|
table = table.replace("-", "_").replace(".", "_").replace(" ", "_").replace("/", "_")
|
|
188
177
|
|
|
@@ -246,15 +235,13 @@ class DuckDbTools(Toolkit):
|
|
|
246
235
|
:param table: Optional table name to use
|
|
247
236
|
:return: Table name, SQL statement used to load the file
|
|
248
237
|
"""
|
|
249
|
-
import os
|
|
250
|
-
|
|
251
238
|
log_debug(f"Loading {path} into duckdb")
|
|
252
239
|
|
|
253
240
|
if table is None:
|
|
254
|
-
# Get the file name from the
|
|
255
|
-
|
|
256
|
-
# Get the file name without extension from the
|
|
257
|
-
table
|
|
241
|
+
# Get the file name from the path
|
|
242
|
+
path_obj = Path(path)
|
|
243
|
+
# Get the file name without extension from the path
|
|
244
|
+
table = path_obj.stem
|
|
258
245
|
# If the table isn't a valid SQL identifier, we'll need to use something else
|
|
259
246
|
table = table.replace("-", "_").replace(".", "_").replace(" ", "_").replace("/", "_")
|
|
260
247
|
|
|
@@ -274,15 +261,13 @@ class DuckDbTools(Toolkit):
|
|
|
274
261
|
:param delimiter: Optional delimiter to use
|
|
275
262
|
:return: Table name, SQL statement used to load the file
|
|
276
263
|
"""
|
|
277
|
-
import os
|
|
278
|
-
|
|
279
264
|
log_debug(f"Loading {path} into duckdb")
|
|
280
265
|
|
|
281
266
|
if table is None:
|
|
282
|
-
# Get the file name from the
|
|
283
|
-
|
|
284
|
-
# Get the file name without extension from the
|
|
285
|
-
table
|
|
267
|
+
# Get the file name from the path
|
|
268
|
+
path_obj = Path(path)
|
|
269
|
+
# Get the file name without extension from the path
|
|
270
|
+
table = path_obj.stem
|
|
286
271
|
# If the table isn't a valid SQL identifier, we'll need to use something else
|
|
287
272
|
table = table.replace("-", "_").replace(".", "_").replace(" ", "_").replace("/", "_")
|
|
288
273
|
|
|
@@ -305,15 +290,13 @@ class DuckDbTools(Toolkit):
|
|
|
305
290
|
:param table: Optional table name to use
|
|
306
291
|
:return: Table name, SQL statement used to load the file
|
|
307
292
|
"""
|
|
308
|
-
import os
|
|
309
|
-
|
|
310
293
|
log_debug(f"Loading {path} into duckdb")
|
|
311
294
|
|
|
312
295
|
if table is None:
|
|
313
|
-
# Get the file name from the
|
|
314
|
-
|
|
315
|
-
# Get the file name without extension from the
|
|
316
|
-
table
|
|
296
|
+
# Get the file name from the path
|
|
297
|
+
path_obj = Path(path)
|
|
298
|
+
# Get the file name without extension from the path
|
|
299
|
+
table = path_obj.stem
|
|
317
300
|
# If the table isn't a valid SQL identifier, we'll need to use something else
|
|
318
301
|
table = table.replace("-", "_").replace(".", "_").replace(" ", "_").replace("/", "_")
|
|
319
302
|
|
|
@@ -332,15 +315,13 @@ class DuckDbTools(Toolkit):
|
|
|
332
315
|
:param table: Optional table name to use
|
|
333
316
|
:return: Table name, SQL statement used to load the file
|
|
334
317
|
"""
|
|
335
|
-
import os
|
|
336
|
-
|
|
337
318
|
log_debug(f"Loading {path} into duckdb")
|
|
338
319
|
|
|
339
320
|
if table is None:
|
|
340
|
-
# Get the file name from the
|
|
341
|
-
|
|
342
|
-
# Get the file name without extension from the
|
|
343
|
-
table
|
|
321
|
+
# Get the file name from the path
|
|
322
|
+
path_obj = Path(path)
|
|
323
|
+
# Get the file name without extension from the path
|
|
324
|
+
table = path_obj.stem
|
|
344
325
|
# If the table isn't a valid SQL identifier, we'll need to use something else
|
|
345
326
|
table = table.replace("-", "_").replace(".", "_").replace(" ", "_").replace("/", "_")
|
|
346
327
|
|
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
|
@@ -8,9 +8,10 @@ from typing import Any, Callable, Dict, List, Optional, Union
|
|
|
8
8
|
from uuid import uuid4
|
|
9
9
|
|
|
10
10
|
from agno.agent import Agent
|
|
11
|
-
from agno.media import
|
|
11
|
+
from agno.media import Image
|
|
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
|
|
164
|
+
Add a PNG image result from the last code execution as an Image object.
|
|
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 Image object
|
|
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 = Image(
|
|
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 Image object
|
|
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 = Image(
|
|
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
|
@@ -6,9 +6,10 @@ from typing import Any, Iterator, List, Literal, Optional, Union
|
|
|
6
6
|
from uuid import uuid4
|
|
7
7
|
|
|
8
8
|
from agno.agent import Agent
|
|
9
|
-
from agno.media import
|
|
9
|
+
from agno.media import Audio
|
|
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 = Audio(
|
|
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 = Audio(
|
|
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.
|