Upgraded core

This commit is contained in:
Saifeddine ALOUI 2023-12-10 22:20:58 +01:00
parent 3a51e57063
commit 54591d660a
6 changed files with 209 additions and 117 deletions

View File

@ -4,8 +4,8 @@ from lollms.personality import PersonalityBuilder
from lollms.binding import LLMBinding, BindingBuilder, ModelBuilder from lollms.binding import LLMBinding, BindingBuilder, ModelBuilder
from lollms.extension import LOLLMSExtension, ExtensionBuilder from lollms.extension import LOLLMSExtension, ExtensionBuilder
from lollms.config import InstallOption from lollms.config import InstallOption
from lollms.helpers import NotificationType from lollms.helpers import ASCIIColors, trace_exception
from lollms.helpers import ASCIIColors, trace_exception, NotificationType, NotificationDisplayType from lollms.com import NotificationType, NotificationDisplayType, LoLLMsCom
from lollms.terminal import MainMenu from lollms.terminal import MainMenu
from lollms.utilities import PromptReshaper from lollms.utilities import PromptReshaper
from safe_store import TextVectorizer, VectorizationMethod, VisualizationMethod from safe_store import TextVectorizer, VectorizationMethod, VisualizationMethod
@ -18,7 +18,7 @@ import importlib
import sys import sys
class LollmsApplication: class LollmsApplication(LoLLMsCom):
def __init__( def __init__(
self, self,
app_name:str, app_name:str,

View File

@ -21,7 +21,7 @@ import importlib
import subprocess import subprocess
from lollms.config import TypedConfig, InstallOption from lollms.config import TypedConfig, InstallOption
from lollms.main_config import LOLLMSConfig from lollms.main_config import LOLLMSConfig
from lollms.helpers import NotificationType, NotificationDisplayType from lollms.com import NotificationType, NotificationDisplayType, LoLLMsCom
import urllib import urllib
import inspect import inspect
from enum import Enum from enum import Enum
@ -57,7 +57,7 @@ class LLMBinding:
supported_file_extensions='*.bin', supported_file_extensions='*.bin',
binding_type:BindingType=BindingType.TEXT_ONLY, binding_type:BindingType=BindingType.TEXT_ONLY,
models_dir_names:list=None, models_dir_names:list=None,
app:Callable=None lollmsCom:LoLLMsCom=None
) -> None: ) -> None:
self.binding_type = binding_type self.binding_type = binding_type
@ -68,6 +68,8 @@ class LLMBinding:
self.config = config self.config = config
self.binding_config = binding_config self.binding_config = binding_config
self.lollmsCom = lollmsCom
binding_config.addConfigs([ binding_config.addConfigs([
{"name":"clip_model_name","type":"str","value":'ViT-L-14/openai','options':["ViT-L-14/openai","ViT-H-14/laion2b_s32b_b79k"], "help":"Clip model to be used for images understanding"}, {"name":"clip_model_name","type":"str","value":'ViT-L-14/openai','options':["ViT-L-14/openai","ViT-H-14/laion2b_s32b_b79k"], "help":"Clip model to be used for images understanding"},
@ -76,50 +78,8 @@ class LLMBinding:
]) ])
self.interrogatorStorer = None self.interrogatorStorer = None
self.supported_file_extensions = supported_file_extensions
self.seed = config["seed"]
self.supported_file_extensions = supported_file_extensions
self.seed = config["seed"]
if app is not None:
self.error:Callable = app.error
self.info:Callable = app.info
self.success:Callable = app.success
self.warning:Callable = app.warning
self.notify:Callable = app.notify
self.InfoMessage:Callable = app.InfoMessage
else:
def InfoMessage(content, duration:int=4, client_id=None, verbose:bool=True):
ASCIIColors.white(content)
def info(content, duration:int=4, client_id=None, verbose:bool=True):
ASCIIColors.info(content)
def warning(content, duration:int=4, client_id=None, verbose:bool=True):
ASCIIColors.warning(content)
def success(content, duration:int=4, client_id=None, verbose:bool=True):
ASCIIColors.success(content)
def error(content, duration:int=4, client_id=None):
ASCIIColors.error(content)
def notify(
content,
notification_type:NotificationType=NotificationType.NOTIF_SUCCESS,
duration:int=4,
client_id=None,
display_type:NotificationDisplayType=NotificationDisplayType.TOAST,
verbose=True
):
ASCIIColors.white(content)
self.error:Callable = error
self.info:Callable = info
self.success:Callable = success
self.warning:Callable = warning
self.notify:Callable = notify
self.InfoMessage:Callable = InfoMessage
self.configuration_file_path = lollms_paths.personal_configuration_path/"bindings"/self.binding_folder_name/f"config.yaml" self.configuration_file_path = lollms_paths.personal_configuration_path/"bindings"/self.binding_folder_name/f"config.yaml"
self.configuration_file_path.parent.mkdir(parents=True, exist_ok=True) self.configuration_file_path.parent.mkdir(parents=True, exist_ok=True)
@ -143,6 +103,46 @@ class LLMBinding:
for models_folder in self.models_folders: for models_folder in self.models_folders:
models_folder.mkdir(parents=True, exist_ok=True) models_folder.mkdir(parents=True, exist_ok=True)
def InfoMessage(self, content, duration:int=4, client_id=None, verbose:bool=True):
if self.lollmsCom:
return self.lollmsCom.InfoMessage(content=content, duration=duration, client_id=client_id, verbose=verbose)
ASCIIColors.white(content)
def info(self, content, duration:int=4, client_id=None, verbose:bool=True):
if self.lollmsCom:
return self.lollmsCom.info(content=content, duration=duration, client_id=client_id, verbose=verbose)
ASCIIColors.info(content)
def warning(self, content, duration:int=4, client_id=None, verbose:bool=True):
if self.lollmsCom:
return self.lollmsCom.warning(content=content, duration=duration, client_id=client_id, verbose=verbose)
ASCIIColors.warning(content)
def success(self, content, duration:int=4, client_id=None, verbose:bool=True):
if self.lollmsCom:
return self.lollmsCom.success(content=content, duration=duration, client_id=client_id, verbose=verbose)
ASCIIColors.success(content)
def error(self, content, duration:int=4, client_id=None, verbose:bool=True):
if self.lollmsCom:
return self.lollmsCom.error(content=content, duration=duration, client_id=client_id, verbose=verbose)
ASCIIColors.error(content)
def notify( self,
content,
notification_type:NotificationType=NotificationType.NOTIF_SUCCESS,
duration:int=4,
client_id=None,
display_type:NotificationDisplayType=NotificationDisplayType.TOAST,
verbose=True
):
if self.lollmsCom:
return self.lollmsCom.error(content=content, notification_type=notification_type, duration=duration, client_id=client_id, display_type=display_type, verbose=verbose)
ASCIIColors.white(content)
def settings_updated(self): def settings_updated(self):
""" """
To be implemented by the bindings To be implemented by the bindings
@ -545,7 +545,7 @@ class BindingBuilder:
config: LOLLMSConfig, config: LOLLMSConfig,
lollms_paths:LollmsPaths, lollms_paths:LollmsPaths,
installation_option:InstallOption=InstallOption.INSTALL_IF_NECESSARY, installation_option:InstallOption=InstallOption.INSTALL_IF_NECESSARY,
app=None lollmsCom=None
)->LLMBinding: )->LLMBinding:
binding:LLMBinding = self.getBinding(config, lollms_paths, installation_option) binding:LLMBinding = self.getBinding(config, lollms_paths, installation_option)
@ -553,7 +553,7 @@ class BindingBuilder:
config, config,
lollms_paths=lollms_paths, lollms_paths=lollms_paths,
installation_option = installation_option, installation_option = installation_option,
app=app lollmsCom=lollmsCom
) )
def getBinding( def getBinding(

98
lollms/com.py Normal file
View File

@ -0,0 +1,98 @@
from ascii_colors import ASCIIColors
from enum import Enum
class NotificationType(Enum):
"""Notification types."""
NOTIF_ERROR = 0
"""This is an error notification."""
NOTIF_SUCCESS = 1
"""This is a success notification."""
NOTIF_INFO = 2
"""This is an information notification."""
NOTIF_WARNING = 3
"""This is a warining notification."""
class NotificationDisplayType(Enum):
"""Notification display types."""
TOAST = 0
"""This is a toast."""
MESSAGE_BOX = 1
"""This is a message box."""
class LoLLMsCom:
def __init__(self) -> None:
pass
def InfoMessage(self, content, duration:int=4, client_id=None, verbose:bool=True):
self.notify(
content,
notification_type=NotificationType.NOTIF_SUCCESS,
duration=duration,
client_id=client_id,
display_type=NotificationDisplayType.MESSAGE_BOX,
verbose=verbose
)
def info(self, content, duration:int=4, client_id=None, verbose:bool=True):
self.notify(
content,
notification_type=NotificationType.NOTIF_SUCCESS,
duration=duration,
client_id=client_id,
display_type=NotificationDisplayType.TOAST,
verbose=verbose
)
def warning(self, content, duration:int=4, client_id=None, verbose:bool=True):
self.notify(
content,
notification_type=NotificationType.NOTIF_WARNING,
duration=duration,
client_id=client_id,
display_type=NotificationDisplayType.TOAST,
verbose=verbose
)
def success(self, content, duration:int=4, client_id=None, verbose:bool=True):
self.notify(
content,
notification_type=NotificationType.NOTIF_SUCCESS,
duration=duration,
client_id=client_id,
display_type=NotificationDisplayType.TOAST,
verbose=verbose
)
def error(self, content, duration:int=4, client_id=None):
self.notify(
content,
notification_type=NotificationType.NOTIF_ERROR,
duration=duration,
client_id=client_id,
display_type=NotificationDisplayType.TOAST
)
def notify(
self,
content,
notification_type:NotificationType=NotificationType.NOTIF_SUCCESS,
duration:int=4,
client_id=None,
display_type:NotificationDisplayType=NotificationDisplayType.TOAST,
verbose=True
):
if verbose:
if notification_type==NotificationType.NOTIF_SUCCESS:
ASCIIColors.success(content)
elif notification_type==NotificationType.NOTIF_INFO:
ASCIIColors.info(content)
elif notification_type==NotificationType.NOTIF_WARNING:
ASCIIColors.warning(content)
else:
ASCIIColors.red(content)

View File

@ -1,29 +1,6 @@
import traceback import traceback
from ascii_colors import ASCIIColors from ascii_colors import ASCIIColors
from enum import Enum from enum import Enum
class NotificationType(Enum):
"""Notification types."""
NOTIF_ERROR = 0
"""This is an error notification."""
NOTIF_SUCCESS = 1
"""This is a success notification."""
NOTIF_INFO = 2
"""This is an information notification."""
NOTIF_WARNING = 3
"""This is a warining notification."""
class NotificationDisplayType(Enum):
"""Notification display types."""
TOAST = 0
"""This is a toast."""
MESSAGE_BOX = 1
"""This is a message box."""
def get_trace_exception(ex): def get_trace_exception(ex):
""" """

View File

@ -12,12 +12,25 @@ if not PackageManager.check_package_installed("pygame"):
import pygame import pygame
else: else:
import pygame import pygame
import threading import threading
if not PackageManager.check_package_installed("cv2"): if not PackageManager.check_package_installed("cv2"):
PackageManager.install_package("opencv-python") PackageManager.install_package("opencv-python")
import cv2 import cv2
else: else:
import cv2 import cv2
if not PackageManager.check_package_installed("pyaudio"):
PackageManager.install_package("pyaudio")
PackageManager.install_package("wave")
import pyaudio
import wave
else:
import pyaudio
import wave
from lollms.com import LoLLMsCom
import time import time
import json import json
import base64 import base64
@ -25,7 +38,8 @@ import base64
class AudioRecorder: class AudioRecorder:
def __init__(self, filename, channels=1, sample_rate=44100, chunk_size=1024, silence_threshold=0.01, silence_duration=2): def __init__(self, socketio, filename, channels=1, sample_rate=44100, chunk_size=1024, silence_threshold=0.01, silence_duration=2, app:LoLLMsCom=None):
self.socketio = socketio
self.filename = filename self.filename = filename
self.channels = channels self.channels = channels
self.sample_rate = sample_rate self.sample_rate = sample_rate
@ -37,6 +51,7 @@ class AudioRecorder:
self.silence_threshold = silence_threshold self.silence_threshold = silence_threshold
self.silence_duration = silence_duration self.silence_duration = silence_duration
self.last_sound_time = time.time() self.last_sound_time = time.time()
self.app = app
def start_recording(self): def start_recording(self):
self.is_recording = True self.is_recording = True

View File

@ -13,7 +13,7 @@ from lollms.main_config import LOLLMSConfig
from lollms.paths import LollmsPaths from lollms.paths import LollmsPaths
from lollms.binding import LLMBinding, BindingType from lollms.binding import LLMBinding, BindingType
from lollms.utilities import PromptReshaper, PackageManager from lollms.utilities import PromptReshaper, PackageManager
from lollms.helpers import NotificationType, NotificationDisplayType from lollms.com import NotificationType, NotificationDisplayType
import pkg_resources import pkg_resources
from pathlib import Path from pathlib import Path
@ -33,7 +33,7 @@ import json
from safe_store import TextVectorizer, GenericDataLoader, VisualizationMethod, VectorizationMethod from safe_store import TextVectorizer, GenericDataLoader, VisualizationMethod, VectorizationMethod
from functools import partial from functools import partial
import sys import sys
from lollms.com import LoLLMsCom
from lollms.helpers import trace_exception from lollms.helpers import trace_exception
from lollms.utilities import PackageManager from lollms.utilities import PackageManager
def is_package_installed(package_name): def is_package_installed(package_name):
@ -75,7 +75,7 @@ class AIPersonality:
lollms_paths:LollmsPaths, lollms_paths:LollmsPaths,
config:LOLLMSConfig, config:LOLLMSConfig,
model:LLMBinding=None, model:LLMBinding=None,
app=None, app:LoLLMsCom=None,
run_scripts=True, run_scripts=True,
selected_language=None, selected_language=None,
is_relative_path=True, is_relative_path=True,
@ -98,45 +98,6 @@ class AIPersonality:
self.config = config self.config = config
self.callback = callback self.callback = callback
self.app = app self.app = app
if app is not None:
self.error:Callable = app.error
self.info:Callable = app.info
self.success:Callable = app.success
self.warning:Callable = app.warning
self.notify:Callable = app.notify
self.InfoMessage:Callable = app.InfoMessage
else:
def InfoMessage(content, duration:int=4, client_id=None, verbose:bool=True):
ASCIIColors.white(content)
def info(content, duration:int=4, client_id=None, verbose:bool=True):
ASCIIColors.info(content)
def warning(content, duration:int=4, client_id=None, verbose:bool=True):
ASCIIColors.warning(content)
def success(content, duration:int=4, client_id=None, verbose:bool=True):
ASCIIColors.success(content)
def error(content, duration:int=4, client_id=None):
ASCIIColors.error(content)
def notify(
content,
notification_type:NotificationType=NotificationType.NOTIF_SUCCESS,
duration:int=4,
client_id=None,
display_type:NotificationDisplayType=NotificationDisplayType.TOAST,
verbose=True
):
ASCIIColors.white(content)
self.error:Callable = error
self.info:Callable = info
self.success:Callable = success
self.warning:Callable = warning
self.notify:Callable = notify
self.InfoMessage:Callable = InfoMessage
self.text_files = [] self.text_files = []
self.image_files = [] self.image_files = []
@ -232,6 +193,47 @@ Date: {{date}}
self.personality_output_folder = lollms_paths.personal_outputs_path/self.name self.personality_output_folder = lollms_paths.personal_outputs_path/self.name
self.personality_output_folder.mkdir(parents=True, exist_ok=True) self.personality_output_folder.mkdir(parents=True, exist_ok=True)
def InfoMessage(self, content, duration:int=4, client_id=None, verbose:bool=True):
if self.app:
return self.app.InfoMessage(content=content, duration=duration, client_id=client_id, verbose=verbose)
ASCIIColors.white(content)
def info(self, content, duration:int=4, client_id=None, verbose:bool=True):
if self.app:
return self.app.info(content=content, duration=duration, client_id=client_id, verbose=verbose)
ASCIIColors.info(content)
def warning(self, content, duration:int=4, client_id=None, verbose:bool=True):
if self.app:
return self.app.warning(content=content, duration=duration, client_id=client_id, verbose=verbose)
ASCIIColors.warning(content)
def success(self, content, duration:int=4, client_id=None, verbose:bool=True):
if self.app:
return self.app.success(content=content, duration=duration, client_id=client_id, verbose=verbose)
ASCIIColors.success(content)
def error(self, content, duration:int=4, client_id=None, verbose:bool=True):
if self.app:
return self.app.error(content=content, duration=duration, client_id=client_id, verbose=verbose)
ASCIIColors.error(content)
def notify( self,
content,
notification_type:NotificationType=NotificationType.NOTIF_SUCCESS,
duration:int=4,
client_id=None,
display_type:NotificationDisplayType=NotificationDisplayType.TOAST,
verbose=True
):
if self.app:
return self.app.error(content=content, notification_type=notification_type, duration=duration, client_id=client_id, display_type=display_type, verbose=verbose)
ASCIIColors.white(content)
def new_message(self, message_text:str, message_type:MSG_TYPE= MSG_TYPE.MSG_TYPE_FULL, metadata=[], callback: Callable[[str, int, dict, list, Any], bool]=None): def new_message(self, message_text:str, message_type:MSG_TYPE= MSG_TYPE.MSG_TYPE_FULL, metadata=[], callback: Callable[[str, int, dict, list, Any], bool]=None):
"""This sends step rogress to front end """This sends step rogress to front end