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
|
@@ -0,0 +1,196 @@
|
|
|
1
|
+
from io import BytesIO
|
|
2
|
+
from os import getenv, path
|
|
3
|
+
from pathlib import Path
|
|
4
|
+
from typing import Any, Iterator, List, Literal, Optional, Union
|
|
5
|
+
from uuid import uuid4
|
|
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 log_error, log_info
|
|
13
|
+
|
|
14
|
+
try:
|
|
15
|
+
from elevenlabs import ElevenLabs # type: ignore
|
|
16
|
+
except ImportError:
|
|
17
|
+
raise ImportError("`elevenlabs` not installed. Please install using `pip install elevenlabs`")
|
|
18
|
+
|
|
19
|
+
ElevenLabsAudioOutputFormat = Literal[
|
|
20
|
+
"mp3_22050_32", # mp3 with 22.05kHz sample rate at 32kbps
|
|
21
|
+
"mp3_44100_32", # mp3 with 44.1kHz sample rate at 32kbps
|
|
22
|
+
"mp3_44100_64", # mp3 with 44.1kHz sample rate at 64kbps
|
|
23
|
+
"mp3_44100_96", # mp3 with 44.1kHz sample rate at 96kbps
|
|
24
|
+
"mp3_44100_128", # default, mp3 with 44.1kHz sample rate at 128kbps
|
|
25
|
+
"mp3_44100_192", # mp3 with 44.1kHz sample rate at 192kbps (Creator tier+)
|
|
26
|
+
"pcm_16000", # PCM format (S16LE) with 16kHz sample rate
|
|
27
|
+
"pcm_22050", # PCM format (S16LE) with 22.05kHz sample rate
|
|
28
|
+
"pcm_24000", # PCM format (S16LE) with 24kHz sample rate
|
|
29
|
+
"pcm_44100", # PCM format (S16LE) with 44.1kHz sample rate (Pro tier+)
|
|
30
|
+
"ulaw_8000", # μ-law format with 8kHz sample rate (for Twilio)
|
|
31
|
+
]
|
|
32
|
+
|
|
33
|
+
|
|
34
|
+
class ElevenLabsTools(Toolkit):
|
|
35
|
+
def __init__(
|
|
36
|
+
self,
|
|
37
|
+
voice_id: str = "JBFqnCBsd6RMkjVDRZzb",
|
|
38
|
+
api_key: Optional[str] = None,
|
|
39
|
+
target_directory: Optional[str] = None,
|
|
40
|
+
model_id: str = "eleven_multilingual_v2",
|
|
41
|
+
output_format: ElevenLabsAudioOutputFormat = "mp3_44100_64",
|
|
42
|
+
enable_get_voices: bool = True,
|
|
43
|
+
enable_generate_sound_effect: bool = True,
|
|
44
|
+
enable_text_to_speech: bool = True,
|
|
45
|
+
all: bool = False,
|
|
46
|
+
**kwargs,
|
|
47
|
+
):
|
|
48
|
+
self.api_key = api_key or getenv("ELEVEN_LABS_API_KEY")
|
|
49
|
+
if not self.api_key:
|
|
50
|
+
log_error("ELEVEN_LABS_API_KEY not set. Please set the ELEVEN_LABS_API_KEY environment variable.")
|
|
51
|
+
|
|
52
|
+
self.target_directory = target_directory
|
|
53
|
+
self.voice_id = voice_id
|
|
54
|
+
self.model_id = model_id
|
|
55
|
+
self.output_format = output_format
|
|
56
|
+
|
|
57
|
+
if self.target_directory:
|
|
58
|
+
target_path = Path(self.target_directory)
|
|
59
|
+
target_path.mkdir(parents=True, exist_ok=True)
|
|
60
|
+
|
|
61
|
+
self.eleven_labs_client = ElevenLabs(api_key=self.api_key)
|
|
62
|
+
|
|
63
|
+
tools: List[Any] = []
|
|
64
|
+
if all or enable_get_voices:
|
|
65
|
+
tools.append(self.get_voices)
|
|
66
|
+
if all or enable_generate_sound_effect:
|
|
67
|
+
tools.append(self.generate_sound_effect)
|
|
68
|
+
if all or enable_text_to_speech:
|
|
69
|
+
tools.append(self.text_to_speech)
|
|
70
|
+
|
|
71
|
+
super().__init__(name="elevenlabs_tools", tools=tools, **kwargs)
|
|
72
|
+
|
|
73
|
+
def get_voices(self) -> str:
|
|
74
|
+
"""
|
|
75
|
+
Get all the voices available.
|
|
76
|
+
|
|
77
|
+
Returns:
|
|
78
|
+
result (list): A list of voices that have an ID, name and description.
|
|
79
|
+
"""
|
|
80
|
+
try:
|
|
81
|
+
voices = self.eleven_labs_client.voices.get_all()
|
|
82
|
+
|
|
83
|
+
response = []
|
|
84
|
+
for voice in voices.voices:
|
|
85
|
+
response.append(
|
|
86
|
+
{
|
|
87
|
+
"id": voice.voice_id,
|
|
88
|
+
"name": voice.name,
|
|
89
|
+
"description": voice.description,
|
|
90
|
+
}
|
|
91
|
+
)
|
|
92
|
+
|
|
93
|
+
return str(response)
|
|
94
|
+
|
|
95
|
+
except Exception as e:
|
|
96
|
+
log_error(f"Failed to fetch voices: {e}")
|
|
97
|
+
return f"Error: {e}"
|
|
98
|
+
|
|
99
|
+
def _process_audio(self, audio_generator: Iterator[bytes]) -> bytes:
|
|
100
|
+
audio_bytes = BytesIO()
|
|
101
|
+
for chunk in audio_generator:
|
|
102
|
+
audio_bytes.write(chunk)
|
|
103
|
+
|
|
104
|
+
# Read bytes
|
|
105
|
+
audio_bytes.seek(0)
|
|
106
|
+
audio_data = audio_bytes.read()
|
|
107
|
+
|
|
108
|
+
# Save to disk if target_directory exists
|
|
109
|
+
if self.target_directory:
|
|
110
|
+
# Determine file extension based on output format
|
|
111
|
+
if self.output_format.startswith("mp3"):
|
|
112
|
+
extension = "mp3"
|
|
113
|
+
elif self.output_format.startswith("pcm"):
|
|
114
|
+
extension = "wav"
|
|
115
|
+
elif self.output_format.startswith("ulaw"):
|
|
116
|
+
extension = "ulaw"
|
|
117
|
+
else:
|
|
118
|
+
extension = "mp3"
|
|
119
|
+
|
|
120
|
+
output_filename = f"{uuid4()}.{extension}"
|
|
121
|
+
output_path = path.join(self.target_directory, output_filename)
|
|
122
|
+
|
|
123
|
+
with open(output_path, "wb") as f:
|
|
124
|
+
f.write(audio_data)
|
|
125
|
+
|
|
126
|
+
log_info(f"Audio saved to: {output_path}")
|
|
127
|
+
|
|
128
|
+
return audio_data
|
|
129
|
+
|
|
130
|
+
def generate_sound_effect(self, prompt: str, duration_seconds: Optional[float] = None) -> ToolResult:
|
|
131
|
+
"""
|
|
132
|
+
Generate a sound effect from a text description.
|
|
133
|
+
|
|
134
|
+
Args:
|
|
135
|
+
prompt (str): Description of the sound effect
|
|
136
|
+
duration_seconds (Optional[float]): Duration in seconds to generate audio from. Has to be between 0.5 and 22.
|
|
137
|
+
Returns:
|
|
138
|
+
ToolResult: A ToolResult containing the generated audio or error message.
|
|
139
|
+
"""
|
|
140
|
+
try:
|
|
141
|
+
audio_generator = self.eleven_labs_client.text_to_sound_effects.convert(
|
|
142
|
+
text=prompt, duration_seconds=duration_seconds
|
|
143
|
+
)
|
|
144
|
+
|
|
145
|
+
audio_data = self._process_audio(audio_generator)
|
|
146
|
+
|
|
147
|
+
# Create AudioArtifact
|
|
148
|
+
audio_artifact = Audio(
|
|
149
|
+
id=str(uuid4()),
|
|
150
|
+
content=audio_data,
|
|
151
|
+
mime_type="audio/mpeg",
|
|
152
|
+
)
|
|
153
|
+
|
|
154
|
+
return ToolResult(
|
|
155
|
+
content="Sound effect generated successfully",
|
|
156
|
+
audios=[audio_artifact],
|
|
157
|
+
)
|
|
158
|
+
|
|
159
|
+
except Exception as e:
|
|
160
|
+
log_error(f"Failed to generate sound effect: {e}")
|
|
161
|
+
return ToolResult(content=f"Error: {e}")
|
|
162
|
+
|
|
163
|
+
def text_to_speech(self, agent: Union[Agent, Team], prompt: str) -> ToolResult:
|
|
164
|
+
"""
|
|
165
|
+
Convert text to speech.
|
|
166
|
+
|
|
167
|
+
Args:
|
|
168
|
+
prompt (str): Text to generate audio from.
|
|
169
|
+
Returns:
|
|
170
|
+
ToolResult: A ToolResult containing the generated audio or error message.
|
|
171
|
+
"""
|
|
172
|
+
try:
|
|
173
|
+
audio_generator = self.eleven_labs_client.text_to_speech.convert(
|
|
174
|
+
text=prompt,
|
|
175
|
+
voice_id=self.voice_id,
|
|
176
|
+
model_id=self.model_id,
|
|
177
|
+
output_format=self.output_format,
|
|
178
|
+
)
|
|
179
|
+
|
|
180
|
+
audio_data = self._process_audio(audio_generator)
|
|
181
|
+
|
|
182
|
+
# Create AudioArtifact
|
|
183
|
+
audio_artifact = Audio(
|
|
184
|
+
id=str(uuid4()),
|
|
185
|
+
content=audio_data,
|
|
186
|
+
mime_type="audio/mpeg",
|
|
187
|
+
)
|
|
188
|
+
|
|
189
|
+
return ToolResult(
|
|
190
|
+
content="Audio generated successfully",
|
|
191
|
+
audios=[audio_artifact],
|
|
192
|
+
)
|
|
193
|
+
|
|
194
|
+
except Exception as e:
|
|
195
|
+
log_error(f"Failed to generate audio: {e}")
|
|
196
|
+
return ToolResult(content=f"Error: {e}")
|
agno/tools/email.py
ADDED
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
from typing import Optional
|
|
2
|
+
|
|
3
|
+
from agno.tools import Toolkit
|
|
4
|
+
from agno.utils.log import log_info, logger
|
|
5
|
+
|
|
6
|
+
|
|
7
|
+
class EmailTools(Toolkit):
|
|
8
|
+
def __init__(
|
|
9
|
+
self,
|
|
10
|
+
receiver_email: Optional[str] = None,
|
|
11
|
+
sender_name: Optional[str] = None,
|
|
12
|
+
sender_email: Optional[str] = None,
|
|
13
|
+
sender_passkey: Optional[str] = None,
|
|
14
|
+
enable_email_user: bool = True,
|
|
15
|
+
all: bool = False,
|
|
16
|
+
**kwargs,
|
|
17
|
+
):
|
|
18
|
+
self.receiver_email: Optional[str] = receiver_email
|
|
19
|
+
self.sender_name: Optional[str] = sender_name
|
|
20
|
+
self.sender_email: Optional[str] = sender_email
|
|
21
|
+
self.sender_passkey: Optional[str] = sender_passkey
|
|
22
|
+
|
|
23
|
+
tools = []
|
|
24
|
+
if all or enable_email_user:
|
|
25
|
+
tools.append(self.email_user)
|
|
26
|
+
|
|
27
|
+
# Call superclass with tools list
|
|
28
|
+
super().__init__(name="email_tools", tools=tools, **kwargs)
|
|
29
|
+
|
|
30
|
+
def email_user(self, subject: str, body: str, **kwargs) -> str:
|
|
31
|
+
"""Emails the user with the given subject and body.
|
|
32
|
+
|
|
33
|
+
:param subject: The subject of the email.
|
|
34
|
+
:param body: The body of the email.
|
|
35
|
+
:return: "success" if the email was sent successfully, "error: [error message]" otherwise.
|
|
36
|
+
"""
|
|
37
|
+
try:
|
|
38
|
+
import smtplib
|
|
39
|
+
from email.message import EmailMessage
|
|
40
|
+
except ImportError:
|
|
41
|
+
logger.error("`smtplib` not installed")
|
|
42
|
+
raise
|
|
43
|
+
|
|
44
|
+
if not self.receiver_email:
|
|
45
|
+
return "error: No receiver email provided"
|
|
46
|
+
if not self.sender_name:
|
|
47
|
+
return "error: No sender name provided"
|
|
48
|
+
if not self.sender_email:
|
|
49
|
+
return "error: No sender email provided"
|
|
50
|
+
if not self.sender_passkey:
|
|
51
|
+
return "error: No sender passkey provided"
|
|
52
|
+
|
|
53
|
+
msg = EmailMessage()
|
|
54
|
+
msg["Subject"] = subject
|
|
55
|
+
msg["From"] = f"{self.sender_name} <{self.sender_email}>"
|
|
56
|
+
msg["To"] = self.receiver_email
|
|
57
|
+
msg.set_content(body)
|
|
58
|
+
|
|
59
|
+
log_info(f"Sending Email to {self.receiver_email}")
|
|
60
|
+
try:
|
|
61
|
+
with smtplib.SMTP_SSL("smtp.gmail.com", 465) as smtp:
|
|
62
|
+
smtp.login(self.sender_email, self.sender_passkey)
|
|
63
|
+
smtp.send_message(msg)
|
|
64
|
+
except Exception as e:
|
|
65
|
+
logger.error(f"Error sending email: {e}")
|
|
66
|
+
return f"error: {e}"
|
|
67
|
+
return "email sent successfully"
|
agno/tools/evm.py
ADDED
|
@@ -0,0 +1,129 @@
|
|
|
1
|
+
from os import getenv
|
|
2
|
+
from typing import Optional
|
|
3
|
+
|
|
4
|
+
from agno.tools import Toolkit
|
|
5
|
+
from agno.utils.log import log_debug, log_error
|
|
6
|
+
|
|
7
|
+
try:
|
|
8
|
+
from eth_account.account import LocalAccount
|
|
9
|
+
from eth_account.datastructures import SignedTransaction
|
|
10
|
+
from hexbytes import HexBytes
|
|
11
|
+
from web3 import Web3
|
|
12
|
+
from web3.main import Web3 as Web3Type
|
|
13
|
+
from web3.providers.rpc import HTTPProvider
|
|
14
|
+
from web3.types import TxParams, TxReceipt
|
|
15
|
+
except ImportError:
|
|
16
|
+
raise ImportError("`web3` not installed. Please install using `pip install web3`")
|
|
17
|
+
|
|
18
|
+
|
|
19
|
+
class EvmTools(Toolkit):
|
|
20
|
+
def __init__(
|
|
21
|
+
self,
|
|
22
|
+
private_key: Optional[str] = None,
|
|
23
|
+
rpc_url: Optional[str] = None,
|
|
24
|
+
enable_send_transaction: bool = True,
|
|
25
|
+
all: bool = False,
|
|
26
|
+
**kwargs,
|
|
27
|
+
):
|
|
28
|
+
"""Initialize EVM tools for blockchain interactions.
|
|
29
|
+
|
|
30
|
+
Args:
|
|
31
|
+
private_key: Private key for signing transactions (defaults to EVM_PRIVATE_KEY env var)
|
|
32
|
+
rpc_url: RPC URL for blockchain connection (defaults to EVM_RPC_URL env var)
|
|
33
|
+
**kwargs: Additional arguments passed to parent Toolkit class
|
|
34
|
+
"""
|
|
35
|
+
|
|
36
|
+
self.private_key = private_key or getenv("EVM_PRIVATE_KEY")
|
|
37
|
+
self.rpc_url = rpc_url or getenv("EVM_RPC_URL")
|
|
38
|
+
|
|
39
|
+
if not self.private_key:
|
|
40
|
+
log_error("Private Key is required")
|
|
41
|
+
raise ValueError("Private Key is required")
|
|
42
|
+
if not self.rpc_url:
|
|
43
|
+
log_error("RPC Url is needed to interact with EVM blockchain")
|
|
44
|
+
raise ValueError("RPC Url is needed to interact with EVM blockchain")
|
|
45
|
+
|
|
46
|
+
# Ensure private key has 0x prefix
|
|
47
|
+
if not self.private_key.startswith("0x"):
|
|
48
|
+
self.private_key = f"0x{self.private_key}"
|
|
49
|
+
|
|
50
|
+
# Initialize Web3 client and account
|
|
51
|
+
self.web3_client: "Web3Type" = Web3(HTTPProvider(self.rpc_url))
|
|
52
|
+
self.account: "LocalAccount" = self.web3_client.eth.account.from_key(self.private_key)
|
|
53
|
+
log_debug(f"Your wallet address is: {self.account.address}")
|
|
54
|
+
|
|
55
|
+
tools = []
|
|
56
|
+
if all or enable_send_transaction:
|
|
57
|
+
tools.append(self.send_transaction)
|
|
58
|
+
|
|
59
|
+
super().__init__(name="evm_tools", tools=tools, **kwargs)
|
|
60
|
+
|
|
61
|
+
def get_max_priority_fee_per_gas(self) -> int:
|
|
62
|
+
"""Get the max priority fee per gas for the transaction.
|
|
63
|
+
|
|
64
|
+
Returns:
|
|
65
|
+
int: The max priority fee per gas for the transaction (1 gwei)
|
|
66
|
+
"""
|
|
67
|
+
max_priority_fee_per_gas = self.web3_client.to_wei(1, "gwei")
|
|
68
|
+
return max_priority_fee_per_gas
|
|
69
|
+
|
|
70
|
+
def get_max_fee_per_gas(self, max_priority_fee_per_gas: int) -> int:
|
|
71
|
+
"""Get the max fee per gas for the transaction.
|
|
72
|
+
|
|
73
|
+
Args:
|
|
74
|
+
max_priority_fee_per_gas: The max priority fee per gas
|
|
75
|
+
|
|
76
|
+
Returns:
|
|
77
|
+
int: The max fee per gas for the transaction
|
|
78
|
+
"""
|
|
79
|
+
latest_block = self.web3_client.eth.get_block("latest")
|
|
80
|
+
base_fee_per_gas = latest_block.get("baseFeePerGas")
|
|
81
|
+
if base_fee_per_gas is None:
|
|
82
|
+
log_error("Base fee per gas not found in the latest block.")
|
|
83
|
+
raise ValueError("Base fee per gas not found in the latest block.")
|
|
84
|
+
max_fee_per_gas = (2 * base_fee_per_gas) + max_priority_fee_per_gas
|
|
85
|
+
return max_fee_per_gas
|
|
86
|
+
|
|
87
|
+
def send_transaction(self, to_address: str, amount_in_wei: int) -> str:
|
|
88
|
+
"""Sends a transaction to the address provided.
|
|
89
|
+
|
|
90
|
+
Args:
|
|
91
|
+
to_address: The address to which you want to send ETH
|
|
92
|
+
amount_in_wei: The amount of ETH to send in wei
|
|
93
|
+
|
|
94
|
+
Returns:
|
|
95
|
+
str: The transaction hash of the transaction or error message
|
|
96
|
+
"""
|
|
97
|
+
try:
|
|
98
|
+
max_priority_fee_per_gas = self.get_max_priority_fee_per_gas()
|
|
99
|
+
max_fee_per_gas = self.get_max_fee_per_gas(max_priority_fee_per_gas)
|
|
100
|
+
|
|
101
|
+
transaction_params: "TxParams" = {
|
|
102
|
+
"from": self.account.address,
|
|
103
|
+
"to": to_address,
|
|
104
|
+
"value": amount_in_wei, # type: ignore[typeddict-item]
|
|
105
|
+
"nonce": self.web3_client.eth.get_transaction_count(self.account.address),
|
|
106
|
+
"gas": 21000,
|
|
107
|
+
"maxFeePerGas": max_fee_per_gas, # type: ignore[typeddict-item]
|
|
108
|
+
"maxPriorityFeePerGas": max_priority_fee_per_gas, # type: ignore[typeddict-item]
|
|
109
|
+
"chainId": self.web3_client.eth.chain_id,
|
|
110
|
+
"type": 2, # EIP-1559 dynamic fee transaction
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
signed_transaction: "SignedTransaction" = self.web3_client.eth.account.sign_transaction(
|
|
114
|
+
transaction_params, self.private_key
|
|
115
|
+
)
|
|
116
|
+
transaction_hash: "HexBytes" = self.web3_client.eth.send_raw_transaction(signed_transaction.raw_transaction)
|
|
117
|
+
log_debug(f"Ongoing Transaction hash: 0x{transaction_hash.hex()}")
|
|
118
|
+
|
|
119
|
+
transaction_receipt: "TxReceipt" = self.web3_client.eth.wait_for_transaction_receipt(transaction_hash)
|
|
120
|
+
if transaction_receipt.get("status") == 1:
|
|
121
|
+
log_debug(f"Transaction successful! Transaction hash: 0x{transaction_hash.hex()}")
|
|
122
|
+
return f"0x{transaction_hash.hex()}"
|
|
123
|
+
else:
|
|
124
|
+
log_error("Transaction failed!")
|
|
125
|
+
raise Exception("Transaction failed!")
|
|
126
|
+
|
|
127
|
+
except Exception as e:
|
|
128
|
+
log_error(f"Error sending transaction: {e}")
|
|
129
|
+
return f"error: {e}"
|