You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
254 lines
8.2 KiB
254 lines
8.2 KiB
import concurrent
|
|
import csv
|
|
from swarms import Agent, OpenAIChat
|
|
from swarms.memory import ChromaDB
|
|
from dotenv import load_dotenv
|
|
from swarms.utils.parse_code import extract_code_from_markdown
|
|
from swarms.utils.file_processing import create_file
|
|
from swarms.utils.loguru_logger import logger
|
|
|
|
|
|
# Load ENV
|
|
load_dotenv()
|
|
|
|
# Gemini
|
|
gemini = OpenAIChat()
|
|
|
|
# memory
|
|
memory = ChromaDB(output_dir="swarm_hackathon")
|
|
|
|
|
|
def execute_concurrently(callable_functions: callable, max_workers=5):
|
|
"""
|
|
Executes callable functions concurrently using multithreading.
|
|
|
|
Parameters:
|
|
- callable_functions: A list of tuples, each containing the callable function and its arguments.
|
|
For example: [(function1, (arg1, arg2), {'kwarg1': val1}), (function2, (), {})]
|
|
- max_workers: The maximum number of threads to use.
|
|
|
|
Returns:
|
|
- results: A list of results returned by the callable functions. If an error occurs in any function,
|
|
the exception object will be placed at the corresponding index in the list.
|
|
"""
|
|
results = [None] * len(callable_functions)
|
|
|
|
def worker(fn, args, kwargs, index):
|
|
try:
|
|
result = fn(*args, **kwargs)
|
|
results[index] = result
|
|
except Exception as e:
|
|
results[index] = e
|
|
|
|
with concurrent.futures.ThreadPoolExecutor(
|
|
max_workers=max_workers
|
|
) as executor:
|
|
futures = []
|
|
for i, (fn, args, kwargs) in enumerate(callable_functions):
|
|
futures.append(
|
|
executor.submit(worker, fn, args, kwargs, i)
|
|
)
|
|
|
|
# Wait for all threads to complete
|
|
concurrent.futures.wait(futures)
|
|
|
|
return results
|
|
|
|
|
|
# Adjusting the function to extract specific column values
|
|
def extract_and_create_agents(
|
|
csv_file_path: str, target_columns: list
|
|
):
|
|
"""
|
|
Reads a CSV file, extracts "Project Name" and "Lightning Proposal" for each row,
|
|
creates an Agent for each, and adds it to the swarm network.
|
|
|
|
Parameters:
|
|
- csv_file_path: The path to the CSV file.
|
|
- target_columns: A list of column names to extract values from.
|
|
"""
|
|
try:
|
|
agents = []
|
|
with open(csv_file_path, mode="r", encoding="utf-8") as file:
|
|
reader = csv.DictReader(file)
|
|
for row in reader:
|
|
project_name = row[target_columns[0]]
|
|
lightning_proposal = row[target_columns[1]]
|
|
|
|
# Example of creating and adding an agent based on the project name and lightning proposal
|
|
agent_name = f"{project_name} agent"
|
|
print(agent_name) # For demonstration
|
|
|
|
# Create the agent
|
|
logger.info("Creating agent...")
|
|
|
|
# Design agent
|
|
logger.info("Creating design agent...")
|
|
design_agent = Agent(
|
|
llm=gemini,
|
|
agent_name="Design Agent",
|
|
max_loops=1,
|
|
stopping_token="<DONE?>",
|
|
sop=None,
|
|
system_prompt=(
|
|
"Transform an app idea into step by step very"
|
|
" simple algorithmic psuedocode so it can be"
|
|
" implemented simply."
|
|
),
|
|
long_term_memory=memory,
|
|
)
|
|
|
|
# Log the agent
|
|
logger.info(
|
|
f"Code Agent created: {agent_name} with long term"
|
|
" memory"
|
|
)
|
|
agent = Agent(
|
|
llm=gemini,
|
|
agent_name=agent_name,
|
|
max_loops=1,
|
|
code_interpreter=True,
|
|
stopping_token="<DONE?>",
|
|
sop=None,
|
|
system_prompt=(
|
|
"Transform an app idea into a very simple"
|
|
" python app in markdown. Return all the"
|
|
" python code in a single markdown file."
|
|
" Return only code and nothing else."
|
|
),
|
|
long_term_memory=memory,
|
|
)
|
|
|
|
# Testing agent
|
|
logger.info(f"Testing_agent agent: {agent_name}")
|
|
agent = Agent(
|
|
llm=gemini,
|
|
agent_name=agent_name + " testing",
|
|
max_loops=1,
|
|
stopping_token="<DONE?>",
|
|
sop=None,
|
|
system_prompt=(
|
|
"Create unit tests using pytest based on the"
|
|
" code you see, only return unit test code in"
|
|
" python using markdown, only return the code"
|
|
" and nothing else."
|
|
),
|
|
long_term_memory=memory,
|
|
)
|
|
|
|
# Log the agent
|
|
logger.info(
|
|
f"Agent created: {agent_name} with long term"
|
|
" memory"
|
|
)
|
|
agents.append(agent)
|
|
|
|
# Design agent
|
|
design_agent_output = design_agent.run(
|
|
(
|
|
"Create the algorithmic psuedocode for the"
|
|
f" {lightning_proposal} in markdown and"
|
|
" return it"
|
|
),
|
|
None,
|
|
)
|
|
|
|
logger.info(
|
|
"Algorithmic psuedocode created:"
|
|
f" {design_agent_output}"
|
|
)
|
|
|
|
# Create the code for each project
|
|
output = agent.run(
|
|
(
|
|
"Create the code for the"
|
|
f" {lightning_proposal} in python using the"
|
|
" algorithmic psuedocode"
|
|
f" {design_agent_output} and wrap it in"
|
|
" markdown and return it"
|
|
),
|
|
None,
|
|
)
|
|
print(output)
|
|
# Parse the output
|
|
output = extract_code_from_markdown(output)
|
|
# Create the file
|
|
output = create_file(output, f"{project_name}.py")
|
|
|
|
# Testing agent
|
|
testing_agent_output = agent.run(
|
|
(
|
|
"Create the unit tests for the"
|
|
f" {lightning_proposal} in python using the"
|
|
f" code {output} and wrap it in markdown and"
|
|
" return it"
|
|
),
|
|
None,
|
|
)
|
|
print(testing_agent_output)
|
|
|
|
# Parse the output
|
|
testing_agent_output = extract_code_from_markdown(
|
|
testing_agent_output
|
|
)
|
|
# Create the file
|
|
testing_agent_output = create_file(
|
|
testing_agent_output, f"test_{project_name}.py"
|
|
)
|
|
|
|
# Log the project created
|
|
logger.info(
|
|
f"Project {project_name} created: {output} at"
|
|
f" file path {project_name}.py"
|
|
)
|
|
print(output)
|
|
|
|
# Log the unit tests created
|
|
logger.info(
|
|
f"Unit tests for {project_name} created:"
|
|
f" {testing_agent_output} at file path"
|
|
f" test_{project_name}.py"
|
|
)
|
|
|
|
print(
|
|
f"Agent {agent_name} created and added to the"
|
|
" swarm network"
|
|
)
|
|
|
|
return agents
|
|
|
|
except Exception as e:
|
|
logger.error(
|
|
"An error occurred while extracting and creating"
|
|
f" agents: {e}"
|
|
)
|
|
return None
|
|
|
|
|
|
# CSV
|
|
csv_file = "presentation.csv"
|
|
|
|
# Specific columns to extract
|
|
target_columns = ["Project Name", "Project Description"]
|
|
|
|
# Use the adjusted function
|
|
specific_column_values = extract_and_create_agents(
|
|
csv_file, target_columns
|
|
)
|
|
|
|
# Display the extracted column values
|
|
print(specific_column_values)
|
|
|
|
|
|
# Concurrently execute the function
|
|
logger.info(
|
|
"Concurrently executing the swarm for each hackathon project..."
|
|
)
|
|
output = execute_concurrently(
|
|
[
|
|
(extract_and_create_agents, (csv_file, target_columns), {}),
|
|
],
|
|
max_workers=5,
|
|
)
|
|
print(output)
|