From 40400f27a5bfd23b52d7e4efc1ca933f0d73fa66 Mon Sep 17 00:00:00 2001 From: Roger Barreto <19890735+RogerBarreto@users.noreply.github.com> Date: Thu, 27 Jun 2024 16:33:54 +0100 Subject: [PATCH 01/17] WIP --- .../Core/ClientCore .TextToAudio.cs | 76 ++++++++++ .../OpenAITextToAudioExecutionSettings.cs | 135 ++++++++++++++++++ .../Services/OpenAITextToAudioService.cs | 61 ++++++++ 3 files changed, 272 insertions(+) create mode 100644 dotnet/src/Connectors/Connectors.OpenAIV2/Core/ClientCore .TextToAudio.cs create mode 100644 dotnet/src/Connectors/Connectors.OpenAIV2/OpenAITextToAudioExecutionSettings.cs create mode 100644 dotnet/src/Connectors/Connectors.OpenAIV2/Services/OpenAITextToAudioService.cs diff --git a/dotnet/src/Connectors/Connectors.OpenAIV2/Core/ClientCore .TextToAudio.cs b/dotnet/src/Connectors/Connectors.OpenAIV2/Core/ClientCore .TextToAudio.cs new file mode 100644 index 000000000000..ecaa87436057 --- /dev/null +++ b/dotnet/src/Connectors/Connectors.OpenAIV2/Core/ClientCore .TextToAudio.cs @@ -0,0 +1,76 @@ +// Copyright (c) Microsoft. All rights reserved. + +/* +Phase 02 + +- This class was created focused in the Image Generation using the SDK client instead of the own client in V1. +- Added Checking for empty or whitespace prompt. +- Removed the format parameter as this is never called in V1 code. Plan to implement it in the future once we change the ITextToImageService abstraction, using PromptExecutionSettings. +- Allow custom size for images when the endpoint is not the default OpenAI v1 endpoint. +*/ + +using System; +using System.ClientModel; +using System.Collections.Generic; +using System.Threading; +using System.Threading.Tasks; +using OpenAI.Audio; + +namespace Microsoft.SemanticKernel.Connectors.OpenAI; + +/// +/// Base class for AI clients that provides common functionality for interacting with OpenAI services. +/// +internal partial class ClientCore +{ + /// + /// Generates an image with the provided configuration. + /// + /// Prompt to generate the image + /// Text to Audio execution settings for the prompt + /// The to monitor for cancellation requests. The default is . + /// Url of the generated image + internal async Task> GetAudioContentAsync( + string prompt, + PromptExecutionSettings? executionSettings, + CancellationToken cancellationToken) + { + Verify.NotNullOrWhiteSpace(prompt); + + OpenAITextToAudioExecutionSettings? audioExecutionSettings = OpenAITextToAudioExecutionSettings.FromExecutionSettings(executionSettings); + var (responseFormat, mimeType) = GetGeneratedSpeechFormatAndMimeType(audioExecutionSettings?.ResponseFormat); + SpeechGenerationOptions options = new() + { + ResponseFormat = responseFormat, + Speed = audioExecutionSettings?.Speed, + }; + + ClientResult response = await RunRequestAsync(() => this.Client.GetAudioClient(this.ModelId).GenerateSpeechFromTextAsync(prompt, GetGeneratedSpeechVoice(audioExecutionSettings?.Voice), options, cancellationToken)).ConfigureAwait(false); + + return [new AudioContent(response.Value.ToArray(), mimeType)]; + } + + private static GeneratedSpeechVoice GetGeneratedSpeechVoice(string? voice) + => voice?.ToUpperInvariant() switch + { + "ALLOY" => GeneratedSpeechVoice.Alloy, + "ECHO" => GeneratedSpeechVoice.Echo, + "FABLE" => GeneratedSpeechVoice.Fable, + "ONYX" => GeneratedSpeechVoice.Onyx, + "NOVA" => GeneratedSpeechVoice.Nova, + "SHIMMER" => GeneratedSpeechVoice.Shimmer, + _ => throw new NotSupportedException($"The voice '{voice}' is not supported."), + }; + + private static (GeneratedSpeechFormat, string) GetGeneratedSpeechFormatAndMimeType(string? format) + => format?.ToUpperInvariant() switch + { + "WAV" => (GeneratedSpeechFormat.Wav, "audio/wav"), + "MP3" => (GeneratedSpeechFormat.Mp3, "audio/mpeg"), + "OPUS" => (GeneratedSpeechFormat.Opus, "audio/opus"), + "FLAC" => (GeneratedSpeechFormat.Flac, "audio/flac"), + "AAC" => (GeneratedSpeechFormat.Aac, "audio/aac"), + "PCM" => (GeneratedSpeechFormat.Pcm, "audio/l16"), + _ => throw new NotSupportedException($"The format '{format}' is not supported.") + }; +} diff --git a/dotnet/src/Connectors/Connectors.OpenAIV2/OpenAITextToAudioExecutionSettings.cs b/dotnet/src/Connectors/Connectors.OpenAIV2/OpenAITextToAudioExecutionSettings.cs new file mode 100644 index 000000000000..c3fc399c0276 --- /dev/null +++ b/dotnet/src/Connectors/Connectors.OpenAIV2/OpenAITextToAudioExecutionSettings.cs @@ -0,0 +1,135 @@ +// Copyright (c) Microsoft. All rights reserved. + +/* Phase 4 +Bringing the OpenAITextToAudioExecutionSettings class to the OpenAIV2 connector as is + +*/ + +using System; +using System.Collections.Generic; +using System.Diagnostics.CodeAnalysis; +using System.Text.Json; +using System.Text.Json.Serialization; +using Microsoft.SemanticKernel.Text; + +namespace Microsoft.SemanticKernel.Connectors.OpenAI; + +/// +/// Execution settings for OpenAI text-to-audio request. +/// +[Experimental("SKEXP0001")] +public sealed class OpenAITextToAudioExecutionSettings : PromptExecutionSettings +{ + /// + /// The voice to use when generating the audio. Supported voices are alloy, echo, fable, onyx, nova, and shimmer. + /// + [JsonPropertyName("voice")] + public string Voice + { + get => this._voice; + + set + { + this.ThrowIfFrozen(); + this._voice = value; + } + } + + /// + /// The format to audio in. Supported formats are mp3, opus, aac, and flac. + /// + [JsonPropertyName("response_format")] + public string ResponseFormat + { + get => this._responseFormat; + + set + { + this.ThrowIfFrozen(); + this._responseFormat = value; + } + } + + /// + /// The speed of the generated audio. Select a value from 0.25 to 4.0. 1.0 is the default. + /// + [JsonPropertyName("speed")] + public float Speed + { + get => this._speed; + + set + { + this.ThrowIfFrozen(); + this._speed = value; + } + } + + /// + /// Creates an instance of class with default voice - "alloy". + /// + public OpenAITextToAudioExecutionSettings() + : this(DefaultVoice) + { + } + + /// + /// Creates an instance of class. + /// + /// The voice to use when generating the audio. Supported voices are alloy, echo, fable, onyx, nova, and shimmer. + public OpenAITextToAudioExecutionSettings(string voice) + { + this._voice = voice; + } + + /// + public override PromptExecutionSettings Clone() + { + return new OpenAITextToAudioExecutionSettings(this.Voice) + { + ModelId = this.ModelId, + ExtensionData = this.ExtensionData is not null ? new Dictionary(this.ExtensionData) : null, + Speed = this.Speed, + ResponseFormat = this.ResponseFormat + }; + } + + /// + /// Converts to derived type. + /// + /// Instance of . + /// Instance of . + public static OpenAITextToAudioExecutionSettings? FromExecutionSettings(PromptExecutionSettings? executionSettings) + { + if (executionSettings is null) + { + return new OpenAITextToAudioExecutionSettings(); + } + + if (executionSettings is OpenAITextToAudioExecutionSettings settings) + { + return settings; + } + + var json = JsonSerializer.Serialize(executionSettings); + + var openAIExecutionSettings = JsonSerializer.Deserialize(json, JsonOptionsCache.ReadPermissive); + + if (openAIExecutionSettings is not null) + { + return openAIExecutionSettings; + } + + throw new ArgumentException($"Invalid execution settings, cannot convert to {nameof(OpenAITextToAudioExecutionSettings)}", nameof(executionSettings)); + } + + #region private ================================================================================ + + private const string DefaultVoice = "alloy"; + + private float _speed = 1.0f; + private string _responseFormat = "mp3"; + private string _voice; + + #endregion +} diff --git a/dotnet/src/Connectors/Connectors.OpenAIV2/Services/OpenAITextToAudioService.cs b/dotnet/src/Connectors/Connectors.OpenAIV2/Services/OpenAITextToAudioService.cs new file mode 100644 index 000000000000..bd03b6615f7e --- /dev/null +++ b/dotnet/src/Connectors/Connectors.OpenAIV2/Services/OpenAITextToAudioService.cs @@ -0,0 +1,61 @@ +// Copyright (c) Microsoft. All rights reserved. + +using System; +using System.Collections.Generic; +using System.Diagnostics.CodeAnalysis; +using System.Net.Http; +using System.Threading; +using System.Threading.Tasks; +using Microsoft.Extensions.Logging; +using Microsoft.SemanticKernel.Services; +using Microsoft.SemanticKernel.TextToAudio; + +namespace Microsoft.SemanticKernel.Connectors.OpenAI; + +/// +/// OpenAI text-to-audio service. +/// +[Experimental("SKEXP0001")] +public sealed class OpenAITextToAudioService : ITextToAudioService +{ + /// + /// OpenAI text-to-audio client for HTTP operations. + /// + private readonly ClientCore _client; + + /// + /// Gets the attribute name used to store the organization in the dictionary. + /// + public static string OrganizationKey => "Organization"; + + /// + public IReadOnlyDictionary Attributes => this._client.Attributes; + + /// + /// Creates an instance of the with API key auth. + /// + /// Model name + /// OpenAI API Key + /// OpenAI Organization Id (usually optional) + /// Non-default endpoint for the OpenAI API. + /// Custom for HTTP requests. + /// The to use for logging. If null, no logging will be performed. + public OpenAITextToAudioService( + string modelId, + string apiKey, + string? organization = null, + Uri? endpoint = null, + HttpClient? httpClient = null, + ILoggerFactory? loggerFactory = null) + { + this._client = new(modelId, apiKey, organization, endpoint, httpClient, loggerFactory?.CreateLogger(typeof(OpenAITextToAudioService))); + } + + /// + public async Task> GetAudioContentsAsync( + string text, + PromptExecutionSettings? executionSettings = null, + Kernel? kernel = null, + CancellationToken cancellationToken = default) + => [await this._client.GetAudioContentAsync(text, executionSettings, cancellationToken)]; +} From 1109159aa073b728f95252c2b17e24ed79f7a3bd Mon Sep 17 00:00:00 2001 From: Roger Barreto <19890735+RogerBarreto@users.noreply.github.com> Date: Fri, 28 Jun 2024 22:17:25 +0100 Subject: [PATCH 02/17] WIP --- .../Connectors.OpenAIV2/Core/ClientCore .TextToAudio.cs | 2 +- .../Connectors.OpenAIV2/Services/OpenAITextToAudioService.cs | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/dotnet/src/Connectors/Connectors.OpenAIV2/Core/ClientCore .TextToAudio.cs b/dotnet/src/Connectors/Connectors.OpenAIV2/Core/ClientCore .TextToAudio.cs index ecaa87436057..1fcad0f0fac2 100644 --- a/dotnet/src/Connectors/Connectors.OpenAIV2/Core/ClientCore .TextToAudio.cs +++ b/dotnet/src/Connectors/Connectors.OpenAIV2/Core/ClientCore .TextToAudio.cs @@ -30,7 +30,7 @@ internal partial class ClientCore /// Text to Audio execution settings for the prompt /// The to monitor for cancellation requests. The default is . /// Url of the generated image - internal async Task> GetAudioContentAsync( + internal async Task> GetAudioContentsAsync( string prompt, PromptExecutionSettings? executionSettings, CancellationToken cancellationToken) diff --git a/dotnet/src/Connectors/Connectors.OpenAIV2/Services/OpenAITextToAudioService.cs b/dotnet/src/Connectors/Connectors.OpenAIV2/Services/OpenAITextToAudioService.cs index bd03b6615f7e..b8255be45343 100644 --- a/dotnet/src/Connectors/Connectors.OpenAIV2/Services/OpenAITextToAudioService.cs +++ b/dotnet/src/Connectors/Connectors.OpenAIV2/Services/OpenAITextToAudioService.cs @@ -52,10 +52,10 @@ public OpenAITextToAudioService( } /// - public async Task> GetAudioContentsAsync( + public Task> GetAudioContentsAsync( string text, PromptExecutionSettings? executionSettings = null, Kernel? kernel = null, CancellationToken cancellationToken = default) - => [await this._client.GetAudioContentAsync(text, executionSettings, cancellationToken)]; + => this._client.GetAudioContentsAsync(text, executionSettings, cancellationToken); } From 487e1a4c7f6f30aee63a9fd9ab8db07d71dc51c4 Mon Sep 17 00:00:00 2001 From: Roger Barreto <19890735+RogerBarreto@users.noreply.github.com> Date: Mon, 1 Jul 2024 14:54:38 +0100 Subject: [PATCH 03/17] Updating tests --- .../Services/OpenAITextToAudioServiceTests.cs | 141 ++++++++++++++++++ .../Services/OpenAITextToImageServiceTests.cs | 2 +- .../OpenAITextToAudioExecutionSettings.cs | 4 +- 3 files changed, 144 insertions(+), 3 deletions(-) create mode 100644 dotnet/src/Connectors/Connectors.OpenAIV2.UnitTests/Services/OpenAITextToAudioServiceTests.cs diff --git a/dotnet/src/Connectors/Connectors.OpenAIV2.UnitTests/Services/OpenAITextToAudioServiceTests.cs b/dotnet/src/Connectors/Connectors.OpenAIV2.UnitTests/Services/OpenAITextToAudioServiceTests.cs new file mode 100644 index 000000000000..95ebb94f5fa3 --- /dev/null +++ b/dotnet/src/Connectors/Connectors.OpenAIV2.UnitTests/Services/OpenAITextToAudioServiceTests.cs @@ -0,0 +1,141 @@ +// Copyright (c) Microsoft. All rights reserved. + +using System; +using System.IO; +using System.Linq; +using System.Net; +using System.Net.Http; +using System.Threading.Tasks; +using Microsoft.Extensions.Logging; +using Microsoft.SemanticKernel.Connectors.OpenAI; +using Moq; +using Xunit; + +namespace SemanticKernel.Connectors.OpenAI.UnitTests.Services; + +/// +/// Unit tests for class. +/// +public sealed class OpenAITextToAudioServiceTests : IDisposable +{ + private readonly HttpMessageHandlerStub _messageHandlerStub; + private readonly HttpClient _httpClient; + private readonly Mock _mockLoggerFactory; + + public OpenAITextToAudioServiceTests() + { + this._messageHandlerStub = new HttpMessageHandlerStub(); + this._httpClient = new HttpClient(this._messageHandlerStub, false); + this._mockLoggerFactory = new Mock(); + } + + [Theory] + [InlineData(true)] + [InlineData(false)] + public void ConstructorWithApiKeyWorksCorrectly(bool includeLoggerFactory) + { + // Arrange & Act + var service = includeLoggerFactory ? + new OpenAITextToAudioService("model-id", "api-key", "organization", loggerFactory: this._mockLoggerFactory.Object) : + new OpenAITextToAudioService("model-id", "api-key", "organization"); + + // Assert + Assert.NotNull(service); + Assert.Equal("model-id", service.Attributes["ModelId"]); + } + + [Theory] + [MemberData(nameof(ExecutionSettings))] + public async Task GetAudioContentWithInvalidSettingsThrowsExceptionAsync(OpenAITextToAudioExecutionSettings? settings, Type expectedExceptionType) + { + // Arrange + var service = new OpenAITextToAudioService("model-id", "api-key", "organization", null, this._httpClient); + await using var stream = new MemoryStream([0x00, 0x00, 0xFF, 0x7F]); + + this._messageHandlerStub.ResponseToReturn = new HttpResponseMessage(HttpStatusCode.OK) + { + Content = new StreamContent(stream) + }; + + // Act + var exception = await Assert.ThrowsAnyAsync(async () => await service.GetAudioContentsAsync("Some text", settings)); + + // Assert + Assert.NotNull(exception); + Assert.IsType(expectedExceptionType, exception); + } + + [Fact] + public async Task GetAudioContentByDefaultWorksCorrectlyAsync() + { + // Arrange + byte[] expectedByteArray = [0x00, 0x00, 0xFF, 0x7F]; + + var service = new OpenAITextToAudioService("model-id", "api-key", "organization", null, this._httpClient); + await using var stream = new MemoryStream(expectedByteArray); + + this._messageHandlerStub.ResponseToReturn = new HttpResponseMessage(HttpStatusCode.OK) + { + Content = new StreamContent(stream) + }; + + // Act + var result = await service.GetAudioContentsAsync("Some text"); + + // Assert + var audioData = result[0].Data!.Value; + Assert.False(audioData.IsEmpty); + Assert.True(audioData.Span.SequenceEqual(expectedByteArray)); + } + + [Fact] + public async Task GetAudioContentThrowsWhenVoiceIsNotSupportedAsync() + { + // Arrange + byte[] expectedByteArray = [0x00, 0x00, 0xFF, 0x7F]; + + var service = new OpenAITextToAudioService("model-id", "api-key", "organization", null, this._httpClient); + + // Act & Assert + await Assert.ThrowsAsync(async () => await service.GetAudioContentsAsync("Some text", new OpenAITextToAudioExecutionSettings("voice"))); + } + + [Theory] + [InlineData(true, "http://local-endpoint")] + [InlineData(false, "https://api.openai.com")] + public async Task GetAudioContentUsesValidBaseUrlAsync(bool useHttpClientBaseAddress, string expectedBaseAddress) + { + // Arrange + byte[] expectedByteArray = [0x00, 0x00, 0xFF, 0x7F]; + + if (useHttpClientBaseAddress) + { + this._httpClient.BaseAddress = new Uri("http://local-endpoint"); + } + + var service = new OpenAITextToAudioService("model-id", "api-key", "organization", null, this._httpClient); + await using var stream = new MemoryStream(expectedByteArray); + + this._messageHandlerStub.ResponseToReturn = new HttpResponseMessage(HttpStatusCode.OK) + { + Content = new StreamContent(stream) + }; + + // Act + var result = await service.GetAudioContentsAsync("Some text"); + + // Assert + Assert.StartsWith(expectedBaseAddress, this._messageHandlerStub.RequestUri!.AbsoluteUri, StringComparison.InvariantCulture); + } + + public void Dispose() + { + this._httpClient.Dispose(); + this._messageHandlerStub.Dispose(); + } + + public static TheoryData ExecutionSettings => new() + { + { new OpenAITextToAudioExecutionSettings("invalid"), typeof(NotSupportedException) }, + }; +} diff --git a/dotnet/src/Connectors/Connectors.OpenAIV2.UnitTests/Services/OpenAITextToImageServiceTests.cs b/dotnet/src/Connectors/Connectors.OpenAIV2.UnitTests/Services/OpenAITextToImageServiceTests.cs index 919b864327e8..f449059e8ab5 100644 --- a/dotnet/src/Connectors/Connectors.OpenAIV2.UnitTests/Services/OpenAITextToImageServiceTests.cs +++ b/dotnet/src/Connectors/Connectors.OpenAIV2.UnitTests/Services/OpenAITextToImageServiceTests.cs @@ -11,7 +11,7 @@ using OpenAI; using Xunit; -namespace SemanticKernel.Connectors.UnitTests.OpenAI.Services; +namespace SemanticKernel.Connectors.OpenAI.UnitTests.Services; /// /// Unit tests for class. diff --git a/dotnet/src/Connectors/Connectors.OpenAIV2/OpenAITextToAudioExecutionSettings.cs b/dotnet/src/Connectors/Connectors.OpenAIV2/OpenAITextToAudioExecutionSettings.cs index c3fc399c0276..0174fca473ae 100644 --- a/dotnet/src/Connectors/Connectors.OpenAIV2/OpenAITextToAudioExecutionSettings.cs +++ b/dotnet/src/Connectors/Connectors.OpenAIV2/OpenAITextToAudioExecutionSettings.cs @@ -77,9 +77,9 @@ public OpenAITextToAudioExecutionSettings() /// Creates an instance of class. /// /// The voice to use when generating the audio. Supported voices are alloy, echo, fable, onyx, nova, and shimmer. - public OpenAITextToAudioExecutionSettings(string voice) + public OpenAITextToAudioExecutionSettings(string? voice) { - this._voice = voice; + this._voice = voice ?? DefaultVoice; } /// From 7e85f1479ca756ca590d5434e8984fb713cc9cc8 Mon Sep 17 00:00:00 2001 From: Roger Barreto <19890735+RogerBarreto@users.noreply.github.com> Date: Mon, 1 Jul 2024 15:23:53 +0100 Subject: [PATCH 04/17] Add missing UTs --- .../KernelBuilderExtensionsTests.cs | 31 ++++++++ .../ServiceCollectionExtensionsTests.cs | 31 ++++++++ .../OpenAIKernelBuilderExtensions.cs | 74 ++++++++++++++++++- .../OpenAIServiceCollectionExtensions.cs | 63 +++++++++++++++- .../Services/OpenAITextToAudioService.cs | 17 ++++- 5 files changed, 212 insertions(+), 4 deletions(-) diff --git a/dotnet/src/Connectors/Connectors.OpenAIV2.UnitTests/Extensions/KernelBuilderExtensionsTests.cs b/dotnet/src/Connectors/Connectors.OpenAIV2.UnitTests/Extensions/KernelBuilderExtensionsTests.cs index f296000c5245..1087da8adc83 100644 --- a/dotnet/src/Connectors/Connectors.OpenAIV2.UnitTests/Extensions/KernelBuilderExtensionsTests.cs +++ b/dotnet/src/Connectors/Connectors.OpenAIV2.UnitTests/Extensions/KernelBuilderExtensionsTests.cs @@ -3,6 +3,7 @@ using Microsoft.SemanticKernel; using Microsoft.SemanticKernel.Embeddings; using Microsoft.SemanticKernel.Services; +using Microsoft.SemanticKernel.TextToAudio; using Microsoft.SemanticKernel.TextToImage; using OpenAI; using Xunit; @@ -70,4 +71,34 @@ public void ItCanAddTextToImageServiceWithOpenAIClient() // Assert Assert.Equal("model", service.Attributes[AIServiceExtensions.ModelIdKey]); } + + [Fact] + public void ItCanAddTextToAudioService() + { + // Arrange + var sut = Kernel.CreateBuilder(); + + // Act + var service = sut.AddOpenAITextToAudio("model", "key") + .Build() + .GetRequiredService(); + + // Assert + Assert.Equal("model", service.Attributes[AIServiceExtensions.ModelIdKey]); + } + + [Fact] + public void ItCanAddTextToAudioServiceWithOpenAIClient() + { + // Arrange + var sut = Kernel.CreateBuilder(); + + // Act + var service = sut.AddOpenAITextToAudio("model", new OpenAIClient("key")) + .Build() + .GetRequiredService(); + + // Assert + Assert.Equal("model", service.Attributes[AIServiceExtensions.ModelIdKey]); + } } diff --git a/dotnet/src/Connectors/Connectors.OpenAIV2.UnitTests/Extensions/ServiceCollectionExtensionsTests.cs b/dotnet/src/Connectors/Connectors.OpenAIV2.UnitTests/Extensions/ServiceCollectionExtensionsTests.cs index 65db68eea180..834ff87606a4 100644 --- a/dotnet/src/Connectors/Connectors.OpenAIV2.UnitTests/Extensions/ServiceCollectionExtensionsTests.cs +++ b/dotnet/src/Connectors/Connectors.OpenAIV2.UnitTests/Extensions/ServiceCollectionExtensionsTests.cs @@ -4,6 +4,7 @@ using Microsoft.SemanticKernel; using Microsoft.SemanticKernel.Embeddings; using Microsoft.SemanticKernel.Services; +using Microsoft.SemanticKernel.TextToAudio; using Microsoft.SemanticKernel.TextToImage; using OpenAI; using Xunit; @@ -71,4 +72,34 @@ public void ItCanAddImageToTextServiceWithOpenAIClient() // Assert Assert.Equal("model", service.Attributes[AIServiceExtensions.ModelIdKey]); } + + [Fact] + public void ItCanAddTextToAudioService() + { + // Arrange + var sut = new ServiceCollection(); + + // Act + var service = sut.AddOpenAITextToAudio("model", "key") + .BuildServiceProvider() + .GetRequiredService(); + + // Assert + Assert.Equal("model", service.Attributes[AIServiceExtensions.ModelIdKey]); + } + + [Fact] + public void ItCanAddTextToAudioServiceWithOpenAIClient() + { + // Arrange + var sut = new ServiceCollection(); + + // Act + var service = sut.AddOpenAITextToAudio("model", new OpenAIClient("key")) + .BuildServiceProvider() + .GetRequiredService(); + + // Assert + Assert.Equal("model", service.Attributes[AIServiceExtensions.ModelIdKey]); + } } diff --git a/dotnet/src/Connectors/Connectors.OpenAIV2/Extensions/OpenAIKernelBuilderExtensions.cs b/dotnet/src/Connectors/Connectors.OpenAIV2/Extensions/OpenAIKernelBuilderExtensions.cs index 567d82726e4b..930ed7742f37 100644 --- a/dotnet/src/Connectors/Connectors.OpenAIV2/Extensions/OpenAIKernelBuilderExtensions.cs +++ b/dotnet/src/Connectors/Connectors.OpenAIV2/Extensions/OpenAIKernelBuilderExtensions.cs @@ -1,5 +1,9 @@ // Copyright (c) Microsoft. All rights reserved. +/* Phase 4 +- Added missing OpenAIClient extensions for audio +- Updated the Experimental attribute to the correct value (Connector) + */ using System; using System.Diagnostics.CodeAnalysis; using System.Net.Http; @@ -8,6 +12,7 @@ using Microsoft.SemanticKernel.Connectors.OpenAI; using Microsoft.SemanticKernel.Embeddings; using Microsoft.SemanticKernel.Http; +using Microsoft.SemanticKernel.TextToAudio; using Microsoft.SemanticKernel.TextToImage; using OpenAI; @@ -89,7 +94,7 @@ public static IKernelBuilder AddOpenAITextEmbeddingGeneration( #region Text to Image /// - /// Add the OpenAI Dall-E text to image service to the list + /// Add the OpenAI text-to-image service to the list /// /// The instance to augment. /// OpenAI model name, see https://platform.openai.com/docs/models @@ -115,7 +120,7 @@ public static IKernelBuilder AddOpenAITextToImage( } /// - /// Add the OpenAI Dall-E text to image service to the list + /// Add the OpenAI text-to-image service to the list /// /// The instance to augment. /// The model to use for image generation. @@ -149,4 +154,69 @@ public static IKernelBuilder AddOpenAITextToImage( return builder; } #endregion + + #region Text to Audio + + /// + /// Adds the OpenAI text-to-audio service to the list. + /// + /// The instance to augment. + /// OpenAI model name, see https://platform.openai.com/docs/models + /// OpenAI API key, see https://platform.openai.com/account/api-keys + /// OpenAI organization id. This is usually optional unless your account belongs to multiple organizations. + /// A local identifier for the given AI service + /// Non-default endpoint for the OpenAI API. + /// The HttpClient to use with this service. + /// The same instance as . + [Experimental("SKEXP0010")] + public static IKernelBuilder AddOpenAITextToAudio( + this IKernelBuilder builder, + string modelId, + string apiKey, + string? orgId = null, + string? serviceId = null, + Uri? endpoint = null, + HttpClient? httpClient = null) + { + Verify.NotNull(builder); + + builder.Services.AddKeyedSingleton(serviceId, (serviceProvider, _) => + new OpenAITextToAudioService( + modelId, + apiKey, + orgId, + endpoint, + HttpClientProvider.GetHttpClient(httpClient, serviceProvider), + serviceProvider.GetService())); + + return builder; + } + + /// + /// Add the OpenAI text-to-audio service to the list + /// + /// The instance to augment. + /// OpenAI model name, see https://platform.openai.com/docs/models + /// to use for the service. If null, one must be available in the service provider when this service is resolved. + /// A local identifier for the given AI service + /// The same instance as . + [Experimental("SKEXP0010")] + public static IKernelBuilder AddOpenAITextToAudio( + this IKernelBuilder builder, + string modelId, + OpenAIClient? openAIClient = null, + string? serviceId = null) + { + Verify.NotNull(builder); + + builder.Services.AddKeyedSingleton(serviceId, (serviceProvider, _) => + new OpenAITextToAudioService( + modelId, + openAIClient ?? serviceProvider.GetRequiredService(), + serviceProvider.GetService())); + + return builder; + } + + #endregion } diff --git a/dotnet/src/Connectors/Connectors.OpenAIV2/Extensions/OpenAIServiceCollectionExtensions.cs b/dotnet/src/Connectors/Connectors.OpenAIV2/Extensions/OpenAIServiceCollectionExtensions.cs index 77355de7f24e..a2a4ad01e963 100644 --- a/dotnet/src/Connectors/Connectors.OpenAIV2/Extensions/OpenAIServiceCollectionExtensions.cs +++ b/dotnet/src/Connectors/Connectors.OpenAIV2/Extensions/OpenAIServiceCollectionExtensions.cs @@ -2,11 +2,13 @@ using System; using System.Diagnostics.CodeAnalysis; +using System.Net.Http; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Logging; using Microsoft.SemanticKernel.Connectors.OpenAI; using Microsoft.SemanticKernel.Embeddings; using Microsoft.SemanticKernel.Http; +using Microsoft.SemanticKernel.TextToAudio; using Microsoft.SemanticKernel.TextToImage; using OpenAI; @@ -89,7 +91,7 @@ public static IServiceCollection AddOpenAITextEmbeddingGeneration(this IServiceC #region Text to Image /// - /// Add the OpenAI Dall-E text to image service to the list + /// Add the OpenAI text-to-image service to the list /// /// The instance to augment. /// The model to use for image generation. @@ -143,4 +145,63 @@ public static IServiceCollection AddOpenAITextToImage(this IServiceCollection se serviceProvider.GetService())); } #endregion + + #region Text to Audio + + /// + /// Adds the OpenAI text-to-audio service to the list. + /// + /// The instance to augment. + /// OpenAI model name, see https://platform.openai.com/docs/models + /// OpenAI API key, see https://platform.openai.com/account/api-keys + /// OpenAI organization id. This is usually optional unless your account belongs to multiple organizations. + /// A local identifier for the given AI service + /// Non-default endpoint for the OpenAI API. + /// The same instance as . + [Experimental("SKEXP0010")] + public static IServiceCollection AddOpenAITextToAudio( + this IServiceCollection services, + string modelId, + string apiKey, + string? orgId = null, + string? serviceId = null, + Uri? endpoint = null) + { + Verify.NotNull(services); + + return services.AddKeyedSingleton(serviceId, (serviceProvider, _) => + new OpenAITextToAudioService( + modelId, + apiKey, + orgId, + endpoint, + HttpClientProvider.GetHttpClient(serviceProvider), + serviceProvider.GetService())); + } + + /// + /// Adds the OpenAI text-to-audio service to the list. + /// + /// The instance to augment. + /// OpenAI model name, see https://platform.openai.com/docs/models + /// to use for the service. If null, one must be available in the service provider when this service is resolved. + /// A local identifier for the given AI service + /// The same instance as . + [Experimental("SKEXP0010")] + public static IServiceCollection AddOpenAITextToAudio( + this IServiceCollection services, + string modelId, + OpenAIClient? openAIClient = null, + string? serviceId = null) + { + Verify.NotNull(services); + + return services.AddKeyedSingleton(serviceId, (serviceProvider, _) => + new OpenAITextToAudioService( + modelId, + openAIClient ?? serviceProvider.GetRequiredService(), + serviceProvider.GetService())); + } + + #endregion } diff --git a/dotnet/src/Connectors/Connectors.OpenAIV2/Services/OpenAITextToAudioService.cs b/dotnet/src/Connectors/Connectors.OpenAIV2/Services/OpenAITextToAudioService.cs index b8255be45343..3d37c6185a9c 100644 --- a/dotnet/src/Connectors/Connectors.OpenAIV2/Services/OpenAITextToAudioService.cs +++ b/dotnet/src/Connectors/Connectors.OpenAIV2/Services/OpenAITextToAudioService.cs @@ -9,13 +9,14 @@ using Microsoft.Extensions.Logging; using Microsoft.SemanticKernel.Services; using Microsoft.SemanticKernel.TextToAudio; +using OpenAI; namespace Microsoft.SemanticKernel.Connectors.OpenAI; /// /// OpenAI text-to-audio service. /// -[Experimental("SKEXP0001")] +[Experimental("SKEXP0010")] public sealed class OpenAITextToAudioService : ITextToAudioService { /// @@ -51,6 +52,20 @@ public OpenAITextToAudioService( this._client = new(modelId, apiKey, organization, endpoint, httpClient, loggerFactory?.CreateLogger(typeof(OpenAITextToAudioService))); } + /// + /// Creates an instance of the with API key auth. + /// + /// Model name + /// Custom for HTTP requests. + /// The to use for logging. If null, no logging will be performed. + public OpenAITextToAudioService( + string modelId, + OpenAIClient openAIClient, + ILoggerFactory? loggerFactory = null) + { + this._client = new(modelId, openAIClient, loggerFactory?.CreateLogger(typeof(OpenAITextToAudioService))); + } + /// public Task> GetAudioContentsAsync( string text, From 6d12918dda55cb21cfd2a1c26d1622158adba0f1 Mon Sep 17 00:00:00 2001 From: Roger Barreto <19890735+RogerBarreto@users.noreply.github.com> Date: Mon, 1 Jul 2024 18:17:55 +0100 Subject: [PATCH 05/17] Complete UT + Move Utility to SK.UT --- .../Connectors.OpenAIV2.UnitTests.csproj | 2 +- .../KernelBuilderExtensionsTests.cs | 31 +++ .../ServiceCollectionExtensionsTests.cs | 31 +++ .../Services/OpenAIAudioToTextServiceTests.cs | 85 ++++++++ ...OpenAIAudioToTextExecutionSettingsTests.cs | 122 +++++++++++ ...OpenAITextToAudioExecutionSettingsTests.cs | 108 ++++++++++ .../Core/ClientCore .AudioToText.cs | 119 +++++++++++ .../OpenAIKernelBuilderExtensions.cs | 70 ++++++- .../OpenAIServiceCollectionExtensions.cs | 63 ++++++ .../OpenAIAudioToTextExecutionSettings.cs | 197 ++++++++++++++++++ .../Services/OpenAIAudioToTextService.cs | 76 +++++++ .../ClientResultExceptionExtensions.cs | 3 +- .../ClientResultExceptionExtensionsTests.cs | 3 +- .../Utilities/OpenAI}/MockPipelineResponse.cs | 2 +- .../Utilities/OpenAI}/MockResponseHeaders.cs | 2 +- 15 files changed, 906 insertions(+), 8 deletions(-) create mode 100644 dotnet/src/Connectors/Connectors.OpenAIV2.UnitTests/Services/OpenAIAudioToTextServiceTests.cs create mode 100644 dotnet/src/Connectors/Connectors.OpenAIV2.UnitTests/Settings/OpenAIAudioToTextExecutionSettingsTests.cs create mode 100644 dotnet/src/Connectors/Connectors.OpenAIV2.UnitTests/Settings/OpenAITextToAudioExecutionSettingsTests.cs create mode 100644 dotnet/src/Connectors/Connectors.OpenAIV2/Core/ClientCore .AudioToText.cs create mode 100644 dotnet/src/Connectors/Connectors.OpenAIV2/OpenAIAudioToTextExecutionSettings.cs create mode 100644 dotnet/src/Connectors/Connectors.OpenAIV2/Services/OpenAIAudioToTextService.cs rename dotnet/src/{Connectors/Connectors.OpenAIV2 => InternalUtilities/openai}/Extensions/ClientResultExceptionExtensions.cs (96%) rename dotnet/src/{Connectors/Connectors.OpenAIV2.UnitTests => SemanticKernel.UnitTests}/Extensions/ClientResultExceptionExtensionsTests.cs (95%) rename dotnet/src/{Connectors/Connectors.OpenAIV2.UnitTests/Utils => SemanticKernel.UnitTests/Utilities/OpenAI}/MockPipelineResponse.cs (98%) rename dotnet/src/{Connectors/Connectors.OpenAIV2.UnitTests/Utils => SemanticKernel.UnitTests/Utilities/OpenAI}/MockResponseHeaders.cs (94%) diff --git a/dotnet/src/Connectors/Connectors.OpenAIV2.UnitTests/Connectors.OpenAIV2.UnitTests.csproj b/dotnet/src/Connectors/Connectors.OpenAIV2.UnitTests/Connectors.OpenAIV2.UnitTests.csproj index 0a100b3c13a6..80e71aa16760 100644 --- a/dotnet/src/Connectors/Connectors.OpenAIV2.UnitTests/Connectors.OpenAIV2.UnitTests.csproj +++ b/dotnet/src/Connectors/Connectors.OpenAIV2.UnitTests/Connectors.OpenAIV2.UnitTests.csproj @@ -37,7 +37,7 @@ - + diff --git a/dotnet/src/Connectors/Connectors.OpenAIV2.UnitTests/Extensions/KernelBuilderExtensionsTests.cs b/dotnet/src/Connectors/Connectors.OpenAIV2.UnitTests/Extensions/KernelBuilderExtensionsTests.cs index 1087da8adc83..bfa71f7e5ab3 100644 --- a/dotnet/src/Connectors/Connectors.OpenAIV2.UnitTests/Extensions/KernelBuilderExtensionsTests.cs +++ b/dotnet/src/Connectors/Connectors.OpenAIV2.UnitTests/Extensions/KernelBuilderExtensionsTests.cs @@ -1,6 +1,7 @@ // Copyright (c) Microsoft. All rights reserved. using Microsoft.SemanticKernel; +using Microsoft.SemanticKernel.AudioToText; using Microsoft.SemanticKernel.Embeddings; using Microsoft.SemanticKernel.Services; using Microsoft.SemanticKernel.TextToAudio; @@ -101,4 +102,34 @@ public void ItCanAddTextToAudioServiceWithOpenAIClient() // Assert Assert.Equal("model", service.Attributes[AIServiceExtensions.ModelIdKey]); } + + [Fact] + public void ItCanAddAudioToTextService() + { + // Arrange + var sut = Kernel.CreateBuilder(); + + // Act + var service = sut.AddOpenAIAudioToText("model", "key") + .Build() + .GetRequiredService(); + + // Assert + Assert.Equal("model", service.Attributes[AIServiceExtensions.ModelIdKey]); + } + + [Fact] + public void ItCanAddAudioToTextServiceWithOpenAIClient() + { + // Arrange + var sut = Kernel.CreateBuilder(); + + // Act + var service = sut.AddOpenAIAudioToText("model", new OpenAIClient("key")) + .Build() + .GetRequiredService(); + + // Assert + Assert.Equal("model", service.Attributes[AIServiceExtensions.ModelIdKey]); + } } diff --git a/dotnet/src/Connectors/Connectors.OpenAIV2.UnitTests/Extensions/ServiceCollectionExtensionsTests.cs b/dotnet/src/Connectors/Connectors.OpenAIV2.UnitTests/Extensions/ServiceCollectionExtensionsTests.cs index 834ff87606a4..79c8024bb93f 100644 --- a/dotnet/src/Connectors/Connectors.OpenAIV2.UnitTests/Extensions/ServiceCollectionExtensionsTests.cs +++ b/dotnet/src/Connectors/Connectors.OpenAIV2.UnitTests/Extensions/ServiceCollectionExtensionsTests.cs @@ -2,6 +2,7 @@ using Microsoft.Extensions.DependencyInjection; using Microsoft.SemanticKernel; +using Microsoft.SemanticKernel.AudioToText; using Microsoft.SemanticKernel.Embeddings; using Microsoft.SemanticKernel.Services; using Microsoft.SemanticKernel.TextToAudio; @@ -102,4 +103,34 @@ public void ItCanAddTextToAudioServiceWithOpenAIClient() // Assert Assert.Equal("model", service.Attributes[AIServiceExtensions.ModelIdKey]); } + + [Fact] + public void ItCanAddAudioToTextService() + { + // Arrange + var sut = new ServiceCollection(); + + // Act + var service = sut.AddOpenAIAudioToText("model", "key") + .BuildServiceProvider() + .GetRequiredService(); + + // Assert + Assert.Equal("model", service.Attributes[AIServiceExtensions.ModelIdKey]); + } + + [Fact] + public void ItCanAddAudioToTextServiceWithOpenAIClient() + { + // Arrange + var sut = new ServiceCollection(); + + // Act + var service = sut.AddOpenAIAudioToText("model", new OpenAIClient("key")) + .BuildServiceProvider() + .GetRequiredService(); + + // Assert + Assert.Equal("model", service.Attributes[AIServiceExtensions.ModelIdKey]); + } } diff --git a/dotnet/src/Connectors/Connectors.OpenAIV2.UnitTests/Services/OpenAIAudioToTextServiceTests.cs b/dotnet/src/Connectors/Connectors.OpenAIV2.UnitTests/Services/OpenAIAudioToTextServiceTests.cs new file mode 100644 index 000000000000..6651421bf6cb --- /dev/null +++ b/dotnet/src/Connectors/Connectors.OpenAIV2.UnitTests/Services/OpenAIAudioToTextServiceTests.cs @@ -0,0 +1,85 @@ +// Copyright (c) Microsoft. All rights reserved. + +using System; +using System.Net.Http; +using System.Threading.Tasks; +using Microsoft.Extensions.Logging; +using Microsoft.SemanticKernel; +using Microsoft.SemanticKernel.Connectors.OpenAI; +using Moq; +using OpenAI; +using Xunit; + +namespace SemanticKernel.Connectors.OpenAI.UnitTests.Services; + +/// +/// Unit tests for class. +/// +public sealed class OpenAIAudioToTextServiceTests : IDisposable +{ + private readonly HttpMessageHandlerStub _messageHandlerStub; + private readonly HttpClient _httpClient; + private readonly Mock _mockLoggerFactory; + + public OpenAIAudioToTextServiceTests() + { + this._messageHandlerStub = new HttpMessageHandlerStub(); + this._httpClient = new HttpClient(this._messageHandlerStub, false); + this._mockLoggerFactory = new Mock(); + } + + [Theory] + [InlineData(true)] + [InlineData(false)] + public void ConstructorWithApiKeyWorksCorrectly(bool includeLoggerFactory) + { + // Arrange & Act + var service = includeLoggerFactory ? + new OpenAIAudioToTextService("model-id", "api-key", "organization", loggerFactory: this._mockLoggerFactory.Object) : + new OpenAIAudioToTextService("model-id", "api-key", "organization"); + + // Assert + Assert.NotNull(service); + Assert.Equal("model-id", service.Attributes["ModelId"]); + } + + [Theory] + [InlineData(true)] + [InlineData(false)] + public void ConstructorWithOpenAIClientWorksCorrectly(bool includeLoggerFactory) + { + // Arrange & Act + var client = new OpenAIClient("key"); + var service = includeLoggerFactory ? + new OpenAIAudioToTextService("model-id", client, loggerFactory: this._mockLoggerFactory.Object) : + new OpenAIAudioToTextService("model-id", client); + + // Assert + Assert.NotNull(service); + Assert.Equal("model-id", service.Attributes["ModelId"]); + } + + [Fact] + public async Task GetTextContentByDefaultWorksCorrectlyAsync() + { + // Arrange + var service = new OpenAIAudioToTextService("model-id", "api-key", "organization", null, this._httpClient); + this._messageHandlerStub.ResponseToReturn = new HttpResponseMessage(System.Net.HttpStatusCode.OK) + { + Content = new StringContent("Test audio-to-text response") + }; + + // Act + var result = await service.GetTextContentsAsync(new AudioContent(new BinaryData("data"), mimeType: null), new OpenAIAudioToTextExecutionSettings("file.mp3")); + + // Assert + Assert.NotNull(result); + Assert.Equal("Test audio-to-text response", result[0].Text); + } + + public void Dispose() + { + this._httpClient.Dispose(); + this._messageHandlerStub.Dispose(); + } +} diff --git a/dotnet/src/Connectors/Connectors.OpenAIV2.UnitTests/Settings/OpenAIAudioToTextExecutionSettingsTests.cs b/dotnet/src/Connectors/Connectors.OpenAIV2.UnitTests/Settings/OpenAIAudioToTextExecutionSettingsTests.cs new file mode 100644 index 000000000000..e01345c82f03 --- /dev/null +++ b/dotnet/src/Connectors/Connectors.OpenAIV2.UnitTests/Settings/OpenAIAudioToTextExecutionSettingsTests.cs @@ -0,0 +1,122 @@ +// Copyright (c) Microsoft. All rights reserved. + +using System; +using System.Text.Json; +using Microsoft.SemanticKernel; +using Microsoft.SemanticKernel.Connectors.OpenAI; +using Xunit; + +namespace SemanticKernel.Connectors.OpenAI.UniTests.Settings; + +/// +/// Unit tests for class. +/// +public sealed class OpenAIAudioToTextExecutionSettingsTests +{ + [Fact] + public void ItReturnsDefaultSettingsWhenSettingsAreNull() + { + Assert.NotNull(OpenAIAudioToTextExecutionSettings.FromExecutionSettings(null)); + } + + [Fact] + public void ItReturnsValidOpenAIAudioToTextExecutionSettings() + { + // Arrange + var audioToTextSettings = new OpenAIAudioToTextExecutionSettings("file.mp3") + { + ModelId = "model_id", + Language = "en", + Prompt = "prompt", + ResponseFormat = "text", + Temperature = 0.2f + }; + + // Act + var settings = OpenAIAudioToTextExecutionSettings.FromExecutionSettings(audioToTextSettings); + + // Assert + Assert.Same(audioToTextSettings, settings); + } + + [Fact] + public void ItCreatesOpenAIAudioToTextExecutionSettingsFromJson() + { + // Arrange + var json = """ + { + "model_id": "model_id", + "language": "en", + "filename": "file.mp3", + "prompt": "prompt", + "response_format": "text", + "temperature": 0.2 + } + """; + + var executionSettings = JsonSerializer.Deserialize(json); + + // Act + var settings = OpenAIAudioToTextExecutionSettings.FromExecutionSettings(executionSettings); + + // Assert + Assert.NotNull(settings); + Assert.Equal("model_id", settings.ModelId); + Assert.Equal("en", settings.Language); + Assert.Equal("file.mp3", settings.Filename); + Assert.Equal("prompt", settings.Prompt); + Assert.Equal("text", settings.ResponseFormat); + Assert.Equal(0.2f, settings.Temperature); + } + + [Fact] + public void ItClonesAllProperties() + { + var settings = new OpenAIAudioToTextExecutionSettings() + { + ModelId = "model_id", + Language = "en", + Prompt = "prompt", + ResponseFormat = "text", + Temperature = 0.2f, + Filename = "something.mp3", + }; + + var clone = (OpenAIAudioToTextExecutionSettings)settings.Clone(); + Assert.NotSame(settings, clone); + + Assert.Equal("model_id", clone.ModelId); + Assert.Equal("en", clone.Language); + Assert.Equal("prompt", clone.Prompt); + Assert.Equal("text", clone.ResponseFormat); + Assert.Equal(0.2f, clone.Temperature); + Assert.Equal("something.mp3", clone.Filename); + } + + [Fact] + public void ItFreezesAndPreventsMutation() + { + var settings = new OpenAIAudioToTextExecutionSettings() + { + ModelId = "model_id", + Language = "en", + Prompt = "prompt", + ResponseFormat = "text", + Temperature = 0.2f, + Filename = "something.mp3", + }; + + settings.Freeze(); + Assert.True(settings.IsFrozen); + + Assert.Throws(() => settings.ModelId = "new_model"); + Assert.Throws(() => settings.Language = "some_format"); + Assert.Throws(() => settings.Prompt = "prompt"); + Assert.Throws(() => settings.ResponseFormat = "something"); + Assert.Throws(() => settings.Temperature = 0.2f); + Assert.Throws(() => settings.Filename = "something"); + + settings.Freeze(); // idempotent + Assert.True(settings.IsFrozen); + } +} diff --git a/dotnet/src/Connectors/Connectors.OpenAIV2.UnitTests/Settings/OpenAITextToAudioExecutionSettingsTests.cs b/dotnet/src/Connectors/Connectors.OpenAIV2.UnitTests/Settings/OpenAITextToAudioExecutionSettingsTests.cs new file mode 100644 index 000000000000..f30478e15acf --- /dev/null +++ b/dotnet/src/Connectors/Connectors.OpenAIV2.UnitTests/Settings/OpenAITextToAudioExecutionSettingsTests.cs @@ -0,0 +1,108 @@ +// Copyright (c) Microsoft. All rights reserved. + +using System; +using System.Text.Json; +using Microsoft.SemanticKernel; +using Microsoft.SemanticKernel.Connectors.OpenAI; +using Xunit; + +namespace SemanticKernel.Connectors.OpenAI.UniTests.Settings; + +/// +/// Unit tests for class. +/// +public sealed class OpenAITextToAudioExecutionSettingsTests +{ + [Fact] + public void ItReturnsDefaultSettingsWhenSettingsAreNull() + { + Assert.NotNull(OpenAITextToAudioExecutionSettings.FromExecutionSettings(null)); + } + + [Fact] + public void ItReturnsValidOpenAITextToAudioExecutionSettings() + { + // Arrange + var textToAudioSettings = new OpenAITextToAudioExecutionSettings("voice") + { + ModelId = "model_id", + ResponseFormat = "mp3", + Speed = 1.0f + }; + + // Act + var settings = OpenAITextToAudioExecutionSettings.FromExecutionSettings(textToAudioSettings); + + // Assert + Assert.Same(textToAudioSettings, settings); + } + + [Fact] + public void ItCreatesOpenAIAudioToTextExecutionSettingsFromJson() + { + // Arrange + var json = """ + { + "model_id": "model_id", + "voice": "voice", + "response_format": "mp3", + "speed": 1.2 + } + """; + + var executionSettings = JsonSerializer.Deserialize(json); + + // Act + var settings = OpenAITextToAudioExecutionSettings.FromExecutionSettings(executionSettings); + + // Assert + Assert.NotNull(settings); + Assert.Equal("model_id", settings.ModelId); + Assert.Equal("voice", settings.Voice); + Assert.Equal("mp3", settings.ResponseFormat); + Assert.Equal(1.2f, settings.Speed); + } + + [Fact] + public void ItClonesAllProperties() + { + var textToAudioSettings = new OpenAITextToAudioExecutionSettings() + { + ModelId = "some_model", + ResponseFormat = "some_format", + Speed = 3.14f, + Voice = "something" + }; + + var clone = (OpenAITextToAudioExecutionSettings)textToAudioSettings.Clone(); + Assert.NotSame(textToAudioSettings, clone); + + Assert.Equal("some_model", clone.ModelId); + Assert.Equal("some_format", clone.ResponseFormat); + Assert.Equal(3.14f, clone.Speed); + Assert.Equal("something", clone.Voice); + } + + [Fact] + public void ItFreezesAndPreventsMutation() + { + var textToAudioSettings = new OpenAITextToAudioExecutionSettings() + { + ModelId = "some_model", + ResponseFormat = "some_format", + Speed = 3.14f, + Voice = "something" + }; + + textToAudioSettings.Freeze(); + Assert.True(textToAudioSettings.IsFrozen); + + Assert.Throws(() => textToAudioSettings.ModelId = "new_model"); + Assert.Throws(() => textToAudioSettings.ResponseFormat = "some_format"); + Assert.Throws(() => textToAudioSettings.Speed = 3.14f); + Assert.Throws(() => textToAudioSettings.Voice = "something"); + + textToAudioSettings.Freeze(); // idempotent + Assert.True(textToAudioSettings.IsFrozen); + } +} diff --git a/dotnet/src/Connectors/Connectors.OpenAIV2/Core/ClientCore .AudioToText.cs b/dotnet/src/Connectors/Connectors.OpenAIV2/Core/ClientCore .AudioToText.cs new file mode 100644 index 000000000000..7849c6103a3f --- /dev/null +++ b/dotnet/src/Connectors/Connectors.OpenAIV2/Core/ClientCore .AudioToText.cs @@ -0,0 +1,119 @@ +// Copyright (c) Microsoft. All rights reserved. + +/* +Phase 02 + +- This class was created focused in the Image Generation using the SDK client instead of the own client in V1. +- Added Checking for empty or whitespace prompt. +- Removed the format parameter as this is never called in V1 code. Plan to implement it in the future once we change the ITextToImageService abstraction, using PromptExecutionSettings. +- Allow custom size for images when the endpoint is not the default OpenAI v1 endpoint. +*/ + +using System; +using System.Collections.Generic; +using System.IO; +using System.Linq; +using System.Text.Json; +using System.Threading; +using System.Threading.Tasks; +using Microsoft.SemanticKernel.Text; +using OpenAI.Audio; + +namespace Microsoft.SemanticKernel.Connectors.OpenAI; + +/// +/// Base class for AI clients that provides common functionality for interacting with OpenAI services. +/// +internal partial class ClientCore +{ + /// + /// Generates an image with the provided configuration. + /// + /// Input audio to generate the text + /// Audio-to-text execution settings for the prompt + /// The to monitor for cancellation requests. The default is . + /// Url of the generated image + internal async Task> GetTextFromAudioContentsAsync( + AudioContent input, + PromptExecutionSettings? executionSettings, + CancellationToken cancellationToken) + { + if (!input.CanRead) + { + throw new ArgumentException("The input audio content is not readable.", nameof(input)); + } + + OpenAIAudioToTextExecutionSettings? audioExecutionSettings = OpenAIAudioToTextExecutionSettings.FromExecutionSettings(executionSettings); + AudioTranscriptionOptions? audioOptions = AudioOptionsFromExecutionSettings(executionSettings); + + Verify.ValidFilename(audioExecutionSettings?.Filename); + + var memoryStream = new MemoryStream(input.Data!.Value.ToArray()); + + AudioTranscription responseData = (await RunRequestAsync(() => this.Client.GetAudioClient(this.ModelId).TranscribeAudioAsync(memoryStream, audioExecutionSettings?.Filename, audioOptions)).ConfigureAwait(false)).Value; + + return [new(responseData.Text, this.ModelId, metadata: GetResponseMetadata(responseData))]; + } + + /// + /// Converts to derived type. + /// + /// Instance of . + /// Instance of . + private static AudioTranscriptionOptions? AudioOptionsFromExecutionSettings(PromptExecutionSettings? executionSettings) + { + if (executionSettings is null) + { + return new AudioTranscriptionOptions(); + } + + if (executionSettings is OpenAIAudioToTextExecutionSettings settings) + { + return new AudioTranscriptionOptions + { + Granularities = ConvertToAudioTimestampGranularities(settings.Granularities), + Language = settings.Language, + Prompt = settings.Prompt, + Temperature = settings.Temperature + }; + } + + var json = JsonSerializer.Serialize(executionSettings); + + var openAIExecutionSettings = JsonSerializer.Deserialize(json, JsonOptionsCache.ReadPermissive); + + if (openAIExecutionSettings is not null) + { + return new AudioTranscriptionOptions + { + Granularities = ConvertToAudioTimestampGranularities(openAIExecutionSettings.Granularities), + Language = openAIExecutionSettings.Language, + Prompt = openAIExecutionSettings.Prompt, + Temperature = openAIExecutionSettings.Temperature + }; + } + + throw new ArgumentException($"Invalid execution settings, cannot convert to {nameof(OpenAIAudioToTextExecutionSettings)}", nameof(executionSettings)); + } + + private static AudioTimestampGranularities ConvertToAudioTimestampGranularities(OpenAIAudioToTextExecutionSettings.TimeStampGranularities[]? granularity) + { + return granularity?.FirstOrDefault() switch + { + OpenAIAudioToTextExecutionSettings.TimeStampGranularities.Default => AudioTimestampGranularities.Default, + OpenAIAudioToTextExecutionSettings.TimeStampGranularities.Word => AudioTimestampGranularities.Word, + OpenAIAudioToTextExecutionSettings.TimeStampGranularities.Segment => AudioTimestampGranularities.Segment, + _ => AudioTimestampGranularities.Default + }; + } + + private static Dictionary GetResponseMetadata(AudioTranscription audioTranscription) + { + return new Dictionary(3) + { + { nameof(audioTranscription.Language), audioTranscription.Language }, + { nameof(audioTranscription.Duration), audioTranscription.Duration }, + { nameof(audioTranscription.Segments), audioTranscription.Segments } + }; + } +} diff --git a/dotnet/src/Connectors/Connectors.OpenAIV2/Extensions/OpenAIKernelBuilderExtensions.cs b/dotnet/src/Connectors/Connectors.OpenAIV2/Extensions/OpenAIKernelBuilderExtensions.cs index 930ed7742f37..ce4a4d9866e0 100644 --- a/dotnet/src/Connectors/Connectors.OpenAIV2/Extensions/OpenAIKernelBuilderExtensions.cs +++ b/dotnet/src/Connectors/Connectors.OpenAIV2/Extensions/OpenAIKernelBuilderExtensions.cs @@ -2,13 +2,14 @@ /* Phase 4 - Added missing OpenAIClient extensions for audio -- Updated the Experimental attribute to the correct value (Connector) +- Updated the Experimental attribute to the correct value 0001 -> 0010 (Connector) */ using System; using System.Diagnostics.CodeAnalysis; using System.Net.Http; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Logging; +using Microsoft.SemanticKernel.AudioToText; using Microsoft.SemanticKernel.Connectors.OpenAI; using Microsoft.SemanticKernel.Embeddings; using Microsoft.SemanticKernel.Http; @@ -219,4 +220,71 @@ public static IKernelBuilder AddOpenAITextToAudio( } #endregion + + #region Audio-to-Text + + /// + /// Adds the OpenAI audio-to-text service to the list. + /// + /// The instance to augment. + /// OpenAI model name, see https://platform.openai.com/docs/models + /// OpenAI API key, see https://platform.openai.com/account/api-keys + /// OpenAI organization id. This is usually optional unless your account belongs to multiple organizations. + /// A local identifier for the given AI service + /// Non-default endpoint for the OpenAI API. + /// The HttpClient to use with this service. + /// The same instance as . + [Experimental("SKEXP0010")] + public static IKernelBuilder AddOpenAIAudioToText( + this IKernelBuilder builder, + string modelId, + string apiKey, + string? orgId = null, + string? serviceId = null, + Uri? endpoint = null, + HttpClient? httpClient = null) + { + Verify.NotNull(builder); + + OpenAIAudioToTextService Factory(IServiceProvider serviceProvider, object? _) => + new(modelId, + apiKey, + orgId, + endpoint, + HttpClientProvider.GetHttpClient(httpClient, serviceProvider), + serviceProvider.GetService()); + + builder.Services.AddKeyedSingleton(serviceId, (Func)Factory); + + return builder; + } + + /// + /// Adds the OpenAI audio-to-text service to the list. + /// + /// The instance to augment. + /// OpenAI model id + /// to use for the service. If null, one must be available in the service provider when this service is resolved. + /// A local identifier for the given AI service + /// The same instance as . + [Experimental("SKEXP0010")] + public static IKernelBuilder AddOpenAIAudioToText( + this IKernelBuilder builder, + string modelId, + OpenAIClient? openAIClient = null, + string? serviceId = null) + { + Verify.NotNull(builder); + + OpenAIAudioToTextService Factory(IServiceProvider serviceProvider, object? _) => + new(modelId, + openAIClient ?? serviceProvider.GetRequiredService(), + serviceProvider.GetService()); + + builder.Services.AddKeyedSingleton(serviceId, (Func)Factory); + + return builder; + } + + #endregion } diff --git a/dotnet/src/Connectors/Connectors.OpenAIV2/Extensions/OpenAIServiceCollectionExtensions.cs b/dotnet/src/Connectors/Connectors.OpenAIV2/Extensions/OpenAIServiceCollectionExtensions.cs index a2a4ad01e963..5fedd6ca64a7 100644 --- a/dotnet/src/Connectors/Connectors.OpenAIV2/Extensions/OpenAIServiceCollectionExtensions.cs +++ b/dotnet/src/Connectors/Connectors.OpenAIV2/Extensions/OpenAIServiceCollectionExtensions.cs @@ -5,6 +5,7 @@ using System.Net.Http; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Logging; +using Microsoft.SemanticKernel.AudioToText; using Microsoft.SemanticKernel.Connectors.OpenAI; using Microsoft.SemanticKernel.Embeddings; using Microsoft.SemanticKernel.Http; @@ -204,4 +205,66 @@ public static IServiceCollection AddOpenAITextToAudio( } #endregion + + #region Audio-to-Text + + /// + /// Adds the OpenAI audio-to-text service to the list. + /// + /// The instance to augment. + /// OpenAI model name, see https://platform.openai.com/docs/models + /// OpenAI API key, see https://platform.openai.com/account/api-keys + /// OpenAI organization id. This is usually optional unless your account belongs to multiple organizations. + /// A local identifier for the given AI service + /// Non-default endpoint for the OpenAI API. + /// The same instance as . + [Experimental("SKEXP0010")] + public static IServiceCollection AddOpenAIAudioToText( + this IServiceCollection services, + string modelId, + string apiKey, + string? orgId = null, + string? serviceId = null, + Uri? endpoint = null) + { + Verify.NotNull(services); + + OpenAIAudioToTextService Factory(IServiceProvider serviceProvider, object? _) => + new(modelId, + apiKey, + orgId, + endpoint, + HttpClientProvider.GetHttpClient(serviceProvider), + serviceProvider.GetService()); + + services.AddKeyedSingleton(serviceId, (Func)Factory); + + return services; + } + + /// + /// Adds the OpenAI audio-to-text service to the list. + /// + /// The instance to augment. + /// OpenAI model id + /// to use for the service. If null, one must be available in the service provider when this service is resolved. + /// A local identifier for the given AI service + /// The same instance as . + [Experimental("SKEXP0010")] + public static IServiceCollection AddOpenAIAudioToText( + this IServiceCollection services, + string modelId, + OpenAIClient? openAIClient = null, + string? serviceId = null) + { + Verify.NotNull(services); + + OpenAIAudioToTextService Factory(IServiceProvider serviceProvider, object? _) => + new(modelId, openAIClient ?? serviceProvider.GetRequiredService(), serviceProvider.GetService()); + + services.AddKeyedSingleton(serviceId, (Func)Factory); + + return services; + } + #endregion } diff --git a/dotnet/src/Connectors/Connectors.OpenAIV2/OpenAIAudioToTextExecutionSettings.cs b/dotnet/src/Connectors/Connectors.OpenAIV2/OpenAIAudioToTextExecutionSettings.cs new file mode 100644 index 000000000000..ee76dc240576 --- /dev/null +++ b/dotnet/src/Connectors/Connectors.OpenAIV2/OpenAIAudioToTextExecutionSettings.cs @@ -0,0 +1,197 @@ +// Copyright (c) Microsoft. All rights reserved. + +using System; +using System.Collections.Generic; +using System.Diagnostics.CodeAnalysis; +using System.Text.Json; +using System.Text.Json.Serialization; +using Microsoft.SemanticKernel.Text; + +namespace Microsoft.SemanticKernel.Connectors.OpenAI; + +/// +/// Execution settings for OpenAI audio-to-text request. +/// +[Experimental("SKEXP0010")] +public sealed class OpenAIAudioToTextExecutionSettings : PromptExecutionSettings +{ + /// + /// Filename or identifier associated with audio data. + /// Should be in format {filename}.{extension} + /// + [JsonPropertyName("filename")] + public string Filename + { + get => this._filename; + + set + { + this.ThrowIfFrozen(); + this._filename = value; + } + } + + /// + /// An optional language of the audio data as two-letter ISO-639-1 language code (e.g. 'en' or 'es'). + /// + [JsonPropertyName("language")] + public string? Language + { + get => this._language; + + set + { + this.ThrowIfFrozen(); + this._language = value; + } + } + + /// + /// An optional text to guide the model's style or continue a previous audio segment. The prompt should match the audio language. + /// + [JsonPropertyName("prompt")] + public string? Prompt + { + get => this._prompt; + + set + { + this.ThrowIfFrozen(); + this._prompt = value; + } + } + + /// + /// The format of the transcript output, in one of these options: json, text, srt, verbose_json, or vtt. Default is 'json'. + /// + [JsonPropertyName("response_format")] + public string ResponseFormat + { + get => this._responseFormat; + + set + { + this.ThrowIfFrozen(); + this._responseFormat = value; + } + } + + /// + /// The sampling temperature, between 0 and 1. + /// Higher values like 0.8 will make the output more random, while lower values like 0.2 will make it more focused and deterministic. + /// If set to 0, the model will use log probability to automatically increase the temperature until certain thresholds are hit. + /// Default is 0. + /// + [JsonPropertyName("temperature")] + public float Temperature + { + get => this._temperature; + + set + { + this.ThrowIfFrozen(); + this._temperature = value; + } + } + + /// + /// The timestamp granularities to populate for this transcription. response_format must be set verbose_json to use timestamp granularities. Either or both of these options are supported: word, or segment. + /// + [JsonPropertyName("granularities")] +#pragma warning disable CA1819 // Properties should not return arrays + public TimeStampGranularities[]? Granularities { get; set; } +#pragma warning restore CA1819 // Properties should not return arrays + + /// + /// Creates an instance of class with default filename - "file.mp3". + /// + public OpenAIAudioToTextExecutionSettings() + : this(DefaultFilename) + { + } + + /// + /// Creates an instance of class. + /// + /// Filename or identifier associated with audio data. Should be in format {filename}.{extension} + public OpenAIAudioToTextExecutionSettings(string filename) + { + this._filename = filename; + } + + /// + public override PromptExecutionSettings Clone() + { + return new OpenAIAudioToTextExecutionSettings(this.Filename) + { + ModelId = this.ModelId, + ExtensionData = this.ExtensionData is not null ? new Dictionary(this.ExtensionData) : null, + Temperature = this.Temperature, + ResponseFormat = this.ResponseFormat, + Language = this.Language, + Prompt = this.Prompt + }; + } + + /// + /// Converts to derived type. + /// + /// Instance of . + /// Instance of . + public static OpenAIAudioToTextExecutionSettings? FromExecutionSettings(PromptExecutionSettings? executionSettings) + { + if (executionSettings is null) + { + return new OpenAIAudioToTextExecutionSettings(); + } + + if (executionSettings is OpenAIAudioToTextExecutionSettings settings) + { + return settings; + } + + var json = JsonSerializer.Serialize(executionSettings); + + var openAIExecutionSettings = JsonSerializer.Deserialize(json, JsonOptionsCache.ReadPermissive); + + if (openAIExecutionSettings is not null) + { + return openAIExecutionSettings; + } + + throw new ArgumentException($"Invalid execution settings, cannot convert to {nameof(OpenAIAudioToTextExecutionSettings)}", nameof(executionSettings)); + } + + /// + /// The timestamp granularities available to populate transcriptions. + /// + public enum TimeStampGranularities + { + /// + /// Not specified. + /// + Default = 0, + + /// + /// The transcription is segmented by word. + /// + Word = 1, + + /// + /// The timestamp of transcription is by segment. + /// + Segment = 2, + } + + #region private ================================================================================ + + private const string DefaultFilename = "file.mp3"; + + private float _temperature = 0; + private string _responseFormat = "json"; + private string _filename; + private string? _language; + private string? _prompt; + + #endregion +} diff --git a/dotnet/src/Connectors/Connectors.OpenAIV2/Services/OpenAIAudioToTextService.cs b/dotnet/src/Connectors/Connectors.OpenAIV2/Services/OpenAIAudioToTextService.cs new file mode 100644 index 000000000000..06b605147585 --- /dev/null +++ b/dotnet/src/Connectors/Connectors.OpenAIV2/Services/OpenAIAudioToTextService.cs @@ -0,0 +1,76 @@ +// Copyright (c) Microsoft. All rights reserved. + +using System; +using System.Collections.Generic; +using System.Diagnostics.CodeAnalysis; +using System.Net.Http; +using System.Threading; +using System.Threading.Tasks; +using Microsoft.Extensions.Logging; +using Microsoft.SemanticKernel.AudioToText; +using Microsoft.SemanticKernel.Services; +using OpenAI; + +namespace Microsoft.SemanticKernel.Connectors.OpenAI; + +/// +/// OpenAI text-to-audio service. +/// +[Experimental("SKEXP0010")] +public sealed class OpenAIAudioToTextService : IAudioToTextService +{ + /// + /// OpenAI text-to-audio client for HTTP operations. + /// + private readonly ClientCore _client; + + /// + /// Gets the attribute name used to store the organization in the dictionary. + /// + public static string OrganizationKey => "Organization"; + + /// + public IReadOnlyDictionary Attributes => this._client.Attributes; + + /// + /// Creates an instance of the with API key auth. + /// + /// Model name + /// OpenAI API Key + /// OpenAI Organization Id (usually optional) + /// Non-default endpoint for the OpenAI API. + /// Custom for HTTP requests. + /// The to use for logging. If null, no logging will be performed. + public OpenAIAudioToTextService( + string modelId, + string apiKey, + string? organization = null, + Uri? endpoint = null, + HttpClient? httpClient = null, + ILoggerFactory? loggerFactory = null) + { + this._client = new(modelId, apiKey, organization, endpoint, httpClient, loggerFactory?.CreateLogger(typeof(OpenAITextToAudioService))); + } + + /// + /// Creates an instance of the with API key auth. + /// + /// Model name + /// Custom for HTTP requests. + /// The to use for logging. If null, no logging will be performed. + public OpenAIAudioToTextService( + string modelId, + OpenAIClient openAIClient, + ILoggerFactory? loggerFactory = null) + { + this._client = new(modelId, openAIClient, loggerFactory?.CreateLogger(typeof(OpenAITextToAudioService))); + } + + /// + public Task> GetTextContentsAsync( + AudioContent input, + PromptExecutionSettings? executionSettings = null, + Kernel? kernel = null, + CancellationToken cancellationToken = default) + => this._client.GetTextFromAudioContentsAsync(input, executionSettings, cancellationToken); +} diff --git a/dotnet/src/Connectors/Connectors.OpenAIV2/Extensions/ClientResultExceptionExtensions.cs b/dotnet/src/InternalUtilities/openai/Extensions/ClientResultExceptionExtensions.cs similarity index 96% rename from dotnet/src/Connectors/Connectors.OpenAIV2/Extensions/ClientResultExceptionExtensions.cs rename to dotnet/src/InternalUtilities/openai/Extensions/ClientResultExceptionExtensions.cs index 7da92e5826ba..b2f3c6a6e8b1 100644 --- a/dotnet/src/Connectors/Connectors.OpenAIV2/Extensions/ClientResultExceptionExtensions.cs +++ b/dotnet/src/InternalUtilities/openai/Extensions/ClientResultExceptionExtensions.cs @@ -8,8 +8,7 @@ Preserved the logic as is. using System.ClientModel; using System.Net; - -namespace Microsoft.SemanticKernel.Connectors.OpenAI; +using Microsoft.SemanticKernel; /// /// Provides extension methods for the class. diff --git a/dotnet/src/Connectors/Connectors.OpenAIV2.UnitTests/Extensions/ClientResultExceptionExtensionsTests.cs b/dotnet/src/SemanticKernel.UnitTests/Extensions/ClientResultExceptionExtensionsTests.cs similarity index 95% rename from dotnet/src/Connectors/Connectors.OpenAIV2.UnitTests/Extensions/ClientResultExceptionExtensionsTests.cs rename to dotnet/src/SemanticKernel.UnitTests/Extensions/ClientResultExceptionExtensionsTests.cs index 0b95f904d893..f7a4e947ec38 100644 --- a/dotnet/src/Connectors/Connectors.OpenAIV2.UnitTests/Extensions/ClientResultExceptionExtensionsTests.cs +++ b/dotnet/src/SemanticKernel.UnitTests/Extensions/ClientResultExceptionExtensionsTests.cs @@ -2,10 +2,9 @@ using System.ClientModel; using System.ClientModel.Primitives; -using Microsoft.SemanticKernel.Connectors.OpenAI; using Xunit; -namespace SemanticKernel.Connectors.OpenAI.UnitTests.Extensions; +namespace SemanticKernel.UnitTests.Utilities.OpenAI; public class ClientResultExceptionExtensionsTests { diff --git a/dotnet/src/Connectors/Connectors.OpenAIV2.UnitTests/Utils/MockPipelineResponse.cs b/dotnet/src/SemanticKernel.UnitTests/Utilities/OpenAI/MockPipelineResponse.cs similarity index 98% rename from dotnet/src/Connectors/Connectors.OpenAIV2.UnitTests/Utils/MockPipelineResponse.cs rename to dotnet/src/SemanticKernel.UnitTests/Utilities/OpenAI/MockPipelineResponse.cs index 6fe18b9c1684..2e254c53d04e 100644 --- a/dotnet/src/Connectors/Connectors.OpenAIV2.UnitTests/Utils/MockPipelineResponse.cs +++ b/dotnet/src/SemanticKernel.UnitTests/Utilities/OpenAI/MockPipelineResponse.cs @@ -12,7 +12,7 @@ This class was imported and adapted from the System.ClientModel Unit Tests. using System.Threading; using System.Threading.Tasks; -namespace SemanticKernel.Connectors.OpenAI.UnitTests; +namespace SemanticKernel.UnitTests.Utilities.OpenAI; public class MockPipelineResponse : PipelineResponse { diff --git a/dotnet/src/Connectors/Connectors.OpenAIV2.UnitTests/Utils/MockResponseHeaders.cs b/dotnet/src/SemanticKernel.UnitTests/Utilities/OpenAI/MockResponseHeaders.cs similarity index 94% rename from dotnet/src/Connectors/Connectors.OpenAIV2.UnitTests/Utils/MockResponseHeaders.cs rename to dotnet/src/SemanticKernel.UnitTests/Utilities/OpenAI/MockResponseHeaders.cs index fceef64e4bae..97c9776b4b25 100644 --- a/dotnet/src/Connectors/Connectors.OpenAIV2.UnitTests/Utils/MockResponseHeaders.cs +++ b/dotnet/src/SemanticKernel.UnitTests/Utilities/OpenAI/MockResponseHeaders.cs @@ -9,7 +9,7 @@ This class was imported and adapted from the System.ClientModel Unit Tests. using System.ClientModel.Primitives; using System.Collections.Generic; -namespace SemanticKernel.Connectors.OpenAI.UnitTests; +namespace SemanticKernel.UnitTests.Utilities.OpenAI; public class MockResponseHeaders : PipelineResponseHeaders { From c34024a1420c1be6dc31ce0da122580005a74539 Mon Sep 17 00:00:00 2001 From: Roger Barreto <19890735+RogerBarreto@users.noreply.github.com> Date: Mon, 1 Jul 2024 18:33:27 +0100 Subject: [PATCH 06/17] Audio to Text, Text to Audio Integration Tests --- .../OpenAI/OpenAIAudioToTextTests.cs | 48 ++++++++++++++++++ .../OpenAI/OpenAITextToAudioTests.cs | 41 +++++++++++++++ .../TestData/test_audio.wav | Bin 0 -> 222798 bytes .../TestData/test_image_001.jpg | Bin 0 -> 61082 bytes 4 files changed, 89 insertions(+) create mode 100644 dotnet/src/IntegrationTestsV2/Connectors/OpenAI/OpenAIAudioToTextTests.cs create mode 100644 dotnet/src/IntegrationTestsV2/Connectors/OpenAI/OpenAITextToAudioTests.cs create mode 100644 dotnet/src/IntegrationTestsV2/TestData/test_audio.wav create mode 100644 dotnet/src/IntegrationTestsV2/TestData/test_image_001.jpg diff --git a/dotnet/src/IntegrationTestsV2/Connectors/OpenAI/OpenAIAudioToTextTests.cs b/dotnet/src/IntegrationTestsV2/Connectors/OpenAI/OpenAIAudioToTextTests.cs new file mode 100644 index 000000000000..f1ead5f9b9c5 --- /dev/null +++ b/dotnet/src/IntegrationTestsV2/Connectors/OpenAI/OpenAIAudioToTextTests.cs @@ -0,0 +1,48 @@ +// Copyright (c) Microsoft. All rights reserved. + +using System; +using System.IO; +using System.Threading.Tasks; +using Microsoft.Extensions.Configuration; +using Microsoft.SemanticKernel; +using Microsoft.SemanticKernel.AudioToText; +using Microsoft.SemanticKernel.Connectors.OpenAI; +using SemanticKernel.IntegrationTests.TestSettings; +using Xunit; + +namespace SemanticKernel.IntegrationTests.Connectors.OpenAI; + +public sealed class OpenAIAudioToTextTests() +{ + private readonly IConfigurationRoot _configuration = new ConfigurationBuilder() + .AddJsonFile(path: "testsettings.json", optional: true, reloadOnChange: true) + .AddJsonFile(path: "testsettings.development.json", optional: true, reloadOnChange: true) + .AddEnvironmentVariables() + .AddUserSecrets() + .Build(); + + [Fact]//(Skip = "OpenAI will often throttle requests. This test is for manual verification.")] + public async Task OpenAIAudioToTextTestAsync() + { + // Arrange + const string Filename = "test_audio.wav"; + + OpenAIConfiguration? openAIConfiguration = this._configuration.GetSection("OpenAIAudioToText").Get(); + Assert.NotNull(openAIConfiguration); + + var kernel = Kernel.CreateBuilder() + .AddOpenAIAudioToText(openAIConfiguration.ModelId, openAIConfiguration.ApiKey) + .Build(); + + var service = kernel.GetRequiredService(); + + await using Stream audio = File.OpenRead($"./TestData/{Filename}"); + var audioData = await BinaryData.FromStreamAsync(audio); + + // Act + var result = await service.GetTextContentAsync(new AudioContent(audioData, mimeType: "audio/wav"), new OpenAIAudioToTextExecutionSettings(Filename)); + + // Assert + Assert.Contains("The sun rises in the east and sets in the west.", result.Text, StringComparison.OrdinalIgnoreCase); + } +} diff --git a/dotnet/src/IntegrationTestsV2/Connectors/OpenAI/OpenAITextToAudioTests.cs b/dotnet/src/IntegrationTestsV2/Connectors/OpenAI/OpenAITextToAudioTests.cs new file mode 100644 index 000000000000..c2818abe2502 --- /dev/null +++ b/dotnet/src/IntegrationTestsV2/Connectors/OpenAI/OpenAITextToAudioTests.cs @@ -0,0 +1,41 @@ +// Copyright (c) Microsoft. All rights reserved. + +using System.Threading.Tasks; +using Microsoft.Extensions.Configuration; +using Microsoft.SemanticKernel; +using Microsoft.SemanticKernel.TextToAudio; +using SemanticKernel.IntegrationTests.TestSettings; +using Xunit; + +namespace SemanticKernel.IntegrationTests.Connectors.OpenAI; + +public sealed class OpenAITextToAudioTests +{ + private readonly IConfigurationRoot _configuration = new ConfigurationBuilder() + .AddJsonFile(path: "testsettings.json", optional: true, reloadOnChange: true) + .AddJsonFile(path: "testsettings.development.json", optional: true, reloadOnChange: true) + .AddEnvironmentVariables() + .AddUserSecrets() + .Build(); + + [Fact]//(Skip = "OpenAI will often throttle requests. This test is for manual verification.")] + public async Task OpenAITextToAudioTestAsync() + { + // Arrange + OpenAIConfiguration? openAIConfiguration = this._configuration.GetSection("OpenAITextToAudio").Get(); + Assert.NotNull(openAIConfiguration); + + var kernel = Kernel.CreateBuilder() + .AddOpenAITextToAudio(openAIConfiguration.ModelId, openAIConfiguration.ApiKey) + .Build(); + + var service = kernel.GetRequiredService(); + + // Act + var result = await service.GetAudioContentAsync("The sun rises in the east and sets in the west."); + + // Assert + var audioData = result.Data!.Value; + Assert.False(audioData.IsEmpty); + } +} diff --git a/dotnet/src/IntegrationTestsV2/TestData/test_audio.wav b/dotnet/src/IntegrationTestsV2/TestData/test_audio.wav new file mode 100644 index 0000000000000000000000000000000000000000..c6d0edd9a93178162afd3446a32be7cccb822743 GIT binary patch literal 222798 zcmeEtgO?;r&~KL8oSq(Ich;EYU1Qd^ZQHhObJpfv+qP#hX1lwrmwVs){)l(Z*Lk{J zQIV06k&(ZM?9{SZvu49E&^@JF(_v$$Bv=3d2rLWg!-Kg1puhs!wCvm^3ZAxX*Q|ZZ z&ds`*;BlLQ(}q>AS+T}H6)RV&1cnTpG7vy2|NHx23H+}F{#OG3D}n!CC4fPTkH9|) zFo47V-}ApCf~qR8{NGyry{p2X1h4$vN~#RY|LkRW^?#24-uZj>KljD|jzoAxghhsb z9u^iB?!P|+w|}qvy~e}4!hhxOy}wWVE&umT>Hj_R_X@2tuyFrT{7dsMpAzKsFVBC! z`*)850+9a|;=fw`tpWJ2hJVL8;=g+Stt}4A-zWY)s{s_y0~0U+GaLhLu!O$fIiWID!0%i2KE&j^&?~wrI=2v~HM|G5s4vuRN`*2t1xlovsccd9E8i4J>8oy6m#MGRZ)z?qD*SE|=nLPz z3s!+^;1#$CmV=?-ESLmlfeBzOXbLh^El5{ysTt}W^{~24ovBWSUl^gbgh$6z47ef3 z6nLQ)s&?2C%|K_+8;k-yK?5jzC%jS@GzaZKIZzU?YAlqO3~SD)Hh5kVN<9|js_~!{ ze7ZiU4u*hnU=HM`8b|@Hz%aVLSir9Xe16wq-Qr zvngl;=|w||7SIHAg0g4?za0m)Ar@Y*2=5Pq?+t}tstF1pCx5SZ2jwB<^03WhD0u)m zR8$MB(P#Ch`T*AV4Xjl<)a)YIMj_Zf`Ec)13)DRIx0(f?x~pDPFQ`XhISZdnSJTv& z>Sgtyx&un)iuy>s3h$nQGFz{1RgXZLZy^mol=)Xkq3}PsIiQ3RV9gNVg;(FfuTcMK zwiXns_teGe6m_Ax64H3BeuVt&g~z+#*?p)je|6`N`cyrjE>#DrQ{mpNmVk8}4_mVj z=m@&NvILw0@4##D9P9vtVa-#Z6uLk;)deL$5K_FTZi1~iMO_2=J+JPBR3@p@)pJlk zli(8(kdsDW7x(}&Kpxb-&#<#sM;aq>NE$c-HiI=_5tt0ARe=3S2SSjmEs*1DPm*t?kO*oPs$tRm@-6h zDuuFJb}Buf-o97#YI(J(IsnqX0X4P-q#Z zOFN}C(sZf01f+N3Me&2!LV6*!lU?#^B?-1uJ#ZSxpb_#7*@ceA2)rRa5Z{Ua!n+ce zh+o7zVmHx+h#?l?Pp~-b5_$mLh7LgUkgCWMs5$N7*MER9ND`Wh&c|M1Y1m!tIo29y z@C4#F-Ui=}eLyL+I#L60$|d=NbW>a?==t;PI%XHmgcgLT(9&Rw;I?3$P(f$`-IHm{ zw&LdT&xJJ6Emc!?tAD_Cq$T zeGwX&jjHH8tR`Na@DuaMY2<415cz<7P3|Nk$SH&upNI1pg*`_OgG{xH%0O#UUim2( z$z7Fa(D;*TF?F|E1>6A9h!yz*PC#vF1J0|*U@P2`PK%3$I{ZfV3tcZ16>J`8=&#}% z;Z5_TdOmoXdDFdJd}00(fx=*8dL(n6t$Hxf;V z_5_X3gl*)*5#k1{wF!6PCGmbx5}j}tb_kn>^}^nwOJG~2qXE=}X|P-9LUbAGLEB;L zunE{wY%Vqn`-lz1UHB40Pu?aMQ3X^<&1}tR&0bAN6Q!-JeXSX(k*MX=AM!2n0zZu9 zqWjU==r^Q3vKHEzENHW?!yc-t&A}&79TA{SD^gFY^I_lfDixKX@)~Ka*i?AIm0%yz z#pzL@^}(ZoI{ql%F>hCI74LBGRPQhEUEc%$`@s9)>d<+*3VWUl@cqPzQXeSMr|J_h z192lgQ3job6<|a0fARPD2b>^`#7lfPeg*%Ihv1-j4_}Ut!)xHx@!@crjBm!%@FKiC zQH`iWbR^b6?bVQ#$>HRF@&I|CJV$OP-6TrYq8?E@sdbc>`a?aWPEtpxD5^dcOZ`Kc zs5PXINFsLOuQ4{Zoz<}UCp%glu zIm#a7K5||8aKR=Hljg{C6pN|{$>3j*1Ii=!kQr!atR!sljrb~jEMAuwLHr~Jk@;jL z>NqutT1joC!YG#Nqlwp+*Y?of)lAdu)S%inn%!DeGe)~Y6Q(Vry{;*#Ijwm`VcMCR z2+a@8G^(+t7}Z4+scA!IQQ@RQZXk1rUc_hOJ30%Ourug0^aT=wltHr94r*KVvs_k5 zlvCt?rLt0r*i=jqD~mIQc)`aPadml#TgeUMmT-V;!wuldv$t7{9mH;68?ejRN^D7{ z4|ACQ$^__TjDdO2IGN{6XQm(1nC(obad!4Qbf_M3A#RwEDy$a1h_$3YQg?Z47)7Lw)3Upkz; zO^wv;pnj6`b(N?>vajwZ8BLX=+GrDr^~4pe9e+xmAheqH*mI&5br0)D7LgawPJ|Dy zj&8@ElWz4Hegc1`cE>g%_d!`u0hy>yK<>ygyC8x`ixb<>H-nQCtefk z3QfhAl7@Sr`q%|h9<i; zi0jmQn8e0t_KDBH6Lf;y9Y=sg$;2um?Lb|n37G-M*h%<&upHZs=s_M9k5^I&A_nV& zTJY=Ya(q43ANhjrA=fLtwR_a!ptkO_)J5A%DI^e5Clk7gsu3GS98qf^5&9o|AI)p5 zrI@YhF1N;X_y@kSexX=^b;8bx8>vNdbFiLR#oILBMH#6;Uf`=~N=lW$d#t}&Q@w;- zQkyD$&=@HTOOXUwL1nH6`BBJ~S75l%S+0jHkQ*p-#o|Q1@KM@`>4h3fO|*jWMGYYa zUWVhqeQ|}72F41Nu{Qi{e2Dl;8K*9hh|>o2>pqFz(R33MTnp9lOjg_WUo*qq-jW5q>pkEs~~2{5UZWXt|DhDjg=?(UIE|+c{X}S zSqSL4*YFD{DUO}C!EJ2T`xZDxHD`zV;@SVJuI>tZ3VwD5nBuG+D zp=Fdva7`_Vyp>gSlC+P&xkbbnbSJlkS|O#VO_4!L4bTYPAym{;uqJXAIyheRzNDRb(1kPiH! ziHs3810$KjAlhzxf1<2%ATp@)aXJCt_$^$_Ho-EWQljSk$5#*=3NO_NZ zK@^EV_oyGiMmYi<3BF35$z0J4MiPZgp|%!xgSyPkr@jbh;iyqtt$|*Wz7j|Ij>Hnh zrF=%V0$HAcgpghQP|X5yI(UR;34N$V%qGoJsSH>L_MrLF3S>XnF4sYDJfGdHtH?V5 ziUXlL86l5G$0)tjWB5{jIvFMo!^f#vQh)rDI!8`G&dOVGuT(=_gPoR7p}2BeeU5z= zJ|Z81R*k^#2sGXYj%v@*i&8jx0BI;W$>V$%@-|t|N!Dl_*jUS90+4QfKtG+!K8zcL5`i06(ME9=Er@}`ubdO)sx9K9qI$G<8-@!|8B zk@}i!Z*&S$T1v)F$OKkLe2aaSnyL+uN74$kwJM0s$uzz>x<VQ5_UV@g&G_^9aMZOAn&_cPTj)k*HlQJ8$Mf%9Ukq*iW&{pjU&Wb5y zxNr(|!XkxX_+t4x_!o{sF-m)MvfK&XD^}Wby7yDUBMp3iHwlGk*C=< z_%kp*+#Gli8(;vL1E*dlojdRr+3J(LUR5&4sHff&dyCAabSh*-(5c=46oAF89! z0NtYOLwAVF(J!E!^aqY@W0ei)aJdfJRbGiLRuWYjIi;>q3XmAkSl&bq;3wgW!DDeS zd4|76ycHKAzmX)dG(J_Di9S=;GT4j@W9byHF`l_hCWs@z+$x`D5a!8&tSLQTPp=3^{a%Q2(RQL-_@FOX(CBH z0P?8fp(a{UnyNGb?eGll0C`%n!Vze)kVw7e9ueckSMVF z(iNR5cEIb%pFozZ!`lk)@F;bWSei5n9wZSgSLR`*`E|P4A+2_kcpO^RtsqWmg{bmu zuu%!2GsL8Umat!+{o3mzH{l)GgFU3l5Pqqv@Oi=` zytXn;sYT3_4nTh+T`7+)mp&rhkjC;IG)JC_j)Jx~5jRV;dIRaCG*eIF+59k~qZ$wm zVqvV~jEd%mYTni&mH0)T^K_2mr5f+xdXO9Zlaz;GnL=s0&=7{TWy9@{3^n!J`%rDIouG$ zgEkOPW2}rLXOuc^qd?6eG{9q4c#UkL)~IcbSUVcUQ?bDqgc1b%`~LK`GIH?^f%X3 zJDi(?@01#$S|uJ#M4wB?pm(+k_Rlro7@En=)n+oYh>z-aPh6H_)f3piq6oGqCR7s65GBP;$PWaS z_mJ!O0h&v~GgJWerB);^{y@7cUeFk1N-0=1c`0B)D|rTbN2-SQlA9yf(;_=ecV5Tjj9Y7+C?|`GTYL6x;Cf9M-uu^Jm@Q>UA zpC+GGSTsr=jD^cGN`~1Kwdv#9bJn>_NJL^-@_lew#ooa9H($%dkh9fKGxQ5*tZ4!6Uf@K24m6 z&z1XuEVQK56Qe;F$w6$DSA&X33iS1!DIewc*kt(vxFf|9+r*im1Yzf2VgDkl#TqCL zAX+1@!@ElX=;5Y<3?&-;26L6ys33GCYw&N-TG&x`igqi%0+_Jo$_Ql_dR?6)0kVzQ z1g(u^NtuL8yo5Q_QsA*-LGQ^H~e!7Q_-qq6eUTFe8sZKjk7?8zjl|F~77H_QJbrta=wB zUAx7VSb}T?l_8bENGXUUHibCkYG@@i5W9+3&w*d+DezjU4JN4b9D*}UMGK%9T4sPsdiG2tIbrO(hZ`^(V!MY=5_6>f^8$d<4W_@*$Rw6zYMhv zJn+x-mG!ms-gFo99Q40phsZ6kMw&1B+NKxQ&S5Ucb7z-`K-BlxO$m;KtFe2cx;oBU zqfFIxt*J2(890S+#?~U2m7wSs)(f(5SX?D7l52pT=w#?Gy;DWSCa;iMN`)@xSz+4`89zbYW;lV7*s$jVXMe=gMiAGc~7E?!vsX`NMM8 zW-rgR`l_lw^_^^^BgP~gF7dWR{bDy_qoYy|i7mtm_B8I>@r ztTg256%gLkVWN{H26^!+?D!T3}=i3oXVR>PboUH7TPV@Vj z+M&V0k)el79X=%Vks3k7{DLroJHqgEDl>w6C_I*`%RQvGLKW_5Xo`P_2X$X?Ep{z( zHFp&+x>|53|3mJ8tR;UAX3Y)RbxoZYqqE~bl*lP@JSNgIg<6U)C7x+}nr~WLSZV75 z`ygwP_8)W(U&6N$tw5VduaO}P1#PR7cp<)yX!J$5fUfxjnpQfH~< z<$e^OUZz%@p<|-JiBH)nKo9BX)%CSXmk;B=GyVcU(FC z9KT(7C?-oc1TB|CFAfz3{Jtb_Z_h9HY1f*fafScpZO<8>vn;#)AMmSY;RGT2B+nSRpozdSm)*3s^livtz5Rzy2K-L_Shg%{T1dBOb)(6t@;{7I!T? z+4Pi*gE5P0#CYYuj->(FW83!^_o=f+y&_e2$#Ul5ZaYOFO7 z_9x-}!Zuqiwkp=LdIn3vl63>@4AgeP6?P!$sW< z@&!W4{rF6_AD=GmQ+vaxZoaxxzQFAa=K9+E5dY`keYUX>CGHnDirIXSAwwO5&{{AZ z*f{=|&{eD}776e8yWCE$h{W&t=~!ZMJh83~kj znY9r$qN8Gx;)^E^j~(kcWMrr(#9JyxZ#O0xUl`6CM(Nh#pX4&aMV=Fq<*MphFaY7e zY^A4=La+Ci@Xrq%2&T~WxqpQc;!eIFn*_(@O7!56j$X+8VB`5nVYYBq_%2Aod*KY9*Gj39NSxbx| zMw_WQs*f~vHy5|eGY>PQP@ljmaUNe;7$*9p%Af;`d>Vj8>de}MPJaXc{QyP}XZ?IB z>A1L_>p|xQiO{cLrC_7bVwMu_3t7TxffN?<=eP&#A+|T`XD}|ElbD=fufQsQA8#$! z^@3;l&GKKuzWzQZFYCph>E921>y&pyk&Fe_uVL$=`^C+P*l+r#8KCQ8{%NP2A0mc2 z2ZRl@zqMY|9mAdx?@Y78D@PTNam4M2YZR>w;|vqEJ+-Iwt;|=fd#%ST2TcxLEWS~> zEL0bMOIq+7`HWInMHgVg3b@NCZ=(Q6yrB@mhDp5S^H%3K-~c{87rpdiRZ-2$`G^^j7p71hp2Wbox4oG z4!#Mtpc!_m&{xQ2&(ohmTyQ}k-CrpC0%@WOfI8m`mlId_#r` zj`T0}rF&|+1FmK+tnf*$IlEnEzx0*ADyMDwKIhw*-{1VlG`y{$-QyS*H8HAA*b~DO z{Q%qe$jsO~@rPqL2W54e5)A{WAhFW0J-l^{5aW#b8D))VW*=;>W;$rvU^yAqJ7T-D zxb35UAXOV1sPq&2NlgHce?)9n+t4aVyx*w1a*dS{Nz{wPzNxL)qC(Z@NeDpl^$3rn|B0TA`s}aBkh~*O}27 zXMZ_jK{a$QsiIYiR;wwcO9EEUWd~wWo~D!zxA`a9SJ>Z6mCbWxHjZ z`IYIGWk*;QC*x49?M$fQkJd$g#7NYOEJjD6M?pP#D-YO>(BF#-mJXZ@#DhF!mU`i?za7?h3khs7vrrU}zvRu*~1icfd2xRk|=I z?^@2Cta6!MGmpg`h-=orrG*O&WPWdm=nJ|=38V$ z@H2J-`B17U%d0aH*6J_(JYqnUi> z5bI^{u>;vWW-RlK9!Q7NMmm9h9qJw2>bu~6RHPKnE<9AQKmTN2&Ac&rQr^$}bA`*@ zhkbP5NeHmrg;Gip(w=Cb;dNHiZYvu$*O?GGH|kFGm6)-y*0_Cf-{YRe-HVgrBI2jU z8DslJ<5BL2Ea!{xFOH@TcbFrrf$gZ-YnZ3&3?t1`@y}>yWWTyqE-5bLFy>A0Ed*El zcz(Jz6|F41QXu5F%>SB~m)9#_&i`8QqVRFiOIM~_@;H4uKjZ%%*c^1i-f$~)8Maob z(5|3AkPt}muk)FFlf9Hz@ci)-f&5T+*2 zzb}vidqX~>=ltAa{wlwdufgx(zOw{tVsb+pg7&}}-xzNrPgi%EtByP9$@Hht2q*Hl zMG;~m=deR$s`ixOhWWa!v!j>uNkmrUlc?^|tD+}H8>1ISeTXcGc;{Rf-pw&4Y_olZ zt*JG^(!qSs)Yf#*NE?3W7w9PMd@6&8#%H75kV&AgD#|;h=Hg>MhkZgH310Na`V8J4 zo+s{RZlCM9>xB!r7r7gFV!RQ)GX5%oF`b*0oB0L>mL{-s!HS93Yv?V*5IuAu0i`*17 zF#1OHfasl3Lgci_9}%qcUidUe@2~;(_BOrsmieKnuW7cat7(Xl*3Z(#Xirlv;w_c| z5zkLB@5!btlXT(*n5g-Y9vMvXPxVgmNbU#j@$O954A)54HrEGNM|V@ta_>u@*Utr* zpcE>kA2Rb;J2w-0c^tQaJH*a_9(tt^6S(Ey?Ca>Q3T-Lw-t1oFJrb}og`8F7rFiu) zas)q1wborXj5K$&eGfYo{@aO0f~Z|lN|Zf1H7Xd{G;(jmL+6I@7LMX!#q9~Ucx$w! zjrp5tqlq`ZF*MS@*Y4GHqizuCFqw4{n5JG)uF3tSA_2z8xp*cmc*Re9pL)uBKDdXu zS=R%X&(+Gk+pUEeL0`PQ&k@iDJ&^lkrZbz&9f1C}o6FoYCx1G zYFA{b$SDyC&SQ=pVQ=gjyUF&=^3q(z{M$6jG{X2pKTg+I+gOuLRv@}!kC3A<>Uvoj zCEKMu;T#{%*%?0Q4D9nQ@m}y)J*nXPL(c*$V6WZdz2V{AC*21<1N~P*?cj{Ot~f*vs2foc??!Fc zRxorkSF%+L+vRu~{=<1Sf{gS;T!QQ`}_Jvc{h3Vo^04#cYB=P zBi{bLX8uZnqQKT*$51IcfvL)-aFuy4KS5X~ScN3mXBIFv`fzY~U?Ak)>HF&4Dim5692&bIytpts?TAot$~$1H%V6 zWcx{*-}=gW+d9em!g9rY#AGl{H}*6X>Qc35G+(KA%m_qz+-OFh-SUhh@kQh%>NouDD~CbXAc$}DAPbN%>e=u?jn zP@yqjjJwOE&>w^A0^R);eGR<#J(#z&Z@1qN+!lJmEae+Xhm`Mt!s-&Ys9w6GhHa)n zmU6bI_K#ts97Onw@bS+3&P}kl9&_vs+h<>In_)d->1&y9IcAvyb?2HX)p*HpLEl}M zrnyZKR0?S)X2EQ^?jTVO$=f7a=)kk=b7mTihIYYxsJFhRzB68%cfV)5hw?u2p7HJT z9}fhBt?3R7%}i$_xS!kwe!Ku@5-J1!kop?+10I04$lC@H}P=Q;-0D5V#RKV_^ z;H%?n=&R>T@ZmlK+|TxX^{w=83A_k~(=C~a>`v|)e?^!k7Kz2B>XKfXBQ6s<@)qte z;||3KQ~X=KQ$1hZM`6qT@`ZxGm|}dIuw7cCtN=66jd(GtrEZ?F$lTr9#n#T=IV{mJ z%Q4r{!(noa3^UtZmer=4hLAp_Pclp}2!@Bo(Wb?wFUISJhx+3B!#YkIs~xDxqvlYL z$g{*?oP?<5Q*|@MCU$Urm|mf&f#<#x-kRRF-u+(M+tv5UH_cxr@Fp+@W?`n#Q5jh1)IOXQOBJZYBb6lQbRn0ukkfhInk$Ksk&c&s3y@E=!OZ!oZuN#&bL z?UX`wD3X8;B%q1W|1q|(P_{bu*s!dysg7fgQI51QH0+G+j-{_jZ)mO?r=6~i(M9Vk z8KR75jjxSMjfiowfij%dSJ6+=E!VEn?4_=g_ld)JYiujBTCF4hD^%is(w~Es0&XAh zP4d?FF7%f7;r>tl)qz&Qgpd--r+rLC?kHbgTrQ=`tCYHGD$GW%0&`)T%WjyDIFeh& z>)va&Q+vpLL@)dpdJyzhUW*D>jM)@C?w{j(19KpIdv|$j`eOYh10{l`LT%|4%w_f> zx1YZY5xqY0WTgenN^b`9lwZPpUZ9+pfJpK#=69$dkn4NwxeO6KU%n~ta!!8Eko?=O zLcfkhq^+O=9!p*)i&KL%eRW+7_l@UGhs^(4###4UQ>_Ko0k(d&2G$t!dP5mqQw>gS zB`Z=-G+Dauh7?l?^F_1WQrY4+4>9jDZ8LT>{LppNqMC2yzrvV|Xv3A(gM)U|4E8Zf5{Wey;9~rUQ8#H7c$6#`KavOaEg3!$9}YH2N96j4n^> z>3BF>`9<$ywy=-5ibA@0Q|_#mgsUD(s_*4V(onHLFo}o6w$e4}lXPBcC2bPN3wfNC zMd+-6%h%BR$vxZktk9IdJ-aAla^}^%^8NwRUeac|YaMCTo3gYWsJ_$y?IQhJLvurf zeiih1eo+fF6JZYRa4HeEBZcZ5WH&KEf7$vYe0}7^$QsV>VJ6!#%PZI(wM}E-3?WsY zsT-}!){fQGBf5Z8VGbSeuktnUuMCc2&T$j@i(CWNPgkUM^a$F)_?ZkC|5+-`lvXP? zFavCXF}t1OGd{%i=bs3ZrM>buxs$w5dL~vAPYFiB$j^c^yaB;y{?on{-m~r;h*o$q zCj4IhXHs4?T@7zzDFuD%#*Tc`L(MWmB!+2*>2B)2XrF0nX?kd6Sd&Sbazu6T6v}0* zd-jU%S$VTG8e0E`>^7zj6UJ0vHbBk#$l+oi`HhmQ7DASoQg@%l8B1$J<#kVF##a?obuoqZH znjafy=(}nsYO*yM+GV=WFcbJWk}95Ij)x?A7M~3BO(0>Xv3{$YqMvWJQyk3 zNPlEVp28gQy5n+lH=u4(hgXgE7Ec~Q(h?( z63)L0<#??{Qtr~M`suZQRZYuF+nw3Qe-l69_#D?I{z0VQI$w8^sE20~0`&pT1sdYt z@X_RPawgswj1p5>8*7%1lk@CM?26*;l6EDEF*(kG_HSmbv6*fqohUC1KOu# zRWwm<#Fyk62+b86YR5JB8Z-%1kShzX+3HLynh#B(uQAcwH|{>yhbzxD=H_!hxbFNd z{yM*$&*7_yzoaPTj-pj-sC86KJ*>1;^5mxSVHk~gA%&y^aBWCeA;|6xt@gEWwamYm z&8543rhY&7y=TUbfLVJX8cq6G>}PbUEnN2mpNbX7tKd7)ctnS4i6PWw@;ka+&gM=s zwfQ)7y?Jm(-9f4?W>%|1O>d^$L*J6~ zH0!8Dq9S@(St?kVCV>Lzn_Tr@qx1Nx(pzyhe}=gq+7PPBNL-HSkxwg=VdQwWlrN0q z-*AI@i#T7d3yz{iaOJ~TE}HR&NHW=r`hx=74rQwFv724#2F%I9w(RH08A0s9`v?R$_6+ z?$39%DO%)y9azhamCne2BuVga3)v_(mHo`E5oSpiHUod8_7FS6 zSlMdE%U%~ID4&obnC~@`YvQ?|wK>iCjsG6|XF%4%oFhe6xubJ<`EQk!q`7tjv0R!A zd%z}Kp{9~o&`01Ias?d%hKcvs@%&UIWc(+(bcy4oUnZqT&#`&*wKY?SLUbbX5P6Ng zA)VS!nlN%VS{}I6zUXtZg&r}b8^7vq6C2cgZb4v*dspG$!t<`XzN7R4!348KO>#@& z0aqVt*i=~qz9S1^en_G)hQ8ppLwqDJlr3yWUXvHJQz6cBh)6_wNw2u#+*iJVl%^Pw z4`85thpp!?R#YqZd}jCbZRx`@yJdb&Z<6~#C>^;pc~a$z#edr(sHWjG8Z4Bn`N?@&4%}60VpA^qSyMCL3Clg*Be;RY~ovppJ4oGtB}es;};5brP|6h zxXy%9&q&$a5*Sy#=wDBt7ym(1sEOKdnk(cmd;=k(U3n7X36Nkg%62+3ElZHgswWjKRQccOecrx}c){(eDmZ44)tC1YB4d>w(fnS=7 z=99Lo7QgNtR#%SZ^z_T%sNkkx-_Q~I6~v|HFkk4dOl^qTSd>aIL**J=<8@l;CAHyi zFni&OvKL%GsSenQ(a=A9M!lluQU&A}A_s#j!k|sBqXgxV(n(=9f1hnmzYkpSMS6$2 z&laxCjZA;}t&&S7V89UP6n7j9-??G8MKD$1v@Gkd|JpHYA3uU z4%%MDR8DLk_sTKAaGR`0j?moFcGu2^V^}$24Dw#?DVl|c!X0HGQOwZWvdXf~u#_mH z#PgTg7JPRZqDQ#Ygu3W4EpE>MkW#*dI{sl}1DNS+#|oRvJ{YY~&O#o6LZ7>PZt z)_Mvf3o*v9!{U}Yww?u!Gn(K zl^m5v#MUKuL$sin@=c!^Hq4re|6%L+a@`xerGm%UFu5Ln)-c|-#x~ScMLUk@Lv}W9 zb2uaJ+rDU4DL0s*FpBgfG?jlR4+oRrisH@cF{z1|B)3C8K=1qt`4G7y&Sy#oj|cXK zRnvIiMPTqBPV<*{;bTuGUt#>)es58j!M_Rh*%oY^V8OnS47>FHbkOe$Ajpcgr=`b>>FoW44;saz1bzi%e%0{M%ui01ZIzC+(E)Epu3V*of zY&~Wavz0q16(ZxwXpM)ACE)r(d^?Q5_tFj0KiBWk4}yMUKZucs=_(o4o6ehqCbMCp z<_PJac2V~T2YAGhp%Q_rUb^5%7Wz9Wt?AFsKj;5m<2`FSQL=X_)p?q#3f`cP^_uY2 zQG@MWu{EJVuK0r01(G`__?Zpy1ErnHRwYLs3SN_pX?gh5s1^|wP4|#P{6TgVe@)yc zuI8=>2YIb-hdbRXS;#?_s8NC-g8fPH8DLXPrzAvw~kFwSrlB zJJld)fTa_QG?f0H;jnRn>80raj5*m%rOi_zZq&xw)_l-tG>q0GFe$GrAut1}<%}uWI;ovaBX97H za2L6fU8~$p{C7h#Be5UopT42qL(DjwvdxMt6S2YE1#c;J7iX#nb{XBFJYhAy%>`w0 zTju5!y!MW#XK;hL7`A{}#GMh(sR+KDnyxuR?uOn*b7iw~9jrx1qNQN|Y!{eGhari? zUQMFDl`-7B$Gp*e){<=h5w4FiM!$?ioZ0p*)_lt{D`AVY8Er=_y#5}#gibGLns>`} z$iKniYm z@)ma`=SSsjDa`P97Fr?4h?>*{G7lHA62wc*azhPMmSK!$Ih^6TaDE_x^hwmUWO1!}~cLy@c ze}D7k@XxDxM}zI9OKPg36FYHN_|Bl3_LKR5wXU%X%XJ_rUTbEH$jidfX)Ix9O)CkD0q#uA2h-W!ghjoF+xT z$ZQScoX;W%=SWAn@UD?e3>AMkJ}16?qB&`Pi371^s8K~9e=o_q$h}k!`96Fq_x%3z z6R#`hVnQW#wRnjiA*3p;$my1@F*Qp*D^rxDiI_xHmgAHK#7XTR+{-q~3w*!vnfZGC zS9Z2gP{Q@CsCdDuyzhmnfxGfoO)JwZLvOMX7zNit9R?)!3aKo)f+6L*QeF&v-R0Lw zmlC)V?Bn0=ZSCL0jF9JOjycvR94nq5O`9&0W68<}%0AVO=q3r{Tu-u_WnIi}k?YCb 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 z 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

w(#uq=ZnfnEQq-^Yei1L6g9(J~XOt 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 literal 0 HcmV?d00001 diff --git a/dotnet/src/IntegrationTestsV2/TestData/test_image_001.jpg b/dotnet/src/IntegrationTestsV2/TestData/test_image_001.jpg new file mode 100644 index 0000000000000000000000000000000000000000..4a132825f9d641659e036ad6ebc9ac64abe7b192 GIT binary patch literal 61082 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 u=Z_`vzx?BYvS5Pa-52tZ+F+r7=vTm~>w#yfi Date: Mon, 1 Jul 2024 18:43:30 +0100 Subject: [PATCH 07/17] Remove extra space in filename --- .../{ClientCore .AudioToText.cs => ClientCore.AudioToText.cs} | 0 .../{ClientCore .TextToAudio.cs => ClientCore.TextToAudio.cs} | 0 2 files changed, 0 insertions(+), 0 deletions(-) rename dotnet/src/Connectors/Connectors.OpenAIV2/Core/{ClientCore .AudioToText.cs => ClientCore.AudioToText.cs} (100%) rename dotnet/src/Connectors/Connectors.OpenAIV2/Core/{ClientCore .TextToAudio.cs => ClientCore.TextToAudio.cs} (100%) diff --git a/dotnet/src/Connectors/Connectors.OpenAIV2/Core/ClientCore .AudioToText.cs b/dotnet/src/Connectors/Connectors.OpenAIV2/Core/ClientCore.AudioToText.cs similarity index 100% rename from dotnet/src/Connectors/Connectors.OpenAIV2/Core/ClientCore .AudioToText.cs rename to dotnet/src/Connectors/Connectors.OpenAIV2/Core/ClientCore.AudioToText.cs diff --git a/dotnet/src/Connectors/Connectors.OpenAIV2/Core/ClientCore .TextToAudio.cs b/dotnet/src/Connectors/Connectors.OpenAIV2/Core/ClientCore.TextToAudio.cs similarity index 100% rename from dotnet/src/Connectors/Connectors.OpenAIV2/Core/ClientCore .TextToAudio.cs rename to dotnet/src/Connectors/Connectors.OpenAIV2/Core/ClientCore.TextToAudio.cs From 2ab5d597f68ca7de9dd9f091487f10b7d1f5d533 Mon Sep 17 00:00:00 2001 From: Roger Barreto <19890735+RogerBarreto@users.noreply.github.com> Date: Mon, 1 Jul 2024 18:44:51 +0100 Subject: [PATCH 08/17] Removing nonused image test data --- .../TestData/test_image_001.jpg | Bin 61082 -> 0 bytes 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 dotnet/src/IntegrationTestsV2/TestData/test_image_001.jpg diff --git a/dotnet/src/IntegrationTestsV2/TestData/test_image_001.jpg b/dotnet/src/IntegrationTestsV2/TestData/test_image_001.jpg deleted file mode 100644 index 4a132825f9d641659e036ad6ebc9ac64abe7b192..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 61082 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 u=Z_`vzx?BYvS5Pa-52tZ+F+r7=vTm~>w#yfi Date: Mon, 1 Jul 2024 19:24:01 +0100 Subject: [PATCH 09/17] Address PR comments --- .../Core/ClientCore.AudioToText.cs | 21 +++++-------------- .../Core/ClientCore.TextToAudio.cs | 11 +--------- .../OpenAIAudioToTextExecutionSettings.cs | 11 ++-------- .../OpenAITextToAudioExecutionSettings.cs | 7 +------ .../Services/OpenAIAudioToTextService.cs | 4 ++-- 5 files changed, 11 insertions(+), 43 deletions(-) diff --git a/dotnet/src/Connectors/Connectors.OpenAIV2/Core/ClientCore.AudioToText.cs b/dotnet/src/Connectors/Connectors.OpenAIV2/Core/ClientCore.AudioToText.cs index 7849c6103a3f..eb0527b76ede 100644 --- a/dotnet/src/Connectors/Connectors.OpenAIV2/Core/ClientCore.AudioToText.cs +++ b/dotnet/src/Connectors/Connectors.OpenAIV2/Core/ClientCore.AudioToText.cs @@ -1,14 +1,5 @@ // Copyright (c) Microsoft. All rights reserved. -/* -Phase 02 - -- This class was created focused in the Image Generation using the SDK client instead of the own client in V1. -- Added Checking for empty or whitespace prompt. -- Removed the format parameter as this is never called in V1 code. Plan to implement it in the future once we change the ITextToImageService abstraction, using PromptExecutionSettings. -- Allow custom size for images when the endpoint is not the default OpenAI v1 endpoint. -*/ - using System; using System.Collections.Generic; using System.IO; @@ -96,7 +87,7 @@ internal async Task> GetTextFromAudioContentsAsync( throw new ArgumentException($"Invalid execution settings, cannot convert to {nameof(OpenAIAudioToTextExecutionSettings)}", nameof(executionSettings)); } - private static AudioTimestampGranularities ConvertToAudioTimestampGranularities(OpenAIAudioToTextExecutionSettings.TimeStampGranularities[]? granularity) + private static AudioTimestampGranularities ConvertToAudioTimestampGranularities(IEnumerable? granularity) { return granularity?.FirstOrDefault() switch { @@ -108,12 +99,10 @@ private static AudioTimestampGranularities ConvertToAudioTimestampGranularities( } private static Dictionary GetResponseMetadata(AudioTranscription audioTranscription) - { - return new Dictionary(3) + => new(3) { - { nameof(audioTranscription.Language), audioTranscription.Language }, - { nameof(audioTranscription.Duration), audioTranscription.Duration }, - { nameof(audioTranscription.Segments), audioTranscription.Segments } + [nameof(audioTranscription.Language)] = audioTranscription.Language, + [nameof(audioTranscription.Duration)] = audioTranscription.Duration, + [nameof(audioTranscription.Segments)] = audioTranscription.Segments }; - } } diff --git a/dotnet/src/Connectors/Connectors.OpenAIV2/Core/ClientCore.TextToAudio.cs b/dotnet/src/Connectors/Connectors.OpenAIV2/Core/ClientCore.TextToAudio.cs index 1fcad0f0fac2..75e484a489aa 100644 --- a/dotnet/src/Connectors/Connectors.OpenAIV2/Core/ClientCore.TextToAudio.cs +++ b/dotnet/src/Connectors/Connectors.OpenAIV2/Core/ClientCore.TextToAudio.cs @@ -1,14 +1,5 @@ // Copyright (c) Microsoft. All rights reserved. -/* -Phase 02 - -- This class was created focused in the Image Generation using the SDK client instead of the own client in V1. -- Added Checking for empty or whitespace prompt. -- Removed the format parameter as this is never called in V1 code. Plan to implement it in the future once we change the ITextToImageService abstraction, using PromptExecutionSettings. -- Allow custom size for images when the endpoint is not the default OpenAI v1 endpoint. -*/ - using System; using System.ClientModel; using System.Collections.Generic; @@ -62,7 +53,7 @@ private static GeneratedSpeechVoice GetGeneratedSpeechVoice(string? voice) _ => throw new NotSupportedException($"The voice '{voice}' is not supported."), }; - private static (GeneratedSpeechFormat, string) GetGeneratedSpeechFormatAndMimeType(string? format) + private static (GeneratedSpeechFormat Format, string MimeType) GetGeneratedSpeechFormatAndMimeType(string? format) => format?.ToUpperInvariant() switch { "WAV" => (GeneratedSpeechFormat.Wav, "audio/wav"), diff --git a/dotnet/src/Connectors/Connectors.OpenAIV2/OpenAIAudioToTextExecutionSettings.cs b/dotnet/src/Connectors/Connectors.OpenAIV2/OpenAIAudioToTextExecutionSettings.cs index ee76dc240576..b56ad62d553d 100644 --- a/dotnet/src/Connectors/Connectors.OpenAIV2/OpenAIAudioToTextExecutionSettings.cs +++ b/dotnet/src/Connectors/Connectors.OpenAIV2/OpenAIAudioToTextExecutionSettings.cs @@ -98,9 +98,7 @@ public float Temperature /// The timestamp granularities to populate for this transcription. response_format must be set verbose_json to use timestamp granularities. Either or both of these options are supported: word, or segment. ///

[JsonPropertyName("granularities")] -#pragma warning disable CA1819 // Properties should not return arrays - public TimeStampGranularities[]? Granularities { get; set; } -#pragma warning restore CA1819 // Properties should not return arrays + public IReadOnlyList? Granularities { get; set; } /// /// Creates an instance of class with default filename - "file.mp3". @@ -154,12 +152,7 @@ public override PromptExecutionSettings Clone() var openAIExecutionSettings = JsonSerializer.Deserialize(json, JsonOptionsCache.ReadPermissive); - if (openAIExecutionSettings is not null) - { - return openAIExecutionSettings; - } - - throw new ArgumentException($"Invalid execution settings, cannot convert to {nameof(OpenAIAudioToTextExecutionSettings)}", nameof(executionSettings)); + return openAIExecutionSettings!; } /// diff --git a/dotnet/src/Connectors/Connectors.OpenAIV2/OpenAITextToAudioExecutionSettings.cs b/dotnet/src/Connectors/Connectors.OpenAIV2/OpenAITextToAudioExecutionSettings.cs index 0174fca473ae..e0c269979f01 100644 --- a/dotnet/src/Connectors/Connectors.OpenAIV2/OpenAITextToAudioExecutionSettings.cs +++ b/dotnet/src/Connectors/Connectors.OpenAIV2/OpenAITextToAudioExecutionSettings.cs @@ -115,12 +115,7 @@ public override PromptExecutionSettings Clone() var openAIExecutionSettings = JsonSerializer.Deserialize(json, JsonOptionsCache.ReadPermissive); - if (openAIExecutionSettings is not null) - { - return openAIExecutionSettings; - } - - throw new ArgumentException($"Invalid execution settings, cannot convert to {nameof(OpenAITextToAudioExecutionSettings)}", nameof(executionSettings)); + return openAIExecutionSettings!; } #region private ================================================================================ diff --git a/dotnet/src/Connectors/Connectors.OpenAIV2/Services/OpenAIAudioToTextService.cs b/dotnet/src/Connectors/Connectors.OpenAIV2/Services/OpenAIAudioToTextService.cs index 06b605147585..88c19c9f1c86 100644 --- a/dotnet/src/Connectors/Connectors.OpenAIV2/Services/OpenAIAudioToTextService.cs +++ b/dotnet/src/Connectors/Connectors.OpenAIV2/Services/OpenAIAudioToTextService.cs @@ -68,9 +68,9 @@ public OpenAIAudioToTextService( /// public Task> GetTextContentsAsync( - AudioContent input, + AudioContent content, PromptExecutionSettings? executionSettings = null, Kernel? kernel = null, CancellationToken cancellationToken = default) - => this._client.GetTextFromAudioContentsAsync(input, executionSettings, cancellationToken); + => this._client.GetTextFromAudioContentsAsync(content, executionSettings, cancellationToken); } From 4eddfdda92f917f8a99282097cba8750009028e3 Mon Sep 17 00:00:00 2001 From: Roger Barreto <19890735+RogerBarreto@users.noreply.github.com> Date: Mon, 1 Jul 2024 19:43:36 +0100 Subject: [PATCH 10/17] Address warnings and feedback --- .../Connectors.OpenAIV2/Core/ClientCore.AudioToText.cs | 4 ++-- .../Extensions/OpenAIServiceCollectionExtensions.cs | 1 - .../Connectors.OpenAIV2/OpenAIAudioToTextExecutionSettings.cs | 1 - .../Connectors.OpenAIV2/OpenAITextToAudioExecutionSettings.cs | 1 - 4 files changed, 2 insertions(+), 5 deletions(-) diff --git a/dotnet/src/Connectors/Connectors.OpenAIV2/Core/ClientCore.AudioToText.cs b/dotnet/src/Connectors/Connectors.OpenAIV2/Core/ClientCore.AudioToText.cs index eb0527b76ede..69d885972272 100644 --- a/dotnet/src/Connectors/Connectors.OpenAIV2/Core/ClientCore.AudioToText.cs +++ b/dotnet/src/Connectors/Connectors.OpenAIV2/Core/ClientCore.AudioToText.cs @@ -47,10 +47,10 @@ internal async Task> GetTextFromAudioContentsAsync( } /// - /// Converts to derived type. + /// Converts to type. /// /// Instance of . - /// Instance of . + /// Instance of . private static AudioTranscriptionOptions? AudioOptionsFromExecutionSettings(PromptExecutionSettings? executionSettings) { if (executionSettings is null) diff --git a/dotnet/src/Connectors/Connectors.OpenAIV2/Extensions/OpenAIServiceCollectionExtensions.cs b/dotnet/src/Connectors/Connectors.OpenAIV2/Extensions/OpenAIServiceCollectionExtensions.cs index 5fedd6ca64a7..769634c1cea7 100644 --- a/dotnet/src/Connectors/Connectors.OpenAIV2/Extensions/OpenAIServiceCollectionExtensions.cs +++ b/dotnet/src/Connectors/Connectors.OpenAIV2/Extensions/OpenAIServiceCollectionExtensions.cs @@ -2,7 +2,6 @@ using System; using System.Diagnostics.CodeAnalysis; -using System.Net.Http; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Logging; using Microsoft.SemanticKernel.AudioToText; diff --git a/dotnet/src/Connectors/Connectors.OpenAIV2/OpenAIAudioToTextExecutionSettings.cs b/dotnet/src/Connectors/Connectors.OpenAIV2/OpenAIAudioToTextExecutionSettings.cs index b56ad62d553d..5d87768c5ddd 100644 --- a/dotnet/src/Connectors/Connectors.OpenAIV2/OpenAIAudioToTextExecutionSettings.cs +++ b/dotnet/src/Connectors/Connectors.OpenAIV2/OpenAIAudioToTextExecutionSettings.cs @@ -1,6 +1,5 @@ // Copyright (c) Microsoft. All rights reserved. -using System; using System.Collections.Generic; using System.Diagnostics.CodeAnalysis; using System.Text.Json; diff --git a/dotnet/src/Connectors/Connectors.OpenAIV2/OpenAITextToAudioExecutionSettings.cs b/dotnet/src/Connectors/Connectors.OpenAIV2/OpenAITextToAudioExecutionSettings.cs index e0c269979f01..8fca703901eb 100644 --- a/dotnet/src/Connectors/Connectors.OpenAIV2/OpenAITextToAudioExecutionSettings.cs +++ b/dotnet/src/Connectors/Connectors.OpenAIV2/OpenAITextToAudioExecutionSettings.cs @@ -5,7 +5,6 @@ Bringing the OpenAITextToAudioExecutionSettings class to the OpenAIV2 connector */ -using System; using System.Collections.Generic; using System.Diagnostics.CodeAnalysis; using System.Text.Json; From 2d06071e01addf662a34749a24d416c8fef3fba9 Mon Sep 17 00:00:00 2001 From: Roger Barreto <19890735+RogerBarreto@users.noreply.github.com> Date: Mon, 1 Jul 2024 20:30:01 +0100 Subject: [PATCH 11/17] Granularities is single --- .../Core/ClientCore.AudioToText.cs | 54 +++++-------------- .../OpenAIAudioToTextExecutionSettings.cs | 11 ++-- 2 files changed, 20 insertions(+), 45 deletions(-) diff --git a/dotnet/src/Connectors/Connectors.OpenAIV2/Core/ClientCore.AudioToText.cs b/dotnet/src/Connectors/Connectors.OpenAIV2/Core/ClientCore.AudioToText.cs index 69d885972272..feca223a9ce7 100644 --- a/dotnet/src/Connectors/Connectors.OpenAIV2/Core/ClientCore.AudioToText.cs +++ b/dotnet/src/Connectors/Connectors.OpenAIV2/Core/ClientCore.AudioToText.cs @@ -4,10 +4,8 @@ using System.Collections.Generic; using System.IO; using System.Linq; -using System.Text.Json; using System.Threading; using System.Threading.Tasks; -using Microsoft.SemanticKernel.Text; using OpenAI.Audio; namespace Microsoft.SemanticKernel.Connectors.OpenAI; @@ -34,12 +32,12 @@ internal async Task> GetTextFromAudioContentsAsync( throw new ArgumentException("The input audio content is not readable.", nameof(input)); } - OpenAIAudioToTextExecutionSettings? audioExecutionSettings = OpenAIAudioToTextExecutionSettings.FromExecutionSettings(executionSettings); - AudioTranscriptionOptions? audioOptions = AudioOptionsFromExecutionSettings(executionSettings); + OpenAIAudioToTextExecutionSettings audioExecutionSettings = OpenAIAudioToTextExecutionSettings.FromExecutionSettings(executionSettings); + AudioTranscriptionOptions? audioOptions = AudioOptionsFromExecutionSettings(audioExecutionSettings); Verify.ValidFilename(audioExecutionSettings?.Filename); - var memoryStream = new MemoryStream(input.Data!.Value.ToArray()); + using var memoryStream = new MemoryStream(input.Data!.Value.ToArray()); AudioTranscription responseData = (await RunRequestAsync(() => this.Client.GetAudioClient(this.ModelId).TranscribeAudioAsync(memoryStream, audioExecutionSettings?.Filename, audioOptions)).ConfigureAwait(false)).Value; @@ -51,47 +49,19 @@ internal async Task> GetTextFromAudioContentsAsync( /// /// Instance of . /// Instance of . - private static AudioTranscriptionOptions? AudioOptionsFromExecutionSettings(PromptExecutionSettings? executionSettings) - { - if (executionSettings is null) - { - return new AudioTranscriptionOptions(); - } - - if (executionSettings is OpenAIAudioToTextExecutionSettings settings) + private static AudioTranscriptionOptions? AudioOptionsFromExecutionSettings(OpenAIAudioToTextExecutionSettings executionSettings) + => new() { - return new AudioTranscriptionOptions - { - Granularities = ConvertToAudioTimestampGranularities(settings.Granularities), - Language = settings.Language, - Prompt = settings.Prompt, - Temperature = settings.Temperature - }; - } - - var json = JsonSerializer.Serialize(executionSettings); - - var openAIExecutionSettings = JsonSerializer.Deserialize(json, JsonOptionsCache.ReadPermissive); - - if (openAIExecutionSettings is not null) - { - return new AudioTranscriptionOptions - { - Granularities = ConvertToAudioTimestampGranularities(openAIExecutionSettings.Granularities), - Language = openAIExecutionSettings.Language, - Prompt = openAIExecutionSettings.Prompt, - Temperature = openAIExecutionSettings.Temperature - }; - } - - throw new ArgumentException($"Invalid execution settings, cannot convert to {nameof(OpenAIAudioToTextExecutionSettings)}", nameof(executionSettings)); - } + Granularities = ConvertToAudioTimestampGranularities(executionSettings!.Granularities), + Language = executionSettings.Language, + Prompt = executionSettings.Prompt, + Temperature = executionSettings.Temperature + }; - private static AudioTimestampGranularities ConvertToAudioTimestampGranularities(IEnumerable? granularity) + private static AudioTimestampGranularities ConvertToAudioTimestampGranularities(OpenAIAudioToTextExecutionSettings.TimeStampGranularities? granularity) { - return granularity?.FirstOrDefault() switch + return granularity switch { - OpenAIAudioToTextExecutionSettings.TimeStampGranularities.Default => AudioTimestampGranularities.Default, OpenAIAudioToTextExecutionSettings.TimeStampGranularities.Word => AudioTimestampGranularities.Word, OpenAIAudioToTextExecutionSettings.TimeStampGranularities.Segment => AudioTimestampGranularities.Segment, _ => AudioTimestampGranularities.Default diff --git a/dotnet/src/Connectors/Connectors.OpenAIV2/OpenAIAudioToTextExecutionSettings.cs b/dotnet/src/Connectors/Connectors.OpenAIV2/OpenAIAudioToTextExecutionSettings.cs index 5d87768c5ddd..835ce4de9c96 100644 --- a/dotnet/src/Connectors/Connectors.OpenAIV2/OpenAIAudioToTextExecutionSettings.cs +++ b/dotnet/src/Connectors/Connectors.OpenAIV2/OpenAIAudioToTextExecutionSettings.cs @@ -8,6 +8,11 @@ namespace Microsoft.SemanticKernel.Connectors.OpenAI; +/* +Phase 04 +Droped support for multiple granularities as it is not supported in OpenAI V2 SDK Options. + +*/ /// /// Execution settings for OpenAI audio-to-text request. /// @@ -94,10 +99,10 @@ public float Temperature } /// - /// The timestamp granularities to populate for this transcription. response_format must be set verbose_json to use timestamp granularities. Either or both of these options are supported: word, or segment. + /// The timestamp granularities to populate for this transcription. response_format must be set verbose_json to use timestamp granularities. Either of these options are supported: word, or segment. /// [JsonPropertyName("granularities")] - public IReadOnlyList? Granularities { get; set; } + public TimeStampGranularities? Granularities { get; set; } /// /// Creates an instance of class with default filename - "file.mp3". @@ -135,7 +140,7 @@ public override PromptExecutionSettings Clone() /// /// Instance of . /// Instance of . - public static OpenAIAudioToTextExecutionSettings? FromExecutionSettings(PromptExecutionSettings? executionSettings) + public static OpenAIAudioToTextExecutionSettings FromExecutionSettings(PromptExecutionSettings? executionSettings) { if (executionSettings is null) { From 3b09b69bd68de96b3aec73d2a3525015ae8851c4 Mon Sep 17 00:00:00 2001 From: Roger Barreto <19890735+RogerBarreto@users.noreply.github.com> Date: Mon, 1 Jul 2024 22:08:44 +0100 Subject: [PATCH 12/17] Fix granularities as a bitwise operation --- .../Core/ClientCore.AudioToText.cs | 24 ++++++++++++++----- .../OpenAIAudioToTextExecutionSettings.cs | 12 ++++------ 2 files changed, 22 insertions(+), 14 deletions(-) diff --git a/dotnet/src/Connectors/Connectors.OpenAIV2/Core/ClientCore.AudioToText.cs b/dotnet/src/Connectors/Connectors.OpenAIV2/Core/ClientCore.AudioToText.cs index feca223a9ce7..ed5b53f8f1a0 100644 --- a/dotnet/src/Connectors/Connectors.OpenAIV2/Core/ClientCore.AudioToText.cs +++ b/dotnet/src/Connectors/Connectors.OpenAIV2/Core/ClientCore.AudioToText.cs @@ -58,14 +58,26 @@ internal async Task> GetTextFromAudioContentsAsync( Temperature = executionSettings.Temperature }; - private static AudioTimestampGranularities ConvertToAudioTimestampGranularities(OpenAIAudioToTextExecutionSettings.TimeStampGranularities? granularity) + private static AudioTimestampGranularities ConvertToAudioTimestampGranularities(IEnumerable? granularities) { - return granularity switch + AudioTimestampGranularities result = AudioTimestampGranularities.Default; + + if (granularities is not null) { - OpenAIAudioToTextExecutionSettings.TimeStampGranularities.Word => AudioTimestampGranularities.Word, - OpenAIAudioToTextExecutionSettings.TimeStampGranularities.Segment => AudioTimestampGranularities.Segment, - _ => AudioTimestampGranularities.Default - }; + foreach (var granularity in granularities) + { + var openAIGranularity = granularity switch + { + OpenAIAudioToTextExecutionSettings.TimeStampGranularities.Word => AudioTimestampGranularities.Word, + OpenAIAudioToTextExecutionSettings.TimeStampGranularities.Segment => AudioTimestampGranularities.Segment, + _ => AudioTimestampGranularities.Default + }; + + result |= openAIGranularity; + } + } + + return result; } private static Dictionary GetResponseMetadata(AudioTranscription audioTranscription) diff --git a/dotnet/src/Connectors/Connectors.OpenAIV2/OpenAIAudioToTextExecutionSettings.cs b/dotnet/src/Connectors/Connectors.OpenAIV2/OpenAIAudioToTextExecutionSettings.cs index 835ce4de9c96..b56ad62d553d 100644 --- a/dotnet/src/Connectors/Connectors.OpenAIV2/OpenAIAudioToTextExecutionSettings.cs +++ b/dotnet/src/Connectors/Connectors.OpenAIV2/OpenAIAudioToTextExecutionSettings.cs @@ -1,5 +1,6 @@ // Copyright (c) Microsoft. All rights reserved. +using System; using System.Collections.Generic; using System.Diagnostics.CodeAnalysis; using System.Text.Json; @@ -8,11 +9,6 @@ namespace Microsoft.SemanticKernel.Connectors.OpenAI; -/* -Phase 04 -Droped support for multiple granularities as it is not supported in OpenAI V2 SDK Options. - -*/ /// /// Execution settings for OpenAI audio-to-text request. /// @@ -99,10 +95,10 @@ public float Temperature } /// - /// The timestamp granularities to populate for this transcription. response_format must be set verbose_json to use timestamp granularities. Either of these options are supported: word, or segment. + /// The timestamp granularities to populate for this transcription. response_format must be set verbose_json to use timestamp granularities. Either or both of these options are supported: word, or segment. /// [JsonPropertyName("granularities")] - public TimeStampGranularities? Granularities { get; set; } + public IReadOnlyList? Granularities { get; set; } /// /// Creates an instance of class with default filename - "file.mp3". @@ -140,7 +136,7 @@ public override PromptExecutionSettings Clone() /// /// Instance of . /// Instance of . - public static OpenAIAudioToTextExecutionSettings FromExecutionSettings(PromptExecutionSettings? executionSettings) + public static OpenAIAudioToTextExecutionSettings? FromExecutionSettings(PromptExecutionSettings? executionSettings) { if (executionSettings is null) { From 1fd16604b60cf185651623b40de495190f0d2218 Mon Sep 17 00:00:00 2001 From: Roger Barreto <19890735+RogerBarreto@users.noreply.github.com> Date: Tue, 2 Jul 2024 11:04:10 +0100 Subject: [PATCH 13/17] Add missing UT --- .../Services/OpenAIAudioToTextServiceTests.cs | 60 +++++++++++++++++ .../Services/OpenAITextToAudioServiceTests.cs | 64 +++++++++++++++++++ .../Services/OpenAIAudioToTextService.cs | 5 +- .../OpenAITextEmbbedingGenerationService.cs | 12 ++-- .../Services/OpenAITextToAudioService.cs | 5 +- .../Services/OpenAITextToImageService.cs | 12 ++-- .../OpenAIAudioToTextExecutionSettings.cs | 0 .../OpenAITextToAudioExecutionSettings.cs | 0 8 files changed, 144 insertions(+), 14 deletions(-) rename dotnet/src/Connectors/Connectors.OpenAIV2/{ => Settings}/OpenAIAudioToTextExecutionSettings.cs (100%) rename dotnet/src/Connectors/Connectors.OpenAIV2/{ => Settings}/OpenAITextToAudioExecutionSettings.cs (100%) diff --git a/dotnet/src/Connectors/Connectors.OpenAIV2.UnitTests/Services/OpenAIAudioToTextServiceTests.cs b/dotnet/src/Connectors/Connectors.OpenAIV2.UnitTests/Services/OpenAIAudioToTextServiceTests.cs index 6651421bf6cb..f6174744a63d 100644 --- a/dotnet/src/Connectors/Connectors.OpenAIV2.UnitTests/Services/OpenAIAudioToTextServiceTests.cs +++ b/dotnet/src/Connectors/Connectors.OpenAIV2.UnitTests/Services/OpenAIAudioToTextServiceTests.cs @@ -2,13 +2,16 @@ using System; using System.Net.Http; +using System.Text; using System.Threading.Tasks; using Microsoft.Extensions.Logging; using Microsoft.SemanticKernel; using Microsoft.SemanticKernel.Connectors.OpenAI; using Moq; using OpenAI; +using OpenAI.Audio; using Xunit; +using static Microsoft.SemanticKernel.Connectors.OpenAI.OpenAIAudioToTextExecutionSettings; namespace SemanticKernel.Connectors.OpenAI.UnitTests.Services; @@ -59,6 +62,43 @@ public void ConstructorWithOpenAIClientWorksCorrectly(bool includeLoggerFactory) Assert.Equal("model-id", service.Attributes["ModelId"]); } + [Theory] + [InlineData(new TimeStampGranularities[] { TimeStampGranularities.Default }, "0")] + [InlineData(new TimeStampGranularities[] { TimeStampGranularities.Word }, "word")] + [InlineData(new TimeStampGranularities[] { TimeStampGranularities.Segment }, "segment")] + [InlineData(new TimeStampGranularities[] { TimeStampGranularities.Segment, TimeStampGranularities.Word }, "word", "segment")] + [InlineData(new TimeStampGranularities[] { TimeStampGranularities.Word, TimeStampGranularities.Segment }, "word", "segment")] + [InlineData(new TimeStampGranularities[] { TimeStampGranularities.Default, TimeStampGranularities.Word }, "word", "0")] + [InlineData(new TimeStampGranularities[] { TimeStampGranularities.Word, TimeStampGranularities.Default }, "word", "0")] + [InlineData(new TimeStampGranularities[] { TimeStampGranularities.Default, TimeStampGranularities.Segment }, "segment", "0")] + [InlineData(new TimeStampGranularities[] { TimeStampGranularities.Segment, TimeStampGranularities.Default }, "segment", "0")] + public async Task GetTextContentGranularitiesWorksAsync(TimeStampGranularities[] granularities, params string[] expectedGranularities) + { + // Arrange + var service = new OpenAIAudioToTextService("model-id", "api-key", httpClient: this._httpClient); + this._messageHandlerStub.ResponseToReturn = new HttpResponseMessage(System.Net.HttpStatusCode.OK) + { + Content = new StringContent("Test audio-to-text response") + }; + + // Act + var settings = new OpenAIAudioToTextExecutionSettings("file.mp3") { Granularities = granularities }; + var result = await service.GetTextContentsAsync(new AudioContent(new BinaryData("data"), mimeType: null), settings); + + // Assert + Assert.NotNull(this._messageHandlerStub.RequestContent); + Assert.NotNull(result); + + var multiPartData = Encoding.UTF8.GetString(this._messageHandlerStub.RequestContent!); + var multiPartBreak = multiPartData.Substring(0, multiPartData.IndexOf("\r\n", StringComparison.OrdinalIgnoreCase)); + + foreach (var granularity in expectedGranularities) + { + var expectedMultipart = $"{granularity}\r\n{multiPartBreak}"; + Assert.Contains(expectedMultipart, multiPartData); + } + } + [Fact] public async Task GetTextContentByDefaultWorksCorrectlyAsync() { @@ -77,6 +117,26 @@ public async Task GetTextContentByDefaultWorksCorrectlyAsync() Assert.Equal("Test audio-to-text response", result[0].Text); } + [Fact] + public async Task GetTextContentsDoesLogActionAsync() + { + // Assert + var modelId = "whisper-1"; + var logger = new Mock>(); + logger.Setup(l => l.IsEnabled(It.IsAny())).Returns(true); + + this._mockLoggerFactory.Setup(x => x.CreateLogger(It.IsAny())).Returns(logger.Object); + + // Arrange + var sut = new OpenAIAudioToTextService(modelId, "apiKey", httpClient: this._httpClient, loggerFactory: this._mockLoggerFactory.Object); + + // Act + await sut.GetTextContentsAsync(new(new byte[] { 0x01, 0x02 }, "text/plain")); + + // Assert + logger.VerifyLog(LogLevel.Information, $"Action: {nameof(OpenAIAudioToTextService.GetTextContentsAsync)}. OpenAI Model ID: {modelId}.", Times.Once()); + } + public void Dispose() { this._httpClient.Dispose(); diff --git a/dotnet/src/Connectors/Connectors.OpenAIV2.UnitTests/Services/OpenAITextToAudioServiceTests.cs b/dotnet/src/Connectors/Connectors.OpenAIV2.UnitTests/Services/OpenAITextToAudioServiceTests.cs index 95ebb94f5fa3..5799e9bdd289 100644 --- a/dotnet/src/Connectors/Connectors.OpenAIV2.UnitTests/Services/OpenAITextToAudioServiceTests.cs +++ b/dotnet/src/Connectors/Connectors.OpenAIV2.UnitTests/Services/OpenAITextToAudioServiceTests.cs @@ -5,6 +5,7 @@ using System.Linq; using System.Net; using System.Net.Http; +using System.Text; using System.Threading.Tasks; using Microsoft.Extensions.Logging; using Microsoft.SemanticKernel.Connectors.OpenAI; @@ -88,6 +89,37 @@ public async Task GetAudioContentByDefaultWorksCorrectlyAsync() Assert.True(audioData.Span.SequenceEqual(expectedByteArray)); } + [Theory] + [InlineData("echo", "wav")] + [InlineData("fable", "opus")] + [InlineData("onyx", "flac")] + [InlineData("nova", "aac")] + [InlineData("shimmer", "pcm")] + public async Task GetAudioContentVoicesWorksCorrectlyAsync(string voice, string format) + { + // Arrange + byte[] expectedByteArray = [0x00, 0x00, 0xFF, 0x7F]; + + var service = new OpenAITextToAudioService("model-id", "api-key", "organization", null, this._httpClient); + await using var stream = new MemoryStream(expectedByteArray); + + this._messageHandlerStub.ResponseToReturn = new HttpResponseMessage(HttpStatusCode.OK) + { + Content = new StreamContent(stream) + }; + + // Act + var result = await service.GetAudioContentsAsync("Some text", new OpenAITextToAudioExecutionSettings(voice) { ResponseFormat = format }); + + // Assert + var resquestBody = Encoding.UTF8.GetString(this._messageHandlerStub.RequestContent!); + var audioData = result[0].Data!.Value; + Assert.Contains($"\"voice\":\"{voice}\"", resquestBody); + Assert.Contains($"\"response_format\":\"{format}\"", resquestBody); + Assert.False(audioData.IsEmpty); + Assert.True(audioData.Span.SequenceEqual(expectedByteArray)); + } + [Fact] public async Task GetAudioContentThrowsWhenVoiceIsNotSupportedAsync() { @@ -100,6 +132,18 @@ public async Task GetAudioContentThrowsWhenVoiceIsNotSupportedAsync() await Assert.ThrowsAsync(async () => await service.GetAudioContentsAsync("Some text", new OpenAITextToAudioExecutionSettings("voice"))); } + [Fact] + public async Task GetAudioContentThrowsWhenFormatIsNotSupportedAsync() + { + // Arrange + byte[] expectedByteArray = [0x00, 0x00, 0xFF, 0x7F]; + + var service = new OpenAITextToAudioService("model-id", "api-key", "organization", null, this._httpClient); + + // Act & Assert + await Assert.ThrowsAsync(async () => await service.GetAudioContentsAsync("Some text", new OpenAITextToAudioExecutionSettings() { ResponseFormat = "not supported" })); + } + [Theory] [InlineData(true, "http://local-endpoint")] [InlineData(false, "https://api.openai.com")] @@ -128,6 +172,26 @@ public async Task GetAudioContentUsesValidBaseUrlAsync(bool useHttpClientBaseAdd Assert.StartsWith(expectedBaseAddress, this._messageHandlerStub.RequestUri!.AbsoluteUri, StringComparison.InvariantCulture); } + [Fact] + public async Task GetAudioContentDoesLogActionAsync() + { + // Assert + var modelId = "whisper-1"; + var logger = new Mock>(); + logger.Setup(l => l.IsEnabled(It.IsAny())).Returns(true); + + this._mockLoggerFactory.Setup(x => x.CreateLogger(It.IsAny())).Returns(logger.Object); + + // Arrange + var sut = new OpenAITextToAudioService(modelId, "apiKey", httpClient: this._httpClient, loggerFactory: this._mockLoggerFactory.Object); + + // Act + await sut.GetAudioContentsAsync("description"); + + // Assert + logger.VerifyLog(LogLevel.Information, $"Action: {nameof(OpenAITextToAudioService.GetAudioContentsAsync)}. OpenAI Model ID: {modelId}.", Times.Once()); + } + public void Dispose() { this._httpClient.Dispose(); diff --git a/dotnet/src/Connectors/Connectors.OpenAIV2/Services/OpenAIAudioToTextService.cs b/dotnet/src/Connectors/Connectors.OpenAIV2/Services/OpenAIAudioToTextService.cs index 88c19c9f1c86..a226d6c59040 100644 --- a/dotnet/src/Connectors/Connectors.OpenAIV2/Services/OpenAIAudioToTextService.cs +++ b/dotnet/src/Connectors/Connectors.OpenAIV2/Services/OpenAIAudioToTextService.cs @@ -72,5 +72,8 @@ public Task> GetTextContentsAsync( PromptExecutionSettings? executionSettings = null, Kernel? kernel = null, CancellationToken cancellationToken = default) - => this._client.GetTextFromAudioContentsAsync(content, executionSettings, cancellationToken); + { + this._client.LogActionDetails(); + return this._client.GetTextFromAudioContentsAsync(content, executionSettings, cancellationToken); + } } diff --git a/dotnet/src/Connectors/Connectors.OpenAIV2/Services/OpenAITextEmbbedingGenerationService.cs b/dotnet/src/Connectors/Connectors.OpenAIV2/Services/OpenAITextEmbbedingGenerationService.cs index a4dd48ba75e3..ea607b2565b3 100644 --- a/dotnet/src/Connectors/Connectors.OpenAIV2/Services/OpenAITextEmbbedingGenerationService.cs +++ b/dotnet/src/Connectors/Connectors.OpenAIV2/Services/OpenAITextEmbbedingGenerationService.cs @@ -22,7 +22,7 @@ Adding the non-default endpoint parameter to the constructor. [Experimental("SKEXP0010")] public sealed class OpenAITextEmbeddingGenerationService : ITextEmbeddingGenerationService { - private readonly ClientCore _core; + private readonly ClientCore _client; private readonly int? _dimensions; /// @@ -44,7 +44,7 @@ public OpenAITextEmbeddingGenerationService( ILoggerFactory? loggerFactory = null, int? dimensions = null) { - this._core = new( + this._client = new( modelId: modelId, apiKey: apiKey, endpoint: endpoint, @@ -68,12 +68,12 @@ public OpenAITextEmbeddingGenerationService( ILoggerFactory? loggerFactory = null, int? dimensions = null) { - this._core = new(modelId, openAIClient, loggerFactory?.CreateLogger(typeof(OpenAITextEmbeddingGenerationService))); + this._client = new(modelId, openAIClient, loggerFactory?.CreateLogger(typeof(OpenAITextEmbeddingGenerationService))); this._dimensions = dimensions; } /// - public IReadOnlyDictionary Attributes => this._core.Attributes; + public IReadOnlyDictionary Attributes => this._client.Attributes; /// public Task>> GenerateEmbeddingsAsync( @@ -81,7 +81,7 @@ public Task>> GenerateEmbeddingsAsync( Kernel? kernel = null, CancellationToken cancellationToken = default) { - this._core.LogActionDetails(); - return this._core.GetEmbeddingsAsync(data, kernel, this._dimensions, cancellationToken); + this._client.LogActionDetails(); + return this._client.GetEmbeddingsAsync(data, kernel, this._dimensions, cancellationToken); } } diff --git a/dotnet/src/Connectors/Connectors.OpenAIV2/Services/OpenAITextToAudioService.cs b/dotnet/src/Connectors/Connectors.OpenAIV2/Services/OpenAITextToAudioService.cs index 3d37c6185a9c..87346eefb1b5 100644 --- a/dotnet/src/Connectors/Connectors.OpenAIV2/Services/OpenAITextToAudioService.cs +++ b/dotnet/src/Connectors/Connectors.OpenAIV2/Services/OpenAITextToAudioService.cs @@ -72,5 +72,8 @@ public Task> GetAudioContentsAsync( PromptExecutionSettings? executionSettings = null, Kernel? kernel = null, CancellationToken cancellationToken = default) - => this._client.GetAudioContentsAsync(text, executionSettings, cancellationToken); + { + this._client.LogActionDetails(); + return this._client.GetAudioContentsAsync(text, executionSettings, cancellationToken); + } } diff --git a/dotnet/src/Connectors/Connectors.OpenAIV2/Services/OpenAITextToImageService.cs b/dotnet/src/Connectors/Connectors.OpenAIV2/Services/OpenAITextToImageService.cs index 55eca0e112eb..1a6038aa3f43 100644 --- a/dotnet/src/Connectors/Connectors.OpenAIV2/Services/OpenAITextToImageService.cs +++ b/dotnet/src/Connectors/Connectors.OpenAIV2/Services/OpenAITextToImageService.cs @@ -28,10 +28,10 @@ namespace Microsoft.SemanticKernel.Connectors.OpenAI; [Experimental("SKEXP0010")] public class OpenAITextToImageService : ITextToImageService { - private readonly ClientCore _core; + private readonly ClientCore _client; /// - public IReadOnlyDictionary Attributes => this._core.Attributes; + public IReadOnlyDictionary Attributes => this._client.Attributes; /// /// Initializes a new instance of the class. @@ -50,7 +50,7 @@ public OpenAITextToImageService( HttpClient? httpClient = null, ILoggerFactory? loggerFactory = null) { - this._core = new(modelId, apiKey, organizationId, endpoint, httpClient, loggerFactory?.CreateLogger(this.GetType())); + this._client = new(modelId, apiKey, organizationId, endpoint, httpClient, loggerFactory?.CreateLogger(this.GetType())); } /// @@ -64,13 +64,13 @@ public OpenAITextToImageService( OpenAIClient openAIClient, ILoggerFactory? loggerFactory = null) { - this._core = new(modelId, openAIClient, loggerFactory?.CreateLogger(typeof(OpenAITextEmbeddingGenerationService))); + this._client = new(modelId, openAIClient, loggerFactory?.CreateLogger(typeof(OpenAITextEmbeddingGenerationService))); } /// public Task GenerateImageAsync(string description, int width, int height, Kernel? kernel = null, CancellationToken cancellationToken = default) { - this._core.LogActionDetails(); - return this._core.GenerateImageAsync(description, width, height, cancellationToken); + this._client.LogActionDetails(); + return this._client.GenerateImageAsync(description, width, height, cancellationToken); } } diff --git a/dotnet/src/Connectors/Connectors.OpenAIV2/OpenAIAudioToTextExecutionSettings.cs b/dotnet/src/Connectors/Connectors.OpenAIV2/Settings/OpenAIAudioToTextExecutionSettings.cs similarity index 100% rename from dotnet/src/Connectors/Connectors.OpenAIV2/OpenAIAudioToTextExecutionSettings.cs rename to dotnet/src/Connectors/Connectors.OpenAIV2/Settings/OpenAIAudioToTextExecutionSettings.cs diff --git a/dotnet/src/Connectors/Connectors.OpenAIV2/OpenAITextToAudioExecutionSettings.cs b/dotnet/src/Connectors/Connectors.OpenAIV2/Settings/OpenAITextToAudioExecutionSettings.cs similarity index 100% rename from dotnet/src/Connectors/Connectors.OpenAIV2/OpenAITextToAudioExecutionSettings.cs rename to dotnet/src/Connectors/Connectors.OpenAIV2/Settings/OpenAITextToAudioExecutionSettings.cs From dca02ad121d723cd6822f8139f237bc43df9e4a5 Mon Sep 17 00:00:00 2001 From: Roger Barreto <19890735+RogerBarreto@users.noreply.github.com> Date: Tue, 2 Jul 2024 11:05:45 +0100 Subject: [PATCH 14/17] Typo fix --- .../Services/OpenAITextToAudioServiceTests.cs | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/dotnet/src/Connectors/Connectors.OpenAIV2.UnitTests/Services/OpenAITextToAudioServiceTests.cs b/dotnet/src/Connectors/Connectors.OpenAIV2.UnitTests/Services/OpenAITextToAudioServiceTests.cs index 5799e9bdd289..e8fdb7b46b1e 100644 --- a/dotnet/src/Connectors/Connectors.OpenAIV2.UnitTests/Services/OpenAITextToAudioServiceTests.cs +++ b/dotnet/src/Connectors/Connectors.OpenAIV2.UnitTests/Services/OpenAITextToAudioServiceTests.cs @@ -112,10 +112,10 @@ public async Task GetAudioContentVoicesWorksCorrectlyAsync(string voice, string var result = await service.GetAudioContentsAsync("Some text", new OpenAITextToAudioExecutionSettings(voice) { ResponseFormat = format }); // Assert - var resquestBody = Encoding.UTF8.GetString(this._messageHandlerStub.RequestContent!); + var requestBody = Encoding.UTF8.GetString(this._messageHandlerStub.RequestContent!); var audioData = result[0].Data!.Value; - Assert.Contains($"\"voice\":\"{voice}\"", resquestBody); - Assert.Contains($"\"response_format\":\"{format}\"", resquestBody); + Assert.Contains($"\"voice\":\"{voice}\"", requestBody); + Assert.Contains($"\"response_format\":\"{format}\"", requestBody); Assert.False(audioData.IsEmpty); Assert.True(audioData.Span.SequenceEqual(expectedByteArray)); } From f73194122167cc9bb16608c868549877fe96097c Mon Sep 17 00:00:00 2001 From: Roger Barreto <19890735+RogerBarreto@users.noreply.github.com> Date: Tue, 2 Jul 2024 11:10:12 +0100 Subject: [PATCH 15/17] Fix warnings --- .../Services/OpenAIAudioToTextServiceTests.cs | 1 - .../Connectors.OpenAIV2/Core/ClientCore.AudioToText.cs | 3 +-- .../Settings/OpenAIAudioToTextExecutionSettings.cs | 1 - 3 files changed, 1 insertion(+), 4 deletions(-) diff --git a/dotnet/src/Connectors/Connectors.OpenAIV2.UnitTests/Services/OpenAIAudioToTextServiceTests.cs b/dotnet/src/Connectors/Connectors.OpenAIV2.UnitTests/Services/OpenAIAudioToTextServiceTests.cs index f6174744a63d..9648670d3de5 100644 --- a/dotnet/src/Connectors/Connectors.OpenAIV2.UnitTests/Services/OpenAIAudioToTextServiceTests.cs +++ b/dotnet/src/Connectors/Connectors.OpenAIV2.UnitTests/Services/OpenAIAudioToTextServiceTests.cs @@ -9,7 +9,6 @@ using Microsoft.SemanticKernel.Connectors.OpenAI; using Moq; using OpenAI; -using OpenAI.Audio; using Xunit; using static Microsoft.SemanticKernel.Connectors.OpenAI.OpenAIAudioToTextExecutionSettings; diff --git a/dotnet/src/Connectors/Connectors.OpenAIV2/Core/ClientCore.AudioToText.cs b/dotnet/src/Connectors/Connectors.OpenAIV2/Core/ClientCore.AudioToText.cs index ed5b53f8f1a0..77ec85fe9c10 100644 --- a/dotnet/src/Connectors/Connectors.OpenAIV2/Core/ClientCore.AudioToText.cs +++ b/dotnet/src/Connectors/Connectors.OpenAIV2/Core/ClientCore.AudioToText.cs @@ -3,7 +3,6 @@ using System; using System.Collections.Generic; using System.IO; -using System.Linq; using System.Threading; using System.Threading.Tasks; using OpenAI.Audio; @@ -32,7 +31,7 @@ internal async Task> GetTextFromAudioContentsAsync( throw new ArgumentException("The input audio content is not readable.", nameof(input)); } - OpenAIAudioToTextExecutionSettings audioExecutionSettings = OpenAIAudioToTextExecutionSettings.FromExecutionSettings(executionSettings); + OpenAIAudioToTextExecutionSettings audioExecutionSettings = OpenAIAudioToTextExecutionSettings.FromExecutionSettings(executionSettings)!; AudioTranscriptionOptions? audioOptions = AudioOptionsFromExecutionSettings(audioExecutionSettings); Verify.ValidFilename(audioExecutionSettings?.Filename); diff --git a/dotnet/src/Connectors/Connectors.OpenAIV2/Settings/OpenAIAudioToTextExecutionSettings.cs b/dotnet/src/Connectors/Connectors.OpenAIV2/Settings/OpenAIAudioToTextExecutionSettings.cs index b56ad62d553d..5d87768c5ddd 100644 --- a/dotnet/src/Connectors/Connectors.OpenAIV2/Settings/OpenAIAudioToTextExecutionSettings.cs +++ b/dotnet/src/Connectors/Connectors.OpenAIV2/Settings/OpenAIAudioToTextExecutionSettings.cs @@ -1,6 +1,5 @@ // Copyright (c) Microsoft. All rights reserved. -using System; using System.Collections.Generic; using System.Diagnostics.CodeAnalysis; using System.Text.Json; From 710255e554364a9bef9ae427f8c3ff51c1023a36 Mon Sep 17 00:00:00 2001 From: Roger Barreto <19890735+RogerBarreto@users.noreply.github.com> Date: Tue, 2 Jul 2024 11:12:47 +0100 Subject: [PATCH 16/17] Exclude utility from code coverage --- .../openai/Extensions/ClientResultExceptionExtensions.cs | 2 ++ 1 file changed, 2 insertions(+) diff --git a/dotnet/src/InternalUtilities/openai/Extensions/ClientResultExceptionExtensions.cs b/dotnet/src/InternalUtilities/openai/Extensions/ClientResultExceptionExtensions.cs index b2f3c6a6e8b1..75cc074b862d 100644 --- a/dotnet/src/InternalUtilities/openai/Extensions/ClientResultExceptionExtensions.cs +++ b/dotnet/src/InternalUtilities/openai/Extensions/ClientResultExceptionExtensions.cs @@ -7,12 +7,14 @@ Preserved the logic as is. */ using System.ClientModel; +using System.Diagnostics.CodeAnalysis; using System.Net; using Microsoft.SemanticKernel; /// /// Provides extension methods for the class. /// +[ExcludeFromCodeCoverage] internal static class ClientResultExceptionExtensions { /// From d39bda8a3051b0d883adaac13faafce0959aafb9 Mon Sep 17 00:00:00 2001 From: Roger Barreto <19890735+RogerBarreto@users.noreply.github.com> Date: Tue, 2 Jul 2024 11:27:30 +0100 Subject: [PATCH 17/17] Remove extra UT for shared from AzureOpenAI Connector --- .../ClientResultExceptionExtensionsTests.cs | 53 ------------------- 1 file changed, 53 deletions(-) delete mode 100644 dotnet/src/Connectors/Connectors.AzureOpenAI.UnitTests/Core/ClientResultExceptionExtensionsTests.cs diff --git a/dotnet/src/Connectors/Connectors.AzureOpenAI.UnitTests/Core/ClientResultExceptionExtensionsTests.cs b/dotnet/src/Connectors/Connectors.AzureOpenAI.UnitTests/Core/ClientResultExceptionExtensionsTests.cs deleted file mode 100644 index d810b2d2a470..000000000000 --- a/dotnet/src/Connectors/Connectors.AzureOpenAI.UnitTests/Core/ClientResultExceptionExtensionsTests.cs +++ /dev/null @@ -1,53 +0,0 @@ -// Copyright (c) Microsoft. All rights reserved. - -using System; -using System.ClientModel; -using System.ClientModel.Primitives; -using System.IO; -using System.Net; -using System.Threading; -using System.Threading.Tasks; -using Microsoft.SemanticKernel; -using Microsoft.SemanticKernel.Connectors.AzureOpenAI; - -namespace SemanticKernel.Connectors.AzureOpenAI.UnitTests.Core; - -/// -/// Unit tests for class. -/// -public sealed class ClientResultExceptionExtensionsTests -{ - [Fact] - public void ToHttpOperationExceptionWithContentReturnsValidException() - { - // Arrange - using var response = new FakeResponse("Response Content", 500); - var exception = new ClientResultException(response); - - // Act - var actualException = exception.ToHttpOperationException(); - - // Assert - Assert.IsType(actualException); - Assert.Equal(HttpStatusCode.InternalServerError, actualException.StatusCode); - Assert.Equal("Response Content", actualException.ResponseContent); - Assert.Same(exception, actualException.InnerException); - } - - #region private - - private sealed class FakeResponse(string responseContent, int status) : PipelineResponse - { - private readonly string _responseContent = responseContent; - public override BinaryData Content => BinaryData.FromString(this._responseContent); - public override int Status { get; } = status; - public override string ReasonPhrase => "Reason Phrase"; - public override Stream? ContentStream { get => null; set => throw new NotImplementedException(); } - protected override PipelineResponseHeaders HeadersCore => throw new NotImplementedException(); - public override BinaryData BufferContent(CancellationToken cancellationToken = default) => new(this._responseContent); - public override ValueTask BufferContentAsync(CancellationToken cancellationToken = default) => throw new NotImplementedException(); - public override void Dispose() { } - } - - #endregion -}