using Journal.Core.Services.Ai; using Journal.Core.Services.Config; using Microsoft.Extensions.DependencyInjection; namespace Journal.AI; public static class ServiceCollectionExtensions { /// /// Registers LLamaSharp-based AI and Coach services. /// Call this AFTER AddFragmentServices() so that IJournalConfigService is available. /// When the provider is "llamasharp", this replaces the default IAiService registration. /// public static IServiceCollection AddLlamaSharpServices(this IServiceCollection services) { // Override IAiService — last registration wins in MS DI services.AddSingleton(provider => { var config = provider.GetRequiredService().Current; if (string.Equals(config.AiProvider, "llamasharp", StringComparison.OrdinalIgnoreCase)) { try { return new LlamaSharpAiService(config); } catch (Exception ex) { return new DisabledAiService( provider: "llamasharp", message: $"LLamaSharp unavailable: {ex.Message}", healthy: false); } } return new DisabledAiService(config.AiProvider); }); // Register coach service services.AddSingleton(provider => { var config = provider.GetRequiredService().Current; var ai = provider.GetRequiredService(); if (ai is LlamaSharpAiService llamaAi) return new LlamaSharpCoachService(llamaAi); if (string.Equals(config.AiProvider, "none", StringComparison.OrdinalIgnoreCase)) return new DisabledCoachService(); return new DisabledCoachService( $"Coach requires llamasharp provider (current: {config.AiProvider})."); }); return services; } }