agno 0.1.2__py3-none-any.whl → 2.3.13__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- agno/__init__.py +8 -0
- agno/agent/__init__.py +44 -5
- agno/agent/agent.py +10531 -2975
- agno/api/agent.py +14 -53
- agno/api/api.py +7 -46
- agno/api/evals.py +22 -0
- agno/api/os.py +17 -0
- agno/api/routes.py +6 -25
- agno/api/schemas/__init__.py +9 -0
- agno/api/schemas/agent.py +6 -9
- agno/api/schemas/evals.py +16 -0
- agno/api/schemas/os.py +14 -0
- agno/api/schemas/team.py +10 -10
- agno/api/schemas/utils.py +21 -0
- agno/api/schemas/workflows.py +16 -0
- agno/api/settings.py +53 -0
- agno/api/team.py +22 -26
- 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/compression/__init__.py +3 -0
- agno/compression/manager.py +247 -0
- agno/culture/__init__.py +3 -0
- agno/culture/manager.py +956 -0
- agno/db/__init__.py +24 -0
- agno/db/async_postgres/__init__.py +3 -0
- agno/db/base.py +946 -0
- agno/db/dynamo/__init__.py +3 -0
- agno/db/dynamo/dynamo.py +2781 -0
- agno/db/dynamo/schemas.py +442 -0
- agno/db/dynamo/utils.py +743 -0
- agno/db/firestore/__init__.py +3 -0
- agno/db/firestore/firestore.py +2379 -0
- agno/db/firestore/schemas.py +181 -0
- agno/db/firestore/utils.py +376 -0
- agno/db/gcs_json/__init__.py +3 -0
- agno/db/gcs_json/gcs_json_db.py +1791 -0
- agno/db/gcs_json/utils.py +228 -0
- agno/db/in_memory/__init__.py +3 -0
- agno/db/in_memory/in_memory_db.py +1312 -0
- agno/db/in_memory/utils.py +230 -0
- agno/db/json/__init__.py +3 -0
- agno/db/json/json_db.py +1777 -0
- agno/db/json/utils.py +230 -0
- agno/db/migrations/manager.py +199 -0
- agno/db/migrations/v1_to_v2.py +635 -0
- agno/db/migrations/versions/v2_3_0.py +938 -0
- agno/db/mongo/__init__.py +17 -0
- agno/db/mongo/async_mongo.py +2760 -0
- agno/db/mongo/mongo.py +2597 -0
- agno/db/mongo/schemas.py +119 -0
- agno/db/mongo/utils.py +276 -0
- agno/db/mysql/__init__.py +4 -0
- agno/db/mysql/async_mysql.py +2912 -0
- agno/db/mysql/mysql.py +2923 -0
- agno/db/mysql/schemas.py +186 -0
- agno/db/mysql/utils.py +488 -0
- agno/db/postgres/__init__.py +4 -0
- agno/db/postgres/async_postgres.py +2579 -0
- agno/db/postgres/postgres.py +2870 -0
- agno/db/postgres/schemas.py +187 -0
- agno/db/postgres/utils.py +442 -0
- agno/db/redis/__init__.py +3 -0
- agno/db/redis/redis.py +2141 -0
- agno/db/redis/schemas.py +159 -0
- agno/db/redis/utils.py +346 -0
- agno/db/schemas/__init__.py +4 -0
- agno/db/schemas/culture.py +120 -0
- agno/db/schemas/evals.py +34 -0
- agno/db/schemas/knowledge.py +40 -0
- agno/db/schemas/memory.py +61 -0
- agno/db/singlestore/__init__.py +3 -0
- agno/db/singlestore/schemas.py +179 -0
- agno/db/singlestore/singlestore.py +2877 -0
- agno/db/singlestore/utils.py +384 -0
- agno/db/sqlite/__init__.py +4 -0
- agno/db/sqlite/async_sqlite.py +2911 -0
- agno/db/sqlite/schemas.py +181 -0
- agno/db/sqlite/sqlite.py +2908 -0
- agno/db/sqlite/utils.py +429 -0
- agno/db/surrealdb/__init__.py +3 -0
- agno/db/surrealdb/metrics.py +292 -0
- agno/db/surrealdb/models.py +334 -0
- agno/db/surrealdb/queries.py +71 -0
- agno/db/surrealdb/surrealdb.py +1908 -0
- agno/db/surrealdb/utils.py +147 -0
- agno/db/utils.py +118 -0
- agno/eval/__init__.py +24 -0
- agno/eval/accuracy.py +666 -276
- agno/eval/agent_as_judge.py +861 -0
- agno/eval/base.py +29 -0
- agno/eval/performance.py +779 -0
- agno/eval/reliability.py +241 -62
- agno/eval/utils.py +120 -0
- agno/exceptions.py +143 -1
- agno/filters.py +354 -0
- agno/guardrails/__init__.py +6 -0
- agno/guardrails/base.py +19 -0
- agno/guardrails/openai.py +144 -0
- agno/guardrails/pii.py +94 -0
- agno/guardrails/prompt_injection.py +52 -0
- agno/hooks/__init__.py +3 -0
- agno/hooks/decorator.py +164 -0
- agno/integrations/discord/__init__.py +3 -0
- agno/integrations/discord/client.py +203 -0
- agno/knowledge/__init__.py +5 -1
- agno/{document → knowledge}/chunking/agentic.py +22 -14
- agno/{document → knowledge}/chunking/document.py +2 -2
- agno/{document → knowledge}/chunking/fixed.py +7 -6
- agno/knowledge/chunking/markdown.py +151 -0
- agno/{document → knowledge}/chunking/recursive.py +15 -3
- agno/knowledge/chunking/row.py +39 -0
- agno/knowledge/chunking/semantic.py +91 -0
- agno/knowledge/chunking/strategy.py +165 -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/knowledge/embedder/aws_bedrock.py +343 -0
- agno/knowledge/embedder/azure_openai.py +210 -0
- agno/{embedder → knowledge/embedder}/base.py +8 -0
- agno/knowledge/embedder/cohere.py +323 -0
- agno/knowledge/embedder/fastembed.py +62 -0
- agno/{embedder → knowledge/embedder}/fireworks.py +1 -1
- agno/knowledge/embedder/google.py +258 -0
- agno/knowledge/embedder/huggingface.py +94 -0
- agno/knowledge/embedder/jina.py +182 -0
- agno/knowledge/embedder/langdb.py +22 -0
- agno/knowledge/embedder/mistral.py +206 -0
- agno/knowledge/embedder/nebius.py +13 -0
- agno/knowledge/embedder/ollama.py +154 -0
- agno/knowledge/embedder/openai.py +195 -0
- agno/knowledge/embedder/sentence_transformer.py +63 -0
- agno/{embedder → knowledge/embedder}/together.py +1 -1
- agno/knowledge/embedder/vllm.py +262 -0
- agno/knowledge/embedder/voyageai.py +165 -0
- agno/knowledge/knowledge.py +3006 -0
- agno/knowledge/reader/__init__.py +7 -0
- agno/knowledge/reader/arxiv_reader.py +81 -0
- agno/knowledge/reader/base.py +95 -0
- agno/knowledge/reader/csv_reader.py +164 -0
- agno/knowledge/reader/docx_reader.py +82 -0
- agno/knowledge/reader/field_labeled_csv_reader.py +290 -0
- agno/knowledge/reader/firecrawl_reader.py +201 -0
- agno/knowledge/reader/json_reader.py +88 -0
- agno/knowledge/reader/markdown_reader.py +137 -0
- agno/knowledge/reader/pdf_reader.py +431 -0
- agno/knowledge/reader/pptx_reader.py +101 -0
- agno/knowledge/reader/reader_factory.py +313 -0
- agno/knowledge/reader/s3_reader.py +89 -0
- agno/knowledge/reader/tavily_reader.py +193 -0
- agno/knowledge/reader/text_reader.py +127 -0
- agno/knowledge/reader/web_search_reader.py +325 -0
- agno/knowledge/reader/website_reader.py +455 -0
- agno/knowledge/reader/wikipedia_reader.py +91 -0
- agno/knowledge/reader/youtube_reader.py +78 -0
- agno/knowledge/remote_content/remote_content.py +88 -0
- agno/knowledge/reranker/__init__.py +3 -0
- agno/{reranker → knowledge/reranker}/base.py +1 -1
- agno/{reranker → knowledge/reranker}/cohere.py +2 -2
- agno/knowledge/reranker/infinity.py +195 -0
- agno/knowledge/reranker/sentence_transformer.py +54 -0
- agno/knowledge/types.py +39 -0
- agno/knowledge/utils.py +234 -0
- agno/media.py +439 -95
- agno/memory/__init__.py +16 -3
- agno/memory/manager.py +1474 -123
- agno/memory/strategies/__init__.py +15 -0
- agno/memory/strategies/base.py +66 -0
- agno/memory/strategies/summarize.py +196 -0
- agno/memory/strategies/types.py +37 -0
- agno/models/aimlapi/__init__.py +5 -0
- agno/models/aimlapi/aimlapi.py +62 -0
- agno/models/anthropic/__init__.py +4 -0
- agno/models/anthropic/claude.py +960 -496
- agno/models/aws/__init__.py +15 -0
- agno/models/aws/bedrock.py +686 -451
- agno/models/aws/claude.py +190 -183
- agno/models/azure/__init__.py +18 -1
- agno/models/azure/ai_foundry.py +489 -0
- agno/models/azure/openai_chat.py +89 -40
- agno/models/base.py +2477 -550
- agno/models/cerebras/__init__.py +12 -0
- agno/models/cerebras/cerebras.py +565 -0
- agno/models/cerebras/cerebras_openai.py +131 -0
- agno/models/cohere/__init__.py +4 -0
- agno/models/cohere/chat.py +306 -492
- agno/models/cometapi/__init__.py +5 -0
- agno/models/cometapi/cometapi.py +74 -0
- agno/models/dashscope/__init__.py +5 -0
- agno/models/dashscope/dashscope.py +90 -0
- agno/models/deepinfra/__init__.py +5 -0
- agno/models/deepinfra/deepinfra.py +45 -0
- agno/models/deepseek/__init__.py +4 -0
- agno/models/deepseek/deepseek.py +110 -9
- agno/models/fireworks/__init__.py +4 -0
- agno/models/fireworks/fireworks.py +19 -22
- agno/models/google/__init__.py +3 -7
- agno/models/google/gemini.py +1717 -662
- agno/models/google/utils.py +22 -0
- agno/models/groq/__init__.py +4 -0
- agno/models/groq/groq.py +391 -666
- agno/models/huggingface/__init__.py +4 -0
- agno/models/huggingface/huggingface.py +266 -538
- agno/models/ibm/__init__.py +5 -0
- agno/models/ibm/watsonx.py +432 -0
- agno/models/internlm/__init__.py +3 -0
- agno/models/internlm/internlm.py +20 -3
- agno/models/langdb/__init__.py +1 -0
- agno/models/langdb/langdb.py +60 -0
- agno/models/litellm/__init__.py +14 -0
- agno/models/litellm/chat.py +503 -0
- agno/models/litellm/litellm_openai.py +42 -0
- agno/models/llama_cpp/__init__.py +5 -0
- agno/models/llama_cpp/llama_cpp.py +22 -0
- agno/models/lmstudio/__init__.py +5 -0
- agno/models/lmstudio/lmstudio.py +25 -0
- agno/models/message.py +361 -39
- agno/models/meta/__init__.py +12 -0
- agno/models/meta/llama.py +502 -0
- agno/models/meta/llama_openai.py +79 -0
- agno/models/metrics.py +120 -0
- agno/models/mistral/__init__.py +4 -0
- agno/models/mistral/mistral.py +293 -393
- agno/models/nebius/__init__.py +3 -0
- agno/models/nebius/nebius.py +53 -0
- agno/models/nexus/__init__.py +3 -0
- agno/models/nexus/nexus.py +22 -0
- agno/models/nvidia/__init__.py +4 -0
- agno/models/nvidia/nvidia.py +22 -3
- agno/models/ollama/__init__.py +4 -2
- agno/models/ollama/chat.py +257 -492
- agno/models/openai/__init__.py +7 -0
- agno/models/openai/chat.py +725 -770
- agno/models/openai/like.py +16 -2
- agno/models/openai/responses.py +1121 -0
- agno/models/openrouter/__init__.py +4 -0
- agno/models/openrouter/openrouter.py +62 -5
- agno/models/perplexity/__init__.py +5 -0
- agno/models/perplexity/perplexity.py +203 -0
- agno/models/portkey/__init__.py +3 -0
- agno/models/portkey/portkey.py +82 -0
- agno/models/requesty/__init__.py +5 -0
- agno/models/requesty/requesty.py +69 -0
- agno/models/response.py +177 -7
- agno/models/sambanova/__init__.py +4 -0
- agno/models/sambanova/sambanova.py +23 -4
- agno/models/siliconflow/__init__.py +5 -0
- agno/models/siliconflow/siliconflow.py +42 -0
- agno/models/together/__init__.py +4 -0
- agno/models/together/together.py +21 -164
- agno/models/utils.py +266 -0
- agno/models/vercel/__init__.py +3 -0
- agno/models/vercel/v0.py +43 -0
- agno/models/vertexai/__init__.py +0 -1
- agno/models/vertexai/claude.py +190 -0
- agno/models/vllm/__init__.py +3 -0
- agno/models/vllm/vllm.py +83 -0
- agno/models/xai/__init__.py +2 -0
- agno/models/xai/xai.py +111 -7
- agno/os/__init__.py +3 -0
- agno/os/app.py +1027 -0
- agno/os/auth.py +244 -0
- agno/os/config.py +126 -0
- agno/os/interfaces/__init__.py +1 -0
- agno/os/interfaces/a2a/__init__.py +3 -0
- agno/os/interfaces/a2a/a2a.py +42 -0
- agno/os/interfaces/a2a/router.py +249 -0
- agno/os/interfaces/a2a/utils.py +924 -0
- agno/os/interfaces/agui/__init__.py +3 -0
- agno/os/interfaces/agui/agui.py +47 -0
- agno/os/interfaces/agui/router.py +147 -0
- agno/os/interfaces/agui/utils.py +574 -0
- agno/os/interfaces/base.py +25 -0
- agno/os/interfaces/slack/__init__.py +3 -0
- agno/os/interfaces/slack/router.py +148 -0
- agno/os/interfaces/slack/security.py +30 -0
- agno/os/interfaces/slack/slack.py +47 -0
- agno/os/interfaces/whatsapp/__init__.py +3 -0
- agno/os/interfaces/whatsapp/router.py +210 -0
- agno/os/interfaces/whatsapp/security.py +55 -0
- agno/os/interfaces/whatsapp/whatsapp.py +36 -0
- agno/os/mcp.py +293 -0
- agno/os/middleware/__init__.py +9 -0
- agno/os/middleware/jwt.py +797 -0
- agno/os/router.py +258 -0
- agno/os/routers/__init__.py +3 -0
- agno/os/routers/agents/__init__.py +3 -0
- agno/os/routers/agents/router.py +599 -0
- agno/os/routers/agents/schema.py +261 -0
- agno/os/routers/evals/__init__.py +3 -0
- agno/os/routers/evals/evals.py +450 -0
- agno/os/routers/evals/schemas.py +174 -0
- agno/os/routers/evals/utils.py +231 -0
- agno/os/routers/health.py +31 -0
- agno/os/routers/home.py +52 -0
- agno/os/routers/knowledge/__init__.py +3 -0
- agno/os/routers/knowledge/knowledge.py +1008 -0
- agno/os/routers/knowledge/schemas.py +178 -0
- agno/os/routers/memory/__init__.py +3 -0
- agno/os/routers/memory/memory.py +661 -0
- agno/os/routers/memory/schemas.py +88 -0
- agno/os/routers/metrics/__init__.py +3 -0
- agno/os/routers/metrics/metrics.py +190 -0
- agno/os/routers/metrics/schemas.py +47 -0
- agno/os/routers/session/__init__.py +3 -0
- agno/os/routers/session/session.py +997 -0
- agno/os/routers/teams/__init__.py +3 -0
- agno/os/routers/teams/router.py +512 -0
- agno/os/routers/teams/schema.py +257 -0
- agno/os/routers/traces/__init__.py +3 -0
- agno/os/routers/traces/schemas.py +414 -0
- agno/os/routers/traces/traces.py +499 -0
- agno/os/routers/workflows/__init__.py +3 -0
- agno/os/routers/workflows/router.py +624 -0
- agno/os/routers/workflows/schema.py +75 -0
- agno/os/schema.py +534 -0
- agno/os/scopes.py +469 -0
- agno/{playground → os}/settings.py +7 -15
- agno/os/utils.py +973 -0
- agno/reasoning/anthropic.py +80 -0
- agno/reasoning/azure_ai_foundry.py +67 -0
- agno/reasoning/deepseek.py +63 -0
- agno/reasoning/default.py +97 -0
- agno/reasoning/gemini.py +73 -0
- agno/reasoning/groq.py +71 -0
- agno/reasoning/helpers.py +24 -1
- agno/reasoning/ollama.py +67 -0
- agno/reasoning/openai.py +86 -0
- agno/reasoning/step.py +2 -1
- agno/reasoning/vertexai.py +76 -0
- agno/run/__init__.py +6 -0
- agno/run/agent.py +822 -0
- agno/run/base.py +247 -0
- agno/run/cancel.py +81 -0
- agno/run/requirement.py +181 -0
- agno/run/team.py +767 -0
- agno/run/workflow.py +708 -0
- agno/session/__init__.py +10 -0
- agno/session/agent.py +260 -0
- agno/session/summary.py +265 -0
- agno/session/team.py +342 -0
- agno/session/workflow.py +501 -0
- agno/table.py +10 -0
- agno/team/__init__.py +37 -0
- agno/team/team.py +9536 -0
- agno/tools/__init__.py +7 -0
- agno/tools/agentql.py +120 -0
- agno/tools/airflow.py +22 -12
- agno/tools/api.py +122 -0
- agno/tools/apify.py +276 -83
- agno/tools/{arxiv_toolkit.py → arxiv.py} +20 -12
- agno/tools/aws_lambda.py +28 -7
- agno/tools/aws_ses.py +66 -0
- agno/tools/baidusearch.py +11 -4
- agno/tools/bitbucket.py +292 -0
- agno/tools/brandfetch.py +213 -0
- agno/tools/bravesearch.py +106 -0
- agno/tools/brightdata.py +367 -0
- agno/tools/browserbase.py +209 -0
- agno/tools/calcom.py +32 -23
- agno/tools/calculator.py +24 -37
- agno/tools/cartesia.py +187 -0
- agno/tools/{clickup_tool.py → clickup.py} +17 -28
- agno/tools/confluence.py +91 -26
- agno/tools/crawl4ai.py +139 -43
- agno/tools/csv_toolkit.py +28 -22
- agno/tools/dalle.py +36 -22
- agno/tools/daytona.py +475 -0
- agno/tools/decorator.py +169 -14
- agno/tools/desi_vocal.py +23 -11
- agno/tools/discord.py +32 -29
- agno/tools/docker.py +716 -0
- agno/tools/duckdb.py +76 -81
- agno/tools/duckduckgo.py +43 -40
- agno/tools/e2b.py +703 -0
- agno/tools/eleven_labs.py +65 -54
- agno/tools/email.py +13 -5
- agno/tools/evm.py +129 -0
- agno/tools/exa.py +324 -42
- agno/tools/fal.py +39 -35
- agno/tools/file.py +196 -30
- agno/tools/file_generation.py +356 -0
- agno/tools/financial_datasets.py +288 -0
- agno/tools/firecrawl.py +108 -33
- agno/tools/function.py +960 -122
- agno/tools/giphy.py +34 -12
- agno/tools/github.py +1294 -97
- agno/tools/gmail.py +922 -0
- agno/tools/google_bigquery.py +117 -0
- agno/tools/google_drive.py +271 -0
- agno/tools/google_maps.py +253 -0
- agno/tools/googlecalendar.py +607 -107
- agno/tools/googlesheets.py +377 -0
- agno/tools/hackernews.py +20 -12
- agno/tools/jina.py +24 -14
- agno/tools/jira.py +48 -19
- agno/tools/knowledge.py +218 -0
- agno/tools/linear.py +82 -43
- agno/tools/linkup.py +58 -0
- agno/tools/local_file_system.py +15 -7
- agno/tools/lumalab.py +41 -26
- agno/tools/mcp/__init__.py +10 -0
- agno/tools/mcp/mcp.py +331 -0
- agno/tools/mcp/multi_mcp.py +347 -0
- agno/tools/mcp/params.py +24 -0
- agno/tools/mcp_toolbox.py +284 -0
- agno/tools/mem0.py +193 -0
- agno/tools/memory.py +419 -0
- agno/tools/mlx_transcribe.py +11 -9
- agno/tools/models/azure_openai.py +190 -0
- agno/tools/models/gemini.py +203 -0
- agno/tools/models/groq.py +158 -0
- agno/tools/models/morph.py +186 -0
- agno/tools/models/nebius.py +124 -0
- agno/tools/models_labs.py +163 -82
- agno/tools/moviepy_video.py +18 -13
- agno/tools/nano_banana.py +151 -0
- agno/tools/neo4j.py +134 -0
- agno/tools/newspaper.py +15 -4
- agno/tools/newspaper4k.py +19 -6
- agno/tools/notion.py +204 -0
- agno/tools/openai.py +181 -17
- agno/tools/openbb.py +27 -20
- agno/tools/opencv.py +321 -0
- agno/tools/openweather.py +233 -0
- agno/tools/oxylabs.py +385 -0
- agno/tools/pandas.py +25 -15
- agno/tools/parallel.py +314 -0
- agno/tools/postgres.py +238 -185
- agno/tools/pubmed.py +125 -13
- agno/tools/python.py +48 -35
- agno/tools/reasoning.py +283 -0
- agno/tools/reddit.py +207 -29
- agno/tools/redshift.py +406 -0
- agno/tools/replicate.py +69 -26
- agno/tools/resend.py +11 -6
- agno/tools/scrapegraph.py +179 -19
- agno/tools/searxng.py +23 -31
- agno/tools/serpapi.py +15 -10
- agno/tools/serper.py +255 -0
- agno/tools/shell.py +23 -12
- agno/tools/shopify.py +1519 -0
- agno/tools/slack.py +56 -14
- agno/tools/sleep.py +8 -6
- agno/tools/spider.py +35 -11
- agno/tools/spotify.py +919 -0
- agno/tools/sql.py +34 -19
- agno/tools/tavily.py +158 -8
- agno/tools/telegram.py +18 -8
- agno/tools/todoist.py +218 -0
- agno/tools/toolkit.py +134 -9
- agno/tools/trafilatura.py +388 -0
- agno/tools/trello.py +25 -28
- agno/tools/twilio.py +18 -9
- agno/tools/user_control_flow.py +78 -0
- agno/tools/valyu.py +228 -0
- agno/tools/visualization.py +467 -0
- agno/tools/webbrowser.py +28 -0
- agno/tools/webex.py +76 -0
- agno/tools/website.py +23 -19
- agno/tools/webtools.py +45 -0
- agno/tools/whatsapp.py +286 -0
- agno/tools/wikipedia.py +28 -19
- agno/tools/workflow.py +285 -0
- agno/tools/{twitter.py → x.py} +142 -46
- agno/tools/yfinance.py +41 -39
- agno/tools/youtube.py +34 -17
- agno/tools/zendesk.py +15 -5
- agno/tools/zep.py +454 -0
- agno/tools/zoom.py +86 -37
- agno/tracing/__init__.py +12 -0
- agno/tracing/exporter.py +157 -0
- agno/tracing/schemas.py +276 -0
- agno/tracing/setup.py +111 -0
- agno/utils/agent.py +938 -0
- agno/utils/audio.py +37 -1
- agno/utils/certs.py +27 -0
- agno/utils/code_execution.py +11 -0
- agno/utils/common.py +103 -20
- agno/utils/cryptography.py +22 -0
- agno/utils/dttm.py +33 -0
- agno/utils/events.py +700 -0
- agno/utils/functions.py +107 -37
- agno/utils/gemini.py +426 -0
- agno/utils/hooks.py +171 -0
- agno/utils/http.py +185 -0
- agno/utils/json_schema.py +159 -37
- agno/utils/knowledge.py +36 -0
- agno/utils/location.py +19 -0
- agno/utils/log.py +221 -8
- agno/utils/mcp.py +214 -0
- agno/utils/media.py +335 -14
- agno/utils/merge_dict.py +22 -1
- agno/utils/message.py +77 -2
- agno/utils/models/ai_foundry.py +50 -0
- agno/utils/models/claude.py +373 -0
- agno/utils/models/cohere.py +94 -0
- agno/utils/models/llama.py +85 -0
- agno/utils/models/mistral.py +100 -0
- agno/utils/models/openai_responses.py +140 -0
- agno/utils/models/schema_utils.py +153 -0
- agno/utils/models/watsonx.py +41 -0
- agno/utils/openai.py +257 -0
- agno/utils/pickle.py +1 -1
- agno/utils/pprint.py +124 -8
- agno/utils/print_response/agent.py +930 -0
- agno/utils/print_response/team.py +1914 -0
- agno/utils/print_response/workflow.py +1668 -0
- agno/utils/prompts.py +111 -0
- agno/utils/reasoning.py +108 -0
- agno/utils/response.py +163 -0
- agno/utils/serialize.py +32 -0
- agno/utils/shell.py +4 -4
- agno/utils/streamlit.py +487 -0
- agno/utils/string.py +204 -51
- agno/utils/team.py +139 -0
- agno/utils/timer.py +9 -2
- agno/utils/tokens.py +657 -0
- agno/utils/tools.py +19 -1
- agno/utils/whatsapp.py +305 -0
- agno/utils/yaml_io.py +3 -3
- agno/vectordb/__init__.py +2 -0
- agno/vectordb/base.py +87 -9
- agno/vectordb/cassandra/__init__.py +5 -1
- agno/vectordb/cassandra/cassandra.py +383 -27
- agno/vectordb/chroma/__init__.py +4 -0
- agno/vectordb/chroma/chromadb.py +748 -83
- agno/vectordb/clickhouse/__init__.py +7 -1
- agno/vectordb/clickhouse/clickhousedb.py +554 -53
- agno/vectordb/couchbase/__init__.py +3 -0
- agno/vectordb/couchbase/couchbase.py +1446 -0
- agno/vectordb/lancedb/__init__.py +5 -0
- agno/vectordb/lancedb/lance_db.py +730 -98
- agno/vectordb/langchaindb/__init__.py +5 -0
- agno/vectordb/langchaindb/langchaindb.py +163 -0
- agno/vectordb/lightrag/__init__.py +5 -0
- agno/vectordb/lightrag/lightrag.py +388 -0
- agno/vectordb/llamaindex/__init__.py +3 -0
- agno/vectordb/llamaindex/llamaindexdb.py +166 -0
- agno/vectordb/milvus/__init__.py +3 -0
- agno/vectordb/milvus/milvus.py +966 -78
- agno/vectordb/mongodb/__init__.py +9 -1
- agno/vectordb/mongodb/mongodb.py +1175 -172
- agno/vectordb/pgvector/__init__.py +8 -0
- agno/vectordb/pgvector/pgvector.py +599 -115
- agno/vectordb/pineconedb/__init__.py +5 -1
- agno/vectordb/pineconedb/pineconedb.py +406 -43
- agno/vectordb/qdrant/__init__.py +4 -0
- agno/vectordb/qdrant/qdrant.py +914 -61
- agno/vectordb/redis/__init__.py +9 -0
- agno/vectordb/redis/redisdb.py +682 -0
- agno/vectordb/singlestore/__init__.py +8 -1
- agno/vectordb/singlestore/singlestore.py +771 -0
- agno/vectordb/surrealdb/__init__.py +3 -0
- agno/vectordb/surrealdb/surrealdb.py +663 -0
- agno/vectordb/upstashdb/__init__.py +5 -0
- agno/vectordb/upstashdb/upstashdb.py +718 -0
- agno/vectordb/weaviate/__init__.py +8 -0
- agno/vectordb/weaviate/index.py +15 -0
- agno/vectordb/weaviate/weaviate.py +1009 -0
- agno/workflow/__init__.py +23 -1
- agno/workflow/agent.py +299 -0
- agno/workflow/condition.py +759 -0
- agno/workflow/loop.py +756 -0
- agno/workflow/parallel.py +853 -0
- agno/workflow/router.py +723 -0
- agno/workflow/step.py +1564 -0
- agno/workflow/steps.py +613 -0
- agno/workflow/types.py +556 -0
- agno/workflow/workflow.py +4327 -514
- agno-2.3.13.dist-info/METADATA +639 -0
- agno-2.3.13.dist-info/RECORD +613 -0
- {agno-0.1.2.dist-info → agno-2.3.13.dist-info}/WHEEL +1 -1
- agno-2.3.13.dist-info/licenses/LICENSE +201 -0
- agno/api/playground.py +0 -91
- agno/api/schemas/playground.py +0 -22
- agno/api/schemas/user.py +0 -22
- agno/api/schemas/workspace.py +0 -46
- agno/api/user.py +0 -160
- agno/api/workspace.py +0 -151
- agno/cli/auth_server.py +0 -118
- agno/cli/config.py +0 -275
- agno/cli/console.py +0 -88
- agno/cli/credentials.py +0 -23
- agno/cli/entrypoint.py +0 -571
- agno/cli/operator.py +0 -355
- agno/cli/settings.py +0 -85
- agno/cli/ws/ws_cli.py +0 -817
- agno/constants.py +0 -13
- agno/document/__init__.py +0 -1
- agno/document/chunking/semantic.py +0 -47
- agno/document/chunking/strategy.py +0 -31
- agno/document/reader/__init__.py +0 -1
- agno/document/reader/arxiv_reader.py +0 -41
- agno/document/reader/base.py +0 -22
- agno/document/reader/csv_reader.py +0 -84
- agno/document/reader/docx_reader.py +0 -46
- agno/document/reader/firecrawl_reader.py +0 -99
- agno/document/reader/json_reader.py +0 -43
- agno/document/reader/pdf_reader.py +0 -219
- agno/document/reader/s3/pdf_reader.py +0 -46
- agno/document/reader/s3/text_reader.py +0 -51
- agno/document/reader/text_reader.py +0 -41
- agno/document/reader/website_reader.py +0 -175
- agno/document/reader/youtube_reader.py +0 -50
- agno/embedder/__init__.py +0 -1
- agno/embedder/azure_openai.py +0 -86
- agno/embedder/cohere.py +0 -72
- agno/embedder/fastembed.py +0 -37
- agno/embedder/google.py +0 -73
- agno/embedder/huggingface.py +0 -54
- agno/embedder/mistral.py +0 -80
- agno/embedder/ollama.py +0 -57
- agno/embedder/openai.py +0 -74
- agno/embedder/sentence_transformer.py +0 -38
- agno/embedder/voyageai.py +0 -64
- agno/eval/perf.py +0 -201
- agno/file/__init__.py +0 -1
- 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 -230
- agno/knowledge/arxiv.py +0 -22
- agno/knowledge/combined.py +0 -22
- agno/knowledge/csv.py +0 -28
- agno/knowledge/csv_url.py +0 -19
- agno/knowledge/document.py +0 -20
- agno/knowledge/docx.py +0 -30
- agno/knowledge/json.py +0 -28
- agno/knowledge/langchain.py +0 -71
- agno/knowledge/llamaindex.py +0 -66
- agno/knowledge/pdf.py +0 -28
- agno/knowledge/pdf_url.py +0 -26
- agno/knowledge/s3/base.py +0 -60
- agno/knowledge/s3/pdf.py +0 -21
- agno/knowledge/s3/text.py +0 -23
- agno/knowledge/text.py +0 -30
- agno/knowledge/website.py +0 -88
- agno/knowledge/wikipedia.py +0 -31
- agno/knowledge/youtube.py +0 -22
- agno/memory/agent.py +0 -392
- agno/memory/classifier.py +0 -104
- agno/memory/db/__init__.py +0 -1
- 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 -15
- agno/memory/row.py +0 -36
- agno/memory/summarizer.py +0 -192
- agno/memory/summary.py +0 -19
- agno/memory/workflow.py +0 -38
- agno/models/google/gemini_openai.py +0 -26
- agno/models/ollama/hermes.py +0 -221
- agno/models/ollama/tools.py +0 -362
- agno/models/vertexai/gemini.py +0 -595
- agno/playground/__init__.py +0 -3
- agno/playground/async_router.py +0 -421
- agno/playground/deploy.py +0 -249
- agno/playground/operator.py +0 -92
- agno/playground/playground.py +0 -91
- agno/playground/schemas.py +0 -76
- agno/playground/serve.py +0 -55
- agno/playground/sync_router.py +0 -405
- agno/reasoning/agent.py +0 -68
- agno/run/response.py +0 -112
- agno/storage/agent/__init__.py +0 -0
- agno/storage/agent/base.py +0 -38
- agno/storage/agent/dynamodb.py +0 -350
- agno/storage/agent/json.py +0 -92
- agno/storage/agent/mongodb.py +0 -228
- agno/storage/agent/postgres.py +0 -367
- agno/storage/agent/session.py +0 -79
- agno/storage/agent/singlestore.py +0 -303
- agno/storage/agent/sqlite.py +0 -357
- agno/storage/agent/yaml.py +0 -93
- agno/storage/workflow/__init__.py +0 -0
- agno/storage/workflow/base.py +0 -40
- agno/storage/workflow/mongodb.py +0 -233
- agno/storage/workflow/postgres.py +0 -366
- agno/storage/workflow/session.py +0 -60
- agno/storage/workflow/sqlite.py +0 -359
- agno/tools/googlesearch.py +0 -88
- 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/vectordb/singlestore/s2vectordb.py +0 -390
- agno/vectordb/singlestore/s2vectordb2.py +0 -355
- agno/workspace/__init__.py +0 -0
- agno/workspace/config.py +0 -325
- agno/workspace/enums.py +0 -6
- agno/workspace/helpers.py +0 -48
- agno/workspace/operator.py +0 -758
- agno/workspace/settings.py +0 -63
- agno-0.1.2.dist-info/LICENSE +0 -375
- agno-0.1.2.dist-info/METADATA +0 -502
- agno-0.1.2.dist-info/RECORD +0 -352
- agno-0.1.2.dist-info/entry_points.txt +0 -3
- /agno/{cli → db/migrations}/__init__.py +0 -0
- /agno/{cli/ws → db/migrations/versions}/__init__.py +0 -0
- /agno/{document/chunking/__init__.py → db/schemas/metrics.py} +0 -0
- /agno/{document/reader/s3 → integrations}/__init__.py +0 -0
- /agno/{file/local → knowledge/chunking}/__init__.py +0 -0
- /agno/{infra → knowledge/remote_content}/__init__.py +0 -0
- /agno/{knowledge/s3 → tools/models}/__init__.py +0 -0
- /agno/{reranker → utils/models}/__init__.py +0 -0
- /agno/{storage → utils/print_response}/__init__.py +0 -0
- {agno-0.1.2.dist-info → agno-2.3.13.dist-info}/top_level.txt +0 -0
agno/embedder/huggingface.py
DELETED
|
@@ -1,54 +0,0 @@
|
|
|
1
|
-
import json
|
|
2
|
-
from dataclasses import dataclass
|
|
3
|
-
from os import getenv
|
|
4
|
-
from typing import Any, Dict, List, Optional, Tuple
|
|
5
|
-
|
|
6
|
-
from agno.embedder.base import Embedder
|
|
7
|
-
from agno.utils.log import logger
|
|
8
|
-
|
|
9
|
-
try:
|
|
10
|
-
from huggingface_hub import InferenceClient, SentenceSimilarityInput
|
|
11
|
-
except ImportError:
|
|
12
|
-
logger.error("`huggingface-hub` not installed, please run `pip install huggingface-hub`")
|
|
13
|
-
raise
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
@dataclass
|
|
17
|
-
class HuggingfaceCustomEmbedder(Embedder):
|
|
18
|
-
"""Huggingface Custom Embedder"""
|
|
19
|
-
|
|
20
|
-
id: str = "jinaai/jina-embeddings-v2-base-code"
|
|
21
|
-
api_key: Optional[str] = getenv("HUGGINGFACE_API_KEY")
|
|
22
|
-
client_params: Optional[Dict[str, Any]] = None
|
|
23
|
-
huggingface_client: Optional[InferenceClient] = None
|
|
24
|
-
|
|
25
|
-
@property
|
|
26
|
-
def client(self) -> InferenceClient:
|
|
27
|
-
if self.huggingface_client:
|
|
28
|
-
return self.huggingface_client
|
|
29
|
-
_client_params: Dict[str, Any] = {}
|
|
30
|
-
if self.api_key:
|
|
31
|
-
_client_params["api_key"] = self.api_key
|
|
32
|
-
if self.client_params:
|
|
33
|
-
_client_params.update(self.client_params)
|
|
34
|
-
return InferenceClient(**_client_params)
|
|
35
|
-
|
|
36
|
-
def _response(self, text: str):
|
|
37
|
-
_request_params: SentenceSimilarityInput = {
|
|
38
|
-
"json": {"inputs": text},
|
|
39
|
-
"model": self.id,
|
|
40
|
-
}
|
|
41
|
-
return self.client.post(**_request_params)
|
|
42
|
-
|
|
43
|
-
def get_embedding(self, text: str) -> List[float]:
|
|
44
|
-
response = self._response(text=text)
|
|
45
|
-
try:
|
|
46
|
-
decoded_string = response.decode("utf-8")
|
|
47
|
-
return json.loads(decoded_string)
|
|
48
|
-
|
|
49
|
-
except Exception as e:
|
|
50
|
-
logger.warning(e)
|
|
51
|
-
return []
|
|
52
|
-
|
|
53
|
-
def get_embedding_and_usage(self, text: str) -> Tuple[List[float], Optional[Dict]]:
|
|
54
|
-
return self.get_embedding(text=text), None
|
agno/embedder/mistral.py
DELETED
|
@@ -1,80 +0,0 @@
|
|
|
1
|
-
from dataclasses import dataclass
|
|
2
|
-
from os import getenv
|
|
3
|
-
from typing import Any, Dict, List, Optional, Tuple
|
|
4
|
-
|
|
5
|
-
from agno.embedder.base import Embedder
|
|
6
|
-
from agno.utils.log import logger
|
|
7
|
-
|
|
8
|
-
try:
|
|
9
|
-
from mistralai import Mistral
|
|
10
|
-
from mistralai.models.embeddingresponse import EmbeddingResponse
|
|
11
|
-
except ImportError:
|
|
12
|
-
raise ImportError("`mistralai` not installed")
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
@dataclass
|
|
16
|
-
class MistralEmbedder(Embedder):
|
|
17
|
-
id: str = "mistral-embed"
|
|
18
|
-
dimensions: int = 1024
|
|
19
|
-
# -*- Request parameters
|
|
20
|
-
request_params: Optional[Dict[str, Any]] = None
|
|
21
|
-
# -*- Client parameters
|
|
22
|
-
api_key: Optional[str] = getenv("MISTRAL_API_KEY")
|
|
23
|
-
endpoint: Optional[str] = None
|
|
24
|
-
max_retries: Optional[int] = None
|
|
25
|
-
timeout: Optional[int] = None
|
|
26
|
-
client_params: Optional[Dict[str, Any]] = None
|
|
27
|
-
# -*- Provide the Mistral Client manually
|
|
28
|
-
mistral_client: Optional[Mistral] = None
|
|
29
|
-
|
|
30
|
-
@property
|
|
31
|
-
def client(self) -> Mistral:
|
|
32
|
-
if self.mistral_client:
|
|
33
|
-
return self.mistral_client
|
|
34
|
-
|
|
35
|
-
_client_params: Dict[str, Any] = {}
|
|
36
|
-
if self.api_key:
|
|
37
|
-
_client_params["api_key"] = self.api_key
|
|
38
|
-
if self.endpoint:
|
|
39
|
-
_client_params["endpoint"] = self.endpoint
|
|
40
|
-
if self.max_retries:
|
|
41
|
-
_client_params["max_retries"] = self.max_retries
|
|
42
|
-
if self.timeout:
|
|
43
|
-
_client_params["timeout"] = self.timeout
|
|
44
|
-
if self.client_params:
|
|
45
|
-
_client_params.update(self.client_params)
|
|
46
|
-
return Mistral(**_client_params)
|
|
47
|
-
|
|
48
|
-
def _response(self, text: str) -> EmbeddingResponse:
|
|
49
|
-
_request_params: Dict[str, Any] = {
|
|
50
|
-
"inputs": text,
|
|
51
|
-
"model": self.id,
|
|
52
|
-
}
|
|
53
|
-
if self.request_params:
|
|
54
|
-
_request_params.update(self.request_params)
|
|
55
|
-
response = self.client.embeddings.create(**_request_params)
|
|
56
|
-
if response is None:
|
|
57
|
-
raise ValueError("Failed to get embedding response")
|
|
58
|
-
return response
|
|
59
|
-
|
|
60
|
-
def get_embedding(self, text: str) -> List[float]:
|
|
61
|
-
try:
|
|
62
|
-
response: EmbeddingResponse = self._response(text=text)
|
|
63
|
-
if response.data and response.data[0].embedding:
|
|
64
|
-
return response.data[0].embedding
|
|
65
|
-
return []
|
|
66
|
-
except Exception as e:
|
|
67
|
-
logger.warning(f"Error getting embedding: {e}")
|
|
68
|
-
return []
|
|
69
|
-
|
|
70
|
-
def get_embedding_and_usage(self, text: str) -> Tuple[List[float], Dict[str, Any]]:
|
|
71
|
-
try:
|
|
72
|
-
response: EmbeddingResponse = self._response(text=text)
|
|
73
|
-
embedding: List[float] = (
|
|
74
|
-
response.data[0].embedding if (response.data and response.data[0].embedding) else []
|
|
75
|
-
)
|
|
76
|
-
usage: Dict[str, Any] = response.usage.model_dump() if response.usage else {}
|
|
77
|
-
return embedding, usage
|
|
78
|
-
except Exception as e:
|
|
79
|
-
logger.warning(f"Error getting embedding and usage: {e}")
|
|
80
|
-
return [], {}
|
agno/embedder/ollama.py
DELETED
|
@@ -1,57 +0,0 @@
|
|
|
1
|
-
from dataclasses import dataclass
|
|
2
|
-
from typing import Any, Dict, List, Optional, Tuple
|
|
3
|
-
|
|
4
|
-
from agno.embedder.base import Embedder
|
|
5
|
-
from agno.utils.log import logger
|
|
6
|
-
|
|
7
|
-
try:
|
|
8
|
-
from ollama import Client as OllamaClient
|
|
9
|
-
except (ModuleNotFoundError, ImportError):
|
|
10
|
-
raise ImportError("`ollama` not installed. Please install using `pip install ollama`")
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
@dataclass
|
|
14
|
-
class OllamaEmbedder(Embedder):
|
|
15
|
-
id: str = "openhermes"
|
|
16
|
-
dimensions: int = 4096
|
|
17
|
-
host: Optional[str] = None
|
|
18
|
-
timeout: Optional[Any] = None
|
|
19
|
-
options: Optional[Any] = None
|
|
20
|
-
client_kwargs: Optional[Dict[str, Any]] = None
|
|
21
|
-
ollama_client: Optional[OllamaClient] = None
|
|
22
|
-
|
|
23
|
-
@property
|
|
24
|
-
def client(self) -> OllamaClient:
|
|
25
|
-
if self.ollama_client:
|
|
26
|
-
return self.ollama_client
|
|
27
|
-
|
|
28
|
-
_ollama_params: Dict[str, Any] = {}
|
|
29
|
-
if self.host:
|
|
30
|
-
_ollama_params["host"] = self.host
|
|
31
|
-
if self.timeout:
|
|
32
|
-
_ollama_params["timeout"] = self.timeout
|
|
33
|
-
if self.client_kwargs:
|
|
34
|
-
_ollama_params.update(self.client_kwargs)
|
|
35
|
-
return OllamaClient(**_ollama_params)
|
|
36
|
-
|
|
37
|
-
def _response(self, text: str) -> Dict[str, Any]:
|
|
38
|
-
kwargs: Dict[str, Any] = {}
|
|
39
|
-
if self.options is not None:
|
|
40
|
-
kwargs["options"] = self.options
|
|
41
|
-
|
|
42
|
-
return self.client.embeddings(prompt=text, model=self.id, **kwargs) # type: ignore
|
|
43
|
-
|
|
44
|
-
def get_embedding(self, text: str) -> List[float]:
|
|
45
|
-
try:
|
|
46
|
-
response = self._response(text=text)
|
|
47
|
-
if response is None:
|
|
48
|
-
return []
|
|
49
|
-
return response.get("embedding", [])
|
|
50
|
-
except Exception as e:
|
|
51
|
-
logger.warning(e)
|
|
52
|
-
return []
|
|
53
|
-
|
|
54
|
-
def get_embedding_and_usage(self, text: str) -> Tuple[List[float], Optional[Dict]]:
|
|
55
|
-
embedding = self.get_embedding(text=text)
|
|
56
|
-
usage = None
|
|
57
|
-
return embedding, usage
|
agno/embedder/openai.py
DELETED
|
@@ -1,74 +0,0 @@
|
|
|
1
|
-
from dataclasses import dataclass
|
|
2
|
-
from typing import Any, Dict, List, Optional, Tuple
|
|
3
|
-
|
|
4
|
-
from typing_extensions import Literal
|
|
5
|
-
|
|
6
|
-
from agno.embedder.base import Embedder
|
|
7
|
-
from agno.utils.log import logger
|
|
8
|
-
|
|
9
|
-
try:
|
|
10
|
-
from openai import OpenAI as OpenAIClient
|
|
11
|
-
from openai.types.create_embedding_response import CreateEmbeddingResponse
|
|
12
|
-
except ImportError:
|
|
13
|
-
raise ImportError("`openai` not installed")
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
@dataclass
|
|
17
|
-
class OpenAIEmbedder(Embedder):
|
|
18
|
-
id: str = "text-embedding-3-small"
|
|
19
|
-
dimensions: int = 1536
|
|
20
|
-
encoding_format: Literal["float", "base64"] = "float"
|
|
21
|
-
user: Optional[str] = None
|
|
22
|
-
api_key: Optional[str] = None
|
|
23
|
-
organization: Optional[str] = None
|
|
24
|
-
base_url: Optional[str] = None
|
|
25
|
-
request_params: Optional[Dict[str, Any]] = None
|
|
26
|
-
client_params: Optional[Dict[str, Any]] = None
|
|
27
|
-
openai_client: Optional[OpenAIClient] = None
|
|
28
|
-
|
|
29
|
-
@property
|
|
30
|
-
def client(self) -> OpenAIClient:
|
|
31
|
-
if self.openai_client:
|
|
32
|
-
return self.openai_client
|
|
33
|
-
|
|
34
|
-
_client_params: Dict[str, Any] = {}
|
|
35
|
-
if self.api_key:
|
|
36
|
-
_client_params["api_key"] = self.api_key
|
|
37
|
-
if self.organization:
|
|
38
|
-
_client_params["organization"] = self.organization
|
|
39
|
-
if self.base_url:
|
|
40
|
-
_client_params["base_url"] = self.base_url
|
|
41
|
-
if self.client_params:
|
|
42
|
-
_client_params.update(self.client_params)
|
|
43
|
-
return OpenAIClient(**_client_params)
|
|
44
|
-
|
|
45
|
-
def response(self, text: str) -> CreateEmbeddingResponse:
|
|
46
|
-
_request_params: Dict[str, Any] = {
|
|
47
|
-
"input": text,
|
|
48
|
-
"model": self.id,
|
|
49
|
-
"encoding_format": self.encoding_format,
|
|
50
|
-
}
|
|
51
|
-
if self.user is not None:
|
|
52
|
-
_request_params["user"] = self.user
|
|
53
|
-
if self.id.startswith("text-embedding-3"):
|
|
54
|
-
_request_params["dimensions"] = self.dimensions
|
|
55
|
-
if self.request_params:
|
|
56
|
-
_request_params.update(self.request_params)
|
|
57
|
-
return self.client.embeddings.create(**_request_params)
|
|
58
|
-
|
|
59
|
-
def get_embedding(self, text: str) -> List[float]:
|
|
60
|
-
response: CreateEmbeddingResponse = self.response(text=text)
|
|
61
|
-
try:
|
|
62
|
-
return response.data[0].embedding
|
|
63
|
-
except Exception as e:
|
|
64
|
-
logger.warning(e)
|
|
65
|
-
return []
|
|
66
|
-
|
|
67
|
-
def get_embedding_and_usage(self, text: str) -> Tuple[List[float], Optional[Dict]]:
|
|
68
|
-
response: CreateEmbeddingResponse = self.response(text=text)
|
|
69
|
-
|
|
70
|
-
embedding = response.data[0].embedding
|
|
71
|
-
usage = response.usage
|
|
72
|
-
if usage:
|
|
73
|
-
return embedding, usage.model_dump()
|
|
74
|
-
return embedding, None
|
|
@@ -1,38 +0,0 @@
|
|
|
1
|
-
import platform
|
|
2
|
-
from dataclasses import dataclass
|
|
3
|
-
from typing import Dict, List, Optional, Tuple, Union
|
|
4
|
-
|
|
5
|
-
from agno.embedder.base import Embedder
|
|
6
|
-
from agno.utils.log import logger
|
|
7
|
-
|
|
8
|
-
try:
|
|
9
|
-
from sentence_transformers import SentenceTransformer
|
|
10
|
-
|
|
11
|
-
if platform.system() == "Windows":
|
|
12
|
-
import numpy as np
|
|
13
|
-
|
|
14
|
-
numpy_version = np.__version__
|
|
15
|
-
if numpy_version.startswith("2"):
|
|
16
|
-
raise RuntimeError(
|
|
17
|
-
"Incompatible NumPy version detected. Please install NumPy 1.x by running 'pip install numpy<2'."
|
|
18
|
-
)
|
|
19
|
-
except ImportError:
|
|
20
|
-
raise ImportError("sentence-transformers not installed, please run pip install sentence-transformers")
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
@dataclass
|
|
24
|
-
class SentenceTransformerEmbedder(Embedder):
|
|
25
|
-
id: str = "sentence-transformers/all-MiniLM-L6-v2"
|
|
26
|
-
sentence_transformer_client: Optional[SentenceTransformer] = None
|
|
27
|
-
|
|
28
|
-
def get_embedding(self, text: Union[str, List[str]]) -> List[float]:
|
|
29
|
-
model = SentenceTransformer(model_name_or_path=self.id)
|
|
30
|
-
embedding = model.encode(text)
|
|
31
|
-
try:
|
|
32
|
-
return embedding # type: ignore
|
|
33
|
-
except Exception as e:
|
|
34
|
-
logger.warning(e)
|
|
35
|
-
return []
|
|
36
|
-
|
|
37
|
-
def get_embedding_and_usage(self, text: str) -> Tuple[List[float], Optional[Dict]]:
|
|
38
|
-
return self.get_embedding(text=text), None
|
agno/embedder/voyageai.py
DELETED
|
@@ -1,64 +0,0 @@
|
|
|
1
|
-
from dataclasses import dataclass
|
|
2
|
-
from typing import Any, Dict, List, Optional, Tuple
|
|
3
|
-
|
|
4
|
-
from agno.embedder.base import Embedder
|
|
5
|
-
from agno.utils.log import logger
|
|
6
|
-
|
|
7
|
-
try:
|
|
8
|
-
from voyageai import Client
|
|
9
|
-
from voyageai.object import EmbeddingsObject
|
|
10
|
-
except ImportError:
|
|
11
|
-
raise ImportError("`voyageai` not installed")
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
@dataclass
|
|
15
|
-
class VoyageAIEmbedder(Embedder):
|
|
16
|
-
id: str = "voyage-2"
|
|
17
|
-
dimensions: int = 1024
|
|
18
|
-
request_params: Optional[Dict[str, Any]] = None
|
|
19
|
-
api_key: Optional[str] = None
|
|
20
|
-
base_url: str = "https://api.voyageai.com/v1/embeddings"
|
|
21
|
-
max_retries: Optional[int] = None
|
|
22
|
-
timeout: Optional[float] = None
|
|
23
|
-
client_params: Optional[Dict[str, Any]] = None
|
|
24
|
-
voyage_client: Optional[Client] = None
|
|
25
|
-
|
|
26
|
-
@property
|
|
27
|
-
def client(self) -> Client:
|
|
28
|
-
if self.voyage_client:
|
|
29
|
-
return self.voyage_client
|
|
30
|
-
|
|
31
|
-
_client_params: Dict[str, Any] = {}
|
|
32
|
-
if self.api_key:
|
|
33
|
-
_client_params["api_key"] = self.api_key
|
|
34
|
-
if self.max_retries:
|
|
35
|
-
_client_params["max_retries"] = self.max_retries
|
|
36
|
-
if self.timeout:
|
|
37
|
-
_client_params["timeout"] = self.timeout
|
|
38
|
-
if self.client_params:
|
|
39
|
-
_client_params.update(self.client_params)
|
|
40
|
-
return Client(**_client_params)
|
|
41
|
-
|
|
42
|
-
def _response(self, text: str) -> EmbeddingsObject:
|
|
43
|
-
_request_params: Dict[str, Any] = {
|
|
44
|
-
"texts": [text],
|
|
45
|
-
"model": self.id,
|
|
46
|
-
}
|
|
47
|
-
if self.request_params:
|
|
48
|
-
_request_params.update(self.request_params)
|
|
49
|
-
return self.client.embed(**_request_params)
|
|
50
|
-
|
|
51
|
-
def get_embedding(self, text: str) -> List[float]:
|
|
52
|
-
response: EmbeddingsObject = self._response(text=text)
|
|
53
|
-
try:
|
|
54
|
-
return response.embeddings[0]
|
|
55
|
-
except Exception as e:
|
|
56
|
-
logger.warning(e)
|
|
57
|
-
return []
|
|
58
|
-
|
|
59
|
-
def get_embedding_and_usage(self, text: str) -> Tuple[List[float], Optional[Dict]]:
|
|
60
|
-
response: EmbeddingsObject = self._response(text=text)
|
|
61
|
-
|
|
62
|
-
embedding = response.embeddings[0]
|
|
63
|
-
usage = {"total_tokens": response.total_tokens}
|
|
64
|
-
return embedding, usage
|
agno/eval/perf.py
DELETED
|
@@ -1,201 +0,0 @@
|
|
|
1
|
-
from dataclasses import asdict, dataclass, field
|
|
2
|
-
from os import getenv
|
|
3
|
-
from pathlib import Path
|
|
4
|
-
from typing import TYPE_CHECKING, Callable, List, Optional
|
|
5
|
-
from uuid import uuid4
|
|
6
|
-
|
|
7
|
-
from memory_profiler import memory_usage
|
|
8
|
-
|
|
9
|
-
from agno.utils.log import logger, set_log_level_to_debug, set_log_level_to_info
|
|
10
|
-
from agno.utils.timer import Timer
|
|
11
|
-
|
|
12
|
-
if TYPE_CHECKING:
|
|
13
|
-
from rich.console import Console
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
@dataclass
|
|
17
|
-
class PerfResult:
|
|
18
|
-
# Run time performance in seconds
|
|
19
|
-
run_times: List[float] = field(default_factory=list)
|
|
20
|
-
avg_run_time: float = field(init=False)
|
|
21
|
-
min_run_time: float = field(init=False)
|
|
22
|
-
max_run_time: float = field(init=False)
|
|
23
|
-
std_dev_run_time: float = field(init=False)
|
|
24
|
-
|
|
25
|
-
# Memory performance in MiB
|
|
26
|
-
memory_usages: List[float] = field(default_factory=list)
|
|
27
|
-
avg_memory_usage: float = field(init=False)
|
|
28
|
-
min_memory_usage: float = field(init=False)
|
|
29
|
-
max_memory_usage: float = field(init=False)
|
|
30
|
-
std_dev_memory_usage: float = field(init=False)
|
|
31
|
-
|
|
32
|
-
def __post_init__(self):
|
|
33
|
-
self.compute_stats()
|
|
34
|
-
|
|
35
|
-
def compute_stats(self):
|
|
36
|
-
import statistics
|
|
37
|
-
|
|
38
|
-
if self.run_times:
|
|
39
|
-
self.avg_run_time = statistics.mean(self.run_times)
|
|
40
|
-
self.min_run_time = min(self.run_times)
|
|
41
|
-
self.max_run_time = max(self.run_times)
|
|
42
|
-
self.std_dev_run_time = statistics.stdev(self.run_times) if len(self.run_times) > 1 else 0
|
|
43
|
-
|
|
44
|
-
if self.memory_usages:
|
|
45
|
-
self.avg_memory_usage = statistics.mean(self.memory_usages)
|
|
46
|
-
self.min_memory_usage = min(self.memory_usages)
|
|
47
|
-
self.max_memory_usage = max(self.memory_usages)
|
|
48
|
-
self.std_dev_memory_usage = statistics.stdev(self.memory_usages) if len(self.memory_usages) > 1 else 0
|
|
49
|
-
|
|
50
|
-
def print_summary(self, console: Optional["Console"] = None):
|
|
51
|
-
from rich.console import Console
|
|
52
|
-
from rich.table import Table
|
|
53
|
-
|
|
54
|
-
if console is None:
|
|
55
|
-
console = Console()
|
|
56
|
-
|
|
57
|
-
# Create performance table
|
|
58
|
-
perf_table = Table(title="Performance Summary", show_header=True, header_style="bold magenta")
|
|
59
|
-
perf_table.add_column("Metric", style="cyan")
|
|
60
|
-
perf_table.add_column("Time (seconds)", style="green")
|
|
61
|
-
perf_table.add_column("Memory (MiB)", style="yellow")
|
|
62
|
-
|
|
63
|
-
# Add rows
|
|
64
|
-
perf_table.add_row("Average", f"{self.avg_run_time:.6f}", f"{self.avg_memory_usage:.2f}")
|
|
65
|
-
perf_table.add_row("Minimum", f"{self.min_run_time:.6f}", f"{self.min_memory_usage:.2f}")
|
|
66
|
-
perf_table.add_row("Maximum", f"{self.max_run_time:.6f}", f"{self.max_memory_usage:.2f}")
|
|
67
|
-
perf_table.add_row("Std Dev", f"{self.std_dev_run_time:.6f}", f"{self.std_dev_memory_usage:.2f}")
|
|
68
|
-
|
|
69
|
-
console.print(perf_table)
|
|
70
|
-
|
|
71
|
-
def print_results(self, console: Optional["Console"] = None):
|
|
72
|
-
from rich.console import Console
|
|
73
|
-
from rich.table import Table
|
|
74
|
-
|
|
75
|
-
if console is None:
|
|
76
|
-
console = Console()
|
|
77
|
-
|
|
78
|
-
# Create runs table
|
|
79
|
-
results_table = Table(title="Individual Runs", show_header=True, header_style="bold magenta")
|
|
80
|
-
results_table.add_column("Run #", style="cyan")
|
|
81
|
-
results_table.add_column("Time (seconds)", style="green")
|
|
82
|
-
results_table.add_column("Memory (MiB)", style="yellow")
|
|
83
|
-
|
|
84
|
-
# Add rows
|
|
85
|
-
for i in range(len(self.run_times)):
|
|
86
|
-
results_table.add_row(str(i + 1), f"{self.run_times[i]:.6f}", f"{self.memory_usages[i]:.2f}")
|
|
87
|
-
|
|
88
|
-
console.print(results_table)
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
@dataclass
|
|
92
|
-
class PerfEval:
|
|
93
|
-
"""Evaluate the performance of a function."""
|
|
94
|
-
|
|
95
|
-
# Function to evaluate
|
|
96
|
-
func: Callable
|
|
97
|
-
|
|
98
|
-
# Evaluation name
|
|
99
|
-
name: Optional[str] = None
|
|
100
|
-
# Evaluation UUID (autogenerated if not set)
|
|
101
|
-
eval_id: Optional[str] = None
|
|
102
|
-
|
|
103
|
-
# Number of iterations to run
|
|
104
|
-
num_iterations: int = 3
|
|
105
|
-
# Result of the evaluation
|
|
106
|
-
result: Optional[PerfResult] = None
|
|
107
|
-
|
|
108
|
-
# Print summary of results
|
|
109
|
-
print_summary: bool = False
|
|
110
|
-
# Print detailed results
|
|
111
|
-
print_results: bool = False
|
|
112
|
-
# Save the result to a file
|
|
113
|
-
save_result_to_file: Optional[str] = None
|
|
114
|
-
|
|
115
|
-
# debug_mode=True enables debug logs
|
|
116
|
-
debug_mode: bool = False
|
|
117
|
-
|
|
118
|
-
def set_eval_id(self) -> str:
|
|
119
|
-
if self.eval_id is None:
|
|
120
|
-
self.eval_id = str(uuid4())
|
|
121
|
-
logger.debug(f"*********** Evaluation ID: {self.eval_id} ***********")
|
|
122
|
-
return self.eval_id
|
|
123
|
-
|
|
124
|
-
def set_debug_mode(self) -> None:
|
|
125
|
-
if self.debug_mode or getenv("AGNO_DEBUG", "false").lower() == "true":
|
|
126
|
-
self.debug_mode = True
|
|
127
|
-
set_log_level_to_debug()
|
|
128
|
-
logger.debug("Debug logs enabled")
|
|
129
|
-
else:
|
|
130
|
-
set_log_level_to_info()
|
|
131
|
-
|
|
132
|
-
def run(self, *, print_summary: bool = False, print_results: bool = False) -> PerfResult:
|
|
133
|
-
from rich.console import Console
|
|
134
|
-
from rich.live import Live
|
|
135
|
-
from rich.status import Status
|
|
136
|
-
|
|
137
|
-
run_times = []
|
|
138
|
-
memory_usages = []
|
|
139
|
-
self.set_eval_id()
|
|
140
|
-
self.set_debug_mode()
|
|
141
|
-
self.print_results = print_results
|
|
142
|
-
self.print_summary = print_summary
|
|
143
|
-
|
|
144
|
-
# Add a spinner while running the evaluations
|
|
145
|
-
console = Console()
|
|
146
|
-
with Live(console=console, transient=True) as live_log:
|
|
147
|
-
# Measure run time
|
|
148
|
-
for i in range(self.num_iterations):
|
|
149
|
-
status = Status(
|
|
150
|
-
f"Running run time evaluation {i + 1}...", spinner="dots", speed=1.0, refresh_per_second=10
|
|
151
|
-
)
|
|
152
|
-
live_log.update(status)
|
|
153
|
-
|
|
154
|
-
timer = Timer()
|
|
155
|
-
# Start the timer
|
|
156
|
-
timer.start()
|
|
157
|
-
# Run the function
|
|
158
|
-
self.func()
|
|
159
|
-
# Stop the timer
|
|
160
|
-
timer.stop()
|
|
161
|
-
# Append the time taken
|
|
162
|
-
run_times.append(timer.elapsed)
|
|
163
|
-
logger.debug(f"\nRun {i + 1}:")
|
|
164
|
-
logger.debug(f"Time taken: {timer.elapsed:.6f} seconds")
|
|
165
|
-
status.stop()
|
|
166
|
-
|
|
167
|
-
# Measure memory usage
|
|
168
|
-
for i in range(self.num_iterations):
|
|
169
|
-
status = Status(
|
|
170
|
-
f"Running memory usage evaluation {i + 1}...", spinner="dots", speed=1.0, refresh_per_second=10
|
|
171
|
-
)
|
|
172
|
-
live_log.update(status)
|
|
173
|
-
mem_usage = memory_usage((self.func, (), {}), interval=0.1, max_iterations=1, max_usage=True)
|
|
174
|
-
memory_usages.append(mem_usage)
|
|
175
|
-
logger.debug(f"\nRun {i + 1}:")
|
|
176
|
-
logger.debug(f"Memory usage: {mem_usage} MiB")
|
|
177
|
-
status.stop()
|
|
178
|
-
|
|
179
|
-
# Create and store the result
|
|
180
|
-
self.result = PerfResult(run_times=run_times, memory_usages=memory_usages)
|
|
181
|
-
|
|
182
|
-
# -*- Save result to file if save_result_to_file is set
|
|
183
|
-
if self.save_result_to_file is not None and self.result is not None:
|
|
184
|
-
try:
|
|
185
|
-
import json
|
|
186
|
-
|
|
187
|
-
fn_path = Path(self.save_result_to_file.format(name=self.name, eval_id=self.eval_id))
|
|
188
|
-
if not fn_path.parent.exists():
|
|
189
|
-
fn_path.parent.mkdir(parents=True, exist_ok=True)
|
|
190
|
-
fn_path.write_text(json.dumps(asdict(self.result), indent=4))
|
|
191
|
-
except Exception as e:
|
|
192
|
-
logger.warning(f"Failed to save result to file: {e}")
|
|
193
|
-
|
|
194
|
-
# Show results
|
|
195
|
-
if self.print_results:
|
|
196
|
-
self.result.print_results(console)
|
|
197
|
-
if self.print_summary or self.print_results:
|
|
198
|
-
self.result.print_summary(console)
|
|
199
|
-
|
|
200
|
-
logger.debug(f"*********** Evaluation End: {self.eval_id} ***********")
|
|
201
|
-
return self.result
|
agno/file/__init__.py
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
from agno.file.file import File
|
agno/file/file.py
DELETED
|
@@ -1,16 +0,0 @@
|
|
|
1
|
-
from dataclasses import dataclass
|
|
2
|
-
from typing import Any, List, Optional
|
|
3
|
-
|
|
4
|
-
from agno.utils.common import dataclass_to_dict
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
@dataclass
|
|
8
|
-
class File:
|
|
9
|
-
name: Optional[str] = None
|
|
10
|
-
description: Optional[str] = None
|
|
11
|
-
columns: Optional[List[str]] = None
|
|
12
|
-
path: Optional[str] = None
|
|
13
|
-
type: str = "FILE"
|
|
14
|
-
|
|
15
|
-
def get_metadata(self) -> dict[str, Any]:
|
|
16
|
-
return dataclass_to_dict(self, exclude_none=True)
|
agno/file/local/csv.py
DELETED
|
@@ -1,32 +0,0 @@
|
|
|
1
|
-
from dataclasses import dataclass
|
|
2
|
-
from typing import Any
|
|
3
|
-
|
|
4
|
-
from agno.file import File
|
|
5
|
-
from agno.utils.common import dataclass_to_dict
|
|
6
|
-
from agno.utils.log import logger
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
@dataclass
|
|
10
|
-
class CsvFile(File):
|
|
11
|
-
path: str = "" # type: ignore
|
|
12
|
-
type: str = "CSV"
|
|
13
|
-
|
|
14
|
-
def get_metadata(self) -> dict[str, Any]:
|
|
15
|
-
if self.name is None:
|
|
16
|
-
from pathlib import Path
|
|
17
|
-
|
|
18
|
-
self.name = Path(self.path).name
|
|
19
|
-
|
|
20
|
-
if self.columns is None:
|
|
21
|
-
try:
|
|
22
|
-
# Get the columns from the file
|
|
23
|
-
import csv
|
|
24
|
-
|
|
25
|
-
with open(self.path) as csvfile:
|
|
26
|
-
dict_reader = csv.DictReader(csvfile)
|
|
27
|
-
if dict_reader.fieldnames is not None:
|
|
28
|
-
self.columns = list(dict_reader.fieldnames)
|
|
29
|
-
except Exception as e:
|
|
30
|
-
logger.debug(f"Error getting columns from file: {e}")
|
|
31
|
-
|
|
32
|
-
return dataclass_to_dict(self, exclude_none=True)
|
agno/file/local/txt.py
DELETED
|
@@ -1,19 +0,0 @@
|
|
|
1
|
-
from dataclasses import dataclass
|
|
2
|
-
from typing import Any
|
|
3
|
-
|
|
4
|
-
from agno.file import File
|
|
5
|
-
from agno.utils.common import dataclass_to_dict
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
@dataclass
|
|
9
|
-
class TextFile(File):
|
|
10
|
-
path: str = "" # type: ignore
|
|
11
|
-
type: str = "TEXT"
|
|
12
|
-
|
|
13
|
-
def get_metadata(self) -> dict[str, Any]:
|
|
14
|
-
if self.name is None:
|
|
15
|
-
from pathlib import Path
|
|
16
|
-
|
|
17
|
-
self.name = Path(self.path).name
|
|
18
|
-
|
|
19
|
-
return dataclass_to_dict(self, exclude_none=True)
|