agno 1.8.1__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 +2778 -4123
- 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/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/google/gemini.py +100 -42
- 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 +121 -23
- agno/models/openai/responses.py +178 -105
- 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 +2961 -4253
- 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 +8 -8
- 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 +61 -61
- 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 +45 -61
- 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 +10 -8
- 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/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 +334 -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 -702
- 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.1.dist-info/METADATA +0 -982
- agno-1.8.1.dist-info/RECORD +0 -566
- agno-1.8.1.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.1.dist-info → agno-2.0.0a1.dist-info}/WHEEL +0 -0
- {agno-1.8.1.dist-info → agno-2.0.0a1.dist-info}/licenses/LICENSE +0 -0
- {agno-1.8.1.dist-info → agno-2.0.0a1.dist-info}/top_level.txt +0 -0
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
|
agno/tools/giphy.py
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import os
|
|
2
1
|
import uuid
|
|
2
|
+
from os import getenv
|
|
3
3
|
from typing import Any, List, Optional, Union
|
|
4
4
|
|
|
5
5
|
import httpx
|
|
@@ -8,6 +8,7 @@ from agno.agent import Agent
|
|
|
8
8
|
from agno.media import ImageArtifact
|
|
9
9
|
from agno.team.team import Team
|
|
10
10
|
from agno.tools import Toolkit
|
|
11
|
+
from agno.tools.function import ToolResult
|
|
11
12
|
from agno.utils.log import logger
|
|
12
13
|
|
|
13
14
|
|
|
@@ -16,6 +17,8 @@ class GiphyTools(Toolkit):
|
|
|
16
17
|
self,
|
|
17
18
|
api_key: Optional[str] = None,
|
|
18
19
|
limit: int = 1,
|
|
20
|
+
enable_search_gifs: bool = True,
|
|
21
|
+
all: bool = False,
|
|
19
22
|
**kwargs,
|
|
20
23
|
):
|
|
21
24
|
"""Initialize Giphy tools.
|
|
@@ -23,27 +26,29 @@ class GiphyTools(Toolkit):
|
|
|
23
26
|
Args:
|
|
24
27
|
api_key: Giphy API key. Defaults to GIPHY_API_KEY environment variable.
|
|
25
28
|
limit: Number of GIFs to return. Defaults to 1.
|
|
26
|
-
|
|
29
|
+
enable_search_gifs: Whether to enable GIF search functionality. Defaults to True.
|
|
30
|
+
all: Enable all functions. Defaults to False.
|
|
27
31
|
"""
|
|
28
|
-
self.api_key = api_key or
|
|
32
|
+
self.api_key = api_key or getenv("GIPHY_API_KEY")
|
|
29
33
|
if not self.api_key:
|
|
30
34
|
logger.error("No Giphy API key provided")
|
|
31
35
|
|
|
32
36
|
self.limit: int = limit
|
|
33
37
|
|
|
34
38
|
tools: List[Any] = []
|
|
35
|
-
|
|
39
|
+
if all or enable_search_gifs:
|
|
40
|
+
tools.append(self.search_gifs)
|
|
36
41
|
|
|
37
42
|
super().__init__(name="giphy_tools", tools=tools, **kwargs)
|
|
38
43
|
|
|
39
|
-
def search_gifs(self, agent: Union[Agent, Team], query: str) ->
|
|
44
|
+
def search_gifs(self, agent: Union[Agent, Team], query: str) -> ToolResult:
|
|
40
45
|
"""Find a GIPHY gif
|
|
41
46
|
|
|
42
47
|
Args:
|
|
43
48
|
query (str): A text description of the required gif.
|
|
44
49
|
|
|
45
50
|
Returns:
|
|
46
|
-
|
|
51
|
+
ToolResult: Contains the found GIF images or error message.
|
|
47
52
|
"""
|
|
48
53
|
|
|
49
54
|
base_url = "https://api.giphy.com/v1/gifs/search"
|
|
@@ -60,6 +65,8 @@ class GiphyTools(Toolkit):
|
|
|
60
65
|
# Extract the GIF URLs
|
|
61
66
|
data = response.json()
|
|
62
67
|
gif_urls = []
|
|
68
|
+
image_artifacts = []
|
|
69
|
+
|
|
63
70
|
for gif in data.get("data", []):
|
|
64
71
|
images = gif.get("images", {})
|
|
65
72
|
original_image = images["original"]
|
|
@@ -69,13 +76,18 @@ class GiphyTools(Toolkit):
|
|
|
69
76
|
alt_text = gif["alt_text"]
|
|
70
77
|
gif_urls.append(gif_url)
|
|
71
78
|
|
|
72
|
-
|
|
79
|
+
# Create ImageArtifact for the GIF
|
|
80
|
+
image_artifact = ImageArtifact(id=media_id, url=gif_url, alt_text=alt_text, revised_prompt=query)
|
|
81
|
+
image_artifacts.append(image_artifact)
|
|
73
82
|
|
|
74
|
-
|
|
83
|
+
if image_artifacts:
|
|
84
|
+
return ToolResult(content=f"Found {len(gif_urls)} GIF(s): {gif_urls}", images=image_artifacts)
|
|
85
|
+
else:
|
|
86
|
+
return ToolResult(content="No gifs found")
|
|
75
87
|
|
|
76
88
|
except httpx.HTTPStatusError as e:
|
|
77
89
|
logger.error(f"HTTP error occurred: {e.response.status_code} - {e.response.text}")
|
|
90
|
+
return ToolResult(content=f"HTTP error occurred: {e.response.status_code}")
|
|
78
91
|
except Exception as e:
|
|
79
92
|
logger.error(f"An error occurred: {e}")
|
|
80
|
-
|
|
81
|
-
return "No gifs found"
|
|
93
|
+
return ToolResult(content=f"An error occurred: {e}")
|