agno 1.8.1__py3-none-any.whl → 2.0.0a1__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- agno/__init__.py +8 -0
- agno/agent/__init__.py +19 -27
- agno/agent/agent.py +2778 -4123
- agno/api/agent.py +9 -65
- agno/api/api.py +5 -46
- agno/api/evals.py +6 -17
- agno/api/os.py +17 -0
- agno/api/routes.py +6 -41
- agno/api/schemas/__init__.py +9 -0
- agno/api/schemas/agent.py +5 -21
- agno/api/schemas/evals.py +7 -16
- agno/api/schemas/os.py +14 -0
- agno/api/schemas/team.py +5 -21
- agno/api/schemas/utils.py +21 -0
- agno/api/schemas/workflows.py +11 -7
- agno/api/settings.py +53 -0
- agno/api/team.py +9 -64
- agno/api/workflow.py +28 -0
- agno/cloud/aws/base.py +214 -0
- agno/cloud/aws/s3/__init__.py +2 -0
- agno/cloud/aws/s3/api_client.py +43 -0
- agno/cloud/aws/s3/bucket.py +195 -0
- agno/cloud/aws/s3/object.py +57 -0
- agno/db/__init__.py +24 -0
- agno/db/base.py +245 -0
- agno/db/dynamo/__init__.py +3 -0
- agno/db/dynamo/dynamo.py +1749 -0
- agno/db/dynamo/schemas.py +278 -0
- agno/db/dynamo/utils.py +684 -0
- agno/db/firestore/__init__.py +3 -0
- agno/db/firestore/firestore.py +1438 -0
- agno/db/firestore/schemas.py +130 -0
- agno/db/firestore/utils.py +278 -0
- agno/db/gcs_json/__init__.py +3 -0
- agno/db/gcs_json/gcs_json_db.py +1001 -0
- agno/db/gcs_json/utils.py +194 -0
- agno/db/in_memory/__init__.py +3 -0
- agno/db/in_memory/in_memory_db.py +888 -0
- agno/db/in_memory/utils.py +172 -0
- agno/db/json/__init__.py +3 -0
- agno/db/json/json_db.py +1051 -0
- agno/db/json/utils.py +196 -0
- agno/db/migrations/v1_to_v2.py +162 -0
- agno/db/mongo/__init__.py +3 -0
- agno/db/mongo/mongo.py +1417 -0
- agno/db/mongo/schemas.py +77 -0
- agno/db/mongo/utils.py +204 -0
- agno/db/mysql/__init__.py +3 -0
- agno/db/mysql/mysql.py +1719 -0
- agno/db/mysql/schemas.py +124 -0
- agno/db/mysql/utils.py +298 -0
- agno/db/postgres/__init__.py +3 -0
- agno/db/postgres/postgres.py +1720 -0
- agno/db/postgres/schemas.py +124 -0
- agno/db/postgres/utils.py +281 -0
- agno/db/redis/__init__.py +3 -0
- agno/db/redis/redis.py +1371 -0
- agno/db/redis/schemas.py +109 -0
- agno/db/redis/utils.py +288 -0
- agno/db/schemas/__init__.py +3 -0
- agno/db/schemas/evals.py +33 -0
- agno/db/schemas/knowledge.py +40 -0
- agno/db/schemas/memory.py +46 -0
- agno/db/singlestore/__init__.py +3 -0
- agno/db/singlestore/schemas.py +116 -0
- agno/db/singlestore/singlestore.py +1722 -0
- agno/db/singlestore/utils.py +327 -0
- agno/db/sqlite/__init__.py +3 -0
- agno/db/sqlite/schemas.py +119 -0
- agno/db/sqlite/sqlite.py +1680 -0
- agno/db/sqlite/utils.py +269 -0
- agno/db/utils.py +88 -0
- agno/eval/__init__.py +14 -0
- agno/eval/accuracy.py +142 -43
- agno/eval/performance.py +88 -23
- agno/eval/reliability.py +73 -20
- agno/eval/utils.py +23 -13
- agno/integrations/discord/__init__.py +3 -0
- agno/{app → integrations}/discord/client.py +10 -10
- agno/knowledge/__init__.py +2 -2
- agno/{document → knowledge}/chunking/agentic.py +2 -2
- agno/{document → knowledge}/chunking/document.py +2 -2
- agno/{document → knowledge}/chunking/fixed.py +3 -3
- agno/{document → knowledge}/chunking/markdown.py +2 -2
- agno/{document → knowledge}/chunking/recursive.py +2 -2
- agno/{document → knowledge}/chunking/row.py +2 -2
- agno/knowledge/chunking/semantic.py +59 -0
- agno/knowledge/chunking/strategy.py +121 -0
- agno/knowledge/content.py +74 -0
- agno/knowledge/document/__init__.py +5 -0
- agno/{document → knowledge/document}/base.py +12 -2
- agno/knowledge/embedder/__init__.py +5 -0
- agno/{embedder → knowledge/embedder}/aws_bedrock.py +127 -1
- agno/{embedder → knowledge/embedder}/azure_openai.py +65 -1
- agno/{embedder → knowledge/embedder}/base.py +6 -0
- agno/{embedder → knowledge/embedder}/cohere.py +72 -1
- agno/{embedder → knowledge/embedder}/fastembed.py +17 -1
- agno/{embedder → knowledge/embedder}/fireworks.py +1 -1
- agno/{embedder → knowledge/embedder}/google.py +74 -1
- agno/{embedder → knowledge/embedder}/huggingface.py +36 -2
- agno/{embedder → knowledge/embedder}/jina.py +48 -2
- agno/knowledge/embedder/langdb.py +22 -0
- agno/knowledge/embedder/mistral.py +139 -0
- agno/{embedder → knowledge/embedder}/nebius.py +1 -1
- agno/{embedder → knowledge/embedder}/ollama.py +54 -3
- agno/knowledge/embedder/openai.py +223 -0
- agno/{embedder → knowledge/embedder}/sentence_transformer.py +16 -1
- agno/{embedder → knowledge/embedder}/together.py +1 -1
- agno/{embedder → knowledge/embedder}/voyageai.py +49 -1
- agno/knowledge/knowledge.py +1515 -0
- agno/knowledge/reader/__init__.py +7 -0
- agno/{document → knowledge}/reader/arxiv_reader.py +32 -4
- agno/knowledge/reader/base.py +88 -0
- agno/{document → knowledge}/reader/csv_reader.py +68 -15
- agno/knowledge/reader/docx_reader.py +83 -0
- agno/{document → knowledge}/reader/firecrawl_reader.py +42 -21
- agno/knowledge/reader/gcs_reader.py +67 -0
- agno/{document → knowledge}/reader/json_reader.py +30 -9
- agno/{document → knowledge}/reader/markdown_reader.py +36 -9
- agno/{document → knowledge}/reader/pdf_reader.py +79 -21
- agno/knowledge/reader/reader_factory.py +275 -0
- agno/knowledge/reader/s3_reader.py +171 -0
- agno/{document → knowledge}/reader/text_reader.py +31 -10
- agno/knowledge/reader/url_reader.py +84 -0
- agno/knowledge/reader/web_search_reader.py +389 -0
- agno/{document → knowledge}/reader/website_reader.py +37 -10
- agno/knowledge/reader/wikipedia_reader.py +59 -0
- agno/knowledge/reader/youtube_reader.py +78 -0
- agno/knowledge/remote_content/remote_content.py +88 -0
- agno/{reranker → knowledge/reranker}/base.py +1 -1
- agno/{reranker → knowledge/reranker}/cohere.py +2 -2
- agno/{reranker → knowledge/reranker}/infinity.py +2 -2
- agno/{reranker → knowledge/reranker}/sentence_transformer.py +2 -2
- agno/knowledge/types.py +30 -0
- agno/knowledge/utils.py +169 -0
- agno/memory/__init__.py +2 -10
- agno/memory/manager.py +1003 -148
- agno/models/aimlapi/__init__.py +2 -2
- agno/models/aimlapi/aimlapi.py +6 -6
- agno/models/anthropic/claude.py +129 -82
- agno/models/aws/bedrock.py +107 -175
- agno/models/aws/claude.py +64 -18
- agno/models/azure/ai_foundry.py +73 -23
- agno/models/base.py +347 -287
- agno/models/cerebras/cerebras.py +84 -27
- agno/models/cohere/chat.py +106 -98
- agno/models/google/gemini.py +100 -42
- agno/models/groq/groq.py +97 -35
- agno/models/huggingface/huggingface.py +92 -27
- agno/models/ibm/watsonx.py +72 -13
- agno/models/litellm/chat.py +85 -13
- agno/models/message.py +38 -144
- agno/models/meta/llama.py +85 -49
- agno/models/metrics.py +120 -0
- agno/models/mistral/mistral.py +90 -21
- agno/models/ollama/__init__.py +0 -2
- agno/models/ollama/chat.py +84 -46
- agno/models/openai/chat.py +121 -23
- agno/models/openai/responses.py +178 -105
- agno/models/perplexity/perplexity.py +26 -2
- agno/models/portkey/portkey.py +0 -7
- agno/models/response.py +14 -8
- agno/models/utils.py +20 -0
- agno/models/vercel/__init__.py +2 -2
- agno/models/vercel/v0.py +1 -1
- agno/models/vllm/__init__.py +2 -2
- agno/models/vllm/vllm.py +3 -3
- agno/models/xai/xai.py +10 -10
- agno/os/__init__.py +3 -0
- agno/os/app.py +393 -0
- agno/os/auth.py +47 -0
- agno/os/config.py +103 -0
- agno/os/interfaces/agui/__init__.py +3 -0
- agno/os/interfaces/agui/agui.py +31 -0
- agno/{app/agui/async_router.py → os/interfaces/agui/router.py} +16 -16
- agno/{app → os/interfaces}/agui/utils.py +65 -28
- agno/os/interfaces/base.py +21 -0
- agno/os/interfaces/slack/__init__.py +3 -0
- agno/{app/slack/async_router.py → os/interfaces/slack/router.py} +3 -5
- agno/os/interfaces/slack/slack.py +33 -0
- agno/os/interfaces/whatsapp/__init__.py +3 -0
- agno/{app/whatsapp/async_router.py → os/interfaces/whatsapp/router.py} +4 -7
- agno/os/interfaces/whatsapp/whatsapp.py +30 -0
- agno/os/router.py +843 -0
- agno/os/routers/__init__.py +3 -0
- agno/os/routers/evals/__init__.py +3 -0
- agno/os/routers/evals/evals.py +204 -0
- agno/os/routers/evals/schemas.py +142 -0
- agno/os/routers/evals/utils.py +161 -0
- agno/os/routers/knowledge/__init__.py +3 -0
- agno/os/routers/knowledge/knowledge.py +413 -0
- agno/os/routers/knowledge/schemas.py +118 -0
- agno/os/routers/memory/__init__.py +3 -0
- agno/os/routers/memory/memory.py +179 -0
- agno/os/routers/memory/schemas.py +58 -0
- agno/os/routers/metrics/__init__.py +3 -0
- agno/os/routers/metrics/metrics.py +58 -0
- agno/os/routers/metrics/schemas.py +47 -0
- agno/os/routers/session/__init__.py +3 -0
- agno/os/routers/session/session.py +163 -0
- agno/os/schema.py +892 -0
- agno/{app/playground → os}/settings.py +8 -15
- agno/os/utils.py +270 -0
- agno/reasoning/azure_ai_foundry.py +4 -4
- agno/reasoning/deepseek.py +4 -4
- agno/reasoning/default.py +6 -11
- agno/reasoning/groq.py +4 -4
- agno/reasoning/helpers.py +4 -6
- agno/reasoning/ollama.py +4 -4
- agno/reasoning/openai.py +4 -4
- agno/run/{response.py → agent.py} +144 -72
- agno/run/base.py +44 -58
- agno/run/cancel.py +83 -0
- agno/run/team.py +133 -77
- agno/run/workflow.py +537 -12
- agno/session/__init__.py +10 -0
- agno/session/agent.py +244 -0
- agno/session/summary.py +225 -0
- agno/session/team.py +262 -0
- agno/{storage/session/v2 → session}/workflow.py +47 -24
- agno/team/__init__.py +15 -16
- agno/team/team.py +2961 -4253
- agno/tools/agentql.py +14 -5
- agno/tools/airflow.py +9 -4
- agno/tools/api.py +7 -3
- agno/tools/apify.py +2 -46
- agno/tools/arxiv.py +8 -3
- agno/tools/aws_lambda.py +7 -5
- agno/tools/aws_ses.py +7 -1
- agno/tools/baidusearch.py +4 -1
- agno/tools/bitbucket.py +4 -4
- agno/tools/brandfetch.py +14 -11
- agno/tools/bravesearch.py +4 -1
- agno/tools/brightdata.py +42 -22
- agno/tools/browserbase.py +13 -4
- agno/tools/calcom.py +12 -10
- agno/tools/calculator.py +10 -27
- agno/tools/cartesia.py +18 -13
- agno/tools/{clickup_tool.py → clickup.py} +12 -25
- agno/tools/confluence.py +8 -8
- agno/tools/crawl4ai.py +7 -1
- agno/tools/csv_toolkit.py +9 -8
- agno/tools/dalle.py +18 -11
- agno/tools/daytona.py +13 -16
- agno/tools/decorator.py +6 -3
- agno/tools/desi_vocal.py +16 -7
- agno/tools/discord.py +11 -8
- agno/tools/docker.py +30 -42
- agno/tools/duckdb.py +34 -53
- agno/tools/duckduckgo.py +8 -7
- agno/tools/e2b.py +61 -61
- agno/tools/eleven_labs.py +35 -28
- agno/tools/email.py +4 -1
- agno/tools/evm.py +7 -1
- agno/tools/exa.py +19 -14
- agno/tools/fal.py +29 -29
- agno/tools/file.py +9 -8
- agno/tools/financial_datasets.py +25 -44
- agno/tools/firecrawl.py +22 -22
- agno/tools/function.py +68 -17
- agno/tools/giphy.py +22 -10
- agno/tools/github.py +48 -126
- agno/tools/gmail.py +45 -61
- agno/tools/google_bigquery.py +7 -6
- agno/tools/google_maps.py +11 -26
- agno/tools/googlesearch.py +7 -2
- agno/tools/googlesheets.py +21 -17
- agno/tools/hackernews.py +9 -5
- agno/tools/jina.py +5 -4
- agno/tools/jira.py +18 -9
- agno/tools/knowledge.py +31 -32
- agno/tools/linear.py +18 -33
- agno/tools/linkup.py +5 -1
- agno/tools/local_file_system.py +8 -5
- agno/tools/lumalab.py +31 -19
- agno/tools/mem0.py +18 -12
- agno/tools/memori.py +14 -10
- agno/tools/mlx_transcribe.py +3 -2
- agno/tools/models/azure_openai.py +32 -14
- agno/tools/models/gemini.py +58 -31
- agno/tools/models/groq.py +29 -20
- agno/tools/models/nebius.py +27 -11
- agno/tools/models_labs.py +39 -15
- agno/tools/moviepy_video.py +7 -6
- agno/tools/neo4j.py +10 -8
- agno/tools/newspaper.py +7 -2
- agno/tools/newspaper4k.py +8 -3
- agno/tools/openai.py +57 -26
- agno/tools/openbb.py +12 -11
- agno/tools/opencv.py +62 -46
- agno/tools/openweather.py +14 -12
- agno/tools/pandas.py +11 -3
- agno/tools/postgres.py +4 -12
- agno/tools/pubmed.py +4 -1
- agno/tools/python.py +9 -22
- agno/tools/reasoning.py +35 -27
- agno/tools/reddit.py +11 -26
- agno/tools/replicate.py +54 -41
- agno/tools/resend.py +4 -1
- agno/tools/scrapegraph.py +15 -14
- agno/tools/searxng.py +10 -23
- agno/tools/serpapi.py +6 -3
- agno/tools/serper.py +13 -4
- agno/tools/shell.py +9 -2
- agno/tools/slack.py +12 -11
- agno/tools/sleep.py +3 -2
- agno/tools/spider.py +24 -4
- agno/tools/sql.py +7 -6
- agno/tools/tavily.py +6 -4
- agno/tools/telegram.py +12 -4
- agno/tools/todoist.py +11 -31
- agno/tools/toolkit.py +1 -1
- agno/tools/trafilatura.py +22 -6
- agno/tools/trello.py +9 -22
- agno/tools/twilio.py +10 -3
- agno/tools/user_control_flow.py +6 -1
- agno/tools/valyu.py +34 -5
- agno/tools/visualization.py +19 -28
- agno/tools/webbrowser.py +4 -3
- agno/tools/webex.py +11 -7
- agno/tools/website.py +15 -46
- agno/tools/webtools.py +12 -4
- agno/tools/whatsapp.py +5 -9
- agno/tools/wikipedia.py +20 -13
- agno/tools/x.py +14 -13
- agno/tools/yfinance.py +13 -40
- agno/tools/youtube.py +26 -20
- agno/tools/zendesk.py +7 -2
- agno/tools/zep.py +10 -7
- agno/tools/zoom.py +10 -9
- agno/utils/common.py +1 -19
- agno/utils/events.py +95 -118
- agno/utils/knowledge.py +29 -0
- agno/utils/log.py +2 -2
- agno/utils/mcp.py +11 -5
- agno/utils/media.py +39 -0
- agno/utils/message.py +12 -1
- agno/utils/models/claude.py +6 -4
- agno/utils/models/mistral.py +8 -7
- agno/utils/models/schema_utils.py +3 -3
- agno/utils/pprint.py +33 -32
- agno/utils/print_response/agent.py +779 -0
- agno/utils/print_response/team.py +1565 -0
- agno/utils/print_response/workflow.py +1451 -0
- agno/utils/prompts.py +14 -14
- agno/utils/reasoning.py +87 -0
- agno/utils/response.py +42 -42
- agno/utils/string.py +8 -22
- agno/utils/team.py +50 -0
- agno/utils/timer.py +2 -2
- agno/vectordb/base.py +33 -21
- agno/vectordb/cassandra/cassandra.py +287 -23
- agno/vectordb/chroma/chromadb.py +482 -59
- agno/vectordb/clickhouse/clickhousedb.py +270 -63
- agno/vectordb/couchbase/couchbase.py +309 -29
- agno/vectordb/lancedb/lance_db.py +360 -21
- agno/vectordb/langchaindb/__init__.py +5 -0
- agno/vectordb/langchaindb/langchaindb.py +145 -0
- agno/vectordb/lightrag/__init__.py +5 -0
- agno/vectordb/lightrag/lightrag.py +374 -0
- agno/vectordb/llamaindex/llamaindexdb.py +127 -0
- agno/vectordb/milvus/milvus.py +242 -32
- agno/vectordb/mongodb/mongodb.py +200 -24
- agno/vectordb/pgvector/pgvector.py +319 -37
- agno/vectordb/pineconedb/pineconedb.py +221 -27
- agno/vectordb/qdrant/qdrant.py +334 -14
- agno/vectordb/singlestore/singlestore.py +286 -29
- agno/vectordb/surrealdb/surrealdb.py +187 -7
- agno/vectordb/upstashdb/upstashdb.py +342 -26
- agno/vectordb/weaviate/weaviate.py +227 -165
- agno/workflow/__init__.py +17 -13
- agno/workflow/{v2/condition.py → condition.py} +135 -32
- agno/workflow/{v2/loop.py → loop.py} +115 -28
- agno/workflow/{v2/parallel.py → parallel.py} +138 -108
- agno/workflow/{v2/router.py → router.py} +133 -32
- agno/workflow/{v2/step.py → step.py} +200 -42
- agno/workflow/{v2/steps.py → steps.py} +147 -66
- agno/workflow/types.py +482 -0
- agno/workflow/workflow.py +2394 -696
- agno-2.0.0a1.dist-info/METADATA +355 -0
- agno-2.0.0a1.dist-info/RECORD +514 -0
- agno/agent/metrics.py +0 -107
- agno/api/app.py +0 -35
- agno/api/playground.py +0 -92
- agno/api/schemas/app.py +0 -12
- agno/api/schemas/playground.py +0 -22
- agno/api/schemas/user.py +0 -35
- agno/api/schemas/workspace.py +0 -46
- agno/api/user.py +0 -160
- agno/api/workflows.py +0 -33
- agno/api/workspace.py +0 -175
- agno/app/agui/__init__.py +0 -3
- agno/app/agui/app.py +0 -17
- agno/app/agui/sync_router.py +0 -120
- agno/app/base.py +0 -186
- agno/app/discord/__init__.py +0 -3
- agno/app/fastapi/__init__.py +0 -3
- agno/app/fastapi/app.py +0 -107
- agno/app/fastapi/async_router.py +0 -457
- agno/app/fastapi/sync_router.py +0 -448
- agno/app/playground/app.py +0 -228
- agno/app/playground/async_router.py +0 -1050
- agno/app/playground/deploy.py +0 -249
- agno/app/playground/operator.py +0 -183
- agno/app/playground/schemas.py +0 -220
- agno/app/playground/serve.py +0 -55
- agno/app/playground/sync_router.py +0 -1042
- agno/app/playground/utils.py +0 -46
- agno/app/settings.py +0 -15
- agno/app/slack/__init__.py +0 -3
- agno/app/slack/app.py +0 -19
- agno/app/slack/sync_router.py +0 -92
- agno/app/utils.py +0 -54
- agno/app/whatsapp/__init__.py +0 -3
- agno/app/whatsapp/app.py +0 -15
- agno/app/whatsapp/sync_router.py +0 -197
- agno/cli/auth_server.py +0 -249
- agno/cli/config.py +0 -274
- agno/cli/console.py +0 -88
- agno/cli/credentials.py +0 -23
- agno/cli/entrypoint.py +0 -571
- agno/cli/operator.py +0 -357
- agno/cli/settings.py +0 -96
- agno/cli/ws/ws_cli.py +0 -817
- agno/constants.py +0 -13
- agno/document/__init__.py +0 -5
- agno/document/chunking/semantic.py +0 -45
- agno/document/chunking/strategy.py +0 -31
- agno/document/reader/__init__.py +0 -5
- agno/document/reader/base.py +0 -47
- agno/document/reader/docx_reader.py +0 -60
- agno/document/reader/gcs/pdf_reader.py +0 -44
- agno/document/reader/s3/pdf_reader.py +0 -59
- agno/document/reader/s3/text_reader.py +0 -63
- agno/document/reader/url_reader.py +0 -59
- agno/document/reader/youtube_reader.py +0 -58
- agno/embedder/__init__.py +0 -5
- agno/embedder/langdb.py +0 -80
- agno/embedder/mistral.py +0 -82
- agno/embedder/openai.py +0 -78
- agno/file/__init__.py +0 -5
- agno/file/file.py +0 -16
- agno/file/local/csv.py +0 -32
- agno/file/local/txt.py +0 -19
- agno/infra/app.py +0 -240
- agno/infra/base.py +0 -144
- agno/infra/context.py +0 -20
- agno/infra/db_app.py +0 -52
- agno/infra/resource.py +0 -205
- agno/infra/resources.py +0 -55
- agno/knowledge/agent.py +0 -702
- agno/knowledge/arxiv.py +0 -33
- agno/knowledge/combined.py +0 -36
- agno/knowledge/csv.py +0 -144
- agno/knowledge/csv_url.py +0 -124
- agno/knowledge/document.py +0 -223
- agno/knowledge/docx.py +0 -137
- agno/knowledge/firecrawl.py +0 -34
- agno/knowledge/gcs/__init__.py +0 -0
- agno/knowledge/gcs/base.py +0 -39
- agno/knowledge/gcs/pdf.py +0 -125
- agno/knowledge/json.py +0 -137
- agno/knowledge/langchain.py +0 -71
- agno/knowledge/light_rag.py +0 -273
- agno/knowledge/llamaindex.py +0 -66
- agno/knowledge/markdown.py +0 -154
- agno/knowledge/pdf.py +0 -164
- agno/knowledge/pdf_bytes.py +0 -42
- agno/knowledge/pdf_url.py +0 -148
- agno/knowledge/s3/__init__.py +0 -0
- agno/knowledge/s3/base.py +0 -64
- agno/knowledge/s3/pdf.py +0 -33
- agno/knowledge/s3/text.py +0 -34
- agno/knowledge/text.py +0 -141
- agno/knowledge/url.py +0 -46
- agno/knowledge/website.py +0 -179
- agno/knowledge/wikipedia.py +0 -32
- agno/knowledge/youtube.py +0 -35
- agno/memory/agent.py +0 -423
- agno/memory/classifier.py +0 -104
- agno/memory/db/__init__.py +0 -5
- agno/memory/db/base.py +0 -42
- agno/memory/db/mongodb.py +0 -189
- agno/memory/db/postgres.py +0 -203
- agno/memory/db/sqlite.py +0 -193
- agno/memory/memory.py +0 -22
- agno/memory/row.py +0 -36
- agno/memory/summarizer.py +0 -201
- agno/memory/summary.py +0 -19
- agno/memory/team.py +0 -415
- agno/memory/v2/__init__.py +0 -2
- agno/memory/v2/db/__init__.py +0 -1
- agno/memory/v2/db/base.py +0 -42
- agno/memory/v2/db/firestore.py +0 -339
- agno/memory/v2/db/mongodb.py +0 -196
- agno/memory/v2/db/postgres.py +0 -214
- agno/memory/v2/db/redis.py +0 -187
- agno/memory/v2/db/schema.py +0 -54
- agno/memory/v2/db/sqlite.py +0 -209
- agno/memory/v2/manager.py +0 -437
- agno/memory/v2/memory.py +0 -1097
- agno/memory/v2/schema.py +0 -55
- agno/memory/v2/summarizer.py +0 -215
- agno/memory/workflow.py +0 -38
- agno/models/ollama/tools.py +0 -430
- agno/models/qwen/__init__.py +0 -5
- agno/playground/__init__.py +0 -10
- agno/playground/deploy.py +0 -3
- agno/playground/playground.py +0 -3
- agno/playground/serve.py +0 -3
- agno/playground/settings.py +0 -3
- agno/reranker/__init__.py +0 -0
- agno/run/v2/__init__.py +0 -0
- agno/run/v2/workflow.py +0 -567
- agno/storage/__init__.py +0 -0
- agno/storage/agent/__init__.py +0 -0
- agno/storage/agent/dynamodb.py +0 -1
- agno/storage/agent/json.py +0 -1
- agno/storage/agent/mongodb.py +0 -1
- agno/storage/agent/postgres.py +0 -1
- agno/storage/agent/singlestore.py +0 -1
- agno/storage/agent/sqlite.py +0 -1
- agno/storage/agent/yaml.py +0 -1
- agno/storage/base.py +0 -60
- agno/storage/dynamodb.py +0 -673
- agno/storage/firestore.py +0 -297
- agno/storage/gcs_json.py +0 -261
- agno/storage/in_memory.py +0 -234
- agno/storage/json.py +0 -237
- agno/storage/mongodb.py +0 -328
- agno/storage/mysql.py +0 -685
- agno/storage/postgres.py +0 -682
- agno/storage/redis.py +0 -336
- agno/storage/session/__init__.py +0 -16
- agno/storage/session/agent.py +0 -64
- agno/storage/session/team.py +0 -63
- agno/storage/session/v2/__init__.py +0 -5
- agno/storage/session/workflow.py +0 -61
- agno/storage/singlestore.py +0 -606
- agno/storage/sqlite.py +0 -646
- agno/storage/workflow/__init__.py +0 -0
- agno/storage/workflow/mongodb.py +0 -1
- agno/storage/workflow/postgres.py +0 -1
- agno/storage/workflow/sqlite.py +0 -1
- agno/storage/yaml.py +0 -241
- agno/tools/thinking.py +0 -73
- agno/utils/defaults.py +0 -57
- agno/utils/filesystem.py +0 -39
- agno/utils/git.py +0 -52
- agno/utils/json_io.py +0 -30
- agno/utils/load_env.py +0 -19
- agno/utils/py_io.py +0 -19
- agno/utils/pyproject.py +0 -18
- agno/utils/resource_filter.py +0 -31
- agno/workflow/v2/__init__.py +0 -21
- agno/workflow/v2/types.py +0 -357
- agno/workflow/v2/workflow.py +0 -3312
- agno/workspace/__init__.py +0 -0
- agno/workspace/config.py +0 -325
- agno/workspace/enums.py +0 -6
- agno/workspace/helpers.py +0 -52
- agno/workspace/operator.py +0 -757
- agno/workspace/settings.py +0 -158
- agno-1.8.1.dist-info/METADATA +0 -982
- agno-1.8.1.dist-info/RECORD +0 -566
- agno-1.8.1.dist-info/entry_points.txt +0 -3
- /agno/{app → db/migrations}/__init__.py +0 -0
- /agno/{app/playground/__init__.py → db/schemas/metrics.py} +0 -0
- /agno/{cli → integrations}/__init__.py +0 -0
- /agno/{cli/ws → knowledge/chunking}/__init__.py +0 -0
- /agno/{document/chunking → knowledge/remote_content}/__init__.py +0 -0
- /agno/{document/reader/gcs → knowledge/reranker}/__init__.py +0 -0
- /agno/{document/reader/s3 → os/interfaces}/__init__.py +0 -0
- /agno/{app → os/interfaces}/slack/security.py +0 -0
- /agno/{app → os/interfaces}/whatsapp/security.py +0 -0
- /agno/{file/local → utils/print_response}/__init__.py +0 -0
- /agno/{infra → vectordb/llamaindex}/__init__.py +0 -0
- {agno-1.8.1.dist-info → agno-2.0.0a1.dist-info}/WHEEL +0 -0
- {agno-1.8.1.dist-info → agno-2.0.0a1.dist-info}/licenses/LICENSE +0 -0
- {agno-1.8.1.dist-info → agno-2.0.0a1.dist-info}/top_level.txt +0 -0
agno/models/openai/chat.py
CHANGED
|
@@ -10,7 +10,9 @@ from agno.exceptions import ModelProviderError
|
|
|
10
10
|
from agno.media import AudioResponse
|
|
11
11
|
from agno.models.base import Model
|
|
12
12
|
from agno.models.message import Message
|
|
13
|
+
from agno.models.metrics import Metrics
|
|
13
14
|
from agno.models.response import ModelResponse
|
|
15
|
+
from agno.run.agent import RunOutput
|
|
14
16
|
from agno.utils.log import log_debug, log_error, log_warning
|
|
15
17
|
from agno.utils.openai import _format_file_for_message, audio_to_message, images_to_message
|
|
16
18
|
|
|
@@ -18,6 +20,7 @@ try:
|
|
|
18
20
|
from openai import APIConnectionError, APIStatusError, RateLimitError
|
|
19
21
|
from openai import AsyncOpenAI as AsyncOpenAIClient
|
|
20
22
|
from openai import OpenAI as OpenAIClient
|
|
23
|
+
from openai.types import CompletionUsage
|
|
21
24
|
from openai.types.chat import ChatCompletionAudio
|
|
22
25
|
from openai.types.chat.chat_completion import ChatCompletion
|
|
23
26
|
from openai.types.chat.chat_completion_chunk import (
|
|
@@ -215,6 +218,15 @@ class OpenAIChat(Model):
|
|
|
215
218
|
|
|
216
219
|
# Add tools
|
|
217
220
|
if tools is not None and len(tools) > 0:
|
|
221
|
+
# Remove unsupported fields for OpenAILike models
|
|
222
|
+
if self.provider in ["AIMLAPI", "Fireworks", "Nvidia"]:
|
|
223
|
+
for tool in tools:
|
|
224
|
+
if tool.get("type") == "function":
|
|
225
|
+
if tool["function"].get("requires_confirmation") is not None:
|
|
226
|
+
del tool["function"]["requires_confirmation"]
|
|
227
|
+
if tool["function"].get("external_execution") is not None:
|
|
228
|
+
del tool["function"]["external_execution"]
|
|
229
|
+
|
|
218
230
|
request_params["tools"] = tools
|
|
219
231
|
|
|
220
232
|
if tool_choice is not None:
|
|
@@ -330,25 +342,43 @@ class OpenAIChat(Model):
|
|
|
330
342
|
def invoke(
|
|
331
343
|
self,
|
|
332
344
|
messages: List[Message],
|
|
345
|
+
assistant_message: Message,
|
|
333
346
|
response_format: Optional[Union[Dict, Type[BaseModel]]] = None,
|
|
334
347
|
tools: Optional[List[Dict[str, Any]]] = None,
|
|
335
348
|
tool_choice: Optional[Union[str, Dict[str, Any]]] = None,
|
|
336
|
-
|
|
349
|
+
run_response: Optional[RunOutput] = None,
|
|
350
|
+
) -> ModelResponse:
|
|
337
351
|
"""
|
|
338
|
-
Send a chat completion request to the OpenAI API.
|
|
352
|
+
Send a chat completion request to the OpenAI API and parse the response.
|
|
339
353
|
|
|
340
354
|
Args:
|
|
341
355
|
messages (List[Message]): A list of messages to send to the model.
|
|
356
|
+
assistant_message (Message): The assistant message to populate.
|
|
357
|
+
response_format (Optional[Union[Dict, Type[BaseModel]]]): The response format to use.
|
|
358
|
+
tools (Optional[List[Dict[str, Any]]]): The tools to use.
|
|
359
|
+
tool_choice (Optional[Union[str, Dict[str, Any]]]): The tool choice to use.
|
|
342
360
|
|
|
343
361
|
Returns:
|
|
344
|
-
|
|
362
|
+
ModelResponse: The chat completion response from the API.
|
|
345
363
|
"""
|
|
346
364
|
try:
|
|
347
|
-
|
|
365
|
+
if run_response and run_response.metrics:
|
|
366
|
+
run_response.metrics.set_time_to_first_token()
|
|
367
|
+
|
|
368
|
+
assistant_message.metrics.start_timer()
|
|
369
|
+
|
|
370
|
+
provider_response = self.get_client().chat.completions.create(
|
|
348
371
|
model=self.id,
|
|
349
372
|
messages=[self._format_message(m) for m in messages], # type: ignore
|
|
350
373
|
**self.get_request_params(response_format=response_format, tools=tools, tool_choice=tool_choice),
|
|
351
374
|
)
|
|
375
|
+
assistant_message.metrics.stop_timer()
|
|
376
|
+
|
|
377
|
+
# Parse the response into an Agno ModelResponse object
|
|
378
|
+
model_response = self._parse_provider_response(provider_response, response_format=response_format)
|
|
379
|
+
|
|
380
|
+
return model_response
|
|
381
|
+
|
|
352
382
|
except RateLimitError as e:
|
|
353
383
|
log_error(f"Rate limit error from OpenAI API: {e}")
|
|
354
384
|
error_message = e.response.json().get("error", {})
|
|
@@ -390,25 +420,42 @@ class OpenAIChat(Model):
|
|
|
390
420
|
async def ainvoke(
|
|
391
421
|
self,
|
|
392
422
|
messages: List[Message],
|
|
423
|
+
assistant_message: Message,
|
|
393
424
|
response_format: Optional[Union[Dict, Type[BaseModel]]] = None,
|
|
394
425
|
tools: Optional[List[Dict[str, Any]]] = None,
|
|
395
426
|
tool_choice: Optional[Union[str, Dict[str, Any]]] = None,
|
|
396
|
-
|
|
427
|
+
run_response: Optional[RunOutput] = None,
|
|
428
|
+
) -> ModelResponse:
|
|
397
429
|
"""
|
|
398
430
|
Sends an asynchronous chat completion request to the OpenAI API.
|
|
399
431
|
|
|
400
432
|
Args:
|
|
401
433
|
messages (List[Message]): A list of messages to send to the model.
|
|
434
|
+
assistant_message (Message): The assistant message to populate.
|
|
435
|
+
response_format (Optional[Union[Dict, Type[BaseModel]]]): The response format to use.
|
|
436
|
+
tools (Optional[List[Dict[str, Any]]]): The tools to use.
|
|
437
|
+
tool_choice (Optional[Union[str, Dict[str, Any]]]): The tool choice to use.
|
|
402
438
|
|
|
403
439
|
Returns:
|
|
404
|
-
|
|
440
|
+
ModelResponse: The chat completion response from the API.
|
|
405
441
|
"""
|
|
406
442
|
try:
|
|
407
|
-
|
|
443
|
+
if run_response and run_response.metrics:
|
|
444
|
+
run_response.metrics.set_time_to_first_token()
|
|
445
|
+
|
|
446
|
+
assistant_message.metrics.start_timer()
|
|
447
|
+
response = await self.get_async_client().chat.completions.create(
|
|
408
448
|
model=self.id,
|
|
409
449
|
messages=[self._format_message(m) for m in messages], # type: ignore
|
|
410
450
|
**self.get_request_params(response_format=response_format, tools=tools, tool_choice=tool_choice),
|
|
411
451
|
)
|
|
452
|
+
assistant_message.metrics.stop_timer()
|
|
453
|
+
|
|
454
|
+
# Parse the response into an Agno ModelResponse object
|
|
455
|
+
provider_response: ModelResponse = self._parse_provider_response(response, response_format=response_format)
|
|
456
|
+
|
|
457
|
+
return provider_response
|
|
458
|
+
|
|
412
459
|
except RateLimitError as e:
|
|
413
460
|
log_error(f"Rate limit error from OpenAI API: {e}")
|
|
414
461
|
error_message = e.response.json().get("error", {})
|
|
@@ -450,10 +497,12 @@ class OpenAIChat(Model):
|
|
|
450
497
|
def invoke_stream(
|
|
451
498
|
self,
|
|
452
499
|
messages: List[Message],
|
|
500
|
+
assistant_message: Message,
|
|
453
501
|
response_format: Optional[Union[Dict, Type[BaseModel]]] = None,
|
|
454
502
|
tools: Optional[List[Dict[str, Any]]] = None,
|
|
455
503
|
tool_choice: Optional[Union[str, Dict[str, Any]]] = None,
|
|
456
|
-
|
|
504
|
+
run_response: Optional[RunOutput] = None,
|
|
505
|
+
) -> Iterator[ModelResponse]:
|
|
457
506
|
"""
|
|
458
507
|
Send a streaming chat completion request to the OpenAI API.
|
|
459
508
|
|
|
@@ -461,17 +510,26 @@ class OpenAIChat(Model):
|
|
|
461
510
|
messages (List[Message]): A list of messages to send to the model.
|
|
462
511
|
|
|
463
512
|
Returns:
|
|
464
|
-
Iterator[
|
|
513
|
+
Iterator[ModelResponse]: An iterator of model responses.
|
|
465
514
|
"""
|
|
466
515
|
|
|
467
516
|
try:
|
|
468
|
-
|
|
517
|
+
if run_response and run_response.metrics:
|
|
518
|
+
run_response.metrics.set_time_to_first_token()
|
|
519
|
+
|
|
520
|
+
assistant_message.metrics.start_timer()
|
|
521
|
+
|
|
522
|
+
for chunk in self.get_client().chat.completions.create(
|
|
469
523
|
model=self.id,
|
|
470
524
|
messages=[self._format_message(m) for m in messages], # type: ignore
|
|
471
525
|
stream=True,
|
|
472
526
|
stream_options={"include_usage": True},
|
|
473
527
|
**self.get_request_params(response_format=response_format, tools=tools, tool_choice=tool_choice),
|
|
474
|
-
)
|
|
528
|
+
):
|
|
529
|
+
yield self._parse_provider_response_delta(chunk)
|
|
530
|
+
|
|
531
|
+
assistant_message.metrics.stop_timer()
|
|
532
|
+
|
|
475
533
|
except RateLimitError as e:
|
|
476
534
|
log_error(f"Rate limit error from OpenAI API: {e}")
|
|
477
535
|
error_message = e.response.json().get("error", {})
|
|
@@ -513,10 +571,12 @@ class OpenAIChat(Model):
|
|
|
513
571
|
async def ainvoke_stream(
|
|
514
572
|
self,
|
|
515
573
|
messages: List[Message],
|
|
574
|
+
assistant_message: Message,
|
|
516
575
|
response_format: Optional[Union[Dict, Type[BaseModel]]] = None,
|
|
517
576
|
tools: Optional[List[Dict[str, Any]]] = None,
|
|
518
577
|
tool_choice: Optional[Union[str, Dict[str, Any]]] = None,
|
|
519
|
-
|
|
578
|
+
run_response: Optional[RunOutput] = None,
|
|
579
|
+
) -> AsyncIterator[ModelResponse]:
|
|
520
580
|
"""
|
|
521
581
|
Sends an asynchronous streaming chat completion request to the OpenAI API.
|
|
522
582
|
|
|
@@ -524,10 +584,15 @@ class OpenAIChat(Model):
|
|
|
524
584
|
messages (List[Message]): A list of messages to send to the model.
|
|
525
585
|
|
|
526
586
|
Returns:
|
|
527
|
-
Any: An asynchronous iterator of
|
|
587
|
+
Any: An asynchronous iterator of model responses.
|
|
528
588
|
"""
|
|
529
589
|
|
|
530
590
|
try:
|
|
591
|
+
if run_response and run_response.metrics:
|
|
592
|
+
run_response.metrics.set_time_to_first_token()
|
|
593
|
+
|
|
594
|
+
assistant_message.metrics.start_timer()
|
|
595
|
+
|
|
531
596
|
async_stream = await self.get_async_client().chat.completions.create(
|
|
532
597
|
model=self.id,
|
|
533
598
|
messages=[self._format_message(m) for m in messages], # type: ignore
|
|
@@ -535,8 +600,12 @@ class OpenAIChat(Model):
|
|
|
535
600
|
stream_options={"include_usage": True},
|
|
536
601
|
**self.get_request_params(response_format=response_format, tools=tools, tool_choice=tool_choice),
|
|
537
602
|
)
|
|
603
|
+
|
|
538
604
|
async for chunk in async_stream:
|
|
539
|
-
yield chunk
|
|
605
|
+
yield self._parse_provider_response_delta(chunk)
|
|
606
|
+
|
|
607
|
+
assistant_message.metrics.stop_timer()
|
|
608
|
+
|
|
540
609
|
except RateLimitError as e:
|
|
541
610
|
log_error(f"Rate limit error from OpenAI API: {e}")
|
|
542
611
|
error_message = e.response.json().get("error", {})
|
|
@@ -575,7 +644,6 @@ class OpenAIChat(Model):
|
|
|
575
644
|
log_error(f"Error from OpenAI API: {e}")
|
|
576
645
|
raise ModelProviderError(message=str(e), model_name=self.name, model_id=self.id) from e
|
|
577
646
|
|
|
578
|
-
# Override base method
|
|
579
647
|
@staticmethod
|
|
580
648
|
def parse_tool_calls(tool_calls_data: List[ChoiceDeltaToolCall]) -> List[Dict[str, Any]]:
|
|
581
649
|
"""
|
|
@@ -616,7 +684,7 @@ class OpenAIChat(Model):
|
|
|
616
684
|
tool_call_entry["type"] = _tool_call_type
|
|
617
685
|
return tool_calls
|
|
618
686
|
|
|
619
|
-
def
|
|
687
|
+
def _parse_provider_response(
|
|
620
688
|
self,
|
|
621
689
|
response: ChatCompletion,
|
|
622
690
|
response_format: Optional[Union[Dict, Type[BaseModel]]] = None,
|
|
@@ -626,9 +694,9 @@ class OpenAIChat(Model):
|
|
|
626
694
|
"""
|
|
627
695
|
model_response = ModelResponse()
|
|
628
696
|
|
|
629
|
-
if hasattr(response, "error") and response.error:
|
|
697
|
+
if hasattr(response, "error") and response.error: # type: ignore
|
|
630
698
|
raise ModelProviderError(
|
|
631
|
-
message=response.error.get("message", "Unknown model error"),
|
|
699
|
+
message=response.error.get("message", "Unknown model error"), # type: ignore
|
|
632
700
|
model_name=self.name,
|
|
633
701
|
model_id=self.id,
|
|
634
702
|
)
|
|
@@ -677,15 +745,15 @@ class OpenAIChat(Model):
|
|
|
677
745
|
except Exception as e:
|
|
678
746
|
log_warning(f"Error processing audio: {e}")
|
|
679
747
|
|
|
680
|
-
if hasattr(response_message, "reasoning_content") and response_message.reasoning_content is not None:
|
|
681
|
-
model_response.reasoning_content = response_message.reasoning_content
|
|
748
|
+
if hasattr(response_message, "reasoning_content") and response_message.reasoning_content is not None: # type: ignore
|
|
749
|
+
model_response.reasoning_content = response_message.reasoning_content # type: ignore
|
|
682
750
|
|
|
683
751
|
if response.usage is not None:
|
|
684
|
-
model_response.response_usage = response.usage
|
|
752
|
+
model_response.response_usage = self._get_metrics(response.usage)
|
|
685
753
|
|
|
686
754
|
return model_response
|
|
687
755
|
|
|
688
|
-
def
|
|
756
|
+
def _parse_provider_response_delta(self, response_delta: ChatCompletionChunk) -> ModelResponse:
|
|
689
757
|
"""
|
|
690
758
|
Parse the OpenAI streaming response into a ModelResponse.
|
|
691
759
|
|
|
@@ -696,6 +764,7 @@ class OpenAIChat(Model):
|
|
|
696
764
|
ModelResponse: Parsed response data
|
|
697
765
|
"""
|
|
698
766
|
model_response = ModelResponse()
|
|
767
|
+
|
|
699
768
|
if response_delta.choices and len(response_delta.choices) > 0:
|
|
700
769
|
choice_delta: ChoiceDelta = response_delta.choices[0].delta
|
|
701
770
|
|
|
@@ -737,6 +806,35 @@ class OpenAIChat(Model):
|
|
|
737
806
|
|
|
738
807
|
# Add usage metrics if present
|
|
739
808
|
if response_delta.usage is not None:
|
|
740
|
-
model_response.response_usage = response_delta.usage
|
|
809
|
+
model_response.response_usage = self._get_metrics(response_delta.usage)
|
|
741
810
|
|
|
742
811
|
return model_response
|
|
812
|
+
|
|
813
|
+
def _get_metrics(self, response_usage: CompletionUsage) -> Metrics:
|
|
814
|
+
"""
|
|
815
|
+
Parse the given OpenAI-specific usage into an Agno Metrics object.
|
|
816
|
+
|
|
817
|
+
Args:
|
|
818
|
+
response_usage: Usage data from OpenAI
|
|
819
|
+
|
|
820
|
+
Returns:
|
|
821
|
+
Metrics: Parsed metrics data
|
|
822
|
+
"""
|
|
823
|
+
|
|
824
|
+
metrics = Metrics()
|
|
825
|
+
|
|
826
|
+
metrics.input_tokens = response_usage.prompt_tokens or 0
|
|
827
|
+
metrics.output_tokens = response_usage.completion_tokens or 0
|
|
828
|
+
metrics.total_tokens = response_usage.total_tokens or 0
|
|
829
|
+
|
|
830
|
+
# Add the prompt_tokens_details field
|
|
831
|
+
if prompt_token_details := response_usage.prompt_tokens_details:
|
|
832
|
+
metrics.audio_input_tokens = prompt_token_details.audio_tokens or 0
|
|
833
|
+
metrics.cache_read_tokens = prompt_token_details.cached_tokens or 0
|
|
834
|
+
|
|
835
|
+
# Add the completion_tokens_details field
|
|
836
|
+
if completion_tokens_details := response_usage.completion_tokens_details:
|
|
837
|
+
metrics.audio_output_tokens = completion_tokens_details.audio_tokens or 0
|
|
838
|
+
metrics.reasoning_tokens = completion_tokens_details.reasoning_tokens or 0
|
|
839
|
+
|
|
840
|
+
return metrics
|