import threading from typing import AnyStr from .DcClient import DcClient from ..ais.AiBase import AiBase from ..ais.QwenAi import QwenAi from ..events import chat_text_signal, discord_online_signal, discord_react_to_chat_signal from ..models import AiConfig class DiscordStatus: def __init__(self, instance): self._instance = instance self._client = DcClient(instance) self.online = False self.react_to_chat = False def set_online(self, online: bool): if online and not self.online: self._client.connect() elif not online and self.online: self._client.disconnect() else: return self.online = online discord_online_signal.send(sender=self.__class__, ai_name=self._instance.configuration.name, status=self.online) def set_react_to_chat(self, react_to_chat: bool): self.react_to_chat = react_to_chat discord_react_to_chat_signal.send(sender=self.__class__, ai_name=self._instance.configuration.name, status=self.react_to_chat) def __del__(self): self.set_online(False) class AiInstance: def __init__(self, configuration: AiConfig): print('Initializing AiInstance ' + configuration.name) self._bot: AiBase | None = None self._botLock = threading.Lock() self.configuration = configuration self.discord = DiscordStatus(self) self.messages = [] self._messagesLock = threading.Lock() def endure_loaded(self): self._botLock.acquire() try: if self._bot is None: self._bot = QwenAi(self.configuration.model_id_or_path) finally: self._botLock.release() def endure_unloaded(self): self._botLock.acquire() try: if self._bot is not None: del self._bot self._bot = None finally: self._botLock.release() def chat_text(self, user: AnyStr, text: AnyStr): self.endure_loaded() self._messagesLock.acquire() try: self.messages.append({'role': 'user', 'name': user, 'content': text}) chat_text_signal.send(sender=self.__class__, ai_name=self.configuration.name, message=self.messages[-1]) self.messages = self._bot.generate(self.messages) chat_text_signal.send(sender=self.__class__, ai_name=self.configuration.name, message=self.messages[-1]) return self.messages[-1] finally: self._messagesLock.release() def chat_conversation(self, conversation): self.endure_loaded() return self._bot.generate(conversation) def __del__(self): print('Destructing AiInstance ' + self.configuration.name) del self._bot del self.discord