< Summary

Information
Class: Intentum.Core.Models.ChainedIntentModel
Assembly: Intentum.Core
File(s): /home/runner/work/Intentum/Intentum/src/Intentum.Core/Models/ChainedIntentModel.cs
Line coverage
100%
Covered lines: 18
Uncovered lines: 0
Coverable lines: 18
Total lines: 47
Line coverage: 100%
Branch coverage
70%
Covered branches: 7
Total branches: 10
Branch coverage: 70%
Method coverage

Feature is only available for sponsors

Upgrade to PRO version

Metrics

MethodBranch coverage Cyclomatic complexity NPath complexity Sequence coverage
.ctor(...)50%44100%
Infer(...)83.33%66100%

File(s)

/home/runner/work/Intentum/Intentum/src/Intentum.Core/Models/ChainedIntentModel.cs

#LineLine coverage
 1using Intentum.Core.Behavior;
 2using Intentum.Core.Contracts;
 3using Intentum.Core.Intents;
 4
 5namespace Intentum.Core.Models;
 6
 7/// <summary>
 8/// Intent model that tries a primary model first; if confidence is below threshold, falls back to a secondary model (e.
 9/// Reduces cost and latency by using cheap rule/keyword path when confidence is high.
 10/// </summary>
 11public sealed class ChainedIntentModel : IIntentModel
 12{
 13    private readonly IIntentModel _primary;
 14    private readonly IIntentModel _fallback;
 15    private readonly double _confidenceThreshold;
 16
 17    /// <summary>
 18    /// Creates a chained intent model.
 19    /// </summary>
 20    /// <param name="primary">Model to try first (e.g. RuleBasedIntentModel).</param>
 21    /// <param name="fallback">Model to use when primary confidence is below threshold (e.g. LlmIntentModel).</param>
 22    /// <param name="confidenceThreshold">Minimum primary confidence to accept primary result; otherwise use fallback. T
 323    public ChainedIntentModel(IIntentModel primary, IIntentModel fallback, double confidenceThreshold = 0.7)
 324    {
 325        _primary = primary ?? throw new ArgumentNullException(nameof(primary));
 326        _fallback = fallback ?? throw new ArgumentNullException(nameof(fallback));
 327        _confidenceThreshold = Math.Clamp(confidenceThreshold, 0, 1);
 328    }
 29
 30    /// <inheritdoc />
 31    public Intent Infer(BehaviorSpace behaviorSpace, BehaviorVector? precomputedVector = null)
 332    {
 333        var primaryIntent = _primary.Infer(behaviorSpace, precomputedVector);
 34
 335        if (primaryIntent.Confidence.Score >= _confidenceThreshold)
 236        {
 237            var reasoning = primaryIntent.Reasoning != null
 238                ? $"Primary: {primaryIntent.Reasoning}"
 239                : "Primary (confidence above threshold)";
 240            return primaryIntent with { Reasoning = reasoning };
 41        }
 42
 143        var fallbackIntent = _fallback.Infer(behaviorSpace, precomputedVector);
 144        var fallbackReasoning = $"Fallback: {fallbackIntent.Reasoning ?? "LLM (primary confidence below " + _confidenceT
 145        return fallbackIntent with { Reasoning = fallbackReasoning };
 346    }
 47}