agno 1.8.0__py3-none-any.whl → 2.0.0a1__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 +19 -27
- agno/agent/agent.py +2781 -4126
- agno/api/agent.py +9 -65
- agno/api/api.py +5 -46
- agno/api/evals.py +6 -17
- agno/api/os.py +17 -0
- agno/api/routes.py +6 -41
- agno/api/schemas/__init__.py +9 -0
- agno/api/schemas/agent.py +5 -21
- agno/api/schemas/evals.py +7 -16
- agno/api/schemas/os.py +14 -0
- agno/api/schemas/team.py +5 -21
- agno/api/schemas/utils.py +21 -0
- agno/api/schemas/workflows.py +11 -7
- agno/api/settings.py +53 -0
- agno/api/team.py +9 -64
- 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/db/__init__.py +24 -0
- agno/db/base.py +245 -0
- agno/db/dynamo/__init__.py +3 -0
- agno/db/dynamo/dynamo.py +1749 -0
- agno/db/dynamo/schemas.py +278 -0
- agno/db/dynamo/utils.py +684 -0
- agno/db/firestore/__init__.py +3 -0
- agno/db/firestore/firestore.py +1438 -0
- agno/db/firestore/schemas.py +130 -0
- agno/db/firestore/utils.py +278 -0
- agno/db/gcs_json/__init__.py +3 -0
- agno/db/gcs_json/gcs_json_db.py +1001 -0
- agno/db/gcs_json/utils.py +194 -0
- agno/db/in_memory/__init__.py +3 -0
- agno/db/in_memory/in_memory_db.py +888 -0
- agno/db/in_memory/utils.py +172 -0
- agno/db/json/__init__.py +3 -0
- agno/db/json/json_db.py +1051 -0
- agno/db/json/utils.py +196 -0
- agno/db/migrations/v1_to_v2.py +162 -0
- agno/db/mongo/__init__.py +3 -0
- agno/db/mongo/mongo.py +1417 -0
- agno/db/mongo/schemas.py +77 -0
- agno/db/mongo/utils.py +204 -0
- agno/db/mysql/__init__.py +3 -0
- agno/db/mysql/mysql.py +1719 -0
- agno/db/mysql/schemas.py +124 -0
- agno/db/mysql/utils.py +298 -0
- agno/db/postgres/__init__.py +3 -0
- agno/db/postgres/postgres.py +1720 -0
- agno/db/postgres/schemas.py +124 -0
- agno/db/postgres/utils.py +281 -0
- agno/db/redis/__init__.py +3 -0
- agno/db/redis/redis.py +1371 -0
- agno/db/redis/schemas.py +109 -0
- agno/db/redis/utils.py +288 -0
- agno/db/schemas/__init__.py +3 -0
- agno/db/schemas/evals.py +33 -0
- agno/db/schemas/knowledge.py +40 -0
- agno/db/schemas/memory.py +46 -0
- agno/db/singlestore/__init__.py +3 -0
- agno/db/singlestore/schemas.py +116 -0
- agno/db/singlestore/singlestore.py +1722 -0
- agno/db/singlestore/utils.py +327 -0
- agno/db/sqlite/__init__.py +3 -0
- agno/db/sqlite/schemas.py +119 -0
- agno/db/sqlite/sqlite.py +1680 -0
- agno/db/sqlite/utils.py +269 -0
- agno/db/utils.py +88 -0
- agno/eval/__init__.py +14 -0
- agno/eval/accuracy.py +142 -43
- agno/eval/performance.py +88 -23
- agno/eval/reliability.py +73 -20
- agno/eval/utils.py +23 -13
- agno/integrations/discord/__init__.py +3 -0
- agno/{app → integrations}/discord/client.py +10 -10
- agno/knowledge/__init__.py +2 -2
- agno/{document → knowledge}/chunking/agentic.py +2 -2
- agno/{document → knowledge}/chunking/document.py +2 -2
- agno/{document → knowledge}/chunking/fixed.py +3 -3
- agno/{document → knowledge}/chunking/markdown.py +2 -2
- agno/{document → knowledge}/chunking/recursive.py +2 -2
- agno/{document → knowledge}/chunking/row.py +2 -2
- agno/knowledge/chunking/semantic.py +59 -0
- agno/knowledge/chunking/strategy.py +121 -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/{embedder → knowledge/embedder}/aws_bedrock.py +127 -1
- agno/{embedder → knowledge/embedder}/azure_openai.py +65 -1
- agno/{embedder → knowledge/embedder}/base.py +6 -0
- agno/{embedder → knowledge/embedder}/cohere.py +72 -1
- agno/{embedder → knowledge/embedder}/fastembed.py +17 -1
- agno/{embedder → knowledge/embedder}/fireworks.py +1 -1
- agno/{embedder → knowledge/embedder}/google.py +74 -1
- agno/{embedder → knowledge/embedder}/huggingface.py +36 -2
- agno/{embedder → knowledge/embedder}/jina.py +48 -2
- agno/knowledge/embedder/langdb.py +22 -0
- agno/knowledge/embedder/mistral.py +139 -0
- agno/{embedder → knowledge/embedder}/nebius.py +1 -1
- agno/{embedder → knowledge/embedder}/ollama.py +54 -3
- agno/knowledge/embedder/openai.py +223 -0
- agno/{embedder → knowledge/embedder}/sentence_transformer.py +16 -1
- agno/{embedder → knowledge/embedder}/together.py +1 -1
- agno/{embedder → knowledge/embedder}/voyageai.py +49 -1
- agno/knowledge/knowledge.py +1515 -0
- agno/knowledge/reader/__init__.py +7 -0
- agno/{document → knowledge}/reader/arxiv_reader.py +32 -4
- agno/knowledge/reader/base.py +88 -0
- agno/{document → knowledge}/reader/csv_reader.py +68 -15
- agno/knowledge/reader/docx_reader.py +83 -0
- agno/{document → knowledge}/reader/firecrawl_reader.py +42 -21
- agno/knowledge/reader/gcs_reader.py +67 -0
- agno/{document → knowledge}/reader/json_reader.py +30 -9
- agno/{document → knowledge}/reader/markdown_reader.py +36 -9
- agno/{document → knowledge}/reader/pdf_reader.py +79 -21
- agno/knowledge/reader/reader_factory.py +275 -0
- agno/knowledge/reader/s3_reader.py +171 -0
- agno/{document → knowledge}/reader/text_reader.py +31 -10
- agno/knowledge/reader/url_reader.py +84 -0
- agno/knowledge/reader/web_search_reader.py +389 -0
- agno/{document → knowledge}/reader/website_reader.py +37 -10
- agno/knowledge/reader/wikipedia_reader.py +59 -0
- agno/knowledge/reader/youtube_reader.py +78 -0
- agno/knowledge/remote_content/remote_content.py +88 -0
- agno/{reranker → knowledge/reranker}/base.py +1 -1
- agno/{reranker → knowledge/reranker}/cohere.py +2 -2
- agno/{reranker → knowledge/reranker}/infinity.py +2 -2
- agno/{reranker → knowledge/reranker}/sentence_transformer.py +2 -2
- agno/knowledge/types.py +30 -0
- agno/knowledge/utils.py +169 -0
- agno/media.py +2 -2
- agno/memory/__init__.py +2 -10
- agno/memory/manager.py +1003 -148
- agno/models/aimlapi/__init__.py +2 -2
- agno/models/aimlapi/aimlapi.py +6 -6
- agno/models/anthropic/claude.py +129 -82
- agno/models/aws/bedrock.py +107 -175
- agno/models/aws/claude.py +64 -18
- agno/models/azure/ai_foundry.py +73 -23
- agno/models/base.py +347 -287
- agno/models/cerebras/cerebras.py +84 -27
- agno/models/cohere/chat.py +106 -98
- agno/models/dashscope/dashscope.py +14 -5
- agno/models/google/gemini.py +123 -53
- agno/models/groq/groq.py +97 -35
- agno/models/huggingface/huggingface.py +92 -27
- agno/models/ibm/watsonx.py +72 -13
- agno/models/litellm/chat.py +85 -13
- agno/models/message.py +38 -144
- agno/models/meta/llama.py +85 -49
- agno/models/metrics.py +120 -0
- agno/models/mistral/mistral.py +90 -21
- agno/models/ollama/__init__.py +0 -2
- agno/models/ollama/chat.py +84 -46
- agno/models/openai/chat.py +135 -27
- agno/models/openai/responses.py +233 -115
- agno/models/perplexity/perplexity.py +26 -2
- agno/models/portkey/portkey.py +0 -7
- agno/models/response.py +14 -8
- agno/models/utils.py +20 -0
- agno/models/vercel/__init__.py +2 -2
- agno/models/vercel/v0.py +1 -1
- agno/models/vllm/__init__.py +2 -2
- agno/models/vllm/vllm.py +3 -3
- agno/models/xai/xai.py +10 -10
- agno/os/__init__.py +3 -0
- agno/os/app.py +393 -0
- agno/os/auth.py +47 -0
- agno/os/config.py +103 -0
- agno/os/interfaces/agui/__init__.py +3 -0
- agno/os/interfaces/agui/agui.py +31 -0
- agno/{app/agui/async_router.py → os/interfaces/agui/router.py} +16 -16
- agno/{app → os/interfaces}/agui/utils.py +65 -28
- agno/os/interfaces/base.py +21 -0
- agno/os/interfaces/slack/__init__.py +3 -0
- agno/{app/slack/async_router.py → os/interfaces/slack/router.py} +3 -5
- agno/os/interfaces/slack/slack.py +33 -0
- agno/os/interfaces/whatsapp/__init__.py +3 -0
- agno/{app/whatsapp/async_router.py → os/interfaces/whatsapp/router.py} +4 -7
- agno/os/interfaces/whatsapp/whatsapp.py +30 -0
- agno/os/router.py +843 -0
- agno/os/routers/__init__.py +3 -0
- agno/os/routers/evals/__init__.py +3 -0
- agno/os/routers/evals/evals.py +204 -0
- agno/os/routers/evals/schemas.py +142 -0
- agno/os/routers/evals/utils.py +161 -0
- agno/os/routers/knowledge/__init__.py +3 -0
- agno/os/routers/knowledge/knowledge.py +413 -0
- agno/os/routers/knowledge/schemas.py +118 -0
- agno/os/routers/memory/__init__.py +3 -0
- agno/os/routers/memory/memory.py +179 -0
- agno/os/routers/memory/schemas.py +58 -0
- agno/os/routers/metrics/__init__.py +3 -0
- agno/os/routers/metrics/metrics.py +58 -0
- agno/os/routers/metrics/schemas.py +47 -0
- agno/os/routers/session/__init__.py +3 -0
- agno/os/routers/session/session.py +163 -0
- agno/os/schema.py +892 -0
- agno/{app/playground → os}/settings.py +8 -15
- agno/os/utils.py +270 -0
- agno/reasoning/azure_ai_foundry.py +4 -4
- agno/reasoning/deepseek.py +4 -4
- agno/reasoning/default.py +6 -11
- agno/reasoning/groq.py +4 -4
- agno/reasoning/helpers.py +4 -6
- agno/reasoning/ollama.py +4 -4
- agno/reasoning/openai.py +4 -4
- agno/run/{response.py → agent.py} +144 -72
- agno/run/base.py +44 -58
- agno/run/cancel.py +83 -0
- agno/run/team.py +133 -77
- agno/run/workflow.py +537 -12
- agno/session/__init__.py +10 -0
- agno/session/agent.py +244 -0
- agno/session/summary.py +225 -0
- agno/session/team.py +262 -0
- agno/{storage/session/v2 → session}/workflow.py +47 -24
- agno/team/__init__.py +15 -16
- agno/team/team.py +2967 -4243
- agno/tools/agentql.py +14 -5
- agno/tools/airflow.py +9 -4
- agno/tools/api.py +7 -3
- agno/tools/apify.py +2 -46
- agno/tools/arxiv.py +8 -3
- agno/tools/aws_lambda.py +7 -5
- agno/tools/aws_ses.py +7 -1
- agno/tools/baidusearch.py +4 -1
- agno/tools/bitbucket.py +4 -4
- agno/tools/brandfetch.py +14 -11
- agno/tools/bravesearch.py +4 -1
- agno/tools/brightdata.py +42 -22
- agno/tools/browserbase.py +13 -4
- agno/tools/calcom.py +12 -10
- agno/tools/calculator.py +10 -27
- agno/tools/cartesia.py +18 -13
- agno/tools/{clickup_tool.py → clickup.py} +12 -25
- agno/tools/confluence.py +71 -18
- agno/tools/crawl4ai.py +7 -1
- agno/tools/csv_toolkit.py +9 -8
- agno/tools/dalle.py +18 -11
- agno/tools/daytona.py +13 -16
- agno/tools/decorator.py +6 -3
- agno/tools/desi_vocal.py +16 -7
- agno/tools/discord.py +11 -8
- agno/tools/docker.py +30 -42
- agno/tools/duckdb.py +34 -53
- agno/tools/duckduckgo.py +8 -7
- agno/tools/e2b.py +62 -62
- agno/tools/eleven_labs.py +35 -28
- agno/tools/email.py +4 -1
- agno/tools/evm.py +7 -1
- agno/tools/exa.py +19 -14
- agno/tools/fal.py +29 -29
- agno/tools/file.py +9 -8
- agno/tools/financial_datasets.py +25 -44
- agno/tools/firecrawl.py +22 -22
- agno/tools/function.py +68 -17
- agno/tools/giphy.py +22 -10
- agno/tools/github.py +48 -126
- agno/tools/gmail.py +46 -62
- agno/tools/google_bigquery.py +7 -6
- agno/tools/google_maps.py +11 -26
- agno/tools/googlesearch.py +7 -2
- agno/tools/googlesheets.py +21 -17
- agno/tools/hackernews.py +9 -5
- agno/tools/jina.py +5 -4
- agno/tools/jira.py +18 -9
- agno/tools/knowledge.py +31 -32
- agno/tools/linear.py +18 -33
- agno/tools/linkup.py +5 -1
- agno/tools/local_file_system.py +8 -5
- agno/tools/lumalab.py +31 -19
- agno/tools/mem0.py +18 -12
- agno/tools/memori.py +14 -10
- agno/tools/mlx_transcribe.py +3 -2
- agno/tools/models/azure_openai.py +32 -14
- agno/tools/models/gemini.py +58 -31
- agno/tools/models/groq.py +29 -20
- agno/tools/models/nebius.py +27 -11
- agno/tools/models_labs.py +39 -15
- agno/tools/moviepy_video.py +7 -6
- agno/tools/neo4j.py +134 -0
- agno/tools/newspaper.py +7 -2
- agno/tools/newspaper4k.py +8 -3
- agno/tools/openai.py +57 -26
- agno/tools/openbb.py +12 -11
- agno/tools/opencv.py +62 -46
- agno/tools/openweather.py +14 -12
- agno/tools/pandas.py +11 -3
- agno/tools/postgres.py +4 -12
- agno/tools/pubmed.py +4 -1
- agno/tools/python.py +9 -22
- agno/tools/reasoning.py +35 -27
- agno/tools/reddit.py +11 -26
- agno/tools/replicate.py +54 -41
- agno/tools/resend.py +4 -1
- agno/tools/scrapegraph.py +15 -14
- agno/tools/searxng.py +10 -23
- agno/tools/serpapi.py +6 -3
- agno/tools/serper.py +13 -4
- agno/tools/shell.py +9 -2
- agno/tools/slack.py +12 -11
- agno/tools/sleep.py +3 -2
- agno/tools/spider.py +24 -4
- agno/tools/sql.py +7 -6
- agno/tools/tavily.py +6 -4
- agno/tools/telegram.py +12 -4
- agno/tools/todoist.py +11 -31
- agno/tools/toolkit.py +1 -1
- agno/tools/trafilatura.py +22 -6
- agno/tools/trello.py +9 -22
- agno/tools/twilio.py +10 -3
- agno/tools/user_control_flow.py +6 -1
- agno/tools/valyu.py +34 -5
- agno/tools/visualization.py +19 -28
- agno/tools/webbrowser.py +4 -3
- agno/tools/webex.py +11 -7
- agno/tools/website.py +15 -46
- agno/tools/webtools.py +12 -4
- agno/tools/whatsapp.py +5 -9
- agno/tools/wikipedia.py +20 -13
- agno/tools/x.py +14 -13
- agno/tools/yfinance.py +13 -40
- agno/tools/youtube.py +26 -20
- agno/tools/zendesk.py +7 -2
- agno/tools/zep.py +10 -7
- agno/tools/zoom.py +10 -9
- agno/utils/common.py +1 -19
- agno/utils/events.py +95 -118
- agno/utils/knowledge.py +29 -0
- agno/utils/location.py +2 -2
- agno/utils/log.py +2 -2
- agno/utils/mcp.py +11 -5
- agno/utils/media.py +39 -0
- agno/utils/message.py +12 -1
- agno/utils/models/claude.py +6 -4
- agno/utils/models/mistral.py +8 -7
- agno/utils/models/schema_utils.py +3 -3
- agno/utils/pprint.py +33 -32
- agno/utils/print_response/agent.py +779 -0
- agno/utils/print_response/team.py +1565 -0
- agno/utils/print_response/workflow.py +1451 -0
- agno/utils/prompts.py +14 -14
- agno/utils/reasoning.py +87 -0
- agno/utils/response.py +42 -42
- agno/utils/string.py +8 -22
- agno/utils/team.py +50 -0
- agno/utils/timer.py +2 -2
- agno/vectordb/base.py +33 -21
- agno/vectordb/cassandra/cassandra.py +287 -23
- agno/vectordb/chroma/chromadb.py +482 -59
- agno/vectordb/clickhouse/clickhousedb.py +270 -63
- agno/vectordb/couchbase/couchbase.py +309 -29
- agno/vectordb/lancedb/lance_db.py +360 -21
- agno/vectordb/langchaindb/__init__.py +5 -0
- agno/vectordb/langchaindb/langchaindb.py +145 -0
- agno/vectordb/lightrag/__init__.py +5 -0
- agno/vectordb/lightrag/lightrag.py +374 -0
- agno/vectordb/llamaindex/llamaindexdb.py +127 -0
- agno/vectordb/milvus/milvus.py +242 -32
- agno/vectordb/mongodb/mongodb.py +200 -24
- agno/vectordb/pgvector/pgvector.py +319 -37
- agno/vectordb/pineconedb/pineconedb.py +221 -27
- agno/vectordb/qdrant/qdrant.py +356 -14
- agno/vectordb/singlestore/singlestore.py +286 -29
- agno/vectordb/surrealdb/surrealdb.py +187 -7
- agno/vectordb/upstashdb/upstashdb.py +342 -26
- agno/vectordb/weaviate/weaviate.py +227 -165
- agno/workflow/__init__.py +17 -13
- agno/workflow/{v2/condition.py → condition.py} +135 -32
- agno/workflow/{v2/loop.py → loop.py} +115 -28
- agno/workflow/{v2/parallel.py → parallel.py} +138 -108
- agno/workflow/{v2/router.py → router.py} +133 -32
- agno/workflow/{v2/step.py → step.py} +200 -42
- agno/workflow/{v2/steps.py → steps.py} +147 -66
- agno/workflow/types.py +482 -0
- agno/workflow/workflow.py +2394 -696
- agno-2.0.0a1.dist-info/METADATA +355 -0
- agno-2.0.0a1.dist-info/RECORD +514 -0
- agno/agent/metrics.py +0 -107
- agno/api/app.py +0 -35
- agno/api/playground.py +0 -92
- agno/api/schemas/app.py +0 -12
- agno/api/schemas/playground.py +0 -22
- agno/api/schemas/user.py +0 -35
- agno/api/schemas/workspace.py +0 -46
- agno/api/user.py +0 -160
- agno/api/workflows.py +0 -33
- agno/api/workspace.py +0 -175
- agno/app/agui/__init__.py +0 -3
- agno/app/agui/app.py +0 -17
- agno/app/agui/sync_router.py +0 -120
- agno/app/base.py +0 -186
- agno/app/discord/__init__.py +0 -3
- agno/app/fastapi/__init__.py +0 -3
- agno/app/fastapi/app.py +0 -107
- agno/app/fastapi/async_router.py +0 -457
- agno/app/fastapi/sync_router.py +0 -448
- agno/app/playground/app.py +0 -228
- agno/app/playground/async_router.py +0 -1050
- agno/app/playground/deploy.py +0 -249
- agno/app/playground/operator.py +0 -183
- agno/app/playground/schemas.py +0 -220
- agno/app/playground/serve.py +0 -55
- agno/app/playground/sync_router.py +0 -1042
- agno/app/playground/utils.py +0 -46
- agno/app/settings.py +0 -15
- agno/app/slack/__init__.py +0 -3
- agno/app/slack/app.py +0 -19
- agno/app/slack/sync_router.py +0 -92
- agno/app/utils.py +0 -54
- agno/app/whatsapp/__init__.py +0 -3
- agno/app/whatsapp/app.py +0 -15
- agno/app/whatsapp/sync_router.py +0 -197
- agno/cli/auth_server.py +0 -249
- agno/cli/config.py +0 -274
- agno/cli/console.py +0 -88
- agno/cli/credentials.py +0 -23
- agno/cli/entrypoint.py +0 -571
- agno/cli/operator.py +0 -357
- agno/cli/settings.py +0 -96
- agno/cli/ws/ws_cli.py +0 -817
- agno/constants.py +0 -13
- agno/document/__init__.py +0 -5
- agno/document/chunking/semantic.py +0 -45
- agno/document/chunking/strategy.py +0 -31
- agno/document/reader/__init__.py +0 -5
- agno/document/reader/base.py +0 -47
- agno/document/reader/docx_reader.py +0 -60
- agno/document/reader/gcs/pdf_reader.py +0 -44
- agno/document/reader/s3/pdf_reader.py +0 -59
- agno/document/reader/s3/text_reader.py +0 -63
- agno/document/reader/url_reader.py +0 -59
- agno/document/reader/youtube_reader.py +0 -58
- agno/embedder/__init__.py +0 -5
- agno/embedder/langdb.py +0 -80
- agno/embedder/mistral.py +0 -82
- agno/embedder/openai.py +0 -78
- agno/file/__init__.py +0 -5
- 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 -698
- agno/knowledge/arxiv.py +0 -33
- agno/knowledge/combined.py +0 -36
- agno/knowledge/csv.py +0 -144
- agno/knowledge/csv_url.py +0 -124
- agno/knowledge/document.py +0 -223
- agno/knowledge/docx.py +0 -137
- agno/knowledge/firecrawl.py +0 -34
- agno/knowledge/gcs/__init__.py +0 -0
- agno/knowledge/gcs/base.py +0 -39
- agno/knowledge/gcs/pdf.py +0 -125
- agno/knowledge/json.py +0 -137
- agno/knowledge/langchain.py +0 -71
- agno/knowledge/light_rag.py +0 -273
- agno/knowledge/llamaindex.py +0 -66
- agno/knowledge/markdown.py +0 -154
- agno/knowledge/pdf.py +0 -164
- agno/knowledge/pdf_bytes.py +0 -42
- agno/knowledge/pdf_url.py +0 -148
- agno/knowledge/s3/__init__.py +0 -0
- agno/knowledge/s3/base.py +0 -64
- agno/knowledge/s3/pdf.py +0 -33
- agno/knowledge/s3/text.py +0 -34
- agno/knowledge/text.py +0 -141
- agno/knowledge/url.py +0 -46
- agno/knowledge/website.py +0 -179
- agno/knowledge/wikipedia.py +0 -32
- agno/knowledge/youtube.py +0 -35
- agno/memory/agent.py +0 -423
- agno/memory/classifier.py +0 -104
- agno/memory/db/__init__.py +0 -5
- 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 -22
- agno/memory/row.py +0 -36
- agno/memory/summarizer.py +0 -201
- agno/memory/summary.py +0 -19
- agno/memory/team.py +0 -415
- agno/memory/v2/__init__.py +0 -2
- agno/memory/v2/db/__init__.py +0 -1
- agno/memory/v2/db/base.py +0 -42
- agno/memory/v2/db/firestore.py +0 -339
- agno/memory/v2/db/mongodb.py +0 -196
- agno/memory/v2/db/postgres.py +0 -214
- agno/memory/v2/db/redis.py +0 -187
- agno/memory/v2/db/schema.py +0 -54
- agno/memory/v2/db/sqlite.py +0 -209
- agno/memory/v2/manager.py +0 -437
- agno/memory/v2/memory.py +0 -1097
- agno/memory/v2/schema.py +0 -55
- agno/memory/v2/summarizer.py +0 -215
- agno/memory/workflow.py +0 -38
- agno/models/ollama/tools.py +0 -430
- agno/models/qwen/__init__.py +0 -5
- agno/playground/__init__.py +0 -10
- agno/playground/deploy.py +0 -3
- agno/playground/playground.py +0 -3
- agno/playground/serve.py +0 -3
- agno/playground/settings.py +0 -3
- agno/reranker/__init__.py +0 -0
- agno/run/v2/__init__.py +0 -0
- agno/run/v2/workflow.py +0 -567
- agno/storage/__init__.py +0 -0
- agno/storage/agent/__init__.py +0 -0
- agno/storage/agent/dynamodb.py +0 -1
- agno/storage/agent/json.py +0 -1
- agno/storage/agent/mongodb.py +0 -1
- agno/storage/agent/postgres.py +0 -1
- agno/storage/agent/singlestore.py +0 -1
- agno/storage/agent/sqlite.py +0 -1
- agno/storage/agent/yaml.py +0 -1
- agno/storage/base.py +0 -60
- agno/storage/dynamodb.py +0 -673
- agno/storage/firestore.py +0 -297
- agno/storage/gcs_json.py +0 -261
- agno/storage/in_memory.py +0 -234
- agno/storage/json.py +0 -237
- agno/storage/mongodb.py +0 -328
- agno/storage/mysql.py +0 -685
- agno/storage/postgres.py +0 -682
- agno/storage/redis.py +0 -336
- agno/storage/session/__init__.py +0 -16
- agno/storage/session/agent.py +0 -64
- agno/storage/session/team.py +0 -63
- agno/storage/session/v2/__init__.py +0 -5
- agno/storage/session/workflow.py +0 -61
- agno/storage/singlestore.py +0 -606
- agno/storage/sqlite.py +0 -646
- agno/storage/workflow/__init__.py +0 -0
- agno/storage/workflow/mongodb.py +0 -1
- agno/storage/workflow/postgres.py +0 -1
- agno/storage/workflow/sqlite.py +0 -1
- agno/storage/yaml.py +0 -241
- agno/tools/thinking.py +0 -73
- 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/workflow/v2/__init__.py +0 -21
- agno/workflow/v2/types.py +0 -357
- agno/workflow/v2/workflow.py +0 -3312
- agno/workspace/__init__.py +0 -0
- agno/workspace/config.py +0 -325
- agno/workspace/enums.py +0 -6
- agno/workspace/helpers.py +0 -52
- agno/workspace/operator.py +0 -757
- agno/workspace/settings.py +0 -158
- agno-1.8.0.dist-info/METADATA +0 -979
- agno-1.8.0.dist-info/RECORD +0 -565
- agno-1.8.0.dist-info/entry_points.txt +0 -3
- /agno/{app → db/migrations}/__init__.py +0 -0
- /agno/{app/playground/__init__.py → db/schemas/metrics.py} +0 -0
- /agno/{cli → integrations}/__init__.py +0 -0
- /agno/{cli/ws → knowledge/chunking}/__init__.py +0 -0
- /agno/{document/chunking → knowledge/remote_content}/__init__.py +0 -0
- /agno/{document/reader/gcs → knowledge/reranker}/__init__.py +0 -0
- /agno/{document/reader/s3 → os/interfaces}/__init__.py +0 -0
- /agno/{app → os/interfaces}/slack/security.py +0 -0
- /agno/{app → os/interfaces}/whatsapp/security.py +0 -0
- /agno/{file/local → utils/print_response}/__init__.py +0 -0
- /agno/{infra → vectordb/llamaindex}/__init__.py +0 -0
- {agno-1.8.0.dist-info → agno-2.0.0a1.dist-info}/WHEEL +0 -0
- {agno-1.8.0.dist-info → agno-2.0.0a1.dist-info}/licenses/LICENSE +0 -0
- {agno-1.8.0.dist-info → agno-2.0.0a1.dist-info}/top_level.txt +0 -0
agno/tools/exa.py
CHANGED
|
@@ -19,11 +19,15 @@ class ExaTools(Toolkit):
|
|
|
19
19
|
functionalities to perform categorized searches and retrieve structured results.
|
|
20
20
|
|
|
21
21
|
Args:
|
|
22
|
+
enable_search (bool): Enable search functionality. Default is True.
|
|
23
|
+
enable_get_contents (bool): Enable get contents functionality. Default is True.
|
|
24
|
+
enable_find_similar (bool): Enable find similar functionality. Default is True.
|
|
25
|
+
enable_answer (bool): Enable answer generation. Default is True.
|
|
26
|
+
enable_research (bool): Enable research tool functionality. Default is False.
|
|
27
|
+
all (bool): Enable all tools. Overrides individual flags when True. Default is False.
|
|
22
28
|
text (bool): Retrieve text content from results. Default is True.
|
|
23
29
|
text_length_limit (int): Max length of text content per result. Default is 1000.
|
|
24
30
|
highlights (bool): Include highlighted snippets. Default is True.
|
|
25
|
-
answer (bool): Enable answer generation. Default is True.
|
|
26
|
-
research (bool): Enable research tool functionality. Default is True.
|
|
27
31
|
api_key (Optional[str]): Exa API key. Retrieved from `EXA_API_KEY` env variable if not provided.
|
|
28
32
|
num_results (Optional[int]): Default number of search results. Overrides individual searches if set.
|
|
29
33
|
start_crawl_date (Optional[str]): Include results crawled on/after this date (`YYYY-MM-DD`).
|
|
@@ -42,11 +46,12 @@ class ExaTools(Toolkit):
|
|
|
42
46
|
|
|
43
47
|
def __init__(
|
|
44
48
|
self,
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
49
|
+
enable_search: bool = True,
|
|
50
|
+
enable_get_contents: bool = True,
|
|
51
|
+
enable_find_similar: bool = True,
|
|
52
|
+
enable_answer: bool = True,
|
|
53
|
+
enable_research: bool = False,
|
|
54
|
+
all: bool = False,
|
|
50
55
|
text: bool = True,
|
|
51
56
|
text_length_limit: int = 1000,
|
|
52
57
|
highlights: bool = True,
|
|
@@ -96,15 +101,15 @@ class ExaTools(Toolkit):
|
|
|
96
101
|
self.research_model: Literal["exa-research", "exa-research-pro"] = research_model
|
|
97
102
|
|
|
98
103
|
tools: List[Any] = []
|
|
99
|
-
if
|
|
104
|
+
if all or enable_search:
|
|
100
105
|
tools.append(self.search_exa)
|
|
101
|
-
if
|
|
106
|
+
if all or enable_get_contents:
|
|
102
107
|
tools.append(self.get_contents)
|
|
103
|
-
if
|
|
108
|
+
if all or enable_find_similar:
|
|
104
109
|
tools.append(self.find_similar)
|
|
105
|
-
if
|
|
110
|
+
if all or enable_answer:
|
|
106
111
|
tools.append(self.exa_answer)
|
|
107
|
-
if
|
|
112
|
+
if all or enable_research:
|
|
108
113
|
tools.append(self.research)
|
|
109
114
|
|
|
110
115
|
super().__init__(name="exa", tools=tools, **kwargs)
|
|
@@ -353,14 +358,14 @@ class ExaTools(Toolkit):
|
|
|
353
358
|
else:
|
|
354
359
|
task_kwargs["output_infer_schema"] = True
|
|
355
360
|
|
|
356
|
-
task_result = self._execute_with_timeout(self.exa.research.create_task, **task_kwargs)
|
|
361
|
+
task_result = self._execute_with_timeout(self.exa.research.create_task, **task_kwargs) # type: ignore
|
|
357
362
|
task_id = task_result.id
|
|
358
363
|
|
|
359
364
|
if self.show_results:
|
|
360
365
|
log_info(f"Research task created with ID: {task_id}")
|
|
361
366
|
|
|
362
367
|
# Step 2: Poll until complete (using default polling settings)
|
|
363
|
-
task = self.exa.research.poll_task(task_id)
|
|
368
|
+
task = self.exa.research.poll_task(task_id) # type: ignore
|
|
364
369
|
|
|
365
370
|
# Step 3: Format and return results
|
|
366
371
|
result: Dict[str, Any] = {"data": task.data, "citations": {}}
|
agno/tools/fal.py
CHANGED
|
@@ -10,6 +10,7 @@ from agno.agent import Agent
|
|
|
10
10
|
from agno.media import ImageArtifact, VideoArtifact
|
|
11
11
|
from agno.team.team import Team
|
|
12
12
|
from agno.tools import Toolkit
|
|
13
|
+
from agno.tools.function import ToolResult
|
|
13
14
|
from agno.utils.log import log_info, logger
|
|
14
15
|
|
|
15
16
|
try:
|
|
@@ -23,16 +24,22 @@ class FalTools(Toolkit):
|
|
|
23
24
|
self,
|
|
24
25
|
api_key: Optional[str] = None,
|
|
25
26
|
model: str = "fal-ai/hunyuan-video",
|
|
27
|
+
enable_generate_media: bool = True,
|
|
28
|
+
enable_image_to_image: bool = False,
|
|
29
|
+
all: bool = False,
|
|
26
30
|
**kwargs,
|
|
27
31
|
):
|
|
28
|
-
self.api_key = api_key or getenv("
|
|
32
|
+
self.api_key = api_key or getenv("FAL_API_KEY")
|
|
29
33
|
if not self.api_key:
|
|
30
|
-
logger.error("
|
|
34
|
+
logger.error("FAL_API_KEY not set. Please set the FAL_API_KEY environment variable.")
|
|
31
35
|
self.model = model
|
|
32
36
|
self.seen_logs: set[str] = set()
|
|
33
37
|
|
|
34
38
|
tools = []
|
|
35
|
-
|
|
39
|
+
if all or enable_generate_media:
|
|
40
|
+
tools.append(self.generate_media)
|
|
41
|
+
if all or enable_image_to_image:
|
|
42
|
+
tools.append(self.image_to_image)
|
|
36
43
|
|
|
37
44
|
super().__init__(name="fal-tools", tools=tools, **kwargs)
|
|
38
45
|
|
|
@@ -44,14 +51,14 @@ class FalTools(Toolkit):
|
|
|
44
51
|
log_info(message)
|
|
45
52
|
self.seen_logs.add(message)
|
|
46
53
|
|
|
47
|
-
def generate_media(self, agent: Union[Agent, Team], prompt: str) ->
|
|
54
|
+
def generate_media(self, agent: Union[Agent, Team], prompt: str) -> ToolResult:
|
|
48
55
|
"""
|
|
49
56
|
Use this function to run a model with a given prompt.
|
|
50
57
|
|
|
51
58
|
Args:
|
|
52
59
|
prompt (str): A text description of the task.
|
|
53
60
|
Returns:
|
|
54
|
-
|
|
61
|
+
ToolResult: Contains the generated media and success message.
|
|
55
62
|
"""
|
|
56
63
|
try:
|
|
57
64
|
result = fal_client.subscribe(
|
|
@@ -65,32 +72,27 @@ class FalTools(Toolkit):
|
|
|
65
72
|
|
|
66
73
|
if "image" in result:
|
|
67
74
|
url = result.get("image", {}).get("url", "")
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
url=url,
|
|
72
|
-
)
|
|
75
|
+
image_artifact = ImageArtifact(
|
|
76
|
+
id=media_id,
|
|
77
|
+
url=url,
|
|
73
78
|
)
|
|
74
|
-
|
|
79
|
+
return ToolResult(content=f"Image generated successfully at {url}", images=[image_artifact])
|
|
75
80
|
elif "video" in result:
|
|
76
81
|
url = result.get("video", {}).get("url", "")
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
url=url,
|
|
81
|
-
)
|
|
82
|
+
video_artifact = VideoArtifact(
|
|
83
|
+
id=media_id,
|
|
84
|
+
url=url,
|
|
82
85
|
)
|
|
83
|
-
|
|
86
|
+
return ToolResult(content=f"Video generated successfully at {url}", videos=[video_artifact])
|
|
84
87
|
else:
|
|
85
88
|
logger.error(f"Unsupported type in result: {result}")
|
|
86
|
-
return f"Unsupported type in result: {result}"
|
|
89
|
+
return ToolResult(content=f"Unsupported type in result: {result}")
|
|
87
90
|
|
|
88
|
-
return f"{media_type.capitalize()} generated successfully at {url}"
|
|
89
91
|
except Exception as e:
|
|
90
92
|
logger.error(f"Failed to run model: {e}")
|
|
91
|
-
return f"Error: {e}"
|
|
93
|
+
return ToolResult(content=f"Error: {e}")
|
|
92
94
|
|
|
93
|
-
def image_to_image(self, agent: Union[Agent, Team], prompt: str, image_url: Optional[str] = None) ->
|
|
95
|
+
def image_to_image(self, agent: Union[Agent, Team], prompt: str, image_url: Optional[str] = None) -> ToolResult:
|
|
94
96
|
"""
|
|
95
97
|
Use this function to transform an input image based on a text prompt using the Fal AI image-to-image model.
|
|
96
98
|
The model takes an existing image and generates a new version modified according to your prompt.
|
|
@@ -101,7 +103,7 @@ class FalTools(Toolkit):
|
|
|
101
103
|
image_url (str): The URL of the image to use for the generation.
|
|
102
104
|
|
|
103
105
|
Returns:
|
|
104
|
-
|
|
106
|
+
ToolResult: Contains the generated image and success message.
|
|
105
107
|
"""
|
|
106
108
|
|
|
107
109
|
try:
|
|
@@ -113,15 +115,13 @@ class FalTools(Toolkit):
|
|
|
113
115
|
)
|
|
114
116
|
url = result.get("images", [{}])[0].get("url", "")
|
|
115
117
|
media_id = str(uuid4())
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
url=url,
|
|
120
|
-
)
|
|
118
|
+
image_artifact = ImageArtifact(
|
|
119
|
+
id=media_id,
|
|
120
|
+
url=url,
|
|
121
121
|
)
|
|
122
122
|
|
|
123
|
-
return f"Image generated successfully at {url}"
|
|
123
|
+
return ToolResult(content=f"Image generated successfully at {url}", images=[image_artifact])
|
|
124
124
|
|
|
125
125
|
except Exception as e:
|
|
126
126
|
logger.error(f"Failed to generate image: {e}")
|
|
127
|
-
return f"Error: {e}"
|
|
127
|
+
return ToolResult(content=f"Error: {e}")
|
agno/tools/file.py
CHANGED
|
@@ -10,22 +10,23 @@ class FileTools(Toolkit):
|
|
|
10
10
|
def __init__(
|
|
11
11
|
self,
|
|
12
12
|
base_dir: Optional[Path] = None,
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
13
|
+
enable_save_file: bool = True,
|
|
14
|
+
enable_read_file: bool = True,
|
|
15
|
+
enable_list_files: bool = True,
|
|
16
|
+
enable_search_files: bool = True,
|
|
17
|
+
all: bool = False,
|
|
17
18
|
**kwargs,
|
|
18
19
|
):
|
|
19
20
|
self.base_dir: Path = base_dir or Path.cwd()
|
|
20
21
|
|
|
21
22
|
tools: List[Any] = []
|
|
22
|
-
if
|
|
23
|
+
if all or enable_save_file:
|
|
23
24
|
tools.append(self.save_file)
|
|
24
|
-
if
|
|
25
|
+
if all or enable_read_file:
|
|
25
26
|
tools.append(self.read_file)
|
|
26
|
-
if
|
|
27
|
+
if all or enable_list_files:
|
|
27
28
|
tools.append(self.list_files)
|
|
28
|
-
if
|
|
29
|
+
if all or enable_search_files:
|
|
29
30
|
tools.append(self.search_files)
|
|
30
31
|
|
|
31
32
|
super().__init__(name="file_tools", tools=tools, **kwargs)
|
agno/tools/financial_datasets.py
CHANGED
|
@@ -11,29 +11,12 @@ class FinancialDatasetsTools(Toolkit):
|
|
|
11
11
|
def __init__(
|
|
12
12
|
self,
|
|
13
13
|
api_key: Optional[str] = None,
|
|
14
|
-
enable_financial_statements: bool = True,
|
|
15
|
-
enable_company_info: bool = True,
|
|
16
|
-
enable_market_data: bool = True,
|
|
17
|
-
enable_ownership_data: bool = True,
|
|
18
|
-
enable_news: bool = True,
|
|
19
|
-
enable_sec_filings: bool = True,
|
|
20
|
-
enable_crypto: bool = True,
|
|
21
|
-
enable_search: bool = True,
|
|
22
14
|
**kwargs,
|
|
23
15
|
):
|
|
24
|
-
"""
|
|
25
|
-
Initialize the Financial Datasets Tools with feature flags.
|
|
16
|
+
"""Initialize the Financial Datasets Tools.
|
|
26
17
|
|
|
27
18
|
Args:
|
|
28
19
|
api_key: API key for Financial Datasets API (optional, can be set via environment variable)
|
|
29
|
-
enable_financial_statements: Enable financial statement related functions (income statements, balance sheets, etc.)
|
|
30
|
-
enable_company_info: Enable company information related functions
|
|
31
|
-
enable_market_data: Enable market data related functions (stock prices, earnings, metrics)
|
|
32
|
-
enable_ownership_data: Enable ownership data related functions (insider trades, institutional ownership)
|
|
33
|
-
enable_news: Enable news related functions
|
|
34
|
-
enable_sec_filings: Enable SEC filings related functions
|
|
35
|
-
enable_crypto: Enable cryptocurrency related functions
|
|
36
|
-
enable_search: Enable search related functions
|
|
37
20
|
"""
|
|
38
21
|
|
|
39
22
|
self.api_key: Optional[str] = api_key or getenv("FINANCIAL_DATASETS_API_KEY")
|
|
@@ -44,32 +27,30 @@ class FinancialDatasetsTools(Toolkit):
|
|
|
44
27
|
|
|
45
28
|
self.base_url = "https://api.financialdatasets.ai"
|
|
46
29
|
|
|
47
|
-
tools: List[Any] = [
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
if enable_search:
|
|
72
|
-
tools.append(self.search_tickers)
|
|
30
|
+
tools: List[Any] = [
|
|
31
|
+
# Financial statements
|
|
32
|
+
self.get_income_statements,
|
|
33
|
+
self.get_balance_sheets,
|
|
34
|
+
self.get_cash_flow_statements,
|
|
35
|
+
self.get_segmented_financials,
|
|
36
|
+
self.get_financial_metrics,
|
|
37
|
+
# Company info
|
|
38
|
+
self.get_company_info,
|
|
39
|
+
# Market data
|
|
40
|
+
self.get_stock_prices,
|
|
41
|
+
self.get_earnings,
|
|
42
|
+
# Ownership data
|
|
43
|
+
self.get_insider_trades,
|
|
44
|
+
self.get_institutional_ownership,
|
|
45
|
+
# News
|
|
46
|
+
self.get_news,
|
|
47
|
+
# SEC filings
|
|
48
|
+
self.get_sec_filings,
|
|
49
|
+
# Crypto
|
|
50
|
+
self.get_crypto_prices,
|
|
51
|
+
# Search
|
|
52
|
+
self.search_tickers,
|
|
53
|
+
]
|
|
73
54
|
|
|
74
55
|
super().__init__(name="financial_datasets_tools", tools=tools, **kwargs)
|
|
75
56
|
|
agno/tools/firecrawl.py
CHANGED
|
@@ -6,7 +6,8 @@ from agno.tools import Toolkit
|
|
|
6
6
|
from agno.utils.log import logger
|
|
7
7
|
|
|
8
8
|
try:
|
|
9
|
-
from firecrawl import FirecrawlApp
|
|
9
|
+
from firecrawl import FirecrawlApp # type: ignore[attr-defined]
|
|
10
|
+
from firecrawl.types import ScrapeOptions
|
|
10
11
|
except ImportError:
|
|
11
12
|
raise ImportError("`firecrawl-py` not installed. Please install using `pip install firecrawl-py`")
|
|
12
13
|
|
|
@@ -24,26 +25,32 @@ class CustomJSONEncoder(json.JSONEncoder):
|
|
|
24
25
|
class FirecrawlTools(Toolkit):
|
|
25
26
|
"""
|
|
26
27
|
Firecrawl is a tool for scraping and crawling websites.
|
|
28
|
+
|
|
27
29
|
Args:
|
|
28
30
|
api_key (Optional[str]): The API key to use for the Firecrawl app.
|
|
31
|
+
enable_scrape (bool): Enable website scraping functionality. Default is True.
|
|
32
|
+
enable_crawl (bool): Enable website crawling functionality. Default is False.
|
|
33
|
+
enable_mapping (bool): Enable website mapping functionality. Default is False.
|
|
34
|
+
enable_search (bool): Enable web search functionality. Default is False.
|
|
35
|
+
all (bool): Enable all tools. Overrides individual flags when True. Default is False.
|
|
29
36
|
formats (Optional[List[str]]): The formats to use for the Firecrawl app.
|
|
30
37
|
limit (int): The maximum number of pages to crawl.
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
mapping (bool): Whether to map the website.
|
|
38
|
+
poll_interval (int): Polling interval for crawl operations.
|
|
39
|
+
search_params (Optional[Dict[str, Any]]): Parameters for search operations.
|
|
34
40
|
api_url (Optional[str]): The API URL to use for the Firecrawl app.
|
|
35
41
|
"""
|
|
36
42
|
|
|
37
43
|
def __init__(
|
|
38
44
|
self,
|
|
39
45
|
api_key: Optional[str] = None,
|
|
46
|
+
enable_scrape: bool = True,
|
|
47
|
+
enable_crawl: bool = False,
|
|
48
|
+
enable_mapping: bool = False,
|
|
49
|
+
enable_search: bool = False,
|
|
50
|
+
all: bool = False,
|
|
40
51
|
formats: Optional[List[str]] = None,
|
|
41
52
|
limit: int = 10,
|
|
42
53
|
poll_interval: int = 30,
|
|
43
|
-
scrape: bool = True,
|
|
44
|
-
crawl: bool = False,
|
|
45
|
-
mapping: bool = False,
|
|
46
|
-
search: bool = False,
|
|
47
54
|
search_params: Optional[Dict[str, Any]] = None,
|
|
48
55
|
api_url: Optional[str] = "https://api.firecrawl.dev",
|
|
49
56
|
**kwargs,
|
|
@@ -58,21 +65,14 @@ class FirecrawlTools(Toolkit):
|
|
|
58
65
|
self.app: FirecrawlApp = FirecrawlApp(api_key=self.api_key, api_url=api_url)
|
|
59
66
|
self.search_params = search_params
|
|
60
67
|
|
|
61
|
-
# Start with scrape by default. But if crawl is set, then set scrape to False.
|
|
62
|
-
if crawl:
|
|
63
|
-
scrape = False
|
|
64
|
-
mapping = False
|
|
65
|
-
elif not scrape:
|
|
66
|
-
crawl = True
|
|
67
|
-
|
|
68
68
|
tools: List[Any] = []
|
|
69
|
-
if
|
|
69
|
+
if all or enable_scrape:
|
|
70
70
|
tools.append(self.scrape_website)
|
|
71
|
-
if
|
|
71
|
+
if all or enable_crawl:
|
|
72
72
|
tools.append(self.crawl_website)
|
|
73
|
-
if
|
|
73
|
+
if all or enable_mapping:
|
|
74
74
|
tools.append(self.map_website)
|
|
75
|
-
if
|
|
75
|
+
if all or enable_search:
|
|
76
76
|
tools.append(self.search)
|
|
77
77
|
|
|
78
78
|
super().__init__(name="firecrawl_tools", tools=tools, **kwargs)
|
|
@@ -87,7 +87,7 @@ class FirecrawlTools(Toolkit):
|
|
|
87
87
|
if self.formats:
|
|
88
88
|
params["formats"] = self.formats
|
|
89
89
|
|
|
90
|
-
scrape_result = self.app.
|
|
90
|
+
scrape_result = self.app.scrape(url, **params)
|
|
91
91
|
return json.dumps(scrape_result.model_dump(), cls=CustomJSONEncoder)
|
|
92
92
|
|
|
93
93
|
def crawl_website(self, url: str, limit: Optional[int] = None) -> str:
|
|
@@ -108,7 +108,7 @@ class FirecrawlTools(Toolkit):
|
|
|
108
108
|
|
|
109
109
|
params["poll_interval"] = self.poll_interval
|
|
110
110
|
|
|
111
|
-
crawl_result = self.app.
|
|
111
|
+
crawl_result = self.app.crawl(url, **params)
|
|
112
112
|
return json.dumps(crawl_result.model_dump(), cls=CustomJSONEncoder)
|
|
113
113
|
|
|
114
114
|
def map_website(self, url: str) -> str:
|
|
@@ -118,7 +118,7 @@ class FirecrawlTools(Toolkit):
|
|
|
118
118
|
url (str): The URL to map.
|
|
119
119
|
|
|
120
120
|
"""
|
|
121
|
-
map_result = self.app.
|
|
121
|
+
map_result = self.app.map(url)
|
|
122
122
|
return json.dumps(map_result.model_dump(), cls=CustomJSONEncoder)
|
|
123
123
|
|
|
124
124
|
def search(self, query: str, limit: Optional[int] = None):
|
agno/tools/function.py
CHANGED
|
@@ -8,6 +8,7 @@ from packaging.version import Version
|
|
|
8
8
|
from pydantic import BaseModel, Field, validate_call
|
|
9
9
|
|
|
10
10
|
from agno.exceptions import AgentRunException
|
|
11
|
+
from agno.media import AudioArtifact, ImageArtifact, VideoArtifact
|
|
11
12
|
from agno.utils.log import log_debug, log_error, log_exception, log_warning
|
|
12
13
|
|
|
13
14
|
T = TypeVar("T")
|
|
@@ -84,8 +85,6 @@ class Function(BaseModel):
|
|
|
84
85
|
entrypoint: Optional[Callable] = None
|
|
85
86
|
# If True, the entrypoint processing is skipped and the Function is used as is.
|
|
86
87
|
skip_entrypoint_processing: bool = False
|
|
87
|
-
# If True, the arguments are sanitized before being passed to the function. (Deprecated)
|
|
88
|
-
sanitize_arguments: bool = False
|
|
89
88
|
# If True, the function call will show the result along with sending it to the model.
|
|
90
89
|
show_result: bool = False
|
|
91
90
|
# If True, the agent will stop after the function call.
|
|
@@ -123,6 +122,8 @@ class Function(BaseModel):
|
|
|
123
122
|
_agent: Optional[Any] = None
|
|
124
123
|
# The team that the function is associated with
|
|
125
124
|
_team: Optional[Any] = None
|
|
125
|
+
# The session state that the function is associated with
|
|
126
|
+
_session_state: Optional[Dict[str, Any]] = None
|
|
126
127
|
|
|
127
128
|
def to_dict(self) -> Dict[str, Any]:
|
|
128
129
|
return self.model_dump(
|
|
@@ -143,17 +144,19 @@ class Function(BaseModel):
|
|
|
143
144
|
type_hints = get_type_hints(c)
|
|
144
145
|
|
|
145
146
|
# If function has an the agent argument, remove the agent parameter from the type hints
|
|
146
|
-
if "agent" in sig.parameters:
|
|
147
|
+
if "agent" in sig.parameters and "agent" in type_hints:
|
|
147
148
|
del type_hints["agent"]
|
|
148
|
-
if "team" in sig.parameters:
|
|
149
|
+
if "team" in sig.parameters and "team" in type_hints:
|
|
149
150
|
del type_hints["team"]
|
|
151
|
+
if "session_state" in sig.parameters and "session_state" in type_hints:
|
|
152
|
+
del type_hints["session_state"]
|
|
150
153
|
# log_info(f"Type hints for {function_name}: {type_hints}")
|
|
151
154
|
|
|
152
155
|
# Filter out return type and only process parameters
|
|
153
156
|
param_type_hints = {
|
|
154
157
|
name: type_hints.get(name)
|
|
155
158
|
for name in sig.parameters
|
|
156
|
-
if name != "return" and name not in ["agent", "team", "self"]
|
|
159
|
+
if name != "return" and name not in ["agent", "team", "session_state", "self"]
|
|
157
160
|
}
|
|
158
161
|
|
|
159
162
|
# Parse docstring for parameters
|
|
@@ -180,14 +183,14 @@ class Function(BaseModel):
|
|
|
180
183
|
# See: https://platform.openai.com/docs/guides/structured-outputs/supported-schemas#all-fields-must-be-required
|
|
181
184
|
if strict:
|
|
182
185
|
parameters["required"] = [
|
|
183
|
-
name for name in parameters["properties"] if name not in ["agent", "team", "self"]
|
|
186
|
+
name for name in parameters["properties"] if name not in ["agent", "team", "session_state", "self"]
|
|
184
187
|
]
|
|
185
188
|
else:
|
|
186
189
|
# Mark a field as required if it has no default value (this would include optional fields)
|
|
187
190
|
parameters["required"] = [
|
|
188
191
|
name
|
|
189
192
|
for name, param in sig.parameters.items()
|
|
190
|
-
if param.default == param.empty and name
|
|
193
|
+
if param.default == param.empty and name not in ["agent", "team", "session_state", "self"]
|
|
191
194
|
]
|
|
192
195
|
|
|
193
196
|
# log_debug(f"JSON schema for {function_name}: {parameters}")
|
|
@@ -232,14 +235,16 @@ class Function(BaseModel):
|
|
|
232
235
|
type_hints = get_type_hints(self.entrypoint)
|
|
233
236
|
|
|
234
237
|
# If function has an the agent argument, remove the agent parameter from the type hints
|
|
235
|
-
if "agent" in sig.parameters:
|
|
238
|
+
if "agent" in sig.parameters and "agent" in type_hints:
|
|
236
239
|
del type_hints["agent"]
|
|
237
|
-
if "team" in sig.parameters:
|
|
240
|
+
if "team" in sig.parameters and "team" in type_hints:
|
|
238
241
|
del type_hints["team"]
|
|
242
|
+
if "session_state" in sig.parameters and "session_state" in type_hints:
|
|
243
|
+
del type_hints["session_state"]
|
|
239
244
|
# log_info(f"Type hints for {self.name}: {type_hints}")
|
|
240
245
|
|
|
241
246
|
# Filter out return type and only process parameters
|
|
242
|
-
excluded_params = ["return", "agent", "team", "self"]
|
|
247
|
+
excluded_params = ["return", "agent", "team", "session_state", "self"]
|
|
243
248
|
if self.requires_user_input and self.user_input_fields:
|
|
244
249
|
if len(self.user_input_fields) == 0:
|
|
245
250
|
excluded_params.extend(list(type_hints.keys()))
|
|
@@ -352,7 +357,7 @@ class Function(BaseModel):
|
|
|
352
357
|
def process_schema_for_strict(self):
|
|
353
358
|
self.parameters["additionalProperties"] = False
|
|
354
359
|
self.parameters["required"] = [
|
|
355
|
-
name for name in self.parameters["properties"] if name not in ["agent", "team", "self"]
|
|
360
|
+
name for name in self.parameters["properties"] if name not in ["agent", "team", "session_state", "self"]
|
|
356
361
|
]
|
|
357
362
|
|
|
358
363
|
def _get_cache_key(self, entrypoint_args: Dict[str, Any], call_args: Optional[Dict[str, Any]] = None) -> str:
|
|
@@ -365,6 +370,8 @@ class Function(BaseModel):
|
|
|
365
370
|
del copy_entrypoint_args["agent"]
|
|
366
371
|
if "team" in copy_entrypoint_args:
|
|
367
372
|
del copy_entrypoint_args["team"]
|
|
373
|
+
if "session_state" in copy_entrypoint_args:
|
|
374
|
+
del copy_entrypoint_args["session_state"]
|
|
368
375
|
args_str = str(copy_entrypoint_args)
|
|
369
376
|
|
|
370
377
|
kwargs_str = str(sorted((call_args or {}).items()))
|
|
@@ -425,6 +432,13 @@ class FunctionExecutionResult(BaseModel):
|
|
|
425
432
|
result: Optional[Any] = None
|
|
426
433
|
error: Optional[str] = None
|
|
427
434
|
|
|
435
|
+
updated_session_state: Optional[Dict[str, Any]] = None
|
|
436
|
+
|
|
437
|
+
# New fields for media artifacts
|
|
438
|
+
images: Optional[List[ImageArtifact]] = None
|
|
439
|
+
videos: Optional[List[VideoArtifact]] = None
|
|
440
|
+
audios: Optional[List[AudioArtifact]] = None
|
|
441
|
+
|
|
428
442
|
|
|
429
443
|
class FunctionCall(BaseModel):
|
|
430
444
|
"""Model for Function Calls"""
|
|
@@ -480,6 +494,9 @@ class FunctionCall(BaseModel):
|
|
|
480
494
|
# Check if the pre-hook has an team argument
|
|
481
495
|
if "team" in signature(self.function.pre_hook).parameters:
|
|
482
496
|
pre_hook_args["team"] = self.function._team
|
|
497
|
+
# Check if the pre-hook has an session_state argument
|
|
498
|
+
if "session_state" in signature(self.function.pre_hook).parameters:
|
|
499
|
+
pre_hook_args["session_state"] = self.function._session_state
|
|
483
500
|
# Check if the pre-hook has an fc argument
|
|
484
501
|
if "fc" in signature(self.function.pre_hook).parameters:
|
|
485
502
|
pre_hook_args["fc"] = self
|
|
@@ -505,6 +522,9 @@ class FunctionCall(BaseModel):
|
|
|
505
522
|
# Check if the post-hook has an team argument
|
|
506
523
|
if "team" in signature(self.function.post_hook).parameters:
|
|
507
524
|
post_hook_args["team"] = self.function._team
|
|
525
|
+
# Check if the post-hook has an session_state argument
|
|
526
|
+
if "session_state" in signature(self.function.post_hook).parameters:
|
|
527
|
+
post_hook_args["session_state"] = self.function._session_state
|
|
508
528
|
# Check if the post-hook has an fc argument
|
|
509
529
|
if "fc" in signature(self.function.post_hook).parameters:
|
|
510
530
|
post_hook_args["fc"] = self
|
|
@@ -528,6 +548,9 @@ class FunctionCall(BaseModel):
|
|
|
528
548
|
# Check if the entrypoint has an team argument
|
|
529
549
|
if "team" in signature(self.function.entrypoint).parameters: # type: ignore
|
|
530
550
|
entrypoint_args["team"] = self.function._team
|
|
551
|
+
# Check if the entrypoint has an session_state argument
|
|
552
|
+
if "session_state" in signature(self.function.entrypoint).parameters: # type: ignore
|
|
553
|
+
entrypoint_args["session_state"] = self.function._session_state
|
|
531
554
|
# Check if the entrypoint has an fc argument
|
|
532
555
|
if "fc" in signature(self.function.entrypoint).parameters: # type: ignore
|
|
533
556
|
entrypoint_args["fc"] = self
|
|
@@ -544,6 +567,9 @@ class FunctionCall(BaseModel):
|
|
|
544
567
|
# Check if the hook has an team argument
|
|
545
568
|
if "team" in signature(hook).parameters:
|
|
546
569
|
hook_args["team"] = self.function._team
|
|
570
|
+
# Check if the hook has an session_state argument
|
|
571
|
+
if "session_state" in signature(hook).parameters:
|
|
572
|
+
hook_args["session_state"] = self.function._session_state
|
|
547
573
|
|
|
548
574
|
if "name" in signature(hook).parameters:
|
|
549
575
|
hook_args["name"] = name
|
|
@@ -641,10 +667,11 @@ class FunctionCall(BaseModel):
|
|
|
641
667
|
execution_chain = self._build_nested_execution_chain(entrypoint_args=entrypoint_args)
|
|
642
668
|
result = execution_chain(self.function.name, self.function.entrypoint, self.arguments or {})
|
|
643
669
|
else:
|
|
644
|
-
|
|
645
|
-
|
|
646
|
-
|
|
647
|
-
|
|
670
|
+
result = self.function.entrypoint(**entrypoint_args, **self.arguments) # type: ignore
|
|
671
|
+
|
|
672
|
+
updated_session_state = None
|
|
673
|
+
if entrypoint_args.get("session_state") is not None:
|
|
674
|
+
updated_session_state = entrypoint_args.get("session_state")
|
|
648
675
|
|
|
649
676
|
# Handle generator case
|
|
650
677
|
if isgenerator(result):
|
|
@@ -670,7 +697,9 @@ class FunctionCall(BaseModel):
|
|
|
670
697
|
# Execute post-hook if it exists
|
|
671
698
|
self._handle_post_hook()
|
|
672
699
|
|
|
673
|
-
return FunctionExecutionResult(
|
|
700
|
+
return FunctionExecutionResult(
|
|
701
|
+
status="success", result=self.result, updated_session_state=updated_session_state
|
|
702
|
+
)
|
|
674
703
|
|
|
675
704
|
async def _handle_pre_hook_async(self):
|
|
676
705
|
"""Handles the async pre-hook for the function call."""
|
|
@@ -685,6 +714,9 @@ class FunctionCall(BaseModel):
|
|
|
685
714
|
# Check if the pre-hook has an team argument
|
|
686
715
|
if "team" in signature(self.function.pre_hook).parameters:
|
|
687
716
|
pre_hook_args["team"] = self.function._team
|
|
717
|
+
# Check if the pre-hook has an session_state argument
|
|
718
|
+
if "session_state" in signature(self.function.pre_hook).parameters:
|
|
719
|
+
pre_hook_args["session_state"] = self.function._session_state
|
|
688
720
|
# Check if the pre-hook has an fc argument
|
|
689
721
|
if "fc" in signature(self.function.pre_hook).parameters:
|
|
690
722
|
pre_hook_args["fc"] = self
|
|
@@ -711,6 +743,10 @@ class FunctionCall(BaseModel):
|
|
|
711
743
|
# Check if the post-hook has an team argument
|
|
712
744
|
if "team" in signature(self.function.post_hook).parameters:
|
|
713
745
|
post_hook_args["team"] = self.function._team
|
|
746
|
+
# Check if the post-hook has an session_state argument
|
|
747
|
+
if "session_state" in signature(self.function.post_hook).parameters:
|
|
748
|
+
post_hook_args["session_state"] = self.function._session_state
|
|
749
|
+
|
|
714
750
|
# Check if the post-hook has an fc argument
|
|
715
751
|
if "fc" in signature(self.function.post_hook).parameters:
|
|
716
752
|
post_hook_args["fc"] = self
|
|
@@ -839,6 +875,10 @@ class FunctionCall(BaseModel):
|
|
|
839
875
|
cache_file = self.function._get_cache_file_path(cache_key)
|
|
840
876
|
self.function._save_to_cache(cache_file, self.result)
|
|
841
877
|
|
|
878
|
+
updated_session_state = None
|
|
879
|
+
if entrypoint_args.get("session_state") is not None:
|
|
880
|
+
updated_session_state = entrypoint_args.get("session_state")
|
|
881
|
+
|
|
842
882
|
except AgentRunException as e:
|
|
843
883
|
log_debug(f"{e.__class__.__name__}: {e}")
|
|
844
884
|
self.error = str(e)
|
|
@@ -855,4 +895,15 @@ class FunctionCall(BaseModel):
|
|
|
855
895
|
else:
|
|
856
896
|
self._handle_post_hook()
|
|
857
897
|
|
|
858
|
-
return FunctionExecutionResult(
|
|
898
|
+
return FunctionExecutionResult(
|
|
899
|
+
status="success", result=self.result, updated_session_state=updated_session_state
|
|
900
|
+
)
|
|
901
|
+
|
|
902
|
+
|
|
903
|
+
class ToolResult(BaseModel):
|
|
904
|
+
"""Result from a tool that can include media artifacts."""
|
|
905
|
+
|
|
906
|
+
content: str
|
|
907
|
+
images: Optional[List[ImageArtifact]] = None
|
|
908
|
+
videos: Optional[List[VideoArtifact]] = None
|
|
909
|
+
audios: Optional[List[AudioArtifact]] = None
|