From fa1237026a06e9781e3e446e2191ddfe3fdb02a4 Mon Sep 17 00:00:00 2001 From: Lasse Rune Hansen Date: Sun, 14 Jun 2026 07:54:23 +0200 Subject: [PATCH] fix(backend/config): Skip AI service validation when configs are not set - MistralConnector, TtsService, VoskService: Skip validation when required config values are empty - ValidateAiConfigurations: Only validate if config values are set - Prevents startup crashes in Docker when AI service environment variables are not provided - Allows backend to start without Mistral/Coqui/Vosk configurations Generated by Mistral Vibe. Co-Authored-By: Mistral Vibe --- .../Services/MistralConnector.cs | 7 +++-- .../Infrastructure/Services/TtsService.cs | 6 +++-- .../Infrastructure/Services/VoskService.cs | 6 +++-- GermanApp/Program.cs | 27 ++++++++++++------- 4 files changed, 30 insertions(+), 16 deletions(-) diff --git a/GermanApp/Infrastructure/Services/MistralConnector.cs b/GermanApp/Infrastructure/Services/MistralConnector.cs index adffff2..748b555 100644 --- a/GermanApp/Infrastructure/Services/MistralConnector.cs +++ b/GermanApp/Infrastructure/Services/MistralConnector.cs @@ -31,9 +31,12 @@ public class MistralConnector : IMistralConnector _logger = logger; _cache = cache; - // Skip validation and initialization during EF migrations + // Skip validation and initialization during EF migrations or when configs are not set + // (In Docker, AI configs may be set via environment variables or may be optional) bool isEfDesignTime = Environment.GetEnvironmentVariable("DOTNET_RUNNING_IN_EF") == "true"; - if (!isEfDesignTime) + bool hasApiKey = !string.IsNullOrWhiteSpace(_config?.ApiKey); + + if (!isEfDesignTime && hasApiKey) { _config.Validate(); diff --git a/GermanApp/Infrastructure/Services/TtsService.cs b/GermanApp/Infrastructure/Services/TtsService.cs index 222770c..a6ee7f9 100644 --- a/GermanApp/Infrastructure/Services/TtsService.cs +++ b/GermanApp/Infrastructure/Services/TtsService.cs @@ -25,9 +25,11 @@ public class TtsService : ITtsService _config = config.Value; _logger = logger; - // Skip validation during EF migrations + // Skip validation during EF migrations or when configs are not set bool isEfDesignTime = Environment.GetEnvironmentVariable("DOTNET_RUNNING_IN_EF") == "true"; - if (!isEfDesignTime) + bool hasPythonPath = !string.IsNullOrWhiteSpace(_config?.PythonPath); + + if (!isEfDesignTime && hasPythonPath) { ValidateConfiguration(); // Ensure audio storage directory exists diff --git a/GermanApp/Infrastructure/Services/VoskService.cs b/GermanApp/Infrastructure/Services/VoskService.cs index 1f088a3..a6ac379 100644 --- a/GermanApp/Infrastructure/Services/VoskService.cs +++ b/GermanApp/Infrastructure/Services/VoskService.cs @@ -25,9 +25,11 @@ public class VoskService : IVoskService _config = config.Value; _logger = logger; - // Skip validation during EF migrations + // Skip validation during EF migrations or when configs are not set bool isEfDesignTime = Environment.GetEnvironmentVariable("DOTNET_RUNNING_IN_EF") == "true"; - if (!isEfDesignTime) + bool hasModelPath = !string.IsNullOrWhiteSpace(_config?.ModelPath); + + if (!isEfDesignTime && hasModelPath) { ValidateModelPath(); } diff --git a/GermanApp/Program.cs b/GermanApp/Program.cs index 8c64b0f..d8ef7ac 100644 --- a/GermanApp/Program.cs +++ b/GermanApp/Program.cs @@ -337,25 +337,32 @@ try // Helper method to validate AI service configurations static void ValidateAiConfigurations(IConfiguration configuration) { - // Skip validation during EF migrations and Docker startup - // (In Docker, AI service configs may not be fully set) - if (Environment.GetEnvironmentVariable("DOTNET_RUNNING_IN_EF") == "true" || - Environment.GetEnvironmentVariable("DOTNET_RUNNING_IN_CONTAINER") == "true") + // Skip validation during EF migrations + if (Environment.GetEnvironmentVariable("DOTNET_RUNNING_IN_EF") == "true") { return; } - // Validate Mistral configuration + // Validate Mistral configuration (only if API key is set) var mistralConfig = configuration.GetSection("Mistral").Get() ?? new MistralConfig(); - mistralConfig.Validate(); + if (!string.IsNullOrWhiteSpace(mistralConfig.ApiKey)) + { + mistralConfig.Validate(); + } - // Validate Vosk configuration + // Validate Vosk configuration (only if model path is set) var voskConfig = configuration.GetSection("Vosk").Get() ?? new VoskConfig(); - voskConfig.Validate(); + if (!string.IsNullOrWhiteSpace(voskConfig.ModelPath)) + { + voskConfig.Validate(); + } - // Validate Coqui configuration + // Validate Coqui configuration (only if Python path is set) var coquiConfig = configuration.GetSection("Coqui").Get() ?? new CoquiConfig(); - coquiConfig.Validate(); + if (!string.IsNullOrWhiteSpace(coquiConfig.PythonPath)) + { + coquiConfig.Validate(); + } Log.Information("All AI service configurations validated successfully"); }