using CodeBase.Models; using OpenAI; using OpenAI.Chat; using System; using System.ClientModel; using System.Threading.Tasks; public class LlmService { private readonly ChatClient _chatClient; private readonly LlmPromptBuilder _builder; public LlmService(LlmPromptBuilder llmPromptBuilder) { // 1. Указываем адрес Ollama (обязательно с /v1 на конце для совместимости с OpenAI) var options = new OpenAIClientOptions { Endpoint = new Uri("http://localhost:11434/v1") }; // 2. Ключ не нужен, но пакет просит хоть какую-то строку var credential = new ApiKeyCredential("ollama"); // 3. ВАЖНО: Имя модели должно ТОЧНО совпадать с тем, что ты скачала в Ollama. // Например, "llama3", "llama3.1", "qwen2.5-coder" или "phi3". string modelName = "qwen2.5-coder:7b"; _chatClient = new ChatClient(modelName, credential, options); _builder = llmPromptBuilder; } public async Task AskQuestionAsync(string userQuestion, List foundChunks) { try { var finalPrompt = _builder.BuildPrompt(userQuestion, foundChunks); // Формируем сообщение. Поскольку мы уже зашили роль и инструкции // внутрь finalPrompt с помощью LlmPromptBuilder, // передаем все это как UserMessage. var messages = new ChatMessage[] { new UserChatMessage(finalPrompt) }; // Отправляем запрос (настройки опциональны) var completionOptions = new ChatCompletionOptions { Temperature = 0.2f, // Делаем ответы менее креативными и более точными }; ChatCompletion completion = await _chatClient.CompleteChatAsync(messages, completionOptions); // Возвращаем сгенерированный текст return completion.Content[0].Text; } catch (Exception ex) { return $"[-] Ошибка при обращении к LLM: {ex.Message}"; } } }