{"repo": "beefailsoup-star/dismagent", "files": {"Services/AiService.cs": {"768bda5ee6991e5e298878ff6966b0d81ea214eb": {"t": 1785746214.7001839, "n": 3196, "h": "4552886eaa86c315", "c": "using System.Text;\nusing System.Text.Json;\nusing DismAgent.Models;\n\nnamespace DismAgent.Services;\n\npublic class AiService\n{\n readonly AppConfig _cfg;\n readonly HttpClient _http = new() { Timeout = TimeSpan.FromSeconds(30) };\n\n static readonly Dictionary Providers = new()\n {\n [\"ollama\"] = (\"\", \"\"),\n [\"kimi\"] = (\"https://api.moonshot.cn/v1\", \"moonshot-v1-8k\"),\n [\"glm\"] = (\"https://open.bigmodel.cn/api/paas/v4\", \"glm-4\"),\n [\"deepseek\"] = (\"https://api.deepseek.com/v1\", \"deepseek-chat\"),\n [\"doubao\"] = (\"https://ark.cn-beijing.volces.com/api/v3\", \"ep-xxxx\"),\n [\"mimo\"] = (\"https://api.mimo.com/v1\", \"mimo-chat\"),\n };\n\n public AiService(AppConfig c) => _cfg = c;\n\n public async Task Explain(string cmd)\n {\n var prompt = $\"You are a PowerShell expert. Explain this command in Traditional Chinese concisely:\\n\\nCommand: {cmd}\\n\\nExplanation:\";\n return _cfg.AiProvider == \"ollama\" ? await CallOllama(prompt) : await CallCloud(prompt);\n }\n\n async Task CallOllama(string p)\n {\n var ep = _cfg.OllamaEndpoint.TrimEnd('/');\n // Build JSON manually — no reflection\n var body = $\"{{\\\"model\\\":\\\"{JsonEscape(_cfg.OllamaModel)}\\\",\\\"prompt\\\":\\\"{JsonEscape(p)}\\\",\\\"stream\\\":false}}\";\n var r = await _http.PostAsync($\"{ep}/api/generate\",\n new StringContent(body, Encoding.UTF8, \"application/json\"));\n r.EnsureSuccessStatusCode();\n var text = await r.Content.ReadAsStringAsync();\n // JsonDocument.Parse is read-only, no reflection needed\n return JsonDocument.Parse(text).RootElement.GetProperty(\"response\").GetString() ?? \"\";\n }\n\n async Task CallCloud(string p)\n {\n if (!Providers.TryGetValue(_cfg.AiProvider, out var prov)) return $\"[ERROR] Unknown provider: {_cfg.AiProvider}\";\n var key = _cfg.AiProvider switch\n {\n \"kimi\" => _cfg.KimiApiKey, \"glm\" => _cfg.GlmApiKey, \"deepseek\" => _cfg.DeepSeekApiKey,\n \"doubao\" => _cfg.DoubaoApiKey, \"mimo\" => _cfg.MimoApiKey, _ => \"\"\n };\n if (string.IsNullOrEmpty(key)) return \"[ERROR] API key not set. Run: dismagent setup\";\n\n // Build JSON manually — no reflection\n var body = $\"{{\\\"model\\\":\\\"{JsonEscape(prov.Model)}\\\",\\\"messages\\\":[{{\\\"role\\\":\\\"user\\\",\\\"content\\\":\\\"{JsonEscape(p)}\\\"}}]}}\";\n var req = new HttpRequestMessage(HttpMethod.Post, $\"{prov.Endpoint}/chat/completions\")\n {\n Content = new StringContent(body, Encoding.UTF8, \"application/json\")\n };\n req.Headers.Add(\"Authorization\", $\"Bearer {key}\");\n var r = await _http.SendAsync(req);\n r.EnsureSuccessStatusCode();\n var text = await r.Content.ReadAsStringAsync();\n // JsonDocument.Parse is read-only, no reflection needed\n return JsonDocument.Parse(text).RootElement.GetProperty(\"choices\")[0].GetProperty(\"message\").GetProperty(\"content\").GetString() ?? \"\";\n }\n\n static string JsonEscape(string s) => s.Replace(\"\\\\\", \"\\\\\\\\\").Replace(\"\\\"\", \"\\\\\\\"\").Replace(\"\\n\", \"\\\\n\").Replace(\"\\r\", \"\\\\r\").Replace(\"\\t\", \"\\\\t\");\n}\n"}, "48003c8a50cc2116dbda19633859896c9cef28b2": {"t": 1785760665.387556, "n": 3196, "h": "4552886eaa86c315", "c": "using System.Text;\nusing System.Text.Json;\nusing DismAgent.Models;\n\nnamespace DismAgent.Services;\n\npublic class AiService\n{\n readonly AppConfig _cfg;\n readonly HttpClient _http = new() { Timeout = TimeSpan.FromSeconds(30) };\n\n static readonly Dictionary Providers = new()\n {\n [\"ollama\"] = (\"\", \"\"),\n [\"kimi\"] = (\"https://api.moonshot.cn/v1\", \"moonshot-v1-8k\"),\n [\"glm\"] = (\"https://open.bigmodel.cn/api/paas/v4\", \"glm-4\"),\n [\"deepseek\"] = (\"https://api.deepseek.com/v1\", \"deepseek-chat\"),\n [\"doubao\"] = (\"https://ark.cn-beijing.volces.com/api/v3\", \"ep-xxxx\"),\n [\"mimo\"] = (\"https://api.mimo.com/v1\", \"mimo-chat\"),\n };\n\n public AiService(AppConfig c) => _cfg = c;\n\n public async Task Explain(string cmd)\n {\n var prompt = $\"You are a PowerShell expert. Explain this command in Traditional Chinese concisely:\\n\\nCommand: {cmd}\\n\\nExplanation:\";\n return _cfg.AiProvider == \"ollama\" ? await CallOllama(prompt) : await CallCloud(prompt);\n }\n\n async Task CallOllama(string p)\n {\n var ep = _cfg.OllamaEndpoint.TrimEnd('/');\n // Build JSON manually — no reflection\n var body = $\"{{\\\"model\\\":\\\"{JsonEscape(_cfg.OllamaModel)}\\\",\\\"prompt\\\":\\\"{JsonEscape(p)}\\\",\\\"stream\\\":false}}\";\n var r = await _http.PostAsync($\"{ep}/api/generate\",\n new StringContent(body, Encoding.UTF8, \"application/json\"));\n r.EnsureSuccessStatusCode();\n var text = await r.Content.ReadAsStringAsync();\n // JsonDocument.Parse is read-only, no reflection needed\n return JsonDocument.Parse(text).RootElement.GetProperty(\"response\").GetString() ?? \"\";\n }\n\n async Task CallCloud(string p)\n {\n if (!Providers.TryGetValue(_cfg.AiProvider, out var prov)) return $\"[ERROR] Unknown provider: {_cfg.AiProvider}\";\n var key = _cfg.AiProvider switch\n {\n \"kimi\" => _cfg.KimiApiKey, \"glm\" => _cfg.GlmApiKey, \"deepseek\" => _cfg.DeepSeekApiKey,\n \"doubao\" => _cfg.DoubaoApiKey, \"mimo\" => _cfg.MimoApiKey, _ => \"\"\n };\n if (string.IsNullOrEmpty(key)) return \"[ERROR] API key not set. Run: dismagent setup\";\n\n // Build JSON manually — no reflection\n var body = $\"{{\\\"model\\\":\\\"{JsonEscape(prov.Model)}\\\",\\\"messages\\\":[{{\\\"role\\\":\\\"user\\\",\\\"content\\\":\\\"{JsonEscape(p)}\\\"}}]}}\";\n var req = new HttpRequestMessage(HttpMethod.Post, $\"{prov.Endpoint}/chat/completions\")\n {\n Content = new StringContent(body, Encoding.UTF8, \"application/json\")\n };\n req.Headers.Add(\"Authorization\", $\"Bearer {key}\");\n var r = await _http.SendAsync(req);\n r.EnsureSuccessStatusCode();\n var text = await r.Content.ReadAsStringAsync();\n // JsonDocument.Parse is read-only, no reflection needed\n return JsonDocument.Parse(text).RootElement.GetProperty(\"choices\")[0].GetProperty(\"message\").GetProperty(\"content\").GetString() ?? \"\";\n }\n\n static string JsonEscape(string s) => s.Replace(\"\\\\\", \"\\\\\\\\\").Replace(\"\\\"\", \"\\\\\\\"\").Replace(\"\\n\", \"\\\\n\").Replace(\"\\r\", \"\\\\r\").Replace(\"\\t\", \"\\\\t\");\n}\n"}}}}