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
agno/session/team.py CHANGED
@@ -91,10 +91,7 @@ class TeamSession:
91
91
 
92
92
  def upsert_run(self, run_response: Union[TeamRunOutput, RunOutput]):
93
93
  """Adds a RunOutput, together with some calculated data, to the runs list."""
94
-
95
94
  messages = run_response.messages
96
- if messages is None:
97
- return
98
95
 
99
96
  # Make message duration None
100
97
  for m in messages or []:
@@ -113,74 +110,82 @@ class TeamSession:
113
110
 
114
111
  log_debug("Added RunOutput to Team Session")
115
112
 
116
- def _should_skip_message(
117
- self, message: Message, skip_role: Optional[str] = None, skip_history_messages: bool = True
118
- ) -> bool:
119
- """Processes a message for history"""
120
- # Skip messages that were tagged as history in previous runs
121
- if hasattr(message, "from_history") and message.from_history and skip_history_messages:
122
- return True
123
-
124
- # Skip messages with specified role
125
- if skip_role and message.role == skip_role:
126
- return True
127
- return False
128
-
129
- def get_messages_from_last_n_runs(
113
+ def get_messages(
130
114
  self,
131
- agent_id: Optional[str] = None,
132
115
  team_id: Optional[str] = None,
133
- last_n: Optional[int] = None,
134
- last_n_messages: Optional[int] = None,
135
- skip_role: Optional[str] = None,
136
- skip_status: Optional[List[RunStatus]] = None,
116
+ member_ids: Optional[List[str]] = None,
117
+ last_n_runs: Optional[int] = None,
118
+ limit: Optional[int] = None,
119
+ skip_roles: Optional[List[str]] = None,
120
+ skip_statuses: Optional[List[RunStatus]] = None,
137
121
  skip_history_messages: bool = True,
138
- member_runs: bool = False,
122
+ skip_member_messages: bool = True,
139
123
  ) -> List[Message]:
140
- """Returns the messages from the last_n runs, excluding previously tagged history messages.
141
- Args:
124
+ """Returns the messages belonging to the session that fit the given criteria.
142
125
 
143
- agent_id: The id of the agent to get the messages from.
126
+ Args:
144
127
  team_id: The id of the team to get the messages from.
145
- last_n: The number of runs to return from the end of the conversation. Defaults to all runs.
146
- last_n_messages: The number of messages to return from the end of the conversation. Defaults to all messages.
147
- skip_role: Skip messages with this role.
148
- skip_status: Skip messages with this status.
128
+ member_ids: The ids of the members to get the messages from.
129
+ last_n_runs: The number of runs to return messages from, counting from the latest. Defaults to all runs.
130
+ limit: The number of messages to return, counting from the latest. Defaults to all messages.
131
+ skip_roles: Skip messages with these roles.
132
+ skip_statuses: Skip messages with these statuses.
149
133
  skip_history_messages: Skip messages that were tagged as history in previous runs.
134
+ skip_member_messages: Skip messages created by members of the team.
135
+
150
136
  Returns:
151
- A list of Messages from the specified runs, excluding history messages.
137
+ A list of Messages belonging to the session.
152
138
  """
139
+
140
+ def _should_skip_message(
141
+ message: Message, skip_roles: Optional[List[str]] = None, skip_history_messages: bool = True
142
+ ) -> bool:
143
+ """Processes a message for history"""
144
+ # Skip messages that were tagged as history in previous runs
145
+ if hasattr(message, "from_history") and message.from_history and skip_history_messages:
146
+ return True
147
+
148
+ # Skip messages with specified role
149
+ if skip_roles and message.role in skip_roles:
150
+ return True
151
+ return False
152
+
153
+ if member_ids is not None and skip_member_messages:
154
+ log_debug("Member IDs to filter by were provided. The skip_member_messages flag will be ignored.")
155
+ skip_member_messages = False
156
+
153
157
  if not self.runs:
154
158
  return []
155
159
 
156
- if skip_status is None:
157
- skip_status = [RunStatus.paused, RunStatus.cancelled, RunStatus.error]
160
+ if skip_statuses is None:
161
+ skip_statuses = [RunStatus.paused, RunStatus.cancelled, RunStatus.error]
158
162
 
159
163
  session_runs = self.runs
160
164
 
161
- # Filter by agent_id and team_id
162
- if agent_id:
163
- session_runs = [run for run in session_runs if hasattr(run, "agent_id") and run.agent_id == agent_id] # type: ignore
165
+ # Filter by team_id and member_ids
164
166
  if team_id:
165
167
  session_runs = [run for run in session_runs if hasattr(run, "team_id") and run.team_id == team_id] # type: ignore
168
+ if member_ids:
169
+ session_runs = [run for run in session_runs if hasattr(run, "agent_id") and run.agent_id in member_ids] # type: ignore
166
170
 
167
- if not member_runs:
171
+ if skip_member_messages:
168
172
  # Filter for the top-level runs (main team runs or agent runs when sharing session)
169
173
  session_runs = [run for run in session_runs if run.parent_run_id is None] # type: ignore
174
+
170
175
  # Filter by status
171
- session_runs = [run for run in session_runs if hasattr(run, "status") and run.status not in skip_status] # type: ignore
176
+ session_runs = [run for run in session_runs if hasattr(run, "status") and run.status not in skip_statuses] # type: ignore
172
177
 
173
178
  messages_from_history = []
174
179
  system_message = None
175
180
 
176
- # Filter by last_n_messages
177
- if last_n_messages is not None:
181
+ # Limit the number of messages returned if limit is set
182
+ if limit is not None:
178
183
  for run_response in session_runs:
179
184
  if not run_response or not run_response.messages:
180
185
  continue
181
186
 
182
187
  for message in run_response.messages or []:
183
- if self._should_skip_message(message, skip_role, skip_history_messages):
188
+ if _should_skip_message(message, skip_roles, skip_history_messages):
184
189
  continue
185
190
 
186
191
  if message.role == "system":
@@ -192,24 +197,24 @@ class TeamSession:
192
197
 
193
198
  if system_message:
194
199
  messages_from_history = [system_message] + messages_from_history[
195
- -(last_n_messages - 1) :
200
+ -(limit - 1) :
196
201
  ] # Grab one less message then add the system message
197
202
  else:
198
- messages_from_history = messages_from_history[-last_n_messages:]
203
+ messages_from_history = messages_from_history[-limit:]
199
204
 
200
205
  # Remove tool result messages that don't have an associated assistant message with tool calls
201
206
  while len(messages_from_history) > 0 and messages_from_history[0].role == "tool":
202
207
  messages_from_history.pop(0)
203
208
  else:
204
209
  # Filter by last_n runs
205
- runs_to_process = session_runs[-last_n:] if last_n is not None else session_runs
210
+ runs_to_process = session_runs[-last_n_runs:] if last_n_runs is not None else session_runs
206
211
 
207
212
  for run_response in runs_to_process:
208
213
  if not (run_response and run_response.messages):
209
214
  continue
210
215
 
211
216
  for message in run_response.messages or []:
212
- if self._should_skip_message(message, skip_role, skip_history_messages):
217
+ if _should_skip_message(message, skip_roles, skip_history_messages):
213
218
  continue
214
219
 
215
220
  if message.role == "system":
@@ -223,6 +228,18 @@ class TeamSession:
223
228
  log_debug(f"Getting messages from previous runs: {len(messages_from_history)}")
224
229
  return messages_from_history
225
230
 
231
+ def get_chat_history(self, last_n_runs: Optional[int] = None) -> List[Message]:
232
+ """Return the chat history (user and assistant messages) for the session.
233
+ Use get_messages() for more filtering options.
234
+
235
+ Args:
236
+ last_n_runs: Number of recent runs to include. If None, all runs will be considered.
237
+
238
+ Returns:
239
+ A list of user and assistant Messages belonging to the session.
240
+ """
241
+ return self.get_messages(skip_roles=["system", "tool"], skip_member_messages=True, last_n_runs=last_n_runs)
242
+
226
243
  def get_tool_calls(self, num_calls: Optional[int] = None) -> List[Dict[str, Any]]:
227
244
  """Returns a list of tool calls from the messages"""
228
245
 
@@ -241,49 +258,6 @@ class TeamSession:
241
258
  return tool_calls
242
259
  return tool_calls
243
260
 
244
- def get_messages_for_session(
245
- self,
246
- user_role: str = "user",
247
- assistant_role: Optional[List[str]] = None,
248
- skip_history_messages: bool = True,
249
- ) -> List[Message]:
250
- """Returns a list of messages for the session that iterate through user message and assistant response."""
251
-
252
- if assistant_role is None:
253
- # TODO: Check if we still need CHATBOT as a role
254
- assistant_role = ["assistant", "model", "CHATBOT"]
255
-
256
- final_messages: List[Message] = []
257
- session_runs = self.runs
258
- if session_runs is None:
259
- return []
260
-
261
- for run_response in session_runs:
262
- if run_response and run_response.messages:
263
- user_message_from_run = None
264
- assistant_message_from_run = None
265
-
266
- # Start from the beginning to look for the user message
267
- for message in run_response.messages or []:
268
- if hasattr(message, "from_history") and message.from_history and skip_history_messages:
269
- continue
270
- if message.role == user_role:
271
- user_message_from_run = message
272
- break
273
-
274
- # Start from the end to look for the assistant response
275
- for message in run_response.messages[::-1]:
276
- if hasattr(message, "from_history") and message.from_history and skip_history_messages:
277
- continue
278
- if message.role in assistant_role:
279
- assistant_message_from_run = message
280
- break
281
-
282
- if user_message_from_run and assistant_message_from_run:
283
- final_messages.append(user_message_from_run)
284
- final_messages.append(assistant_message_from_run)
285
- return final_messages
286
-
287
261
  def get_team_history(self, num_runs: Optional[int] = None) -> List[Tuple[str, str]]:
288
262
  """Get team history as structured data (input, response pairs) -> This is the history of the team leader, not the members.
289
263
 
@@ -363,30 +337,3 @@ class TeamSession:
363
337
  return None
364
338
 
365
339
  return self.summary # type: ignore
366
-
367
- # Chat History functions
368
- def get_chat_history(
369
- self, skip_history_messages: bool = True, skip_roles: Optional[List[str]] = None
370
- ) -> List[Message]:
371
- """
372
- Get the chat history for the session.
373
- This is all messages across all runs for the team leader.
374
- """
375
-
376
- messages = []
377
- if self.runs is None:
378
- return []
379
-
380
- for run in self.runs or []:
381
- if run.parent_run_id is not None:
382
- continue
383
-
384
- if run.messages is not None:
385
- for msg in run.messages or []:
386
- if skip_history_messages and msg.from_history:
387
- continue
388
- if skip_roles and msg.role in skip_roles:
389
- continue
390
- messages.append(msg)
391
-
392
- return messages