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/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
|
+
}
|
agno/eval/reliability.py
CHANGED
|
@@ -1,15 +1,17 @@
|
|
|
1
1
|
from dataclasses import asdict, dataclass, field
|
|
2
2
|
from os import getenv
|
|
3
|
-
from typing import TYPE_CHECKING, List, Optional
|
|
3
|
+
from typing import TYPE_CHECKING, Any, Dict, List, Optional
|
|
4
4
|
from uuid import uuid4
|
|
5
5
|
|
|
6
|
+
from agno.db.base import BaseDb
|
|
7
|
+
|
|
6
8
|
if TYPE_CHECKING:
|
|
7
9
|
from rich.console import Console
|
|
8
10
|
|
|
9
|
-
from agno.agent import
|
|
10
|
-
from agno.
|
|
11
|
-
from agno.eval.utils import
|
|
12
|
-
from agno.run.team import
|
|
11
|
+
from agno.agent import RunOutput
|
|
12
|
+
from agno.db.schemas.evals import EvalType
|
|
13
|
+
from agno.eval.utils import async_log_eval, log_eval_run, store_result_in_file
|
|
14
|
+
from agno.run.team import TeamRunOutput
|
|
13
15
|
from agno.utils.log import logger
|
|
14
16
|
|
|
15
17
|
|
|
@@ -46,9 +48,9 @@ class ReliabilityEval:
|
|
|
46
48
|
eval_id: str = field(default_factory=lambda: str(uuid4()))
|
|
47
49
|
|
|
48
50
|
# Agent response
|
|
49
|
-
agent_response: Optional[
|
|
51
|
+
agent_response: Optional[RunOutput] = None
|
|
50
52
|
# Team response
|
|
51
|
-
team_response: Optional[
|
|
53
|
+
team_response: Optional[TeamRunOutput] = None
|
|
52
54
|
# Expected tool calls
|
|
53
55
|
expected_tool_calls: Optional[List[str]] = None
|
|
54
56
|
# Result of the evaluation
|
|
@@ -60,8 +62,13 @@ class ReliabilityEval:
|
|
|
60
62
|
file_path_to_save_results: Optional[str] = None
|
|
61
63
|
# Enable debug logs
|
|
62
64
|
debug_mode: bool = getenv("AGNO_DEBUG", "false").lower() == "true"
|
|
63
|
-
#
|
|
64
|
-
|
|
65
|
+
# The database to store Evaluation results
|
|
66
|
+
db: Optional[BaseDb] = None
|
|
67
|
+
|
|
68
|
+
# Telemetry settings
|
|
69
|
+
# telemetry=True logs minimal telemetry for analytics
|
|
70
|
+
# This helps us improve our Evals and provide better support
|
|
71
|
+
telemetry: bool = True
|
|
65
72
|
|
|
66
73
|
def run(self, *, print_results: bool = False) -> Optional[ReliabilityResult]:
|
|
67
74
|
if self.agent_response is None and self.team_response is None:
|
|
@@ -100,15 +107,18 @@ class ReliabilityEval:
|
|
|
100
107
|
|
|
101
108
|
failed_tool_calls = []
|
|
102
109
|
passed_tool_calls = []
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
if
|
|
109
|
-
|
|
110
|
+
if not actual_tool_calls:
|
|
111
|
+
failed_tool_calls = self.expected_tool_calls or []
|
|
112
|
+
else:
|
|
113
|
+
for tool_call in actual_tool_calls: # type: ignore
|
|
114
|
+
tool_name = tool_call.get("function", {}).get("name")
|
|
115
|
+
if not tool_name:
|
|
116
|
+
continue
|
|
110
117
|
else:
|
|
111
|
-
|
|
118
|
+
if tool_name not in self.expected_tool_calls: # type: ignore
|
|
119
|
+
failed_tool_calls.append(tool_call.get("function", {}).get("name"))
|
|
120
|
+
else:
|
|
121
|
+
passed_tool_calls.append(tool_call.get("function", {}).get("name"))
|
|
112
122
|
|
|
113
123
|
self.result = ReliabilityResult(
|
|
114
124
|
eval_status="PASSED" if len(failed_tool_calls) == 0 else "FAILED",
|
|
@@ -130,7 +140,7 @@ class ReliabilityEval:
|
|
|
130
140
|
self.result.print_eval(console)
|
|
131
141
|
|
|
132
142
|
# Log results to the Agno platform if requested
|
|
133
|
-
if self.
|
|
143
|
+
if self.db:
|
|
134
144
|
if self.agent_response is not None:
|
|
135
145
|
agent_id = self.agent_response.agent_id
|
|
136
146
|
team_id = None
|
|
@@ -142,7 +152,12 @@ class ReliabilityEval:
|
|
|
142
152
|
model_id = self.team_response.model
|
|
143
153
|
model_provider = self.team_response.model_provider
|
|
144
154
|
|
|
155
|
+
eval_input = {
|
|
156
|
+
"expected_tool_calls": self.expected_tool_calls,
|
|
157
|
+
}
|
|
158
|
+
|
|
145
159
|
log_eval_run(
|
|
160
|
+
db=self.db,
|
|
146
161
|
run_id=self.eval_id, # type: ignore
|
|
147
162
|
run_data=asdict(self.result),
|
|
148
163
|
eval_type=EvalType.RELIABILITY,
|
|
@@ -151,6 +166,18 @@ class ReliabilityEval:
|
|
|
151
166
|
team_id=team_id,
|
|
152
167
|
model_id=model_id,
|
|
153
168
|
model_provider=model_provider,
|
|
169
|
+
eval_input=eval_input,
|
|
170
|
+
)
|
|
171
|
+
|
|
172
|
+
if self.telemetry:
|
|
173
|
+
from agno.api.evals import EvalRunCreate, create_eval_run_telemetry
|
|
174
|
+
|
|
175
|
+
create_eval_run_telemetry(
|
|
176
|
+
eval_run=EvalRunCreate(
|
|
177
|
+
run_id=self.eval_id,
|
|
178
|
+
eval_type=EvalType.RELIABILITY,
|
|
179
|
+
data=self._get_telemetry_data(),
|
|
180
|
+
),
|
|
154
181
|
)
|
|
155
182
|
|
|
156
183
|
logger.debug(f"*********** Evaluation End: {self.eval_id} ***********")
|
|
@@ -223,7 +250,7 @@ class ReliabilityEval:
|
|
|
223
250
|
self.result.print_eval(console)
|
|
224
251
|
|
|
225
252
|
# Log results to the Agno platform if requested
|
|
226
|
-
if self.
|
|
253
|
+
if self.db:
|
|
227
254
|
if self.agent_response is not None:
|
|
228
255
|
agent_id = self.agent_response.agent_id
|
|
229
256
|
team_id = None
|
|
@@ -235,7 +262,12 @@ class ReliabilityEval:
|
|
|
235
262
|
model_id = self.team_response.model
|
|
236
263
|
model_provider = self.team_response.model_provider
|
|
237
264
|
|
|
238
|
-
|
|
265
|
+
eval_input = {
|
|
266
|
+
"expected_tool_calls": self.expected_tool_calls,
|
|
267
|
+
}
|
|
268
|
+
|
|
269
|
+
await async_log_eval(
|
|
270
|
+
db=self.db,
|
|
239
271
|
run_id=self.eval_id, # type: ignore
|
|
240
272
|
run_data=asdict(self.result),
|
|
241
273
|
eval_type=EvalType.RELIABILITY,
|
|
@@ -244,7 +276,28 @@ class ReliabilityEval:
|
|
|
244
276
|
team_id=team_id,
|
|
245
277
|
model_id=model_id,
|
|
246
278
|
model_provider=model_provider,
|
|
279
|
+
eval_input=eval_input,
|
|
280
|
+
)
|
|
281
|
+
|
|
282
|
+
if self.telemetry:
|
|
283
|
+
from agno.api.evals import EvalRunCreate, async_create_eval_run_telemetry
|
|
284
|
+
|
|
285
|
+
await async_create_eval_run_telemetry(
|
|
286
|
+
eval_run=EvalRunCreate(
|
|
287
|
+
run_id=self.eval_id,
|
|
288
|
+
eval_type=EvalType.RELIABILITY,
|
|
289
|
+
data=self._get_telemetry_data(),
|
|
290
|
+
),
|
|
247
291
|
)
|
|
248
292
|
|
|
249
293
|
logger.debug(f"*********** Evaluation End: {self.eval_id} ***********")
|
|
250
294
|
return self.result
|
|
295
|
+
|
|
296
|
+
def _get_telemetry_data(self) -> Dict[str, Any]:
|
|
297
|
+
"""Get the telemetry data for the evaluation"""
|
|
298
|
+
return {
|
|
299
|
+
"team_id": self.team_response.team_id if self.team_response else None,
|
|
300
|
+
"agent_id": self.agent_response.agent_id if self.agent_response else None,
|
|
301
|
+
"model_id": self.agent_response.model if self.agent_response else None,
|
|
302
|
+
"model_provider": self.agent_response.model_provider if self.agent_response else None,
|
|
303
|
+
}
|
agno/eval/utils.py
CHANGED
|
@@ -2,8 +2,8 @@ from dataclasses import asdict
|
|
|
2
2
|
from pathlib import Path
|
|
3
3
|
from typing import TYPE_CHECKING, Optional, Union
|
|
4
4
|
|
|
5
|
-
from agno.
|
|
6
|
-
from agno.
|
|
5
|
+
from agno.db.base import BaseDb
|
|
6
|
+
from agno.db.schemas.evals import EvalRunRecord, EvalType
|
|
7
7
|
from agno.utils.log import log_debug, logger
|
|
8
8
|
|
|
9
9
|
if TYPE_CHECKING:
|
|
@@ -13,61 +13,71 @@ if TYPE_CHECKING:
|
|
|
13
13
|
|
|
14
14
|
|
|
15
15
|
def log_eval_run(
|
|
16
|
+
db: BaseDb,
|
|
16
17
|
run_id: str,
|
|
17
18
|
run_data: dict,
|
|
18
19
|
eval_type: EvalType,
|
|
20
|
+
eval_input: dict,
|
|
19
21
|
agent_id: Optional[str] = None,
|
|
20
22
|
model_id: Optional[str] = None,
|
|
21
23
|
model_provider: Optional[str] = None,
|
|
22
24
|
name: Optional[str] = None,
|
|
23
|
-
|
|
25
|
+
evaluated_component_name: Optional[str] = None,
|
|
24
26
|
team_id: Optional[str] = None,
|
|
27
|
+
workflow_id: Optional[str] = None,
|
|
25
28
|
) -> None:
|
|
26
29
|
"""Call the API to create an evaluation run."""
|
|
27
30
|
|
|
28
31
|
try:
|
|
29
|
-
create_eval_run(
|
|
30
|
-
|
|
32
|
+
db.create_eval_run(
|
|
33
|
+
EvalRunRecord(
|
|
31
34
|
run_id=run_id,
|
|
32
35
|
eval_type=eval_type,
|
|
33
36
|
eval_data=run_data,
|
|
37
|
+
eval_input=eval_input,
|
|
34
38
|
agent_id=agent_id,
|
|
35
39
|
model_id=model_id,
|
|
36
40
|
model_provider=model_provider,
|
|
37
41
|
name=name,
|
|
38
|
-
|
|
42
|
+
evaluated_component_name=evaluated_component_name,
|
|
39
43
|
team_id=team_id,
|
|
44
|
+
workflow_id=workflow_id,
|
|
40
45
|
)
|
|
41
46
|
)
|
|
42
47
|
except Exception as e:
|
|
43
48
|
log_debug(f"Could not create agent event: {e}")
|
|
44
49
|
|
|
45
50
|
|
|
46
|
-
async def
|
|
51
|
+
async def async_log_eval(
|
|
52
|
+
db: BaseDb,
|
|
47
53
|
run_id: str,
|
|
48
54
|
run_data: dict,
|
|
49
55
|
eval_type: EvalType,
|
|
56
|
+
eval_input: dict,
|
|
50
57
|
agent_id: Optional[str] = None,
|
|
51
58
|
model_id: Optional[str] = None,
|
|
52
59
|
model_provider: Optional[str] = None,
|
|
53
60
|
name: Optional[str] = None,
|
|
54
|
-
|
|
61
|
+
evaluated_component_name: Optional[str] = None,
|
|
55
62
|
team_id: Optional[str] = None,
|
|
63
|
+
workflow_id: Optional[str] = None,
|
|
56
64
|
) -> None:
|
|
57
|
-
"""
|
|
65
|
+
"""Call the API to create an evaluation run."""
|
|
58
66
|
|
|
59
67
|
try:
|
|
60
|
-
|
|
61
|
-
|
|
68
|
+
db.create_eval_run(
|
|
69
|
+
EvalRunRecord(
|
|
62
70
|
run_id=run_id,
|
|
63
71
|
eval_type=eval_type,
|
|
64
72
|
eval_data=run_data,
|
|
73
|
+
eval_input=eval_input,
|
|
65
74
|
agent_id=agent_id,
|
|
66
75
|
model_id=model_id,
|
|
67
76
|
model_provider=model_provider,
|
|
68
|
-
team_id=team_id,
|
|
69
77
|
name=name,
|
|
70
|
-
|
|
78
|
+
evaluated_component_name=evaluated_component_name,
|
|
79
|
+
team_id=team_id,
|
|
80
|
+
workflow_id=workflow_id,
|
|
71
81
|
)
|
|
72
82
|
)
|
|
73
83
|
except Exception as e:
|
|
@@ -4,9 +4,9 @@ from typing import Optional, Union
|
|
|
4
4
|
|
|
5
5
|
import requests
|
|
6
6
|
|
|
7
|
-
from agno.agent.agent import Agent,
|
|
7
|
+
from agno.agent.agent import Agent, RunOutput
|
|
8
8
|
from agno.media import Audio, File, Image, Video
|
|
9
|
-
from agno.team.team import Team,
|
|
9
|
+
from agno.team.team import Team, TeamRunOutput
|
|
10
10
|
from agno.utils.log import log_info, log_warning
|
|
11
11
|
|
|
12
12
|
try:
|
|
@@ -115,8 +115,8 @@ class DiscordClient:
|
|
|
115
115
|
""")
|
|
116
116
|
if self.agent:
|
|
117
117
|
self.agent.additional_context = additional_context
|
|
118
|
-
agent_response:
|
|
119
|
-
message_text,
|
|
118
|
+
agent_response: RunOutput = await self.agent.arun(
|
|
119
|
+
input=message_text,
|
|
120
120
|
user_id=message_user_id,
|
|
121
121
|
session_id=str(thread.id),
|
|
122
122
|
images=[Image(url=message_image)] if message_image else None,
|
|
@@ -127,8 +127,8 @@ class DiscordClient:
|
|
|
127
127
|
await self._handle_response_in_thread(agent_response, thread)
|
|
128
128
|
elif self.team:
|
|
129
129
|
self.team.additional_context = additional_context
|
|
130
|
-
team_response:
|
|
131
|
-
message_text,
|
|
130
|
+
team_response: TeamRunOutput = await self.team.arun(
|
|
131
|
+
input=message_text,
|
|
132
132
|
user_id=message_user_id,
|
|
133
133
|
session_id=str(thread.id),
|
|
134
134
|
images=[Image(url=message_image)] if message_image else None,
|
|
@@ -139,8 +139,8 @@ class DiscordClient:
|
|
|
139
139
|
await self._handle_response_in_thread(team_response, thread)
|
|
140
140
|
|
|
141
141
|
async def handle_hitl(
|
|
142
|
-
self, run_response:
|
|
143
|
-
) ->
|
|
142
|
+
self, run_response: RunOutput, thread: Union[discord.Thread, discord.TextChannel]
|
|
143
|
+
) -> RunOutput:
|
|
144
144
|
"""Handles optional Human-In-The-Loop interaction."""
|
|
145
145
|
if run_response.is_paused:
|
|
146
146
|
for tool in run_response.tools_requiring_confirmation:
|
|
@@ -157,9 +157,9 @@ class DiscordClient:
|
|
|
157
157
|
return run_response
|
|
158
158
|
|
|
159
159
|
async def _handle_response_in_thread(
|
|
160
|
-
self, response: Union[
|
|
160
|
+
self, response: Union[RunOutput, TeamRunOutput], thread: Union[discord.TextChannel, discord.Thread]
|
|
161
161
|
):
|
|
162
|
-
if isinstance(response,
|
|
162
|
+
if isinstance(response, RunOutput):
|
|
163
163
|
response = await self.handle_hitl(response, thread)
|
|
164
164
|
|
|
165
165
|
if response.reasoning_content:
|
agno/knowledge/__init__.py
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
from typing import List, Optional
|
|
2
2
|
|
|
3
|
-
from agno.
|
|
4
|
-
from agno.document.
|
|
3
|
+
from agno.knowledge.chunking.strategy import ChunkingStrategy
|
|
4
|
+
from agno.knowledge.document.base import Document
|
|
5
5
|
from agno.models.base import Model
|
|
6
6
|
from agno.models.defaults import DEFAULT_OPENAI_MODEL_ID
|
|
7
7
|
from agno.models.message import Message
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
from typing import List
|
|
2
2
|
|
|
3
|
-
from agno.
|
|
4
|
-
from agno.document.
|
|
3
|
+
from agno.knowledge.chunking.strategy import ChunkingStrategy
|
|
4
|
+
from agno.knowledge.document.base import Document
|
|
5
5
|
|
|
6
6
|
|
|
7
7
|
class DocumentChunking(ChunkingStrategy):
|
|
@@ -1,13 +1,13 @@
|
|
|
1
1
|
from typing import List
|
|
2
2
|
|
|
3
|
-
from agno.
|
|
4
|
-
from agno.document.
|
|
3
|
+
from agno.knowledge.chunking.strategy import ChunkingStrategy
|
|
4
|
+
from agno.knowledge.document.base import Document
|
|
5
5
|
|
|
6
6
|
|
|
7
7
|
class FixedSizeChunking(ChunkingStrategy):
|
|
8
8
|
"""Chunking strategy that splits text into fixed-size chunks with optional overlap"""
|
|
9
9
|
|
|
10
|
-
def __init__(self, chunk_size: int =
|
|
10
|
+
def __init__(self, chunk_size: int = 100, overlap: int = 0):
|
|
11
11
|
# overlap must be less than chunk size
|
|
12
12
|
if overlap >= chunk_size:
|
|
13
13
|
raise ValueError(f"Invalid parameters: overlap ({overlap}) must be less than chunk size ({chunk_size}).")
|
|
@@ -8,8 +8,8 @@ try:
|
|
|
8
8
|
except ImportError:
|
|
9
9
|
raise ImportError("`unstructured` not installed. Please install it using `pip install unstructured markdown`")
|
|
10
10
|
|
|
11
|
-
from agno.
|
|
12
|
-
from agno.document.
|
|
11
|
+
from agno.knowledge.chunking.strategy import ChunkingStrategy
|
|
12
|
+
from agno.knowledge.document.base import Document
|
|
13
13
|
|
|
14
14
|
|
|
15
15
|
class MarkdownChunking(ChunkingStrategy):
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import warnings
|
|
2
2
|
from typing import List
|
|
3
3
|
|
|
4
|
-
from agno.
|
|
5
|
-
from agno.document.
|
|
4
|
+
from agno.knowledge.chunking.strategy import ChunkingStrategy
|
|
5
|
+
from agno.knowledge.document.base import Document
|
|
6
6
|
|
|
7
7
|
|
|
8
8
|
class RecursiveChunking(ChunkingStrategy):
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
from typing import List
|
|
2
2
|
|
|
3
|
-
from agno.
|
|
4
|
-
from agno.document.
|
|
3
|
+
from agno.knowledge.chunking.strategy import ChunkingStrategy
|
|
4
|
+
from agno.knowledge.document.base import Document
|
|
5
5
|
|
|
6
6
|
|
|
7
7
|
class RowChunking(ChunkingStrategy):
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
from typing import List, Optional
|
|
2
|
+
|
|
3
|
+
from agno.knowledge.chunking.strategy import ChunkingStrategy
|
|
4
|
+
from agno.knowledge.document.base import Document
|
|
5
|
+
from agno.knowledge.embedder.base import Embedder
|
|
6
|
+
from agno.knowledge.embedder.openai import OpenAIEmbedder
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
class SemanticChunking(ChunkingStrategy):
|
|
10
|
+
"""Chunking strategy that splits text into semantic chunks using chonkie"""
|
|
11
|
+
|
|
12
|
+
def __init__(self, embedder: Optional[Embedder] = None, chunk_size: int = 5000, similarity_threshold: float = 0.5):
|
|
13
|
+
self.embedder = embedder or OpenAIEmbedder(id="text-embedding-3-small") # type: ignore
|
|
14
|
+
self.chunk_size = chunk_size
|
|
15
|
+
self.similarity_threshold = similarity_threshold
|
|
16
|
+
self.chunker = None # Will be initialized lazily when needed
|
|
17
|
+
|
|
18
|
+
def _initialize_chunker(self):
|
|
19
|
+
"""Lazily initialize the chunker with chonkie dependency."""
|
|
20
|
+
if self.chunker is None:
|
|
21
|
+
try:
|
|
22
|
+
from chonkie import SemanticChunker
|
|
23
|
+
except ImportError:
|
|
24
|
+
raise ImportError(
|
|
25
|
+
"`chonkie` is required for semantic chunking. "
|
|
26
|
+
"Please install it using `pip install chonkie` to use SemanticChunking."
|
|
27
|
+
)
|
|
28
|
+
|
|
29
|
+
self.chunker = SemanticChunker(
|
|
30
|
+
embedding_model=self.embedder.id, # type: ignore
|
|
31
|
+
chunk_size=self.chunk_size,
|
|
32
|
+
threshold=self.similarity_threshold,
|
|
33
|
+
)
|
|
34
|
+
|
|
35
|
+
def chunk(self, document: Document) -> List[Document]:
|
|
36
|
+
"""Split document into semantic chunks using chonkie"""
|
|
37
|
+
if not document.content:
|
|
38
|
+
return [document]
|
|
39
|
+
|
|
40
|
+
# Ensure chunker is initialized (will raise ImportError if chonkie is missing)
|
|
41
|
+
self._initialize_chunker()
|
|
42
|
+
|
|
43
|
+
# Use chonkie to split into semantic chunks
|
|
44
|
+
if self.chunker is None:
|
|
45
|
+
raise RuntimeError("Chunker failed to initialize")
|
|
46
|
+
|
|
47
|
+
chunks = self.chunker.chunk(self.clean_text(document.content))
|
|
48
|
+
|
|
49
|
+
# Convert chunks to Documents
|
|
50
|
+
chunked_documents: List[Document] = []
|
|
51
|
+
for i, chunk in enumerate(chunks, 1):
|
|
52
|
+
meta_data = document.meta_data.copy()
|
|
53
|
+
meta_data["chunk"] = i
|
|
54
|
+
chunk_id = f"{document.id}_{i}" if document.id else None
|
|
55
|
+
meta_data["chunk_size"] = len(chunk.text)
|
|
56
|
+
|
|
57
|
+
chunked_documents.append(Document(id=chunk_id, name=document.name, meta_data=meta_data, content=chunk.text))
|
|
58
|
+
|
|
59
|
+
return chunked_documents
|