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
|
@@ -7,6 +7,7 @@ from requests import post
|
|
|
7
7
|
from agno.agent import Agent
|
|
8
8
|
from agno.media import ImageArtifact
|
|
9
9
|
from agno.tools import Toolkit
|
|
10
|
+
from agno.tools.function import ToolResult
|
|
10
11
|
from agno.utils.log import log_debug, logger
|
|
11
12
|
|
|
12
13
|
|
|
@@ -31,9 +32,9 @@ class AzureOpenAITools(Toolkit):
|
|
|
31
32
|
image_deployment: Optional[str] = None,
|
|
32
33
|
image_model: str = "dall-e-3",
|
|
33
34
|
image_quality: Literal["standard", "hd"] = "standard", # Note: "hd" quality is only available for dall-e-3.
|
|
35
|
+
enable_generate_image: bool = True,
|
|
36
|
+
all: bool = False,
|
|
34
37
|
):
|
|
35
|
-
super().__init__(name="azure_openai")
|
|
36
|
-
|
|
37
38
|
# Set credentials from parameters or environment variables
|
|
38
39
|
self.api_key = api_key or getenv("AZURE_OPENAI_API_KEY")
|
|
39
40
|
self.azure_endpoint = azure_endpoint or getenv("AZURE_OPENAI_ENDPOINT")
|
|
@@ -49,15 +50,20 @@ class AzureOpenAITools(Toolkit):
|
|
|
49
50
|
self.image_deployment = image_deployment or getenv("AZURE_OPENAI_IMAGE_DEPLOYMENT")
|
|
50
51
|
self.image_model = image_model
|
|
51
52
|
|
|
53
|
+
# Build tools list based on available services
|
|
54
|
+
tools = []
|
|
55
|
+
|
|
52
56
|
# Validate image generation parameters
|
|
53
57
|
if self.image_deployment and self.image_model in self.VALID_MODELS:
|
|
54
58
|
# Create and store the base URL
|
|
55
59
|
self.image_base_url = f"{self.azure_endpoint}/openai/deployments/{self.image_deployment}/images/generations?api-version={self.api_version}"
|
|
56
|
-
|
|
57
|
-
|
|
60
|
+
if all or enable_generate_image:
|
|
61
|
+
tools.append(self.generate_image)
|
|
58
62
|
else:
|
|
59
63
|
logger.error("Missing required image generation parameters or invalid model")
|
|
60
64
|
|
|
65
|
+
super().__init__(name="azure_openai_tools", tools=tools)
|
|
66
|
+
|
|
61
67
|
self.image_quality = image_quality
|
|
62
68
|
|
|
63
69
|
# Validate quality
|
|
@@ -98,7 +104,7 @@ class AzureOpenAITools(Toolkit):
|
|
|
98
104
|
n: int = 1,
|
|
99
105
|
size: Optional[Literal["256x256", "512x512", "1024x1024", "1792x1024", "1024x1792"]] = "1024x1024",
|
|
100
106
|
style: Literal["vivid", "natural"] = "vivid",
|
|
101
|
-
) ->
|
|
107
|
+
) -> ToolResult:
|
|
102
108
|
"""Generate an image using Azure OpenAI image generation.
|
|
103
109
|
|
|
104
110
|
Args:
|
|
@@ -114,7 +120,7 @@ class AzureOpenAITools(Toolkit):
|
|
|
114
120
|
Note: "vivid" produces more dramatic images, while "natural" produces more realistic ones.
|
|
115
121
|
|
|
116
122
|
Returns:
|
|
117
|
-
A
|
|
123
|
+
ToolResult: A ToolResult containing the generated images or error message.
|
|
118
124
|
|
|
119
125
|
Note:
|
|
120
126
|
Invalid parameters will be automatically corrected to valid values. For example:
|
|
@@ -125,7 +131,9 @@ class AzureOpenAITools(Toolkit):
|
|
|
125
131
|
"""
|
|
126
132
|
# Check if image generation is properly initialized
|
|
127
133
|
if not hasattr(self, "image_base_url"):
|
|
128
|
-
return
|
|
134
|
+
return ToolResult(
|
|
135
|
+
content="Image generation tool not properly initialized. Please check your configuration."
|
|
136
|
+
)
|
|
129
137
|
|
|
130
138
|
# Enforce valid parameters
|
|
131
139
|
params = self._enforce_valid_image_parameters(
|
|
@@ -147,26 +155,36 @@ class AzureOpenAITools(Toolkit):
|
|
|
147
155
|
response = post(self.image_base_url, headers=headers, json=params)
|
|
148
156
|
|
|
149
157
|
if response.status_code != 200:
|
|
150
|
-
return f"Error {response.status_code}: {response.text}"
|
|
158
|
+
return ToolResult(content=f"Error {response.status_code}: {response.text}")
|
|
151
159
|
|
|
152
160
|
# Process results
|
|
153
161
|
data = response.json()
|
|
154
162
|
log_debug("Image generated successfully")
|
|
155
163
|
|
|
156
|
-
#
|
|
164
|
+
# Create ImageArtifact objects for generated images
|
|
165
|
+
generated_images = []
|
|
157
166
|
response_str = ""
|
|
167
|
+
|
|
158
168
|
for img in data.get("data", []):
|
|
159
169
|
image_url = img.get("url")
|
|
160
170
|
revised_prompt = img.get("revised_prompt")
|
|
161
171
|
|
|
162
|
-
#
|
|
163
|
-
|
|
164
|
-
|
|
172
|
+
# Create ImageArtifact with URL
|
|
173
|
+
image_artifact = ImageArtifact(
|
|
174
|
+
id=str(uuid4()), url=image_url, original_prompt=prompt, revised_prompt=revised_prompt
|
|
165
175
|
)
|
|
176
|
+
generated_images.append(image_artifact)
|
|
166
177
|
|
|
167
178
|
response_str += f"Image has been generated at the URL {image_url}\n"
|
|
168
|
-
|
|
179
|
+
|
|
180
|
+
if generated_images:
|
|
181
|
+
return ToolResult(
|
|
182
|
+
content=response_str.strip(),
|
|
183
|
+
images=generated_images,
|
|
184
|
+
)
|
|
185
|
+
else:
|
|
186
|
+
return ToolResult(content="No images were generated.")
|
|
169
187
|
|
|
170
188
|
except Exception as e:
|
|
171
189
|
logger.error(f"Failed to generate image: {e}")
|
|
172
|
-
return f"Error: {e}"
|
|
190
|
+
return ToolResult(content=f"Error: {e}")
|
agno/tools/models/gemini.py
CHANGED
|
@@ -7,6 +7,7 @@ from uuid import uuid4
|
|
|
7
7
|
from agno.agent import Agent
|
|
8
8
|
from agno.media import ImageArtifact, VideoArtifact
|
|
9
9
|
from agno.tools import Toolkit
|
|
10
|
+
from agno.tools.function import ToolResult
|
|
10
11
|
from agno.utils.log import log_debug, log_error, log_info
|
|
11
12
|
|
|
12
13
|
try:
|
|
@@ -27,9 +28,18 @@ class GeminiTools(Toolkit):
|
|
|
27
28
|
location: Optional[str] = None,
|
|
28
29
|
image_generation_model: str = "imagen-3.0-generate-002",
|
|
29
30
|
video_generation_model: str = "veo-2.0-generate-001",
|
|
31
|
+
enable_generate_image: bool = True,
|
|
32
|
+
enable_generate_video: bool = True,
|
|
33
|
+
all: bool = False,
|
|
30
34
|
**kwargs,
|
|
31
35
|
):
|
|
32
|
-
|
|
36
|
+
tools = []
|
|
37
|
+
if all or enable_generate_image:
|
|
38
|
+
tools.append(self.generate_image)
|
|
39
|
+
if all or enable_generate_video:
|
|
40
|
+
tools.append(self.generate_video)
|
|
41
|
+
|
|
42
|
+
super().__init__(name="gemini_tools", tools=tools, **kwargs)
|
|
33
43
|
|
|
34
44
|
# Set mode and credentials: use only provided vertexai parameter
|
|
35
45
|
self.vertexai = vertexai or getenv("GOOGLE_GENAI_USE_VERTEXAI") == "true"
|
|
@@ -67,13 +77,13 @@ class GeminiTools(Toolkit):
|
|
|
67
77
|
self,
|
|
68
78
|
agent: Agent,
|
|
69
79
|
prompt: str,
|
|
70
|
-
) ->
|
|
80
|
+
) -> ToolResult:
|
|
71
81
|
"""Generate images based on a text prompt using Google Imagen.
|
|
72
82
|
|
|
73
83
|
Args:
|
|
74
84
|
prompt (str): The text prompt to generate the image from.
|
|
75
85
|
Returns:
|
|
76
|
-
|
|
86
|
+
ToolResult: A ToolResult containing the generated images or error message.
|
|
77
87
|
"""
|
|
78
88
|
|
|
79
89
|
try:
|
|
@@ -87,47 +97,55 @@ class GeminiTools(Toolkit):
|
|
|
87
97
|
# Extract image bytes
|
|
88
98
|
if response.generated_images is None or not response.generated_images:
|
|
89
99
|
log_info("No images were generated.")
|
|
90
|
-
return "Failed to generate image: No images were generated."
|
|
100
|
+
return ToolResult(content="Failed to generate image: No images were generated.")
|
|
91
101
|
|
|
102
|
+
generated_images = []
|
|
92
103
|
for generated_image in response.generated_images:
|
|
93
104
|
if generated_image.image is None or not generated_image.image.image_bytes:
|
|
94
105
|
continue
|
|
106
|
+
|
|
95
107
|
image_bytes = generated_image.image.image_bytes
|
|
96
|
-
base64_encoded_image_bytes = base64.b64encode(image_bytes)
|
|
97
108
|
actual_mime_type = "image/png"
|
|
98
|
-
|
|
99
109
|
media_id = str(uuid4())
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
110
|
+
|
|
111
|
+
# Create ImageArtifact with raw bytes (not base64 encoded)
|
|
112
|
+
image_artifact = ImageArtifact(
|
|
113
|
+
id=media_id,
|
|
114
|
+
content=image_bytes,
|
|
115
|
+
original_prompt=prompt,
|
|
116
|
+
mime_type=actual_mime_type,
|
|
107
117
|
)
|
|
118
|
+
generated_images.append(image_artifact)
|
|
108
119
|
log_debug(f"Successfully generated image {media_id} with model {self.image_model}")
|
|
109
|
-
|
|
120
|
+
|
|
121
|
+
if generated_images:
|
|
122
|
+
return ToolResult(
|
|
123
|
+
content="Image generated successfully",
|
|
124
|
+
images=generated_images,
|
|
125
|
+
)
|
|
126
|
+
else:
|
|
127
|
+
return ToolResult(content="Failed to generate image: No valid images were generated.")
|
|
110
128
|
|
|
111
129
|
except Exception as e:
|
|
112
130
|
log_error(f"Failed to generate image: Client or method not available ({e})")
|
|
113
|
-
return f"Failed to generate image: Client or method not available ({e})"
|
|
131
|
+
return ToolResult(content=f"Failed to generate image: Client or method not available ({e})")
|
|
114
132
|
|
|
115
133
|
def generate_video(
|
|
116
134
|
self,
|
|
117
135
|
agent: Agent,
|
|
118
136
|
prompt: str,
|
|
119
|
-
) ->
|
|
137
|
+
) -> ToolResult:
|
|
120
138
|
"""Generate a video based on a text prompt.
|
|
121
139
|
Args:
|
|
122
140
|
prompt (str): The text prompt to generate the video from.
|
|
123
141
|
Returns:
|
|
124
|
-
|
|
142
|
+
ToolResult: A ToolResult containing the generated video or error message.
|
|
125
143
|
"""
|
|
126
144
|
# Video generation requires Vertex AI mode.
|
|
127
145
|
if not self.vertexai:
|
|
128
146
|
log_error("Video generation requires Vertex AI mode. Please enable Vertex AI mode.")
|
|
129
|
-
return (
|
|
130
|
-
"Video generation requires Vertex AI mode. "
|
|
147
|
+
return ToolResult(
|
|
148
|
+
content="Video generation requires Vertex AI mode. "
|
|
131
149
|
"Please set `vertexai=True` or environment variable `GOOGLE_GENAI_USE_VERTEXAI=true`."
|
|
132
150
|
)
|
|
133
151
|
|
|
@@ -149,28 +167,37 @@ class GeminiTools(Toolkit):
|
|
|
149
167
|
result = operation.result
|
|
150
168
|
if result is None or result.generated_videos is None or not result.generated_videos:
|
|
151
169
|
log_error("No videos were generated.")
|
|
152
|
-
return "Failed to generate video: No videos were generated."
|
|
170
|
+
return ToolResult(content="Failed to generate video: No videos were generated.")
|
|
153
171
|
|
|
172
|
+
generated_videos = []
|
|
154
173
|
for video in result.generated_videos:
|
|
155
174
|
if video.video is None or not video.video.video_bytes:
|
|
156
175
|
continue
|
|
176
|
+
|
|
157
177
|
generated_video = video.video
|
|
158
178
|
if generated_video.video_bytes is None:
|
|
159
179
|
continue
|
|
160
180
|
|
|
161
181
|
media_id = str(uuid4())
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
mime_type=generated_video.mime_type or "video/mp4",
|
|
170
|
-
)
|
|
182
|
+
|
|
183
|
+
# Create VideoArtifact with base64 encoded content
|
|
184
|
+
video_artifact = VideoArtifact(
|
|
185
|
+
id=media_id,
|
|
186
|
+
content=base64.b64encode(generated_video.video_bytes).decode("utf-8"),
|
|
187
|
+
original_prompt=prompt,
|
|
188
|
+
mime_type=generated_video.mime_type or "video/mp4",
|
|
171
189
|
)
|
|
190
|
+
generated_videos.append(video_artifact)
|
|
172
191
|
log_debug(f"Successfully generated video {media_id} with model {self.video_model}")
|
|
173
|
-
|
|
192
|
+
|
|
193
|
+
if generated_videos:
|
|
194
|
+
return ToolResult(
|
|
195
|
+
content="Video generated successfully",
|
|
196
|
+
videos=generated_videos,
|
|
197
|
+
)
|
|
198
|
+
else:
|
|
199
|
+
return ToolResult(content="Failed to generate video: No valid videos were generated.")
|
|
200
|
+
|
|
174
201
|
except Exception as e:
|
|
175
202
|
log_error(f"Failed to generate video: {e}")
|
|
176
|
-
return f"Failed to generate video: {e}"
|
|
203
|
+
return ToolResult(content=f"Failed to generate video: {e}")
|
agno/tools/models/groq.py
CHANGED
|
@@ -1,12 +1,13 @@
|
|
|
1
1
|
import base64
|
|
2
|
-
import os
|
|
3
2
|
from os import getenv
|
|
4
|
-
from
|
|
3
|
+
from pathlib import Path
|
|
4
|
+
from typing import Any, List, Optional
|
|
5
5
|
from uuid import uuid4
|
|
6
6
|
|
|
7
7
|
from agno.agent import Agent
|
|
8
8
|
from agno.media import AudioArtifact
|
|
9
9
|
from agno.tools import Toolkit
|
|
10
|
+
from agno.tools.function import ToolResult
|
|
10
11
|
from agno.utils.log import log_debug, log_error
|
|
11
12
|
|
|
12
13
|
try:
|
|
@@ -25,11 +26,21 @@ class GroqTools(Toolkit):
|
|
|
25
26
|
translation_model: str = "whisper-large-v3",
|
|
26
27
|
tts_model: str = "playai-tts",
|
|
27
28
|
tts_voice: str = "Chip-PlayAI",
|
|
29
|
+
enable_transcribe_audio: bool = True,
|
|
30
|
+
enable_translate_audio: bool = True,
|
|
31
|
+
enable_generate_speech: bool = True,
|
|
32
|
+
all: bool = False,
|
|
28
33
|
**kwargs,
|
|
29
34
|
):
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
35
|
+
tools: List[Any] = []
|
|
36
|
+
if all or enable_transcribe_audio:
|
|
37
|
+
tools.append(self.transcribe_audio)
|
|
38
|
+
if all or enable_translate_audio:
|
|
39
|
+
tools.append(self.translate_audio)
|
|
40
|
+
if all or enable_generate_speech:
|
|
41
|
+
tools.append(self.generate_speech)
|
|
42
|
+
|
|
43
|
+
super().__init__(name="groq_tools", tools=tools, **kwargs)
|
|
33
44
|
|
|
34
45
|
self.api_key = api_key or getenv("GROQ_API_KEY")
|
|
35
46
|
if not self.api_key:
|
|
@@ -52,7 +63,7 @@ class GroqTools(Toolkit):
|
|
|
52
63
|
log_debug(f"Transcribing audio from {audio_source} using Groq model {self.transcription_model}")
|
|
53
64
|
try:
|
|
54
65
|
# Check if the audio source as a local file or a URL
|
|
55
|
-
if not
|
|
66
|
+
if not Path(audio_source).exists():
|
|
56
67
|
log_debug(f"Audio source '{audio_source}' not found locally, attempting as URL.")
|
|
57
68
|
transcription_text = self.client.audio.transcriptions.create(
|
|
58
69
|
url=audio_source,
|
|
@@ -63,7 +74,7 @@ class GroqTools(Toolkit):
|
|
|
63
74
|
log_debug(f"Transcribing local file: {audio_source}")
|
|
64
75
|
with open(audio_source, "rb") as audio_file:
|
|
65
76
|
transcription_text = self.client.audio.transcriptions.create(
|
|
66
|
-
file=(
|
|
77
|
+
file=(Path(audio_source).name, audio_file.read()),
|
|
67
78
|
model=self.transcription_model,
|
|
68
79
|
response_format="text",
|
|
69
80
|
)
|
|
@@ -83,7 +94,7 @@ class GroqTools(Toolkit):
|
|
|
83
94
|
"""
|
|
84
95
|
log_debug(f"Translating audio from {audio_source} to English using Groq model {self.translation_model}")
|
|
85
96
|
try:
|
|
86
|
-
if not
|
|
97
|
+
if not Path(audio_source).exists():
|
|
87
98
|
log_debug(f"Audio source '{audio_source}' not found locally.")
|
|
88
99
|
translation = self.client.audio.translations.create(
|
|
89
100
|
url=audio_source,
|
|
@@ -94,7 +105,7 @@ class GroqTools(Toolkit):
|
|
|
94
105
|
log_debug(f"Translating local file: {audio_source}")
|
|
95
106
|
with open(audio_source, "rb") as audio_file:
|
|
96
107
|
translation = self.client.audio.translations.create(
|
|
97
|
-
file=(
|
|
108
|
+
file=(Path(audio_source).name, audio_file.read()),
|
|
98
109
|
model=self.translation_model,
|
|
99
110
|
response_format="text",
|
|
100
111
|
)
|
|
@@ -109,14 +120,13 @@ class GroqTools(Toolkit):
|
|
|
109
120
|
self,
|
|
110
121
|
agent: Agent,
|
|
111
122
|
text_input: str,
|
|
112
|
-
) ->
|
|
123
|
+
) -> ToolResult:
|
|
113
124
|
"""Generate speech from text using Groq's Text-to-Speech API.
|
|
114
|
-
Adds the generated audio as an AudioArtifact to the agent.
|
|
115
125
|
|
|
116
126
|
Args:
|
|
117
127
|
text_input: The text to synthesize into speech.
|
|
118
128
|
Returns:
|
|
119
|
-
|
|
129
|
+
ToolResult: Contains the generated audio artifact or error message.
|
|
120
130
|
"""
|
|
121
131
|
log_debug(
|
|
122
132
|
f"Generating speech for text: '{text_input[:50]}...' using Groq model {self.tts_model}, voice {self.tts_voice}"
|
|
@@ -136,16 +146,15 @@ class GroqTools(Toolkit):
|
|
|
136
146
|
base64_encoded_audio = base64.b64encode(audio_data).decode("utf-8")
|
|
137
147
|
|
|
138
148
|
media_id = str(uuid4())
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
mime_type="audio/wav",
|
|
144
|
-
)
|
|
149
|
+
audio_artifact = AudioArtifact(
|
|
150
|
+
id=media_id,
|
|
151
|
+
base64_audio=base64_encoded_audio,
|
|
152
|
+
mime_type="audio/wav",
|
|
145
153
|
)
|
|
154
|
+
|
|
146
155
|
log_debug(f"Successfully generated speech artifact with ID: {media_id}")
|
|
147
|
-
return f"Speech generated successfully with ID: {media_id}"
|
|
156
|
+
return ToolResult(content=f"Speech generated successfully with ID: {media_id}", audios=[audio_artifact])
|
|
148
157
|
|
|
149
158
|
except Exception as e:
|
|
150
159
|
log_error(f"Failed to generate speech with Groq: {str(e)}")
|
|
151
|
-
return f"Failed to generate speech with Groq: {str(e)}"
|
|
160
|
+
return ToolResult(content=f"Failed to generate speech with Groq: {str(e)}")
|
agno/tools/models/nebius.py
CHANGED
|
@@ -7,6 +7,7 @@ from agno.agent import Agent
|
|
|
7
7
|
from agno.media import ImageArtifact
|
|
8
8
|
from agno.models.nebius import Nebius
|
|
9
9
|
from agno.tools import Toolkit
|
|
10
|
+
from agno.tools.function import ToolResult
|
|
10
11
|
from agno.utils.log import log_error, log_warning
|
|
11
12
|
|
|
12
13
|
|
|
@@ -21,6 +22,8 @@ class NebiusTools(Toolkit):
|
|
|
21
22
|
image_quality: Optional[str] = "standard",
|
|
22
23
|
image_size: Optional[str] = "1024x1024",
|
|
23
24
|
image_style: Optional[str] = None,
|
|
25
|
+
enable_generate_image: bool = True,
|
|
26
|
+
all: bool = False,
|
|
24
27
|
**kwargs,
|
|
25
28
|
):
|
|
26
29
|
"""Initialize Nebius AI Studio text-to-image tools.
|
|
@@ -35,9 +38,15 @@ class NebiusTools(Toolkit):
|
|
|
35
38
|
image_quality: Image quality. Options: "standard", "hd".
|
|
36
39
|
image_size: Image size in format "WIDTHxHEIGHT". Max supported: 2000x2000.
|
|
37
40
|
image_style: Optional style preset to apply.
|
|
41
|
+
enable_generate_image: Enable image generation functionality.
|
|
42
|
+
all: Enable all functions.
|
|
38
43
|
**kwargs: Additional arguments to pass to Toolkit.
|
|
39
44
|
"""
|
|
40
|
-
|
|
45
|
+
tools = []
|
|
46
|
+
if all or enable_generate_image:
|
|
47
|
+
tools.append(self.generate_image)
|
|
48
|
+
|
|
49
|
+
super().__init__(name="nebius_tools", tools=tools, **kwargs)
|
|
41
50
|
|
|
42
51
|
self.api_key = api_key or getenv("NEBIUS_API_KEY")
|
|
43
52
|
if not self.api_key:
|
|
@@ -59,7 +68,7 @@ class NebiusTools(Toolkit):
|
|
|
59
68
|
self,
|
|
60
69
|
agent: Agent,
|
|
61
70
|
prompt: str,
|
|
62
|
-
) ->
|
|
71
|
+
) -> ToolResult:
|
|
63
72
|
"""Generate images based on a text prompt using Nebius AI Studio.
|
|
64
73
|
|
|
65
74
|
Args:
|
|
@@ -67,7 +76,7 @@ class NebiusTools(Toolkit):
|
|
|
67
76
|
prompt: The text prompt to generate images from.
|
|
68
77
|
|
|
69
78
|
Returns:
|
|
70
|
-
A
|
|
79
|
+
ToolResult: A ToolResult containing the generated image or error message.
|
|
71
80
|
"""
|
|
72
81
|
try:
|
|
73
82
|
extra_params = {
|
|
@@ -91,18 +100,25 @@ class NebiusTools(Toolkit):
|
|
|
91
100
|
data = response.data[0]
|
|
92
101
|
if data is None:
|
|
93
102
|
log_warning("Nebius API did not return any data.")
|
|
94
|
-
return "Failed to generate image: No data received from API."
|
|
103
|
+
return ToolResult(content="Failed to generate image: No data received from API.")
|
|
104
|
+
|
|
95
105
|
if hasattr(data, "b64_json") and data.b64_json:
|
|
96
106
|
image_base64 = data.b64_json
|
|
97
107
|
image_content_bytes = base64.b64decode(image_base64)
|
|
98
108
|
media_id = str(uuid4())
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
109
|
+
|
|
110
|
+
# Create ImageArtifact with raw bytes
|
|
111
|
+
image_artifact = ImageArtifact(
|
|
112
|
+
id=media_id, content=image_content_bytes, mime_type="image/png", original_prompt=prompt
|
|
103
113
|
)
|
|
104
|
-
|
|
105
|
-
|
|
114
|
+
|
|
115
|
+
return ToolResult(
|
|
116
|
+
content="Image generated successfully.",
|
|
117
|
+
images=[image_artifact],
|
|
118
|
+
)
|
|
119
|
+
|
|
120
|
+
return ToolResult(content="Failed to generate image: No content received from API.")
|
|
121
|
+
|
|
106
122
|
except Exception as e:
|
|
107
123
|
log_error(f"Failed to generate image using {self.image_model}: {e}")
|
|
108
|
-
return f"Failed to generate image: {e}"
|
|
124
|
+
return ToolResult(content=f"Failed to generate image: {e}")
|
agno/tools/models_labs.py
CHANGED
|
@@ -9,6 +9,7 @@ from agno.media import AudioArtifact, ImageArtifact, VideoArtifact
|
|
|
9
9
|
from agno.models.response import FileType
|
|
10
10
|
from agno.team import Team
|
|
11
11
|
from agno.tools import Toolkit
|
|
12
|
+
from agno.tools.function import ToolResult
|
|
12
13
|
from agno.utils.log import log_debug, log_info, logger
|
|
13
14
|
|
|
14
15
|
try:
|
|
@@ -86,16 +87,25 @@ class ModelsLabTools(Toolkit):
|
|
|
86
87
|
|
|
87
88
|
return base_payload
|
|
88
89
|
|
|
89
|
-
def
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
90
|
+
def _create_media_artifacts(self, media_id: str, media_url: str, eta: Optional[str] = None) -> Dict[str, List]:
|
|
91
|
+
"""Create appropriate media artifacts based on file type."""
|
|
92
|
+
artifacts: Dict[str, List[Union[ImageArtifact, VideoArtifact, AudioArtifact]]] = {
|
|
93
|
+
"images": [],
|
|
94
|
+
"videos": [],
|
|
95
|
+
"audios": [],
|
|
96
|
+
}
|
|
97
|
+
|
|
93
98
|
if self.file_type == FileType.MP4:
|
|
94
|
-
|
|
99
|
+
video_artifact = VideoArtifact(id=str(media_id), url=media_url, eta=str(eta))
|
|
100
|
+
artifacts["videos"].append(video_artifact)
|
|
95
101
|
elif self.file_type == FileType.GIF:
|
|
96
|
-
|
|
102
|
+
image_artifact = ImageArtifact(id=str(media_id), url=media_url)
|
|
103
|
+
artifacts["images"].append(image_artifact)
|
|
97
104
|
elif self.file_type == FileType.MP3:
|
|
98
|
-
|
|
105
|
+
audio_artifact = AudioArtifact(id=str(media_id), url=media_url)
|
|
106
|
+
artifacts["audios"].append(audio_artifact)
|
|
107
|
+
|
|
108
|
+
return artifacts
|
|
99
109
|
|
|
100
110
|
def _wait_for_media(self, media_id: str, eta: int) -> bool:
|
|
101
111
|
"""Wait for media generation to complete."""
|
|
@@ -121,10 +131,10 @@ class ModelsLabTools(Toolkit):
|
|
|
121
131
|
|
|
122
132
|
return False
|
|
123
133
|
|
|
124
|
-
def generate_media(self, agent: Union[Agent, Team], prompt: str) ->
|
|
134
|
+
def generate_media(self, agent: Union[Agent, Team], prompt: str) -> ToolResult:
|
|
125
135
|
"""Generate media (video, image, or audio) given a prompt."""
|
|
126
136
|
if not self.api_key:
|
|
127
|
-
return "Please set the MODELS_LAB_API_KEY"
|
|
137
|
+
return ToolResult(content="Please set the MODELS_LAB_API_KEY")
|
|
128
138
|
|
|
129
139
|
try:
|
|
130
140
|
payload = json.dumps(self._create_payload(prompt))
|
|
@@ -139,19 +149,27 @@ class ModelsLabTools(Toolkit):
|
|
|
139
149
|
status = result.get("status")
|
|
140
150
|
if status == "error":
|
|
141
151
|
logger.error(f"Error in response: {result.get('message')}")
|
|
142
|
-
return f"Error: {result.get('message')}"
|
|
152
|
+
return ToolResult(content=f"Error: {result.get('message')}")
|
|
143
153
|
|
|
144
154
|
if "error" in result:
|
|
145
155
|
error_msg = f"Failed to generate {self.file_type.value}: {result['error']}"
|
|
146
156
|
logger.error(error_msg)
|
|
147
|
-
return f"Error: {result['error']}"
|
|
157
|
+
return ToolResult(content=f"Error: {result['error']}")
|
|
148
158
|
|
|
149
159
|
eta = result.get("eta")
|
|
150
160
|
url_links = result.get("future_links")
|
|
151
161
|
media_id = str(uuid4())
|
|
152
162
|
|
|
163
|
+
# Collect all media artifacts
|
|
164
|
+
all_images = []
|
|
165
|
+
all_videos = []
|
|
166
|
+
all_audios = []
|
|
167
|
+
|
|
153
168
|
for media_url in url_links:
|
|
154
|
-
self.
|
|
169
|
+
artifacts = self._create_media_artifacts(media_id, media_url, str(eta))
|
|
170
|
+
all_images.extend(artifacts["images"])
|
|
171
|
+
all_videos.extend(artifacts["videos"])
|
|
172
|
+
all_audios.extend(artifacts["audios"])
|
|
155
173
|
|
|
156
174
|
if self.wait_for_completion and isinstance(eta, int):
|
|
157
175
|
if self._wait_for_media(media_id, eta):
|
|
@@ -159,13 +177,19 @@ class ModelsLabTools(Toolkit):
|
|
|
159
177
|
else:
|
|
160
178
|
logger.warning("Media generation timed out")
|
|
161
179
|
|
|
162
|
-
|
|
180
|
+
# Return ToolResult with appropriate media artifacts
|
|
181
|
+
return ToolResult(
|
|
182
|
+
content=f"{self.file_type.value.capitalize()} has been generated successfully and will be ready in {eta} seconds",
|
|
183
|
+
images=all_images if all_images else None,
|
|
184
|
+
videos=all_videos if all_videos else None,
|
|
185
|
+
audios=all_audios if all_audios else None,
|
|
186
|
+
)
|
|
163
187
|
|
|
164
188
|
except RequestException as e:
|
|
165
189
|
error_msg = f"Network error while generating {self.file_type.value}: {e}"
|
|
166
190
|
logger.error(error_msg)
|
|
167
|
-
return f"Error: {error_msg}"
|
|
191
|
+
return ToolResult(content=f"Error: {error_msg}")
|
|
168
192
|
except Exception as e:
|
|
169
193
|
error_msg = f"Unexpected error while generating {self.file_type.value}: {e}"
|
|
170
194
|
logger.error(error_msg)
|
|
171
|
-
return f"Error: {error_msg}"
|
|
195
|
+
return ToolResult(content=f"Error: {error_msg}")
|
agno/tools/moviepy_video.py
CHANGED
|
@@ -14,17 +14,18 @@ class MoviePyVideoTools(Toolkit):
|
|
|
14
14
|
|
|
15
15
|
def __init__(
|
|
16
16
|
self,
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
17
|
+
enable_process_video: bool = True,
|
|
18
|
+
enable_generate_captions: bool = True,
|
|
19
|
+
enable_embed_captions: bool = True,
|
|
20
|
+
all: bool = False,
|
|
20
21
|
**kwargs,
|
|
21
22
|
):
|
|
22
23
|
tools: List[Any] = []
|
|
23
|
-
if
|
|
24
|
+
if enable_process_video or all:
|
|
24
25
|
tools.append(self.extract_audio)
|
|
25
|
-
if
|
|
26
|
+
if enable_generate_captions or all:
|
|
26
27
|
tools.append(self.create_srt)
|
|
27
|
-
if
|
|
28
|
+
if enable_embed_captions or all:
|
|
28
29
|
tools.append(self.embed_captions)
|
|
29
30
|
|
|
30
31
|
super().__init__(name="video_tools", tools=tools, **kwargs)
|