agno 1.8.1__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/__init__.py +8 -0
- 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 +15 -11
- 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 +131 -131
- agno/models/aws/bedrock.py +110 -182
- 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 +77 -33
- 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 +22 -22
- 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 +19 -34
- 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 +32 -2
- 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 +47 -4
- 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 -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/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 -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-1.8.1.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.1.dist-info → agno-2.0.0.dist-info}/WHEEL +0 -0
- {agno-1.8.1.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
|
-
from agno.utils.models.claude import MCPServerConfiguration, format_messages
|
|
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`"
|
|
@@ -176,85 +174,53 @@ class Claude(Model):
|
|
|
176
174
|
request_kwargs["system"] = [{"text": system_message, "type": "text"}]
|
|
177
175
|
|
|
178
176
|
if tools:
|
|
179
|
-
request_kwargs["tools"] =
|
|
177
|
+
request_kwargs["tools"] = format_tools_for_model(tools)
|
|
180
178
|
|
|
181
179
|
if request_kwargs:
|
|
182
180
|
log_debug(f"Calling {self.provider} with request parameters: {request_kwargs}", log_level=2)
|
|
183
181
|
return request_kwargs
|
|
184
182
|
|
|
185
|
-
def _format_tools_for_model(self, tools: Optional[List[Dict[str, Any]]] = None) -> Optional[List[Dict[str, Any]]]:
|
|
186
|
-
"""
|
|
187
|
-
Transforms function definitions into a format accepted by the Anthropic API.
|
|
188
|
-
"""
|
|
189
|
-
if not tools:
|
|
190
|
-
return None
|
|
191
|
-
|
|
192
|
-
parsed_tools: List[Dict[str, Any]] = []
|
|
193
|
-
for tool_def in tools:
|
|
194
|
-
if tool_def.get("type", "") != "function":
|
|
195
|
-
parsed_tools.append(tool_def)
|
|
196
|
-
continue
|
|
197
|
-
|
|
198
|
-
func_def = tool_def.get("function", {})
|
|
199
|
-
parameters: Dict[str, Any] = func_def.get("parameters", {})
|
|
200
|
-
properties: Dict[str, Any] = parameters.get("properties", {})
|
|
201
|
-
required_params: List[str] = []
|
|
202
|
-
|
|
203
|
-
for param_name, param_info in properties.items():
|
|
204
|
-
param_type = param_info.get("type", "")
|
|
205
|
-
param_type_list: List[str] = [param_type] if isinstance(param_type, str) else param_type or []
|
|
206
|
-
|
|
207
|
-
if "null" not in param_type_list:
|
|
208
|
-
required_params.append(param_name)
|
|
209
|
-
|
|
210
|
-
input_properties: Dict[str, Dict[str, Union[str, List[str]]]] = {}
|
|
211
|
-
for param_name, param_info in properties.items():
|
|
212
|
-
input_properties[param_name] = {
|
|
213
|
-
"description": param_info.get("description", ""),
|
|
214
|
-
}
|
|
215
|
-
if "type" not in param_info and "anyOf" in param_info:
|
|
216
|
-
input_properties[param_name]["anyOf"] = param_info["anyOf"]
|
|
217
|
-
else:
|
|
218
|
-
input_properties[param_name]["type"] = param_info.get("type", "")
|
|
219
|
-
|
|
220
|
-
tool = {
|
|
221
|
-
"name": func_def.get("name") or "",
|
|
222
|
-
"description": func_def.get("description") or "",
|
|
223
|
-
"input_schema": {
|
|
224
|
-
"type": parameters.get("type", "object"),
|
|
225
|
-
"properties": input_properties,
|
|
226
|
-
"required": required_params,
|
|
227
|
-
},
|
|
228
|
-
}
|
|
229
|
-
parsed_tools.append(tool)
|
|
230
|
-
return parsed_tools
|
|
231
|
-
|
|
232
183
|
def invoke(
|
|
233
184
|
self,
|
|
234
185
|
messages: List[Message],
|
|
186
|
+
assistant_message: Message,
|
|
235
187
|
response_format: Optional[Union[Dict, Type[BaseModel]]] = None,
|
|
236
188
|
tools: Optional[List[Dict[str, Any]]] = None,
|
|
237
189
|
tool_choice: Optional[Union[str, Dict[str, Any]]] = None,
|
|
238
|
-
|
|
190
|
+
run_response: Optional[RunOutput] = None,
|
|
191
|
+
) -> ModelResponse:
|
|
239
192
|
"""
|
|
240
193
|
Send a request to the Anthropic API to generate a response.
|
|
241
194
|
"""
|
|
242
195
|
try:
|
|
196
|
+
if run_response and run_response.metrics:
|
|
197
|
+
run_response.metrics.set_time_to_first_token()
|
|
198
|
+
|
|
243
199
|
chat_messages, system_message = format_messages(messages)
|
|
244
200
|
request_kwargs = self._prepare_request_kwargs(system_message, tools)
|
|
245
201
|
|
|
246
202
|
if self.mcp_servers is not None:
|
|
247
|
-
|
|
203
|
+
assistant_message.metrics.start_timer()
|
|
204
|
+
provider_response = self.get_client().beta.messages.create(
|
|
248
205
|
model=self.id,
|
|
249
206
|
messages=chat_messages, # type: ignore
|
|
250
207
|
**self.get_request_params(),
|
|
251
208
|
)
|
|
252
209
|
else:
|
|
253
|
-
|
|
210
|
+
assistant_message.metrics.start_timer()
|
|
211
|
+
provider_response = self.get_client().messages.create(
|
|
254
212
|
model=self.id,
|
|
255
213
|
messages=chat_messages, # type: ignore
|
|
256
214
|
**request_kwargs,
|
|
257
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
|
+
|
|
258
224
|
except APIConnectionError as e:
|
|
259
225
|
log_error(f"Connection error while calling Claude API: {str(e)}")
|
|
260
226
|
raise ModelProviderError(message=e.message, model_name=self.name, model_id=self.id) from e
|
|
@@ -273,9 +239,11 @@ class Claude(Model):
|
|
|
273
239
|
def invoke_stream(
|
|
274
240
|
self,
|
|
275
241
|
messages: List[Message],
|
|
242
|
+
assistant_message: Message,
|
|
276
243
|
response_format: Optional[Union[Dict, Type[BaseModel]]] = None,
|
|
277
244
|
tools: Optional[List[Dict[str, Any]]] = None,
|
|
278
245
|
tool_choice: Optional[Union[str, Dict[str, Any]]] = None,
|
|
246
|
+
run_response: Optional[RunOutput] = None,
|
|
279
247
|
) -> Any:
|
|
280
248
|
"""
|
|
281
249
|
Stream a response from the Anthropic API.
|
|
@@ -295,26 +263,30 @@ class Claude(Model):
|
|
|
295
263
|
request_kwargs = self._prepare_request_kwargs(system_message, tools)
|
|
296
264
|
|
|
297
265
|
try:
|
|
266
|
+
if run_response and run_response.metrics:
|
|
267
|
+
run_response.metrics.set_time_to_first_token()
|
|
268
|
+
|
|
298
269
|
if self.mcp_servers is not None:
|
|
299
|
-
|
|
300
|
-
|
|
301
|
-
.
|
|
302
|
-
|
|
303
|
-
|
|
304
|
-
|
|
305
|
-
|
|
306
|
-
|
|
307
|
-
)
|
|
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
|
|
308
278
|
else:
|
|
309
|
-
|
|
310
|
-
|
|
311
|
-
.
|
|
312
|
-
|
|
313
|
-
|
|
314
|
-
|
|
315
|
-
|
|
316
|
-
|
|
317
|
-
|
|
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
|
+
|
|
318
290
|
except APIConnectionError as e:
|
|
319
291
|
log_error(f"Connection error while calling Claude API: {str(e)}")
|
|
320
292
|
raise ModelProviderError(message=e.message, model_name=self.name, model_id=self.id) from e
|
|
@@ -333,29 +305,44 @@ class Claude(Model):
|
|
|
333
305
|
async def ainvoke(
|
|
334
306
|
self,
|
|
335
307
|
messages: List[Message],
|
|
308
|
+
assistant_message: Message,
|
|
336
309
|
response_format: Optional[Union[Dict, Type[BaseModel]]] = None,
|
|
337
310
|
tools: Optional[List[Dict[str, Any]]] = None,
|
|
338
311
|
tool_choice: Optional[Union[str, Dict[str, Any]]] = None,
|
|
339
|
-
|
|
312
|
+
run_response: Optional[RunOutput] = None,
|
|
313
|
+
) -> ModelResponse:
|
|
340
314
|
"""
|
|
341
315
|
Send an asynchronous request to the Anthropic API to generate a response.
|
|
342
316
|
"""
|
|
343
317
|
try:
|
|
318
|
+
if run_response and run_response.metrics:
|
|
319
|
+
run_response.metrics.set_time_to_first_token()
|
|
320
|
+
|
|
344
321
|
chat_messages, system_message = format_messages(messages)
|
|
345
322
|
request_kwargs = self._prepare_request_kwargs(system_message, tools)
|
|
346
323
|
|
|
347
324
|
if self.mcp_servers is not None:
|
|
348
|
-
|
|
325
|
+
assistant_message.metrics.start_timer()
|
|
326
|
+
provider_response = await self.get_async_client().beta.messages.create(
|
|
349
327
|
model=self.id,
|
|
350
328
|
messages=chat_messages, # type: ignore
|
|
351
329
|
**self.get_request_params(),
|
|
352
330
|
)
|
|
353
331
|
else:
|
|
354
|
-
|
|
332
|
+
assistant_message.metrics.start_timer()
|
|
333
|
+
provider_response = await self.get_async_client().messages.create(
|
|
355
334
|
model=self.id,
|
|
356
335
|
messages=chat_messages, # type: ignore
|
|
357
336
|
**request_kwargs,
|
|
358
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
|
+
|
|
359
346
|
except APIConnectionError as e:
|
|
360
347
|
log_error(f"Connection error while calling Claude API: {str(e)}")
|
|
361
348
|
raise ModelProviderError(message=e.message, model_name=self.name, model_id=self.id) from e
|
|
@@ -374,44 +361,51 @@ class Claude(Model):
|
|
|
374
361
|
async def ainvoke_stream(
|
|
375
362
|
self,
|
|
376
363
|
messages: List[Message],
|
|
364
|
+
assistant_message: Message,
|
|
377
365
|
response_format: Optional[Union[Dict, Type[BaseModel]]] = None,
|
|
378
366
|
tools: Optional[List[Dict[str, Any]]] = None,
|
|
379
367
|
tool_choice: Optional[Union[str, Dict[str, Any]]] = None,
|
|
380
|
-
|
|
368
|
+
run_response: Optional[RunOutput] = None,
|
|
369
|
+
) -> AsyncIterator[ModelResponse]:
|
|
381
370
|
"""
|
|
382
371
|
Stream an asynchronous response from the Anthropic API.
|
|
383
|
-
|
|
384
372
|
Args:
|
|
385
373
|
messages (List[Message]): A list of messages to send to the model.
|
|
386
|
-
|
|
387
374
|
Returns:
|
|
388
|
-
|
|
389
|
-
|
|
375
|
+
AsyncIterator[ModelResponse]: An async iterator of processed model responses.
|
|
390
376
|
Raises:
|
|
391
377
|
APIConnectionError: If there are network connectivity issues
|
|
392
378
|
RateLimitError: If the API rate limit is exceeded
|
|
393
379
|
APIStatusError: For other API-related errors
|
|
394
380
|
"""
|
|
395
381
|
try:
|
|
382
|
+
if run_response and run_response.metrics:
|
|
383
|
+
run_response.metrics.set_time_to_first_token()
|
|
384
|
+
|
|
396
385
|
chat_messages, system_message = format_messages(messages)
|
|
397
386
|
request_kwargs = self._prepare_request_kwargs(system_message, tools)
|
|
398
387
|
|
|
399
388
|
if self.mcp_servers is not None:
|
|
389
|
+
assistant_message.metrics.start_timer()
|
|
400
390
|
async with self.get_async_client().beta.messages.stream(
|
|
401
391
|
model=self.id,
|
|
402
392
|
messages=chat_messages, # type: ignore
|
|
403
393
|
**request_kwargs,
|
|
404
394
|
) as stream:
|
|
405
395
|
async for chunk in stream:
|
|
406
|
-
yield chunk
|
|
396
|
+
yield self._parse_provider_response_delta(chunk) # type: ignore
|
|
407
397
|
else:
|
|
398
|
+
assistant_message.metrics.start_timer()
|
|
408
399
|
async with self.get_async_client().messages.stream(
|
|
409
400
|
model=self.id,
|
|
410
401
|
messages=chat_messages, # type: ignore
|
|
411
402
|
**request_kwargs,
|
|
412
403
|
) as stream:
|
|
413
404
|
async for chunk in stream: # type: ignore
|
|
414
|
-
yield chunk
|
|
405
|
+
yield self._parse_provider_response_delta(chunk) # type: ignore
|
|
406
|
+
|
|
407
|
+
assistant_message.metrics.stop_timer()
|
|
408
|
+
|
|
415
409
|
except APIConnectionError as e:
|
|
416
410
|
log_error(f"Connection error while calling Claude API: {str(e)}")
|
|
417
411
|
raise ModelProviderError(message=e.message, model_name=self.name, model_id=self.id) from e
|
|
@@ -453,7 +447,7 @@ class Claude(Model):
|
|
|
453
447
|
return tool_call_prompt
|
|
454
448
|
return None
|
|
455
449
|
|
|
456
|
-
def
|
|
450
|
+
def _parse_provider_response(self, response: AnthropicMessage, **kwargs) -> ModelResponse:
|
|
457
451
|
"""
|
|
458
452
|
Parse the Claude response into a ModelResponse.
|
|
459
453
|
|
|
@@ -496,12 +490,12 @@ class Claude(Model):
|
|
|
496
490
|
)
|
|
497
491
|
)
|
|
498
492
|
elif block.type == "thinking":
|
|
499
|
-
model_response.
|
|
493
|
+
model_response.reasoning_content = block.thinking
|
|
500
494
|
model_response.provider_data = {
|
|
501
495
|
"signature": block.signature,
|
|
502
496
|
}
|
|
503
497
|
elif block.type == "redacted_thinking":
|
|
504
|
-
model_response.
|
|
498
|
+
model_response.redacted_reasoning_content = block.data
|
|
505
499
|
|
|
506
500
|
# Extract tool calls from the response
|
|
507
501
|
if response.stop_reason == "tool_use":
|
|
@@ -515,6 +509,7 @@ class Claude(Model):
|
|
|
515
509
|
function_def["arguments"] = json.dumps(tool_input)
|
|
516
510
|
|
|
517
511
|
model_response.extra = model_response.extra or {}
|
|
512
|
+
|
|
518
513
|
model_response.tool_calls.append(
|
|
519
514
|
{
|
|
520
515
|
"id": block.id,
|
|
@@ -525,23 +520,19 @@ class Claude(Model):
|
|
|
525
520
|
|
|
526
521
|
# Add usage metrics
|
|
527
522
|
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
|
|
523
|
+
model_response.response_usage = self._get_metrics(response.usage)
|
|
540
524
|
|
|
541
525
|
return model_response
|
|
542
526
|
|
|
543
|
-
def
|
|
544
|
-
self,
|
|
527
|
+
def _parse_provider_response_delta(
|
|
528
|
+
self,
|
|
529
|
+
response: Union[
|
|
530
|
+
ContentBlockStartEvent,
|
|
531
|
+
ContentBlockDeltaEvent,
|
|
532
|
+
ContentBlockStopEvent,
|
|
533
|
+
MessageStopEvent,
|
|
534
|
+
BetaRawContentBlockDeltaEvent,
|
|
535
|
+
],
|
|
545
536
|
) -> ModelResponse:
|
|
546
537
|
"""
|
|
547
538
|
Parse the Claude streaming response into ModelProviderResponse objects.
|
|
@@ -553,9 +544,10 @@ class Claude(Model):
|
|
|
553
544
|
ModelResponse: Iterator of parsed response data
|
|
554
545
|
"""
|
|
555
546
|
model_response = ModelResponse()
|
|
547
|
+
|
|
556
548
|
if isinstance(response, ContentBlockStartEvent):
|
|
557
|
-
if response.content_block.type == "
|
|
558
|
-
model_response.
|
|
549
|
+
if response.content_block.type == "redacted_reasoning_content":
|
|
550
|
+
model_response.redacted_reasoning_content = response.content_block.data
|
|
559
551
|
|
|
560
552
|
if isinstance(response, ContentBlockDeltaEvent):
|
|
561
553
|
# Handle text content
|
|
@@ -563,23 +555,14 @@ class Claude(Model):
|
|
|
563
555
|
model_response.content = response.delta.text
|
|
564
556
|
# Handle thinking content
|
|
565
557
|
elif response.delta.type == "thinking_delta":
|
|
566
|
-
model_response.
|
|
558
|
+
model_response.reasoning_content = response.delta.thinking
|
|
567
559
|
elif response.delta.type == "signature_delta":
|
|
568
560
|
model_response.provider_data = {
|
|
569
561
|
"signature": response.delta.signature,
|
|
570
562
|
}
|
|
571
563
|
|
|
572
564
|
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
|
|
565
|
+
if response.content_block.type == "tool_use": # type: ignore
|
|
583
566
|
tool_use = response.content_block # type: ignore
|
|
584
567
|
tool_name = tool_use.name
|
|
585
568
|
tool_input = tool_use.input
|
|
@@ -617,19 +600,8 @@ class Claude(Model):
|
|
|
617
600
|
DocumentCitation(document_title=citation.document_title, cited_text=citation.cited_text)
|
|
618
601
|
)
|
|
619
602
|
|
|
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
|
|
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
|
|
633
605
|
|
|
634
606
|
# Capture the Beta response
|
|
635
607
|
try:
|
|
@@ -643,3 +615,31 @@ class Claude(Model):
|
|
|
643
615
|
log_error(f"Error parsing Beta response: {e}")
|
|
644
616
|
|
|
645
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
|