diff --git a/lollms/personality.py b/lollms/personality.py index ce8b093..0661dc1 100644 --- a/lollms/personality.py +++ b/lollms/personality.py @@ -24,7 +24,7 @@ import shutil import subprocess import yaml from ascii_colors import ASCIIColors - +import time from lollms.types import MSG_TYPE from typing import Callable import json @@ -32,6 +32,8 @@ from safe_store import TextVectorizer, GenericDataLoader, VisualizationMethod, V from functools import partial from typing import Dict, Any +from lollms.helpers import get_trace_exception + def is_package_installed(package_name): try: dist = pkg_resources.get_distribution(package_name) @@ -179,6 +181,9 @@ Date: {{date}} # Open and store the personality self.load_personality() + self.personality_output_folder = lollms_paths.personal_outputs_path/self.name + self.personality_output_folder.mkdir(parents=True, exist_ok=True) + def print_prompt(self, title, prompt): ASCIIColors.red("*-*-*-*-*-*-*-* ", end="") @@ -219,10 +224,13 @@ Date: {{date}} self.model.config.ctx_size - max_generation_size, sacrifice ) + ntk = len(self.model.tokenize(prompt)) + max_generation_size = min(self.model.config.ctx_size - ntk, max_generation_size) + gen = self.generate(prompt, max_generation_size, callback=callback).strip().replace("", "").replace("", "") if debug: - self.print_prompt("prompt", prompt) - - return self.generate(prompt, max_generation_size, callback=callback).strip().replace("", "").replace("", "") + self.print_prompt("prompt", prompt+gen) + + return gen def remove_text_from_string(self, string, text_to_find): """ @@ -1576,13 +1584,54 @@ class APScript(StateMachine): if callback: callback(full_text, MSG_TYPE.MSG_TYPE_FULL_INVISIBLE_TO_USER) + + + + def execute_python(self, code): + def spawn_process(code): + """Executes Python code and returns the output as JSON.""" + # Create a temporary file. + root_folder = self.personality.personality_output_folder + root_folder.mkdir(parents=True,exist_ok=True) + tmp_file = root_folder/f"ai_code.py" + with open(tmp_file,"w") as f: + f.write(code) + + try: + # Execute the Python code in a temporary file. + process = subprocess.Popen( + ["python", str(tmp_file)], + stdout=subprocess.PIPE, + stderr=subprocess.PIPE, + cwd=root_folder + ) + + # Get the output and error from the process. + output, error = process.communicate() + except Exception as ex: + error_message = f"Error executing Python code: {ex}" + raise Exception(error_message) + + # Check if the process was successful. + if process.returncode != 0: + # The child process threw an exception. + error_message = f"Error executing Python code: {error.decode('utf8')}" + raise Exception(error_message) + + # The child process was successful. + return output.decode("utf8") + return spawn_process(code) + def build_python_code(self, prompt, max_title_length=4096): if not PackageManager.check_package_installed("autopep8"): PackageManager.install_package("autopep8") import autopep8 - global_prompt = f"{prompt}\n##>Code Builder:```python\n" - code = self.fast_gen(global_prompt,max_title_length) - code = code.rstrip("`") # Remove trailing backticks + global_prompt = f"{prompt}\n!@>Code Builder:```python\n" + code = self.fast_gen(global_prompt, max_title_length) + back_quote_index = code.index("```") # Remove trailing backticks + if back_quote_index>=0: + # Removing any extra text + code = code[:back_quote_index] formatted_code = autopep8.fix_code(code) # Fix indentation errors return formatted_code