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/calculator.py
CHANGED
|
@@ -1,42 +1,29 @@
|
|
|
1
1
|
import json
|
|
2
2
|
import math
|
|
3
|
+
from typing import Callable, List
|
|
3
4
|
|
|
4
5
|
from agno.tools import Toolkit
|
|
5
|
-
from agno.utils.log import logger
|
|
6
|
+
from agno.utils.log import log_debug, logger
|
|
6
7
|
|
|
7
8
|
|
|
8
9
|
class CalculatorTools(Toolkit):
|
|
9
10
|
def __init__(
|
|
10
11
|
self,
|
|
11
|
-
|
|
12
|
-
subtract: bool = True,
|
|
13
|
-
multiply: bool = True,
|
|
14
|
-
divide: bool = True,
|
|
15
|
-
exponentiate: bool = False,
|
|
16
|
-
factorial: bool = False,
|
|
17
|
-
is_prime: bool = False,
|
|
18
|
-
square_root: bool = False,
|
|
19
|
-
enable_all: bool = False,
|
|
12
|
+
**kwargs,
|
|
20
13
|
):
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
self.
|
|
26
|
-
|
|
27
|
-
self.
|
|
28
|
-
|
|
29
|
-
self.
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
if factorial or enable_all:
|
|
35
|
-
self.register(self.factorial)
|
|
36
|
-
if is_prime or enable_all:
|
|
37
|
-
self.register(self.is_prime)
|
|
38
|
-
if square_root or enable_all:
|
|
39
|
-
self.register(self.square_root)
|
|
14
|
+
tools: List[Callable] = [
|
|
15
|
+
self.add,
|
|
16
|
+
self.subtract,
|
|
17
|
+
self.multiply,
|
|
18
|
+
self.divide,
|
|
19
|
+
self.exponentiate,
|
|
20
|
+
self.factorial,
|
|
21
|
+
self.is_prime,
|
|
22
|
+
self.square_root,
|
|
23
|
+
]
|
|
24
|
+
|
|
25
|
+
# Initialize the toolkit with auto-registration enabled
|
|
26
|
+
super().__init__(name="calculator", tools=tools, **kwargs)
|
|
40
27
|
|
|
41
28
|
def add(self, a: float, b: float) -> str:
|
|
42
29
|
"""Add two numbers and return the result.
|
|
@@ -49,7 +36,7 @@ class CalculatorTools(Toolkit):
|
|
|
49
36
|
str: JSON string of the result.
|
|
50
37
|
"""
|
|
51
38
|
result = a + b
|
|
52
|
-
|
|
39
|
+
log_debug(f"Adding {a} and {b} to get {result}")
|
|
53
40
|
return json.dumps({"operation": "addition", "result": result})
|
|
54
41
|
|
|
55
42
|
def subtract(self, a: float, b: float) -> str:
|
|
@@ -63,7 +50,7 @@ class CalculatorTools(Toolkit):
|
|
|
63
50
|
str: JSON string of the result.
|
|
64
51
|
"""
|
|
65
52
|
result = a - b
|
|
66
|
-
|
|
53
|
+
log_debug(f"Subtracting {b} from {a} to get {result}")
|
|
67
54
|
return json.dumps({"operation": "subtraction", "result": result})
|
|
68
55
|
|
|
69
56
|
def multiply(self, a: float, b: float) -> str:
|
|
@@ -77,7 +64,7 @@ class CalculatorTools(Toolkit):
|
|
|
77
64
|
str: JSON string of the result.
|
|
78
65
|
"""
|
|
79
66
|
result = a * b
|
|
80
|
-
|
|
67
|
+
log_debug(f"Multiplying {a} and {b} to get {result}")
|
|
81
68
|
return json.dumps({"operation": "multiplication", "result": result})
|
|
82
69
|
|
|
83
70
|
def divide(self, a: float, b: float) -> str:
|
|
@@ -96,8 +83,8 @@ class CalculatorTools(Toolkit):
|
|
|
96
83
|
try:
|
|
97
84
|
result = a / b
|
|
98
85
|
except Exception as e:
|
|
99
|
-
return json.dumps({"operation": "division", "error": e, "result": "Error"})
|
|
100
|
-
|
|
86
|
+
return json.dumps({"operation": "division", "error": str(e), "result": "Error"})
|
|
87
|
+
log_debug(f"Dividing {a} by {b} to get {result}")
|
|
101
88
|
return json.dumps({"operation": "division", "result": result})
|
|
102
89
|
|
|
103
90
|
def exponentiate(self, a: float, b: float) -> str:
|
|
@@ -111,7 +98,7 @@ class CalculatorTools(Toolkit):
|
|
|
111
98
|
str: JSON string of the result.
|
|
112
99
|
"""
|
|
113
100
|
result = math.pow(a, b)
|
|
114
|
-
|
|
101
|
+
log_debug(f"Raising {a} to the power of {b} to get {result}")
|
|
115
102
|
return json.dumps({"operation": "exponentiation", "result": result})
|
|
116
103
|
|
|
117
104
|
def factorial(self, n: int) -> str:
|
|
@@ -127,7 +114,7 @@ class CalculatorTools(Toolkit):
|
|
|
127
114
|
logger.error("Attempt to calculate factorial of a negative number")
|
|
128
115
|
return json.dumps({"operation": "factorial", "error": "Factorial of a negative number is undefined"})
|
|
129
116
|
result = math.factorial(n)
|
|
130
|
-
|
|
117
|
+
log_debug(f"Calculating factorial of {n} to get {result}")
|
|
131
118
|
return json.dumps({"operation": "factorial", "result": result})
|
|
132
119
|
|
|
133
120
|
def is_prime(self, n: int) -> str:
|
|
@@ -160,5 +147,5 @@ class CalculatorTools(Toolkit):
|
|
|
160
147
|
return json.dumps({"operation": "square_root", "error": "Square root of a negative number is undefined"})
|
|
161
148
|
|
|
162
149
|
result = math.sqrt(n)
|
|
163
|
-
|
|
150
|
+
log_debug(f"Calculating square root of {n} to get {result}")
|
|
164
151
|
return json.dumps({"operation": "square_root", "result": result})
|
agno/tools/cartesia.py
ADDED
|
@@ -0,0 +1,187 @@
|
|
|
1
|
+
import json
|
|
2
|
+
from os import getenv
|
|
3
|
+
from typing import Any, Dict, List, Optional, Union
|
|
4
|
+
from uuid import uuid4
|
|
5
|
+
|
|
6
|
+
from agno.agent import Agent
|
|
7
|
+
from agno.media import Audio
|
|
8
|
+
from agno.team.team import Team
|
|
9
|
+
from agno.tools import Toolkit
|
|
10
|
+
from agno.tools.function import ToolResult
|
|
11
|
+
from agno.utils.log import log_debug, log_error, log_info
|
|
12
|
+
|
|
13
|
+
try:
|
|
14
|
+
import cartesia # type: ignore
|
|
15
|
+
except ImportError:
|
|
16
|
+
raise ImportError("`cartesia` not installed. Please install using `pip install cartesia`")
|
|
17
|
+
|
|
18
|
+
|
|
19
|
+
class CartesiaTools(Toolkit):
|
|
20
|
+
def __init__(
|
|
21
|
+
self,
|
|
22
|
+
api_key: Optional[str] = None,
|
|
23
|
+
model_id: str = "sonic-2",
|
|
24
|
+
default_voice_id: str = "78ab82d5-25be-4f7d-82b3-7ad64e5b85b2",
|
|
25
|
+
enable_text_to_speech: bool = True,
|
|
26
|
+
enable_list_voices: bool = True,
|
|
27
|
+
enable_localize_voice: bool = False,
|
|
28
|
+
all: bool = False,
|
|
29
|
+
**kwargs,
|
|
30
|
+
):
|
|
31
|
+
self.api_key = api_key or getenv("CARTESIA_API_KEY")
|
|
32
|
+
|
|
33
|
+
if not self.api_key:
|
|
34
|
+
raise ValueError("CARTESIA_API_KEY not set. Please set the CARTESIA_API_KEY environment variable.")
|
|
35
|
+
|
|
36
|
+
self.client = cartesia.Cartesia(api_key=self.api_key)
|
|
37
|
+
self.model_id = model_id
|
|
38
|
+
self.default_voice_id = default_voice_id
|
|
39
|
+
|
|
40
|
+
tools: List[Any] = []
|
|
41
|
+
if all or enable_localize_voice:
|
|
42
|
+
tools.append(self.localize_voice)
|
|
43
|
+
if all or enable_text_to_speech:
|
|
44
|
+
tools.append(self.text_to_speech)
|
|
45
|
+
if all or enable_list_voices:
|
|
46
|
+
tools.append(self.list_voices)
|
|
47
|
+
|
|
48
|
+
super().__init__(name="cartesia_tools", tools=tools, **kwargs)
|
|
49
|
+
|
|
50
|
+
def list_voices(self) -> str:
|
|
51
|
+
"""List available voices from Cartesia (first page).
|
|
52
|
+
|
|
53
|
+
Returns:
|
|
54
|
+
str: JSON string containing a list of voices, each with id, name, description, and language.
|
|
55
|
+
"""
|
|
56
|
+
try:
|
|
57
|
+
voices = self.client.voices.list()
|
|
58
|
+
|
|
59
|
+
voice_objects = voices.items if voices else None
|
|
60
|
+
|
|
61
|
+
filtered_result = []
|
|
62
|
+
if voice_objects:
|
|
63
|
+
for voice in voice_objects:
|
|
64
|
+
try:
|
|
65
|
+
# Extract desired attributes from the Voice object
|
|
66
|
+
voice_data = {
|
|
67
|
+
"id": voice.id if hasattr(voice, "id") else None,
|
|
68
|
+
"name": voice.name if hasattr(voice, "name") else None,
|
|
69
|
+
"description": voice.description if hasattr(voice, "description") else None,
|
|
70
|
+
"language": voice.language if hasattr(voice, "language") else None,
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
if voice_data["id"]: # Only add if we could get an ID
|
|
74
|
+
filtered_result.append(voice_data)
|
|
75
|
+
else:
|
|
76
|
+
log_info(f"Could not extract 'id' from voice object: {voice}")
|
|
77
|
+
except AttributeError as ae:
|
|
78
|
+
log_error(f"AttributeError accessing voice data: {ae}. Voice data: {voice}")
|
|
79
|
+
continue
|
|
80
|
+
except Exception as inner_e:
|
|
81
|
+
log_error(f"Unexpected error processing voice: {inner_e}. Voice data: {voice}")
|
|
82
|
+
continue
|
|
83
|
+
|
|
84
|
+
return json.dumps(filtered_result, indent=4)
|
|
85
|
+
except Exception as e:
|
|
86
|
+
log_error(f"Error listing voices from Cartesia: {e}", exc_info=True)
|
|
87
|
+
return json.dumps({"error": str(e), "detail": "Error occurred in list_voices function."})
|
|
88
|
+
|
|
89
|
+
def localize_voice(
|
|
90
|
+
self,
|
|
91
|
+
name: str,
|
|
92
|
+
description: str,
|
|
93
|
+
language: str,
|
|
94
|
+
original_speaker_gender: str,
|
|
95
|
+
voice_id: Optional[str] = None,
|
|
96
|
+
) -> str:
|
|
97
|
+
"""Create a new voice localized to a different language.
|
|
98
|
+
|
|
99
|
+
Args:
|
|
100
|
+
name (str): The desired name for the new localized voice.
|
|
101
|
+
description (str): The description for the new localized voice.
|
|
102
|
+
language (str): The target language code (e.g., 'fr', 'es').
|
|
103
|
+
original_speaker_gender (str): The gender of the original speaker ("male" or "female").
|
|
104
|
+
voice_id (optional): The ID of an existing voice to use as the base. If None, uses the default voice ID configured in the tool. Defaults to None.
|
|
105
|
+
|
|
106
|
+
Returns:
|
|
107
|
+
str: JSON string containing the information of the newly created localized voice, including its 'id'.
|
|
108
|
+
"""
|
|
109
|
+
localize_voice_id = voice_id or self.default_voice_id
|
|
110
|
+
log_debug(f"Using voice_id '{localize_voice_id}' for localization.")
|
|
111
|
+
|
|
112
|
+
try:
|
|
113
|
+
result = self.client.voices.localize(
|
|
114
|
+
voice_id=localize_voice_id,
|
|
115
|
+
name=name,
|
|
116
|
+
description=description,
|
|
117
|
+
language=language,
|
|
118
|
+
original_speaker_gender=original_speaker_gender,
|
|
119
|
+
)
|
|
120
|
+
|
|
121
|
+
if isinstance(result, dict):
|
|
122
|
+
return json.dumps(result, indent=4)
|
|
123
|
+
else:
|
|
124
|
+
return result.model_dump_json(indent=4)
|
|
125
|
+
|
|
126
|
+
except Exception as e:
|
|
127
|
+
log_error(f"Error localizing voice with Cartesia: {e}", exc_info=True)
|
|
128
|
+
return json.dumps({"error": str(e), "type": type(e).__name__})
|
|
129
|
+
|
|
130
|
+
def text_to_speech(
|
|
131
|
+
self,
|
|
132
|
+
agent: Union[Agent, Team],
|
|
133
|
+
transcript: str,
|
|
134
|
+
voice_id: Optional[str] = None,
|
|
135
|
+
) -> ToolResult:
|
|
136
|
+
"""
|
|
137
|
+
Convert text to speech.
|
|
138
|
+
Args:
|
|
139
|
+
transcript: The text to convert to speech
|
|
140
|
+
voice_id (optional): The ID of the voice to use for the text-to-speech. If None, uses the default voice ID configured in the tool. Defaults to None.
|
|
141
|
+
|
|
142
|
+
Returns:
|
|
143
|
+
ToolResult: A ToolResult containing the generated audio or error message.
|
|
144
|
+
"""
|
|
145
|
+
|
|
146
|
+
try:
|
|
147
|
+
effective_voice_id = voice_id or self.default_voice_id
|
|
148
|
+
|
|
149
|
+
log_info(f"Using voice_id: {effective_voice_id} for text_to_speech.")
|
|
150
|
+
log_info(f"Using model_id: {self.model_id} for text_to_speech.")
|
|
151
|
+
|
|
152
|
+
output_format_sample_rate = 44100
|
|
153
|
+
requested_bit_rate = 128000
|
|
154
|
+
mime_type = "audio/mpeg"
|
|
155
|
+
|
|
156
|
+
output_format = {
|
|
157
|
+
"container": "mp3",
|
|
158
|
+
"sample_rate": output_format_sample_rate,
|
|
159
|
+
"bit_rate": requested_bit_rate,
|
|
160
|
+
"encoding": "mp3",
|
|
161
|
+
}
|
|
162
|
+
|
|
163
|
+
params: Dict[str, Any] = {
|
|
164
|
+
"model_id": self.model_id,
|
|
165
|
+
"transcript": transcript,
|
|
166
|
+
"voice": {"mode": "id", "id": effective_voice_id},
|
|
167
|
+
"output_format": output_format,
|
|
168
|
+
}
|
|
169
|
+
|
|
170
|
+
audio_iterator = self.client.tts.bytes(**params)
|
|
171
|
+
audio_data = b"".join(chunk for chunk in audio_iterator)
|
|
172
|
+
|
|
173
|
+
# Create AudioArtifact
|
|
174
|
+
audio_artifact = Audio(
|
|
175
|
+
id=str(uuid4()),
|
|
176
|
+
content=audio_data,
|
|
177
|
+
mime_type=mime_type, # Hardcoded to audio/mpeg
|
|
178
|
+
)
|
|
179
|
+
|
|
180
|
+
return ToolResult(
|
|
181
|
+
content="Audio generated and attached successfully.",
|
|
182
|
+
audios=[audio_artifact],
|
|
183
|
+
)
|
|
184
|
+
|
|
185
|
+
except Exception as e:
|
|
186
|
+
log_error(f"Error generating speech with Cartesia: {e}", exc_info=True)
|
|
187
|
+
return ToolResult(content=f"Error generating speech: {e}")
|
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
import json
|
|
2
|
-
import os
|
|
3
2
|
import re
|
|
3
|
+
from os import getenv
|
|
4
4
|
from typing import Any, Dict, List, Optional
|
|
5
5
|
|
|
6
6
|
from agno.tools import Toolkit
|
|
7
|
-
from agno.utils.log import logger
|
|
7
|
+
from agno.utils.log import log_debug, logger
|
|
8
8
|
|
|
9
9
|
try:
|
|
10
10
|
import requests
|
|
@@ -17,18 +17,10 @@ class ClickUpTools(Toolkit):
|
|
|
17
17
|
self,
|
|
18
18
|
api_key: Optional[str] = None,
|
|
19
19
|
master_space_id: Optional[str] = None,
|
|
20
|
-
|
|
21
|
-
create_task: bool = True,
|
|
22
|
-
get_task: bool = True,
|
|
23
|
-
update_task: bool = True,
|
|
24
|
-
delete_task: bool = True,
|
|
25
|
-
list_spaces: bool = True,
|
|
26
|
-
list_lists: bool = True,
|
|
20
|
+
**kwargs,
|
|
27
21
|
):
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
self.api_key = api_key or os.getenv("CLICKUP_API_KEY")
|
|
31
|
-
self.master_space_id = master_space_id or os.getenv("MASTER_SPACE_ID")
|
|
22
|
+
self.api_key = api_key or getenv("CLICKUP_API_KEY")
|
|
23
|
+
self.master_space_id = master_space_id or getenv("MASTER_SPACE_ID")
|
|
32
24
|
self.base_url = "https://api.clickup.com/api/v2"
|
|
33
25
|
self.headers = {"Authorization": self.api_key}
|
|
34
26
|
|
|
@@ -37,20 +29,17 @@ class ClickUpTools(Toolkit):
|
|
|
37
29
|
if not self.master_space_id:
|
|
38
30
|
raise ValueError("MASTER_SPACE_ID not set. Please set the MASTER_SPACE_ID environment variable.")
|
|
39
31
|
|
|
40
|
-
|
|
41
|
-
self.
|
|
42
|
-
|
|
43
|
-
self.
|
|
44
|
-
|
|
45
|
-
self.
|
|
46
|
-
|
|
47
|
-
self.
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
self.register(self.list_spaces)
|
|
52
|
-
if list_lists:
|
|
53
|
-
self.register(self.list_lists)
|
|
32
|
+
tools: List[Any] = [
|
|
33
|
+
self.list_tasks,
|
|
34
|
+
self.create_task,
|
|
35
|
+
self.get_task,
|
|
36
|
+
self.update_task,
|
|
37
|
+
self.delete_task,
|
|
38
|
+
self.list_spaces,
|
|
39
|
+
self.list_lists,
|
|
40
|
+
]
|
|
41
|
+
|
|
42
|
+
super().__init__(name="clickup", tools=tools, **kwargs)
|
|
54
43
|
|
|
55
44
|
def _make_request(
|
|
56
45
|
self, method: str, endpoint: str, params: Optional[Dict] = None, data: Optional[Dict] = None
|
|
@@ -175,7 +164,7 @@ class ClickUpTools(Toolkit):
|
|
|
175
164
|
|
|
176
165
|
# Get first list in space
|
|
177
166
|
response = self._make_request("GET", f"space/{space['id']}/list")
|
|
178
|
-
|
|
167
|
+
log_debug(f"Lists: {response}")
|
|
179
168
|
lists_data = response.get("lists", [])
|
|
180
169
|
if not lists_data:
|
|
181
170
|
return json.dumps({"error": f"No lists found in space '{space_name}'"}, indent=2)
|
agno/tools/confluence.py
CHANGED
|
@@ -1,9 +1,11 @@
|
|
|
1
1
|
import json
|
|
2
2
|
from os import getenv
|
|
3
|
-
from typing import Optional
|
|
3
|
+
from typing import Any, List, Optional
|
|
4
|
+
|
|
5
|
+
import requests
|
|
4
6
|
|
|
5
7
|
from agno.tools import Toolkit
|
|
6
|
-
from agno.utils.log import logger
|
|
8
|
+
from agno.utils.log import log_info, logger
|
|
7
9
|
|
|
8
10
|
try:
|
|
9
11
|
from atlassian import Confluence
|
|
@@ -18,6 +20,8 @@ class ConfluenceTools(Toolkit):
|
|
|
18
20
|
password: Optional[str] = None,
|
|
19
21
|
url: Optional[str] = None,
|
|
20
22
|
api_key: Optional[str] = None,
|
|
23
|
+
verify_ssl: bool = True,
|
|
24
|
+
**kwargs,
|
|
21
25
|
):
|
|
22
26
|
"""Initialize Confluence Tools with authentication credentials.
|
|
23
27
|
|
|
@@ -26,6 +30,7 @@ class ConfluenceTools(Toolkit):
|
|
|
26
30
|
password (str, optional): Confluence password. Defaults to None.
|
|
27
31
|
url (str, optional): Confluence instance URL. Defaults to None.
|
|
28
32
|
api_key (str, optional): Confluence API key. Defaults to None.
|
|
33
|
+
verify_ssl (bool, optional): Whether to verify SSL certificates. Defaults to True.
|
|
29
34
|
|
|
30
35
|
Notes:
|
|
31
36
|
Credentials can be provided either through method arguments or environment variables:
|
|
@@ -34,32 +39,49 @@ class ConfluenceTools(Toolkit):
|
|
|
34
39
|
- CONFLUENCE_API_KEY
|
|
35
40
|
"""
|
|
36
41
|
|
|
37
|
-
super().__init__(name="confluence_tools")
|
|
38
42
|
self.url = url or getenv("CONFLUENCE_URL")
|
|
39
43
|
self.username = username or getenv("CONFLUENCE_USERNAME")
|
|
40
44
|
self.password = api_key or getenv("CONFLUENCE_API_KEY") or password or getenv("CONFLUENCE_PASSWORD")
|
|
41
45
|
|
|
42
46
|
if not self.url:
|
|
43
|
-
|
|
47
|
+
raise ValueError(
|
|
44
48
|
"Confluence URL not provided. Pass it in the constructor or set CONFLUENCE_URL in environment variable"
|
|
45
49
|
)
|
|
46
50
|
|
|
47
51
|
if not self.username:
|
|
48
|
-
|
|
52
|
+
raise ValueError(
|
|
49
53
|
"Confluence username not provided. Pass it in the constructor or set CONFLUENCE_USERNAME in environment variable"
|
|
50
54
|
)
|
|
51
55
|
|
|
52
56
|
if not self.password:
|
|
53
|
-
|
|
57
|
+
raise ValueError("Confluence API KEY or password not provided")
|
|
58
|
+
|
|
59
|
+
session = requests.Session()
|
|
60
|
+
session.verify = verify_ssl
|
|
61
|
+
|
|
62
|
+
if not verify_ssl:
|
|
63
|
+
import urllib3
|
|
64
|
+
|
|
65
|
+
urllib3.disable_warnings(urllib3.exceptions.InsecureRequestWarning)
|
|
66
|
+
|
|
67
|
+
self.confluence = Confluence(
|
|
68
|
+
url=self.url,
|
|
69
|
+
username=self.username,
|
|
70
|
+
password=self.password,
|
|
71
|
+
verify_ssl=verify_ssl,
|
|
72
|
+
session=session,
|
|
73
|
+
)
|
|
54
74
|
|
|
55
|
-
|
|
75
|
+
tools: List[Any] = [
|
|
76
|
+
self.get_page_content,
|
|
77
|
+
self.get_space_key,
|
|
78
|
+
self.create_page,
|
|
79
|
+
self.update_page,
|
|
80
|
+
self.get_all_space_detail,
|
|
81
|
+
self.get_all_page_from_space,
|
|
82
|
+
]
|
|
56
83
|
|
|
57
|
-
|
|
58
|
-
self.register(self.get_space_key)
|
|
59
|
-
self.register(self.create_page)
|
|
60
|
-
self.register(self.update_page)
|
|
61
|
-
self.register(self.get_all_space_detail)
|
|
62
|
-
self.register(self.get_all_page_from_space)
|
|
84
|
+
super().__init__(name="confluence_tools", tools=tools, **kwargs)
|
|
63
85
|
|
|
64
86
|
def get_page_content(self, space_name: str, page_title: str, expand: Optional[str] = "body.storage"):
|
|
65
87
|
"""Retrieve the content of a specific page in a Confluence space.
|
|
@@ -73,11 +95,14 @@ class ConfluenceTools(Toolkit):
|
|
|
73
95
|
str: JSON-encoded page content or error message.
|
|
74
96
|
"""
|
|
75
97
|
try:
|
|
76
|
-
|
|
98
|
+
log_info(f"Retrieving page content from space '{space_name}'")
|
|
77
99
|
key = self.get_space_key(space_name=space_name)
|
|
100
|
+
if key == "No space found":
|
|
101
|
+
return json.dumps({"error": f"Space '{space_name}' not found"})
|
|
102
|
+
|
|
78
103
|
page = self.confluence.get_page_by_title(key, page_title, expand=expand)
|
|
79
104
|
if page:
|
|
80
|
-
|
|
105
|
+
log_info(f"Successfully retrieved page '{page_title}' from space '{space_name}'")
|
|
81
106
|
return json.dumps(page)
|
|
82
107
|
|
|
83
108
|
logger.warning(f"Page '{page_title}' not found in space '{space_name}'")
|
|
@@ -93,8 +118,21 @@ class ConfluenceTools(Toolkit):
|
|
|
93
118
|
Returns:
|
|
94
119
|
str: List of space details as a string.
|
|
95
120
|
"""
|
|
96
|
-
|
|
97
|
-
results =
|
|
121
|
+
log_info("Retrieving details for all Confluence spaces")
|
|
122
|
+
results = []
|
|
123
|
+
start = 0
|
|
124
|
+
limit = 50
|
|
125
|
+
|
|
126
|
+
while True:
|
|
127
|
+
spaces_data = self.confluence.get_all_spaces(start=start, limit=limit)
|
|
128
|
+
if not spaces_data.get("results"):
|
|
129
|
+
break
|
|
130
|
+
results.extend(spaces_data["results"])
|
|
131
|
+
|
|
132
|
+
if len(spaces_data["results"]) < limit:
|
|
133
|
+
break
|
|
134
|
+
start += limit
|
|
135
|
+
|
|
98
136
|
return str(results)
|
|
99
137
|
|
|
100
138
|
def get_space_key(self, space_name: str):
|
|
@@ -106,13 +144,29 @@ class ConfluenceTools(Toolkit):
|
|
|
106
144
|
Returns:
|
|
107
145
|
str: Space key or "No space found" if space doesn't exist.
|
|
108
146
|
"""
|
|
109
|
-
|
|
110
|
-
|
|
147
|
+
start = 0
|
|
148
|
+
limit = 50
|
|
111
149
|
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
150
|
+
while True:
|
|
151
|
+
result = self.confluence.get_all_spaces(start=start, limit=limit)
|
|
152
|
+
if not result.get("results"):
|
|
153
|
+
break
|
|
154
|
+
|
|
155
|
+
spaces = result["results"]
|
|
156
|
+
|
|
157
|
+
for space in spaces:
|
|
158
|
+
if space["name"].lower() == space_name.lower():
|
|
159
|
+
log_info(f"Found space key for '{space_name}': {space['key']}")
|
|
160
|
+
return space["key"]
|
|
161
|
+
|
|
162
|
+
for space in spaces:
|
|
163
|
+
if space["key"] == space_name:
|
|
164
|
+
log_info(f"'{space_name}' is already a space key")
|
|
165
|
+
return space_name
|
|
166
|
+
|
|
167
|
+
if len(spaces) < limit:
|
|
168
|
+
break
|
|
169
|
+
start += limit
|
|
116
170
|
|
|
117
171
|
logger.warning(f"No space named {space_name} found")
|
|
118
172
|
return "No space found"
|
|
@@ -126,11 +180,19 @@ class ConfluenceTools(Toolkit):
|
|
|
126
180
|
Returns:
|
|
127
181
|
list: Details of pages in the specified space.
|
|
128
182
|
"""
|
|
129
|
-
|
|
183
|
+
log_info(f"Retrieving all pages from space '{space_name}'")
|
|
130
184
|
space_key = self.get_space_key(space_name)
|
|
185
|
+
|
|
186
|
+
if space_key == "No space found":
|
|
187
|
+
return json.dumps({"error": f"Space '{space_name}' not found"})
|
|
188
|
+
|
|
131
189
|
page_details = self.confluence.get_all_pages_from_space(
|
|
132
190
|
space_key, status=None, expand=None, content_type="page"
|
|
133
191
|
)
|
|
192
|
+
|
|
193
|
+
if not page_details:
|
|
194
|
+
return json.dumps({"error": f"No pages found in space '{space_name}'"})
|
|
195
|
+
|
|
134
196
|
page_details = str([{"id": page["id"], "title": page["title"]} for page in page_details])
|
|
135
197
|
return page_details
|
|
136
198
|
|
|
@@ -148,8 +210,11 @@ class ConfluenceTools(Toolkit):
|
|
|
148
210
|
"""
|
|
149
211
|
try:
|
|
150
212
|
space_key = self.get_space_key(space_name=space_name)
|
|
213
|
+
if space_key == "No space found":
|
|
214
|
+
return json.dumps({"error": f"Space '{space_name}' not found"})
|
|
215
|
+
|
|
151
216
|
page = self.confluence.create_page(space_key, title, body, parent_id=parent_id)
|
|
152
|
-
|
|
217
|
+
log_info(f"Page created: {title} with ID {page['id']}")
|
|
153
218
|
return json.dumps({"id": page["id"], "title": title})
|
|
154
219
|
except Exception as e:
|
|
155
220
|
logger.error(f"Error creating page '{title}': {e}")
|
|
@@ -168,7 +233,7 @@ class ConfluenceTools(Toolkit):
|
|
|
168
233
|
"""
|
|
169
234
|
try:
|
|
170
235
|
updated_page = self.confluence.update_page(page_id, title, body)
|
|
171
|
-
|
|
236
|
+
log_info(f"Page updated: {title} with ID {updated_page['id']}")
|
|
172
237
|
return json.dumps({"status": "success", "id": updated_page["id"]})
|
|
173
238
|
except Exception as e:
|
|
174
239
|
logger.error(f"Error updating page '{title}': {e}")
|