1 line
18 KiB
JSON
1 line
18 KiB
JSON
{"repo": "2760526773/ai-desktop-palisades", "files": {"Palisades.Application/Helpers/AiSettings.cs": {"af7984c2fbdc23326aac6183d7c6d33555f3ed08": {"t": 1785745808.5755727, "n": 8702, "h": "960a6d4ab8aa80b0", "c": "using System;\nusing System.Collections.Generic;\nusing System.IO;\nusing System.Linq;\nusing System.Text.Json;\n\nnamespace Palisades.Helpers\n{\n internal class AiSettings\n {\n public string Provider { get; set; } = \"openai\";\n public Dictionary<string, ProviderSettings> Providers { get; set; } = CreateDefaultProviders();\n\n public List<string> Extensions { get; set; } = new() { \".lnk\", \".url\", \".exe\", \".doc\", \".docx\", \".ppt\", \".pptx\", \".xls\", \".xlsx\", \".pdf\", \".txt\", \".md\", \".mp3\", \".wav\", \".flac\", \".mp4\", \".mkv\", \".avi\", \".zip\", \".7z\", \".rar\" };\n\n public static AiSettings Load()\n {\n string file = Path.Combine(PDirectory.GetAppDirectory(), \"ai-settings.json\");\n if (!File.Exists(file))\n {\n AiSettings settings = new();\n settings.Save();\n return settings;\n }\n\n try\n {\n string json = File.ReadAllText(file);\n AiSettings? loaded = JsonSerializer.Deserialize<AiSettings>(json, new JsonSerializerOptions { PropertyNameCaseInsensitive = true });\n if (loaded == null)\n {\n return new AiSettings();\n }\n\n loaded.Providers ??= new Dictionary<string, ProviderSettings>(StringComparer.OrdinalIgnoreCase);\n loaded.MergeMissingDefaultProviders();\n loaded.EnsureRecommendedModels();\n if (string.IsNullOrWhiteSpace(loaded.Provider) || !loaded.Providers.ContainsKey(loaded.Provider))\n {\n loaded.Provider = \"openai\";\n }\n return loaded;\n }\n catch\n {\n return new AiSettings();\n }\n }\n\n public void Save()\n {\n EnsureRecommendedModels();\n string dir = PDirectory.GetAppDirectory();\n PDirectory.EnsureExists(dir);\n string file = Path.Combine(dir, \"ai-settings.json\");\n File.WriteAllText(file, JsonSerializer.Serialize(this, new JsonSerializerOptions { WriteIndented = true }));\n }\n\n private void MergeMissingDefaultProviders()\n {\n foreach (var pair in CreateDefaultProviders())\n {\n if (!Providers.ContainsKey(pair.Key))\n {\n Providers[pair.Key] = pair.Value;\n }\n }\n }\n\n private void EnsureRecommendedModels()\n {\n Dictionary<string, ProviderSettings> defaults = CreateDefaultProviders();\n foreach (var pair in Providers)\n {\n pair.Value.RecommendedModels ??= new List<string>();\n if (defaults.TryGetValue(pair.Key, out ProviderSettings? @default))\n {\n foreach (string model in @default.RecommendedModels)\n {\n if (!pair.Value.RecommendedModels.Any(existing => string.Equals(existing, model, StringComparison.OrdinalIgnoreCase)))\n {\n pair.Value.RecommendedModels.Add(model);\n }\n }\n }\n\n if (!string.IsNullOrWhiteSpace(pair.Value.Model) && !pair.Value.RecommendedModels.Any(existing => string.Equals(existing, pair.Value.Model, StringComparison.OrdinalIgnoreCase)))\n {\n pair.Value.RecommendedModels.Insert(0, pair.Value.Model);\n }\n }\n }\n\n private static Dictionary<string, ProviderSettings> CreateDefaultProviders()\n {\n return new Dictionary<string, ProviderSettings>(StringComparer.OrdinalIgnoreCase)\n {\n [\"openai\"] = new ProviderSettings\n {\n Type = \"openai\",\n BaseUrl = \"https://api.openai.com/v1/chat/completions\",\n Model = \"gpt-4o-mini\",\n EnvKey = \"OPENAI_API_KEY\",\n RecommendedModels = new() { \"gpt-4o-mini\", \"gpt-4.1-mini\", \"gpt-4.1\", \"o4-mini\" }\n },\n [\"kimi\"] = new ProviderSettings\n {\n Type = \"openai\",\n BaseUrl = \"https://api.moonshot.cn/v1/chat/completions\",\n Model = \"kimi-latest\",\n EnvKey = \"KIMI_API_KEY\",\n RecommendedModels = new() { \"kimi-latest\", \"moonshot-v1-8k\", \"moonshot-v1-32k\", \"moonshot-v1-128k\" }\n },\n [\"doubao\"] = new ProviderSettings\n {\n Type = \"openai\",\n BaseUrl = \"https://ark.cn-beijing.volces.com/api/v3/chat/completions\",\n Model = \"doubao-pro-32k\",\n EnvKey = \"ARK_API_KEY\",\n RecommendedModels = new() { \"doubao-pro-32k\", \"doubao-lite-32k\", \"doubao-seed-1-6-thinking\" }\n },\n [\"deepseek\"] = new ProviderSettings\n {\n Type = \"openai\",\n BaseUrl = \"https://api.deepseek.com/chat/completions\",\n Model = \"deepseek-chat\",\n EnvKey = \"DEEPSEEK_API_KEY\",\n RecommendedModels = new() { \"deepseek-chat\", \"deepseek-reasoner\" }\n },\n [\"gemini\"] = new ProviderSettings\n {\n Type = \"gemini\",\n BaseUrl = \"https://generativelanguage.googleapis.com/v1beta/models\",\n Model = \"gemini-2.5-flash\",\n EnvKey = \"GEMINI_API_KEY\",\n RecommendedModels = new() { \"gemini-2.5-flash\", \"gemini-2.5-pro\", \"gemini-2.0-flash\" }\n },\n [\"qwen\"] = new ProviderSettings\n {\n Type = \"openai\",\n BaseUrl = \"https://dashscope.aliyuncs.com/compatible-mode/v1/chat/completions\",\n Model = \"qwen-plus\",\n EnvKey = \"DASHSCOPE_API_KEY\",\n RecommendedModels = new() { \"qwen-plus\", \"qwen-turbo\", \"qwen-max\", \"qwen-long\" }\n },\n [\"groq\"] = new ProviderSettings\n {\n Type = \"openai\",\n BaseUrl = \"https://api.groq.com/openai/v1/chat/completions\",\n Model = \"openai/gpt-oss-20b\",\n EnvKey = \"GROQ_API_KEY\",\n RecommendedModels = new() { \"openai/gpt-oss-20b\", \"llama-3.3-70b-versatile\", \"deepseek-r1-distill-llama-70b\" }\n },\n [\"grok\"] = new ProviderSettings\n {\n Type = \"openai\",\n BaseUrl = \"https://api.x.ai/v1/chat/completions\",\n Model = \"grok-3-fast\",\n EnvKey = \"XAI_API_KEY\",\n RecommendedModels = new() { \"grok-3-fast\", \"grok-3\", \"grok-3-mini\" }\n },\n [\"openrouter\"] = new ProviderSettings\n {\n Type = \"openai\",\n BaseUrl = \"https://openrouter.ai/api/v1/chat/completions\",\n Model = \"openai/gpt-4.1-mini\",\n EnvKey = \"OPENROUTER_API_KEY\",\n RecommendedModels = new() { \"openai/gpt-4.1-mini\", \"google/gemini-2.5-flash\", \"anthropic/claude-3.7-sonnet\", \"deepseek/deepseek-chat-v3-0324\" }\n },\n [\"mistral\"] = new ProviderSettings\n {\n Type = \"openai\",\n BaseUrl = \"https://api.mistral.ai/v1/chat/completions\",\n Model = \"mistral-small-latest\",\n EnvKey = \"MISTRAL_API_KEY\",\n RecommendedModels = new() { \"mistral-small-latest\", \"mistral-medium-latest\", \"pixtral-large-latest\" }\n },\n [\"custom\"] = new ProviderSettings\n {\n Type = \"openai\",\n BaseUrl = \"https://api.openai.com/v1/chat/completions\",\n Model = \"gpt-4o-mini\",\n EnvKey = \"OPENAI_API_KEY\",\n RecommendedModels = new() { \"gpt-4o-mini\" }\n },\n };\n }\n }\n\n internal class ProviderSettings\n {\n public string Type { get; set; } = \"openai\";\n public string BaseUrl { get; set; } = string.Empty;\n public string Model { get; set; } = string.Empty;\n public string EnvKey { get; set; } = string.Empty;\n public string ApiKey { get; set; } = string.Empty;\n public List<string> RecommendedModels { get; set; } = new();\n }\n}\n\n\n\n"}, "987f1df0bc4504cd22c95b96932bdb0f2bfa5aa3": {"t": 1785756740.3260431, "n": 8702, "h": "960a6d4ab8aa80b0", "c": "using System;\nusing System.Collections.Generic;\nusing System.IO;\nusing System.Linq;\nusing System.Text.Json;\n\nnamespace Palisades.Helpers\n{\n internal class AiSettings\n {\n public string Provider { get; set; } = \"openai\";\n public Dictionary<string, ProviderSettings> Providers { get; set; } = CreateDefaultProviders();\n\n public List<string> Extensions { get; set; } = new() { \".lnk\", \".url\", \".exe\", \".doc\", \".docx\", \".ppt\", \".pptx\", \".xls\", \".xlsx\", \".pdf\", \".txt\", \".md\", \".mp3\", \".wav\", \".flac\", \".mp4\", \".mkv\", \".avi\", \".zip\", \".7z\", \".rar\" };\n\n public static AiSettings Load()\n {\n string file = Path.Combine(PDirectory.GetAppDirectory(), \"ai-settings.json\");\n if (!File.Exists(file))\n {\n AiSettings settings = new();\n settings.Save();\n return settings;\n }\n\n try\n {\n string json = File.ReadAllText(file);\n AiSettings? loaded = JsonSerializer.Deserialize<AiSettings>(json, new JsonSerializerOptions { PropertyNameCaseInsensitive = true });\n if (loaded == null)\n {\n return new AiSettings();\n }\n\n loaded.Providers ??= new Dictionary<string, ProviderSettings>(StringComparer.OrdinalIgnoreCase);\n loaded.MergeMissingDefaultProviders();\n loaded.EnsureRecommendedModels();\n if (string.IsNullOrWhiteSpace(loaded.Provider) || !loaded.Providers.ContainsKey(loaded.Provider))\n {\n loaded.Provider = \"openai\";\n }\n return loaded;\n }\n catch\n {\n return new AiSettings();\n }\n }\n\n public void Save()\n {\n EnsureRecommendedModels();\n string dir = PDirectory.GetAppDirectory();\n PDirectory.EnsureExists(dir);\n string file = Path.Combine(dir, \"ai-settings.json\");\n File.WriteAllText(file, JsonSerializer.Serialize(this, new JsonSerializerOptions { WriteIndented = true }));\n }\n\n private void MergeMissingDefaultProviders()\n {\n foreach (var pair in CreateDefaultProviders())\n {\n if (!Providers.ContainsKey(pair.Key))\n {\n Providers[pair.Key] = pair.Value;\n }\n }\n }\n\n private void EnsureRecommendedModels()\n {\n Dictionary<string, ProviderSettings> defaults = CreateDefaultProviders();\n foreach (var pair in Providers)\n {\n pair.Value.RecommendedModels ??= new List<string>();\n if (defaults.TryGetValue(pair.Key, out ProviderSettings? @default))\n {\n foreach (string model in @default.RecommendedModels)\n {\n if (!pair.Value.RecommendedModels.Any(existing => string.Equals(existing, model, StringComparison.OrdinalIgnoreCase)))\n {\n pair.Value.RecommendedModels.Add(model);\n }\n }\n }\n\n if (!string.IsNullOrWhiteSpace(pair.Value.Model) && !pair.Value.RecommendedModels.Any(existing => string.Equals(existing, pair.Value.Model, StringComparison.OrdinalIgnoreCase)))\n {\n pair.Value.RecommendedModels.Insert(0, pair.Value.Model);\n }\n }\n }\n\n private static Dictionary<string, ProviderSettings> CreateDefaultProviders()\n {\n return new Dictionary<string, ProviderSettings>(StringComparer.OrdinalIgnoreCase)\n {\n [\"openai\"] = new ProviderSettings\n {\n Type = \"openai\",\n BaseUrl = \"https://api.openai.com/v1/chat/completions\",\n Model = \"gpt-4o-mini\",\n EnvKey = \"OPENAI_API_KEY\",\n RecommendedModels = new() { \"gpt-4o-mini\", \"gpt-4.1-mini\", \"gpt-4.1\", \"o4-mini\" }\n },\n [\"kimi\"] = new ProviderSettings\n {\n Type = \"openai\",\n BaseUrl = \"https://api.moonshot.cn/v1/chat/completions\",\n Model = \"kimi-latest\",\n EnvKey = \"KIMI_API_KEY\",\n RecommendedModels = new() { \"kimi-latest\", \"moonshot-v1-8k\", \"moonshot-v1-32k\", \"moonshot-v1-128k\" }\n },\n [\"doubao\"] = new ProviderSettings\n {\n Type = \"openai\",\n BaseUrl = \"https://ark.cn-beijing.volces.com/api/v3/chat/completions\",\n Model = \"doubao-pro-32k\",\n EnvKey = \"ARK_API_KEY\",\n RecommendedModels = new() { \"doubao-pro-32k\", \"doubao-lite-32k\", \"doubao-seed-1-6-thinking\" }\n },\n [\"deepseek\"] = new ProviderSettings\n {\n Type = \"openai\",\n BaseUrl = \"https://api.deepseek.com/chat/completions\",\n Model = \"deepseek-chat\",\n EnvKey = \"DEEPSEEK_API_KEY\",\n RecommendedModels = new() { \"deepseek-chat\", \"deepseek-reasoner\" }\n },\n [\"gemini\"] = new ProviderSettings\n {\n Type = \"gemini\",\n BaseUrl = \"https://generativelanguage.googleapis.com/v1beta/models\",\n Model = \"gemini-2.5-flash\",\n EnvKey = \"GEMINI_API_KEY\",\n RecommendedModels = new() { \"gemini-2.5-flash\", \"gemini-2.5-pro\", \"gemini-2.0-flash\" }\n },\n [\"qwen\"] = new ProviderSettings\n {\n Type = \"openai\",\n BaseUrl = \"https://dashscope.aliyuncs.com/compatible-mode/v1/chat/completions\",\n Model = \"qwen-plus\",\n EnvKey = \"DASHSCOPE_API_KEY\",\n RecommendedModels = new() { \"qwen-plus\", \"qwen-turbo\", \"qwen-max\", \"qwen-long\" }\n },\n [\"groq\"] = new ProviderSettings\n {\n Type = \"openai\",\n BaseUrl = \"https://api.groq.com/openai/v1/chat/completions\",\n Model = \"openai/gpt-oss-20b\",\n EnvKey = \"GROQ_API_KEY\",\n RecommendedModels = new() { \"openai/gpt-oss-20b\", \"llama-3.3-70b-versatile\", \"deepseek-r1-distill-llama-70b\" }\n },\n [\"grok\"] = new ProviderSettings\n {\n Type = \"openai\",\n BaseUrl = \"https://api.x.ai/v1/chat/completions\",\n Model = \"grok-3-fast\",\n EnvKey = \"XAI_API_KEY\",\n RecommendedModels = new() { \"grok-3-fast\", \"grok-3\", \"grok-3-mini\" }\n },\n [\"openrouter\"] = new ProviderSettings\n {\n Type = \"openai\",\n BaseUrl = \"https://openrouter.ai/api/v1/chat/completions\",\n Model = \"openai/gpt-4.1-mini\",\n EnvKey = \"OPENROUTER_API_KEY\",\n RecommendedModels = new() { \"openai/gpt-4.1-mini\", \"google/gemini-2.5-flash\", \"anthropic/claude-3.7-sonnet\", \"deepseek/deepseek-chat-v3-0324\" }\n },\n [\"mistral\"] = new ProviderSettings\n {\n Type = \"openai\",\n BaseUrl = \"https://api.mistral.ai/v1/chat/completions\",\n Model = \"mistral-small-latest\",\n EnvKey = \"MISTRAL_API_KEY\",\n RecommendedModels = new() { \"mistral-small-latest\", \"mistral-medium-latest\", \"pixtral-large-latest\" }\n },\n [\"custom\"] = new ProviderSettings\n {\n Type = \"openai\",\n BaseUrl = \"https://api.openai.com/v1/chat/completions\",\n Model = \"gpt-4o-mini\",\n EnvKey = \"OPENAI_API_KEY\",\n RecommendedModels = new() { \"gpt-4o-mini\" }\n },\n };\n }\n }\n\n internal class ProviderSettings\n {\n public string Type { get; set; } = \"openai\";\n public string BaseUrl { get; set; } = string.Empty;\n public string Model { get; set; } = string.Empty;\n public string EnvKey { get; set; } = string.Empty;\n public string ApiKey { get; set; } = string.Empty;\n public List<string> RecommendedModels { get; set; } = new();\n }\n}\n\n\n\n"}}}} |