Skip to content

Commit cf0266a

Browse files
shyamnamboodiripadstephentoub
authored andcommitted
Add MEAI.Evaluation libraries
1 parent fab3675 commit cf0266a

File tree

161 files changed

+19944
-3
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

161 files changed

+19944
-3
lines changed

eng/Version.Details.xml

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,9 @@
11
<Dependencies>
22
<ProductDependencies>
3+
<Dependency Name="Microsoft.Bcl.Memory" Version="9.0.1" CoherentParentDependency="Microsoft.AspNetCore.App.Runtime.win-x64">
4+
<Uri>https://dev.azure.com/dnceng/internal/_git/dotnet-runtime</Uri>
5+
<Sha>69ae1ac0682f4b69b1d733fbf3bdee2825a2aab2</Sha>
6+
</Dependency>
37
<Dependency Name="Microsoft.Bcl.TimeProvider" Version="9.0.1" CoherentParentDependency="Microsoft.AspNetCore.App.Runtime.win-x64">
48
<Uri>https://dev.azure.com/dnceng/internal/_git/dotnet-runtime</Uri>
59
<Sha>69ae1ac0682f4b69b1d733fbf3bdee2825a2aab2</Sha>

eng/Versions.props

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@
2828
<PropertyGroup Label="Automated">
2929
<!-- Packages from dotnet/runtime -->
3030
<MicrosoftBclAsyncInterfacesVersion>9.0.1</MicrosoftBclAsyncInterfacesVersion>
31+
<MicrosoftBclMemoryVersion>9.0.1</MicrosoftBclMemoryVersion>
3132
<MicrosoftBclTimeProviderVersion>9.0.1</MicrosoftBclTimeProviderVersion>
3233
<MicrosoftExtensionsCachingAbstractionsVersion>9.0.1</MicrosoftExtensionsCachingAbstractionsVersion>
3334
<MicrosoftExtensionsCachingMemoryVersion>9.0.1</MicrosoftExtensionsCachingMemoryVersion>
@@ -78,6 +79,7 @@
7879
<PropertyGroup Label="Manual">
7980
<!-- Packages from dotnet/runtime -->
8081
<MicrosoftBclAsyncInterfacesLTSVersion>8.0.0</MicrosoftBclAsyncInterfacesLTSVersion>
82+
<MicrosoftBclMemoryLTSVersion>9.0.1</MicrosoftBclMemoryLTSVersion>
8183
<MicrosoftBclTimeProviderLTSVersion>8.0.1</MicrosoftBclTimeProviderLTSVersion>
8284
<MicrosoftExtensionsCachingAbstractionsLTSVersion>8.0.0</MicrosoftExtensionsCachingAbstractionsLTSVersion>
8385
<MicrosoftExtensionsCachingMemoryLTSVersion>8.0.1</MicrosoftExtensionsCachingMemoryLTSVersion>
@@ -137,6 +139,7 @@
137139
Win-x64 is used here because we have picked an arbitrary runtime identifier to flow the version of the latest NETCore.App runtime.
138140
All Runtime.$rid packages should have the same version.
139141
-->
142+
<MicrosoftMLTokenizersVersion>1.0.1</MicrosoftMLTokenizersVersion>
140143
<MicrosoftNETCoreAppRuntimeVersion>$(MicrosoftNETCoreAppRuntimewinx64Version)</MicrosoftNETCoreAppRuntimeVersion>
141144
<!-- Compatibility with VS 17.8/.NET SDK 8.0.1xx -->
142145
<MicrosoftCodeAnalysisVersion>4.8.0</MicrosoftCodeAnalysisVersion>

eng/packages/General-LTS.props

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
of the framework, we should use the following LTS versions instead -->
55
<ItemGroup Condition="'$(TargetFramework)' != 'net9.0' And '$(ForceLatestDotnetVersions)' != 'true'">
66
<PackageVersion Include="Microsoft.Bcl.AsyncInterfaces" Version="$(MicrosoftBclAsyncInterfacesLTSVersion)" />
7+
<PackageVersion Include="Microsoft.Bcl.Memory" Version="$(MicrosoftBclMemoryLTSVersion)" />
78
<PackageVersion Include="Microsoft.Bcl.TimeProvider" Version="$(MicrosoftBclTimeProviderLTSVersion)" />
89
<PackageVersion Include="Microsoft.Extensions.Caching.Abstractions" Version="$(MicrosoftExtensionsCachingAbstractionsLTSVersion)" />
910
<PackageVersion Include="Microsoft.Extensions.Caching.Memory" Version="$(MicrosoftExtensionsCachingMemoryLTSVersion)" />
@@ -23,6 +24,7 @@
2324
<PackageVersion Include="Microsoft.Extensions.Http" Version="$(MicrosoftExtensionsHttpLTSVersion)" />
2425
<PackageVersion Include="Microsoft.Extensions.Logging.Abstractions" Version="$(MicrosoftExtensionsLoggingAbstractionsLTSVersion)" />
2526
<PackageVersion Include="Microsoft.Extensions.Logging.Configuration" Version="$(MicrosoftExtensionsLoggingConfigurationLTSVersion)" />
27+
<PackageVersion Include="Microsoft.Extensions.Logging.Console" Version="$(MicrosoftExtensionsLoggingConsoleLTSVersion)" />
2628
<PackageVersion Include="Microsoft.Extensions.Logging" Version="$(MicrosoftExtensionsLoggingLTSVersion)" />
2729
<PackageVersion Include="Microsoft.Extensions.ObjectPool" Version="$(MicrosoftExtensionsObjectPoolLTSVersion)" />
2830
<PackageVersion Include="Microsoft.Extensions.Options.ConfigurationExtensions" Version="$(MicrosoftExtensionsOptionsConfigurationExtensionsLTSVersion)" />

eng/packages/General-net9.props

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
of the framework, the following versions should be used. -->
55
<ItemGroup Condition="'$(TargetFramework)' == 'net9.0' Or '$(ForceLatestDotnetVersions)' == 'true'">
66
<PackageVersion Include="Microsoft.Bcl.AsyncInterfaces" Version="$(MicrosoftBclAsyncInterfacesVersion)" />
7+
<PackageVersion Include="Microsoft.Bcl.Memory" Version="$(MicrosoftBclMemoryLTSVersion)" />
78
<PackageVersion Include="Microsoft.Bcl.TimeProvider" Version="$(MicrosoftBclTimeProviderVersion)" />
89
<PackageVersion Include="Microsoft.Extensions.Caching.Abstractions" Version="$(MicrosoftExtensionsCachingAbstractionsVersion)" />
910
<PackageVersion Include="Microsoft.Extensions.Caching.Memory" Version="$(MicrosoftExtensionsCachingMemoryVersion)" />
@@ -23,6 +24,7 @@
2324
<PackageVersion Include="Microsoft.Extensions.Http" Version="$(MicrosoftExtensionsHttpVersion)" />
2425
<PackageVersion Include="Microsoft.Extensions.Logging.Abstractions" Version="$(MicrosoftExtensionsLoggingAbstractionsVersion)" />
2526
<PackageVersion Include="Microsoft.Extensions.Logging.Configuration" Version="$(MicrosoftExtensionsLoggingConfigurationVersion)" />
27+
<PackageVersion Include="Microsoft.Extensions.Logging.Console" Version="$(MicrosoftExtensionsLoggingConsoleVersion)" />
2628
<PackageVersion Include="Microsoft.Extensions.Logging" Version="$(MicrosoftExtensionsLoggingVersion)" />
2729
<PackageVersion Include="Microsoft.Extensions.ObjectPool" Version="$(MicrosoftExtensionsObjectPoolVersion)" />
2830
<PackageVersion Include="Microsoft.Extensions.Options.ConfigurationExtensions" Version="$(MicrosoftExtensionsOptionsConfigurationExtensionsVersion)" />

eng/packages/General.props

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
<?xml version="1.0" encoding="utf-8"?>
22
<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
33
<ItemGroup>
4+
<PackageVersion Include="Azure.Storage.Files.DataLake" Version="12.21.0" />
45
<PackageVersion Include="Azure.AI.Inference" Version="1.0.0-beta.2" />
56
<PackageVersion Include="ICSharpCode.Decompiler" Version="8.2.0.7535" />
67
<PackageVersion Include="Microsoft.Bcl.HashCode" Version="1.1.1" />
@@ -10,6 +11,7 @@
1011
<PackageVersion Include="Microsoft.CodeAnalysis.CSharp" Version="$(MicrosoftCodeAnalysisVersion)" />
1112
<PackageVersion Include="Microsoft.CodeAnalysis" Version="$(MicrosoftCodeAnalysisVersion)" />
1213
<PackageVersion Include="Microsoft.IO.RecyclableMemoryStream" Version="3.0.0" />
14+
<PackageVersion Include="Microsoft.ML.Tokenizers" Version="$(MicrosoftMLTokenizersVersion)" />
1315
<PackageVersion Include="Newtonsoft.Json" Version="13.0.3" />
1416
<PackageVersion Include="OpenAI" Version="2.2.0-beta.1" />
1517
<PackageVersion Include="Polly" Version="8.4.2" />

eng/packages/TestOnly.props

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
<ItemGroup>
44
<PackageVersion Include="AutoFixture.AutoMoq" Version="4.17.0" />
55
<PackageVersion Include="Azure.AI.OpenAI" Version="2.2.0-beta.1" />
6+
<PackageVersion Include="Azure.Identity" Version="1.13.2" />
67
<PackageVersion Include="autofixture" Version="4.17.0" />
78
<PackageVersion Include="BenchmarkDotNet" Version="0.13.5" />
89
<PackageVersion Include="FluentAssertions" Version="6.11.0" />
@@ -12,7 +13,7 @@
1213
<PackageVersion Include="Microsoft.Diagnostics.Tracing.TraceEvent" Version="3.1.3" />
1314
<PackageVersion Include="Microsoft.Extensions.Configuration.EnvironmentVariables" Version="9.0.0" />
1415
<PackageVersion Include="Microsoft.Extensions.Configuration.UserSecrets" Version="9.0.0" />
15-
<PackageVersion Include="Microsoft.ML.Tokenizers" Version="0.22.0-preview.24378.1" />
16+
<PackageVersion Include="Microsoft.ML.Tokenizers.Data.O200kBase" Version="$(MicrosoftMLTokenizersVersion)" />
1617
<PackageVersion Include="Moq.AutoMock" Version="3.1.0" />
1718
<PackageVersion Include="Moq" Version="4.18.4" />
1819
<PackageVersion Include="OpenTelemetry.Exporter.InMemory" Version="1.9.0" />

eng/pipelines/templates/BuildAndTest.yml

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,12 @@ parameters:
2323
default: false
2424

2525
steps:
26+
- task: NodeTool@0
27+
displayName: Add NodeJS/npm
28+
inputs:
29+
versionSpec: "20.x"
30+
checkLatest: true
31+
2632
- script: ${{ parameters.buildScript }}
2733
-restore
2834
/bl:${{ parameters.repoLogPath }}/restore.binlog

eng/xunit.runner.json

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
{
22
"diagnosticMessages": true,
3-
"longRunningTestSeconds": 300
3+
"longRunningTestSeconds": 300,
4+
"shadowCopy": false
45
}

scripts/ConfigureEvaluationTests.ps1

Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
param (
2+
[switch]$Configure=$False,
3+
[switch]$Unconfigure=$False,
4+
[string]$ConfigRoot=$Null
5+
)
6+
7+
Write-Host "$PSScriptRoot"
8+
9+
if ($Configure -and $Unconfigure) {
10+
Write-Error -Message "Cannot specify both -Configure and -Unconfigure"
11+
Exit 1
12+
}
13+
14+
if ($ConfigRoot -eq $Null) {
15+
$ConfigRoot = "$HOME/.config/dotnet-extensions"
16+
}
17+
18+
$ProjectRoot = Resolve-Path "$PSScriptRoot/../test/Libraries"
19+
$ReportingConfig = "Microsoft.Extensions.AI.Evaluation.Reporting.Tests/appsettings.local.json"
20+
$IntegrationConfig = "Microsoft.Extensions.AI.Evaluation.Integration.Tests/appsettings.local.json"
21+
22+
if ($Configure) {
23+
if (!(Test-Path -Path "$ConfigRoot/$ReportingConfig")) {
24+
Write-Host "No configuration found at $ConfigRoot/$ReportingConfig"
25+
Exit 0
26+
}
27+
if (!(Test-Path -Path "$ConfigRoot/$IntegrationConfig")) {
28+
Write-Host "No configuration found at $ConfigRoot/$IntegrationConfig"
29+
Exit 0
30+
}
31+
32+
Copy-Item -Path "$ConfigRoot/$ReportingConfig" -Destination "$ProjectRoot/$ReportingConfig" -Force
33+
Copy-Item -Path "$ConfigRoot/$IntegrationConfig" -Destination "$ProjectRoot/$IntegrationConfig" -Force
34+
35+
Write-Host "Test configured to use external resources"
36+
} elseif ($Unconfigure) {
37+
Remove-Item -Path "$ProjectRoot/$ReportingConfig" -Force
38+
Remove-Item -Path "$ProjectRoot/$IntegrationConfig" -Force
39+
40+
Write-Host "Test unconfigured from using external resources"
41+
} else {
42+
Write-Error -Message "Must specify either -Configure or -Unconfigure"
43+
Exit 1
44+
}
45+

src/Libraries/Directory.Build.props

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,6 @@
1111
<InjectTrimAttributesOnLegacy Condition="'$(InjectTrimAttributesOnLegacy)' == ''">true</InjectTrimAttributesOnLegacy>
1212
<InjectSkipLocalsInitAttributeOnLegacy Condition="'$(InjectSkipLocalsInitAttributeOnLegacy)' == ''">true</InjectSkipLocalsInitAttributeOnLegacy>
1313
<InjectCallerAttributesOnLegacy Condition="'$(InjectCallerAttributesOnLegacy)' == ''">true</InjectCallerAttributesOnLegacy>
14-
<InjectDiagnosticAttributesOnLegacy Condition="'$(InjectDiagnosticAttributesOnLegacy)' == ''">true</InjectDiagnosticAttributesOnLegacy>
1514
<InjectSharedThrow Condition="'$(InjectSharedThrow)' == ''">true</InjectSharedThrow>
1615
</PropertyGroup>
1716
</Project>
Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
// Licensed to the .NET Foundation under one or more agreements.
2+
// The .NET Foundation licenses this file to you under the MIT license.
3+
4+
using System.IO;
5+
using System.Threading;
6+
using System.Threading.Tasks;
7+
using Microsoft.Extensions.AI.Evaluation.Console.Utilities;
8+
using Microsoft.Extensions.AI.Evaluation.Reporting.Storage;
9+
using Microsoft.Extensions.Logging;
10+
11+
namespace Microsoft.Extensions.AI.Evaluation.Console.Commands;
12+
13+
internal sealed class CleanCacheCommand(ILogger logger)
14+
{
15+
internal async Task<int> InvokeAsync(DirectoryInfo storageRootDir, CancellationToken cancellationToken = default)
16+
{
17+
string storageRootPath = storageRootDir.FullName;
18+
logger.LogInformation("Storage root path: {storageRootPath}", storageRootPath);
19+
logger.LogInformation("Deleting expired cache entries...");
20+
21+
var cacheProvider = new DiskBasedResponseCacheProvider(storageRootPath);
22+
23+
await logger.ExecuteWithCatchAsync(
24+
() => cacheProvider.DeleteExpiredCacheEntriesAsync(cancellationToken)).ConfigureAwait(false);
25+
26+
return 0;
27+
}
28+
}
Lines changed: 67 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,67 @@
1+
// Licensed to the .NET Foundation under one or more agreements.
2+
// The .NET Foundation licenses this file to you under the MIT license.
3+
4+
using System.Collections.Generic;
5+
using System.IO;
6+
using System.Threading;
7+
using System.Threading.Tasks;
8+
using Microsoft.Extensions.AI.Evaluation.Console.Utilities;
9+
using Microsoft.Extensions.AI.Evaluation.Reporting.Storage;
10+
using Microsoft.Extensions.Logging;
11+
12+
namespace Microsoft.Extensions.AI.Evaluation.Console.Commands;
13+
14+
internal sealed class CleanResultsCommand(ILogger logger)
15+
{
16+
internal async Task<int> InvokeAsync(
17+
DirectoryInfo storageRootDir,
18+
int lastN,
19+
CancellationToken cancellationToken = default)
20+
{
21+
string storageRootPath = storageRootDir.FullName;
22+
logger.LogInformation("Storage root path: {storageRootPath}", storageRootPath);
23+
24+
var resultStore = new DiskBasedResultStore(storageRootPath);
25+
26+
await logger.ExecuteWithCatchAsync(
27+
async ValueTask () =>
28+
{
29+
if (lastN is 0)
30+
{
31+
logger.LogInformation("Deleting all results...");
32+
33+
await resultStore.DeleteResultsAsync(cancellationToken: cancellationToken).ConfigureAwait(false);
34+
}
35+
else
36+
{
37+
logger.LogInformation("Deleting all results except the {lastN} most recent ones...", lastN);
38+
39+
HashSet<string> toPreserve = [];
40+
41+
await foreach (string executionName in
42+
resultStore.GetLatestExecutionNamesAsync(lastN, cancellationToken).ConfigureAwait(false))
43+
{
44+
cancellationToken.ThrowIfCancellationRequested();
45+
46+
_ = toPreserve.Add(executionName);
47+
}
48+
49+
await foreach (string executionName in
50+
resultStore.GetLatestExecutionNamesAsync(
51+
cancellationToken: cancellationToken).ConfigureAwait(false))
52+
{
53+
cancellationToken.ThrowIfCancellationRequested();
54+
55+
if (!toPreserve.Contains(executionName))
56+
{
57+
await resultStore.DeleteResultsAsync(
58+
executionName,
59+
cancellationToken: cancellationToken).ConfigureAwait(false);
60+
}
61+
}
62+
}
63+
}).ConfigureAwait(false);
64+
65+
return 0;
66+
}
67+
}
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
// Licensed to the .NET Foundation under one or more agreements.
2+
// The .NET Foundation licenses this file to you under the MIT license.
3+
4+
namespace Microsoft.Extensions.AI.Evaluation.Console.Commands;
5+
6+
internal partial class ReportCommand
7+
{
8+
internal enum Format
9+
{
10+
html,
11+
json
12+
}
13+
}
Lines changed: 67 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,67 @@
1+
// Licensed to the .NET Foundation under one or more agreements.
2+
// The .NET Foundation licenses this file to you under the MIT license.
3+
4+
using System;
5+
using System.Collections.Generic;
6+
using System.IO;
7+
using System.Threading;
8+
using System.Threading.Tasks;
9+
using Microsoft.Extensions.AI.Evaluation.Reporting;
10+
using Microsoft.Extensions.AI.Evaluation.Reporting.Formats.Html;
11+
using Microsoft.Extensions.AI.Evaluation.Reporting.Formats.Json;
12+
using Microsoft.Extensions.AI.Evaluation.Reporting.Storage;
13+
using Microsoft.Extensions.Logging;
14+
15+
namespace Microsoft.Extensions.AI.Evaluation.Console.Commands;
16+
17+
internal sealed partial class ReportCommand(ILogger logger)
18+
{
19+
internal async Task<int> InvokeAsync(
20+
DirectoryInfo storageRootDir,
21+
FileInfo outputFile,
22+
int lastN,
23+
Format format,
24+
CancellationToken cancellationToken = default)
25+
{
26+
string storageRootPath = storageRootDir.FullName;
27+
logger.LogInformation("Storage root path: {storageRootPath}", storageRootPath);
28+
29+
var results = new List<ScenarioRunResult>();
30+
var resultStore = new DiskBasedResultStore(storageRootPath);
31+
32+
await foreach (string executionName in
33+
resultStore.GetLatestExecutionNamesAsync(lastN, cancellationToken).ConfigureAwait(false))
34+
{
35+
cancellationToken.ThrowIfCancellationRequested();
36+
37+
await foreach (ScenarioRunResult result in
38+
resultStore.ReadResultsAsync(
39+
executionName,
40+
cancellationToken: cancellationToken).ConfigureAwait(false))
41+
{
42+
cancellationToken.ThrowIfCancellationRequested();
43+
44+
results.Add(result);
45+
}
46+
}
47+
48+
string outputFilePath = outputFile.FullName;
49+
string? outputPath = Path.GetDirectoryName(outputFilePath);
50+
if (outputPath is not null && !Directory.Exists(outputPath))
51+
{
52+
_ = Directory.CreateDirectory(outputPath);
53+
}
54+
55+
IEvaluationReportWriter reportWriter = format switch
56+
{
57+
Format.html => new HtmlReportWriter(outputFilePath),
58+
Format.json => new JsonReportWriter(outputFilePath),
59+
_ => throw new NotSupportedException(),
60+
};
61+
62+
await reportWriter.WriteReportAsync(results, cancellationToken).ConfigureAwait(false);
63+
logger.LogInformation("Report: {outputFilePath} [{format}]", outputFilePath, format);
64+
65+
return 0;
66+
}
67+
}

0 commit comments

Comments
 (0)