agno 2.2.13__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 +51 -0
- agno/agent/agent.py +10405 -0
- agno/api/__init__.py +0 -0
- agno/api/agent.py +28 -0
- agno/api/api.py +40 -0
- agno/api/evals.py +22 -0
- agno/api/os.py +17 -0
- agno/api/routes.py +13 -0
- agno/api/schemas/__init__.py +9 -0
- agno/api/schemas/agent.py +16 -0
- agno/api/schemas/evals.py +16 -0
- agno/api/schemas/os.py +14 -0
- agno/api/schemas/response.py +6 -0
- agno/api/schemas/team.py +16 -0
- agno/api/schemas/utils.py +21 -0
- agno/api/schemas/workflows.py +16 -0
- agno/api/settings.py +53 -0
- agno/api/team.py +30 -0
- 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/culture/__init__.py +3 -0
- agno/culture/manager.py +956 -0
- agno/db/__init__.py +24 -0
- agno/db/async_postgres/__init__.py +3 -0
- agno/db/base.py +598 -0
- agno/db/dynamo/__init__.py +3 -0
- agno/db/dynamo/dynamo.py +2042 -0
- agno/db/dynamo/schemas.py +314 -0
- agno/db/dynamo/utils.py +743 -0
- agno/db/firestore/__init__.py +3 -0
- agno/db/firestore/firestore.py +1795 -0
- agno/db/firestore/schemas.py +140 -0
- agno/db/firestore/utils.py +376 -0
- agno/db/gcs_json/__init__.py +3 -0
- agno/db/gcs_json/gcs_json_db.py +1335 -0
- agno/db/gcs_json/utils.py +228 -0
- agno/db/in_memory/__init__.py +3 -0
- agno/db/in_memory/in_memory_db.py +1160 -0
- agno/db/in_memory/utils.py +230 -0
- agno/db/json/__init__.py +3 -0
- agno/db/json/json_db.py +1328 -0
- agno/db/json/utils.py +230 -0
- agno/db/migrations/__init__.py +0 -0
- agno/db/migrations/v1_to_v2.py +635 -0
- agno/db/mongo/__init__.py +17 -0
- agno/db/mongo/async_mongo.py +2026 -0
- agno/db/mongo/mongo.py +1982 -0
- agno/db/mongo/schemas.py +87 -0
- agno/db/mongo/utils.py +259 -0
- agno/db/mysql/__init__.py +3 -0
- agno/db/mysql/mysql.py +2308 -0
- agno/db/mysql/schemas.py +138 -0
- agno/db/mysql/utils.py +355 -0
- agno/db/postgres/__init__.py +4 -0
- agno/db/postgres/async_postgres.py +1927 -0
- agno/db/postgres/postgres.py +2260 -0
- agno/db/postgres/schemas.py +139 -0
- agno/db/postgres/utils.py +442 -0
- agno/db/redis/__init__.py +3 -0
- agno/db/redis/redis.py +1660 -0
- agno/db/redis/schemas.py +123 -0
- agno/db/redis/utils.py +346 -0
- agno/db/schemas/__init__.py +4 -0
- agno/db/schemas/culture.py +120 -0
- agno/db/schemas/evals.py +33 -0
- agno/db/schemas/knowledge.py +40 -0
- agno/db/schemas/memory.py +46 -0
- agno/db/schemas/metrics.py +0 -0
- agno/db/singlestore/__init__.py +3 -0
- agno/db/singlestore/schemas.py +130 -0
- agno/db/singlestore/singlestore.py +2272 -0
- agno/db/singlestore/utils.py +384 -0
- agno/db/sqlite/__init__.py +4 -0
- agno/db/sqlite/async_sqlite.py +2293 -0
- agno/db/sqlite/schemas.py +133 -0
- agno/db/sqlite/sqlite.py +2288 -0
- agno/db/sqlite/utils.py +431 -0
- agno/db/surrealdb/__init__.py +3 -0
- agno/db/surrealdb/metrics.py +292 -0
- agno/db/surrealdb/models.py +309 -0
- agno/db/surrealdb/queries.py +71 -0
- agno/db/surrealdb/surrealdb.py +1353 -0
- agno/db/surrealdb/utils.py +147 -0
- agno/db/utils.py +116 -0
- agno/debug.py +18 -0
- agno/eval/__init__.py +14 -0
- agno/eval/accuracy.py +834 -0
- agno/eval/performance.py +773 -0
- agno/eval/reliability.py +306 -0
- agno/eval/utils.py +119 -0
- agno/exceptions.py +161 -0
- agno/filters.py +354 -0
- agno/guardrails/__init__.py +6 -0
- agno/guardrails/base.py +19 -0
- agno/guardrails/openai.py +144 -0
- agno/guardrails/pii.py +94 -0
- agno/guardrails/prompt_injection.py +52 -0
- agno/integrations/__init__.py +0 -0
- agno/integrations/discord/__init__.py +3 -0
- agno/integrations/discord/client.py +203 -0
- agno/knowledge/__init__.py +5 -0
- agno/knowledge/chunking/__init__.py +0 -0
- agno/knowledge/chunking/agentic.py +79 -0
- agno/knowledge/chunking/document.py +91 -0
- agno/knowledge/chunking/fixed.py +57 -0
- agno/knowledge/chunking/markdown.py +151 -0
- agno/knowledge/chunking/recursive.py +63 -0
- agno/knowledge/chunking/row.py +39 -0
- agno/knowledge/chunking/semantic.py +86 -0
- agno/knowledge/chunking/strategy.py +165 -0
- agno/knowledge/content.py +74 -0
- agno/knowledge/document/__init__.py +5 -0
- agno/knowledge/document/base.py +58 -0
- agno/knowledge/embedder/__init__.py +5 -0
- agno/knowledge/embedder/aws_bedrock.py +343 -0
- agno/knowledge/embedder/azure_openai.py +210 -0
- agno/knowledge/embedder/base.py +23 -0
- agno/knowledge/embedder/cohere.py +323 -0
- agno/knowledge/embedder/fastembed.py +62 -0
- agno/knowledge/embedder/fireworks.py +13 -0
- agno/knowledge/embedder/google.py +258 -0
- agno/knowledge/embedder/huggingface.py +94 -0
- agno/knowledge/embedder/jina.py +182 -0
- agno/knowledge/embedder/langdb.py +22 -0
- agno/knowledge/embedder/mistral.py +206 -0
- agno/knowledge/embedder/nebius.py +13 -0
- agno/knowledge/embedder/ollama.py +154 -0
- agno/knowledge/embedder/openai.py +195 -0
- agno/knowledge/embedder/sentence_transformer.py +63 -0
- agno/knowledge/embedder/together.py +13 -0
- agno/knowledge/embedder/vllm.py +262 -0
- agno/knowledge/embedder/voyageai.py +165 -0
- agno/knowledge/knowledge.py +1988 -0
- agno/knowledge/reader/__init__.py +7 -0
- agno/knowledge/reader/arxiv_reader.py +81 -0
- agno/knowledge/reader/base.py +95 -0
- agno/knowledge/reader/csv_reader.py +166 -0
- agno/knowledge/reader/docx_reader.py +82 -0
- agno/knowledge/reader/field_labeled_csv_reader.py +292 -0
- agno/knowledge/reader/firecrawl_reader.py +201 -0
- agno/knowledge/reader/json_reader.py +87 -0
- agno/knowledge/reader/markdown_reader.py +137 -0
- agno/knowledge/reader/pdf_reader.py +431 -0
- agno/knowledge/reader/pptx_reader.py +101 -0
- agno/knowledge/reader/reader_factory.py +313 -0
- agno/knowledge/reader/s3_reader.py +89 -0
- agno/knowledge/reader/tavily_reader.py +194 -0
- agno/knowledge/reader/text_reader.py +115 -0
- agno/knowledge/reader/web_search_reader.py +372 -0
- agno/knowledge/reader/website_reader.py +455 -0
- agno/knowledge/reader/wikipedia_reader.py +59 -0
- agno/knowledge/reader/youtube_reader.py +78 -0
- agno/knowledge/remote_content/__init__.py +0 -0
- agno/knowledge/remote_content/remote_content.py +88 -0
- agno/knowledge/reranker/__init__.py +3 -0
- agno/knowledge/reranker/base.py +14 -0
- agno/knowledge/reranker/cohere.py +64 -0
- agno/knowledge/reranker/infinity.py +195 -0
- agno/knowledge/reranker/sentence_transformer.py +54 -0
- agno/knowledge/types.py +39 -0
- agno/knowledge/utils.py +189 -0
- agno/media.py +462 -0
- agno/memory/__init__.py +3 -0
- agno/memory/manager.py +1327 -0
- agno/models/__init__.py +0 -0
- agno/models/aimlapi/__init__.py +5 -0
- agno/models/aimlapi/aimlapi.py +45 -0
- agno/models/anthropic/__init__.py +5 -0
- agno/models/anthropic/claude.py +757 -0
- agno/models/aws/__init__.py +15 -0
- agno/models/aws/bedrock.py +701 -0
- agno/models/aws/claude.py +378 -0
- agno/models/azure/__init__.py +18 -0
- agno/models/azure/ai_foundry.py +485 -0
- agno/models/azure/openai_chat.py +131 -0
- agno/models/base.py +2175 -0
- agno/models/cerebras/__init__.py +12 -0
- agno/models/cerebras/cerebras.py +501 -0
- agno/models/cerebras/cerebras_openai.py +112 -0
- agno/models/cohere/__init__.py +5 -0
- agno/models/cohere/chat.py +389 -0
- agno/models/cometapi/__init__.py +5 -0
- agno/models/cometapi/cometapi.py +57 -0
- agno/models/dashscope/__init__.py +5 -0
- agno/models/dashscope/dashscope.py +91 -0
- agno/models/deepinfra/__init__.py +5 -0
- agno/models/deepinfra/deepinfra.py +28 -0
- agno/models/deepseek/__init__.py +5 -0
- agno/models/deepseek/deepseek.py +61 -0
- agno/models/defaults.py +1 -0
- agno/models/fireworks/__init__.py +5 -0
- agno/models/fireworks/fireworks.py +26 -0
- agno/models/google/__init__.py +5 -0
- agno/models/google/gemini.py +1085 -0
- agno/models/groq/__init__.py +5 -0
- agno/models/groq/groq.py +556 -0
- agno/models/huggingface/__init__.py +5 -0
- agno/models/huggingface/huggingface.py +491 -0
- agno/models/ibm/__init__.py +5 -0
- agno/models/ibm/watsonx.py +422 -0
- agno/models/internlm/__init__.py +3 -0
- agno/models/internlm/internlm.py +26 -0
- agno/models/langdb/__init__.py +1 -0
- agno/models/langdb/langdb.py +48 -0
- agno/models/litellm/__init__.py +14 -0
- agno/models/litellm/chat.py +468 -0
- agno/models/litellm/litellm_openai.py +25 -0
- agno/models/llama_cpp/__init__.py +5 -0
- agno/models/llama_cpp/llama_cpp.py +22 -0
- agno/models/lmstudio/__init__.py +5 -0
- agno/models/lmstudio/lmstudio.py +25 -0
- agno/models/message.py +434 -0
- agno/models/meta/__init__.py +12 -0
- agno/models/meta/llama.py +475 -0
- agno/models/meta/llama_openai.py +78 -0
- agno/models/metrics.py +120 -0
- agno/models/mistral/__init__.py +5 -0
- agno/models/mistral/mistral.py +432 -0
- agno/models/nebius/__init__.py +3 -0
- agno/models/nebius/nebius.py +54 -0
- agno/models/nexus/__init__.py +3 -0
- agno/models/nexus/nexus.py +22 -0
- agno/models/nvidia/__init__.py +5 -0
- agno/models/nvidia/nvidia.py +28 -0
- agno/models/ollama/__init__.py +5 -0
- agno/models/ollama/chat.py +441 -0
- agno/models/openai/__init__.py +9 -0
- agno/models/openai/chat.py +883 -0
- agno/models/openai/like.py +27 -0
- agno/models/openai/responses.py +1050 -0
- agno/models/openrouter/__init__.py +5 -0
- agno/models/openrouter/openrouter.py +66 -0
- agno/models/perplexity/__init__.py +5 -0
- agno/models/perplexity/perplexity.py +187 -0
- agno/models/portkey/__init__.py +3 -0
- agno/models/portkey/portkey.py +81 -0
- agno/models/requesty/__init__.py +5 -0
- agno/models/requesty/requesty.py +52 -0
- agno/models/response.py +199 -0
- agno/models/sambanova/__init__.py +5 -0
- agno/models/sambanova/sambanova.py +28 -0
- agno/models/siliconflow/__init__.py +5 -0
- agno/models/siliconflow/siliconflow.py +25 -0
- agno/models/together/__init__.py +5 -0
- agno/models/together/together.py +25 -0
- agno/models/utils.py +266 -0
- agno/models/vercel/__init__.py +3 -0
- agno/models/vercel/v0.py +26 -0
- agno/models/vertexai/__init__.py +0 -0
- agno/models/vertexai/claude.py +70 -0
- agno/models/vllm/__init__.py +3 -0
- agno/models/vllm/vllm.py +78 -0
- agno/models/xai/__init__.py +3 -0
- agno/models/xai/xai.py +113 -0
- agno/os/__init__.py +3 -0
- agno/os/app.py +876 -0
- agno/os/auth.py +57 -0
- agno/os/config.py +104 -0
- agno/os/interfaces/__init__.py +1 -0
- agno/os/interfaces/a2a/__init__.py +3 -0
- agno/os/interfaces/a2a/a2a.py +42 -0
- agno/os/interfaces/a2a/router.py +250 -0
- agno/os/interfaces/a2a/utils.py +924 -0
- agno/os/interfaces/agui/__init__.py +3 -0
- agno/os/interfaces/agui/agui.py +47 -0
- agno/os/interfaces/agui/router.py +144 -0
- agno/os/interfaces/agui/utils.py +534 -0
- agno/os/interfaces/base.py +25 -0
- agno/os/interfaces/slack/__init__.py +3 -0
- agno/os/interfaces/slack/router.py +148 -0
- agno/os/interfaces/slack/security.py +30 -0
- agno/os/interfaces/slack/slack.py +47 -0
- agno/os/interfaces/whatsapp/__init__.py +3 -0
- agno/os/interfaces/whatsapp/router.py +211 -0
- agno/os/interfaces/whatsapp/security.py +53 -0
- agno/os/interfaces/whatsapp/whatsapp.py +36 -0
- agno/os/mcp.py +292 -0
- agno/os/middleware/__init__.py +7 -0
- agno/os/middleware/jwt.py +233 -0
- agno/os/router.py +1763 -0
- agno/os/routers/__init__.py +3 -0
- agno/os/routers/evals/__init__.py +3 -0
- agno/os/routers/evals/evals.py +430 -0
- agno/os/routers/evals/schemas.py +142 -0
- agno/os/routers/evals/utils.py +162 -0
- agno/os/routers/health.py +31 -0
- agno/os/routers/home.py +52 -0
- agno/os/routers/knowledge/__init__.py +3 -0
- agno/os/routers/knowledge/knowledge.py +997 -0
- agno/os/routers/knowledge/schemas.py +178 -0
- agno/os/routers/memory/__init__.py +3 -0
- agno/os/routers/memory/memory.py +515 -0
- agno/os/routers/memory/schemas.py +62 -0
- agno/os/routers/metrics/__init__.py +3 -0
- agno/os/routers/metrics/metrics.py +190 -0
- agno/os/routers/metrics/schemas.py +47 -0
- agno/os/routers/session/__init__.py +3 -0
- agno/os/routers/session/session.py +997 -0
- agno/os/schema.py +1055 -0
- agno/os/settings.py +43 -0
- agno/os/utils.py +630 -0
- agno/py.typed +0 -0
- agno/reasoning/__init__.py +0 -0
- agno/reasoning/anthropic.py +80 -0
- agno/reasoning/azure_ai_foundry.py +67 -0
- agno/reasoning/deepseek.py +63 -0
- agno/reasoning/default.py +97 -0
- agno/reasoning/gemini.py +73 -0
- agno/reasoning/groq.py +71 -0
- agno/reasoning/helpers.py +63 -0
- agno/reasoning/ollama.py +67 -0
- agno/reasoning/openai.py +86 -0
- agno/reasoning/step.py +31 -0
- agno/reasoning/vertexai.py +76 -0
- agno/run/__init__.py +6 -0
- agno/run/agent.py +787 -0
- agno/run/base.py +229 -0
- agno/run/cancel.py +81 -0
- agno/run/messages.py +32 -0
- agno/run/team.py +753 -0
- agno/run/workflow.py +708 -0
- agno/session/__init__.py +10 -0
- agno/session/agent.py +295 -0
- agno/session/summary.py +265 -0
- agno/session/team.py +392 -0
- agno/session/workflow.py +205 -0
- agno/team/__init__.py +37 -0
- agno/team/team.py +8793 -0
- agno/tools/__init__.py +10 -0
- agno/tools/agentql.py +120 -0
- agno/tools/airflow.py +69 -0
- agno/tools/api.py +122 -0
- agno/tools/apify.py +314 -0
- agno/tools/arxiv.py +127 -0
- agno/tools/aws_lambda.py +53 -0
- agno/tools/aws_ses.py +66 -0
- agno/tools/baidusearch.py +89 -0
- agno/tools/bitbucket.py +292 -0
- agno/tools/brandfetch.py +213 -0
- agno/tools/bravesearch.py +106 -0
- agno/tools/brightdata.py +367 -0
- agno/tools/browserbase.py +209 -0
- agno/tools/calcom.py +255 -0
- agno/tools/calculator.py +151 -0
- agno/tools/cartesia.py +187 -0
- agno/tools/clickup.py +244 -0
- agno/tools/confluence.py +240 -0
- agno/tools/crawl4ai.py +158 -0
- agno/tools/csv_toolkit.py +185 -0
- agno/tools/dalle.py +110 -0
- agno/tools/daytona.py +475 -0
- agno/tools/decorator.py +262 -0
- agno/tools/desi_vocal.py +108 -0
- agno/tools/discord.py +161 -0
- agno/tools/docker.py +716 -0
- agno/tools/duckdb.py +379 -0
- agno/tools/duckduckgo.py +91 -0
- agno/tools/e2b.py +703 -0
- agno/tools/eleven_labs.py +196 -0
- agno/tools/email.py +67 -0
- agno/tools/evm.py +129 -0
- agno/tools/exa.py +396 -0
- agno/tools/fal.py +127 -0
- agno/tools/file.py +240 -0
- agno/tools/file_generation.py +350 -0
- agno/tools/financial_datasets.py +288 -0
- agno/tools/firecrawl.py +143 -0
- agno/tools/function.py +1187 -0
- agno/tools/giphy.py +93 -0
- agno/tools/github.py +1760 -0
- agno/tools/gmail.py +922 -0
- agno/tools/google_bigquery.py +117 -0
- agno/tools/google_drive.py +270 -0
- agno/tools/google_maps.py +253 -0
- agno/tools/googlecalendar.py +674 -0
- agno/tools/googlesearch.py +98 -0
- agno/tools/googlesheets.py +377 -0
- agno/tools/hackernews.py +77 -0
- agno/tools/jina.py +101 -0
- agno/tools/jira.py +170 -0
- agno/tools/knowledge.py +218 -0
- agno/tools/linear.py +426 -0
- agno/tools/linkup.py +58 -0
- agno/tools/local_file_system.py +90 -0
- agno/tools/lumalab.py +183 -0
- agno/tools/mcp/__init__.py +10 -0
- agno/tools/mcp/mcp.py +331 -0
- agno/tools/mcp/multi_mcp.py +347 -0
- agno/tools/mcp/params.py +24 -0
- agno/tools/mcp_toolbox.py +284 -0
- agno/tools/mem0.py +193 -0
- agno/tools/memori.py +339 -0
- agno/tools/memory.py +419 -0
- agno/tools/mlx_transcribe.py +139 -0
- agno/tools/models/__init__.py +0 -0
- agno/tools/models/azure_openai.py +190 -0
- agno/tools/models/gemini.py +203 -0
- agno/tools/models/groq.py +158 -0
- agno/tools/models/morph.py +186 -0
- agno/tools/models/nebius.py +124 -0
- agno/tools/models_labs.py +195 -0
- agno/tools/moviepy_video.py +349 -0
- agno/tools/neo4j.py +134 -0
- agno/tools/newspaper.py +46 -0
- agno/tools/newspaper4k.py +93 -0
- agno/tools/notion.py +204 -0
- agno/tools/openai.py +202 -0
- agno/tools/openbb.py +160 -0
- agno/tools/opencv.py +321 -0
- agno/tools/openweather.py +233 -0
- agno/tools/oxylabs.py +385 -0
- agno/tools/pandas.py +102 -0
- agno/tools/parallel.py +314 -0
- agno/tools/postgres.py +257 -0
- agno/tools/pubmed.py +188 -0
- agno/tools/python.py +205 -0
- agno/tools/reasoning.py +283 -0
- agno/tools/reddit.py +467 -0
- agno/tools/replicate.py +117 -0
- agno/tools/resend.py +62 -0
- agno/tools/scrapegraph.py +222 -0
- agno/tools/searxng.py +152 -0
- agno/tools/serpapi.py +116 -0
- agno/tools/serper.py +255 -0
- agno/tools/shell.py +53 -0
- agno/tools/slack.py +136 -0
- agno/tools/sleep.py +20 -0
- agno/tools/spider.py +116 -0
- agno/tools/sql.py +154 -0
- agno/tools/streamlit/__init__.py +0 -0
- agno/tools/streamlit/components.py +113 -0
- agno/tools/tavily.py +254 -0
- agno/tools/telegram.py +48 -0
- agno/tools/todoist.py +218 -0
- agno/tools/tool_registry.py +1 -0
- agno/tools/toolkit.py +146 -0
- agno/tools/trafilatura.py +388 -0
- agno/tools/trello.py +274 -0
- agno/tools/twilio.py +186 -0
- agno/tools/user_control_flow.py +78 -0
- agno/tools/valyu.py +228 -0
- agno/tools/visualization.py +467 -0
- agno/tools/webbrowser.py +28 -0
- agno/tools/webex.py +76 -0
- agno/tools/website.py +54 -0
- agno/tools/webtools.py +45 -0
- agno/tools/whatsapp.py +286 -0
- agno/tools/wikipedia.py +63 -0
- agno/tools/workflow.py +278 -0
- agno/tools/x.py +335 -0
- agno/tools/yfinance.py +257 -0
- agno/tools/youtube.py +184 -0
- agno/tools/zendesk.py +82 -0
- agno/tools/zep.py +454 -0
- agno/tools/zoom.py +382 -0
- agno/utils/__init__.py +0 -0
- agno/utils/agent.py +820 -0
- agno/utils/audio.py +49 -0
- agno/utils/certs.py +27 -0
- agno/utils/code_execution.py +11 -0
- agno/utils/common.py +132 -0
- agno/utils/dttm.py +13 -0
- agno/utils/enum.py +22 -0
- agno/utils/env.py +11 -0
- agno/utils/events.py +696 -0
- agno/utils/format_str.py +16 -0
- agno/utils/functions.py +166 -0
- agno/utils/gemini.py +426 -0
- agno/utils/hooks.py +57 -0
- agno/utils/http.py +74 -0
- agno/utils/json_schema.py +234 -0
- agno/utils/knowledge.py +36 -0
- agno/utils/location.py +19 -0
- agno/utils/log.py +255 -0
- agno/utils/mcp.py +214 -0
- agno/utils/media.py +352 -0
- agno/utils/merge_dict.py +41 -0
- agno/utils/message.py +118 -0
- agno/utils/models/__init__.py +0 -0
- agno/utils/models/ai_foundry.py +43 -0
- agno/utils/models/claude.py +358 -0
- agno/utils/models/cohere.py +87 -0
- agno/utils/models/llama.py +78 -0
- agno/utils/models/mistral.py +98 -0
- agno/utils/models/openai_responses.py +140 -0
- agno/utils/models/schema_utils.py +153 -0
- agno/utils/models/watsonx.py +41 -0
- agno/utils/openai.py +257 -0
- agno/utils/pickle.py +32 -0
- agno/utils/pprint.py +178 -0
- agno/utils/print_response/__init__.py +0 -0
- agno/utils/print_response/agent.py +842 -0
- agno/utils/print_response/team.py +1724 -0
- agno/utils/print_response/workflow.py +1668 -0
- agno/utils/prompts.py +111 -0
- agno/utils/reasoning.py +108 -0
- agno/utils/response.py +163 -0
- agno/utils/response_iterator.py +17 -0
- agno/utils/safe_formatter.py +24 -0
- agno/utils/serialize.py +32 -0
- agno/utils/shell.py +22 -0
- agno/utils/streamlit.py +487 -0
- agno/utils/string.py +231 -0
- agno/utils/team.py +139 -0
- agno/utils/timer.py +41 -0
- agno/utils/tools.py +102 -0
- agno/utils/web.py +23 -0
- agno/utils/whatsapp.py +305 -0
- agno/utils/yaml_io.py +25 -0
- agno/vectordb/__init__.py +3 -0
- agno/vectordb/base.py +127 -0
- agno/vectordb/cassandra/__init__.py +5 -0
- agno/vectordb/cassandra/cassandra.py +501 -0
- agno/vectordb/cassandra/extra_param_mixin.py +11 -0
- agno/vectordb/cassandra/index.py +13 -0
- agno/vectordb/chroma/__init__.py +5 -0
- agno/vectordb/chroma/chromadb.py +929 -0
- agno/vectordb/clickhouse/__init__.py +9 -0
- agno/vectordb/clickhouse/clickhousedb.py +835 -0
- agno/vectordb/clickhouse/index.py +9 -0
- agno/vectordb/couchbase/__init__.py +3 -0
- agno/vectordb/couchbase/couchbase.py +1442 -0
- agno/vectordb/distance.py +7 -0
- agno/vectordb/lancedb/__init__.py +6 -0
- agno/vectordb/lancedb/lance_db.py +995 -0
- agno/vectordb/langchaindb/__init__.py +5 -0
- agno/vectordb/langchaindb/langchaindb.py +163 -0
- agno/vectordb/lightrag/__init__.py +5 -0
- agno/vectordb/lightrag/lightrag.py +388 -0
- agno/vectordb/llamaindex/__init__.py +3 -0
- agno/vectordb/llamaindex/llamaindexdb.py +166 -0
- agno/vectordb/milvus/__init__.py +4 -0
- agno/vectordb/milvus/milvus.py +1182 -0
- agno/vectordb/mongodb/__init__.py +9 -0
- agno/vectordb/mongodb/mongodb.py +1417 -0
- agno/vectordb/pgvector/__init__.py +12 -0
- agno/vectordb/pgvector/index.py +23 -0
- agno/vectordb/pgvector/pgvector.py +1462 -0
- agno/vectordb/pineconedb/__init__.py +5 -0
- agno/vectordb/pineconedb/pineconedb.py +747 -0
- agno/vectordb/qdrant/__init__.py +5 -0
- agno/vectordb/qdrant/qdrant.py +1134 -0
- agno/vectordb/redis/__init__.py +9 -0
- agno/vectordb/redis/redisdb.py +694 -0
- agno/vectordb/search.py +7 -0
- agno/vectordb/singlestore/__init__.py +10 -0
- agno/vectordb/singlestore/index.py +41 -0
- agno/vectordb/singlestore/singlestore.py +763 -0
- agno/vectordb/surrealdb/__init__.py +3 -0
- agno/vectordb/surrealdb/surrealdb.py +699 -0
- agno/vectordb/upstashdb/__init__.py +5 -0
- agno/vectordb/upstashdb/upstashdb.py +718 -0
- agno/vectordb/weaviate/__init__.py +8 -0
- agno/vectordb/weaviate/index.py +15 -0
- agno/vectordb/weaviate/weaviate.py +1005 -0
- agno/workflow/__init__.py +23 -0
- agno/workflow/agent.py +299 -0
- agno/workflow/condition.py +738 -0
- agno/workflow/loop.py +735 -0
- agno/workflow/parallel.py +824 -0
- agno/workflow/router.py +702 -0
- agno/workflow/step.py +1432 -0
- agno/workflow/steps.py +592 -0
- agno/workflow/types.py +520 -0
- agno/workflow/workflow.py +4321 -0
- agno-2.2.13.dist-info/METADATA +614 -0
- agno-2.2.13.dist-info/RECORD +575 -0
- agno-2.2.13.dist-info/WHEEL +5 -0
- agno-2.2.13.dist-info/licenses/LICENSE +201 -0
- agno-2.2.13.dist-info/top_level.txt +1 -0
agno/tools/todoist.py
ADDED
|
@@ -0,0 +1,218 @@
|
|
|
1
|
+
import json
|
|
2
|
+
from os import getenv
|
|
3
|
+
from typing import Any, Dict, List, Optional
|
|
4
|
+
|
|
5
|
+
from agno.tools import Toolkit
|
|
6
|
+
from agno.utils.log import logger
|
|
7
|
+
|
|
8
|
+
try:
|
|
9
|
+
from todoist_api_python.api import TodoistAPI
|
|
10
|
+
except ImportError:
|
|
11
|
+
raise ImportError("`todoist-api-python` not installed. Please install using `pip install todoist-api-python`")
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
class TodoistTools(Toolkit):
|
|
15
|
+
"""A toolkit for interacting with Todoist tasks and projects."""
|
|
16
|
+
|
|
17
|
+
def __init__(
|
|
18
|
+
self,
|
|
19
|
+
api_token: Optional[str] = None,
|
|
20
|
+
**kwargs,
|
|
21
|
+
):
|
|
22
|
+
"""Initialize the Todoist toolkit.
|
|
23
|
+
|
|
24
|
+
Args:
|
|
25
|
+
api_token: Optional Todoist API token. If not provided, will look for TODOIST_API_TOKEN env var
|
|
26
|
+
"""
|
|
27
|
+
self.api_token = api_token or getenv("TODOIST_API_TOKEN")
|
|
28
|
+
if not self.api_token:
|
|
29
|
+
raise ValueError("TODOIST_API_TOKEN not set. Please set the TODOIST_API_TOKEN environment variable.")
|
|
30
|
+
|
|
31
|
+
self.api = TodoistAPI(self.api_token)
|
|
32
|
+
|
|
33
|
+
tools: List[Any] = [
|
|
34
|
+
self.create_task,
|
|
35
|
+
self.get_task,
|
|
36
|
+
self.update_task,
|
|
37
|
+
self.close_task,
|
|
38
|
+
self.delete_task,
|
|
39
|
+
self.get_active_tasks,
|
|
40
|
+
self.get_projects,
|
|
41
|
+
]
|
|
42
|
+
|
|
43
|
+
super().__init__(name="todoist", tools=tools, **kwargs)
|
|
44
|
+
|
|
45
|
+
def _task_to_dict(self, task: Any) -> Dict[str, Any]:
|
|
46
|
+
"""Convert a Todoist task to a dictionary with proper typing."""
|
|
47
|
+
task_dict: Dict[str, Any] = {
|
|
48
|
+
"id": task.id,
|
|
49
|
+
"content": task.content,
|
|
50
|
+
"description": task.description,
|
|
51
|
+
"project_id": task.project_id,
|
|
52
|
+
"section_id": task.section_id,
|
|
53
|
+
"parent_id": task.parent_id,
|
|
54
|
+
"order": task.order,
|
|
55
|
+
"priority": task.priority,
|
|
56
|
+
"url": task.url,
|
|
57
|
+
"creator_id": task.creator_id,
|
|
58
|
+
"created_at": task.created_at,
|
|
59
|
+
"labels": task.labels,
|
|
60
|
+
}
|
|
61
|
+
if hasattr(task, "comment_count"):
|
|
62
|
+
task_dict["comment_count"] = task.comment_count
|
|
63
|
+
if task.due:
|
|
64
|
+
task_dict["due"] = {
|
|
65
|
+
"date": task.due.date,
|
|
66
|
+
"string": task.due.string,
|
|
67
|
+
"lang": task.due.lang,
|
|
68
|
+
"is_recurring": task.due.is_recurring,
|
|
69
|
+
"timezone": task.due.timezone,
|
|
70
|
+
}
|
|
71
|
+
return task_dict
|
|
72
|
+
|
|
73
|
+
def create_task(
|
|
74
|
+
self,
|
|
75
|
+
content: str,
|
|
76
|
+
project_id: Optional[str] = None,
|
|
77
|
+
due_string: Optional[str] = None,
|
|
78
|
+
priority: Optional[int] = None,
|
|
79
|
+
labels: Optional[List[str]] = None,
|
|
80
|
+
) -> str:
|
|
81
|
+
"""
|
|
82
|
+
Create a new task in Todoist.
|
|
83
|
+
|
|
84
|
+
Args:
|
|
85
|
+
content: The task content/description
|
|
86
|
+
project_id: Optional ID of the project to add the task to
|
|
87
|
+
due_string: Optional due date in natural language (e.g., "tomorrow at 12:00")
|
|
88
|
+
priority: Optional priority level (1-4, where 4 is highest)
|
|
89
|
+
labels: Optional list of label names to apply to the task
|
|
90
|
+
|
|
91
|
+
Returns:
|
|
92
|
+
str: JSON string containing the created task
|
|
93
|
+
"""
|
|
94
|
+
try:
|
|
95
|
+
task = self.api.add_task(
|
|
96
|
+
content=content, project_id=project_id, due_string=due_string, priority=priority, labels=labels or []
|
|
97
|
+
)
|
|
98
|
+
# Convert task to a dictionary and handle the Due object
|
|
99
|
+
task_dict = self._task_to_dict(task)
|
|
100
|
+
return json.dumps(task_dict, default=str)
|
|
101
|
+
except Exception as e:
|
|
102
|
+
logger.error(f"Failed to create task: {str(e)}")
|
|
103
|
+
return json.dumps({"error": str(e)})
|
|
104
|
+
|
|
105
|
+
def get_task(self, task_id: str) -> str:
|
|
106
|
+
"""Get a specific task by ID."""
|
|
107
|
+
try:
|
|
108
|
+
task = self.api.get_task(task_id)
|
|
109
|
+
task_dict = self._task_to_dict(task)
|
|
110
|
+
return json.dumps(task_dict, default=str)
|
|
111
|
+
except Exception as e:
|
|
112
|
+
logger.error(f"Failed to get task: {str(e)}")
|
|
113
|
+
return json.dumps({"error": str(e)})
|
|
114
|
+
|
|
115
|
+
def update_task(
|
|
116
|
+
self,
|
|
117
|
+
task_id: str,
|
|
118
|
+
content: Optional[str] = None,
|
|
119
|
+
description: Optional[str] = None,
|
|
120
|
+
labels: Optional[List[str]] = None,
|
|
121
|
+
priority: Optional[int] = None,
|
|
122
|
+
due_string: Optional[str] = None,
|
|
123
|
+
due_date: Optional[str] = None,
|
|
124
|
+
due_datetime: Optional[str] = None,
|
|
125
|
+
due_lang: Optional[str] = None,
|
|
126
|
+
assignee_id: Optional[str] = None,
|
|
127
|
+
section_id: Optional[str] = None,
|
|
128
|
+
) -> str:
|
|
129
|
+
"""
|
|
130
|
+
Update an existing task with the specified parameters.
|
|
131
|
+
|
|
132
|
+
Args:
|
|
133
|
+
task_id: The ID of the task to update
|
|
134
|
+
content: The task content/name
|
|
135
|
+
description: The task description
|
|
136
|
+
labels: Array of label names
|
|
137
|
+
priority: Task priority from 1 (normal) to 4 (urgent)
|
|
138
|
+
due_string: Human readable date ("next Monday", "tomorrow", etc)
|
|
139
|
+
due_date: Specific date in YYYY-MM-DD format
|
|
140
|
+
due_datetime: Specific date and time in RFC3339 format
|
|
141
|
+
due_lang: 2-letter code specifying language of due_string ("en", "fr", etc)
|
|
142
|
+
assignee_id: The responsible user ID
|
|
143
|
+
section_id: ID of the section to move task to
|
|
144
|
+
|
|
145
|
+
Returns:
|
|
146
|
+
str: JSON string containing success status or error message
|
|
147
|
+
"""
|
|
148
|
+
try:
|
|
149
|
+
# Build updates dictionary with only provided parameters
|
|
150
|
+
updates: Dict[str, Any] = {}
|
|
151
|
+
if content is not None:
|
|
152
|
+
updates["content"] = content
|
|
153
|
+
if description is not None:
|
|
154
|
+
updates["description"] = description
|
|
155
|
+
if labels is not None:
|
|
156
|
+
updates["labels"] = labels
|
|
157
|
+
if priority is not None:
|
|
158
|
+
updates["priority"] = priority
|
|
159
|
+
if due_string is not None:
|
|
160
|
+
updates["due_string"] = due_string
|
|
161
|
+
if due_date is not None:
|
|
162
|
+
updates["due_date"] = due_date
|
|
163
|
+
if due_datetime is not None:
|
|
164
|
+
updates["due_datetime"] = due_datetime
|
|
165
|
+
if due_lang is not None:
|
|
166
|
+
updates["due_lang"] = due_lang
|
|
167
|
+
if assignee_id is not None:
|
|
168
|
+
updates["assignee_id"] = assignee_id
|
|
169
|
+
if section_id is not None:
|
|
170
|
+
updates["section_id"] = section_id
|
|
171
|
+
|
|
172
|
+
success = self.api.update_task(task_id=task_id, **updates)
|
|
173
|
+
return json.dumps({"success": success})
|
|
174
|
+
except Exception as e:
|
|
175
|
+
error_msg = str(e)
|
|
176
|
+
logger.error(f"Failed to update task: {error_msg}")
|
|
177
|
+
return json.dumps({"error": error_msg})
|
|
178
|
+
|
|
179
|
+
def close_task(self, task_id: str) -> str:
|
|
180
|
+
"""Mark a task as completed."""
|
|
181
|
+
try:
|
|
182
|
+
success = self.api.complete_task(task_id)
|
|
183
|
+
return json.dumps({"success": success})
|
|
184
|
+
except Exception as e:
|
|
185
|
+
logger.error(f"Failed to close task: {str(e)}")
|
|
186
|
+
return json.dumps({"error": str(e)})
|
|
187
|
+
|
|
188
|
+
def delete_task(self, task_id: str) -> str:
|
|
189
|
+
"""Delete a task."""
|
|
190
|
+
try:
|
|
191
|
+
success = self.api.delete_task(task_id)
|
|
192
|
+
return json.dumps({"success": success})
|
|
193
|
+
except Exception as e:
|
|
194
|
+
logger.error(f"Failed to delete task: {str(e)}")
|
|
195
|
+
return json.dumps({"error": str(e)})
|
|
196
|
+
|
|
197
|
+
def get_active_tasks(self) -> str:
|
|
198
|
+
"""Get all active (not completed) tasks."""
|
|
199
|
+
try:
|
|
200
|
+
tasks_response = self.api.get_tasks()
|
|
201
|
+
tasks = list(tasks_response)[0]
|
|
202
|
+
tasks_list = []
|
|
203
|
+
for task in tasks:
|
|
204
|
+
task_dict = self._task_to_dict(task)
|
|
205
|
+
tasks_list.append(task_dict)
|
|
206
|
+
return json.dumps(tasks_list, default=str)
|
|
207
|
+
except Exception as e:
|
|
208
|
+
logger.error(f"Failed to get active tasks: {str(e)}")
|
|
209
|
+
return json.dumps({"error": str(e)})
|
|
210
|
+
|
|
211
|
+
def get_projects(self) -> str:
|
|
212
|
+
"""Get all projects."""
|
|
213
|
+
try:
|
|
214
|
+
projects = self.api.get_projects()
|
|
215
|
+
return json.dumps([project.__dict__ for project in projects])
|
|
216
|
+
except Exception as e:
|
|
217
|
+
logger.error(f"Failed to get projects: {str(e)}")
|
|
218
|
+
return json.dumps({"error": str(e)})
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
from agno.tools.toolkit import Toolkit as ToolRegistry # type: ignore # noqa: F401
|
agno/tools/toolkit.py
ADDED
|
@@ -0,0 +1,146 @@
|
|
|
1
|
+
from collections import OrderedDict
|
|
2
|
+
from typing import Any, Callable, Dict, List, Optional
|
|
3
|
+
|
|
4
|
+
from agno.tools.function import Function
|
|
5
|
+
from agno.utils.log import log_debug, log_warning, logger
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
class Toolkit:
|
|
9
|
+
def __init__(
|
|
10
|
+
self,
|
|
11
|
+
name: str = "toolkit",
|
|
12
|
+
tools: List[Callable] = [],
|
|
13
|
+
instructions: Optional[str] = None,
|
|
14
|
+
add_instructions: bool = False,
|
|
15
|
+
include_tools: Optional[list[str]] = None,
|
|
16
|
+
exclude_tools: Optional[list[str]] = None,
|
|
17
|
+
requires_confirmation_tools: Optional[list[str]] = None,
|
|
18
|
+
external_execution_required_tools: Optional[list[str]] = None,
|
|
19
|
+
stop_after_tool_call_tools: Optional[List[str]] = None,
|
|
20
|
+
show_result_tools: Optional[List[str]] = None,
|
|
21
|
+
cache_results: bool = False,
|
|
22
|
+
cache_ttl: int = 3600,
|
|
23
|
+
cache_dir: Optional[str] = None,
|
|
24
|
+
auto_register: bool = True,
|
|
25
|
+
):
|
|
26
|
+
"""Initialize a new Toolkit.
|
|
27
|
+
|
|
28
|
+
Args:
|
|
29
|
+
name: A descriptive name for the toolkit
|
|
30
|
+
tools: List of tools to include in the toolkit
|
|
31
|
+
instructions: Instructions for the toolkit
|
|
32
|
+
add_instructions: Whether to add instructions to the toolkit
|
|
33
|
+
include_tools: List of tool names to include in the toolkit
|
|
34
|
+
exclude_tools: List of tool names to exclude from the toolkit
|
|
35
|
+
requires_confirmation_tools: List of tool names that require user confirmation
|
|
36
|
+
external_execution_required_tools: List of tool names that will be executed outside of the agent loop
|
|
37
|
+
cache_results (bool): Enable in-memory caching of function results.
|
|
38
|
+
cache_ttl (int): Time-to-live for cached results in seconds.
|
|
39
|
+
cache_dir (Optional[str]): Directory to store cache files. Defaults to system temp dir.
|
|
40
|
+
auto_register (bool): Whether to automatically register all methods in the class.
|
|
41
|
+
stop_after_tool_call_tools (Optional[List[str]]): List of function names that should stop the agent after execution.
|
|
42
|
+
show_result_tools (Optional[List[str]]): List of function names whose results should be shown.
|
|
43
|
+
"""
|
|
44
|
+
self.name: str = name
|
|
45
|
+
self.tools: List[Callable] = tools
|
|
46
|
+
self.functions: Dict[str, Function] = OrderedDict()
|
|
47
|
+
self.instructions: Optional[str] = instructions
|
|
48
|
+
self.add_instructions: bool = add_instructions
|
|
49
|
+
|
|
50
|
+
self.requires_confirmation_tools: list[str] = requires_confirmation_tools or []
|
|
51
|
+
self.external_execution_required_tools: list[str] = external_execution_required_tools or []
|
|
52
|
+
|
|
53
|
+
self.stop_after_tool_call_tools: list[str] = stop_after_tool_call_tools or []
|
|
54
|
+
self.show_result_tools: list[str] = show_result_tools or []
|
|
55
|
+
|
|
56
|
+
self._check_tools_filters(
|
|
57
|
+
available_tools=[tool.__name__ for tool in tools], include_tools=include_tools, exclude_tools=exclude_tools
|
|
58
|
+
)
|
|
59
|
+
|
|
60
|
+
self.include_tools = include_tools
|
|
61
|
+
self.exclude_tools = exclude_tools
|
|
62
|
+
|
|
63
|
+
self.cache_results: bool = cache_results
|
|
64
|
+
self.cache_ttl: int = cache_ttl
|
|
65
|
+
self.cache_dir: Optional[str] = cache_dir
|
|
66
|
+
|
|
67
|
+
# Automatically register all methods if auto_register is True
|
|
68
|
+
if auto_register and self.tools:
|
|
69
|
+
self._register_tools()
|
|
70
|
+
|
|
71
|
+
def _check_tools_filters(
|
|
72
|
+
self,
|
|
73
|
+
available_tools: List[str],
|
|
74
|
+
include_tools: Optional[list[str]] = None,
|
|
75
|
+
exclude_tools: Optional[list[str]] = None,
|
|
76
|
+
) -> None:
|
|
77
|
+
"""Check if `include_tools` and `exclude_tools` are valid"""
|
|
78
|
+
if include_tools or exclude_tools:
|
|
79
|
+
if include_tools:
|
|
80
|
+
missing_includes = set(include_tools) - set(available_tools)
|
|
81
|
+
if missing_includes:
|
|
82
|
+
raise ValueError(f"Included tool(s) not present in the toolkit: {', '.join(missing_includes)}")
|
|
83
|
+
|
|
84
|
+
if exclude_tools:
|
|
85
|
+
missing_excludes = set(exclude_tools) - set(available_tools)
|
|
86
|
+
if missing_excludes:
|
|
87
|
+
raise ValueError(f"Excluded tool(s) not present in the toolkit: {', '.join(missing_excludes)}")
|
|
88
|
+
|
|
89
|
+
if self.requires_confirmation_tools:
|
|
90
|
+
missing_requires_confirmation = set(self.requires_confirmation_tools) - set(available_tools)
|
|
91
|
+
if missing_requires_confirmation:
|
|
92
|
+
log_warning(
|
|
93
|
+
f"Requires confirmation tool(s) not present in the toolkit: {', '.join(missing_requires_confirmation)}"
|
|
94
|
+
)
|
|
95
|
+
|
|
96
|
+
if self.external_execution_required_tools:
|
|
97
|
+
missing_external_execution_required = set(self.external_execution_required_tools) - set(available_tools)
|
|
98
|
+
if missing_external_execution_required:
|
|
99
|
+
log_warning(
|
|
100
|
+
f"External execution required tool(s) not present in the toolkit: {', '.join(missing_external_execution_required)}"
|
|
101
|
+
)
|
|
102
|
+
|
|
103
|
+
def _register_tools(self) -> None:
|
|
104
|
+
"""Register all tools."""
|
|
105
|
+
for tool in self.tools:
|
|
106
|
+
self.register(tool)
|
|
107
|
+
|
|
108
|
+
def register(self, function: Callable[..., Any], name: Optional[str] = None):
|
|
109
|
+
"""Register a function with the toolkit.
|
|
110
|
+
|
|
111
|
+
Args:
|
|
112
|
+
function: The callable to register
|
|
113
|
+
name: Optional custom name for the function
|
|
114
|
+
|
|
115
|
+
Returns:
|
|
116
|
+
The registered function
|
|
117
|
+
"""
|
|
118
|
+
try:
|
|
119
|
+
tool_name = name or function.__name__
|
|
120
|
+
if self.include_tools is not None and tool_name not in self.include_tools:
|
|
121
|
+
return
|
|
122
|
+
if self.exclude_tools is not None and tool_name in self.exclude_tools:
|
|
123
|
+
return
|
|
124
|
+
|
|
125
|
+
f = Function(
|
|
126
|
+
name=tool_name,
|
|
127
|
+
entrypoint=function,
|
|
128
|
+
cache_results=self.cache_results,
|
|
129
|
+
cache_dir=self.cache_dir,
|
|
130
|
+
cache_ttl=self.cache_ttl,
|
|
131
|
+
requires_confirmation=tool_name in self.requires_confirmation_tools,
|
|
132
|
+
external_execution=tool_name in self.external_execution_required_tools,
|
|
133
|
+
stop_after_tool_call=tool_name in self.stop_after_tool_call_tools,
|
|
134
|
+
show_result=tool_name in self.show_result_tools or tool_name in self.stop_after_tool_call_tools,
|
|
135
|
+
)
|
|
136
|
+
self.functions[f.name] = f
|
|
137
|
+
log_debug(f"Function: {f.name} registered with {self.name}")
|
|
138
|
+
except Exception as e:
|
|
139
|
+
logger.warning(f"Failed to create Function for: {function.__name__}")
|
|
140
|
+
raise e
|
|
141
|
+
|
|
142
|
+
def __repr__(self):
|
|
143
|
+
return f"<{self.__class__.__name__} name={self.name} functions={list(self.functions.keys())}>"
|
|
144
|
+
|
|
145
|
+
def __str__(self):
|
|
146
|
+
return self.__repr__()
|