// Copyright (c) Microsoft. All rights reserved.
using System.Collections.Generic;
using System.Threading;
using System.Threading.Tasks;
using Microsoft.Extensions.AI.Evaluation;
namespace Microsoft.Agents.AI;
///
/// Evaluator that runs check functions locally without API calls.
///
public sealed class LocalEvaluator : IAgentEvaluator
{
private readonly EvalCheck[] _checks;
///
/// Initializes a new instance of the class.
///
/// The check functions to run on each item.
public LocalEvaluator(params EvalCheck[] checks)
{
this._checks = checks;
}
///
public string Name => "LocalEvaluator";
///
public Task EvaluateAsync(
IReadOnlyList items,
string evalName = "Local Eval",
CancellationToken cancellationToken = default)
{
var results = new List(items.Count);
foreach (var item in items)
{
cancellationToken.ThrowIfCancellationRequested();
var evalResult = new EvaluationResult();
foreach (var check in this._checks)
{
var EvalCheckResult = check(item);
evalResult.Metrics[EvalCheckResult.CheckName] = new BooleanMetric(
EvalCheckResult.CheckName,
EvalCheckResult.Passed,
reason: EvalCheckResult.Reason)
{
Interpretation = new EvaluationMetricInterpretation
{
Rating = EvalCheckResult.Passed
? EvaluationRating.Good
: EvaluationRating.Unacceptable,
Failed = !EvalCheckResult.Passed,
},
};
}
results.Add(evalResult);
}
return Task.FromResult(new AgentEvaluationResults(this.Name, results, inputItems: items));
}
}