|
import subprocess |
|
def check_model_exists(model_name): |
|
try: |
|
|
|
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: |
|
|
|
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": |
|
|
|
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": |
|
|
|
BEGIN_OF_TEXT = "<s>" |
|
EOT_ID = "</s>" |
|
START_HEADER_ID = "" |
|
END_HEADER_ID = "" |
|
else: |
|
|
|
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 |
|
|