agno 0.1.2__py3-none-any.whl → 2.3.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 +44 -5
- agno/agent/agent.py +10531 -2975
- agno/api/agent.py +14 -53
- agno/api/api.py +7 -46
- agno/api/evals.py +22 -0
- agno/api/os.py +17 -0
- agno/api/routes.py +6 -25
- agno/api/schemas/__init__.py +9 -0
- agno/api/schemas/agent.py +6 -9
- agno/api/schemas/evals.py +16 -0
- agno/api/schemas/os.py +14 -0
- agno/api/schemas/team.py +10 -10
- agno/api/schemas/utils.py +21 -0
- agno/api/schemas/workflows.py +16 -0
- agno/api/settings.py +53 -0
- agno/api/team.py +22 -26
- 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/compression/__init__.py +3 -0
- agno/compression/manager.py +247 -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 +946 -0
- agno/db/dynamo/__init__.py +3 -0
- agno/db/dynamo/dynamo.py +2781 -0
- agno/db/dynamo/schemas.py +442 -0
- agno/db/dynamo/utils.py +743 -0
- agno/db/firestore/__init__.py +3 -0
- agno/db/firestore/firestore.py +2379 -0
- agno/db/firestore/schemas.py +181 -0
- agno/db/firestore/utils.py +376 -0
- agno/db/gcs_json/__init__.py +3 -0
- agno/db/gcs_json/gcs_json_db.py +1791 -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 +1312 -0
- agno/db/in_memory/utils.py +230 -0
- agno/db/json/__init__.py +3 -0
- agno/db/json/json_db.py +1777 -0
- agno/db/json/utils.py +230 -0
- agno/db/migrations/manager.py +199 -0
- agno/db/migrations/v1_to_v2.py +635 -0
- agno/db/migrations/versions/v2_3_0.py +938 -0
- agno/db/mongo/__init__.py +17 -0
- agno/db/mongo/async_mongo.py +2760 -0
- agno/db/mongo/mongo.py +2597 -0
- agno/db/mongo/schemas.py +119 -0
- agno/db/mongo/utils.py +276 -0
- agno/db/mysql/__init__.py +4 -0
- agno/db/mysql/async_mysql.py +2912 -0
- agno/db/mysql/mysql.py +2923 -0
- agno/db/mysql/schemas.py +186 -0
- agno/db/mysql/utils.py +488 -0
- agno/db/postgres/__init__.py +4 -0
- agno/db/postgres/async_postgres.py +2579 -0
- agno/db/postgres/postgres.py +2870 -0
- agno/db/postgres/schemas.py +187 -0
- agno/db/postgres/utils.py +442 -0
- agno/db/redis/__init__.py +3 -0
- agno/db/redis/redis.py +2141 -0
- agno/db/redis/schemas.py +159 -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 +34 -0
- agno/db/schemas/knowledge.py +40 -0
- agno/db/schemas/memory.py +61 -0
- agno/db/singlestore/__init__.py +3 -0
- agno/db/singlestore/schemas.py +179 -0
- agno/db/singlestore/singlestore.py +2877 -0
- agno/db/singlestore/utils.py +384 -0
- agno/db/sqlite/__init__.py +4 -0
- agno/db/sqlite/async_sqlite.py +2911 -0
- agno/db/sqlite/schemas.py +181 -0
- agno/db/sqlite/sqlite.py +2908 -0
- agno/db/sqlite/utils.py +429 -0
- agno/db/surrealdb/__init__.py +3 -0
- agno/db/surrealdb/metrics.py +292 -0
- agno/db/surrealdb/models.py +334 -0
- agno/db/surrealdb/queries.py +71 -0
- agno/db/surrealdb/surrealdb.py +1908 -0
- agno/db/surrealdb/utils.py +147 -0
- agno/db/utils.py +118 -0
- agno/eval/__init__.py +24 -0
- agno/eval/accuracy.py +666 -276
- agno/eval/agent_as_judge.py +861 -0
- agno/eval/base.py +29 -0
- agno/eval/performance.py +779 -0
- agno/eval/reliability.py +241 -62
- agno/eval/utils.py +120 -0
- agno/exceptions.py +143 -1
- 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/hooks/__init__.py +3 -0
- agno/hooks/decorator.py +164 -0
- agno/integrations/discord/__init__.py +3 -0
- agno/integrations/discord/client.py +203 -0
- agno/knowledge/__init__.py +5 -1
- agno/{document → knowledge}/chunking/agentic.py +22 -14
- agno/{document → knowledge}/chunking/document.py +2 -2
- agno/{document → knowledge}/chunking/fixed.py +7 -6
- agno/knowledge/chunking/markdown.py +151 -0
- agno/{document → knowledge}/chunking/recursive.py +15 -3
- agno/knowledge/chunking/row.py +39 -0
- agno/knowledge/chunking/semantic.py +91 -0
- agno/knowledge/chunking/strategy.py +165 -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/knowledge/embedder/aws_bedrock.py +343 -0
- agno/knowledge/embedder/azure_openai.py +210 -0
- agno/{embedder → knowledge/embedder}/base.py +8 -0
- agno/knowledge/embedder/cohere.py +323 -0
- agno/knowledge/embedder/fastembed.py +62 -0
- agno/{embedder → knowledge/embedder}/fireworks.py +1 -1
- 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/{embedder → knowledge/embedder}/together.py +1 -1
- agno/knowledge/embedder/vllm.py +262 -0
- agno/knowledge/embedder/voyageai.py +165 -0
- agno/knowledge/knowledge.py +3006 -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 +164 -0
- agno/knowledge/reader/docx_reader.py +82 -0
- agno/knowledge/reader/field_labeled_csv_reader.py +290 -0
- agno/knowledge/reader/firecrawl_reader.py +201 -0
- agno/knowledge/reader/json_reader.py +88 -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 +193 -0
- agno/knowledge/reader/text_reader.py +127 -0
- agno/knowledge/reader/web_search_reader.py +325 -0
- agno/knowledge/reader/website_reader.py +455 -0
- agno/knowledge/reader/wikipedia_reader.py +91 -0
- agno/knowledge/reader/youtube_reader.py +78 -0
- agno/knowledge/remote_content/remote_content.py +88 -0
- agno/knowledge/reranker/__init__.py +3 -0
- agno/{reranker → knowledge/reranker}/base.py +1 -1
- agno/{reranker → knowledge/reranker}/cohere.py +2 -2
- 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 +234 -0
- agno/media.py +439 -95
- agno/memory/__init__.py +16 -3
- agno/memory/manager.py +1474 -123
- agno/memory/strategies/__init__.py +15 -0
- agno/memory/strategies/base.py +66 -0
- agno/memory/strategies/summarize.py +196 -0
- agno/memory/strategies/types.py +37 -0
- agno/models/aimlapi/__init__.py +5 -0
- agno/models/aimlapi/aimlapi.py +62 -0
- agno/models/anthropic/__init__.py +4 -0
- agno/models/anthropic/claude.py +960 -496
- agno/models/aws/__init__.py +15 -0
- agno/models/aws/bedrock.py +686 -451
- agno/models/aws/claude.py +190 -183
- agno/models/azure/__init__.py +18 -1
- agno/models/azure/ai_foundry.py +489 -0
- agno/models/azure/openai_chat.py +89 -40
- agno/models/base.py +2477 -550
- agno/models/cerebras/__init__.py +12 -0
- agno/models/cerebras/cerebras.py +565 -0
- agno/models/cerebras/cerebras_openai.py +131 -0
- agno/models/cohere/__init__.py +4 -0
- agno/models/cohere/chat.py +306 -492
- agno/models/cometapi/__init__.py +5 -0
- agno/models/cometapi/cometapi.py +74 -0
- agno/models/dashscope/__init__.py +5 -0
- agno/models/dashscope/dashscope.py +90 -0
- agno/models/deepinfra/__init__.py +5 -0
- agno/models/deepinfra/deepinfra.py +45 -0
- agno/models/deepseek/__init__.py +4 -0
- agno/models/deepseek/deepseek.py +110 -9
- agno/models/fireworks/__init__.py +4 -0
- agno/models/fireworks/fireworks.py +19 -22
- agno/models/google/__init__.py +3 -7
- agno/models/google/gemini.py +1717 -662
- agno/models/google/utils.py +22 -0
- agno/models/groq/__init__.py +4 -0
- agno/models/groq/groq.py +391 -666
- agno/models/huggingface/__init__.py +4 -0
- agno/models/huggingface/huggingface.py +266 -538
- agno/models/ibm/__init__.py +5 -0
- agno/models/ibm/watsonx.py +432 -0
- agno/models/internlm/__init__.py +3 -0
- agno/models/internlm/internlm.py +20 -3
- agno/models/langdb/__init__.py +1 -0
- agno/models/langdb/langdb.py +60 -0
- agno/models/litellm/__init__.py +14 -0
- agno/models/litellm/chat.py +503 -0
- agno/models/litellm/litellm_openai.py +42 -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 +361 -39
- agno/models/meta/__init__.py +12 -0
- agno/models/meta/llama.py +502 -0
- agno/models/meta/llama_openai.py +79 -0
- agno/models/metrics.py +120 -0
- agno/models/mistral/__init__.py +4 -0
- agno/models/mistral/mistral.py +293 -393
- agno/models/nebius/__init__.py +3 -0
- agno/models/nebius/nebius.py +53 -0
- agno/models/nexus/__init__.py +3 -0
- agno/models/nexus/nexus.py +22 -0
- agno/models/nvidia/__init__.py +4 -0
- agno/models/nvidia/nvidia.py +22 -3
- agno/models/ollama/__init__.py +4 -2
- agno/models/ollama/chat.py +257 -492
- agno/models/openai/__init__.py +7 -0
- agno/models/openai/chat.py +725 -770
- agno/models/openai/like.py +16 -2
- agno/models/openai/responses.py +1121 -0
- agno/models/openrouter/__init__.py +4 -0
- agno/models/openrouter/openrouter.py +62 -5
- agno/models/perplexity/__init__.py +5 -0
- agno/models/perplexity/perplexity.py +203 -0
- agno/models/portkey/__init__.py +3 -0
- agno/models/portkey/portkey.py +82 -0
- agno/models/requesty/__init__.py +5 -0
- agno/models/requesty/requesty.py +69 -0
- agno/models/response.py +177 -7
- agno/models/sambanova/__init__.py +4 -0
- agno/models/sambanova/sambanova.py +23 -4
- agno/models/siliconflow/__init__.py +5 -0
- agno/models/siliconflow/siliconflow.py +42 -0
- agno/models/together/__init__.py +4 -0
- agno/models/together/together.py +21 -164
- agno/models/utils.py +266 -0
- agno/models/vercel/__init__.py +3 -0
- agno/models/vercel/v0.py +43 -0
- agno/models/vertexai/__init__.py +0 -1
- agno/models/vertexai/claude.py +190 -0
- agno/models/vllm/__init__.py +3 -0
- agno/models/vllm/vllm.py +83 -0
- agno/models/xai/__init__.py +2 -0
- agno/models/xai/xai.py +111 -7
- agno/os/__init__.py +3 -0
- agno/os/app.py +1027 -0
- agno/os/auth.py +244 -0
- agno/os/config.py +126 -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 +249 -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 +147 -0
- agno/os/interfaces/agui/utils.py +574 -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 +210 -0
- agno/os/interfaces/whatsapp/security.py +55 -0
- agno/os/interfaces/whatsapp/whatsapp.py +36 -0
- agno/os/mcp.py +293 -0
- agno/os/middleware/__init__.py +9 -0
- agno/os/middleware/jwt.py +797 -0
- agno/os/router.py +258 -0
- agno/os/routers/__init__.py +3 -0
- agno/os/routers/agents/__init__.py +3 -0
- agno/os/routers/agents/router.py +599 -0
- agno/os/routers/agents/schema.py +261 -0
- agno/os/routers/evals/__init__.py +3 -0
- agno/os/routers/evals/evals.py +450 -0
- agno/os/routers/evals/schemas.py +174 -0
- agno/os/routers/evals/utils.py +231 -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 +1008 -0
- agno/os/routers/knowledge/schemas.py +178 -0
- agno/os/routers/memory/__init__.py +3 -0
- agno/os/routers/memory/memory.py +661 -0
- agno/os/routers/memory/schemas.py +88 -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/routers/teams/__init__.py +3 -0
- agno/os/routers/teams/router.py +512 -0
- agno/os/routers/teams/schema.py +257 -0
- agno/os/routers/traces/__init__.py +3 -0
- agno/os/routers/traces/schemas.py +414 -0
- agno/os/routers/traces/traces.py +499 -0
- agno/os/routers/workflows/__init__.py +3 -0
- agno/os/routers/workflows/router.py +624 -0
- agno/os/routers/workflows/schema.py +75 -0
- agno/os/schema.py +534 -0
- agno/os/scopes.py +469 -0
- agno/{playground → os}/settings.py +7 -15
- agno/os/utils.py +973 -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 +24 -1
- agno/reasoning/ollama.py +67 -0
- agno/reasoning/openai.py +86 -0
- agno/reasoning/step.py +2 -1
- agno/reasoning/vertexai.py +76 -0
- agno/run/__init__.py +6 -0
- agno/run/agent.py +822 -0
- agno/run/base.py +247 -0
- agno/run/cancel.py +81 -0
- agno/run/requirement.py +181 -0
- agno/run/team.py +767 -0
- agno/run/workflow.py +708 -0
- agno/session/__init__.py +10 -0
- agno/session/agent.py +260 -0
- agno/session/summary.py +265 -0
- agno/session/team.py +342 -0
- agno/session/workflow.py +501 -0
- agno/table.py +10 -0
- agno/team/__init__.py +37 -0
- agno/team/team.py +9536 -0
- agno/tools/__init__.py +7 -0
- agno/tools/agentql.py +120 -0
- agno/tools/airflow.py +22 -12
- agno/tools/api.py +122 -0
- agno/tools/apify.py +276 -83
- agno/tools/{arxiv_toolkit.py → arxiv.py} +20 -12
- agno/tools/aws_lambda.py +28 -7
- agno/tools/aws_ses.py +66 -0
- agno/tools/baidusearch.py +11 -4
- 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 +32 -23
- agno/tools/calculator.py +24 -37
- agno/tools/cartesia.py +187 -0
- agno/tools/{clickup_tool.py → clickup.py} +17 -28
- agno/tools/confluence.py +91 -26
- agno/tools/crawl4ai.py +139 -43
- agno/tools/csv_toolkit.py +28 -22
- agno/tools/dalle.py +36 -22
- agno/tools/daytona.py +475 -0
- agno/tools/decorator.py +169 -14
- agno/tools/desi_vocal.py +23 -11
- agno/tools/discord.py +32 -29
- agno/tools/docker.py +716 -0
- agno/tools/duckdb.py +76 -81
- agno/tools/duckduckgo.py +43 -40
- agno/tools/e2b.py +703 -0
- agno/tools/eleven_labs.py +65 -54
- agno/tools/email.py +13 -5
- agno/tools/evm.py +129 -0
- agno/tools/exa.py +324 -42
- agno/tools/fal.py +39 -35
- agno/tools/file.py +196 -30
- agno/tools/file_generation.py +356 -0
- agno/tools/financial_datasets.py +288 -0
- agno/tools/firecrawl.py +108 -33
- agno/tools/function.py +960 -122
- agno/tools/giphy.py +34 -12
- agno/tools/github.py +1294 -97
- agno/tools/gmail.py +922 -0
- agno/tools/google_bigquery.py +117 -0
- agno/tools/google_drive.py +271 -0
- agno/tools/google_maps.py +253 -0
- agno/tools/googlecalendar.py +607 -107
- agno/tools/googlesheets.py +377 -0
- agno/tools/hackernews.py +20 -12
- agno/tools/jina.py +24 -14
- agno/tools/jira.py +48 -19
- agno/tools/knowledge.py +218 -0
- agno/tools/linear.py +82 -43
- agno/tools/linkup.py +58 -0
- agno/tools/local_file_system.py +15 -7
- agno/tools/lumalab.py +41 -26
- 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/memory.py +419 -0
- agno/tools/mlx_transcribe.py +11 -9
- 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 +163 -82
- agno/tools/moviepy_video.py +18 -13
- agno/tools/nano_banana.py +151 -0
- agno/tools/neo4j.py +134 -0
- agno/tools/newspaper.py +15 -4
- agno/tools/newspaper4k.py +19 -6
- agno/tools/notion.py +204 -0
- agno/tools/openai.py +181 -17
- agno/tools/openbb.py +27 -20
- agno/tools/opencv.py +321 -0
- agno/tools/openweather.py +233 -0
- agno/tools/oxylabs.py +385 -0
- agno/tools/pandas.py +25 -15
- agno/tools/parallel.py +314 -0
- agno/tools/postgres.py +238 -185
- agno/tools/pubmed.py +125 -13
- agno/tools/python.py +48 -35
- agno/tools/reasoning.py +283 -0
- agno/tools/reddit.py +207 -29
- agno/tools/redshift.py +406 -0
- agno/tools/replicate.py +69 -26
- agno/tools/resend.py +11 -6
- agno/tools/scrapegraph.py +179 -19
- agno/tools/searxng.py +23 -31
- agno/tools/serpapi.py +15 -10
- agno/tools/serper.py +255 -0
- agno/tools/shell.py +23 -12
- agno/tools/shopify.py +1519 -0
- agno/tools/slack.py +56 -14
- agno/tools/sleep.py +8 -6
- agno/tools/spider.py +35 -11
- agno/tools/spotify.py +919 -0
- agno/tools/sql.py +34 -19
- agno/tools/tavily.py +158 -8
- agno/tools/telegram.py +18 -8
- agno/tools/todoist.py +218 -0
- agno/tools/toolkit.py +134 -9
- agno/tools/trafilatura.py +388 -0
- agno/tools/trello.py +25 -28
- agno/tools/twilio.py +18 -9
- 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 +23 -19
- agno/tools/webtools.py +45 -0
- agno/tools/whatsapp.py +286 -0
- agno/tools/wikipedia.py +28 -19
- agno/tools/workflow.py +285 -0
- agno/tools/{twitter.py → x.py} +142 -46
- agno/tools/yfinance.py +41 -39
- agno/tools/youtube.py +34 -17
- agno/tools/zendesk.py +15 -5
- agno/tools/zep.py +454 -0
- agno/tools/zoom.py +86 -37
- agno/tracing/__init__.py +12 -0
- agno/tracing/exporter.py +157 -0
- agno/tracing/schemas.py +276 -0
- agno/tracing/setup.py +111 -0
- agno/utils/agent.py +938 -0
- agno/utils/audio.py +37 -1
- agno/utils/certs.py +27 -0
- agno/utils/code_execution.py +11 -0
- agno/utils/common.py +103 -20
- agno/utils/cryptography.py +22 -0
- agno/utils/dttm.py +33 -0
- agno/utils/events.py +700 -0
- agno/utils/functions.py +107 -37
- agno/utils/gemini.py +426 -0
- agno/utils/hooks.py +171 -0
- agno/utils/http.py +185 -0
- agno/utils/json_schema.py +159 -37
- agno/utils/knowledge.py +36 -0
- agno/utils/location.py +19 -0
- agno/utils/log.py +221 -8
- agno/utils/mcp.py +214 -0
- agno/utils/media.py +335 -14
- agno/utils/merge_dict.py +22 -1
- agno/utils/message.py +77 -2
- agno/utils/models/ai_foundry.py +50 -0
- agno/utils/models/claude.py +373 -0
- agno/utils/models/cohere.py +94 -0
- agno/utils/models/llama.py +85 -0
- agno/utils/models/mistral.py +100 -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 +1 -1
- agno/utils/pprint.py +124 -8
- agno/utils/print_response/agent.py +930 -0
- agno/utils/print_response/team.py +1914 -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/serialize.py +32 -0
- agno/utils/shell.py +4 -4
- agno/utils/streamlit.py +487 -0
- agno/utils/string.py +204 -51
- agno/utils/team.py +139 -0
- agno/utils/timer.py +9 -2
- agno/utils/tokens.py +657 -0
- agno/utils/tools.py +19 -1
- agno/utils/whatsapp.py +305 -0
- agno/utils/yaml_io.py +3 -3
- agno/vectordb/__init__.py +2 -0
- agno/vectordb/base.py +87 -9
- agno/vectordb/cassandra/__init__.py +5 -1
- agno/vectordb/cassandra/cassandra.py +383 -27
- agno/vectordb/chroma/__init__.py +4 -0
- agno/vectordb/chroma/chromadb.py +748 -83
- agno/vectordb/clickhouse/__init__.py +7 -1
- agno/vectordb/clickhouse/clickhousedb.py +554 -53
- agno/vectordb/couchbase/__init__.py +3 -0
- agno/vectordb/couchbase/couchbase.py +1446 -0
- agno/vectordb/lancedb/__init__.py +5 -0
- agno/vectordb/lancedb/lance_db.py +730 -98
- 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 +3 -0
- agno/vectordb/milvus/milvus.py +966 -78
- agno/vectordb/mongodb/__init__.py +9 -1
- agno/vectordb/mongodb/mongodb.py +1175 -172
- agno/vectordb/pgvector/__init__.py +8 -0
- agno/vectordb/pgvector/pgvector.py +599 -115
- agno/vectordb/pineconedb/__init__.py +5 -1
- agno/vectordb/pineconedb/pineconedb.py +406 -43
- agno/vectordb/qdrant/__init__.py +4 -0
- agno/vectordb/qdrant/qdrant.py +914 -61
- agno/vectordb/redis/__init__.py +9 -0
- agno/vectordb/redis/redisdb.py +682 -0
- agno/vectordb/singlestore/__init__.py +8 -1
- agno/vectordb/singlestore/singlestore.py +771 -0
- agno/vectordb/surrealdb/__init__.py +3 -0
- agno/vectordb/surrealdb/surrealdb.py +663 -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 +1009 -0
- agno/workflow/__init__.py +23 -1
- agno/workflow/agent.py +299 -0
- agno/workflow/condition.py +759 -0
- agno/workflow/loop.py +756 -0
- agno/workflow/parallel.py +853 -0
- agno/workflow/router.py +723 -0
- agno/workflow/step.py +1564 -0
- agno/workflow/steps.py +613 -0
- agno/workflow/types.py +556 -0
- agno/workflow/workflow.py +4327 -514
- agno-2.3.13.dist-info/METADATA +639 -0
- agno-2.3.13.dist-info/RECORD +613 -0
- {agno-0.1.2.dist-info → agno-2.3.13.dist-info}/WHEEL +1 -1
- agno-2.3.13.dist-info/licenses/LICENSE +201 -0
- agno/api/playground.py +0 -91
- agno/api/schemas/playground.py +0 -22
- agno/api/schemas/user.py +0 -22
- agno/api/schemas/workspace.py +0 -46
- agno/api/user.py +0 -160
- agno/api/workspace.py +0 -151
- agno/cli/auth_server.py +0 -118
- agno/cli/config.py +0 -275
- agno/cli/console.py +0 -88
- agno/cli/credentials.py +0 -23
- agno/cli/entrypoint.py +0 -571
- agno/cli/operator.py +0 -355
- agno/cli/settings.py +0 -85
- agno/cli/ws/ws_cli.py +0 -817
- agno/constants.py +0 -13
- agno/document/__init__.py +0 -1
- agno/document/chunking/semantic.py +0 -47
- agno/document/chunking/strategy.py +0 -31
- agno/document/reader/__init__.py +0 -1
- agno/document/reader/arxiv_reader.py +0 -41
- agno/document/reader/base.py +0 -22
- agno/document/reader/csv_reader.py +0 -84
- agno/document/reader/docx_reader.py +0 -46
- agno/document/reader/firecrawl_reader.py +0 -99
- agno/document/reader/json_reader.py +0 -43
- agno/document/reader/pdf_reader.py +0 -219
- agno/document/reader/s3/pdf_reader.py +0 -46
- agno/document/reader/s3/text_reader.py +0 -51
- agno/document/reader/text_reader.py +0 -41
- agno/document/reader/website_reader.py +0 -175
- agno/document/reader/youtube_reader.py +0 -50
- agno/embedder/__init__.py +0 -1
- agno/embedder/azure_openai.py +0 -86
- agno/embedder/cohere.py +0 -72
- agno/embedder/fastembed.py +0 -37
- agno/embedder/google.py +0 -73
- agno/embedder/huggingface.py +0 -54
- agno/embedder/mistral.py +0 -80
- agno/embedder/ollama.py +0 -57
- agno/embedder/openai.py +0 -74
- agno/embedder/sentence_transformer.py +0 -38
- agno/embedder/voyageai.py +0 -64
- agno/eval/perf.py +0 -201
- agno/file/__init__.py +0 -1
- 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 -230
- agno/knowledge/arxiv.py +0 -22
- agno/knowledge/combined.py +0 -22
- agno/knowledge/csv.py +0 -28
- agno/knowledge/csv_url.py +0 -19
- agno/knowledge/document.py +0 -20
- agno/knowledge/docx.py +0 -30
- agno/knowledge/json.py +0 -28
- agno/knowledge/langchain.py +0 -71
- agno/knowledge/llamaindex.py +0 -66
- agno/knowledge/pdf.py +0 -28
- agno/knowledge/pdf_url.py +0 -26
- agno/knowledge/s3/base.py +0 -60
- agno/knowledge/s3/pdf.py +0 -21
- agno/knowledge/s3/text.py +0 -23
- agno/knowledge/text.py +0 -30
- agno/knowledge/website.py +0 -88
- agno/knowledge/wikipedia.py +0 -31
- agno/knowledge/youtube.py +0 -22
- agno/memory/agent.py +0 -392
- agno/memory/classifier.py +0 -104
- agno/memory/db/__init__.py +0 -1
- 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 -15
- agno/memory/row.py +0 -36
- agno/memory/summarizer.py +0 -192
- agno/memory/summary.py +0 -19
- agno/memory/workflow.py +0 -38
- agno/models/google/gemini_openai.py +0 -26
- agno/models/ollama/hermes.py +0 -221
- agno/models/ollama/tools.py +0 -362
- agno/models/vertexai/gemini.py +0 -595
- agno/playground/__init__.py +0 -3
- agno/playground/async_router.py +0 -421
- agno/playground/deploy.py +0 -249
- agno/playground/operator.py +0 -92
- agno/playground/playground.py +0 -91
- agno/playground/schemas.py +0 -76
- agno/playground/serve.py +0 -55
- agno/playground/sync_router.py +0 -405
- agno/reasoning/agent.py +0 -68
- agno/run/response.py +0 -112
- agno/storage/agent/__init__.py +0 -0
- agno/storage/agent/base.py +0 -38
- agno/storage/agent/dynamodb.py +0 -350
- agno/storage/agent/json.py +0 -92
- agno/storage/agent/mongodb.py +0 -228
- agno/storage/agent/postgres.py +0 -367
- agno/storage/agent/session.py +0 -79
- agno/storage/agent/singlestore.py +0 -303
- agno/storage/agent/sqlite.py +0 -357
- agno/storage/agent/yaml.py +0 -93
- agno/storage/workflow/__init__.py +0 -0
- agno/storage/workflow/base.py +0 -40
- agno/storage/workflow/mongodb.py +0 -233
- agno/storage/workflow/postgres.py +0 -366
- agno/storage/workflow/session.py +0 -60
- agno/storage/workflow/sqlite.py +0 -359
- agno/tools/googlesearch.py +0 -88
- 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/vectordb/singlestore/s2vectordb.py +0 -390
- agno/vectordb/singlestore/s2vectordb2.py +0 -355
- agno/workspace/__init__.py +0 -0
- agno/workspace/config.py +0 -325
- agno/workspace/enums.py +0 -6
- agno/workspace/helpers.py +0 -48
- agno/workspace/operator.py +0 -758
- agno/workspace/settings.py +0 -63
- agno-0.1.2.dist-info/LICENSE +0 -375
- agno-0.1.2.dist-info/METADATA +0 -502
- agno-0.1.2.dist-info/RECORD +0 -352
- agno-0.1.2.dist-info/entry_points.txt +0 -3
- /agno/{cli → db/migrations}/__init__.py +0 -0
- /agno/{cli/ws → db/migrations/versions}/__init__.py +0 -0
- /agno/{document/chunking/__init__.py → db/schemas/metrics.py} +0 -0
- /agno/{document/reader/s3 → integrations}/__init__.py +0 -0
- /agno/{file/local → knowledge/chunking}/__init__.py +0 -0
- /agno/{infra → knowledge/remote_content}/__init__.py +0 -0
- /agno/{knowledge/s3 → tools/models}/__init__.py +0 -0
- /agno/{reranker → utils/models}/__init__.py +0 -0
- /agno/{storage → utils/print_response}/__init__.py +0 -0
- {agno-0.1.2.dist-info → agno-2.3.13.dist-info}/top_level.txt +0 -0
agno/tools/decorator.py
CHANGED
|
@@ -1,12 +1,55 @@
|
|
|
1
1
|
from functools import update_wrapper, wraps
|
|
2
|
-
from typing import Any, Callable, Optional, TypeVar, Union, overload
|
|
2
|
+
from typing import Any, Callable, Dict, List, Optional, TypeVar, Union, overload
|
|
3
3
|
|
|
4
|
-
from agno.tools.function import Function
|
|
4
|
+
from agno.tools.function import Function, get_entrypoint_docstring
|
|
5
5
|
from agno.utils.log import logger
|
|
6
6
|
|
|
7
7
|
# Type variable for better type hints
|
|
8
8
|
F = TypeVar("F", bound=Callable[..., Any])
|
|
9
|
-
ToolConfig = TypeVar("ToolConfig", bound=
|
|
9
|
+
ToolConfig = TypeVar("ToolConfig", bound=Dict[str, Any])
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
def _is_async_function(func: Callable) -> bool:
|
|
13
|
+
"""
|
|
14
|
+
Check if a function is async, even when wrapped by decorators like @staticmethod.
|
|
15
|
+
|
|
16
|
+
This function tries to detect async functions by:
|
|
17
|
+
1. Checking the function directly with inspect functions
|
|
18
|
+
2. Looking at the original function if it's wrapped
|
|
19
|
+
3. Checking the function's code object for async indicators
|
|
20
|
+
"""
|
|
21
|
+
from inspect import iscoroutine, iscoroutinefunction
|
|
22
|
+
|
|
23
|
+
# First, try the standard inspect functions
|
|
24
|
+
if iscoroutinefunction(func) or iscoroutine(func):
|
|
25
|
+
return True
|
|
26
|
+
|
|
27
|
+
# If the function has a __wrapped__ attribute, check the original function
|
|
28
|
+
if hasattr(func, "__wrapped__"):
|
|
29
|
+
original_func = func.__wrapped__
|
|
30
|
+
if iscoroutinefunction(original_func) or iscoroutine(original_func):
|
|
31
|
+
return True
|
|
32
|
+
|
|
33
|
+
# Check if the function has CO_COROUTINE flag in its code object
|
|
34
|
+
try:
|
|
35
|
+
if hasattr(func, "__code__") and func.__code__.co_flags & 0x80: # CO_COROUTINE flag
|
|
36
|
+
return True
|
|
37
|
+
except (AttributeError, TypeError):
|
|
38
|
+
pass
|
|
39
|
+
|
|
40
|
+
# For static methods, try to get the original function
|
|
41
|
+
try:
|
|
42
|
+
if hasattr(func, "__func__"):
|
|
43
|
+
original_func = func.__func__
|
|
44
|
+
if iscoroutinefunction(original_func) or iscoroutine(original_func):
|
|
45
|
+
return True
|
|
46
|
+
# Check the code object of the original function
|
|
47
|
+
if hasattr(original_func, "__code__") and original_func.__code__.co_flags & 0x80:
|
|
48
|
+
return True
|
|
49
|
+
except (AttributeError, TypeError):
|
|
50
|
+
pass
|
|
51
|
+
|
|
52
|
+
return False
|
|
10
53
|
|
|
11
54
|
|
|
12
55
|
@overload
|
|
@@ -19,11 +62,20 @@ def tool(
|
|
|
19
62
|
name: Optional[str] = None,
|
|
20
63
|
description: Optional[str] = None,
|
|
21
64
|
strict: Optional[bool] = None,
|
|
22
|
-
|
|
65
|
+
instructions: Optional[str] = None,
|
|
66
|
+
add_instructions: bool = True,
|
|
23
67
|
show_result: Optional[bool] = None,
|
|
24
|
-
|
|
68
|
+
stop_after_tool_call: Optional[bool] = None,
|
|
69
|
+
requires_confirmation: Optional[bool] = None,
|
|
70
|
+
requires_user_input: Optional[bool] = None,
|
|
71
|
+
user_input_fields: Optional[List[str]] = None,
|
|
72
|
+
external_execution: Optional[bool] = None,
|
|
25
73
|
pre_hook: Optional[Callable] = None,
|
|
26
74
|
post_hook: Optional[Callable] = None,
|
|
75
|
+
tool_hooks: Optional[List[Callable]] = None,
|
|
76
|
+
cache_results: bool = False,
|
|
77
|
+
cache_dir: Optional[str] = None,
|
|
78
|
+
cache_ttl: int = 3600,
|
|
27
79
|
) -> Callable[[F], Function]: ...
|
|
28
80
|
|
|
29
81
|
|
|
@@ -38,11 +90,20 @@ def tool(*args, **kwargs) -> Union[Function, Callable[[F], Function]]:
|
|
|
38
90
|
name: Optional[str] - Override for the function name
|
|
39
91
|
description: Optional[str] - Override for the function description
|
|
40
92
|
strict: Optional[bool] - Flag for strict parameter checking
|
|
41
|
-
|
|
93
|
+
instructions: Optional[str] - Instructions for using the tool
|
|
94
|
+
add_instructions: bool - If True, add instructions to the system message
|
|
42
95
|
show_result: Optional[bool] - If True, shows the result after function call
|
|
43
|
-
|
|
96
|
+
stop_after_tool_call: Optional[bool] - If True, the agent will stop after the function call.
|
|
97
|
+
requires_confirmation: Optional[bool] - If True, the function will require user confirmation before execution
|
|
98
|
+
requires_user_input: Optional[bool] - If True, the function will require user input before execution
|
|
99
|
+
user_input_fields: Optional[List[str]] - List of fields that will be provided to the function as user input
|
|
100
|
+
external_execution: Optional[bool] - If True, the function will be executed outside of the agent's context
|
|
44
101
|
pre_hook: Optional[Callable] - Hook that runs before the function is executed.
|
|
45
102
|
post_hook: Optional[Callable] - Hook that runs after the function is executed.
|
|
103
|
+
tool_hooks: Optional[List[Callable]] - List of hooks that run before and after the function is executed.
|
|
104
|
+
cache_results: bool - If True, enable caching of function results
|
|
105
|
+
cache_dir: Optional[str] - Directory to store cache files
|
|
106
|
+
cache_ttl: int - Time-to-live for cached results in seconds
|
|
46
107
|
|
|
47
108
|
Returns:
|
|
48
109
|
Union[Function, Callable[[F], Function]]: Decorated function or decorator
|
|
@@ -55,6 +116,10 @@ def tool(*args, **kwargs) -> Union[Function, Callable[[F], Function]]:
|
|
|
55
116
|
@tool(name="custom_name", description="Custom description")
|
|
56
117
|
def another_function():
|
|
57
118
|
pass
|
|
119
|
+
|
|
120
|
+
@tool
|
|
121
|
+
async def my_async_function():
|
|
122
|
+
pass
|
|
58
123
|
"""
|
|
59
124
|
# Move valid kwargs to a frozen set at module level
|
|
60
125
|
VALID_KWARGS = frozenset(
|
|
@@ -62,11 +127,20 @@ def tool(*args, **kwargs) -> Union[Function, Callable[[F], Function]]:
|
|
|
62
127
|
"name",
|
|
63
128
|
"description",
|
|
64
129
|
"strict",
|
|
65
|
-
"
|
|
130
|
+
"instructions",
|
|
131
|
+
"add_instructions",
|
|
66
132
|
"show_result",
|
|
67
|
-
"
|
|
133
|
+
"stop_after_tool_call",
|
|
134
|
+
"requires_confirmation",
|
|
135
|
+
"requires_user_input",
|
|
136
|
+
"user_input_fields",
|
|
137
|
+
"external_execution",
|
|
68
138
|
"pre_hook",
|
|
69
139
|
"post_hook",
|
|
140
|
+
"tool_hooks",
|
|
141
|
+
"cache_results",
|
|
142
|
+
"cache_dir",
|
|
143
|
+
"cache_ttl",
|
|
70
144
|
}
|
|
71
145
|
)
|
|
72
146
|
|
|
@@ -77,28 +151,109 @@ def tool(*args, **kwargs) -> Union[Function, Callable[[F], Function]]:
|
|
|
77
151
|
f"Invalid tool configuration arguments: {invalid_kwargs}. Valid arguments are: {sorted(VALID_KWARGS)}"
|
|
78
152
|
)
|
|
79
153
|
|
|
154
|
+
# Check that only one of requires_user_input, requires_confirmation, and external_execution is set at the same time
|
|
155
|
+
exclusive_flags = [
|
|
156
|
+
kwargs.get("requires_user_input", False),
|
|
157
|
+
kwargs.get("requires_confirmation", False),
|
|
158
|
+
kwargs.get("external_execution", False),
|
|
159
|
+
]
|
|
160
|
+
true_flags_count = sum(1 for flag in exclusive_flags if flag)
|
|
161
|
+
|
|
162
|
+
if true_flags_count > 1:
|
|
163
|
+
raise ValueError(
|
|
164
|
+
"Only one of 'requires_user_input', 'requires_confirmation', or 'external_execution' can be set to True at the same time."
|
|
165
|
+
)
|
|
166
|
+
|
|
80
167
|
def decorator(func: F) -> Function:
|
|
168
|
+
from inspect import isasyncgenfunction
|
|
169
|
+
|
|
81
170
|
@wraps(func)
|
|
82
|
-
def
|
|
171
|
+
def sync_wrapper(*args: Any, **kwargs: Any) -> Any:
|
|
83
172
|
try:
|
|
84
173
|
return func(*args, **kwargs)
|
|
85
174
|
except Exception as e:
|
|
86
175
|
logger.error(
|
|
87
176
|
f"Error in tool {func.__name__!r}: {e!r}",
|
|
88
|
-
exc_info=True,
|
|
177
|
+
exc_info=True,
|
|
89
178
|
)
|
|
90
179
|
raise
|
|
91
180
|
|
|
92
|
-
|
|
181
|
+
@wraps(func)
|
|
182
|
+
async def async_wrapper(*args: Any, **kwargs: Any) -> Any:
|
|
183
|
+
try:
|
|
184
|
+
return await func(*args, **kwargs)
|
|
185
|
+
except Exception as e:
|
|
186
|
+
logger.error(
|
|
187
|
+
f"Error in async tool {func.__name__!r}: {e!r}",
|
|
188
|
+
exc_info=True,
|
|
189
|
+
)
|
|
190
|
+
raise
|
|
191
|
+
|
|
192
|
+
@wraps(func)
|
|
193
|
+
async def async_gen_wrapper(*args: Any, **kwargs: Any) -> Any:
|
|
194
|
+
try:
|
|
195
|
+
return func(*args, **kwargs)
|
|
196
|
+
except Exception as e:
|
|
197
|
+
logger.error(
|
|
198
|
+
f"Error in async generator tool {func.__name__!r}: {e!r}",
|
|
199
|
+
exc_info=True,
|
|
200
|
+
)
|
|
201
|
+
raise
|
|
202
|
+
|
|
203
|
+
# Choose appropriate wrapper based on function type
|
|
204
|
+
if isasyncgenfunction(func):
|
|
205
|
+
wrapper = async_gen_wrapper
|
|
206
|
+
elif _is_async_function(func):
|
|
207
|
+
wrapper = async_wrapper
|
|
208
|
+
else:
|
|
209
|
+
wrapper = sync_wrapper
|
|
210
|
+
|
|
211
|
+
# Preserve the original signature and metadata
|
|
93
212
|
update_wrapper(wrapper, func)
|
|
94
213
|
|
|
214
|
+
if kwargs.get("requires_user_input", True):
|
|
215
|
+
kwargs["user_input_fields"] = kwargs.get("user_input_fields", [])
|
|
216
|
+
|
|
217
|
+
if kwargs.get("user_input_fields"):
|
|
218
|
+
kwargs["requires_user_input"] = True
|
|
219
|
+
|
|
95
220
|
# Create Function instance with any provided kwargs
|
|
96
221
|
tool_config = {
|
|
97
222
|
"name": kwargs.get("name", func.__name__),
|
|
223
|
+
"description": kwargs.get(
|
|
224
|
+
"description", get_entrypoint_docstring(wrapper)
|
|
225
|
+
), # Get docstring if description not provided
|
|
226
|
+
"instructions": kwargs.get("instructions"),
|
|
227
|
+
"add_instructions": kwargs.get("add_instructions", True),
|
|
98
228
|
"entrypoint": wrapper,
|
|
99
|
-
|
|
229
|
+
"cache_results": kwargs.get("cache_results", False),
|
|
230
|
+
"cache_dir": kwargs.get("cache_dir"),
|
|
231
|
+
"cache_ttl": kwargs.get("cache_ttl", 3600),
|
|
232
|
+
**{
|
|
233
|
+
k: v
|
|
234
|
+
for k, v in kwargs.items()
|
|
235
|
+
if k
|
|
236
|
+
not in [
|
|
237
|
+
"name",
|
|
238
|
+
"description",
|
|
239
|
+
"instructions",
|
|
240
|
+
"add_instructions",
|
|
241
|
+
"cache_results",
|
|
242
|
+
"cache_dir",
|
|
243
|
+
"cache_ttl",
|
|
244
|
+
]
|
|
245
|
+
and v is not None
|
|
246
|
+
},
|
|
100
247
|
}
|
|
101
|
-
|
|
248
|
+
|
|
249
|
+
# Automatically set show_result=True if stop_after_tool_call=True (unless explicitly set to False)
|
|
250
|
+
if kwargs.get("stop_after_tool_call") is True:
|
|
251
|
+
if "show_result" not in kwargs or kwargs.get("show_result") is None:
|
|
252
|
+
tool_config["show_result"] = True
|
|
253
|
+
function = Function(**tool_config)
|
|
254
|
+
# Determine parameters for the function
|
|
255
|
+
function.process_entrypoint()
|
|
256
|
+
return function
|
|
102
257
|
|
|
103
258
|
# Handle both @tool and @tool() cases
|
|
104
259
|
if len(args) == 1 and callable(args[0]) and not kwargs:
|
agno/tools/desi_vocal.py
CHANGED
|
@@ -1,12 +1,14 @@
|
|
|
1
1
|
from os import getenv
|
|
2
|
-
from typing import Optional
|
|
2
|
+
from typing import Any, List, Optional, Union
|
|
3
3
|
from uuid import uuid4
|
|
4
4
|
|
|
5
5
|
import requests
|
|
6
6
|
|
|
7
7
|
from agno.agent import Agent
|
|
8
|
-
from agno.media import
|
|
8
|
+
from agno.media import Audio
|
|
9
|
+
from agno.team.team import Team
|
|
9
10
|
from agno.tools import Toolkit
|
|
11
|
+
from agno.tools.function import ToolResult
|
|
10
12
|
from agno.utils.log import logger
|
|
11
13
|
|
|
12
14
|
|
|
@@ -15,17 +17,24 @@ class DesiVocalTools(Toolkit):
|
|
|
15
17
|
self,
|
|
16
18
|
api_key: Optional[str] = None,
|
|
17
19
|
voice_id: Optional[str] = "f27d74e5-ea71-4697-be3e-f04bbd80c1a8",
|
|
20
|
+
enable_get_voices: bool = True,
|
|
21
|
+
enable_text_to_speech: bool = True,
|
|
22
|
+
all: bool = False,
|
|
23
|
+
**kwargs,
|
|
18
24
|
):
|
|
19
|
-
super().__init__(name="desi_vocal_tools")
|
|
20
|
-
|
|
21
25
|
self.api_key = api_key or getenv("DESI_VOCAL_API_KEY")
|
|
22
26
|
if not self.api_key:
|
|
23
27
|
logger.error("DESI_VOCAL_API_KEY not set. Please set the DESI_VOCAL_API_KEY environment variable.")
|
|
24
28
|
|
|
25
29
|
self.voice_id = voice_id
|
|
26
30
|
|
|
27
|
-
|
|
28
|
-
|
|
31
|
+
tools: List[Any] = []
|
|
32
|
+
if all or enable_get_voices:
|
|
33
|
+
tools.append(self.get_voices)
|
|
34
|
+
if all or enable_text_to_speech:
|
|
35
|
+
tools.append(self.text_to_speech)
|
|
36
|
+
|
|
37
|
+
super().__init__(name="desi_vocal_tools", tools=tools, **kwargs)
|
|
29
38
|
|
|
30
39
|
def get_voices(self) -> str:
|
|
31
40
|
"""
|
|
@@ -60,13 +69,13 @@ class DesiVocalTools(Toolkit):
|
|
|
60
69
|
logger.error(f"Failed to get voices: {e}")
|
|
61
70
|
return f"Error: {e}"
|
|
62
71
|
|
|
63
|
-
def text_to_speech(self, agent: Agent, prompt: str, voice_id: Optional[str] = None) ->
|
|
72
|
+
def text_to_speech(self, agent: Union[Agent, Team], prompt: str, voice_id: Optional[str] = None) -> ToolResult:
|
|
64
73
|
"""
|
|
65
74
|
Use this function to generate audio from text.
|
|
66
75
|
Args:
|
|
67
76
|
prompt (str): The text to generate audio from.
|
|
68
77
|
Returns:
|
|
69
|
-
|
|
78
|
+
ToolResult: A ToolResult containing the generated audio or error message.
|
|
70
79
|
"""
|
|
71
80
|
try:
|
|
72
81
|
url = "https://prod-api2.desivocal.com/dv/api/v0/tts_api/generate"
|
|
@@ -88,9 +97,12 @@ class DesiVocalTools(Toolkit):
|
|
|
88
97
|
response_json = response.json()
|
|
89
98
|
audio_url = response_json["s3_path"]
|
|
90
99
|
|
|
91
|
-
|
|
100
|
+
audio_artifact = Audio(id=str(uuid4()), url=audio_url)
|
|
92
101
|
|
|
93
|
-
return
|
|
102
|
+
return ToolResult(
|
|
103
|
+
content=f"Audio generated successfully: {audio_url}",
|
|
104
|
+
audios=[audio_artifact],
|
|
105
|
+
)
|
|
94
106
|
except Exception as e:
|
|
95
107
|
logger.error(f"Failed to generate audio: {e}")
|
|
96
|
-
return f"Error: {e}"
|
|
108
|
+
return ToolResult(content=f"Error: {e}")
|
agno/tools/discord.py
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
|
|
3
3
|
import json
|
|
4
4
|
from os import getenv
|
|
5
|
-
from typing import Any, Dict, Optional
|
|
5
|
+
from typing import Any, Dict, List, Optional
|
|
6
6
|
|
|
7
7
|
import requests
|
|
8
8
|
|
|
@@ -14,14 +14,14 @@ class DiscordTools(Toolkit):
|
|
|
14
14
|
def __init__(
|
|
15
15
|
self,
|
|
16
16
|
bot_token: Optional[str] = None,
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
17
|
+
enable_send_message: bool = True,
|
|
18
|
+
enable_get_channel_messages: bool = True,
|
|
19
|
+
enable_get_channel_info: bool = True,
|
|
20
|
+
enable_list_channels: bool = True,
|
|
21
|
+
enable_delete_message: bool = True,
|
|
22
|
+
all: bool = False,
|
|
23
|
+
**kwargs,
|
|
21
24
|
):
|
|
22
|
-
"""Initialize Discord tools."""
|
|
23
|
-
super().__init__(name="discord")
|
|
24
|
-
|
|
25
25
|
self.bot_token = bot_token or getenv("DISCORD_BOT_TOKEN")
|
|
26
26
|
if not self.bot_token:
|
|
27
27
|
logger.error("Discord bot token is required")
|
|
@@ -33,16 +33,19 @@ class DiscordTools(Toolkit):
|
|
|
33
33
|
"Content-Type": "application/json",
|
|
34
34
|
}
|
|
35
35
|
|
|
36
|
-
|
|
37
|
-
if
|
|
38
|
-
|
|
39
|
-
if
|
|
40
|
-
|
|
41
|
-
if
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
36
|
+
tools: List[Any] = []
|
|
37
|
+
if enable_send_message or all:
|
|
38
|
+
tools.append(self.send_message)
|
|
39
|
+
if enable_get_channel_messages or all:
|
|
40
|
+
tools.append(self.get_channel_messages)
|
|
41
|
+
if enable_get_channel_info or all:
|
|
42
|
+
tools.append(self.get_channel_info)
|
|
43
|
+
if enable_list_channels or all:
|
|
44
|
+
tools.append(self.list_channels)
|
|
45
|
+
if enable_delete_message or all:
|
|
46
|
+
tools.append(self.delete_message)
|
|
47
|
+
|
|
48
|
+
super().__init__(name="discord", tools=tools, **kwargs)
|
|
46
49
|
|
|
47
50
|
def _make_request(self, method: str, endpoint: str, data: Optional[Dict[str, Any]] = None) -> Dict[str, Any]:
|
|
48
51
|
"""Make a request to Discord API."""
|
|
@@ -51,12 +54,12 @@ class DiscordTools(Toolkit):
|
|
|
51
54
|
response.raise_for_status()
|
|
52
55
|
return response.json() if response.text else {}
|
|
53
56
|
|
|
54
|
-
def send_message(self, channel_id:
|
|
57
|
+
def send_message(self, channel_id: str, message: str) -> str:
|
|
55
58
|
"""
|
|
56
59
|
Send a message to a Discord channel.
|
|
57
60
|
|
|
58
61
|
Args:
|
|
59
|
-
channel_id (
|
|
62
|
+
channel_id (str): The ID of the channel to send the message to.
|
|
60
63
|
message (str): The text of the message to send.
|
|
61
64
|
|
|
62
65
|
Returns:
|
|
@@ -70,12 +73,12 @@ class DiscordTools(Toolkit):
|
|
|
70
73
|
logger.error(f"Error sending message: {e}")
|
|
71
74
|
return f"Error sending message: {str(e)}"
|
|
72
75
|
|
|
73
|
-
def get_channel_info(self, channel_id:
|
|
76
|
+
def get_channel_info(self, channel_id: str) -> str:
|
|
74
77
|
"""
|
|
75
78
|
Get information about a Discord channel.
|
|
76
79
|
|
|
77
80
|
Args:
|
|
78
|
-
channel_id (
|
|
81
|
+
channel_id (str): The ID of the channel to get information about.
|
|
79
82
|
|
|
80
83
|
Returns:
|
|
81
84
|
str: A JSON string containing the channel information.
|
|
@@ -87,12 +90,12 @@ class DiscordTools(Toolkit):
|
|
|
87
90
|
logger.error(f"Error getting channel info: {e}")
|
|
88
91
|
return f"Error getting channel info: {str(e)}"
|
|
89
92
|
|
|
90
|
-
def list_channels(self, guild_id:
|
|
93
|
+
def list_channels(self, guild_id: str) -> str:
|
|
91
94
|
"""
|
|
92
95
|
List all channels in a Discord server.
|
|
93
96
|
|
|
94
97
|
Args:
|
|
95
|
-
guild_id (
|
|
98
|
+
guild_id (str): The ID of the server to list channels from.
|
|
96
99
|
|
|
97
100
|
Returns:
|
|
98
101
|
str: A JSON string containing the list of channels.
|
|
@@ -104,12 +107,12 @@ class DiscordTools(Toolkit):
|
|
|
104
107
|
logger.error(f"Error listing channels: {e}")
|
|
105
108
|
return f"Error listing channels: {str(e)}"
|
|
106
109
|
|
|
107
|
-
def get_channel_messages(self, channel_id:
|
|
110
|
+
def get_channel_messages(self, channel_id: str, limit: int = 100) -> str:
|
|
108
111
|
"""
|
|
109
112
|
Get the message history of a Discord channel.
|
|
110
113
|
|
|
111
114
|
Args:
|
|
112
|
-
channel_id (
|
|
115
|
+
channel_id (str): The ID of the channel to fetch messages from.
|
|
113
116
|
limit (int): The maximum number of messages to fetch. Defaults to 100.
|
|
114
117
|
|
|
115
118
|
Returns:
|
|
@@ -122,13 +125,13 @@ class DiscordTools(Toolkit):
|
|
|
122
125
|
logger.error(f"Error getting messages: {e}")
|
|
123
126
|
return f"Error getting messages: {str(e)}"
|
|
124
127
|
|
|
125
|
-
def delete_message(self, channel_id:
|
|
128
|
+
def delete_message(self, channel_id: str, message_id: str) -> str:
|
|
126
129
|
"""
|
|
127
130
|
Delete a message from a Discord channel.
|
|
128
131
|
|
|
129
132
|
Args:
|
|
130
|
-
channel_id (
|
|
131
|
-
message_id (
|
|
133
|
+
channel_id (str): The ID of the channel containing the message.
|
|
134
|
+
message_id (str): The ID of the message to delete.
|
|
132
135
|
|
|
133
136
|
Returns:
|
|
134
137
|
str: A success message or error message.
|