agno 2.4.6__py3-none-any.whl → 2.4.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.
@@ -17,6 +17,10 @@ from agno.utils.log import log_debug, logger
17
17
  from agno.workflow.step import Step
18
18
  from agno.workflow.types import StepInput, StepOutput, StepType
19
19
 
20
+ # Constants for condition branch identifiers
21
+ CONDITION_BRANCH_IF = "if"
22
+ CONDITION_BRANCH_ELSE = "else"
23
+
20
24
  WorkflowSteps = List[
21
25
  Union[
22
26
  Callable[
@@ -34,7 +38,12 @@ WorkflowSteps = List[
34
38
 
35
39
  @dataclass
36
40
  class Condition:
37
- """A condition that executes a step (or list of steps) if the condition is met"""
41
+ """A condition that executes a step (or list of steps) if the condition is met.
42
+
43
+ If the condition evaluates to True, the `steps` are executed.
44
+ If the condition evaluates to False and `else_steps` is provided (and not empty),
45
+ the `else_steps` are executed instead.
46
+ """
38
47
 
39
48
  # Evaluator should only return boolean
40
49
  evaluator: Union[
@@ -44,6 +53,9 @@ class Condition:
44
53
  ]
45
54
  steps: WorkflowSteps
46
55
 
56
+ # Steps to execute when condition is False (optional)
57
+ else_steps: Optional[WorkflowSteps] = None
58
+
47
59
  name: Optional[str] = None
48
60
  description: Optional[str] = None
49
61
 
@@ -57,20 +69,27 @@ class Condition:
57
69
  from agno.workflow.step import Step
58
70
  from agno.workflow.steps import Steps
59
71
 
60
- prepared_steps: WorkflowSteps = []
61
- for step in self.steps:
62
- if callable(step) and hasattr(step, "__name__"):
63
- prepared_steps.append(Step(name=step.__name__, description="User-defined callable step", executor=step))
64
- elif isinstance(step, Agent):
65
- prepared_steps.append(Step(name=step.name, description=step.description, agent=step))
66
- elif isinstance(step, Team):
67
- prepared_steps.append(Step(name=step.name, description=step.description, team=step))
68
- elif isinstance(step, (Step, Steps, Loop, Parallel, Condition, Router)):
69
- prepared_steps.append(step)
70
- else:
71
- raise ValueError(f"Invalid step type: {type(step).__name__}")
72
+ def prepare_step_list(steps: WorkflowSteps) -> WorkflowSteps:
73
+ """Helper to prepare a list of steps."""
74
+ prepared: WorkflowSteps = []
75
+ for step in steps:
76
+ if callable(step) and hasattr(step, "__name__"):
77
+ prepared.append(Step(name=step.__name__, description="User-defined callable step", executor=step))
78
+ elif isinstance(step, Agent):
79
+ prepared.append(Step(name=step.name, description=step.description, agent=step))
80
+ elif isinstance(step, Team):
81
+ prepared.append(Step(name=step.name, description=step.description, team=step))
82
+ elif isinstance(step, (Step, Steps, Loop, Parallel, Condition, Router)):
83
+ prepared.append(step)
84
+ else:
85
+ raise ValueError(f"Invalid step type: {type(step).__name__}")
86
+ return prepared
87
+
88
+ self.steps = prepare_step_list(self.steps)
72
89
 
73
- self.steps = prepared_steps
90
+ # Also prepare else_steps if provided and not empty
91
+ if self.else_steps and len(self.else_steps) > 0:
92
+ self.else_steps = prepare_step_list(self.else_steps)
74
93
 
75
94
  def _update_step_input_from_outputs(
76
95
  self,
@@ -169,6 +188,10 @@ class Condition:
169
188
  except Exception:
170
189
  return False
171
190
 
191
+ def _has_else_steps(self) -> bool:
192
+ """Check if else_steps is provided and not empty."""
193
+ return self.else_steps is not None and len(self.else_steps) > 0
194
+
172
195
  def execute(
173
196
  self,
174
197
  step_input: StepInput,
@@ -183,7 +206,12 @@ class Condition:
183
206
  num_history_runs: int = 3,
184
207
  background_tasks: Optional[Any] = None,
185
208
  ) -> StepOutput:
186
- """Execute the condition and its steps with sequential chaining if condition is true"""
209
+ """Execute the condition and its steps with sequential chaining.
210
+
211
+ If condition is True, executes `steps`.
212
+ If condition is False and `else_steps` is provided (and not empty), executes `else_steps`.
213
+ If condition is False and no `else_steps`, returns a "not met" message.
214
+ """
187
215
  log_debug(f"Condition Start: {self.name}", center=True, symbol="-")
188
216
 
189
217
  conditional_step_id = str(uuid4())
@@ -198,7 +226,17 @@ class Condition:
198
226
 
199
227
  log_debug(f"Condition {self.name} evaluated to: {condition_result}")
200
228
 
201
- if not condition_result:
229
+ # Determine which steps to execute
230
+ if condition_result:
231
+ steps_to_execute = self.steps
232
+ branch = CONDITION_BRANCH_IF
233
+ log_debug(f"Condition {self.name} met, executing {len(steps_to_execute)} steps (if branch)")
234
+ elif self._has_else_steps():
235
+ steps_to_execute = self.else_steps # type: ignore[assignment]
236
+ branch = CONDITION_BRANCH_ELSE
237
+ log_debug(f"Condition {self.name} not met, executing {len(steps_to_execute)} else_steps (else branch)")
238
+ else:
239
+ # No else_steps provided, return "not met" message
202
240
  log_debug(f"Condition {self.name} not met, skipping {len(self.steps)} steps")
203
241
  return StepOutput(
204
242
  step_name=self.name,
@@ -208,12 +246,11 @@ class Condition:
208
246
  success=True,
209
247
  )
210
248
 
211
- log_debug(f"Condition {self.name} met, executing {len(self.steps)} steps")
212
249
  all_results: List[StepOutput] = []
213
250
  current_step_input = step_input
214
- condition_step_outputs = {}
251
+ condition_step_outputs: Dict[str, StepOutput] = {}
215
252
 
216
- for i, step in enumerate(self.steps):
253
+ for i, step in enumerate(steps_to_execute):
217
254
  try:
218
255
  step_output = step.execute( # type: ignore[union-attr]
219
256
  current_step_input,
@@ -234,7 +271,7 @@ class Condition:
234
271
  all_results.extend(step_output)
235
272
  if step_output:
236
273
  step_name = getattr(step, "name", f"step_{i}")
237
- log_debug(f"Executing condition step {i + 1}/{len(self.steps)}: {step_name}")
274
+ log_debug(f"Executing condition step {i + 1}/{len(steps_to_execute)}: {step_name}")
238
275
 
239
276
  condition_step_outputs[step_name] = step_output[-1]
240
277
 
@@ -269,13 +306,13 @@ class Condition:
269
306
  all_results.append(error_output)
270
307
  break
271
308
 
272
- log_debug(f"Condition End: {self.name} ({len(all_results)} results)", center=True, symbol="-")
309
+ log_debug(f"Condition End: {self.name} ({len(all_results)} results, {branch} branch)", center=True, symbol="-")
273
310
 
274
311
  return StepOutput(
275
312
  step_name=self.name,
276
313
  step_id=conditional_step_id,
277
314
  step_type=StepType.CONDITION,
278
- content=f"Condition {self.name} completed with {len(all_results)} results",
315
+ content=f"Condition {self.name} completed with {len(all_results)} results ({branch} branch)",
279
316
  success=all(result.success for result in all_results) if all_results else True,
280
317
  error=None,
281
318
  stop=any(result.stop for result in all_results) if all_results else False,
@@ -300,7 +337,12 @@ class Condition:
300
337
  num_history_runs: int = 3,
301
338
  background_tasks: Optional[Any] = None,
302
339
  ) -> Iterator[Union[WorkflowRunOutputEvent, StepOutput]]:
303
- """Execute the condition with streaming support - mirrors Loop logic"""
340
+ """Execute the condition with streaming support.
341
+
342
+ If condition is True, executes `steps`.
343
+ If condition is False and `else_steps` is provided (and not empty), executes `else_steps`.
344
+ If condition is False and no `else_steps`, yields completed event and returns.
345
+ """
304
346
  log_debug(f"Condition Start: {self.name}", center=True, symbol="-")
305
347
 
306
348
  conditional_step_id = str(uuid4())
@@ -328,9 +370,18 @@ class Condition:
328
370
  parent_step_id=parent_step_id,
329
371
  )
330
372
 
331
- if not condition_result:
373
+ # Determine which steps to execute
374
+ if condition_result:
375
+ steps_to_execute = self.steps
376
+ branch = CONDITION_BRANCH_IF
377
+ log_debug(f"Condition {self.name} met, executing {len(steps_to_execute)} steps (if branch)")
378
+ elif self._has_else_steps():
379
+ steps_to_execute = self.else_steps # type: ignore[assignment]
380
+ branch = CONDITION_BRANCH_ELSE
381
+ log_debug(f"Condition {self.name} not met, executing {len(steps_to_execute)} else_steps (else branch)")
382
+ else:
383
+ # No else_steps provided, yield completed event and return
332
384
  if stream_events and workflow_run_response:
333
- # Yield condition completed event for empty case
334
385
  yield ConditionExecutionCompletedEvent(
335
386
  run_id=workflow_run_response.run_id or "",
336
387
  workflow_name=workflow_run_response.workflow_name or "",
@@ -340,20 +391,20 @@ class Condition:
340
391
  step_index=step_index,
341
392
  condition_result=False,
342
393
  executed_steps=0,
394
+ branch=None,
343
395
  step_results=[],
344
396
  step_id=conditional_step_id,
345
397
  parent_step_id=parent_step_id,
346
398
  )
347
399
  return
348
400
 
349
- log_debug(f"Condition {self.name} met, executing {len(self.steps)} steps")
350
- all_results = []
401
+ all_results: List[StepOutput] = []
351
402
  current_step_input = step_input
352
- condition_step_outputs = {}
403
+ condition_step_outputs: Dict[str, StepOutput] = {}
353
404
 
354
- for i, step in enumerate(self.steps):
405
+ for i, step in enumerate(steps_to_execute):
355
406
  try:
356
- step_outputs_for_step = []
407
+ step_outputs_for_step: List[StepOutput] = []
357
408
 
358
409
  # Create child index for each step within condition
359
410
  if step_index is None or isinstance(step_index, int):
@@ -426,7 +477,7 @@ class Condition:
426
477
  all_results.append(error_output)
427
478
  break
428
479
 
429
- log_debug(f"Condition End: {self.name} ({len(all_results)} results)", center=True, symbol="-")
480
+ log_debug(f"Condition End: {self.name} ({len(all_results)} results, {branch} branch)", center=True, symbol="-")
430
481
  if stream_events and workflow_run_response:
431
482
  # Yield condition completed event
432
483
  yield ConditionExecutionCompletedEvent(
@@ -436,8 +487,9 @@ class Condition:
436
487
  session_id=workflow_run_response.session_id or "",
437
488
  step_name=self.name,
438
489
  step_index=step_index,
439
- condition_result=True,
440
- executed_steps=len(self.steps),
490
+ condition_result=condition_result,
491
+ executed_steps=len(steps_to_execute),
492
+ branch=branch,
441
493
  step_results=all_results,
442
494
  step_id=conditional_step_id,
443
495
  parent_step_id=parent_step_id,
@@ -447,7 +499,7 @@ class Condition:
447
499
  step_name=self.name,
448
500
  step_id=conditional_step_id,
449
501
  step_type=StepType.CONDITION,
450
- content=f"Condition {self.name} completed with {len(all_results)} results",
502
+ content=f"Condition {self.name} completed with {len(all_results)} results ({branch} branch)",
451
503
  success=all(result.success for result in all_results) if all_results else True,
452
504
  stop=any(result.stop for result in all_results) if all_results else False,
453
505
  steps=all_results,
@@ -467,7 +519,12 @@ class Condition:
467
519
  num_history_runs: int = 3,
468
520
  background_tasks: Optional[Any] = None,
469
521
  ) -> StepOutput:
470
- """Async execute the condition and its steps with sequential chaining"""
522
+ """Async execute the condition and its steps with sequential chaining.
523
+
524
+ If condition is True, executes `steps`.
525
+ If condition is False and `else_steps` is provided (and not empty), executes `else_steps`.
526
+ If condition is False and no `else_steps`, returns a "not met" message.
527
+ """
471
528
  log_debug(f"Condition Start: {self.name}", center=True, symbol="-")
472
529
 
473
530
  conditional_step_id = str(uuid4())
@@ -481,24 +538,32 @@ class Condition:
481
538
  condition_result = await self._aevaluate_condition(step_input, session_state=session_state)
482
539
  log_debug(f"Condition {self.name} evaluated to: {condition_result}")
483
540
 
484
- if not condition_result:
541
+ # Determine which steps to execute
542
+ if condition_result:
543
+ steps_to_execute = self.steps
544
+ branch = CONDITION_BRANCH_IF
545
+ log_debug(f"Condition {self.name} met, executing {len(steps_to_execute)} steps (if branch)")
546
+ elif self._has_else_steps():
547
+ steps_to_execute = self.else_steps # type: ignore[assignment]
548
+ branch = CONDITION_BRANCH_ELSE
549
+ log_debug(f"Condition {self.name} not met, executing {len(steps_to_execute)} else_steps (else branch)")
550
+ else:
551
+ # No else_steps provided, return "not met" message
485
552
  log_debug(f"Condition {self.name} not met, skipping {len(self.steps)} steps")
486
553
  return StepOutput(
487
554
  step_name=self.name,
488
- step_id=str(uuid4()),
555
+ step_id=conditional_step_id,
489
556
  step_type=StepType.CONDITION,
490
557
  content=f"Condition {self.name} not met - skipped {len(self.steps)} steps",
491
558
  success=True,
492
559
  )
493
560
 
494
- log_debug(f"Condition {self.name} met, executing {len(self.steps)} steps")
495
-
496
561
  # Chain steps sequentially like Loop does
497
562
  all_results: List[StepOutput] = []
498
563
  current_step_input = step_input
499
- condition_step_outputs = {}
564
+ condition_step_outputs: Dict[str, StepOutput] = {}
500
565
 
501
- for i, step in enumerate(self.steps):
566
+ for i, step in enumerate(steps_to_execute):
502
567
  try:
503
568
  step_output = await step.aexecute( # type: ignore[union-attr]
504
569
  current_step_input,
@@ -552,13 +617,13 @@ class Condition:
552
617
  all_results.append(error_output)
553
618
  break
554
619
 
555
- log_debug(f"Condition End: {self.name} ({len(all_results)} results)", center=True, symbol="-")
620
+ log_debug(f"Condition End: {self.name} ({len(all_results)} results, {branch} branch)", center=True, symbol="-")
556
621
 
557
622
  return StepOutput(
558
623
  step_name=self.name,
559
624
  step_id=conditional_step_id,
560
625
  step_type=StepType.CONDITION,
561
- content=f"Condition {self.name} completed with {len(all_results)} results",
626
+ content=f"Condition {self.name} completed with {len(all_results)} results ({branch} branch)",
562
627
  success=all(result.success for result in all_results) if all_results else True,
563
628
  error=None,
564
629
  stop=any(result.stop for result in all_results) if all_results else False,
@@ -583,7 +648,12 @@ class Condition:
583
648
  num_history_runs: int = 3,
584
649
  background_tasks: Optional[Any] = None,
585
650
  ) -> AsyncIterator[Union[WorkflowRunOutputEvent, TeamRunOutputEvent, RunOutputEvent, StepOutput]]:
586
- """Async execute the condition with streaming support - mirrors Loop logic"""
651
+ """Async execute the condition with streaming support.
652
+
653
+ If condition is True, executes `steps`.
654
+ If condition is False and `else_steps` is provided (and not empty), executes `else_steps`.
655
+ If condition is False and no `else_steps`, yields completed event and returns.
656
+ """
587
657
  log_debug(f"Condition Start: {self.name}", center=True, symbol="-")
588
658
 
589
659
  conditional_step_id = str(uuid4())
@@ -611,9 +681,18 @@ class Condition:
611
681
  parent_step_id=parent_step_id,
612
682
  )
613
683
 
614
- if not condition_result:
684
+ # Determine which steps to execute
685
+ if condition_result:
686
+ steps_to_execute = self.steps
687
+ branch = CONDITION_BRANCH_IF
688
+ log_debug(f"Condition {self.name} met, executing {len(steps_to_execute)} steps (if branch)")
689
+ elif self._has_else_steps():
690
+ steps_to_execute = self.else_steps # type: ignore[assignment]
691
+ branch = CONDITION_BRANCH_ELSE
692
+ log_debug(f"Condition {self.name} not met, executing {len(steps_to_execute)} else_steps (else branch)")
693
+ else:
694
+ # No else_steps provided, yield completed event and return
615
695
  if stream_events and workflow_run_response:
616
- # Yield condition completed event for empty case
617
696
  yield ConditionExecutionCompletedEvent(
618
697
  run_id=workflow_run_response.run_id or "",
619
698
  workflow_name=workflow_run_response.workflow_name or "",
@@ -623,22 +702,21 @@ class Condition:
623
702
  step_index=step_index,
624
703
  condition_result=False,
625
704
  executed_steps=0,
705
+ branch=None,
626
706
  step_results=[],
627
707
  step_id=conditional_step_id,
628
708
  parent_step_id=parent_step_id,
629
709
  )
630
710
  return
631
711
 
632
- log_debug(f"Condition {self.name} met, executing {len(self.steps)} steps")
633
-
634
712
  # Chain steps sequentially like Loop does
635
- all_results = []
713
+ all_results: List[StepOutput] = []
636
714
  current_step_input = step_input
637
- condition_step_outputs = {}
715
+ condition_step_outputs: Dict[str, StepOutput] = {}
638
716
 
639
- for i, step in enumerate(self.steps):
717
+ for i, step in enumerate(steps_to_execute):
640
718
  try:
641
- step_outputs_for_step = []
719
+ step_outputs_for_step: List[StepOutput] = []
642
720
 
643
721
  # Create child index for each step within condition
644
722
  if step_index is None or isinstance(step_index, int):
@@ -711,7 +789,7 @@ class Condition:
711
789
  all_results.append(error_output)
712
790
  break
713
791
 
714
- log_debug(f"Condition End: {self.name} ({len(all_results)} results)", center=True, symbol="-")
792
+ log_debug(f"Condition End: {self.name} ({len(all_results)} results, {branch} branch)", center=True, symbol="-")
715
793
 
716
794
  if stream_events and workflow_run_response:
717
795
  # Yield condition completed event
@@ -722,8 +800,9 @@ class Condition:
722
800
  session_id=workflow_run_response.session_id or "",
723
801
  step_name=self.name,
724
802
  step_index=step_index,
725
- condition_result=True,
726
- executed_steps=len(self.steps),
803
+ condition_result=condition_result,
804
+ executed_steps=len(steps_to_execute),
805
+ branch=branch,
727
806
  step_results=all_results,
728
807
  step_id=conditional_step_id,
729
808
  parent_step_id=parent_step_id,
@@ -733,7 +812,7 @@ class Condition:
733
812
  step_name=self.name,
734
813
  step_id=conditional_step_id,
735
814
  step_type=StepType.CONDITION,
736
- content=f"Condition {self.name} completed with {len(all_results)} results",
815
+ content=f"Condition {self.name} completed with {len(all_results)} results ({branch} branch)",
737
816
  success=all(result.success for result in all_results) if all_results else True,
738
817
  stop=any(result.stop for result in all_results) if all_results else False,
739
818
  steps=all_results,
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: agno
3
- Version: 2.4.6
3
+ Version: 2.4.7
4
4
  Summary: Agno: a lightweight library for building Multi-Agent Systems
5
5
  Author-email: Ashpreet Bedi <ashpreet@agno.com>
6
6
  Project-URL: homepage, https://agno.com
@@ -225,7 +225,7 @@ Requires-Dist: pgvector; extra == "pgvector"
225
225
  Provides-Extra: chromadb
226
226
  Requires-Dist: chromadb; extra == "chromadb"
227
227
  Provides-Extra: lancedb
228
- Requires-Dist: lancedb==0.24.0; extra == "lancedb"
228
+ Requires-Dist: lancedb>=0.26.0; extra == "lancedb"
229
229
  Requires-Dist: tantivy; extra == "lancedb"
230
230
  Provides-Extra: pylance
231
231
  Requires-Dist: pylance; extra == "pylance"
@@ -94,7 +94,7 @@ agno/db/schemas/memory.py,sha256=soOeuQgLYHng0qZxzrRHf1lN574IW55lXGP403Qn1oY,207
94
94
  agno/db/schemas/metrics.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
95
95
  agno/db/singlestore/__init__.py,sha256=dufbaod8ZZIeZIVi0hYJQ8Eu2DfIfWdIy00cpqAsx9U,87
96
96
  agno/db/singlestore/schemas.py,sha256=wPzSrSQ3hVdUw385nmr8UmurHV6vtpAVuhYUlaLh1K4,9750
97
- agno/db/singlestore/singlestore.py,sha256=B7votCquaXWmRofkqK9kr0scVovzdmnUshjYp3VqELw,121986
97
+ agno/db/singlestore/singlestore.py,sha256=zCqDFd-YHPj7TsOUEr5cC7B67DtceKOI06wGjlmpnKo,121934
98
98
  agno/db/singlestore/utils.py,sha256=vJ6QM-wbJBzA8l5ULYbJ5KLB9c3-GZqtb0NWdy5gg2c,14225
99
99
  agno/db/sqlite/__init__.py,sha256=09V3i4y0-tBjt60--57ivZ__SaaS67GCsDT4Apzv-5Y,138
100
100
  agno/db/sqlite/async_sqlite.py,sha256=BzvBibnsK654K48gx-aWzV7FhmYNS324JBUnoldILTk,136969
@@ -144,7 +144,7 @@ agno/knowledge/chunking/strategy.py,sha256=M8-2i5uXZCEYHswuzLcyAdZL1cgczd7-SAK3-
144
144
  agno/knowledge/document/__init__.py,sha256=vxMAu103larPlcpJFG3sBg-sCATf-LZZO_SlOwlEY5E,81
145
145
  agno/knowledge/document/base.py,sha256=kvoLSAxc8snrayo_-C6L3HxJVXwZiXd7Maq6VToLgfg,2087
146
146
  agno/knowledge/embedder/__init__.py,sha256=RdjcB1qoXuGVLlIkD-hn3B4zs8ycabmCVRmZsG3RhCQ,81
147
- agno/knowledge/embedder/aws_bedrock.py,sha256=tqWp-BFnZvyOSusuN1OZ-TXtt6nZWFzZu6bg_zskBdc,14629
147
+ agno/knowledge/embedder/aws_bedrock.py,sha256=qTOt1NxIzF69mJvOuK9WHecGqkJjv23a7jnwxUj-iFg,23247
148
148
  agno/knowledge/embedder/azure_openai.py,sha256=Fv-Yn7eHZnw3qhVU6AktLpj8kYy3E7ynLPOYAJryCYs,8521
149
149
  agno/knowledge/embedder/base.py,sha256=PUyo0zzk1TlImKsmWORLhc74rNSEKIQcMcjP1sE7Pyk,746
150
150
  agno/knowledge/embedder/cohere.py,sha256=riT-Q7sGaG-BgkYtaq9ONXLuoUt99TncOWLzfOSWwtE,14499
@@ -188,6 +188,7 @@ agno/knowledge/remote_content/__init__.py,sha256=3zIQf3-iUK0Jy3_DtrmFhJSPol-DOSQ
188
188
  agno/knowledge/remote_content/config.py,sha256=vRCGYH_yvktB22QG6bDP4UXMitF0y2Riddkgw8xCPsk,7833
189
189
  agno/knowledge/remote_content/remote_content.py,sha256=0LtdtGHx-n9l12qDvxVYWb6Nc0907HVc-RcRQtrM7h4,5731
190
190
  agno/knowledge/reranker/__init__.py,sha256=6EK9EUQQY0ar-Jnev4hmlNyq2GwS_6UDMJXD2IBcFvE,74
191
+ agno/knowledge/reranker/aws_bedrock.py,sha256=d1ps7rvOz2FSQFZe1qruKptO6BX5c2elWe_423ky7x8,10600
191
192
  agno/knowledge/reranker/base.py,sha256=GsPcMmBiI5gOX8XABpmQNeP478mp5ma-W-1n37P0-QM,376
192
193
  agno/knowledge/reranker/cohere.py,sha256=2Be5blVyeZ3vYlnFa2NYvJuytjaCB8G2OWJ11pQz7vQ,2178
193
194
  agno/knowledge/reranker/infinity.py,sha256=N9geg9xZqRdJZksfQcvbGJgMymXrQVJl_K5KICWqH8o,7193
@@ -195,7 +196,7 @@ agno/knowledge/reranker/sentence_transformer.py,sha256=ZN4SqnMZsUhg5G7AzlONM1_Uj
195
196
  agno/learn/__init__.py,sha256=w4uS6ZDzfYyrYI9FjDP5mlYi6slCvU0XZ6jdV3HFSf8,1624
196
197
  agno/learn/config.py,sha256=GxysFhbix8RdyDf_2kORTbcLUSdzRJfjEG-2y29OEkk,15791
197
198
  agno/learn/curate.py,sha256=ywbtEkN9T1Bl1eJ794L24zLb_BX5H65bebjh4su1lvc,5248
198
- agno/learn/machine.py,sha256=Xzr6n9rNu7gU0bpWM1Ppv0wi4maDCdTZeCJ0RE6_uMk,25575
199
+ agno/learn/machine.py,sha256=I6tJFrNUolnjDluOurBr0wp0Q411B-B2RBTMjRJeEDY,25516
199
200
  agno/learn/schemas.py,sha256=Qb9TRITzXJ6QNciRAz7ijrER11hmYmzzC2vxs8M_USo,40491
200
201
  agno/learn/utils.py,sha256=dUL_oKWHPyUWF5e2muJyNo9W4Y7fwePESI_APQUZ12g,5672
201
202
  agno/learn/stores/__init__.py,sha256=c5kC8X5bgZwwRG7epKU5IHdJ-eA9qKcC9G756Xrk2CA,1306
@@ -401,7 +402,7 @@ agno/run/cancel.py,sha256=Tyxg4lxwSvO2wSZDG4OF82ORQU6MYBu94YLqrEnK09Y,3019
401
402
  agno/run/messages.py,sha256=rAC4CLW-xBA6qFS1BOvcjJ9j_qYf0a7sX1mcdY04zMU,1126
402
403
  agno/run/requirement.py,sha256=5M_L-3nKLPDS0tUxTbFNvgXgWfWUyEohQz_3bxNc39M,6817
403
404
  agno/run/team.py,sha256=F3IRagtwuXil-wizeo9LVuv5jhS7R90nAleO5kuWFR4,30764
404
- agno/run/workflow.py,sha256=PMpOP7i2jl47kIMtw_rxY4U2S-Egxlvxe7QegGFihxA,25134
405
+ agno/run/workflow.py,sha256=s8Q6jZ48E6GXQ7DiWni91s041YQMhC-tbQ-JKoL6WPk,25260
405
406
  agno/run/cancellation_management/__init__.py,sha256=tA_u4MeG2dgm8cWJRXy0X6HF4mv6Kc55gykoSnuMPf0,406
406
407
  agno/run/cancellation_management/base.py,sha256=nNh5yqfjp4Bpn03RE7T2jzLbzvY007ckzGhd-XKmZpk,2408
407
408
  agno/run/cancellation_management/in_memory_cancellation_manager.py,sha256=p04IxrXG8FcHG3X-YS-ApNAdVj8kY1ZKBeUavdypZjM,3956
@@ -544,7 +545,7 @@ agno/tools/zendesk.py,sha256=OgvK0bQGIHnRmN8X6OxyGI7P0Si6w4sodZr6FfmNR50,3084
544
545
  agno/tools/zep.py,sha256=i3yDNlVJLM0CK8SFHi-64fs0DfHMUwqu1CCrMvzJ95M,19305
545
546
  agno/tools/zoom.py,sha256=PD3l-JJ6VK1XJLXF8ciPScS6oRH8CHl7OQtoiZq8VK0,15963
546
547
  agno/tools/mcp/__init__.py,sha256=VqnrxQzDMGcT9gRI5sXAmZ1ccuomGNCfHYQSYxlyZaw,278
547
- agno/tools/mcp/mcp.py,sha256=c8nWHZpWo53bUw7PJ4tkTP5ECew8mAFT7RpyzIgIFPQ,25898
548
+ agno/tools/mcp/mcp.py,sha256=Id00Kni0eONxr_gcWy-_cV3jfCt-T2ZkIFg1REDcCjQ,27524
548
549
  agno/tools/mcp/multi_mcp.py,sha256=lYO_euSw_gJdky6cZyJtQ53s1igrsMaxR-bL8DJMF60,25659
549
550
  agno/tools/mcp/params.py,sha256=Ng9RhXeUgHCDh2mzPAKoAdsTctKfurrt5VYmbrUgfVA,666
550
551
  agno/tools/models/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
@@ -633,7 +634,7 @@ agno/vectordb/clickhouse/index.py,sha256=_YW-8AuEYy5kzOHi0zIzjngpQPgJOBdSrn9BfEL
633
634
  agno/vectordb/couchbase/__init__.py,sha256=dKZkcQLFN4r2_NIdXby4inzAAn4BDMlb9T2BW_i0_gQ,93
634
635
  agno/vectordb/couchbase/couchbase.py,sha256=SDyNQGq_wD5mkUIQGkYtR7AZCUxf7fIw50YmI0N1T5U,65636
635
636
  agno/vectordb/lancedb/__init__.py,sha256=tb9qvinKyWMTLjJYMwW_lhYHFvrfWTfHODtBfMj-NLE,111
636
- agno/vectordb/lancedb/lance_db.py,sha256=G1wCwM_oex78i2gUsRiHsL83qzmWacLQvYZ5933BWl8,41587
637
+ agno/vectordb/lancedb/lance_db.py,sha256=tbvXsEVcIsOjL6Suh9HUDcIvbWc8WNXQSX8v1n57pmA,41654
637
638
  agno/vectordb/langchaindb/__init__.py,sha256=BxGs6tcEKTiydbVJL3P5djlnafS5Bbgql3u1k6vhW2w,108
638
639
  agno/vectordb/langchaindb/langchaindb.py,sha256=AS-Jrh7gXKYkSHFiXKiD0kwL-FUFz10VbYksm8UEBAU,6391
639
640
  agno/vectordb/lightrag/__init__.py,sha256=fgQpA8pZW-jEHI91SZ_xgmROmv14oKdwCQZ8LpyipaE,84
@@ -665,7 +666,7 @@ agno/vectordb/weaviate/index.py,sha256=y4XYPRZFksMfrrF85B4hn5AtmXM4SH--4CyLo27EH
665
666
  agno/vectordb/weaviate/weaviate.py,sha256=B5mP2uGIbgMA1uP_JGWpjAJ7IUGm4ZHpVke_lQY0it4,40639
666
667
  agno/workflow/__init__.py,sha256=4aTXmTeOFofdNm-LgvjlN0y78vmsCpQDwYvke-f34E4,761
667
668
  agno/workflow/agent.py,sha256=PSt7X8BOgO9Rmh1YnT3I9HBq360IjdXfaKNzffqqiRw,12173
668
- agno/workflow/condition.py,sha256=ekqtvDIeOaG2QFDdlXJhXzz5LKyGlCFMHD2mF-Q4TxM,33203
669
+ agno/workflow/condition.py,sha256=Wur-Q6r5Vl4KkthaoBpPn06Duan5Zk49aJIsJLiLo-g,37410
669
670
  agno/workflow/loop.py,sha256=9yX_JY3b14I5Rem4QtxUIj1hF1gFC-ICshv5kmnPIf0,34048
670
671
  agno/workflow/parallel.py,sha256=PYdnWYimIBvHqzgQ13EpvITnmjCpogDOAaPqIrDmtTs,37057
671
672
  agno/workflow/remote.py,sha256=-turwcZ0Nm0rsltJAFfG6IzyhTujJZs9lPoV-W2anUs,14144
@@ -674,8 +675,8 @@ agno/workflow/step.py,sha256=AgSugOOoWidfZGFtR5PMpgWSBpIeUQB45vmaUDnV7E8,77919
674
675
  agno/workflow/steps.py,sha256=p1RdyTZIKDYOPdxU7FbsX_vySWehPWaobge76Q_UDac,26462
675
676
  agno/workflow/types.py,sha256=t4304WCKB19QFdV3ixXZICcU8wtBza4EBCIz5Ve6MSQ,18035
676
677
  agno/workflow/workflow.py,sha256=S4Iwx3LtpeE_XZ61slYvnM90BdnGhW6Gfax_BKEUG68,218609
677
- agno-2.4.6.dist-info/licenses/LICENSE,sha256=QwcOLU5TJoTeUhuIXzhdCEEDDvorGiC6-3YTOl4TecE,11356
678
- agno-2.4.6.dist-info/METADATA,sha256=MmLfiyHxq2B7hn_o0JMPG7Hwnk5Hn_yz8RhixiReUOY,21116
679
- agno-2.4.6.dist-info/WHEEL,sha256=wUyA8OaulRlbfwMtmQsvNngGrxQHAvkKcvRmdizlJi0,92
680
- agno-2.4.6.dist-info/top_level.txt,sha256=MKyeuVesTyOKIXUhc-d_tPa2Hrh0oTA4LM0izowpx70,5
681
- agno-2.4.6.dist-info/RECORD,,
678
+ agno-2.4.7.dist-info/licenses/LICENSE,sha256=QwcOLU5TJoTeUhuIXzhdCEEDDvorGiC6-3YTOl4TecE,11356
679
+ agno-2.4.7.dist-info/METADATA,sha256=7c2VNjm7zuh4jnQzTVP3MBRUKGvUlDc7I7VprKOe_XQ,21116
680
+ agno-2.4.7.dist-info/WHEEL,sha256=wUyA8OaulRlbfwMtmQsvNngGrxQHAvkKcvRmdizlJi0,92
681
+ agno-2.4.7.dist-info/top_level.txt,sha256=MKyeuVesTyOKIXUhc-d_tPa2Hrh0oTA4LM0izowpx70,5
682
+ agno-2.4.7.dist-info/RECORD,,
File without changes