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/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
|
|
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`"
|
|
@@ -232,29 +230,44 @@ class Claude(Model):
|
|
|
232
230
|
def invoke(
|
|
233
231
|
self,
|
|
234
232
|
messages: List[Message],
|
|
233
|
+
assistant_message: Message,
|
|
235
234
|
response_format: Optional[Union[Dict, Type[BaseModel]]] = None,
|
|
236
235
|
tools: Optional[List[Dict[str, Any]]] = None,
|
|
237
236
|
tool_choice: Optional[Union[str, Dict[str, Any]]] = None,
|
|
238
|
-
|
|
237
|
+
run_response: Optional[RunOutput] = None,
|
|
238
|
+
) -> ModelResponse:
|
|
239
239
|
"""
|
|
240
240
|
Send a request to the Anthropic API to generate a response.
|
|
241
241
|
"""
|
|
242
242
|
try:
|
|
243
|
+
if run_response and run_response.metrics:
|
|
244
|
+
run_response.metrics.set_time_to_first_token()
|
|
245
|
+
|
|
243
246
|
chat_messages, system_message = format_messages(messages)
|
|
244
247
|
request_kwargs = self._prepare_request_kwargs(system_message, tools)
|
|
245
248
|
|
|
246
249
|
if self.mcp_servers is not None:
|
|
247
|
-
|
|
250
|
+
assistant_message.metrics.start_timer()
|
|
251
|
+
provider_response = self.get_client().beta.messages.create(
|
|
248
252
|
model=self.id,
|
|
249
253
|
messages=chat_messages, # type: ignore
|
|
250
254
|
**self.get_request_params(),
|
|
251
255
|
)
|
|
252
256
|
else:
|
|
253
|
-
|
|
257
|
+
assistant_message.metrics.start_timer()
|
|
258
|
+
provider_response = self.get_client().messages.create(
|
|
254
259
|
model=self.id,
|
|
255
260
|
messages=chat_messages, # type: ignore
|
|
256
261
|
**request_kwargs,
|
|
257
262
|
)
|
|
263
|
+
|
|
264
|
+
assistant_message.metrics.stop_timer()
|
|
265
|
+
|
|
266
|
+
# Parse the response into an Agno ModelResponse object
|
|
267
|
+
model_response = self._parse_provider_response(provider_response, response_format=response_format) # type: ignore
|
|
268
|
+
|
|
269
|
+
return model_response
|
|
270
|
+
|
|
258
271
|
except APIConnectionError as e:
|
|
259
272
|
log_error(f"Connection error while calling Claude API: {str(e)}")
|
|
260
273
|
raise ModelProviderError(message=e.message, model_name=self.name, model_id=self.id) from e
|
|
@@ -273,9 +286,11 @@ class Claude(Model):
|
|
|
273
286
|
def invoke_stream(
|
|
274
287
|
self,
|
|
275
288
|
messages: List[Message],
|
|
289
|
+
assistant_message: Message,
|
|
276
290
|
response_format: Optional[Union[Dict, Type[BaseModel]]] = None,
|
|
277
291
|
tools: Optional[List[Dict[str, Any]]] = None,
|
|
278
292
|
tool_choice: Optional[Union[str, Dict[str, Any]]] = None,
|
|
293
|
+
run_response: Optional[RunOutput] = None,
|
|
279
294
|
) -> Any:
|
|
280
295
|
"""
|
|
281
296
|
Stream a response from the Anthropic API.
|
|
@@ -295,26 +310,30 @@ class Claude(Model):
|
|
|
295
310
|
request_kwargs = self._prepare_request_kwargs(system_message, tools)
|
|
296
311
|
|
|
297
312
|
try:
|
|
313
|
+
if run_response and run_response.metrics:
|
|
314
|
+
run_response.metrics.set_time_to_first_token()
|
|
315
|
+
|
|
298
316
|
if self.mcp_servers is not None:
|
|
299
|
-
|
|
300
|
-
|
|
301
|
-
.
|
|
302
|
-
|
|
303
|
-
|
|
304
|
-
|
|
305
|
-
|
|
306
|
-
|
|
307
|
-
)
|
|
317
|
+
assistant_message.metrics.start_timer()
|
|
318
|
+
with self.get_client().beta.messages.stream(
|
|
319
|
+
model=self.id,
|
|
320
|
+
messages=chat_messages, # type: ignore
|
|
321
|
+
**request_kwargs,
|
|
322
|
+
) as stream:
|
|
323
|
+
for chunk in stream:
|
|
324
|
+
yield self._parse_provider_response_delta(chunk) # type: ignore
|
|
308
325
|
else:
|
|
309
|
-
|
|
310
|
-
|
|
311
|
-
.
|
|
312
|
-
|
|
313
|
-
|
|
314
|
-
|
|
315
|
-
|
|
316
|
-
|
|
317
|
-
|
|
326
|
+
assistant_message.metrics.start_timer()
|
|
327
|
+
with self.get_client().messages.stream(
|
|
328
|
+
model=self.id,
|
|
329
|
+
messages=chat_messages, # type: ignore
|
|
330
|
+
**request_kwargs,
|
|
331
|
+
) as stream:
|
|
332
|
+
for chunk in stream: # type: ignore
|
|
333
|
+
yield self._parse_provider_response_delta(chunk) # type: ignore
|
|
334
|
+
|
|
335
|
+
assistant_message.metrics.stop_timer()
|
|
336
|
+
|
|
318
337
|
except APIConnectionError as e:
|
|
319
338
|
log_error(f"Connection error while calling Claude API: {str(e)}")
|
|
320
339
|
raise ModelProviderError(message=e.message, model_name=self.name, model_id=self.id) from e
|
|
@@ -333,29 +352,44 @@ class Claude(Model):
|
|
|
333
352
|
async def ainvoke(
|
|
334
353
|
self,
|
|
335
354
|
messages: List[Message],
|
|
355
|
+
assistant_message: Message,
|
|
336
356
|
response_format: Optional[Union[Dict, Type[BaseModel]]] = None,
|
|
337
357
|
tools: Optional[List[Dict[str, Any]]] = None,
|
|
338
358
|
tool_choice: Optional[Union[str, Dict[str, Any]]] = None,
|
|
339
|
-
|
|
359
|
+
run_response: Optional[RunOutput] = None,
|
|
360
|
+
) -> ModelResponse:
|
|
340
361
|
"""
|
|
341
362
|
Send an asynchronous request to the Anthropic API to generate a response.
|
|
342
363
|
"""
|
|
343
364
|
try:
|
|
365
|
+
if run_response and run_response.metrics:
|
|
366
|
+
run_response.metrics.set_time_to_first_token()
|
|
367
|
+
|
|
344
368
|
chat_messages, system_message = format_messages(messages)
|
|
345
369
|
request_kwargs = self._prepare_request_kwargs(system_message, tools)
|
|
346
370
|
|
|
347
371
|
if self.mcp_servers is not None:
|
|
348
|
-
|
|
372
|
+
assistant_message.metrics.start_timer()
|
|
373
|
+
provider_response = await self.get_async_client().beta.messages.create(
|
|
349
374
|
model=self.id,
|
|
350
375
|
messages=chat_messages, # type: ignore
|
|
351
376
|
**self.get_request_params(),
|
|
352
377
|
)
|
|
353
378
|
else:
|
|
354
|
-
|
|
379
|
+
assistant_message.metrics.start_timer()
|
|
380
|
+
provider_response = await self.get_async_client().messages.create(
|
|
355
381
|
model=self.id,
|
|
356
382
|
messages=chat_messages, # type: ignore
|
|
357
383
|
**request_kwargs,
|
|
358
384
|
)
|
|
385
|
+
|
|
386
|
+
assistant_message.metrics.stop_timer()
|
|
387
|
+
|
|
388
|
+
# Parse the response into an Agno ModelResponse object
|
|
389
|
+
model_response = self._parse_provider_response(provider_response, response_format=response_format) # type: ignore
|
|
390
|
+
|
|
391
|
+
return model_response
|
|
392
|
+
|
|
359
393
|
except APIConnectionError as e:
|
|
360
394
|
log_error(f"Connection error while calling Claude API: {str(e)}")
|
|
361
395
|
raise ModelProviderError(message=e.message, model_name=self.name, model_id=self.id) from e
|
|
@@ -374,44 +408,51 @@ class Claude(Model):
|
|
|
374
408
|
async def ainvoke_stream(
|
|
375
409
|
self,
|
|
376
410
|
messages: List[Message],
|
|
411
|
+
assistant_message: Message,
|
|
377
412
|
response_format: Optional[Union[Dict, Type[BaseModel]]] = None,
|
|
378
413
|
tools: Optional[List[Dict[str, Any]]] = None,
|
|
379
414
|
tool_choice: Optional[Union[str, Dict[str, Any]]] = None,
|
|
380
|
-
|
|
415
|
+
run_response: Optional[RunOutput] = None,
|
|
416
|
+
) -> AsyncIterator[ModelResponse]:
|
|
381
417
|
"""
|
|
382
418
|
Stream an asynchronous response from the Anthropic API.
|
|
383
|
-
|
|
384
419
|
Args:
|
|
385
420
|
messages (List[Message]): A list of messages to send to the model.
|
|
386
|
-
|
|
387
421
|
Returns:
|
|
388
|
-
|
|
389
|
-
|
|
422
|
+
AsyncIterator[ModelResponse]: An async iterator of processed model responses.
|
|
390
423
|
Raises:
|
|
391
424
|
APIConnectionError: If there are network connectivity issues
|
|
392
425
|
RateLimitError: If the API rate limit is exceeded
|
|
393
426
|
APIStatusError: For other API-related errors
|
|
394
427
|
"""
|
|
395
428
|
try:
|
|
429
|
+
if run_response and run_response.metrics:
|
|
430
|
+
run_response.metrics.set_time_to_first_token()
|
|
431
|
+
|
|
396
432
|
chat_messages, system_message = format_messages(messages)
|
|
397
433
|
request_kwargs = self._prepare_request_kwargs(system_message, tools)
|
|
398
434
|
|
|
399
435
|
if self.mcp_servers is not None:
|
|
436
|
+
assistant_message.metrics.start_timer()
|
|
400
437
|
async with self.get_async_client().beta.messages.stream(
|
|
401
438
|
model=self.id,
|
|
402
439
|
messages=chat_messages, # type: ignore
|
|
403
440
|
**request_kwargs,
|
|
404
441
|
) as stream:
|
|
405
442
|
async for chunk in stream:
|
|
406
|
-
yield chunk
|
|
443
|
+
yield self._parse_provider_response_delta(chunk) # type: ignore
|
|
407
444
|
else:
|
|
445
|
+
assistant_message.metrics.start_timer()
|
|
408
446
|
async with self.get_async_client().messages.stream(
|
|
409
447
|
model=self.id,
|
|
410
448
|
messages=chat_messages, # type: ignore
|
|
411
449
|
**request_kwargs,
|
|
412
450
|
) as stream:
|
|
413
451
|
async for chunk in stream: # type: ignore
|
|
414
|
-
yield chunk
|
|
452
|
+
yield self._parse_provider_response_delta(chunk) # type: ignore
|
|
453
|
+
|
|
454
|
+
assistant_message.metrics.stop_timer()
|
|
455
|
+
|
|
415
456
|
except APIConnectionError as e:
|
|
416
457
|
log_error(f"Connection error while calling Claude API: {str(e)}")
|
|
417
458
|
raise ModelProviderError(message=e.message, model_name=self.name, model_id=self.id) from e
|
|
@@ -453,7 +494,7 @@ class Claude(Model):
|
|
|
453
494
|
return tool_call_prompt
|
|
454
495
|
return None
|
|
455
496
|
|
|
456
|
-
def
|
|
497
|
+
def _parse_provider_response(self, response: AnthropicMessage, **kwargs) -> ModelResponse:
|
|
457
498
|
"""
|
|
458
499
|
Parse the Claude response into a ModelResponse.
|
|
459
500
|
|
|
@@ -496,12 +537,12 @@ class Claude(Model):
|
|
|
496
537
|
)
|
|
497
538
|
)
|
|
498
539
|
elif block.type == "thinking":
|
|
499
|
-
model_response.
|
|
540
|
+
model_response.reasoning_content = block.thinking
|
|
500
541
|
model_response.provider_data = {
|
|
501
542
|
"signature": block.signature,
|
|
502
543
|
}
|
|
503
544
|
elif block.type == "redacted_thinking":
|
|
504
|
-
model_response.
|
|
545
|
+
model_response.redacted_reasoning_content = block.data
|
|
505
546
|
|
|
506
547
|
# Extract tool calls from the response
|
|
507
548
|
if response.stop_reason == "tool_use":
|
|
@@ -515,6 +556,7 @@ class Claude(Model):
|
|
|
515
556
|
function_def["arguments"] = json.dumps(tool_input)
|
|
516
557
|
|
|
517
558
|
model_response.extra = model_response.extra or {}
|
|
559
|
+
|
|
518
560
|
model_response.tool_calls.append(
|
|
519
561
|
{
|
|
520
562
|
"id": block.id,
|
|
@@ -525,23 +567,19 @@ class Claude(Model):
|
|
|
525
567
|
|
|
526
568
|
# Add usage metrics
|
|
527
569
|
if response.usage is not None:
|
|
528
|
-
|
|
529
|
-
"input_tokens": response.usage.input_tokens,
|
|
530
|
-
"output_tokens": response.usage.output_tokens,
|
|
531
|
-
}
|
|
532
|
-
|
|
533
|
-
if hasattr(response.usage, "cache_creation_input_tokens") and response.usage.cache_creation_input_tokens:
|
|
534
|
-
usage_dict["cache_write_tokens"] = response.usage.cache_creation_input_tokens
|
|
535
|
-
|
|
536
|
-
if hasattr(response.usage, "cache_read_input_tokens") and response.usage.cache_read_input_tokens:
|
|
537
|
-
usage_dict["cached_tokens"] = response.usage.cache_read_input_tokens
|
|
538
|
-
|
|
539
|
-
model_response.response_usage = usage_dict
|
|
570
|
+
model_response.response_usage = self._get_metrics(response.usage)
|
|
540
571
|
|
|
541
572
|
return model_response
|
|
542
573
|
|
|
543
|
-
def
|
|
544
|
-
self,
|
|
574
|
+
def _parse_provider_response_delta(
|
|
575
|
+
self,
|
|
576
|
+
response: Union[
|
|
577
|
+
ContentBlockStartEvent,
|
|
578
|
+
ContentBlockDeltaEvent,
|
|
579
|
+
ContentBlockStopEvent,
|
|
580
|
+
MessageStopEvent,
|
|
581
|
+
BetaRawContentBlockDeltaEvent,
|
|
582
|
+
],
|
|
545
583
|
) -> ModelResponse:
|
|
546
584
|
"""
|
|
547
585
|
Parse the Claude streaming response into ModelProviderResponse objects.
|
|
@@ -553,9 +591,10 @@ class Claude(Model):
|
|
|
553
591
|
ModelResponse: Iterator of parsed response data
|
|
554
592
|
"""
|
|
555
593
|
model_response = ModelResponse()
|
|
594
|
+
|
|
556
595
|
if isinstance(response, ContentBlockStartEvent):
|
|
557
|
-
if response.content_block.type == "
|
|
558
|
-
model_response.
|
|
596
|
+
if response.content_block.type == "redacted_reasoning_content":
|
|
597
|
+
model_response.redacted_reasoning_content = response.content_block.data
|
|
559
598
|
|
|
560
599
|
if isinstance(response, ContentBlockDeltaEvent):
|
|
561
600
|
# Handle text content
|
|
@@ -563,23 +602,14 @@ class Claude(Model):
|
|
|
563
602
|
model_response.content = response.delta.text
|
|
564
603
|
# Handle thinking content
|
|
565
604
|
elif response.delta.type == "thinking_delta":
|
|
566
|
-
model_response.
|
|
605
|
+
model_response.reasoning_content = response.delta.thinking
|
|
567
606
|
elif response.delta.type == "signature_delta":
|
|
568
607
|
model_response.provider_data = {
|
|
569
608
|
"signature": response.delta.signature,
|
|
570
609
|
}
|
|
571
610
|
|
|
572
611
|
elif isinstance(response, ContentBlockStopEvent):
|
|
573
|
-
|
|
574
|
-
if response.content_block.type == "thinking": # type: ignore
|
|
575
|
-
model_response.thinking = response.content_block.thinking # type: ignore
|
|
576
|
-
# Store signature if available
|
|
577
|
-
if hasattr(response.content_block, "signature"): # type: ignore
|
|
578
|
-
model_response.provider_data = {
|
|
579
|
-
"signature": response.content_block.signature, # type: ignore
|
|
580
|
-
}
|
|
581
|
-
# Handle tool calls
|
|
582
|
-
elif response.content_block.type == "tool_use": # type: ignore
|
|
612
|
+
if response.content_block.type == "tool_use": # type: ignore
|
|
583
613
|
tool_use = response.content_block # type: ignore
|
|
584
614
|
tool_name = tool_use.name
|
|
585
615
|
tool_input = tool_use.input
|
|
@@ -617,19 +647,8 @@ class Claude(Model):
|
|
|
617
647
|
DocumentCitation(document_title=citation.document_title, cited_text=citation.cited_text)
|
|
618
648
|
)
|
|
619
649
|
|
|
620
|
-
if hasattr(response, "usage") and response.usage is not None:
|
|
621
|
-
|
|
622
|
-
"input_tokens": response.usage.input_tokens or 0,
|
|
623
|
-
"output_tokens": response.usage.output_tokens or 0,
|
|
624
|
-
}
|
|
625
|
-
|
|
626
|
-
if hasattr(response.usage, "cache_creation_input_tokens") and response.usage.cache_creation_input_tokens:
|
|
627
|
-
usage_dict["cache_write_tokens"] = response.usage.cache_creation_input_tokens
|
|
628
|
-
|
|
629
|
-
if hasattr(response.usage, "cache_read_input_tokens") and response.usage.cache_read_input_tokens:
|
|
630
|
-
usage_dict["cached_tokens"] = response.usage.cache_read_input_tokens
|
|
631
|
-
|
|
632
|
-
model_response.response_usage = usage_dict
|
|
650
|
+
if hasattr(response, "message") and hasattr(response.message, "usage") and response.message.usage is not None: # type: ignore
|
|
651
|
+
model_response.response_usage = self._get_metrics(response.message.usage) # type: ignore
|
|
633
652
|
|
|
634
653
|
# Capture the Beta response
|
|
635
654
|
try:
|
|
@@ -643,3 +662,31 @@ class Claude(Model):
|
|
|
643
662
|
log_error(f"Error parsing Beta response: {e}")
|
|
644
663
|
|
|
645
664
|
return model_response
|
|
665
|
+
|
|
666
|
+
def _get_metrics(self, response_usage: Union[Usage, MessageDeltaUsage]) -> Metrics:
|
|
667
|
+
"""
|
|
668
|
+
Parse the given Anthropic-specific usage into an Agno Metrics object.
|
|
669
|
+
|
|
670
|
+
Args:
|
|
671
|
+
response_usage: Usage data from Anthropic
|
|
672
|
+
|
|
673
|
+
Returns:
|
|
674
|
+
Metrics: Parsed metrics data
|
|
675
|
+
"""
|
|
676
|
+
metrics = Metrics()
|
|
677
|
+
|
|
678
|
+
metrics.input_tokens = response_usage.input_tokens or 0
|
|
679
|
+
metrics.output_tokens = response_usage.output_tokens or 0
|
|
680
|
+
metrics.total_tokens = metrics.input_tokens + metrics.output_tokens
|
|
681
|
+
metrics.cache_read_tokens = response_usage.cache_read_input_tokens or 0
|
|
682
|
+
metrics.cache_write_tokens = response_usage.cache_creation_input_tokens or 0
|
|
683
|
+
|
|
684
|
+
# Anthropic-specific additional fields
|
|
685
|
+
if response_usage.server_tool_use:
|
|
686
|
+
metrics.provider_metrics = {"server_tool_use": response_usage.server_tool_use}
|
|
687
|
+
if isinstance(response_usage, Usage):
|
|
688
|
+
if response_usage.service_tier:
|
|
689
|
+
metrics.provider_metrics = metrics.provider_metrics or {}
|
|
690
|
+
metrics.provider_metrics["service_tier"] = response_usage.service_tier
|
|
691
|
+
|
|
692
|
+
return metrics
|