diff --git a/src/Libraries/Microsoft.Extensions.AI.Abstractions/Contents/HostedFileContent.cs b/src/Libraries/Microsoft.Extensions.AI.Abstractions/Contents/HostedFileContent.cs index 10335833eef..b3d99b55ecc 100644 --- a/src/Libraries/Microsoft.Extensions.AI.Abstractions/Contents/HostedFileContent.cs +++ b/src/Libraries/Microsoft.Extensions.AI.Abstractions/Contents/HostedFileContent.cs @@ -54,30 +54,10 @@ public string? MediaType public string? Name { get; set; } /// Gets or sets the size of the file in bytes. - [Experimental(DiagnosticIds.Experiments.AIFiles, UrlFormat = DiagnosticIds.UrlFormat)] - [JsonIgnore] - public long? SizeInBytes - { - get => SizeInBytesCore; - set => SizeInBytesCore = value; - } - - [JsonInclude] - [JsonPropertyName("sizeInBytes")] - internal long? SizeInBytesCore { get; set; } + public long? SizeInBytes { get; set; } /// Gets or sets when the file was created. - [Experimental(DiagnosticIds.Experiments.AIFiles, UrlFormat = DiagnosticIds.UrlFormat)] - [JsonIgnore] - public DateTimeOffset? CreatedAt - { - get => CreatedAtCore; - set => CreatedAtCore = value; - } - - [JsonInclude] - [JsonPropertyName("createdAt")] - internal DateTimeOffset? CreatedAtCore { get; set; } + public DateTimeOffset? CreatedAt { get; set; } /// Gets or sets the purpose for which the file was uploaded. /// diff --git a/src/Libraries/Microsoft.Extensions.AI.Abstractions/Microsoft.Extensions.AI.Abstractions.json b/src/Libraries/Microsoft.Extensions.AI.Abstractions/Microsoft.Extensions.AI.Abstractions.json index 3ebfc885c69..f48b3048be7 100644 --- a/src/Libraries/Microsoft.Extensions.AI.Abstractions/Microsoft.Extensions.AI.Abstractions.json +++ b/src/Libraries/Microsoft.Extensions.AI.Abstractions/Microsoft.Extensions.AI.Abstractions.json @@ -2399,7 +2399,7 @@ "Properties": [ { "Member": "System.DateTimeOffset? Microsoft.Extensions.AI.HostedFileContent.CreatedAt { get; set; }", - "Stage": "Experimental" + "Stage": "Stable" }, { "Member": "string Microsoft.Extensions.AI.HostedFileContent.FileId { get; set; }", @@ -2423,7 +2423,7 @@ }, { "Member": "long? Microsoft.Extensions.AI.HostedFileContent.SizeInBytes { get; set; }", - "Stage": "Experimental" + "Stage": "Stable" } ] }, diff --git a/test/Libraries/Microsoft.Extensions.AI.Abstractions.Tests/Contents/HostedFileContentTests.cs b/test/Libraries/Microsoft.Extensions.AI.Abstractions.Tests/Contents/HostedFileContentTests.cs index 87cc0baa09a..2fa1d637d61 100644 --- a/test/Libraries/Microsoft.Extensions.AI.Abstractions.Tests/Contents/HostedFileContentTests.cs +++ b/test/Libraries/Microsoft.Extensions.AI.Abstractions.Tests/Contents/HostedFileContentTests.cs @@ -1,8 +1,6 @@ // Licensed to the .NET Foundation under one or more agreements. // The .NET Foundation licenses this file to you under the MIT license. -#pragma warning disable MEAI001 - using System; using System.Text.Json; using Xunit; @@ -28,8 +26,10 @@ public void Constructor_String_PropsDefault() Assert.Null(c.AdditionalProperties); Assert.Null(c.SizeInBytes); Assert.Null(c.CreatedAt); +#pragma warning disable MEAI001 Assert.Null(c.Purpose); Assert.Null(c.Scope); +#pragma warning restore MEAI001 Assert.Equal(fileId, c.FileId); } @@ -153,6 +153,7 @@ public void CreatedAt_Roundtrips() Assert.Null(c.CreatedAt); } +#pragma warning disable MEAI001 [Fact] public void Purpose_Roundtrips() { @@ -178,6 +179,7 @@ public void Scope_Roundtrips() c.Scope = null; Assert.Null(c.Scope); } +#pragma warning restore MEAI001 [Fact] public void Serialization_IncludesExperimentalProperties() @@ -189,8 +191,10 @@ public void Serialization_IncludesExperimentalProperties() MediaType = "text/plain", SizeInBytes = 1024, CreatedAt = now, +#pragma warning disable MEAI001 Purpose = "fine-tune", Scope = "container-1", +#pragma warning restore MEAI001 }; var json = JsonSerializer.Serialize(content, AIJsonUtilities.DefaultOptions); @@ -204,8 +208,10 @@ public void Serialization_IncludesExperimentalProperties() Assert.NotNull(deserialized); Assert.Equal(1024, deserialized.SizeInBytes); Assert.Equal(now, deserialized.CreatedAt); +#pragma warning disable MEAI001 Assert.Equal("fine-tune", deserialized.Purpose); Assert.Equal("container-1", deserialized.Scope); +#pragma warning restore MEAI001 } [Theory] @@ -257,8 +263,10 @@ public void JsonDeserialization_KnownPayload() Assert.Equal("document.pdf", hostedFile.Name); Assert.Equal(1024, hostedFile.SizeInBytes); Assert.Equal(new DateTimeOffset(2024, 1, 15, 10, 30, 0, TimeSpan.Zero), hostedFile.CreatedAt); +#pragma warning disable MEAI001 Assert.Equal("assistants", hostedFile.Purpose); Assert.Equal("user", hostedFile.Scope); +#pragma warning restore MEAI001 Assert.NotNull(hostedFile.AdditionalProperties); Assert.Equal("val", hostedFile.AdditionalProperties["key"]?.ToString()); } diff --git a/test/Libraries/Microsoft.Extensions.AI.Abstractions.Tests/Image/ImageGenerationOptionsTests.cs b/test/Libraries/Microsoft.Extensions.AI.Abstractions.Tests/Image/ImageGenerationOptionsTests.cs index be47fd247c4..a8bca88fd88 100644 --- a/test/Libraries/Microsoft.Extensions.AI.Abstractions.Tests/Image/ImageGenerationOptionsTests.cs +++ b/test/Libraries/Microsoft.Extensions.AI.Abstractions.Tests/Image/ImageGenerationOptionsTests.cs @@ -35,7 +35,9 @@ public void Properties_Roundtrip() { ImageGenerationOptions options = new(); +#pragma warning disable MEAI001 // IImageGenerator is experimental Func factory = generator => new { Representation = "raw data" }; +#pragma warning restore MEAI001 options.ResponseFormat = ImageGenerationResponseFormat.Data; options.Count = 5; @@ -72,9 +74,9 @@ public void JsonSerialization_Roundtrips() ModelId = "test-model", }; - string json = JsonSerializer.Serialize(options, TestJsonSerializerContext.Default.ImageGenerationOptions); + string json = JsonSerializer.Serialize(options, AIJsonUtilities.DefaultOptions); - ImageGenerationOptions? deserialized = JsonSerializer.Deserialize(json, TestJsonSerializerContext.Default.ImageGenerationOptions); + ImageGenerationOptions? deserialized = JsonSerializer.Deserialize(json, AIJsonUtilities.DefaultOptions); Assert.NotNull(deserialized); Assert.Equal(ImageGenerationResponseFormat.Data, deserialized.ResponseFormat); @@ -116,7 +118,9 @@ public void Clone_CreatesIndependentCopy() [Theory] [InlineData(ImageGenerationResponseFormat.Uri)] [InlineData(ImageGenerationResponseFormat.Data)] +#pragma warning disable MEAI001 // ImageGenerationResponseFormat.Hosted is experimental [InlineData(ImageGenerationResponseFormat.Hosted)] +#pragma warning restore MEAI001 public void ImageGenerationResponseFormat_Values_AreValid(ImageGenerationResponseFormat responseFormat) { Assert.True(Enum.IsDefined(typeof(ImageGenerationResponseFormat), responseFormat)); @@ -127,8 +131,8 @@ public void ImageGenerationResponseFormat_JsonSerialization_Roundtrips() { foreach (ImageGenerationResponseFormat responseFormat in Enum.GetValues(typeof(ImageGenerationResponseFormat))) { - string json = JsonSerializer.Serialize(responseFormat, TestJsonSerializerContext.Default.ImageGenerationResponseFormat); - ImageGenerationResponseFormat deserialized = JsonSerializer.Deserialize(json, TestJsonSerializerContext.Default.ImageGenerationResponseFormat); + string json = JsonSerializer.Serialize(responseFormat, AIJsonUtilities.DefaultOptions); + ImageGenerationResponseFormat deserialized = JsonSerializer.Deserialize(json, AIJsonUtilities.DefaultOptions); Assert.Equal(responseFormat, deserialized); } } diff --git a/test/Libraries/Microsoft.Extensions.AI.Stabilization.Tests/Microsoft.Extensions.AI.Stabilization.Tests.csproj b/test/Libraries/Microsoft.Extensions.AI.Stabilization.Tests/Microsoft.Extensions.AI.Stabilization.Tests.csproj index 8d96f318440..3e9945a6bf2 100644 --- a/test/Libraries/Microsoft.Extensions.AI.Stabilization.Tests/Microsoft.Extensions.AI.Stabilization.Tests.csproj +++ b/test/Libraries/Microsoft.Extensions.AI.Stabilization.Tests/Microsoft.Extensions.AI.Stabilization.Tests.csproj @@ -1,7 +1,7 @@ Microsoft.Extensions.AI - Stabilization tests for ImageGeneration, CodeInterpreter, and WebSearch content types (no MEAI001 suppression). + Stabilization tests (no MEAI001 suppression). @@ -22,6 +22,7 @@ + @@ -29,6 +30,7 @@ +