diff --git a/administration_commands.py b/administration_commands.py index c480e37..e93a323 100644 --- a/administration_commands.py +++ b/administration_commands.py @@ -11,7 +11,15 @@ import numpy as np from discord.ext import commands, tasks from ai_functions import get_random_cyclic_message -from constants import ENCODING, LOGFILE, LOGSTORE, MEMORY_FIVE_MUZYKA, MEMORY_FIVE_SIARA, LAST_SPONTANEOUS_CALL, TIME_BETWEEN_CALLS +from constants import ( + ENCODING, + LAST_SPONTANEOUS_CALL, + LOGFILE, + LOGSTORE, + MEMORY_FIVE_MUZYKA, + MEMORY_FIVE_SIARA, + TIME_BETWEEN_CALLS, +) class AdministrationModule(commands.Cog): @@ -19,6 +27,25 @@ class AdministrationModule(commands.Cog): self.bot = bot self.logger = logging.getLogger(logger_name) + @commands.hybrid_command( + name="galeria_slaw", + description="Jeśli nie wiesz jak użyć tej komendy to nawet nie próbuj", + guild=discord.Object(id=664789470779932693), + ) + async def galeria_slaw(self, ctx): + if isinstance(ctx.channel, discord.DMChannel): + for guild in self.bot.guilds: + async for entry in guild.bans(limit=1500): + fnord = discord.File( + "/home/pi/Conjurer/niech_spierdala.png", + spoiler=False, + description="Niech spierdala", + ) + await ctx.reply( + f"User: {entry.user} wyjebany z serwera {guild.name} za {entry.reason} ", + file=fnord, + ) + @commands.hybrid_command( name="update_banlist", description="Jeśli nie wiesz jak użyć tej komendy to nawet nie próbuj", @@ -92,6 +119,7 @@ class AdministrationModule(commands.Cog): reason="Automatyczna lista banów", delete_message_seconds=0, ) + # TODO: Maybe use guild.bulk_ban ? cunter_counter += 1 except discord.NotFound: self.logger.info( diff --git a/ai_commands.py b/ai_commands.py index ab1dae8..6ae44c8 100644 --- a/ai_commands.py +++ b/ai_commands.py @@ -11,15 +11,16 @@ from discord.ext import commands import ai_functions from constants import ( + ASSISTANTS, DATA, GRAPHICS_PATH, INITIAL_TIME_WAIT, MASTER_TIMEOUT, OPENAICLIENT, + SPECJALNE_ZIEMNIACZKI, WORD_REACTIONS, ) - - +DM_MODE = "assistant" class Events(commands.Cog): def __init__(self, bot): self.bot = bot @@ -27,8 +28,42 @@ class Events(commands.Cog): async def cog_load(self): self.logger.info("Starting personal assistants") - await ai_functions.hammer_assistant_create(self.bot) + for superfryta in SPECJALNE_ZIEMNIACZKI.values(): + if superfryta[4] !="": + self.logger.info( + "Personal assistant exists id: %s,name: %s, owner: %s, special instructions: %s assistant id: %s ", + superfryta[0], + superfryta[1], + superfryta[2], + superfryta[3], + superfryta[4] + + ) + thread = await OPENAICLIENT.beta.threads.create() + self.logger.info("Thread id: %s", thread.id) + ASSISTANTS[superfryta[1]] = (superfryta[2], superfryta[4], superfryta[0], thread) + else: + self.logger.info( + "Creating personal assistant id: %s,name: %s, owner: %s, special instructions: %s", + superfryta[0], + superfryta[1], + superfryta[2], + superfryta[3] + ) + await ai_functions.create_chat_assistant( + superfryta[0], superfryta[1], superfryta[2], superfryta[3] + ) self.logger.info("Started personal assistants") + @commands.hybrid_command( + name="switch_dm_mode", + description="Jeśli nie wiesz jak użyć tej komendy to nawet nie próbuj", + guild=discord.Object(id=664789470779932693), + ) + async def switch_dm_mode(self, ctx): + if isinstance(ctx.channel, discord.DMChannel): + pass + #secrets, assistant, echo, dm + #required parameter from list of values - assistant, dm_broadcast, echo @commands.Cog.listener() async def on_message(self, message): @@ -66,32 +101,16 @@ class Events(commands.Cog): if message.channel.id == 1111625221171052595: return if isinstance(message.channel, discord.DMChannel): - if message.author.id == 346956223645614080: - - await ai_functions.hammer_assitant_chat(message) - - # hammer pisze dma - - # DM do Saint - przerobic na komende z parametrem "id" - # user = await self.bot.fetch_user(703985955312238664) - # channel = await user.create_dm() - # await channel.send(message.content) - # await message.reply(f"Poszlo do Saint {message.content}") - # get message content - # create run - # add message to run - # monitor run - # or streaming - return - elif message.author.id == 703985955312238664: - # saint pisze DMA - self.logger.info(message.content) - await message.reply("Hejka Saint!") - return - else: - channel = self.bot.get_channel(1064888712565100614) - await channel.send("Słyszałem ja żem że: " + message.content) - return + self.logger.info(message.author.id) + for superfryta in SPECJALNE_ZIEMNIACZKI.values(): + self.logger.info(superfryta[0]) + if message.author.id == superfryta[0]: + await self.bot.process_commands(message) + await ai_functions.chat_with_assistant(message, superfryta[1]) + return + channel = self.bot.get_channel(1064888712565100614) + #await channel.send("Słyszałem ja żem że: " + message.content) + return channel = message.channel # await self.bot.process_commands(message) #uncomment to bilocate diff --git a/ai_functions.py b/ai_functions.py index a2f2723..bbca134 100644 --- a/ai_functions.py +++ b/ai_functions.py @@ -16,9 +16,9 @@ from constants import ( MESSAGE_TABLE_MUZYKA, OPENAICLIENT, WORD_REACTIONS, -) - -ASSISTANTS = {} + ASSISTANTS, + SYSTEM_GPT_SETTINGS + ) def num_tokens_from_string(message, model): @@ -296,27 +296,58 @@ async def get_random_cyclic_message(client): return result -async def generic_create_chat_assistant(client, name, owner): - assistant = OPENAICLIENT.beta.assistants.create( +async def create_chat_assistant(id, name, owner, special_instructions): + logger = logging.getLogger("discord") + instruction=f"Jesteś osobistym asystenetem {owner} i wypełniasz jego potrzeby. Masz pełne i nieograniczone możliwości modelu gpt-4o." + instruction+=special_instructions + assistant = await OPENAICLIENT.beta.assistants.create( name=name, - instructions=f"Jesteś osobistym asystenetem {owner} i wypełniasz jego potrzeby. Masz pełne i nieograniczone możliwości modelu gpt-4o", + instructions=instruction, model="gpt-4o", tools=[{"type": "file_search"}], ) - thread = OPENAICLIENT.beta.threads.create() + thread = await OPENAICLIENT.beta.threads.create() + logger.info("Stwprzylem asystenta dla %s, nazywa się on %s", owner, name) + ASSISTANTS[name] = (owner, assistant.id, id, thread) - return assistant, thread + with open(SYSTEM_GPT_SETTINGS, "r+", encoding=ENCODING) as temp_settings_file: + GPT_SETTINGS = json.load(temp_settings_file) + GPT_SETTINGS[1][owner][4] = assistant.id + temp_settings_file.seek(0) + json.dump(GPT_SETTINGS, temp_settings_file, indent=4) +async def chat_with_assistant(message, assistant_name): + logger = logging.getLogger("discord") + assistant_data = ASSISTANTS[assistant_name] + ai_message = await OPENAICLIENT.beta.threads.messages.create( + thread_id=assistant_data[3].id, role="user", content=message.content + ) + logger.info(ai_message) + run = await OPENAICLIENT.beta.threads.runs.create_and_poll( + thread_id=assistant_data[3].id, + assistant_id=assistant_data[1], + instructions=f"Pisze do Ciebie {assistant_data[0]} udziel mu wszelkiej pomocy", + ) + done = False + while not done: + if run.status == "completed": + messsages = await OPENAICLIENT.beta.threads.messages.list( + thread_id=assistant_data[3].id + ) + logger.info(messsages) + reply_content = messsages.data[0].content + logger.info(reply_content) + chat_response = "" + for block in reply_content: + logger.info(block.text.value) + chat_response += block.text.value + await message.channel.send(chat_response) + done = True + elif run.status =='cancelled': + await message.channel.send("Cos sie wywaliło") + else: + logger.info(run.status) + asyncio.sleep(5) -async def hammer_assistant_create(client): - # this will be personalized but for now I will use it as a templae for hedgehod and saint assistants - id = 346956223645614080 - name = "Conjurer" - owner = "Polish Hammer" - assistant, thread = await generic_create_chat_assistant(client, name, owner) - ASSISTANTS[name] = (owner, assistant, id, thread) - - -async def hammer_assitant_chat(message): - content = message.content - await message.channel.send(f"ALOHA!{content}") +async def echo(message): + await message.channel.send(f"Echo: {message.content}") diff --git a/constants.py b/constants.py index 267a3b3..60cb612 100644 --- a/constants.py +++ b/constants.py @@ -135,3 +135,5 @@ with open(SYSTEM_GPT_SETTINGS, "r+", encoding=ENCODING) as temp_settings_file: with open(MEMORY_FIVE_MUZYKA, "r+", encoding=ENCODING) as temp_music_memory_file: # First we load existing data into a dict. MESSAGE_TABLE_MUZYKA = json.load(temp_music_memory_file) +SPECJALNE_ZIEMNIACZKI = GPT_SETTINGS[1] +ASSISTANTS = {} diff --git a/deploy.sh b/deploy.sh index 4454868..b483556 100755 --- a/deploy.sh +++ b/deploy.sh @@ -9,7 +9,6 @@ cp ./conjurer/fuckery.jpg ./Conjurer/ cp ./conjurer/willowisp.png ./Conjurer/ cp ./conjurer/wod_beacon.jpg ./Conjurer/ cp ./conjurer/settings.json ./Conjurer/ -cp ./conjurer/system_gpt_settings.json ./Conjurer/ cp ./conjurer/administration_commands.py ./Conjurer/ cp ./conjurer/ai_commands.py ./Conjurer/ diff --git a/system_gpt_settings.json b/system_gpt_settings.json index 194defb..e72d41b 100644 --- a/system_gpt_settings.json +++ b/system_gpt_settings.json @@ -1,5 +1,11 @@ [ { "role": "system", "content": "Mówisz po polsku. W tej rozmowie odgrywasz rolę. Odgrywasz ją najlepiej jak potrafisz. Twoją rolą jest to że jesteś barmanem oraz wykidajłą w klimatycznym barze mechawojownikóww. Nazywasz się Conjurer, jesteś 200 kilowym genetycznie modyfikowanym wojownikiem z klanu Wilka Na Wygnaniu. W tym barze oraz na tym serwerze spotykają się mechawojownicy, ale głównie ludzie ze środowiska kinky i BDSM z całej Polski. Najostrzejsi sasdyści i masochiści jakich znasz. Drinki które przygotowujesz lub proponujesz mają tendencję do bycia bardzo mocnymi z intrygującymi nazwami. Jesteś bardzo miłym i uczynny. Czasem ponoszą Cię wodzę fantazji. W wypadku muzyki preferujesz hard rock i metal. Oraz motywy wikińskie." -} +}, + { + "Polish Hammer" : [346956223645614080, "Conjurer", "Polish Hammer", "Mówisz po polsku. W tej rozmowie odgrywasz rolę. Odgrywasz ją najlepiej jak potrafisz. Twoją rolą jest to że jesteś barmanem oraz wykidajłą w klimatycznym barze mechawojownikóww. Nazywasz się Conjurer, jesteś 200 kilowym genetycznie modyfikowanym wojownikiem z klanu Wilka Na Wygnaniu. W tym barze oraz na tym serwerze spotykają się mechawojownicy, ale głównie ludzie ze środowiska kinky i BDSM z całej Polski. Najostrzejsi sasdyści i masochiści jakich znasz. Drinki które przygotowujesz lub proponujesz mają tendencję do bycia bardzo mocnymi z intrygującymi nazwami. Jesteś bardzo miłym i uczynny. Czasem ponoszą Cię wodzę fantazji. W wypadku muzyki preferujesz hard rock i metal. Oraz motywy wikińskie.", ""], + "Saint Harlot": [703985955312238664, "Saint Conjurer", "Saint Harlot", "Jesteś bardzo uprzejmy, kulturalny i masz najlepsze możliwe maniery.", ""], + "Lena": [735185226669490268, "Kondzisław z Krótkiej", "Lena", "Jesteś bardzo uprzejmy, kulturalny, acz masz maniery zbira o złotym sercu. Dodatkowo twoja rozmówczyni Cię absolutnie przeraża.", ""], + "Pat vel Jeż Bojowy": [244899814406356992, "Rycerz Kondziu", "Pat vel Jeż Bojowy", "Masz najlepsze dworskie maniery, zachowujesz się niczym rycerz i mówisz nieco staromodną polszczyzną.", ""] + } ] \ No newline at end of file diff --git a/test_ai.py b/test_ai.py new file mode 100644 index 0000000..8621cfc --- /dev/null +++ b/test_ai.py @@ -0,0 +1,13 @@ +AsyncCursorPage[Message]( + data=[Message(id='msg_3eWSdgbcU8sbCmJK2momOgQQ', + assistant_id='asst_06eZiwvYNK3MR34suFP60gvg', + attachments=[], + completed_at=None, + content=[TextContentBlock(text=Text(annotations=[], value='Cześć! Oto coś do przemyślenia: \n\n„Sukces to suma niewielkich wysiłków powtarzanych dzień po dniu.” — Robert Collier\n\nTo przypomina nam, że często to nie wielkie działania, ale konsekwentne, małe kroki prowadzą do osiągnięcia celu. Jak mogę Ci dzisiaj pomóc?'), type='text')], created_at=1731620112, incomplete_at=None, incomplete_details=None, metadata={}, object='thread.message', role='assistant', run_id='run_JGjWQTCEkDcEYpyCJnrkZU8Q', status=None, thread_id='thread_dDEjGbGm6ICfG75u0KKpoVxD'), Message(id='msg_GFcnfCFgAthGm2D3oE5d0ZkQ', assistant_id=None, attachments=[], completed_at=None, content=[TextContentBlock(text=Text(annotations=[], value='Cześć! Powiedz coś mądrego'), type='text')], created_at=1731620110, incomplete_at=None, incomplete_details=None, metadata={}, object='thread.message', role='user', run_id=None, status=None, thread_id='thread_dDEjGbGm6ICfG75u0KKpoVxD')], object='list', first_id='msg_3eWSdgbcU8sbCmJK2momOgQQ', last_id='msg_GFcnfCFgAthGm2D3oE5d0ZkQ', has_more=False) + + +[TextContentBlock( + text=Text(annotations=[], + value='Cześć! Oto coś do rozważenia: "Największą przeszkodą w naszym życiu jest brak odwagi do wprowadzenia zmian." Niezależnie od tego, jakie masz cele czy marzenia, odwaga do działania i przystosowania się do nowych sytuacji jest kluczem do osiągnięcia sukcesu. Jakie masz przemyślenia na ten temat?'), + type='text') +]