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.
Files changed (314) hide show
  1. agno/agent/agent.py +5540 -2273
  2. agno/api/api.py +2 -0
  3. agno/api/os.py +1 -1
  4. agno/compression/__init__.py +3 -0
  5. agno/compression/manager.py +247 -0
  6. agno/culture/__init__.py +3 -0
  7. agno/culture/manager.py +956 -0
  8. agno/db/async_postgres/__init__.py +3 -0
  9. agno/db/base.py +689 -6
  10. agno/db/dynamo/dynamo.py +933 -37
  11. agno/db/dynamo/schemas.py +174 -10
  12. agno/db/dynamo/utils.py +63 -4
  13. agno/db/firestore/firestore.py +831 -9
  14. agno/db/firestore/schemas.py +51 -0
  15. agno/db/firestore/utils.py +102 -4
  16. agno/db/gcs_json/gcs_json_db.py +660 -12
  17. agno/db/gcs_json/utils.py +60 -26
  18. agno/db/in_memory/in_memory_db.py +287 -14
  19. agno/db/in_memory/utils.py +60 -2
  20. agno/db/json/json_db.py +590 -14
  21. agno/db/json/utils.py +60 -26
  22. agno/db/migrations/manager.py +199 -0
  23. agno/db/migrations/v1_to_v2.py +43 -13
  24. agno/db/migrations/versions/__init__.py +0 -0
  25. agno/db/migrations/versions/v2_3_0.py +938 -0
  26. agno/db/mongo/__init__.py +15 -1
  27. agno/db/mongo/async_mongo.py +2760 -0
  28. agno/db/mongo/mongo.py +879 -11
  29. agno/db/mongo/schemas.py +42 -0
  30. agno/db/mongo/utils.py +80 -8
  31. agno/db/mysql/__init__.py +2 -1
  32. agno/db/mysql/async_mysql.py +2912 -0
  33. agno/db/mysql/mysql.py +946 -68
  34. agno/db/mysql/schemas.py +72 -10
  35. agno/db/mysql/utils.py +198 -7
  36. agno/db/postgres/__init__.py +2 -1
  37. agno/db/postgres/async_postgres.py +2579 -0
  38. agno/db/postgres/postgres.py +942 -57
  39. agno/db/postgres/schemas.py +81 -18
  40. agno/db/postgres/utils.py +164 -2
  41. agno/db/redis/redis.py +671 -7
  42. agno/db/redis/schemas.py +50 -0
  43. agno/db/redis/utils.py +65 -7
  44. agno/db/schemas/__init__.py +2 -1
  45. agno/db/schemas/culture.py +120 -0
  46. agno/db/schemas/evals.py +1 -0
  47. agno/db/schemas/memory.py +17 -2
  48. agno/db/singlestore/schemas.py +63 -0
  49. agno/db/singlestore/singlestore.py +949 -83
  50. agno/db/singlestore/utils.py +60 -2
  51. agno/db/sqlite/__init__.py +2 -1
  52. agno/db/sqlite/async_sqlite.py +2911 -0
  53. agno/db/sqlite/schemas.py +62 -0
  54. agno/db/sqlite/sqlite.py +965 -46
  55. agno/db/sqlite/utils.py +169 -8
  56. agno/db/surrealdb/__init__.py +3 -0
  57. agno/db/surrealdb/metrics.py +292 -0
  58. agno/db/surrealdb/models.py +334 -0
  59. agno/db/surrealdb/queries.py +71 -0
  60. agno/db/surrealdb/surrealdb.py +1908 -0
  61. agno/db/surrealdb/utils.py +147 -0
  62. agno/db/utils.py +2 -0
  63. agno/eval/__init__.py +10 -0
  64. agno/eval/accuracy.py +75 -55
  65. agno/eval/agent_as_judge.py +861 -0
  66. agno/eval/base.py +29 -0
  67. agno/eval/performance.py +16 -7
  68. agno/eval/reliability.py +28 -16
  69. agno/eval/utils.py +35 -17
  70. agno/exceptions.py +27 -2
  71. agno/filters.py +354 -0
  72. agno/guardrails/prompt_injection.py +1 -0
  73. agno/hooks/__init__.py +3 -0
  74. agno/hooks/decorator.py +164 -0
  75. agno/integrations/discord/client.py +1 -1
  76. agno/knowledge/chunking/agentic.py +13 -10
  77. agno/knowledge/chunking/fixed.py +4 -1
  78. agno/knowledge/chunking/semantic.py +9 -4
  79. agno/knowledge/chunking/strategy.py +59 -15
  80. agno/knowledge/embedder/fastembed.py +1 -1
  81. agno/knowledge/embedder/nebius.py +1 -1
  82. agno/knowledge/embedder/ollama.py +8 -0
  83. agno/knowledge/embedder/openai.py +8 -8
  84. agno/knowledge/embedder/sentence_transformer.py +6 -2
  85. agno/knowledge/embedder/vllm.py +262 -0
  86. agno/knowledge/knowledge.py +1618 -318
  87. agno/knowledge/reader/base.py +6 -2
  88. agno/knowledge/reader/csv_reader.py +8 -10
  89. agno/knowledge/reader/docx_reader.py +5 -6
  90. agno/knowledge/reader/field_labeled_csv_reader.py +16 -20
  91. agno/knowledge/reader/json_reader.py +5 -4
  92. agno/knowledge/reader/markdown_reader.py +8 -8
  93. agno/knowledge/reader/pdf_reader.py +17 -19
  94. agno/knowledge/reader/pptx_reader.py +101 -0
  95. agno/knowledge/reader/reader_factory.py +32 -3
  96. agno/knowledge/reader/s3_reader.py +3 -3
  97. agno/knowledge/reader/tavily_reader.py +193 -0
  98. agno/knowledge/reader/text_reader.py +22 -10
  99. agno/knowledge/reader/web_search_reader.py +1 -48
  100. agno/knowledge/reader/website_reader.py +10 -10
  101. agno/knowledge/reader/wikipedia_reader.py +33 -1
  102. agno/knowledge/types.py +1 -0
  103. agno/knowledge/utils.py +72 -7
  104. agno/media.py +22 -6
  105. agno/memory/__init__.py +14 -1
  106. agno/memory/manager.py +544 -83
  107. agno/memory/strategies/__init__.py +15 -0
  108. agno/memory/strategies/base.py +66 -0
  109. agno/memory/strategies/summarize.py +196 -0
  110. agno/memory/strategies/types.py +37 -0
  111. agno/models/aimlapi/aimlapi.py +17 -0
  112. agno/models/anthropic/claude.py +515 -40
  113. agno/models/aws/bedrock.py +102 -21
  114. agno/models/aws/claude.py +131 -274
  115. agno/models/azure/ai_foundry.py +41 -19
  116. agno/models/azure/openai_chat.py +39 -8
  117. agno/models/base.py +1249 -525
  118. agno/models/cerebras/cerebras.py +91 -21
  119. agno/models/cerebras/cerebras_openai.py +21 -2
  120. agno/models/cohere/chat.py +40 -6
  121. agno/models/cometapi/cometapi.py +18 -1
  122. agno/models/dashscope/dashscope.py +2 -3
  123. agno/models/deepinfra/deepinfra.py +18 -1
  124. agno/models/deepseek/deepseek.py +69 -3
  125. agno/models/fireworks/fireworks.py +18 -1
  126. agno/models/google/gemini.py +877 -80
  127. agno/models/google/utils.py +22 -0
  128. agno/models/groq/groq.py +51 -18
  129. agno/models/huggingface/huggingface.py +17 -6
  130. agno/models/ibm/watsonx.py +16 -6
  131. agno/models/internlm/internlm.py +18 -1
  132. agno/models/langdb/langdb.py +13 -1
  133. agno/models/litellm/chat.py +44 -9
  134. agno/models/litellm/litellm_openai.py +18 -1
  135. agno/models/message.py +28 -5
  136. agno/models/meta/llama.py +47 -14
  137. agno/models/meta/llama_openai.py +22 -17
  138. agno/models/mistral/mistral.py +8 -4
  139. agno/models/nebius/nebius.py +6 -7
  140. agno/models/nvidia/nvidia.py +20 -3
  141. agno/models/ollama/chat.py +24 -8
  142. agno/models/openai/chat.py +104 -29
  143. agno/models/openai/responses.py +101 -81
  144. agno/models/openrouter/openrouter.py +60 -3
  145. agno/models/perplexity/perplexity.py +17 -1
  146. agno/models/portkey/portkey.py +7 -6
  147. agno/models/requesty/requesty.py +24 -4
  148. agno/models/response.py +73 -2
  149. agno/models/sambanova/sambanova.py +20 -3
  150. agno/models/siliconflow/siliconflow.py +19 -2
  151. agno/models/together/together.py +20 -3
  152. agno/models/utils.py +254 -8
  153. agno/models/vercel/v0.py +20 -3
  154. agno/models/vertexai/__init__.py +0 -0
  155. agno/models/vertexai/claude.py +190 -0
  156. agno/models/vllm/vllm.py +19 -14
  157. agno/models/xai/xai.py +19 -2
  158. agno/os/app.py +549 -152
  159. agno/os/auth.py +190 -3
  160. agno/os/config.py +23 -0
  161. agno/os/interfaces/a2a/router.py +8 -11
  162. agno/os/interfaces/a2a/utils.py +1 -1
  163. agno/os/interfaces/agui/router.py +18 -3
  164. agno/os/interfaces/agui/utils.py +152 -39
  165. agno/os/interfaces/slack/router.py +55 -37
  166. agno/os/interfaces/slack/slack.py +9 -1
  167. agno/os/interfaces/whatsapp/router.py +0 -1
  168. agno/os/interfaces/whatsapp/security.py +3 -1
  169. agno/os/mcp.py +110 -52
  170. agno/os/middleware/__init__.py +2 -0
  171. agno/os/middleware/jwt.py +676 -112
  172. agno/os/router.py +40 -1478
  173. agno/os/routers/agents/__init__.py +3 -0
  174. agno/os/routers/agents/router.py +599 -0
  175. agno/os/routers/agents/schema.py +261 -0
  176. agno/os/routers/evals/evals.py +96 -39
  177. agno/os/routers/evals/schemas.py +65 -33
  178. agno/os/routers/evals/utils.py +80 -10
  179. agno/os/routers/health.py +10 -4
  180. agno/os/routers/knowledge/knowledge.py +196 -38
  181. agno/os/routers/knowledge/schemas.py +82 -22
  182. agno/os/routers/memory/memory.py +279 -52
  183. agno/os/routers/memory/schemas.py +46 -17
  184. agno/os/routers/metrics/metrics.py +20 -8
  185. agno/os/routers/metrics/schemas.py +16 -16
  186. agno/os/routers/session/session.py +462 -34
  187. agno/os/routers/teams/__init__.py +3 -0
  188. agno/os/routers/teams/router.py +512 -0
  189. agno/os/routers/teams/schema.py +257 -0
  190. agno/os/routers/traces/__init__.py +3 -0
  191. agno/os/routers/traces/schemas.py +414 -0
  192. agno/os/routers/traces/traces.py +499 -0
  193. agno/os/routers/workflows/__init__.py +3 -0
  194. agno/os/routers/workflows/router.py +624 -0
  195. agno/os/routers/workflows/schema.py +75 -0
  196. agno/os/schema.py +256 -693
  197. agno/os/scopes.py +469 -0
  198. agno/os/utils.py +514 -36
  199. agno/reasoning/anthropic.py +80 -0
  200. agno/reasoning/gemini.py +73 -0
  201. agno/reasoning/openai.py +5 -0
  202. agno/reasoning/vertexai.py +76 -0
  203. agno/run/__init__.py +6 -0
  204. agno/run/agent.py +155 -32
  205. agno/run/base.py +55 -3
  206. agno/run/requirement.py +181 -0
  207. agno/run/team.py +125 -38
  208. agno/run/workflow.py +72 -18
  209. agno/session/agent.py +102 -89
  210. agno/session/summary.py +56 -15
  211. agno/session/team.py +164 -90
  212. agno/session/workflow.py +405 -40
  213. agno/table.py +10 -0
  214. agno/team/team.py +3974 -1903
  215. agno/tools/dalle.py +2 -4
  216. agno/tools/eleven_labs.py +23 -25
  217. agno/tools/exa.py +21 -16
  218. agno/tools/file.py +153 -23
  219. agno/tools/file_generation.py +16 -10
  220. agno/tools/firecrawl.py +15 -7
  221. agno/tools/function.py +193 -38
  222. agno/tools/gmail.py +238 -14
  223. agno/tools/google_drive.py +271 -0
  224. agno/tools/googlecalendar.py +36 -8
  225. agno/tools/googlesheets.py +20 -5
  226. agno/tools/jira.py +20 -0
  227. agno/tools/mcp/__init__.py +10 -0
  228. agno/tools/mcp/mcp.py +331 -0
  229. agno/tools/mcp/multi_mcp.py +347 -0
  230. agno/tools/mcp/params.py +24 -0
  231. agno/tools/mcp_toolbox.py +3 -3
  232. agno/tools/models/nebius.py +5 -5
  233. agno/tools/models_labs.py +20 -10
  234. agno/tools/nano_banana.py +151 -0
  235. agno/tools/notion.py +204 -0
  236. agno/tools/parallel.py +314 -0
  237. agno/tools/postgres.py +76 -36
  238. agno/tools/redshift.py +406 -0
  239. agno/tools/scrapegraph.py +1 -1
  240. agno/tools/shopify.py +1519 -0
  241. agno/tools/slack.py +18 -3
  242. agno/tools/spotify.py +919 -0
  243. agno/tools/tavily.py +146 -0
  244. agno/tools/toolkit.py +25 -0
  245. agno/tools/workflow.py +8 -1
  246. agno/tools/yfinance.py +12 -11
  247. agno/tracing/__init__.py +12 -0
  248. agno/tracing/exporter.py +157 -0
  249. agno/tracing/schemas.py +276 -0
  250. agno/tracing/setup.py +111 -0
  251. agno/utils/agent.py +938 -0
  252. agno/utils/cryptography.py +22 -0
  253. agno/utils/dttm.py +33 -0
  254. agno/utils/events.py +151 -3
  255. agno/utils/gemini.py +15 -5
  256. agno/utils/hooks.py +118 -4
  257. agno/utils/http.py +113 -2
  258. agno/utils/knowledge.py +12 -5
  259. agno/utils/log.py +1 -0
  260. agno/utils/mcp.py +92 -2
  261. agno/utils/media.py +187 -1
  262. agno/utils/merge_dict.py +3 -3
  263. agno/utils/message.py +60 -0
  264. agno/utils/models/ai_foundry.py +9 -2
  265. agno/utils/models/claude.py +49 -14
  266. agno/utils/models/cohere.py +9 -2
  267. agno/utils/models/llama.py +9 -2
  268. agno/utils/models/mistral.py +4 -2
  269. agno/utils/print_response/agent.py +109 -16
  270. agno/utils/print_response/team.py +223 -30
  271. agno/utils/print_response/workflow.py +251 -34
  272. agno/utils/streamlit.py +1 -1
  273. agno/utils/team.py +98 -9
  274. agno/utils/tokens.py +657 -0
  275. agno/vectordb/base.py +39 -7
  276. agno/vectordb/cassandra/cassandra.py +21 -5
  277. agno/vectordb/chroma/chromadb.py +43 -12
  278. agno/vectordb/clickhouse/clickhousedb.py +21 -5
  279. agno/vectordb/couchbase/couchbase.py +29 -5
  280. agno/vectordb/lancedb/lance_db.py +92 -181
  281. agno/vectordb/langchaindb/langchaindb.py +24 -4
  282. agno/vectordb/lightrag/lightrag.py +17 -3
  283. agno/vectordb/llamaindex/llamaindexdb.py +25 -5
  284. agno/vectordb/milvus/milvus.py +50 -37
  285. agno/vectordb/mongodb/__init__.py +7 -1
  286. agno/vectordb/mongodb/mongodb.py +36 -30
  287. agno/vectordb/pgvector/pgvector.py +201 -77
  288. agno/vectordb/pineconedb/pineconedb.py +41 -23
  289. agno/vectordb/qdrant/qdrant.py +67 -54
  290. agno/vectordb/redis/__init__.py +9 -0
  291. agno/vectordb/redis/redisdb.py +682 -0
  292. agno/vectordb/singlestore/singlestore.py +50 -29
  293. agno/vectordb/surrealdb/surrealdb.py +31 -41
  294. agno/vectordb/upstashdb/upstashdb.py +34 -6
  295. agno/vectordb/weaviate/weaviate.py +53 -14
  296. agno/workflow/__init__.py +2 -0
  297. agno/workflow/agent.py +299 -0
  298. agno/workflow/condition.py +120 -18
  299. agno/workflow/loop.py +77 -10
  300. agno/workflow/parallel.py +231 -143
  301. agno/workflow/router.py +118 -17
  302. agno/workflow/step.py +609 -170
  303. agno/workflow/steps.py +73 -6
  304. agno/workflow/types.py +96 -21
  305. agno/workflow/workflow.py +2039 -262
  306. {agno-2.1.2.dist-info → agno-2.3.13.dist-info}/METADATA +201 -66
  307. agno-2.3.13.dist-info/RECORD +613 -0
  308. agno/tools/googlesearch.py +0 -98
  309. agno/tools/mcp.py +0 -679
  310. agno/tools/memori.py +0 -339
  311. agno-2.1.2.dist-info/RECORD +0 -543
  312. {agno-2.1.2.dist-info → agno-2.3.13.dist-info}/WHEEL +0 -0
  313. {agno-2.1.2.dist-info → agno-2.3.13.dist-info}/licenses/LICENSE +0 -0
  314. {agno-2.1.2.dist-info → agno-2.3.13.dist-info}/top_level.txt +0 -0
@@ -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 AgnoError, ModelProviderError
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
- raise AgnoError(
106
- message="AWS credentials not found. Please set AWS_ACCESS_KEY_ID and AWS_SECRET_ACCESS_KEY environment variables or provide a boto3 session.",
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(self, messages: List[Message]) -> Tuple[List[Dict[str, Any]], Optional[List[Dict[str, Any]]]]:
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: Dict[str, Any] = {"role": message.role, "content": []}
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, messages: List[Message], function_call_results: List[Message], **kwargs
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
- tool_result = {
570
- "toolUseId": tool_id,
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
- messages.append(Message(role="user", content=tool_result_content))
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
  """