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;
using Microsoft.Extensions.DependencyInjection.Extensions; using Microsoft.Extensions.DependencyInjection.Extensions;
using Microsoft.SemanticKernel; using Microsoft.SemanticKernel;
using Microsoft.SemanticKernel.ChatCompletion;
using Volo.Abp.Modularity; using Volo.Abp.Modularity;
namespace Volo.Abp.AI; namespace Volo.Abp.AI;
@ -17,38 +16,43 @@ public class AbpAIModule : AbpModule
{ {
public const string DefaultWorkspaceName = "Default"; public const string DefaultWorkspaceName = "Default";
public override void PostConfigureServices(ServiceConfigurationContext context) public override void ConfigureServices(ServiceConfigurationContext context)
{ {
var options = context.Services.ExecutePreConfiguredActions<AbpAIOptions>(); var options = context.Services.ExecutePreConfiguredActions<AbpAIOptions>();
context.Services.Configure<AbpAIWorkspaceOptions>(workspaceOptions => 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) foreach (var workspaceConfig in options.Workspaces.Values)
{ {
if (workspaceConfig.ChatClient?.Builder is null) if (workspaceConfig.ChatClient.Builder is null)
{ {
continue; continue;
} }
foreach (var builderConfigurer in workspaceConfig.ChatClient.BuilderConfigurers) 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( context.Services.AddKeyedChatClient(
AbpAIOptions.GetChatClientServiceKeyName(workspaceConfig.Name), serviceName,
provider => workspaceConfig.ChatClient.Builder!.Build(provider), provider => workspaceConfig.ChatClient.Builder.Build(provider),
ServiceLifetime.Transient ServiceLifetime.Transient
); );
if (workspaceConfig.Name == DefaultWorkspaceName) if (workspaceConfig.Name == DefaultWorkspaceName)
{ {
context.Services.AddTransient<IChatClient>(sp => sp.GetRequiredKeyedService<IChatClient>( context.Services.AddTransient<IChatClient>(
AbpAIOptions.GetChatClientServiceKeyName(workspaceConfig.Name) sp => sp.GetRequiredKeyedService<IChatClient>(serviceName)
)
); );
} }
} }
@ -57,7 +61,7 @@ public class AbpAIModule : AbpModule
foreach (var workspaceConfig in options.Workspaces.Values) foreach (var workspaceConfig in options.Workspaces.Values)
{ {
if (workspaceConfig.Kernel?.Builder is null) if (workspaceConfig.Kernel.Builder is null)
{ {
continue; 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; namespace Volo.Abp.AI;
public class AbpAIOptions public class AbpAIOptions //TODO: Rename to AbpAIWorkspaceOptions
{ {
public const string ChatClientServiceKeyNamePrefix = "Abp.AI.ChatClient_"; public const string ChatClientServiceKeyNamePrefix = "Abp.AI.ChatClient_";
public const string KernelServiceKeyNamePrefix = "Abp.AI.Kernel_"; 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; namespace Volo.Abp.AI;
public class AbpAIWorkspaceOptions public class AbpAIWorkspaceOptions //TODO: Rename to AbpAIOptions
{ {
public HashSet<string> ConfiguredWorkspaceNames { get; } = new(); 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(); 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) public void ConfigureBuilder(Action<ChatClientBuilder> configureAction)
{ {
BuilderConfigurers.Add(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; namespace Volo.Abp.AI;
public class TypedKernelAccessor<TWorkSpace> : IKernelAccessor<TWorkSpace> public class KernelAccessor<TWorkSpace> : IKernelAccessor<TWorkSpace>
where TWorkSpace : class where TWorkSpace : class
{ {
public Kernel? Kernel { get; } public Kernel? Kernel { get; }
public TypedKernelAccessor(IServiceProvider serviceProvider) public KernelAccessor(IServiceProvider serviceProvider)
{ {
Kernel = serviceProvider.GetKeyedService<Kernel>( Kernel = serviceProvider.GetKeyedService<Kernel>(
AbpAIOptions.GetKernelServiceKeyName( AbpAIOptions.GetKernelServiceKeyName(
Loading…
Cancel
Save