From 8e1a0242d9c8481c2362281783a068f0979d4e40 Mon Sep 17 00:00:00 2001 From: Kye Date: Tue, 2 Jan 2024 11:57:11 -0500 Subject: [PATCH] [FEATS] [BlockList] [BlockDict] [block] --- concurrent_workflow.py | 15 ++-- pyproject.toml | 2 +- swarms/structs/__init__.py | 4 + swarms/structs/block_wrapper.py | 35 ++++++++ swarms/structs/blockdevice.py | 19 +++++ swarms/structs/blocksdict.py | 65 +++++++++++++++ swarms/structs/blockslist.py | 138 ++++++++++++++++++++++++++++++++ swarms/structs/types.py | 0 8 files changed, 272 insertions(+), 6 deletions(-) create mode 100644 swarms/structs/block_wrapper.py create mode 100644 swarms/structs/blockdevice.py create mode 100644 swarms/structs/blocksdict.py create mode 100644 swarms/structs/blockslist.py create mode 100644 swarms/structs/types.py diff --git a/concurrent_workflow.py b/concurrent_workflow.py index a228d247..8033e10a 100644 --- a/concurrent_workflow.py +++ b/concurrent_workflow.py @@ -7,20 +7,25 @@ load_dotenv() # Load environment variables llm = OpenAIChat(openai_api_key=os.getenv("OPENAI_API_KEY")) -agent = Agent(llm=llm, max_loops=1) +agent = Agent( + llm=llm, + max_loops=1, +) # Create a workflow workflow = ConcurrentWorkflow(max_workers=5) # Create tasks -task1 = Task(agent, "What's the weather in miami") -task2 = Task(agent, "What's the weather in new york") -task3 = Task(agent, "What's the weather in london") +task1 = Task(agent=agent, description="What's the weather in miami") +task2 = Task( + agent=agent, description="What's the weather in new york" +) +task3 = Task(agent=agent, description="What's the weather in london") # Add tasks to the workflow workflow.add(task1) workflow.add(task2) workflow.add(task3) -# Run the workflow +# Run the workflow and print each task result workflow.run() diff --git a/pyproject.toml b/pyproject.toml index bc7b807b..0871ddaa 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -4,7 +4,7 @@ build-backend = "poetry.core.masonry.api" [tool.poetry] name = "swarms" -version = "3.1.9" +version = "3.2.5" description = "Swarms - Pytorch" license = "MIT" authors = ["Kye Gomez "] diff --git a/swarms/structs/__init__.py b/swarms/structs/__init__.py index 80d23d7c..29c0f503 100644 --- a/swarms/structs/__init__.py +++ b/swarms/structs/__init__.py @@ -27,6 +27,8 @@ from swarms.structs.utils import ( parse_tasks, detect_markdown, ) +from swarms.structs.task import Task +from swarms.structs.block_wrapper import block __all__ = [ "Agent", @@ -55,4 +57,6 @@ __all__ = [ "BaseWorkflow", "BaseStructure", "detect_markdown", + "Task", + "block" ] diff --git a/swarms/structs/block_wrapper.py b/swarms/structs/block_wrapper.py new file mode 100644 index 00000000..7b16d757 --- /dev/null +++ b/swarms/structs/block_wrapper.py @@ -0,0 +1,35 @@ +from typing import Callable, Any +import logging + +logging.basicConfig(level=logging.INFO) +logger = logging.getLogger(__name__) + + +def block( + function: Callable[..., Any], + device: str = None, + verbose: bool = False, +) -> Callable[..., Any]: + """ + A decorator that transforms a function into a block. + + Args: + function (Callable[..., Any]): The function to transform. + + Returns: + Callable[..., Any]: The transformed function. + """ + def wrapper(*args, **kwargs): + # Here you can add code to execute the function on various hardwares + # For now, we'll just call the function normally + try: + return function(*args, **kwargs) + except Exception as error: + logger.error(f"Error in {function.__name__}: {error}") + raise error + + # Set the wrapper function's name and docstring to those of the original function + wrapper.__name__ = function.__name__ + wrapper.__doc__ = function.__doc__ + + return wrapper diff --git a/swarms/structs/blockdevice.py b/swarms/structs/blockdevice.py new file mode 100644 index 00000000..d286e2d8 --- /dev/null +++ b/swarms/structs/blockdevice.py @@ -0,0 +1,19 @@ +from tracemalloc import start +from typing import Any, Callable, Dict, List, Union + +from dataclasses import dataclass, field + +@dataclass +class BlockDevice: + device: str + cluster: str + description: str + + def __init__(self, device: str, cluster: str, description: str): + self.device = device + self.cluster = cluster + self.description = description + + def __str__(self): + return f"BlockDevice(device={self.device}, cluster={self.cluster}, description={self.description})" + diff --git a/swarms/structs/blocksdict.py b/swarms/structs/blocksdict.py new file mode 100644 index 00000000..cf355fc1 --- /dev/null +++ b/swarms/structs/blocksdict.py @@ -0,0 +1,65 @@ +from typing import ( + Any, + Dict, + Optional, +) + +from swarms.structs.base import BaseStructure + + +class BlocksDict(BaseStructure): + """ + A class representing a dictionary of blocks. + + Args: + name (str): The name of the blocks dictionary. + description (str): The description of the blocks dictionary. + blocks (Dict[str, Any]): The dictionary of blocks. + parent (Optional[Any], optional): The parent of the blocks dictionary. Defaults to None. + **kwargs: Additional keyword arguments. + + Attributes: + parent (Optional[Any]): The parent of the blocks dictionary. + blocks (Dict[str, Any]): The dictionary of blocks. + + Methods: + add(key: str, block: Any): Add a block to the dictionary. + remove(key: str): Remove a block from the dictionary. + get(key: str): Get a block from the dictionary. + """ + + def __init__( + self, + name: str, + description: str, + blocks: Dict[str, Any], + parent: Optional[Any] = None, + **kwargs, + ): + super().__init__(name=name, description=description, **kwargs) + self.parent = parent + self.blocks = blocks + + def add(self, key: str, block: Any): + self.blocks[key] = block + + def remove(self, key: str): + del self.blocks[key] + + def get(self, key: str): + return self.blocks.get(key) + + def update(self, key: str, block: Any): + self.blocks[key] = block + + def keys(self): + return list(self.blocks.keys()) + + def values(self): + return list(self.blocks.values()) + + def items(self): + return list(self.blocks.items()) + + def clear(self): + self.blocks.clear() diff --git a/swarms/structs/blockslist.py b/swarms/structs/blockslist.py new file mode 100644 index 00000000..93ab0afa --- /dev/null +++ b/swarms/structs/blockslist.py @@ -0,0 +1,138 @@ +from typing import ( + Any, + List, + Optional, +) + +from swarms.structs.base import BaseStructure + + +class BlocksList(BaseStructure): + """ + A class representing a list of blocks. + + Args: + name (str): The name of the blocks list. + description (str): The description of the blocks list. + blocks (List[Any]): The list of blocks. + parent (Optional[Any], optional): The parent of the blocks list. Defaults to None. + **kwargs: Additional keyword arguments. + + Attributes: + parent (Optional[Any]): The parent of the blocks list. + blocks (List[Any]): The list of blocks. + + Methods: + add(block: Any): Add a block to the list. + remove(block: Any): Remove a block from the list. + update(block: Any): Update a block in the list. + get(index: int): Get a block at the specified index. + get_all(): Get all blocks in the list. + get_by_name(name: str): Get blocks by name. + get_by_type(type: str): Get blocks by type. + get_by_id(id: str): Get blocks by ID. + get_by_parent(parent: str): Get blocks by parent. + get_by_parent_id(parent_id: str): Get blocks by parent ID. + get_by_parent_name(parent_name: str): Get blocks by parent name. + get_by_parent_type(parent_type: str): Get blocks by parent type. + get_by_parent_description(parent_description: str): Get blocks by parent description. + """ + + def __init__( + self, + name: str, + description: str, + blocks: List[Any], + parent: Optional[Any] = None, + **kwargs, + ): + super().__init__(name=name, description=description, **kwargs) + self.parent = parent + self.blocks = blocks + + def add(self, block: Any): + self.blocks.append(block) + + def remove(self, block: Any): + self.blocks.remove(block) + + def update(self, block: Any): + self.blocks[self.blocks.index(block)] = block + + def get(self, index: int): + return self.blocks[index] + + def get_all(self): + return self.blocks + + def get_by_name(self, name: str): + return [block for block in self.blocks if block.name == name] + + def get_by_type(self, type: str): + return [block for block in self.blocks if block.type == type] + + def get_by_id(self, id: str): + return [block for block in self.blocks if block.id == id] + + def get_by_parent(self, parent: str): + return [ + block for block in self.blocks if block.parent == parent + ] + + def get_by_parent_id(self, parent_id: str): + return [ + block + for block in self.blocks + if block.parent_id == parent_id + ] + + def get_by_parent_name(self, parent_name: str): + return [ + block + for block in self.blocks + if block.parent_name == parent_name + ] + + def get_by_parent_type(self, parent_type: str): + return [ + block + for block in self.blocks + if block.parent_type == parent_type + ] + + def get_by_parent_description(self, parent_description: str): + return [ + block + for block in self.blocks + if block.parent_description == parent_description + ] + + def __len__(self): + return len(self.blocks) + + def __getitem__(self, index): + return self.blocks[index] + + def __setitem__(self, index, value): + self.blocks[index] = value + + def __delitem__(self, index): + del self.blocks[index] + + def __iter__(self): + return iter(self.blocks) + + def __reversed__(self): + return reversed(self.blocks) + + def __contains__(self, item): + return item in self.blocks + + def __str__(self): + return f"{self.name}({self.blocks})" + + def __repr__(self): + return f"{self.name}({self.blocks})" + + def __eq__(self, other): + return self.blocks == other.blocks diff --git a/swarms/structs/types.py b/swarms/structs/types.py new file mode 100644 index 00000000..e69de29b