quality control

pull/59/head
Kye 1 year ago
parent 0ab2d9108d
commit bcac30d456

@ -0,0 +1,30 @@
name: Linting and Formatting
on:
push:
branches:
- main
jobs:
lint_and_format:
runs-on: ubuntu-latest
steps:
- name: Checkout code
uses: actions/checkout@v3
- name: Set up Python
uses: actions/setup-python@v3
with:
python-version: 3.x
- name: Install dependencies
run: pip install -r requirements.txt
- name: Find Python files
run: find swarms -name "*.py" -type f -exec autopep8 --in-place --aggressive --aggressive {} +
- name: Push changes
uses: ad-m/github-push-action@master
with:
github_token: ${{ secrets.GITHUB_TOKEN }}

@ -63,3 +63,11 @@ types-pytz = "^2023.3.0.0"
black = "^23.1.0"
types-chardet = "^5.0.4.6"
mypy-protobuf = "^3.0.0"
[tool.autopep8]
max_line_length = 120
ignore = "E501,W6" # or ["E501", "W6"]
in-place = true
recursive = true
aggressive = 3

@ -50,6 +50,7 @@ torchmetrics
transformers
webdataset
yapf
autopep8
mkdocs

@ -1,23 +1,23 @@
# swarms
from swarms import agents
from swarms.swarms.orchestrate import Orchestrator
from swarms import swarms
from swarms import structs
from swarms import models
from swarms.workers.worker import Worker
from swarms import workers
from swarms.logo import logo2
print(logo2)
# worker
from swarms import workers
from swarms.workers.worker import Worker
# boss
# from swarms.boss.boss_node import Boss
# models
from swarms import models
# structs
from swarms import structs
# swarms
from swarms import swarms
from swarms.swarms.orchestrate import Orchestrator
# agents
from swarms import agents

@ -8,7 +8,6 @@
from swarms.agents.omni_modal_agent import OmniModalAgent
# utils
from swarms.agents.message import Message
from swarms.agents.stream_response import stream

@ -7,6 +7,7 @@ import openai
logging.basicConfig(level=logging.INFO, format='%(asctime)s - %(levelname)s - %(message)s')
logger = logging.getLogger(__name__)
class OpenAI:
def __init__(
self,
@ -111,7 +112,7 @@ class OpenAI:
initial_prompt,
rejected_solutions=None
):
if (type(state) == str):
if (isinstance(state, str)):
state_text = state
else:
state_text = '\n'.join(state)
@ -134,7 +135,6 @@ class OpenAI:
# print(f"Generated thoughts: {thoughts}")
return thoughts
def generate_solution(self,
initial_prompt,
state,
@ -169,7 +169,7 @@ class OpenAI:
if self.evaluation_strategy == 'value':
state_values = {}
for state in states:
if (type(state) == str):
if (isinstance(state, str)):
state_text = state
else:
state_text = '\n'.join(state)
@ -193,6 +193,8 @@ class OpenAI:
else:
raise ValueError("Invalid evaluation strategy. Choose 'value' or 'vote'.")
class AoTAgent:
def __init__(
self,

@ -62,4 +62,3 @@ class AbstractAgent:
def _astep(self, message: str):
"""Asynchronous step"""

@ -22,8 +22,6 @@ except ImportError:
return x
logger = logging.getLogger(__name__)

@ -3,6 +3,7 @@ from typing import Any, Dict, List
from swarms.memory.base_memory import BaseChatMemory, get_prompt_input_key
from swarms.memory.base import VectorStoreRetriever
class AgentMemory(BaseChatMemory):
retriever: VectorStoreRetriever
"""VectorStoreRetriever object to connect to."""

@ -1,5 +1,6 @@
import datetime
class Message:
"""
Represents a message with timestamp and optional metadata.

@ -3,5 +3,3 @@
# from .GroundingDINO.groundingdino.util import box_ops, SLConfig
# from .GroundingDINO.groundingdino.util.utils import clean_state_dict, get_phrases_from_posmap
# from .segment_anything.segment_anything import build_sam, SamPredictor, SamAutomaticMaskGenerator

@ -11,4 +11,3 @@
# Copied from DETR (https://github.com/facebookresearch/detr)
# Copyright (c) Facebook, Inc. and its affiliates. All Rights Reserved.
# ------------------------------------------------------------------------

@ -27,7 +27,7 @@ from torch.nn.init import constant_, xavier_uniform_
try:
from groundingdino import _C
except:
except BaseException:
warnings.warn("Failed to load custom C++ ops. Running on CPU mode Only!")
@ -241,7 +241,6 @@ class MultiScaleDeformableAttention(nn.Module):
level_start_index: Optional[torch.Tensor] = None,
**kwargs
) -> torch.Tensor:
"""Forward Function of MultiScaleDeformableAttention
Args:

@ -1,6 +1,7 @@
from transformers import AutoTokenizer, BertModel, RobertaModel
import os
def get_tokenlizer(text_encoder_type):
if not isinstance(text_encoder_type, str):
# print("text_encoder_type is not a str")

@ -170,7 +170,7 @@ class SLConfig(object):
elif isinstance(b, list):
try:
_ = int(k)
except:
except BaseException:
raise TypeError(
f"b is a list, " f"index {k} should be an int when input but {type(k)}"
)

@ -268,6 +268,7 @@ def get_embedder(multires, i=0):
}
embedder_obj = Embedder(**embed_kwargs)
def embed(x, eo=embedder_obj):
return eo.embed(x)
return embed, embedder_obj.out_dim

@ -243,7 +243,7 @@ class COCOVisualizer:
for ann in anns:
c = (np.random.random((1, 3)) * 0.6 + 0.4).tolist()[0]
if "segmentation" in ann:
if type(ann["segmentation"]) == list:
if isinstance(ann["segmentation"], list):
# polygon
for seg in ann["segmentation"]:
poly = np.array(seg).reshape((int(len(seg) / 2), 2))
@ -252,7 +252,7 @@ class COCOVisualizer:
else:
# mask
t = self.imgs[ann["image_id"]]
if type(ann["segmentation"]["counts"]) == list:
if isinstance(ann["segmentation"]["counts"], list):
rle = maskUtils.frPyObjects(
[ann["segmentation"]], t["height"], t["width"]
)
@ -267,7 +267,7 @@ class COCOVisualizer:
for i in range(3):
img[:, :, i] = color_mask[i]
ax.imshow(np.dstack((img, m * 0.5)))
if "keypoints" in ann and type(ann["keypoints"]) == list:
if "keypoints" in ann and isinstance(ann["keypoints"], list):
# turn skeleton into zero-based index
sks = np.array(self.loadCats(ann["category_id"])[0]["skeleton"]) - 1
kp = np.array(ann["keypoints"])

@ -24,14 +24,14 @@ def create_positive_map_from_span(tokenized, token_span, max_text_len=256):
beg_pos = tokenized.char_to_token(beg + 1)
if beg_pos is None:
beg_pos = tokenized.char_to_token(beg + 2)
except:
except BaseException:
beg_pos = None
if end_pos is None:
try:
end_pos = tokenized.char_to_token(end - 2)
if end_pos is None:
end_pos = tokenized.char_to_token(end - 3)
except:
except BaseException:
end_pos = None
if beg_pos is None or end_pos is None:
continue

@ -3,4 +3,3 @@
# This source code is licensed under the license found in the
# LICENSE file in the root directory of this source tree.

@ -3,4 +3,3 @@
# This source code is licensed under the license found in the
# LICENSE file in the root directory of this source tree.

@ -1,3 +1,4 @@
from swarms.agents.message import Message
import os
import random
import torch
@ -36,7 +37,6 @@ import matplotlib.pyplot as plt
import wget
# prompts
VISUAL_AGENT_PREFIX = """
Worker Multi-Modal Agent is designed to be able to assist with
@ -239,6 +239,7 @@ def get_new_image_name(org_img_name, func_name="update"):
new_file_name = f'{this_new_uuid}_{func_name}_{recent_prev_file_name}_{most_org_file_name}.png'
return os.path.join(head, new_file_name)
class InstructPix2Pix:
def __init__(self, device):
print(f"Initializing InstructPix2Pix to {device}")
@ -604,6 +605,7 @@ class PoseText2Image:
f"Output Image: {updated_image_path}")
return updated_image_path
class SegText2Image:
def __init__(self, device):
print(f"Initializing SegText2Image to {device}")
@ -815,10 +817,8 @@ class Segmenting:
if not os.path.exists(self.model_checkpoint_path):
wget.download(url, out=self.model_checkpoint_path)
def show_mask(self, mask: np.ndarray, image: np.ndarray,
random_color: bool = False, transparency=1) -> np.ndarray:
"""Visualize a mask on top of an image.
Args:
mask (np.ndarray): A 2D array of shape (H, W).
@ -839,7 +839,6 @@ class Segmenting:
image = cv2.addWeighted(image, 0.7, mask_image.astype('uint8'), transparency, 0)
return image
def show_box(self, box, ax, label):
@ -848,7 +847,6 @@ class Segmenting:
ax.add_patch(plt.Rectangle((x0, y0), w, h, edgecolor='green', facecolor=(0, 0, 0, 0), lw=2))
ax.text(x0, y0, label)
def get_mask_with_boxes(self, image_pil, image, boxes_filt):
size = image_pil.size
@ -916,7 +914,6 @@ class Segmenting:
image, p.astype(int), radius=3, color=(255, 0, 0), thickness=-1)
return image
def segment_image_with_click(self, img, is_positive: bool):
self.sam_predictor.set_image(img)
@ -971,7 +968,6 @@ class Segmenting:
multimask_output=False,
)
img = self.show_mask(masks[0], img, random_color=False, transparency=0.3)
img = self.show_points(input_point, input_label, img)
@ -1016,6 +1012,7 @@ class Segmenting:
)
return updated_image_path
class Text2Box:
def __init__(self, device):
print(f"Initializing ObjectDetection to {device}")
@ -1035,6 +1032,7 @@ class Text2Box:
config_url = "https://raw.githubusercontent.com/IDEA-Research/GroundingDINO/main/groundingdino/config/GroundingDINO_SwinT_OGC.py"
if not os.path.exists(self.model_config_path):
wget.download(config_url, out=self.model_config_path)
def load_image(self, image_path):
# load image
image_pil = Image.open(image_path).convert("RGB") # load image
@ -1169,13 +1167,16 @@ class Inpainting:
self.inpaint = StableDiffusionInpaintPipeline.from_pretrained(
"runwayml/stable-diffusion-inpainting", revision=self.revision, torch_dtype=self.torch_dtype, safety_checker=StableDiffusionSafetyChecker.from_pretrained('CompVis/stable-diffusion-safety-checker')).to(device)
def __call__(self, prompt, image, mask_image, height=512, width=512, num_inference_steps=50):
update_image = self.inpaint(prompt=prompt, image=image.resize((width, height)),
mask_image=mask_image.resize((width, height)), height=height, width=width, num_inference_steps=num_inference_steps).images[0]
return update_image
class InfinityOutPainting:
template_model = True # Add this line to show this is a template model.
def __init__(self, ImageCaptioning, Inpainting, VisualQuestionAnswering):
self.llm = OpenAI(temperature=0)
self.ImageCaption = ImageCaptioning
@ -1272,15 +1273,14 @@ class InfinityOutPainting:
return updated_image_path
class ObjectSegmenting:
template_model = True # Add this line to show this is a template model.
def __init__(self, Text2Box: Text2Box, Segmenting: Segmenting):
# self.llm = OpenAI(temperature=0)
self.grounding = Text2Box
self.sam = Segmenting
@prompts(name="Segment the given object",
description="useful when you only want to segment the certain objects in the picture"
"according to the given text"
@ -1341,7 +1341,6 @@ class ObjectSegmenting:
for mask in masks:
image = self.sam.show_mask(mask[0].cpu().numpy(), image, random_color=True, transparency=0.3)
Image.fromarray(merged_mask)
return merged_mask
@ -1349,6 +1348,7 @@ class ObjectSegmenting:
class ImageEditing:
template_model = True
def __init__(self, Text2Box: Text2Box, Segmenting: Segmenting, Inpainting: Inpainting):
print("Initializing ImageEditing")
self.sam = Segmenting
@ -1408,11 +1408,13 @@ class ImageEditing:
f"Output Image: {updated_image_path}")
return updated_image_path
class BackgroundRemoving:
'''
using to remove the background of the given picture
'''
template_model = True
def __init__(self, VisualQuestionAnswering: VisualQuestionAnswering, Text2Box: Text2Box, Segmenting: Segmenting):
self.vqa = VisualQuestionAnswering
self.obj_segmenting = ObjectSegmenting(Text2Box, Segmenting)
@ -1578,10 +1580,7 @@ class MultiModalVisualAgent:
self.memory.clear()
###### usage
from swarms.agents.message import Message
# usage
class MultiModalAgent:
@ -1619,6 +1618,7 @@ class MultiModalAgent:
"""
def __init__(
self,
load_dict,
@ -1641,7 +1641,6 @@ class MultiModalAgent:
self.language = language
self.history = []
def run_text(
self,
text: str = None,
@ -1762,5 +1761,3 @@ class MultiModalAgent:
self.agent.clear_memory()
except Exception as e:
return f"Error cleaning memory: {str(e)}"

@ -34,18 +34,22 @@ max_length = {
"ada": 2049
}
def count_tokens(model_name, text):
return len(encodings[model_name].encode(text))
def get_max_context_length(model_name):
return max_length[model_name]
def get_token_ids_for_task_parsing(model_name):
text = '''{"task": "text-classification", "token-classification", "text2text-generation", "summarization", "translation", "question-answering", "conversational", "text-generation", "sentence-similarity", "tabular-classification", "object-detection", "image-classification", "image-to-image", "image-to-text", "text-to-image", "visual-question-answering", "document-question-answering", "image-segmentation", "text-to-speech", "text-to-video", "automatic-speech-recognition", "audio-to-audio", "audio-classification", "canny-control", "hed-control", "mlsd-control", "normal-control", "openpose-control", "canny-text-to-image", "depth-text-to-image", "hed-text-to-image", "mlsd-text-to-image", "normal-text-to-image", "openpose-text-to-image", "seg-text-to-image", "args", "text", "path", "dep", "id", "<GENERATED>-"}'''
res = encodings[model_name].encode(text)
res = list(set(res))
return res
def get_token_ids_for_choose_model(model_name):
text = '''{"id": "reason"}'''
res = encodings[model_name].encode(text)

@ -56,7 +56,6 @@ from transformers import (
)
# logs
warnings.filterwarnings("ignore")
parser = argparse.ArgumentParser()
@ -295,7 +294,6 @@ def load_pipes(local_deployment):
model.load_state_dict(torch.load(f"{local_fold}/lllyasviel/ControlNet/annotator/ckpts/mlsd_large_512_fp32.pth"), strict=True)
return MLSDdetector(model)
hed_network = Network(f"{local_fold}/lllyasviel/ControlNet/annotator/ckpts/network-bsds500.pth")
controlnet_sd_pipes = {
@ -356,6 +354,7 @@ def load_pipes(local_deployment):
pipes = {**standard_pipes, **other_pipes, **controlnet_sd_pipes}
return pipes
pipes = load_pipes(local_deployment)
end = time.time()
@ -363,10 +362,12 @@ during = end - start
print(f"[ ready ] {during}s")
@app.route('/running', methods=['GET'])
def running():
return jsonify({"running": True})
@app.route('/status/<path:model_id>', methods=['GET'])
def status(model_id):
disabled_models = ["microsoft/trocr-base-printed", "microsoft/trocr-base-handwritten"]
@ -377,6 +378,7 @@ def status(model_id):
print(f"[ check {model_id} ] failed")
return jsonify({"loaded": False})
@app.route('/models/<path:model_id>', methods=['POST'])
def models(model_id):
while "using" in pipes[model_id] and pipes[model_id]["using"]:
@ -392,7 +394,7 @@ def models(model_id):
if "device" in pipes[model_id]:
try:
pipe.to(pipes[model_id]["device"])
except:
except BaseException:
pipe.device = torch.device(pipes[model_id]["device"])
pipe.model.to(pipes[model_id]["device"])
@ -621,7 +623,7 @@ def models(model_id):
try:
pipe.to("cpu")
torch.cuda.empty_cache()
except:
except BaseException:
pipe.device = torch.device("cpu")
pipe.model.to("cpu")
torch.cuda.empty_cache()

@ -57,18 +57,22 @@ max_length = {
"ada": 2049
}
def count_tokens(model_name, text):
return len(encodings[model_name].encode(text))
def get_max_context_length(model_name):
return max_length[model_name]
def get_token_ids_for_task_parsing(model_name):
text = '''{"task": "text-classification", "token-classification", "text2text-generation", "summarization", "translation", "question-answering", "conversational", "text-generation", "sentence-similarity", "tabular-classification", "object-detection", "image-classification", "image-to-image", "image-to-text", "text-to-image", "visual-question-answering", "document-question-answering", "image-segmentation", "text-to-speech", "text-to-video", "automatic-speech-recognition", "audio-to-audio", "audio-classification", "canny-control", "hed-control", "mlsd-control", "normal-control", "openpose-control", "canny-text-to-image", "depth-text-to-image", "hed-text-to-image", "mlsd-text-to-image", "normal-text-to-image", "openpose-text-to-image", "seg-text-to-image", "args", "text", "path", "dep", "id", "<GENERATED>-"}'''
res = encodings[model_name].encode(text)
res = list(set(res))
return res
def get_token_ids_for_choose_model(model_name):
text = '''{"id": "reason"}'''
res = encodings[model_name].encode(text)
@ -76,13 +80,7 @@ def get_token_ids_for_choose_model(model_name):
return res
#########
parser = argparse.ArgumentParser()
parser.add_argument("--config", type=str, default="swarms/agents/workers/multi_modal_workers/omni_agent/config.yml")
parser.add_argument("--mode", type=str, default="cli")
@ -183,7 +181,7 @@ if inference_mode!="huggingface":
r = requests.get(Model_Server + "/running")
if r.status_code != 200:
raise ValueError(message)
except:
except BaseException:
raise ValueError(message)
@ -222,6 +220,7 @@ elif "HUGGINGFACE_ACCESS_TOKEN" in os.environ and os.getenv("HUGGINGFACE_ACCESS_
else:
raise ValueError(f"Incorrect HuggingFace token. Please check your {args.config} file.")
def convert_chat_to_completion(data):
messages = data.pop('messages', [])
tprompt = ""
@ -243,6 +242,7 @@ def convert_chat_to_completion(data):
data['max_tokens'] = data.get('max_tokens', max(get_max_context_length(LLM) - count_tokens(LLM_encoding, final_prompt), 1))
return data
def send_request(data):
api_key = data.pop("api_key")
api_type = data.pop("api_type")
@ -269,6 +269,7 @@ def send_request(data):
else:
return response.json()["choices"][0]["message"]["content"].strip()
def replace_slot(text, entries):
for key, value in entries.items():
if not isinstance(value, str):
@ -276,6 +277,7 @@ def replace_slot(text, entries):
text = text.replace("{{" + key + "}}", value.replace('"', "'").replace('\n', ""))
return text
def find_json(s):
s = s.replace("\'", "\"")
start = s.find("{")
@ -284,21 +286,24 @@ def find_json(s):
res = res.replace("\n", "")
return res
def field_extract(s, field):
try:
field_rep = re.compile(f'{field}.*?:.*?"(.*?)"', re.IGNORECASE)
extracted = field_rep.search(s).group(1).replace("\"", "\'")
except:
except BaseException:
field_rep = re.compile(f'{field}:\ *"(.*?)"', re.IGNORECASE)
extracted = field_rep.search(s).group(1).replace("\"", "\'")
return extracted
def get_id_reason(choose_str):
reason = field_extract(choose_str, "reason")
id = field_extract(choose_str, "id")
choose = {"id": id, "reason": reason}
return id.strip(), reason.strip(), choose
def record_case(success, **args):
if success:
f = open("logs/log_success.jsonl", "a")
@ -308,6 +313,7 @@ def record_case(success, **args):
f.write(json.dumps(log) + "\n")
f.close()
def image_to_bytes(img_url):
img_byte = io.BytesIO()
img_url.split(".")[-1]
@ -315,6 +321,7 @@ def image_to_bytes(img_url):
img_data = img_byte.getvalue()
return img_data
def resource_has_dep(command):
args = command["args"]
for _, v in args.items():
@ -322,6 +329,7 @@ def resource_has_dep(command):
return True
return False
def fix_dep(tasks):
for task in tasks:
args = task["args"]
@ -335,6 +343,7 @@ def fix_dep(tasks):
task["dep"] = [-1]
return tasks
def unfold(tasks):
flag_unfold_task = False
try:
@ -361,6 +370,7 @@ def unfold(tasks):
return tasks
def chitchat(messages, api_key, api_type, api_endpoint):
data = {
"model": LLM,
@ -371,6 +381,7 @@ def chitchat(messages, api_key, api_type, api_endpoint):
}
return send_request(data)
def parse_task(context, input, api_key, api_type, api_endpoint):
demos_or_presteps = parse_task_demos_or_presteps
messages = json.loads(demos_or_presteps)
@ -404,6 +415,7 @@ def parse_task(context, input, api_key, api_type, api_endpoint):
}
return send_request(data)
def choose_model(input, task, metas, api_key, api_type, api_endpoint):
prompt = replace_slot(choose_model_prompt, {
"input": input,
@ -454,6 +466,7 @@ def response_results(input, results, api_key, api_type, api_endpoint):
}
return send_request(data)
def huggingface_model_inference(model_id, data, task):
task_url = f"https://api-inference.huggingface.co/models/{model_id}" # InferenceApi does not yet support some tasks
inference = InferenceApi(repo_id=model_id, token=config["huggingface"]["token"])
@ -586,6 +599,7 @@ def huggingface_model_inference(model_id, data, task):
result = {"generated audio": f"/audios/{name}.{type}"}
return result
def local_model_inference(model_id, data, task):
task_url = f"{Model_Server}/models/{model_id}"
@ -732,6 +746,7 @@ def get_model_status(model_id, url, headers, queue = None):
queue.put((model_id, False, None))
return False
def get_avaliable_models(candidates, topk=5):
all_available_models = {"local": [], "huggingface": []}
threads = []
@ -766,6 +781,7 @@ def get_avaliable_models(candidates, topk=5):
return all_available_models
def collect_result(command, choose, inference_result):
result = {"task": command}
result["inference result"] = inference_result
@ -945,6 +961,7 @@ def run_task(input, command, results, api_key, api_type, api_endpoint):
results[id] = collect_result(command, choose, inference_result)
return True
def chat_huggingface(messages, api_key, api_type, api_endpoint, return_planning=False, return_results=False):
start = time.time()
context = messages[:-1]
@ -1032,6 +1049,7 @@ def chat_huggingface(messages, api_key, api_type, api_endpoint, return_planning
logger.info(f"response: {response}")
return answer
def test():
# single round examples
inputs = [
@ -1055,6 +1073,7 @@ def test():
]
chat_huggingface(messages, API_KEY, API_TYPE, API_ENDPOINT, return_planning=False, return_results=False)
def cli():
messages = []
print("Welcome to Jarvis! A collaborative system that consists of an LLM as the controller and numerous expert models as collaborative executors. Jarvis can plan tasks, schedule Hugging Face models, generate friendly responses based on your requests, and help you with many things. Please enter your request (`exit` to exit).")

@ -10,5 +10,3 @@ class Replicator:
def run(self, task):
pass

@ -30,6 +30,7 @@ class Step:
self.args = args
self.tool = tool
class Plan:
def __init__(
self,
@ -44,9 +45,6 @@ class Plan:
return str(self)
class OmniModalAgent:
"""
OmniModalAgent
@ -72,6 +70,7 @@ class OmniModalAgent:
agent = OmniModalAgent(llm)
response = agent.run("Hello, how are you? Create an image of how your are doing!")
"""
def __init__(
self,
llm: BaseLanguageModel,
@ -105,7 +104,6 @@ class OmniModalAgent:
# self.task_executor = TaskExecutor
self.history = []
def run(
self,
input: str
@ -203,5 +201,3 @@ class OmniModalAgent:
"""
for token in response.split():
yield token

@ -132,12 +132,6 @@ class SalesConversationChain(LLMChain):
return cls(prompt=prompt, llm=llm, verbose=verbose)
# Set up a knowledge base
def setup_knowledge_base(product_catalog: str = None):
"""
@ -186,8 +180,6 @@ def get_tools(product_catalog):
return tools
class CustomPromptTemplateForTools(StringPromptTemplate):
# The template to use
template: str
@ -238,7 +230,7 @@ class SalesConvoOutputParser(AgentOutputParser):
regex = r"Action: (.*?)[\n]*Action Input: (.*)"
match = re.search(regex, text)
if not match:
## TODO - this is not entirely reliable, sometimes results in an error.
# TODO - this is not entirely reliable, sometimes results in an error.
return AgentFinish(
{
"output": "I apologize, I was unable to find the answer to your question. Is there anything else I can help with?"
@ -405,7 +397,7 @@ class ProfitPilot(Chain, BaseModel):
tool_names = [tool.name for tool in tools]
# WARNING: this output parser is NOT reliable yet
## It makes assumptions about output from LLM which can break and throw an error
# It makes assumptions about output from LLM which can break and throw an error
output_parser = SalesConvoOutputParser(ai_prefix=kwargs["salesperson_name"])
sales_agent_with_tools = LLMSingleActionAgent(

@ -17,4 +17,3 @@ class ErrorArtifact(BaseArtifact):
from griptape.schemas import ErrorArtifactSchema
return dict(ErrorArtifactSchema().dump(self))

@ -5,6 +5,7 @@ import json
from typing import Optional
from pydantic import BaseModel, Field, StrictStr
class Artifact(BaseModel):
"""
@ -63,5 +64,3 @@ class Artifact(BaseModel):
)
return _obj

@ -14,6 +14,7 @@ logging.basicConfig(level=logging.INFO, format='%(asctime)s - %(levelname)s - %(
# ---------- Boss Node ----------
class Boss:
"""
The Bose class is responsible for creating and executing tasks using the BabyAGI model.
@ -37,6 +38,7 @@ class Boss:
# Run the Bose to process the objective
boss.run()
"""
def __init__(
self,
objective: str,

@ -28,4 +28,3 @@ class PegasusEmbedding:
except Exception as e:
logging.error(f"Failed to generate embeddings. Error: {e}")
raise

@ -12,6 +12,7 @@ from swarms.swarms.swarms import HierarchicalSwarm
logging.basicConfig(level=logging.DEBUG, format='%(asctime)s - %(levelname)s - %(message)s')
class HiveMind:
def __init__(
self,

@ -10,9 +10,11 @@ from swarms.memory.schemas import Task as APITask
class Step(APIStep):
additional_properties: Optional[Dict[str, str]] = None
class Task(APITask):
steps: List[Step] = []
class NotFoundException(Exception):
"""
Exception raised when a resource is not found.
@ -23,6 +25,7 @@ class NotFoundException(Exception):
self.item_id = item_id
super().__init__(f"{item_name} with {item_id} not found.")
class TaskDB(ABC):
async def create_task(
self,

@ -6,6 +6,7 @@ from typing import Union, List
import oceandb
from oceandb.utils.embedding_function import MultiModalEmbeddingFunction
class OceanDB:
def __init__(self):
try:

@ -1,6 +1,7 @@
import requests
import os
class Anthropic:
"""Anthropic large language models."""

@ -1,5 +1,6 @@
from abc import ABC, abstractmethod
class AbstractModel(ABC):
# abstract base class for language models
def __init__():
@ -12,4 +13,3 @@ class AbstractModel(ABC):
def chat(self, prompt, history):
pass

@ -13,6 +13,7 @@ class Mistral:
result = model.run(task)
print(result)
"""
def __init__(
self,
ai_name: str = "Node Model Agent",
@ -151,4 +152,3 @@ class Mistral:
"""
for token in response.split():
yield token

@ -1,5 +1,6 @@
from transformers import AutoTokenizer, AutoModelForCausalLM
class Petals:
"""Petals Bloom models."""

@ -3,11 +3,13 @@ import re
from abc import abstractmethod
from typing import Dict, NamedTuple
class AgentAction(NamedTuple):
"""Action returned by AgentOutputParser."""
name: str
args: Dict
class BaseAgentOutputParser:
"""Base Output parser for Agent."""
@ -15,6 +17,7 @@ class BaseAgentOutputParser:
def parse(self, text: str) -> AgentAction:
"""Return AgentAction"""
class AgentOutputParser(BaseAgentOutputParser):
"""Output parser for Agent."""

@ -1,6 +1,7 @@
import json
from typing import List
class PromptGenerator:
"""A class for generating custom prompt strings."""
@ -75,4 +76,3 @@ class PromptGenerator:
)
return prompt_string

@ -2,6 +2,7 @@ import time
from typing import Any, List
from swarms.models.prompts.agent_prompt_generator import get_prompt
class TokenUtils:
@staticmethod
def count_tokens(text: str) -> int:

@ -27,6 +27,7 @@ def generate_report_prompt(question, research_summary):
" in depth, with facts and numbers if available, a minimum of 1,200 words and with markdown syntax and apa format. "\
"Write all source urls at the end of the report in apa format"
def generate_search_queries_prompt(question):
""" Generates the search queries prompt for the given question.
Args: question (str): The question to generate the search queries prompt for
@ -69,6 +70,7 @@ def generate_outline_report_prompt(question, research_summary):
' The research report should be detailed, informative, in-depth, and a minimum of 1,200 words.' \
' Use appropriate Markdown syntax to format the outline and ensure readability.'
def generate_concepts_prompt(question, research_summary):
""" Generates the concepts prompt for the given question.
Args: question (str): The question to generate the concepts prompt for
@ -96,6 +98,7 @@ def generate_lesson_prompt(concept):
return prompt
def get_report_by_type(report_type):
report_type_mapping = {
'research_report': generate_report_prompt,

@ -10,6 +10,7 @@ from swarms.utils.serializable import Serializable
if TYPE_CHECKING:
from langchain.prompts.chat import ChatPromptTemplate
def get_buffer_string(
messages: Sequence[BaseMessage], human_prefix: str = "Human", ai_prefix: str = "AI"
) -> str:
@ -95,7 +96,7 @@ class BaseMessageChunk(BaseMessage):
for k, v in right.items():
if k not in merged:
merged[k] = v
elif type(merged[k]) != type(v):
elif not isinstance(merged[k], type(v)):
raise ValueError(
f'additional_kwargs["{k}"] already exists in this message,'
" but with a different type."

@ -11,6 +11,7 @@ class Message:
The base abstract Message class.
Messages are the inputs and outputs of ChatModels.
"""
def __init__(self, content: str, role: str, additional_kwargs: Dict = None):
self.content = content
self.role = role
@ -25,6 +26,7 @@ class HumanMessage(Message):
"""
A Message from a human.
"""
def __init__(self, content: str, role: str = "Human", additional_kwargs: Dict = None, example: bool = False):
super().__init__(content, role, additional_kwargs)
self.example = example
@ -37,6 +39,7 @@ class AIMessage(Message):
"""
A Message from an AI.
"""
def __init__(self, content: str, role: str = "AI", additional_kwargs: Dict = None, example: bool = False):
super().__init__(content, role, additional_kwargs)
self.example = example
@ -50,6 +53,7 @@ class SystemMessage(Message):
A Message for priming AI behavior, usually passed in as the first of a sequence
of input messages.
"""
def __init__(self, content: str, role: str = "System", additional_kwargs: Dict = None):
super().__init__(content, role, additional_kwargs)
@ -61,6 +65,7 @@ class FunctionMessage(Message):
"""
A Message for passing the result of executing a function back to a model.
"""
def __init__(self, content: str, role: str = "Function", name: str, additional_kwargs: Dict = None):
super().__init__(content, role, additional_kwargs)
self.name = name
@ -73,6 +78,7 @@ class ChatMessage(Message):
"""
A Message that can be assigned an arbitrary speaker (i.e. role).
"""
def __init__(self, content: str, role: str, additional_kwargs: Dict = None):
super().__init__(content, role, additional_kwargs)

@ -21,6 +21,7 @@ def character(character_name, topic, word_limit):
"""
return prompt
def debate_monitor(game_description, word_limit, character_names):
prompt = f"""

@ -1,6 +1,5 @@
SALES_ASSISTANT_PROMPT = """You are a sales assistant helping your sales agent to determine which stage of a sales conversation should the agent move to, or stay at.
Following '===' is the conversation history.
Use this conversation history to make your decision.
@ -55,4 +54,3 @@ conversation_stages = {'1' : "Introduction: Start the conversation by introducin
'5': "Solution presentation: Based on the prospect's needs, present your product/service as the solution that can address their pain points.",
'6': "Objection handling: Address any objections that the prospect may have regarding your product/service. Be prepared to provide evidence or testimonials to support your claims.",
'7': "Close: Ask for the sale by proposing a next step. This could be a demo, a trial or a meeting with decision-makers. Ensure to summarize what has been discussed and reiterate the benefits."}

@ -9,7 +9,6 @@ conversation_stages = {
}
SALES_AGENT_TOOLS_PROMPT = """
Never forget your name is {salesperson_name}. You work as a {salesperson_role}.
You work at company named {company_name}. {company_name}'s business is the following: {company_business}.

@ -2,6 +2,7 @@ from typing import List, Dict, Any, Union
from concurrent.futures import Executor, ThreadPoolExecutor, as_completed
from graphlib import TopologicalSorter
class Task:
def __init__(
self,
@ -46,6 +47,7 @@ class NonLinearWorkflow:
"""
def __init__(
self,
agents,
@ -104,4 +106,3 @@ class NonLinearWorkflow:
return [
self.find_task(task_id) for task_id in task_order
]

@ -4,7 +4,6 @@ from concurrent.futures import ThreadPoolExecutor
from typing import Any, Dict, List, Optional
class Workflow:
"""
Workflows are ideal for prescriptive processes that need to be executed
@ -94,4 +93,3 @@ class Workflow:
return
else:
self.__run_from_task(next(iter(task.children), None))

@ -5,6 +5,7 @@ from time import sleep
from swarms.utils.decorators import error_decorator, log_decorator, timing_decorator
from swarms.workers.worker import Worker
class AutoScaler:
"""
The AutoScaler is like a kubernetes pod, that autoscales an agent or worker or boss!
@ -91,4 +92,3 @@ class AutoScaler:
if self.agents_pool:
agent_to_remove = self.agents_poo.pop()
del agent_to_remove

@ -1,5 +1,6 @@
from abc import ABC, abstractmethod
class AbstractSwarm(ABC):
# TODO: Pass in abstract LLM class that can utilize Hf or Anthropic models, Move away from OPENAI
# TODO: ADD Universal Communication Layer, a ocean vectorstore instance
@ -19,5 +20,3 @@ class AbstractSwarm(ABC):
@abstractmethod
def run(self):
pass

@ -1,6 +1,7 @@
from typing import List
from swarms.workers.worker import Worker
class DialogueSimulator:
def __init__(self, agents: List[Worker]):
self.agents = agents

@ -29,6 +29,7 @@ class GodMode:
"""
def __init__(
self,
llms

@ -72,7 +72,6 @@ class GroupChat:
)
class GroupChatManager(Worker):
def __init__(
self,

@ -3,14 +3,18 @@ import tenacity
from langchain.output_parsers import RegexParser
# utils
class BidOutputParser(RegexParser):
def get_format_instructions(self) -> str:
return "Your response should be an integrater delimited by angled brackets like this: <int>"
bid_parser = BidOutputParser(
regex=r"<(\d+)>", output_keys=["bid"], default_output_key="bid"
)
def select_next_speaker(
step: int,
agents,

@ -7,6 +7,7 @@ def select_speaker(step: int, agents: List[Worker]) -> int:
# This function selects the speaker in a round-robin fashion
return step % len(agents)
class MultiAgentDebate:
"""
MultiAgentDebate
@ -15,6 +16,7 @@ class MultiAgentDebate:
"""
def __init__(
self,
agents: List[Worker],

@ -15,6 +15,7 @@ class TaskStatus(Enum):
COMPLETED = 3
FAILED = 4
class Orchestrator:
"""
The Orchestrator takes in an agent, worker, or boss as input
@ -88,6 +89,7 @@ class Orchestrator:
print(orchestrator.retrieve_result(id(task)))
```
"""
def __init__(
self,
agent,
@ -121,8 +123,8 @@ class Orchestrator:
self.embed_func = embed_func if embed_func else self.embed
# @abstractmethod
def assign_task(
self,
agent_id: int,
@ -170,8 +172,8 @@ class Orchestrator:
embedding = openai(input)
return embedding
# @abstractmethod
def retrieve_results(self, agent_id: int) -> Any:
"""Retrieve results from a specific agent"""
@ -202,8 +204,8 @@ class Orchestrator:
logging.error(f"Failed to update the vector database. Error: {e}")
raise
# @abstractmethod
def get_vector_db(self):
"""Retrieve the vector database"""
return self.collection
@ -291,9 +293,6 @@ class Orchestrator:
objective=f"chat with agent {receiver_id} about {message}"
)
def add_agents(
self,
num_agents: int
@ -311,4 +310,3 @@ class Orchestrator:
self.executor = ThreadPoolExecutor(
max_workers=self.agents.qsize()
)

@ -13,6 +13,7 @@ class TaskStatus(Enum):
COMPLETED = 3
FAILED = 4
class ScalableGroupChat:
"""
This is a class to enable scalable groupchat like a telegram, it takes an Worker as an input
@ -26,6 +27,7 @@ class ScalableGroupChat:
-> every worker can communicate without restrictions in parallel
"""
def __init__(
self,
worker_count: int = 5,
@ -61,7 +63,6 @@ class ScalableGroupChat:
return embedding
def retrieve_results(
self,
agent_id: int
@ -95,13 +96,12 @@ class ScalableGroupChat:
logging.error(f"Failed to update the vector database. Error: {e}")
raise
# @abstractmethod
def get_vector_db(self):
"""Retrieve the vector database"""
return self.collection
def append_to_db(
self,
result: str
@ -118,8 +118,6 @@ class ScalableGroupChat:
logging.error(f"Failed to append the agent output to database. Error: {e}")
raise
def chat(
self,
sender_id: int,
@ -158,5 +156,3 @@ class ScalableGroupChat:
self.run(
objective=f"chat with agent {receiver_id} about {message}"
)

@ -1,6 +1,7 @@
from swarms.workers.worker import Worker
from queue import Queue, PriorityQueue
class SimpleSwarm:
def __init__(
self,
@ -79,7 +80,6 @@ class SimpleSwarm:
return responses
def run_old(self, task):
responses = []

@ -1,3 +1,17 @@
import interpreter
from transformers import (
BlipForQuestionAnswering,
BlipProcessor,
)
from PIL import Image
import torch
from swarms.utils.logger import logger
from pydantic import Field
from langchain.tools.file_management.write import WriteFileTool
from langchain.tools.file_management.read import ReadFileTool
from langchain.tools import BaseTool
from langchain.text_splitter import RecursiveCharacterTextSplitter
from langchain.chains.qa_with_sources.loading import BaseCombineDocumentsChain
import asyncio
import os
@ -13,16 +27,6 @@ from langchain.docstore.document import Document
ROOT_DIR = "./data/"
from langchain.chains.qa_with_sources.loading import BaseCombineDocumentsChain
from langchain.text_splitter import RecursiveCharacterTextSplitter
from langchain.tools import BaseTool
from langchain.tools.file_management.read import ReadFileTool
from langchain.tools.file_management.write import WriteFileTool
from pydantic import Field
from swarms.utils.logger import logger
@contextmanager
def pushd(new_dir):
@ -34,6 +38,7 @@ def pushd(new_dir):
finally:
os.chdir(prev_dir)
@tool
def process_csv(
llm, csv_file_path: str, instructions: str, output_path: Optional[str] = None
@ -84,10 +89,12 @@ async def async_load_playwright(url: str) -> str:
await browser.close()
return results
def run_async(coro):
event_loop = asyncio.get_event_loop()
return event_loop.run_until_complete(coro)
@tool
def browse_web_page(url: str) -> str:
"""Verbose way to scrape a whole webpage. Likely to cause issues parsing."""
@ -126,8 +133,6 @@ class WebpageQATool(BaseTool):
async def _arun(self, url: str, question: str) -> str:
raise NotImplementedError
import interpreter
@tool
def compile(task: str):
@ -153,16 +158,7 @@ def compile(task: str):
os.environ["INTERPRETER_CLI_DEBUG"] = True
# mm model workers
import torch
from PIL import Image
from transformers import (
BlipForQuestionAnswering,
BlipProcessor,
)
@tool
@ -195,5 +191,3 @@ def VQAinference(self, inputs):
)
return answer

@ -10,6 +10,7 @@ from langchain.llms.base import BaseLLM
from langchain.agents.agent import AgentExecutor
from langchain.agents import load_tools
class ToolScope(Enum):
GLOBAL = "global"
SESSION = "session"

@ -3,6 +3,7 @@ from swarms.tools.base import Tool, ToolException
from typing import Any, List
from codeinterpreterapi import CodeInterpreterSession, File, ToolException
class CodeInterpreter(Tool):
def __init__(self, name: str, description: str):
super().__init__(name, description, self.run)
@ -51,6 +52,7 @@ class CodeInterpreter(Tool):
# terminate the session
await session.astop()
"""
tool = CodeInterpreter("Code Interpreter", "A tool to interpret code and generate useful outputs.")

@ -42,7 +42,6 @@ def verify(func):
return wrapper
class SyscallTimeoutException(Exception):
def __init__(self, pid: int, *args) -> None:
super().__init__(f"deadline exceeded while waiting syscall for {pid}", *args)
@ -132,8 +131,6 @@ class SyscallTracer:
return exitcode, reason
class StdoutTracer:
def __init__(
self,
@ -196,7 +193,6 @@ class StdoutTracer:
return (exitcode, output)
class Terminal(BaseToolSet):
def __init__(self):
self.sessions: Dict[str, List[SyscallTracer]] = {}
@ -242,7 +238,6 @@ class Terminal(BaseToolSet):
#############
@tool(
name="Terminal",
description="Executes commands in a terminal."
@ -281,8 +276,6 @@ def terminal_execute(self, commands: str, get_session: SessionGetter) -> str:
return output
"""
write protocol:
@ -291,7 +284,6 @@ write protocol:
"""
class WriteCommand:
separator = "\n"
@ -329,15 +321,13 @@ class CodeWriter:
return WriteCommand.from_str(command).with_mode("a").execute()
"""
read protocol:
<filepath>|<start line>-<end line>
"""
class Line:
def __init__(self, content: str, line_number: int, depth: int):
self.__content: str = content
@ -500,10 +490,6 @@ class CodeReader:
return SummaryCommand.from_str(command).execute()
"""
patch protocol:
@ -563,7 +549,6 @@ test.py|11,16|11,16|_titles
"""
class Position:
separator = ","
@ -664,11 +649,6 @@ class CodePatcher:
return written, deleted
class CodeEditor(BaseToolSet):
@tool(
name="CodeEditor.READ",
@ -825,6 +805,7 @@ def code_editor_read(self, inputs: str) -> str:
)
return output
@tool(
name="CodeEditor.SUMMARY",
description="Summary code. "
@ -845,6 +826,7 @@ def code_editor_summary(self, inputs: str) -> str:
)
return output
@tool(
name="CodeEditor.APPEND",
description="Append code to the existing file. "
@ -867,6 +849,7 @@ def code_editor_append(self, inputs: str) -> str:
)
return output
@tool(
name="CodeEditor.WRITE",
description="Write code to create a new tool. "
@ -890,6 +873,7 @@ def code_editor_write(self, inputs: str) -> str:
)
return output
@tool(
name="CodeEditor.PATCH",
description="Patch the code to correct the error if an error occurs or to improve it. "
@ -920,6 +904,7 @@ def code_editor_patch(self, patches: str) -> str:
)
return output
@tool(
name="CodeEditor.DELETE",
description="Delete code in file for a new start. "

@ -20,6 +20,3 @@ class ExitConversation(BaseToolSet):
logger.debug("\nProcessed ExitConversation.")
return message

@ -223,7 +223,6 @@ class VisualQuestionAnswering(BaseToolSet):
return answer
class ImageCaptioning(BaseHandler):
def __init__(self, device):
print("Initializing ImageCaptioning to %s" % device)
@ -256,8 +255,3 @@ class ImageCaptioning(BaseHandler):
)
return IMAGE_PROMPT.format(filename=filename, description=description)

@ -35,4 +35,3 @@ class RequestsGet(BaseToolSet):
)
return content

@ -38,7 +38,6 @@ class SpeechToText:
subprocess.run(["pip", "install", "pytube"])
subprocess.run(["pip", "install", "pydub"])
def download_youtube_video(self):
audio_file = f'video.{self.audio_format}'
@ -121,5 +120,3 @@ class SpeechToText:
return transcription
except KeyError:
print("The key 'segments' is not found in the result.")

@ -13,6 +13,7 @@ def log_decorator(func):
return result
return wrapper
def error_decorator(func):
def wrapper(*args, **kwargs):
try:
@ -22,6 +23,7 @@ def error_decorator(func):
raise
return wrapper
def timing_decorator(func):
def wrapper(*args, **kwargs):
start_time = time.time()
@ -31,6 +33,7 @@ def timing_decorator(func):
return result
return wrapper
def retry_decorator(max_retries=5):
def decorator(func):
@functools.wraps(func)
@ -44,16 +47,20 @@ def retry_decorator(max_retries=5):
return wrapper
return decorator
def singleton_decorator(cls):
instances = {}
def wrapper(*args, **kwargs):
if cls not in instances:
instances[cls] = cls(*args, **kwargs)
return instances[cls]
return wrapper
def synchronized_decorator(func):
func.__lock__ = threading.Lock()
def wrapper(*args, **kwargs):
with func.__lock__:
return func(*args, **kwargs)
@ -67,6 +74,7 @@ def deprecated_decorator(func):
return func(*args, **kwargs)
return wrapper
def validate_inputs_decorator(validator):
def decorator(func):
@functools.wraps(func)
@ -76,4 +84,3 @@ def validate_inputs_decorator(validator):
return func(*args, **kwargs)
return wrapper
return decorator

@ -1,3 +1,12 @@
import pandas as pd
from swarms.models.prompts.prebuild.multi_modal_prompts import DATAFRAME_PROMPT
import requests
from typing import Dict
from enum import Enum
from pathlib import Path
import shutil
import boto3
from abc import ABC, abstractmethod, abstractstaticmethod
import os
import random
import uuid
@ -13,7 +22,7 @@ def seed_everything(seed):
torch.manual_seed(seed)
torch.cuda.manual_seed_all(seed)
except:
except BaseException:
pass
return seed
@ -75,16 +84,10 @@ def get_new_dataframe_name(org_img_name, func_name="update"):
this_new_uuid, func_name, recent_prev_file_name, most_org_file_name
)
return os.path.join(head, new_file_name)
#########=======================> utils end
# =======================> utils end
#########=======================> ANSI BEGINNING
# =======================> ANSI BEGINNING
class Code:
@ -205,9 +208,6 @@ def dim_multiline(message: str) -> str:
# ================================> upload base
from abc import ABC, abstractmethod, abstractstaticmethod
STATIC_DIR = "static"
@ -227,9 +227,6 @@ class AbstractUploader(ABC):
# ========================= upload s3
import boto3
class S3Uploader(AbstractUploader):
def __init__(self, accessKey: str, secretKey: str, region: str, bucket: str):
self.accessKey = accessKey
@ -261,9 +258,8 @@ class S3Uploader(AbstractUploader):
# ========================= upload s3
# ========================> upload/static
import shutil
from pathlib import Path
class StaticUploader(AbstractUploader):
@ -277,8 +273,6 @@ class StaticUploader(AbstractUploader):
server = os.environ.get("SERVER", "http://localhost:8000")
return StaticUploader(server, path, endpoint)
def get_url(self, uploaded_path: str) -> str:
return f"{self.server}/{uploaded_path}"
@ -291,14 +285,8 @@ class StaticUploader(AbstractUploader):
return f"{self.server}/{endpoint_path}"
# ========================> handlers/base
import uuid
from enum import Enum
from typing import Dict
import requests
# from env import settings
@ -391,18 +379,12 @@ class FileHandler:
return handler.handle(local_filename)
except Exception as e:
raise e
########################### => base end
# => base end
# ===========================>
#############===========================>
from swarms.models.prompts.prebuild.multi_modal_prompts import DATAFRAME_PROMPT
import pandas as pd
class CsvToDataframe(BaseHandler):
def handle(self, filename: str):
df = pd.read_csv(filename)
@ -417,7 +399,3 @@ class CsvToDataframe(BaseHandler):
)
return DATAFRAME_PROMPT.format(filename=filename, description=description)

@ -6,6 +6,7 @@ from pathlib import Path
from swarms.utils.main import AbstractUploader
class StaticUploader(AbstractUploader):
def __init__(self, server: str, path: Path, endpoint: str):
self.server = server

@ -21,6 +21,8 @@ from swarms.utils.decorators import error_decorator, log_decorator, timing_decor
ROOT_DIR = "./data/"
# main
class Worker:
"""
Useful for when you need to spawn an autonomous agent instance as a worker to accomplish complex tasks,
@ -54,6 +56,7 @@ class Worker:
llm + tools + memory
"""
def __init__(
self,
ai_name: str = "Autobot Swarm Worker",
@ -139,7 +142,6 @@ class Worker:
if external_tools is not None:
self.tools.extend(external_tools)
def setup_memory(self):
"""
Set up memory for the worker.
@ -158,7 +160,6 @@ class Worker:
except Exception as error:
raise RuntimeError(f"Error setting up memory perhaps try try tuning the embedding size: {error}")
def setup_agent(self):
"""
Set up the autonomous agent.
@ -311,4 +312,3 @@ class Worker:
return {"content": message}
else:
return message
Loading…
Cancel
Save