swarms 7.9.2__py3-none-any.whl → 7.9.4__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.
@@ -1,8 +1,11 @@
1
- from typing import List, Any, Optional, Union, Callable
1
+ from typing import Dict, List, Any, Optional, Union, Callable
2
2
  import random
3
3
  from swarms.prompts.collaborative_prompts import (
4
4
  get_multi_agent_collaboration_prompt_one,
5
5
  )
6
+ from functools import lru_cache
7
+
8
+ from loguru import logger
6
9
 
7
10
 
8
11
  def list_all_agents(
@@ -116,3 +119,65 @@ def set_random_models_for_agents(
116
119
  else:
117
120
  setattr(agents, "model_name", random.choice(model_names))
118
121
  return agents
122
+
123
+
124
+ @lru_cache(maxsize=128)
125
+ def _create_agent_map_cached(
126
+ agent_tuple: tuple,
127
+ ) -> Dict[str, Union[Callable, Any]]:
128
+ """Internal cached version of create_agent_map that takes a tuple for hashability."""
129
+ try:
130
+ return {
131
+ (
132
+ agent.agent_name
133
+ if isinstance(agent, Callable)
134
+ else agent.__name__
135
+ ): agent
136
+ for agent in agent_tuple
137
+ }
138
+ except (AttributeError, TypeError) as e:
139
+ logger.error(f"Error creating agent map: {e}")
140
+ return {}
141
+
142
+
143
+ def create_agent_map(
144
+ agents: List[Union[Callable, Any]],
145
+ ) -> Dict[str, Union[Callable, Any]]:
146
+ """Creates a map of agent names to agents for fast lookup.
147
+
148
+ This function is optimized with LRU caching to avoid recreating maps for identical agent lists.
149
+ The cache stores up to 128 different agent map configurations.
150
+
151
+ Args:
152
+ agents (List[Union[Callable, Any]]): List of agents to create a map of. Each agent should either be:
153
+ - A callable with a __name__ attribute
154
+ - An object with an agent_name attribute
155
+
156
+ Returns:
157
+ Dict[str, Union[Callable, Any]]: Map of agent names to agents
158
+
159
+ Examples:
160
+ >>> def agent1(): pass
161
+ >>> def agent2(): pass
162
+ >>> agents = [agent1, agent2]
163
+ >>> agent_map = create_agent_map(agents)
164
+ >>> print(agent_map.keys())
165
+ dict_keys(['agent1', 'agent2'])
166
+
167
+ >>> class Agent:
168
+ ... def __init__(self, name):
169
+ ... self.agent_name = name
170
+ >>> agents = [Agent("bot1"), Agent("bot2")]
171
+ >>> agent_map = create_agent_map(agents)
172
+ >>> print(agent_map.keys())
173
+ dict_keys(['bot1', 'bot2'])
174
+
175
+ Raises:
176
+ ValueError: If agents list is empty
177
+ TypeError: If any agent lacks required name attributes
178
+ """
179
+ if not agents:
180
+ raise ValueError("Agents list cannot be empty")
181
+
182
+ # Convert list to tuple for hashability
183
+ return _create_agent_map_cached(tuple(agents))
@@ -1,4 +1,3 @@
1
- import asyncio
2
1
  import json
3
2
  import uuid
4
3
  from concurrent.futures import ThreadPoolExecutor
@@ -282,7 +281,6 @@ class AgentRearrange(BaseSwarm):
282
281
  )
283
282
 
284
283
  for task_idx, task in enumerate(tasks):
285
- is_last = task == tasks[-1]
286
284
  agent_names = [
287
285
  name.strip() for name in task.split(",")
288
286
  ]
@@ -298,7 +296,6 @@ class AgentRearrange(BaseSwarm):
298
296
  result = agent.run(
299
297
  task=self.conversation.get_str(),
300
298
  img=img,
301
- is_last=is_last,
302
299
  *args,
303
300
  **kwargs,
304
301
  )
@@ -327,7 +324,6 @@ class AgentRearrange(BaseSwarm):
327
324
  current_task = agent.run(
328
325
  task=self.conversation.get_str(),
329
326
  img=img,
330
- is_last=is_last,
331
327
  *args,
332
328
  **kwargs,
333
329
  )
@@ -344,7 +340,8 @@ class AgentRearrange(BaseSwarm):
344
340
  logger.info("Task execution completed")
345
341
 
346
342
  return history_output_formatter(
347
- self.conversation, self.output_type
343
+ conversation=self.conversation,
344
+ type=self.output_type,
348
345
  )
349
346
 
350
347
  except Exception as e:
@@ -364,11 +361,6 @@ class AgentRearrange(BaseSwarm):
364
361
  self,
365
362
  task: str = None,
366
363
  img: str = None,
367
- device: str = "cpu",
368
- device_id: int = 2,
369
- all_cores: bool = True,
370
- all_gpus: bool = False,
371
- no_use_clusterops: bool = True,
372
364
  *args,
373
365
  **kwargs,
374
366
  ):
@@ -481,58 +473,11 @@ class AgentRearrange(BaseSwarm):
481
473
  except Exception as e:
482
474
  self._catch_error(e)
483
475
 
484
- async def abatch_run(
485
- self,
486
- tasks: List[str],
487
- img: Optional[List[str]] = None,
488
- batch_size: int = 10,
489
- *args,
490
- **kwargs,
491
- ) -> List[str]:
492
- """
493
- Asynchronously process multiple tasks in batches.
494
-
495
- Args:
496
- tasks: List of tasks to process
497
- img: Optional list of images corresponding to tasks
498
- batch_size: Number of tasks to process simultaneously
499
-
500
- Returns:
501
- List of results corresponding to input tasks
502
- """
503
- try:
504
- results = []
505
- for i in range(0, len(tasks), batch_size):
506
- batch_tasks = tasks[i : i + batch_size]
507
- batch_imgs = (
508
- img[i : i + batch_size]
509
- if img
510
- else [None] * len(batch_tasks)
511
- )
512
-
513
- # Process batch using asyncio.gather
514
- batch_coros = [
515
- self.astream(
516
- task=task, img=img_path, *args, **kwargs
517
- )
518
- for task, img_path in zip(batch_tasks, batch_imgs)
519
- ]
520
- batch_results = await asyncio.gather(*batch_coros)
521
- results.extend(batch_results)
522
-
523
- return results
524
- except Exception as e:
525
- self._catch_error(e)
526
-
527
476
  def concurrent_run(
528
477
  self,
529
478
  tasks: List[str],
530
479
  img: Optional[List[str]] = None,
531
480
  max_workers: Optional[int] = None,
532
- device: str = "cpu",
533
- device_id: int = None,
534
- all_cores: bool = True,
535
- all_gpus: bool = False,
536
481
  *args,
537
482
  **kwargs,
538
483
  ) -> List[str]:
@@ -561,10 +506,6 @@ class AgentRearrange(BaseSwarm):
561
506
  self.run,
562
507
  task=task,
563
508
  img=img_path,
564
- device=device,
565
- device_id=device_id,
566
- all_cores=all_cores,
567
- all_gpus=all_gpus,
568
509
  *args,
569
510
  **kwargs,
570
511
  )
@@ -49,15 +49,12 @@ class SequentialWorkflow:
49
49
  self.flow = self.sequential_flow()
50
50
 
51
51
  self.agent_rearrange = AgentRearrange(
52
- name=name,
53
- description=description,
54
- agents=agents,
52
+ name=self.name,
53
+ description=self.description,
54
+ agents=self.agents,
55
55
  flow=self.flow,
56
- max_loops=max_loops,
57
- output_type=output_type,
58
- shared_memory_system=shared_memory_system,
59
- *args,
60
- **kwargs,
56
+ max_loops=self.max_loops,
57
+ output_type=self.output_type,
61
58
  )
62
59
 
63
60
  def sequential_flow(self):
@@ -105,11 +102,7 @@ class SequentialWorkflow:
105
102
  self,
106
103
  task: str,
107
104
  img: Optional[str] = None,
108
- device: str = "cpu",
109
- all_cores: bool = False,
110
- all_gpus: bool = False,
111
- device_id: int = 0,
112
- no_use_clusterops: bool = True,
105
+ imgs: Optional[List[str]] = None,
113
106
  *args,
114
107
  **kwargs,
115
108
  ):
@@ -134,14 +127,14 @@ class SequentialWorkflow:
134
127
  """
135
128
 
136
129
  try:
137
- result = self.agent_rearrange.run(
130
+ return self.agent_rearrange.run(
138
131
  task=task,
139
132
  img=img,
140
- *args,
141
- **kwargs,
133
+ # imgs=imgs,
134
+ # *args,
135
+ # **kwargs,
142
136
  )
143
137
 
144
- return result
145
138
  except Exception as e:
146
139
  logger.error(
147
140
  f"An error occurred while executing the task: {e}"
@@ -503,7 +503,12 @@ class SwarmRouter:
503
503
  """
504
504
  self.swarm = self._create_swarm(task, *args, **kwargs)
505
505
 
506
- self.conversation = self.swarm.conversation
506
+ if self.swarm_type == "SequentialWorkflow":
507
+ self.conversation = (
508
+ self.swarm.agent_rearrange.conversation
509
+ )
510
+ else:
511
+ self.conversation = self.swarm.conversation
507
512
 
508
513
  if self.list_all_agents is True:
509
514
  list_all_agents(
swarms/utils/formatter.py CHANGED
@@ -5,9 +5,27 @@ from typing import Any, Callable, Dict, List, Optional
5
5
  from rich.console import Console
6
6
  from rich.live import Live
7
7
  from rich.panel import Panel
8
- from rich.progress import Progress, SpinnerColumn, TextColumn
8
+ from rich.progress import (
9
+ Progress,
10
+ SpinnerColumn,
11
+ TextColumn,
12
+ )
9
13
  from rich.table import Table
10
14
  from rich.text import Text
15
+ from rich.spinner import Spinner
16
+
17
+ # Global lock to ensure only a single Rich Live context is active at any moment.
18
+ # Rich's Live render is **not** thread-safe; concurrent Live contexts on the same
19
+ # console raise runtime errors. Using a module-level lock serialises access and
20
+ # prevents crashes when multiple agents stream simultaneously in different
21
+ # threads (e.g., in ConcurrentWorkflow).
22
+ live_render_lock = threading.Lock()
23
+
24
+ # Global Live display for the dashboard
25
+ dashboard_live = None
26
+
27
+ # Create a spinner for loading animation
28
+ spinner = Spinner("dots", style="yellow")
11
29
 
12
30
 
13
31
  def choose_random_color():
@@ -37,6 +55,53 @@ class Formatter:
37
55
  Initializes the Formatter with a Rich Console instance.
38
56
  """
39
57
  self.console = Console()
58
+ self._dashboard_live = None
59
+ self._spinner_frames = [
60
+ "⠋",
61
+ "⠙",
62
+ "⠹",
63
+ "⠸",
64
+ "⠼",
65
+ "⠴",
66
+ "⠦",
67
+ "⠧",
68
+ "⠇",
69
+ "⠏",
70
+ ]
71
+ self._spinner_idx = 0
72
+
73
+ def _get_status_with_loading(self, status: str) -> Text:
74
+ """
75
+ Creates a status text with loading animation for running status.
76
+ """
77
+ if status.lower() == "running":
78
+ # Create loading bar effect
79
+ self._spinner_idx = (self._spinner_idx + 1) % len(
80
+ self._spinner_frames
81
+ )
82
+ spinner_char = self._spinner_frames[self._spinner_idx]
83
+ progress_bar = "█" * (self._spinner_idx % 5) + "░" * (
84
+ 4 - (self._spinner_idx % 5)
85
+ )
86
+ return Text(
87
+ f"{spinner_char} {status} {progress_bar}",
88
+ style="bold yellow",
89
+ )
90
+
91
+ # Style other statuses
92
+ status_style = {
93
+ "completed": "bold green",
94
+ "pending": "bold red",
95
+ "error": "bold red",
96
+ }.get(status.lower(), "white")
97
+
98
+ status_symbol = {
99
+ "completed": "✓",
100
+ "pending": "○",
101
+ "error": "✗",
102
+ }.get(status.lower(), "•")
103
+
104
+ return Text(f"{status_symbol} {status}", style=status_style)
40
105
 
41
106
  def _print_panel(
42
107
  self, content: str, title: str = "", style: str = "bold blue"
@@ -209,58 +274,155 @@ class Formatter:
209
274
  complete_response = ""
210
275
  chunks_collected = []
211
276
 
212
- # TRUE streaming with Rich's automatic text wrapping
213
- with Live(
214
- create_streaming_panel(streaming_text),
215
- console=self.console,
216
- refresh_per_second=20,
217
- ) as live:
218
- try:
219
- for part in streaming_response:
220
- if (
221
- hasattr(part, "choices")
222
- and part.choices
223
- and part.choices[0].delta.content
224
- ):
225
- # Add ONLY the new chunk to the Text object with random color style
226
- chunk = part.choices[0].delta.content
227
- streaming_text.append(chunk, style=text_style)
228
- complete_response += chunk
229
-
230
- # Collect chunks if requested
231
- if collect_chunks:
232
- chunks_collected.append(chunk)
233
-
234
- # Call chunk callback if provided
235
- if on_chunk_callback:
236
- on_chunk_callback(chunk)
237
-
238
- # Update display with new text - Rich handles all wrapping automatically
239
- live.update(
240
- create_streaming_panel(
241
- streaming_text, is_complete=False
277
+ # Acquire the lock so that only one Live panel is active at a time.
278
+ # Other threads will wait here until the current streaming completes,
279
+ # avoiding Rich.Live concurrency errors.
280
+ with live_render_lock:
281
+ # TRUE streaming with Rich's automatic text wrapping
282
+ with Live(
283
+ create_streaming_panel(streaming_text),
284
+ console=self.console,
285
+ refresh_per_second=20,
286
+ ) as live:
287
+ try:
288
+ for part in streaming_response:
289
+ if (
290
+ hasattr(part, "choices")
291
+ and part.choices
292
+ and part.choices[0].delta.content
293
+ ):
294
+ # Add ONLY the new chunk to the Text object with random color style
295
+ chunk = part.choices[0].delta.content
296
+ streaming_text.append(
297
+ chunk, style=text_style
298
+ )
299
+ complete_response += chunk
300
+
301
+ # Collect chunks if requested
302
+ if collect_chunks:
303
+ chunks_collected.append(chunk)
304
+
305
+ # Call chunk callback if provided
306
+ if on_chunk_callback:
307
+ on_chunk_callback(chunk)
308
+
309
+ # Update display with new text - Rich handles all wrapping automatically
310
+ live.update(
311
+ create_streaming_panel(
312
+ streaming_text, is_complete=False
313
+ )
242
314
  )
315
+
316
+ # Final update to show completion
317
+ live.update(
318
+ create_streaming_panel(
319
+ streaming_text, is_complete=True
243
320
  )
321
+ )
244
322
 
245
- # Final update to show completion
246
- live.update(
247
- create_streaming_panel(
248
- streaming_text, is_complete=True
323
+ except Exception as e:
324
+ # Handle any streaming errors gracefully
325
+ streaming_text.append(
326
+ f"\n[Error: {str(e)}]", style="bold red"
249
327
  )
250
- )
328
+ live.update(
329
+ create_streaming_panel(
330
+ streaming_text, is_complete=True
331
+ )
332
+ )
333
+
334
+ return complete_response
335
+
336
+ def _create_dashboard_table(
337
+ self, agents_data: List[Dict[str, Any]], title: str
338
+ ) -> Panel:
339
+ """
340
+ Creates the dashboard table with the current agent statuses.
341
+ """
342
+ # Create main table
343
+ table = Table(
344
+ show_header=True,
345
+ header_style="bold magenta",
346
+ expand=True,
347
+ title=title,
348
+ title_style="bold cyan",
349
+ border_style="bright_blue",
350
+ show_lines=True, # Add lines between rows
351
+ )
352
+
353
+ # Add columns with adjusted widths
354
+ table.add_column(
355
+ "Agent Name", style="cyan", width=30, no_wrap=True
356
+ )
357
+ table.add_column(
358
+ "Status", style="green", width=20, no_wrap=True
359
+ ) # Increased width for loading animation
360
+ table.add_column(
361
+ "Output", style="white", width=100, overflow="fold"
362
+ ) # Allow text to wrap
363
+
364
+ # Add rows for each agent
365
+ for agent in agents_data:
366
+ name = Text(agent["name"], style="bold cyan")
367
+ status = self._get_status_with_loading(agent["status"])
368
+ output = Text(str(agent["output"]))
369
+ table.add_row(name, status, output)
370
+
371
+ # Create a panel to wrap the table
372
+ dashboard_panel = Panel(
373
+ table,
374
+ border_style="bright_blue",
375
+ padding=(1, 2),
376
+ title=f"[bold cyan]{title}[/bold cyan] - Total Agents: [bold green]{len(agents_data)}[/bold green]",
377
+ expand=True, # Make panel expand to full width
378
+ )
379
+
380
+ return dashboard_panel
251
381
 
252
- except Exception as e:
253
- # Handle any streaming errors gracefully
254
- streaming_text.append(
255
- f"\n[Error: {str(e)}]", style="bold red"
382
+ def print_agent_dashboard(
383
+ self,
384
+ agents_data: List[Dict[str, Any]],
385
+ title: str = "🤖 Agent Dashboard",
386
+ is_final: bool = False,
387
+ ) -> None:
388
+ """
389
+ Displays a beautiful dashboard showing agent information in a panel-like spreadsheet format.
390
+ Updates in place instead of printing multiple times.
391
+
392
+ Args:
393
+ agents_data (List[Dict[str, Any]]): List of dictionaries containing agent information.
394
+ Each dict should have: name, status, output
395
+ title (str): The title of the dashboard.
396
+ is_final (bool): Whether this is the final update of the dashboard.
397
+ """
398
+ with live_render_lock:
399
+ if self._dashboard_live is None:
400
+ # Create new Live display if none exists
401
+ self._dashboard_live = Live(
402
+ self._create_dashboard_table(agents_data, title),
403
+ console=self.console,
404
+ refresh_per_second=10, # Increased refresh rate
405
+ transient=False, # Make display persistent
256
406
  )
257
- live.update(
258
- create_streaming_panel(
259
- streaming_text, is_complete=True
260
- )
407
+ self._dashboard_live.start()
408
+ else:
409
+ # Update existing Live display
410
+ self._dashboard_live.update(
411
+ self._create_dashboard_table(agents_data, title)
261
412
  )
262
413
 
263
- return complete_response
414
+ # If this is the final update, add a newline to separate from future output
415
+ if is_final:
416
+ self.console.print() # Add blank line after final display
417
+
418
+ def stop_dashboard(self):
419
+ """
420
+ Stops and cleans up the dashboard display.
421
+ """
422
+ if self._dashboard_live is not None:
423
+ self._dashboard_live.stop()
424
+ self.console.print() # Add blank line after stopping
425
+ self._dashboard_live = None
264
426
 
265
427
 
266
428
  formatter = Formatter()
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.3
2
2
  Name: swarms
3
- Version: 7.9.2
3
+ Version: 7.9.4
4
4
  Summary: Swarms - TGSC
5
5
  License: MIT
6
6
  Keywords: artificial intelligence,deep learning,optimizers,Prompt Engineering,swarms,agents,llms,transformers,multi-agent,swarms of agents,Enterprise-Grade Agents,Production-Grade Agents,Agents,Multi-Grade-Agents,Swarms,Transformers,LLMs,Prompt Engineering,Agents,Generative Agents,Generative AI,Agent Marketplace,Agent Store,quant,finance,algorithmic trading,portfolio optimization,risk management,financial modeling,machine learning for finance,natural language processing for finance
@@ -12,7 +12,7 @@ swarms/agents/gkp_agent.py,sha256=5Jms3zHQ2qwJ6-PHDh9X-cFtAlH4dSUoDgRqN-xZzog,21
12
12
  swarms/agents/i_agent.py,sha256=_kqGt3a4SGB21_GP-KcV8A5p_9wneShs6eJUJYFdluw,12274
13
13
  swarms/agents/openai_assistant.py,sha256=mTSEtj26J0mc5pCeWrmMY0EXzTRYQfyfw_BtOqtcCHc,11044
14
14
  swarms/agents/react_agent.py,sha256=yM8lQoRsqJZicqtmgBrC7RHv0aKEb5oZHh4q5aAA_xs,5804
15
- swarms/agents/reasoning_agents.py,sha256=Z_YETF-hzG7qL-h6WB1qNR6QU4g784M9NzO5C0_kWtA,9639
15
+ swarms/agents/reasoning_agents.py,sha256=0pdvNtRBtBJU-fGYeGfplxQkyxZGTqkZisqpAq1zGkU,8631
16
16
  swarms/agents/reasoning_duo.py,sha256=4qw9RtwmWkWnDWjEtJqYFVLh--EV9YQd24-fQa0lMfM,3873
17
17
  swarms/agents/self_agent_builder.py,sha256=bX7xSwak6HiyK901VdeE8OlT4yqE0n7jyHcWJrkMeew,1104
18
18
  swarms/agents/tool_agent.py,sha256=G7rhBACsHsGUMT4H9eF5aY7e3Gx-5jOmJkhCF1jm9mU,5087
@@ -106,7 +106,7 @@ swarms/schemas/mcp_schemas.py,sha256=XZJ4HyiY_cv8Gvj-53ddjzXuqT9hBU2f0cHbhIKs_jY
106
106
  swarms/schemas/swarms_api_schemas.py,sha256=uKqleW_7hNpqHi06yoba9jS2i9yzZp-SBV944MnkN68,6233
107
107
  swarms/schemas/tool_schema_base_model.py,sha256=0biTGIoibsPPP3fOrkC6WvNU5vXaalyccVKC1fpO_eg,1409
108
108
  swarms/structs/__init__.py,sha256=8_CG2mct9cS-TQlpKlC5-240kSjmoooy9bfYXRuB9oQ,4552
109
- swarms/structs/agent.py,sha256=KFlloIhQQivm5hTtNI2ZFzqs4bRaC5cMaqs2mnOA-eY,120067
109
+ swarms/structs/agent.py,sha256=hkFhZYZVjNrcHQv4nm5qkaRNHmjyf2LNsp5UZy1CXJk,127157
110
110
  swarms/structs/agent_builder.py,sha256=tYNpfO4_8cgfMHfgA5DAOWffHnt70p6CLt59esqfVCY,12133
111
111
  swarms/structs/agent_rag_handler.py,sha256=g17YRrNmf16TLvyFCCcsitVk3d-QNZmck_XYmjSN_YM,21372
112
112
  swarms/structs/agent_registry.py,sha256=il507cO1NF-d4ChyANVLuWrN8bXsEAi8_7bLJ_sTU6A,12112
@@ -119,7 +119,7 @@ swarms/structs/base_swarm.py,sha256=bO5olk16je7aJ_XmJxiD6y4nVlbvOySZpc5JX6Rdpvg,
119
119
  swarms/structs/base_workflow.py,sha256=DTfFwX3AdFYxACDYwUDqhsbcDZnITlg5TeEYyxmJBCc,11414
120
120
  swarms/structs/batch_agent_execution.py,sha256=d85DzeCq4uTbbPqLhAXFqFx_cxXUS5yRnJ1-gJkwU5w,1871
121
121
  swarms/structs/concat.py,sha256=utezSxNyh1mIwXgdf8-dJ803NDPyEy79WE8zJHuooGk,732
122
- swarms/structs/concurrent_workflow.py,sha256=SCyK-weYYpRb5EG3wZW4z7cF9isoIdpN7CvIVQaB7jg,8343
122
+ swarms/structs/concurrent_workflow.py,sha256=0Yo_eMKxdbLfqkVmEJpyL0_cjMUH5NrBu-r-EWltMwU,14477
123
123
  swarms/structs/conversation.py,sha256=mmsvR15zWxsJ4dgyxwwunIifvfcVO4gfJr5zl0RxaSA,52258
124
124
  swarms/structs/council_judge.py,sha256=siYDKiHMvFmShUTXxdo4R6vXiQhKt7bEBI205oC3kU4,19639
125
125
  swarms/structs/csv_to_agent.py,sha256=Zv41sjeWA50msq-paGHESzlxZyMU78DYDLNNKZtNfoI,11125
@@ -131,10 +131,10 @@ swarms/structs/groupchat.py,sha256=jjH0BqU9Nrd_3jl9QzrcvbSce527SFpUaepawaRiw2o,1
131
131
  swarms/structs/hiearchical_swarm.py,sha256=6JwYWlsmwsVtOr2xlzl2q0IRsGvr-RFzDG9ClIJWTQo,33400
132
132
  swarms/structs/hybrid_hiearchical_peer_swarm.py,sha256=0BrmzSVit-I_04DFfrs7onLblLA6PSPa0JE3-4j05FA,9316
133
133
  swarms/structs/image_batch_processor.py,sha256=31Z8vTVL4dw18QxGwb0Jg1nvp0YzX8lwVgGj_-KrkhY,8207
134
- swarms/structs/interactive_groupchat.py,sha256=tlI4BiDRKQK2YtHvbWvT-Z0rhfpfsywavj1CHfZc7F8,41169
134
+ swarms/structs/interactive_groupchat.py,sha256=zgumadD7YCFAqzNrh9CKMSWKe66aBkohIxPgQs3IU2k,40370
135
135
  swarms/structs/long_agent.py,sha256=KFjE2uUI8ONTkeJO43Sh3y5-Ec0kga28BECGklic-S4,15049
136
136
  swarms/structs/ma_blocks.py,sha256=04dF3DOSHXxNwrcl9QUloKgNDkI9yLRv6UbyyiKsIb0,4551
137
- swarms/structs/ma_utils.py,sha256=XJYxqWxFKBmdDekdX_BVGmmBxLbnz7hURMS2ZpVIcK8,3854
137
+ swarms/structs/ma_utils.py,sha256=-7wTLVq9PHbXxt3QP9ngFA4mHV8H4dIOmhrXml4Iwcc,5933
138
138
  swarms/structs/majority_voting.py,sha256=7RGMTNX-ulH5McV0LPkpGEOkwYgsBdzTzHk5G_g_YUY,10120
139
139
  swarms/structs/malt.py,sha256=uLofKBWHkP3uNhyCkkgEyE4Z7qnOHTtcg-OTiR19x_Y,19572
140
140
  swarms/structs/matrix_swarm.py,sha256=qHuhOYrTyOv6ujHMe8PrQT-h-WmaCPCfX4ghv5L8UFI,9765
@@ -145,10 +145,10 @@ swarms/structs/multi_agent_exec.py,sha256=3hIGgwJ_mQwgD16N096jN48-DEIZWFPoetR2nC
145
145
  swarms/structs/multi_agent_router.py,sha256=A4MDd4_QAoarrLaxClnCxnEP62bSMFvyq77ttqeq3u8,11049
146
146
  swarms/structs/multi_model_gpu_manager.py,sha256=gHC6MmVia4etMD6RlpEdbqZtV7ng4f-6jVMH0Zrt8y4,47356
147
147
  swarms/structs/omni_agent_types.py,sha256=RdKLfZ-lXDJrEa0aJT_Rfx9TypJQo8SISqKz4fnLkAk,230
148
- swarms/structs/rearrange.py,sha256=x8dU19blC2ED8xEi1NPF5_GMgsupKbZ08nVVEQEGmaQ,22598
148
+ swarms/structs/rearrange.py,sha256=V_CiIIMknZVmTwvr3a4zyimGtbAGaPPmna49nn2k88g,20661
149
149
  swarms/structs/round_robin.py,sha256=MGk623KiN9uSxTMG6MY_BIAkvEDh1RPwyl5Min7GLOU,7573
150
150
  swarms/structs/safe_loading.py,sha256=gmYX8G9TsvAIp6OCvREBZt5mwSFc-p-t1rSnDBfhEmE,7124
151
- swarms/structs/sequential_workflow.py,sha256=CP-MmxSEJpQCJFivegQyK0GTff5k3jFZbso3t3bSu00,8524
151
+ swarms/structs/sequential_workflow.py,sha256=j_WsB_zwsqWdI82Q6D9MaHKg9I70Q7cKpQbH9OeN4fM,8338
152
152
  swarms/structs/spreadsheet_swarm.py,sha256=ToX56QJjlm_nnC3MYppvKC_NTr9Zy_orkBzfxNLdwbA,14845
153
153
  swarms/structs/stopping_conditions.py,sha256=JHHwqgPoUvjX897ofW2gpPZH_cqEWmv5lDTqb2GtA6M,1382
154
154
  swarms/structs/swarm_arange.py,sha256=5ewEfL52Y4gh-a0lRjFcleHWlsCBuc5XR1nVEEGh07w,15481
@@ -156,7 +156,7 @@ swarms/structs/swarm_eval.py,sha256=148E2R2zaCmt_LZYx15nmdFjybXHiQ2CZbl6pk77jNs,
156
156
  swarms/structs/swarm_id_generator.py,sha256=Wly7AtGM9e6VgzhYmfg8_gSOdxAdsOvWHJFK81cpQNQ,68
157
157
  swarms/structs/swarm_matcher.py,sha256=HUCxTWRnxT5Rix3CMKEuJCqNleqPA9xGrWFGw6rjcTw,26821
158
158
  swarms/structs/swarm_registry.py,sha256=P0XRrqp1qBNyt0BycqPQljUzKv9jClaQMhtaBMinhYg,5578
159
- swarms/structs/swarm_router.py,sha256=cr_-bx_Axhq3FM9UyRmgyg3CfVKGU012ZPnYdaYClB0,26574
159
+ swarms/structs/swarm_router.py,sha256=XO_KSsEKMpEpTzTvyUpqa06QFutIFlRds7aGNuhUeSI,26748
160
160
  swarms/structs/swarming_architectures.py,sha256=guNQU2N7Ofuk01fZbU3tmBJymnZ9zdGULpPZAdaqCeA,28276
161
161
  swarms/structs/tree_swarm.py,sha256=AnIxrt0KhWxAQN8uGjfCcOq-XCmsuTJiH8Ex4mXy8V8,12500
162
162
  swarms/structs/utils.py,sha256=Mo6wHQYOB8baWZUKnAJN5Dsgubpo81umNwJIEDitb2A,1873
@@ -192,7 +192,7 @@ swarms/utils/check_all_model_max_tokens.py,sha256=ZHIKlrU-L-OM2IJAbYkCoVyBKe2d0J
192
192
  swarms/utils/data_to_text.py,sha256=1PUoWokylp7MOrGNk1cmO3cJlfskdAIiImGk9ECwsKU,3427
193
193
  swarms/utils/disable_logging.py,sha256=KKPKQVfQqLPFgj03uveOoyeHOTlfEJt-yfLc3SA53Rk,2470
194
194
  swarms/utils/file_processing.py,sha256=QjQCIPTcwicQlfy656BXBYpIzMR0s2343E7ftnok5Uo,4865
195
- swarms/utils/formatter.py,sha256=PDtaj93jwySIaGy4kO7nEoHSAEaNs5CRiM6sKOBZEME,8813
195
+ swarms/utils/formatter.py,sha256=IpYrGlGfcBX1jGrsxqIDhO4szrMbk0jQqtKrTGZbMQY,14724
196
196
  swarms/utils/function_caller_model.py,sha256=ZfgCMzOizNnuZipYLclTziECNHszH9p8RQcUq7VNr4Q,4156
197
197
  swarms/utils/generate_keys.py,sha256=o5zp_8rwu5sgQnItWS1xAuIIRIkahwm02qy1vsV6DSQ,997
198
198
  swarms/utils/history_output_formatter.py,sha256=whjfk4N5SjMo3mtrafNny_alNiAhQcGza3l1dCyg7Nw,1388
@@ -208,8 +208,8 @@ swarms/utils/str_to_dict.py,sha256=T3Jsdjz87WIlkSo7jAW6BB80sv0Ns49WT1qXlOrdEoE,8
208
208
  swarms/utils/try_except_wrapper.py,sha256=uvDZDZJcH986EF0Ej6zZBLcqHJ58NHizPsAH5olrE7Q,3919
209
209
  swarms/utils/vllm_wrapper.py,sha256=sNkm4EbeMrqqmHidnvq5zTnofQAaARy3HIrNBu11lKs,5072
210
210
  swarms/utils/xml_utils.py,sha256=D4nEdo1nkHqSoTKrWylXBXjcHFhGaOYvvfGNQQoYV5o,2514
211
- swarms-7.9.2.dist-info/LICENSE,sha256=jwRtEmTWjLrEsvFB6QFdYs2cEeZPRMdj-UMOFkPF8_0,11363
212
- swarms-7.9.2.dist-info/METADATA,sha256=AV-TV_QK1dsuaB6awZJAlqzXgBM6ZYfEV1p2Cdz4Ma0,32138
213
- swarms-7.9.2.dist-info/WHEEL,sha256=b4K_helf-jlQoXBBETfwnf4B04YC67LOev0jo4fX5m8,88
214
- swarms-7.9.2.dist-info/entry_points.txt,sha256=2K0rTtfO1X1WaO-waJlXIKw5Voa_EpAL_yU0HXE2Jgc,47
215
- swarms-7.9.2.dist-info/RECORD,,
211
+ swarms-7.9.4.dist-info/LICENSE,sha256=jwRtEmTWjLrEsvFB6QFdYs2cEeZPRMdj-UMOFkPF8_0,11363
212
+ swarms-7.9.4.dist-info/METADATA,sha256=8jzaBd4MWGhsDSfrmyblph_Qa5-Pz5_F3EG1QCmnNAc,32138
213
+ swarms-7.9.4.dist-info/WHEEL,sha256=b4K_helf-jlQoXBBETfwnf4B04YC67LOev0jo4fX5m8,88
214
+ swarms-7.9.4.dist-info/entry_points.txt,sha256=2K0rTtfO1X1WaO-waJlXIKw5Voa_EpAL_yU0HXE2Jgc,47
215
+ swarms-7.9.4.dist-info/RECORD,,
File without changes