removed old languages format

This commit is contained in:
Saifeddine ALOUI 2024-11-05 01:44:52 +01:00
parent 22299b5c7f
commit 7a73972055
4 changed files with 286 additions and 102 deletions

View File

@ -52,6 +52,13 @@ class LollmsApplication(LoLLMsCom):
super().__init__(sio)
self.app_name = app_name
self.config = config
ASCIIColors.warning(f"Configuration fix ")
try:
config.personalities = [p.split(":")[0] for p in config.personalities]
config.save_config()
except Exception as ex:
trace_exception(ex)
self.lollms_paths = lollms_paths
# TODO : implement
@ -691,10 +698,7 @@ class LollmsApplication(LoLLMsCom):
self.n_cond_tk = len(self.cond_tk)
ASCIIColors.success(f"Personality {personality.name} mounted successfully")
else:
if personality.selected_language is not None:
ASCIIColors.success(f"Personality {personality.name} : {personality.selected_language} mounted successfully but no model is selected")
else:
ASCIIColors.success(f"Personality {personality.name} mounted successfully but no model is selected")
ASCIIColors.success(f"Personality {personality.name} mounted successfully but no model is selected")
except Exception as ex:
ASCIIColors.error(f"Couldn't load personality. Please verify your configuration file at {self.lollms_paths.personal_configuration_path} or use the next menu to select a valid personality")
ASCIIColors.error(f"Binding returned this exception : {ex}")
@ -913,7 +917,7 @@ class LollmsApplication(LoLLMsCom):
default_language = self.personality.language.lower().strip().split()[0]
current_language = self.config.current_language.lower().strip().split()[0]
if self.config.current_language and current_language!= default_language:
if current_language and current_language!= self.personality.language:
language_path = self.lollms_paths.personal_configuration_path/"personalities"/self.personality.name/f"languages_{current_language}.yaml"
if not language_path.exists():
self.info(f"This is the first time this personality speaks {current_language}\nLollms is reconditionning the persona in that language.\nThis will be done just once. Next time, the personality will speak {current_language} out of the box")
@ -926,7 +930,7 @@ class LollmsApplication(LoLLMsCom):
else:
with open(language_path,"r",encoding="utf-8", errors="ignore") as f:
language_pack = yaml.safe_load(f)
conditionning = language_pack["personality_conditioning"]
conditionning = language_pack.get("personality_conditioning", language_pack.get("conditionning", self.personality.personality_conditioning))
else:
conditionning = self.personality._personality_conditioning

View File

@ -1094,6 +1094,7 @@ Use this structure:
# Load parameters from the configuration file
self._version = config.get("version", self._version)
self._author = config.get("author", self._author)
self._language = config.get("language", self._author)
self._name = config.get("name", self._name)
self._creation_date = config.get("creation_date", self._creation_date)
self._last_update_date = config.get("last_update_date", self._last_update_date)
@ -1110,6 +1111,16 @@ Use this structure:
self._personality_description = config.get("personality_description", self._personality_description)
self._personality_conditioning = config.get("personality_conditioning", self._personality_conditioning)
self._prompts_list = config.get("prompts_list", self._prompts_list)
try:
personality_folder = self.lollms_paths.personal_configuration_path/"personalities"/self.name
personality_folder.mkdir(exist_ok=True, parents=True)
custom_prompts = personality_folder/"custom_prompts.yaml"
if custom_prompts.exists():
with open(custom_prompts,"r") as f:
data = yaml.safe_load(f)
self._prompts_list.append(data["custom_prompts"])
except Exception as ex:
trace_exception(ex)
self._welcome_message = config.get("welcome_message", self._welcome_message)
self._include_welcome_message_in_discussion = config.get("include_welcome_message_in_discussion", self._include_welcome_message_in_discussion)
@ -1129,7 +1140,53 @@ Use this structure:
# Script parameters (for example keys to connect to search engine or any other usage)
self._processor_cfg = config.get("processor_cfg", self._processor_cfg)
def add_prompt(self, prompt):
try:
personality_folder = self.lollms_paths.personal_configuration_path/"personalities"/self.name
personality_folder.mkdir(exist_ok=True, parents=True)
custom_prompts = personality_folder/"custom_prompts.yaml"
if custom_prompts.exists():
with open(custom_prompts,"r") as f:
data = yaml.safe_load(f)
data["custom_prompts"].append(prompt)
else:
data = {
"custom_prompts":[prompt]
}
with open(custom_prompts,"w") as f:
yaml.dump(data, f)
except Exception as ex:
trace_exception(ex)
def delete_prompt(self, prompt):
try:
personality_folder = self.lollms_paths.personal_configuration_path/"personalities"/self.name
personality_folder.mkdir(exist_ok=True, parents=True)
custom_prompts = personality_folder/"custom_prompts.yaml"
if custom_prompts.exists():
with open(custom_prompts,"r") as f:
data = yaml.safe_load(f)
index = data["custom_prompts"].index(prompt)
if index>=0:
del data["custom_prompts"][index]
with open(custom_prompts,"w") as f:
yaml.dump(data, f)
except Exception as ex:
trace_exception(ex)
def set_language(self, language):
if self.default_language==language:
package_path = self.personality_package_path
# Verify that there is at least a configuration file
config_file = package_path / "config.yaml"
if not config_file.exists():
raise ValueError(f"The provided folder {package_path} does not exist.")
with open(config_file, "r", encoding='utf-8') as f:
config = yaml.safe_load(f)
self.set_config(config)
return
if self.language.lower().strip() and self.language.lower().strip()!= language:
language_path = self.app.lollms_paths.personal_configuration_path/"personalities"/self.name/f"languages_{language}.yaml"
if not language_path.exists():
@ -1154,12 +1211,13 @@ Use this structure:
raise ValueError(f"The provided folder {package_path} does not exist.")
with open(config_file, "r", encoding='utf-8') as f:
default_config = f.read()
default_config = yaml.safe_load(f)
# Translating
new_config = self.generate_code(f"Translate the following yaml file values to {language}.\n```yaml\n{default_config}```\n")
new_config = self.generate_code(f"Translate the following json file values to {language}. Use double quotes for the keys and strings. Do not translate the keys, just the values\n```json\n{default_config}```\n", max_continues=1)
json_cfg = json.loads(new_config)
with open(language_path,"w",encoding="utf-8", errors="ignore") as f:
f.write(new_config)
yaml.dump(json_cfg, f)
with open(language_path,"r",encoding="utf-8", errors="ignore") as f:
new_config = yaml.safe_load(f)
self.set_config(new_config)
@ -1170,9 +1228,12 @@ Use this structure:
self.InfoMessage(f"Couldn't translate personality to {language}.\nThe model you are using may be unable to do this task. We'll switch to conditionning language insertion mode.")
else:
with open(language_path,"r",encoding="utf-8", errors="ignore") as f:
config = yaml.safe_load(f)
self.set_config(config, False)
try:
with open(language_path,"r",encoding="utf-8", errors="ignore") as f:
config = yaml.safe_load(f)
self.set_config(config, False)
except Exception as ex:
trace_exception(ex)
else:
pass
@ -1215,7 +1276,7 @@ Use this structure:
else:
default_language = 'english'
current_language = self.config.current_language.lower().strip().split()[0]
current_language = self.selected_language.lower().strip().split()[0]
if current_language and current_language!= default_language:
language_path = self.app.lollms_paths.personal_configuration_path/"personalities"/config["name"]/f"languages_{current_language}.yaml"
@ -1438,12 +1499,15 @@ Use this structure:
if process:
if self.vectorizer is None:
if self.config.rag_vectorizer == "semantic":
self.ShowBlockingMessage("Processing file\nPlease wait ...\nUsing semantic vectorizer")
from lollmsvectordb.lollms_vectorizers.semantic_vectorizer import SemanticVectorizer
v = SemanticVectorizer(self.config.rag_vectorizer_model)
elif self.config.rag_vectorizer == "tfidf":
self.ShowBlockingMessage("Processing file\nPlease wait ...\nUsing tfidf vectorizer")
from lollmsvectordb.lollms_vectorizers.tfidf_vectorizer import TFIDFVectorizer
v = TFIDFVectorizer()
elif self.config.rag_vectorizer == "openai":
self.ShowBlockingMessage("Processing file\nPlease wait ...\nUsing open ai vectorizer")
from lollmsvectordb.lollms_vectorizers.openai_vectorizer import OpenAIVectorizer
v = OpenAIVectorizer()
@ -1455,6 +1519,8 @@ Use this structure:
overlap=self.config.rag_overlap
)
data = TextDocumentsLoader.read_file(path)
if self.config.debug:
self.print_prompt(data)
self.vectorizer.add_document(path.stem, data, path, True)
self.vectorizer.build_index()
if callback is not None:
@ -1463,8 +1529,10 @@ Use this structure:
return True
except Exception as e:
trace_exception(e)
self.InfoMessage(f"Unsupported file format or empty file.\nSupported formats are {GenericDataLoader.get_supported_file_types()}",client_id=client.client_id)
self.InfoMessage(f"Unsupported file format or empty file.\nSupported formats are {TextDocumentsLoader.get_supported_file_types()}",client_id=client.client_id)
return False
def save_personality(self, package_path=None):
"""
Save the personality parameters to a YAML configuration file.
@ -1494,8 +1562,7 @@ Use this structure:
"last_update_date": self._last_update_date,
"user_name": self._user_name,
"category": self._category,
"language": self._language,
"default_language": self._default_language,
"language": self._default_language,
"supported_languages": self._supported_languages,
"selected_language": self._selected_language,
"ignore_discussion_documents_rag": self._ignore_discussion_documents_rag,
@ -5145,13 +5212,7 @@ class PersonalityBuilder:
if id>len(self.config["personalities"]):
id = len(self.config["personalities"])-1
if ":" in self.config["personalities"][id]:
elements = self.config["personalities"][id].split(":")
personality_folder = elements[0]
personality_language = elements[1]
else:
personality_folder = self.config["personalities"][id]
personality_language = None
personality_folder = self.config["personalities"][id]
if len(self.config["personalities"][id].split("/"))==2:
self.personality = AIPersonality(
@ -5160,7 +5221,7 @@ class PersonalityBuilder:
self.config,
self.model,
app=self.app,
selected_language=personality_language,
selected_language=self.config.current_language,
installation_option=self.installation_option,
callback=self.callback
)
@ -5172,7 +5233,7 @@ class PersonalityBuilder:
self.model,
app=self.app,
is_relative_path=False,
selected_language=personality_language,
selected_language=self.config.current_language,
installation_option=self.installation_option,
callback=self.callback
)

View File

@ -61,6 +61,68 @@ def list_personalities(category:str):
ASCIIColors.error(f"No personalities found. Using default one {ex}")
return personalities
@router.get("/get_personality")
def get_personality():
ASCIIColors.yellow("Getting current personality")
personality = lollmsElfServer.personality
real_assets_path = lollmsElfServer.lollms_paths.personalities_zoo_path / personality.category / personality.name / 'assets'
assets_path = Path("personalities") / personality.category / personality.name / 'assets'
gif_logo_path = assets_path / 'logo.gif'
webp_logo_path = assets_path / 'logo.webp'
png_logo_path = assets_path / 'logo.png'
jpg_logo_path = assets_path / 'logo.jpg'
jpeg_logo_path = assets_path / 'logo.jpeg'
svg_logo_path = assets_path / 'logo.svg'
bmp_logo_path = assets_path / 'logo.bmp'
gif_logo_path_ = real_assets_path / 'logo.gif'
webp_logo_path_ = real_assets_path / 'logo.webp'
png_logo_path_ = real_assets_path / 'logo.png'
jpg_logo_path_ = real_assets_path / 'logo.jpg'
jpeg_logo_path_ = real_assets_path / 'logo.jpeg'
svg_logo_path_ = real_assets_path / 'logo.svg'
bmp_logo_path_ = real_assets_path / 'logo.bmp'
has_logo = png_logo_path.is_file() or gif_logo_path.is_file()
if gif_logo_path_.exists():
avatar = str(gif_logo_path).replace("\\","/")
elif webp_logo_path_.exists():
avatar = str(webp_logo_path).replace("\\","/")
elif png_logo_path_.exists():
avatar = str(png_logo_path).replace("\\","/")
elif jpg_logo_path_.exists():
avatar = str(jpg_logo_path).replace("\\","/")
elif jpeg_logo_path_.exists():
avatar = str(jpeg_logo_path).replace("\\","/")
elif svg_logo_path_.exists():
avatar = str(svg_logo_path).replace("\\","/")
elif bmp_logo_path_.exists():
avatar = str(bmp_logo_path).replace("\\","/")
else:
avatar = ""
personality = {
"folder":personality.personality_folder_name,
"has_scripts":personality.processor is not None,
"name":personality.name,
"description":personality.personality_description,
"disclaimer":personality.disclaimer,
"author":personality.author,
"language":personality.language,
"version":personality.version,
"creation_date":personality.creation_date,
"last_update_date":personality.last_update_date,
"installed":True,
"help":personality.help,
"commands":personality.commands,
"prompts_list":personality.prompts_list,
"avatar":avatar,
"has_logo":has_logo
}
return personality
@router.get("/get_all_personalities")
def get_all_personalities():
ASCIIColors.yellow("Listing all personalities")
@ -73,82 +135,142 @@ def get_all_personalities():
personalities[cat if category_folder!=lollmsElfServer.lollms_paths.custom_personalities_path else "custom_personalities"] = []
for personality_folder in category_folder.iterdir():
pers = personality_folder.stem
if personality_folder.is_dir() and not personality_folder.stem.startswith('.'):
personality_info = {"folder":personality_folder.stem}
config_path = personality_folder / 'config.yaml'
if not config_path.exists():
"""
if lollmsElfServer.personality.personality_folder_name==pers:
personality = lollmsElfServer.personality
real_assets_path = lollmsElfServer.lollms_paths.personalities_zoo_path / personality.category / personality.name / 'assets'
assets_path = Path("personalities") / personality.category / personality.name / 'assets'
gif_logo_path = assets_path / 'logo.gif'
webp_logo_path = assets_path / 'logo.webp'
png_logo_path = assets_path / 'logo.png'
jpg_logo_path = assets_path / 'logo.jpg'
jpeg_logo_path = assets_path / 'logo.jpeg'
svg_logo_path = assets_path / 'logo.svg'
bmp_logo_path = assets_path / 'logo.bmp'
gif_logo_path_ = real_assets_path / 'logo.gif'
webp_logo_path_ = real_assets_path / 'logo.webp'
png_logo_path_ = real_assets_path / 'logo.png'
jpg_logo_path_ = real_assets_path / 'logo.jpg'
jpeg_logo_path_ = real_assets_path / 'logo.jpeg'
svg_logo_path_ = real_assets_path / 'logo.svg'
bmp_logo_path_ = real_assets_path / 'logo.bmp'
has_logo = png_logo_path.is_file() or gif_logo_path.is_file()
if gif_logo_path_.exists():
avatar = str(gif_logo_path).replace("\\","/")
elif webp_logo_path_.exists():
avatar = str(webp_logo_path).replace("\\","/")
elif png_logo_path_.exists():
avatar = str(png_logo_path).replace("\\","/")
elif jpg_logo_path_.exists():
avatar = str(jpg_logo_path).replace("\\","/")
elif jpeg_logo_path_.exists():
avatar = str(jpeg_logo_path).replace("\\","/")
elif svg_logo_path_.exists():
avatar = str(svg_logo_path).replace("\\","/")
elif bmp_logo_path_.exists():
avatar = str(bmp_logo_path).replace("\\","/")
else:
avatar = ""
personality = {
"folder":personality.personality_folder_name,
"has_scripts":personality.processor is not None,
"name":personality.name,
"description":personality.personality_description,
"disclaimer":personality.disclaimer,
"author":personality.author,
"language":personality.language,
"version":personality.version,
"creation_date":personality.creation_date,
"last_update_date":personality.last_update_date,
"installed":True,
"help":personality.help,
"commands":personality.commands,
"prompts_list":personality.prompts_list,
"avatar":avatar,
"has_logo":has_logo
}
personalities[cat if category_folder!=lollmsElfServer.lollms_paths.custom_personalities_path else "custom_personalities"].append(personality)
else:
if personality_folder.is_dir() and not personality_folder.stem.startswith('.'):
personality_info = {"folder":personality_folder.stem}
config_path = personality_folder / 'config.yaml'
if not config_path.exists():
"""
try:
shutil.rmtree(str(config_path.parent))
ASCIIColors.warning(f"Deleted useless personality: {config_path.parent}")
except Exception as ex:
ASCIIColors.warning(f"Couldn't delete personality ({ex})")
"""
continue
try:
shutil.rmtree(str(config_path.parent))
ASCIIColors.warning(f"Deleted useless personality: {config_path.parent}")
except Exception as ex:
ASCIIColors.warning(f"Couldn't delete personality ({ex})")
"""
continue
try:
scripts_path = personality_folder / 'scripts'
personality_info['has_scripts'] = scripts_path.exists()
with open(config_path, "r", encoding="utf8") as config_file:
config_data = yaml.load(config_file, Loader=yaml.FullLoader)
personality_info['name'] = config_data.get('name',"No Name")
personality_info['description'] = config_data.get('personality_description',"")
personality_info['disclaimer'] = config_data.get('disclaimer',"")
personality_info['author'] = config_data.get('author', 'ParisNeo')
personality_info['version'] = config_data.get('version', '1.0.0')
personality_info['creation_date'] = config_data.get("creation_date",None)
personality_info['last_update_date'] = config_data.get("last_update_date",None)
personality_info['installed'] = (lollmsElfServer.lollms_paths.personal_configuration_path/f"personality_{personality_folder.stem}.yaml").exists() or personality_info['has_scripts']
personality_info['help'] = config_data.get('help', '')
personality_info['commands'] = config_data.get('commands', '')
personality_info['prompts_list'] = config_data.get('prompts_list', [])
languages_path = personality_folder/ 'languages'
scripts_path = personality_folder / 'scripts'
personality_info['has_scripts'] = scripts_path.exists()
with open(config_path, "r", encoding="utf8") as config_file:
config_data = yaml.load(config_file, Loader=yaml.FullLoader)
personality_info['name'] = config_data.get('name',"No Name")
personality_info['description'] = config_data.get('personality_description',"")
personality_info['disclaimer'] = config_data.get('disclaimer',"")
personality_info['author'] = config_data.get('author', 'ParisNeo')
personality_info['language'] = config_data.get('language', 'english')
personality_info['version'] = config_data.get('version', '1.0.0')
personality_info['creation_date'] = config_data.get("creation_date",None)
personality_info['last_update_date'] = config_data.get("last_update_date",None)
personality_info['installed'] = (lollmsElfServer.lollms_paths.personal_configuration_path/f"personality_{personality_folder.stem}.yaml").exists() or personality_info['has_scripts']
personality_info['help'] = config_data.get('help', '')
personality_info['commands'] = config_data.get('commands', '')
personality_info['prompts_list'] = config_data.get('prompts_list', [])
languages_path = personality_folder/ 'languages'
real_assets_path = personality_folder/ 'assets'
assets_path = Path("personalities") / cat / pers / 'assets'
gif_logo_path = assets_path / 'logo.gif'
webp_logo_path = assets_path / 'logo.webp'
png_logo_path = assets_path / 'logo.png'
jpg_logo_path = assets_path / 'logo.jpg'
jpeg_logo_path = assets_path / 'logo.jpeg'
svg_logo_path = assets_path / 'logo.svg'
bmp_logo_path = assets_path / 'logo.bmp'
real_assets_path = personality_folder/ 'assets'
assets_path = Path("personalities") / cat / pers / 'assets'
gif_logo_path = assets_path / 'logo.gif'
webp_logo_path = assets_path / 'logo.webp'
png_logo_path = assets_path / 'logo.png'
jpg_logo_path = assets_path / 'logo.jpg'
jpeg_logo_path = assets_path / 'logo.jpeg'
svg_logo_path = assets_path / 'logo.svg'
bmp_logo_path = assets_path / 'logo.bmp'
gif_logo_path_ = real_assets_path / 'logo.gif'
webp_logo_path_ = real_assets_path / 'logo.webp'
png_logo_path_ = real_assets_path / 'logo.png'
jpg_logo_path_ = real_assets_path / 'logo.jpg'
jpeg_logo_path_ = real_assets_path / 'logo.jpeg'
svg_logo_path_ = real_assets_path / 'logo.svg'
bmp_logo_path_ = real_assets_path / 'logo.bmp'
gif_logo_path_ = real_assets_path / 'logo.gif'
webp_logo_path_ = real_assets_path / 'logo.webp'
png_logo_path_ = real_assets_path / 'logo.png'
jpg_logo_path_ = real_assets_path / 'logo.jpg'
jpeg_logo_path_ = real_assets_path / 'logo.jpeg'
svg_logo_path_ = real_assets_path / 'logo.svg'
bmp_logo_path_ = real_assets_path / 'logo.bmp'
if languages_path.exists():
personality_info['languages']= [""]+[f.stem for f in languages_path.iterdir() if f.suffix==".yaml"]
else:
personality_info['languages']=None
if languages_path.exists():
personality_info['languages']= [""]+[f.stem for f in languages_path.iterdir() if f.suffix==".yaml"]
else:
personality_info['languages']=None
personality_info['has_logo'] = png_logo_path.is_file() or gif_logo_path.is_file()
personality_info['has_logo'] = png_logo_path.is_file() or gif_logo_path.is_file()
if gif_logo_path_.exists():
personality_info['avatar'] = str(gif_logo_path).replace("\\","/")
elif webp_logo_path_.exists():
personality_info['avatar'] = str(webp_logo_path).replace("\\","/")
elif png_logo_path_.exists():
personality_info['avatar'] = str(png_logo_path).replace("\\","/")
elif jpg_logo_path_.exists():
personality_info['avatar'] = str(jpg_logo_path).replace("\\","/")
elif jpeg_logo_path_.exists():
personality_info['avatar'] = str(jpeg_logo_path).replace("\\","/")
elif svg_logo_path_.exists():
personality_info['avatar'] = str(svg_logo_path).replace("\\","/")
elif bmp_logo_path_.exists():
personality_info['avatar'] = str(bmp_logo_path).replace("\\","/")
else:
personality_info['avatar'] = ""
personalities[cat if category_folder!=lollmsElfServer.lollms_paths.custom_personalities_path else "custom_personalities"].append(personality_info)
except Exception as ex:
ASCIIColors.warning(f"Couldn't load personality from {personality_folder} [{ex}]")
trace_exception(ex)
if gif_logo_path_.exists():
personality_info['avatar'] = str(gif_logo_path).replace("\\","/")
elif webp_logo_path_.exists():
personality_info['avatar'] = str(webp_logo_path).replace("\\","/")
elif png_logo_path_.exists():
personality_info['avatar'] = str(png_logo_path).replace("\\","/")
elif jpg_logo_path_.exists():
personality_info['avatar'] = str(jpg_logo_path).replace("\\","/")
elif jpeg_logo_path_.exists():
personality_info['avatar'] = str(jpeg_logo_path).replace("\\","/")
elif svg_logo_path_.exists():
personality_info['avatar'] = str(svg_logo_path).replace("\\","/")
elif bmp_logo_path_.exists():
personality_info['avatar'] = str(bmp_logo_path).replace("\\","/")
else:
personality_info['avatar'] = ""
personalities[cat if category_folder!=lollmsElfServer.lollms_paths.custom_personalities_path else "custom_personalities"].append(personality_info)
except Exception as ex:
ASCIIColors.warning(f"Couldn't load personality from {personality_folder} [{ex}]")
trace_exception(ex)
ASCIIColors.green("OK")
return personalities
@ -395,7 +517,6 @@ def mount_personality(data:PersonalityMountingInfos):
print("- Mounting personality")
category = sanitize_path(data.category)
name = sanitize_path(data.folder)
language = data.language #.get('language', None)
if category=="":
return {"status":False, "error":"category must not be empty."}
@ -407,8 +528,6 @@ def mount_personality(data:PersonalityMountingInfos):
config_file = package_full_path / "config.yaml"
if config_file.exists():
if language:
package_path += ":" + language
"""
if package_path in lollmsElfServer.config["personalities"]:
ASCIIColors.error("Can't mount exact same personality twice")
@ -513,7 +632,7 @@ def unmount_personality(data:PersonalityMountingInfos):
return {"status":False, "error":"category must not be empty."}
try:
personality_id = f"{category}/{name}" if language is None or language=="" else f"{category}/{name}:{language}"
personality_id = f"{category}/{name}" if language is None or language=="" else f"{category}/{name}"
index = lollmsElfServer.config["personalities"].index(personality_id)
lollmsElfServer.config["personalities"].remove(personality_id)
if lollmsElfServer.config["active_personality_id"]>=index:
@ -540,7 +659,7 @@ def unmount_personality(data:PersonalityMountingInfos):
except Exception as ex:
trace_exception(ex)
if language:
ASCIIColors.error(f"nok : Personality not found @ {category}/{name}:{language}")
ASCIIColors.error(f"nok : Personality not found @ {category}/{name}")
else:
ASCIIColors.error(f"nok : Personality not found @ {category}/{name}")

View File

@ -342,7 +342,7 @@ class MainMenu(Menu):
choice = self.show_menu(languages)
if 1 <= choice <= len(languages):
language = languages[choice - 1]
self.lollms_app.config["personalities"].append(f"{category}/{name}:{language}")
self.lollms_app.config["personalities"].append(f"{category}/{name}")
else:
print("Invalid choice!")
else: