agno 1.8.2__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/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 +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 +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 +128 -72
- 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 +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 +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 +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 +17 -18
- 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 +18 -33
- 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 +1 -1
- 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 +6 -12
- 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 -110
- 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 -1053
- agno/app/playground/deploy.py +0 -249
- agno/app/playground/operator.py +0 -183
- agno/app/playground/schemas.py +0 -223
- agno/app/playground/serve.py +0 -55
- agno/app/playground/sync_router.py +0 -1045
- 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 -3313
- 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.2.dist-info/METADATA +0 -982
- agno-1.8.2.dist-info/RECORD +0 -566
- agno-1.8.2.dist-info/entry_points.txt +0 -3
- agno-1.8.2.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.2.dist-info → agno-2.0.0.dist-info}/WHEEL +0 -0
- {agno-1.8.2.dist-info → agno-2.0.0.dist-info}/top_level.txt +0 -0
agno/tools/opencv.py
CHANGED
|
@@ -1,10 +1,12 @@
|
|
|
1
|
-
import base64
|
|
2
1
|
import time
|
|
2
|
+
from pathlib import Path
|
|
3
|
+
from typing import Callable, List
|
|
3
4
|
from uuid import uuid4
|
|
4
5
|
|
|
5
6
|
from agno.agent import Agent
|
|
6
|
-
from agno.media import
|
|
7
|
-
from agno.tools
|
|
7
|
+
from agno.media import Image, Video
|
|
8
|
+
from agno.tools import Toolkit
|
|
9
|
+
from agno.tools.function import ToolResult
|
|
8
10
|
from agno.utils.log import log_debug, log_error, log_info
|
|
9
11
|
|
|
10
12
|
try:
|
|
@@ -16,30 +18,40 @@ except ImportError:
|
|
|
16
18
|
class OpenCVTools(Toolkit):
|
|
17
19
|
"""Tools for capturing images and videos from the webcam using OpenCV"""
|
|
18
20
|
|
|
19
|
-
def __init__(
|
|
21
|
+
def __init__(
|
|
22
|
+
self,
|
|
23
|
+
show_preview=False,
|
|
24
|
+
enable_capture_image: bool = True,
|
|
25
|
+
enable_capture_video: bool = True,
|
|
26
|
+
all: bool = False,
|
|
27
|
+
**kwargs,
|
|
28
|
+
):
|
|
29
|
+
self.show_preview = show_preview
|
|
30
|
+
|
|
31
|
+
tools: List[Callable] = []
|
|
32
|
+
if all or enable_capture_image:
|
|
33
|
+
tools.append(self.capture_image)
|
|
34
|
+
if all or enable_capture_video:
|
|
35
|
+
tools.append(self.capture_video)
|
|
36
|
+
|
|
20
37
|
super().__init__(
|
|
21
38
|
name="opencv_tools",
|
|
22
|
-
tools=
|
|
23
|
-
self.capture_image,
|
|
24
|
-
self.capture_video,
|
|
25
|
-
],
|
|
39
|
+
tools=tools,
|
|
26
40
|
**kwargs,
|
|
27
41
|
)
|
|
28
42
|
|
|
29
|
-
self.show_preview = show_preview
|
|
30
|
-
|
|
31
43
|
def capture_image(
|
|
32
44
|
self,
|
|
33
45
|
agent: Agent,
|
|
34
46
|
prompt: str = "Webcam capture",
|
|
35
|
-
) ->
|
|
47
|
+
) -> ToolResult:
|
|
36
48
|
"""Capture an image from the webcam.
|
|
37
49
|
|
|
38
50
|
Args:
|
|
39
51
|
prompt (str): Description of the image capture. Defaults to "Webcam capture".
|
|
40
52
|
|
|
41
53
|
Returns:
|
|
42
|
-
|
|
54
|
+
ToolResult: A ToolResult containing the captured image or error message.
|
|
43
55
|
"""
|
|
44
56
|
try:
|
|
45
57
|
log_debug("Initializing webcam for image capture...")
|
|
@@ -55,7 +67,7 @@ class OpenCVTools(Toolkit):
|
|
|
55
67
|
if not cam.isOpened():
|
|
56
68
|
error_msg = "Could not open webcam. Please ensure your terminal has camera permissions and the camera is not being used by another application."
|
|
57
69
|
log_error(error_msg)
|
|
58
|
-
return error_msg
|
|
70
|
+
return ToolResult(content=error_msg)
|
|
59
71
|
|
|
60
72
|
try:
|
|
61
73
|
cam.set(cv2.CAP_PROP_FRAME_WIDTH, 1280)
|
|
@@ -73,7 +85,7 @@ class OpenCVTools(Toolkit):
|
|
|
73
85
|
if not ret:
|
|
74
86
|
error_msg = "Failed to read frame from webcam"
|
|
75
87
|
log_error(error_msg)
|
|
76
|
-
return error_msg
|
|
88
|
+
return ToolResult(content=error_msg)
|
|
77
89
|
|
|
78
90
|
cv2.imshow('Camera Preview - Press "c" to capture, "q" to quit', frame)
|
|
79
91
|
|
|
@@ -84,41 +96,42 @@ class OpenCVTools(Toolkit):
|
|
|
84
96
|
break
|
|
85
97
|
elif key == ord("q"):
|
|
86
98
|
log_info("Capture cancelled by user")
|
|
87
|
-
return "Image capture cancelled by user"
|
|
99
|
+
return ToolResult(content="Image capture cancelled by user")
|
|
88
100
|
else:
|
|
89
101
|
ret, captured_frame = cam.read()
|
|
90
102
|
if not ret:
|
|
91
103
|
error_msg = "Failed to capture image from webcam"
|
|
92
104
|
log_error(error_msg)
|
|
93
|
-
return error_msg
|
|
105
|
+
return ToolResult(content=error_msg)
|
|
94
106
|
|
|
95
107
|
if captured_frame is None:
|
|
96
108
|
error_msg = "No frame captured"
|
|
97
109
|
log_error(error_msg)
|
|
98
|
-
return error_msg
|
|
110
|
+
return ToolResult(content=error_msg)
|
|
99
111
|
|
|
100
112
|
success, encoded_image = cv2.imencode(".png", captured_frame)
|
|
101
113
|
|
|
102
114
|
if not success:
|
|
103
115
|
error_msg = "Failed to encode captured image"
|
|
104
116
|
log_error(error_msg)
|
|
105
|
-
return error_msg
|
|
117
|
+
return ToolResult(content=error_msg)
|
|
106
118
|
|
|
107
119
|
image_bytes = encoded_image.tobytes()
|
|
108
|
-
base64_encoded_image = base64.b64encode(image_bytes)
|
|
109
|
-
|
|
110
120
|
media_id = str(uuid4())
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
121
|
+
|
|
122
|
+
# Create ImageArtifact with raw bytes (not base64 encoded)
|
|
123
|
+
image_artifact = Image(
|
|
124
|
+
id=media_id,
|
|
125
|
+
content=image_bytes, # Store as raw bytes
|
|
126
|
+
original_prompt=prompt,
|
|
127
|
+
mime_type="image/png",
|
|
118
128
|
)
|
|
119
129
|
|
|
120
130
|
log_debug(f"Successfully captured and attached image {media_id}")
|
|
121
|
-
return
|
|
131
|
+
return ToolResult(
|
|
132
|
+
content="Image captured successfully",
|
|
133
|
+
images=[image_artifact],
|
|
134
|
+
)
|
|
122
135
|
|
|
123
136
|
finally:
|
|
124
137
|
# Release the camera and close windows
|
|
@@ -129,14 +142,14 @@ class OpenCVTools(Toolkit):
|
|
|
129
142
|
except Exception as e:
|
|
130
143
|
error_msg = f"Error capturing image: {str(e)}"
|
|
131
144
|
log_error(error_msg)
|
|
132
|
-
return error_msg
|
|
145
|
+
return ToolResult(content=error_msg)
|
|
133
146
|
|
|
134
147
|
def capture_video(
|
|
135
148
|
self,
|
|
136
149
|
agent: Agent,
|
|
137
150
|
duration: int = 10,
|
|
138
151
|
prompt: str = "Webcam video capture",
|
|
139
|
-
) ->
|
|
152
|
+
) -> ToolResult:
|
|
140
153
|
"""Capture a video from the webcam.
|
|
141
154
|
|
|
142
155
|
Args:
|
|
@@ -144,7 +157,7 @@ class OpenCVTools(Toolkit):
|
|
|
144
157
|
prompt (str): Description of the video capture. Defaults to "Webcam video capture".
|
|
145
158
|
|
|
146
159
|
Returns:
|
|
147
|
-
|
|
160
|
+
ToolResult: A ToolResult containing the captured video or error message.
|
|
148
161
|
"""
|
|
149
162
|
try:
|
|
150
163
|
log_debug("Initializing webcam for video capture...")
|
|
@@ -161,7 +174,7 @@ class OpenCVTools(Toolkit):
|
|
|
161
174
|
if not cap.isOpened():
|
|
162
175
|
error_msg = "Could not open webcam. Please ensure your terminal has camera permissions and the camera is not being used by another application."
|
|
163
176
|
log_error(error_msg)
|
|
164
|
-
return error_msg
|
|
177
|
+
return ToolResult(content=error_msg)
|
|
165
178
|
|
|
166
179
|
try:
|
|
167
180
|
frame_width = int(cap.get(cv2.CAP_PROP_FRAME_WIDTH))
|
|
@@ -211,7 +224,7 @@ class OpenCVTools(Toolkit):
|
|
|
211
224
|
if not out or not out.isOpened():
|
|
212
225
|
error_msg = "Failed to initialize video writer with any codec"
|
|
213
226
|
log_error(error_msg)
|
|
214
|
-
return error_msg
|
|
227
|
+
return ToolResult(content=error_msg)
|
|
215
228
|
|
|
216
229
|
start_time = time.time()
|
|
217
230
|
frame_count = 0
|
|
@@ -227,7 +240,7 @@ class OpenCVTools(Toolkit):
|
|
|
227
240
|
if not ret:
|
|
228
241
|
error_msg = "Failed to capture video frame"
|
|
229
242
|
log_error(error_msg)
|
|
230
|
-
return error_msg
|
|
243
|
+
return ToolResult(content=error_msg)
|
|
231
244
|
|
|
232
245
|
# Write the frame to the output file
|
|
233
246
|
out.write(frame)
|
|
@@ -263,10 +276,11 @@ class OpenCVTools(Toolkit):
|
|
|
263
276
|
out.release()
|
|
264
277
|
|
|
265
278
|
# Verify the file was created and has content
|
|
266
|
-
|
|
279
|
+
temp_path = Path(temp_filepath)
|
|
280
|
+
if not temp_path.exists() or temp_path.stat().st_size == 0:
|
|
267
281
|
error_msg = "Video file was not created or is empty"
|
|
268
282
|
log_error(error_msg)
|
|
269
|
-
return error_msg
|
|
283
|
+
return ToolResult(content=error_msg)
|
|
270
284
|
|
|
271
285
|
# Read the video file and encode to base64
|
|
272
286
|
with open(temp_filepath, "rb") as video_file:
|
|
@@ -275,23 +289,25 @@ class OpenCVTools(Toolkit):
|
|
|
275
289
|
# Clean up temporary file
|
|
276
290
|
os.unlink(temp_filepath)
|
|
277
291
|
|
|
278
|
-
base64_encoded_video = base64.b64encode(video_bytes)
|
|
279
|
-
|
|
280
292
|
media_id = str(uuid4())
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
|
|
293
|
+
|
|
294
|
+
# Create VideoArtifact with base64 encoded content
|
|
295
|
+
video_artifact = Video(
|
|
296
|
+
id=media_id,
|
|
297
|
+
content=video_bytes,
|
|
298
|
+
original_prompt=prompt,
|
|
299
|
+
mime_type="video/mp4",
|
|
288
300
|
)
|
|
289
301
|
|
|
290
302
|
actual_duration = time.time() - start_time
|
|
291
303
|
log_debug(
|
|
292
304
|
f"Successfully captured and attached video {media_id} ({actual_duration:.1f}s, {frame_count} frames)"
|
|
293
305
|
)
|
|
294
|
-
|
|
306
|
+
|
|
307
|
+
return ToolResult(
|
|
308
|
+
content=f"Video captured successfully and attached as artifact {media_id} ({actual_duration:.1f}s, {frame_count} frames, {successful_codec} codec)",
|
|
309
|
+
videos=[video_artifact],
|
|
310
|
+
)
|
|
295
311
|
|
|
296
312
|
finally:
|
|
297
313
|
if "cap" in locals():
|
|
@@ -302,4 +318,4 @@ class OpenCVTools(Toolkit):
|
|
|
302
318
|
except Exception as e:
|
|
303
319
|
error_msg = f"Error capturing video: {str(e)}"
|
|
304
320
|
log_error(error_msg)
|
|
305
|
-
return error_msg
|
|
321
|
+
return ToolResult(content=error_msg)
|
agno/tools/openweather.py
CHANGED
|
@@ -18,20 +18,22 @@ class OpenWeatherTools(Toolkit):
|
|
|
18
18
|
Args:
|
|
19
19
|
api_key (Optional[str]): OpenWeatherMap API key. If not provided, will try to get from OPENWEATHER_API_KEY env var.
|
|
20
20
|
units (str): Units of measurement. Options are 'standard', 'metric', and 'imperial'. Default is 'metric'.
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
21
|
+
enable_current_weather (bool): Enable current weather function. Default is True.
|
|
22
|
+
enable_forecast (bool): Enable forecast function. Default is True.
|
|
23
|
+
enable_air_pollution (bool): Enable air pollution function. Default is True.
|
|
24
|
+
enable_geocoding (bool): Enable geocoding function. Default is True.
|
|
25
|
+
all (bool): Enable all functions. Default is False.
|
|
25
26
|
"""
|
|
26
27
|
|
|
27
28
|
def __init__(
|
|
28
29
|
self,
|
|
29
30
|
api_key: Optional[str] = None,
|
|
30
31
|
units: str = "metric",
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
32
|
+
enable_current_weather: bool = True,
|
|
33
|
+
enable_forecast: bool = True,
|
|
34
|
+
enable_air_pollution: bool = True,
|
|
35
|
+
enable_geocoding: bool = True,
|
|
36
|
+
all: bool = False,
|
|
35
37
|
**kwargs,
|
|
36
38
|
):
|
|
37
39
|
self.api_key = api_key or getenv("OPENWEATHER_API_KEY")
|
|
@@ -45,13 +47,13 @@ class OpenWeatherTools(Toolkit):
|
|
|
45
47
|
self.geo_url = "https://api.openweathermap.org/geo/1.0"
|
|
46
48
|
|
|
47
49
|
tools: List[Any] = []
|
|
48
|
-
if
|
|
50
|
+
if enable_current_weather or all:
|
|
49
51
|
tools.append(self.get_current_weather)
|
|
50
|
-
if
|
|
52
|
+
if enable_forecast or all:
|
|
51
53
|
tools.append(self.get_forecast)
|
|
52
|
-
if
|
|
54
|
+
if enable_air_pollution or all:
|
|
53
55
|
tools.append(self.get_air_pollution)
|
|
54
|
-
if
|
|
56
|
+
if enable_geocoding or all:
|
|
55
57
|
tools.append(self.geocode_location)
|
|
56
58
|
|
|
57
59
|
super().__init__(name="openweather_tools", tools=tools, **kwargs)
|
agno/tools/pandas.py
CHANGED
|
@@ -10,12 +10,20 @@ except ImportError:
|
|
|
10
10
|
|
|
11
11
|
|
|
12
12
|
class PandasTools(Toolkit):
|
|
13
|
-
def __init__(
|
|
13
|
+
def __init__(
|
|
14
|
+
self,
|
|
15
|
+
enable_create_pandas_dataframe: bool = True,
|
|
16
|
+
enable_run_dataframe_operation: bool = True,
|
|
17
|
+
all: bool = False,
|
|
18
|
+
**kwargs,
|
|
19
|
+
):
|
|
14
20
|
self.dataframes: Dict[str, pd.DataFrame] = {}
|
|
15
21
|
|
|
16
22
|
tools: List[Any] = []
|
|
17
|
-
|
|
18
|
-
|
|
23
|
+
if all or enable_create_pandas_dataframe:
|
|
24
|
+
tools.append(self.create_pandas_dataframe)
|
|
25
|
+
if all or enable_run_dataframe_operation:
|
|
26
|
+
tools.append(self.run_dataframe_operation)
|
|
19
27
|
|
|
20
28
|
super().__init__(name="pandas_tools", tools=tools, **kwargs)
|
|
21
29
|
|
agno/tools/postgres.py
CHANGED
|
@@ -22,10 +22,6 @@ class PostgresTools(Toolkit):
|
|
|
22
22
|
password: Optional[str] = None,
|
|
23
23
|
host: Optional[str] = None,
|
|
24
24
|
port: Optional[int] = None,
|
|
25
|
-
run_queries: bool = True,
|
|
26
|
-
inspect_queries: bool = False,
|
|
27
|
-
summarize_tables: bool = True,
|
|
28
|
-
export_tables: bool = False,
|
|
29
25
|
table_schema: str = "public",
|
|
30
26
|
**kwargs,
|
|
31
27
|
):
|
|
@@ -40,15 +36,11 @@ class PostgresTools(Toolkit):
|
|
|
40
36
|
tools: List[Any] = [
|
|
41
37
|
self.show_tables,
|
|
42
38
|
self.describe_table,
|
|
39
|
+
self.summarize_table,
|
|
40
|
+
self.inspect_query,
|
|
41
|
+
self.run_query,
|
|
42
|
+
self.export_table_to_path,
|
|
43
43
|
]
|
|
44
|
-
if inspect_queries:
|
|
45
|
-
tools.append(self.inspect_query)
|
|
46
|
-
if run_queries:
|
|
47
|
-
tools.append(self.run_query)
|
|
48
|
-
if summarize_tables:
|
|
49
|
-
tools.append(self.summarize_table)
|
|
50
|
-
if export_tables:
|
|
51
|
-
tools.append(self.export_table_to_path)
|
|
52
44
|
|
|
53
45
|
super().__init__(name="postgres_tools", tools=tools, **kwargs)
|
|
54
46
|
|
agno/tools/pubmed.py
CHANGED
|
@@ -14,6 +14,8 @@ class PubmedTools(Toolkit):
|
|
|
14
14
|
email: str = "your_email@example.com",
|
|
15
15
|
max_results: Optional[int] = None,
|
|
16
16
|
results_expanded: bool = False,
|
|
17
|
+
enable_search_pubmed: bool = True,
|
|
18
|
+
all: bool = False,
|
|
17
19
|
**kwargs,
|
|
18
20
|
):
|
|
19
21
|
self.max_results: Optional[int] = max_results
|
|
@@ -21,7 +23,8 @@ class PubmedTools(Toolkit):
|
|
|
21
23
|
self.results_expanded: bool = results_expanded
|
|
22
24
|
|
|
23
25
|
tools: List[Any] = []
|
|
24
|
-
|
|
26
|
+
if enable_search_pubmed or all:
|
|
27
|
+
tools.append(self.search_pubmed)
|
|
25
28
|
|
|
26
29
|
super().__init__(name="pubmed", tools=tools, **kwargs)
|
|
27
30
|
|
agno/tools/python.py
CHANGED
|
@@ -16,13 +16,6 @@ class PythonTools(Toolkit):
|
|
|
16
16
|
def __init__(
|
|
17
17
|
self,
|
|
18
18
|
base_dir: Optional[Path] = None,
|
|
19
|
-
save_and_run: bool = True,
|
|
20
|
-
pip_install: bool = False,
|
|
21
|
-
uv_pip_install: bool = False,
|
|
22
|
-
run_code: bool = False,
|
|
23
|
-
list_files: bool = False,
|
|
24
|
-
run_files: bool = False,
|
|
25
|
-
read_files: bool = False,
|
|
26
19
|
safe_globals: Optional[dict] = None,
|
|
27
20
|
safe_locals: Optional[dict] = None,
|
|
28
21
|
**kwargs,
|
|
@@ -33,21 +26,15 @@ class PythonTools(Toolkit):
|
|
|
33
26
|
self.safe_globals: dict = safe_globals or globals()
|
|
34
27
|
self.safe_locals: dict = safe_locals or locals()
|
|
35
28
|
|
|
36
|
-
tools: List[Any] = [
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
if run_files:
|
|
46
|
-
tools.append(self.run_python_file_return_variable)
|
|
47
|
-
if read_files:
|
|
48
|
-
tools.append(self.read_file)
|
|
49
|
-
if list_files:
|
|
50
|
-
tools.append(self.list_files)
|
|
29
|
+
tools: List[Any] = [
|
|
30
|
+
self.save_to_file_and_run,
|
|
31
|
+
self.run_python_code,
|
|
32
|
+
self.pip_install_package,
|
|
33
|
+
self.uv_pip_install_package,
|
|
34
|
+
self.run_python_file_return_variable,
|
|
35
|
+
self.read_file,
|
|
36
|
+
self.list_files,
|
|
37
|
+
]
|
|
51
38
|
|
|
52
39
|
super().__init__(name="python_tools", tools=tools, **kwargs)
|
|
53
40
|
|
agno/tools/reasoning.py
CHANGED
|
@@ -1,9 +1,7 @@
|
|
|
1
1
|
from textwrap import dedent
|
|
2
|
-
from typing import Any, List, Optional
|
|
2
|
+
from typing import Any, Dict, List, Optional
|
|
3
3
|
|
|
4
|
-
from agno.agent import Agent
|
|
5
4
|
from agno.reasoning.step import NextAction, ReasoningStep
|
|
6
|
-
from agno.team.team import Team
|
|
7
5
|
from agno.tools import Toolkit
|
|
8
6
|
from agno.utils.log import log_debug, log_error
|
|
9
7
|
|
|
@@ -11,8 +9,9 @@ from agno.utils.log import log_debug, log_error
|
|
|
11
9
|
class ReasoningTools(Toolkit):
|
|
12
10
|
def __init__(
|
|
13
11
|
self,
|
|
14
|
-
|
|
15
|
-
|
|
12
|
+
enable_think: bool = True,
|
|
13
|
+
enable_analyze: bool = True,
|
|
14
|
+
all: bool = False,
|
|
16
15
|
instructions: Optional[str] = None,
|
|
17
16
|
add_instructions: bool = False,
|
|
18
17
|
add_few_shot: bool = False,
|
|
@@ -34,9 +33,10 @@ class ReasoningTools(Toolkit):
|
|
|
34
33
|
self.instructions = instructions
|
|
35
34
|
|
|
36
35
|
tools: List[Any] = []
|
|
37
|
-
|
|
36
|
+
# Prefer new flags; fallback to legacy ones
|
|
37
|
+
if all or enable_think:
|
|
38
38
|
tools.append(self.think)
|
|
39
|
-
if
|
|
39
|
+
if all or enable_analyze:
|
|
40
40
|
tools.append(self.analyze)
|
|
41
41
|
|
|
42
42
|
super().__init__(
|
|
@@ -48,7 +48,12 @@ class ReasoningTools(Toolkit):
|
|
|
48
48
|
)
|
|
49
49
|
|
|
50
50
|
def think(
|
|
51
|
-
self,
|
|
51
|
+
self,
|
|
52
|
+
session_state: Dict[str, Any],
|
|
53
|
+
title: str,
|
|
54
|
+
thought: str,
|
|
55
|
+
action: Optional[str] = None,
|
|
56
|
+
confidence: float = 0.8,
|
|
52
57
|
) -> str:
|
|
53
58
|
"""Use this tool as a scratchpad to reason about the question and work through it step-by-step.
|
|
54
59
|
This tool will help you break down complex problems into logical steps and track the reasoning process.
|
|
@@ -75,19 +80,21 @@ class ReasoningTools(Toolkit):
|
|
|
75
80
|
confidence=confidence,
|
|
76
81
|
)
|
|
77
82
|
|
|
83
|
+
current_run_id = session_state.get("current_run_id", None)
|
|
84
|
+
|
|
78
85
|
# Add this step to the Agent's session state
|
|
79
|
-
if
|
|
80
|
-
|
|
81
|
-
if "reasoning_steps" not in
|
|
82
|
-
|
|
83
|
-
if
|
|
84
|
-
|
|
85
|
-
|
|
86
|
+
if session_state is None:
|
|
87
|
+
session_state = {}
|
|
88
|
+
if "reasoning_steps" not in session_state:
|
|
89
|
+
session_state["reasoning_steps"] = {}
|
|
90
|
+
if current_run_id not in session_state["reasoning_steps"]:
|
|
91
|
+
session_state["reasoning_steps"][current_run_id] = []
|
|
92
|
+
session_state["reasoning_steps"][current_run_id].append(reasoning_step.model_dump_json())
|
|
86
93
|
|
|
87
94
|
# Return all previous reasoning_steps and the new reasoning_step
|
|
88
|
-
if "reasoning_steps" in
|
|
95
|
+
if "reasoning_steps" in session_state and current_run_id in session_state["reasoning_steps"]:
|
|
89
96
|
formatted_reasoning_steps = ""
|
|
90
|
-
for i, step in enumerate(
|
|
97
|
+
for i, step in enumerate(session_state["reasoning_steps"][current_run_id], 1):
|
|
91
98
|
step_parsed = ReasoningStep.model_validate_json(step)
|
|
92
99
|
step_str = dedent(f"""\
|
|
93
100
|
Step {i}:
|
|
@@ -105,7 +112,7 @@ Confidence: {step_parsed.confidence}
|
|
|
105
112
|
|
|
106
113
|
def analyze(
|
|
107
114
|
self,
|
|
108
|
-
|
|
115
|
+
session_state: Dict[str, Any],
|
|
109
116
|
title: str,
|
|
110
117
|
result: str,
|
|
111
118
|
analysis: str,
|
|
@@ -143,19 +150,20 @@ Confidence: {step_parsed.confidence}
|
|
|
143
150
|
confidence=confidence,
|
|
144
151
|
)
|
|
145
152
|
|
|
153
|
+
current_run_id = session_state.get("current_run_id", None)
|
|
146
154
|
# Add this step to the Agent's session state
|
|
147
|
-
if
|
|
148
|
-
|
|
149
|
-
if "reasoning_steps" not in
|
|
150
|
-
|
|
151
|
-
if
|
|
152
|
-
|
|
153
|
-
|
|
155
|
+
if session_state is None:
|
|
156
|
+
session_state = {}
|
|
157
|
+
if "reasoning_steps" not in session_state:
|
|
158
|
+
session_state["reasoning_steps"] = {}
|
|
159
|
+
if current_run_id not in session_state["reasoning_steps"]:
|
|
160
|
+
session_state["reasoning_steps"][current_run_id] = []
|
|
161
|
+
session_state["reasoning_steps"][current_run_id].append(reasoning_step.model_dump_json())
|
|
154
162
|
|
|
155
163
|
# Return all previous reasoning_steps and the new reasoning_step
|
|
156
|
-
if "reasoning_steps" in
|
|
164
|
+
if "reasoning_steps" in session_state and current_run_id in session_state["reasoning_steps"]:
|
|
157
165
|
formatted_reasoning_steps = ""
|
|
158
|
-
for i, step in enumerate(
|
|
166
|
+
for i, step in enumerate(session_state["reasoning_steps"][current_run_id], 1):
|
|
159
167
|
step_parsed = ReasoningStep.model_validate_json(step)
|
|
160
168
|
step_str = dedent(f"""\
|
|
161
169
|
Step {i}:
|
agno/tools/reddit.py
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import json
|
|
2
2
|
from os import getenv
|
|
3
|
-
from typing import
|
|
3
|
+
from typing import Callable, Dict, List, Optional, Union
|
|
4
4
|
|
|
5
5
|
from agno.tools import Toolkit
|
|
6
6
|
from agno.utils.log import log_debug, log_info, logger
|
|
@@ -20,14 +20,6 @@ class RedditTools(Toolkit):
|
|
|
20
20
|
user_agent: Optional[str] = None,
|
|
21
21
|
username: Optional[str] = None,
|
|
22
22
|
password: Optional[str] = None,
|
|
23
|
-
get_user_info: bool = True,
|
|
24
|
-
get_top_posts: bool = True,
|
|
25
|
-
get_subreddit_info: bool = True,
|
|
26
|
-
get_trending_subreddits: bool = True,
|
|
27
|
-
get_subreddit_stats: bool = True,
|
|
28
|
-
create_post: bool = True,
|
|
29
|
-
reply_to_post: bool = True,
|
|
30
|
-
reply_to_comment: bool = True,
|
|
31
23
|
**kwargs,
|
|
32
24
|
):
|
|
33
25
|
if reddit_instance is not None:
|
|
@@ -65,23 +57,16 @@ class RedditTools(Toolkit):
|
|
|
65
57
|
else:
|
|
66
58
|
logger.warning("Missing Reddit API credentials")
|
|
67
59
|
|
|
68
|
-
tools: List[
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
tools.append(self.get_subreddit_stats)
|
|
79
|
-
if create_post:
|
|
80
|
-
tools.append(self.create_post)
|
|
81
|
-
if reply_to_post:
|
|
82
|
-
tools.append(self.reply_to_post)
|
|
83
|
-
if reply_to_comment:
|
|
84
|
-
tools.append(self.reply_to_comment)
|
|
60
|
+
tools: List[Callable] = [
|
|
61
|
+
self.get_user_info,
|
|
62
|
+
self.get_top_posts,
|
|
63
|
+
self.get_subreddit_info,
|
|
64
|
+
self.get_trending_subreddits,
|
|
65
|
+
self.get_subreddit_stats,
|
|
66
|
+
self.create_post,
|
|
67
|
+
self.reply_to_post,
|
|
68
|
+
self.reply_to_comment,
|
|
69
|
+
]
|
|
85
70
|
|
|
86
71
|
super().__init__(name="reddit", tools=tools, **kwargs)
|
|
87
72
|
|