Browse Source

Refactored AI package

pull/23782/head
Halil İbrahim Kalkan 1 year ago
parent
commit
ddaffcffb5
  1. 28
      framework/src/Volo.Abp.AI/Volo/Abp/AI/AbpAIModule.cs
  2. 2
      framework/src/Volo.Abp.AI/Volo/Abp/AI/AbpAIOptions.cs
  3. 2
      framework/src/Volo.Abp.AI/Volo/Abp/AI/AbpAIWorkspaceOptions.cs
  4. 2
      framework/src/Volo.Abp.AI/Volo/Abp/AI/ChatClientConfiguration.cs
  5. 4
      framework/src/Volo.Abp.AI/Volo/Abp/AI/KernelAccessor.cs

28
framework/src/Volo.Abp.AI/Volo/Abp/AI/AbpAIModule.cs

@ -5,7 +5,6 @@ using Microsoft.Extensions.AI;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.DependencyInjection.Extensions;
using Microsoft.SemanticKernel;
using Microsoft.SemanticKernel.ChatCompletion;
using Volo.Abp.Modularity;
namespace Volo.Abp.AI;
@ -17,38 +16,43 @@ public class AbpAIModule : AbpModule
{
public const string DefaultWorkspaceName = "Default";
public override void PostConfigureServices(ServiceConfigurationContext context)
public override void ConfigureServices(ServiceConfigurationContext context)
{
var options = context.Services.ExecutePreConfiguredActions<AbpAIOptions>();
context.Services.Configure<AbpAIWorkspaceOptions>(workspaceOptions =>
{
workspaceOptions.ConfiguredWorkspaceNames.UnionWith(options.Workspaces.Select(x => x.Key).ToArray());
workspaceOptions.ConfiguredWorkspaceNames.AddIfNotContains(
options.Workspaces.Select(x => x.Key)
);
});
//TODO: Refactor & merge foreach loops
foreach (var workspaceConfig in options.Workspaces.Values)
{
if (workspaceConfig.ChatClient?.Builder is null)
if (workspaceConfig.ChatClient.Builder is null)
{
continue;
}
foreach (var builderConfigurer in workspaceConfig.ChatClient.BuilderConfigurers)
{
builderConfigurer.Action(workspaceConfig.ChatClient.Builder!);
builderConfigurer.Action(workspaceConfig.ChatClient.Builder);
}
var serviceName = AbpAIOptions.GetChatClientServiceKeyName(workspaceConfig.Name);
context.Services.AddKeyedChatClient(
AbpAIOptions.GetChatClientServiceKeyName(workspaceConfig.Name),
provider => workspaceConfig.ChatClient.Builder!.Build(provider),
serviceName,
provider => workspaceConfig.ChatClient.Builder.Build(provider),
ServiceLifetime.Transient
);
if (workspaceConfig.Name == DefaultWorkspaceName)
{
context.Services.AddTransient<IChatClient>(sp => sp.GetRequiredKeyedService<IChatClient>(
AbpAIOptions.GetChatClientServiceKeyName(workspaceConfig.Name)
)
context.Services.AddTransient<IChatClient>(
sp => sp.GetRequiredKeyedService<IChatClient>(serviceName)
);
}
}
@ -57,7 +61,7 @@ public class AbpAIModule : AbpModule
foreach (var workspaceConfig in options.Workspaces.Values)
{
if (workspaceConfig.Kernel?.Builder is null)
if (workspaceConfig.Kernel.Builder is null)
{
continue;
}
@ -91,6 +95,6 @@ public class AbpAIModule : AbpModule
}
}
context.Services.TryAddTransient(typeof(IKernelAccessor<>), typeof(TypedKernelAccessor<>));
context.Services.TryAddTransient(typeof(IKernelAccessor<>), typeof(KernelAccessor<>));
}
}

2
framework/src/Volo.Abp.AI/Volo/Abp/AI/AbpAIOptions.cs

@ -1,6 +1,6 @@
namespace Volo.Abp.AI;
public class AbpAIOptions
public class AbpAIOptions //TODO: Rename to AbpAIWorkspaceOptions
{
public const string ChatClientServiceKeyNamePrefix = "Abp.AI.ChatClient_";
public const string KernelServiceKeyNamePrefix = "Abp.AI.Kernel_";

2
framework/src/Volo.Abp.AI/Volo/Abp/AI/AbpAIWorkspaceOptions.cs

@ -2,7 +2,7 @@ using System.Collections.Generic;
namespace Volo.Abp.AI;
public class AbpAIWorkspaceOptions
public class AbpAIWorkspaceOptions //TODO: Rename to AbpAIOptions
{
public HashSet<string> ConfiguredWorkspaceNames { get; } = new();
}

2
framework/src/Volo.Abp.AI/Volo/Abp/AI/ChatClientConfiguration.cs

@ -9,8 +9,6 @@ public class ChatClientConfiguration
public BuilderConfigurerList BuilderConfigurers { get; } = new();
// TODO: Base chat client (for inheriting a chat client configuration from some other one)
public void ConfigureBuilder(Action<ChatClientBuilder> configureAction)
{
BuilderConfigurers.Add(configureAction);

4
framework/src/Volo.Abp.AI/Volo/Abp/AI/TypedKernelAccessor.cs → framework/src/Volo.Abp.AI/Volo/Abp/AI/KernelAccessor.cs

@ -4,12 +4,12 @@ using Microsoft.SemanticKernel;
namespace Volo.Abp.AI;
public class TypedKernelAccessor<TWorkSpace> : IKernelAccessor<TWorkSpace>
public class KernelAccessor<TWorkSpace> : IKernelAccessor<TWorkSpace>
where TWorkSpace : class
{
public Kernel? Kernel { get; }
public TypedKernelAccessor(IServiceProvider serviceProvider)
public KernelAccessor(IServiceProvider serviceProvider)
{
Kernel = serviceProvider.GetKeyedService<Kernel>(
AbpAIOptions.GetKernelServiceKeyName(
Loading…
Cancel
Save