< Summary

Information
Class: Intentum.Core.Models.SlidingWindowIntentModel
Assembly: Intentum.Core
File(s): /home/runner/work/Intentum/Intentum/src/Intentum.Core/Models/SlidingWindowIntentModel.cs
Line coverage
100%
Covered lines: 24
Uncovered lines: 0
Coverable lines: 24
Total lines: 55
Line coverage: 100%
Branch coverage
83%
Covered branches: 10
Total branches: 12
Branch coverage: 83.3%
Method coverage

Feature is only available for sponsors

Upgrade to PRO version

Metrics

MethodBranch coverage Cyclomatic complexity NPath complexity Sequence coverage
.ctor(...)50%22100%
Infer(...)90%1010100%

File(s)

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

#LineLine coverage
 1using Intentum.Core.Behavior;
 2using Intentum.Core.Contracts;
 3using Intentum.Core.Intents;
 4
 5namespace Intentum.Core.Models;
 6
 7/// <summary>
 8/// Wraps an intent model and restricts inference to a sliding time window (configurable window, deterministic for testi
 9/// Use when you want intent resolution based only on recent events (e.g. last 5 minutes).
 10/// For decay (recent events weigh more), use an inner model with Intentum.AI.Similarity.TimeDecaySimilarityEngine.
 11/// </summary>
 12public sealed class SlidingWindowIntentModel : IIntentModel
 13{
 14    private readonly IIntentModel _inner;
 15    private readonly TimeSpan _windowSize;
 16    private readonly DateTimeOffset? _referenceTimeForDeterminism;
 17
 18    /// <summary>
 19    /// Creates a sliding-window intent model.
 20    /// </summary>
 21    /// <param name="inner">The inner intent model (e.g. rule-based or LLM).</param>
 22    /// <param name="windowSize">Time window (e.g. last 5 minutes). Only events within this window are used for inferenc
 23    /// <param name="referenceTimeForDeterminism">Optional: fix the "now" for the window end so that tests are determini
 524    public SlidingWindowIntentModel(
 525        IIntentModel inner,
 526        TimeSpan windowSize,
 527        DateTimeOffset? referenceTimeForDeterminism = null)
 528    {
 529        _inner = inner ?? throw new ArgumentNullException(nameof(inner));
 530        _windowSize = windowSize;
 531        _referenceTimeForDeterminism = referenceTimeForDeterminism;
 532    }
 33
 34    /// <inheritdoc />
 35    public Intent Infer(BehaviorSpace behaviorSpace, BehaviorVector? precomputedVector = null)
 636    {
 637        if (behaviorSpace.Events.Count == 0)
 138            return _inner.Infer(behaviorSpace, precomputedVector);
 39
 540        var end = _referenceTimeForDeterminism ?? DateTimeOffset.UtcNow;
 541        var start = end - _windowSize;
 542        var eventsInWindow = behaviorSpace.GetEventsInWindow(start, end);
 43
 544        if (eventsInWindow.Count == 0)
 145            return _inner.Infer(behaviorSpace, precomputedVector);
 46
 447        var windowedSpace = new BehaviorSpace();
 2648        foreach (var evt in eventsInWindow)
 749            windowedSpace.Observe(evt);
 1450        foreach (var kv in behaviorSpace.Metadata)
 151            windowedSpace.SetMetadata(kv.Key, kv.Value);
 52
 453        return _inner.Infer(windowedSpace, precomputedVector: null);
 654    }
 55}