agno 1.8.1__py3-none-any.whl → 2.0.0__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 +3143 -4170
- agno/api/agent.py +11 -67
- agno/api/api.py +5 -46
- agno/api/evals.py +8 -19
- 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 +11 -66
- 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 +1743 -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 +1432 -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 +882 -0
- agno/db/in_memory/utils.py +172 -0
- agno/db/json/__init__.py +3 -0
- agno/db/json/json_db.py +1045 -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 +1416 -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 +297 -0
- agno/db/postgres/__init__.py +3 -0
- agno/db/postgres/postgres.py +1710 -0
- agno/db/postgres/schemas.py +124 -0
- agno/db/postgres/utils.py +280 -0
- agno/db/redis/__init__.py +3 -0
- agno/db/redis/redis.py +1367 -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 +1712 -0
- agno/db/singlestore/utils.py +326 -0
- agno/db/sqlite/__init__.py +3 -0
- agno/db/sqlite/schemas.py +119 -0
- agno/db/sqlite/sqlite.py +1676 -0
- agno/db/sqlite/utils.py +268 -0
- agno/db/utils.py +88 -0
- agno/eval/__init__.py +14 -0
- agno/eval/accuracy.py +154 -48
- 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 +15 -11
- 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 +1551 -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 +47 -65
- agno/knowledge/reader/docx_reader.py +83 -0
- agno/{document → knowledge}/reader/firecrawl_reader.py +42 -21
- agno/{document → knowledge}/reader/json_reader.py +30 -9
- agno/{document → knowledge}/reader/markdown_reader.py +58 -9
- agno/{document → knowledge}/reader/pdf_reader.py +71 -126
- agno/knowledge/reader/reader_factory.py +268 -0
- agno/knowledge/reader/s3_reader.py +101 -0
- agno/{document → knowledge}/reader/text_reader.py +31 -10
- agno/knowledge/reader/url_reader.py +128 -0
- agno/knowledge/reader/web_search_reader.py +366 -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 +269 -268
- 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 +131 -131
- agno/models/aws/bedrock.py +110 -182
- agno/models/aws/claude.py +64 -18
- agno/models/azure/ai_foundry.py +73 -23
- agno/models/base.py +346 -290
- agno/models/cerebras/cerebras.py +84 -27
- agno/models/cohere/chat.py +106 -98
- agno/models/google/gemini.py +105 -46
- 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 +46 -151
- 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 +85 -47
- agno/models/openai/chat.py +154 -37
- 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 +15 -9
- 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 +497 -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 +77 -33
- 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 +32 -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 +29 -0
- agno/os/mcp.py +235 -0
- agno/os/router.py +1400 -0
- agno/os/routers/__init__.py +3 -0
- agno/os/routers/evals/__init__.py +3 -0
- agno/os/routers/evals/evals.py +393 -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 +850 -0
- agno/os/routers/knowledge/schemas.py +118 -0
- agno/os/routers/memory/__init__.py +3 -0
- agno/os/routers/memory/memory.py +410 -0
- agno/os/routers/memory/schemas.py +58 -0
- agno/os/routers/metrics/__init__.py +3 -0
- agno/os/routers/metrics/metrics.py +178 -0
- agno/os/routers/metrics/schemas.py +47 -0
- agno/os/routers/session/__init__.py +3 -0
- agno/os/routers/session/session.py +536 -0
- agno/os/schema.py +945 -0
- agno/{app/playground → os}/settings.py +7 -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/agent.py +633 -0
- agno/run/base.py +53 -77
- agno/run/cancel.py +81 -0
- agno/run/team.py +243 -96
- agno/run/workflow.py +550 -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 +3260 -4824
- 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 +43 -23
- agno/tools/browserbase.py +13 -4
- agno/tools/calcom.py +12 -10
- agno/tools/calculator.py +10 -27
- agno/tools/cartesia.py +20 -17
- 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 +22 -12
- agno/tools/daytona.py +13 -16
- agno/tools/decorator.py +6 -3
- agno/tools/desi_vocal.py +17 -8
- 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 +36 -29
- agno/tools/email.py +4 -1
- agno/tools/evm.py +7 -1
- agno/tools/exa.py +19 -14
- agno/tools/fal.py +30 -30
- agno/tools/file.py +9 -8
- agno/tools/financial_datasets.py +25 -44
- agno/tools/firecrawl.py +22 -22
- agno/tools/function.py +127 -18
- agno/tools/giphy.py +23 -11
- 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 +19 -34
- agno/tools/linkup.py +5 -1
- agno/tools/local_file_system.py +8 -5
- agno/tools/lumalab.py +32 -20
- agno/tools/mcp.py +1 -2
- 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 +33 -15
- agno/tools/models/gemini.py +59 -32
- agno/tools/models/groq.py +30 -23
- agno/tools/models/nebius.py +28 -12
- agno/tools/models_labs.py +40 -16
- 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 +58 -32
- agno/tools/openbb.py +12 -11
- agno/tools/opencv.py +63 -47
- 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 +55 -42
- 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 +100 -123
- agno/utils/gemini.py +32 -2
- agno/utils/knowledge.py +29 -0
- agno/utils/log.py +54 -4
- agno/utils/mcp.py +68 -10
- agno/utils/media.py +39 -0
- agno/utils/message.py +12 -1
- agno/utils/models/aws_claude.py +1 -1
- agno/utils/models/claude.py +47 -4
- agno/utils/models/cohere.py +1 -1
- agno/utils/models/mistral.py +8 -7
- agno/utils/models/schema_utils.py +3 -3
- agno/utils/models/watsonx.py +1 -1
- agno/utils/openai.py +1 -1
- agno/utils/pprint.py +33 -32
- agno/utils/print_response/agent.py +779 -0
- agno/utils/print_response/team.py +1669 -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/streamlit.py +481 -0
- 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} +207 -49
- agno/workflow/{v2/steps.py → steps.py} +147 -66
- agno/workflow/types.py +482 -0
- agno/workflow/workflow.py +2410 -696
- agno-2.0.0.dist-info/METADATA +494 -0
- agno-2.0.0.dist-info/RECORD +515 -0
- agno-2.0.0.dist-info/licenses/LICENSE +201 -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/response.py +0 -467
- 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-1.8.1.dist-info/licenses/LICENSE +0 -375
- /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.0.dist-info}/WHEEL +0 -0
- {agno-1.8.1.dist-info → agno-2.0.0.dist-info}/top_level.txt +0 -0
agno/eval/accuracy.py
CHANGED
|
@@ -1,14 +1,15 @@
|
|
|
1
1
|
from dataclasses import asdict, dataclass, field
|
|
2
2
|
from os import getenv
|
|
3
3
|
from textwrap import dedent
|
|
4
|
-
from typing import TYPE_CHECKING, Callable, List, Optional, Union
|
|
4
|
+
from typing import TYPE_CHECKING, Any, Callable, Dict, List, Optional, Union
|
|
5
5
|
from uuid import uuid4
|
|
6
6
|
|
|
7
7
|
from pydantic import BaseModel, Field
|
|
8
8
|
|
|
9
9
|
from agno.agent import Agent
|
|
10
|
-
from agno.
|
|
11
|
-
from agno.
|
|
10
|
+
from agno.db.base import BaseDb
|
|
11
|
+
from agno.db.schemas.evals import EvalType
|
|
12
|
+
from agno.eval.utils import async_log_eval, log_eval_run, store_result_in_file
|
|
12
13
|
from agno.exceptions import EvalError
|
|
13
14
|
from agno.models.base import Model
|
|
14
15
|
from agno.team.team import Team
|
|
@@ -96,11 +97,18 @@ class AccuracyResult:
|
|
|
96
97
|
title_justify="center",
|
|
97
98
|
)
|
|
98
99
|
summary_table.add_row("Number of Runs", f"{len(self.results)}")
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
100
|
+
|
|
101
|
+
if self.avg_score is not None:
|
|
102
|
+
summary_table.add_row("Average Score", f"{self.avg_score:.2f}")
|
|
103
|
+
if self.mean_score is not None:
|
|
104
|
+
summary_table.add_row("Mean Score", f"{self.mean_score:.2f}")
|
|
105
|
+
if self.min_score is not None:
|
|
106
|
+
summary_table.add_row("Minimum Score", f"{self.min_score:.2f}")
|
|
107
|
+
if self.max_score is not None:
|
|
108
|
+
summary_table.add_row("Maximum Score", f"{self.max_score:.2f}")
|
|
109
|
+
if self.std_dev_score is not None:
|
|
110
|
+
summary_table.add_row("Standard Deviation", f"{self.std_dev_score:.2f}")
|
|
111
|
+
|
|
104
112
|
console.print(summary_table)
|
|
105
113
|
|
|
106
114
|
def print_results(self, console: Optional["Console"] = None):
|
|
@@ -167,8 +175,13 @@ class AccuracyEval:
|
|
|
167
175
|
file_path_to_save_results: Optional[str] = None
|
|
168
176
|
# Enable debug logs
|
|
169
177
|
debug_mode: bool = getenv("AGNO_DEBUG", "false").lower() == "true"
|
|
170
|
-
#
|
|
171
|
-
|
|
178
|
+
# The database to store Evaluation results
|
|
179
|
+
db: Optional[BaseDb] = None
|
|
180
|
+
|
|
181
|
+
# Telemetry settings
|
|
182
|
+
# telemetry=True logs minimal telemetry for analytics
|
|
183
|
+
# This helps us improve our Evals and provide better support
|
|
184
|
+
telemetry: bool = True
|
|
172
185
|
|
|
173
186
|
def get_evaluator_agent(self) -> Agent:
|
|
174
187
|
"""Return the evaluator agent. If not provided, build it based on the evaluator fields and default instructions."""
|
|
@@ -235,7 +248,7 @@ You are an expert judge tasked with comparing the quality of an AI Agent’s out
|
|
|
235
248
|
{additional_guidelines}{additional_context}
|
|
236
249
|
Remember: You must only compare the agent_output to the expected_output. The expected_output is correct as it was provided by the user.
|
|
237
250
|
""",
|
|
238
|
-
|
|
251
|
+
output_schema=AccuracyAgentResponse,
|
|
239
252
|
structured_outputs=True,
|
|
240
253
|
)
|
|
241
254
|
|
|
@@ -344,9 +357,9 @@ Remember: You must only compare the agent_output to the expected_output. The exp
|
|
|
344
357
|
live_log.update(status)
|
|
345
358
|
|
|
346
359
|
if self.agent is not None:
|
|
347
|
-
output = self.agent.run(
|
|
360
|
+
output = self.agent.run(input=eval_input).content
|
|
348
361
|
elif self.team is not None:
|
|
349
|
-
output = self.team.run(
|
|
362
|
+
output = self.team.run(input=eval_input).content
|
|
350
363
|
|
|
351
364
|
if not output:
|
|
352
365
|
logger.error(f"Failed to generate a valid answer on iteration {i + 1}: {output}")
|
|
@@ -398,22 +411,31 @@ Remember: You must only compare the agent_output to the expected_output. The exp
|
|
|
398
411
|
if self.print_summary or print_summary:
|
|
399
412
|
self.result.print_summary(console)
|
|
400
413
|
|
|
401
|
-
# Log results to the Agno
|
|
414
|
+
# Log results to the Agno DB if requested
|
|
402
415
|
if self.agent is not None:
|
|
403
|
-
agent_id = self.agent.
|
|
416
|
+
agent_id = self.agent.id
|
|
404
417
|
team_id = None
|
|
405
418
|
model_id = self.agent.model.id if self.agent.model is not None else None
|
|
406
419
|
model_provider = self.agent.model.provider if self.agent.model is not None else None
|
|
407
|
-
|
|
420
|
+
evaluated_component_name = self.agent.name
|
|
408
421
|
elif self.team is not None:
|
|
409
422
|
agent_id = None
|
|
410
|
-
team_id = self.team.
|
|
423
|
+
team_id = self.team.id
|
|
411
424
|
model_id = self.team.model.id if self.team.model is not None else None
|
|
412
425
|
model_provider = self.team.model.provider if self.team.model is not None else None
|
|
413
|
-
|
|
426
|
+
evaluated_component_name = self.team.name
|
|
427
|
+
|
|
428
|
+
if self.db:
|
|
429
|
+
log_eval_input = {
|
|
430
|
+
"additional_guidelines": self.additional_guidelines,
|
|
431
|
+
"additional_context": self.additional_context,
|
|
432
|
+
"num_iterations": self.num_iterations,
|
|
433
|
+
"expected_output": self.expected_output,
|
|
434
|
+
"input": self.input,
|
|
435
|
+
}
|
|
414
436
|
|
|
415
|
-
if self.monitoring:
|
|
416
437
|
log_eval_run(
|
|
438
|
+
db=self.db,
|
|
417
439
|
run_id=self.eval_id, # type: ignore
|
|
418
440
|
run_data=asdict(self.result),
|
|
419
441
|
eval_type=EvalType.ACCURACY,
|
|
@@ -422,7 +444,19 @@ Remember: You must only compare the agent_output to the expected_output. The exp
|
|
|
422
444
|
model_id=model_id,
|
|
423
445
|
model_provider=model_provider,
|
|
424
446
|
name=self.name if self.name is not None else None,
|
|
425
|
-
|
|
447
|
+
evaluated_component_name=evaluated_component_name,
|
|
448
|
+
eval_input=log_eval_input,
|
|
449
|
+
)
|
|
450
|
+
|
|
451
|
+
if self.telemetry:
|
|
452
|
+
from agno.api.evals import EvalRunCreate, create_eval_run_telemetry
|
|
453
|
+
|
|
454
|
+
create_eval_run_telemetry(
|
|
455
|
+
eval_run=EvalRunCreate(
|
|
456
|
+
run_id=self.eval_id,
|
|
457
|
+
eval_type=EvalType.ACCURACY,
|
|
458
|
+
data=self._get_telemetry_data(),
|
|
459
|
+
),
|
|
426
460
|
)
|
|
427
461
|
|
|
428
462
|
logger.debug(f"*********** Evaluation {self.eval_id} Finished ***********")
|
|
@@ -464,10 +498,10 @@ Remember: You must only compare the agent_output to the expected_output. The exp
|
|
|
464
498
|
live_log.update(status)
|
|
465
499
|
|
|
466
500
|
if self.agent is not None:
|
|
467
|
-
response = await self.agent.arun(
|
|
501
|
+
response = await self.agent.arun(input=eval_input)
|
|
468
502
|
output = response.content
|
|
469
503
|
elif self.team is not None:
|
|
470
|
-
response = await self.team.arun(
|
|
504
|
+
response = await self.team.arun(input=eval_input) # type: ignore
|
|
471
505
|
output = response.content
|
|
472
506
|
|
|
473
507
|
if not output:
|
|
@@ -520,19 +554,48 @@ Remember: You must only compare the agent_output to the expected_output. The exp
|
|
|
520
554
|
if self.print_summary or print_summary:
|
|
521
555
|
self.result.print_summary(console)
|
|
522
556
|
|
|
523
|
-
|
|
524
|
-
|
|
525
|
-
|
|
557
|
+
if self.agent is not None:
|
|
558
|
+
agent_id = self.agent.id
|
|
559
|
+
team_id = None
|
|
560
|
+
model_id = self.agent.model.id if self.agent.model is not None else None
|
|
561
|
+
model_provider = self.agent.model.provider if self.agent.model is not None else None
|
|
562
|
+
evaluated_component_name = self.agent.name
|
|
563
|
+
elif self.team is not None:
|
|
564
|
+
agent_id = None
|
|
565
|
+
team_id = self.team.id
|
|
566
|
+
model_id = self.team.model.id if self.team.model is not None else None
|
|
567
|
+
model_provider = self.team.model.provider if self.team.model is not None else None
|
|
568
|
+
evaluated_component_name = self.team.name
|
|
569
|
+
|
|
570
|
+
# Log results to the Agno DB if requested
|
|
571
|
+
if self.db:
|
|
572
|
+
log_eval_input = {
|
|
573
|
+
"additional_guidelines": self.additional_guidelines,
|
|
574
|
+
"additional_context": self.additional_context,
|
|
575
|
+
"num_iterations": self.num_iterations,
|
|
576
|
+
"expected_output": self.expected_output,
|
|
577
|
+
"input": self.input,
|
|
578
|
+
}
|
|
579
|
+
await async_log_eval(
|
|
580
|
+
db=self.db,
|
|
526
581
|
run_id=self.eval_id, # type: ignore
|
|
527
582
|
run_data=asdict(self.result),
|
|
528
583
|
eval_type=EvalType.ACCURACY,
|
|
529
|
-
agent_id=
|
|
530
|
-
model_id=
|
|
531
|
-
model_provider=
|
|
532
|
-
if self.agent is not None and self.agent.model is not None
|
|
533
|
-
else None,
|
|
584
|
+
agent_id=agent_id,
|
|
585
|
+
model_id=model_id,
|
|
586
|
+
model_provider=model_provider,
|
|
534
587
|
name=self.name if self.name is not None else None,
|
|
535
|
-
|
|
588
|
+
evaluated_component_name=evaluated_component_name,
|
|
589
|
+
team_id=team_id,
|
|
590
|
+
workflow_id=None,
|
|
591
|
+
eval_input=log_eval_input,
|
|
592
|
+
)
|
|
593
|
+
|
|
594
|
+
if self.telemetry:
|
|
595
|
+
from agno.api.evals import EvalRunCreate, async_create_eval_run_telemetry
|
|
596
|
+
|
|
597
|
+
await async_create_eval_run_telemetry(
|
|
598
|
+
eval_run=EvalRunCreate(run_id=self.eval_id, eval_type=EvalType.ACCURACY),
|
|
536
599
|
)
|
|
537
600
|
|
|
538
601
|
logger.debug(f"*********** Evaluation {self.eval_id} Finished ***********")
|
|
@@ -596,28 +659,37 @@ Remember: You must only compare the agent_output to the expected_output. The exp
|
|
|
596
659
|
eval_id=self.eval_id,
|
|
597
660
|
result=self.result,
|
|
598
661
|
)
|
|
599
|
-
# Log results to the Agno
|
|
600
|
-
if self.
|
|
662
|
+
# Log results to the Agno DB if requested
|
|
663
|
+
if self.db:
|
|
601
664
|
if self.agent is not None:
|
|
602
|
-
agent_id = self.agent.
|
|
665
|
+
agent_id = self.agent.id
|
|
603
666
|
team_id = None
|
|
604
667
|
model_id = self.agent.model.id if self.agent.model is not None else None
|
|
605
668
|
model_provider = self.agent.model.provider if self.agent.model is not None else None
|
|
606
|
-
|
|
669
|
+
evaluated_component_name = self.agent.name
|
|
607
670
|
elif self.team is not None:
|
|
608
671
|
agent_id = None
|
|
609
|
-
team_id = self.team.
|
|
672
|
+
team_id = self.team.id
|
|
610
673
|
model_id = self.team.model.id if self.team.model is not None else None
|
|
611
674
|
model_provider = self.team.model.provider if self.team.model is not None else None
|
|
612
|
-
|
|
675
|
+
evaluated_component_name = self.team.name
|
|
613
676
|
else:
|
|
614
677
|
agent_id = None
|
|
615
678
|
team_id = None
|
|
616
679
|
model_id = None
|
|
617
680
|
model_provider = None
|
|
618
|
-
|
|
681
|
+
evaluated_component_name = None
|
|
682
|
+
|
|
683
|
+
log_eval_input = {
|
|
684
|
+
"additional_guidelines": self.additional_guidelines,
|
|
685
|
+
"additional_context": self.additional_context,
|
|
686
|
+
"num_iterations": self.num_iterations,
|
|
687
|
+
"expected_output": self.expected_output,
|
|
688
|
+
"input": self.input,
|
|
689
|
+
}
|
|
619
690
|
|
|
620
691
|
log_eval_run(
|
|
692
|
+
db=self.db,
|
|
621
693
|
run_id=self.eval_id, # type: ignore
|
|
622
694
|
run_data=asdict(self.result),
|
|
623
695
|
eval_type=EvalType.ACCURACY,
|
|
@@ -626,7 +698,20 @@ Remember: You must only compare the agent_output to the expected_output. The exp
|
|
|
626
698
|
team_id=team_id,
|
|
627
699
|
model_id=model_id,
|
|
628
700
|
model_provider=model_provider,
|
|
629
|
-
|
|
701
|
+
evaluated_component_name=evaluated_component_name,
|
|
702
|
+
workflow_id=None,
|
|
703
|
+
eval_input=log_eval_input,
|
|
704
|
+
)
|
|
705
|
+
|
|
706
|
+
if self.telemetry:
|
|
707
|
+
from agno.api.evals import EvalRunCreate, create_eval_run_telemetry
|
|
708
|
+
|
|
709
|
+
create_eval_run_telemetry(
|
|
710
|
+
eval_run=EvalRunCreate(
|
|
711
|
+
run_id=self.eval_id,
|
|
712
|
+
eval_type=EvalType.ACCURACY,
|
|
713
|
+
data=self._get_telemetry_data(),
|
|
714
|
+
),
|
|
630
715
|
)
|
|
631
716
|
|
|
632
717
|
logger.debug(f"*********** Evaluation End: {self.eval_id} ***********")
|
|
@@ -690,22 +775,31 @@ Remember: You must only compare the agent_output to the expected_output. The exp
|
|
|
690
775
|
eval_id=self.eval_id,
|
|
691
776
|
result=self.result,
|
|
692
777
|
)
|
|
693
|
-
# Log results to the Agno
|
|
694
|
-
if self.
|
|
778
|
+
# Log results to the Agno DB if requested
|
|
779
|
+
if self.db:
|
|
695
780
|
if self.agent is not None:
|
|
696
|
-
agent_id = self.agent.
|
|
781
|
+
agent_id = self.agent.id
|
|
697
782
|
team_id = None
|
|
698
783
|
model_id = self.agent.model.id if self.agent.model is not None else None
|
|
699
784
|
model_provider = self.agent.model.provider if self.agent.model is not None else None
|
|
700
|
-
|
|
785
|
+
evaluated_component_name = self.agent.name
|
|
701
786
|
elif self.team is not None:
|
|
702
787
|
agent_id = None
|
|
703
|
-
team_id = self.team.
|
|
788
|
+
team_id = self.team.id
|
|
704
789
|
model_id = self.team.model.id if self.team.model is not None else None
|
|
705
790
|
model_provider = self.team.model.provider if self.team.model is not None else None
|
|
706
|
-
|
|
707
|
-
|
|
708
|
-
|
|
791
|
+
evaluated_component_name = self.team.name
|
|
792
|
+
|
|
793
|
+
log_eval_input = {
|
|
794
|
+
"additional_guidelines": self.additional_guidelines,
|
|
795
|
+
"additional_context": self.additional_context,
|
|
796
|
+
"num_iterations": self.num_iterations,
|
|
797
|
+
"expected_output": self.expected_output,
|
|
798
|
+
"input": self.input,
|
|
799
|
+
}
|
|
800
|
+
|
|
801
|
+
await async_log_eval(
|
|
802
|
+
db=self.db,
|
|
709
803
|
run_id=self.eval_id, # type: ignore
|
|
710
804
|
run_data=asdict(self.result),
|
|
711
805
|
eval_type=EvalType.ACCURACY,
|
|
@@ -714,8 +808,20 @@ Remember: You must only compare the agent_output to the expected_output. The exp
|
|
|
714
808
|
team_id=team_id,
|
|
715
809
|
model_id=model_id,
|
|
716
810
|
model_provider=model_provider,
|
|
717
|
-
|
|
811
|
+
evaluated_component_name=evaluated_component_name,
|
|
812
|
+
workflow_id=None,
|
|
813
|
+
eval_input=log_eval_input,
|
|
718
814
|
)
|
|
719
815
|
|
|
720
816
|
logger.debug(f"*********** Evaluation End: {self.eval_id} ***********")
|
|
721
817
|
return self.result
|
|
818
|
+
|
|
819
|
+
def _get_telemetry_data(self) -> Dict[str, Any]:
|
|
820
|
+
"""Get the telemetry data for the evaluation"""
|
|
821
|
+
return {
|
|
822
|
+
"agent_id": self.agent.id if self.agent else None,
|
|
823
|
+
"team_id": self.team.id if self.team else None,
|
|
824
|
+
"model_id": self.agent.model.id if self.agent and self.agent.model else None,
|
|
825
|
+
"model_provider": self.agent.model.provider if self.agent and self.agent.model else None,
|
|
826
|
+
"num_iterations": self.num_iterations,
|
|
827
|
+
}
|
agno/eval/performance.py
CHANGED
|
@@ -3,11 +3,12 @@ import gc
|
|
|
3
3
|
import tracemalloc
|
|
4
4
|
from dataclasses import dataclass, field
|
|
5
5
|
from os import getenv
|
|
6
|
-
from typing import TYPE_CHECKING, Callable, List, Optional
|
|
6
|
+
from typing import TYPE_CHECKING, Any, Callable, Dict, List, Optional
|
|
7
7
|
from uuid import uuid4
|
|
8
8
|
|
|
9
|
-
from agno.
|
|
10
|
-
from agno.
|
|
9
|
+
from agno.db.base import BaseDb
|
|
10
|
+
from agno.db.schemas.evals import EvalType
|
|
11
|
+
from agno.eval.utils import async_log_eval, log_eval_run, store_result_in_file
|
|
11
12
|
from agno.utils.log import log_debug, set_log_level_to_debug, set_log_level_to_info
|
|
12
13
|
from agno.utils.timer import Timer
|
|
13
14
|
|
|
@@ -195,7 +196,7 @@ class PerformanceEval:
|
|
|
195
196
|
# Evaluation UUID
|
|
196
197
|
eval_id: str = field(default_factory=lambda: str(uuid4()))
|
|
197
198
|
# Number of warm-up runs (not included in final stats)
|
|
198
|
-
warmup_runs: int = 10
|
|
199
|
+
warmup_runs: Optional[int] = 10
|
|
199
200
|
# Number of measured iterations
|
|
200
201
|
num_iterations: int = 50
|
|
201
202
|
# Result of the evaluation
|
|
@@ -210,12 +211,23 @@ class PerformanceEval:
|
|
|
210
211
|
# Number of memory allocations to track
|
|
211
212
|
top_n_memory_allocations: int = 5
|
|
212
213
|
|
|
214
|
+
# Agent and Team information
|
|
215
|
+
agent_id: Optional[str] = None
|
|
216
|
+
team_id: Optional[str] = None
|
|
217
|
+
model_id: Optional[str] = None
|
|
218
|
+
model_provider: Optional[str] = None
|
|
219
|
+
|
|
213
220
|
# If set, results will be saved in the given file path
|
|
214
221
|
file_path_to_save_results: Optional[str] = None
|
|
215
222
|
# Enable debug logs
|
|
216
223
|
debug_mode: bool = getenv("AGNO_DEBUG", "false").lower() == "true"
|
|
217
|
-
#
|
|
218
|
-
|
|
224
|
+
# The database to store Evaluation results
|
|
225
|
+
db: Optional[BaseDb] = None
|
|
226
|
+
|
|
227
|
+
# Telemetry settings
|
|
228
|
+
# telemetry=True logs minimal telemetry for analytics
|
|
229
|
+
# This helps us improve our Evals and provide better support
|
|
230
|
+
telemetry: bool = True
|
|
219
231
|
|
|
220
232
|
def _measure_time(self) -> float:
|
|
221
233
|
"""Measure execution time for a single run."""
|
|
@@ -495,12 +507,13 @@ class PerformanceEval:
|
|
|
495
507
|
console = Console()
|
|
496
508
|
with Live(console=console, transient=True) as live_log:
|
|
497
509
|
# 1. Do optional warm-up runs.
|
|
498
|
-
|
|
499
|
-
|
|
500
|
-
|
|
501
|
-
|
|
502
|
-
|
|
503
|
-
|
|
510
|
+
if self.warmup_runs is not None:
|
|
511
|
+
for i in range(self.warmup_runs):
|
|
512
|
+
status = Status(f"Warm-up run {i + 1}/{self.warmup_runs}...", spinner="dots", speed=1.0)
|
|
513
|
+
live_log.update(status)
|
|
514
|
+
self.func() # Simply run the function without measuring
|
|
515
|
+
self._set_log_level() # Set log level incase function changed it
|
|
516
|
+
status.stop()
|
|
504
517
|
|
|
505
518
|
# 2. Measure runtime
|
|
506
519
|
if self.measure_runtime:
|
|
@@ -570,13 +583,33 @@ class PerformanceEval:
|
|
|
570
583
|
self.result.print_summary(console, measure_memory=self.measure_memory, measure_runtime=self.measure_runtime)
|
|
571
584
|
|
|
572
585
|
# 7. Log results to the Agno platform if requested
|
|
573
|
-
if self.
|
|
586
|
+
if self.db:
|
|
587
|
+
eval_input = {
|
|
588
|
+
"num_iterations": self.num_iterations,
|
|
589
|
+
"warmup_runs": self.warmup_runs,
|
|
590
|
+
}
|
|
591
|
+
|
|
574
592
|
log_eval_run(
|
|
593
|
+
db=self.db,
|
|
575
594
|
run_id=self.eval_id, # type: ignore
|
|
576
595
|
run_data=self._parse_eval_run_data(),
|
|
577
596
|
eval_type=EvalType.PERFORMANCE,
|
|
578
597
|
name=self.name if self.name is not None else None,
|
|
579
|
-
|
|
598
|
+
evaluated_component_name=self.func.__name__,
|
|
599
|
+
agent_id=self.agent_id,
|
|
600
|
+
team_id=self.team_id,
|
|
601
|
+
model_id=self.model_id,
|
|
602
|
+
model_provider=self.model_provider,
|
|
603
|
+
eval_input=eval_input,
|
|
604
|
+
)
|
|
605
|
+
|
|
606
|
+
if self.telemetry:
|
|
607
|
+
from agno.api.evals import EvalRunCreate, create_eval_run_telemetry
|
|
608
|
+
|
|
609
|
+
create_eval_run_telemetry(
|
|
610
|
+
eval_run=EvalRunCreate(
|
|
611
|
+
run_id=self.eval_id, eval_type=EvalType.PERFORMANCE, data=self._get_telemetry_data()
|
|
612
|
+
),
|
|
580
613
|
)
|
|
581
614
|
|
|
582
615
|
log_debug(f"*********** Evaluation End: {self.eval_id} ***********")
|
|
@@ -617,12 +650,13 @@ class PerformanceEval:
|
|
|
617
650
|
console = Console()
|
|
618
651
|
with Live(console=console, transient=True) as live_log:
|
|
619
652
|
# 1. Do optional warm-up runs.
|
|
620
|
-
|
|
621
|
-
|
|
622
|
-
|
|
623
|
-
|
|
624
|
-
|
|
625
|
-
|
|
653
|
+
if self.warmup_runs is not None:
|
|
654
|
+
for i in range(self.warmup_runs):
|
|
655
|
+
status = Status(f"Warm-up run {i + 1}/{self.warmup_runs}...", spinner="dots", speed=1.0)
|
|
656
|
+
live_log.update(status)
|
|
657
|
+
await self.func() # Simply run the function without measuring
|
|
658
|
+
self._set_log_level() # Set log level incase function changed it
|
|
659
|
+
status.stop()
|
|
626
660
|
|
|
627
661
|
# 2. Measure runtime
|
|
628
662
|
if self.measure_runtime:
|
|
@@ -692,14 +726,45 @@ class PerformanceEval:
|
|
|
692
726
|
self.result.print_summary(console, measure_memory=self.measure_memory, measure_runtime=self.measure_runtime)
|
|
693
727
|
|
|
694
728
|
# 7. Log results to the Agno platform if requested
|
|
695
|
-
if self.
|
|
696
|
-
|
|
729
|
+
if self.db:
|
|
730
|
+
eval_input = {
|
|
731
|
+
"num_iterations": self.num_iterations,
|
|
732
|
+
"warmup_runs": self.warmup_runs,
|
|
733
|
+
}
|
|
734
|
+
|
|
735
|
+
await async_log_eval(
|
|
736
|
+
db=self.db,
|
|
697
737
|
run_id=self.eval_id, # type: ignore
|
|
698
738
|
run_data=self._parse_eval_run_data(),
|
|
699
739
|
eval_type=EvalType.PERFORMANCE,
|
|
700
740
|
name=self.name if self.name is not None else None,
|
|
701
|
-
|
|
741
|
+
evaluated_component_name=self.func.__name__,
|
|
742
|
+
agent_id=self.agent_id,
|
|
743
|
+
team_id=self.team_id,
|
|
744
|
+
model_id=self.model_id,
|
|
745
|
+
model_provider=self.model_provider,
|
|
746
|
+
eval_input=eval_input,
|
|
747
|
+
)
|
|
748
|
+
|
|
749
|
+
if self.telemetry:
|
|
750
|
+
from agno.api.evals import EvalRunCreate, async_create_eval_run_telemetry
|
|
751
|
+
|
|
752
|
+
await async_create_eval_run_telemetry(
|
|
753
|
+
eval_run=EvalRunCreate(
|
|
754
|
+
run_id=self.eval_id, eval_type=EvalType.PERFORMANCE, data=self._get_telemetry_data()
|
|
755
|
+
),
|
|
702
756
|
)
|
|
703
757
|
|
|
704
758
|
log_debug(f"*********** Evaluation End: {self.eval_id} ***********")
|
|
705
759
|
return self.result
|
|
760
|
+
|
|
761
|
+
def _get_telemetry_data(self) -> Dict[str, Any]:
|
|
762
|
+
"""Get the telemetry data for the evaluation"""
|
|
763
|
+
return {
|
|
764
|
+
"model_id": self.model_id,
|
|
765
|
+
"model_provider": self.model_provider,
|
|
766
|
+
"num_iterations": self.num_iterations,
|
|
767
|
+
"warmup_runs": self.warmup_runs,
|
|
768
|
+
"measure_memory": self.measure_memory,
|
|
769
|
+
"measure_runtime": self.measure_runtime,
|
|
770
|
+
}
|