agno 2.2.5__py3-none-any.whl → 2.2.7__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 (57) hide show
  1. agno/agent/agent.py +500 -423
  2. agno/api/os.py +1 -1
  3. agno/culture/manager.py +12 -8
  4. agno/guardrails/prompt_injection.py +1 -0
  5. agno/knowledge/chunking/agentic.py +6 -2
  6. agno/knowledge/embedder/vllm.py +262 -0
  7. agno/knowledge/knowledge.py +37 -5
  8. agno/memory/manager.py +9 -4
  9. agno/models/anthropic/claude.py +1 -2
  10. agno/models/azure/ai_foundry.py +31 -14
  11. agno/models/azure/openai_chat.py +12 -4
  12. agno/models/base.py +106 -65
  13. agno/models/cerebras/cerebras.py +11 -6
  14. agno/models/groq/groq.py +7 -4
  15. agno/models/meta/llama.py +12 -6
  16. agno/models/meta/llama_openai.py +5 -1
  17. agno/models/openai/chat.py +26 -17
  18. agno/models/openai/responses.py +11 -63
  19. agno/models/requesty/requesty.py +5 -2
  20. agno/models/utils.py +254 -8
  21. agno/models/vertexai/claude.py +9 -13
  22. agno/os/app.py +13 -12
  23. agno/os/routers/evals/evals.py +8 -8
  24. agno/os/routers/evals/utils.py +1 -0
  25. agno/os/schema.py +56 -38
  26. agno/os/utils.py +27 -0
  27. agno/run/__init__.py +6 -0
  28. agno/run/agent.py +5 -0
  29. agno/run/base.py +18 -1
  30. agno/run/team.py +13 -9
  31. agno/run/workflow.py +39 -0
  32. agno/session/summary.py +8 -2
  33. agno/session/workflow.py +4 -3
  34. agno/team/team.py +302 -369
  35. agno/tools/exa.py +21 -16
  36. agno/tools/file.py +153 -25
  37. agno/tools/function.py +98 -17
  38. agno/tools/mcp/mcp.py +8 -1
  39. agno/tools/notion.py +204 -0
  40. agno/utils/agent.py +78 -0
  41. agno/utils/events.py +2 -0
  42. agno/utils/hooks.py +1 -1
  43. agno/utils/models/claude.py +25 -8
  44. agno/utils/print_response/workflow.py +115 -16
  45. agno/vectordb/__init__.py +2 -1
  46. agno/vectordb/milvus/milvus.py +5 -0
  47. agno/vectordb/redis/__init__.py +5 -0
  48. agno/vectordb/redis/redisdb.py +687 -0
  49. agno/workflow/__init__.py +2 -0
  50. agno/workflow/agent.py +299 -0
  51. agno/workflow/step.py +13 -2
  52. agno/workflow/workflow.py +969 -72
  53. {agno-2.2.5.dist-info → agno-2.2.7.dist-info}/METADATA +10 -3
  54. {agno-2.2.5.dist-info → agno-2.2.7.dist-info}/RECORD +57 -52
  55. {agno-2.2.5.dist-info → agno-2.2.7.dist-info}/WHEEL +0 -0
  56. {agno-2.2.5.dist-info → agno-2.2.7.dist-info}/licenses/LICENSE +0 -0
  57. {agno-2.2.5.dist-info → agno-2.2.7.dist-info}/top_level.txt +0 -0
agno/team/team.py CHANGED
@@ -45,9 +45,10 @@ from agno.models.base import Model
45
45
  from agno.models.message import Message, MessageReferences
46
46
  from agno.models.metrics import Metrics
47
47
  from agno.models.response import ModelResponse, ModelResponseEvent
48
+ from agno.models.utils import get_model
48
49
  from agno.reasoning.step import NextAction, ReasoningStep, ReasoningSteps
50
+ from agno.run import RunContext, RunStatus
49
51
  from agno.run.agent import RunEvent, RunOutput, RunOutputEvent
50
- from agno.run.base import RunStatus
51
52
  from agno.run.cancel import (
52
53
  cancel_run as cancel_run_global,
53
54
  )
@@ -87,7 +88,9 @@ from agno.utils.agent import (
87
88
  scrub_media_from_run_output,
88
89
  scrub_tool_results_from_run_output,
89
90
  set_session_name_util,
91
+ store_media_util,
90
92
  update_session_state_util,
93
+ validate_media_object_id,
91
94
  wait_for_background_tasks,
92
95
  wait_for_background_tasks_stream,
93
96
  )
@@ -335,9 +338,9 @@ class Team:
335
338
 
336
339
  # --- Team Hooks ---
337
340
  # Functions called right after team session is loaded, before processing starts
338
- pre_hooks: Optional[Union[List[Callable[..., Any]], List[BaseGuardrail]]] = None
341
+ pre_hooks: Optional[List[Union[Callable[..., Any], BaseGuardrail]]] = None
339
342
  # Functions called after output is generated but before the response is returned
340
- post_hooks: Optional[Union[List[Callable[..., Any]], List[BaseGuardrail]]] = None
343
+ post_hooks: Optional[List[Union[Callable[..., Any], BaseGuardrail]]] = None
341
344
 
342
345
  # --- Structured output ---
343
346
  # Input schema for validating input
@@ -437,7 +440,7 @@ class Team:
437
440
  self,
438
441
  members: List[Union[Agent, "Team"]],
439
442
  id: Optional[str] = None,
440
- model: Optional[Model] = None,
443
+ model: Optional[Union[Model, str]] = None,
441
444
  name: Optional[str] = None,
442
445
  role: Optional[str] = None,
443
446
  respond_directly: bool = False,
@@ -494,13 +497,13 @@ class Team:
494
497
  tool_call_limit: Optional[int] = None,
495
498
  tool_choice: Optional[Union[str, Dict[str, Any]]] = None,
496
499
  tool_hooks: Optional[List[Callable]] = None,
497
- pre_hooks: Optional[Union[List[Callable[..., Any]], List[BaseGuardrail]]] = None,
498
- post_hooks: Optional[Union[List[Callable[..., Any]], List[BaseGuardrail]]] = None,
500
+ pre_hooks: Optional[List[Union[Callable[..., Any], BaseGuardrail]]] = None,
501
+ post_hooks: Optional[List[Union[Callable[..., Any], BaseGuardrail]]] = None,
499
502
  input_schema: Optional[Type[BaseModel]] = None,
500
503
  output_schema: Optional[Type[BaseModel]] = None,
501
- parser_model: Optional[Model] = None,
504
+ parser_model: Optional[Union[Model, str]] = None,
502
505
  parser_model_prompt: Optional[str] = None,
503
- output_model: Optional[Model] = None,
506
+ output_model: Optional[Union[Model, str]] = None,
504
507
  output_model_prompt: Optional[str] = None,
505
508
  use_json_mode: bool = False,
506
509
  parse_response: bool = True,
@@ -514,7 +517,7 @@ class Team:
514
517
  add_session_summary_to_context: Optional[bool] = None,
515
518
  metadata: Optional[Dict[str, Any]] = None,
516
519
  reasoning: bool = False,
517
- reasoning_model: Optional[Model] = None,
520
+ reasoning_model: Optional[Union[Model, str]] = None,
518
521
  reasoning_agent: Optional[Agent] = None,
519
522
  reasoning_min_steps: int = 1,
520
523
  reasoning_max_steps: int = 10,
@@ -535,7 +538,7 @@ class Team:
535
538
  ):
536
539
  self.members = members
537
540
 
538
- self.model = model
541
+ self.model = model # type: ignore[assignment]
539
542
 
540
543
  self.name = name
541
544
  self.id = id
@@ -618,9 +621,9 @@ class Team:
618
621
 
619
622
  self.input_schema = input_schema
620
623
  self.output_schema = output_schema
621
- self.parser_model = parser_model
624
+ self.parser_model = parser_model # type: ignore[assignment]
622
625
  self.parser_model_prompt = parser_model_prompt
623
- self.output_model = output_model
626
+ self.output_model = output_model # type: ignore[assignment]
624
627
  self.output_model_prompt = output_model_prompt
625
628
  self.use_json_mode = use_json_mode
626
629
  self.parse_response = parse_response
@@ -637,7 +640,7 @@ class Team:
637
640
  self.metadata = metadata
638
641
 
639
642
  self.reasoning = reasoning
640
- self.reasoning_model = reasoning_model
643
+ self.reasoning_model = reasoning_model # type: ignore[assignment]
641
644
  self.reasoning_agent = reasoning_agent
642
645
  self.reasoning_min_steps = reasoning_min_steps
643
646
  self.reasoning_max_steps = reasoning_max_steps
@@ -694,6 +697,8 @@ class Team:
694
697
  # Lazy-initialized shared thread pool executor for background tasks (memory, cultural knowledge, etc.)
695
698
  self._background_executor: Optional[Any] = None
696
699
 
700
+ self._resolve_models()
701
+
697
702
  @property
698
703
  def background_executor(self) -> Any:
699
704
  """Lazy initialization of shared thread pool executor for background tasks.
@@ -902,6 +907,17 @@ class Team:
902
907
  """Return True if the db the team is equipped with is an Async implementation"""
903
908
  return self.db is not None and isinstance(self.db, AsyncBaseDb)
904
909
 
910
+ def _resolve_models(self) -> None:
911
+ """Resolve model strings to Model instances."""
912
+ if self.model is not None:
913
+ self.model = get_model(self.model)
914
+ if self.reasoning_model is not None:
915
+ self.reasoning_model = get_model(self.reasoning_model)
916
+ if self.parser_model is not None:
917
+ self.parser_model = get_model(self.parser_model)
918
+ if self.output_model is not None:
919
+ self.output_model = get_model(self.output_model)
920
+
905
921
  def initialize_team(self, debug_mode: Optional[bool] = None) -> None:
906
922
  # Make sure for the team, we are using the team logger
907
923
  use_team_logger()
@@ -976,9 +992,7 @@ class Team:
976
992
  run_response: TeamRunOutput,
977
993
  run_input: TeamRunInput,
978
994
  session: TeamSession,
979
- session_state: Optional[Dict[str, Any]] = None,
980
- dependencies: Optional[Dict[str, Any]] = None,
981
- metadata: Optional[Dict[str, Any]] = None,
995
+ run_context: RunContext,
982
996
  user_id: Optional[str] = None,
983
997
  debug_mode: Optional[bool] = None,
984
998
  **kwargs: Any,
@@ -990,12 +1004,13 @@ class Team:
990
1004
  # Prepare all possible arguments once
991
1005
  all_args = {
992
1006
  "run_input": run_input,
1007
+ "run_context": run_context,
993
1008
  "team": self,
994
1009
  "session": session,
995
1010
  "user_id": user_id,
996
- "metadata": metadata,
997
- "session_state": session_state,
998
- "dependencies": dependencies,
1011
+ "metadata": run_context.metadata,
1012
+ "session_state": run_context.session_state,
1013
+ "dependencies": run_context.dependencies,
999
1014
  "debug_mode": debug_mode or self.debug_mode,
1000
1015
  }
1001
1016
  all_args.update(kwargs)
@@ -1042,9 +1057,7 @@ class Team:
1042
1057
  run_response: TeamRunOutput,
1043
1058
  run_input: TeamRunInput,
1044
1059
  session: TeamSession,
1045
- session_state: Optional[Dict[str, Any]] = None,
1046
- dependencies: Optional[Dict[str, Any]] = None,
1047
- metadata: Optional[Dict[str, Any]] = None,
1060
+ run_context: RunContext,
1048
1061
  user_id: Optional[str] = None,
1049
1062
  debug_mode: Optional[bool] = None,
1050
1063
  **kwargs: Any,
@@ -1056,12 +1069,13 @@ class Team:
1056
1069
  # Prepare all possible arguments once
1057
1070
  all_args = {
1058
1071
  "run_input": run_input,
1072
+ "run_context": run_context,
1059
1073
  "team": self,
1060
1074
  "session": session,
1061
1075
  "user_id": user_id,
1062
- "session_state": session_state,
1063
- "dependencies": dependencies,
1064
- "metadata": metadata,
1076
+ "session_state": run_context.session_state,
1077
+ "dependencies": run_context.dependencies,
1078
+ "metadata": run_context.metadata,
1065
1079
  "debug_mode": debug_mode or self.debug_mode,
1066
1080
  }
1067
1081
  all_args.update(kwargs)
@@ -1113,9 +1127,7 @@ class Team:
1113
1127
  hooks: Optional[List[Callable[..., Any]]],
1114
1128
  run_output: TeamRunOutput,
1115
1129
  session: TeamSession,
1116
- session_state: Optional[Dict[str, Any]] = None,
1117
- dependencies: Optional[Dict[str, Any]] = None,
1118
- metadata: Optional[Dict[str, Any]] = None,
1130
+ run_context: RunContext,
1119
1131
  user_id: Optional[str] = None,
1120
1132
  debug_mode: Optional[bool] = None,
1121
1133
  **kwargs: Any,
@@ -1127,12 +1139,13 @@ class Team:
1127
1139
  # Prepare all possible arguments once
1128
1140
  all_args = {
1129
1141
  "run_output": run_output,
1142
+ "run_context": run_context,
1130
1143
  "team": self,
1131
1144
  "session": session,
1132
1145
  "user_id": user_id,
1133
- "session_state": session_state,
1134
- "dependencies": dependencies,
1135
- "metadata": metadata,
1146
+ "session_state": run_context.session_state,
1147
+ "dependencies": run_context.dependencies,
1148
+ "metadata": run_context.metadata,
1136
1149
  "debug_mode": debug_mode or self.debug_mode,
1137
1150
  }
1138
1151
  all_args.update(kwargs)
@@ -1174,10 +1187,8 @@ class Team:
1174
1187
  hooks: Optional[List[Callable[..., Any]]],
1175
1188
  run_output: TeamRunOutput,
1176
1189
  session: TeamSession,
1190
+ run_context: RunContext,
1177
1191
  user_id: Optional[str] = None,
1178
- session_state: Optional[Dict[str, Any]] = None,
1179
- dependencies: Optional[Dict[str, Any]] = None,
1180
- metadata: Optional[Dict[str, Any]] = None,
1181
1192
  debug_mode: Optional[bool] = None,
1182
1193
  **kwargs: Any,
1183
1194
  ) -> AsyncIterator[TeamRunOutputEvent]:
@@ -1188,12 +1199,13 @@ class Team:
1188
1199
  # Prepare all possible arguments once
1189
1200
  all_args = {
1190
1201
  "run_output": run_output,
1202
+ "run_context": run_context,
1191
1203
  "team": self,
1192
1204
  "session": session,
1193
1205
  "user_id": user_id,
1194
- "session_state": session_state,
1195
- "dependencies": dependencies,
1196
- "metadata": metadata,
1206
+ "session_state": run_context.session_state,
1207
+ "dependencies": run_context.dependencies,
1208
+ "metadata": run_context.metadata,
1197
1209
  "debug_mode": debug_mode or self.debug_mode,
1198
1210
  }
1199
1211
  all_args.update(kwargs)
@@ -1238,15 +1250,12 @@ class Team:
1238
1250
  self,
1239
1251
  run_response: TeamRunOutput,
1240
1252
  session: TeamSession,
1241
- session_state: Dict[str, Any],
1253
+ run_context: RunContext,
1242
1254
  user_id: Optional[str] = None,
1243
- knowledge_filters: Optional[Dict[str, Any]] = None,
1244
1255
  add_history_to_context: Optional[bool] = None,
1245
1256
  add_dependencies_to_context: Optional[bool] = None,
1246
1257
  add_session_state_to_context: Optional[bool] = None,
1247
- metadata: Optional[Dict[str, Any]] = None,
1248
1258
  response_format: Optional[Union[Dict, Type[BaseModel]]] = None,
1249
- dependencies: Optional[Dict[str, Any]] = None,
1250
1259
  debug_mode: Optional[bool] = None,
1251
1260
  **kwargs: Any,
1252
1261
  ) -> TeamRunOutput:
@@ -1280,10 +1289,8 @@ class Team:
1280
1289
  hooks=self.pre_hooks, # type: ignore
1281
1290
  run_response=run_response,
1282
1291
  run_input=run_input,
1292
+ run_context=run_context,
1283
1293
  session=session,
1284
- session_state=session_state,
1285
- dependencies=dependencies,
1286
- metadata=metadata,
1287
1294
  user_id=user_id,
1288
1295
  debug_mode=debug_mode,
1289
1296
  **kwargs,
@@ -1298,12 +1305,11 @@ class Team:
1298
1305
  _tools = self._determine_tools_for_model(
1299
1306
  model=self.model,
1300
1307
  run_response=run_response,
1308
+ run_context=run_context,
1301
1309
  team_run_context=team_run_context,
1302
1310
  session=session,
1303
- session_state=session_state,
1304
1311
  user_id=user_id,
1305
1312
  async_mode=False,
1306
- knowledge_filters=knowledge_filters,
1307
1313
  input_message=run_input.input_content,
1308
1314
  images=run_input.images,
1309
1315
  videos=run_input.videos,
@@ -1312,28 +1318,23 @@ class Team:
1312
1318
  debug_mode=debug_mode,
1313
1319
  add_history_to_context=add_history_to_context,
1314
1320
  add_session_state_to_context=add_session_state_to_context,
1315
- dependencies=dependencies,
1316
1321
  add_dependencies_to_context=add_dependencies_to_context,
1317
- metadata=metadata,
1318
1322
  )
1319
1323
 
1320
1324
  # 3. Prepare run messages
1321
1325
  run_messages: RunMessages = self._get_run_messages(
1322
1326
  run_response=run_response,
1323
1327
  session=session,
1324
- session_state=session_state,
1328
+ run_context=run_context,
1325
1329
  user_id=user_id,
1326
1330
  input_message=run_input.input_content,
1327
1331
  audio=run_input.audios,
1328
1332
  images=run_input.images,
1329
1333
  videos=run_input.videos,
1330
1334
  files=run_input.files,
1331
- knowledge_filters=knowledge_filters,
1332
1335
  add_history_to_context=add_history_to_context,
1333
- dependencies=dependencies,
1334
1336
  add_dependencies_to_context=add_dependencies_to_context,
1335
1337
  add_session_state_to_context=add_session_state_to_context,
1336
- metadata=metadata,
1337
1338
  tools=_tools,
1338
1339
  **kwargs,
1339
1340
  )
@@ -1386,7 +1387,7 @@ class Team:
1386
1387
 
1387
1388
  # 8. Store media if enabled
1388
1389
  if self.store_media:
1389
- self._store_media(run_response, model_response)
1390
+ store_media_util(run_response, model_response)
1390
1391
 
1391
1392
  # 9. Convert response to structured format
1392
1393
  self._convert_response_to_structured_format(run_response=run_response)
@@ -1396,10 +1397,8 @@ class Team:
1396
1397
  iterator = self._execute_post_hooks(
1397
1398
  hooks=self.post_hooks, # type: ignore
1398
1399
  run_output=run_response,
1400
+ run_context=run_context,
1399
1401
  session=session,
1400
- session_state=session_state,
1401
- dependencies=dependencies,
1402
- metadata=metadata,
1403
1402
  user_id=user_id,
1404
1403
  debug_mode=debug_mode,
1405
1404
  **kwargs,
@@ -1451,15 +1450,12 @@ class Team:
1451
1450
  def _run_stream(
1452
1451
  self,
1453
1452
  run_response: TeamRunOutput,
1453
+ run_context: RunContext,
1454
1454
  session: TeamSession,
1455
- session_state: Dict[str, Any],
1456
1455
  user_id: Optional[str] = None,
1457
- knowledge_filters: Optional[Dict[str, Any]] = None,
1458
1456
  add_history_to_context: Optional[bool] = None,
1459
1457
  add_dependencies_to_context: Optional[bool] = None,
1460
1458
  add_session_state_to_context: Optional[bool] = None,
1461
- metadata: Optional[Dict[str, Any]] = None,
1462
- dependencies: Optional[Dict[str, Any]] = None,
1463
1459
  response_format: Optional[Union[Dict, Type[BaseModel]]] = None,
1464
1460
  stream_events: bool = False,
1465
1461
  yield_run_response: bool = False,
@@ -1491,11 +1487,9 @@ class Team:
1491
1487
  pre_hook_iterator = self._execute_pre_hooks(
1492
1488
  hooks=self.pre_hooks, # type: ignore
1493
1489
  run_response=run_response,
1490
+ run_context=run_context,
1494
1491
  run_input=run_input,
1495
1492
  session=session,
1496
- session_state=session_state,
1497
- dependencies=dependencies,
1498
- metadata=metadata,
1499
1493
  user_id=user_id,
1500
1494
  debug_mode=debug_mode,
1501
1495
  **kwargs,
@@ -1510,12 +1504,11 @@ class Team:
1510
1504
  _tools = self._determine_tools_for_model(
1511
1505
  model=self.model,
1512
1506
  run_response=run_response,
1507
+ run_context=run_context,
1513
1508
  team_run_context=team_run_context,
1514
1509
  session=session,
1515
- session_state=session_state,
1516
1510
  user_id=user_id,
1517
1511
  async_mode=False,
1518
- knowledge_filters=knowledge_filters,
1519
1512
  input_message=run_input.input_content,
1520
1513
  images=run_input.images,
1521
1514
  videos=run_input.videos,
@@ -1524,28 +1517,23 @@ class Team:
1524
1517
  debug_mode=debug_mode,
1525
1518
  add_history_to_context=add_history_to_context,
1526
1519
  add_session_state_to_context=add_session_state_to_context,
1527
- dependencies=dependencies,
1528
1520
  add_dependencies_to_context=add_dependencies_to_context,
1529
- metadata=metadata,
1530
1521
  )
1531
1522
 
1532
1523
  # 3. Prepare run messages
1533
1524
  run_messages: RunMessages = self._get_run_messages(
1534
1525
  run_response=run_response,
1526
+ run_context=run_context,
1535
1527
  session=session,
1536
- session_state=session_state,
1537
1528
  user_id=user_id,
1538
1529
  input_message=run_input.input_content,
1539
1530
  audio=run_input.audios,
1540
1531
  images=run_input.images,
1541
1532
  videos=run_input.videos,
1542
1533
  files=run_input.files,
1543
- knowledge_filters=knowledge_filters,
1544
1534
  add_history_to_context=add_history_to_context,
1545
- dependencies=dependencies,
1546
1535
  add_dependencies_to_context=add_dependencies_to_context,
1547
1536
  add_session_state_to_context=add_session_state_to_context,
1548
- metadata=metadata,
1549
1537
  tools=_tools,
1550
1538
  **kwargs,
1551
1539
  )
@@ -1593,6 +1581,7 @@ class Team:
1593
1581
  tools=_tools,
1594
1582
  response_format=response_format,
1595
1583
  stream_events=stream_events,
1584
+ session_state=run_context.session_state,
1596
1585
  ):
1597
1586
  raise_if_cancelled(run_response.run_id) # type: ignore
1598
1587
  yield event
@@ -1604,6 +1593,7 @@ class Team:
1604
1593
  tools=_tools,
1605
1594
  response_format=response_format,
1606
1595
  stream_events=stream_events,
1596
+ session_state=run_context.session_state,
1607
1597
  ):
1608
1598
  raise_if_cancelled(run_response.run_id) # type: ignore
1609
1599
  from agno.run.team import IntermediateRunContentEvent, RunContentEvent
@@ -1647,9 +1637,7 @@ class Team:
1647
1637
  yield from self._execute_post_hooks(
1648
1638
  hooks=self.post_hooks, # type: ignore
1649
1639
  run_output=run_response,
1650
- session_state=session_state,
1651
- dependencies=dependencies,
1652
- metadata=metadata,
1640
+ run_context=run_context,
1653
1641
  session=session,
1654
1642
  user_id=user_id,
1655
1643
  debug_mode=debug_mode,
@@ -1840,14 +1828,14 @@ class Team:
1840
1828
  # Normalise hook & guardails
1841
1829
  if not self._hooks_normalised:
1842
1830
  if self.pre_hooks:
1843
- self.pre_hooks = normalize_hooks(self.pre_hooks)
1831
+ self.pre_hooks = normalize_hooks(self.pre_hooks) # type: ignore
1844
1832
  if self.post_hooks:
1845
- self.post_hooks = normalize_hooks(self.post_hooks)
1833
+ self.post_hooks = normalize_hooks(self.post_hooks) # type: ignore
1846
1834
  self._hooks_normalised = True
1847
1835
 
1848
1836
  session_id, user_id = self._initialize_session(session_id=session_id, user_id=user_id)
1849
1837
 
1850
- image_artifacts, video_artifacts, audio_artifacts, file_artifacts = self._validate_media_object_id(
1838
+ image_artifacts, video_artifacts, audio_artifacts, file_artifacts = validate_media_object_id(
1851
1839
  images=images, videos=videos, audios=audio, files=files
1852
1840
  )
1853
1841
 
@@ -1872,11 +1860,20 @@ class Team:
1872
1860
  session_state = self._load_session_state(session=team_session, session_state=session_state)
1873
1861
 
1874
1862
  # Determine runtime dependencies
1875
- run_dependencies = dependencies if dependencies is not None else self.dependencies
1863
+ dependencies = dependencies if dependencies is not None else self.dependencies
1864
+
1865
+ # Initialize run context
1866
+ run_context = RunContext(
1867
+ run_id=run_id,
1868
+ session_id=session_id,
1869
+ user_id=user_id,
1870
+ session_state=session_state,
1871
+ dependencies=dependencies,
1872
+ )
1876
1873
 
1877
1874
  # Resolve callable dependencies if present
1878
- if run_dependencies is not None:
1879
- self._resolve_run_dependencies(run_dependencies)
1875
+ if run_context.dependencies is not None:
1876
+ self._resolve_run_dependencies(run_context=run_context)
1880
1877
 
1881
1878
  # Determine runtime context parameters
1882
1879
  add_dependencies = (
@@ -1889,12 +1886,9 @@ class Team:
1889
1886
  )
1890
1887
  add_history = add_history_to_context if add_history_to_context is not None else self.add_history_to_context
1891
1888
 
1892
- # Initialize Knowledge Filters
1893
- effective_filters = knowledge_filters
1894
-
1895
1889
  # When filters are passed manually
1896
1890
  if self.knowledge_filters or knowledge_filters:
1897
- effective_filters = self._get_effective_filters(knowledge_filters)
1891
+ run_context.knowledge_filters = self._get_effective_filters(knowledge_filters)
1898
1892
 
1899
1893
  # Use stream override value when necessary
1900
1894
  if stream is None:
@@ -1925,13 +1919,18 @@ class Team:
1925
1919
  else:
1926
1920
  merge_dictionaries(metadata, self.metadata)
1927
1921
 
1922
+ if metadata:
1923
+ run_context.metadata = metadata
1924
+
1928
1925
  # Create a new run_response for this attempt
1929
1926
  run_response = TeamRunOutput(
1930
1927
  run_id=run_id,
1931
1928
  session_id=session_id,
1929
+ user_id=user_id,
1932
1930
  team_id=self.id,
1933
1931
  team_name=self.name,
1934
- metadata=metadata,
1932
+ metadata=run_context.metadata,
1933
+ session_state=run_context.session_state,
1935
1934
  input=run_input,
1936
1935
  )
1937
1936
 
@@ -1957,15 +1956,12 @@ class Team:
1957
1956
  if stream:
1958
1957
  response_iterator = self._run_stream(
1959
1958
  run_response=run_response,
1959
+ run_context=run_context,
1960
1960
  session=team_session,
1961
- session_state=session_state,
1962
1961
  user_id=user_id,
1963
- knowledge_filters=effective_filters,
1964
1962
  add_history_to_context=add_history,
1965
1963
  add_dependencies_to_context=add_dependencies,
1966
1964
  add_session_state_to_context=add_session_state,
1967
- metadata=metadata,
1968
- dependencies=run_dependencies,
1969
1965
  response_format=response_format,
1970
1966
  stream_events=stream_events,
1971
1967
  yield_run_response=yield_run_response,
@@ -1977,15 +1973,12 @@ class Team:
1977
1973
  else:
1978
1974
  return self._run(
1979
1975
  run_response=run_response,
1976
+ run_context=run_context,
1980
1977
  session=team_session,
1981
- session_state=session_state,
1982
1978
  user_id=user_id,
1983
- knowledge_filters=effective_filters,
1984
1979
  add_history_to_context=add_history,
1985
1980
  add_dependencies_to_context=add_dependencies,
1986
1981
  add_session_state_to_context=add_session_state,
1987
- metadata=metadata,
1988
- dependencies=run_dependencies,
1989
1982
  response_format=response_format,
1990
1983
  debug_mode=debug_mode,
1991
1984
  **kwargs,
@@ -2037,17 +2030,14 @@ class Team:
2037
2030
  async def _arun(
2038
2031
  self,
2039
2032
  run_response: TeamRunOutput,
2033
+ run_context: RunContext,
2040
2034
  session_id: str,
2041
- session_state: Optional[Dict[str, Any]] = None,
2042
2035
  user_id: Optional[str] = None,
2043
2036
  response_format: Optional[Union[Dict, Type[BaseModel]]] = None,
2044
2037
  add_dependencies_to_context: Optional[bool] = None,
2045
2038
  add_session_state_to_context: Optional[bool] = None,
2046
2039
  add_history_to_context: Optional[bool] = None,
2047
- knowledge_filters: Optional[Dict[str, Any]] = None,
2048
- metadata: Optional[Dict[str, Any]] = None,
2049
2040
  debug_mode: Optional[bool] = None,
2050
- dependencies: Optional[Dict[str, Any]] = None,
2051
2041
  **kwargs: Any,
2052
2042
  ) -> TeamRunOutput:
2053
2043
  """Run the Team and return the response.
@@ -2073,8 +2063,8 @@ class Team:
2073
2063
 
2074
2064
  register_run(run_response.run_id) # type: ignore
2075
2065
 
2076
- if dependencies is not None:
2077
- await self._aresolve_run_dependencies(dependencies=dependencies)
2066
+ if run_context.dependencies is not None:
2067
+ await self._aresolve_run_dependencies(run_context=run_context)
2078
2068
 
2079
2069
  # 1. Read or create session. Reads from the database if provided.
2080
2070
  if self._has_async_db():
@@ -2085,11 +2075,17 @@ class Team:
2085
2075
  # 2. Update metadata and session state
2086
2076
  self._update_metadata(session=team_session)
2087
2077
  # Initialize session state
2088
- session_state = self._initialize_session_state(
2089
- session_state=session_state or {}, user_id=user_id, session_id=session_id, run_id=run_response.run_id
2078
+ run_context.session_state = self._initialize_session_state(
2079
+ session_state=run_context.session_state or {},
2080
+ user_id=user_id,
2081
+ session_id=session_id,
2082
+ run_id=run_response.run_id,
2090
2083
  )
2091
2084
  # Update session state from DB
2092
- session_state = self._load_session_state(session=team_session, session_state=session_state) # type: ignore
2085
+ if run_context.session_state is not None:
2086
+ run_context.session_state = self._load_session_state(
2087
+ session=team_session, session_state=run_context.session_state
2088
+ )
2093
2089
 
2094
2090
  run_input = cast(TeamRunInput, run_response.input)
2095
2091
 
@@ -2098,13 +2094,11 @@ class Team:
2098
2094
  pre_hook_iterator = self._aexecute_pre_hooks(
2099
2095
  hooks=self.pre_hooks, # type: ignore
2100
2096
  run_response=run_response,
2097
+ run_context=run_context,
2101
2098
  run_input=run_input,
2102
2099
  session=team_session,
2103
2100
  user_id=user_id,
2104
2101
  debug_mode=debug_mode,
2105
- session_state=session_state,
2106
- dependencies=dependencies,
2107
- metadata=metadata,
2108
2102
  **kwargs,
2109
2103
  )
2110
2104
 
@@ -2119,12 +2113,11 @@ class Team:
2119
2113
  _tools = self._determine_tools_for_model(
2120
2114
  model=self.model,
2121
2115
  run_response=run_response,
2116
+ run_context=run_context,
2122
2117
  team_run_context=team_run_context,
2123
2118
  session=team_session,
2124
- session_state=session_state,
2125
2119
  user_id=user_id,
2126
2120
  async_mode=True,
2127
- knowledge_filters=knowledge_filters,
2128
2121
  input_message=run_input.input_content,
2129
2122
  images=run_input.images,
2130
2123
  videos=run_input.videos,
@@ -2134,27 +2127,22 @@ class Team:
2134
2127
  add_history_to_context=add_history_to_context,
2135
2128
  add_dependencies_to_context=add_dependencies_to_context,
2136
2129
  add_session_state_to_context=add_session_state_to_context,
2137
- dependencies=dependencies,
2138
- metadata=metadata,
2139
2130
  )
2140
2131
 
2141
2132
  # 5. Prepare run messages
2142
2133
  run_messages = await self._aget_run_messages(
2143
2134
  run_response=run_response,
2135
+ run_context=run_context,
2144
2136
  session=team_session, # type: ignore
2145
- session_state=session_state,
2146
2137
  user_id=user_id,
2147
2138
  input_message=run_input.input_content,
2148
2139
  audio=run_input.audios,
2149
2140
  images=run_input.images,
2150
2141
  videos=run_input.videos,
2151
2142
  files=run_input.files,
2152
- knowledge_filters=knowledge_filters,
2153
2143
  add_history_to_context=add_history_to_context,
2154
- dependencies=dependencies,
2155
2144
  add_dependencies_to_context=add_dependencies_to_context,
2156
2145
  add_session_state_to_context=add_session_state_to_context,
2157
- metadata=metadata,
2158
2146
  tools=_tools,
2159
2147
  **kwargs,
2160
2148
  )
@@ -2187,6 +2175,7 @@ class Team:
2187
2175
  tool_call_limit=self.tool_call_limit,
2188
2176
  response_format=response_format,
2189
2177
  send_media_to_model=self.send_media_to_model,
2178
+ run_response=run_response,
2190
2179
  ) # type: ignore
2191
2180
 
2192
2181
  # Check for cancellation after model call
@@ -2205,7 +2194,7 @@ class Team:
2205
2194
 
2206
2195
  # 10. Store media if enabled
2207
2196
  if self.store_media:
2208
- self._store_media(run_response, model_response)
2197
+ store_media_util(run_response, model_response)
2209
2198
 
2210
2199
  # 11. Convert response to structured format
2211
2200
  self._convert_response_to_structured_format(run_response=run_response)
@@ -2215,10 +2204,8 @@ class Team:
2215
2204
  async for _ in self._aexecute_post_hooks(
2216
2205
  hooks=self.post_hooks, # type: ignore
2217
2206
  run_output=run_response,
2207
+ run_context=run_context,
2218
2208
  session=team_session,
2219
- session_state=session_state,
2220
- dependencies=dependencies,
2221
- metadata=metadata,
2222
2209
  user_id=user_id,
2223
2210
  debug_mode=debug_mode,
2224
2211
  **kwargs,
@@ -2277,8 +2264,8 @@ class Team:
2277
2264
  async def _arun_stream(
2278
2265
  self,
2279
2266
  run_response: TeamRunOutput,
2267
+ run_context: RunContext,
2280
2268
  session_id: str,
2281
- session_state: Optional[Dict[str, Any]] = None,
2282
2269
  user_id: Optional[str] = None,
2283
2270
  response_format: Optional[Union[Dict, Type[BaseModel]]] = None,
2284
2271
  stream_events: bool = False,
@@ -2287,10 +2274,7 @@ class Team:
2287
2274
  add_dependencies_to_context: Optional[bool] = None,
2288
2275
  add_session_state_to_context: Optional[bool] = None,
2289
2276
  add_history_to_context: Optional[bool] = None,
2290
- knowledge_filters: Optional[Dict[str, Any]] = None,
2291
- metadata: Optional[Dict[str, Any]] = None,
2292
2277
  debug_mode: Optional[bool] = None,
2293
- dependencies: Optional[Dict[str, Any]] = None,
2294
2278
  **kwargs: Any,
2295
2279
  ) -> AsyncIterator[Union[TeamRunOutputEvent, RunOutputEvent, TeamRunOutput]]:
2296
2280
  """Run the Team and return the response.
@@ -2312,8 +2296,8 @@ class Team:
2312
2296
  """
2313
2297
 
2314
2298
  # 1. Resolve dependencies
2315
- if dependencies is not None:
2316
- await self._aresolve_run_dependencies(dependencies=dependencies)
2299
+ if run_context.dependencies is not None:
2300
+ await self._aresolve_run_dependencies(run_context=run_context)
2317
2301
 
2318
2302
  # 2. Read or create session. Reads from the database if provided.
2319
2303
  if self._has_async_db():
@@ -2324,11 +2308,17 @@ class Team:
2324
2308
  # 3. Update metadata and session state
2325
2309
  self._update_metadata(session=team_session)
2326
2310
  # Initialize session state
2327
- session_state = self._initialize_session_state(
2328
- session_state=session_state or {}, user_id=user_id, session_id=session_id, run_id=run_response.run_id
2311
+ run_context.session_state = self._initialize_session_state(
2312
+ session_state=run_context.session_state or {},
2313
+ user_id=user_id,
2314
+ session_id=session_id,
2315
+ run_id=run_response.run_id,
2329
2316
  )
2330
2317
  # Update session state from DB
2331
- session_state = self._load_session_state(session=team_session, session_state=session_state) # type: ignore
2318
+ if run_context.session_state is not None:
2319
+ run_context.session_state = self._load_session_state(
2320
+ session=team_session, session_state=run_context.session_state
2321
+ ) # type: ignore
2332
2322
 
2333
2323
  # 4. Execute pre-hooks
2334
2324
  run_input = cast(TeamRunInput, run_response.input)
@@ -2337,13 +2327,11 @@ class Team:
2337
2327
  pre_hook_iterator = self._aexecute_pre_hooks(
2338
2328
  hooks=self.pre_hooks, # type: ignore
2339
2329
  run_response=run_response,
2330
+ run_context=run_context,
2340
2331
  run_input=run_input,
2341
2332
  session=team_session,
2342
2333
  user_id=user_id,
2343
2334
  debug_mode=debug_mode,
2344
- session_state=session_state,
2345
- dependencies=dependencies,
2346
- metadata=metadata,
2347
2335
  **kwargs,
2348
2336
  )
2349
2337
  async for pre_hook_event in pre_hook_iterator:
@@ -2356,12 +2344,11 @@ class Team:
2356
2344
  _tools = self._determine_tools_for_model(
2357
2345
  model=self.model,
2358
2346
  run_response=run_response,
2347
+ run_context=run_context,
2359
2348
  team_run_context=team_run_context,
2360
2349
  session=team_session, # type: ignore
2361
- session_state=session_state,
2362
2350
  user_id=user_id,
2363
2351
  async_mode=True,
2364
- knowledge_filters=knowledge_filters,
2365
2352
  input_message=run_input.input_content,
2366
2353
  images=run_input.images,
2367
2354
  videos=run_input.videos,
@@ -2369,27 +2356,22 @@ class Team:
2369
2356
  files=run_input.files,
2370
2357
  debug_mode=debug_mode,
2371
2358
  add_history_to_context=add_history_to_context,
2372
- dependencies=dependencies,
2373
- metadata=metadata,
2374
2359
  )
2375
2360
 
2376
2361
  # 6. Prepare run messages
2377
2362
  run_messages = await self._aget_run_messages(
2378
2363
  run_response=run_response,
2364
+ run_context=run_context,
2379
2365
  session=team_session, # type: ignore
2380
- session_state=session_state,
2381
2366
  user_id=user_id,
2382
2367
  input_message=run_input.input_content,
2383
2368
  audio=run_input.audios,
2384
2369
  images=run_input.images,
2385
2370
  videos=run_input.videos,
2386
2371
  files=run_input.files,
2387
- knowledge_filters=knowledge_filters,
2388
2372
  add_history_to_context=add_history_to_context,
2389
- dependencies=dependencies,
2390
2373
  add_dependencies_to_context=add_dependencies_to_context,
2391
2374
  add_session_state_to_context=add_session_state_to_context,
2392
- metadata=metadata,
2393
2375
  tools=_tools,
2394
2376
  **kwargs,
2395
2377
  )
@@ -2439,6 +2421,7 @@ class Team:
2439
2421
  tools=_tools,
2440
2422
  response_format=response_format,
2441
2423
  stream_events=stream_events,
2424
+ session_state=run_context.session_state,
2442
2425
  ):
2443
2426
  raise_if_cancelled(run_response.run_id) # type: ignore
2444
2427
  yield event
@@ -2450,6 +2433,7 @@ class Team:
2450
2433
  tools=_tools,
2451
2434
  response_format=response_format,
2452
2435
  stream_events=stream_events,
2436
+ session_state=run_context.session_state,
2453
2437
  ):
2454
2438
  raise_if_cancelled(run_response.run_id) # type: ignore
2455
2439
  from agno.run.team import IntermediateRunContentEvent, RunContentEvent
@@ -2495,9 +2479,7 @@ class Team:
2495
2479
  async for event in self._aexecute_post_hooks(
2496
2480
  hooks=self.post_hooks, # type: ignore
2497
2481
  run_output=run_response,
2498
- session_state=session_state,
2499
- dependencies=dependencies,
2500
- metadata=metadata,
2482
+ run_context=run_context,
2501
2483
  session=team_session,
2502
2484
  user_id=user_id,
2503
2485
  debug_mode=debug_mode,
@@ -2694,9 +2676,9 @@ class Team:
2694
2676
  # Normalise hook & guardails
2695
2677
  if not self._hooks_normalised:
2696
2678
  if self.pre_hooks:
2697
- self.pre_hooks = normalize_hooks(self.pre_hooks, async_mode=True)
2679
+ self.pre_hooks = normalize_hooks(self.pre_hooks, async_mode=True) # type: ignore
2698
2680
  if self.post_hooks:
2699
- self.post_hooks = normalize_hooks(self.post_hooks, async_mode=True)
2681
+ self.post_hooks = normalize_hooks(self.post_hooks, async_mode=True) # type: ignore
2700
2682
  self._hooks_normalised = True
2701
2683
 
2702
2684
  session_id, user_id = self._initialize_session(session_id=session_id, user_id=user_id)
@@ -2704,12 +2686,12 @@ class Team:
2704
2686
  # Initialize Team
2705
2687
  self.initialize_team(debug_mode=debug_mode)
2706
2688
 
2707
- image_artifacts, video_artifacts, audio_artifacts, file_artifacts = self._validate_media_object_id(
2689
+ image_artifacts, video_artifacts, audio_artifacts, file_artifacts = validate_media_object_id(
2708
2690
  images=images, videos=videos, audios=audio, files=files
2709
2691
  )
2710
2692
 
2711
2693
  # Resolve variables
2712
- run_dependencies = dependencies if dependencies is not None else self.dependencies
2694
+ dependencies = dependencies if dependencies is not None else self.dependencies
2713
2695
  add_dependencies = (
2714
2696
  add_dependencies_to_context if add_dependencies_to_context is not None else self.add_dependencies_to_context
2715
2697
  )
@@ -2764,13 +2746,26 @@ class Team:
2764
2746
  if self.knowledge_filters or knowledge_filters:
2765
2747
  effective_filters = self._get_effective_filters(knowledge_filters)
2766
2748
 
2749
+ # Initialize run context
2750
+ run_context = RunContext(
2751
+ run_id=run_id,
2752
+ session_id=session_id,
2753
+ user_id=user_id,
2754
+ session_state=session_state,
2755
+ dependencies=dependencies,
2756
+ knowledge_filters=effective_filters,
2757
+ metadata=metadata,
2758
+ )
2759
+
2767
2760
  # Create a new run_response for this attempt
2768
2761
  run_response = TeamRunOutput(
2769
2762
  run_id=run_id,
2763
+ user_id=user_id,
2770
2764
  session_id=session_id,
2771
2765
  team_id=self.id,
2772
2766
  team_name=self.name,
2773
- metadata=metadata,
2767
+ metadata=run_context.metadata,
2768
+ session_state=run_context.session_state,
2774
2769
  input=run_input,
2775
2770
  )
2776
2771
 
@@ -2795,16 +2790,13 @@ class Team:
2795
2790
  response_iterator = self._arun_stream(
2796
2791
  input=validated_input,
2797
2792
  run_response=run_response,
2793
+ run_context=run_context,
2798
2794
  session_id=session_id,
2799
- session_state=session_state,
2800
2795
  user_id=user_id,
2801
- knowledge_filters=effective_filters,
2802
2796
  add_history_to_context=add_history,
2803
2797
  add_dependencies_to_context=add_dependencies,
2804
2798
  add_session_state_to_context=add_session_state,
2805
- metadata=metadata,
2806
2799
  response_format=response_format,
2807
- dependencies=run_dependencies,
2808
2800
  stream_events=stream_events,
2809
2801
  yield_run_response=yield_run_response,
2810
2802
  debug_mode=debug_mode,
@@ -2815,17 +2807,14 @@ class Team:
2815
2807
  return self._arun( # type: ignore
2816
2808
  input=validated_input,
2817
2809
  run_response=run_response,
2810
+ run_context=run_context,
2818
2811
  session_id=session_id,
2819
- session_state=session_state,
2820
2812
  user_id=user_id,
2821
- knowledge_filters=effective_filters,
2822
2813
  add_history_to_context=add_history,
2823
2814
  add_dependencies_to_context=add_dependencies,
2824
2815
  add_session_state_to_context=add_session_state,
2825
- metadata=metadata,
2826
2816
  response_format=response_format,
2827
2817
  debug_mode=debug_mode,
2828
- dependencies=run_dependencies,
2829
2818
  **kwargs,
2830
2819
  )
2831
2820
 
@@ -2871,25 +2860,6 @@ class Team:
2871
2860
 
2872
2861
  raise Exception(f"Failed after {num_attempts} attempts.")
2873
2862
 
2874
- def _store_media(self, run_response: TeamRunOutput, model_response: ModelResponse):
2875
- """Store media from model response in run_response for persistence"""
2876
- # Handle generated media fields from ModelResponse (generated media)
2877
- if model_response.images is not None:
2878
- for image in model_response.images:
2879
- self._add_image(image, run_response) # Generated images go to run_response.images
2880
-
2881
- if model_response.videos is not None:
2882
- for video in model_response.videos:
2883
- self._add_video(video, run_response) # Generated videos go to run_response.videos
2884
-
2885
- if model_response.audios is not None:
2886
- for audio in model_response.audios:
2887
- self._add_audio(audio, run_response) # Generated audio go to run_response.audio
2888
-
2889
- if model_response.files is not None:
2890
- for file in model_response.files:
2891
- self._add_file(file, run_response) # Generated files go to run_response.files
2892
-
2893
2863
  def _update_run_response(
2894
2864
  self, model_response: ModelResponse, run_response: TeamRunOutput, run_messages: RunMessages
2895
2865
  ):
@@ -2930,6 +2900,12 @@ class Team:
2930
2900
  if model_response.audio is not None:
2931
2901
  run_response.response_audio = model_response.audio
2932
2902
 
2903
+ # Update session_state with changes from model response
2904
+ if model_response.updated_session_state is not None and run_response.session_state is not None:
2905
+ from agno.utils.merge_dict import merge_dictionaries
2906
+
2907
+ merge_dictionaries(run_response.session_state, model_response.updated_session_state)
2908
+
2933
2909
  # Build a list of messages that should be added to the RunOutput
2934
2910
  messages_for_run_response = [m for m in run_messages.messages if m.add_to_agent_memory]
2935
2911
 
@@ -2954,6 +2930,7 @@ class Team:
2954
2930
  tools: Optional[List[Union[Function, dict]]] = None,
2955
2931
  response_format: Optional[Union[Dict, Type[BaseModel]]] = None,
2956
2932
  stream_events: bool = False,
2933
+ session_state: Optional[Dict[str, Any]] = None,
2957
2934
  ) -> Iterator[Union[TeamRunOutputEvent, RunOutputEvent]]:
2958
2935
  self.model = cast(Model, self.model)
2959
2936
 
@@ -2985,6 +2962,7 @@ class Team:
2985
2962
  reasoning_state=reasoning_state,
2986
2963
  stream_events=stream_events,
2987
2964
  parse_structured_output=self.should_parse_structured_output,
2965
+ session_state=session_state,
2988
2966
  )
2989
2967
 
2990
2968
  # 3. Update TeamRunOutput
@@ -3036,6 +3014,7 @@ class Team:
3036
3014
  tools: Optional[List[Union[Function, dict]]] = None,
3037
3015
  response_format: Optional[Union[Dict, Type[BaseModel]]] = None,
3038
3016
  stream_events: bool = False,
3017
+ session_state: Optional[Dict[str, Any]] = None,
3039
3018
  ) -> AsyncIterator[Union[TeamRunOutputEvent, RunOutputEvent]]:
3040
3019
  self.model = cast(Model, self.model)
3041
3020
 
@@ -3058,6 +3037,7 @@ class Team:
3058
3037
  tool_call_limit=self.tool_call_limit,
3059
3038
  stream_model_response=stream_model_response,
3060
3039
  send_media_to_model=self.send_media_to_model,
3040
+ run_response=run_response,
3061
3041
  ) # type: ignore
3062
3042
  async for model_response_event in model_stream:
3063
3043
  for event in self._handle_model_response_chunk(
@@ -3068,6 +3048,7 @@ class Team:
3068
3048
  reasoning_state=reasoning_state,
3069
3049
  stream_events=stream_events,
3070
3050
  parse_structured_output=self.should_parse_structured_output,
3051
+ session_state=session_state,
3071
3052
  ):
3072
3053
  yield event
3073
3054
 
@@ -3122,6 +3103,7 @@ class Team:
3122
3103
  reasoning_state: Optional[Dict[str, Any]] = None,
3123
3104
  stream_events: bool = False,
3124
3105
  parse_structured_output: bool = False,
3106
+ session_state: Optional[Dict[str, Any]] = None,
3125
3107
  ) -> Iterator[Union[TeamRunOutputEvent, RunOutputEvent]]:
3126
3108
  if isinstance(model_response_event, tuple(get_args(RunOutputEvent))) or isinstance(
3127
3109
  model_response_event, tuple(get_args(TeamRunOutputEvent))
@@ -3241,7 +3223,9 @@ class Team:
3241
3223
 
3242
3224
  if model_response_event.images is not None:
3243
3225
  for image in model_response_event.images:
3244
- self._add_image(image, run_response)
3226
+ if run_response.images is None:
3227
+ run_response.images = []
3228
+ run_response.images.append(image)
3245
3229
 
3246
3230
  should_yield = True
3247
3231
 
@@ -3299,22 +3283,39 @@ class Team:
3299
3283
 
3300
3284
  # If the model response is a tool_call_completed, update the existing tool call in the run_response
3301
3285
  elif model_response_event.event == ModelResponseEvent.tool_call_completed.value:
3302
- if model_response_event.updated_session_state is not None and session.session_data is not None:
3303
- merge_dictionaries(
3304
- session.session_data["session_state"], model_response_event.updated_session_state
3305
- )
3286
+ if model_response_event.updated_session_state is not None:
3287
+ # Update the session_state variable that TeamRunOutput references
3288
+ if session_state is not None:
3289
+ merge_dictionaries(session_state, model_response_event.updated_session_state)
3290
+ # Also update the DB session object
3291
+ if session.session_data is not None:
3292
+ merge_dictionaries(
3293
+ session.session_data["session_state"], model_response_event.updated_session_state
3294
+ )
3306
3295
 
3307
3296
  if model_response_event.images is not None:
3308
3297
  for image in model_response_event.images:
3309
- self._add_image(image, run_response)
3298
+ if run_response.images is None:
3299
+ run_response.images = []
3300
+ run_response.images.append(image)
3310
3301
 
3311
3302
  if model_response_event.videos is not None:
3312
3303
  for video in model_response_event.videos:
3313
- self._add_video(video, run_response)
3304
+ if run_response.videos is None:
3305
+ run_response.videos = []
3306
+ run_response.videos.append(video)
3314
3307
 
3315
3308
  if model_response_event.audios is not None:
3316
3309
  for audio in model_response_event.audios:
3317
- self._add_audio(audio, run_response)
3310
+ if run_response.audio is None:
3311
+ run_response.audio = []
3312
+ run_response.audio.append(audio)
3313
+
3314
+ if model_response_event.files is not None:
3315
+ for file_obj in model_response_event.files:
3316
+ if run_response.files is None:
3317
+ run_response.files = []
3318
+ run_response.files.append(file_obj)
3318
3319
 
3319
3320
  reasoning_step: Optional[ReasoningStep] = None
3320
3321
  tool_executions_list = model_response_event.tool_executions
@@ -4123,55 +4124,6 @@ class Team:
4123
4124
  if isinstance(member_response, TeamRunOutput) and member_response.member_responses:
4124
4125
  member._scrub_member_responses(member_response.member_responses) # type: ignore
4125
4126
 
4126
- def _validate_media_object_id(
4127
- self,
4128
- images: Optional[Sequence[Image]] = None,
4129
- videos: Optional[Sequence[Video]] = None,
4130
- audios: Optional[Sequence[Audio]] = None,
4131
- files: Optional[Sequence[File]] = None,
4132
- ) -> tuple:
4133
- image_list = None
4134
- if images:
4135
- image_list = []
4136
- for img in images:
4137
- if not img.id:
4138
- from uuid import uuid4
4139
-
4140
- img.id = str(uuid4())
4141
- image_list.append(img)
4142
-
4143
- video_list = None
4144
- if videos:
4145
- video_list = []
4146
- for vid in videos:
4147
- if not vid.id:
4148
- from uuid import uuid4
4149
-
4150
- vid.id = str(uuid4())
4151
- video_list.append(vid)
4152
-
4153
- audio_list = None
4154
- if audios:
4155
- audio_list = []
4156
- for aud in audios:
4157
- if not aud.id:
4158
- from uuid import uuid4
4159
-
4160
- aud.id = str(uuid4())
4161
- audio_list.append(aud)
4162
-
4163
- file_list = None
4164
- if files:
4165
- file_list = []
4166
- for file in files:
4167
- if not file.id:
4168
- from uuid import uuid4
4169
-
4170
- file.id = str(uuid4())
4171
- file_list.append(file)
4172
-
4173
- return image_list, video_list, audio_list, file_list
4174
-
4175
4127
  def cli_app(
4176
4128
  self,
4177
4129
  input: Optional[str] = None,
@@ -4498,7 +4450,7 @@ class Team:
4498
4450
  store_events=self.store_events,
4499
4451
  )
4500
4452
  else:
4501
- log_warning(
4453
+ log_info(
4502
4454
  f"Reasoning model: {reasoning_model.__class__.__name__} is not a native reasoning model, defaulting to manual Chain-of-Thought reasoning"
4503
4455
  )
4504
4456
  use_default_reasoning = True
@@ -4779,7 +4731,7 @@ class Team:
4779
4731
  store_events=self.store_events,
4780
4732
  )
4781
4733
  else:
4782
- log_warning(
4734
+ log_info(
4783
4735
  f"Reasoning model: {reasoning_model.__class__.__name__} is not a native reasoning model, defaulting to manual Chain-of-Thought reasoning"
4784
4736
  )
4785
4737
  use_default_reasoning = True
@@ -4915,38 +4867,38 @@ class Team:
4915
4867
  store_events=self.store_events,
4916
4868
  )
4917
4869
 
4918
- def _resolve_run_dependencies(self, dependencies: Optional[Dict[str, Any]] = None) -> None:
4870
+ def _resolve_run_dependencies(self, run_context: RunContext) -> None:
4919
4871
  from inspect import signature
4920
4872
 
4921
4873
  log_debug("Resolving dependencies")
4922
- if not isinstance(dependencies, dict):
4874
+ if not isinstance(run_context.dependencies, dict):
4923
4875
  log_warning("Dependencies is not a dict")
4924
4876
  return
4925
4877
 
4926
- for key, value in dependencies.items():
4878
+ for key, value in run_context.dependencies.items():
4927
4879
  if not callable(value):
4928
- dependencies[key] = value
4880
+ run_context.dependencies[key] = value
4929
4881
  continue
4930
4882
 
4931
4883
  try:
4932
4884
  sig = signature(value)
4933
4885
  resolved_value = value(agent=self) if "agent" in sig.parameters else value()
4934
4886
 
4935
- dependencies[key] = resolved_value
4887
+ run_context.dependencies[key] = resolved_value
4936
4888
  except Exception as e:
4937
4889
  log_warning(f"Failed to resolve dependencies for {key}: {e}")
4938
4890
 
4939
- async def _aresolve_run_dependencies(self, dependencies: Optional[Dict[str, Any]] = None) -> None:
4891
+ async def _aresolve_run_dependencies(self, run_context: RunContext) -> None:
4940
4892
  from inspect import iscoroutine, signature
4941
4893
 
4942
4894
  log_debug("Resolving context (async)")
4943
- if not isinstance(dependencies, dict):
4895
+ if not isinstance(run_context.dependencies, dict):
4944
4896
  log_warning("Dependencies is not a dict")
4945
4897
  return
4946
4898
 
4947
- for key, value in dependencies.items():
4899
+ for key, value in run_context.dependencies.items():
4948
4900
  if not callable(value):
4949
- dependencies[key] = value
4901
+ run_context.dependencies[key] = value
4950
4902
  continue
4951
4903
 
4952
4904
  try:
@@ -4956,7 +4908,7 @@ class Team:
4956
4908
  if iscoroutine(resolved_value):
4957
4909
  resolved_value = await resolved_value
4958
4910
 
4959
- dependencies[key] = resolved_value
4911
+ run_context.dependencies[key] = resolved_value
4960
4912
  except Exception as e:
4961
4913
  log_warning(f"Failed to resolve context for '{key}': {e}")
4962
4914
 
@@ -4987,12 +4939,11 @@ class Team:
4987
4939
  self,
4988
4940
  model: Model,
4989
4941
  run_response: TeamRunOutput,
4942
+ run_context: RunContext,
4990
4943
  team_run_context: Dict[str, Any],
4991
4944
  session: TeamSession,
4992
- session_state: Dict[str, Any],
4993
4945
  user_id: Optional[str] = None,
4994
4946
  async_mode: bool = False,
4995
- knowledge_filters: Optional[Dict[str, Any]] = None,
4996
4947
  input_message: Optional[Union[str, List, Dict, Message, BaseModel, List[Message]]] = None,
4997
4948
  images: Optional[Sequence[Image]] = None,
4998
4949
  videos: Optional[Sequence[Video]] = None,
@@ -5000,10 +4951,8 @@ class Team:
5000
4951
  files: Optional[Sequence[File]] = None,
5001
4952
  debug_mode: Optional[bool] = None,
5002
4953
  add_history_to_context: Optional[bool] = None,
5003
- dependencies: Optional[Dict[str, Any]] = None,
5004
4954
  add_dependencies_to_context: Optional[bool] = None,
5005
4955
  add_session_state_to_context: Optional[bool] = None,
5006
- metadata: Optional[Dict[str, Any]] = None,
5007
4956
  check_mcp_tools: bool = True,
5008
4957
  ) -> List[Union[Function, dict]]:
5009
4958
  # Prepare tools
@@ -5049,13 +4998,17 @@ class Team:
5049
4998
  if self.enable_agentic_knowledge_filters:
5050
4999
  _tools.append(
5051
5000
  self._get_search_knowledge_base_with_agentic_filters_function(
5052
- run_response=run_response, knowledge_filters=knowledge_filters, async_mode=async_mode
5001
+ run_response=run_response,
5002
+ knowledge_filters=run_context.knowledge_filters,
5003
+ async_mode=async_mode,
5053
5004
  )
5054
5005
  )
5055
5006
  else:
5056
5007
  _tools.append(
5057
5008
  self._get_search_knowledge_base_function(
5058
- run_response=run_response, knowledge_filters=knowledge_filters, async_mode=async_mode
5009
+ run_response=run_response,
5010
+ knowledge_filters=run_context.knowledge_filters,
5011
+ async_mode=async_mode,
5059
5012
  )
5060
5013
  )
5061
5014
 
@@ -5068,23 +5021,21 @@ class Team:
5068
5021
  if self.determine_input_for_members is False:
5069
5022
  user_message = self._get_user_message(
5070
5023
  run_response=run_response,
5071
- session_state=session_state,
5024
+ run_context=run_context,
5072
5025
  input_message=input_message,
5073
5026
  user_id=user_id,
5074
5027
  audio=audio,
5075
5028
  images=images,
5076
5029
  videos=videos,
5077
5030
  files=files,
5078
- dependencies=dependencies,
5079
5031
  add_dependencies_to_context=add_dependencies_to_context,
5080
- metadata=metadata,
5081
5032
  )
5082
5033
  user_message_content = user_message.content if user_message is not None else None
5083
5034
 
5084
5035
  delegate_task_func = self._get_delegate_task_function(
5085
5036
  run_response=run_response,
5037
+ run_context=run_context,
5086
5038
  session=session,
5087
- session_state=session_state,
5088
5039
  team_run_context=team_run_context,
5089
5040
  input=user_message_content,
5090
5041
  user_id=user_id,
@@ -5095,12 +5046,9 @@ class Team:
5095
5046
  videos=videos, # type: ignore
5096
5047
  audio=audio, # type: ignore
5097
5048
  files=files, # type: ignore
5098
- knowledge_filters=knowledge_filters,
5099
5049
  add_history_to_context=add_history_to_context,
5100
- dependencies=dependencies,
5101
5050
  add_dependencies_to_context=add_dependencies_to_context,
5102
5051
  add_session_state_to_context=add_session_state_to_context,
5103
- metadata=metadata,
5104
5052
  debug_mode=debug_mode,
5105
5053
  )
5106
5054
 
@@ -5207,8 +5155,9 @@ class Team:
5207
5155
 
5208
5156
  for func in _functions: # type: ignore
5209
5157
  if isinstance(func, Function):
5210
- func._session_state = session_state
5211
- func._dependencies = dependencies
5158
+ func._run_context = run_context
5159
+ func._session_state = run_context.session_state
5160
+ func._dependencies = run_context.dependencies
5212
5161
  func._images = joint_images
5213
5162
  func._files = joint_files
5214
5163
  func._audios = joint_audios
@@ -5251,18 +5200,30 @@ class Team:
5251
5200
  def get_system_message(
5252
5201
  self,
5253
5202
  session: TeamSession,
5254
- session_state: Optional[Dict[str, Any]] = None,
5203
+ run_context: Optional[RunContext] = None,
5255
5204
  user_id: Optional[str] = None,
5256
5205
  audio: Optional[Sequence[Audio]] = None,
5257
5206
  images: Optional[Sequence[Image]] = None,
5258
5207
  videos: Optional[Sequence[Video]] = None,
5259
5208
  files: Optional[Sequence[File]] = None,
5260
- dependencies: Optional[Dict[str, Any]] = None,
5261
- metadata: Optional[Dict[str, Any]] = None,
5262
5209
  tools: Optional[List[Union[Function, dict]]] = None,
5263
5210
  add_session_state_to_context: Optional[bool] = None,
5211
+ session_state: Optional[Dict[str, Any]] = None, # Deprecated
5212
+ dependencies: Optional[Dict[str, Any]] = None, # Deprecated
5213
+ metadata: Optional[Dict[str, Any]] = None, # Deprecated
5264
5214
  ) -> Optional[Message]:
5265
- """Get the system message for the team."""
5215
+ """Get the system message for the team.
5216
+
5217
+ 1. If the system_message is provided, use that.
5218
+ 2. If build_context is False, return None.
5219
+ 3. Build and return the default system message for the Team.
5220
+ """
5221
+
5222
+ # Consider both run_context and session_state, dependencies, metadata (deprecated fields)
5223
+ if run_context is not None:
5224
+ session_state = run_context.session_state or session_state
5225
+ dependencies = run_context.dependencies or dependencies
5226
+ metadata = run_context.metadata or metadata
5266
5227
 
5267
5228
  # 1. If the system_message is provided, use that.
5268
5229
  if self.system_message is not None:
@@ -5545,19 +5506,26 @@ class Team:
5545
5506
  async def aget_system_message(
5546
5507
  self,
5547
5508
  session: TeamSession,
5548
- session_state: Optional[Dict[str, Any]] = None,
5509
+ run_context: Optional[RunContext] = None,
5549
5510
  user_id: Optional[str] = None,
5550
5511
  audio: Optional[Sequence[Audio]] = None,
5551
5512
  images: Optional[Sequence[Image]] = None,
5552
5513
  videos: Optional[Sequence[Video]] = None,
5553
5514
  files: Optional[Sequence[File]] = None,
5554
- dependencies: Optional[Dict[str, Any]] = None,
5555
- metadata: Optional[Dict[str, Any]] = None,
5556
5515
  tools: Optional[List[Union[Function, dict]]] = None,
5557
5516
  add_session_state_to_context: Optional[bool] = None,
5517
+ session_state: Optional[Dict[str, Any]] = None, # Deprecated
5518
+ dependencies: Optional[Dict[str, Any]] = None, # Deprecated
5519
+ metadata: Optional[Dict[str, Any]] = None, # Deprecated
5558
5520
  ) -> Optional[Message]:
5559
5521
  """Get the system message for the team."""
5560
5522
 
5523
+ # Consider both run_context and session_state, dependencies, metadata (deprecated fields)
5524
+ if run_context is not None:
5525
+ session_state = run_context.session_state or session_state
5526
+ dependencies = run_context.dependencies or dependencies
5527
+ metadata = run_context.metadata or metadata
5528
+
5561
5529
  # 1. If the system_message is provided, use that.
5562
5530
  if self.system_message is not None:
5563
5531
  if isinstance(self.system_message, Message):
@@ -5651,7 +5619,7 @@ class Team:
5651
5619
  additional_information.append(f"Your name is: {self.name}.")
5652
5620
 
5653
5621
  if self.knowledge is not None and self.enable_agentic_knowledge_filters:
5654
- valid_filters = getattr(self.knowledge, "valid_metadata_filters", None)
5622
+ valid_filters = await self.knowledge.aget_valid_filters()
5655
5623
  if valid_filters:
5656
5624
  valid_filters_str = ", ".join(valid_filters)
5657
5625
  additional_information.append(
@@ -5827,8 +5795,8 @@ class Team:
5827
5795
  f"<additional_context>\n{self.additional_context.strip()}\n</additional_context>\n\n"
5828
5796
  )
5829
5797
 
5830
- if self.add_session_state_to_context:
5831
- system_message_content += f"<session_state>\n{session_state}\n</session_state>\n\n"
5798
+ if add_session_state_to_context and session_state is not None:
5799
+ system_message_content += self._get_formatted_session_state_for_system_message(session_state)
5832
5800
 
5833
5801
  # Add the JSON output prompt if output_schema is provided and structured_outputs is False
5834
5802
  if (
@@ -5848,20 +5816,17 @@ class Team:
5848
5816
  self,
5849
5817
  *,
5850
5818
  run_response: TeamRunOutput,
5819
+ run_context: RunContext,
5851
5820
  session: TeamSession,
5852
- session_state: Optional[Dict[str, Any]] = None,
5853
5821
  user_id: Optional[str] = None,
5854
5822
  input_message: Optional[Union[str, List, Dict, Message, BaseModel, List[Message]]] = None,
5855
5823
  audio: Optional[Sequence[Audio]] = None,
5856
5824
  images: Optional[Sequence[Image]] = None,
5857
5825
  videos: Optional[Sequence[Video]] = None,
5858
5826
  files: Optional[Sequence[File]] = None,
5859
- knowledge_filters: Optional[Dict[str, Any]] = None,
5860
5827
  add_history_to_context: Optional[bool] = None,
5861
- dependencies: Optional[Dict[str, Any]] = None,
5862
5828
  add_dependencies_to_context: Optional[bool] = None,
5863
5829
  add_session_state_to_context: Optional[bool] = None,
5864
- metadata: Optional[Dict[str, Any]] = None,
5865
5830
  tools: Optional[List[Union[Function, dict]]] = None,
5866
5831
  **kwargs: Any,
5867
5832
  ) -> RunMessages:
@@ -5884,14 +5849,12 @@ class Team:
5884
5849
  # 1. Add system message to run_messages
5885
5850
  system_message = self.get_system_message(
5886
5851
  session=session,
5887
- session_state=session_state,
5852
+ run_context=run_context,
5888
5853
  user_id=user_id,
5889
5854
  images=images,
5890
5855
  audio=audio,
5891
5856
  videos=videos,
5892
5857
  files=files,
5893
- dependencies=dependencies,
5894
- metadata=metadata,
5895
5858
  add_session_state_to_context=add_session_state_to_context,
5896
5859
  tools=tools,
5897
5860
  )
@@ -5965,17 +5928,14 @@ class Team:
5965
5928
  # 5.1 Build user message if message is None, str or list
5966
5929
  user_message = self._get_user_message(
5967
5930
  run_response=run_response,
5968
- session_state=session_state,
5931
+ run_context=run_context,
5969
5932
  input_message=input_message,
5970
5933
  user_id=user_id,
5971
5934
  audio=audio,
5972
5935
  images=images,
5973
5936
  videos=videos,
5974
5937
  files=files,
5975
- knowledge_filters=knowledge_filters,
5976
- dependencies=dependencies,
5977
5938
  add_dependencies_to_context=add_dependencies_to_context,
5978
- metadata=metadata,
5979
5939
  **kwargs,
5980
5940
  )
5981
5941
  # Add user message to run_messages
@@ -5989,20 +5949,17 @@ class Team:
5989
5949
  self,
5990
5950
  *,
5991
5951
  run_response: TeamRunOutput,
5952
+ run_context: RunContext,
5992
5953
  session: TeamSession,
5993
- session_state: Optional[Dict[str, Any]] = None,
5994
5954
  user_id: Optional[str] = None,
5995
5955
  input_message: Optional[Union[str, List, Dict, Message, BaseModel, List[Message]]] = None,
5996
5956
  audio: Optional[Sequence[Audio]] = None,
5997
5957
  images: Optional[Sequence[Image]] = None,
5998
5958
  videos: Optional[Sequence[Video]] = None,
5999
5959
  files: Optional[Sequence[File]] = None,
6000
- knowledge_filters: Optional[Dict[str, Any]] = None,
6001
5960
  add_history_to_context: Optional[bool] = None,
6002
- dependencies: Optional[Dict[str, Any]] = None,
6003
5961
  add_dependencies_to_context: Optional[bool] = None,
6004
5962
  add_session_state_to_context: Optional[bool] = None,
6005
- metadata: Optional[Dict[str, Any]] = None,
6006
5963
  tools: Optional[List[Union[Function, dict]]] = None,
6007
5964
  **kwargs: Any,
6008
5965
  ) -> RunMessages:
@@ -6025,14 +5982,12 @@ class Team:
6025
5982
  # 1. Add system message to run_messages
6026
5983
  system_message = await self.aget_system_message(
6027
5984
  session=session,
6028
- session_state=session_state,
5985
+ run_context=run_context,
6029
5986
  user_id=user_id,
6030
5987
  images=images,
6031
5988
  audio=audio,
6032
5989
  videos=videos,
6033
5990
  files=files,
6034
- dependencies=dependencies,
6035
- metadata=metadata,
6036
5991
  add_session_state_to_context=add_session_state_to_context,
6037
5992
  tools=tools,
6038
5993
  )
@@ -6105,17 +6060,14 @@ class Team:
6105
6060
  # 5.1 Build user message if message is None, str or list
6106
6061
  user_message = self._get_user_message(
6107
6062
  run_response=run_response,
6108
- session_state=session_state,
6063
+ run_context=run_context,
6109
6064
  input_message=input_message,
6110
6065
  user_id=user_id,
6111
6066
  audio=audio,
6112
6067
  images=images,
6113
6068
  videos=videos,
6114
6069
  files=files,
6115
- knowledge_filters=knowledge_filters,
6116
- dependencies=dependencies,
6117
6070
  add_dependencies_to_context=add_dependencies_to_context,
6118
- metadata=metadata,
6119
6071
  **kwargs,
6120
6072
  )
6121
6073
  # Add user message to run_messages
@@ -6129,17 +6081,14 @@ class Team:
6129
6081
  self,
6130
6082
  *,
6131
6083
  run_response: TeamRunOutput,
6132
- session_state: Optional[Dict[str, Any]] = None,
6084
+ run_context: RunContext,
6133
6085
  input_message: Optional[Union[str, List, Dict, Message, BaseModel, List[Message]]] = None,
6134
6086
  user_id: Optional[str] = None,
6135
6087
  audio: Optional[Sequence[Audio]] = None,
6136
6088
  images: Optional[Sequence[Image]] = None,
6137
6089
  videos: Optional[Sequence[Video]] = None,
6138
6090
  files: Optional[Sequence[File]] = None,
6139
- knowledge_filters: Optional[Dict[str, Any]] = None,
6140
- dependencies: Optional[Dict[str, Any]] = None,
6141
6091
  add_dependencies_to_context: Optional[bool] = None,
6142
- metadata: Optional[Dict[str, Any]] = None,
6143
6092
  **kwargs,
6144
6093
  ):
6145
6094
  # Get references from the knowledge base to use in the user message
@@ -6223,7 +6172,7 @@ class Team:
6223
6172
  retrieval_timer = Timer()
6224
6173
  retrieval_timer.start()
6225
6174
  docs_from_knowledge = self.get_relevant_docs_from_knowledge(
6226
- query=user_msg_content, filters=knowledge_filters, **kwargs
6175
+ query=user_msg_content, filters=run_context.knowledge_filters, **kwargs
6227
6176
  )
6228
6177
  if docs_from_knowledge is not None:
6229
6178
  references = MessageReferences(
@@ -6244,9 +6193,9 @@ class Team:
6244
6193
  user_msg_content = self._format_message_with_state_variables(
6245
6194
  user_msg_content,
6246
6195
  user_id=user_id,
6247
- session_state=session_state,
6248
- dependencies=dependencies,
6249
- metadata=metadata,
6196
+ session_state=run_context.session_state,
6197
+ dependencies=run_context.dependencies,
6198
+ metadata=run_context.metadata,
6250
6199
  )
6251
6200
 
6252
6201
  # Convert to string for concatenation operations
@@ -6264,9 +6213,9 @@ class Team:
6264
6213
  user_msg_content_str += self._convert_documents_to_string(references.references) + "\n"
6265
6214
  user_msg_content_str += "</references>"
6266
6215
  # 4.2 Add context to user message
6267
- if add_dependencies_to_context and dependencies is not None:
6216
+ if add_dependencies_to_context and run_context.dependencies is not None:
6268
6217
  user_msg_content_str += "\n\n<additional context>\n"
6269
- user_msg_content_str += self._convert_dependencies_to_string(dependencies) + "\n"
6218
+ user_msg_content_str += self._convert_dependencies_to_string(run_context.dependencies) + "\n"
6270
6219
  user_msg_content_str += "</additional context>"
6271
6220
 
6272
6221
  # Use the string version for the final content
@@ -6344,10 +6293,10 @@ class Team:
6344
6293
  def _format_message_with_state_variables(
6345
6294
  self,
6346
6295
  message: Any,
6347
- user_id: Optional[str] = None,
6348
6296
  session_state: Optional[Dict[str, Any]] = None,
6349
6297
  dependencies: Optional[Dict[str, Any]] = None,
6350
6298
  metadata: Optional[Dict[str, Any]] = None,
6299
+ user_id: Optional[str] = None,
6351
6300
  ) -> Any:
6352
6301
  """Format a message with the session state variables."""
6353
6302
  import re
@@ -6853,8 +6802,8 @@ class Team:
6853
6802
  def _get_delegate_task_function(
6854
6803
  self,
6855
6804
  run_response: TeamRunOutput,
6805
+ run_context: RunContext,
6856
6806
  session: TeamSession,
6857
- session_state: Dict[str, Any],
6858
6807
  team_run_context: Dict[str, Any],
6859
6808
  user_id: Optional[str] = None,
6860
6809
  stream: bool = False,
@@ -6865,12 +6814,9 @@ class Team:
6865
6814
  videos: Optional[List[Video]] = None,
6866
6815
  audio: Optional[List[Audio]] = None,
6867
6816
  files: Optional[List[File]] = None,
6868
- knowledge_filters: Optional[Dict[str, Any]] = None,
6869
6817
  add_history_to_context: Optional[bool] = None,
6870
- dependencies: Optional[Dict[str, Any]] = None,
6871
6818
  add_dependencies_to_context: Optional[bool] = None,
6872
6819
  add_session_state_to_context: Optional[bool] = None,
6873
- metadata: Optional[Dict[str, Any]] = None,
6874
6820
  debug_mode: Optional[bool] = None,
6875
6821
  ) -> Function:
6876
6822
  if not images:
@@ -6986,7 +6932,7 @@ class Team:
6986
6932
  session.upsert_run(member_agent_run_response)
6987
6933
 
6988
6934
  # Update team session state
6989
- merge_dictionaries(session_state, member_session_state_copy) # type: ignore
6935
+ merge_dictionaries(run_context.session_state, member_session_state_copy) # type: ignore
6990
6936
 
6991
6937
  # Update the team media
6992
6938
  if member_agent_run_response is not None:
@@ -7019,7 +6965,7 @@ class Team:
7019
6965
  # Make sure for the member agent, we are using the agent logger
7020
6966
  use_agent_logger()
7021
6967
 
7022
- member_session_state_copy = copy(session_state)
6968
+ member_session_state_copy = copy(run_context.session_state)
7023
6969
 
7024
6970
  if stream:
7025
6971
  member_agent_run_response_stream = member_agent.run(
@@ -7035,11 +6981,11 @@ class Team:
7035
6981
  stream=True,
7036
6982
  stream_events=stream_events,
7037
6983
  debug_mode=debug_mode,
7038
- dependencies=dependencies,
6984
+ dependencies=run_context.dependencies,
7039
6985
  add_dependencies_to_context=add_dependencies_to_context,
7040
- metadata=metadata,
6986
+ metadata=run_context.metadata,
7041
6987
  add_session_state_to_context=add_session_state_to_context,
7042
- knowledge_filters=knowledge_filters
6988
+ knowledge_filters=run_context.knowledge_filters
7043
6989
  if not member_agent.knowledge_filters and member_agent.knowledge
7044
6990
  else None,
7045
6991
  yield_run_response=True,
@@ -7063,7 +7009,7 @@ class Team:
7063
7009
  yield member_agent_run_output_event
7064
7010
  else:
7065
7011
  member_agent_run_response = member_agent.run( # type: ignore
7066
- input=member_agent_task if not history else history,
7012
+ input=member_agent_task if not history else history, # type: ignore
7067
7013
  user_id=user_id,
7068
7014
  # All members have the same session_id
7069
7015
  session_id=session.session_id,
@@ -7074,11 +7020,11 @@ class Team:
7074
7020
  files=files,
7075
7021
  stream=False,
7076
7022
  debug_mode=debug_mode,
7077
- dependencies=dependencies,
7023
+ dependencies=run_context.dependencies,
7078
7024
  add_dependencies_to_context=add_dependencies_to_context,
7079
7025
  add_session_state_to_context=add_session_state_to_context,
7080
- metadata=metadata,
7081
- knowledge_filters=knowledge_filters
7026
+ metadata=run_context.metadata,
7027
+ knowledge_filters=run_context.knowledge_filters
7082
7028
  if not member_agent.knowledge_filters and member_agent.knowledge
7083
7029
  else None,
7084
7030
  )
@@ -7116,7 +7062,10 @@ class Team:
7116
7062
  use_team_logger()
7117
7063
 
7118
7064
  _process_delegate_task_to_member(
7119
- member_agent_run_response, member_agent, member_agent_task, member_session_state_copy
7065
+ member_agent_run_response,
7066
+ member_agent,
7067
+ member_agent_task, # type: ignore
7068
+ member_session_state_copy, # type: ignore
7120
7069
  )
7121
7070
 
7122
7071
  async def adelegate_task_to_member(
@@ -7146,7 +7095,7 @@ class Team:
7146
7095
  # Make sure for the member agent, we are using the agent logger
7147
7096
  use_agent_logger()
7148
7097
 
7149
- member_session_state_copy = copy(session_state)
7098
+ member_session_state_copy = copy(run_context.session_state)
7150
7099
 
7151
7100
  if stream:
7152
7101
  member_agent_run_response_stream = member_agent.arun( # type: ignore
@@ -7162,11 +7111,11 @@ class Team:
7162
7111
  stream=True,
7163
7112
  stream_events=stream_events,
7164
7113
  debug_mode=debug_mode,
7165
- dependencies=dependencies,
7114
+ dependencies=run_context.dependencies,
7166
7115
  add_dependencies_to_context=add_dependencies_to_context,
7167
7116
  add_session_state_to_context=add_session_state_to_context,
7168
- metadata=metadata,
7169
- knowledge_filters=knowledge_filters
7117
+ metadata=run_context.metadata,
7118
+ knowledge_filters=run_context.knowledge_filters
7170
7119
  if not member_agent.knowledge_filters and member_agent.knowledge
7171
7120
  else None,
7172
7121
  yield_run_response=True,
@@ -7201,11 +7150,11 @@ class Team:
7201
7150
  files=files,
7202
7151
  stream=False,
7203
7152
  debug_mode=debug_mode,
7204
- dependencies=dependencies,
7153
+ dependencies=run_context.dependencies,
7205
7154
  add_dependencies_to_context=add_dependencies_to_context,
7206
7155
  add_session_state_to_context=add_session_state_to_context,
7207
- metadata=metadata,
7208
- knowledge_filters=knowledge_filters
7156
+ metadata=run_context.metadata,
7157
+ knowledge_filters=run_context.knowledge_filters
7209
7158
  if not member_agent.knowledge_filters and member_agent.knowledge
7210
7159
  else None,
7211
7160
  )
@@ -7239,7 +7188,10 @@ class Team:
7239
7188
  use_team_logger()
7240
7189
 
7241
7190
  _process_delegate_task_to_member(
7242
- member_agent_run_response, member_agent, member_agent_task, member_session_state_copy
7191
+ member_agent_run_response,
7192
+ member_agent,
7193
+ member_agent_task, # type: ignore
7194
+ member_session_state_copy, # type: ignore
7243
7195
  )
7244
7196
 
7245
7197
  # When the task should be delegated to all members
@@ -7260,7 +7212,7 @@ class Team:
7260
7212
  member_agent=member_agent, task_description=task
7261
7213
  )
7262
7214
 
7263
- member_session_state_copy = copy(session_state)
7215
+ member_session_state_copy = copy(run_context.session_state)
7264
7216
  if stream:
7265
7217
  member_agent_run_response_stream = member_agent.run(
7266
7218
  input=member_agent_task if not history else history,
@@ -7274,14 +7226,14 @@ class Team:
7274
7226
  files=files,
7275
7227
  stream=True,
7276
7228
  stream_events=stream_events,
7277
- knowledge_filters=knowledge_filters
7229
+ knowledge_filters=run_context.knowledge_filters
7278
7230
  if not member_agent.knowledge_filters and member_agent.knowledge
7279
7231
  else None,
7280
7232
  debug_mode=debug_mode,
7281
- dependencies=dependencies,
7233
+ dependencies=run_context.dependencies,
7282
7234
  add_dependencies_to_context=add_dependencies_to_context,
7283
7235
  add_session_state_to_context=add_session_state_to_context,
7284
- metadata=metadata,
7236
+ metadata=run_context.metadata,
7285
7237
  yield_run_response=True,
7286
7238
  )
7287
7239
  member_agent_run_response = None
@@ -7314,14 +7266,14 @@ class Team:
7314
7266
  audio=audio,
7315
7267
  files=files,
7316
7268
  stream=False,
7317
- knowledge_filters=knowledge_filters
7269
+ knowledge_filters=run_context.knowledge_filters
7318
7270
  if not member_agent.knowledge_filters and member_agent.knowledge
7319
7271
  else None,
7320
7272
  debug_mode=debug_mode,
7321
- dependencies=dependencies,
7273
+ dependencies=run_context.dependencies,
7322
7274
  add_dependencies_to_context=add_dependencies_to_context,
7323
7275
  add_session_state_to_context=add_session_state_to_context,
7324
- metadata=metadata,
7276
+ metadata=run_context.metadata,
7325
7277
  )
7326
7278
 
7327
7279
  check_if_run_cancelled(member_agent_run_response) # type: ignore
@@ -7348,7 +7300,10 @@ class Team:
7348
7300
  yield f"Agent {member_agent.name}: Error - {str(e)}"
7349
7301
 
7350
7302
  _process_delegate_task_to_member(
7351
- member_agent_run_response, member_agent, member_agent_task, member_session_state_copy
7303
+ member_agent_run_response,
7304
+ member_agent,
7305
+ member_agent_task, # type: ignore
7306
+ member_session_state_copy, # type: ignore
7352
7307
  )
7353
7308
 
7354
7309
  # After all the member runs, switch back to the team logger
@@ -7374,7 +7329,7 @@ class Team:
7374
7329
  member_agent_task, history = _setup_delegate_task_to_member(
7375
7330
  member_agent=agent, task_description=task
7376
7331
  ) # type: ignore
7377
- member_session_state_copy = copy(session_state)
7332
+ member_session_state_copy = copy(run_context.session_state)
7378
7333
 
7379
7334
  member_stream = agent.arun( # type: ignore
7380
7335
  input=member_agent_task if not history else history,
@@ -7388,13 +7343,13 @@ class Team:
7388
7343
  stream=True,
7389
7344
  stream_events=stream_events,
7390
7345
  debug_mode=debug_mode,
7391
- knowledge_filters=knowledge_filters
7346
+ knowledge_filters=run_context.knowledge_filters
7392
7347
  if not member_agent.knowledge_filters and member_agent.knowledge
7393
7348
  else None,
7394
- dependencies=dependencies,
7349
+ dependencies=run_context.dependencies,
7395
7350
  add_dependencies_to_context=add_dependencies_to_context,
7396
7351
  add_session_state_to_context=add_session_state_to_context,
7397
- metadata=metadata,
7352
+ metadata=run_context.metadata,
7398
7353
  yield_run_response=True,
7399
7354
  )
7400
7355
  member_agent_run_response = None
@@ -7412,7 +7367,10 @@ class Team:
7412
7367
  await queue.put(member_agent_run_output_event)
7413
7368
  finally:
7414
7369
  _process_delegate_task_to_member(
7415
- member_agent_run_response, member_agent, member_agent_task, member_session_state_copy
7370
+ member_agent_run_response,
7371
+ member_agent,
7372
+ member_agent_task, # type: ignore
7373
+ member_session_state_copy, # type: ignore
7416
7374
  )
7417
7375
  await queue.put(done_marker)
7418
7376
 
@@ -7451,7 +7409,7 @@ class Team:
7451
7409
  )
7452
7410
 
7453
7411
  async def run_member_agent(agent=current_agent) -> str:
7454
- member_session_state_copy = copy(session_state)
7412
+ member_session_state_copy = copy(run_context.session_state)
7455
7413
 
7456
7414
  member_agent_run_response = await agent.arun(
7457
7415
  input=member_agent_task if not history else history,
@@ -7466,18 +7424,21 @@ class Team:
7466
7424
  stream=False,
7467
7425
  stream_events=stream_events,
7468
7426
  debug_mode=debug_mode,
7469
- knowledge_filters=knowledge_filters
7427
+ knowledge_filters=run_context.knowledge_filters
7470
7428
  if not member_agent.knowledge_filters and member_agent.knowledge
7471
7429
  else None,
7472
- dependencies=dependencies,
7430
+ dependencies=run_context.dependencies,
7473
7431
  add_dependencies_to_context=add_dependencies_to_context,
7474
7432
  add_session_state_to_context=add_session_state_to_context,
7475
- metadata=metadata,
7433
+ metadata=run_context.metadata,
7476
7434
  )
7477
7435
  check_if_run_cancelled(member_agent_run_response)
7478
7436
 
7479
7437
  _process_delegate_task_to_member(
7480
- member_agent_run_response, member_agent, member_agent_task, member_session_state_copy
7438
+ member_agent_run_response,
7439
+ member_agent,
7440
+ member_agent_task, # type: ignore
7441
+ member_session_state_copy, # type: ignore
7481
7442
  )
7482
7443
 
7483
7444
  member_name = member_agent.name if member_agent.name else f"agent_{member_agent_index}"
@@ -8280,37 +8241,9 @@ class Team:
8280
8241
  return await self.memory_manager.aget_user_memories(user_id=user_id)
8281
8242
 
8282
8243
  ###########################################################################
8283
- # Handle images, videos and audio
8244
+ # Handle reasoning content
8284
8245
  ###########################################################################
8285
8246
 
8286
- def _add_image(self, image: Image, run_response: TeamRunOutput) -> None:
8287
- """Add an image to both the agent's stateful storage and the current run response"""
8288
- # Add to run response
8289
- if run_response.images is None:
8290
- run_response.images = []
8291
- run_response.images.append(image)
8292
-
8293
- def _add_video(self, video: Video, run_response: TeamRunOutput) -> None:
8294
- """Add a video to both the agent's stateful storage and the current run response"""
8295
- # Add to run response
8296
- if run_response.videos is None:
8297
- run_response.videos = []
8298
- run_response.videos.append(video)
8299
-
8300
- def _add_audio(self, audio: Audio, run_response: TeamRunOutput) -> None:
8301
- """Add audio to both the agent's stateful storage and the current run response"""
8302
- # Add to run response
8303
- if run_response.audio is None:
8304
- run_response.audio = []
8305
- run_response.audio.append(audio)
8306
-
8307
- def _add_file(self, file: File, run_response: TeamRunOutput) -> None:
8308
- """Add file to both the agent's stateful storage and the current run response"""
8309
- # Add to run response
8310
- if run_response.files is None:
8311
- run_response.files = []
8312
- run_response.files.append(file)
8313
-
8314
8247
  def _update_reasoning_content_from_tool_call(
8315
8248
  self, run_response: TeamRunOutput, tool_name: str, tool_args: Dict[str, Any]
8316
8249
  ) -> Optional[ReasoningStep]:
@@ -8506,7 +8439,7 @@ class Team:
8506
8439
 
8507
8440
  # Validate the filters against known valid filter keys
8508
8441
  if self.knowledge is not None:
8509
- valid_filters, invalid_keys = self.knowledge.validate_filters(filters) # type: ignore
8442
+ valid_filters, invalid_keys = await self.knowledge.async_validate_filters(filters) # type: ignore
8510
8443
 
8511
8444
  # Warn about invalid filter keys
8512
8445
  if invalid_keys: