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
@@ -19,13 +19,17 @@ TOOL_CALL_ROLE_MAP = {
19
19
  }
20
20
 
21
21
 
22
- def format_message(message: Message, openai_like: bool = False, tool_calls: bool = False) -> Dict[str, Any]:
22
+ def format_message(
23
+ message: Message, openai_like: bool = False, tool_calls: bool = False, compress_tool_results: bool = False
24
+ ) -> Dict[str, Any]:
23
25
  """
24
26
  Format a message into the format expected by Llama API.
25
27
 
26
28
  Args:
27
29
  message (Message): The message to format.
28
30
  openai_like (bool): Whether to format the message as an OpenAI-like message.
31
+ tool_calls (bool): Whether tool calls are present.
32
+ compress_tool_results: Whether to compress tool results.
29
33
 
30
34
  Returns:
31
35
  Dict[str, Any]: The formatted message.
@@ -52,10 +56,13 @@ def format_message(message: Message, openai_like: bool = False, tool_calls: bool
52
56
  log_warning("Audio input is currently unsupported.")
53
57
 
54
58
  if message.role == "tool":
59
+ # Use compressed content if compression is active
60
+ content = message.get_content(use_compressed_content=compress_tool_results)
61
+
55
62
  message_dict = {
56
63
  "role": "tool",
57
64
  "tool_call_id": message.tool_call_id,
58
- "content": message.content,
65
+ "content": content,
59
66
  }
60
67
 
61
68
  if message.role == "assistant":
@@ -48,7 +48,7 @@ def _format_image_for_message(image: Image) -> Optional[ImageURLChunk]:
48
48
  return None
49
49
 
50
50
 
51
- def format_messages(messages: List[Message]) -> List[MistralMessage]:
51
+ def format_messages(messages: List[Message], compress_tool_results: bool = False) -> List[MistralMessage]:
52
52
  mistral_messages: List[MistralMessage] = []
53
53
 
54
54
  for message in messages:
@@ -84,7 +84,9 @@ def format_messages(messages: List[Message]) -> List[MistralMessage]:
84
84
  elif message.role == "system":
85
85
  mistral_message = SystemMessage(role="system", content=message.content)
86
86
  elif message.role == "tool":
87
- mistral_message = ToolMessage(name="tool", content=message.content, tool_call_id=message.tool_call_id)
87
+ # Get compressed content if compression is active
88
+ tool_content = message.get_content(use_compressed_content=compress_tool_results)
89
+ mistral_message = ToolMessage(name="tool", content=tool_content, tool_call_id=message.tool_call_id)
88
90
  else:
89
91
  raise ValueError(f"Unknown role: {message.role}")
90
92
 
@@ -1,4 +1,5 @@
1
1
  import json
2
+ import warnings
2
3
  from collections.abc import Set
3
4
  from typing import TYPE_CHECKING, Any, Dict, List, Optional, Sequence, Union, cast, get_args
4
5
 
@@ -10,6 +11,7 @@ from rich.markdown import Markdown
10
11
  from rich.status import Status
11
12
  from rich.text import Text
12
13
 
14
+ from agno.filters import FilterExpr
13
15
  from agno.media import Audio, File, Image, Video
14
16
  from agno.models.message import Message
15
17
  from agno.reasoning.step import ReasoningStep
@@ -29,12 +31,12 @@ def print_response_stream(
29
31
  session_id: Optional[str] = None,
30
32
  session_state: Optional[Dict[str, Any]] = None,
31
33
  user_id: Optional[str] = None,
34
+ run_id: Optional[str] = None,
32
35
  audio: Optional[Sequence[Audio]] = None,
33
36
  images: Optional[Sequence[Image]] = None,
34
37
  videos: Optional[Sequence[Video]] = None,
35
38
  files: Optional[Sequence[File]] = None,
36
- stream_intermediate_steps: bool = False,
37
- knowledge_filters: Optional[Dict[str, Any]] = None,
39
+ knowledge_filters: Optional[Union[Dict[str, Any], List[FilterExpr]]] = None,
38
40
  debug_mode: Optional[bool] = None,
39
41
  markdown: bool = False,
40
42
  show_message: bool = True,
@@ -85,12 +87,12 @@ def print_response_stream(
85
87
  session_id=session_id,
86
88
  session_state=session_state,
87
89
  user_id=user_id,
90
+ run_id=run_id,
88
91
  audio=audio,
89
92
  images=images,
90
93
  videos=videos,
91
94
  files=files,
92
95
  stream=True,
93
- stream_intermediate_steps=stream_intermediate_steps,
94
96
  knowledge_filters=knowledge_filters,
95
97
  debug_mode=debug_mode,
96
98
  add_history_to_context=add_history_to_context,
@@ -179,6 +181,7 @@ def print_response_stream(
179
181
  show_reasoning=show_reasoning,
180
182
  show_full_reasoning=show_full_reasoning,
181
183
  accumulated_tool_calls=accumulated_tool_calls,
184
+ compression_manager=agent.compression_manager,
182
185
  )
183
186
  panels.extend(additional_panels)
184
187
  if panels:
@@ -204,6 +207,10 @@ def print_response_stream(
204
207
  live_log.update(Group(*panels))
205
208
  agent.session_summary_manager.summaries_updated = False
206
209
 
210
+ # Clear compression stats after final display
211
+ if agent.compression_manager is not None:
212
+ agent.compression_manager.stats.clear()
213
+
207
214
  response_timer.stop()
208
215
 
209
216
  # Final update to remove the "Thinking..." status
@@ -217,12 +224,12 @@ async def aprint_response_stream(
217
224
  session_id: Optional[str] = None,
218
225
  session_state: Optional[Dict[str, Any]] = None,
219
226
  user_id: Optional[str] = None,
227
+ run_id: Optional[str] = None,
220
228
  audio: Optional[Sequence[Audio]] = None,
221
229
  images: Optional[Sequence[Image]] = None,
222
230
  videos: Optional[Sequence[Video]] = None,
223
231
  files: Optional[Sequence[File]] = None,
224
- stream_intermediate_steps: bool = False,
225
- knowledge_filters: Optional[Dict[str, Any]] = None,
232
+ knowledge_filters: Optional[Union[Dict[str, Any], List[FilterExpr]]] = None,
226
233
  debug_mode: Optional[bool] = None,
227
234
  markdown: bool = False,
228
235
  show_message: bool = True,
@@ -271,12 +278,12 @@ async def aprint_response_stream(
271
278
  session_id=session_id,
272
279
  session_state=session_state,
273
280
  user_id=user_id,
281
+ run_id=run_id,
274
282
  audio=audio,
275
283
  images=images,
276
284
  videos=videos,
277
285
  files=files,
278
286
  stream=True,
279
- stream_intermediate_steps=stream_intermediate_steps,
280
287
  knowledge_filters=knowledge_filters,
281
288
  debug_mode=debug_mode,
282
289
  add_history_to_context=add_history_to_context,
@@ -368,6 +375,7 @@ async def aprint_response_stream(
368
375
  show_reasoning=show_reasoning,
369
376
  show_full_reasoning=show_full_reasoning,
370
377
  accumulated_tool_calls=accumulated_tool_calls,
378
+ compression_manager=agent.compression_manager,
371
379
  )
372
380
  panels.extend(additional_panels)
373
381
  if panels:
@@ -393,6 +401,10 @@ async def aprint_response_stream(
393
401
  live_log.update(Group(*panels))
394
402
  agent.session_summary_manager.summaries_updated = False
395
403
 
404
+ # Clear compression stats after final display
405
+ if agent.compression_manager is not None:
406
+ agent.compression_manager.stats.clear()
407
+
396
408
  response_timer.stop()
397
409
 
398
410
  # Final update to remove the "Thinking..." status
@@ -409,6 +421,7 @@ def build_panels_stream(
409
421
  show_reasoning: bool = True,
410
422
  show_full_reasoning: bool = False,
411
423
  accumulated_tool_calls: Optional[List] = None,
424
+ compression_manager: Optional[Any] = None,
412
425
  ):
413
426
  panels = []
414
427
 
@@ -449,8 +462,18 @@ def build_panels_stream(
449
462
  for formatted_tool_call in formatted_tool_calls:
450
463
  tool_calls_content.append(f"• {formatted_tool_call}\n")
451
464
 
465
+ tool_calls_text = tool_calls_content.plain.rstrip()
466
+
467
+ # Add compression stats if available (don't clear - caller will clear after final display)
468
+ if compression_manager is not None and compression_manager.stats:
469
+ stats = compression_manager.stats
470
+ saved = stats.get("original_size", 0) - stats.get("compressed_size", 0)
471
+ orig = stats.get("original_size", 1)
472
+ if stats.get("tool_results_compressed", 0) > 0:
473
+ tool_calls_text += f"\n\ncompressed: {stats.get('tool_results_compressed', 0)} | Saved: {saved:,} chars ({saved / orig * 100:.0f}%)"
474
+
452
475
  tool_calls_panel = create_panel(
453
- content=tool_calls_content.plain.rstrip(),
476
+ content=tool_calls_text,
454
477
  title="Tool Calls",
455
478
  border_style="yellow",
456
479
  )
@@ -471,11 +494,23 @@ def build_panels_stream(
471
494
  and response_event.citations is not None
472
495
  and response_event.citations.urls is not None
473
496
  ):
474
- md_content = "\n".join(
497
+ md_lines = []
498
+
499
+ # Add search queries if present
500
+ if response_event.citations.search_queries:
501
+ md_lines.append("**Search Queries:**")
502
+ for query in response_event.citations.search_queries:
503
+ md_lines.append(f"- {query}")
504
+ md_lines.append("") # Empty line before URLs
505
+
506
+ # Add URL citations
507
+ md_lines.extend(
475
508
  f"{i + 1}. [{citation.title or citation.url}]({citation.url})"
476
509
  for i, citation in enumerate(response_event.citations.urls)
477
510
  if citation.url # Only include citations with valid URLs
478
511
  )
512
+
513
+ md_content = "\n".join(md_lines)
479
514
  if md_content: # Only create panel if there are citations
480
515
  citations_panel = create_panel(
481
516
  content=Markdown(md_content),
@@ -493,12 +528,14 @@ def print_response(
493
528
  session_id: Optional[str] = None,
494
529
  session_state: Optional[Dict[str, Any]] = None,
495
530
  user_id: Optional[str] = None,
531
+ run_id: Optional[str] = None,
496
532
  audio: Optional[Sequence[Audio]] = None,
497
533
  images: Optional[Sequence[Image]] = None,
498
534
  videos: Optional[Sequence[Video]] = None,
499
535
  files: Optional[Sequence[File]] = None,
500
- stream_intermediate_steps: bool = False,
501
- knowledge_filters: Optional[Dict[str, Any]] = None,
536
+ knowledge_filters: Optional[Union[Dict[str, Any], List[FilterExpr]]] = None,
537
+ stream_events: Optional[bool] = None,
538
+ stream_intermediate_steps: Optional[bool] = None,
502
539
  debug_mode: Optional[bool] = None,
503
540
  markdown: bool = False,
504
541
  show_message: bool = True,
@@ -513,6 +550,19 @@ def print_response(
513
550
  metadata: Optional[Dict[str, Any]] = None,
514
551
  **kwargs: Any,
515
552
  ):
553
+ if stream_events is not None:
554
+ warnings.warn(
555
+ "The 'stream_events' parameter is deprecated and will be removed in future versions. Event streaming is always enabled using the print_response function.",
556
+ DeprecationWarning,
557
+ stacklevel=2,
558
+ )
559
+ if stream_intermediate_steps is not None:
560
+ warnings.warn(
561
+ "The 'stream_intermediate_steps' parameter is deprecated and will be removed in future versions. Event streaming is always enabled using the print_response function.",
562
+ DeprecationWarning,
563
+ stacklevel=2,
564
+ )
565
+
516
566
  with Live(console=console) as live_log:
517
567
  status = Status("Thinking...", spinner="aesthetic", speed=0.4, refresh_per_second=10)
518
568
  live_log.update(status)
@@ -538,12 +588,13 @@ def print_response(
538
588
  session_id=session_id,
539
589
  session_state=session_state,
540
590
  user_id=user_id,
591
+ run_id=run_id,
541
592
  audio=audio,
542
593
  images=images,
543
594
  videos=videos,
544
595
  files=files,
545
596
  stream=False,
546
- stream_intermediate_steps=stream_intermediate_steps,
597
+ stream_events=True,
547
598
  knowledge_filters=knowledge_filters,
548
599
  debug_mode=debug_mode,
549
600
  add_history_to_context=add_history_to_context,
@@ -577,6 +628,7 @@ def print_response(
577
628
  show_full_reasoning=show_full_reasoning,
578
629
  tags_to_include_in_markdown=tags_to_include_in_markdown,
579
630
  markdown=markdown,
631
+ compression_manager=agent.compression_manager,
580
632
  )
581
633
  panels.extend(additional_panels)
582
634
 
@@ -611,17 +663,19 @@ async def aprint_response(
611
663
  session_id: Optional[str] = None,
612
664
  session_state: Optional[Dict[str, Any]] = None,
613
665
  user_id: Optional[str] = None,
666
+ run_id: Optional[str] = None,
614
667
  audio: Optional[Sequence[Audio]] = None,
615
668
  images: Optional[Sequence[Image]] = None,
616
669
  videos: Optional[Sequence[Video]] = None,
617
670
  files: Optional[Sequence[File]] = None,
618
- stream_intermediate_steps: bool = False,
619
- knowledge_filters: Optional[Dict[str, Any]] = None,
671
+ knowledge_filters: Optional[Union[Dict[str, Any], List[FilterExpr]]] = None,
620
672
  debug_mode: Optional[bool] = None,
621
673
  markdown: bool = False,
622
674
  show_message: bool = True,
623
675
  show_reasoning: bool = True,
624
676
  show_full_reasoning: bool = False,
677
+ stream_events: Optional[bool] = None,
678
+ stream_intermediate_steps: Optional[bool] = None,
625
679
  tags_to_include_in_markdown: Set[str] = {"think", "thinking"},
626
680
  console: Optional[Any] = None,
627
681
  add_history_to_context: Optional[bool] = None,
@@ -631,6 +685,19 @@ async def aprint_response(
631
685
  metadata: Optional[Dict[str, Any]] = None,
632
686
  **kwargs: Any,
633
687
  ):
688
+ if stream_events is not None:
689
+ warnings.warn(
690
+ "The 'stream_events' parameter is deprecated and will be removed in future versions. Event streaming is always enabled using the aprint_response function.",
691
+ DeprecationWarning,
692
+ stacklevel=2,
693
+ )
694
+ if stream_intermediate_steps is not None:
695
+ warnings.warn(
696
+ "The 'stream_intermediate_steps' parameter is deprecated and will be removed in future versions. Event streaming is always enabled using the aprint_response function.",
697
+ DeprecationWarning,
698
+ stacklevel=2,
699
+ )
700
+
634
701
  with Live(console=console) as live_log:
635
702
  status = Status("Thinking...", spinner="aesthetic", speed=0.4, refresh_per_second=10)
636
703
  live_log.update(status)
@@ -656,12 +723,13 @@ async def aprint_response(
656
723
  session_id=session_id,
657
724
  session_state=session_state,
658
725
  user_id=user_id,
726
+ run_id=run_id,
659
727
  audio=audio,
660
728
  images=images,
661
729
  videos=videos,
662
730
  files=files,
663
731
  stream=False,
664
- stream_intermediate_steps=stream_intermediate_steps,
732
+ stream_events=True,
665
733
  knowledge_filters=knowledge_filters,
666
734
  debug_mode=debug_mode,
667
735
  add_history_to_context=add_history_to_context,
@@ -695,6 +763,7 @@ async def aprint_response(
695
763
  show_full_reasoning=show_full_reasoning,
696
764
  tags_to_include_in_markdown=tags_to_include_in_markdown,
697
765
  markdown=markdown,
766
+ compression_manager=agent.compression_manager,
698
767
  )
699
768
  panels.extend(additional_panels)
700
769
 
@@ -731,6 +800,7 @@ def build_panels(
731
800
  show_full_reasoning: bool = False,
732
801
  tags_to_include_in_markdown: Optional[Set[str]] = None,
733
802
  markdown: bool = False,
803
+ compression_manager: Optional[Any] = None,
734
804
  ):
735
805
  panels = []
736
806
 
@@ -782,8 +852,19 @@ def build_panels(
782
852
  for formatted_tool_call in formatted_tool_calls:
783
853
  tool_calls_content.append(f"• {formatted_tool_call}\n")
784
854
 
855
+ tool_calls_text = tool_calls_content.plain.rstrip()
856
+
857
+ # Add compression stats if available
858
+ if compression_manager is not None and compression_manager.stats:
859
+ stats = compression_manager.stats
860
+ saved = stats.get("original_size", 0) - stats.get("compressed_size", 0)
861
+ orig = stats.get("original_size", 1)
862
+ if stats.get("tool_results_compressed", 0) > 0:
863
+ tool_calls_text += f"\n\ncompressed: {stats.get('tool_results_compressed', 0)} | Saved: {saved:,} chars ({saved / orig * 100:.0f}%)"
864
+ compression_manager.stats.clear()
865
+
785
866
  tool_calls_panel = create_panel(
786
- content=tool_calls_content.plain.rstrip(),
867
+ content=tool_calls_text,
787
868
  title="Tool Calls",
788
869
  border_style="yellow",
789
870
  )
@@ -821,11 +902,23 @@ def build_panels(
821
902
  and run_response.citations is not None
822
903
  and run_response.citations.urls is not None
823
904
  ):
824
- md_content = "\n".join(
905
+ md_lines = []
906
+
907
+ # Add search queries if present
908
+ if run_response.citations.search_queries:
909
+ md_lines.append("**Search Queries:**")
910
+ for query in run_response.citations.search_queries:
911
+ md_lines.append(f"- {query}")
912
+ md_lines.append("") # Empty line before URLs
913
+
914
+ # Add URL citations
915
+ md_lines.extend(
825
916
  f"{i + 1}. [{citation.title or citation.url}]({citation.url})"
826
917
  for i, citation in enumerate(run_response.citations.urls)
827
918
  if citation.url # Only include citations with valid URLs
828
919
  )
920
+
921
+ md_content = "\n".join(md_lines)
829
922
  if md_content: # Only create panel if there are citations
830
923
  citations_panel = create_panel(
831
924
  content=Markdown(md_content),