agno 1.8.2__py3-none-any.whl → 2.0.0__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- agno/agent/__init__.py +19 -27
- agno/agent/agent.py +3143 -4170
- agno/api/agent.py +11 -67
- agno/api/api.py +5 -46
- agno/api/evals.py +8 -19
- agno/api/os.py +17 -0
- agno/api/routes.py +6 -41
- agno/api/schemas/__init__.py +9 -0
- agno/api/schemas/agent.py +5 -21
- agno/api/schemas/evals.py +7 -16
- agno/api/schemas/os.py +14 -0
- agno/api/schemas/team.py +5 -21
- agno/api/schemas/utils.py +21 -0
- agno/api/schemas/workflows.py +11 -7
- agno/api/settings.py +53 -0
- agno/api/team.py +11 -66
- agno/api/workflow.py +28 -0
- agno/cloud/aws/base.py +214 -0
- agno/cloud/aws/s3/__init__.py +2 -0
- agno/cloud/aws/s3/api_client.py +43 -0
- agno/cloud/aws/s3/bucket.py +195 -0
- agno/cloud/aws/s3/object.py +57 -0
- agno/db/__init__.py +24 -0
- agno/db/base.py +245 -0
- agno/db/dynamo/__init__.py +3 -0
- agno/db/dynamo/dynamo.py +1743 -0
- agno/db/dynamo/schemas.py +278 -0
- agno/db/dynamo/utils.py +684 -0
- agno/db/firestore/__init__.py +3 -0
- agno/db/firestore/firestore.py +1432 -0
- agno/db/firestore/schemas.py +130 -0
- agno/db/firestore/utils.py +278 -0
- agno/db/gcs_json/__init__.py +3 -0
- agno/db/gcs_json/gcs_json_db.py +1001 -0
- agno/db/gcs_json/utils.py +194 -0
- agno/db/in_memory/__init__.py +3 -0
- agno/db/in_memory/in_memory_db.py +882 -0
- agno/db/in_memory/utils.py +172 -0
- agno/db/json/__init__.py +3 -0
- agno/db/json/json_db.py +1045 -0
- agno/db/json/utils.py +196 -0
- agno/db/migrations/v1_to_v2.py +162 -0
- agno/db/mongo/__init__.py +3 -0
- agno/db/mongo/mongo.py +1416 -0
- agno/db/mongo/schemas.py +77 -0
- agno/db/mongo/utils.py +204 -0
- agno/db/mysql/__init__.py +3 -0
- agno/db/mysql/mysql.py +1719 -0
- agno/db/mysql/schemas.py +124 -0
- agno/db/mysql/utils.py +297 -0
- agno/db/postgres/__init__.py +3 -0
- agno/db/postgres/postgres.py +1710 -0
- agno/db/postgres/schemas.py +124 -0
- agno/db/postgres/utils.py +280 -0
- agno/db/redis/__init__.py +3 -0
- agno/db/redis/redis.py +1367 -0
- agno/db/redis/schemas.py +109 -0
- agno/db/redis/utils.py +288 -0
- agno/db/schemas/__init__.py +3 -0
- agno/db/schemas/evals.py +33 -0
- agno/db/schemas/knowledge.py +40 -0
- agno/db/schemas/memory.py +46 -0
- agno/db/singlestore/__init__.py +3 -0
- agno/db/singlestore/schemas.py +116 -0
- agno/db/singlestore/singlestore.py +1712 -0
- agno/db/singlestore/utils.py +326 -0
- agno/db/sqlite/__init__.py +3 -0
- agno/db/sqlite/schemas.py +119 -0
- agno/db/sqlite/sqlite.py +1676 -0
- agno/db/sqlite/utils.py +268 -0
- agno/db/utils.py +88 -0
- agno/eval/__init__.py +14 -0
- agno/eval/accuracy.py +154 -48
- agno/eval/performance.py +88 -23
- agno/eval/reliability.py +73 -20
- agno/eval/utils.py +23 -13
- agno/integrations/discord/__init__.py +3 -0
- agno/{app → integrations}/discord/client.py +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 +1551 -0
- agno/knowledge/reader/__init__.py +7 -0
- agno/{document → knowledge}/reader/arxiv_reader.py +32 -4
- agno/knowledge/reader/base.py +88 -0
- agno/{document → knowledge}/reader/csv_reader.py +47 -65
- agno/knowledge/reader/docx_reader.py +83 -0
- agno/{document → knowledge}/reader/firecrawl_reader.py +42 -21
- agno/{document → knowledge}/reader/json_reader.py +30 -9
- agno/{document → knowledge}/reader/markdown_reader.py +58 -9
- agno/{document → knowledge}/reader/pdf_reader.py +71 -126
- agno/knowledge/reader/reader_factory.py +268 -0
- agno/knowledge/reader/s3_reader.py +101 -0
- agno/{document → knowledge}/reader/text_reader.py +31 -10
- agno/knowledge/reader/url_reader.py +128 -0
- agno/knowledge/reader/web_search_reader.py +366 -0
- agno/{document → knowledge}/reader/website_reader.py +37 -10
- agno/knowledge/reader/wikipedia_reader.py +59 -0
- agno/knowledge/reader/youtube_reader.py +78 -0
- agno/knowledge/remote_content/remote_content.py +88 -0
- agno/{reranker → knowledge/reranker}/base.py +1 -1
- agno/{reranker → knowledge/reranker}/cohere.py +2 -2
- agno/{reranker → knowledge/reranker}/infinity.py +2 -2
- agno/{reranker → knowledge/reranker}/sentence_transformer.py +2 -2
- agno/knowledge/types.py +30 -0
- agno/knowledge/utils.py +169 -0
- agno/media.py +269 -268
- agno/memory/__init__.py +2 -10
- agno/memory/manager.py +1003 -148
- agno/models/aimlapi/__init__.py +2 -2
- agno/models/aimlapi/aimlapi.py +6 -6
- agno/models/anthropic/claude.py +128 -72
- 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 +346 -290
- agno/models/cerebras/cerebras.py +84 -27
- agno/models/cohere/chat.py +106 -98
- agno/models/google/gemini.py +105 -46
- agno/models/groq/groq.py +97 -35
- agno/models/huggingface/huggingface.py +92 -27
- agno/models/ibm/watsonx.py +72 -13
- agno/models/litellm/chat.py +85 -13
- agno/models/message.py +46 -151
- agno/models/meta/llama.py +85 -49
- agno/models/metrics.py +120 -0
- agno/models/mistral/mistral.py +90 -21
- agno/models/ollama/__init__.py +0 -2
- agno/models/ollama/chat.py +85 -47
- agno/models/openai/chat.py +154 -37
- agno/models/openai/responses.py +178 -105
- agno/models/perplexity/perplexity.py +26 -2
- agno/models/portkey/portkey.py +0 -7
- agno/models/response.py +15 -9
- agno/models/utils.py +20 -0
- agno/models/vercel/__init__.py +2 -2
- agno/models/vercel/v0.py +1 -1
- agno/models/vllm/__init__.py +2 -2
- agno/models/vllm/vllm.py +3 -3
- agno/models/xai/xai.py +10 -10
- agno/os/__init__.py +3 -0
- agno/os/app.py +497 -0
- agno/os/auth.py +47 -0
- agno/os/config.py +103 -0
- agno/os/interfaces/agui/__init__.py +3 -0
- agno/os/interfaces/agui/agui.py +31 -0
- agno/{app/agui/async_router.py → os/interfaces/agui/router.py} +16 -16
- agno/{app → os/interfaces}/agui/utils.py +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 +32 -0
- agno/os/interfaces/whatsapp/__init__.py +3 -0
- agno/{app/whatsapp/async_router.py → os/interfaces/whatsapp/router.py} +4 -7
- agno/os/interfaces/whatsapp/whatsapp.py +29 -0
- agno/os/mcp.py +235 -0
- agno/os/router.py +1400 -0
- agno/os/routers/__init__.py +3 -0
- agno/os/routers/evals/__init__.py +3 -0
- agno/os/routers/evals/evals.py +393 -0
- agno/os/routers/evals/schemas.py +142 -0
- agno/os/routers/evals/utils.py +161 -0
- agno/os/routers/knowledge/__init__.py +3 -0
- agno/os/routers/knowledge/knowledge.py +850 -0
- agno/os/routers/knowledge/schemas.py +118 -0
- agno/os/routers/memory/__init__.py +3 -0
- agno/os/routers/memory/memory.py +410 -0
- agno/os/routers/memory/schemas.py +58 -0
- agno/os/routers/metrics/__init__.py +3 -0
- agno/os/routers/metrics/metrics.py +178 -0
- agno/os/routers/metrics/schemas.py +47 -0
- agno/os/routers/session/__init__.py +3 -0
- agno/os/routers/session/session.py +536 -0
- agno/os/schema.py +945 -0
- agno/{app/playground → os}/settings.py +7 -15
- agno/os/utils.py +270 -0
- agno/reasoning/azure_ai_foundry.py +4 -4
- agno/reasoning/deepseek.py +4 -4
- agno/reasoning/default.py +6 -11
- agno/reasoning/groq.py +4 -4
- agno/reasoning/helpers.py +4 -6
- agno/reasoning/ollama.py +4 -4
- agno/reasoning/openai.py +4 -4
- agno/run/agent.py +633 -0
- agno/run/base.py +53 -77
- agno/run/cancel.py +81 -0
- agno/run/team.py +243 -96
- agno/run/workflow.py +550 -12
- agno/session/__init__.py +10 -0
- agno/session/agent.py +244 -0
- agno/session/summary.py +225 -0
- agno/session/team.py +262 -0
- agno/{storage/session/v2 → session}/workflow.py +47 -24
- agno/team/__init__.py +15 -16
- agno/team/team.py +3260 -4824
- agno/tools/agentql.py +14 -5
- agno/tools/airflow.py +9 -4
- agno/tools/api.py +7 -3
- agno/tools/apify.py +2 -46
- agno/tools/arxiv.py +8 -3
- agno/tools/aws_lambda.py +7 -5
- agno/tools/aws_ses.py +7 -1
- agno/tools/baidusearch.py +4 -1
- agno/tools/bitbucket.py +4 -4
- agno/tools/brandfetch.py +14 -11
- agno/tools/bravesearch.py +4 -1
- agno/tools/brightdata.py +43 -23
- agno/tools/browserbase.py +13 -4
- agno/tools/calcom.py +12 -10
- agno/tools/calculator.py +10 -27
- agno/tools/cartesia.py +20 -17
- agno/tools/{clickup_tool.py → clickup.py} +12 -25
- agno/tools/confluence.py +8 -8
- agno/tools/crawl4ai.py +7 -1
- agno/tools/csv_toolkit.py +9 -8
- agno/tools/dalle.py +22 -12
- agno/tools/daytona.py +13 -16
- agno/tools/decorator.py +6 -3
- agno/tools/desi_vocal.py +17 -8
- agno/tools/discord.py +11 -8
- agno/tools/docker.py +30 -42
- agno/tools/duckdb.py +34 -53
- agno/tools/duckduckgo.py +8 -7
- agno/tools/e2b.py +62 -62
- agno/tools/eleven_labs.py +36 -29
- agno/tools/email.py +4 -1
- agno/tools/evm.py +7 -1
- agno/tools/exa.py +19 -14
- agno/tools/fal.py +30 -30
- agno/tools/file.py +9 -8
- agno/tools/financial_datasets.py +25 -44
- agno/tools/firecrawl.py +17 -18
- agno/tools/function.py +127 -18
- agno/tools/giphy.py +23 -11
- agno/tools/github.py +48 -126
- agno/tools/gmail.py +45 -61
- agno/tools/google_bigquery.py +7 -6
- agno/tools/google_maps.py +11 -26
- agno/tools/googlesearch.py +7 -2
- agno/tools/googlesheets.py +21 -17
- agno/tools/hackernews.py +9 -5
- agno/tools/jina.py +5 -4
- agno/tools/jira.py +18 -9
- agno/tools/knowledge.py +31 -32
- agno/tools/linear.py +18 -33
- agno/tools/linkup.py +5 -1
- agno/tools/local_file_system.py +8 -5
- agno/tools/lumalab.py +32 -20
- agno/tools/mcp.py +1 -2
- agno/tools/mem0.py +18 -12
- agno/tools/memori.py +14 -10
- agno/tools/mlx_transcribe.py +3 -2
- agno/tools/models/azure_openai.py +33 -15
- agno/tools/models/gemini.py +59 -32
- agno/tools/models/groq.py +30 -23
- agno/tools/models/nebius.py +28 -12
- agno/tools/models_labs.py +40 -16
- agno/tools/moviepy_video.py +7 -6
- agno/tools/neo4j.py +10 -8
- agno/tools/newspaper.py +7 -2
- agno/tools/newspaper4k.py +8 -3
- agno/tools/openai.py +58 -32
- agno/tools/openbb.py +12 -11
- agno/tools/opencv.py +63 -47
- agno/tools/openweather.py +14 -12
- agno/tools/pandas.py +11 -3
- agno/tools/postgres.py +4 -12
- agno/tools/pubmed.py +4 -1
- agno/tools/python.py +9 -22
- agno/tools/reasoning.py +35 -27
- agno/tools/reddit.py +11 -26
- agno/tools/replicate.py +55 -42
- agno/tools/resend.py +4 -1
- agno/tools/scrapegraph.py +15 -14
- agno/tools/searxng.py +10 -23
- agno/tools/serpapi.py +6 -3
- agno/tools/serper.py +13 -4
- agno/tools/shell.py +9 -2
- agno/tools/slack.py +12 -11
- agno/tools/sleep.py +3 -2
- agno/tools/spider.py +24 -4
- agno/tools/sql.py +7 -6
- agno/tools/tavily.py +6 -4
- agno/tools/telegram.py +12 -4
- agno/tools/todoist.py +11 -31
- agno/tools/toolkit.py +1 -1
- agno/tools/trafilatura.py +22 -6
- agno/tools/trello.py +9 -22
- agno/tools/twilio.py +10 -3
- agno/tools/user_control_flow.py +6 -1
- agno/tools/valyu.py +34 -5
- agno/tools/visualization.py +19 -28
- agno/tools/webbrowser.py +4 -3
- agno/tools/webex.py +11 -7
- agno/tools/website.py +15 -46
- agno/tools/webtools.py +12 -4
- agno/tools/whatsapp.py +5 -9
- agno/tools/wikipedia.py +20 -13
- agno/tools/x.py +14 -13
- agno/tools/yfinance.py +13 -40
- agno/tools/youtube.py +26 -20
- agno/tools/zendesk.py +7 -2
- agno/tools/zep.py +10 -7
- agno/tools/zoom.py +10 -9
- agno/utils/common.py +1 -19
- agno/utils/events.py +100 -123
- agno/utils/gemini.py +1 -1
- agno/utils/knowledge.py +29 -0
- agno/utils/log.py +54 -4
- agno/utils/mcp.py +68 -10
- agno/utils/media.py +39 -0
- agno/utils/message.py +12 -1
- agno/utils/models/aws_claude.py +1 -1
- agno/utils/models/claude.py +6 -12
- agno/utils/models/cohere.py +1 -1
- agno/utils/models/mistral.py +8 -7
- agno/utils/models/schema_utils.py +3 -3
- agno/utils/models/watsonx.py +1 -1
- agno/utils/openai.py +1 -1
- agno/utils/pprint.py +33 -32
- agno/utils/print_response/agent.py +779 -0
- agno/utils/print_response/team.py +1669 -0
- agno/utils/print_response/workflow.py +1451 -0
- agno/utils/prompts.py +14 -14
- agno/utils/reasoning.py +87 -0
- agno/utils/response.py +42 -42
- agno/utils/streamlit.py +481 -0
- agno/utils/string.py +8 -22
- agno/utils/team.py +50 -0
- agno/utils/timer.py +2 -2
- agno/vectordb/base.py +33 -21
- agno/vectordb/cassandra/cassandra.py +287 -23
- agno/vectordb/chroma/chromadb.py +482 -59
- agno/vectordb/clickhouse/clickhousedb.py +270 -63
- agno/vectordb/couchbase/couchbase.py +309 -29
- agno/vectordb/lancedb/lance_db.py +360 -21
- agno/vectordb/langchaindb/__init__.py +5 -0
- agno/vectordb/langchaindb/langchaindb.py +145 -0
- agno/vectordb/lightrag/__init__.py +5 -0
- agno/vectordb/lightrag/lightrag.py +374 -0
- agno/vectordb/llamaindex/llamaindexdb.py +127 -0
- agno/vectordb/milvus/milvus.py +242 -32
- agno/vectordb/mongodb/mongodb.py +200 -24
- agno/vectordb/pgvector/pgvector.py +319 -37
- agno/vectordb/pineconedb/pineconedb.py +221 -27
- agno/vectordb/qdrant/qdrant.py +334 -14
- agno/vectordb/singlestore/singlestore.py +286 -29
- agno/vectordb/surrealdb/surrealdb.py +187 -7
- agno/vectordb/upstashdb/upstashdb.py +342 -26
- agno/vectordb/weaviate/weaviate.py +227 -165
- agno/workflow/__init__.py +17 -13
- agno/workflow/{v2/condition.py → condition.py} +135 -32
- agno/workflow/{v2/loop.py → loop.py} +115 -28
- agno/workflow/{v2/parallel.py → parallel.py} +138 -108
- agno/workflow/{v2/router.py → router.py} +133 -32
- agno/workflow/{v2/step.py → step.py} +207 -49
- agno/workflow/{v2/steps.py → steps.py} +147 -66
- agno/workflow/types.py +482 -0
- agno/workflow/workflow.py +2410 -696
- agno-2.0.0.dist-info/METADATA +494 -0
- agno-2.0.0.dist-info/RECORD +515 -0
- agno-2.0.0.dist-info/licenses/LICENSE +201 -0
- agno/agent/metrics.py +0 -110
- 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 -1053
- agno/app/playground/deploy.py +0 -249
- agno/app/playground/operator.py +0 -183
- agno/app/playground/schemas.py +0 -223
- agno/app/playground/serve.py +0 -55
- agno/app/playground/sync_router.py +0 -1045
- agno/app/playground/utils.py +0 -46
- agno/app/settings.py +0 -15
- agno/app/slack/__init__.py +0 -3
- agno/app/slack/app.py +0 -19
- agno/app/slack/sync_router.py +0 -92
- agno/app/utils.py +0 -54
- agno/app/whatsapp/__init__.py +0 -3
- agno/app/whatsapp/app.py +0 -15
- agno/app/whatsapp/sync_router.py +0 -197
- agno/cli/auth_server.py +0 -249
- agno/cli/config.py +0 -274
- agno/cli/console.py +0 -88
- agno/cli/credentials.py +0 -23
- agno/cli/entrypoint.py +0 -571
- agno/cli/operator.py +0 -357
- agno/cli/settings.py +0 -96
- agno/cli/ws/ws_cli.py +0 -817
- agno/constants.py +0 -13
- agno/document/__init__.py +0 -5
- agno/document/chunking/semantic.py +0 -45
- agno/document/chunking/strategy.py +0 -31
- agno/document/reader/__init__.py +0 -5
- agno/document/reader/base.py +0 -47
- agno/document/reader/docx_reader.py +0 -60
- agno/document/reader/gcs/pdf_reader.py +0 -44
- agno/document/reader/s3/pdf_reader.py +0 -59
- agno/document/reader/s3/text_reader.py +0 -63
- agno/document/reader/url_reader.py +0 -59
- agno/document/reader/youtube_reader.py +0 -58
- agno/embedder/__init__.py +0 -5
- agno/embedder/langdb.py +0 -80
- agno/embedder/mistral.py +0 -82
- agno/embedder/openai.py +0 -78
- agno/file/__init__.py +0 -5
- agno/file/file.py +0 -16
- agno/file/local/csv.py +0 -32
- agno/file/local/txt.py +0 -19
- agno/infra/app.py +0 -240
- agno/infra/base.py +0 -144
- agno/infra/context.py +0 -20
- agno/infra/db_app.py +0 -52
- agno/infra/resource.py +0 -205
- agno/infra/resources.py +0 -55
- agno/knowledge/agent.py +0 -702
- agno/knowledge/arxiv.py +0 -33
- agno/knowledge/combined.py +0 -36
- agno/knowledge/csv.py +0 -144
- agno/knowledge/csv_url.py +0 -124
- agno/knowledge/document.py +0 -223
- agno/knowledge/docx.py +0 -137
- agno/knowledge/firecrawl.py +0 -34
- agno/knowledge/gcs/__init__.py +0 -0
- agno/knowledge/gcs/base.py +0 -39
- agno/knowledge/gcs/pdf.py +0 -125
- agno/knowledge/json.py +0 -137
- agno/knowledge/langchain.py +0 -71
- agno/knowledge/light_rag.py +0 -273
- agno/knowledge/llamaindex.py +0 -66
- agno/knowledge/markdown.py +0 -154
- agno/knowledge/pdf.py +0 -164
- agno/knowledge/pdf_bytes.py +0 -42
- agno/knowledge/pdf_url.py +0 -148
- agno/knowledge/s3/__init__.py +0 -0
- agno/knowledge/s3/base.py +0 -64
- agno/knowledge/s3/pdf.py +0 -33
- agno/knowledge/s3/text.py +0 -34
- agno/knowledge/text.py +0 -141
- agno/knowledge/url.py +0 -46
- agno/knowledge/website.py +0 -179
- agno/knowledge/wikipedia.py +0 -32
- agno/knowledge/youtube.py +0 -35
- agno/memory/agent.py +0 -423
- agno/memory/classifier.py +0 -104
- agno/memory/db/__init__.py +0 -5
- agno/memory/db/base.py +0 -42
- agno/memory/db/mongodb.py +0 -189
- agno/memory/db/postgres.py +0 -203
- agno/memory/db/sqlite.py +0 -193
- agno/memory/memory.py +0 -22
- agno/memory/row.py +0 -36
- agno/memory/summarizer.py +0 -201
- agno/memory/summary.py +0 -19
- agno/memory/team.py +0 -415
- agno/memory/v2/__init__.py +0 -2
- agno/memory/v2/db/__init__.py +0 -1
- agno/memory/v2/db/base.py +0 -42
- agno/memory/v2/db/firestore.py +0 -339
- agno/memory/v2/db/mongodb.py +0 -196
- agno/memory/v2/db/postgres.py +0 -214
- agno/memory/v2/db/redis.py +0 -187
- agno/memory/v2/db/schema.py +0 -54
- agno/memory/v2/db/sqlite.py +0 -209
- agno/memory/v2/manager.py +0 -437
- agno/memory/v2/memory.py +0 -1097
- agno/memory/v2/schema.py +0 -55
- agno/memory/v2/summarizer.py +0 -215
- agno/memory/workflow.py +0 -38
- agno/models/ollama/tools.py +0 -430
- agno/models/qwen/__init__.py +0 -5
- agno/playground/__init__.py +0 -10
- agno/playground/deploy.py +0 -3
- agno/playground/playground.py +0 -3
- agno/playground/serve.py +0 -3
- agno/playground/settings.py +0 -3
- agno/reranker/__init__.py +0 -0
- agno/run/response.py +0 -467
- agno/run/v2/__init__.py +0 -0
- agno/run/v2/workflow.py +0 -567
- agno/storage/__init__.py +0 -0
- agno/storage/agent/__init__.py +0 -0
- agno/storage/agent/dynamodb.py +0 -1
- agno/storage/agent/json.py +0 -1
- agno/storage/agent/mongodb.py +0 -1
- agno/storage/agent/postgres.py +0 -1
- agno/storage/agent/singlestore.py +0 -1
- agno/storage/agent/sqlite.py +0 -1
- agno/storage/agent/yaml.py +0 -1
- agno/storage/base.py +0 -60
- agno/storage/dynamodb.py +0 -673
- agno/storage/firestore.py +0 -297
- agno/storage/gcs_json.py +0 -261
- agno/storage/in_memory.py +0 -234
- agno/storage/json.py +0 -237
- agno/storage/mongodb.py +0 -328
- agno/storage/mysql.py +0 -685
- agno/storage/postgres.py +0 -682
- agno/storage/redis.py +0 -336
- agno/storage/session/__init__.py +0 -16
- agno/storage/session/agent.py +0 -64
- agno/storage/session/team.py +0 -63
- agno/storage/session/v2/__init__.py +0 -5
- agno/storage/session/workflow.py +0 -61
- agno/storage/singlestore.py +0 -606
- agno/storage/sqlite.py +0 -646
- agno/storage/workflow/__init__.py +0 -0
- agno/storage/workflow/mongodb.py +0 -1
- agno/storage/workflow/postgres.py +0 -1
- agno/storage/workflow/sqlite.py +0 -1
- agno/storage/yaml.py +0 -241
- agno/tools/thinking.py +0 -73
- agno/utils/defaults.py +0 -57
- agno/utils/filesystem.py +0 -39
- agno/utils/git.py +0 -52
- agno/utils/json_io.py +0 -30
- agno/utils/load_env.py +0 -19
- agno/utils/py_io.py +0 -19
- agno/utils/pyproject.py +0 -18
- agno/utils/resource_filter.py +0 -31
- agno/workflow/v2/__init__.py +0 -21
- agno/workflow/v2/types.py +0 -357
- agno/workflow/v2/workflow.py +0 -3313
- 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.2.dist-info/METADATA +0 -982
- agno-1.8.2.dist-info/RECORD +0 -566
- agno-1.8.2.dist-info/entry_points.txt +0 -3
- agno-1.8.2.dist-info/licenses/LICENSE +0 -375
- /agno/{app → db/migrations}/__init__.py +0 -0
- /agno/{app/playground/__init__.py → db/schemas/metrics.py} +0 -0
- /agno/{cli → integrations}/__init__.py +0 -0
- /agno/{cli/ws → knowledge/chunking}/__init__.py +0 -0
- /agno/{document/chunking → knowledge/remote_content}/__init__.py +0 -0
- /agno/{document/reader/gcs → knowledge/reranker}/__init__.py +0 -0
- /agno/{document/reader/s3 → os/interfaces}/__init__.py +0 -0
- /agno/{app → os/interfaces}/slack/security.py +0 -0
- /agno/{app → os/interfaces}/whatsapp/security.py +0 -0
- /agno/{file/local → utils/print_response}/__init__.py +0 -0
- /agno/{infra → vectordb/llamaindex}/__init__.py +0 -0
- {agno-1.8.2.dist-info → agno-2.0.0.dist-info}/WHEEL +0 -0
- {agno-1.8.2.dist-info → agno-2.0.0.dist-info}/top_level.txt +0 -0
agno/models/aimlapi/__init__.py
CHANGED
agno/models/aimlapi/aimlapi.py
CHANGED
|
@@ -7,22 +7,22 @@ from agno.models.openai.like import OpenAILike
|
|
|
7
7
|
|
|
8
8
|
|
|
9
9
|
@dataclass
|
|
10
|
-
class
|
|
10
|
+
class AIMLAPI(OpenAILike):
|
|
11
11
|
"""
|
|
12
|
-
A class for using models hosted on
|
|
12
|
+
A class for using models hosted on AIMLAPI.
|
|
13
13
|
|
|
14
14
|
Attributes:
|
|
15
15
|
id (str): The model id. Defaults to "gpt-4o-mini".
|
|
16
|
-
name (str): The model name. Defaults to "
|
|
17
|
-
provider (str): The provider name. Defaults to "
|
|
16
|
+
name (str): The model name. Defaults to "AIMLAPI".
|
|
17
|
+
provider (str): The provider name. Defaults to "AIMLAPI".
|
|
18
18
|
api_key (Optional[str]): The API key.
|
|
19
19
|
base_url (str): The base URL. Defaults to "https://api.aimlapi.com/v1".
|
|
20
20
|
max_tokens (int): The maximum number of tokens. Defaults to 4096.
|
|
21
21
|
"""
|
|
22
22
|
|
|
23
23
|
id: str = "gpt-4o-mini"
|
|
24
|
-
name: str = "
|
|
25
|
-
provider: str = "
|
|
24
|
+
name: str = "AIMLAPI"
|
|
25
|
+
provider: str = "AIMLAPI"
|
|
26
26
|
|
|
27
27
|
api_key: Optional[str] = getenv("AIMLAPI_API_KEY")
|
|
28
28
|
base_url: str = "https://api.aimlapi.com/v1"
|
agno/models/anthropic/claude.py
CHANGED
|
@@ -9,14 +9,14 @@ from pydantic import BaseModel
|
|
|
9
9
|
from agno.exceptions import ModelProviderError, ModelRateLimitError
|
|
10
10
|
from agno.models.base import Model
|
|
11
11
|
from agno.models.message import Citations, DocumentCitation, Message, UrlCitation
|
|
12
|
+
from agno.models.metrics import Metrics
|
|
12
13
|
from agno.models.response import ModelResponse
|
|
14
|
+
from agno.run.agent import RunOutput
|
|
13
15
|
from agno.utils.log import log_debug, log_error, log_warning
|
|
14
16
|
from agno.utils.models.claude import MCPServerConfiguration, format_messages, format_tools_for_model
|
|
15
17
|
|
|
16
18
|
try:
|
|
17
|
-
from anthropic import
|
|
18
|
-
Anthropic as AnthropicClient,
|
|
19
|
-
)
|
|
19
|
+
from anthropic import Anthropic as AnthropicClient
|
|
20
20
|
from anthropic import (
|
|
21
21
|
APIConnectionError,
|
|
22
22
|
APIStatusError,
|
|
@@ -31,8 +31,10 @@ try:
|
|
|
31
31
|
ContentBlockDeltaEvent,
|
|
32
32
|
ContentBlockStartEvent,
|
|
33
33
|
ContentBlockStopEvent,
|
|
34
|
+
MessageDeltaUsage,
|
|
34
35
|
# MessageDeltaEvent, # Currently broken
|
|
35
36
|
MessageStopEvent,
|
|
37
|
+
Usage,
|
|
36
38
|
)
|
|
37
39
|
from anthropic.types import (
|
|
38
40
|
Message as AnthropicMessage,
|
|
@@ -42,11 +44,7 @@ except ImportError as e:
|
|
|
42
44
|
|
|
43
45
|
# Import Beta types
|
|
44
46
|
try:
|
|
45
|
-
from anthropic.types.beta import
|
|
46
|
-
BetaMessage,
|
|
47
|
-
BetaRawContentBlockDeltaEvent,
|
|
48
|
-
BetaTextDelta,
|
|
49
|
-
)
|
|
47
|
+
from anthropic.types.beta import BetaRawContentBlockDeltaEvent, BetaTextDelta
|
|
50
48
|
except ImportError as e:
|
|
51
49
|
raise ImportError(
|
|
52
50
|
"`anthropic` not installed or missing beta components. Please install with `pip install anthropic`"
|
|
@@ -185,29 +183,44 @@ class Claude(Model):
|
|
|
185
183
|
def invoke(
|
|
186
184
|
self,
|
|
187
185
|
messages: List[Message],
|
|
186
|
+
assistant_message: Message,
|
|
188
187
|
response_format: Optional[Union[Dict, Type[BaseModel]]] = None,
|
|
189
188
|
tools: Optional[List[Dict[str, Any]]] = None,
|
|
190
189
|
tool_choice: Optional[Union[str, Dict[str, Any]]] = None,
|
|
191
|
-
|
|
190
|
+
run_response: Optional[RunOutput] = None,
|
|
191
|
+
) -> ModelResponse:
|
|
192
192
|
"""
|
|
193
193
|
Send a request to the Anthropic API to generate a response.
|
|
194
194
|
"""
|
|
195
195
|
try:
|
|
196
|
+
if run_response and run_response.metrics:
|
|
197
|
+
run_response.metrics.set_time_to_first_token()
|
|
198
|
+
|
|
196
199
|
chat_messages, system_message = format_messages(messages)
|
|
197
200
|
request_kwargs = self._prepare_request_kwargs(system_message, tools)
|
|
198
201
|
|
|
199
202
|
if self.mcp_servers is not None:
|
|
200
|
-
|
|
203
|
+
assistant_message.metrics.start_timer()
|
|
204
|
+
provider_response = self.get_client().beta.messages.create(
|
|
201
205
|
model=self.id,
|
|
202
206
|
messages=chat_messages, # type: ignore
|
|
203
207
|
**self.get_request_params(),
|
|
204
208
|
)
|
|
205
209
|
else:
|
|
206
|
-
|
|
210
|
+
assistant_message.metrics.start_timer()
|
|
211
|
+
provider_response = self.get_client().messages.create(
|
|
207
212
|
model=self.id,
|
|
208
213
|
messages=chat_messages, # type: ignore
|
|
209
214
|
**request_kwargs,
|
|
210
215
|
)
|
|
216
|
+
|
|
217
|
+
assistant_message.metrics.stop_timer()
|
|
218
|
+
|
|
219
|
+
# Parse the response into an Agno ModelResponse object
|
|
220
|
+
model_response = self._parse_provider_response(provider_response, response_format=response_format) # type: ignore
|
|
221
|
+
|
|
222
|
+
return model_response
|
|
223
|
+
|
|
211
224
|
except APIConnectionError as e:
|
|
212
225
|
log_error(f"Connection error while calling Claude API: {str(e)}")
|
|
213
226
|
raise ModelProviderError(message=e.message, model_name=self.name, model_id=self.id) from e
|
|
@@ -226,9 +239,11 @@ class Claude(Model):
|
|
|
226
239
|
def invoke_stream(
|
|
227
240
|
self,
|
|
228
241
|
messages: List[Message],
|
|
242
|
+
assistant_message: Message,
|
|
229
243
|
response_format: Optional[Union[Dict, Type[BaseModel]]] = None,
|
|
230
244
|
tools: Optional[List[Dict[str, Any]]] = None,
|
|
231
245
|
tool_choice: Optional[Union[str, Dict[str, Any]]] = None,
|
|
246
|
+
run_response: Optional[RunOutput] = None,
|
|
232
247
|
) -> Any:
|
|
233
248
|
"""
|
|
234
249
|
Stream a response from the Anthropic API.
|
|
@@ -248,26 +263,30 @@ class Claude(Model):
|
|
|
248
263
|
request_kwargs = self._prepare_request_kwargs(system_message, tools)
|
|
249
264
|
|
|
250
265
|
try:
|
|
266
|
+
if run_response and run_response.metrics:
|
|
267
|
+
run_response.metrics.set_time_to_first_token()
|
|
268
|
+
|
|
251
269
|
if self.mcp_servers is not None:
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
.
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
)
|
|
270
|
+
assistant_message.metrics.start_timer()
|
|
271
|
+
with self.get_client().beta.messages.stream(
|
|
272
|
+
model=self.id,
|
|
273
|
+
messages=chat_messages, # type: ignore
|
|
274
|
+
**request_kwargs,
|
|
275
|
+
) as stream:
|
|
276
|
+
for chunk in stream:
|
|
277
|
+
yield self._parse_provider_response_delta(chunk) # type: ignore
|
|
261
278
|
else:
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
.
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
|
|
279
|
+
assistant_message.metrics.start_timer()
|
|
280
|
+
with self.get_client().messages.stream(
|
|
281
|
+
model=self.id,
|
|
282
|
+
messages=chat_messages, # type: ignore
|
|
283
|
+
**request_kwargs,
|
|
284
|
+
) as stream:
|
|
285
|
+
for chunk in stream: # type: ignore
|
|
286
|
+
yield self._parse_provider_response_delta(chunk) # type: ignore
|
|
287
|
+
|
|
288
|
+
assistant_message.metrics.stop_timer()
|
|
289
|
+
|
|
271
290
|
except APIConnectionError as e:
|
|
272
291
|
log_error(f"Connection error while calling Claude API: {str(e)}")
|
|
273
292
|
raise ModelProviderError(message=e.message, model_name=self.name, model_id=self.id) from e
|
|
@@ -286,29 +305,44 @@ class Claude(Model):
|
|
|
286
305
|
async def ainvoke(
|
|
287
306
|
self,
|
|
288
307
|
messages: List[Message],
|
|
308
|
+
assistant_message: Message,
|
|
289
309
|
response_format: Optional[Union[Dict, Type[BaseModel]]] = None,
|
|
290
310
|
tools: Optional[List[Dict[str, Any]]] = None,
|
|
291
311
|
tool_choice: Optional[Union[str, Dict[str, Any]]] = None,
|
|
292
|
-
|
|
312
|
+
run_response: Optional[RunOutput] = None,
|
|
313
|
+
) -> ModelResponse:
|
|
293
314
|
"""
|
|
294
315
|
Send an asynchronous request to the Anthropic API to generate a response.
|
|
295
316
|
"""
|
|
296
317
|
try:
|
|
318
|
+
if run_response and run_response.metrics:
|
|
319
|
+
run_response.metrics.set_time_to_first_token()
|
|
320
|
+
|
|
297
321
|
chat_messages, system_message = format_messages(messages)
|
|
298
322
|
request_kwargs = self._prepare_request_kwargs(system_message, tools)
|
|
299
323
|
|
|
300
324
|
if self.mcp_servers is not None:
|
|
301
|
-
|
|
325
|
+
assistant_message.metrics.start_timer()
|
|
326
|
+
provider_response = await self.get_async_client().beta.messages.create(
|
|
302
327
|
model=self.id,
|
|
303
328
|
messages=chat_messages, # type: ignore
|
|
304
329
|
**self.get_request_params(),
|
|
305
330
|
)
|
|
306
331
|
else:
|
|
307
|
-
|
|
332
|
+
assistant_message.metrics.start_timer()
|
|
333
|
+
provider_response = await self.get_async_client().messages.create(
|
|
308
334
|
model=self.id,
|
|
309
335
|
messages=chat_messages, # type: ignore
|
|
310
336
|
**request_kwargs,
|
|
311
337
|
)
|
|
338
|
+
|
|
339
|
+
assistant_message.metrics.stop_timer()
|
|
340
|
+
|
|
341
|
+
# Parse the response into an Agno ModelResponse object
|
|
342
|
+
model_response = self._parse_provider_response(provider_response, response_format=response_format) # type: ignore
|
|
343
|
+
|
|
344
|
+
return model_response
|
|
345
|
+
|
|
312
346
|
except APIConnectionError as e:
|
|
313
347
|
log_error(f"Connection error while calling Claude API: {str(e)}")
|
|
314
348
|
raise ModelProviderError(message=e.message, model_name=self.name, model_id=self.id) from e
|
|
@@ -327,44 +361,51 @@ class Claude(Model):
|
|
|
327
361
|
async def ainvoke_stream(
|
|
328
362
|
self,
|
|
329
363
|
messages: List[Message],
|
|
364
|
+
assistant_message: Message,
|
|
330
365
|
response_format: Optional[Union[Dict, Type[BaseModel]]] = None,
|
|
331
366
|
tools: Optional[List[Dict[str, Any]]] = None,
|
|
332
367
|
tool_choice: Optional[Union[str, Dict[str, Any]]] = None,
|
|
333
|
-
|
|
368
|
+
run_response: Optional[RunOutput] = None,
|
|
369
|
+
) -> AsyncIterator[ModelResponse]:
|
|
334
370
|
"""
|
|
335
371
|
Stream an asynchronous response from the Anthropic API.
|
|
336
|
-
|
|
337
372
|
Args:
|
|
338
373
|
messages (List[Message]): A list of messages to send to the model.
|
|
339
|
-
|
|
340
374
|
Returns:
|
|
341
|
-
|
|
342
|
-
|
|
375
|
+
AsyncIterator[ModelResponse]: An async iterator of processed model responses.
|
|
343
376
|
Raises:
|
|
344
377
|
APIConnectionError: If there are network connectivity issues
|
|
345
378
|
RateLimitError: If the API rate limit is exceeded
|
|
346
379
|
APIStatusError: For other API-related errors
|
|
347
380
|
"""
|
|
348
381
|
try:
|
|
382
|
+
if run_response and run_response.metrics:
|
|
383
|
+
run_response.metrics.set_time_to_first_token()
|
|
384
|
+
|
|
349
385
|
chat_messages, system_message = format_messages(messages)
|
|
350
386
|
request_kwargs = self._prepare_request_kwargs(system_message, tools)
|
|
351
387
|
|
|
352
388
|
if self.mcp_servers is not None:
|
|
389
|
+
assistant_message.metrics.start_timer()
|
|
353
390
|
async with self.get_async_client().beta.messages.stream(
|
|
354
391
|
model=self.id,
|
|
355
392
|
messages=chat_messages, # type: ignore
|
|
356
393
|
**request_kwargs,
|
|
357
394
|
) as stream:
|
|
358
395
|
async for chunk in stream:
|
|
359
|
-
yield chunk
|
|
396
|
+
yield self._parse_provider_response_delta(chunk) # type: ignore
|
|
360
397
|
else:
|
|
398
|
+
assistant_message.metrics.start_timer()
|
|
361
399
|
async with self.get_async_client().messages.stream(
|
|
362
400
|
model=self.id,
|
|
363
401
|
messages=chat_messages, # type: ignore
|
|
364
402
|
**request_kwargs,
|
|
365
403
|
) as stream:
|
|
366
404
|
async for chunk in stream: # type: ignore
|
|
367
|
-
yield chunk
|
|
405
|
+
yield self._parse_provider_response_delta(chunk) # type: ignore
|
|
406
|
+
|
|
407
|
+
assistant_message.metrics.stop_timer()
|
|
408
|
+
|
|
368
409
|
except APIConnectionError as e:
|
|
369
410
|
log_error(f"Connection error while calling Claude API: {str(e)}")
|
|
370
411
|
raise ModelProviderError(message=e.message, model_name=self.name, model_id=self.id) from e
|
|
@@ -406,7 +447,7 @@ class Claude(Model):
|
|
|
406
447
|
return tool_call_prompt
|
|
407
448
|
return None
|
|
408
449
|
|
|
409
|
-
def
|
|
450
|
+
def _parse_provider_response(self, response: AnthropicMessage, **kwargs) -> ModelResponse:
|
|
410
451
|
"""
|
|
411
452
|
Parse the Claude response into a ModelResponse.
|
|
412
453
|
|
|
@@ -449,12 +490,12 @@ class Claude(Model):
|
|
|
449
490
|
)
|
|
450
491
|
)
|
|
451
492
|
elif block.type == "thinking":
|
|
452
|
-
model_response.
|
|
493
|
+
model_response.reasoning_content = block.thinking
|
|
453
494
|
model_response.provider_data = {
|
|
454
495
|
"signature": block.signature,
|
|
455
496
|
}
|
|
456
497
|
elif block.type == "redacted_thinking":
|
|
457
|
-
model_response.
|
|
498
|
+
model_response.redacted_reasoning_content = block.data
|
|
458
499
|
|
|
459
500
|
# Extract tool calls from the response
|
|
460
501
|
if response.stop_reason == "tool_use":
|
|
@@ -468,6 +509,7 @@ class Claude(Model):
|
|
|
468
509
|
function_def["arguments"] = json.dumps(tool_input)
|
|
469
510
|
|
|
470
511
|
model_response.extra = model_response.extra or {}
|
|
512
|
+
|
|
471
513
|
model_response.tool_calls.append(
|
|
472
514
|
{
|
|
473
515
|
"id": block.id,
|
|
@@ -478,23 +520,19 @@ class Claude(Model):
|
|
|
478
520
|
|
|
479
521
|
# Add usage metrics
|
|
480
522
|
if response.usage is not None:
|
|
481
|
-
|
|
482
|
-
"input_tokens": response.usage.input_tokens,
|
|
483
|
-
"output_tokens": response.usage.output_tokens,
|
|
484
|
-
}
|
|
485
|
-
|
|
486
|
-
if hasattr(response.usage, "cache_creation_input_tokens") and response.usage.cache_creation_input_tokens:
|
|
487
|
-
usage_dict["cache_write_tokens"] = response.usage.cache_creation_input_tokens
|
|
488
|
-
|
|
489
|
-
if hasattr(response.usage, "cache_read_input_tokens") and response.usage.cache_read_input_tokens:
|
|
490
|
-
usage_dict["cached_tokens"] = response.usage.cache_read_input_tokens
|
|
491
|
-
|
|
492
|
-
model_response.response_usage = usage_dict
|
|
523
|
+
model_response.response_usage = self._get_metrics(response.usage)
|
|
493
524
|
|
|
494
525
|
return model_response
|
|
495
526
|
|
|
496
|
-
def
|
|
497
|
-
self,
|
|
527
|
+
def _parse_provider_response_delta(
|
|
528
|
+
self,
|
|
529
|
+
response: Union[
|
|
530
|
+
ContentBlockStartEvent,
|
|
531
|
+
ContentBlockDeltaEvent,
|
|
532
|
+
ContentBlockStopEvent,
|
|
533
|
+
MessageStopEvent,
|
|
534
|
+
BetaRawContentBlockDeltaEvent,
|
|
535
|
+
],
|
|
498
536
|
) -> ModelResponse:
|
|
499
537
|
"""
|
|
500
538
|
Parse the Claude streaming response into ModelProviderResponse objects.
|
|
@@ -506,9 +544,10 @@ class Claude(Model):
|
|
|
506
544
|
ModelResponse: Iterator of parsed response data
|
|
507
545
|
"""
|
|
508
546
|
model_response = ModelResponse()
|
|
547
|
+
|
|
509
548
|
if isinstance(response, ContentBlockStartEvent):
|
|
510
|
-
if response.content_block.type == "
|
|
511
|
-
model_response.
|
|
549
|
+
if response.content_block.type == "redacted_reasoning_content":
|
|
550
|
+
model_response.redacted_reasoning_content = response.content_block.data
|
|
512
551
|
|
|
513
552
|
if isinstance(response, ContentBlockDeltaEvent):
|
|
514
553
|
# Handle text content
|
|
@@ -516,7 +555,7 @@ class Claude(Model):
|
|
|
516
555
|
model_response.content = response.delta.text
|
|
517
556
|
# Handle thinking content
|
|
518
557
|
elif response.delta.type == "thinking_delta":
|
|
519
|
-
model_response.
|
|
558
|
+
model_response.reasoning_content = response.delta.thinking
|
|
520
559
|
elif response.delta.type == "signature_delta":
|
|
521
560
|
model_response.provider_data = {
|
|
522
561
|
"signature": response.delta.signature,
|
|
@@ -561,19 +600,8 @@ class Claude(Model):
|
|
|
561
600
|
DocumentCitation(document_title=citation.document_title, cited_text=citation.cited_text)
|
|
562
601
|
)
|
|
563
602
|
|
|
564
|
-
if hasattr(response, "usage") and response.usage is not None:
|
|
565
|
-
|
|
566
|
-
"input_tokens": response.usage.input_tokens or 0,
|
|
567
|
-
"output_tokens": response.usage.output_tokens or 0,
|
|
568
|
-
}
|
|
569
|
-
|
|
570
|
-
if hasattr(response.usage, "cache_creation_input_tokens") and response.usage.cache_creation_input_tokens:
|
|
571
|
-
usage_dict["cache_write_tokens"] = response.usage.cache_creation_input_tokens
|
|
572
|
-
|
|
573
|
-
if hasattr(response.usage, "cache_read_input_tokens") and response.usage.cache_read_input_tokens:
|
|
574
|
-
usage_dict["cached_tokens"] = response.usage.cache_read_input_tokens
|
|
575
|
-
|
|
576
|
-
model_response.response_usage = usage_dict
|
|
603
|
+
if hasattr(response, "message") and hasattr(response.message, "usage") and response.message.usage is not None: # type: ignore
|
|
604
|
+
model_response.response_usage = self._get_metrics(response.message.usage) # type: ignore
|
|
577
605
|
|
|
578
606
|
# Capture the Beta response
|
|
579
607
|
try:
|
|
@@ -587,3 +615,31 @@ class Claude(Model):
|
|
|
587
615
|
log_error(f"Error parsing Beta response: {e}")
|
|
588
616
|
|
|
589
617
|
return model_response
|
|
618
|
+
|
|
619
|
+
def _get_metrics(self, response_usage: Union[Usage, MessageDeltaUsage]) -> Metrics:
|
|
620
|
+
"""
|
|
621
|
+
Parse the given Anthropic-specific usage into an Agno Metrics object.
|
|
622
|
+
|
|
623
|
+
Args:
|
|
624
|
+
response_usage: Usage data from Anthropic
|
|
625
|
+
|
|
626
|
+
Returns:
|
|
627
|
+
Metrics: Parsed metrics data
|
|
628
|
+
"""
|
|
629
|
+
metrics = Metrics()
|
|
630
|
+
|
|
631
|
+
metrics.input_tokens = response_usage.input_tokens or 0
|
|
632
|
+
metrics.output_tokens = response_usage.output_tokens or 0
|
|
633
|
+
metrics.total_tokens = metrics.input_tokens + metrics.output_tokens
|
|
634
|
+
metrics.cache_read_tokens = response_usage.cache_read_input_tokens or 0
|
|
635
|
+
metrics.cache_write_tokens = response_usage.cache_creation_input_tokens or 0
|
|
636
|
+
|
|
637
|
+
# Anthropic-specific additional fields
|
|
638
|
+
if response_usage.server_tool_use:
|
|
639
|
+
metrics.provider_metrics = {"server_tool_use": response_usage.server_tool_use}
|
|
640
|
+
if isinstance(response_usage, Usage):
|
|
641
|
+
if response_usage.service_tier:
|
|
642
|
+
metrics.provider_metrics = metrics.provider_metrics or {}
|
|
643
|
+
metrics.provider_metrics["service_tier"] = response_usage.service_tier
|
|
644
|
+
|
|
645
|
+
return metrics
|