diff --git a/scripts/update_ollama_models.py b/scripts/update_ollama_models.py new file mode 100755 index 00000000..66b26adf --- /dev/null +++ b/scripts/update_ollama_models.py @@ -0,0 +1,75 @@ + +import subprocess +import json +import os +import glob + +def get_models_from_modelfiles(): + models = set() + modelfiles = glob.glob("Modelfile.*") + for modelfile in modelfiles: + with open(modelfile, 'r') as f: + for line in f: + if line.strip().startswith("FROM"): + parts = line.strip().split() + if len(parts) > 1: + model_name = parts[1] + # Only consider models that are not local file paths + if not model_name.startswith('/') and not model_name.startswith('~') and not model_name.endswith('.gguf'): + models.add(model_name) + break # Only take the first FROM in each Modelfile + return sorted(list(models)) + +def update_ollama_model(model_name): + print(f"Checking for updates for model: {model_name}") + try: + # Run ollama pull command + process = subprocess.run( + ["ollama", "pull", model_name], + capture_output=True, + text=True, + check=True, + timeout=900 # 15 minutes + ) + output = process.stdout + print(f"Output for {model_name}:\n{output}") + + # Basic check to see if an update happened. + # Ollama pull output will contain "pulling" or "downloading" if an update is in progress + # and "success" if it completed. If the model is already up to date, it says "already up to date". + if "pulling" in output or "downloading" in output: + print(f"Model {model_name} was updated.") + return True + elif "already up to date" in output: + print(f"Model {model_name} is already up to date.") + return False + else: + print(f"Unexpected output for {model_name}, assuming no update: {output}") + return False + + except subprocess.CalledProcessError as e: + print(f"Error updating model {model_name}: {e}") + print(f"Stderr: {e.stderr}") + return False + except FileNotFoundError: + print("Error: 'ollama' command not found. Please ensure Ollama is installed and in your PATH.") + return False + +def main(): + models_to_update = get_models_from_modelfiles() + print(f"Identified models to check for updates: {models_to_update}") + + updated_models = [] + for model in models_to_update: + if update_ollama_model(model): + updated_models.append(model) + + if updated_models: + print("\nSuccessfully updated the following models:") + for model in updated_models: + print(f"- {model}") + else: + print("\nNo models were updated.") + +if __name__ == "__main__": + main()