|  |  |  | @ -1,6 +1,6 @@ | 
			
		
	
		
			
				
					|  |  |  |  | import asyncio | 
			
		
	
		
			
				
					|  |  |  |  | import csv | 
			
		
	
		
			
				
					|  |  |  |  | from datetime import datetime  # Correct import statement | 
			
		
	
		
			
				
					|  |  |  |  | from datetime import datetime | 
			
		
	
		
			
				
					|  |  |  |  | import os | 
			
		
	
		
			
				
					|  |  |  |  | import uuid | 
			
		
	
		
			
				
					|  |  |  |  | from typing import List, Union | 
			
		
	
	
		
			
				
					|  |  |  | @ -16,14 +16,8 @@ from swarms.utils.loguru_logger import initialize_logger | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  | logger = initialize_logger(log_folder="spreadsheet_swarm") | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  | # Corrected line | 
			
		
	
		
			
				
					|  |  |  |  | time = datetime.now().isoformat()  # Use datetime.now() instead of datetime.datetime.now() | 
			
		
	
		
			
				
					|  |  |  |  | uuid_hex = uuid.uuid4().hex | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  | # --------------- NEW CHANGE START --------------- | 
			
		
	
		
			
				
					|  |  |  |  | # Format time variable to be compatible across operating systems | 
			
		
	
		
			
				
					|  |  |  |  | formatted_time = datetime.now().strftime("%Y-%m-%dT%H-%M-%S") | 
			
		
	
		
			
				
					|  |  |  |  | # --------------- NEW CHANGE END --------------- | 
			
		
	
		
			
				
					|  |  |  |  | # Replace timestamp-based time with a UUID for file naming | 
			
		
	
		
			
				
					|  |  |  |  | run_id = uuid.uuid4().hex  # Unique identifier for each run | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  | class AgentOutput(BaseModel): | 
			
		
	
		
			
				
					|  |  |  |  |     agent_name: str | 
			
		
	
	
		
			
				
					|  |  |  | @ -34,13 +28,13 @@ class AgentOutput(BaseModel): | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  | class SwarmRunMetadata(BaseModel): | 
			
		
	
		
			
				
					|  |  |  |  |     run_id: str = Field( | 
			
		
	
		
			
				
					|  |  |  |  |         default_factory=lambda: f"spreadsheet_swarm_run_{uuid_hex}" | 
			
		
	
		
			
				
					|  |  |  |  |         default_factory=lambda: f"spreadsheet_swarm_run_{run_id}" | 
			
		
	
		
			
				
					|  |  |  |  |     ) | 
			
		
	
		
			
				
					|  |  |  |  |     name: str | 
			
		
	
		
			
				
					|  |  |  |  |     description: str | 
			
		
	
		
			
				
					|  |  |  |  |     agents: List[str] | 
			
		
	
		
			
				
					|  |  |  |  |     start_time: str = Field( | 
			
		
	
		
			
				
					|  |  |  |  |         default_factory=lambda: time, | 
			
		
	
		
			
				
					|  |  |  |  |         default_factory=lambda: str(datetime.now().timestamp()),  # Numeric timestamp | 
			
		
	
		
			
				
					|  |  |  |  |         description="The start time of the swarm run.", | 
			
		
	
		
			
				
					|  |  |  |  |     ) | 
			
		
	
		
			
				
					|  |  |  |  |     end_time: str | 
			
		
	
	
		
			
				
					|  |  |  | @ -94,17 +88,18 @@ class SpreadSheetSwarm(BaseSwarm): | 
			
		
	
		
			
				
					|  |  |  |  |         self.max_loops = max_loops | 
			
		
	
		
			
				
					|  |  |  |  |         self.workspace_dir = workspace_dir | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  |         # --------------- NEW CHANGE START --------------- | 
			
		
	
		
			
				
					|  |  |  |  |         # The save_file_path now uses the formatted_time and uuid_hex | 
			
		
	
		
			
				
					|  |  |  |  |         self.save_file_path = f"spreadsheet_swarm_{formatted_time}_run_id_{uuid_hex}.csv" | 
			
		
	
		
			
				
					|  |  |  |  |         # --------------- NEW CHANGE END --------------- | 
			
		
	
		
			
				
					|  |  |  |  |         # Create a timestamp without colons or periods | 
			
		
	
		
			
				
					|  |  |  |  |         timestamp = datetime.now().isoformat().replace(":", "_").replace(".", "_") | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  |         # Use this timestamp in the CSV filename | 
			
		
	
		
			
				
					|  |  |  |  |         self.save_file_path = f"spreadsheet_swarm_{timestamp}_run_id_{run_id}.csv" | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  |         self.metadata = SwarmRunMetadata( | 
			
		
	
		
			
				
					|  |  |  |  |             run_id=f"spreadsheet_swarm_run_{time}", | 
			
		
	
		
			
				
					|  |  |  |  |             run_id=f"spreadsheet_swarm_run_{run_id}", | 
			
		
	
		
			
				
					|  |  |  |  |             name=name, | 
			
		
	
		
			
				
					|  |  |  |  |             description=description, | 
			
		
	
		
			
				
					|  |  |  |  |             agents=[agent.name for agent in agents], | 
			
		
	
		
			
				
					|  |  |  |  |             start_time=time, | 
			
		
	
		
			
				
					|  |  |  |  |             start_time=str(datetime.now().timestamp()),  # Numeric timestamp | 
			
		
	
		
			
				
					|  |  |  |  |             end_time="", | 
			
		
	
		
			
				
					|  |  |  |  |             tasks_completed=0, | 
			
		
	
		
			
				
					|  |  |  |  |             outputs=[], | 
			
		
	
	
		
			
				
					|  |  |  | @ -147,7 +142,7 @@ class SpreadSheetSwarm(BaseSwarm): | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  |         """ | 
			
		
	
		
			
				
					|  |  |  |  |         logger.info(f"Running the swarm with task: {task}") | 
			
		
	
		
			
				
					|  |  |  |  |         self.metadata.start_time = time | 
			
		
	
		
			
				
					|  |  |  |  |         self.metadata.start_time = str(datetime.now().timestamp())  # Numeric timestamp | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  |         # Check if we're already in an event loop | 
			
		
	
		
			
				
					|  |  |  |  |         if asyncio.get_event_loop().is_running(): | 
			
		
	
	
		
			
				
					|  |  |  | @ -158,7 +153,7 @@ class SpreadSheetSwarm(BaseSwarm): | 
			
		
	
		
			
				
					|  |  |  |  |             # If no event loop is running, run using `asyncio.run` | 
			
		
	
		
			
				
					|  |  |  |  |             asyncio.run(self._run_tasks(task, *args, **kwargs)) | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  |         self.metadata.end_time = time | 
			
		
	
		
			
				
					|  |  |  |  |         self.metadata.end_time = str(datetime.now().timestamp())  # Numeric timestamp | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  |         # Synchronously save metadata | 
			
		
	
		
			
				
					|  |  |  |  |         logger.info("Saving metadata to CSV and JSON...") | 
			
		
	
	
		
			
				
					|  |  |  | @ -233,7 +228,7 @@ class SpreadSheetSwarm(BaseSwarm): | 
			
		
	
		
			
				
					|  |  |  |  |                 agent_name=agent_name, | 
			
		
	
		
			
				
					|  |  |  |  |                 task=task, | 
			
		
	
		
			
				
					|  |  |  |  |                 result=result, | 
			
		
	
		
			
				
					|  |  |  |  |                 timestamp=time, | 
			
		
	
		
			
				
					|  |  |  |  |                 timestamp=str(datetime.now().timestamp()),  # Numeric timestamp | 
			
		
	
		
			
				
					|  |  |  |  |             ) | 
			
		
	
		
			
				
					|  |  |  |  |         ) | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
	
		
			
				
					|  |  |  | @ -284,4 +279,4 @@ class SpreadSheetSwarm(BaseSwarm): | 
			
		
	
		
			
				
					|  |  |  |  |             # Write each output as a new row | 
			
		
	
		
			
				
					|  |  |  |  |             for output in self.metadata.outputs: | 
			
		
	
		
			
				
					|  |  |  |  |                 row = f"{run_id},{output.agent_name},{output.task},{output.result},{output.timestamp}\n" | 
			
		
	
		
			
				
					|  |  |  |  |                 await file.write(row) | 
			
		
	
		
			
				
					|  |  |  |  |                 await file.write(row) |