parent
0036dcf864
commit
f1b26e4690
@ -1,19 +0,0 @@
|
|||||||
from swarms.structs import Flow, SequentialWorkflow
|
|
||||||
from swarms.models import OpenAIChat, Anthropic
|
|
||||||
|
|
||||||
# llm
|
|
||||||
llm = OpenAIChat()
|
|
||||||
llm2 = Anthropic()
|
|
||||||
|
|
||||||
# 2 Flows, one that creates an algorithmic pseuedocode and another that creates the pytorch code
|
|
||||||
flow1 = Flow(llm2, max_loops=1)
|
|
||||||
flow2 = Flow(llm, max_loops=1)
|
|
||||||
|
|
||||||
# SequentialWorkflow
|
|
||||||
workflow = SequentialWorkflow(
|
|
||||||
[flow1, flow2],
|
|
||||||
max_loops=1,
|
|
||||||
name="Paper to Code",
|
|
||||||
autosave=True,
|
|
||||||
description="This workflow takes a paper and converts it to code.",
|
|
||||||
)
|
|
@ -1,105 +0,0 @@
|
|||||||
from concurrent.futures import ThreadPoolExecutor, as_completed
|
|
||||||
from graphlib import TopologicalSorter
|
|
||||||
from typing import Dict, List
|
|
||||||
|
|
||||||
|
|
||||||
class Task:
|
|
||||||
"""
|
|
||||||
Task is a unit of work that can be executed by an agent
|
|
||||||
"""
|
|
||||||
|
|
||||||
def __init__(
|
|
||||||
self, id: str, parents: List["Task"] = None, children: List["Task"] = None
|
|
||||||
):
|
|
||||||
self.id = id
|
|
||||||
self.parents = parents
|
|
||||||
self.children = children
|
|
||||||
|
|
||||||
def can_execute(self):
|
|
||||||
"""
|
|
||||||
can_execute returns True if the task can be executed
|
|
||||||
"""
|
|
||||||
raise NotImplementedError
|
|
||||||
|
|
||||||
def execute(self):
|
|
||||||
"""
|
|
||||||
Execute the task
|
|
||||||
|
|
||||||
"""
|
|
||||||
raise NotImplementedError
|
|
||||||
|
|
||||||
|
|
||||||
class NonLinearWorkflow:
|
|
||||||
"""
|
|
||||||
NonLinearWorkflow constructs a non sequential DAG of tasks to be executed by agents
|
|
||||||
|
|
||||||
|
|
||||||
Architecture:
|
|
||||||
NonLinearWorkflow = Task + Agent + Executor
|
|
||||||
|
|
||||||
ASCII Diagram:
|
|
||||||
+-------------------+
|
|
||||||
| NonLinearWorkflow |
|
|
||||||
+-------------------+
|
|
||||||
| |
|
|
||||||
| |
|
|
||||||
| |
|
|
||||||
| |
|
|
||||||
| |
|
|
||||||
| |
|
|
||||||
| |
|
|
||||||
| |
|
|
||||||
| |
|
|
||||||
| |
|
|
||||||
+-------------------+
|
|
||||||
|
|
||||||
|
|
||||||
"""
|
|
||||||
|
|
||||||
def __init__(self, agents, iters_per_task):
|
|
||||||
"""A workflow is a collection of tasks that can be executed in parallel or sequentially."""
|
|
||||||
super().__init__()
|
|
||||||
self.executor = ThreadPoolExecutor()
|
|
||||||
self.agents = agents
|
|
||||||
self.tasks = []
|
|
||||||
|
|
||||||
def add(self, task: Task):
|
|
||||||
"""Add a task to the workflow"""
|
|
||||||
assert isinstance(task, Task), "Input must be an nstance of Task"
|
|
||||||
self.tasks.append(task)
|
|
||||||
return task
|
|
||||||
|
|
||||||
def run(self):
|
|
||||||
"""Run the workflow"""
|
|
||||||
ordered_tasks = self.ordered_tasks
|
|
||||||
exit_loop = False
|
|
||||||
|
|
||||||
while not self.is_finished() and not exit_loop:
|
|
||||||
futures_list = {}
|
|
||||||
|
|
||||||
for task in ordered_tasks:
|
|
||||||
if task.can_execute:
|
|
||||||
future = self.executor.submit(self.agents.run, task.task_string)
|
|
||||||
futures_list[future] = task
|
|
||||||
|
|
||||||
for future in as_completed(futures_list):
|
|
||||||
if isinstance(future.result(), Exception):
|
|
||||||
exit_loop = True
|
|
||||||
break
|
|
||||||
return self.output_tasks()
|
|
||||||
|
|
||||||
def output_tasks(self) -> List[Task]:
|
|
||||||
"""Output tasks from the workflow"""
|
|
||||||
return [task for task in self.tasks if not task.children]
|
|
||||||
|
|
||||||
def to_graph(self) -> Dict[str, set[str]]:
|
|
||||||
"""Convert the workflow to a graph"""
|
|
||||||
graph = {
|
|
||||||
task.id: set(child.id for child in task.children) for task in self.tasks
|
|
||||||
}
|
|
||||||
return graph
|
|
||||||
|
|
||||||
def order_tasks(self) -> List[Task]:
|
|
||||||
"""Order the tasks USING TOPOLOGICAL SORTING"""
|
|
||||||
task_order = TopologicalSorter(self.to_graph()).static_order()
|
|
||||||
return [self.find_task(task_id) for task_id in task_order]
|
|
@ -1,23 +0,0 @@
|
|||||||
from rich import print as rich_print
|
|
||||||
from rich.markdown import Markdown
|
|
||||||
from rich.rule import Rule
|
|
||||||
|
|
||||||
|
|
||||||
def display_markdown_message(message):
|
|
||||||
"""
|
|
||||||
Display markdown message. Works with multiline strings with lots of indentation.
|
|
||||||
Will automatically make single line > tags beautiful.
|
|
||||||
"""
|
|
||||||
|
|
||||||
for line in message.split("\n"):
|
|
||||||
line = line.strip()
|
|
||||||
if line == "":
|
|
||||||
print("")
|
|
||||||
elif line == "---":
|
|
||||||
rich_print(Rule(style="white"))
|
|
||||||
else:
|
|
||||||
rich_print(Markdown(line))
|
|
||||||
|
|
||||||
if "\n" not in message and message.startswith(">"):
|
|
||||||
# Aesthetic choice. For these tags, they need a space below them
|
|
||||||
print("")
|
|
@ -1,29 +0,0 @@
|
|||||||
import os
|
|
||||||
import shutil
|
|
||||||
from pathlib import Path
|
|
||||||
|
|
||||||
# from env import DotEnv
|
|
||||||
|
|
||||||
from swarms.utils.main import AbstractUploader
|
|
||||||
|
|
||||||
|
|
||||||
class StaticUploader(AbstractUploader):
|
|
||||||
def __init__(self, server: str, path: Path, endpoint: str):
|
|
||||||
self.server = server
|
|
||||||
self.path = path
|
|
||||||
self.endpoint = endpoint
|
|
||||||
|
|
||||||
@staticmethod
|
|
||||||
def from_settings(path: Path, endpoint: str) -> "StaticUploader":
|
|
||||||
return StaticUploader(os.environ["SERVER"], path, endpoint)
|
|
||||||
|
|
||||||
def get_url(self, uploaded_path: str) -> str:
|
|
||||||
return f"{self.server}/{uploaded_path}"
|
|
||||||
|
|
||||||
def upload(self, filepath: str):
|
|
||||||
relative_path = Path("generated") / filepath.split("/")[-1]
|
|
||||||
file_path = self.path / relative_path
|
|
||||||
os.makedirs(os.path.dirname(file_path), exist_ok=True)
|
|
||||||
shutil.copy(filepath, file_path)
|
|
||||||
endpoint_path = self.endpoint / relative_path
|
|
||||||
return f"{self.server}/{endpoint_path}"
|
|
Loading…
Reference in new issue