From c37d937cac547cf98ee624c3c4eaf3dd38dbda7e Mon Sep 17 00:00:00 2001 From: Shay Rojansky Date: Mon, 14 Apr 2025 16:08:10 +0200 Subject: [PATCH] Rename EmbeddingGeneratorExtensions.GenerateEmbedding extension methods To align with the the base method on IEmbeddingGenerator --- .../EmbeddingGeneratorExtensions.cs | 8 ++--- .../README.md | 2 +- .../Services/SemanticSearch.cs | 2 +- .../EmbeddingGeneratorExtensionsTests.cs | 8 ++--- .../EmbeddingGeneratorIntegrationTests.cs | 10 +++--- ...istributedCachingEmbeddingGeneratorTest.cs | 32 +++++++++---------- .../LoggingEmbeddingGeneratorTests.cs | 2 +- .../OpenTelemetryEmbeddingGeneratorTests.cs | 2 +- .../aichatweb/Services/SemanticSearch.cs | 2 +- .../aichatweb.Web/Services/SemanticSearch.cs | 2 +- 10 files changed, 35 insertions(+), 35 deletions(-) diff --git a/src/Libraries/Microsoft.Extensions.AI.Abstractions/Embeddings/EmbeddingGeneratorExtensions.cs b/src/Libraries/Microsoft.Extensions.AI.Abstractions/Embeddings/EmbeddingGeneratorExtensions.cs index d8ed6967d71..895b7bf7ea7 100644 --- a/src/Libraries/Microsoft.Extensions.AI.Abstractions/Embeddings/EmbeddingGeneratorExtensions.cs +++ b/src/Libraries/Microsoft.Extensions.AI.Abstractions/Embeddings/EmbeddingGeneratorExtensions.cs @@ -99,16 +99,16 @@ public static TService GetRequiredService( /// is . /// The generator did not produce exactly one embedding. /// - /// This operation is equivalent to using and returning the + /// This operation is equivalent to using and returning the /// resulting 's property. /// - public static async Task> GenerateEmbeddingVectorAsync( + public static async Task> GenerateVectorAsync( this IEmbeddingGenerator> generator, TInput value, EmbeddingGenerationOptions? options = null, CancellationToken cancellationToken = default) { - var embedding = await GenerateEmbeddingAsync(generator, value, options, cancellationToken).ConfigureAwait(false); + var embedding = await GenerateAsync(generator, value, options, cancellationToken).ConfigureAwait(false); return embedding.Vector; } @@ -130,7 +130,7 @@ public static async Task> GenerateEmbeddingVec /// collection composed of the single and then returning the first embedding element from the /// resulting collection. /// - public static async Task GenerateEmbeddingAsync( + public static async Task GenerateAsync( this IEmbeddingGenerator generator, TInput value, EmbeddingGenerationOptions? options = null, diff --git a/src/Libraries/Microsoft.Extensions.AI.Abstractions/README.md b/src/Libraries/Microsoft.Extensions.AI.Abstractions/README.md index 0d94cacc925..08caff50fb0 100644 --- a/src/Libraries/Microsoft.Extensions.AI.Abstractions/README.md +++ b/src/Libraries/Microsoft.Extensions.AI.Abstractions/README.md @@ -522,7 +522,7 @@ using Microsoft.Extensions.AI; IEmbeddingGenerator> generator = new SampleEmbeddingGenerator(new Uri("http://coolsite.ai"), "my-custom-model"); -ReadOnlyMemory vector = generator.GenerateEmbeddingVectorAsync("What is AI?"); +ReadOnlyMemory vector = generator.GenerateVectorAsync("What is AI?"); ``` #### Pipelines of Functionality diff --git a/src/ProjectTemplates/Microsoft.Extensions.AI.Templates/src/ChatWithCustomData/ChatWithCustomData-CSharp.Web/Services/SemanticSearch.cs b/src/ProjectTemplates/Microsoft.Extensions.AI.Templates/src/ChatWithCustomData/ChatWithCustomData-CSharp.Web/Services/SemanticSearch.cs index cbe0b8b1554..e44c4144d27 100644 --- a/src/ProjectTemplates/Microsoft.Extensions.AI.Templates/src/ChatWithCustomData/ChatWithCustomData-CSharp.Web/Services/SemanticSearch.cs +++ b/src/ProjectTemplates/Microsoft.Extensions.AI.Templates/src/ChatWithCustomData/ChatWithCustomData-CSharp.Web/Services/SemanticSearch.cs @@ -9,7 +9,7 @@ public class SemanticSearch( { public async Task> SearchAsync(string text, string? filenameFilter, int maxResults) { - var queryEmbedding = await embeddingGenerator.GenerateEmbeddingVectorAsync(text); + var queryEmbedding = await embeddingGenerator.GenerateVectorAsync(text); #if (UseQdrant) var vectorCollection = vectorStore.GetCollection("data-ChatWithCustomData-CSharp.Web-ingestion"); #else diff --git a/test/Libraries/Microsoft.Extensions.AI.Abstractions.Tests/Embeddings/EmbeddingGeneratorExtensionsTests.cs b/test/Libraries/Microsoft.Extensions.AI.Abstractions.Tests/Embeddings/EmbeddingGeneratorExtensionsTests.cs index dfe970b23ca..60e15848e0f 100644 --- a/test/Libraries/Microsoft.Extensions.AI.Abstractions.Tests/Embeddings/EmbeddingGeneratorExtensionsTests.cs +++ b/test/Libraries/Microsoft.Extensions.AI.Abstractions.Tests/Embeddings/EmbeddingGeneratorExtensionsTests.cs @@ -78,8 +78,8 @@ public void GetService_ValidService_Returned() [Fact] public async Task GenerateAsync_InvalidArgs_ThrowsAsync() { - await Assert.ThrowsAsync("generator", () => ((TestEmbeddingGenerator)null!).GenerateEmbeddingAsync("hello")); - await Assert.ThrowsAsync("generator", () => ((TestEmbeddingGenerator)null!).GenerateEmbeddingVectorAsync("hello")); + await Assert.ThrowsAsync("generator", () => ((TestEmbeddingGenerator)null!).GenerateAsync("hello")); + await Assert.ThrowsAsync("generator", () => ((TestEmbeddingGenerator)null!).GenerateVectorAsync("hello")); await Assert.ThrowsAsync("generator", () => ((TestEmbeddingGenerator)null!).GenerateAndZipAsync(["hello"])); } @@ -94,8 +94,8 @@ public async Task GenerateAsync_ReturnsSingleEmbeddingAsync() Task.FromResult>>([result]) }; - Assert.Same(result, await service.GenerateEmbeddingAsync("hello")); - Assert.Equal(result.Vector, await service.GenerateEmbeddingVectorAsync("hello")); + Assert.Same(result, await service.GenerateAsync("hello")); + Assert.Equal(result.Vector, await service.GenerateVectorAsync("hello")); } [Theory] diff --git a/test/Libraries/Microsoft.Extensions.AI.Integration.Tests/EmbeddingGeneratorIntegrationTests.cs b/test/Libraries/Microsoft.Extensions.AI.Integration.Tests/EmbeddingGeneratorIntegrationTests.cs index b2a0d7a2c94..1188e899e4d 100644 --- a/test/Libraries/Microsoft.Extensions.AI.Integration.Tests/EmbeddingGeneratorIntegrationTests.cs +++ b/test/Libraries/Microsoft.Extensions.AI.Integration.Tests/EmbeddingGeneratorIntegrationTests.cs @@ -88,10 +88,10 @@ public virtual async Task Caching_SameOutputsForSameInput() .Build(); string input = "Red, White, and Blue"; - var embedding1 = await generator.GenerateEmbeddingAsync(input); - var embedding2 = await generator.GenerateEmbeddingAsync(input); - var embedding3 = await generator.GenerateEmbeddingAsync(input + "... and Green"); - var embedding4 = await generator.GenerateEmbeddingAsync(input); + var embedding1 = await generator.GenerateAsync(input); + var embedding2 = await generator.GenerateAsync(input); + var embedding3 = await generator.GenerateAsync(input + "... and Green"); + var embedding4 = await generator.GenerateAsync(input); var callCounter = generator.GetService(); Assert.NotNull(callCounter); @@ -116,7 +116,7 @@ public virtual async Task OpenTelemetry_CanEmitTracesAndMetrics() .UseOpenTelemetry(sourceName: sourceName) .Build(); - _ = await embeddingGenerator.GenerateEmbeddingAsync("Hello, world!"); + _ = await embeddingGenerator.GenerateAsync("Hello, world!"); Assert.Single(activities); var activity = activities.Single(); diff --git a/test/Libraries/Microsoft.Extensions.AI.Tests/Embeddings/DistributedCachingEmbeddingGeneratorTest.cs b/test/Libraries/Microsoft.Extensions.AI.Tests/Embeddings/DistributedCachingEmbeddingGeneratorTest.cs index 04a7c574d53..6153ec8ab45 100644 --- a/test/Libraries/Microsoft.Extensions.AI.Tests/Embeddings/DistributedCachingEmbeddingGeneratorTest.cs +++ b/test/Libraries/Microsoft.Extensions.AI.Tests/Embeddings/DistributedCachingEmbeddingGeneratorTest.cs @@ -43,12 +43,12 @@ public async Task CachesSuccessResultsAsync() }; // Make the initial request and do a quick sanity check - var result1 = await outer.GenerateEmbeddingAsync("abc"); + var result1 = await outer.GenerateAsync("abc"); AssertEmbeddingsEqual(_expectedEmbedding, result1); Assert.Equal(1, innerCallCount); // Act - var result2 = await outer.GenerateEmbeddingAsync("abc"); + var result2 = await outer.GenerateAsync("abc"); // Assert Assert.Equal(1, innerCallCount); @@ -134,8 +134,8 @@ public async Task AllowsConcurrentCallsAsync() }; // Act 1: Concurrent calls before resolution are passed into the inner client - var result1 = outer.GenerateEmbeddingAsync("abc"); - var result2 = outer.GenerateEmbeddingAsync("abc"); + var result1 = outer.GenerateAsync("abc"); + var result2 = outer.GenerateAsync("abc"); // Assert 1 Assert.Equal(2, innerCallCount); @@ -146,7 +146,7 @@ public async Task AllowsConcurrentCallsAsync() AssertEmbeddingsEqual(_expectedEmbedding, await result2); // Act 2: Subsequent calls after completion are resolved from the cache - var result3 = await outer.GenerateEmbeddingAsync("abc"); + var result3 = await outer.GenerateAsync("abc"); Assert.Equal(2, innerCallCount); AssertEmbeddingsEqual(_expectedEmbedding, await result1); } @@ -169,12 +169,12 @@ public async Task DoesNotCacheExceptionResultsAsync() JsonSerializerOptions = TestJsonSerializerContext.Default.Options, }; - var ex1 = await Assert.ThrowsAsync(() => outer.GenerateEmbeddingAsync("abc")); + var ex1 = await Assert.ThrowsAsync(() => outer.GenerateAsync("abc")); Assert.Equal("some failure", ex1.Message); Assert.Equal(1, innerCallCount); // Act - var ex2 = await Assert.ThrowsAsync(() => outer.GenerateEmbeddingAsync("abc")); + var ex2 = await Assert.ThrowsAsync(() => outer.GenerateAsync("abc")); // Assert Assert.NotSame(ex1, ex2); @@ -207,7 +207,7 @@ public async Task DoesNotCacheCanceledResultsAsync() }; // First call gets cancelled - var result1 = outer.GenerateEmbeddingAsync("abc"); + var result1 = outer.GenerateAsync("abc"); Assert.False(result1.IsCompleted); Assert.Equal(1, innerCallCount); resolutionTcs.SetCanceled(); @@ -215,7 +215,7 @@ public async Task DoesNotCacheCanceledResultsAsync() Assert.True(result1.IsCanceled); // Act/Assert: Second call can succeed - var result2 = await outer.GenerateEmbeddingAsync("abc"); + var result2 = await outer.GenerateAsync("abc"); Assert.Equal(2, innerCallCount); AssertEmbeddingsEqual(_expectedEmbedding, result2); } @@ -241,11 +241,11 @@ public async Task CacheKeyVariesByEmbeddingOptionsAsync() }; // Act: Call with two different EmbeddingGenerationOptions that have the same values - var result1 = await outer.GenerateEmbeddingAsync("abc", new EmbeddingGenerationOptions + var result1 = await outer.GenerateAsync("abc", new EmbeddingGenerationOptions { AdditionalProperties = new() { ["someKey"] = "value 1" } }); - var result2 = await outer.GenerateEmbeddingAsync("abc", new EmbeddingGenerationOptions + var result2 = await outer.GenerateAsync("abc", new EmbeddingGenerationOptions { AdditionalProperties = new() { ["someKey"] = "value 1" } }); @@ -256,11 +256,11 @@ public async Task CacheKeyVariesByEmbeddingOptionsAsync() AssertEmbeddingsEqual(new("value 1".Select(c => (float)c).ToArray()), result2); // Act: Call with two different EmbeddingGenerationOptions that have different values - var result3 = await outer.GenerateEmbeddingAsync("abc", new EmbeddingGenerationOptions + var result3 = await outer.GenerateAsync("abc", new EmbeddingGenerationOptions { AdditionalProperties = new() { ["someKey"] = "value 1" } }); - var result4 = await outer.GenerateEmbeddingAsync("abc", new EmbeddingGenerationOptions + var result4 = await outer.GenerateAsync("abc", new EmbeddingGenerationOptions { AdditionalProperties = new() { ["someKey"] = "value 2" } }); @@ -292,11 +292,11 @@ public async Task SubclassCanOverrideCacheKeyToVaryByOptionsAsync() }; // Act: Call with two different options - var result1 = await outer.GenerateEmbeddingAsync("abc", new EmbeddingGenerationOptions + var result1 = await outer.GenerateAsync("abc", new EmbeddingGenerationOptions { AdditionalProperties = new() { ["someKey"] = "value 1" } }); - var result2 = await outer.GenerateEmbeddingAsync("abc", new EmbeddingGenerationOptions + var result2 = await outer.GenerateAsync("abc", new EmbeddingGenerationOptions { AdditionalProperties = new() { ["someKey"] = "value 2" } }); @@ -331,7 +331,7 @@ public async Task CanResolveIDistributedCacheFromDI() // Act: Make a request that should populate the cache Assert.Empty(_storage.Keys); - var result = await outer.GenerateEmbeddingAsync("abc"); + var result = await outer.GenerateAsync("abc"); // Assert Assert.NotNull(result); diff --git a/test/Libraries/Microsoft.Extensions.AI.Tests/Embeddings/LoggingEmbeddingGeneratorTests.cs b/test/Libraries/Microsoft.Extensions.AI.Tests/Embeddings/LoggingEmbeddingGeneratorTests.cs index 23600eac43b..737a7576821 100644 --- a/test/Libraries/Microsoft.Extensions.AI.Tests/Embeddings/LoggingEmbeddingGeneratorTests.cs +++ b/test/Libraries/Microsoft.Extensions.AI.Tests/Embeddings/LoggingEmbeddingGeneratorTests.cs @@ -64,7 +64,7 @@ public async Task GetResponseAsync_LogsResponseInvocationAndCompletion(LogLevel .UseLogging() .Build(services); - await generator.GenerateEmbeddingAsync("Blue whale"); + await generator.GenerateAsync("Blue whale"); var logs = collector.GetSnapshot(); if (level is LogLevel.Trace) diff --git a/test/Libraries/Microsoft.Extensions.AI.Tests/Embeddings/OpenTelemetryEmbeddingGeneratorTests.cs b/test/Libraries/Microsoft.Extensions.AI.Tests/Embeddings/OpenTelemetryEmbeddingGeneratorTests.cs index 847bf49be06..c6a4adb1e97 100644 --- a/test/Libraries/Microsoft.Extensions.AI.Tests/Embeddings/OpenTelemetryEmbeddingGeneratorTests.cs +++ b/test/Libraries/Microsoft.Extensions.AI.Tests/Embeddings/OpenTelemetryEmbeddingGeneratorTests.cs @@ -69,7 +69,7 @@ public async Task ExpectedInformationLogged_Async(string? perRequestModelId) }, }; - await generator.GenerateEmbeddingVectorAsync("hello", options); + await generator.GenerateVectorAsync("hello", options); var activity = Assert.Single(activities); var expectedModelName = perRequestModelId ?? "defaultmodel"; diff --git a/test/ProjectTemplates/Microsoft.Extensions.AI.Templates.IntegrationTests/Snapshots/aichatweb.Basic.verified/aichatweb/Services/SemanticSearch.cs b/test/ProjectTemplates/Microsoft.Extensions.AI.Templates.IntegrationTests/Snapshots/aichatweb.Basic.verified/aichatweb/Services/SemanticSearch.cs index 6b74a95ace4..1ac3977d014 100644 --- a/test/ProjectTemplates/Microsoft.Extensions.AI.Templates.IntegrationTests/Snapshots/aichatweb.Basic.verified/aichatweb/Services/SemanticSearch.cs +++ b/test/ProjectTemplates/Microsoft.Extensions.AI.Templates.IntegrationTests/Snapshots/aichatweb.Basic.verified/aichatweb/Services/SemanticSearch.cs @@ -9,7 +9,7 @@ public class SemanticSearch( { public async Task> SearchAsync(string text, string? filenameFilter, int maxResults) { - var queryEmbedding = await embeddingGenerator.GenerateEmbeddingVectorAsync(text); + var queryEmbedding = await embeddingGenerator.GenerateVectorAsync(text); var vectorCollection = vectorStore.GetCollection("data-aichatweb-ingested"); var nearest = await vectorCollection.VectorizedSearchAsync(queryEmbedding, new VectorSearchOptions diff --git a/test/ProjectTemplates/Microsoft.Extensions.AI.Templates.IntegrationTests/Snapshots/aichatweb.BasicAspire--aspire.verified/aichatweb/aichatweb.Web/Services/SemanticSearch.cs b/test/ProjectTemplates/Microsoft.Extensions.AI.Templates.IntegrationTests/Snapshots/aichatweb.BasicAspire--aspire.verified/aichatweb/aichatweb.Web/Services/SemanticSearch.cs index 5419ac9e7bd..4f775cd1db4 100644 --- a/test/ProjectTemplates/Microsoft.Extensions.AI.Templates.IntegrationTests/Snapshots/aichatweb.BasicAspire--aspire.verified/aichatweb/aichatweb.Web/Services/SemanticSearch.cs +++ b/test/ProjectTemplates/Microsoft.Extensions.AI.Templates.IntegrationTests/Snapshots/aichatweb.BasicAspire--aspire.verified/aichatweb/aichatweb.Web/Services/SemanticSearch.cs @@ -9,7 +9,7 @@ public class SemanticSearch( { public async Task> SearchAsync(string text, string? filenameFilter, int maxResults) { - var queryEmbedding = await embeddingGenerator.GenerateEmbeddingVectorAsync(text); + var queryEmbedding = await embeddingGenerator.GenerateVectorAsync(text); var vectorCollection = vectorStore.GetCollection("data-aichatweb-ingested"); var nearest = await vectorCollection.VectorizedSearchAsync(queryEmbedding, new VectorSearchOptions