Skip to content

Commit

Permalink
Refactor
Browse files Browse the repository at this point in the history
  • Loading branch information
durmisi committed Mar 18, 2024
1 parent fb28bde commit 51e7624
Show file tree
Hide file tree
Showing 6 changed files with 64 additions and 168 deletions.
1 change: 0 additions & 1 deletion Core/ServiceCollectionExtensions.cs
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,6 @@ public static void AddOpenAI(this IServiceCollection services)

services.AddScoped<IAISqlGenerator, AISqlGenerator>();
services.AddScoped<IAIAudioService, IAIAudioService>();
services.AddScoped<IAIEmbeddingsGenerator, AIEmbeddingsGenerator>();
}
}
}
76 changes: 0 additions & 76 deletions Core/Services/AIEmbeddingsGenerator.cs

This file was deleted.

111 changes: 59 additions & 52 deletions Core/Services/AITranslationService.cs
Original file line number Diff line number Diff line change
@@ -1,83 +1,90 @@
using Azure.AI.OpenAI;
using Microsoft.Extensions.Logging;
using Microsoft.Extensions.Logging;
using Microsoft.SemanticKernel;
using Microsoft.SemanticKernel.ChatCompletion;
using Microsoft.SemanticKernel.Connectors.OpenAI;
using System.Text.Json;
using System.Text.Json.Serialization;

namespace OpenAIExtensions.Services
{
public interface ITranslationService
{
Task<string?> TranslateAsync(string text, string fromLanguage, string toLanguage = "English");
Task<string?> TranslateAsync(string text, string fromLanguage, string toLanguage = "English", CancellationToken ct = default);

Task<Dictionary<string, string>?> TranslateToManyAsync(string text, string fromLanguage, string[]? toLanguages = null);
Task<Dictionary<string, string>?> TranslateToManyAsync(string text, string fromLanguage, string[]? toLanguages = null, CancellationToken ct = default);
}

public class AITranslationService : ITranslationService
{
private readonly OpenAIClient _client;

private readonly Kernel _kernel;
private readonly ILogger<AITranslationService> _logger;

private readonly string _deploymentName = "gpt-35-turbo-0613";

public AITranslationService(
IAIBroker aIBroker,
ILogger<AITranslationService> logger, string? deploymentName = null)
Kernel kernel,
ILogger<AITranslationService> logger)
{
_kernel = kernel;
_logger = logger;
_client = aIBroker.GetClient();

if (!string.IsNullOrEmpty(deploymentName))
{
_deploymentName = deploymentName;
}
}

private ChatCompletionsOptions GetCompletionsOptions()
{
var completionOptions = new ChatCompletionsOptions
{
DeploymentName = _deploymentName,
MaxTokens = 60,
Temperature = 0f,
FrequencyPenalty = 0.0f,
PresencePenalty = 0.0f,
NucleusSamplingFactor = 1 // Top P
};

return completionOptions;
}

public async Task<string?> TranslateAsync(string text, string fromLanguage, string toLanguage = "English")
public async Task<string?> TranslateAsync(string text,
string fromLanguage,
string toLanguage = "English",
CancellationToken ct = default)
{
var systemPrompt = $"You are a virtual agent that helps users translate passages from {fromLanguage} to {toLanguage}.";

var userPrompt = $@"Translate this into 1. {toLanguage}.
{text}";

var completionOptions = GetCompletionsOptions();
var chatHistory = new ChatHistory();

completionOptions.Messages.Add(new ChatRequestSystemMessage(systemPrompt));
completionOptions.Messages.Add(new ChatRequestUserMessage(userPrompt));
chatHistory.AddSystemMessage(systemPrompt);
chatHistory.AddUserMessage(userPrompt);

ChatCompletions response = await _client.GetChatCompletionsAsync(completionOptions);
var response = await GetResponse(chatHistory, ct);

var choice = response.Choices.FirstOrDefault();
string responseMessage = response.Content ?? "";

if (choice != null)
if (!string.IsNullOrEmpty(responseMessage))
{
return choice?.Message?.Content;
return responseMessage;
}

return null;
}

public async Task<Dictionary<string, string>?> TranslateToManyAsync(string text, string fromLanguage, string[]? toLanguages = null)
private async Task<ChatMessageContent> GetResponse(ChatHistory chatHistory,
CancellationToken ct)
{
if (toLanguages == null)
{
toLanguages = ["English"];
}
var openAIPromptExecutionSettings = GetExecutionSettings();

var chatCompletionService = _kernel.GetRequiredService<IChatCompletionService>();

var response = await chatCompletionService
.GetChatMessageContentAsync(chatHistory: chatHistory,
executionSettings: openAIPromptExecutionSettings,
kernel: _kernel,
cancellationToken: ct);

return response;
}

private static PromptExecutionSettings GetExecutionSettings() => new OpenAIPromptExecutionSettings()
{
MaxTokens = 60,
Temperature = 0f,
FrequencyPenalty = 0.0f,
PresencePenalty = 0.0f,
TopP = 1 // Top P
};

public async Task<Dictionary<string, string>?> TranslateToManyAsync(string text,
string fromLanguage,
string[]? toLanguages = null,
CancellationToken ct = default)
{
toLanguages ??= ["English"];

var toLanguagesString = "";

Expand All @@ -91,24 +98,24 @@ private ChatCompletionsOptions GetCompletionsOptions()

var userPrompt = $@"Translate this into {toLanguagesString} {text} and return the result as json dictionary of language/translation but exclude the original language.";

var completionOptions = GetCompletionsOptions();
var chatHistory = new ChatHistory();

completionOptions.Messages.Add(new ChatRequestSystemMessage(systemPrompt));
completionOptions.Messages.Add(new ChatRequestUserMessage(userPrompt));
chatHistory.AddSystemMessage(systemPrompt);
chatHistory.AddUserMessage(userPrompt);

ChatCompletions response = await _client.GetChatCompletionsAsync(completionOptions);
var response = await GetResponse(chatHistory, ct);

var choice = response.Choices.FirstOrDefault();
string responseMessage = response.Content ?? "";

if (choice != null)
if (!string.IsNullOrEmpty(responseMessage))
{
var serializedOptions = new JsonSerializerOptions
JsonSerializerOptions serializedOptions = new()
{
PropertyNameCaseInsensitive = true,
NumberHandling = JsonNumberHandling.WriteAsString,
};

using var stream = new MemoryStream(System.Text.Encoding.UTF8.GetBytes(choice.Message.Content));
using var stream = new MemoryStream(System.Text.Encoding.UTF8.GetBytes(responseMessage));
var result = JsonSerializer.Deserialize<Dictionary<string, string>?>(stream, serializedOptions);

return result;
Expand Down
2 changes: 0 additions & 2 deletions OpenAIExtensions.Plugins/WebSearch/WikipediaPlugin.cs
Original file line number Diff line number Diff line change
Expand Up @@ -7,10 +7,8 @@ namespace OpenAIExtensions.Plugins.WebSearch
{
public class WikipediaPlugin : WebSearchPlugin
{

private readonly int ContentLenght = 300;


[KernelFunction, Description("Search wikipedia, wiki search")]
public async Task<string> Search(
Kernel kernel,
Expand Down
36 changes: 0 additions & 36 deletions OpenAIExtensions.Tests/AIEmbeddingsGeneratorTests.cs

This file was deleted.

6 changes: 5 additions & 1 deletion OpenAIExtensions.Tests/AITranslationServiceTests.cs
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,11 @@ public AITranslationServiceTests(ITestOutputHelper outputHelper)
var endpoint = Configuration.GetValue<string>("OpenAI:TranslationService:Endpoint")!;
var key = Configuration.GetValue<string>("OpenAI:TranslationService:Key")!;

_translationService = new AITranslationService(new AIBroker(endpoint, key), logger);
var kernel = SematicKernelBuilder.Create()
.AddAIChatCompletion(endpoint: endpoint, apiKey: key)
.Build();

_translationService = new AITranslationService(kernel, logger);
_outputHelper = outputHelper;
}

Expand Down

0 comments on commit 51e7624

Please sign in to comment.