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/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 (
|
|
@@ -77,7 +80,7 @@ class OpenAIChat(Model):
|
|
|
77
80
|
max_retries: Optional[int] = None
|
|
78
81
|
default_headers: Optional[Any] = None
|
|
79
82
|
default_query: Optional[Any] = None
|
|
80
|
-
http_client: Optional[httpx.Client] = None
|
|
83
|
+
http_client: Optional[Union[httpx.Client, httpx.AsyncClient]] = None
|
|
81
84
|
client_params: Optional[Dict[str, Any]] = None
|
|
82
85
|
|
|
83
86
|
# The role to map the message role to.
|
|
@@ -123,8 +126,11 @@ class OpenAIChat(Model):
|
|
|
123
126
|
OpenAIClient: An instance of the OpenAI client.
|
|
124
127
|
"""
|
|
125
128
|
client_params: Dict[str, Any] = self._get_client_params()
|
|
126
|
-
if self.http_client
|
|
127
|
-
|
|
129
|
+
if self.http_client:
|
|
130
|
+
if isinstance(self.http_client, httpx.Client):
|
|
131
|
+
client_params["http_client"] = self.http_client
|
|
132
|
+
else:
|
|
133
|
+
log_warning("http_client is not an instance of httpx.Client.")
|
|
128
134
|
return OpenAIClient(**client_params)
|
|
129
135
|
|
|
130
136
|
def get_async_client(self) -> AsyncOpenAIClient:
|
|
@@ -136,7 +142,14 @@ class OpenAIChat(Model):
|
|
|
136
142
|
"""
|
|
137
143
|
client_params: Dict[str, Any] = self._get_client_params()
|
|
138
144
|
if self.http_client:
|
|
139
|
-
|
|
145
|
+
if isinstance(self.http_client, httpx.AsyncClient):
|
|
146
|
+
client_params["http_client"] = self.http_client
|
|
147
|
+
else:
|
|
148
|
+
log_warning("http_client is not an instance of httpx.AsyncClient. Using default httpx.AsyncClient.")
|
|
149
|
+
# Create a new async HTTP client with custom limits
|
|
150
|
+
client_params["http_client"] = httpx.AsyncClient(
|
|
151
|
+
limits=httpx.Limits(max_connections=1000, max_keepalive_connections=100)
|
|
152
|
+
)
|
|
140
153
|
else:
|
|
141
154
|
# Create a new async HTTP client with custom limits
|
|
142
155
|
client_params["http_client"] = httpx.AsyncClient(
|
|
@@ -205,6 +218,15 @@ class OpenAIChat(Model):
|
|
|
205
218
|
|
|
206
219
|
# Add tools
|
|
207
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
|
+
|
|
208
230
|
request_params["tools"] = tools
|
|
209
231
|
|
|
210
232
|
if tool_choice is not None:
|
|
@@ -320,25 +342,43 @@ class OpenAIChat(Model):
|
|
|
320
342
|
def invoke(
|
|
321
343
|
self,
|
|
322
344
|
messages: List[Message],
|
|
345
|
+
assistant_message: Message,
|
|
323
346
|
response_format: Optional[Union[Dict, Type[BaseModel]]] = None,
|
|
324
347
|
tools: Optional[List[Dict[str, Any]]] = None,
|
|
325
348
|
tool_choice: Optional[Union[str, Dict[str, Any]]] = None,
|
|
326
|
-
|
|
349
|
+
run_response: Optional[RunOutput] = None,
|
|
350
|
+
) -> ModelResponse:
|
|
327
351
|
"""
|
|
328
|
-
Send a chat completion request to the OpenAI API.
|
|
352
|
+
Send a chat completion request to the OpenAI API and parse the response.
|
|
329
353
|
|
|
330
354
|
Args:
|
|
331
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.
|
|
332
360
|
|
|
333
361
|
Returns:
|
|
334
|
-
|
|
362
|
+
ModelResponse: The chat completion response from the API.
|
|
335
363
|
"""
|
|
336
364
|
try:
|
|
337
|
-
|
|
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(
|
|
338
371
|
model=self.id,
|
|
339
372
|
messages=[self._format_message(m) for m in messages], # type: ignore
|
|
340
373
|
**self.get_request_params(response_format=response_format, tools=tools, tool_choice=tool_choice),
|
|
341
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
|
+
|
|
342
382
|
except RateLimitError as e:
|
|
343
383
|
log_error(f"Rate limit error from OpenAI API: {e}")
|
|
344
384
|
error_message = e.response.json().get("error", {})
|
|
@@ -380,25 +420,42 @@ class OpenAIChat(Model):
|
|
|
380
420
|
async def ainvoke(
|
|
381
421
|
self,
|
|
382
422
|
messages: List[Message],
|
|
423
|
+
assistant_message: Message,
|
|
383
424
|
response_format: Optional[Union[Dict, Type[BaseModel]]] = None,
|
|
384
425
|
tools: Optional[List[Dict[str, Any]]] = None,
|
|
385
426
|
tool_choice: Optional[Union[str, Dict[str, Any]]] = None,
|
|
386
|
-
|
|
427
|
+
run_response: Optional[RunOutput] = None,
|
|
428
|
+
) -> ModelResponse:
|
|
387
429
|
"""
|
|
388
430
|
Sends an asynchronous chat completion request to the OpenAI API.
|
|
389
431
|
|
|
390
432
|
Args:
|
|
391
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.
|
|
392
438
|
|
|
393
439
|
Returns:
|
|
394
|
-
|
|
440
|
+
ModelResponse: The chat completion response from the API.
|
|
395
441
|
"""
|
|
396
442
|
try:
|
|
397
|
-
|
|
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(
|
|
398
448
|
model=self.id,
|
|
399
449
|
messages=[self._format_message(m) for m in messages], # type: ignore
|
|
400
450
|
**self.get_request_params(response_format=response_format, tools=tools, tool_choice=tool_choice),
|
|
401
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
|
+
|
|
402
459
|
except RateLimitError as e:
|
|
403
460
|
log_error(f"Rate limit error from OpenAI API: {e}")
|
|
404
461
|
error_message = e.response.json().get("error", {})
|
|
@@ -440,10 +497,12 @@ class OpenAIChat(Model):
|
|
|
440
497
|
def invoke_stream(
|
|
441
498
|
self,
|
|
442
499
|
messages: List[Message],
|
|
500
|
+
assistant_message: Message,
|
|
443
501
|
response_format: Optional[Union[Dict, Type[BaseModel]]] = None,
|
|
444
502
|
tools: Optional[List[Dict[str, Any]]] = None,
|
|
445
503
|
tool_choice: Optional[Union[str, Dict[str, Any]]] = None,
|
|
446
|
-
|
|
504
|
+
run_response: Optional[RunOutput] = None,
|
|
505
|
+
) -> Iterator[ModelResponse]:
|
|
447
506
|
"""
|
|
448
507
|
Send a streaming chat completion request to the OpenAI API.
|
|
449
508
|
|
|
@@ -451,17 +510,26 @@ class OpenAIChat(Model):
|
|
|
451
510
|
messages (List[Message]): A list of messages to send to the model.
|
|
452
511
|
|
|
453
512
|
Returns:
|
|
454
|
-
Iterator[
|
|
513
|
+
Iterator[ModelResponse]: An iterator of model responses.
|
|
455
514
|
"""
|
|
456
515
|
|
|
457
516
|
try:
|
|
458
|
-
|
|
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(
|
|
459
523
|
model=self.id,
|
|
460
524
|
messages=[self._format_message(m) for m in messages], # type: ignore
|
|
461
525
|
stream=True,
|
|
462
526
|
stream_options={"include_usage": True},
|
|
463
527
|
**self.get_request_params(response_format=response_format, tools=tools, tool_choice=tool_choice),
|
|
464
|
-
)
|
|
528
|
+
):
|
|
529
|
+
yield self._parse_provider_response_delta(chunk)
|
|
530
|
+
|
|
531
|
+
assistant_message.metrics.stop_timer()
|
|
532
|
+
|
|
465
533
|
except RateLimitError as e:
|
|
466
534
|
log_error(f"Rate limit error from OpenAI API: {e}")
|
|
467
535
|
error_message = e.response.json().get("error", {})
|
|
@@ -503,10 +571,12 @@ class OpenAIChat(Model):
|
|
|
503
571
|
async def ainvoke_stream(
|
|
504
572
|
self,
|
|
505
573
|
messages: List[Message],
|
|
574
|
+
assistant_message: Message,
|
|
506
575
|
response_format: Optional[Union[Dict, Type[BaseModel]]] = None,
|
|
507
576
|
tools: Optional[List[Dict[str, Any]]] = None,
|
|
508
577
|
tool_choice: Optional[Union[str, Dict[str, Any]]] = None,
|
|
509
|
-
|
|
578
|
+
run_response: Optional[RunOutput] = None,
|
|
579
|
+
) -> AsyncIterator[ModelResponse]:
|
|
510
580
|
"""
|
|
511
581
|
Sends an asynchronous streaming chat completion request to the OpenAI API.
|
|
512
582
|
|
|
@@ -514,10 +584,15 @@ class OpenAIChat(Model):
|
|
|
514
584
|
messages (List[Message]): A list of messages to send to the model.
|
|
515
585
|
|
|
516
586
|
Returns:
|
|
517
|
-
Any: An asynchronous iterator of
|
|
587
|
+
Any: An asynchronous iterator of model responses.
|
|
518
588
|
"""
|
|
519
589
|
|
|
520
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
|
+
|
|
521
596
|
async_stream = await self.get_async_client().chat.completions.create(
|
|
522
597
|
model=self.id,
|
|
523
598
|
messages=[self._format_message(m) for m in messages], # type: ignore
|
|
@@ -525,8 +600,12 @@ class OpenAIChat(Model):
|
|
|
525
600
|
stream_options={"include_usage": True},
|
|
526
601
|
**self.get_request_params(response_format=response_format, tools=tools, tool_choice=tool_choice),
|
|
527
602
|
)
|
|
603
|
+
|
|
528
604
|
async for chunk in async_stream:
|
|
529
|
-
yield chunk
|
|
605
|
+
yield self._parse_provider_response_delta(chunk)
|
|
606
|
+
|
|
607
|
+
assistant_message.metrics.stop_timer()
|
|
608
|
+
|
|
530
609
|
except RateLimitError as e:
|
|
531
610
|
log_error(f"Rate limit error from OpenAI API: {e}")
|
|
532
611
|
error_message = e.response.json().get("error", {})
|
|
@@ -565,7 +644,6 @@ class OpenAIChat(Model):
|
|
|
565
644
|
log_error(f"Error from OpenAI API: {e}")
|
|
566
645
|
raise ModelProviderError(message=str(e), model_name=self.name, model_id=self.id) from e
|
|
567
646
|
|
|
568
|
-
# Override base method
|
|
569
647
|
@staticmethod
|
|
570
648
|
def parse_tool_calls(tool_calls_data: List[ChoiceDeltaToolCall]) -> List[Dict[str, Any]]:
|
|
571
649
|
"""
|
|
@@ -606,7 +684,7 @@ class OpenAIChat(Model):
|
|
|
606
684
|
tool_call_entry["type"] = _tool_call_type
|
|
607
685
|
return tool_calls
|
|
608
686
|
|
|
609
|
-
def
|
|
687
|
+
def _parse_provider_response(
|
|
610
688
|
self,
|
|
611
689
|
response: ChatCompletion,
|
|
612
690
|
response_format: Optional[Union[Dict, Type[BaseModel]]] = None,
|
|
@@ -616,9 +694,9 @@ class OpenAIChat(Model):
|
|
|
616
694
|
"""
|
|
617
695
|
model_response = ModelResponse()
|
|
618
696
|
|
|
619
|
-
if hasattr(response, "error") and response.error:
|
|
697
|
+
if hasattr(response, "error") and response.error: # type: ignore
|
|
620
698
|
raise ModelProviderError(
|
|
621
|
-
message=response.error.get("message", "Unknown model error"),
|
|
699
|
+
message=response.error.get("message", "Unknown model error"), # type: ignore
|
|
622
700
|
model_name=self.name,
|
|
623
701
|
model_id=self.id,
|
|
624
702
|
)
|
|
@@ -667,15 +745,15 @@ class OpenAIChat(Model):
|
|
|
667
745
|
except Exception as e:
|
|
668
746
|
log_warning(f"Error processing audio: {e}")
|
|
669
747
|
|
|
670
|
-
if hasattr(response_message, "reasoning_content") and response_message.reasoning_content is not None:
|
|
671
|
-
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
|
|
672
750
|
|
|
673
751
|
if response.usage is not None:
|
|
674
|
-
model_response.response_usage = response.usage
|
|
752
|
+
model_response.response_usage = self._get_metrics(response.usage)
|
|
675
753
|
|
|
676
754
|
return model_response
|
|
677
755
|
|
|
678
|
-
def
|
|
756
|
+
def _parse_provider_response_delta(self, response_delta: ChatCompletionChunk) -> ModelResponse:
|
|
679
757
|
"""
|
|
680
758
|
Parse the OpenAI streaming response into a ModelResponse.
|
|
681
759
|
|
|
@@ -686,6 +764,7 @@ class OpenAIChat(Model):
|
|
|
686
764
|
ModelResponse: Parsed response data
|
|
687
765
|
"""
|
|
688
766
|
model_response = ModelResponse()
|
|
767
|
+
|
|
689
768
|
if response_delta.choices and len(response_delta.choices) > 0:
|
|
690
769
|
choice_delta: ChoiceDelta = response_delta.choices[0].delta
|
|
691
770
|
|
|
@@ -727,6 +806,35 @@ class OpenAIChat(Model):
|
|
|
727
806
|
|
|
728
807
|
# Add usage metrics if present
|
|
729
808
|
if response_delta.usage is not None:
|
|
730
|
-
model_response.response_usage = response_delta.usage
|
|
809
|
+
model_response.response_usage = self._get_metrics(response_delta.usage)
|
|
731
810
|
|
|
732
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
|