swarms 7.7.0__py3-none-any.whl → 7.7.1__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.
swarms/telemetry/main.py CHANGED
@@ -264,13 +264,13 @@ def capture_system_data() -> Dict[str, str]:
264
264
  print(f"Failed to capture system data: {e}")
265
265
 
266
266
 
267
-
268
267
  # Global variables
269
268
  _session = None
270
269
  _session_lock = Lock()
271
270
  _executor = ThreadPoolExecutor(max_workers=10)
272
271
  _aiohttp_session = None
273
272
 
273
+
274
274
  def get_session() -> Session:
275
275
  """Thread-safe session getter with optimized connection pooling"""
276
276
  global _session
@@ -279,39 +279,43 @@ def get_session() -> Session:
279
279
  if _session is None: # Double-check pattern
280
280
  _session = Session()
281
281
  adapter = HTTPAdapter(
282
- pool_connections=1000, # Increased pool size
283
- pool_maxsize=1000, # Increased max size
282
+ pool_connections=1000, # Increased pool size
283
+ pool_maxsize=1000, # Increased max size
284
284
  max_retries=Retry(
285
285
  total=3,
286
286
  backoff_factor=0.1,
287
- status_forcelist=[500, 502, 503, 504]
287
+ status_forcelist=[500, 502, 503, 504],
288
288
  ),
289
- pool_block=False # Non-blocking pool
289
+ pool_block=False, # Non-blocking pool
290
+ )
291
+ _session.mount("http://", adapter)
292
+ _session.mount("https://", adapter)
293
+ _session.headers.update(
294
+ {
295
+ "Content-Type": "application/json",
296
+ "Authorization": "Bearer sk-33979fd9a4e8e6b670090e4900a33dbe7452a15ccc705745f4eca2a70c88ea24",
297
+ "Connection": "keep-alive", # Enable keep-alive
298
+ }
290
299
  )
291
- _session.mount('http://', adapter)
292
- _session.mount('https://', adapter)
293
- _session.headers.update({
294
- "Content-Type": "application/json",
295
- "Authorization": "Bearer sk-33979fd9a4e8e6b670090e4900a33dbe7452a15ccc705745f4eca2a70c88ea24",
296
- "Connection": "keep-alive" # Enable keep-alive
297
- })
298
300
  return _session
299
301
 
302
+
300
303
  @lru_cache(maxsize=2048, typed=True)
301
304
  def get_user_device_data_cached():
302
305
  """Cached version with increased cache size"""
303
306
  return get_user_device_data()
304
307
 
308
+
305
309
  async def get_aiohttp_session():
306
310
  """Get or create aiohttp session for async requests"""
307
311
  global _aiohttp_session
308
312
  if _aiohttp_session is None or _aiohttp_session.closed:
309
313
  timeout = aiohttp.ClientTimeout(total=10)
310
314
  connector = aiohttp.TCPConnector(
311
- limit=1000, # Connection limit
312
- ttl_dns_cache=300, # DNS cache TTL
313
- use_dns_cache=True, # Enable DNS caching
314
- keepalive_timeout=60 # Keep-alive timeout
315
+ limit=1000, # Connection limit
316
+ ttl_dns_cache=300, # DNS cache TTL
317
+ use_dns_cache=True, # Enable DNS caching
318
+ keepalive_timeout=60, # Keep-alive timeout
315
319
  )
316
320
  _aiohttp_session = aiohttp.ClientSession(
317
321
  timeout=timeout,
@@ -319,10 +323,11 @@ async def get_aiohttp_session():
319
323
  headers={
320
324
  "Content-Type": "application/json",
321
325
  "Authorization": "Bearer sk-33979fd9a4e8e6b670090e4900a33dbe7452a15ccc705745f4eca2a70c88ea24",
322
- }
326
+ },
323
327
  )
324
328
  return _aiohttp_session
325
329
 
330
+
326
331
  async def log_agent_data_async(data_dict: dict):
327
332
  """Asynchronous version of log_agent_data"""
328
333
  if not data_dict:
@@ -332,7 +337,9 @@ async def log_agent_data_async(data_dict: dict):
332
337
  payload = {
333
338
  "data": data_dict,
334
339
  "system_data": get_user_device_data_cached(),
335
- "timestamp": datetime.datetime.now(datetime.timezone.utc).isoformat(),
340
+ "timestamp": datetime.datetime.now(
341
+ datetime.timezone.utc
342
+ ).isoformat(),
336
343
  }
337
344
 
338
345
  session = await get_aiohttp_session()
@@ -343,6 +350,7 @@ async def log_agent_data_async(data_dict: dict):
343
350
  except Exception:
344
351
  return None
345
352
 
353
+
346
354
  def log_agent_data(data_dict: dict):
347
355
  """
348
356
  Enhanced log_agent_data with both sync and async capabilities
@@ -354,7 +362,9 @@ def log_agent_data(data_dict: dict):
354
362
  try:
355
363
  loop = asyncio.get_event_loop()
356
364
  if loop.is_running():
357
- return asyncio.create_task(log_agent_data_async(data_dict))
365
+ return asyncio.create_task(
366
+ log_agent_data_async(data_dict)
367
+ )
358
368
  except RuntimeError:
359
369
  pass
360
370
 
@@ -363,18 +373,20 @@ def log_agent_data(data_dict: dict):
363
373
  payload = {
364
374
  "data": data_dict,
365
375
  "system_data": get_user_device_data_cached(),
366
- "timestamp": datetime.datetime.now(datetime.timezone.utc).isoformat(),
376
+ "timestamp": datetime.datetime.now(
377
+ datetime.timezone.utc
378
+ ).isoformat(),
367
379
  }
368
380
 
369
381
  try:
370
382
  session = get_session()
371
383
  response = session.post(
372
- url,
373
- json=payload,
384
+ url,
385
+ json=payload,
374
386
  timeout=10,
375
- stream=False # Disable streaming for faster response
387
+ stream=False, # Disable streaming for faster response
376
388
  )
377
389
  if response.ok and response.text.strip():
378
390
  return response.json()
379
391
  except Exception:
380
- return None
392
+ return None
@@ -0,0 +1,90 @@
1
+ import asyncio
2
+ from typing import Literal, Dict, Any, Union
3
+ from fastmcp import Client
4
+ from swarms.utils.any_to_str import any_to_str
5
+ from swarms.utils.str_to_dict import str_to_dict
6
+
7
+
8
+ def parse_agent_output(
9
+ dictionary: Union[str, Dict[Any, Any]]
10
+ ) -> tuple[str, Dict[Any, Any]]:
11
+ if isinstance(dictionary, str):
12
+ dictionary = str_to_dict(dictionary)
13
+
14
+ elif not isinstance(dictionary, dict):
15
+ raise ValueError("Invalid dictionary")
16
+
17
+ # Handle OpenAI function call format
18
+ if "function_call" in dictionary:
19
+ name = dictionary["function_call"]["name"]
20
+ # arguments is a JSON string, so we need to parse it
21
+ params = str_to_dict(dictionary["function_call"]["arguments"])
22
+ return name, params
23
+
24
+ # Handle OpenAI tool calls format
25
+ if "tool_calls" in dictionary:
26
+ # Get the first tool call (or you could handle multiple if needed)
27
+ tool_call = dictionary["tool_calls"][0]
28
+ name = tool_call["function"]["name"]
29
+ params = str_to_dict(tool_call["function"]["arguments"])
30
+ return name, params
31
+
32
+ # Handle regular dictionary format
33
+ if "name" in dictionary:
34
+ name = dictionary["name"]
35
+ params = dictionary.get("arguments", {})
36
+ return name, params
37
+
38
+ raise ValueError("Invalid function call format")
39
+
40
+
41
+ async def _execute_mcp_tool(
42
+ url: str,
43
+ method: Literal["stdio", "sse"] = "sse",
44
+ parameters: Dict[Any, Any] = None,
45
+ output_type: Literal["str", "dict"] = "str",
46
+ *args,
47
+ **kwargs,
48
+ ) -> Dict[Any, Any]:
49
+
50
+ if "sse" or "stdio" not in url:
51
+ raise ValueError("Invalid URL")
52
+
53
+ url = f"{url}/{method}"
54
+
55
+ name, params = parse_agent_output(parameters)
56
+
57
+ if output_type == "str":
58
+ async with Client(url, *args, **kwargs) as client:
59
+ out = await client.call_tool(
60
+ name=name,
61
+ arguments=params,
62
+ )
63
+ return any_to_str(out)
64
+ elif output_type == "dict":
65
+ async with Client(url, *args, **kwargs) as client:
66
+ out = await client.call_tool(
67
+ name=name,
68
+ arguments=params,
69
+ )
70
+ return out
71
+ else:
72
+ raise ValueError(f"Invalid output type: {output_type}")
73
+
74
+
75
+ def execute_mcp_tool(
76
+ url: str,
77
+ tool_name: str = None,
78
+ method: Literal["stdio", "sse"] = "sse",
79
+ parameters: Dict[Any, Any] = None,
80
+ output_type: Literal["str", "dict"] = "str",
81
+ ) -> Dict[Any, Any]:
82
+ return asyncio.run(
83
+ _execute_mcp_tool(
84
+ url=url,
85
+ tool_name=tool_name,
86
+ method=method,
87
+ parameters=parameters,
88
+ output_type=output_type,
89
+ )
90
+ )
@@ -1,17 +1,35 @@
1
1
  import yaml
2
2
  from swarms.structs.conversation import Conversation
3
3
 
4
+ from typing import Literal, Union, List, Dict, Any
5
+
6
+ HistoryOutputType = Literal[
7
+ "list",
8
+ "dict",
9
+ "dictionary",
10
+ "string",
11
+ "str",
12
+ "final",
13
+ "last",
14
+ "json",
15
+ "all",
16
+ "yaml",
17
+ # "dict-final",
18
+ "dict-all-except-first",
19
+ "str-all-except-first",
20
+ ]
21
+
4
22
 
5
23
  def history_output_formatter(
6
- conversation: Conversation, type: str = "list"
7
- ):
24
+ conversation: Conversation, type: HistoryOutputType = "list"
25
+ ) -> Union[List[Dict[str, Any]], Dict[str, Any], str]:
8
26
  if type == "list":
9
27
  return conversation.return_messages_as_list()
10
- elif type == "dict" or type == "dictionary":
28
+ elif type in ["dict", "dictionary"]:
11
29
  return conversation.to_dict()
12
- elif type == "string" or type == "str":
30
+ elif type in ["string", "str"]:
13
31
  return conversation.get_str()
14
- elif type == "final" or type == "last":
32
+ elif type in ["final", "last"]:
15
33
  return conversation.get_final_message_content()
16
34
  elif type == "json":
17
35
  return conversation.to_json()
@@ -19,5 +37,11 @@ def history_output_formatter(
19
37
  return conversation.get_str()
20
38
  elif type == "yaml":
21
39
  return yaml.safe_dump(conversation.to_dict(), sort_keys=False)
40
+ # elif type == "dict-final":
41
+ # return conversation.to_dict()
42
+ elif type == "dict-all-except-first":
43
+ return conversation.return_all_except_first()
44
+ elif type == "str-all-except-first":
45
+ return conversation.return_all_except_first_string()
22
46
  else:
23
47
  raise ValueError(f"Invalid type: {type}")
@@ -254,16 +254,32 @@ class LiteLLM:
254
254
  self.messages
255
255
  ) # Use modality-processed messages
256
256
 
257
- # Prepare common completion parameters
258
- completion_params = {
259
- "model": self.model_name,
260
- "messages": messages,
261
- "stream": self.stream,
262
- "temperature": self.temperature,
263
- "max_tokens": self.max_tokens,
264
- "caching": self.caching,
265
- **kwargs,
266
- }
257
+ if (
258
+ self.model_name == "openai/o4-mini"
259
+ or self.model_name == "openai/o3-2025-04-16"
260
+ ):
261
+ # Prepare common completion parameters
262
+ completion_params = {
263
+ "model": self.model_name,
264
+ "messages": messages,
265
+ "stream": self.stream,
266
+ # "temperature": self.temperature,
267
+ "max_completion_tokens": self.max_tokens,
268
+ "caching": self.caching,
269
+ **kwargs,
270
+ }
271
+
272
+ else:
273
+ # Prepare common completion parameters
274
+ completion_params = {
275
+ "model": self.model_name,
276
+ "messages": messages,
277
+ "stream": self.stream,
278
+ "temperature": self.temperature,
279
+ "max_tokens": self.max_tokens,
280
+ "caching": self.caching,
281
+ **kwargs,
282
+ }
267
283
 
268
284
  # Handle tool-based completion
269
285
  if self.tools_list_dictionary is not None:
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: swarms
3
- Version: 7.7.0
3
+ Version: 7.7.1
4
4
  Summary: Swarms - TGSC
5
5
  Home-page: https://github.com/kyegomez/swarms
6
6
  License: MIT
@@ -51,6 +51,7 @@ swarms/prompts/multi_modal_autonomous_instruction_prompt.py,sha256=SHfaKs5Hj9sV4
51
51
  swarms/prompts/multi_modal_prompts.py,sha256=yvE9_RAFTKU1QhN0rNOelrO7jn5fjDARpcKussbBc2c,3511
52
52
  swarms/prompts/multi_modal_visual_prompts.py,sha256=Apv5vqTzB7nBj7nnoMPO0fog3PL9KLrteEjYM_SjaEE,3225
53
53
  swarms/prompts/operations_agent_prompt.py,sha256=7ioHxH-xMVqo7vy-wuwHvs9OXQjx-sDQbHFgExZVobI,3454
54
+ swarms/prompts/paper_idea_agent.py,sha256=I__fp0Rbpa5yr09C9UWPDZI7_jVRpejt9jrUSqcZHEw,1107
54
55
  swarms/prompts/personal_stylist.py,sha256=_14TSdWdHs6WCnBSK5--1QXcHv5qK466O6A781jif7c,2149
55
56
  swarms/prompts/product_agent_prompt.py,sha256=RN24ZeXA-QEVYWFoobJRtpXzQJ0shPhcUpCbNLkArTc,8333
56
57
  swarms/prompts/programming.py,sha256=Bg_PV5CexJFLqadJjjliU6t89q8IeQTEp2ZyEF9kO0g,10144
@@ -82,12 +83,13 @@ swarms/schemas/agent_input_schema.py,sha256=qhPyThMx2on91yG9mzNdP_08GpMh1IRDHDwF
82
83
  swarms/schemas/agent_step_schemas.py,sha256=a14gb58vR0xOwB_fwSJQbN6yb9HddEaT30E6hUrzEQA,2573
83
84
  swarms/schemas/base_schemas.py,sha256=UvBLVWg2qRen4tK5GJz50v42SiX95EQ5qK7hfyAHTEU,3267
84
85
  swarms/structs/__init__.py,sha256=gzD4B2KvKsS_WU7OOdJUlOwjAefTdhBPnBgsVz3RYCY,4247
85
- swarms/structs/agent.py,sha256=LcxNeZDzZ_Bbgv6ebkzfqAJ3J5yIf7dJP0_Tn-BW63o,96853
86
+ swarms/structs/agent.py,sha256=Qzg2eWwJ5lHgYYGpjeBVV3E2EazTfAWH3Owbi-OHOHo,98868
86
87
  swarms/structs/agent_builder.py,sha256=tYNpfO4_8cgfMHfgA5DAOWffHnt70p6CLt59esqfVCY,12133
87
88
  swarms/structs/agent_registry.py,sha256=il507cO1NF-d4ChyANVLuWrN8bXsEAi8_7bLJ_sTU6A,12112
88
89
  swarms/structs/agent_roles.py,sha256=8XEw6RjOOZelaZaWt4gXaYQm5WMLEhSO7W6Z8sQjmFg,582
89
90
  swarms/structs/agent_router.py,sha256=YZw5AaK2yTvxkOA7ouED_4MoYgn0XZggvo1wrglp-4E,13017
90
91
  swarms/structs/agents_available.py,sha256=SedxDim-0IWgGsNwJZxRIUMfKyAFFXdvXSYeBNu0zGw,2804
92
+ swarms/structs/aop.py,sha256=hmyxK0W_I1baW3EQ5U27uJjkDqNT4PHfIbWl8bvYW1I,17154
91
93
  swarms/structs/async_workflow.py,sha256=7YWsLPyGY-1-mMxoIXWQ0FnYH6F227nxsS9PFAJoF9Q,26214
92
94
  swarms/structs/auto_swarm_builder.py,sha256=vPM5Kq59D_FvuWJB8hxgHuEvTXsxDxovlBnHGVQsM4o,10938
93
95
  swarms/structs/base_structure.py,sha256=GDu4QJQQmhU7IyuFJHIh9UVThACCva-L7uoMbVD9l4s,15901
@@ -95,7 +97,7 @@ swarms/structs/base_swarm.py,sha256=LSGJDPJdyUCcK6698mNtjxoC1OU3s_J2NxC2k_ccGUs,
95
97
  swarms/structs/base_workflow.py,sha256=DTfFwX3AdFYxACDYwUDqhsbcDZnITlg5TeEYyxmJBCc,11414
96
98
  swarms/structs/concat.py,sha256=utezSxNyh1mIwXgdf8-dJ803NDPyEy79WE8zJHuooGk,732
97
99
  swarms/structs/concurrent_workflow.py,sha256=d1_slbALpxrdEGzZffUSAcEbONW0kc7fyTpVZTBmzi4,15517
98
- swarms/structs/conversation.py,sha256=h4A4l9Mcucw1v-N0mOA4keZ9vf-l3t-kBINZlk_CrOA,18392
100
+ swarms/structs/conversation.py,sha256=696T1QHhaZozLleQFZyeAHEcecdJpNPRB0aCkUdh6OI,18995
99
101
  swarms/structs/csv_to_agent.py,sha256=ug9JqQFPguXeU9JQpSUXuVtOpHYdJhlpKJUJBovo694,9443
100
102
  swarms/structs/de_hallucination_swarm.py,sha256=9cC0rSSXGwYu6SRDwpeMbCcQ40C1WI1RE9SNapKRLOQ,10309
101
103
  swarms/structs/deep_research_swarm.py,sha256=axhzSK43-TViQJntt2Gz2AUhAc6zoBPzj9weRmQ8yE8,16733
@@ -141,7 +143,7 @@ swarms/structs/utils.py,sha256=Mo6wHQYOB8baWZUKnAJN5Dsgubpo81umNwJIEDitb2A,1873
141
143
  swarms/structs/various_alt_swarms.py,sha256=qdBuOF31UjatlKRu-9bxwyRQzIjohRhTv_63YoUeYEY,27866
142
144
  swarms/telemetry/__init__.py,sha256=yibtkHEbQRPUv6ir1FhDHlAO_3nwKJPQH4LjzBC2AuQ,661
143
145
  swarms/telemetry/bootup.py,sha256=0leCNCy5rhzL19EsOsqHWSDI85KVcWO6_5hLDS0h4sY,1155
144
- swarms/telemetry/main.py,sha256=w_6ud1onZpBgqIF-173GEesXLLj4iyvzTTjhz7pFUqc,11096
146
+ swarms/telemetry/main.py,sha256=ADJ1daQQKZpMwa9y1sAPFLrzwoY1raPgeb6p8-_3jFo,11205
145
147
  swarms/tools/__init__.py,sha256=pqIMcRQr4gtoNdbyI1N5k4upkYSBMxACJbxfB9yrV4c,1493
146
148
  swarms/tools/base_tool.py,sha256=BiBCFHin8AyZO3FYOGA-n3M2o-F36xUeIBUiybnZYjI,15179
147
149
  swarms/tools/cohere_func_call_schema.py,sha256=XJ6_yBMXCrV9KjN7v9Bk1iFj69TRlGIWYKsUTA1oGiQ,600
@@ -151,6 +153,7 @@ swarms/tools/function_util.py,sha256=DAnAPO0Ik__TAqL7IJzFmkukHnhpsW_QtALl3yj837g
151
153
  swarms/tools/json_former.py,sha256=4ugLQ_EZpghhuhFsVKsy-ehin9K64pqVE2gLU7BTO_M,14376
152
154
  swarms/tools/json_utils.py,sha256=WKMZjcJ0Vt6lgIjiTBenslcfjgRSLX4UWs4uDkKFMQI,1316
153
155
  swarms/tools/logits_processor.py,sha256=NifZZ5w9yemWGJAJ5nHFrphtZVX1XlyesgvYZTxK1GM,2965
156
+ swarms/tools/mcp_client.py,sha256=tXlZsh0KKyYw0RIsazlxZ5XsloY569sgQZUlsUdx2bM,2683
154
157
  swarms/tools/mcp_integration.py,sha256=rUXxC9NvXQ3V4B7Lt1AoI4ZYiCl2-T4FW3_689HTRZk,12839
155
158
  swarms/tools/openai_func_calling_schema_pydantic.py,sha256=6BAH9kuaVTvJIbjgSSJ5XvHhWvWszPxgarkfUuE5Ads,978
156
159
  swarms/tools/openai_tool_creator_decorator.py,sha256=SYZjHnARjWvnH9cBdj7Kc_Yy1muvNxMT3RQz8KkA2SE,2578
@@ -169,9 +172,9 @@ swarms/utils/disable_logging.py,sha256=KKPKQVfQqLPFgj03uveOoyeHOTlfEJt-yfLc3SA53
169
172
  swarms/utils/file_processing.py,sha256=QjQCIPTcwicQlfy656BXBYpIzMR0s2343E7ftnok5Uo,4865
170
173
  swarms/utils/formatter.py,sha256=YykmcuWXkxvQ7a2Vq6OzWuqUDiIwro6VrtSt4ITbXcU,4194
171
174
  swarms/utils/function_caller_model.py,sha256=ZfgCMzOizNnuZipYLclTziECNHszH9p8RQcUq7VNr4Q,4156
172
- swarms/utils/history_output_formatter.py,sha256=WHcd0xhSNRDKakXtkCjv0nW1NF-GM9SYcey3RrN5gl8,778
175
+ swarms/utils/history_output_formatter.py,sha256=5Gc-FLUDTkTYfzZVbfq4EL-wAZqPN0mD3K3h62CB71k,1379
173
176
  swarms/utils/litellm_tokenizer.py,sha256=0AAj4NffBe2eHii_3_5SpQAhSiBbunJR8MzaBTIm7hg,484
174
- swarms/utils/litellm_wrapper.py,sha256=mhlG52rffI-vNYbEnHsuYzraFbtsnx84-jb7WMZLReA,14507
177
+ swarms/utils/litellm_wrapper.py,sha256=xdRRj2MvO-4RtfD1SHOCKoidX1UTKRj__I7CvWxQV3o,15145
175
178
  swarms/utils/loguru_logger.py,sha256=hIoSK3NHLpe7eAmjHRURrEYzNXYC2gbR7_Vv63Yaydk,685
176
179
  swarms/utils/markdown_message.py,sha256=RThHNnMf6ZLTlYK4vKn3yuewChaxWAYAWb0Xm_pTyIU,652
177
180
  swarms/utils/parse_code.py,sha256=XFOLymbdP3HzMZuqsj7pwUyisvUmTm0ev9iThR_ambI,1987
@@ -181,8 +184,8 @@ swarms/utils/try_except_wrapper.py,sha256=appEGu9Afy3TmdkNNXUgQ9yU9lj2j0uNkIoW0J
181
184
  swarms/utils/visualizer.py,sha256=0ylohEk62MAS6iPRaDOV03m9qo2k5J56tWlKJk_46p4,16927
182
185
  swarms/utils/vllm_wrapper.py,sha256=OIGnU9Vf81vE_hul1FK-xEhChFK8fxqZX6-fhQeW22c,4987
183
186
  swarms/utils/wrapper_clusterop.py,sha256=PMSCVM7ZT1vgj1D_MYAe835RR3SMLYxA-si2JS02yNQ,4220
184
- swarms-7.7.0.dist-info/LICENSE,sha256=jwRtEmTWjLrEsvFB6QFdYs2cEeZPRMdj-UMOFkPF8_0,11363
185
- swarms-7.7.0.dist-info/METADATA,sha256=AjkFhCgUgocVqF_3D_HR8IA30JnY2ckwUg3ywrBbvE0,104909
186
- swarms-7.7.0.dist-info/WHEEL,sha256=sP946D7jFCHeNz5Iq4fL4Lu-PrWrFsgfLXbbkciIZwg,88
187
- swarms-7.7.0.dist-info/entry_points.txt,sha256=2K0rTtfO1X1WaO-waJlXIKw5Voa_EpAL_yU0HXE2Jgc,47
188
- swarms-7.7.0.dist-info/RECORD,,
187
+ swarms-7.7.1.dist-info/LICENSE,sha256=jwRtEmTWjLrEsvFB6QFdYs2cEeZPRMdj-UMOFkPF8_0,11363
188
+ swarms-7.7.1.dist-info/METADATA,sha256=_rVOKIek6LO--J4jqcewJ0aRKD2t63raUHk8C9v9GXk,104909
189
+ swarms-7.7.1.dist-info/WHEEL,sha256=sP946D7jFCHeNz5Iq4fL4Lu-PrWrFsgfLXbbkciIZwg,88
190
+ swarms-7.7.1.dist-info/entry_points.txt,sha256=2K0rTtfO1X1WaO-waJlXIKw5Voa_EpAL_yU0HXE2Jgc,47
191
+ swarms-7.7.1.dist-info/RECORD,,
File without changes