import subprocess def check_model_exists(model_name): try: # List available models output = subprocess.check_output("ollama list", shell=True, stderr=subprocess.STDOUT, universal_newlines=True) available_models = [line.split()[0] for line in output.strip().split('\n')[1:]] return any(model_name in model for model in available_models) except subprocess.CalledProcessError as e: print(f"Error checking models: {e.output}") return False except Exception as e: print(f"An unexpected error occurred: {str(e)}") return False def download_model(model_name): remote_models=['llama3', 'llama3:70b', 'phi3', 'mistral', 'neural-chat', 'starling-lm', 'codellama', 'llama2-uncensored', 'llava', 'gemma:2b', 'gemma:7b', 'solar'] if model_name in remote_models: try: # Download the model print(f"Downloading model '{model_name}'...") subprocess.check_call(f"ollama pull {model_name}", shell=True) print(f"Model '{model_name}' downloaded successfully.") except subprocess.CalledProcessError as e: print(f"Error downloading model: {e.output}") raise e except Exception as e: print(f"An unexpected error occurred: {str(e)}") raise e else: print("Not supported model currently") def check_model(model_name): if not check_model_exists(model_name): try: download_model(model_name) except Exception as e: print(f"Failed to download model '{model_name}': {e}") return else: print("OK") def make_simple_prompt(input, messages): """ Create a simple prompt based on the input and messages. :param input: str, input message from the user :param messages: list, conversation history as a list of dictionaries containing 'role' and 'content' :return: str, generated prompt """ if len(messages) == 1: prompt = f'''You are a friendly AI companion. You should answer what the user request. user: {input}''' else: conversation_history = '\n'.join( f"{message['role']}: {message['content']}" for message in reversed(messages[:-1]) ) prompt = f'''You are a friendly AI companion. history: {conversation_history}. You should answer what the user request. user: {input}''' print(prompt) return prompt def make_prompt(input, messages, model): """ Create a prompt based on the input, messages, and model used. :param input: str, input message from the user :param messages: list, conversation history as a list of dictionaries containing 'role' and 'content' :param model: str, name of the model ("llama3", "mistral", or other) :return: str, generated prompt """ if model == "llama3": # Special Tokens used with Meta Llama 3 BEGIN_OF_TEXT = "<|begin_of_text|>" EOT_ID = "<|eot_id|>" START_HEADER_ID = "<|start_header_id|>" END_HEADER_ID = "<|end_header_id|>" elif model == "mistral": # Special tokens Mistral BEGIN_OF_TEXT = "" EOT_ID = "" START_HEADER_ID = "" # Not applicable to Mistral END_HEADER_ID = "" # Not applicable to Mistral else: # No Special tokens BEGIN_OF_TEXT = "" EOT_ID = "" START_HEADER_ID = "" END_HEADER_ID = "" if len(messages) == 1: prompt = f'''{BEGIN_OF_TEXT}{START_HEADER_ID}system{END_HEADER_ID} You are a friendly AI companion. {EOT_ID}{START_HEADER_ID}user{END_HEADER_ID} {input} {EOT_ID}''' else: conversation_history = '\n'.join( f"{START_HEADER_ID}{message['role']}{END_HEADER_ID}\n{message['content']}{EOT_ID}" for message in reversed(messages[:-1]) ) prompt = f'''{BEGIN_OF_TEXT}{START_HEADER_ID}system{END_HEADER_ID} You are a friendly AI companion. history: {conversation_history} {EOT_ID}{START_HEADER_ID}user{END_HEADER_ID} {input} {EOT_ID}''' print(prompt) return prompt