agno 2.1.2__py3-none-any.whl → 2.3.13__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/agent.py +5540 -2273
- agno/api/api.py +2 -0
- agno/api/os.py +1 -1
- agno/compression/__init__.py +3 -0
- agno/compression/manager.py +247 -0
- agno/culture/__init__.py +3 -0
- agno/culture/manager.py +956 -0
- agno/db/async_postgres/__init__.py +3 -0
- agno/db/base.py +689 -6
- agno/db/dynamo/dynamo.py +933 -37
- agno/db/dynamo/schemas.py +174 -10
- agno/db/dynamo/utils.py +63 -4
- agno/db/firestore/firestore.py +831 -9
- agno/db/firestore/schemas.py +51 -0
- agno/db/firestore/utils.py +102 -4
- agno/db/gcs_json/gcs_json_db.py +660 -12
- agno/db/gcs_json/utils.py +60 -26
- agno/db/in_memory/in_memory_db.py +287 -14
- agno/db/in_memory/utils.py +60 -2
- agno/db/json/json_db.py +590 -14
- agno/db/json/utils.py +60 -26
- agno/db/migrations/manager.py +199 -0
- agno/db/migrations/v1_to_v2.py +43 -13
- agno/db/migrations/versions/__init__.py +0 -0
- agno/db/migrations/versions/v2_3_0.py +938 -0
- agno/db/mongo/__init__.py +15 -1
- agno/db/mongo/async_mongo.py +2760 -0
- agno/db/mongo/mongo.py +879 -11
- agno/db/mongo/schemas.py +42 -0
- agno/db/mongo/utils.py +80 -8
- agno/db/mysql/__init__.py +2 -1
- agno/db/mysql/async_mysql.py +2912 -0
- agno/db/mysql/mysql.py +946 -68
- agno/db/mysql/schemas.py +72 -10
- agno/db/mysql/utils.py +198 -7
- agno/db/postgres/__init__.py +2 -1
- agno/db/postgres/async_postgres.py +2579 -0
- agno/db/postgres/postgres.py +942 -57
- agno/db/postgres/schemas.py +81 -18
- agno/db/postgres/utils.py +164 -2
- agno/db/redis/redis.py +671 -7
- agno/db/redis/schemas.py +50 -0
- agno/db/redis/utils.py +65 -7
- agno/db/schemas/__init__.py +2 -1
- agno/db/schemas/culture.py +120 -0
- agno/db/schemas/evals.py +1 -0
- agno/db/schemas/memory.py +17 -2
- agno/db/singlestore/schemas.py +63 -0
- agno/db/singlestore/singlestore.py +949 -83
- agno/db/singlestore/utils.py +60 -2
- agno/db/sqlite/__init__.py +2 -1
- agno/db/sqlite/async_sqlite.py +2911 -0
- agno/db/sqlite/schemas.py +62 -0
- agno/db/sqlite/sqlite.py +965 -46
- agno/db/sqlite/utils.py +169 -8
- agno/db/surrealdb/__init__.py +3 -0
- agno/db/surrealdb/metrics.py +292 -0
- agno/db/surrealdb/models.py +334 -0
- agno/db/surrealdb/queries.py +71 -0
- agno/db/surrealdb/surrealdb.py +1908 -0
- agno/db/surrealdb/utils.py +147 -0
- agno/db/utils.py +2 -0
- agno/eval/__init__.py +10 -0
- agno/eval/accuracy.py +75 -55
- agno/eval/agent_as_judge.py +861 -0
- agno/eval/base.py +29 -0
- agno/eval/performance.py +16 -7
- agno/eval/reliability.py +28 -16
- agno/eval/utils.py +35 -17
- agno/exceptions.py +27 -2
- agno/filters.py +354 -0
- agno/guardrails/prompt_injection.py +1 -0
- agno/hooks/__init__.py +3 -0
- agno/hooks/decorator.py +164 -0
- agno/integrations/discord/client.py +1 -1
- agno/knowledge/chunking/agentic.py +13 -10
- agno/knowledge/chunking/fixed.py +4 -1
- agno/knowledge/chunking/semantic.py +9 -4
- agno/knowledge/chunking/strategy.py +59 -15
- agno/knowledge/embedder/fastembed.py +1 -1
- agno/knowledge/embedder/nebius.py +1 -1
- agno/knowledge/embedder/ollama.py +8 -0
- agno/knowledge/embedder/openai.py +8 -8
- agno/knowledge/embedder/sentence_transformer.py +6 -2
- agno/knowledge/embedder/vllm.py +262 -0
- agno/knowledge/knowledge.py +1618 -318
- agno/knowledge/reader/base.py +6 -2
- agno/knowledge/reader/csv_reader.py +8 -10
- agno/knowledge/reader/docx_reader.py +5 -6
- agno/knowledge/reader/field_labeled_csv_reader.py +16 -20
- agno/knowledge/reader/json_reader.py +5 -4
- agno/knowledge/reader/markdown_reader.py +8 -8
- agno/knowledge/reader/pdf_reader.py +17 -19
- agno/knowledge/reader/pptx_reader.py +101 -0
- agno/knowledge/reader/reader_factory.py +32 -3
- agno/knowledge/reader/s3_reader.py +3 -3
- agno/knowledge/reader/tavily_reader.py +193 -0
- agno/knowledge/reader/text_reader.py +22 -10
- agno/knowledge/reader/web_search_reader.py +1 -48
- agno/knowledge/reader/website_reader.py +10 -10
- agno/knowledge/reader/wikipedia_reader.py +33 -1
- agno/knowledge/types.py +1 -0
- agno/knowledge/utils.py +72 -7
- agno/media.py +22 -6
- agno/memory/__init__.py +14 -1
- agno/memory/manager.py +544 -83
- agno/memory/strategies/__init__.py +15 -0
- agno/memory/strategies/base.py +66 -0
- agno/memory/strategies/summarize.py +196 -0
- agno/memory/strategies/types.py +37 -0
- agno/models/aimlapi/aimlapi.py +17 -0
- agno/models/anthropic/claude.py +515 -40
- agno/models/aws/bedrock.py +102 -21
- agno/models/aws/claude.py +131 -274
- agno/models/azure/ai_foundry.py +41 -19
- agno/models/azure/openai_chat.py +39 -8
- agno/models/base.py +1249 -525
- agno/models/cerebras/cerebras.py +91 -21
- agno/models/cerebras/cerebras_openai.py +21 -2
- agno/models/cohere/chat.py +40 -6
- agno/models/cometapi/cometapi.py +18 -1
- agno/models/dashscope/dashscope.py +2 -3
- agno/models/deepinfra/deepinfra.py +18 -1
- agno/models/deepseek/deepseek.py +69 -3
- agno/models/fireworks/fireworks.py +18 -1
- agno/models/google/gemini.py +877 -80
- agno/models/google/utils.py +22 -0
- agno/models/groq/groq.py +51 -18
- agno/models/huggingface/huggingface.py +17 -6
- agno/models/ibm/watsonx.py +16 -6
- agno/models/internlm/internlm.py +18 -1
- agno/models/langdb/langdb.py +13 -1
- agno/models/litellm/chat.py +44 -9
- agno/models/litellm/litellm_openai.py +18 -1
- agno/models/message.py +28 -5
- agno/models/meta/llama.py +47 -14
- agno/models/meta/llama_openai.py +22 -17
- agno/models/mistral/mistral.py +8 -4
- agno/models/nebius/nebius.py +6 -7
- agno/models/nvidia/nvidia.py +20 -3
- agno/models/ollama/chat.py +24 -8
- agno/models/openai/chat.py +104 -29
- agno/models/openai/responses.py +101 -81
- agno/models/openrouter/openrouter.py +60 -3
- agno/models/perplexity/perplexity.py +17 -1
- agno/models/portkey/portkey.py +7 -6
- agno/models/requesty/requesty.py +24 -4
- agno/models/response.py +73 -2
- agno/models/sambanova/sambanova.py +20 -3
- agno/models/siliconflow/siliconflow.py +19 -2
- agno/models/together/together.py +20 -3
- agno/models/utils.py +254 -8
- agno/models/vercel/v0.py +20 -3
- agno/models/vertexai/__init__.py +0 -0
- agno/models/vertexai/claude.py +190 -0
- agno/models/vllm/vllm.py +19 -14
- agno/models/xai/xai.py +19 -2
- agno/os/app.py +549 -152
- agno/os/auth.py +190 -3
- agno/os/config.py +23 -0
- agno/os/interfaces/a2a/router.py +8 -11
- agno/os/interfaces/a2a/utils.py +1 -1
- agno/os/interfaces/agui/router.py +18 -3
- agno/os/interfaces/agui/utils.py +152 -39
- agno/os/interfaces/slack/router.py +55 -37
- agno/os/interfaces/slack/slack.py +9 -1
- agno/os/interfaces/whatsapp/router.py +0 -1
- agno/os/interfaces/whatsapp/security.py +3 -1
- agno/os/mcp.py +110 -52
- agno/os/middleware/__init__.py +2 -0
- agno/os/middleware/jwt.py +676 -112
- agno/os/router.py +40 -1478
- agno/os/routers/agents/__init__.py +3 -0
- agno/os/routers/agents/router.py +599 -0
- agno/os/routers/agents/schema.py +261 -0
- agno/os/routers/evals/evals.py +96 -39
- agno/os/routers/evals/schemas.py +65 -33
- agno/os/routers/evals/utils.py +80 -10
- agno/os/routers/health.py +10 -4
- agno/os/routers/knowledge/knowledge.py +196 -38
- agno/os/routers/knowledge/schemas.py +82 -22
- agno/os/routers/memory/memory.py +279 -52
- agno/os/routers/memory/schemas.py +46 -17
- agno/os/routers/metrics/metrics.py +20 -8
- agno/os/routers/metrics/schemas.py +16 -16
- agno/os/routers/session/session.py +462 -34
- agno/os/routers/teams/__init__.py +3 -0
- agno/os/routers/teams/router.py +512 -0
- agno/os/routers/teams/schema.py +257 -0
- agno/os/routers/traces/__init__.py +3 -0
- agno/os/routers/traces/schemas.py +414 -0
- agno/os/routers/traces/traces.py +499 -0
- agno/os/routers/workflows/__init__.py +3 -0
- agno/os/routers/workflows/router.py +624 -0
- agno/os/routers/workflows/schema.py +75 -0
- agno/os/schema.py +256 -693
- agno/os/scopes.py +469 -0
- agno/os/utils.py +514 -36
- agno/reasoning/anthropic.py +80 -0
- agno/reasoning/gemini.py +73 -0
- agno/reasoning/openai.py +5 -0
- agno/reasoning/vertexai.py +76 -0
- agno/run/__init__.py +6 -0
- agno/run/agent.py +155 -32
- agno/run/base.py +55 -3
- agno/run/requirement.py +181 -0
- agno/run/team.py +125 -38
- agno/run/workflow.py +72 -18
- agno/session/agent.py +102 -89
- agno/session/summary.py +56 -15
- agno/session/team.py +164 -90
- agno/session/workflow.py +405 -40
- agno/table.py +10 -0
- agno/team/team.py +3974 -1903
- agno/tools/dalle.py +2 -4
- agno/tools/eleven_labs.py +23 -25
- agno/tools/exa.py +21 -16
- agno/tools/file.py +153 -23
- agno/tools/file_generation.py +16 -10
- agno/tools/firecrawl.py +15 -7
- agno/tools/function.py +193 -38
- agno/tools/gmail.py +238 -14
- agno/tools/google_drive.py +271 -0
- agno/tools/googlecalendar.py +36 -8
- agno/tools/googlesheets.py +20 -5
- agno/tools/jira.py +20 -0
- agno/tools/mcp/__init__.py +10 -0
- agno/tools/mcp/mcp.py +331 -0
- agno/tools/mcp/multi_mcp.py +347 -0
- agno/tools/mcp/params.py +24 -0
- agno/tools/mcp_toolbox.py +3 -3
- agno/tools/models/nebius.py +5 -5
- agno/tools/models_labs.py +20 -10
- agno/tools/nano_banana.py +151 -0
- agno/tools/notion.py +204 -0
- agno/tools/parallel.py +314 -0
- agno/tools/postgres.py +76 -36
- agno/tools/redshift.py +406 -0
- agno/tools/scrapegraph.py +1 -1
- agno/tools/shopify.py +1519 -0
- agno/tools/slack.py +18 -3
- agno/tools/spotify.py +919 -0
- agno/tools/tavily.py +146 -0
- agno/tools/toolkit.py +25 -0
- agno/tools/workflow.py +8 -1
- agno/tools/yfinance.py +12 -11
- agno/tracing/__init__.py +12 -0
- agno/tracing/exporter.py +157 -0
- agno/tracing/schemas.py +276 -0
- agno/tracing/setup.py +111 -0
- agno/utils/agent.py +938 -0
- agno/utils/cryptography.py +22 -0
- agno/utils/dttm.py +33 -0
- agno/utils/events.py +151 -3
- agno/utils/gemini.py +15 -5
- agno/utils/hooks.py +118 -4
- agno/utils/http.py +113 -2
- agno/utils/knowledge.py +12 -5
- agno/utils/log.py +1 -0
- agno/utils/mcp.py +92 -2
- agno/utils/media.py +187 -1
- agno/utils/merge_dict.py +3 -3
- agno/utils/message.py +60 -0
- agno/utils/models/ai_foundry.py +9 -2
- agno/utils/models/claude.py +49 -14
- agno/utils/models/cohere.py +9 -2
- agno/utils/models/llama.py +9 -2
- agno/utils/models/mistral.py +4 -2
- agno/utils/print_response/agent.py +109 -16
- agno/utils/print_response/team.py +223 -30
- agno/utils/print_response/workflow.py +251 -34
- agno/utils/streamlit.py +1 -1
- agno/utils/team.py +98 -9
- agno/utils/tokens.py +657 -0
- agno/vectordb/base.py +39 -7
- agno/vectordb/cassandra/cassandra.py +21 -5
- agno/vectordb/chroma/chromadb.py +43 -12
- agno/vectordb/clickhouse/clickhousedb.py +21 -5
- agno/vectordb/couchbase/couchbase.py +29 -5
- agno/vectordb/lancedb/lance_db.py +92 -181
- agno/vectordb/langchaindb/langchaindb.py +24 -4
- agno/vectordb/lightrag/lightrag.py +17 -3
- agno/vectordb/llamaindex/llamaindexdb.py +25 -5
- agno/vectordb/milvus/milvus.py +50 -37
- agno/vectordb/mongodb/__init__.py +7 -1
- agno/vectordb/mongodb/mongodb.py +36 -30
- agno/vectordb/pgvector/pgvector.py +201 -77
- agno/vectordb/pineconedb/pineconedb.py +41 -23
- agno/vectordb/qdrant/qdrant.py +67 -54
- agno/vectordb/redis/__init__.py +9 -0
- agno/vectordb/redis/redisdb.py +682 -0
- agno/vectordb/singlestore/singlestore.py +50 -29
- agno/vectordb/surrealdb/surrealdb.py +31 -41
- agno/vectordb/upstashdb/upstashdb.py +34 -6
- agno/vectordb/weaviate/weaviate.py +53 -14
- agno/workflow/__init__.py +2 -0
- agno/workflow/agent.py +299 -0
- agno/workflow/condition.py +120 -18
- agno/workflow/loop.py +77 -10
- agno/workflow/parallel.py +231 -143
- agno/workflow/router.py +118 -17
- agno/workflow/step.py +609 -170
- agno/workflow/steps.py +73 -6
- agno/workflow/types.py +96 -21
- agno/workflow/workflow.py +2039 -262
- {agno-2.1.2.dist-info → agno-2.3.13.dist-info}/METADATA +201 -66
- agno-2.3.13.dist-info/RECORD +613 -0
- agno/tools/googlesearch.py +0 -98
- agno/tools/mcp.py +0 -679
- agno/tools/memori.py +0 -339
- agno-2.1.2.dist-info/RECORD +0 -543
- {agno-2.1.2.dist-info → agno-2.3.13.dist-info}/WHEEL +0 -0
- {agno-2.1.2.dist-info → agno-2.3.13.dist-info}/licenses/LICENSE +0 -0
- {agno-2.1.2.dist-info → agno-2.3.13.dist-info}/top_level.txt +0 -0
agno/models/aws/bedrock.py
CHANGED
|
@@ -5,13 +5,14 @@ from typing import Any, AsyncIterator, Dict, Iterator, List, Optional, Tuple, Ty
|
|
|
5
5
|
|
|
6
6
|
from pydantic import BaseModel
|
|
7
7
|
|
|
8
|
-
from agno.exceptions import
|
|
8
|
+
from agno.exceptions import ModelProviderError
|
|
9
9
|
from agno.models.base import Model
|
|
10
10
|
from agno.models.message import Message
|
|
11
11
|
from agno.models.metrics import Metrics
|
|
12
12
|
from agno.models.response import ModelResponse
|
|
13
13
|
from agno.run.agent import RunOutput
|
|
14
14
|
from agno.utils.log import log_debug, log_error, log_warning
|
|
15
|
+
from agno.utils.tokens import count_schema_tokens
|
|
15
16
|
|
|
16
17
|
try:
|
|
17
18
|
from boto3 import client as AwsClient
|
|
@@ -102,9 +103,8 @@ class AwsBedrock(Model):
|
|
|
102
103
|
self.client = AwsClient(service_name="bedrock-runtime", region_name=self.aws_region)
|
|
103
104
|
else:
|
|
104
105
|
if not self.aws_access_key_id or not self.aws_secret_access_key:
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
status_code=400,
|
|
106
|
+
log_error(
|
|
107
|
+
"AWS credentials not found. Please set AWS_ACCESS_KEY_ID and AWS_SECRET_ACCESS_KEY environment variables or provide a boto3 session."
|
|
108
108
|
)
|
|
109
109
|
|
|
110
110
|
self.client = AwsClient(
|
|
@@ -219,21 +219,35 @@ class AwsBedrock(Model):
|
|
|
219
219
|
|
|
220
220
|
return {k: v for k, v in request_kwargs.items() if v is not None}
|
|
221
221
|
|
|
222
|
-
def _format_messages(
|
|
222
|
+
def _format_messages(
|
|
223
|
+
self, messages: List[Message], compress_tool_results: bool = False
|
|
224
|
+
) -> Tuple[List[Dict[str, Any]], Optional[List[Dict[str, Any]]]]:
|
|
223
225
|
"""
|
|
224
226
|
Format the messages for the request.
|
|
225
227
|
|
|
228
|
+
Args:
|
|
229
|
+
messages: List of messages to format
|
|
230
|
+
compress_tool_results: Whether to compress tool results
|
|
231
|
+
|
|
226
232
|
Returns:
|
|
227
233
|
Tuple[List[Dict[str, Any]], Optional[List[Dict[str, Any]]]]: The formatted messages.
|
|
228
234
|
"""
|
|
235
|
+
|
|
229
236
|
formatted_messages: List[Dict[str, Any]] = []
|
|
230
237
|
system_message = None
|
|
231
238
|
for message in messages:
|
|
232
239
|
if message.role == "system":
|
|
233
240
|
system_message = [{"text": message.content}]
|
|
241
|
+
elif message.role == "tool":
|
|
242
|
+
content = message.get_content(use_compressed_content=compress_tool_results)
|
|
243
|
+
tool_result = {
|
|
244
|
+
"toolUseId": message.tool_call_id,
|
|
245
|
+
"content": [{"json": {"result": content}}],
|
|
246
|
+
}
|
|
247
|
+
formatted_message: Dict[str, Any] = {"role": "user", "content": [{"toolResult": tool_result}]}
|
|
248
|
+
formatted_messages.append(formatted_message)
|
|
234
249
|
else:
|
|
235
|
-
formatted_message
|
|
236
|
-
# Handle tool results
|
|
250
|
+
formatted_message = {"role": message.role, "content": []}
|
|
237
251
|
if isinstance(message.content, list):
|
|
238
252
|
formatted_message["content"].extend(message.content)
|
|
239
253
|
elif message.tool_calls:
|
|
@@ -344,6 +358,65 @@ class AwsBedrock(Model):
|
|
|
344
358
|
# TODO: Add caching: https://docs.aws.amazon.com/bedrock/latest/userguide/conversation-inference-call.html
|
|
345
359
|
return formatted_messages, system_message
|
|
346
360
|
|
|
361
|
+
def count_tokens(
|
|
362
|
+
self,
|
|
363
|
+
messages: List[Message],
|
|
364
|
+
tools: Optional[List[Dict[str, Any]]] = None,
|
|
365
|
+
output_schema: Optional[Union[Dict, Type[BaseModel]]] = None,
|
|
366
|
+
) -> int:
|
|
367
|
+
try:
|
|
368
|
+
formatted_messages, system_message = self._format_messages(messages, compress_tool_results=True)
|
|
369
|
+
converse_input: Dict[str, Any] = {"messages": formatted_messages}
|
|
370
|
+
if system_message:
|
|
371
|
+
converse_input["system"] = system_message
|
|
372
|
+
|
|
373
|
+
response = self.get_client().count_tokens(modelId=self.id, input={"converse": converse_input})
|
|
374
|
+
tokens = response.get("inputTokens", 0)
|
|
375
|
+
|
|
376
|
+
# Count tool tokens
|
|
377
|
+
if tools:
|
|
378
|
+
from agno.utils.tokens import count_tool_tokens
|
|
379
|
+
|
|
380
|
+
tokens += count_tool_tokens(tools, self.id)
|
|
381
|
+
|
|
382
|
+
# Count schema tokens
|
|
383
|
+
tokens += count_schema_tokens(output_schema, self.id)
|
|
384
|
+
|
|
385
|
+
return tokens
|
|
386
|
+
except Exception as e:
|
|
387
|
+
log_warning(f"Failed to count tokens via Bedrock API: {e}")
|
|
388
|
+
return super().count_tokens(messages, tools, output_schema)
|
|
389
|
+
|
|
390
|
+
async def acount_tokens(
|
|
391
|
+
self,
|
|
392
|
+
messages: List[Message],
|
|
393
|
+
tools: Optional[List[Dict[str, Any]]] = None,
|
|
394
|
+
output_schema: Optional[Union[Dict, Type[BaseModel]]] = None,
|
|
395
|
+
) -> int:
|
|
396
|
+
try:
|
|
397
|
+
formatted_messages, system_message = self._format_messages(messages, compress_tool_results=True)
|
|
398
|
+
converse_input: Dict[str, Any] = {"messages": formatted_messages}
|
|
399
|
+
if system_message:
|
|
400
|
+
converse_input["system"] = system_message
|
|
401
|
+
|
|
402
|
+
async with self.get_async_client() as client:
|
|
403
|
+
response = await client.count_tokens(modelId=self.id, input={"converse": converse_input})
|
|
404
|
+
tokens = response.get("inputTokens", 0)
|
|
405
|
+
|
|
406
|
+
# Count tool tokens
|
|
407
|
+
if tools:
|
|
408
|
+
from agno.utils.tokens import count_tool_tokens
|
|
409
|
+
|
|
410
|
+
tokens += count_tool_tokens(tools, self.id)
|
|
411
|
+
|
|
412
|
+
# Count schema tokens
|
|
413
|
+
tokens += count_schema_tokens(output_schema, self.id)
|
|
414
|
+
|
|
415
|
+
return tokens
|
|
416
|
+
except Exception as e:
|
|
417
|
+
log_warning(f"Failed to count tokens via Bedrock API: {e}")
|
|
418
|
+
return await super().acount_tokens(messages, tools, output_schema)
|
|
419
|
+
|
|
347
420
|
def invoke(
|
|
348
421
|
self,
|
|
349
422
|
messages: List[Message],
|
|
@@ -352,15 +425,16 @@ class AwsBedrock(Model):
|
|
|
352
425
|
tools: Optional[List[Dict[str, Any]]] = None,
|
|
353
426
|
tool_choice: Optional[Union[str, Dict[str, Any]]] = None,
|
|
354
427
|
run_response: Optional[RunOutput] = None,
|
|
428
|
+
compress_tool_results: bool = False,
|
|
355
429
|
) -> ModelResponse:
|
|
356
430
|
"""
|
|
357
431
|
Invoke the Bedrock API.
|
|
358
432
|
"""
|
|
359
433
|
try:
|
|
360
|
-
formatted_messages, system_message = self._format_messages(messages)
|
|
434
|
+
formatted_messages, system_message = self._format_messages(messages, compress_tool_results)
|
|
361
435
|
|
|
362
436
|
tool_config = None
|
|
363
|
-
if tools:
|
|
437
|
+
if tools:
|
|
364
438
|
tool_config = {"tools": self._format_tools_for_request(tools)}
|
|
365
439
|
|
|
366
440
|
body = {
|
|
@@ -400,12 +474,13 @@ class AwsBedrock(Model):
|
|
|
400
474
|
tools: Optional[List[Dict[str, Any]]] = None,
|
|
401
475
|
tool_choice: Optional[Union[str, Dict[str, Any]]] = None,
|
|
402
476
|
run_response: Optional[RunOutput] = None,
|
|
477
|
+
compress_tool_results: bool = False,
|
|
403
478
|
) -> Iterator[ModelResponse]:
|
|
404
479
|
"""
|
|
405
480
|
Invoke the Bedrock API with streaming.
|
|
406
481
|
"""
|
|
407
482
|
try:
|
|
408
|
-
formatted_messages, system_message = self._format_messages(messages)
|
|
483
|
+
formatted_messages, system_message = self._format_messages(messages, compress_tool_results)
|
|
409
484
|
|
|
410
485
|
tool_config = None
|
|
411
486
|
if tools:
|
|
@@ -452,12 +527,13 @@ class AwsBedrock(Model):
|
|
|
452
527
|
tools: Optional[List[Dict[str, Any]]] = None,
|
|
453
528
|
tool_choice: Optional[Union[str, Dict[str, Any]]] = None,
|
|
454
529
|
run_response: Optional[RunOutput] = None,
|
|
530
|
+
compress_tool_results: bool = False,
|
|
455
531
|
) -> ModelResponse:
|
|
456
532
|
"""
|
|
457
533
|
Async invoke the Bedrock API.
|
|
458
534
|
"""
|
|
459
535
|
try:
|
|
460
|
-
formatted_messages, system_message = self._format_messages(messages)
|
|
536
|
+
formatted_messages, system_message = self._format_messages(messages, compress_tool_results)
|
|
461
537
|
|
|
462
538
|
tool_config = None
|
|
463
539
|
if tools:
|
|
@@ -503,12 +579,13 @@ class AwsBedrock(Model):
|
|
|
503
579
|
tools: Optional[List[Dict[str, Any]]] = None,
|
|
504
580
|
tool_choice: Optional[Union[str, Dict[str, Any]]] = None,
|
|
505
581
|
run_response: Optional[RunOutput] = None,
|
|
582
|
+
compress_tool_results: bool = False,
|
|
506
583
|
) -> AsyncIterator[ModelResponse]:
|
|
507
584
|
"""
|
|
508
585
|
Async invoke the Bedrock API with streaming.
|
|
509
586
|
"""
|
|
510
587
|
try:
|
|
511
|
-
formatted_messages, system_message = self._format_messages(messages)
|
|
588
|
+
formatted_messages, system_message = self._format_messages(messages, compress_tool_results)
|
|
512
589
|
|
|
513
590
|
tool_config = None
|
|
514
591
|
if tools:
|
|
@@ -549,30 +626,34 @@ class AwsBedrock(Model):
|
|
|
549
626
|
|
|
550
627
|
# Overwrite the default from the base model
|
|
551
628
|
def format_function_call_results(
|
|
552
|
-
self,
|
|
629
|
+
self,
|
|
630
|
+
messages: List[Message],
|
|
631
|
+
function_call_results: List[Message],
|
|
632
|
+
compress_tool_results: bool = False,
|
|
633
|
+
**kwargs,
|
|
553
634
|
) -> None:
|
|
554
635
|
"""
|
|
555
|
-
Handle the results of function calls.
|
|
636
|
+
Handle the results of function calls for Bedrock.
|
|
637
|
+
Uses compressed_content if compress_tool_results is True.
|
|
556
638
|
|
|
557
639
|
Args:
|
|
558
640
|
messages (List[Message]): The list of conversation messages.
|
|
559
641
|
function_call_results (List[Message]): The results of the function calls.
|
|
642
|
+
compress_tool_results: Whether to compress tool results.
|
|
560
643
|
**kwargs: Additional arguments including tool_ids.
|
|
561
644
|
"""
|
|
645
|
+
|
|
562
646
|
if function_call_results:
|
|
563
647
|
tool_ids = kwargs.get("tool_ids", [])
|
|
564
|
-
tool_result_content: List = []
|
|
565
648
|
|
|
566
649
|
for _fc_message_index, _fc_message in enumerate(function_call_results):
|
|
567
650
|
# Use tool_call_id from message if tool_ids list is insufficient
|
|
568
651
|
tool_id = tool_ids[_fc_message_index] if _fc_message_index < len(tool_ids) else _fc_message.tool_call_id
|
|
569
|
-
|
|
570
|
-
|
|
571
|
-
"content": [{"json": {"result": _fc_message.content}}],
|
|
572
|
-
}
|
|
573
|
-
tool_result_content.append({"toolResult": tool_result})
|
|
652
|
+
if not _fc_message.tool_call_id:
|
|
653
|
+
_fc_message.tool_call_id = tool_id
|
|
574
654
|
|
|
575
|
-
|
|
655
|
+
# Append as standard role="tool" message
|
|
656
|
+
messages.append(_fc_message)
|
|
576
657
|
|
|
577
658
|
def _parse_provider_response(self, response: Dict[str, Any], **kwargs) -> ModelResponse:
|
|
578
659
|
"""
|