< Summary

Information
Class: Intentum.Explainability.IntentExplainer
Assembly: Intentum.Explainability
File(s): /home/runner/work/Intentum/Intentum/src/Intentum.Explainability/IntentExplainer.cs
Line coverage
93%
Covered lines: 31
Uncovered lines: 2
Coverable lines: 33
Total lines: 51
Line coverage: 93.9%
Branch coverage
75%
Covered branches: 6
Total branches: 8
Branch coverage: 75%
Method coverage

Feature is only available for sponsors

Upgrade to PRO version

Metrics

MethodBranch coverage Cyclomatic complexity NPath complexity Sequence coverage
GetSignalContributions(...)75%4493.33%
GetExplanation(...)75%4494.44%

File(s)

/home/runner/work/Intentum/Intentum/src/Intentum.Explainability/IntentExplainer.cs

#LineLine coverage
 1using Intentum.Core.Intents;
 2
 3namespace Intentum.Explainability;
 4
 5/// <summary>
 6/// Default implementation of intent explainability using signal weights.
 7/// </summary>
 8public sealed class IntentExplainer : IIntentExplainer
 9{
 10    /// <inheritdoc />
 11    public IReadOnlyList<SignalContribution> GetSignalContributions(Intent intent)
 312    {
 313        if (intent.Signals.Count == 0)
 114            return [];
 15
 616        var total = intent.Signals.Sum(s => s.Weight);
 217        if (total <= 0)
 018            return intent.Signals.Select(s => new SignalContribution(s.Source, s.Description, s.Weight, 0)).ToList();
 19
 220        return intent.Signals
 421            .Select(s => new SignalContribution(
 422                s.Source,
 423                s.Description,
 424                s.Weight,
 425                100.0 * s.Weight / total))
 326            .OrderByDescending(c => c.ContributionPercent)
 227            .ToList();
 328    }
 29
 30    /// <inheritdoc />
 31    public string GetExplanation(Intent intent, int maxSignals = 5)
 132    {
 133        var level = intent.Confidence.Level;
 134        var score = intent.Confidence.Score;
 135        var contributions = GetSignalContributions(intent).Take(maxSignals).ToList();
 36
 137        var parts = new List<string>
 138        {
 139            $"Intent \"{intent.Name}\" inferred with confidence {level} ({score:F2})."
 140        };
 141        if (contributions.Count > 0)
 142        {
 143            var top = string.Join("; ", contributions.Select(c =>
 244                $"{c.Description} ({c.ContributionPercent:F0}%)"));
 145            parts.Add($"Top contributors: {top}.");
 146        }
 147        if (!string.IsNullOrWhiteSpace(intent.Reasoning))
 048            parts.Add($"Reasoning: {intent.Reasoning}");
 149        return string.Join(" ", parts);
 150    }
 51}