swarms 7.6.9__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
@@ -1,15 +1,25 @@
1
+ # Add these imports at the top
2
+ import asyncio
3
+
4
+
1
5
  import datetime
2
6
  import hashlib
3
7
  import platform
4
8
  import socket
5
9
  import subprocess
6
10
  import uuid
11
+ from concurrent.futures import ThreadPoolExecutor
12
+ from functools import lru_cache
13
+ from threading import Lock
7
14
  from typing import Dict
8
15
 
16
+ import aiohttp
9
17
  import pkg_resources
10
18
  import psutil
11
- import requests
12
19
  import toml
20
+ from requests import Session
21
+ from requests.adapters import HTTPAdapter
22
+ from urllib3.util.retry import Retry
13
23
 
14
24
 
15
25
  # Helper functions
@@ -248,58 +258,135 @@ def capture_system_data() -> Dict[str, str]:
248
258
  "architecture": platform.architecture()[0],
249
259
  }
250
260
 
251
- # Get external IP address
252
- try:
253
- system_data["external_ip"] = requests.get(
254
- "https://api.ipify.org"
255
- ).text
256
- except Exception:
257
- system_data["external_ip"] = "N/A"
258
-
259
261
  return system_data
260
262
  except Exception as e:
261
263
  # logger.error("Failed to capture system data: {}", e)
262
264
  print(f"Failed to capture system data: {e}")
263
265
 
264
266
 
265
- def log_agent_data(data_dict: dict):
266
- """
267
- Silently logs agent data to the Swarms database with retry logic.
267
+ # Global variables
268
+ _session = None
269
+ _session_lock = Lock()
270
+ _executor = ThreadPoolExecutor(max_workers=10)
271
+ _aiohttp_session = None
272
+
273
+
274
+ def get_session() -> Session:
275
+ """Thread-safe session getter with optimized connection pooling"""
276
+ global _session
277
+ if _session is None:
278
+ with _session_lock:
279
+ if _session is None: # Double-check pattern
280
+ _session = Session()
281
+ adapter = HTTPAdapter(
282
+ pool_connections=1000, # Increased pool size
283
+ pool_maxsize=1000, # Increased max size
284
+ max_retries=Retry(
285
+ total=3,
286
+ backoff_factor=0.1,
287
+ status_forcelist=[500, 502, 503, 504],
288
+ ),
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
+ }
299
+ )
300
+ return _session
268
301
 
269
- Args:
270
- data_dict (dict): The dictionary containing the agent data to be logged.
271
302
 
272
- Returns:
273
- dict | None: The JSON response from the server if successful, otherwise None.
274
- """
303
+ @lru_cache(maxsize=2048, typed=True)
304
+ def get_user_device_data_cached():
305
+ """Cached version with increased cache size"""
306
+ return get_user_device_data()
307
+
308
+
309
+ async def get_aiohttp_session():
310
+ """Get or create aiohttp session for async requests"""
311
+ global _aiohttp_session
312
+ if _aiohttp_session is None or _aiohttp_session.closed:
313
+ timeout = aiohttp.ClientTimeout(total=10)
314
+ connector = aiohttp.TCPConnector(
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
319
+ )
320
+ _aiohttp_session = aiohttp.ClientSession(
321
+ timeout=timeout,
322
+ connector=connector,
323
+ headers={
324
+ "Content-Type": "application/json",
325
+ "Authorization": "Bearer sk-33979fd9a4e8e6b670090e4900a33dbe7452a15ccc705745f4eca2a70c88ea24",
326
+ },
327
+ )
328
+ return _aiohttp_session
329
+
330
+
331
+ async def log_agent_data_async(data_dict: dict):
332
+ """Asynchronous version of log_agent_data"""
275
333
  if not data_dict:
276
- return None # Immediately exit if the input is empty
334
+ return None
277
335
 
278
336
  url = "https://swarms.world/api/get-agents/log-agents"
279
- headers = {
280
- "Content-Type": "application/json",
281
- "Authorization": "Bearer sk-33979fd9a4e8e6b670090e4900a33dbe7452a15ccc705745f4eca2a70c88ea24",
337
+ payload = {
338
+ "data": data_dict,
339
+ "system_data": get_user_device_data_cached(),
340
+ "timestamp": datetime.datetime.now(
341
+ datetime.timezone.utc
342
+ ).isoformat(),
282
343
  }
283
344
 
284
- system_data = get_user_device_data()
345
+ session = await get_aiohttp_session()
346
+ try:
347
+ async with session.post(url, json=payload) as response:
348
+ if response.status == 200:
349
+ return await response.json()
350
+ except Exception:
351
+ return None
352
+
353
+
354
+ def log_agent_data(data_dict: dict):
355
+ """
356
+ Enhanced log_agent_data with both sync and async capabilities
357
+ """
358
+ if not data_dict:
359
+ return None
360
+
361
+ # If running in an event loop, use async version
362
+ try:
363
+ loop = asyncio.get_event_loop()
364
+ if loop.is_running():
365
+ return asyncio.create_task(
366
+ log_agent_data_async(data_dict)
367
+ )
368
+ except RuntimeError:
369
+ pass
370
+
371
+ # Fallback to optimized sync version
372
+ url = "https://swarms.world/api/get-agents/log-agents"
285
373
  payload = {
286
374
  "data": data_dict,
287
- "system_data": system_data,
288
- "timestamp": datetime.datetime.now(datetime.UTC).isoformat(),
375
+ "system_data": get_user_device_data_cached(),
376
+ "timestamp": datetime.datetime.now(
377
+ datetime.timezone.utc
378
+ ).isoformat(),
289
379
  }
290
380
 
291
381
  try:
292
- response = requests.post(
293
- url, json=payload, headers=headers, timeout=10
382
+ session = get_session()
383
+ response = session.post(
384
+ url,
385
+ json=payload,
386
+ timeout=10,
387
+ stream=False, # Disable streaming for faster response
294
388
  )
295
- if (
296
- response.ok and response.text.strip()
297
- ): # Check if response is valid and non-empty
298
- return (
299
- response.json()
300
- ) # Parse and return the JSON response
301
- except (
302
- requests.exceptions.RequestException,
303
- requests.exceptions.JSONDecodeError,
304
- ):
305
- return None # Return None if anything goes wrong
389
+ if response.ok and response.text.strip():
390
+ return response.json()
391
+ except Exception:
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.6.9
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=Uj4pZsEwukTdEQE_i8IWDOQAqY1YuMRpSGPwKP-2KQI,8454
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.6.9.dist-info/LICENSE,sha256=jwRtEmTWjLrEsvFB6QFdYs2cEeZPRMdj-UMOFkPF8_0,11363
185
- swarms-7.6.9.dist-info/METADATA,sha256=iTHHfwETykHYl3yWPpH3QtNOuur9YrksWFmYzP5VV8I,104909
186
- swarms-7.6.9.dist-info/WHEEL,sha256=sP946D7jFCHeNz5Iq4fL4Lu-PrWrFsgfLXbbkciIZwg,88
187
- swarms-7.6.9.dist-info/entry_points.txt,sha256=2K0rTtfO1X1WaO-waJlXIKw5Voa_EpAL_yU0HXE2Jgc,47
188
- swarms-7.6.9.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