From ecc518701cf167de0b6760090ebb40051da88a13 Mon Sep 17 00:00:00 2001 From: Leonid Pershin Date: Wed, 15 Oct 2025 20:32:27 +0300 Subject: [PATCH] add comment --- ChatBot/Models/Configuration/AppSettings.cs | 14 ++ .../Configuration/OpenRouterSettings.cs | 30 ++++ .../Models/Configuration/SerilogSettings.cs | 38 +++++ .../Configuration/TelegramBotSettings.cs | 6 + .../Validators/ConfigurationValidator.cs | 138 +++++++++++++++--- 5 files changed, 203 insertions(+), 23 deletions(-) diff --git a/ChatBot/Models/Configuration/AppSettings.cs b/ChatBot/Models/Configuration/AppSettings.cs index a0c3e08..1511e5f 100644 --- a/ChatBot/Models/Configuration/AppSettings.cs +++ b/ChatBot/Models/Configuration/AppSettings.cs @@ -1,9 +1,23 @@ namespace ChatBot.Models.Configuration { + /// + /// Основные настройки приложения + /// public class AppSettings { + /// + /// Настройки Telegram бота + /// public TelegramBotSettings TelegramBot { get; set; } = new(); + + /// + /// Настройки OpenRouter API + /// public OpenRouterSettings OpenRouter { get; set; } = new(); + + /// + /// Настройки логирования Serilog + /// public SerilogSettings Serilog { get; set; } = new(); } } diff --git a/ChatBot/Models/Configuration/OpenRouterSettings.cs b/ChatBot/Models/Configuration/OpenRouterSettings.cs index caf9598..74323fb 100644 --- a/ChatBot/Models/Configuration/OpenRouterSettings.cs +++ b/ChatBot/Models/Configuration/OpenRouterSettings.cs @@ -1,13 +1,43 @@ namespace ChatBot.Models.Configuration { + /// + /// Настройки OpenRouter API + /// public class OpenRouterSettings { + /// + /// API токен для аутентификации в OpenRouter + /// public string Token { get; set; } = string.Empty; + + /// + /// URL эндпоинта OpenRouter API + /// public string Url { get; set; } = string.Empty; + + /// + /// Список доступных моделей ИИ + /// public List AvailableModels { get; set; } = new(); + + /// + /// Модель по умолчанию для генерации ответов + /// public string DefaultModel { get; set; } = string.Empty; + + /// + /// Максимальное количество повторных попыток при ошибках + /// public int MaxRetries { get; set; } = 3; + + /// + /// Максимальное количество токенов в ответе + /// public int MaxTokens { get; set; } = 1000; + + /// + /// Температура генерации (креативность ответов от 0.0 до 2.0) + /// public double Temperature { get; set; } = 0.7; } } diff --git a/ChatBot/Models/Configuration/SerilogSettings.cs b/ChatBot/Models/Configuration/SerilogSettings.cs index 036f77f..a57b062 100644 --- a/ChatBot/Models/Configuration/SerilogSettings.cs +++ b/ChatBot/Models/Configuration/SerilogSettings.cs @@ -1,22 +1,60 @@ namespace ChatBot.Models.Configuration { + /// + /// Настройки логирования Serilog + /// public class SerilogSettings { + /// + /// Список используемых sink'ов для логирования + /// public List Using { get; set; } = new(); + + /// + /// Настройки минимального уровня логирования + /// public MinimumLevelSettings MinimumLevel { get; set; } = new(); + + /// + /// Настройки получателей логов (куда писать логи) + /// public List WriteTo { get; set; } = new(); + + /// + /// Список обогатителей логов (дополнительная информация) + /// public List Enrich { get; set; } = new(); } + /// + /// Настройки минимального уровня логирования + /// public class MinimumLevelSettings { + /// + /// Уровень логирования по умолчанию + /// public string Default { get; set; } = "Information"; + + /// + /// Переопределения уровня логирования для конкретных пространств имен + /// public Dictionary Override { get; set; } = new(); } + /// + /// Настройки получателя логов + /// public class WriteToSettings { + /// + /// Название sink'а для записи логов + /// public string Name { get; set; } = string.Empty; + + /// + /// Аргументы для настройки sink'а + /// public Dictionary Args { get; set; } = new(); } } diff --git a/ChatBot/Models/Configuration/TelegramBotSettings.cs b/ChatBot/Models/Configuration/TelegramBotSettings.cs index 05080cf..ba083e9 100644 --- a/ChatBot/Models/Configuration/TelegramBotSettings.cs +++ b/ChatBot/Models/Configuration/TelegramBotSettings.cs @@ -1,7 +1,13 @@ namespace ChatBot.Models.Configuration { + /// + /// Настройки Telegram бота + /// public class TelegramBotSettings { + /// + /// Токен бота для работы с Telegram API + /// public string BotToken { get; set; } = string.Empty; } } diff --git a/ChatBot/Models/Configuration/Validators/ConfigurationValidator.cs b/ChatBot/Models/Configuration/Validators/ConfigurationValidator.cs index d824d76..0f99c2f 100644 --- a/ChatBot/Models/Configuration/Validators/ConfigurationValidator.cs +++ b/ChatBot/Models/Configuration/Validators/ConfigurationValidator.cs @@ -2,31 +2,46 @@ using ChatBot.Models.Configuration; namespace ChatBot.Models.Configuration.Validators { + /// + /// Валидатор конфигурации приложения + /// public static class ConfigurationValidator { + /// + /// Валидирует все настройки приложения + /// + /// Настройки приложения + /// Результат валидации public static ValidationResult ValidateAppSettings(AppSettings settings) { var errors = new List(); - // Валидация TelegramBot + // Валидация настроек Telegram бота var telegramResult = ValidateTelegramBotSettings(settings.TelegramBot); errors.AddRange(telegramResult.Errors); - // Валидация OpenRouter + // Валидация настроек OpenRouter var openRouterResult = ValidateOpenRouterSettings(settings.OpenRouter); errors.AddRange(openRouterResult.Errors); return new ValidationResult { IsValid = !errors.Any(), Errors = errors }; } + /// + /// Валидирует настройки Telegram бота + /// + /// Настройки Telegram бота + /// Результат валидации public static ValidationResult ValidateTelegramBotSettings(TelegramBotSettings settings) { var errors = new List(); + // Проверка наличия токена бота if (string.IsNullOrWhiteSpace(settings.BotToken)) { errors.Add("TelegramBot:BotToken is required"); } + // Проверка формата токена (должен содержать ':' или начинаться с 'bot') else if ( !settings.BotToken.StartsWith("bot", StringComparison.OrdinalIgnoreCase) && !settings.BotToken.Contains(":") @@ -40,79 +55,156 @@ namespace ChatBot.Models.Configuration.Validators return new ValidationResult { IsValid = !errors.Any(), Errors = errors }; } + /// + /// Валидирует настройки OpenRouter + /// + /// Настройки OpenRouter + /// Результат валидации public static ValidationResult ValidateOpenRouterSettings(OpenRouterSettings settings) { var errors = new List(); - if (string.IsNullOrWhiteSpace(settings.Token)) + // Валидация всех компонентов настроек OpenRouter + ValidateToken(settings.Token, errors); + ValidateUrl(settings.Url, errors); + ValidateAvailableModels(settings.AvailableModels, errors); + ValidateDefaultModel(settings.DefaultModel, settings.AvailableModels, errors); + ValidateNumericSettings(settings, errors); + + return new ValidationResult { IsValid = !errors.Any(), Errors = errors }; + } + + /// + /// Валидирует токен OpenRouter + /// + /// Токен для проверки + /// Список ошибок валидации + private static void ValidateToken(string token, List errors) + { + // Проверка наличия токена + if (string.IsNullOrWhiteSpace(token)) { errors.Add("OpenRouter:Token is required"); } - else if (!settings.Token.StartsWith("sk-", StringComparison.OrdinalIgnoreCase)) + // Проверка формата токена (должен начинаться с 'sk-') + else if (!token.StartsWith("sk-", StringComparison.OrdinalIgnoreCase)) { errors.Add("OpenRouter:Token appears to be invalid (should start with 'sk-')"); } + } - if (string.IsNullOrWhiteSpace(settings.Url)) + /// + /// Валидирует URL OpenRouter + /// + /// URL для проверки + /// Список ошибок валидации + private static void ValidateUrl(string url, List errors) + { + // Проверка наличия URL + if (string.IsNullOrWhiteSpace(url)) { errors.Add("OpenRouter:Url is required"); } + // Проверка корректности URL (должен быть валидным HTTP/HTTPS URL) else if ( - !Uri.TryCreate(settings.Url, UriKind.Absolute, out var uri) + !Uri.TryCreate(url, UriKind.Absolute, out var uri) || (uri.Scheme != "http" && uri.Scheme != "https") ) { errors.Add("OpenRouter:Url must be a valid HTTP/HTTPS URL"); } + } - if (settings.AvailableModels == null || !settings.AvailableModels.Any()) + /// + /// Валидирует список доступных моделей + /// + /// Список моделей для проверки + /// Список ошибок валидации + private static void ValidateAvailableModels(IEnumerable models, List errors) + { + // Проверка наличия хотя бы одной модели + if (models == null || !models.Any()) { errors.Add("OpenRouter:AvailableModels must contain at least one model"); - } - else - { - foreach (var model in settings.AvailableModels) - { - if (string.IsNullOrWhiteSpace(model)) - { - errors.Add("OpenRouter:AvailableModels contains empty model name"); - } - } + return; } + // Проверка на пустые названия моделей + var emptyModels = models.Where(string.IsNullOrWhiteSpace).ToList(); + if (emptyModels.Any()) + { + errors.Add("OpenRouter:AvailableModels contains empty model name"); + } + } + + /// + /// Валидирует модель по умолчанию + /// + /// Модель по умолчанию + /// Список доступных моделей + /// Список ошибок валидации + private static void ValidateDefaultModel( + string defaultModel, + IEnumerable availableModels, + List errors + ) + { + // Проверка, что модель по умолчанию присутствует в списке доступных if ( - !string.IsNullOrWhiteSpace(settings.DefaultModel) - && settings.AvailableModels != null - && !settings.AvailableModels.Contains(settings.DefaultModel) + !string.IsNullOrWhiteSpace(defaultModel) + && availableModels != null + && !availableModels.Contains(defaultModel) ) { errors.Add( - $"OpenRouter:DefaultModel '{settings.DefaultModel}' is not in AvailableModels list" + $"OpenRouter:DefaultModel '{defaultModel}' is not in AvailableModels list" ); } + } + /// + /// Валидирует числовые параметры настроек OpenRouter + /// + /// Настройки OpenRouter + /// Список ошибок валидации + private static void ValidateNumericSettings( + OpenRouterSettings settings, + List errors + ) + { + // Проверка количества повторных попыток (1-10) if (settings.MaxRetries < 1 || settings.MaxRetries > 10) { errors.Add("OpenRouter:MaxRetries must be between 1 and 10"); } + // Проверка максимального количества токенов (1-100000) if (settings.MaxTokens < 1 || settings.MaxTokens > 100000) { errors.Add("OpenRouter:MaxTokens must be between 1 and 100000"); } + // Проверка температуры (0.0-2.0) if (settings.Temperature < 0.0 || settings.Temperature > 2.0) { errors.Add("OpenRouter:Temperature must be between 0.0 and 2.0"); } - - return new ValidationResult { IsValid = !errors.Any(), Errors = errors }; } } + /// + /// Результат валидации конфигурации + /// public class ValidationResult { + /// + /// Указывает, прошла ли валидация успешно + /// public bool IsValid { get; set; } + + /// + /// Список ошибок валидации + /// public List Errors { get; set; } = new(); } }