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/decorator.py
ADDED
|
@@ -0,0 +1,262 @@
|
|
|
1
|
+
from functools import update_wrapper, wraps
|
|
2
|
+
from typing import Any, Callable, Dict, List, Optional, TypeVar, Union, overload
|
|
3
|
+
|
|
4
|
+
from agno.tools.function import Function, get_entrypoint_docstring
|
|
5
|
+
from agno.utils.log import logger
|
|
6
|
+
|
|
7
|
+
# Type variable for better type hints
|
|
8
|
+
F = TypeVar("F", bound=Callable[..., Any])
|
|
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
|
|
53
|
+
|
|
54
|
+
|
|
55
|
+
@overload
|
|
56
|
+
def tool() -> Callable[[F], Function]: ...
|
|
57
|
+
|
|
58
|
+
|
|
59
|
+
@overload
|
|
60
|
+
def tool(
|
|
61
|
+
*,
|
|
62
|
+
name: Optional[str] = None,
|
|
63
|
+
description: Optional[str] = None,
|
|
64
|
+
strict: Optional[bool] = None,
|
|
65
|
+
instructions: Optional[str] = None,
|
|
66
|
+
add_instructions: bool = True,
|
|
67
|
+
show_result: Optional[bool] = None,
|
|
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,
|
|
73
|
+
pre_hook: Optional[Callable] = None,
|
|
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,
|
|
79
|
+
) -> Callable[[F], Function]: ...
|
|
80
|
+
|
|
81
|
+
|
|
82
|
+
@overload
|
|
83
|
+
def tool(func: F) -> Function: ...
|
|
84
|
+
|
|
85
|
+
|
|
86
|
+
def tool(*args, **kwargs) -> Union[Function, Callable[[F], Function]]:
|
|
87
|
+
"""Decorator to convert a function into a Function that can be used by an agent.
|
|
88
|
+
|
|
89
|
+
Args:
|
|
90
|
+
name: Optional[str] - Override for the function name
|
|
91
|
+
description: Optional[str] - Override for the function description
|
|
92
|
+
strict: Optional[bool] - Flag for strict parameter checking
|
|
93
|
+
instructions: Optional[str] - Instructions for using the tool
|
|
94
|
+
add_instructions: bool - If True, add instructions to the system message
|
|
95
|
+
show_result: Optional[bool] - If True, shows the result after function call
|
|
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
|
|
101
|
+
pre_hook: Optional[Callable] - Hook that runs before the function is executed.
|
|
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
|
|
107
|
+
|
|
108
|
+
Returns:
|
|
109
|
+
Union[Function, Callable[[F], Function]]: Decorated function or decorator
|
|
110
|
+
|
|
111
|
+
Examples:
|
|
112
|
+
@tool
|
|
113
|
+
def my_function():
|
|
114
|
+
pass
|
|
115
|
+
|
|
116
|
+
@tool(name="custom_name", description="Custom description")
|
|
117
|
+
def another_function():
|
|
118
|
+
pass
|
|
119
|
+
|
|
120
|
+
@tool
|
|
121
|
+
async def my_async_function():
|
|
122
|
+
pass
|
|
123
|
+
"""
|
|
124
|
+
# Move valid kwargs to a frozen set at module level
|
|
125
|
+
VALID_KWARGS = frozenset(
|
|
126
|
+
{
|
|
127
|
+
"name",
|
|
128
|
+
"description",
|
|
129
|
+
"strict",
|
|
130
|
+
"instructions",
|
|
131
|
+
"add_instructions",
|
|
132
|
+
"show_result",
|
|
133
|
+
"stop_after_tool_call",
|
|
134
|
+
"requires_confirmation",
|
|
135
|
+
"requires_user_input",
|
|
136
|
+
"user_input_fields",
|
|
137
|
+
"external_execution",
|
|
138
|
+
"pre_hook",
|
|
139
|
+
"post_hook",
|
|
140
|
+
"tool_hooks",
|
|
141
|
+
"cache_results",
|
|
142
|
+
"cache_dir",
|
|
143
|
+
"cache_ttl",
|
|
144
|
+
}
|
|
145
|
+
)
|
|
146
|
+
|
|
147
|
+
# Improve error message with more context
|
|
148
|
+
invalid_kwargs = set(kwargs.keys()) - VALID_KWARGS
|
|
149
|
+
if invalid_kwargs:
|
|
150
|
+
raise ValueError(
|
|
151
|
+
f"Invalid tool configuration arguments: {invalid_kwargs}. Valid arguments are: {sorted(VALID_KWARGS)}"
|
|
152
|
+
)
|
|
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
|
+
|
|
167
|
+
def decorator(func: F) -> Function:
|
|
168
|
+
from inspect import isasyncgenfunction
|
|
169
|
+
|
|
170
|
+
@wraps(func)
|
|
171
|
+
def sync_wrapper(*args: Any, **kwargs: Any) -> Any:
|
|
172
|
+
try:
|
|
173
|
+
return func(*args, **kwargs)
|
|
174
|
+
except Exception as e:
|
|
175
|
+
logger.error(
|
|
176
|
+
f"Error in tool {func.__name__!r}: {e!r}",
|
|
177
|
+
exc_info=True,
|
|
178
|
+
)
|
|
179
|
+
raise
|
|
180
|
+
|
|
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
|
|
212
|
+
update_wrapper(wrapper, func)
|
|
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
|
+
|
|
220
|
+
# Create Function instance with any provided kwargs
|
|
221
|
+
tool_config = {
|
|
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),
|
|
228
|
+
"entrypoint": wrapper,
|
|
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
|
+
},
|
|
247
|
+
}
|
|
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
|
|
257
|
+
|
|
258
|
+
# Handle both @tool and @tool() cases
|
|
259
|
+
if len(args) == 1 and callable(args[0]) and not kwargs:
|
|
260
|
+
return decorator(args[0])
|
|
261
|
+
|
|
262
|
+
return decorator
|
agno/tools/desi_vocal.py
ADDED
|
@@ -0,0 +1,108 @@
|
|
|
1
|
+
from os import getenv
|
|
2
|
+
from typing import Any, List, Optional, Union
|
|
3
|
+
from uuid import uuid4
|
|
4
|
+
|
|
5
|
+
import requests
|
|
6
|
+
|
|
7
|
+
from agno.agent import Agent
|
|
8
|
+
from agno.media import Audio
|
|
9
|
+
from agno.team.team import Team
|
|
10
|
+
from agno.tools import Toolkit
|
|
11
|
+
from agno.tools.function import ToolResult
|
|
12
|
+
from agno.utils.log import logger
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
class DesiVocalTools(Toolkit):
|
|
16
|
+
def __init__(
|
|
17
|
+
self,
|
|
18
|
+
api_key: Optional[str] = None,
|
|
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,
|
|
24
|
+
):
|
|
25
|
+
self.api_key = api_key or getenv("DESI_VOCAL_API_KEY")
|
|
26
|
+
if not self.api_key:
|
|
27
|
+
logger.error("DESI_VOCAL_API_KEY not set. Please set the DESI_VOCAL_API_KEY environment variable.")
|
|
28
|
+
|
|
29
|
+
self.voice_id = voice_id
|
|
30
|
+
|
|
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)
|
|
38
|
+
|
|
39
|
+
def get_voices(self) -> str:
|
|
40
|
+
"""
|
|
41
|
+
Use this function to get all the voices available.
|
|
42
|
+
Returns:
|
|
43
|
+
result (list): A list of voices that have an ID, name and description.
|
|
44
|
+
"""
|
|
45
|
+
try:
|
|
46
|
+
url = "https://prod-api2.desivocal.com/dv/api/v0/tts_api/voices"
|
|
47
|
+
response = requests.get(url)
|
|
48
|
+
response.raise_for_status()
|
|
49
|
+
|
|
50
|
+
voices_data = response.json()
|
|
51
|
+
|
|
52
|
+
responses = []
|
|
53
|
+
for voice_id, voice_info in voices_data.items():
|
|
54
|
+
responses.append(
|
|
55
|
+
{
|
|
56
|
+
"id": voice_id,
|
|
57
|
+
"name": voice_info["name"],
|
|
58
|
+
"gender": voice_info["audio_gender"],
|
|
59
|
+
"type": voice_info["voice_type"],
|
|
60
|
+
"language": ", ".join(voice_info["languages"]),
|
|
61
|
+
"preview_url": next(iter(voice_info["preview_path"].values()))
|
|
62
|
+
if voice_info["preview_path"]
|
|
63
|
+
else None,
|
|
64
|
+
}
|
|
65
|
+
)
|
|
66
|
+
|
|
67
|
+
return str(responses)
|
|
68
|
+
except Exception as e:
|
|
69
|
+
logger.error(f"Failed to get voices: {e}")
|
|
70
|
+
return f"Error: {e}"
|
|
71
|
+
|
|
72
|
+
def text_to_speech(self, agent: Union[Agent, Team], prompt: str, voice_id: Optional[str] = None) -> ToolResult:
|
|
73
|
+
"""
|
|
74
|
+
Use this function to generate audio from text.
|
|
75
|
+
Args:
|
|
76
|
+
prompt (str): The text to generate audio from.
|
|
77
|
+
Returns:
|
|
78
|
+
ToolResult: A ToolResult containing the generated audio or error message.
|
|
79
|
+
"""
|
|
80
|
+
try:
|
|
81
|
+
url = "https://prod-api2.desivocal.com/dv/api/v0/tts_api/generate"
|
|
82
|
+
|
|
83
|
+
payload = {
|
|
84
|
+
"text": prompt,
|
|
85
|
+
"voice_id": voice_id or self.voice_id,
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
headers = {
|
|
89
|
+
"X_API_KEY": self.api_key,
|
|
90
|
+
"Content-Type": "application/json",
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
response = requests.post(url, headers=headers, json=payload)
|
|
94
|
+
|
|
95
|
+
response.raise_for_status()
|
|
96
|
+
|
|
97
|
+
response_json = response.json()
|
|
98
|
+
audio_url = response_json["s3_path"]
|
|
99
|
+
|
|
100
|
+
audio_artifact = Audio(id=str(uuid4()), url=audio_url)
|
|
101
|
+
|
|
102
|
+
return ToolResult(
|
|
103
|
+
content=f"Audio generated successfully: {audio_url}",
|
|
104
|
+
audios=[audio_artifact],
|
|
105
|
+
)
|
|
106
|
+
except Exception as e:
|
|
107
|
+
logger.error(f"Failed to generate audio: {e}")
|
|
108
|
+
return ToolResult(content=f"Error: {e}")
|
agno/tools/discord.py
ADDED
|
@@ -0,0 +1,161 @@
|
|
|
1
|
+
"""Discord integration tools for interacting with Discord channels and servers."""
|
|
2
|
+
|
|
3
|
+
import json
|
|
4
|
+
from os import getenv
|
|
5
|
+
from typing import Any, Dict, List, Optional
|
|
6
|
+
|
|
7
|
+
import requests
|
|
8
|
+
|
|
9
|
+
from agno.tools import Toolkit
|
|
10
|
+
from agno.utils.log import logger
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
class DiscordTools(Toolkit):
|
|
14
|
+
def __init__(
|
|
15
|
+
self,
|
|
16
|
+
bot_token: Optional[str] = None,
|
|
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,
|
|
24
|
+
):
|
|
25
|
+
self.bot_token = bot_token or getenv("DISCORD_BOT_TOKEN")
|
|
26
|
+
if not self.bot_token:
|
|
27
|
+
logger.error("Discord bot token is required")
|
|
28
|
+
raise ValueError("Discord bot token is required")
|
|
29
|
+
|
|
30
|
+
self.base_url = "https://discord.com/api/v10"
|
|
31
|
+
self.headers = {
|
|
32
|
+
"Authorization": f"Bot {self.bot_token}",
|
|
33
|
+
"Content-Type": "application/json",
|
|
34
|
+
}
|
|
35
|
+
|
|
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)
|
|
49
|
+
|
|
50
|
+
def _make_request(self, method: str, endpoint: str, data: Optional[Dict[str, Any]] = None) -> Dict[str, Any]:
|
|
51
|
+
"""Make a request to Discord API."""
|
|
52
|
+
url = f"{self.base_url}{endpoint}"
|
|
53
|
+
response = requests.request(method, url, headers=self.headers, json=data)
|
|
54
|
+
response.raise_for_status()
|
|
55
|
+
return response.json() if response.text else {}
|
|
56
|
+
|
|
57
|
+
def send_message(self, channel_id: str, message: str) -> str:
|
|
58
|
+
"""
|
|
59
|
+
Send a message to a Discord channel.
|
|
60
|
+
|
|
61
|
+
Args:
|
|
62
|
+
channel_id (str): The ID of the channel to send the message to.
|
|
63
|
+
message (str): The text of the message to send.
|
|
64
|
+
|
|
65
|
+
Returns:
|
|
66
|
+
str: A success message or error message.
|
|
67
|
+
"""
|
|
68
|
+
try:
|
|
69
|
+
data = {"content": message}
|
|
70
|
+
self._make_request("POST", f"/channels/{channel_id}/messages", data)
|
|
71
|
+
return f"Message sent successfully to channel {channel_id}"
|
|
72
|
+
except Exception as e:
|
|
73
|
+
logger.error(f"Error sending message: {e}")
|
|
74
|
+
return f"Error sending message: {str(e)}"
|
|
75
|
+
|
|
76
|
+
def get_channel_info(self, channel_id: str) -> str:
|
|
77
|
+
"""
|
|
78
|
+
Get information about a Discord channel.
|
|
79
|
+
|
|
80
|
+
Args:
|
|
81
|
+
channel_id (str): The ID of the channel to get information about.
|
|
82
|
+
|
|
83
|
+
Returns:
|
|
84
|
+
str: A JSON string containing the channel information.
|
|
85
|
+
"""
|
|
86
|
+
try:
|
|
87
|
+
response = self._make_request("GET", f"/channels/{channel_id}")
|
|
88
|
+
return json.dumps(response, indent=2)
|
|
89
|
+
except Exception as e:
|
|
90
|
+
logger.error(f"Error getting channel info: {e}")
|
|
91
|
+
return f"Error getting channel info: {str(e)}"
|
|
92
|
+
|
|
93
|
+
def list_channels(self, guild_id: str) -> str:
|
|
94
|
+
"""
|
|
95
|
+
List all channels in a Discord server.
|
|
96
|
+
|
|
97
|
+
Args:
|
|
98
|
+
guild_id (str): The ID of the server to list channels from.
|
|
99
|
+
|
|
100
|
+
Returns:
|
|
101
|
+
str: A JSON string containing the list of channels.
|
|
102
|
+
"""
|
|
103
|
+
try:
|
|
104
|
+
response = self._make_request("GET", f"/guilds/{guild_id}/channels")
|
|
105
|
+
return json.dumps(response, indent=2)
|
|
106
|
+
except Exception as e:
|
|
107
|
+
logger.error(f"Error listing channels: {e}")
|
|
108
|
+
return f"Error listing channels: {str(e)}"
|
|
109
|
+
|
|
110
|
+
def get_channel_messages(self, channel_id: str, limit: int = 100) -> str:
|
|
111
|
+
"""
|
|
112
|
+
Get the message history of a Discord channel.
|
|
113
|
+
|
|
114
|
+
Args:
|
|
115
|
+
channel_id (str): The ID of the channel to fetch messages from.
|
|
116
|
+
limit (int): The maximum number of messages to fetch. Defaults to 100.
|
|
117
|
+
|
|
118
|
+
Returns:
|
|
119
|
+
str: A JSON string containing the channel's message history.
|
|
120
|
+
"""
|
|
121
|
+
try:
|
|
122
|
+
response = self._make_request("GET", f"/channels/{channel_id}/messages?limit={limit}")
|
|
123
|
+
return json.dumps(response, indent=2)
|
|
124
|
+
except Exception as e:
|
|
125
|
+
logger.error(f"Error getting messages: {e}")
|
|
126
|
+
return f"Error getting messages: {str(e)}"
|
|
127
|
+
|
|
128
|
+
def delete_message(self, channel_id: str, message_id: str) -> str:
|
|
129
|
+
"""
|
|
130
|
+
Delete a message from a Discord channel.
|
|
131
|
+
|
|
132
|
+
Args:
|
|
133
|
+
channel_id (str): The ID of the channel containing the message.
|
|
134
|
+
message_id (str): The ID of the message to delete.
|
|
135
|
+
|
|
136
|
+
Returns:
|
|
137
|
+
str: A success message or error message.
|
|
138
|
+
"""
|
|
139
|
+
try:
|
|
140
|
+
self._make_request("DELETE", f"/channels/{channel_id}/messages/{message_id}")
|
|
141
|
+
return f"Message {message_id} deleted successfully from channel {channel_id}"
|
|
142
|
+
except Exception as e:
|
|
143
|
+
logger.error(f"Error deleting message: {e}")
|
|
144
|
+
return f"Error deleting message: {str(e)}"
|
|
145
|
+
|
|
146
|
+
@staticmethod
|
|
147
|
+
def get_tool_name() -> str:
|
|
148
|
+
"""Get the name of the tool."""
|
|
149
|
+
return "discord"
|
|
150
|
+
|
|
151
|
+
@staticmethod
|
|
152
|
+
def get_tool_description() -> str:
|
|
153
|
+
"""Get the description of the tool."""
|
|
154
|
+
return "Tool for interacting with Discord channels and servers"
|
|
155
|
+
|
|
156
|
+
@staticmethod
|
|
157
|
+
def get_tool_config() -> dict:
|
|
158
|
+
"""Get the required configuration for the tool."""
|
|
159
|
+
return {
|
|
160
|
+
"bot_token": {"type": "string", "description": "Discord bot token for authentication", "required": True}
|
|
161
|
+
}
|