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/zoom.py
ADDED
|
@@ -0,0 +1,382 @@
|
|
|
1
|
+
import json
|
|
2
|
+
from base64 import b64encode
|
|
3
|
+
from datetime import datetime, timedelta
|
|
4
|
+
from os import getenv
|
|
5
|
+
from typing import Any, List, Optional
|
|
6
|
+
|
|
7
|
+
import requests
|
|
8
|
+
|
|
9
|
+
from agno.tools import Toolkit
|
|
10
|
+
from agno.utils.log import log_debug, log_info, logger
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
class ZoomTools(Toolkit):
|
|
14
|
+
def __init__(
|
|
15
|
+
self,
|
|
16
|
+
account_id: Optional[str] = None,
|
|
17
|
+
client_id: Optional[str] = None,
|
|
18
|
+
client_secret: Optional[str] = None,
|
|
19
|
+
**kwargs,
|
|
20
|
+
):
|
|
21
|
+
"""
|
|
22
|
+
Initialize the ZoomTool.
|
|
23
|
+
|
|
24
|
+
Args:
|
|
25
|
+
account_id (str): The Zoom account ID for authentication. If not provided, will use ZOOM_ACCOUNT_ID env var.
|
|
26
|
+
client_id (str): The client ID for authentication. If not provided, will use ZOOM_CLIENT_ID env var.
|
|
27
|
+
client_secret (str): The client secret for authentication. If not provided, will use ZOOM_CLIENT_SECRET env var.
|
|
28
|
+
name (str): The name of the tool. Defaults to "zoom_tool".
|
|
29
|
+
"""
|
|
30
|
+
# Get credentials from env vars if not provided
|
|
31
|
+
self.account_id = account_id or getenv("ZOOM_ACCOUNT_ID")
|
|
32
|
+
self.client_id = client_id or getenv("ZOOM_CLIENT_ID")
|
|
33
|
+
self.client_secret = client_secret or getenv("ZOOM_CLIENT_SECRET")
|
|
34
|
+
self.__access_token = None # Made private
|
|
35
|
+
self.__token_expiry = None # Track token expiration
|
|
36
|
+
|
|
37
|
+
if not self.account_id or not self.client_id or not self.client_secret:
|
|
38
|
+
logger.error(
|
|
39
|
+
"ZOOM_ACCOUNT_ID, ZOOM_CLIENT_ID, and ZOOM_CLIENT_SECRET must be set either through parameters or environment variables."
|
|
40
|
+
)
|
|
41
|
+
|
|
42
|
+
tools: List[Any] = [
|
|
43
|
+
self.get_access_token,
|
|
44
|
+
self.schedule_meeting,
|
|
45
|
+
self.get_upcoming_meetings,
|
|
46
|
+
self.list_meetings,
|
|
47
|
+
self.get_meeting_recordings,
|
|
48
|
+
self.delete_meeting,
|
|
49
|
+
self.get_meeting,
|
|
50
|
+
]
|
|
51
|
+
|
|
52
|
+
super().__init__(name="zoom_tool", tools=tools, **kwargs)
|
|
53
|
+
|
|
54
|
+
def get_access_token(self) -> str:
|
|
55
|
+
"""
|
|
56
|
+
Get a valid access token, refreshing if necessary using Zoom's Server-to-Server OAuth.
|
|
57
|
+
|
|
58
|
+
Returns:
|
|
59
|
+
str: The current access token or empty string if token generation fails.
|
|
60
|
+
"""
|
|
61
|
+
# Check if we have a valid token
|
|
62
|
+
if self.__access_token and self.__token_expiry and datetime.now() < self.__token_expiry:
|
|
63
|
+
return self.__access_token
|
|
64
|
+
|
|
65
|
+
# Generate new token
|
|
66
|
+
try:
|
|
67
|
+
headers = {
|
|
68
|
+
"Content-Type": "application/x-www-form-urlencoded",
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
# Create base64 encoded auth string
|
|
72
|
+
auth_string = b64encode(f"{self.client_id}:{self.client_secret}".encode()).decode()
|
|
73
|
+
headers["Authorization"] = f"Basic {auth_string}"
|
|
74
|
+
|
|
75
|
+
data = {
|
|
76
|
+
"grant_type": "account_credentials",
|
|
77
|
+
"account_id": self.account_id,
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
response = requests.post("https://zoom.us/oauth/token", headers=headers, data=data)
|
|
81
|
+
response.raise_for_status()
|
|
82
|
+
|
|
83
|
+
token_data = response.json()
|
|
84
|
+
self.__access_token = token_data["access_token"]
|
|
85
|
+
# Set expiry time slightly before actual expiry to ensure token validity
|
|
86
|
+
self.__token_expiry = datetime.now() + timedelta(seconds=token_data["expires_in"] - 60) # type: ignore
|
|
87
|
+
|
|
88
|
+
log_debug("Successfully generated new Zoom access token")
|
|
89
|
+
return self.__access_token # type: ignore
|
|
90
|
+
|
|
91
|
+
except requests.RequestException as e:
|
|
92
|
+
logger.error(f"Failed to generate Zoom access token: {e}")
|
|
93
|
+
self.__access_token = None
|
|
94
|
+
self.__token_expiry = None
|
|
95
|
+
return ""
|
|
96
|
+
|
|
97
|
+
def schedule_meeting(self, topic: str, start_time: str, duration: int, timezone: str = "UTC") -> str:
|
|
98
|
+
"""
|
|
99
|
+
Schedule a new Zoom meeting.
|
|
100
|
+
|
|
101
|
+
Args:
|
|
102
|
+
topic (str): The topic or title of the meeting.
|
|
103
|
+
start_time (str): The start time of the meeting in ISO 8601 format.
|
|
104
|
+
duration (int): The duration of the meeting in minutes.
|
|
105
|
+
timezone (str): The timezone for the meeting (e.g., "America/New_York", "Asia/Tokyo").
|
|
106
|
+
|
|
107
|
+
Returns:
|
|
108
|
+
A JSON-formatted string containing the response from Zoom API with the scheduled meeting details,
|
|
109
|
+
or an error message if the scheduling fails.
|
|
110
|
+
"""
|
|
111
|
+
log_debug(f"Attempting to schedule meeting: {topic} in timezone: {timezone}")
|
|
112
|
+
token = self.get_access_token()
|
|
113
|
+
if not token:
|
|
114
|
+
logger.error("Unable to obtain access token.")
|
|
115
|
+
return json.dumps({"error": "Failed to obtain access token"})
|
|
116
|
+
|
|
117
|
+
url = "https://api.zoom.us/v2/users/me/meetings"
|
|
118
|
+
headers = {"Authorization": f"Bearer {token}", "Content-Type": "application/json"}
|
|
119
|
+
data = {
|
|
120
|
+
"topic": topic,
|
|
121
|
+
"type": 2,
|
|
122
|
+
"start_time": start_time,
|
|
123
|
+
"duration": duration,
|
|
124
|
+
"timezone": timezone,
|
|
125
|
+
"settings": {
|
|
126
|
+
"host_video": True,
|
|
127
|
+
"participant_video": True,
|
|
128
|
+
"join_before_host": False,
|
|
129
|
+
"mute_upon_entry": False,
|
|
130
|
+
"watermark": True,
|
|
131
|
+
"audio": "voip",
|
|
132
|
+
"auto_recording": "none",
|
|
133
|
+
},
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
try:
|
|
137
|
+
response = requests.post(url, json=data, headers=headers)
|
|
138
|
+
response.raise_for_status()
|
|
139
|
+
meeting_info = response.json()
|
|
140
|
+
|
|
141
|
+
result = {
|
|
142
|
+
"message": "Meeting scheduled successfully!",
|
|
143
|
+
"meeting_id": meeting_info["id"],
|
|
144
|
+
"topic": meeting_info["topic"],
|
|
145
|
+
"start_time": meeting_info["start_time"],
|
|
146
|
+
"duration": meeting_info["duration"],
|
|
147
|
+
"join_url": meeting_info["join_url"],
|
|
148
|
+
}
|
|
149
|
+
log_info(f"Meeting scheduled successfully. ID: {meeting_info['id']}")
|
|
150
|
+
return json.dumps(result, indent=2)
|
|
151
|
+
except requests.RequestException as e:
|
|
152
|
+
logger.error(f"Error scheduling meeting: {e}")
|
|
153
|
+
return json.dumps({"error": str(e)})
|
|
154
|
+
|
|
155
|
+
def get_upcoming_meetings(self, user_id: str = "me") -> str:
|
|
156
|
+
"""
|
|
157
|
+
Get a list of upcoming meetings for a specified user.
|
|
158
|
+
|
|
159
|
+
Args:
|
|
160
|
+
user_id (str): The user ID or 'me' for the authenticated user. Defaults to 'me'.
|
|
161
|
+
|
|
162
|
+
Returns:
|
|
163
|
+
A JSON-formatted string containing the upcoming meetings information,
|
|
164
|
+
or an error message if the request fails.
|
|
165
|
+
"""
|
|
166
|
+
log_debug(f"Fetching upcoming meetings for user: {user_id}")
|
|
167
|
+
token = self.get_access_token()
|
|
168
|
+
if not token:
|
|
169
|
+
logger.error("Unable to obtain access token.")
|
|
170
|
+
return json.dumps({"error": "Failed to obtain access token"})
|
|
171
|
+
|
|
172
|
+
url = f"https://api.zoom.us/v2/users/{user_id}/meetings"
|
|
173
|
+
headers = {"Authorization": f"Bearer {token}"}
|
|
174
|
+
params = {"type": "upcoming", "page_size": str(30)}
|
|
175
|
+
|
|
176
|
+
try:
|
|
177
|
+
response = requests.get(url, headers=headers, params=params) # type: ignore
|
|
178
|
+
response.raise_for_status()
|
|
179
|
+
meetings = response.json()
|
|
180
|
+
|
|
181
|
+
result = {"message": "Upcoming meetings retrieved successfully", "meetings": meetings.get("meetings", [])}
|
|
182
|
+
log_info(f"Retrieved {len(result['meetings'])} upcoming meetings")
|
|
183
|
+
return json.dumps(result, indent=2)
|
|
184
|
+
except requests.RequestException as e:
|
|
185
|
+
logger.error(f"Error fetching upcoming meetings: {e}")
|
|
186
|
+
return json.dumps({"error": str(e)})
|
|
187
|
+
|
|
188
|
+
def list_meetings(self, user_id: str = "me", type: str = "scheduled") -> str:
|
|
189
|
+
"""
|
|
190
|
+
List all meetings for a specified user.
|
|
191
|
+
|
|
192
|
+
Args:
|
|
193
|
+
user_id (str): The user ID or 'me' for the authenticated user. Defaults to 'me'.
|
|
194
|
+
type (str): The type of meetings to return. Options are:
|
|
195
|
+
"scheduled" - All valid scheduled meetings
|
|
196
|
+
"live" - All live meetings
|
|
197
|
+
"upcoming" - All upcoming meetings
|
|
198
|
+
"previous" - All previous meetings
|
|
199
|
+
Defaults to "scheduled".
|
|
200
|
+
|
|
201
|
+
Returns:
|
|
202
|
+
A JSON-formatted string containing the meetings information,
|
|
203
|
+
or an error message if the request fails.
|
|
204
|
+
"""
|
|
205
|
+
log_debug(f"Fetching meetings for user: {user_id}")
|
|
206
|
+
token = self.get_access_token()
|
|
207
|
+
if not token:
|
|
208
|
+
logger.error("Unable to obtain access token.")
|
|
209
|
+
return json.dumps({"error": "Failed to obtain access token"})
|
|
210
|
+
|
|
211
|
+
url = f"https://api.zoom.us/v2/users/{user_id}/meetings"
|
|
212
|
+
headers = {"Authorization": f"Bearer {token}"}
|
|
213
|
+
params = {"type": type}
|
|
214
|
+
|
|
215
|
+
try:
|
|
216
|
+
response = requests.get(url, headers=headers, params=params)
|
|
217
|
+
response.raise_for_status()
|
|
218
|
+
meetings = response.json()
|
|
219
|
+
|
|
220
|
+
result = {
|
|
221
|
+
"message": "Meetings retrieved successfully",
|
|
222
|
+
"page_count": meetings.get("page_count", 0),
|
|
223
|
+
"page_number": meetings.get("page_number", 1),
|
|
224
|
+
"page_size": meetings.get("page_size", 30),
|
|
225
|
+
"total_records": meetings.get("total_records", 0),
|
|
226
|
+
"meetings": meetings.get("meetings", []),
|
|
227
|
+
}
|
|
228
|
+
log_info(f"Retrieved {len(result['meetings'])} meetings")
|
|
229
|
+
return json.dumps(result, indent=2)
|
|
230
|
+
except requests.RequestException as e:
|
|
231
|
+
logger.error(f"Error fetching meetings: {e}")
|
|
232
|
+
return json.dumps({"error": str(e)})
|
|
233
|
+
|
|
234
|
+
def get_meeting_recordings(
|
|
235
|
+
self, meeting_id: str, include_download_token: bool = False, token_ttl: Optional[int] = None
|
|
236
|
+
) -> str:
|
|
237
|
+
"""
|
|
238
|
+
Get all recordings for a specific meeting.
|
|
239
|
+
|
|
240
|
+
Args:
|
|
241
|
+
meeting_id (str): The meeting ID or UUID to get recordings for.
|
|
242
|
+
include_download_token (bool): Whether to include download access token in response.
|
|
243
|
+
token_ttl (int, optional): Time to live for download token in seconds (max 604800).
|
|
244
|
+
|
|
245
|
+
Returns:
|
|
246
|
+
A JSON-formatted string containing the meeting recordings information,
|
|
247
|
+
or an error message if the request fails.
|
|
248
|
+
"""
|
|
249
|
+
log_debug(f"Fetching recordings for meeting: {meeting_id}")
|
|
250
|
+
token = self.get_access_token()
|
|
251
|
+
if not token:
|
|
252
|
+
logger.error("Unable to obtain access token.")
|
|
253
|
+
return json.dumps({"error": "Failed to obtain access token"})
|
|
254
|
+
|
|
255
|
+
url = f"https://api.zoom.us/v2/meetings/{meeting_id}/recordings"
|
|
256
|
+
headers = {"Authorization": f"Bearer {token}"}
|
|
257
|
+
|
|
258
|
+
# Build query parameters
|
|
259
|
+
params = {}
|
|
260
|
+
if include_download_token:
|
|
261
|
+
params["include_fields"] = "download_access_token"
|
|
262
|
+
if token_ttl is not None:
|
|
263
|
+
if 0 <= token_ttl <= 604800:
|
|
264
|
+
params["ttl"] = str(token_ttl) # Convert to string if necessary
|
|
265
|
+
else:
|
|
266
|
+
logger.warning("Invalid TTL value. Must be between 0 and 604800 seconds.")
|
|
267
|
+
|
|
268
|
+
try:
|
|
269
|
+
response = requests.get(url, headers=headers, params=params)
|
|
270
|
+
response.raise_for_status()
|
|
271
|
+
recordings = response.json()
|
|
272
|
+
|
|
273
|
+
result = {
|
|
274
|
+
"message": "Meeting recordings retrieved successfully",
|
|
275
|
+
"meeting_id": str(recordings.get("id", "")),
|
|
276
|
+
"uuid": recordings.get("uuid", ""),
|
|
277
|
+
"host_id": recordings.get("host_id", ""),
|
|
278
|
+
"topic": recordings.get("topic", ""),
|
|
279
|
+
"start_time": recordings.get("start_time", ""),
|
|
280
|
+
"duration": recordings.get("duration", 0),
|
|
281
|
+
"total_size": recordings.get("total_size", 0),
|
|
282
|
+
"recording_count": recordings.get("recording_count", 0),
|
|
283
|
+
"recording_files": recordings.get("recording_files", []),
|
|
284
|
+
}
|
|
285
|
+
|
|
286
|
+
log_info(f"Retrieved {result['recording_count']} recording files")
|
|
287
|
+
return json.dumps(result, indent=2)
|
|
288
|
+
except requests.RequestException as e:
|
|
289
|
+
logger.error(f"Error fetching meeting recordings: {e}")
|
|
290
|
+
return json.dumps({"error": str(e)})
|
|
291
|
+
|
|
292
|
+
def delete_meeting(self, meeting_id: str, schedule_for_reminder: bool = True) -> str:
|
|
293
|
+
"""
|
|
294
|
+
Delete a scheduled Zoom meeting.
|
|
295
|
+
|
|
296
|
+
Args:
|
|
297
|
+
meeting_id (str): The ID of the meeting to delete
|
|
298
|
+
schedule_for_reminder (bool): Send cancellation email to registrants.
|
|
299
|
+
Defaults to True.
|
|
300
|
+
|
|
301
|
+
Returns:
|
|
302
|
+
A JSON-formatted string containing the response status,
|
|
303
|
+
or an error message if the deletion fails.
|
|
304
|
+
"""
|
|
305
|
+
log_debug(f"Attempting to delete meeting: {meeting_id}")
|
|
306
|
+
token = self.get_access_token()
|
|
307
|
+
if not token:
|
|
308
|
+
logger.error("Unable to obtain access token.")
|
|
309
|
+
return json.dumps({"error": "Failed to obtain access token"})
|
|
310
|
+
|
|
311
|
+
url = f"https://api.zoom.us/v2/meetings/{meeting_id}"
|
|
312
|
+
headers = {"Authorization": f"Bearer {token}"}
|
|
313
|
+
params = {"schedule_for_reminder": schedule_for_reminder}
|
|
314
|
+
|
|
315
|
+
try:
|
|
316
|
+
response = requests.delete(url, headers=headers, params=params)
|
|
317
|
+
response.raise_for_status()
|
|
318
|
+
|
|
319
|
+
# Zoom returns 204 No Content for successful deletion
|
|
320
|
+
if response.status_code == 204:
|
|
321
|
+
result = {"message": "Meeting deleted successfully!", "meeting_id": meeting_id}
|
|
322
|
+
log_info(f"Meeting {meeting_id} deleted successfully")
|
|
323
|
+
else:
|
|
324
|
+
result = response.json()
|
|
325
|
+
|
|
326
|
+
return json.dumps(result, indent=2)
|
|
327
|
+
except requests.RequestException as e:
|
|
328
|
+
logger.error(f"Error deleting meeting: {e}")
|
|
329
|
+
return json.dumps({"error": str(e)})
|
|
330
|
+
|
|
331
|
+
def get_meeting(self, meeting_id: str) -> str:
|
|
332
|
+
"""
|
|
333
|
+
Get the details of a specific Zoom meeting.
|
|
334
|
+
|
|
335
|
+
Args:
|
|
336
|
+
meeting_id (str): The ID of the meeting to retrieve
|
|
337
|
+
|
|
338
|
+
Returns:
|
|
339
|
+
A JSON-formatted string containing the meeting details,
|
|
340
|
+
or an error message if the request fails.
|
|
341
|
+
"""
|
|
342
|
+
log_debug(f"Fetching details for meeting: {meeting_id}")
|
|
343
|
+
token = self.get_access_token()
|
|
344
|
+
if not token:
|
|
345
|
+
logger.error("Unable to obtain access token.")
|
|
346
|
+
return json.dumps({"error": "Failed to obtain access token"})
|
|
347
|
+
|
|
348
|
+
url = f"https://api.zoom.us/v2/meetings/{meeting_id}"
|
|
349
|
+
headers = {"Authorization": f"Bearer {token}"}
|
|
350
|
+
|
|
351
|
+
try:
|
|
352
|
+
response = requests.get(url, headers=headers)
|
|
353
|
+
response.raise_for_status()
|
|
354
|
+
meeting_info = response.json()
|
|
355
|
+
|
|
356
|
+
result = {
|
|
357
|
+
"message": "Meeting details retrieved successfully",
|
|
358
|
+
"meeting_id": str(meeting_info.get("id", "")),
|
|
359
|
+
"topic": meeting_info.get("topic", ""),
|
|
360
|
+
"type": meeting_info.get("type", ""),
|
|
361
|
+
"start_time": meeting_info.get("start_time", ""),
|
|
362
|
+
"duration": meeting_info.get("duration", 0),
|
|
363
|
+
"timezone": meeting_info.get("timezone", ""),
|
|
364
|
+
"created_at": meeting_info.get("created_at", ""),
|
|
365
|
+
"join_url": meeting_info.get("join_url", ""),
|
|
366
|
+
"settings": meeting_info.get("settings", {}),
|
|
367
|
+
}
|
|
368
|
+
|
|
369
|
+
log_info(f"Retrieved details for meeting ID: {meeting_id}")
|
|
370
|
+
return json.dumps(result, indent=2)
|
|
371
|
+
except requests.RequestException as e:
|
|
372
|
+
logger.error(f"Error fetching meeting details: {e}")
|
|
373
|
+
return json.dumps({"error": str(e)})
|
|
374
|
+
|
|
375
|
+
def instructions(self) -> str:
|
|
376
|
+
"""
|
|
377
|
+
Provide instructions for using the ZoomTool.
|
|
378
|
+
|
|
379
|
+
Returns:
|
|
380
|
+
A string containing instructions on how to use the ZoomTool.
|
|
381
|
+
"""
|
|
382
|
+
return "Use this tool to schedule and manage Zoom meetings. You can schedule meetings by providing a topic, start time, and duration."
|
agno/utils/__init__.py
ADDED
|
File without changes
|