// // Copyright (c) StellaOps. Licensed under the BUSL-1.1. // using System.Security.Cryptography; using System.Text; namespace StellaOps.AdvisoryAI.Explanation; public sealed class NullExplanationInferenceClient : IExplanationInferenceClient { public Task GenerateAsync( ExplanationPrompt prompt, CancellationToken cancellationToken = default) { ArgumentNullException.ThrowIfNull(prompt); var promptHash = ComputeHash(prompt.Content ?? string.Empty); var content = $"Placeholder explanation (no model). prompt_hash=sha256:{promptHash}"; return Task.FromResult(new ExplanationInferenceResult { Content = content, Confidence = 0.0, ModelId = "stub-explainer:v0" }); } private static string ComputeHash(string content) { var bytes = SHA256.HashData(Encoding.UTF8.GetBytes(content)); return Convert.ToHexStringLower(bytes); } }