agno 1.8.1__py3-none-any.whl → 2.0.0__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- agno/__init__.py +8 -0
- agno/agent/__init__.py +19 -27
- agno/agent/agent.py +3143 -4170
- agno/api/agent.py +11 -67
- agno/api/api.py +5 -46
- agno/api/evals.py +8 -19
- agno/api/os.py +17 -0
- agno/api/routes.py +6 -41
- agno/api/schemas/__init__.py +9 -0
- agno/api/schemas/agent.py +5 -21
- agno/api/schemas/evals.py +7 -16
- agno/api/schemas/os.py +14 -0
- agno/api/schemas/team.py +5 -21
- agno/api/schemas/utils.py +21 -0
- agno/api/schemas/workflows.py +11 -7
- agno/api/settings.py +53 -0
- agno/api/team.py +11 -66
- agno/api/workflow.py +28 -0
- agno/cloud/aws/base.py +214 -0
- agno/cloud/aws/s3/__init__.py +2 -0
- agno/cloud/aws/s3/api_client.py +43 -0
- agno/cloud/aws/s3/bucket.py +195 -0
- agno/cloud/aws/s3/object.py +57 -0
- agno/db/__init__.py +24 -0
- agno/db/base.py +245 -0
- agno/db/dynamo/__init__.py +3 -0
- agno/db/dynamo/dynamo.py +1743 -0
- agno/db/dynamo/schemas.py +278 -0
- agno/db/dynamo/utils.py +684 -0
- agno/db/firestore/__init__.py +3 -0
- agno/db/firestore/firestore.py +1432 -0
- agno/db/firestore/schemas.py +130 -0
- agno/db/firestore/utils.py +278 -0
- agno/db/gcs_json/__init__.py +3 -0
- agno/db/gcs_json/gcs_json_db.py +1001 -0
- agno/db/gcs_json/utils.py +194 -0
- agno/db/in_memory/__init__.py +3 -0
- agno/db/in_memory/in_memory_db.py +882 -0
- agno/db/in_memory/utils.py +172 -0
- agno/db/json/__init__.py +3 -0
- agno/db/json/json_db.py +1045 -0
- agno/db/json/utils.py +196 -0
- agno/db/migrations/v1_to_v2.py +162 -0
- agno/db/mongo/__init__.py +3 -0
- agno/db/mongo/mongo.py +1416 -0
- agno/db/mongo/schemas.py +77 -0
- agno/db/mongo/utils.py +204 -0
- agno/db/mysql/__init__.py +3 -0
- agno/db/mysql/mysql.py +1719 -0
- agno/db/mysql/schemas.py +124 -0
- agno/db/mysql/utils.py +297 -0
- agno/db/postgres/__init__.py +3 -0
- agno/db/postgres/postgres.py +1710 -0
- agno/db/postgres/schemas.py +124 -0
- agno/db/postgres/utils.py +280 -0
- agno/db/redis/__init__.py +3 -0
- agno/db/redis/redis.py +1367 -0
- agno/db/redis/schemas.py +109 -0
- agno/db/redis/utils.py +288 -0
- agno/db/schemas/__init__.py +3 -0
- agno/db/schemas/evals.py +33 -0
- agno/db/schemas/knowledge.py +40 -0
- agno/db/schemas/memory.py +46 -0
- agno/db/singlestore/__init__.py +3 -0
- agno/db/singlestore/schemas.py +116 -0
- agno/db/singlestore/singlestore.py +1712 -0
- agno/db/singlestore/utils.py +326 -0
- agno/db/sqlite/__init__.py +3 -0
- agno/db/sqlite/schemas.py +119 -0
- agno/db/sqlite/sqlite.py +1676 -0
- agno/db/sqlite/utils.py +268 -0
- agno/db/utils.py +88 -0
- agno/eval/__init__.py +14 -0
- agno/eval/accuracy.py +154 -48
- agno/eval/performance.py +88 -23
- agno/eval/reliability.py +73 -20
- agno/eval/utils.py +23 -13
- agno/integrations/discord/__init__.py +3 -0
- agno/{app → integrations}/discord/client.py +15 -11
- agno/knowledge/__init__.py +2 -2
- agno/{document → knowledge}/chunking/agentic.py +2 -2
- agno/{document → knowledge}/chunking/document.py +2 -2
- agno/{document → knowledge}/chunking/fixed.py +3 -3
- agno/{document → knowledge}/chunking/markdown.py +2 -2
- agno/{document → knowledge}/chunking/recursive.py +2 -2
- agno/{document → knowledge}/chunking/row.py +2 -2
- agno/knowledge/chunking/semantic.py +59 -0
- agno/knowledge/chunking/strategy.py +121 -0
- agno/knowledge/content.py +74 -0
- agno/knowledge/document/__init__.py +5 -0
- agno/{document → knowledge/document}/base.py +12 -2
- agno/knowledge/embedder/__init__.py +5 -0
- agno/{embedder → knowledge/embedder}/aws_bedrock.py +127 -1
- agno/{embedder → knowledge/embedder}/azure_openai.py +65 -1
- agno/{embedder → knowledge/embedder}/base.py +6 -0
- agno/{embedder → knowledge/embedder}/cohere.py +72 -1
- agno/{embedder → knowledge/embedder}/fastembed.py +17 -1
- agno/{embedder → knowledge/embedder}/fireworks.py +1 -1
- agno/{embedder → knowledge/embedder}/google.py +74 -1
- agno/{embedder → knowledge/embedder}/huggingface.py +36 -2
- agno/{embedder → knowledge/embedder}/jina.py +48 -2
- agno/knowledge/embedder/langdb.py +22 -0
- agno/knowledge/embedder/mistral.py +139 -0
- agno/{embedder → knowledge/embedder}/nebius.py +1 -1
- agno/{embedder → knowledge/embedder}/ollama.py +54 -3
- agno/knowledge/embedder/openai.py +223 -0
- agno/{embedder → knowledge/embedder}/sentence_transformer.py +16 -1
- agno/{embedder → knowledge/embedder}/together.py +1 -1
- agno/{embedder → knowledge/embedder}/voyageai.py +49 -1
- agno/knowledge/knowledge.py +1551 -0
- agno/knowledge/reader/__init__.py +7 -0
- agno/{document → knowledge}/reader/arxiv_reader.py +32 -4
- agno/knowledge/reader/base.py +88 -0
- agno/{document → knowledge}/reader/csv_reader.py +47 -65
- agno/knowledge/reader/docx_reader.py +83 -0
- agno/{document → knowledge}/reader/firecrawl_reader.py +42 -21
- agno/{document → knowledge}/reader/json_reader.py +30 -9
- agno/{document → knowledge}/reader/markdown_reader.py +58 -9
- agno/{document → knowledge}/reader/pdf_reader.py +71 -126
- agno/knowledge/reader/reader_factory.py +268 -0
- agno/knowledge/reader/s3_reader.py +101 -0
- agno/{document → knowledge}/reader/text_reader.py +31 -10
- agno/knowledge/reader/url_reader.py +128 -0
- agno/knowledge/reader/web_search_reader.py +366 -0
- agno/{document → knowledge}/reader/website_reader.py +37 -10
- agno/knowledge/reader/wikipedia_reader.py +59 -0
- agno/knowledge/reader/youtube_reader.py +78 -0
- agno/knowledge/remote_content/remote_content.py +88 -0
- agno/{reranker → knowledge/reranker}/base.py +1 -1
- agno/{reranker → knowledge/reranker}/cohere.py +2 -2
- agno/{reranker → knowledge/reranker}/infinity.py +2 -2
- agno/{reranker → knowledge/reranker}/sentence_transformer.py +2 -2
- agno/knowledge/types.py +30 -0
- agno/knowledge/utils.py +169 -0
- agno/media.py +269 -268
- agno/memory/__init__.py +2 -10
- agno/memory/manager.py +1003 -148
- agno/models/aimlapi/__init__.py +2 -2
- agno/models/aimlapi/aimlapi.py +6 -6
- agno/models/anthropic/claude.py +131 -131
- agno/models/aws/bedrock.py +110 -182
- agno/models/aws/claude.py +64 -18
- agno/models/azure/ai_foundry.py +73 -23
- agno/models/base.py +346 -290
- agno/models/cerebras/cerebras.py +84 -27
- agno/models/cohere/chat.py +106 -98
- agno/models/google/gemini.py +105 -46
- agno/models/groq/groq.py +97 -35
- agno/models/huggingface/huggingface.py +92 -27
- agno/models/ibm/watsonx.py +72 -13
- agno/models/litellm/chat.py +85 -13
- agno/models/message.py +46 -151
- agno/models/meta/llama.py +85 -49
- agno/models/metrics.py +120 -0
- agno/models/mistral/mistral.py +90 -21
- agno/models/ollama/__init__.py +0 -2
- agno/models/ollama/chat.py +85 -47
- agno/models/openai/chat.py +154 -37
- agno/models/openai/responses.py +178 -105
- agno/models/perplexity/perplexity.py +26 -2
- agno/models/portkey/portkey.py +0 -7
- agno/models/response.py +15 -9
- agno/models/utils.py +20 -0
- agno/models/vercel/__init__.py +2 -2
- agno/models/vercel/v0.py +1 -1
- agno/models/vllm/__init__.py +2 -2
- agno/models/vllm/vllm.py +3 -3
- agno/models/xai/xai.py +10 -10
- agno/os/__init__.py +3 -0
- agno/os/app.py +497 -0
- agno/os/auth.py +47 -0
- agno/os/config.py +103 -0
- agno/os/interfaces/agui/__init__.py +3 -0
- agno/os/interfaces/agui/agui.py +31 -0
- agno/{app/agui/async_router.py → os/interfaces/agui/router.py} +16 -16
- agno/{app → os/interfaces}/agui/utils.py +77 -33
- agno/os/interfaces/base.py +21 -0
- agno/os/interfaces/slack/__init__.py +3 -0
- agno/{app/slack/async_router.py → os/interfaces/slack/router.py} +3 -5
- agno/os/interfaces/slack/slack.py +32 -0
- agno/os/interfaces/whatsapp/__init__.py +3 -0
- agno/{app/whatsapp/async_router.py → os/interfaces/whatsapp/router.py} +4 -7
- agno/os/interfaces/whatsapp/whatsapp.py +29 -0
- agno/os/mcp.py +235 -0
- agno/os/router.py +1400 -0
- agno/os/routers/__init__.py +3 -0
- agno/os/routers/evals/__init__.py +3 -0
- agno/os/routers/evals/evals.py +393 -0
- agno/os/routers/evals/schemas.py +142 -0
- agno/os/routers/evals/utils.py +161 -0
- agno/os/routers/knowledge/__init__.py +3 -0
- agno/os/routers/knowledge/knowledge.py +850 -0
- agno/os/routers/knowledge/schemas.py +118 -0
- agno/os/routers/memory/__init__.py +3 -0
- agno/os/routers/memory/memory.py +410 -0
- agno/os/routers/memory/schemas.py +58 -0
- agno/os/routers/metrics/__init__.py +3 -0
- agno/os/routers/metrics/metrics.py +178 -0
- agno/os/routers/metrics/schemas.py +47 -0
- agno/os/routers/session/__init__.py +3 -0
- agno/os/routers/session/session.py +536 -0
- agno/os/schema.py +945 -0
- agno/{app/playground → os}/settings.py +7 -15
- agno/os/utils.py +270 -0
- agno/reasoning/azure_ai_foundry.py +4 -4
- agno/reasoning/deepseek.py +4 -4
- agno/reasoning/default.py +6 -11
- agno/reasoning/groq.py +4 -4
- agno/reasoning/helpers.py +4 -6
- agno/reasoning/ollama.py +4 -4
- agno/reasoning/openai.py +4 -4
- agno/run/agent.py +633 -0
- agno/run/base.py +53 -77
- agno/run/cancel.py +81 -0
- agno/run/team.py +243 -96
- agno/run/workflow.py +550 -12
- agno/session/__init__.py +10 -0
- agno/session/agent.py +244 -0
- agno/session/summary.py +225 -0
- agno/session/team.py +262 -0
- agno/{storage/session/v2 → session}/workflow.py +47 -24
- agno/team/__init__.py +15 -16
- agno/team/team.py +3260 -4824
- agno/tools/agentql.py +14 -5
- agno/tools/airflow.py +9 -4
- agno/tools/api.py +7 -3
- agno/tools/apify.py +2 -46
- agno/tools/arxiv.py +8 -3
- agno/tools/aws_lambda.py +7 -5
- agno/tools/aws_ses.py +7 -1
- agno/tools/baidusearch.py +4 -1
- agno/tools/bitbucket.py +4 -4
- agno/tools/brandfetch.py +14 -11
- agno/tools/bravesearch.py +4 -1
- agno/tools/brightdata.py +43 -23
- agno/tools/browserbase.py +13 -4
- agno/tools/calcom.py +12 -10
- agno/tools/calculator.py +10 -27
- agno/tools/cartesia.py +20 -17
- agno/tools/{clickup_tool.py → clickup.py} +12 -25
- agno/tools/confluence.py +8 -8
- agno/tools/crawl4ai.py +7 -1
- agno/tools/csv_toolkit.py +9 -8
- agno/tools/dalle.py +22 -12
- agno/tools/daytona.py +13 -16
- agno/tools/decorator.py +6 -3
- agno/tools/desi_vocal.py +17 -8
- agno/tools/discord.py +11 -8
- agno/tools/docker.py +30 -42
- agno/tools/duckdb.py +34 -53
- agno/tools/duckduckgo.py +8 -7
- agno/tools/e2b.py +62 -62
- agno/tools/eleven_labs.py +36 -29
- agno/tools/email.py +4 -1
- agno/tools/evm.py +7 -1
- agno/tools/exa.py +19 -14
- agno/tools/fal.py +30 -30
- agno/tools/file.py +9 -8
- agno/tools/financial_datasets.py +25 -44
- agno/tools/firecrawl.py +22 -22
- agno/tools/function.py +127 -18
- agno/tools/giphy.py +23 -11
- agno/tools/github.py +48 -126
- agno/tools/gmail.py +45 -61
- agno/tools/google_bigquery.py +7 -6
- agno/tools/google_maps.py +11 -26
- agno/tools/googlesearch.py +7 -2
- agno/tools/googlesheets.py +21 -17
- agno/tools/hackernews.py +9 -5
- agno/tools/jina.py +5 -4
- agno/tools/jira.py +18 -9
- agno/tools/knowledge.py +31 -32
- agno/tools/linear.py +19 -34
- agno/tools/linkup.py +5 -1
- agno/tools/local_file_system.py +8 -5
- agno/tools/lumalab.py +32 -20
- agno/tools/mcp.py +1 -2
- agno/tools/mem0.py +18 -12
- agno/tools/memori.py +14 -10
- agno/tools/mlx_transcribe.py +3 -2
- agno/tools/models/azure_openai.py +33 -15
- agno/tools/models/gemini.py +59 -32
- agno/tools/models/groq.py +30 -23
- agno/tools/models/nebius.py +28 -12
- agno/tools/models_labs.py +40 -16
- agno/tools/moviepy_video.py +7 -6
- agno/tools/neo4j.py +10 -8
- agno/tools/newspaper.py +7 -2
- agno/tools/newspaper4k.py +8 -3
- agno/tools/openai.py +58 -32
- agno/tools/openbb.py +12 -11
- agno/tools/opencv.py +63 -47
- agno/tools/openweather.py +14 -12
- agno/tools/pandas.py +11 -3
- agno/tools/postgres.py +4 -12
- agno/tools/pubmed.py +4 -1
- agno/tools/python.py +9 -22
- agno/tools/reasoning.py +35 -27
- agno/tools/reddit.py +11 -26
- agno/tools/replicate.py +55 -42
- agno/tools/resend.py +4 -1
- agno/tools/scrapegraph.py +15 -14
- agno/tools/searxng.py +10 -23
- agno/tools/serpapi.py +6 -3
- agno/tools/serper.py +13 -4
- agno/tools/shell.py +9 -2
- agno/tools/slack.py +12 -11
- agno/tools/sleep.py +3 -2
- agno/tools/spider.py +24 -4
- agno/tools/sql.py +7 -6
- agno/tools/tavily.py +6 -4
- agno/tools/telegram.py +12 -4
- agno/tools/todoist.py +11 -31
- agno/tools/toolkit.py +1 -1
- agno/tools/trafilatura.py +22 -6
- agno/tools/trello.py +9 -22
- agno/tools/twilio.py +10 -3
- agno/tools/user_control_flow.py +6 -1
- agno/tools/valyu.py +34 -5
- agno/tools/visualization.py +19 -28
- agno/tools/webbrowser.py +4 -3
- agno/tools/webex.py +11 -7
- agno/tools/website.py +15 -46
- agno/tools/webtools.py +12 -4
- agno/tools/whatsapp.py +5 -9
- agno/tools/wikipedia.py +20 -13
- agno/tools/x.py +14 -13
- agno/tools/yfinance.py +13 -40
- agno/tools/youtube.py +26 -20
- agno/tools/zendesk.py +7 -2
- agno/tools/zep.py +10 -7
- agno/tools/zoom.py +10 -9
- agno/utils/common.py +1 -19
- agno/utils/events.py +100 -123
- agno/utils/gemini.py +32 -2
- agno/utils/knowledge.py +29 -0
- agno/utils/log.py +54 -4
- agno/utils/mcp.py +68 -10
- agno/utils/media.py +39 -0
- agno/utils/message.py +12 -1
- agno/utils/models/aws_claude.py +1 -1
- agno/utils/models/claude.py +47 -4
- agno/utils/models/cohere.py +1 -1
- agno/utils/models/mistral.py +8 -7
- agno/utils/models/schema_utils.py +3 -3
- agno/utils/models/watsonx.py +1 -1
- agno/utils/openai.py +1 -1
- agno/utils/pprint.py +33 -32
- agno/utils/print_response/agent.py +779 -0
- agno/utils/print_response/team.py +1669 -0
- agno/utils/print_response/workflow.py +1451 -0
- agno/utils/prompts.py +14 -14
- agno/utils/reasoning.py +87 -0
- agno/utils/response.py +42 -42
- agno/utils/streamlit.py +481 -0
- agno/utils/string.py +8 -22
- agno/utils/team.py +50 -0
- agno/utils/timer.py +2 -2
- agno/vectordb/base.py +33 -21
- agno/vectordb/cassandra/cassandra.py +287 -23
- agno/vectordb/chroma/chromadb.py +482 -59
- agno/vectordb/clickhouse/clickhousedb.py +270 -63
- agno/vectordb/couchbase/couchbase.py +309 -29
- agno/vectordb/lancedb/lance_db.py +360 -21
- agno/vectordb/langchaindb/__init__.py +5 -0
- agno/vectordb/langchaindb/langchaindb.py +145 -0
- agno/vectordb/lightrag/__init__.py +5 -0
- agno/vectordb/lightrag/lightrag.py +374 -0
- agno/vectordb/llamaindex/llamaindexdb.py +127 -0
- agno/vectordb/milvus/milvus.py +242 -32
- agno/vectordb/mongodb/mongodb.py +200 -24
- agno/vectordb/pgvector/pgvector.py +319 -37
- agno/vectordb/pineconedb/pineconedb.py +221 -27
- agno/vectordb/qdrant/qdrant.py +334 -14
- agno/vectordb/singlestore/singlestore.py +286 -29
- agno/vectordb/surrealdb/surrealdb.py +187 -7
- agno/vectordb/upstashdb/upstashdb.py +342 -26
- agno/vectordb/weaviate/weaviate.py +227 -165
- agno/workflow/__init__.py +17 -13
- agno/workflow/{v2/condition.py → condition.py} +135 -32
- agno/workflow/{v2/loop.py → loop.py} +115 -28
- agno/workflow/{v2/parallel.py → parallel.py} +138 -108
- agno/workflow/{v2/router.py → router.py} +133 -32
- agno/workflow/{v2/step.py → step.py} +207 -49
- agno/workflow/{v2/steps.py → steps.py} +147 -66
- agno/workflow/types.py +482 -0
- agno/workflow/workflow.py +2410 -696
- agno-2.0.0.dist-info/METADATA +494 -0
- agno-2.0.0.dist-info/RECORD +515 -0
- agno-2.0.0.dist-info/licenses/LICENSE +201 -0
- agno/agent/metrics.py +0 -107
- agno/api/app.py +0 -35
- agno/api/playground.py +0 -92
- agno/api/schemas/app.py +0 -12
- agno/api/schemas/playground.py +0 -22
- agno/api/schemas/user.py +0 -35
- agno/api/schemas/workspace.py +0 -46
- agno/api/user.py +0 -160
- agno/api/workflows.py +0 -33
- agno/api/workspace.py +0 -175
- agno/app/agui/__init__.py +0 -3
- agno/app/agui/app.py +0 -17
- agno/app/agui/sync_router.py +0 -120
- agno/app/base.py +0 -186
- agno/app/discord/__init__.py +0 -3
- agno/app/fastapi/__init__.py +0 -3
- agno/app/fastapi/app.py +0 -107
- agno/app/fastapi/async_router.py +0 -457
- agno/app/fastapi/sync_router.py +0 -448
- agno/app/playground/app.py +0 -228
- agno/app/playground/async_router.py +0 -1050
- agno/app/playground/deploy.py +0 -249
- agno/app/playground/operator.py +0 -183
- agno/app/playground/schemas.py +0 -220
- agno/app/playground/serve.py +0 -55
- agno/app/playground/sync_router.py +0 -1042
- agno/app/playground/utils.py +0 -46
- agno/app/settings.py +0 -15
- agno/app/slack/__init__.py +0 -3
- agno/app/slack/app.py +0 -19
- agno/app/slack/sync_router.py +0 -92
- agno/app/utils.py +0 -54
- agno/app/whatsapp/__init__.py +0 -3
- agno/app/whatsapp/app.py +0 -15
- agno/app/whatsapp/sync_router.py +0 -197
- agno/cli/auth_server.py +0 -249
- agno/cli/config.py +0 -274
- agno/cli/console.py +0 -88
- agno/cli/credentials.py +0 -23
- agno/cli/entrypoint.py +0 -571
- agno/cli/operator.py +0 -357
- agno/cli/settings.py +0 -96
- agno/cli/ws/ws_cli.py +0 -817
- agno/constants.py +0 -13
- agno/document/__init__.py +0 -5
- agno/document/chunking/semantic.py +0 -45
- agno/document/chunking/strategy.py +0 -31
- agno/document/reader/__init__.py +0 -5
- agno/document/reader/base.py +0 -47
- agno/document/reader/docx_reader.py +0 -60
- agno/document/reader/gcs/pdf_reader.py +0 -44
- agno/document/reader/s3/pdf_reader.py +0 -59
- agno/document/reader/s3/text_reader.py +0 -63
- agno/document/reader/url_reader.py +0 -59
- agno/document/reader/youtube_reader.py +0 -58
- agno/embedder/__init__.py +0 -5
- agno/embedder/langdb.py +0 -80
- agno/embedder/mistral.py +0 -82
- agno/embedder/openai.py +0 -78
- agno/file/__init__.py +0 -5
- agno/file/file.py +0 -16
- agno/file/local/csv.py +0 -32
- agno/file/local/txt.py +0 -19
- agno/infra/app.py +0 -240
- agno/infra/base.py +0 -144
- agno/infra/context.py +0 -20
- agno/infra/db_app.py +0 -52
- agno/infra/resource.py +0 -205
- agno/infra/resources.py +0 -55
- agno/knowledge/agent.py +0 -702
- agno/knowledge/arxiv.py +0 -33
- agno/knowledge/combined.py +0 -36
- agno/knowledge/csv.py +0 -144
- agno/knowledge/csv_url.py +0 -124
- agno/knowledge/document.py +0 -223
- agno/knowledge/docx.py +0 -137
- agno/knowledge/firecrawl.py +0 -34
- agno/knowledge/gcs/__init__.py +0 -0
- agno/knowledge/gcs/base.py +0 -39
- agno/knowledge/gcs/pdf.py +0 -125
- agno/knowledge/json.py +0 -137
- agno/knowledge/langchain.py +0 -71
- agno/knowledge/light_rag.py +0 -273
- agno/knowledge/llamaindex.py +0 -66
- agno/knowledge/markdown.py +0 -154
- agno/knowledge/pdf.py +0 -164
- agno/knowledge/pdf_bytes.py +0 -42
- agno/knowledge/pdf_url.py +0 -148
- agno/knowledge/s3/__init__.py +0 -0
- agno/knowledge/s3/base.py +0 -64
- agno/knowledge/s3/pdf.py +0 -33
- agno/knowledge/s3/text.py +0 -34
- agno/knowledge/text.py +0 -141
- agno/knowledge/url.py +0 -46
- agno/knowledge/website.py +0 -179
- agno/knowledge/wikipedia.py +0 -32
- agno/knowledge/youtube.py +0 -35
- agno/memory/agent.py +0 -423
- agno/memory/classifier.py +0 -104
- agno/memory/db/__init__.py +0 -5
- agno/memory/db/base.py +0 -42
- agno/memory/db/mongodb.py +0 -189
- agno/memory/db/postgres.py +0 -203
- agno/memory/db/sqlite.py +0 -193
- agno/memory/memory.py +0 -22
- agno/memory/row.py +0 -36
- agno/memory/summarizer.py +0 -201
- agno/memory/summary.py +0 -19
- agno/memory/team.py +0 -415
- agno/memory/v2/__init__.py +0 -2
- agno/memory/v2/db/__init__.py +0 -1
- agno/memory/v2/db/base.py +0 -42
- agno/memory/v2/db/firestore.py +0 -339
- agno/memory/v2/db/mongodb.py +0 -196
- agno/memory/v2/db/postgres.py +0 -214
- agno/memory/v2/db/redis.py +0 -187
- agno/memory/v2/db/schema.py +0 -54
- agno/memory/v2/db/sqlite.py +0 -209
- agno/memory/v2/manager.py +0 -437
- agno/memory/v2/memory.py +0 -1097
- agno/memory/v2/schema.py +0 -55
- agno/memory/v2/summarizer.py +0 -215
- agno/memory/workflow.py +0 -38
- agno/models/ollama/tools.py +0 -430
- agno/models/qwen/__init__.py +0 -5
- agno/playground/__init__.py +0 -10
- agno/playground/deploy.py +0 -3
- agno/playground/playground.py +0 -3
- agno/playground/serve.py +0 -3
- agno/playground/settings.py +0 -3
- agno/reranker/__init__.py +0 -0
- agno/run/response.py +0 -467
- agno/run/v2/__init__.py +0 -0
- agno/run/v2/workflow.py +0 -567
- agno/storage/__init__.py +0 -0
- agno/storage/agent/__init__.py +0 -0
- agno/storage/agent/dynamodb.py +0 -1
- agno/storage/agent/json.py +0 -1
- agno/storage/agent/mongodb.py +0 -1
- agno/storage/agent/postgres.py +0 -1
- agno/storage/agent/singlestore.py +0 -1
- agno/storage/agent/sqlite.py +0 -1
- agno/storage/agent/yaml.py +0 -1
- agno/storage/base.py +0 -60
- agno/storage/dynamodb.py +0 -673
- agno/storage/firestore.py +0 -297
- agno/storage/gcs_json.py +0 -261
- agno/storage/in_memory.py +0 -234
- agno/storage/json.py +0 -237
- agno/storage/mongodb.py +0 -328
- agno/storage/mysql.py +0 -685
- agno/storage/postgres.py +0 -682
- agno/storage/redis.py +0 -336
- agno/storage/session/__init__.py +0 -16
- agno/storage/session/agent.py +0 -64
- agno/storage/session/team.py +0 -63
- agno/storage/session/v2/__init__.py +0 -5
- agno/storage/session/workflow.py +0 -61
- agno/storage/singlestore.py +0 -606
- agno/storage/sqlite.py +0 -646
- agno/storage/workflow/__init__.py +0 -0
- agno/storage/workflow/mongodb.py +0 -1
- agno/storage/workflow/postgres.py +0 -1
- agno/storage/workflow/sqlite.py +0 -1
- agno/storage/yaml.py +0 -241
- agno/tools/thinking.py +0 -73
- agno/utils/defaults.py +0 -57
- agno/utils/filesystem.py +0 -39
- agno/utils/git.py +0 -52
- agno/utils/json_io.py +0 -30
- agno/utils/load_env.py +0 -19
- agno/utils/py_io.py +0 -19
- agno/utils/pyproject.py +0 -18
- agno/utils/resource_filter.py +0 -31
- agno/workflow/v2/__init__.py +0 -21
- agno/workflow/v2/types.py +0 -357
- agno/workflow/v2/workflow.py +0 -3312
- agno/workspace/__init__.py +0 -0
- agno/workspace/config.py +0 -325
- agno/workspace/enums.py +0 -6
- agno/workspace/helpers.py +0 -52
- agno/workspace/operator.py +0 -757
- agno/workspace/settings.py +0 -158
- agno-1.8.1.dist-info/METADATA +0 -982
- agno-1.8.1.dist-info/RECORD +0 -566
- agno-1.8.1.dist-info/entry_points.txt +0 -3
- agno-1.8.1.dist-info/licenses/LICENSE +0 -375
- /agno/{app → db/migrations}/__init__.py +0 -0
- /agno/{app/playground/__init__.py → db/schemas/metrics.py} +0 -0
- /agno/{cli → integrations}/__init__.py +0 -0
- /agno/{cli/ws → knowledge/chunking}/__init__.py +0 -0
- /agno/{document/chunking → knowledge/remote_content}/__init__.py +0 -0
- /agno/{document/reader/gcs → knowledge/reranker}/__init__.py +0 -0
- /agno/{document/reader/s3 → os/interfaces}/__init__.py +0 -0
- /agno/{app → os/interfaces}/slack/security.py +0 -0
- /agno/{app → os/interfaces}/whatsapp/security.py +0 -0
- /agno/{file/local → utils/print_response}/__init__.py +0 -0
- /agno/{infra → vectordb/llamaindex}/__init__.py +0 -0
- {agno-1.8.1.dist-info → agno-2.0.0.dist-info}/WHEEL +0 -0
- {agno-1.8.1.dist-info → agno-2.0.0.dist-info}/top_level.txt +0 -0
agno/tools/models/groq.py
CHANGED
|
@@ -1,12 +1,12 @@
|
|
|
1
|
-
import base64
|
|
2
|
-
import os
|
|
3
1
|
from os import getenv
|
|
4
|
-
from
|
|
2
|
+
from pathlib import Path
|
|
3
|
+
from typing import Any, List, Optional
|
|
5
4
|
from uuid import uuid4
|
|
6
5
|
|
|
7
6
|
from agno.agent import Agent
|
|
8
|
-
from agno.media import
|
|
7
|
+
from agno.media import Audio
|
|
9
8
|
from agno.tools import Toolkit
|
|
9
|
+
from agno.tools.function import ToolResult
|
|
10
10
|
from agno.utils.log import log_debug, log_error
|
|
11
11
|
|
|
12
12
|
try:
|
|
@@ -25,11 +25,21 @@ class GroqTools(Toolkit):
|
|
|
25
25
|
translation_model: str = "whisper-large-v3",
|
|
26
26
|
tts_model: str = "playai-tts",
|
|
27
27
|
tts_voice: str = "Chip-PlayAI",
|
|
28
|
+
enable_transcribe_audio: bool = True,
|
|
29
|
+
enable_translate_audio: bool = True,
|
|
30
|
+
enable_generate_speech: bool = True,
|
|
31
|
+
all: bool = False,
|
|
28
32
|
**kwargs,
|
|
29
33
|
):
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
34
|
+
tools: List[Any] = []
|
|
35
|
+
if all or enable_transcribe_audio:
|
|
36
|
+
tools.append(self.transcribe_audio)
|
|
37
|
+
if all or enable_translate_audio:
|
|
38
|
+
tools.append(self.translate_audio)
|
|
39
|
+
if all or enable_generate_speech:
|
|
40
|
+
tools.append(self.generate_speech)
|
|
41
|
+
|
|
42
|
+
super().__init__(name="groq_tools", tools=tools, **kwargs)
|
|
33
43
|
|
|
34
44
|
self.api_key = api_key or getenv("GROQ_API_KEY")
|
|
35
45
|
if not self.api_key:
|
|
@@ -52,7 +62,7 @@ class GroqTools(Toolkit):
|
|
|
52
62
|
log_debug(f"Transcribing audio from {audio_source} using Groq model {self.transcription_model}")
|
|
53
63
|
try:
|
|
54
64
|
# Check if the audio source as a local file or a URL
|
|
55
|
-
if not
|
|
65
|
+
if not Path(audio_source).exists():
|
|
56
66
|
log_debug(f"Audio source '{audio_source}' not found locally, attempting as URL.")
|
|
57
67
|
transcription_text = self.client.audio.transcriptions.create(
|
|
58
68
|
url=audio_source,
|
|
@@ -63,7 +73,7 @@ class GroqTools(Toolkit):
|
|
|
63
73
|
log_debug(f"Transcribing local file: {audio_source}")
|
|
64
74
|
with open(audio_source, "rb") as audio_file:
|
|
65
75
|
transcription_text = self.client.audio.transcriptions.create(
|
|
66
|
-
file=(
|
|
76
|
+
file=(Path(audio_source).name, audio_file.read()),
|
|
67
77
|
model=self.transcription_model,
|
|
68
78
|
response_format="text",
|
|
69
79
|
)
|
|
@@ -83,7 +93,7 @@ class GroqTools(Toolkit):
|
|
|
83
93
|
"""
|
|
84
94
|
log_debug(f"Translating audio from {audio_source} to English using Groq model {self.translation_model}")
|
|
85
95
|
try:
|
|
86
|
-
if not
|
|
96
|
+
if not Path(audio_source).exists():
|
|
87
97
|
log_debug(f"Audio source '{audio_source}' not found locally.")
|
|
88
98
|
translation = self.client.audio.translations.create(
|
|
89
99
|
url=audio_source,
|
|
@@ -94,7 +104,7 @@ class GroqTools(Toolkit):
|
|
|
94
104
|
log_debug(f"Translating local file: {audio_source}")
|
|
95
105
|
with open(audio_source, "rb") as audio_file:
|
|
96
106
|
translation = self.client.audio.translations.create(
|
|
97
|
-
file=(
|
|
107
|
+
file=(Path(audio_source).name, audio_file.read()),
|
|
98
108
|
model=self.translation_model,
|
|
99
109
|
response_format="text",
|
|
100
110
|
)
|
|
@@ -109,14 +119,13 @@ class GroqTools(Toolkit):
|
|
|
109
119
|
self,
|
|
110
120
|
agent: Agent,
|
|
111
121
|
text_input: str,
|
|
112
|
-
) ->
|
|
122
|
+
) -> ToolResult:
|
|
113
123
|
"""Generate speech from text using Groq's Text-to-Speech API.
|
|
114
|
-
Adds the generated audio as an AudioArtifact to the agent.
|
|
115
124
|
|
|
116
125
|
Args:
|
|
117
126
|
text_input: The text to synthesize into speech.
|
|
118
127
|
Returns:
|
|
119
|
-
|
|
128
|
+
ToolResult: Contains the generated audio artifact or error message.
|
|
120
129
|
"""
|
|
121
130
|
log_debug(
|
|
122
131
|
f"Generating speech for text: '{text_input[:50]}...' using Groq model {self.tts_model}, voice {self.tts_voice}"
|
|
@@ -133,19 +142,17 @@ class GroqTools(Toolkit):
|
|
|
133
142
|
log_debug(f"Groq TTS Response: {response}")
|
|
134
143
|
|
|
135
144
|
audio_data: bytes = response.read()
|
|
136
|
-
base64_encoded_audio = base64.b64encode(audio_data).decode("utf-8")
|
|
137
145
|
|
|
138
146
|
media_id = str(uuid4())
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
mime_type="audio/wav",
|
|
144
|
-
)
|
|
147
|
+
audio_artifact = Audio(
|
|
148
|
+
id=media_id,
|
|
149
|
+
content=audio_data,
|
|
150
|
+
mime_type="audio/wav",
|
|
145
151
|
)
|
|
152
|
+
|
|
146
153
|
log_debug(f"Successfully generated speech artifact with ID: {media_id}")
|
|
147
|
-
return f"Speech generated successfully with ID: {media_id}"
|
|
154
|
+
return ToolResult(content=f"Speech generated successfully with ID: {media_id}", audios=[audio_artifact])
|
|
148
155
|
|
|
149
156
|
except Exception as e:
|
|
150
157
|
log_error(f"Failed to generate speech with Groq: {str(e)}")
|
|
151
|
-
return f"Failed to generate speech with Groq: {str(e)}"
|
|
158
|
+
return ToolResult(content=f"Failed to generate speech with Groq: {str(e)}")
|
agno/tools/models/nebius.py
CHANGED
|
@@ -4,9 +4,10 @@ from typing import Optional
|
|
|
4
4
|
from uuid import uuid4
|
|
5
5
|
|
|
6
6
|
from agno.agent import Agent
|
|
7
|
-
from agno.media import
|
|
7
|
+
from agno.media import Image
|
|
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 = Image(
|
|
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
|
@@ -5,10 +5,11 @@ from typing import Any, Dict, List, Optional, Union
|
|
|
5
5
|
from uuid import uuid4
|
|
6
6
|
|
|
7
7
|
from agno.agent import Agent
|
|
8
|
-
from agno.media import
|
|
8
|
+
from agno.media import Audio, Image, Video
|
|
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[Image, Video, Audio]]] = {
|
|
93
|
+
"images": [],
|
|
94
|
+
"videos": [],
|
|
95
|
+
"audios": [],
|
|
96
|
+
}
|
|
97
|
+
|
|
93
98
|
if self.file_type == FileType.MP4:
|
|
94
|
-
|
|
99
|
+
video_artifact = Video(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 = Image(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 = Audio(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)
|
agno/tools/neo4j.py
CHANGED
|
@@ -17,10 +17,12 @@ class Neo4jTools(Toolkit):
|
|
|
17
17
|
user: Optional[str] = None,
|
|
18
18
|
password: Optional[str] = None,
|
|
19
19
|
database: Optional[str] = None,
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
20
|
+
# Enable flags for <6 functions
|
|
21
|
+
enable_list_labels: bool = True,
|
|
22
|
+
enable_list_relationships: bool = True,
|
|
23
|
+
enable_get_schema: bool = True,
|
|
24
|
+
enable_run_cypher: bool = True,
|
|
25
|
+
all: bool = False,
|
|
24
26
|
**kwargs,
|
|
25
27
|
):
|
|
26
28
|
"""
|
|
@@ -62,13 +64,13 @@ class Neo4jTools(Toolkit):
|
|
|
62
64
|
|
|
63
65
|
# Register toolkit methods as tools
|
|
64
66
|
tools: List[Any] = []
|
|
65
|
-
if
|
|
67
|
+
if all or enable_list_labels:
|
|
66
68
|
tools.append(self.list_labels)
|
|
67
|
-
if
|
|
69
|
+
if all or enable_list_relationships:
|
|
68
70
|
tools.append(self.list_relationship_types)
|
|
69
|
-
if
|
|
71
|
+
if all or enable_get_schema:
|
|
70
72
|
tools.append(self.get_schema)
|
|
71
|
-
if
|
|
73
|
+
if all or enable_run_cypher:
|
|
72
74
|
tools.append(self.run_cypher_query)
|
|
73
75
|
super().__init__(name="neo4j_tools", tools=tools, **kwargs)
|
|
74
76
|
|
agno/tools/newspaper.py
CHANGED
|
@@ -14,9 +14,14 @@ class NewspaperTools(Toolkit):
|
|
|
14
14
|
get_article_text (bool): Whether to get the text of an article from a URL.
|
|
15
15
|
"""
|
|
16
16
|
|
|
17
|
-
def __init__(
|
|
17
|
+
def __init__(
|
|
18
|
+
self,
|
|
19
|
+
enable_get_article_text: bool = True,
|
|
20
|
+
all: bool = False,
|
|
21
|
+
**kwargs,
|
|
22
|
+
):
|
|
18
23
|
tools = []
|
|
19
|
-
if
|
|
24
|
+
if all or enable_get_article_text:
|
|
20
25
|
tools.append(self.get_article_text)
|
|
21
26
|
|
|
22
27
|
super().__init__(name="newspaper_toolkit", tools=tools, **kwargs)
|
agno/tools/newspaper4k.py
CHANGED
|
@@ -14,19 +14,24 @@ class Newspaper4kTools(Toolkit):
|
|
|
14
14
|
"""
|
|
15
15
|
Newspaper4kTools is a toolkit for getting the text of an article from a URL.
|
|
16
16
|
Args:
|
|
17
|
-
|
|
17
|
+
enable_read_article (bool): Whether to read an article from a URL.
|
|
18
18
|
include_summary (bool): Whether to include the summary of an article.
|
|
19
19
|
article_length (Optional[int]): The length of the article to read.
|
|
20
20
|
"""
|
|
21
21
|
|
|
22
22
|
def __init__(
|
|
23
|
-
self,
|
|
23
|
+
self,
|
|
24
|
+
include_summary: bool = False,
|
|
25
|
+
article_length: Optional[int] = None,
|
|
26
|
+
enable_read_article: bool = True,
|
|
27
|
+
all: bool = False,
|
|
28
|
+
**kwargs,
|
|
24
29
|
):
|
|
25
30
|
self.include_summary: bool = include_summary
|
|
26
31
|
self.article_length: Optional[int] = article_length
|
|
27
32
|
|
|
28
33
|
tools = []
|
|
29
|
-
if
|
|
34
|
+
if all or enable_read_article:
|
|
30
35
|
tools.append(self.read_article)
|
|
31
36
|
|
|
32
37
|
super().__init__(name="newspaper4k_tools", tools=tools, **kwargs)
|
agno/tools/openai.py
CHANGED
|
@@ -3,9 +3,10 @@ from typing import Any, List, Literal, Optional, Union
|
|
|
3
3
|
from uuid import uuid4
|
|
4
4
|
|
|
5
5
|
from agno.agent import Agent
|
|
6
|
-
from agno.media import
|
|
6
|
+
from agno.media import Audio, Image
|
|
7
7
|
from agno.team.team import Team
|
|
8
8
|
from agno.tools import Toolkit
|
|
9
|
+
from agno.tools.function import ToolResult
|
|
9
10
|
from agno.utils.log import log_debug, log_error, log_warning
|
|
10
11
|
|
|
11
12
|
try:
|
|
@@ -20,7 +21,23 @@ OpenAITTSFormat = Literal["mp3", "opus", "aac", "flac", "wav", "pcm"]
|
|
|
20
21
|
|
|
21
22
|
|
|
22
23
|
class OpenAITools(Toolkit):
|
|
23
|
-
"""Tools for interacting with
|
|
24
|
+
"""Tools for interacting with OpenAI API.
|
|
25
|
+
|
|
26
|
+
Args:
|
|
27
|
+
api_key (str, optional): OpenAI API key. Retrieved from OPENAI_API_KEY env variable if not provided.
|
|
28
|
+
enable_transcription (bool): Enable audio transcription functionality. Default is True.
|
|
29
|
+
enable_image_generation (bool): Enable image generation functionality. Default is True.
|
|
30
|
+
enable_speech_generation (bool): Enable speech generation functionality. Default is True.
|
|
31
|
+
all (bool): Enable all tools. Overrides individual flags when True. Default is False.
|
|
32
|
+
transcription_model (str): Model to use for transcription. Default is "whisper-1".
|
|
33
|
+
text_to_speech_voice (OpenAIVoice): Voice to use for TTS. Default is "alloy".
|
|
34
|
+
text_to_speech_model (OpenAITTSModel): Model to use for TTS. Default is "tts-1".
|
|
35
|
+
text_to_speech_format (OpenAITTSFormat): Audio format for TTS. Default is "mp3".
|
|
36
|
+
image_model (str, optional): Model to use for image generation. Default is "dall-e-3".
|
|
37
|
+
image_quality (str, optional): Quality setting for image generation.
|
|
38
|
+
image_size (str, optional): Size setting for image generation.
|
|
39
|
+
image_style (str, optional): Style setting for image generation.
|
|
40
|
+
"""
|
|
24
41
|
|
|
25
42
|
def __init__(
|
|
26
43
|
self,
|
|
@@ -28,6 +45,7 @@ class OpenAITools(Toolkit):
|
|
|
28
45
|
enable_transcription: bool = True,
|
|
29
46
|
enable_image_generation: bool = True,
|
|
30
47
|
enable_speech_generation: bool = True,
|
|
48
|
+
all: bool = False,
|
|
31
49
|
transcription_model: str = "whisper-1",
|
|
32
50
|
text_to_speech_voice: OpenAIVoice = "alloy",
|
|
33
51
|
text_to_speech_model: OpenAITTSModel = "tts-1",
|
|
@@ -53,11 +71,11 @@ class OpenAITools(Toolkit):
|
|
|
53
71
|
self.image_size = image_size
|
|
54
72
|
|
|
55
73
|
tools: List[Any] = []
|
|
56
|
-
if enable_transcription:
|
|
74
|
+
if all or enable_transcription:
|
|
57
75
|
tools.append(self.transcribe_audio)
|
|
58
|
-
if enable_image_generation:
|
|
76
|
+
if all or enable_image_generation:
|
|
59
77
|
tools.append(self.generate_image)
|
|
60
|
-
if enable_speech_generation:
|
|
78
|
+
if all or enable_speech_generation:
|
|
61
79
|
tools.append(self.generate_speech)
|
|
62
80
|
|
|
63
81
|
super().__init__(name="openai_tools", tools=tools, **kwargs)
|
|
@@ -85,14 +103,15 @@ class OpenAITools(Toolkit):
|
|
|
85
103
|
|
|
86
104
|
def generate_image(
|
|
87
105
|
self,
|
|
88
|
-
agent: Union[Agent, Team],
|
|
89
106
|
prompt: str,
|
|
90
|
-
) ->
|
|
107
|
+
) -> ToolResult:
|
|
91
108
|
"""Generate images based on a text prompt.
|
|
92
109
|
Args:
|
|
93
110
|
prompt (str): The text prompt to generate the image from.
|
|
94
111
|
"""
|
|
95
112
|
try:
|
|
113
|
+
import base64
|
|
114
|
+
|
|
96
115
|
extra_params = {
|
|
97
116
|
"size": self.image_size,
|
|
98
117
|
"quality": self.image_quality,
|
|
@@ -120,36 +139,43 @@ class OpenAITools(Toolkit):
|
|
|
120
139
|
data = response.data[0]
|
|
121
140
|
if data is None:
|
|
122
141
|
log_warning("OpenAI API did not return any data.")
|
|
123
|
-
return "Failed to generate image: No data received from API."
|
|
142
|
+
return ToolResult(content="Failed to generate image: No data received from API.")
|
|
143
|
+
|
|
124
144
|
if hasattr(data, "b64_json") and data.b64_json:
|
|
125
145
|
image_base64 = data.b64_json
|
|
126
146
|
media_id = str(uuid4())
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
147
|
+
|
|
148
|
+
# Decode base64 to bytes for proper storage
|
|
149
|
+
image_bytes = base64.b64decode(image_base64)
|
|
150
|
+
|
|
151
|
+
# Create ImageArtifact and return in ToolResult
|
|
152
|
+
image_artifact = Image(
|
|
153
|
+
id=media_id,
|
|
154
|
+
content=image_bytes, # ← Store as bytes, not encoded string
|
|
155
|
+
mime_type="image/png",
|
|
156
|
+
original_prompt=prompt,
|
|
157
|
+
)
|
|
158
|
+
|
|
159
|
+
return ToolResult(
|
|
160
|
+
content="Image generated successfully.",
|
|
161
|
+
images=[image_artifact],
|
|
134
162
|
)
|
|
135
|
-
|
|
136
|
-
return "Failed to generate image: No content received from API."
|
|
163
|
+
|
|
164
|
+
return ToolResult(content="Failed to generate image: No content received from API.")
|
|
137
165
|
except Exception as e:
|
|
138
166
|
log_error(f"Failed to generate image using {self.image_model}: {e}")
|
|
139
|
-
return f"Failed to generate image: {e}"
|
|
167
|
+
return ToolResult(content=f"Failed to generate image: {e}")
|
|
140
168
|
|
|
141
169
|
def generate_speech(
|
|
142
170
|
self,
|
|
143
171
|
agent: Union[Agent, Team],
|
|
144
172
|
text_input: str,
|
|
145
|
-
) ->
|
|
173
|
+
) -> ToolResult: # Changed return type
|
|
146
174
|
"""Generate speech from text using OpenAI's Text-to-Speech API.
|
|
147
175
|
Args:
|
|
148
176
|
text_input (str): The text to synthesize into speech.
|
|
149
177
|
"""
|
|
150
178
|
try:
|
|
151
|
-
import base64
|
|
152
|
-
|
|
153
179
|
response = OpenAIClient(api_key=self.api_key).audio.speech.create(
|
|
154
180
|
model=self.tts_model,
|
|
155
181
|
voice=self.tts_voice,
|
|
@@ -160,17 +186,17 @@ class OpenAITools(Toolkit):
|
|
|
160
186
|
# Get raw audio data for artifact creation before potentially saving
|
|
161
187
|
audio_data: bytes = response.content
|
|
162
188
|
|
|
163
|
-
#
|
|
164
|
-
base64_encoded_audio = base64.b64encode(audio_data).decode("utf-8")
|
|
165
|
-
|
|
166
|
-
# Create and add AudioArtifact using base64_audio field
|
|
189
|
+
# Create AudioArtifact and return in ToolResult
|
|
167
190
|
media_id = str(uuid4())
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
191
|
+
audio_artifact = Audio(
|
|
192
|
+
id=media_id,
|
|
193
|
+
content=audio_data,
|
|
194
|
+
mime_type=f"audio/{self.tts_format}",
|
|
195
|
+
)
|
|
196
|
+
|
|
197
|
+
return ToolResult(
|
|
198
|
+
content=f"Speech generated successfully with ID: {media_id}",
|
|
199
|
+
audios=[audio_artifact],
|
|
173
200
|
)
|
|
174
|
-
return f"Speech generated successfully with ID: {media_id}"
|
|
175
201
|
except Exception as e:
|
|
176
|
-
return f"Failed to generate speech: {str(e)}"
|
|
202
|
+
return ToolResult(content=f"Failed to generate speech: {str(e)}")
|
agno/tools/openbb.py
CHANGED
|
@@ -17,11 +17,12 @@ class OpenBBTools(Toolkit):
|
|
|
17
17
|
obb: Optional[Any] = None,
|
|
18
18
|
openbb_pat: Optional[str] = None,
|
|
19
19
|
provider: Literal["benzinga", "fmp", "intrinio", "polygon", "tiingo", "tmx", "yfinance"] = "yfinance",
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
20
|
+
enable_get_stock_price: bool = True,
|
|
21
|
+
enable_search_company_symbol: bool = False,
|
|
22
|
+
enable_get_company_news: bool = False,
|
|
23
|
+
enable_get_company_profile: bool = False,
|
|
24
|
+
enable_get_price_targets: bool = False,
|
|
25
|
+
all: bool = False,
|
|
25
26
|
**kwargs,
|
|
26
27
|
):
|
|
27
28
|
self.obb = obb or openbb_app
|
|
@@ -34,18 +35,18 @@ class OpenBBTools(Toolkit):
|
|
|
34
35
|
self.provider: Literal["benzinga", "fmp", "intrinio", "polygon", "tiingo", "tmx", "yfinance"] = provider
|
|
35
36
|
|
|
36
37
|
tools: List[Any] = []
|
|
37
|
-
if
|
|
38
|
+
if enable_get_stock_price or all:
|
|
38
39
|
tools.append(self.get_stock_price)
|
|
39
|
-
if
|
|
40
|
+
if enable_search_company_symbol or all:
|
|
40
41
|
tools.append(self.search_company_symbol)
|
|
41
|
-
if
|
|
42
|
+
if enable_get_company_news or all:
|
|
42
43
|
tools.append(self.get_company_news)
|
|
43
|
-
if
|
|
44
|
+
if enable_get_company_profile or all:
|
|
44
45
|
tools.append(self.get_company_profile)
|
|
45
|
-
if
|
|
46
|
+
if enable_get_price_targets or all:
|
|
46
47
|
tools.append(self.get_price_targets)
|
|
47
48
|
|
|
48
|
-
super().__init__(name="
|
|
49
|
+
super().__init__(name="openbb_tools", tools=tools, **kwargs)
|
|
49
50
|
|
|
50
51
|
def get_stock_price(self, symbol: str) -> str:
|
|
51
52
|
"""Use this function to get the current stock price for a stock symbol or list of symbols.
|