code quality

Former-commit-id: 42ce6cf18c
discord-bot-framework
Kye 1 year ago
parent 069b2aed45
commit 9c0c6c06cc

@ -32,7 +32,6 @@ model = whisper.load_model("base")
def transcribe(audio): def transcribe(audio):
# load audio and pad/trim it to fit 30 seconds # load audio and pad/trim it to fit 30 seconds
audio = whisper.load_audio(audio) audio = whisper.load_audio(audio)
audio = whisper.pad_or_trim(audio) audio = whisper.pad_or_trim(audio)
@ -58,13 +57,16 @@ async def on_message(message):
response = [] response = []
for chunk in interpreter.chat(message.content, display=False, stream=False): for chunk in interpreter.chat(message.content, display=False, stream=False):
# await message.channel.send(chunk) # await message.channel.send(chunk)
if 'message' in chunk: if "message" in chunk:
response.append(chunk['message']) response.append(chunk["message"])
last_response = response[-1] last_response = response[-1]
max_message_length = 2000 # Discord's max message length is 2000 characters max_message_length = 2000 # Discord's max message length is 2000 characters
# Splitting the message into chunks of 2000 characters # Splitting the message into chunks of 2000 characters
response_chunks = [last_response[i:i + max_message_length] for i in range(0, len(last_response), max_message_length)] response_chunks = [
last_response[i : i + max_message_length]
for i in range(0, len(last_response), max_message_length)
]
# Sending each chunk as a separate message # Sending each chunk as a separate message
for chunk in response_chunks: for chunk in response_chunks:
await message.channel.send(chunk) await message.channel.send(chunk)
@ -74,9 +76,9 @@ async def on_message(message):
async def join(ctx): async def join(ctx):
if ctx.author.voice: if ctx.author.voice:
channel = ctx.message.author.voice.channel channel = ctx.message.author.voice.channel
print('joining..') print("joining..")
await channel.connect() await channel.connect()
print('joined.') print("joined.")
else: else:
print("not in a voice channel!") print("not in a voice channel!")
@ -92,32 +94,32 @@ async def leave(ctx):
@client.command() @client.command()
async def listen(ctx): async def listen(ctx):
if ctx.voice_client: if ctx.voice_client:
print('trying to listen..') print("trying to listen..")
ctx.voice_client.start_recording(discord.sinks.WaveSink(), callback, ctx) ctx.voice_client.start_recording(discord.sinks.WaveSink(), callback, ctx)
print('listening..') print("listening..")
else: else:
print("not in a voice channel!") print("not in a voice channel!")
async def callback(sink: discord.sinks, ctx): async def callback(sink: discord.sinks, ctx):
print('in callback..') print("in callback..")
for user_id, audio in sink.audio_data.items(): for user_id, audio in sink.audio_data.items():
if user_id == ctx.author.id: if user_id == ctx.author.id:
print('saving audio..') print("saving audio..")
audio: discord.sinks.core.AudioData = audio audio: discord.sinks.core.AudioData = audio
print(user_id) print(user_id)
filename = "audio.wav" filename = "audio.wav"
with open(filename, "wb") as f: with open(filename, "wb") as f:
f.write(audio.file.getvalue()) f.write(audio.file.getvalue())
print('audio saved.') print("audio saved.")
transcription = transcribe(filename) transcription = transcribe(filename)
print(transcription) print(transcription)
response = [] response = []
for chunk in interpreter.chat(transcription, display=False, stream=True): for chunk in interpreter.chat(transcription, display=False, stream=True):
# await message.channel.send(chunk) # await message.channel.send(chunk)
if 'message' in chunk: if "message" in chunk:
response.append(chunk['message']) response.append(chunk["message"])
await ctx.message.channel.send(' '.join(response)) await ctx.message.channel.send(" ".join(response))
@client.command() @client.command()
@ -129,4 +131,5 @@ async def stop(ctx):
async def on_ready(): async def on_ready():
print(f"We have logged in as {client.user}") print(f"We have logged in as {client.user}")
client.run(bot_token) client.run(bot_token)

@ -34,15 +34,13 @@ def get_audio_length(audio_bytes):
def speak(text): def speak(text):
speaking = True speaking = True
audio = generate( audio = generate(text=text, voice="Daniel")
text=text,
voice="Daniel"
)
play(audio, notebook=True) play(audio, notebook=True)
audio_length = get_audio_length(audio) audio_length = get_audio_length(audio)
time.sleep(audio_length) time.sleep(audio_length)
# @title Text-only JARVIS # @title Text-only JARVIS
# @markdown Run this cell for a ChatGPT-like interface. # @markdown Run this cell for a ChatGPT-like interface.
@ -55,13 +53,11 @@ with gr.Blocks() as demo:
return "", history + [[user_message, None]] return "", history + [[user_message, None]]
def bot(history): def bot(history):
user_message = history[-1][0] user_message = history[-1][0]
history[-1][1] = "" history[-1][1] = ""
active_block_type = "" active_block_type = ""
for chunk in interpreter.chat(user_message, stream=True, display=False): for chunk in interpreter.chat(user_message, stream=True, display=False):
# Message # Message
if "message" in chunk: if "message" in chunk:
if active_block_type != "message": if active_block_type != "message":
@ -96,6 +92,6 @@ with gr.Blocks() as demo:
bot, chatbot, chatbot bot, chatbot, chatbot
) )
if __name__ == '__main__': if __name__ == "__main__":
demo.queue() demo.queue()
demo.launch(debug=True) demo.launch(debug=True)

@ -5,6 +5,7 @@ from swarms.agents.stream_response import stream
from swarms.agents.base import AbstractAgent from swarms.agents.base import AbstractAgent
from swarms.agents.registry import Registry from swarms.agents.registry import Registry
from swarms.agents.idea_to_image_agent import Idea2Image from swarms.agents.idea_to_image_agent import Idea2Image
"""Agent Infrastructure, models, memory, utils, tools""" """Agent Infrastructure, models, memory, utils, tools"""
"""Agent Infrastructure, models, memory, utils, tools""" """Agent Infrastructure, models, memory, utils, tools"""

@ -28,14 +28,22 @@ class BingChat:
self.cookies = json.loads(open(cookies_path, encoding="utf-8").read()) self.cookies = json.loads(open(cookies_path, encoding="utf-8").read())
self.bot = asyncio.run(Chatbot.create(cookies=self.cookies)) self.bot = asyncio.run(Chatbot.create(cookies=self.cookies))
def __call__(self, prompt: str, style: ConversationStyle = ConversationStyle.creative) -> str: def __call__(
self, prompt: str, style: ConversationStyle = ConversationStyle.creative
) -> str:
""" """
Get a text response using the EdgeGPT model based on the provided prompt. Get a text response using the EdgeGPT model based on the provided prompt.
""" """
response = asyncio.run(self.bot.ask(prompt=prompt, conversation_style=style, simplify_response=True)) response = asyncio.run(
return response['text'] self.bot.ask(
prompt=prompt, conversation_style=style, simplify_response=True
)
)
return response["text"]
def create_img(self, prompt: str, output_dir: str = "./output", auth_cookie: str = None) -> str: def create_img(
self, prompt: str, output_dir: str = "./output", auth_cookie: str = None
) -> str:
""" """
Generate an image based on the provided prompt and save it in the given output directory. Generate an image based on the provided prompt and save it in the given output directory.
Returns the path of the generated image. Returns the path of the generated image.
@ -47,7 +55,7 @@ class BingChat:
images = image_generator.get_images(prompt) images = image_generator.get_images(prompt)
image_generator.save_images(images, output_dir=output_dir) image_generator.save_images(images, output_dir=output_dir)
return Path(output_dir) / images[0]['path'] return Path(output_dir) / images[0]["path"]
@staticmethod @staticmethod
def set_cookie_dir_path(path: str): def set_cookie_dir_path(path: str):

@ -35,8 +35,6 @@ class Vilt:
Args: Args:
text: str
""" """
# Download the image # Download the image

@ -851,5 +851,3 @@ def tool(
return _partial return _partial
else: else:
raise ValueError("Too many arguments for tool decorator") raise ValueError("Too many arguments for tool decorator")

@ -1,68 +0,0 @@
import pytest
from unittest.mock import Mock
from swarms.swarms.orchestrate import Orchestrator
@pytest.fixture
def mock_agent():
return Mock()
@pytest.fixture
def mock_task():
return {"task_id": 1, "task_data": "data"}
@pytest.fixture
def mock_vector_db():
return Mock()
@pytest.fixture
def orchestrator(mock_agent, mock_vector_db):
agent_list = [mock_agent for _ in range(5)]
task_queue = []
return Orchestrator(mock_agent, agent_list, task_queue, mock_vector_db)
def test_assign_task(orchestrator, mock_agent, mock_task, mock_vector_db):
orchestrator.task_queue.append(mock_task)
orchestrator.assign_task(0, mock_task)
mock_agent.process_task.assert_called_once()
mock_vector_db.add_documents.assert_called_once()
def test_retrieve_results(orchestrator, mock_vector_db):
mock_vector_db.query.return_value = "expected_result"
assert orchestrator.retrieve_results(0) == "expected_result"
def test_update_vector_db(orchestrator, mock_vector_db):
data = {"vector": [0.1, 0.2, 0.3], "task_id": 1}
orchestrator.update_vector_db(data)
mock_vector_db.add_documents.assert_called_once_with(
[data["vector"]], [str(data["task_id"])]
)
def test_get_vector_db(orchestrator, mock_vector_db):
assert orchestrator.get_vector_db() == mock_vector_db
def test_append_to_db(orchestrator, mock_vector_db):
collection = "test_collection"
result = "test_result"
orchestrator.append_to_db(collection, result)
mock_vector_db.append_document.assert_called_once_with(
collection, result, id=str(id(result))
)
def test_run(orchestrator, mock_agent, mock_vector_db):
objective = "test_objective"
collection = "test_collection"
orchestrator.run(objective, collection)
mock_agent.process_task.assert_called()
mock_vector_db.append_document.assert_called()

@ -1,71 +1,68 @@
import numpy as np import pytest
from swarms.swarms.orchestrate import Orchestrator, Worker from unittest.mock import Mock
import chromadb from swarms.swarms.orchestrate import Orchestrator
def test_orchestrator_initialization(): @pytest.fixture
orchestrator = Orchestrator(agent=Worker, agent_list=[Worker] * 5, task_queue=[]) def mock_agent():
assert isinstance(orchestrator, Orchestrator) return Mock()
assert orchestrator.agents.qsize() == 5
assert orchestrator.task_queue.qsize() == 0
def test_orchestrator_assign_task(): @pytest.fixture
orchestrator = Orchestrator(agent=Worker, agent_list=[Worker] * 5, task_queue=[]) def mock_task():
orchestrator.assign_task(1, {"content": "task1"}) return {"task_id": 1, "task_data": "data"}
assert orchestrator.task_queue.qsize() == 1
def test_orchestrator_embed(): @pytest.fixture
orchestrator = Orchestrator(agent=Worker, agent_list=[Worker] * 5, task_queue=[]) def mock_vector_db():
result = orchestrator.embed("Hello, world!", "api_key", "model_name") return Mock()
assert isinstance(result, np.ndarray)
def test_orchestrator_retrieve_results(): @pytest.fixture
orchestrator = Orchestrator(agent=Worker, agent_list=[Worker] * 5, task_queue=[]) def orchestrator(mock_agent, mock_vector_db):
result = orchestrator.retrieve_results(1) agent_list = [mock_agent for _ in range(5)]
assert isinstance(result, list) task_queue = []
return Orchestrator(mock_agent, agent_list, task_queue, mock_vector_db)
def test_orchestrator_update_vector_db(): def test_assign_task(orchestrator, mock_agent, mock_task, mock_vector_db):
orchestrator = Orchestrator(agent=Worker, agent_list=[Worker] * 5, task_queue=[]) orchestrator.task_queue.append(mock_task)
data = {"vector": np.array([1, 2, 3]), "task_id": 1} orchestrator.assign_task(0, mock_task)
orchestrator.update_vector_db(data)
assert orchestrator.collection.count() == 1
mock_agent.process_task.assert_called_once()
mock_vector_db.add_documents.assert_called_once()
def test_orchestrator_get_vector_db():
orchestrator = Orchestrator(agent=Worker, agent_list=[Worker] * 5, task_queue=[])
result = orchestrator.get_vector_db()
assert isinstance(result, chromadb.Collection)
def test_retrieve_results(orchestrator, mock_vector_db):
mock_vector_db.query.return_value = "expected_result"
assert orchestrator.retrieve_results(0) == "expected_result"
def test_orchestrator_append_to_db():
orchestrator = Orchestrator(agent=Worker, agent_list=[Worker] * 5, task_queue=[])
orchestrator.append_to_db("Hello, world!")
assert orchestrator.collection.count() == 1
def test_update_vector_db(orchestrator, mock_vector_db):
data = {"vector": [0.1, 0.2, 0.3], "task_id": 1}
orchestrator.update_vector_db(data)
mock_vector_db.add_documents.assert_called_once_with(
[data["vector"]], [str(data["task_id"])]
)
def test_orchestrator_run():
orchestrator = Orchestrator(agent=Worker, agent_list=[Worker] * 5, task_queue=[])
result = orchestrator.run("Write a short story.")
assert isinstance(result, list)
def test_get_vector_db(orchestrator, mock_vector_db):
assert orchestrator.get_vector_db() == mock_vector_db
def test_orchestrator_chat():
orchestrator = Orchestrator(agent=Worker, agent_list=[Worker] * 5, task_queue=[])
orchestrator.chat(1, 2, "Hello, Agent 2!")
assert orchestrator.collection.count() == 1
def test_append_to_db(orchestrator, mock_vector_db):
collection = "test_collection"
result = "test_result"
orchestrator.append_to_db(collection, result)
mock_vector_db.append_document.assert_called_once_with(
collection, result, id=str(id(result))
)
def test_orchestrator_add_agents():
orchestrator = Orchestrator(agent=Worker, agent_list=[Worker] * 5, task_queue=[])
orchestrator.add_agents(5)
assert orchestrator.agents.qsize() == 10
def test_run(orchestrator, mock_agent, mock_vector_db):
objective = "test_objective"
collection = "test_collection"
orchestrator.run(objective, collection)
def test_orchestrator_remove_agents(): mock_agent.process_task.assert_called()
orchestrator = Orchestrator(agent=Worker, agent_list=[Worker] * 5, task_queue=[]) mock_vector_db.append_document.assert_called()
orchestrator.remove_agents(3)
assert orchestrator.agents.qsize() == 2

Loading…
Cancel
Save