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