using Spectre.Console; namespace LLama.Examples; internal static class UserSettings { private static readonly string SettingsModelPath = Path.Join(AppContext.BaseDirectory, "DefaultModel.env"); private static readonly string SettingsMMprojPath = Path.Join(AppContext.BaseDirectory, "DefaultMMProj.env"); private static readonly string SettingsImagePath = Path.Join(AppContext.BaseDirectory, "DefaultImage.env"); private static string? ReadDefaultPath(string file) { if (!File.Exists(file)) return null; string path = File.ReadAllText(file).Trim(); if (!File.Exists(path)) return null; return path; } private static void WriteDefaultPath(string settings, string path) { File.WriteAllText(settings, path); } public static string GetModelPath(bool alwaysPrompt = false) { var defaultPath = ReadDefaultPath(SettingsModelPath); var path = defaultPath is null || alwaysPrompt ? PromptUserForPath() : PromptUserForPathWithDefault(defaultPath); if (File.Exists(path)) WriteDefaultPath(SettingsModelPath, path); return path; } // TODO: Refactorize public static string GetMMProjPath(bool alwaysPrompt = false) { var defaultPath = ReadDefaultPath(SettingsMMprojPath); var path = defaultPath is null || alwaysPrompt ? PromptUserForPath("MMProj") : PromptUserForPathWithDefault(defaultPath, "MMProj"); if (File.Exists(path)) WriteDefaultPath(SettingsMMprojPath, path); return path; } // TODO: Refactorize public static string GetImagePath(bool alwaysPrompt = false) { var defaultPath = ReadDefaultPath(SettingsImagePath); var path = defaultPath is null || alwaysPrompt ? PromptUserForPath("image") : PromptUserForPathWithDefault(defaultPath, "image"); if (File.Exists(path)) WriteDefaultPath(SettingsImagePath, path); return path; } private static string PromptUserForPath(string text = "model") { return AnsiConsole.Prompt( new TextPrompt(string.Format("Please input your {0} path:", text) ) .PromptStyle("white") .Validate(File.Exists, string.Format("[red]ERROR: invalid {0} file path - file does not exist[/]", text) ) ); } private static string PromptUserForPathWithDefault(string defaultPath, string text = "model") { return AnsiConsole.Prompt( new TextPrompt(string.Format("Please input your {0} path (or ENTER for default):", text) ) .DefaultValue(defaultPath) .PromptStyle("white") .Validate(File.Exists, string.Format("[red]ERROR: invalid {0} file path - file does not exist[/]", text)) ); } }