using Newtonsoft.Json; using PaperlessAI.Models; using PaperlessAI.Models.LMStudio; namespace PaperlessAI.Services; public class LLMAgentService(ApiService apiService, Configuration config, ILogger logger) { public async Task ProcessDocumentWithAI(PaperlessDocument docToProcess) { // Prompt var prompt = config.Prompt.Replace("{document_id}", docToProcess.DocumentId.ToString()); // Request var content = new LmStudioChatRequest() { Model = config.Model, Input = prompt, Integrations = config.IntegrationsList, SystemPrompt = config.SystemPrompt, ContextLength = config.ContextLength, MaxOutputTokens = config.max_output_tokens, Temperature = config.Temperature, TopP = config.TopP, Reasoning = config.Reasoning }; var response = await apiService.Post("chat", content); // Response var contentMessage = await response.Content.ReadAsStringAsync(); logger.LogDebug(contentMessage); var chatResponseJson = JsonConvert.DeserializeObject(contentMessage); var messages = chatResponseJson?.GetOutputsByResponseType("message"); if(messages?.Count > 1) { logger.LogError($"To many messages received! Count: {messages?.Count}"); messages?.ForEach(x => logger.LogError(x.ToString())); return null; } if(messages?.Count == 0) { logger.LogError($"No messages received!"); return null; } var message = messages!.FirstOrDefault(); var llmResponse = JsonConvert.DeserializeObject(message!.Content ?? string.Empty); logger.LogInformation(llmResponse?.ToString()); return llmResponse; } internal async Task UnloadModel() { var content = new LmStudioUnloadModel() { InstanceId = config.Model }; var response = await apiService.Post("models/unload", content); var message = await response.Content.ReadAsStringAsync(); logger.LogInformation(message); } }