pull/415/head
Kye 10 months ago
parent e38f48d3cc
commit da7b33d819

1
.gitignore vendored

@ -13,6 +13,7 @@ runs
chroma chroma
Unit Testing Agent_state.json Unit Testing Agent_state.json
swarms/__pycache__ swarms/__pycache__
artifacts
venv venv
.DS_Store .DS_Store
Cargo.lock Cargo.lock

@ -1,15 +0,0 @@
[package]
name = "swarms-runtime" # The name of your project
version = "0.1.0" # The current version, adhering to semantic versioning
edition = "2021" # Specifies which edition of Rust you're using, e.g., 2018 or 2021
authors = ["Your Name <your.email@example.com>"] # Optional: specify the package authors
license = "MIT" # Optional: the license for your project
description = "A brief description of my project" # Optional: a short description of your project
[dependencies]
cpython = "0.5"
rayon = "1.5"
[dependencies.pyo3]
version = "0.20.3"
features = ["extension-module", "auto-initialize"]

@ -61,7 +61,7 @@ nav:
- Limitations of Individual Agents: "limits_of_individual_agents.md" - Limitations of Individual Agents: "limits_of_individual_agents.md"
- Why Swarms: "why_swarms.md" - Why Swarms: "why_swarms.md"
- The Swarms Bounty System: "swarms_bounty_system.md" - The Swarms Bounty System: "swarms_bounty_system.md"
- Swarms Framework: - Swarms Framework [PY]:
- Overview: "swarms/index.md" - Overview: "swarms/index.md"
- DIY Build Your Own Agent: "diy_your_own_agent.md" - DIY Build Your Own Agent: "diy_your_own_agent.md"
- swarms.agents: - swarms.agents:

@ -0,0 +1,26 @@
Project Name,Lightning Proposal ,Names of Teammates,Teammates' Contact Info,Discord Handle,Diagram,github
Beggar AI,Self-improving LLMs that we will use to get in-game gold from people in World of Warcraft,Alex Bauer / Hamudi Naana,alex@legionfarm.com,hollyflame_lf,Searching for an engineer who can create self-improving LLMs that we will use to get in-game gold from people in World of Warcraft,
ChatQ,Chat visualization screen aimed to facilitate a dialog and provide visual cues.,"Vlad, Daniel",dkh@cs.stanford.edu,"volkfox, redpowered",,
Ego,"Create 3D characters and prompt them to chat with one another, fully voiced, on any conversation topic","Vish, Peggy","v@ego.live, peggy@ego.live","sixtynine, pegasaurusrex",we need an unreal engine dev to help us :),
Bants,"Public group chats broadcasted to the world, with content created by the interaction between humans and generative agents",Eric Zhang,zhang.bozheng@u.nus.edu,zbz_lvlv,"React Native, Supabase",
Human voice,Leverage AI generated video to represent human voice and encourage authentic social activities. E.g. under represented opinions. Use AI agent to as an influencer and represent a vibe and attract like-minded people to create social tribe.,,Sunnychiuka@gmail.com,carocha_,Dev and anyone:) got a web app for text already and happy anyone who is interested in the topic to join https://dontbeevil.web.app/,
SEMA,Semantic search agent to research arxiv,Matthew Diakonov,matthew.ddy@gmail.com,matthew.ddy,,
OpenMind.bot,"OpenMind.bot streamlines social interactions between personalized bots, representing users, media, and influencers, ensuring meaningful exchanges. It eliminates misunderstandings by using context-aware conversations, followed by summaries or audio recaps of these interactions for efficient communication.",Xuejun(Sheldon) Xie,xuejun.tse@gmail.com,dreammagician,,
From galpha.ai to Video of financial chat,turn a text based QA financial bot from the startup's API at http://galpha.ai into video based QA multimodal bot that can look at real time market,Bill Sun,bill@galpha.ai,bill_sun,"AI Plot generation, AI long video cut tool, product design, front end coding, backend coding",
Feelboard,"Looking to create a chat interface which improves the input based on actual feelings of the user. Interface uses front cam to detect facial expressions and emotions, analyses text being written and formats the text based on the emotions (bold, red, font).",ishan ,marketishan@gmail.com,ishanp0314,,
AiPets,"Create your AiPet, with memory, thinking, reflection. Use gemini 1.5, HeyGen, Gemelo.ai, NextJs, Apple Vision Pro",Konrad,konradmgnat@gmail.com,,,
Dots,External memory for social interactions,Peter k,K11kirky@gmail.com,K11kirky,,
Context Cam,Real-time visual inference & agent actions based on real world context.,Conway Anderson,hello@conwayanderson.com,conway#0000,Related demo: https://twitter.com/ConwayAnderson/status/1756058632960237871,
Subtext,Chat that infers and visualizes message tone for accessibility ,Andrew Acomb,acombandrew@gmail.com,asdlsd,"High EQ product people who text a lot, or devs interested in the project. Text 4088285953 if interested ",https://github.com/AndrewAcomb/subtext
Highlight,Using Gemini to find highlight short clips from long videos,"Jing Xiong, Alex Fu",xiongjing100@gmail.com,milkteax777,,
Merse,"A new way of Storytelling — Democratising Comic Strip creation based on your personal life story, Text to Comic book!","Mark Rachapoom, Kumar Abhirup, Kinjal Nandy, Alex",hey@kumareth.com,,,
DateSmart,create dating simulator that reflects real world dating conversations.,Kai Hung Chang,kaihungc1993@gmail.com,kai kaihungc ,,
YourContact,create a software that help you manage your relationship and remember detail about other people. for example remember birthday to send them birthday congrats,Sam He,samhenan@gmail.com,supersam331,"UX to brainstore and find painpo this idea. FE eng. I""m a BE ",
Beyond,Unlocking cultural capital for the global workforce,Yun Huang,huangyun@sas.upenn.edu,huangyoon,Searching for an inquisitive developer with strong execution skills,
AutoCAD ,generate threejs code for an object given a video of it from multiple angles,Haden Wasserbaech ,hello@haden.io,,,
LogicMind,Addressing hallucinations using NS approaches,Sankeerth Rao,sankeerth1729@gmail.com,sankeerthrao,,
AI Reality TV,,Edgar Haond,,,,
Swarms,Orchestrate Agents to create swarms,"Kye, Nate",kye@apac.ai,eternalreclaimer,Searching for agent engineers,https://github.com/kyegomez/swarms
Simplychat,Chat interface for e-commerce website,Hao,Shenghaozhe@gmail.com,,,
Kindergarten,A place for Kids growing up in the age AI to learn & play with fellow AI agents that feel like good friends and encourage you to learn & get better,Ben,ben@holfeld.ai,benholfeld,Looking for multi-agent interadction engineers,https://twitter.com/benholfeld
Followup,personal networking assistant,Eleanor,eleanorqin@gmail.com,eleanor.q,,
1 Project Name Lightning Proposal Names of Teammates Teammates' Contact Info Discord Handle Diagram github
2 Beggar AI Self-improving LLMs that we will use to get in-game gold from people in World of Warcraft Alex Bauer / Hamudi Naana alex@legionfarm.com hollyflame_lf Searching for an engineer who can create self-improving LLMs that we will use to get in-game gold from people in World of Warcraft
3 ChatQ Chat visualization screen aimed to facilitate a dialog and provide visual cues. Vlad, Daniel dkh@cs.stanford.edu volkfox, redpowered
4 Ego Create 3D characters and prompt them to chat with one another, fully voiced, on any conversation topic Vish, Peggy v@ego.live, peggy@ego.live sixtynine, pegasaurusrex we need an unreal engine dev to help us :)
5 Bants Public group chats broadcasted to the world, with content created by the interaction between humans and generative agents Eric Zhang zhang.bozheng@u.nus.edu zbz_lvlv React Native, Supabase
6 Human voice Leverage AI generated video to represent human voice and encourage authentic social activities. E.g. under represented opinions. Use AI agent to as an influencer and represent a vibe and attract like-minded people to create social tribe. Sunnychiuka@gmail.com carocha_ Dev and anyone:) got a web app for text already and happy anyone who is interested in the topic to join https://dontbeevil.web.app/
7 SEMA Semantic search agent to research arxiv Matthew Diakonov matthew.ddy@gmail.com matthew.ddy
8 OpenMind.bot OpenMind.bot streamlines social interactions between personalized bots, representing users, media, and influencers, ensuring meaningful exchanges. It eliminates misunderstandings by using context-aware conversations, followed by summaries or audio recaps of these interactions for efficient communication. Xuejun(Sheldon) Xie xuejun.tse@gmail.com dreammagician
9 From galpha.ai to Video of financial chat turn a text based QA financial bot from the startup's API at http://galpha.ai into video based QA multimodal bot that can look at real time market Bill Sun bill@galpha.ai bill_sun AI Plot generation, AI long video cut tool, product design, front end coding, backend coding
10 Feelboard Looking to create a chat interface which improves the input based on actual feelings of the user. Interface uses front cam to detect facial expressions and emotions, analyses text being written and formats the text based on the emotions (bold, red, font). ishan marketishan@gmail.com ishanp0314
11 AiPets Create your AiPet, with memory, thinking, reflection. Use gemini 1.5, HeyGen, Gemelo.ai, NextJs, Apple Vision Pro Konrad konradmgnat@gmail.com
12 Dots External memory for social interactions Peter k K11kirky@gmail.com K11kirky
13 Context Cam Real-time visual inference & agent actions based on real world context. Conway Anderson hello@conwayanderson.com conway#0000 Related demo: https://twitter.com/ConwayAnderson/status/1756058632960237871
14 Subtext Chat that infers and visualizes message tone for accessibility Andrew Acomb acombandrew@gmail.com asdlsd High EQ product people who text a lot, or devs interested in the project. Text 4088285953 if interested https://github.com/AndrewAcomb/subtext
15 Highlight Using Gemini to find highlight short clips from long videos Jing Xiong, Alex Fu xiongjing100@gmail.com milkteax777
16 Merse A new way of Storytelling — Democratising Comic Strip creation based on your personal life story, Text to Comic book! Mark Rachapoom, Kumar Abhirup, Kinjal Nandy, Alex hey@kumareth.com
17 DateSmart create dating simulator that reflects real world dating conversations. Kai Hung Chang kaihungc1993@gmail.com kai kaihungc
18 YourContact create a software that help you manage your relationship and remember detail about other people. for example remember birthday to send them birthday congrats Sam He samhenan@gmail.com supersam331 UX to brainstore and find painpo this idea. FE eng. I"m a BE
19 Beyond Unlocking cultural capital for the global workforce Yun Huang huangyun@sas.upenn.edu huangyoon Searching for an inquisitive developer with strong execution skills
20 AutoCAD generate threejs code for an object given a video of it from multiple angles Haden Wasserbaech hello@haden.io
21 LogicMind Addressing hallucinations using NS approaches Sankeerth Rao sankeerth1729@gmail.com sankeerthrao
22 AI Reality TV Edgar Haond
23 Swarms Orchestrate Agents to create swarms Kye, Nate kye@apac.ai eternalreclaimer Searching for agent engineers https://github.com/kyegomez/swarms
24 Simplychat Chat interface for e-commerce website Hao Shenghaozhe@gmail.com
25 Kindergarten A place for Kids growing up in the age AI to learn & play with fellow AI agents that feel like good friends and encourage you to learn & get better Ben ben@holfeld.ai benholfeld Looking for multi-agent interadction engineers https://twitter.com/benholfeld
26 Followup personal networking assistant Eleanor eleanorqin@gmail.com eleanor.q

@ -1,7 +1,7 @@
import concurrent import concurrent
import csv import csv
import os import os
from swarms import Gemini, Agent, SwarmNetwork, ConcurrentWorkflow from swarms import Gemini, Agent
from swarms.memory import ChromaDB from swarms.memory import ChromaDB
from dotenv import load_dotenv from dotenv import load_dotenv
from swarms.utils.parse_code import extract_code_from_markdown from swarms.utils.parse_code import extract_code_from_markdown
@ -17,24 +17,11 @@ gemini = Gemini(
gemini_api_key=os.getenv("GEMINI_API_KEY"), gemini_api_key=os.getenv("GEMINI_API_KEY"),
) )
# SwarmNetwork
swarm_network = SwarmNetwork(
logging_enabled=True,
)
# ConcurrentWorkflow
workflow = ConcurrentWorkflow(
task_pool=None,
max_workers=10,
)
# memory # memory
memory = ChromaDB(output_dir="swarm_hackathon") memory = ChromaDB(output_dir="swarm_hackathon")
def execute_concurrently(callable_functions, max_workers=5): def execute_concurrently(callable_functions: callable, max_workers=5):
""" """
Executes callable functions concurrently using multithreading. Executes callable functions concurrently using multithreading.
@ -71,23 +58,6 @@ def execute_concurrently(callable_functions, max_workers=5):
return results return results
# # For each row in the dataframe, create an agent and add it to the swarm network
# for index, row in df.iterrows():
# agent_name = row["Project Name"] + "agent"
# system_prompt = row["Lightning Proposal"]
# agent = Agent(
# llm=gemini,
# max_loops="auto",
# stopping_token="<DONE>",
# system_prompt=system_prompt,
# agent_name=agent_name,
# long_term_memory=ChromaDB(output_dir="swarm_hackathon"),
# )
# swarm_network.add_agent(agent)
# out = swarm_network.list_agents()
# Adjusting the function to extract specific column values # Adjusting the function to extract specific column values
def extract_and_create_agents( def extract_and_create_agents(
csv_file_path: str, target_columns: list csv_file_path: str, target_columns: list

@ -0,0 +1,18 @@
import os
from swarms import OpenAIChat, Agent
from dotenv import load_dotenv
# Load environment variables
load_dotenv()
# Create a chat instance
llm = OpenAIChat(
api_key=os.getenv("OPENAI_API_KEY"),
)
# Create an agent
agent = Agent(
agent_name="GPT-3",
llm=llm,
)

@ -5,8 +5,11 @@ llm = Anthropic()
# Agents # Agents
agent1 = Agent( agent1 = Agent(
llm = llm, llm=llm,
system_prompt="You are the leader of the Progressive Party. What is your stance on healthcare?", system_prompt=(
"You are the leader of the Progressive Party. What is your"
" stance on healthcare?"
),
agent_name="Progressive Leader", agent_name="Progressive Leader",
agent_description="Leader of the Progressive Party", agent_description="Leader of the Progressive Party",
long_term_memory=ChromaDB(), long_term_memory=ChromaDB(),
@ -39,4 +42,4 @@ mv = MajorityVoting(
# Start the majority voting # Start the majority voting
mv.run("What is your stance on healthcare?") mv.run("What is your stance on healthcare?")

@ -5,7 +5,12 @@ from swarms.memory.chroma_db import ChromaDB
# Agents # Agents
agent1 = Agent( agent1 = Agent(
llm=OpenAIChat(system_prompt="You are a Minecraft player. What's your favorite building style?"), llm=OpenAIChat(
system_prompt=(
"You are a Minecraft player. What's your favorite"
" building style?"
)
),
agent_name="Steve", agent_name="Steve",
agent_description="A Minecraft player agent", agent_description="A Minecraft player agent",
long_term_memory=ChromaDB(), long_term_memory=ChromaDB(),
@ -13,7 +18,12 @@ agent1 = Agent(
) )
agent2 = Agent( agent2 = Agent(
llm=OpenAIChat(system_prompt="You are a Minecraft builder. What's your most impressive creation?"), llm=OpenAIChat(
system_prompt=(
"You are a Minecraft builder. What's your most impressive"
" creation?"
)
),
agent_name="Bob", agent_name="Bob",
agent_description="A Minecraft builder agent", agent_description="A Minecraft builder agent",
long_term_memory=ChromaDB(), long_term_memory=ChromaDB(),
@ -21,7 +31,12 @@ agent2 = Agent(
) )
agent3 = Agent( agent3 = Agent(
llm=OpenAIChat(system_prompt="You are a Minecraft explorer. What's the most interesting place you've discovered?"), llm=OpenAIChat(
system_prompt=(
"You are a Minecraft explorer. What's the most"
" interesting place you've discovered?"
)
),
agent_name="Alex", agent_name="Alex",
agent_description="A Minecraft explorer agent", agent_description="A Minecraft explorer agent",
long_term_memory=ChromaDB(), long_term_memory=ChromaDB(),
@ -29,7 +44,12 @@ agent3 = Agent(
) )
agent4 = Agent( agent4 = Agent(
llm=OpenAIChat(system_prompt="You are a Minecraft adventurer. What's the most dangerous situation you've been in?"), llm=OpenAIChat(
system_prompt=(
"You are a Minecraft adventurer. What's the most"
" dangerous situation you've been in?"
)
),
agent_name="Ender", agent_name="Ender",
agent_description="A Minecraft adventurer agent", agent_description="A Minecraft adventurer agent",
long_term_memory=ChromaDB(), long_term_memory=ChromaDB(),
@ -37,7 +57,12 @@ agent4 = Agent(
) )
moderator = Agent( moderator = Agent(
llm=OpenAIChat(system_prompt="You are a Minecraft moderator. How do you handle conflicts between players?"), llm=OpenAIChat(
system_prompt=(
"You are a Minecraft moderator. How do you handle"
" conflicts between players?"
)
),
agent_name="Admin", agent_name="Admin",
agent_description="A Minecraft moderator agent", agent_description="A Minecraft moderator agent",
long_term_memory=ChromaDB(), long_term_memory=ChromaDB(),

@ -0,0 +1,61 @@
import os
from swarms import Gemini, Agent
from swarms.structs.multi_process_workflow import MultiProcessWorkflow
from dotenv import load_dotenv
# Load the environment variables
load_dotenv()
# Gemini API key
api_key = os.getenv("GEMINI_API_KEY")
# Initialize LLM
llm = Gemini(
model_name="gemini-pro",
api_key=api_key,
)
# Initialize the agents
finance_agent = Agent(
agent_name="Finance Agent",
llm=llm,
max_loops=1,
system_prompt="Finance",
)
marketing_agent = Agent(
agent_name="Marketing Agent",
llm=llm,
max_loops=1,
system_prompt="Marketing",
)
product_agent = Agent(
agent_name="Product Agent",
llm=llm,
max_loops=1,
system_prompt="Product",
)
other_agent = Agent(
agent_name="Other Agent",
llm=llm,
max_loops=1,
system_prompt="Other",
)
# Swarm
workflow = MultiProcessWorkflow(
agents=[
finance_agent,
marketing_agent,
product_agent,
other_agent,
],
max_workers=5,
autosave=True,
)
# Run the workflow
results = workflow.run("What")

@ -1,6 +1,4 @@
# Import necessary libraries
from transformers import AutoModelForCausalLM, AutoTokenizer from transformers import AutoModelForCausalLM, AutoTokenizer
from swarms import ToolAgent from swarms import ToolAgent
# Load the pre-trained model and tokenizer # Load the pre-trained model and tokenizer

@ -0,0 +1,183 @@
import inspect
import os
import threading
from typing import Callable, List
from swarms.prompts.documentation import DOCUMENTATION_WRITER_SOP
from swarms import Agent, OpenAIChat
from swarms.utils.loguru_logger import logger
import concurrent
#########
from swarms.utils.file_processing import (
load_json,
sanitize_file_path,
zip_workspace,
create_file_in_folder,
zip_folders,
)
class PythonDocumentationSwarm:
"""
A class for automating the documentation process for Python classes.
Args:
agents (List[Agent]): A list of agents used for processing the documentation.
max_loops (int, optional): The maximum number of loops to run. Defaults to 4.
docs_module_name (str, optional): The name of the module where the documentation will be saved. Defaults to "swarms.structs".
docs_directory (str, optional): The directory where the documentation will be saved. Defaults to "docs/swarms/tokenizers".
Attributes:
agents (List[Agent]): A list of agents used for processing the documentation.
max_loops (int): The maximum number of loops to run.
docs_module_name (str): The name of the module where the documentation will be saved.
docs_directory (str): The directory where the documentation will be saved.
"""
def __init__(
self,
agents: List[Agent],
max_loops: int = 4,
docs_module_name: str = "swarms.utils",
docs_directory: str = "docs/swarms/utils",
*args,
**kwargs,
):
super().__init__(*args, **kwargs)
self.agents = agents
self.max_loops = max_loops
self.docs_module_name = docs_module_name
self.docs_directory = docs_directory
# Initialize agent name logging
logger.info(
"Agents used for documentation:"
f" {', '.join([agent.name for agent in agents])}"
)
# Create the directory if it doesn't exist
dir_path = self.docs_directory
os.makedirs(dir_path, exist_ok=True)
logger.info(f"Documentation directory created at {dir_path}.")
def process_documentation(self, item):
"""
Process the documentation for a given class using OpenAI model and save it in a Markdown file.
Args:
item: The class or function for which the documentation needs to be processed.
"""
try:
doc = inspect.getdoc(item)
source = inspect.getsource(item)
is_class = inspect.isclass(item)
item_type = "Class Name" if is_class else "Name"
input_content = (
f"{item_type}:"
f" {item.__name__}\n\nDocumentation:\n{doc}\n\nSource"
f" Code:\n{source}"
)
# Process with OpenAI model (assuming the model's __call__ method takes this input and returns processed content)
for agent in self.agents:
processed_content = agent(
DOCUMENTATION_WRITER_SOP(
input_content, self.docs_module_name
)
)
doc_content = f"{processed_content}\n"
# Create the directory if it doesn't exist
dir_path = self.docs_directory
os.makedirs(dir_path, exist_ok=True)
# Write the processed documentation to a Markdown file
file_path = os.path.join(
dir_path, f"{item.__name__.lower()}.md"
)
with open(file_path, "w") as file:
file.write(doc_content)
logger.info(
f"Documentation generated for {item.__name__}."
)
except Exception as e:
logger.error(
f"Error processing documentation for {item.__name__}."
)
logger.error(e)
def run(self, python_items: List[Callable]):
"""
Run the documentation process for a list of Python items.
Args:
python_items (List[Callable]): A list of Python classes or functions for which the documentation needs to be generated.
"""
try:
threads = []
for item in python_items:
thread = threading.Thread(
target=self.process_documentation, args=(item,)
)
threads.append(thread)
thread.start()
# Wait for all threads to complete
for thread in threads:
thread.join()
logger.info(
"Documentation generated in 'swarms.structs'"
" directory."
)
except Exception as e:
logger.error("Error running documentation process.")
logger.error(e)
def run_concurrently(self, python_items: List[Callable]):
try:
with concurrent.futures.ThreadPoolExecutor() as executor:
executor.map(self.process_documentation, python_items)
logger.info(
"Documentation generated in 'swarms.structs'"
" directory."
)
except Exception as e:
logger.error("Error running documentation process.")
logger.error(e)
# Example usage
# Initialize the agents
agent = Agent(
llm=OpenAIChat(max_tokens=3000),
agent_name="Documentation Agent",
system_prompt=(
"You write documentation for Python items functions and"
" classes, return in markdown"
),
max_loops=1,
)
# Initialize the documentation swarm
doc_swarm = PythonDocumentationSwarm(
agents=[agent],
max_loops=1,
docs_module_name="swarms.structs",
docs_directory="docs/swarms/tokenizers",
)
# Run the documentation process
doc_swarm.run(
[
load_json,
sanitize_file_path,
zip_workspace,
create_file_in_folder,
zip_folders,
]
)

@ -5,7 +5,7 @@ build-backend = "poetry.core.masonry.api"
[tool.poetry] [tool.poetry]
name = "swarms" name = "swarms"
version = "4.2.8" version = "4.2.9"
description = "Swarms - Pytorch" description = "Swarms - Pytorch"
license = "MIT" license = "MIT"
authors = ["Kye Gomez <kye@apac.ai>"] authors = ["Kye Gomez <kye@apac.ai>"]
@ -49,7 +49,7 @@ tiktoken = "0.4.0"
ratelimit = "2.2.1" ratelimit = "2.2.1"
loguru = "0.7.2" loguru = "0.7.2"
huggingface-hub = "*" huggingface-hub = "*"
pydantic = "1.10.12" pydantic = "*"
tenacity = "8.2.2" tenacity = "8.2.2"
Pillow = "9.4.0" Pillow = "9.4.0"
chromadb = "*" chromadb = "*"

@ -0,0 +1,21 @@
import os
import shutil
# Create a new directory for the log files if it doesn't exist
if not os.path.exists("artifacts"):
os.makedirs("artifacts")
# Walk through the current directory
for dirpath, dirnames, filenames in os.walk("."):
for filename in filenames:
# If the file is a log file
if filename.endswith(".log"):
# Construct the full file path
file_path = os.path.join(dirpath, filename)
# Move the log file to the 'artifacts' directory
shutil.move(file_path, "artifacts")
print(
"Moved all log files into the 'artifacts' directory and deleted"
" their original location."
)

@ -1,6 +1,7 @@
# from swarms.telemetry.main import Telemetry # noqa: E402, F403 # from swarms.telemetry.main import Telemetry # noqa: E402, F403
from swarms.telemetry.bootup import bootup # noqa: E402, F403 from swarms.telemetry.bootup import bootup # noqa: E402, F403
import os import os
os.environ["WANDB_SILENT"] = "true" os.environ["WANDB_SILENT"] = "true"
bootup() bootup()
@ -17,4 +18,4 @@ from swarms.telemetry import * # noqa: E402, F403
from swarms.tokenizers import * # noqa: E402, F403 from swarms.tokenizers import * # noqa: E402, F403
from swarms.tools import * # noqa: E402, F403 from swarms.tools import * # noqa: E402, F403
from swarms.utils import * # noqa: E402, F403 from swarms.utils import * # noqa: E402, F403
from swarms.memory import * # noqa: E402, F403 from swarms.memory import * # noqa: E402, F403

@ -13,7 +13,7 @@ from cachetools import TTLCache
from dotenv import load_dotenv from dotenv import load_dotenv
from openai import OpenAI from openai import OpenAI
from PIL import Image from PIL import Image
from pydantic import validator from pydantic import field_validator
from termcolor import colored from termcolor import colored
load_dotenv() load_dotenv()
@ -90,7 +90,8 @@ class Dalle3:
arbitrary_types_allowed = True arbitrary_types_allowed = True
@validator("max_retries", "time_seconds") @field_validator("max_retries", "time_seconds")
@classmethod
def must_be_positive(cls, value): def must_be_positive(cls, value):
if value <= 0: if value <= 0:
raise ValueError("Must be positive") raise ValueError("Must be positive")

@ -3,7 +3,7 @@ from enum import Enum
from typing import Any, Dict, Union from typing import Any, Dict, Union
from langchain.utils import get_from_dict_or_env from langchain.utils import get_from_dict_or_env
from pydantic import root_validator from pydantic import model_validator
from swarms.tools.tool import BaseTool from swarms.tools.tool import BaseTool
@ -59,7 +59,8 @@ class ElevenLabsText2SpeechTool(BaseTool):
" Italian, French, Portuguese, and Hindi. " " Italian, French, Portuguese, and Hindi. "
) )
@root_validator(pre=True) @model_validator(mode="before")
@classmethod
def validate_environment(cls, values: Dict) -> Dict: def validate_environment(cls, values: Dict) -> Dict:
"""Validate that api key exists in environment.""" """Validate that api key exists in environment."""
_ = get_from_dict_or_env( _ = get_from_dict_or_env(

@ -36,7 +36,6 @@ def get_gemini_api_key_env():
return str(key) return str(key)
# Main class # Main class
class Gemini(BaseMultiModalModel): class Gemini(BaseMultiModalModel):
"""Gemini model """Gemini model

@ -9,21 +9,21 @@ class TextModality(BaseModel):
class ImageModality(BaseModel): class ImageModality(BaseModel):
url: str url: str
alt_text: Optional[str] alt_text: Optional[str] = None
class AudioModality(BaseModel): class AudioModality(BaseModel):
url: str url: str
transcript: Optional[str] transcript: Optional[str] = None
class VideoModality(BaseModel): class VideoModality(BaseModel):
url: str url: str
transcript: Optional[str] transcript: Optional[str] = None
class MultimodalData(BaseModel): class MultimodalData(BaseModel):
text: Optional[List[TextModality]] text: Optional[List[TextModality]] = None
images: Optional[List[ImageModality]] images: Optional[List[ImageModality]] = None
audio: Optional[List[AudioModality]] audio: Optional[List[AudioModality]] = None
video: Optional[List[VideoModality]] video: Optional[List[VideoModality]] = None

@ -19,7 +19,7 @@ from swarms.structs.message import Message
from swarms.structs.model_parallizer import ModelParallelizer from swarms.structs.model_parallizer import ModelParallelizer
from swarms.structs.multi_agent_collab import MultiAgentCollaboration from swarms.structs.multi_agent_collab import MultiAgentCollaboration
from swarms.structs.multi_process_workflow import ( from swarms.structs.multi_process_workflow import (
MultiProcessingWorkflow, MultiProcessWorkflow,
) )
from swarms.structs.multi_threaded_workflow import ( from swarms.structs.multi_threaded_workflow import (
MultiThreadedWorkflow, MultiThreadedWorkflow,
@ -136,7 +136,7 @@ __all__ = [
"MajorityVoting", "MajorityVoting",
"synchronized_queue", "synchronized_queue",
"TaskQueueBase", "TaskQueueBase",
"MultiProcessingWorkflow", "MultiProcessWorkflow",
"MultiThreadedWorkflow", "MultiThreadedWorkflow",
"AgentJob", "AgentJob",
] ]

@ -114,11 +114,10 @@ def majority_voting(answers: List[str]):
""" """
counter = Counter(answers) counter = Counter(answers)
if counter: if counter:
answer = counter.most_common(1)[0][0] answer = counter.most_common(1)[0][0]
else: else:
answer = "I don't know" answer = "I don't know"
return answer return answer
@ -166,7 +165,9 @@ class MajorityVoting:
# If autosave is enabled, save the conversation to a file # If autosave is enabled, save the conversation to a file
if self.autosave: if self.autosave:
create_file(str(self.conversation), "majority_voting.json") create_file(
str(self.conversation), "majority_voting.json"
)
# Log the agents # Log the agents
logger.info("Initializing majority voting system") logger.info("Initializing majority voting system")
@ -205,9 +206,14 @@ class MajorityVoting:
# Add responses to conversation and log them # Add responses to conversation and log them
for agent, response in zip(self.agents, results): for agent, response in zip(self.agents, results):
response = response if isinstance(response, list) else [response] response = (
response if isinstance(response, list) else [response]
)
self.conversation.add(agent.agent_name, response) self.conversation.add(agent.agent_name, response)
logger.info(f"[Agent][Name: {agent.agent_name}][Response: {response}]") logger.info(
f"[Agent][Name: {agent.agent_name}][Response:"
f" {response}]"
)
# Perform majority voting on the conversation # Perform majority voting on the conversation
responses = [ responses = [
@ -218,10 +224,11 @@ class MajorityVoting:
# If an output parser is provided, parse the responses # If an output parser is provided, parse the responses
if self.output_parser is not None: if self.output_parser is not None:
majority_vote = self.output_parser(responses, *args, **kwargs) majority_vote = self.output_parser(
responses, *args, **kwargs
)
else: else:
majority_vote = majority_voting(responses) majority_vote = majority_voting(responses)
# Return the majority vote # Return the majority vote
return majority_vote return majority_vote

@ -210,4 +210,4 @@ class MessagePool:
# (mod, content) # (mod, content)
# for mod, content, _ in self.messages # Add an underscore to ignore the rest of the elements # for mod, content, _ in self.messages # Add an underscore to ignore the rest of the elements
# if query in content # if query in content
# ] # ]

@ -1,17 +1,11 @@
import logging
from functools import wraps from functools import wraps
from multiprocessing import Manager, Pool, cpu_count from multiprocessing import Manager, Pool, cpu_count
from time import sleep from time import sleep
from typing import List from typing import Sequence
from swarms.structs.agent import Agent
from swarms.structs.base_workflow import BaseWorkflow from swarms.structs.base_workflow import BaseWorkflow
from swarms.structs.task import Task from swarms.utils.loguru_logger import logger
# Configure logging
logging.basicConfig(
level=logging.INFO,
format="%(asctime)s - %(levelname)s - %(message)s",
)
# Retry on failure # Retry on failure
@ -35,7 +29,7 @@ def retry_on_failure(max_retries: int = 3, delay: int = 5):
try: try:
return func(*args, **kwargs) return func(*args, **kwargs)
except Exception as error: except Exception as error:
logging.error( logger.error(
f"Error: {str(error)}, retrying in" f"Error: {str(error)}, retrying in"
f" {delay} seconds..." f" {delay} seconds..."
) )
@ -47,7 +41,7 @@ def retry_on_failure(max_retries: int = 3, delay: int = 5):
return decorator return decorator
class MultiProcessingWorkflow(BaseWorkflow): class MultiProcessWorkflow(BaseWorkflow):
""" """
Initialize a MultiProcessWorkflow object. Initialize a MultiProcessWorkflow object.
@ -90,25 +84,32 @@ class MultiProcessingWorkflow(BaseWorkflow):
self, self,
max_workers: int = 5, max_workers: int = 5,
autosave: bool = True, autosave: bool = True,
tasks: List[Task] = None, agents: Sequence[Agent] = None,
*args, *args,
**kwargs, **kwargs,
): ):
super().__init__(*args, **kwargs) super().__init__(*args, **kwargs)
self.max_workers = max_workers self.max_workers = max_workers
self.autosave = autosave self.autosave = autosave
self.tasks = sorted( self.agents = agents
tasks or [], key=lambda task: task.priority, reverse=True
)
self.max_workers or cpu_count() self.max_workers or cpu_count()
if tasks is None: # Log
tasks = [] logger.info(
(
"Initialized MultiProcessWorkflow with"
f" {self.max_workers} max workers and autosave set to"
f" {self.autosave}"
),
)
self.tasks = tasks # Log the agents
if self.agents is not None:
for agent in self.agents:
logger.info(f"Agent: {agent.agent_name}")
def execute_task(self, task: Task, *args, **kwargs): def execute_task(self, task: str, *args, **kwargs):
"""Execute a task and handle exceptions. """Execute a task and handle exceptions.
Args: Args:
@ -121,27 +122,23 @@ class MultiProcessingWorkflow(BaseWorkflow):
""" """
try: try:
result = task.execute(*args, **kwargs) if self.agents is not None:
# Execute the task
logging.info( for agent in self.agents:
f"Task {task} completed successfully with result" result = agent.run(task, *args, **kwargs)
f" {result}"
)
if self.autosave: return result
self._autosave_task_result(task, result)
except Exception as e: except Exception as e:
logging.error( logger.error(
( (
"An error occurred during execution of task" "An error occurred during execution of task"
f" {task}: {str(e)}" f" {task}: {str(e)}"
), ),
exc_info=True,
) )
return None return None
def run(self, task: Task, *args, **kwargs): def run(self, task: str, *args, **kwargs):
"""Run the workflow. """Run the workflow.
Args: Args:
@ -163,14 +160,14 @@ class MultiProcessingWorkflow(BaseWorkflow):
results_list = manager.list() results_list = manager.list()
jobs = [ jobs = [
pool.apply_async( pool.apply_async(
self.execute_task, self.execute_task, # Pass the function, not the function call
(task,), args=(task,)
+ args, # Pass the arguments as a tuple
kwds=kwargs, # Pass the keyword arguments as a dictionary
callback=results_list.append, callback=results_list.append,
timeout=task.timeout, timeout=task.timeout,
*args,
**kwargs,
) )
for task in self.tasks for agent in self.agent
] ]
# Wait for all jobs to complete # Wait for all jobs to complete
@ -181,17 +178,5 @@ class MultiProcessingWorkflow(BaseWorkflow):
return results return results
except Exception as error: except Exception as error:
logging.error(f"Error in run: {error}") logger.error(f"Error in run: {error}")
return None return None
def _autosave_task_result(self, task: Task, result):
"""Autosave task result. This should be adapted based on how autosaving is implemented.
Args:
task (Task): The task for which to autosave the result.
result (Any): The result of the task execution.
"""
# Note: This method might need to be adapted to ensure it's process-safe, depending on how autosaving is implemented.
logging.info(f"Autosaving result for task {task}: {result}")
# Actual autosave logic here

@ -12,7 +12,7 @@ class TaskInput(BaseModel):
description=( description=(
"The input parameters for the task. Any value is allowed." "The input parameters for the task. Any value is allowed."
), ),
example='{\n"debug": false,\n"mode": "benchmarks"\n}', examples=['{\n"debug": false,\n"mode": "benchmarks"\n}'],
) )
@ -29,17 +29,19 @@ class Artifact(BaseModel):
artifact_id: str = Field( artifact_id: str = Field(
..., ...,
description="Id of the artifact", description="Id of the artifact",
example="b225e278-8b4c-4f99-a696-8facf19f0e56", examples=["b225e278-8b4c-4f99-a696-8facf19f0e56"],
) )
file_name: str = Field( file_name: str = Field(
..., description="Filename of the artifact", example="main.py" ...,
description="Filename of the artifact",
examples=["main.py"],
) )
relative_path: str | None = Field( relative_path: str | None = Field(
None, None,
description=( description=(
"Relative path of the artifact in the agent's workspace" "Relative path of the artifact in the agent's workspace"
), ),
example="python/code/", examples=["python/code/"],
) )
@ -50,7 +52,7 @@ class ArtifactUpload(BaseModel):
description=( description=(
"Relative path of the artifact in the agent's workspace" "Relative path of the artifact in the agent's workspace"
), ),
example="python/code/", examples=["python/code/"],
) )
@ -61,7 +63,7 @@ class StepInput(BaseModel):
"Input parameters for the task step. Any value is" "Input parameters for the task step. Any value is"
" allowed." " allowed."
), ),
example='{\n"file_to_refactor": "models.py"\n}', examples=['{\n"file_to_refactor": "models.py"\n}'],
) )
@ -72,7 +74,7 @@ class StepOutput(BaseModel):
"Output that the task step has produced. Any value is" "Output that the task step has produced. Any value is"
" allowed." " allowed."
), ),
example='{\n"tokens": 7894,\n"estimated_cost": "0,24$"\n}', examples=['{\n"tokens": 7894,\n"estimated_cost": "0,24$"\n}'],
) )
@ -80,9 +82,9 @@ class TaskRequestBody(BaseModel):
input: str | None = Field( input: str | None = Field(
None, None,
description="Input prompt for the task.", description="Input prompt for the task.",
example=( examples=[
"Write the words you receive to the file 'output.txt'." "Write the words you receive to the file 'output.txt'."
), ],
) )
additional_input: TaskInput | None = None additional_input: TaskInput | None = None
@ -91,14 +93,16 @@ class Task(TaskRequestBody):
task_id: str = Field( task_id: str = Field(
..., ...,
description="The ID of the task.", description="The ID of the task.",
example="50da533e-3904-4401-8a07-c49adf88b5eb", examples=["50da533e-3904-4401-8a07-c49adf88b5eb"],
) )
artifacts: list[Artifact] = Field( artifacts: list[Artifact] = Field(
[], [],
description="A list of artifacts that the task has produced.", description="A list of artifacts that the task has produced.",
example=[ examples=[
"7a49f31c-f9c6-4346-a22c-e32bc5af4d8e", [
"ab7b4091-2560-4692-a4fe-d831ea3ca7d6", "7a49f31c-f9c6-4346-a22c-e32bc5af4d8e",
"ab7b4091-2560-4692-a4fe-d831ea3ca7d6",
]
], ],
) )
@ -107,7 +111,7 @@ class StepRequestBody(BaseModel):
input: str | None = Field( input: str | None = Field(
None, None,
description="Input prompt for the step.", description="Input prompt for the step.",
example="Washington", examples=["Washington"],
) )
additional_input: StepInput | None = None additional_input: StepInput | None = None
@ -122,17 +126,17 @@ class Step(StepRequestBody):
task_id: str = Field( task_id: str = Field(
..., ...,
description="The ID of the task this step belongs to.", description="The ID of the task this step belongs to.",
example="50da533e-3904-4401-8a07-c49adf88b5eb", examples=["50da533e-3904-4401-8a07-c49adf88b5eb"],
) )
step_id: str = Field( step_id: str = Field(
..., ...,
description="The ID of the task step.", description="The ID of the task step.",
example="6bb1801a-fd80-45e8-899a-4dd723cc602e", examples=["6bb1801a-fd80-45e8-899a-4dd723cc602e"],
) )
name: str | None = Field( name: str | None = Field(
None, None,
description="The name of the task step.", description="The name of the task step.",
example="Write to file", examples=["Write to file"],
) )
status: Status = Field( status: Status = Field(
..., description="The status of the task step." ..., description="The status of the task step."
@ -140,11 +144,11 @@ class Step(StepRequestBody):
output: str | None = Field( output: str | None = Field(
None, None,
description="Output of the task step.", description="Output of the task step.",
example=( examples=[
"I am going to use the write_to_file command and write" "I am going to use the write_to_file command and write"
" Washington to a file called output.txt" " Washington to a file called output.txt"
" <write_to_file('output.txt', 'Washington')" " <write_to_file('output.txt', 'Washington')"
), ],
) )
additional_output: StepOutput | None = None additional_output: StepOutput | None = None
artifacts: list[Artifact] = Field( artifacts: list[Artifact] = Field(

@ -1,7 +1,7 @@
import json import json
from typing import List, Optional from typing import List, Optional
from pydantic import BaseModel, Field, Json, root_validator from pydantic import model_validator, BaseModel, Field, Json
from swarms.structs.agent import Agent from swarms.structs.agent import Agent
from swarms.structs.task import Task from swarms.structs.task import Task
@ -20,9 +20,11 @@ class Team(BaseModel):
config (Optional[Json]): Configuration of the Team. Default is None. config (Optional[Json]): Configuration of the Team. Default is None.
""" """
tasks: Optional[List[Task]] = Field(description="List of tasks") tasks: Optional[List[Task]] = Field(
None, description="List of tasks"
)
agents: Optional[List[Agent]] = Field( agents: Optional[List[Agent]] = Field(
description="List of agents in this Team." None, description="List of agents in this Team."
) )
architecture = Field( architecture = Field(
description="architecture that the Team will follow.", description="architecture that the Team will follow.",
@ -36,7 +38,8 @@ class Team(BaseModel):
description="Configuration of the Team.", default=None description="Configuration of the Team.", default=None
) )
@root_validator(pre=True) @model_validator(mode="before")
@classmethod
def check_config(_cls, values): def check_config(_cls, values):
if not values.get("config") and ( if not values.get("config") and (
not values.get("agents") and not values.get("tasks") not values.get("agents") and not values.get("tasks")

@ -7,12 +7,12 @@ from swarms.tools.exec_tool import (
preprocess_json_input, preprocess_json_input,
) )
from swarms.tools.tool import BaseTool, StructuredTool, Tool, tool from swarms.tools.tool import BaseTool, StructuredTool, Tool, tool
from swarms.tools.tool_func_doc_scraper import scrape_tool_func_docs
from swarms.tools.tool_utils import ( from swarms.tools.tool_utils import (
execute_tools, execute_tools,
extract_tool_commands, extract_tool_commands,
parse_and_execute_tools, parse_and_execute_tools,
tool_find_by_name, tool_find_by_name,
scrape_tool_func_docs,
) )
__all__ = [ __all__ = [

@ -1,46 +0,0 @@
import inspect
from typing import Callable
from termcolor import colored
def scrape_tool_func_docs(fn: Callable) -> str:
"""
Scrape the docstrings and parameters of a function decorated with `tool` and return a formatted string.
Args:
fn (Callable): The function to scrape.
Returns:
str: A string containing the function's name, documentation string, and a list of its parameters. Each parameter is represented as a line containing the parameter's name, default value, and annotation.
"""
try:
# If the function is a tool, get the original function
if hasattr(fn, "func"):
fn = fn.func
signature = inspect.signature(fn)
parameters = []
for name, param in signature.parameters.items():
parameters.append(
f"Name: {name}, Type:"
f" {param.default if param.default is not param.empty else 'None'},"
" Annotation:"
f" {param.annotation if param.annotation is not param.empty else 'None'}"
)
parameters_str = "\n".join(parameters)
return (
f"Function: {fn.__name__}\nDocstring:"
f" {inspect.getdoc(fn)}\nParameters:\n{parameters_str}"
)
except Exception as error:
print(
colored(
(
f"Error scraping tool function docs {error} try"
" optimizing your inputs with different"
" variables and attempt once more."
),
"red",
)
)

@ -4,7 +4,52 @@ from typing import Any, List
from swarms.prompts.tools import SCENARIOS from swarms.prompts.tools import SCENARIOS
from swarms.tools.tool import BaseTool from swarms.tools.tool import BaseTool
from swarms.tools.tool_func_doc_scraper import scrape_tool_func_docs import inspect
from typing import Callable
from termcolor import colored
def scrape_tool_func_docs(fn: Callable) -> str:
"""
Scrape the docstrings and parameters of a function decorated with `tool` and return a formatted string.
Args:
fn (Callable): The function to scrape.
Returns:
str: A string containing the function's name, documentation string, and a list of its parameters. Each parameter is represented as a line containing the parameter's name, default value, and annotation.
"""
try:
# If the function is a tool, get the original function
if hasattr(fn, "func"):
fn = fn.func
signature = inspect.signature(fn)
parameters = []
for name, param in signature.parameters.items():
parameters.append(
f"Name: {name}, Type:"
f" {param.default if param.default is not param.empty else 'None'},"
" Annotation:"
f" {param.annotation if param.annotation is not param.empty else 'None'}"
)
parameters_str = "\n".join(parameters)
return (
f"Function: {fn.__name__}\nDocstring:"
f" {inspect.getdoc(fn)}\nParameters:\n{parameters_str}"
)
except Exception as error:
print(
colored(
(
f"Error scraping tool function docs {error} try"
" optimizing your inputs with different"
" variables and attempt once more."
),
"red",
)
)
def tool_find_by_name(tool_name: str, tools: List[Any]): def tool_find_by_name(tool_name: str, tools: List[Any]):

@ -1,6 +1,5 @@
import json import json
from pydantic import BaseModel from pydantic import BaseModel
@ -33,3 +32,19 @@ def extract_json_from_str(response: str):
json_start = response.index("{") json_start = response.index("{")
json_end = response.rfind("}") json_end = response.rfind("}")
return json.loads(response[json_start : json_end + 1]) return json.loads(response[json_start : json_end + 1])
def base_model_to_json(base_model_instance: BaseModel) -> str:
"""
Convert a Pydantic base model instance to a JSON string.
Args:
base_model_instance (BaseModel): Instance of the Pydantic base model.
Returns:
str: JSON string representation of the base model instance.
"""
model_dict = base_model_instance.dict()
json_string = json.dumps(model_dict)
return json_string

Loading…
Cancel
Save