agno 1.8.0__py3-none-any.whl → 2.0.0a1__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- agno/__init__.py +8 -0
- agno/agent/__init__.py +19 -27
- agno/agent/agent.py +2781 -4126
- agno/api/agent.py +9 -65
- agno/api/api.py +5 -46
- agno/api/evals.py +6 -17
- agno/api/os.py +17 -0
- agno/api/routes.py +6 -41
- agno/api/schemas/__init__.py +9 -0
- agno/api/schemas/agent.py +5 -21
- agno/api/schemas/evals.py +7 -16
- agno/api/schemas/os.py +14 -0
- agno/api/schemas/team.py +5 -21
- agno/api/schemas/utils.py +21 -0
- agno/api/schemas/workflows.py +11 -7
- agno/api/settings.py +53 -0
- agno/api/team.py +9 -64
- agno/api/workflow.py +28 -0
- agno/cloud/aws/base.py +214 -0
- agno/cloud/aws/s3/__init__.py +2 -0
- agno/cloud/aws/s3/api_client.py +43 -0
- agno/cloud/aws/s3/bucket.py +195 -0
- agno/cloud/aws/s3/object.py +57 -0
- agno/db/__init__.py +24 -0
- agno/db/base.py +245 -0
- agno/db/dynamo/__init__.py +3 -0
- agno/db/dynamo/dynamo.py +1749 -0
- agno/db/dynamo/schemas.py +278 -0
- agno/db/dynamo/utils.py +684 -0
- agno/db/firestore/__init__.py +3 -0
- agno/db/firestore/firestore.py +1438 -0
- agno/db/firestore/schemas.py +130 -0
- agno/db/firestore/utils.py +278 -0
- agno/db/gcs_json/__init__.py +3 -0
- agno/db/gcs_json/gcs_json_db.py +1001 -0
- agno/db/gcs_json/utils.py +194 -0
- agno/db/in_memory/__init__.py +3 -0
- agno/db/in_memory/in_memory_db.py +888 -0
- agno/db/in_memory/utils.py +172 -0
- agno/db/json/__init__.py +3 -0
- agno/db/json/json_db.py +1051 -0
- agno/db/json/utils.py +196 -0
- agno/db/migrations/v1_to_v2.py +162 -0
- agno/db/mongo/__init__.py +3 -0
- agno/db/mongo/mongo.py +1417 -0
- agno/db/mongo/schemas.py +77 -0
- agno/db/mongo/utils.py +204 -0
- agno/db/mysql/__init__.py +3 -0
- agno/db/mysql/mysql.py +1719 -0
- agno/db/mysql/schemas.py +124 -0
- agno/db/mysql/utils.py +298 -0
- agno/db/postgres/__init__.py +3 -0
- agno/db/postgres/postgres.py +1720 -0
- agno/db/postgres/schemas.py +124 -0
- agno/db/postgres/utils.py +281 -0
- agno/db/redis/__init__.py +3 -0
- agno/db/redis/redis.py +1371 -0
- agno/db/redis/schemas.py +109 -0
- agno/db/redis/utils.py +288 -0
- agno/db/schemas/__init__.py +3 -0
- agno/db/schemas/evals.py +33 -0
- agno/db/schemas/knowledge.py +40 -0
- agno/db/schemas/memory.py +46 -0
- agno/db/singlestore/__init__.py +3 -0
- agno/db/singlestore/schemas.py +116 -0
- agno/db/singlestore/singlestore.py +1722 -0
- agno/db/singlestore/utils.py +327 -0
- agno/db/sqlite/__init__.py +3 -0
- agno/db/sqlite/schemas.py +119 -0
- agno/db/sqlite/sqlite.py +1680 -0
- agno/db/sqlite/utils.py +269 -0
- agno/db/utils.py +88 -0
- agno/eval/__init__.py +14 -0
- agno/eval/accuracy.py +142 -43
- agno/eval/performance.py +88 -23
- agno/eval/reliability.py +73 -20
- agno/eval/utils.py +23 -13
- agno/integrations/discord/__init__.py +3 -0
- agno/{app → integrations}/discord/client.py +10 -10
- agno/knowledge/__init__.py +2 -2
- agno/{document → knowledge}/chunking/agentic.py +2 -2
- agno/{document → knowledge}/chunking/document.py +2 -2
- agno/{document → knowledge}/chunking/fixed.py +3 -3
- agno/{document → knowledge}/chunking/markdown.py +2 -2
- agno/{document → knowledge}/chunking/recursive.py +2 -2
- agno/{document → knowledge}/chunking/row.py +2 -2
- agno/knowledge/chunking/semantic.py +59 -0
- agno/knowledge/chunking/strategy.py +121 -0
- agno/knowledge/content.py +74 -0
- agno/knowledge/document/__init__.py +5 -0
- agno/{document → knowledge/document}/base.py +12 -2
- agno/knowledge/embedder/__init__.py +5 -0
- agno/{embedder → knowledge/embedder}/aws_bedrock.py +127 -1
- agno/{embedder → knowledge/embedder}/azure_openai.py +65 -1
- agno/{embedder → knowledge/embedder}/base.py +6 -0
- agno/{embedder → knowledge/embedder}/cohere.py +72 -1
- agno/{embedder → knowledge/embedder}/fastembed.py +17 -1
- agno/{embedder → knowledge/embedder}/fireworks.py +1 -1
- agno/{embedder → knowledge/embedder}/google.py +74 -1
- agno/{embedder → knowledge/embedder}/huggingface.py +36 -2
- agno/{embedder → knowledge/embedder}/jina.py +48 -2
- agno/knowledge/embedder/langdb.py +22 -0
- agno/knowledge/embedder/mistral.py +139 -0
- agno/{embedder → knowledge/embedder}/nebius.py +1 -1
- agno/{embedder → knowledge/embedder}/ollama.py +54 -3
- agno/knowledge/embedder/openai.py +223 -0
- agno/{embedder → knowledge/embedder}/sentence_transformer.py +16 -1
- agno/{embedder → knowledge/embedder}/together.py +1 -1
- agno/{embedder → knowledge/embedder}/voyageai.py +49 -1
- agno/knowledge/knowledge.py +1515 -0
- agno/knowledge/reader/__init__.py +7 -0
- agno/{document → knowledge}/reader/arxiv_reader.py +32 -4
- agno/knowledge/reader/base.py +88 -0
- agno/{document → knowledge}/reader/csv_reader.py +68 -15
- agno/knowledge/reader/docx_reader.py +83 -0
- agno/{document → knowledge}/reader/firecrawl_reader.py +42 -21
- agno/knowledge/reader/gcs_reader.py +67 -0
- agno/{document → knowledge}/reader/json_reader.py +30 -9
- agno/{document → knowledge}/reader/markdown_reader.py +36 -9
- agno/{document → knowledge}/reader/pdf_reader.py +79 -21
- agno/knowledge/reader/reader_factory.py +275 -0
- agno/knowledge/reader/s3_reader.py +171 -0
- agno/{document → knowledge}/reader/text_reader.py +31 -10
- agno/knowledge/reader/url_reader.py +84 -0
- agno/knowledge/reader/web_search_reader.py +389 -0
- agno/{document → knowledge}/reader/website_reader.py +37 -10
- agno/knowledge/reader/wikipedia_reader.py +59 -0
- agno/knowledge/reader/youtube_reader.py +78 -0
- agno/knowledge/remote_content/remote_content.py +88 -0
- agno/{reranker → knowledge/reranker}/base.py +1 -1
- agno/{reranker → knowledge/reranker}/cohere.py +2 -2
- agno/{reranker → knowledge/reranker}/infinity.py +2 -2
- agno/{reranker → knowledge/reranker}/sentence_transformer.py +2 -2
- agno/knowledge/types.py +30 -0
- agno/knowledge/utils.py +169 -0
- agno/media.py +2 -2
- agno/memory/__init__.py +2 -10
- agno/memory/manager.py +1003 -148
- agno/models/aimlapi/__init__.py +2 -2
- agno/models/aimlapi/aimlapi.py +6 -6
- agno/models/anthropic/claude.py +129 -82
- agno/models/aws/bedrock.py +107 -175
- agno/models/aws/claude.py +64 -18
- agno/models/azure/ai_foundry.py +73 -23
- agno/models/base.py +347 -287
- agno/models/cerebras/cerebras.py +84 -27
- agno/models/cohere/chat.py +106 -98
- agno/models/dashscope/dashscope.py +14 -5
- agno/models/google/gemini.py +123 -53
- agno/models/groq/groq.py +97 -35
- agno/models/huggingface/huggingface.py +92 -27
- agno/models/ibm/watsonx.py +72 -13
- agno/models/litellm/chat.py +85 -13
- agno/models/message.py +38 -144
- agno/models/meta/llama.py +85 -49
- agno/models/metrics.py +120 -0
- agno/models/mistral/mistral.py +90 -21
- agno/models/ollama/__init__.py +0 -2
- agno/models/ollama/chat.py +84 -46
- agno/models/openai/chat.py +135 -27
- agno/models/openai/responses.py +233 -115
- agno/models/perplexity/perplexity.py +26 -2
- agno/models/portkey/portkey.py +0 -7
- agno/models/response.py +14 -8
- agno/models/utils.py +20 -0
- agno/models/vercel/__init__.py +2 -2
- agno/models/vercel/v0.py +1 -1
- agno/models/vllm/__init__.py +2 -2
- agno/models/vllm/vllm.py +3 -3
- agno/models/xai/xai.py +10 -10
- agno/os/__init__.py +3 -0
- agno/os/app.py +393 -0
- agno/os/auth.py +47 -0
- agno/os/config.py +103 -0
- agno/os/interfaces/agui/__init__.py +3 -0
- agno/os/interfaces/agui/agui.py +31 -0
- agno/{app/agui/async_router.py → os/interfaces/agui/router.py} +16 -16
- agno/{app → os/interfaces}/agui/utils.py +65 -28
- agno/os/interfaces/base.py +21 -0
- agno/os/interfaces/slack/__init__.py +3 -0
- agno/{app/slack/async_router.py → os/interfaces/slack/router.py} +3 -5
- agno/os/interfaces/slack/slack.py +33 -0
- agno/os/interfaces/whatsapp/__init__.py +3 -0
- agno/{app/whatsapp/async_router.py → os/interfaces/whatsapp/router.py} +4 -7
- agno/os/interfaces/whatsapp/whatsapp.py +30 -0
- agno/os/router.py +843 -0
- agno/os/routers/__init__.py +3 -0
- agno/os/routers/evals/__init__.py +3 -0
- agno/os/routers/evals/evals.py +204 -0
- agno/os/routers/evals/schemas.py +142 -0
- agno/os/routers/evals/utils.py +161 -0
- agno/os/routers/knowledge/__init__.py +3 -0
- agno/os/routers/knowledge/knowledge.py +413 -0
- agno/os/routers/knowledge/schemas.py +118 -0
- agno/os/routers/memory/__init__.py +3 -0
- agno/os/routers/memory/memory.py +179 -0
- agno/os/routers/memory/schemas.py +58 -0
- agno/os/routers/metrics/__init__.py +3 -0
- agno/os/routers/metrics/metrics.py +58 -0
- agno/os/routers/metrics/schemas.py +47 -0
- agno/os/routers/session/__init__.py +3 -0
- agno/os/routers/session/session.py +163 -0
- agno/os/schema.py +892 -0
- agno/{app/playground → os}/settings.py +8 -15
- agno/os/utils.py +270 -0
- agno/reasoning/azure_ai_foundry.py +4 -4
- agno/reasoning/deepseek.py +4 -4
- agno/reasoning/default.py +6 -11
- agno/reasoning/groq.py +4 -4
- agno/reasoning/helpers.py +4 -6
- agno/reasoning/ollama.py +4 -4
- agno/reasoning/openai.py +4 -4
- agno/run/{response.py → agent.py} +144 -72
- agno/run/base.py +44 -58
- agno/run/cancel.py +83 -0
- agno/run/team.py +133 -77
- agno/run/workflow.py +537 -12
- agno/session/__init__.py +10 -0
- agno/session/agent.py +244 -0
- agno/session/summary.py +225 -0
- agno/session/team.py +262 -0
- agno/{storage/session/v2 → session}/workflow.py +47 -24
- agno/team/__init__.py +15 -16
- agno/team/team.py +2967 -4243
- agno/tools/agentql.py +14 -5
- agno/tools/airflow.py +9 -4
- agno/tools/api.py +7 -3
- agno/tools/apify.py +2 -46
- agno/tools/arxiv.py +8 -3
- agno/tools/aws_lambda.py +7 -5
- agno/tools/aws_ses.py +7 -1
- agno/tools/baidusearch.py +4 -1
- agno/tools/bitbucket.py +4 -4
- agno/tools/brandfetch.py +14 -11
- agno/tools/bravesearch.py +4 -1
- agno/tools/brightdata.py +42 -22
- agno/tools/browserbase.py +13 -4
- agno/tools/calcom.py +12 -10
- agno/tools/calculator.py +10 -27
- agno/tools/cartesia.py +18 -13
- agno/tools/{clickup_tool.py → clickup.py} +12 -25
- agno/tools/confluence.py +71 -18
- agno/tools/crawl4ai.py +7 -1
- agno/tools/csv_toolkit.py +9 -8
- agno/tools/dalle.py +18 -11
- agno/tools/daytona.py +13 -16
- agno/tools/decorator.py +6 -3
- agno/tools/desi_vocal.py +16 -7
- agno/tools/discord.py +11 -8
- agno/tools/docker.py +30 -42
- agno/tools/duckdb.py +34 -53
- agno/tools/duckduckgo.py +8 -7
- agno/tools/e2b.py +62 -62
- agno/tools/eleven_labs.py +35 -28
- agno/tools/email.py +4 -1
- agno/tools/evm.py +7 -1
- agno/tools/exa.py +19 -14
- agno/tools/fal.py +29 -29
- agno/tools/file.py +9 -8
- agno/tools/financial_datasets.py +25 -44
- agno/tools/firecrawl.py +22 -22
- agno/tools/function.py +68 -17
- agno/tools/giphy.py +22 -10
- agno/tools/github.py +48 -126
- agno/tools/gmail.py +46 -62
- agno/tools/google_bigquery.py +7 -6
- agno/tools/google_maps.py +11 -26
- agno/tools/googlesearch.py +7 -2
- agno/tools/googlesheets.py +21 -17
- agno/tools/hackernews.py +9 -5
- agno/tools/jina.py +5 -4
- agno/tools/jira.py +18 -9
- agno/tools/knowledge.py +31 -32
- agno/tools/linear.py +18 -33
- agno/tools/linkup.py +5 -1
- agno/tools/local_file_system.py +8 -5
- agno/tools/lumalab.py +31 -19
- agno/tools/mem0.py +18 -12
- agno/tools/memori.py +14 -10
- agno/tools/mlx_transcribe.py +3 -2
- agno/tools/models/azure_openai.py +32 -14
- agno/tools/models/gemini.py +58 -31
- agno/tools/models/groq.py +29 -20
- agno/tools/models/nebius.py +27 -11
- agno/tools/models_labs.py +39 -15
- agno/tools/moviepy_video.py +7 -6
- agno/tools/neo4j.py +134 -0
- agno/tools/newspaper.py +7 -2
- agno/tools/newspaper4k.py +8 -3
- agno/tools/openai.py +57 -26
- agno/tools/openbb.py +12 -11
- agno/tools/opencv.py +62 -46
- agno/tools/openweather.py +14 -12
- agno/tools/pandas.py +11 -3
- agno/tools/postgres.py +4 -12
- agno/tools/pubmed.py +4 -1
- agno/tools/python.py +9 -22
- agno/tools/reasoning.py +35 -27
- agno/tools/reddit.py +11 -26
- agno/tools/replicate.py +54 -41
- agno/tools/resend.py +4 -1
- agno/tools/scrapegraph.py +15 -14
- agno/tools/searxng.py +10 -23
- agno/tools/serpapi.py +6 -3
- agno/tools/serper.py +13 -4
- agno/tools/shell.py +9 -2
- agno/tools/slack.py +12 -11
- agno/tools/sleep.py +3 -2
- agno/tools/spider.py +24 -4
- agno/tools/sql.py +7 -6
- agno/tools/tavily.py +6 -4
- agno/tools/telegram.py +12 -4
- agno/tools/todoist.py +11 -31
- agno/tools/toolkit.py +1 -1
- agno/tools/trafilatura.py +22 -6
- agno/tools/trello.py +9 -22
- agno/tools/twilio.py +10 -3
- agno/tools/user_control_flow.py +6 -1
- agno/tools/valyu.py +34 -5
- agno/tools/visualization.py +19 -28
- agno/tools/webbrowser.py +4 -3
- agno/tools/webex.py +11 -7
- agno/tools/website.py +15 -46
- agno/tools/webtools.py +12 -4
- agno/tools/whatsapp.py +5 -9
- agno/tools/wikipedia.py +20 -13
- agno/tools/x.py +14 -13
- agno/tools/yfinance.py +13 -40
- agno/tools/youtube.py +26 -20
- agno/tools/zendesk.py +7 -2
- agno/tools/zep.py +10 -7
- agno/tools/zoom.py +10 -9
- agno/utils/common.py +1 -19
- agno/utils/events.py +95 -118
- agno/utils/knowledge.py +29 -0
- agno/utils/location.py +2 -2
- agno/utils/log.py +2 -2
- agno/utils/mcp.py +11 -5
- agno/utils/media.py +39 -0
- agno/utils/message.py +12 -1
- agno/utils/models/claude.py +6 -4
- agno/utils/models/mistral.py +8 -7
- agno/utils/models/schema_utils.py +3 -3
- agno/utils/pprint.py +33 -32
- agno/utils/print_response/agent.py +779 -0
- agno/utils/print_response/team.py +1565 -0
- agno/utils/print_response/workflow.py +1451 -0
- agno/utils/prompts.py +14 -14
- agno/utils/reasoning.py +87 -0
- agno/utils/response.py +42 -42
- agno/utils/string.py +8 -22
- agno/utils/team.py +50 -0
- agno/utils/timer.py +2 -2
- agno/vectordb/base.py +33 -21
- agno/vectordb/cassandra/cassandra.py +287 -23
- agno/vectordb/chroma/chromadb.py +482 -59
- agno/vectordb/clickhouse/clickhousedb.py +270 -63
- agno/vectordb/couchbase/couchbase.py +309 -29
- agno/vectordb/lancedb/lance_db.py +360 -21
- agno/vectordb/langchaindb/__init__.py +5 -0
- agno/vectordb/langchaindb/langchaindb.py +145 -0
- agno/vectordb/lightrag/__init__.py +5 -0
- agno/vectordb/lightrag/lightrag.py +374 -0
- agno/vectordb/llamaindex/llamaindexdb.py +127 -0
- agno/vectordb/milvus/milvus.py +242 -32
- agno/vectordb/mongodb/mongodb.py +200 -24
- agno/vectordb/pgvector/pgvector.py +319 -37
- agno/vectordb/pineconedb/pineconedb.py +221 -27
- agno/vectordb/qdrant/qdrant.py +356 -14
- agno/vectordb/singlestore/singlestore.py +286 -29
- agno/vectordb/surrealdb/surrealdb.py +187 -7
- agno/vectordb/upstashdb/upstashdb.py +342 -26
- agno/vectordb/weaviate/weaviate.py +227 -165
- agno/workflow/__init__.py +17 -13
- agno/workflow/{v2/condition.py → condition.py} +135 -32
- agno/workflow/{v2/loop.py → loop.py} +115 -28
- agno/workflow/{v2/parallel.py → parallel.py} +138 -108
- agno/workflow/{v2/router.py → router.py} +133 -32
- agno/workflow/{v2/step.py → step.py} +200 -42
- agno/workflow/{v2/steps.py → steps.py} +147 -66
- agno/workflow/types.py +482 -0
- agno/workflow/workflow.py +2394 -696
- agno-2.0.0a1.dist-info/METADATA +355 -0
- agno-2.0.0a1.dist-info/RECORD +514 -0
- agno/agent/metrics.py +0 -107
- agno/api/app.py +0 -35
- agno/api/playground.py +0 -92
- agno/api/schemas/app.py +0 -12
- agno/api/schemas/playground.py +0 -22
- agno/api/schemas/user.py +0 -35
- agno/api/schemas/workspace.py +0 -46
- agno/api/user.py +0 -160
- agno/api/workflows.py +0 -33
- agno/api/workspace.py +0 -175
- agno/app/agui/__init__.py +0 -3
- agno/app/agui/app.py +0 -17
- agno/app/agui/sync_router.py +0 -120
- agno/app/base.py +0 -186
- agno/app/discord/__init__.py +0 -3
- agno/app/fastapi/__init__.py +0 -3
- agno/app/fastapi/app.py +0 -107
- agno/app/fastapi/async_router.py +0 -457
- agno/app/fastapi/sync_router.py +0 -448
- agno/app/playground/app.py +0 -228
- agno/app/playground/async_router.py +0 -1050
- agno/app/playground/deploy.py +0 -249
- agno/app/playground/operator.py +0 -183
- agno/app/playground/schemas.py +0 -220
- agno/app/playground/serve.py +0 -55
- agno/app/playground/sync_router.py +0 -1042
- agno/app/playground/utils.py +0 -46
- agno/app/settings.py +0 -15
- agno/app/slack/__init__.py +0 -3
- agno/app/slack/app.py +0 -19
- agno/app/slack/sync_router.py +0 -92
- agno/app/utils.py +0 -54
- agno/app/whatsapp/__init__.py +0 -3
- agno/app/whatsapp/app.py +0 -15
- agno/app/whatsapp/sync_router.py +0 -197
- agno/cli/auth_server.py +0 -249
- agno/cli/config.py +0 -274
- agno/cli/console.py +0 -88
- agno/cli/credentials.py +0 -23
- agno/cli/entrypoint.py +0 -571
- agno/cli/operator.py +0 -357
- agno/cli/settings.py +0 -96
- agno/cli/ws/ws_cli.py +0 -817
- agno/constants.py +0 -13
- agno/document/__init__.py +0 -5
- agno/document/chunking/semantic.py +0 -45
- agno/document/chunking/strategy.py +0 -31
- agno/document/reader/__init__.py +0 -5
- agno/document/reader/base.py +0 -47
- agno/document/reader/docx_reader.py +0 -60
- agno/document/reader/gcs/pdf_reader.py +0 -44
- agno/document/reader/s3/pdf_reader.py +0 -59
- agno/document/reader/s3/text_reader.py +0 -63
- agno/document/reader/url_reader.py +0 -59
- agno/document/reader/youtube_reader.py +0 -58
- agno/embedder/__init__.py +0 -5
- agno/embedder/langdb.py +0 -80
- agno/embedder/mistral.py +0 -82
- agno/embedder/openai.py +0 -78
- agno/file/__init__.py +0 -5
- agno/file/file.py +0 -16
- agno/file/local/csv.py +0 -32
- agno/file/local/txt.py +0 -19
- agno/infra/app.py +0 -240
- agno/infra/base.py +0 -144
- agno/infra/context.py +0 -20
- agno/infra/db_app.py +0 -52
- agno/infra/resource.py +0 -205
- agno/infra/resources.py +0 -55
- agno/knowledge/agent.py +0 -698
- agno/knowledge/arxiv.py +0 -33
- agno/knowledge/combined.py +0 -36
- agno/knowledge/csv.py +0 -144
- agno/knowledge/csv_url.py +0 -124
- agno/knowledge/document.py +0 -223
- agno/knowledge/docx.py +0 -137
- agno/knowledge/firecrawl.py +0 -34
- agno/knowledge/gcs/__init__.py +0 -0
- agno/knowledge/gcs/base.py +0 -39
- agno/knowledge/gcs/pdf.py +0 -125
- agno/knowledge/json.py +0 -137
- agno/knowledge/langchain.py +0 -71
- agno/knowledge/light_rag.py +0 -273
- agno/knowledge/llamaindex.py +0 -66
- agno/knowledge/markdown.py +0 -154
- agno/knowledge/pdf.py +0 -164
- agno/knowledge/pdf_bytes.py +0 -42
- agno/knowledge/pdf_url.py +0 -148
- agno/knowledge/s3/__init__.py +0 -0
- agno/knowledge/s3/base.py +0 -64
- agno/knowledge/s3/pdf.py +0 -33
- agno/knowledge/s3/text.py +0 -34
- agno/knowledge/text.py +0 -141
- agno/knowledge/url.py +0 -46
- agno/knowledge/website.py +0 -179
- agno/knowledge/wikipedia.py +0 -32
- agno/knowledge/youtube.py +0 -35
- agno/memory/agent.py +0 -423
- agno/memory/classifier.py +0 -104
- agno/memory/db/__init__.py +0 -5
- agno/memory/db/base.py +0 -42
- agno/memory/db/mongodb.py +0 -189
- agno/memory/db/postgres.py +0 -203
- agno/memory/db/sqlite.py +0 -193
- agno/memory/memory.py +0 -22
- agno/memory/row.py +0 -36
- agno/memory/summarizer.py +0 -201
- agno/memory/summary.py +0 -19
- agno/memory/team.py +0 -415
- agno/memory/v2/__init__.py +0 -2
- agno/memory/v2/db/__init__.py +0 -1
- agno/memory/v2/db/base.py +0 -42
- agno/memory/v2/db/firestore.py +0 -339
- agno/memory/v2/db/mongodb.py +0 -196
- agno/memory/v2/db/postgres.py +0 -214
- agno/memory/v2/db/redis.py +0 -187
- agno/memory/v2/db/schema.py +0 -54
- agno/memory/v2/db/sqlite.py +0 -209
- agno/memory/v2/manager.py +0 -437
- agno/memory/v2/memory.py +0 -1097
- agno/memory/v2/schema.py +0 -55
- agno/memory/v2/summarizer.py +0 -215
- agno/memory/workflow.py +0 -38
- agno/models/ollama/tools.py +0 -430
- agno/models/qwen/__init__.py +0 -5
- agno/playground/__init__.py +0 -10
- agno/playground/deploy.py +0 -3
- agno/playground/playground.py +0 -3
- agno/playground/serve.py +0 -3
- agno/playground/settings.py +0 -3
- agno/reranker/__init__.py +0 -0
- agno/run/v2/__init__.py +0 -0
- agno/run/v2/workflow.py +0 -567
- agno/storage/__init__.py +0 -0
- agno/storage/agent/__init__.py +0 -0
- agno/storage/agent/dynamodb.py +0 -1
- agno/storage/agent/json.py +0 -1
- agno/storage/agent/mongodb.py +0 -1
- agno/storage/agent/postgres.py +0 -1
- agno/storage/agent/singlestore.py +0 -1
- agno/storage/agent/sqlite.py +0 -1
- agno/storage/agent/yaml.py +0 -1
- agno/storage/base.py +0 -60
- agno/storage/dynamodb.py +0 -673
- agno/storage/firestore.py +0 -297
- agno/storage/gcs_json.py +0 -261
- agno/storage/in_memory.py +0 -234
- agno/storage/json.py +0 -237
- agno/storage/mongodb.py +0 -328
- agno/storage/mysql.py +0 -685
- agno/storage/postgres.py +0 -682
- agno/storage/redis.py +0 -336
- agno/storage/session/__init__.py +0 -16
- agno/storage/session/agent.py +0 -64
- agno/storage/session/team.py +0 -63
- agno/storage/session/v2/__init__.py +0 -5
- agno/storage/session/workflow.py +0 -61
- agno/storage/singlestore.py +0 -606
- agno/storage/sqlite.py +0 -646
- agno/storage/workflow/__init__.py +0 -0
- agno/storage/workflow/mongodb.py +0 -1
- agno/storage/workflow/postgres.py +0 -1
- agno/storage/workflow/sqlite.py +0 -1
- agno/storage/yaml.py +0 -241
- agno/tools/thinking.py +0 -73
- agno/utils/defaults.py +0 -57
- agno/utils/filesystem.py +0 -39
- agno/utils/git.py +0 -52
- agno/utils/json_io.py +0 -30
- agno/utils/load_env.py +0 -19
- agno/utils/py_io.py +0 -19
- agno/utils/pyproject.py +0 -18
- agno/utils/resource_filter.py +0 -31
- agno/workflow/v2/__init__.py +0 -21
- agno/workflow/v2/types.py +0 -357
- agno/workflow/v2/workflow.py +0 -3312
- agno/workspace/__init__.py +0 -0
- agno/workspace/config.py +0 -325
- agno/workspace/enums.py +0 -6
- agno/workspace/helpers.py +0 -52
- agno/workspace/operator.py +0 -757
- agno/workspace/settings.py +0 -158
- agno-1.8.0.dist-info/METADATA +0 -979
- agno-1.8.0.dist-info/RECORD +0 -565
- agno-1.8.0.dist-info/entry_points.txt +0 -3
- /agno/{app → db/migrations}/__init__.py +0 -0
- /agno/{app/playground/__init__.py → db/schemas/metrics.py} +0 -0
- /agno/{cli → integrations}/__init__.py +0 -0
- /agno/{cli/ws → knowledge/chunking}/__init__.py +0 -0
- /agno/{document/chunking → knowledge/remote_content}/__init__.py +0 -0
- /agno/{document/reader/gcs → knowledge/reranker}/__init__.py +0 -0
- /agno/{document/reader/s3 → os/interfaces}/__init__.py +0 -0
- /agno/{app → os/interfaces}/slack/security.py +0 -0
- /agno/{app → os/interfaces}/whatsapp/security.py +0 -0
- /agno/{file/local → utils/print_response}/__init__.py +0 -0
- /agno/{infra → vectordb/llamaindex}/__init__.py +0 -0
- {agno-1.8.0.dist-info → agno-2.0.0a1.dist-info}/WHEEL +0 -0
- {agno-1.8.0.dist-info → agno-2.0.0a1.dist-info}/licenses/LICENSE +0 -0
- {agno-1.8.0.dist-info → agno-2.0.0a1.dist-info}/top_level.txt +0 -0
agno/tools/giphy.py
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import os
|
|
2
1
|
import uuid
|
|
2
|
+
from os import getenv
|
|
3
3
|
from typing import Any, List, Optional, Union
|
|
4
4
|
|
|
5
5
|
import httpx
|
|
@@ -8,6 +8,7 @@ from agno.agent import Agent
|
|
|
8
8
|
from agno.media import ImageArtifact
|
|
9
9
|
from agno.team.team import Team
|
|
10
10
|
from agno.tools import Toolkit
|
|
11
|
+
from agno.tools.function import ToolResult
|
|
11
12
|
from agno.utils.log import logger
|
|
12
13
|
|
|
13
14
|
|
|
@@ -16,6 +17,8 @@ class GiphyTools(Toolkit):
|
|
|
16
17
|
self,
|
|
17
18
|
api_key: Optional[str] = None,
|
|
18
19
|
limit: int = 1,
|
|
20
|
+
enable_search_gifs: bool = True,
|
|
21
|
+
all: bool = False,
|
|
19
22
|
**kwargs,
|
|
20
23
|
):
|
|
21
24
|
"""Initialize Giphy tools.
|
|
@@ -23,27 +26,29 @@ class GiphyTools(Toolkit):
|
|
|
23
26
|
Args:
|
|
24
27
|
api_key: Giphy API key. Defaults to GIPHY_API_KEY environment variable.
|
|
25
28
|
limit: Number of GIFs to return. Defaults to 1.
|
|
26
|
-
|
|
29
|
+
enable_search_gifs: Whether to enable GIF search functionality. Defaults to True.
|
|
30
|
+
all: Enable all functions. Defaults to False.
|
|
27
31
|
"""
|
|
28
|
-
self.api_key = api_key or
|
|
32
|
+
self.api_key = api_key or getenv("GIPHY_API_KEY")
|
|
29
33
|
if not self.api_key:
|
|
30
34
|
logger.error("No Giphy API key provided")
|
|
31
35
|
|
|
32
36
|
self.limit: int = limit
|
|
33
37
|
|
|
34
38
|
tools: List[Any] = []
|
|
35
|
-
|
|
39
|
+
if all or enable_search_gifs:
|
|
40
|
+
tools.append(self.search_gifs)
|
|
36
41
|
|
|
37
42
|
super().__init__(name="giphy_tools", tools=tools, **kwargs)
|
|
38
43
|
|
|
39
|
-
def search_gifs(self, agent: Union[Agent, Team], query: str) ->
|
|
44
|
+
def search_gifs(self, agent: Union[Agent, Team], query: str) -> ToolResult:
|
|
40
45
|
"""Find a GIPHY gif
|
|
41
46
|
|
|
42
47
|
Args:
|
|
43
48
|
query (str): A text description of the required gif.
|
|
44
49
|
|
|
45
50
|
Returns:
|
|
46
|
-
|
|
51
|
+
ToolResult: Contains the found GIF images or error message.
|
|
47
52
|
"""
|
|
48
53
|
|
|
49
54
|
base_url = "https://api.giphy.com/v1/gifs/search"
|
|
@@ -60,6 +65,8 @@ class GiphyTools(Toolkit):
|
|
|
60
65
|
# Extract the GIF URLs
|
|
61
66
|
data = response.json()
|
|
62
67
|
gif_urls = []
|
|
68
|
+
image_artifacts = []
|
|
69
|
+
|
|
63
70
|
for gif in data.get("data", []):
|
|
64
71
|
images = gif.get("images", {})
|
|
65
72
|
original_image = images["original"]
|
|
@@ -69,13 +76,18 @@ class GiphyTools(Toolkit):
|
|
|
69
76
|
alt_text = gif["alt_text"]
|
|
70
77
|
gif_urls.append(gif_url)
|
|
71
78
|
|
|
72
|
-
|
|
79
|
+
# Create ImageArtifact for the GIF
|
|
80
|
+
image_artifact = ImageArtifact(id=media_id, url=gif_url, alt_text=alt_text, revised_prompt=query)
|
|
81
|
+
image_artifacts.append(image_artifact)
|
|
73
82
|
|
|
74
|
-
|
|
83
|
+
if image_artifacts:
|
|
84
|
+
return ToolResult(content=f"Found {len(gif_urls)} GIF(s): {gif_urls}", images=image_artifacts)
|
|
85
|
+
else:
|
|
86
|
+
return ToolResult(content="No gifs found")
|
|
75
87
|
|
|
76
88
|
except httpx.HTTPStatusError as e:
|
|
77
89
|
logger.error(f"HTTP error occurred: {e.response.status_code} - {e.response.text}")
|
|
90
|
+
return ToolResult(content=f"HTTP error occurred: {e.response.status_code}")
|
|
78
91
|
except Exception as e:
|
|
79
92
|
logger.error(f"An error occurred: {e}")
|
|
80
|
-
|
|
81
|
-
return "No gifs found"
|
|
93
|
+
return ToolResult(content=f"An error occurred: {e}")
|
agno/tools/github.py
CHANGED
|
@@ -7,7 +7,6 @@ from agno.utils.log import log_debug, logger
|
|
|
7
7
|
|
|
8
8
|
try:
|
|
9
9
|
from github import Auth, Github, GithubException
|
|
10
|
-
from github.GithubObject import NotSet
|
|
11
10
|
|
|
12
11
|
except ImportError:
|
|
13
12
|
raise ImportError("`PyGithub` not installed. Please install using `pip install pygithub`")
|
|
@@ -18,45 +17,6 @@ class GithubTools(Toolkit):
|
|
|
18
17
|
self,
|
|
19
18
|
access_token: Optional[str] = None,
|
|
20
19
|
base_url: Optional[str] = None,
|
|
21
|
-
search_repositories: bool = True,
|
|
22
|
-
list_repositories: bool = False,
|
|
23
|
-
get_repository: bool = False,
|
|
24
|
-
get_pull_request: bool = False,
|
|
25
|
-
get_pull_request_changes: bool = False,
|
|
26
|
-
create_issue: bool = False,
|
|
27
|
-
create_repository: bool = False,
|
|
28
|
-
delete_repository: bool = False,
|
|
29
|
-
get_repository_languages: bool = False,
|
|
30
|
-
list_branches: bool = False,
|
|
31
|
-
get_pull_request_count: bool = False,
|
|
32
|
-
get_repository_stars: bool = False,
|
|
33
|
-
get_pull_requests: bool = False,
|
|
34
|
-
get_pull_request_comments: bool = False,
|
|
35
|
-
create_pull_request_comment: bool = False,
|
|
36
|
-
edit_pull_request_comment: bool = False,
|
|
37
|
-
get_pull_request_with_details: bool = False,
|
|
38
|
-
get_repository_with_stats: bool = False,
|
|
39
|
-
list_issues: bool = False,
|
|
40
|
-
get_issue: bool = False,
|
|
41
|
-
comment_on_issue: bool = False,
|
|
42
|
-
close_issue: bool = False,
|
|
43
|
-
reopen_issue: bool = False,
|
|
44
|
-
assign_issue: bool = False,
|
|
45
|
-
label_issue: bool = False,
|
|
46
|
-
list_issue_comments: bool = False,
|
|
47
|
-
edit_issue: bool = False,
|
|
48
|
-
create_pull_request: bool = False,
|
|
49
|
-
create_file: bool = False,
|
|
50
|
-
get_file_content: bool = False,
|
|
51
|
-
update_file: bool = True,
|
|
52
|
-
delete_file: bool = False,
|
|
53
|
-
get_directory_content: bool = False,
|
|
54
|
-
get_branch_content: bool = False,
|
|
55
|
-
create_branch: bool = False,
|
|
56
|
-
set_default_branch: bool = False,
|
|
57
|
-
search_code: bool = False,
|
|
58
|
-
search_issues_and_prs: bool = False,
|
|
59
|
-
create_review_request: bool = False,
|
|
60
20
|
**kwargs,
|
|
61
21
|
):
|
|
62
22
|
self.access_token = access_token or getenv("GITHUB_ACCESS_TOKEN")
|
|
@@ -64,85 +24,47 @@ class GithubTools(Toolkit):
|
|
|
64
24
|
|
|
65
25
|
self.g = self.authenticate()
|
|
66
26
|
|
|
67
|
-
tools: List[Any] = [
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
if comment_on_issue:
|
|
109
|
-
tools.append(self.comment_on_issue)
|
|
110
|
-
if close_issue:
|
|
111
|
-
tools.append(self.close_issue)
|
|
112
|
-
if reopen_issue:
|
|
113
|
-
tools.append(self.reopen_issue)
|
|
114
|
-
if assign_issue:
|
|
115
|
-
tools.append(self.assign_issue)
|
|
116
|
-
if label_issue:
|
|
117
|
-
tools.append(self.label_issue)
|
|
118
|
-
if list_issue_comments:
|
|
119
|
-
tools.append(self.list_issue_comments)
|
|
120
|
-
if edit_issue:
|
|
121
|
-
tools.append(self.edit_issue)
|
|
122
|
-
if create_pull_request:
|
|
123
|
-
tools.append(self.create_pull_request)
|
|
124
|
-
if create_file:
|
|
125
|
-
tools.append(self.create_file)
|
|
126
|
-
if get_file_content:
|
|
127
|
-
tools.append(self.get_file_content)
|
|
128
|
-
if update_file:
|
|
129
|
-
tools.append(self.update_file)
|
|
130
|
-
if delete_file:
|
|
131
|
-
tools.append(self.delete_file)
|
|
132
|
-
if get_directory_content:
|
|
133
|
-
tools.append(self.get_directory_content)
|
|
134
|
-
if get_branch_content:
|
|
135
|
-
tools.append(self.get_branch_content)
|
|
136
|
-
if create_branch:
|
|
137
|
-
tools.append(self.create_branch)
|
|
138
|
-
if set_default_branch:
|
|
139
|
-
tools.append(self.set_default_branch)
|
|
140
|
-
if search_code:
|
|
141
|
-
tools.append(self.search_code)
|
|
142
|
-
if search_issues_and_prs:
|
|
143
|
-
tools.append(self.search_issues_and_prs)
|
|
144
|
-
if create_review_request:
|
|
145
|
-
tools.append(self.create_review_request)
|
|
27
|
+
tools: List[Any] = [
|
|
28
|
+
self.search_repositories,
|
|
29
|
+
self.list_repositories,
|
|
30
|
+
self.get_repository,
|
|
31
|
+
self.get_pull_request,
|
|
32
|
+
self.get_pull_request_changes,
|
|
33
|
+
self.create_issue,
|
|
34
|
+
self.create_repository,
|
|
35
|
+
self.delete_repository,
|
|
36
|
+
self.list_branches,
|
|
37
|
+
self.get_repository_languages,
|
|
38
|
+
self.get_pull_request_count,
|
|
39
|
+
self.get_repository_stars,
|
|
40
|
+
self.get_pull_requests,
|
|
41
|
+
self.get_pull_request_comments,
|
|
42
|
+
self.create_pull_request_comment,
|
|
43
|
+
self.edit_pull_request_comment,
|
|
44
|
+
self.get_pull_request_with_details,
|
|
45
|
+
self.get_repository_with_stats,
|
|
46
|
+
self.list_issues,
|
|
47
|
+
self.get_issue,
|
|
48
|
+
self.comment_on_issue,
|
|
49
|
+
self.close_issue,
|
|
50
|
+
self.reopen_issue,
|
|
51
|
+
self.assign_issue,
|
|
52
|
+
self.label_issue,
|
|
53
|
+
self.list_issue_comments,
|
|
54
|
+
self.edit_issue,
|
|
55
|
+
self.create_pull_request,
|
|
56
|
+
self.create_file,
|
|
57
|
+
self.get_file_content,
|
|
58
|
+
self.update_file,
|
|
59
|
+
self.delete_file,
|
|
60
|
+
self.get_directory_content,
|
|
61
|
+
self.get_branch_content,
|
|
62
|
+
self.create_branch,
|
|
63
|
+
self.set_default_branch,
|
|
64
|
+
self.search_code,
|
|
65
|
+
self.search_issues_and_prs,
|
|
66
|
+
self.create_review_request,
|
|
67
|
+
]
|
|
146
68
|
|
|
147
69
|
super().__init__(name="github", tools=tools, **kwargs)
|
|
148
70
|
|
|
@@ -428,7 +350,7 @@ class GithubTools(Toolkit):
|
|
|
428
350
|
logger.error(f"Error getting pull request changes: {e}")
|
|
429
351
|
return json.dumps({"error": str(e)})
|
|
430
352
|
|
|
431
|
-
def create_issue(self, repo_name: str, title: str, body: Optional[str] =
|
|
353
|
+
def create_issue(self, repo_name: str, title: str, body: Optional[str] = None) -> str:
|
|
432
354
|
"""Create an issue in a repository.
|
|
433
355
|
|
|
434
356
|
Args:
|
|
@@ -442,7 +364,7 @@ class GithubTools(Toolkit):
|
|
|
442
364
|
log_debug(f"Creating issue in repository: {repo_name}")
|
|
443
365
|
try:
|
|
444
366
|
repo = self.g.get_repo(repo_name)
|
|
445
|
-
issue = repo.create_issue(title=title, body=body)
|
|
367
|
+
issue = repo.create_issue(title=title, body=body) # type: ignore
|
|
446
368
|
issue_info = {
|
|
447
369
|
"id": issue.id,
|
|
448
370
|
"number": issue.number,
|
|
@@ -697,8 +619,8 @@ class GithubTools(Toolkit):
|
|
|
697
619
|
self,
|
|
698
620
|
repo_name: str,
|
|
699
621
|
issue_number: int,
|
|
700
|
-
title: Optional[str] =
|
|
701
|
-
body: Optional[str] =
|
|
622
|
+
title: Optional[str] = None,
|
|
623
|
+
body: Optional[str] = None,
|
|
702
624
|
) -> str:
|
|
703
625
|
"""Edit the title or body of an issue.
|
|
704
626
|
|
|
@@ -715,7 +637,7 @@ class GithubTools(Toolkit):
|
|
|
715
637
|
try:
|
|
716
638
|
repo = self.g.get_repo(repo_name)
|
|
717
639
|
issue = repo.get_issue(number=issue_number)
|
|
718
|
-
issue.edit(title=title, body=body)
|
|
640
|
+
issue.edit(title=title, body=body) # type: ignore
|
|
719
641
|
return json.dumps({"message": f"Issue #{issue_number} updated."}, indent=2)
|
|
720
642
|
except GithubException as e:
|
|
721
643
|
logger.error(f"Error editing issue: {e}")
|
|
@@ -1324,7 +1246,7 @@ class GithubTools(Toolkit):
|
|
|
1324
1246
|
path: str,
|
|
1325
1247
|
content: str,
|
|
1326
1248
|
message: str,
|
|
1327
|
-
branch: Optional[str] =
|
|
1249
|
+
branch: Optional[str] = None,
|
|
1328
1250
|
) -> str:
|
|
1329
1251
|
"""Create a new file in a repository.
|
|
1330
1252
|
|
|
@@ -1350,7 +1272,7 @@ class GithubTools(Toolkit):
|
|
|
1350
1272
|
|
|
1351
1273
|
# Extract relevant information
|
|
1352
1274
|
file_info = {
|
|
1353
|
-
"path": result["content"].path,
|
|
1275
|
+
"path": result["content"].path, # type: ignore
|
|
1354
1276
|
"sha": result["content"].sha,
|
|
1355
1277
|
"url": result["content"].html_url,
|
|
1356
1278
|
"commit": {
|
agno/tools/gmail.py
CHANGED
|
@@ -101,17 +101,6 @@ class GmailTools(Toolkit):
|
|
|
101
101
|
|
|
102
102
|
def __init__(
|
|
103
103
|
self,
|
|
104
|
-
get_latest_emails: bool = True,
|
|
105
|
-
get_emails_from_user: bool = True,
|
|
106
|
-
get_unread_emails: bool = True,
|
|
107
|
-
get_starred_emails: bool = True,
|
|
108
|
-
get_emails_by_context: bool = True,
|
|
109
|
-
get_emails_by_date: bool = True,
|
|
110
|
-
get_emails_by_thread: bool = True,
|
|
111
|
-
create_draft_email: bool = True,
|
|
112
|
-
send_email: bool = True,
|
|
113
|
-
send_email_reply: bool = True,
|
|
114
|
-
search_emails: bool = True,
|
|
115
104
|
creds: Optional[Credentials] = None,
|
|
116
105
|
credentials_path: Optional[str] = None,
|
|
117
106
|
token_path: Optional[str] = None,
|
|
@@ -122,18 +111,7 @@ class GmailTools(Toolkit):
|
|
|
122
111
|
"""Initialize GmailTools and authenticate with Gmail API
|
|
123
112
|
|
|
124
113
|
Args:
|
|
125
|
-
|
|
126
|
-
get_emails_from_user (bool): Enable getting emails from specific user. Defaults to True.
|
|
127
|
-
get_unread_emails (bool): Enable getting unread emails. Defaults to True.
|
|
128
|
-
get_starred_emails (bool): Enable getting starred emails. Defaults to True.
|
|
129
|
-
get_emails_by_context (bool): Enable getting emails by context. Defaults to True.
|
|
130
|
-
get_emails_by_date (bool): Enable getting emails by date. Defaults to True.
|
|
131
|
-
get_emails_by_thread (bool): Enable getting emails by thread. Defaults to True.
|
|
132
|
-
create_draft_email (bool): Enable creating draft emails. Defaults to True.
|
|
133
|
-
send_email (bool): Enable sending emails. Defaults to True.
|
|
134
|
-
search_emails (bool): Enable searching emails. Defaults to True.
|
|
135
|
-
send_email_reply (bool): Enable sending email replies. Defaults to True.
|
|
136
|
-
creds (Optional[Credentials]): Pre-existing credentials. Defaults to None.
|
|
114
|
+
creds (Optional[Credentials]): Pre-fetched OAuth credentials. Use this to skip a new auth flow. Defaults to None.
|
|
137
115
|
credentials_path (Optional[str]): Path to credentials file. Defaults to None.
|
|
138
116
|
token_path (Optional[str]): Path to token file. Defaults to None.
|
|
139
117
|
scopes (Optional[List[str]]): Custom OAuth scopes. If None, uses DEFAULT_SCOPES.
|
|
@@ -146,55 +124,61 @@ class GmailTools(Toolkit):
|
|
|
146
124
|
self.scopes = scopes or self.DEFAULT_SCOPES
|
|
147
125
|
self.port = port
|
|
148
126
|
|
|
149
|
-
|
|
150
|
-
|
|
127
|
+
""" tools functions:
|
|
128
|
+
enable_get_latest_emails (bool): Enable getting latest emails.
|
|
129
|
+
enable_get_emails_from_user (bool): Enable getting emails from specific user.
|
|
130
|
+
enable_get_unread_emails (bool): Enable getting unread emails.
|
|
131
|
+
enable_get_starred_emails (bool): Enable getting starred emails.
|
|
132
|
+
enable_get_emails_by_context (bool): Enable getting emails by context.
|
|
133
|
+
enable_get_emails_by_date (bool): Enable getting emails by date.
|
|
134
|
+
enable_get_emails_by_thread (bool): Enable getting emails by thread.
|
|
135
|
+
enable_create_draft_email (bool): Enable creating draft emails.
|
|
136
|
+
enable_send_email (bool): Enable sending emails.
|
|
137
|
+
enable_send_email_reply (bool): Enable sending email replies.
|
|
138
|
+
all (bool): Enable all tools.
|
|
139
|
+
"""
|
|
140
|
+
|
|
141
|
+
tools: List[Any] = [
|
|
142
|
+
# Reading emails
|
|
143
|
+
self.get_latest_emails,
|
|
144
|
+
self.get_emails_from_user,
|
|
145
|
+
self.get_unread_emails,
|
|
146
|
+
self.get_starred_emails,
|
|
147
|
+
self.get_emails_by_context,
|
|
148
|
+
self.get_emails_by_date,
|
|
149
|
+
self.get_emails_by_thread,
|
|
150
|
+
self.search_emails,
|
|
151
|
+
# Composing emails
|
|
152
|
+
self.create_draft_email,
|
|
153
|
+
self.send_email,
|
|
154
|
+
self.send_email_reply,
|
|
155
|
+
]
|
|
156
|
+
|
|
157
|
+
super().__init__(name="gmail_tools", tools=tools, **kwargs)
|
|
158
|
+
|
|
159
|
+
# Validate that required scopes are present for requested operations (only check registered functions)
|
|
160
|
+
if (
|
|
161
|
+
"create_draft_email" in self.functions or "send_email" in self.functions
|
|
162
|
+
) and "https://www.googleapis.com/auth/gmail.compose" not in self.scopes:
|
|
151
163
|
raise ValueError(
|
|
152
164
|
"The scope https://www.googleapis.com/auth/gmail.compose is required for email composition operations"
|
|
153
165
|
)
|
|
154
|
-
|
|
155
166
|
read_operations = [
|
|
156
|
-
get_latest_emails,
|
|
157
|
-
get_emails_from_user,
|
|
158
|
-
get_unread_emails,
|
|
159
|
-
get_starred_emails,
|
|
160
|
-
get_emails_by_context,
|
|
161
|
-
get_emails_by_date,
|
|
162
|
-
get_emails_by_thread,
|
|
163
|
-
search_emails,
|
|
167
|
+
"get_latest_emails",
|
|
168
|
+
"get_emails_from_user",
|
|
169
|
+
"get_unread_emails",
|
|
170
|
+
"get_starred_emails",
|
|
171
|
+
"get_emails_by_context",
|
|
172
|
+
"get_emails_by_date",
|
|
173
|
+
"get_emails_by_thread",
|
|
174
|
+
"search_emails",
|
|
164
175
|
]
|
|
165
|
-
|
|
166
|
-
if any(read_operations):
|
|
176
|
+
if any(read_operation in self.functions for read_operation in read_operations):
|
|
167
177
|
read_scope = "https://www.googleapis.com/auth/gmail.readonly"
|
|
168
178
|
write_scope = "https://www.googleapis.com/auth/gmail.modify"
|
|
169
179
|
if read_scope not in self.scopes and write_scope not in self.scopes:
|
|
170
180
|
raise ValueError(f"The scope {read_scope} is required for email reading operations")
|
|
171
181
|
|
|
172
|
-
tools: List[Any] = []
|
|
173
|
-
if get_latest_emails:
|
|
174
|
-
tools.append(self.get_latest_emails)
|
|
175
|
-
if get_emails_from_user:
|
|
176
|
-
tools.append(self.get_emails_from_user)
|
|
177
|
-
if get_unread_emails:
|
|
178
|
-
tools.append(self.get_unread_emails)
|
|
179
|
-
if get_starred_emails:
|
|
180
|
-
tools.append(self.get_starred_emails)
|
|
181
|
-
if get_emails_by_context:
|
|
182
|
-
tools.append(self.get_emails_by_context)
|
|
183
|
-
if get_emails_by_date:
|
|
184
|
-
tools.append(self.get_emails_by_date)
|
|
185
|
-
if get_emails_by_thread:
|
|
186
|
-
tools.append(self.get_emails_by_thread)
|
|
187
|
-
if create_draft_email:
|
|
188
|
-
tools.append(self.create_draft_email)
|
|
189
|
-
if send_email:
|
|
190
|
-
tools.append(self.send_email)
|
|
191
|
-
if send_email_reply:
|
|
192
|
-
tools.append(self.send_email_reply)
|
|
193
|
-
if search_emails:
|
|
194
|
-
tools.append(self.search_emails)
|
|
195
|
-
|
|
196
|
-
super().__init__(name="gmail_tools", tools=tools, **kwargs)
|
|
197
|
-
|
|
198
182
|
def _auth(self) -> None:
|
|
199
183
|
"""Authenticate with Gmail API"""
|
|
200
184
|
token_file = Path(self.token_path or "token.json")
|
agno/tools/google_bigquery.py
CHANGED
|
@@ -17,10 +17,11 @@ class GoogleBigQueryTools(Toolkit):
|
|
|
17
17
|
dataset: str,
|
|
18
18
|
project: Optional[str] = None,
|
|
19
19
|
location: Optional[str] = None,
|
|
20
|
-
list_tables: Optional[bool] = True,
|
|
21
|
-
describe_table: Optional[bool] = True,
|
|
22
|
-
run_sql_query: Optional[bool] = True,
|
|
23
20
|
credentials: Optional[Any] = None,
|
|
21
|
+
enable_list_tables: bool = True,
|
|
22
|
+
enable_describe_table: bool = True,
|
|
23
|
+
enable_run_sql_query: bool = True,
|
|
24
|
+
all: bool = False,
|
|
24
25
|
**kwargs,
|
|
25
26
|
):
|
|
26
27
|
self.project = project or getenv("GOOGLE_CLOUD_PROJECT")
|
|
@@ -37,11 +38,11 @@ class GoogleBigQueryTools(Toolkit):
|
|
|
37
38
|
self.client = bigquery.Client(project=self.project, credentials=credentials)
|
|
38
39
|
|
|
39
40
|
tools: List[Any] = []
|
|
40
|
-
if
|
|
41
|
+
if all or enable_list_tables:
|
|
41
42
|
tools.append(self.list_tables)
|
|
42
|
-
if
|
|
43
|
+
if all or enable_describe_table:
|
|
43
44
|
tools.append(self.describe_table)
|
|
44
|
-
if
|
|
45
|
+
if all or enable_run_sql_query:
|
|
45
46
|
tools.append(self.run_sql_query)
|
|
46
47
|
|
|
47
48
|
super().__init__(name="google_bigquery_tools", tools=tools, **kwargs)
|
agno/tools/google_maps.py
CHANGED
|
@@ -6,7 +6,7 @@ Prerequisites:
|
|
|
6
6
|
You can obtain the API key from the Google Cloud Console:
|
|
7
7
|
https://console.cloud.google.com/projectselector2/google/maps-apis/credentials
|
|
8
8
|
|
|
9
|
-
- You also need to activate the Address Validation API for your .
|
|
9
|
+
- You also need to activate the Address Validation API for your project.
|
|
10
10
|
https://console.developers.google.com/apis/api/addressvalidation.googleapis.com
|
|
11
11
|
|
|
12
12
|
"""
|
|
@@ -29,14 +29,6 @@ class GoogleMapTools(Toolkit):
|
|
|
29
29
|
def __init__(
|
|
30
30
|
self,
|
|
31
31
|
key: Optional[str] = None,
|
|
32
|
-
search_places: bool = True,
|
|
33
|
-
get_directions: bool = True,
|
|
34
|
-
validate_address: bool = True,
|
|
35
|
-
geocode_address: bool = True,
|
|
36
|
-
reverse_geocode: bool = True,
|
|
37
|
-
get_distance_matrix: bool = True,
|
|
38
|
-
get_elevation: bool = True,
|
|
39
|
-
get_timezone: bool = True,
|
|
40
32
|
**kwargs,
|
|
41
33
|
):
|
|
42
34
|
self.api_key = key or getenv("GOOGLE_MAPS_API_KEY")
|
|
@@ -46,23 +38,16 @@ class GoogleMapTools(Toolkit):
|
|
|
46
38
|
|
|
47
39
|
self.places_client = places_v1.PlacesClient()
|
|
48
40
|
|
|
49
|
-
tools: List[Any] = [
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
tools.append(self.reverse_geocode)
|
|
60
|
-
if get_distance_matrix:
|
|
61
|
-
tools.append(self.get_distance_matrix)
|
|
62
|
-
if get_elevation:
|
|
63
|
-
tools.append(self.get_elevation)
|
|
64
|
-
if get_timezone:
|
|
65
|
-
tools.append(self.get_timezone)
|
|
41
|
+
tools: List[Any] = [
|
|
42
|
+
self.search_places,
|
|
43
|
+
self.get_directions,
|
|
44
|
+
self.validate_address,
|
|
45
|
+
self.geocode_address,
|
|
46
|
+
self.reverse_geocode,
|
|
47
|
+
self.get_distance_matrix,
|
|
48
|
+
self.get_elevation,
|
|
49
|
+
self.get_timezone,
|
|
50
|
+
]
|
|
66
51
|
|
|
67
52
|
super().__init__(name="google_maps", tools=tools, **kwargs)
|
|
68
53
|
|
agno/tools/googlesearch.py
CHANGED
|
@@ -29,6 +29,8 @@ class GoogleSearchTools(Toolkit):
|
|
|
29
29
|
cache_results (bool): Enable caching of search results.
|
|
30
30
|
cache_ttl (int): Time-to-live for cached results in seconds.
|
|
31
31
|
cache_dir (Optional[str]): Directory to store cache files.
|
|
32
|
+
enable_google_search (bool): Enable Google search.
|
|
33
|
+
all (bool): Enable all tools.
|
|
32
34
|
"""
|
|
33
35
|
|
|
34
36
|
def __init__(
|
|
@@ -38,6 +40,8 @@ class GoogleSearchTools(Toolkit):
|
|
|
38
40
|
headers: Optional[Any] = None,
|
|
39
41
|
proxy: Optional[str] = None,
|
|
40
42
|
timeout: Optional[int] = 10,
|
|
43
|
+
enable_google_search: bool = True,
|
|
44
|
+
all: bool = False,
|
|
41
45
|
**kwargs,
|
|
42
46
|
):
|
|
43
47
|
self.fixed_max_results: Optional[int] = fixed_max_results
|
|
@@ -47,7 +51,8 @@ class GoogleSearchTools(Toolkit):
|
|
|
47
51
|
self.timeout: Optional[int] = timeout
|
|
48
52
|
|
|
49
53
|
tools = []
|
|
50
|
-
|
|
54
|
+
if all or enable_google_search:
|
|
55
|
+
tools.append(self.google_search)
|
|
51
56
|
|
|
52
57
|
super().__init__(name="google_search_tools", tools=tools, **kwargs)
|
|
53
58
|
|
|
@@ -77,7 +82,7 @@ class GoogleSearchTools(Toolkit):
|
|
|
77
82
|
log_debug(f"Searching Google [{language}] for: {query}")
|
|
78
83
|
|
|
79
84
|
# Perform Google search using the googlesearch-python package
|
|
80
|
-
results = list(search(query,
|
|
85
|
+
results = list(search(query, num=max_results, lang=language))
|
|
81
86
|
|
|
82
87
|
# Collect the search results
|
|
83
88
|
res: List[Dict[str, str]] = []
|
agno/tools/googlesheets.py
CHANGED
|
@@ -94,27 +94,29 @@ class GoogleSheetsTools(Toolkit):
|
|
|
94
94
|
creds: Optional[Credentials] = None,
|
|
95
95
|
creds_path: Optional[str] = None,
|
|
96
96
|
token_path: Optional[str] = None,
|
|
97
|
-
read: bool = True,
|
|
98
|
-
create: bool = False,
|
|
99
|
-
update: bool = False,
|
|
100
|
-
duplicate: bool = False,
|
|
101
97
|
oauth_port: int = 0,
|
|
98
|
+
enable_read_sheet: bool = True,
|
|
99
|
+
enable_create_sheet: bool = False,
|
|
100
|
+
enable_update_sheet: bool = False,
|
|
101
|
+
enable_create_duplicate_sheet: bool = False,
|
|
102
|
+
all: bool = False,
|
|
102
103
|
**kwargs,
|
|
103
104
|
):
|
|
104
105
|
"""Initialize GoogleSheetsTools with the specified configuration.
|
|
105
106
|
|
|
106
107
|
Args:
|
|
107
|
-
scopes (Optional[List[str]]): Custom OAuth scopes. If None,
|
|
108
|
+
scopes (Optional[List[str]]): Custom OAuth scopes. If None, uses write scope by default.
|
|
108
109
|
spreadsheet_id (Optional[str]): ID of the target spreadsheet.
|
|
109
110
|
spreadsheet_range (Optional[str]): Range within the spreadsheet.
|
|
110
111
|
creds (Optional[Credentials]): Pre-existing credentials.
|
|
111
112
|
creds_path (Optional[str]): Path to credentials file.
|
|
112
113
|
token_path (Optional[str]): Path to token file.
|
|
113
|
-
read (bool): Enable read operations. Defaults to True.
|
|
114
|
-
create (bool): Enable create operations. Defaults to False.
|
|
115
|
-
update (bool): Enable update operations. Defaults to False.
|
|
116
|
-
duplicate (bool): Enable duplicate operations. Defaults to False.
|
|
117
114
|
oauth_port (int): Port to use for OAuth authentication. Defaults to 0.
|
|
115
|
+
enable_read_sheet (bool): Enable reading from a sheet.
|
|
116
|
+
enable_create_sheet (bool): Enable creating a sheet.
|
|
117
|
+
enable_update_sheet (bool): Enable updating a sheet.
|
|
118
|
+
enable_create_duplicate_sheet (bool): Enable creating a duplicate sheet.
|
|
119
|
+
all (bool): Enable all tools.
|
|
118
120
|
"""
|
|
119
121
|
|
|
120
122
|
self.spreadsheet_id = spreadsheet_id
|
|
@@ -128,19 +130,21 @@ class GoogleSheetsTools(Toolkit):
|
|
|
128
130
|
# Determine required scopes based on operations if no custom scopes provided
|
|
129
131
|
if scopes is None:
|
|
130
132
|
self.scopes = []
|
|
131
|
-
if
|
|
133
|
+
if enable_read_sheet:
|
|
132
134
|
self.scopes.append(self.DEFAULT_SCOPES["read"])
|
|
133
|
-
if
|
|
135
|
+
if enable_create_sheet or enable_update_sheet or enable_create_duplicate_sheet:
|
|
134
136
|
self.scopes.append(self.DEFAULT_SCOPES["write"])
|
|
135
137
|
# Remove duplicates while preserving order
|
|
136
138
|
self.scopes = list(dict.fromkeys(self.scopes))
|
|
137
139
|
else:
|
|
138
140
|
self.scopes = scopes
|
|
139
141
|
# Validate that required scopes are present for requested operations
|
|
140
|
-
if (
|
|
142
|
+
if (enable_create_sheet or enable_update_sheet or enable_create_duplicate_sheet) and self.DEFAULT_SCOPES[
|
|
143
|
+
"write"
|
|
144
|
+
] not in self.scopes:
|
|
141
145
|
raise ValueError(f"The scope {self.DEFAULT_SCOPES['write']} is required for write operations")
|
|
142
146
|
if (
|
|
143
|
-
|
|
147
|
+
enable_read_sheet
|
|
144
148
|
and self.DEFAULT_SCOPES["read"] not in self.scopes
|
|
145
149
|
and self.DEFAULT_SCOPES["write"] not in self.scopes
|
|
146
150
|
):
|
|
@@ -149,13 +153,13 @@ class GoogleSheetsTools(Toolkit):
|
|
|
149
153
|
)
|
|
150
154
|
|
|
151
155
|
tools: List[Any] = []
|
|
152
|
-
if
|
|
156
|
+
if all or enable_read_sheet:
|
|
153
157
|
tools.append(self.read_sheet)
|
|
154
|
-
if
|
|
158
|
+
if all or enable_create_sheet:
|
|
155
159
|
tools.append(self.create_sheet)
|
|
156
|
-
if
|
|
160
|
+
if all or enable_update_sheet:
|
|
157
161
|
tools.append(self.update_sheet)
|
|
158
|
-
if
|
|
162
|
+
if all or enable_create_duplicate_sheet:
|
|
159
163
|
tools.append(self.create_duplicate_sheet)
|
|
160
164
|
|
|
161
165
|
super().__init__(name="google_sheets_tools", tools=tools, **kwargs)
|