namespace Service.AI; /// /// 分类图标生成提示词提供器实现 /// public class ClassificationIconPromptProvider : IClassificationIconPromptProvider { private readonly ILogger _logger; private readonly IconPromptSettings _config; private readonly Random _random = new(); public ClassificationIconPromptProvider( ILogger logger, IOptions config) { _logger = logger; _config = config.Value; } public string GetPrompt(string categoryName, TransactionType categoryType) { var typeText = GetCategoryTypeText(categoryType); var useNewPrompt = ShouldUseNewPrompt(); var template = useNewPrompt ? _config.DefaultPromptTemplate : _config.OldDefaultPromptTemplate; string prompt; if (useNewPrompt) { prompt = PromptTemplateEngine.ReplaceForIconGeneration( template, categoryName, typeText, _config.ColorScheme, _config.StyleStrength); } else { prompt = PromptTemplateEngine.ReplaceForIconGeneration( template, categoryName, typeText, _config.ColorScheme, 0); } _logger.LogDebug("使用 {PromptType} 提示词生成图标,分类:{CategoryName}", useNewPrompt ? "新版" : "旧版", categoryName); return prompt; } public string GetSingleIconPrompt(string categoryName, TransactionType categoryType) { var typeText = GetCategoryTypeText(categoryType); var useNewPrompt = ShouldUseNewPrompt(); var template = useNewPrompt ? _config.SingleIconPromptTemplate : _config.OldSingleIconPromptTemplate; string prompt; if (useNewPrompt) { prompt = PromptTemplateEngine.ReplaceForIconGeneration( template, categoryName, typeText, _config.ColorScheme, _config.StyleStrength); } else { prompt = PromptTemplateEngine.ReplaceForIconGeneration( template, categoryName, typeText, _config.ColorScheme, 0); } _logger.LogDebug("使用 {PromptType} 提示词生成单个图标,分类:{CategoryName}", useNewPrompt ? "新版" : "旧版", categoryName); return prompt; } private bool ShouldUseNewPrompt() { if (!_config.EnableNewPrompt) { return false; } var randomValue = _random.NextDouble(); return randomValue < _config.GrayScaleRatio; } private static string GetCategoryTypeText(TransactionType categoryType) { return categoryType switch { TransactionType.Expense => "支出", TransactionType.Income => "收入", TransactionType.None => "不计入收支", _ => "未知" }; } }