using System; using System.Collections.Generic; using System.Net.Http; using System.Net.Http.Json; using System.Text.Json; using System.Threading.Tasks; using System.Text.Json.Serialization; using System.Linq; namespace finder2e_foundry_converter.Services { public class OllamaService : ILlmService { private readonly HttpClient _httpClient = new HttpClient(); public async Task> GetModelsAsync(string baseUrl) { try { var response = await _httpClient.GetFromJsonAsync($"{baseUrl.TrimEnd('/')}/api/tags"); if (response?.Models == null) return new List(); return response.Models.Select(m => m.Name).ToList(); } catch { return new List { "Error: Ollama not found" }; } } public async Task GenerateResponseAsync(string baseUrl, string model, string text, List imagePaths) { try { var images = new List(); foreach (var path in imagePaths) { if (string.IsNullOrWhiteSpace(path)) continue; var bytes = await System.IO.File.ReadAllBytesAsync(path); images.Add(Convert.ToBase64String(bytes)); } var requestBody = new { model = model, messages = new[] { new { role = "user", content = text, images = images.Count > 0 ? images.ToArray() : null } }, stream = false }; var response = await _httpClient.PostAsJsonAsync($"{baseUrl.TrimEnd('/')}/api/chat", requestBody); var body = await response.Content.ReadAsStringAsync(); using var doc = JsonDocument.Parse(body); if (doc.RootElement.TryGetProperty("error", out var error)) { return $"Error: {error.GetString()}"; } if (doc.RootElement.TryGetProperty("message", out var message)) { return message.GetProperty("content").GetString() ?? "No content returned"; } return "No response returned."; } catch (Exception ex) { return $"Error: {ex.Message}"; } } public async Task AskAsync(string baseUrl, string model, string prompt, List imagePaths) { // Reuse GenerateResponseAsync semantics for single-shot prompts return await GenerateResponseAsync(baseUrl, model, prompt, imagePaths); } private class OllamaModelsResponse { [JsonPropertyName("models")] public List? Models { get; set; } } private class OllamaModelData { [JsonPropertyName("name")] public string Name { get; set; } = string.Empty; } } }