You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
84 lines
3.4 KiB
84 lines
3.4 KiB
import os
|
|
import platform
|
|
import subprocess
|
|
import time
|
|
import wget
|
|
import stat
|
|
|
|
class Llm:
|
|
def __init__(self, config):
|
|
|
|
self.interpreter = config["interpreter"]
|
|
config.pop("interpreter", None)
|
|
|
|
self.install(config["service_directory"])
|
|
|
|
config.pop("service_directory", None)
|
|
for key, value in config.items():
|
|
setattr(self.interpreter, key.replace("-", "_"), value)
|
|
|
|
self.llm = self.interpreter.llm.completions
|
|
|
|
def install(self, service_directory):
|
|
|
|
if platform.system() == "Darwin": # Check if the system is MacOS
|
|
result = subprocess.run(
|
|
["xcode-select", "-p"], stdout=subprocess.PIPE, stderr=subprocess.STDOUT
|
|
)
|
|
if result.returncode != 0:
|
|
print(
|
|
"Llamafile requires Mac users to have Xcode installed. You can install Xcode from https://developer.apple.com/xcode/ .\n\nAlternatively, you can use `LM Studio`, `Jan.ai`, or `Ollama` to manage local language models. Learn more at https://docs.openinterpreter.com/guides/running-locally ."
|
|
)
|
|
time.sleep(3)
|
|
raise Exception("Xcode is not installed. Please install Xcode and try again.")
|
|
|
|
# Define the path to the models directory
|
|
models_dir = os.path.join(service_directory, "models")
|
|
|
|
# Check and create the models directory if it doesn't exist
|
|
if not os.path.exists(models_dir):
|
|
os.makedirs(models_dir)
|
|
|
|
# Define the path to the new llamafile
|
|
llamafile_path = os.path.join(models_dir, "phi-2.Q4_K_M.llamafile")
|
|
|
|
# Check if the new llamafile exists, if not download it
|
|
if not os.path.exists(llamafile_path):
|
|
print(
|
|
"Attempting to download the `Phi-2` language model. This may take a few minutes."
|
|
)
|
|
time.sleep(3)
|
|
|
|
url = "https://huggingface.co/jartine/phi-2-llamafile/resolve/main/phi-2.Q4_K_M.llamafile"
|
|
wget.download(url, llamafile_path)
|
|
|
|
|
|
|
|
# Make the new llamafile executable
|
|
if platform.system() != "Windows":
|
|
st = os.stat(llamafile_path)
|
|
os.chmod(llamafile_path, st.st_mode | stat.S_IEXEC)
|
|
|
|
# Run the new llamafile in the background
|
|
if os.path.exists(llamafile_path):
|
|
try:
|
|
# Test if the llamafile is executable
|
|
subprocess.check_call([llamafile_path])
|
|
except subprocess.CalledProcessError:
|
|
print("The llamafile is not executable. Please check the file permissions.")
|
|
raise
|
|
subprocess.Popen([llamafile_path, "-ngl", "9999"])
|
|
else:
|
|
error_message = "The llamafile does not exist or is corrupted. Please ensure it has been downloaded correctly or try again."
|
|
print(error_message)
|
|
print(error_message)
|
|
|
|
self.interpreter.system_message = "You are Open Interpreter, a world-class programmer that can execute code on the user's machine."
|
|
self.interpreter.offline = True
|
|
|
|
self.interpreter.llm.model = "local"
|
|
self.interpreter.llm.temperature = 0
|
|
self.interpreter.llm.api_base = "https://localhost:8080/v1"
|
|
self.interpreter.llm.max_tokens = 1000
|
|
self.interpreter.llm.context_window = 3000
|
|
self.interpreter.llm.supports_functions = False |