mirror of
https://github.com/ParisNeo/lollms.git
synced 2025-04-25 05:19:48 +00:00
Added extensions
This commit is contained in:
parent
189fb75139
commit
10fbef35da
@ -3,13 +3,14 @@ from lollms.helpers import ASCIIColors
|
|||||||
from lollms.paths import LollmsPaths
|
from lollms.paths import LollmsPaths
|
||||||
from lollms.personality import PersonalityBuilder
|
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.config import InstallOption
|
from lollms.config import InstallOption
|
||||||
from lollms.helpers import trace_exception
|
from lollms.helpers import trace_exception
|
||||||
from lollms.terminal import MainMenu
|
from lollms.terminal import MainMenu
|
||||||
from typing import Callable
|
from typing import Callable
|
||||||
|
|
||||||
import subprocess
|
import subprocess
|
||||||
|
import importlib
|
||||||
class LollmsApplication:
|
class LollmsApplication:
|
||||||
def __init__(
|
def __init__(
|
||||||
self,
|
self,
|
||||||
@ -33,6 +34,8 @@ class LollmsApplication:
|
|||||||
self.mounted_personalities = []
|
self.mounted_personalities = []
|
||||||
self.personality = None
|
self.personality = None
|
||||||
|
|
||||||
|
self.mounted_extensions = []
|
||||||
|
|
||||||
self.binding=None
|
self.binding=None
|
||||||
self.model=None
|
self.model=None
|
||||||
|
|
||||||
@ -91,6 +94,7 @@ class LollmsApplication:
|
|||||||
|
|
||||||
|
|
||||||
self.mount_personalities()
|
self.mount_personalities()
|
||||||
|
self.mount_extensions()
|
||||||
|
|
||||||
def load_binding(self):
|
def load_binding(self):
|
||||||
try:
|
try:
|
||||||
@ -125,6 +129,17 @@ class LollmsApplication:
|
|||||||
return model
|
return model
|
||||||
|
|
||||||
|
|
||||||
|
def mount_extension(self, id:int, callback=None):
|
||||||
|
try:
|
||||||
|
extension = ExtensionBuilder(self.lollms_paths, self.config, self.model, self, callback=callback).build_extension(self.config["extensions"][id], self.lollms_paths, self)
|
||||||
|
self.mounted_extensions.append(extension)
|
||||||
|
return extension
|
||||||
|
except Exception as ex:
|
||||||
|
ASCIIColors.error(f"Couldn't load extension. Please verify your configuration file at {self.lollms_paths.personal_configuration_path} or use the next menu to select a valid personality")
|
||||||
|
trace_exception(ex)
|
||||||
|
return None
|
||||||
|
|
||||||
|
|
||||||
def mount_personality(self, id:int, callback=None):
|
def mount_personality(self, id:int, callback=None):
|
||||||
try:
|
try:
|
||||||
personality = PersonalityBuilder(self.lollms_paths, self.config, self.model, self, callback=callback).build_personality(id)
|
personality = PersonalityBuilder(self.lollms_paths, self.config, self.model, self, callback=callback).build_personality(id)
|
||||||
@ -167,10 +182,32 @@ class LollmsApplication:
|
|||||||
self.mount_personality(0, callback = None)
|
self.mount_personality(0, callback = None)
|
||||||
self.config.active_personality_id = 0
|
self.config.active_personality_id = 0
|
||||||
self.personality = self.mounted_personalities[self.config.active_personality_id]
|
self.personality = self.mounted_personalities[self.config.active_personality_id]
|
||||||
|
|
||||||
|
def mount_extensions(self, callback = None):
|
||||||
|
self.mounted_extensions = []
|
||||||
|
to_remove = []
|
||||||
|
for i in range(len(self.config["extensions"])):
|
||||||
|
p = self.mount_extension(i, callback = None)
|
||||||
|
if p is None:
|
||||||
|
to_remove.append(i)
|
||||||
|
to_remove.sort(reverse=True)
|
||||||
|
for i in to_remove:
|
||||||
|
self.unmount_extension(i)
|
||||||
|
|
||||||
|
|
||||||
def set_personalities_callbacks(self, callback: Callable[[str, int, dict], bool]=None):
|
def set_personalities_callbacks(self, callback: Callable[[str, int, dict], bool]=None):
|
||||||
for personality in self.mount_personalities:
|
for personality in self.mount_personalities:
|
||||||
personality.setCallback(callback)
|
personality.setCallback(callback)
|
||||||
|
|
||||||
|
def unmount_extension(self, id:int)->bool:
|
||||||
|
if id<len(self.config.extensions):
|
||||||
|
del self.config.extensions[id]
|
||||||
|
del self.mounted_extensions[id]
|
||||||
|
self.config.save_config()
|
||||||
|
return True
|
||||||
|
else:
|
||||||
|
return False
|
||||||
|
|
||||||
|
|
||||||
def unmount_personality(self, id:int)->bool:
|
def unmount_personality(self, id:int)->bool:
|
||||||
if id<len(self.config.personalities):
|
if id<len(self.config.personalities):
|
||||||
|
@ -4,8 +4,11 @@
|
|||||||
# This is the main class to be imported by the extension
|
# This is the main class to be imported by the extension
|
||||||
# it gives your code access to the model, the callback functions, the model conditionning etc
|
# it gives your code access to the model, the callback functions, the model conditionning etc
|
||||||
from lollms.helpers import ASCIIColors
|
from lollms.helpers import ASCIIColors
|
||||||
from lollms.config import BaseConfig
|
from lollms.config import InstallOption, TypedConfig, BaseConfig, ConfigTemplate
|
||||||
|
from lollms.paths import LollmsPaths
|
||||||
from enum import Enum
|
from enum import Enum
|
||||||
|
from pathlib import Path
|
||||||
|
import importlib
|
||||||
|
|
||||||
|
|
||||||
__author__ = "parisneo"
|
__author__ = "parisneo"
|
||||||
@ -18,23 +21,78 @@ class EXTENSION_TYPE(Enum):
|
|||||||
EXTENSION_TYPE_STAND_ALONE = 0 # An extension that has access to the current personality and model but has an independant
|
EXTENSION_TYPE_STAND_ALONE = 0 # An extension that has access to the current personality and model but has an independant
|
||||||
|
|
||||||
|
|
||||||
class Extension():
|
class LOLLMSExtension():
|
||||||
def __init__(self, metadata_file_path:str, app) -> None:
|
def __init__(self, name:str, script_path:str|Path, config:TypedConfig, app) -> None:
|
||||||
|
self.name = name
|
||||||
self.app = app
|
self.app = app
|
||||||
self.metadata_file_path = metadata_file_path
|
self.config = config
|
||||||
self.config = BaseConfig(file_path=metadata_file_path)
|
self.script_path = script_path
|
||||||
self.config.load_config()
|
self.card = self.script_path /"card.yaml"
|
||||||
|
|
||||||
|
self.configuration_path = app.lollms_paths.personal_configuration_path/"extensions"/f"{name}"
|
||||||
|
self.configuration_path.mkdir(parents=True, exist_ok=True)
|
||||||
|
self.configuration_path= self.configuration_path/"config.yaml"
|
||||||
|
|
||||||
|
def build_extension(self):
|
||||||
|
return self
|
||||||
|
|
||||||
def install(self):
|
def install(self):
|
||||||
"""
|
"""
|
||||||
Installation procedure (to be implemented)
|
Installation procedure (to be implemented)
|
||||||
"""
|
"""
|
||||||
ASCIIColors.blue("*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*")
|
ASCIIColors.blue("*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*")
|
||||||
ASCIIColors.red(f"Installing {self.binding_folder_name}")
|
ASCIIColors.red(f"Installing {self.name}")
|
||||||
ASCIIColors.blue("*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*")
|
ASCIIColors.blue("*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*")
|
||||||
|
|
||||||
|
def pre_gen(self, previous_prompt:str, prompt:str):
|
||||||
|
return previous_prompt, prompt
|
||||||
|
|
||||||
|
def in_gen(self, chunk:str)->str:
|
||||||
|
return chunk
|
||||||
|
|
||||||
|
def post_gen(self, ai_output:str):
|
||||||
|
pass
|
||||||
|
|
||||||
|
|
||||||
def get_ui():
|
def get_ui():
|
||||||
"""
|
"""
|
||||||
Get user interface of the extension
|
Get user interface of the extension
|
||||||
"""
|
"""
|
||||||
return "<p>This is a ui extension template</p>"
|
return "<p>This is a ui extension template</p>"
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
class ExtensionBuilder:
|
||||||
|
def build_extension(
|
||||||
|
self,
|
||||||
|
extension_path:str,
|
||||||
|
lollms_paths:LollmsPaths,
|
||||||
|
app
|
||||||
|
)->LOLLMSExtension:
|
||||||
|
|
||||||
|
extension, script_path = self.getBinding(extension_path, lollms_paths, app)
|
||||||
|
return extension(
|
||||||
|
extension_path.split[1],
|
||||||
|
script_path,
|
||||||
|
lollms_paths=lollms_paths,
|
||||||
|
app = app
|
||||||
|
)
|
||||||
|
|
||||||
|
def getExtension(
|
||||||
|
self,
|
||||||
|
extension_path:str,
|
||||||
|
lollms_paths:LollmsPaths,
|
||||||
|
app
|
||||||
|
)->LOLLMSExtension:
|
||||||
|
|
||||||
|
extension_path = lollms_paths.bindings_zoo_path / extension_path
|
||||||
|
|
||||||
|
# define the full absolute path to the module
|
||||||
|
absolute_path = extension_path.resolve()
|
||||||
|
# infer the module name from the file path
|
||||||
|
module_name = extension_path.stem
|
||||||
|
# use importlib to load the module from the file path
|
||||||
|
loader = importlib.machinery.SourceFileLoader(module_name, str(absolute_path / "__init__.py"))
|
||||||
|
extension_module = loader.load_module()
|
||||||
|
extension:LOLLMSExtension = getattr(extension_module, extension_module.extension_name)
|
||||||
|
return extension, absolute_path
|
@ -51,7 +51,7 @@ class LollmsPaths:
|
|||||||
|
|
||||||
self.bindings_zoo_path = self.personal_path / "bindings_zoo"
|
self.bindings_zoo_path = self.personal_path / "bindings_zoo"
|
||||||
self.personalities_zoo_path = self.personal_path / "personalities_zoo"
|
self.personalities_zoo_path = self.personal_path / "personalities_zoo"
|
||||||
self.extensions_zoo_path = self.personal_path / "extensions_zoo_path"
|
self.extensions_zoo_path = self.personal_path / "extensions_zoo"
|
||||||
|
|
||||||
ASCIIColors.green("----------------------Paths information-----------------------")
|
ASCIIColors.green("----------------------Paths information-----------------------")
|
||||||
ASCIIColors.yellow("personal_path:",end="")
|
ASCIIColors.yellow("personal_path:",end="")
|
||||||
|
2
setup.py
2
setup.py
@ -26,7 +26,7 @@ def get_all_files(path):
|
|||||||
|
|
||||||
setuptools.setup(
|
setuptools.setup(
|
||||||
name="lollms",
|
name="lollms",
|
||||||
version="5.5.6",
|
version="5.6.1",
|
||||||
author="Saifeddine ALOUI",
|
author="Saifeddine ALOUI",
|
||||||
author_email="aloui.saifeddine@gmail.com",
|
author_email="aloui.saifeddine@gmail.com",
|
||||||
description="A python library for AI personality definition",
|
description="A python library for AI personality definition",
|
||||||
|
Loading…
x
Reference in New Issue
Block a user