agno 2.2.13__py3-none-any.whl → 2.4.3__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 (383) hide show
  1. agno/agent/__init__.py +6 -0
  2. agno/agent/agent.py +5252 -3145
  3. agno/agent/remote.py +525 -0
  4. agno/api/api.py +2 -0
  5. agno/client/__init__.py +3 -0
  6. agno/client/a2a/__init__.py +10 -0
  7. agno/client/a2a/client.py +554 -0
  8. agno/client/a2a/schemas.py +112 -0
  9. agno/client/a2a/utils.py +369 -0
  10. agno/client/os.py +2669 -0
  11. agno/compression/__init__.py +3 -0
  12. agno/compression/manager.py +247 -0
  13. agno/culture/manager.py +2 -2
  14. agno/db/base.py +927 -6
  15. agno/db/dynamo/dynamo.py +788 -2
  16. agno/db/dynamo/schemas.py +128 -0
  17. agno/db/dynamo/utils.py +26 -3
  18. agno/db/firestore/firestore.py +674 -50
  19. agno/db/firestore/schemas.py +41 -0
  20. agno/db/firestore/utils.py +25 -10
  21. agno/db/gcs_json/gcs_json_db.py +506 -3
  22. agno/db/gcs_json/utils.py +14 -2
  23. agno/db/in_memory/in_memory_db.py +203 -4
  24. agno/db/in_memory/utils.py +14 -2
  25. agno/db/json/json_db.py +498 -2
  26. agno/db/json/utils.py +14 -2
  27. agno/db/migrations/manager.py +199 -0
  28. agno/db/migrations/utils.py +19 -0
  29. agno/db/migrations/v1_to_v2.py +54 -16
  30. agno/db/migrations/versions/__init__.py +0 -0
  31. agno/db/migrations/versions/v2_3_0.py +977 -0
  32. agno/db/mongo/async_mongo.py +1013 -39
  33. agno/db/mongo/mongo.py +684 -4
  34. agno/db/mongo/schemas.py +48 -0
  35. agno/db/mongo/utils.py +17 -0
  36. agno/db/mysql/__init__.py +2 -1
  37. agno/db/mysql/async_mysql.py +2958 -0
  38. agno/db/mysql/mysql.py +722 -53
  39. agno/db/mysql/schemas.py +77 -11
  40. agno/db/mysql/utils.py +151 -8
  41. agno/db/postgres/async_postgres.py +1254 -137
  42. agno/db/postgres/postgres.py +2316 -93
  43. agno/db/postgres/schemas.py +153 -21
  44. agno/db/postgres/utils.py +22 -7
  45. agno/db/redis/redis.py +531 -3
  46. agno/db/redis/schemas.py +36 -0
  47. agno/db/redis/utils.py +31 -15
  48. agno/db/schemas/evals.py +1 -0
  49. agno/db/schemas/memory.py +20 -9
  50. agno/db/singlestore/schemas.py +70 -1
  51. agno/db/singlestore/singlestore.py +737 -74
  52. agno/db/singlestore/utils.py +13 -3
  53. agno/db/sqlite/async_sqlite.py +1069 -89
  54. agno/db/sqlite/schemas.py +133 -1
  55. agno/db/sqlite/sqlite.py +2203 -165
  56. agno/db/sqlite/utils.py +21 -11
  57. agno/db/surrealdb/models.py +25 -0
  58. agno/db/surrealdb/surrealdb.py +603 -1
  59. agno/db/utils.py +60 -0
  60. agno/eval/__init__.py +26 -3
  61. agno/eval/accuracy.py +25 -12
  62. agno/eval/agent_as_judge.py +871 -0
  63. agno/eval/base.py +29 -0
  64. agno/eval/performance.py +10 -4
  65. agno/eval/reliability.py +22 -13
  66. agno/eval/utils.py +2 -1
  67. agno/exceptions.py +42 -0
  68. agno/hooks/__init__.py +3 -0
  69. agno/hooks/decorator.py +164 -0
  70. agno/integrations/discord/client.py +13 -2
  71. agno/knowledge/__init__.py +4 -0
  72. agno/knowledge/chunking/code.py +90 -0
  73. agno/knowledge/chunking/document.py +65 -4
  74. agno/knowledge/chunking/fixed.py +4 -1
  75. agno/knowledge/chunking/markdown.py +102 -11
  76. agno/knowledge/chunking/recursive.py +2 -2
  77. agno/knowledge/chunking/semantic.py +130 -48
  78. agno/knowledge/chunking/strategy.py +18 -0
  79. agno/knowledge/embedder/azure_openai.py +0 -1
  80. agno/knowledge/embedder/google.py +1 -1
  81. agno/knowledge/embedder/mistral.py +1 -1
  82. agno/knowledge/embedder/nebius.py +1 -1
  83. agno/knowledge/embedder/openai.py +16 -12
  84. agno/knowledge/filesystem.py +412 -0
  85. agno/knowledge/knowledge.py +4261 -1199
  86. agno/knowledge/protocol.py +134 -0
  87. agno/knowledge/reader/arxiv_reader.py +3 -2
  88. agno/knowledge/reader/base.py +9 -7
  89. agno/knowledge/reader/csv_reader.py +91 -42
  90. agno/knowledge/reader/docx_reader.py +9 -10
  91. agno/knowledge/reader/excel_reader.py +225 -0
  92. agno/knowledge/reader/field_labeled_csv_reader.py +38 -48
  93. agno/knowledge/reader/firecrawl_reader.py +3 -2
  94. agno/knowledge/reader/json_reader.py +16 -22
  95. agno/knowledge/reader/markdown_reader.py +15 -14
  96. agno/knowledge/reader/pdf_reader.py +33 -28
  97. agno/knowledge/reader/pptx_reader.py +9 -10
  98. agno/knowledge/reader/reader_factory.py +135 -1
  99. agno/knowledge/reader/s3_reader.py +8 -16
  100. agno/knowledge/reader/tavily_reader.py +3 -3
  101. agno/knowledge/reader/text_reader.py +15 -14
  102. agno/knowledge/reader/utils/__init__.py +17 -0
  103. agno/knowledge/reader/utils/spreadsheet.py +114 -0
  104. agno/knowledge/reader/web_search_reader.py +8 -65
  105. agno/knowledge/reader/website_reader.py +16 -13
  106. agno/knowledge/reader/wikipedia_reader.py +36 -3
  107. agno/knowledge/reader/youtube_reader.py +3 -2
  108. agno/knowledge/remote_content/__init__.py +33 -0
  109. agno/knowledge/remote_content/config.py +266 -0
  110. agno/knowledge/remote_content/remote_content.py +105 -17
  111. agno/knowledge/utils.py +76 -22
  112. agno/learn/__init__.py +71 -0
  113. agno/learn/config.py +463 -0
  114. agno/learn/curate.py +185 -0
  115. agno/learn/machine.py +725 -0
  116. agno/learn/schemas.py +1114 -0
  117. agno/learn/stores/__init__.py +38 -0
  118. agno/learn/stores/decision_log.py +1156 -0
  119. agno/learn/stores/entity_memory.py +3275 -0
  120. agno/learn/stores/learned_knowledge.py +1583 -0
  121. agno/learn/stores/protocol.py +117 -0
  122. agno/learn/stores/session_context.py +1217 -0
  123. agno/learn/stores/user_memory.py +1495 -0
  124. agno/learn/stores/user_profile.py +1220 -0
  125. agno/learn/utils.py +209 -0
  126. agno/media.py +22 -6
  127. agno/memory/__init__.py +14 -1
  128. agno/memory/manager.py +223 -8
  129. agno/memory/strategies/__init__.py +15 -0
  130. agno/memory/strategies/base.py +66 -0
  131. agno/memory/strategies/summarize.py +196 -0
  132. agno/memory/strategies/types.py +37 -0
  133. agno/models/aimlapi/aimlapi.py +17 -0
  134. agno/models/anthropic/claude.py +434 -59
  135. agno/models/aws/bedrock.py +121 -20
  136. agno/models/aws/claude.py +131 -274
  137. agno/models/azure/ai_foundry.py +10 -6
  138. agno/models/azure/openai_chat.py +33 -10
  139. agno/models/base.py +1162 -561
  140. agno/models/cerebras/cerebras.py +120 -24
  141. agno/models/cerebras/cerebras_openai.py +21 -2
  142. agno/models/cohere/chat.py +65 -6
  143. agno/models/cometapi/cometapi.py +18 -1
  144. agno/models/dashscope/dashscope.py +2 -3
  145. agno/models/deepinfra/deepinfra.py +18 -1
  146. agno/models/deepseek/deepseek.py +69 -3
  147. agno/models/fireworks/fireworks.py +18 -1
  148. agno/models/google/gemini.py +959 -89
  149. agno/models/google/utils.py +22 -0
  150. agno/models/groq/groq.py +48 -18
  151. agno/models/huggingface/huggingface.py +17 -6
  152. agno/models/ibm/watsonx.py +16 -6
  153. agno/models/internlm/internlm.py +18 -1
  154. agno/models/langdb/langdb.py +13 -1
  155. agno/models/litellm/chat.py +88 -9
  156. agno/models/litellm/litellm_openai.py +18 -1
  157. agno/models/message.py +24 -5
  158. agno/models/meta/llama.py +40 -13
  159. agno/models/meta/llama_openai.py +22 -21
  160. agno/models/metrics.py +12 -0
  161. agno/models/mistral/mistral.py +8 -4
  162. agno/models/n1n/__init__.py +3 -0
  163. agno/models/n1n/n1n.py +57 -0
  164. agno/models/nebius/nebius.py +6 -7
  165. agno/models/nvidia/nvidia.py +20 -3
  166. agno/models/ollama/__init__.py +2 -0
  167. agno/models/ollama/chat.py +17 -6
  168. agno/models/ollama/responses.py +100 -0
  169. agno/models/openai/__init__.py +2 -0
  170. agno/models/openai/chat.py +117 -26
  171. agno/models/openai/open_responses.py +46 -0
  172. agno/models/openai/responses.py +110 -32
  173. agno/models/openrouter/__init__.py +2 -0
  174. agno/models/openrouter/openrouter.py +67 -2
  175. agno/models/openrouter/responses.py +146 -0
  176. agno/models/perplexity/perplexity.py +19 -1
  177. agno/models/portkey/portkey.py +7 -6
  178. agno/models/requesty/requesty.py +19 -2
  179. agno/models/response.py +20 -2
  180. agno/models/sambanova/sambanova.py +20 -3
  181. agno/models/siliconflow/siliconflow.py +19 -2
  182. agno/models/together/together.py +20 -3
  183. agno/models/vercel/v0.py +20 -3
  184. agno/models/vertexai/claude.py +124 -4
  185. agno/models/vllm/vllm.py +19 -14
  186. agno/models/xai/xai.py +19 -2
  187. agno/os/app.py +467 -137
  188. agno/os/auth.py +253 -5
  189. agno/os/config.py +22 -0
  190. agno/os/interfaces/a2a/a2a.py +7 -6
  191. agno/os/interfaces/a2a/router.py +635 -26
  192. agno/os/interfaces/a2a/utils.py +32 -33
  193. agno/os/interfaces/agui/agui.py +5 -3
  194. agno/os/interfaces/agui/router.py +26 -16
  195. agno/os/interfaces/agui/utils.py +97 -57
  196. agno/os/interfaces/base.py +7 -7
  197. agno/os/interfaces/slack/router.py +16 -7
  198. agno/os/interfaces/slack/slack.py +7 -7
  199. agno/os/interfaces/whatsapp/router.py +35 -7
  200. agno/os/interfaces/whatsapp/security.py +3 -1
  201. agno/os/interfaces/whatsapp/whatsapp.py +11 -8
  202. agno/os/managers.py +326 -0
  203. agno/os/mcp.py +652 -79
  204. agno/os/middleware/__init__.py +4 -0
  205. agno/os/middleware/jwt.py +718 -115
  206. agno/os/middleware/trailing_slash.py +27 -0
  207. agno/os/router.py +105 -1558
  208. agno/os/routers/agents/__init__.py +3 -0
  209. agno/os/routers/agents/router.py +655 -0
  210. agno/os/routers/agents/schema.py +288 -0
  211. agno/os/routers/components/__init__.py +3 -0
  212. agno/os/routers/components/components.py +475 -0
  213. agno/os/routers/database.py +155 -0
  214. agno/os/routers/evals/evals.py +111 -18
  215. agno/os/routers/evals/schemas.py +38 -5
  216. agno/os/routers/evals/utils.py +80 -11
  217. agno/os/routers/health.py +3 -3
  218. agno/os/routers/knowledge/knowledge.py +284 -35
  219. agno/os/routers/knowledge/schemas.py +14 -2
  220. agno/os/routers/memory/memory.py +274 -11
  221. agno/os/routers/memory/schemas.py +44 -3
  222. agno/os/routers/metrics/metrics.py +30 -15
  223. agno/os/routers/metrics/schemas.py +10 -6
  224. agno/os/routers/registry/__init__.py +3 -0
  225. agno/os/routers/registry/registry.py +337 -0
  226. agno/os/routers/session/session.py +143 -14
  227. agno/os/routers/teams/__init__.py +3 -0
  228. agno/os/routers/teams/router.py +550 -0
  229. agno/os/routers/teams/schema.py +280 -0
  230. agno/os/routers/traces/__init__.py +3 -0
  231. agno/os/routers/traces/schemas.py +414 -0
  232. agno/os/routers/traces/traces.py +549 -0
  233. agno/os/routers/workflows/__init__.py +3 -0
  234. agno/os/routers/workflows/router.py +757 -0
  235. agno/os/routers/workflows/schema.py +139 -0
  236. agno/os/schema.py +157 -584
  237. agno/os/scopes.py +469 -0
  238. agno/os/settings.py +3 -0
  239. agno/os/utils.py +574 -185
  240. agno/reasoning/anthropic.py +85 -1
  241. agno/reasoning/azure_ai_foundry.py +93 -1
  242. agno/reasoning/deepseek.py +102 -2
  243. agno/reasoning/default.py +6 -7
  244. agno/reasoning/gemini.py +87 -3
  245. agno/reasoning/groq.py +109 -2
  246. agno/reasoning/helpers.py +6 -7
  247. agno/reasoning/manager.py +1238 -0
  248. agno/reasoning/ollama.py +93 -1
  249. agno/reasoning/openai.py +115 -1
  250. agno/reasoning/vertexai.py +85 -1
  251. agno/registry/__init__.py +3 -0
  252. agno/registry/registry.py +68 -0
  253. agno/remote/__init__.py +3 -0
  254. agno/remote/base.py +581 -0
  255. agno/run/__init__.py +2 -4
  256. agno/run/agent.py +134 -19
  257. agno/run/base.py +49 -1
  258. agno/run/cancel.py +65 -52
  259. agno/run/cancellation_management/__init__.py +9 -0
  260. agno/run/cancellation_management/base.py +78 -0
  261. agno/run/cancellation_management/in_memory_cancellation_manager.py +100 -0
  262. agno/run/cancellation_management/redis_cancellation_manager.py +236 -0
  263. agno/run/requirement.py +181 -0
  264. agno/run/team.py +111 -19
  265. agno/run/workflow.py +2 -1
  266. agno/session/agent.py +57 -92
  267. agno/session/summary.py +1 -1
  268. agno/session/team.py +62 -115
  269. agno/session/workflow.py +353 -57
  270. agno/skills/__init__.py +17 -0
  271. agno/skills/agent_skills.py +377 -0
  272. agno/skills/errors.py +32 -0
  273. agno/skills/loaders/__init__.py +4 -0
  274. agno/skills/loaders/base.py +27 -0
  275. agno/skills/loaders/local.py +216 -0
  276. agno/skills/skill.py +65 -0
  277. agno/skills/utils.py +107 -0
  278. agno/skills/validator.py +277 -0
  279. agno/table.py +10 -0
  280. agno/team/__init__.py +5 -1
  281. agno/team/remote.py +447 -0
  282. agno/team/team.py +3769 -2202
  283. agno/tools/brandfetch.py +27 -18
  284. agno/tools/browserbase.py +225 -16
  285. agno/tools/crawl4ai.py +3 -0
  286. agno/tools/duckduckgo.py +25 -71
  287. agno/tools/exa.py +0 -21
  288. agno/tools/file.py +14 -13
  289. agno/tools/file_generation.py +12 -6
  290. agno/tools/firecrawl.py +15 -7
  291. agno/tools/function.py +94 -113
  292. agno/tools/google_bigquery.py +11 -2
  293. agno/tools/google_drive.py +4 -3
  294. agno/tools/knowledge.py +9 -4
  295. agno/tools/mcp/mcp.py +301 -18
  296. agno/tools/mcp/multi_mcp.py +269 -14
  297. agno/tools/mem0.py +11 -10
  298. agno/tools/memory.py +47 -46
  299. agno/tools/mlx_transcribe.py +10 -7
  300. agno/tools/models/nebius.py +5 -5
  301. agno/tools/models_labs.py +20 -10
  302. agno/tools/nano_banana.py +151 -0
  303. agno/tools/parallel.py +0 -7
  304. agno/tools/postgres.py +76 -36
  305. agno/tools/python.py +14 -6
  306. agno/tools/reasoning.py +30 -23
  307. agno/tools/redshift.py +406 -0
  308. agno/tools/shopify.py +1519 -0
  309. agno/tools/spotify.py +919 -0
  310. agno/tools/tavily.py +4 -1
  311. agno/tools/toolkit.py +253 -18
  312. agno/tools/websearch.py +93 -0
  313. agno/tools/website.py +1 -1
  314. agno/tools/wikipedia.py +1 -1
  315. agno/tools/workflow.py +56 -48
  316. agno/tools/yfinance.py +12 -11
  317. agno/tracing/__init__.py +12 -0
  318. agno/tracing/exporter.py +161 -0
  319. agno/tracing/schemas.py +276 -0
  320. agno/tracing/setup.py +112 -0
  321. agno/utils/agent.py +251 -10
  322. agno/utils/cryptography.py +22 -0
  323. agno/utils/dttm.py +33 -0
  324. agno/utils/events.py +264 -7
  325. agno/utils/hooks.py +111 -3
  326. agno/utils/http.py +161 -2
  327. agno/utils/mcp.py +49 -8
  328. agno/utils/media.py +22 -1
  329. agno/utils/models/ai_foundry.py +9 -2
  330. agno/utils/models/claude.py +20 -5
  331. agno/utils/models/cohere.py +9 -2
  332. agno/utils/models/llama.py +9 -2
  333. agno/utils/models/mistral.py +4 -2
  334. agno/utils/os.py +0 -0
  335. agno/utils/print_response/agent.py +99 -16
  336. agno/utils/print_response/team.py +223 -24
  337. agno/utils/print_response/workflow.py +0 -2
  338. agno/utils/prompts.py +8 -6
  339. agno/utils/remote.py +23 -0
  340. agno/utils/response.py +1 -13
  341. agno/utils/string.py +91 -2
  342. agno/utils/team.py +62 -12
  343. agno/utils/tokens.py +657 -0
  344. agno/vectordb/base.py +15 -2
  345. agno/vectordb/cassandra/cassandra.py +1 -1
  346. agno/vectordb/chroma/__init__.py +2 -1
  347. agno/vectordb/chroma/chromadb.py +468 -23
  348. agno/vectordb/clickhouse/clickhousedb.py +1 -1
  349. agno/vectordb/couchbase/couchbase.py +6 -2
  350. agno/vectordb/lancedb/lance_db.py +7 -38
  351. agno/vectordb/lightrag/lightrag.py +7 -6
  352. agno/vectordb/milvus/milvus.py +118 -84
  353. agno/vectordb/mongodb/__init__.py +2 -1
  354. agno/vectordb/mongodb/mongodb.py +14 -31
  355. agno/vectordb/pgvector/pgvector.py +120 -66
  356. agno/vectordb/pineconedb/pineconedb.py +2 -19
  357. agno/vectordb/qdrant/__init__.py +2 -1
  358. agno/vectordb/qdrant/qdrant.py +33 -56
  359. agno/vectordb/redis/__init__.py +2 -1
  360. agno/vectordb/redis/redisdb.py +19 -31
  361. agno/vectordb/singlestore/singlestore.py +17 -9
  362. agno/vectordb/surrealdb/surrealdb.py +2 -38
  363. agno/vectordb/weaviate/__init__.py +2 -1
  364. agno/vectordb/weaviate/weaviate.py +7 -3
  365. agno/workflow/__init__.py +5 -1
  366. agno/workflow/agent.py +2 -2
  367. agno/workflow/condition.py +12 -10
  368. agno/workflow/loop.py +28 -9
  369. agno/workflow/parallel.py +21 -13
  370. agno/workflow/remote.py +362 -0
  371. agno/workflow/router.py +12 -9
  372. agno/workflow/step.py +261 -36
  373. agno/workflow/steps.py +12 -8
  374. agno/workflow/types.py +40 -77
  375. agno/workflow/workflow.py +939 -213
  376. {agno-2.2.13.dist-info → agno-2.4.3.dist-info}/METADATA +134 -181
  377. agno-2.4.3.dist-info/RECORD +677 -0
  378. {agno-2.2.13.dist-info → agno-2.4.3.dist-info}/WHEEL +1 -1
  379. agno/tools/googlesearch.py +0 -98
  380. agno/tools/memori.py +0 -339
  381. agno-2.2.13.dist-info/RECORD +0 -575
  382. {agno-2.2.13.dist-info → agno-2.4.3.dist-info}/licenses/LICENSE +0 -0
  383. {agno-2.2.13.dist-info → agno-2.4.3.dist-info}/top_level.txt +0 -0
@@ -30,12 +30,11 @@ def print_response_stream(
30
30
  session_id: Optional[str] = None,
31
31
  session_state: Optional[Dict[str, Any]] = None,
32
32
  user_id: Optional[str] = None,
33
+ run_id: Optional[str] = None,
33
34
  audio: Optional[Sequence[Audio]] = None,
34
35
  images: Optional[Sequence[Image]] = None,
35
36
  videos: Optional[Sequence[Video]] = None,
36
37
  files: Optional[Sequence[File]] = None,
37
- stream_events: bool = False,
38
- stream_intermediate_steps: bool = False,
39
38
  knowledge_filters: Optional[Union[Dict[str, Any], List[FilterExpr]]] = None,
40
39
  debug_mode: Optional[bool] = None,
41
40
  markdown: bool = False,
@@ -82,20 +81,17 @@ def print_response_stream(
82
81
 
83
82
  input_content = get_text_from_message(input)
84
83
 
85
- # Consider both stream_events and stream_intermediate_steps (deprecated)
86
- stream_events = stream_events or stream_intermediate_steps
87
-
88
84
  for response_event in agent.run(
89
85
  input=input,
90
86
  session_id=session_id,
91
87
  session_state=session_state,
92
88
  user_id=user_id,
89
+ run_id=run_id,
93
90
  audio=audio,
94
91
  images=images,
95
92
  videos=videos,
96
93
  files=files,
97
94
  stream=True,
98
- stream_events=stream_events,
99
95
  knowledge_filters=knowledge_filters,
100
96
  debug_mode=debug_mode,
101
97
  add_history_to_context=add_history_to_context,
@@ -137,6 +133,11 @@ def print_response_stream(
137
133
  )
138
134
  except Exception as e:
139
135
  log_warning(f"Failed to convert response to JSON: {e}")
136
+ elif agent.output_schema is not None and isinstance(response_event.content, dict):
137
+ try:
138
+ response_content_batch = JSON(json.dumps(response_event.content), indent=2) # type: ignore
139
+ except Exception as e:
140
+ log_warning(f"Failed to convert response to JSON: {e}")
140
141
  else:
141
142
  try:
142
143
  response_content_batch = JSON(json.dumps(response_event.content), indent=4)
@@ -144,6 +145,12 @@ def print_response_stream(
144
145
  log_warning(f"Failed to convert response to JSON: {e}")
145
146
  if hasattr(response_event, "reasoning_content") and response_event.reasoning_content is not None: # type: ignore
146
147
  _response_reasoning_content += response_event.reasoning_content # type: ignore
148
+
149
+ # Handle streaming reasoning content delta events
150
+ if response_event.event == RunEvent.reasoning_content_delta: # type: ignore
151
+ if hasattr(response_event, "reasoning_content") and response_event.reasoning_content is not None: # type: ignore
152
+ _response_reasoning_content += response_event.reasoning_content # type: ignore
153
+
147
154
  if hasattr(response_event, "reasoning_steps") and response_event.reasoning_steps is not None: # type: ignore
148
155
  reasoning_steps = response_event.reasoning_steps # type: ignore
149
156
 
@@ -184,6 +191,7 @@ def print_response_stream(
184
191
  show_reasoning=show_reasoning,
185
192
  show_full_reasoning=show_full_reasoning,
186
193
  accumulated_tool_calls=accumulated_tool_calls,
194
+ compression_manager=agent.compression_manager,
187
195
  )
188
196
  panels.extend(additional_panels)
189
197
  if panels:
@@ -209,6 +217,10 @@ def print_response_stream(
209
217
  live_log.update(Group(*panels))
210
218
  agent.session_summary_manager.summaries_updated = False
211
219
 
220
+ # Clear compression stats after final display
221
+ if agent.compression_manager is not None:
222
+ agent.compression_manager.stats.clear()
223
+
212
224
  response_timer.stop()
213
225
 
214
226
  # Final update to remove the "Thinking..." status
@@ -222,12 +234,11 @@ async def aprint_response_stream(
222
234
  session_id: Optional[str] = None,
223
235
  session_state: Optional[Dict[str, Any]] = None,
224
236
  user_id: Optional[str] = None,
237
+ run_id: Optional[str] = None,
225
238
  audio: Optional[Sequence[Audio]] = None,
226
239
  images: Optional[Sequence[Image]] = None,
227
240
  videos: Optional[Sequence[Video]] = None,
228
241
  files: Optional[Sequence[File]] = None,
229
- stream_events: bool = False,
230
- stream_intermediate_steps: bool = False,
231
242
  knowledge_filters: Optional[Union[Dict[str, Any], List[FilterExpr]]] = None,
232
243
  debug_mode: Optional[bool] = None,
233
244
  markdown: bool = False,
@@ -272,20 +283,17 @@ async def aprint_response_stream(
272
283
  if render:
273
284
  live_log.update(Group(*panels))
274
285
 
275
- # Considering both stream_events and stream_intermediate_steps (deprecated)
276
- stream_events = stream_events or stream_intermediate_steps
277
-
278
286
  result = agent.arun(
279
287
  input=input,
280
288
  session_id=session_id,
281
289
  session_state=session_state,
282
290
  user_id=user_id,
291
+ run_id=run_id,
283
292
  audio=audio,
284
293
  images=images,
285
294
  videos=videos,
286
295
  files=files,
287
296
  stream=True,
288
- stream_events=stream_events,
289
297
  knowledge_filters=knowledge_filters,
290
298
  debug_mode=debug_mode,
291
299
  add_history_to_context=add_history_to_context,
@@ -327,6 +335,11 @@ async def aprint_response_stream(
327
335
  response_content_batch = JSON(resp.content.model_dump_json(exclude_none=True), indent=2) # type: ignore
328
336
  except Exception as e:
329
337
  log_warning(f"Failed to convert response to JSON: {e}")
338
+ elif agent.output_schema is not None and isinstance(resp.content, dict):
339
+ try:
340
+ response_content_batch = JSON(json.dumps(resp.content), indent=2) # type: ignore
341
+ except Exception as e:
342
+ log_warning(f"Failed to convert response to JSON: {e}")
330
343
  else:
331
344
  try:
332
345
  response_content_batch = JSON(json.dumps(resp.content), indent=4)
@@ -335,6 +348,11 @@ async def aprint_response_stream(
335
348
  if resp.reasoning_content is not None: # type: ignore
336
349
  _response_reasoning_content += resp.reasoning_content # type: ignore
337
350
 
351
+ # Handle streaming reasoning content delta events
352
+ if resp.event == RunEvent.reasoning_content_delta: # type: ignore
353
+ if hasattr(resp, "reasoning_content") and resp.reasoning_content is not None: # type: ignore
354
+ _response_reasoning_content += resp.reasoning_content # type: ignore
355
+
338
356
  if hasattr(resp, "reasoning_steps") and resp.reasoning_steps is not None: # type: ignore
339
357
  reasoning_steps = resp.reasoning_steps # type: ignore
340
358
 
@@ -377,6 +395,7 @@ async def aprint_response_stream(
377
395
  show_reasoning=show_reasoning,
378
396
  show_full_reasoning=show_full_reasoning,
379
397
  accumulated_tool_calls=accumulated_tool_calls,
398
+ compression_manager=agent.compression_manager,
380
399
  )
381
400
  panels.extend(additional_panels)
382
401
  if panels:
@@ -402,6 +421,10 @@ async def aprint_response_stream(
402
421
  live_log.update(Group(*panels))
403
422
  agent.session_summary_manager.summaries_updated = False
404
423
 
424
+ # Clear compression stats after final display
425
+ if agent.compression_manager is not None:
426
+ agent.compression_manager.stats.clear()
427
+
405
428
  response_timer.stop()
406
429
 
407
430
  # Final update to remove the "Thinking..." status
@@ -418,6 +441,7 @@ def build_panels_stream(
418
441
  show_reasoning: bool = True,
419
442
  show_full_reasoning: bool = False,
420
443
  accumulated_tool_calls: Optional[List] = None,
444
+ compression_manager: Optional[Any] = None,
421
445
  ):
422
446
  panels = []
423
447
 
@@ -458,8 +482,18 @@ def build_panels_stream(
458
482
  for formatted_tool_call in formatted_tool_calls:
459
483
  tool_calls_content.append(f"• {formatted_tool_call}\n")
460
484
 
485
+ tool_calls_text = tool_calls_content.plain.rstrip()
486
+
487
+ # Add compression stats if available (don't clear - caller will clear after final display)
488
+ if compression_manager is not None and compression_manager.stats:
489
+ stats = compression_manager.stats
490
+ saved = stats.get("original_size", 0) - stats.get("compressed_size", 0)
491
+ orig = stats.get("original_size", 1)
492
+ if stats.get("tool_results_compressed", 0) > 0:
493
+ tool_calls_text += f"\n\ncompressed: {stats.get('tool_results_compressed', 0)} | Saved: {saved:,} chars ({saved / orig * 100:.0f}%)"
494
+
461
495
  tool_calls_panel = create_panel(
462
- content=tool_calls_content.plain.rstrip(),
496
+ content=tool_calls_text,
463
497
  title="Tool Calls",
464
498
  border_style="yellow",
465
499
  )
@@ -480,11 +514,23 @@ def build_panels_stream(
480
514
  and response_event.citations is not None
481
515
  and response_event.citations.urls is not None
482
516
  ):
483
- md_content = "\n".join(
517
+ md_lines = []
518
+
519
+ # Add search queries if present
520
+ if response_event.citations.search_queries:
521
+ md_lines.append("**Search Queries:**")
522
+ for query in response_event.citations.search_queries:
523
+ md_lines.append(f"- {query}")
524
+ md_lines.append("") # Empty line before URLs
525
+
526
+ # Add URL citations
527
+ md_lines.extend(
484
528
  f"{i + 1}. [{citation.title or citation.url}]({citation.url})"
485
529
  for i, citation in enumerate(response_event.citations.urls)
486
530
  if citation.url # Only include citations with valid URLs
487
531
  )
532
+
533
+ md_content = "\n".join(md_lines)
488
534
  if md_content: # Only create panel if there are citations
489
535
  citations_panel = create_panel(
490
536
  content=Markdown(md_content),
@@ -502,6 +548,7 @@ def print_response(
502
548
  session_id: Optional[str] = None,
503
549
  session_state: Optional[Dict[str, Any]] = None,
504
550
  user_id: Optional[str] = None,
551
+ run_id: Optional[str] = None,
505
552
  audio: Optional[Sequence[Audio]] = None,
506
553
  images: Optional[Sequence[Image]] = None,
507
554
  videos: Optional[Sequence[Video]] = None,
@@ -546,11 +593,13 @@ def print_response(
546
593
  session_id=session_id,
547
594
  session_state=session_state,
548
595
  user_id=user_id,
596
+ run_id=run_id,
549
597
  audio=audio,
550
598
  images=images,
551
599
  videos=videos,
552
600
  files=files,
553
601
  stream=False,
602
+ stream_events=True,
554
603
  knowledge_filters=knowledge_filters,
555
604
  debug_mode=debug_mode,
556
605
  add_history_to_context=add_history_to_context,
@@ -584,6 +633,7 @@ def print_response(
584
633
  show_full_reasoning=show_full_reasoning,
585
634
  tags_to_include_in_markdown=tags_to_include_in_markdown,
586
635
  markdown=markdown,
636
+ compression_manager=agent.compression_manager,
587
637
  )
588
638
  panels.extend(additional_panels)
589
639
 
@@ -618,6 +668,7 @@ async def aprint_response(
618
668
  session_id: Optional[str] = None,
619
669
  session_state: Optional[Dict[str, Any]] = None,
620
670
  user_id: Optional[str] = None,
671
+ run_id: Optional[str] = None,
621
672
  audio: Optional[Sequence[Audio]] = None,
622
673
  images: Optional[Sequence[Image]] = None,
623
674
  videos: Optional[Sequence[Video]] = None,
@@ -662,11 +713,13 @@ async def aprint_response(
662
713
  session_id=session_id,
663
714
  session_state=session_state,
664
715
  user_id=user_id,
716
+ run_id=run_id,
665
717
  audio=audio,
666
718
  images=images,
667
719
  videos=videos,
668
720
  files=files,
669
721
  stream=False,
722
+ stream_events=True,
670
723
  knowledge_filters=knowledge_filters,
671
724
  debug_mode=debug_mode,
672
725
  add_history_to_context=add_history_to_context,
@@ -700,6 +753,7 @@ async def aprint_response(
700
753
  show_full_reasoning=show_full_reasoning,
701
754
  tags_to_include_in_markdown=tags_to_include_in_markdown,
702
755
  markdown=markdown,
756
+ compression_manager=agent.compression_manager,
703
757
  )
704
758
  panels.extend(additional_panels)
705
759
 
@@ -736,6 +790,7 @@ def build_panels(
736
790
  show_full_reasoning: bool = False,
737
791
  tags_to_include_in_markdown: Optional[Set[str]] = None,
738
792
  markdown: bool = False,
793
+ compression_manager: Optional[Any] = None,
739
794
  ):
740
795
  panels = []
741
796
 
@@ -787,8 +842,19 @@ def build_panels(
787
842
  for formatted_tool_call in formatted_tool_calls:
788
843
  tool_calls_content.append(f"• {formatted_tool_call}\n")
789
844
 
845
+ tool_calls_text = tool_calls_content.plain.rstrip()
846
+
847
+ # Add compression stats if available
848
+ if compression_manager is not None and compression_manager.stats:
849
+ stats = compression_manager.stats
850
+ saved = stats.get("original_size", 0) - stats.get("compressed_size", 0)
851
+ orig = stats.get("original_size", 1)
852
+ if stats.get("tool_results_compressed", 0) > 0:
853
+ tool_calls_text += f"\n\ncompressed: {stats.get('tool_results_compressed', 0)} | Saved: {saved:,} chars ({saved / orig * 100:.0f}%)"
854
+ compression_manager.stats.clear()
855
+
790
856
  tool_calls_panel = create_panel(
791
- content=tool_calls_content.plain.rstrip(),
857
+ content=tool_calls_text,
792
858
  title="Tool Calls",
793
859
  border_style="yellow",
794
860
  )
@@ -807,6 +873,11 @@ def build_panels(
807
873
  response_content_batch = JSON(run_response.content.model_dump_json(exclude_none=True), indent=2)
808
874
  except Exception as e:
809
875
  log_warning(f"Failed to convert response to JSON: {e}")
876
+ elif output_schema is not None and isinstance(run_response.content, dict):
877
+ try:
878
+ response_content_batch = JSON(json.dumps(run_response.content), indent=2)
879
+ except Exception as e:
880
+ log_warning(f"Failed to convert response to JSON: {e}")
810
881
  else:
811
882
  try:
812
883
  response_content_batch = JSON(json.dumps(run_response.content), indent=4)
@@ -826,11 +897,23 @@ def build_panels(
826
897
  and run_response.citations is not None
827
898
  and run_response.citations.urls is not None
828
899
  ):
829
- md_content = "\n".join(
900
+ md_lines = []
901
+
902
+ # Add search queries if present
903
+ if run_response.citations.search_queries:
904
+ md_lines.append("**Search Queries:**")
905
+ for query in run_response.citations.search_queries:
906
+ md_lines.append(f"- {query}")
907
+ md_lines.append("") # Empty line before URLs
908
+
909
+ # Add URL citations
910
+ md_lines.extend(
830
911
  f"{i + 1}. [{citation.title or citation.url}]({citation.url})"
831
912
  for i, citation in enumerate(run_response.citations.urls)
832
913
  if citation.url # Only include citations with valid URLs
833
914
  )
915
+
916
+ md_content = "\n".join(md_lines)
834
917
  if md_content: # Only create panel if there are citations
835
918
  citations_panel = create_panel(
836
919
  content=Markdown(md_content),