diff --git a/framework/src/Volo.Abp.AI/Volo/Abp/AI/AbpAIModule.cs b/framework/src/Volo.Abp.AI/Volo/Abp/AI/AbpAIModule.cs index 831b29658a..74c9ec0822 100644 --- a/framework/src/Volo.Abp.AI/Volo/Abp/AI/AbpAIModule.cs +++ b/framework/src/Volo.Abp.AI/Volo/Abp/AI/AbpAIModule.cs @@ -9,13 +9,18 @@ public class AbpAIModule : AbpModule { var options = context.Services.ExecutePreConfiguredActions(); - foreach (var chatClientConfig in options.ChatClients.GetAll()) + foreach (var chatClientConfig in options.ChatClients.Values) { if (chatClientConfig.Builder == null) { throw new AbpException("ChatClientBuilder is not properly configured. Set the Builder."); } + foreach (var builderConfigurer in chatClientConfig.BuilderConfigurers) + { + builderConfigurer.Action(chatClientConfig.Builder); + } + context.Services.AddKeyedChatClient(chatClientConfig.Name, provider => chatClientConfig.Builder.Build(provider)); } } diff --git a/framework/src/Volo.Abp.AI/Volo/Abp/AI/AbpAIOptions.cs b/framework/src/Volo.Abp.AI/Volo/Abp/AI/AbpAIOptions.cs index 8354b995db..36a4dd8a81 100644 --- a/framework/src/Volo.Abp.AI/Volo/Abp/AI/AbpAIOptions.cs +++ b/framework/src/Volo.Abp.AI/Volo/Abp/AI/AbpAIOptions.cs @@ -2,5 +2,5 @@ namespace Volo.Abp.AI; public class AbpAIOptions { - public ChatClientConfigurationCollection ChatClients { get; } = new(); + public ChatClientConfigurationDictionary ChatClients { get; } = new(); } \ No newline at end of file diff --git a/framework/src/Volo.Abp.AI/Volo/Abp/AI/BuilderConfigurerList.cs b/framework/src/Volo.Abp.AI/Volo/Abp/AI/BuilderConfigurerList.cs new file mode 100644 index 0000000000..c5a279e658 --- /dev/null +++ b/framework/src/Volo.Abp.AI/Volo/Abp/AI/BuilderConfigurerList.cs @@ -0,0 +1,8 @@ +using Microsoft.Extensions.AI; + +namespace Volo.Abp.AI; + +public class BuilderConfigurerList : NamedObjectList> +{ + +} \ No newline at end of file diff --git a/framework/src/Volo.Abp.AI/Volo/Abp/AI/ChatClientConfiguration.cs b/framework/src/Volo.Abp.AI/Volo/Abp/AI/ChatClientConfiguration.cs index df8be6e04e..9b7ec59462 100644 --- a/framework/src/Volo.Abp.AI/Volo/Abp/AI/ChatClientConfiguration.cs +++ b/framework/src/Volo.Abp.AI/Volo/Abp/AI/ChatClientConfiguration.cs @@ -5,7 +5,10 @@ namespace Volo.Abp.AI; public class ChatClientConfiguration { public string Name { get; } + public ChatClientBuilder? Builder { get; set; } + + public BuilderConfigurerList BuilderConfigurers { get; } = new(); public ChatClientConfiguration(string name) { diff --git a/framework/src/Volo.Abp.AI/Volo/Abp/AI/ChatClientConfigurationCollection.cs b/framework/src/Volo.Abp.AI/Volo/Abp/AI/ChatClientConfigurationCollection.cs index cf7e42f50f..8c782f7d3f 100644 --- a/framework/src/Volo.Abp.AI/Volo/Abp/AI/ChatClientConfigurationCollection.cs +++ b/framework/src/Volo.Abp.AI/Volo/Abp/AI/ChatClientConfigurationCollection.cs @@ -1,26 +1,18 @@ using System; -using System.Collections.Concurrent; using System.Collections.Generic; namespace Volo.Abp.AI; -public class ChatClientConfigurationCollection +public class ChatClientConfigurationDictionary : Dictionary { - private readonly ConcurrentDictionary _chatClients = new(); - public void Configure(string name, Action configureAction) { - if (!_chatClients.TryGetValue(name, out var configuration)) + if (!this.TryGetValue(name, out var configuration)) { configuration = new ChatClientConfiguration(name); - _chatClients[name] = configuration; + this[name] = configuration; } configureAction(configuration); } - - internal IEnumerable GetAll() - { - return _chatClients.Values; - } -} \ No newline at end of file +} diff --git a/framework/src/Volo.Abp.AI/Volo/Abp/AI/NamedAction.cs b/framework/src/Volo.Abp.AI/Volo/Abp/AI/NamedAction.cs new file mode 100644 index 0000000000..883766e14e --- /dev/null +++ b/framework/src/Volo.Abp.AI/Volo/Abp/AI/NamedAction.cs @@ -0,0 +1,14 @@ +using System; + +namespace Volo.Abp.AI; + +public class NamedAction : NamedObject //TODO: Move to Core package? +{ + public Action Action { get; set; } + + public NamedAction(string name, Action action) + : base(name) + { + Action = Check.NotNull(action, nameof(action)); + } +} \ No newline at end of file diff --git a/framework/src/Volo.Abp.AI/Volo/Abp/AI/NamedObject.cs b/framework/src/Volo.Abp.AI/Volo/Abp/AI/NamedObject.cs new file mode 100644 index 0000000000..1d16e11f11 --- /dev/null +++ b/framework/src/Volo.Abp.AI/Volo/Abp/AI/NamedObject.cs @@ -0,0 +1,11 @@ +namespace Volo.Abp.AI; + +public class NamedObject //TODO: Move to Core package? +{ + public string Name { get; } + + public NamedObject(string name) + { + Name = Check.NotNullOrWhiteSpace(name, nameof(name)); + } +} \ No newline at end of file diff --git a/framework/src/Volo.Abp.AI/Volo/Abp/AI/NamedObjectList.cs b/framework/src/Volo.Abp.AI/Volo/Abp/AI/NamedObjectList.cs new file mode 100644 index 0000000000..48ea7e8db6 --- /dev/null +++ b/framework/src/Volo.Abp.AI/Volo/Abp/AI/NamedObjectList.cs @@ -0,0 +1,12 @@ +using System.Collections.Generic; + +namespace Volo.Abp.AI; + +public class NamedObjectList : List + where T : NamedObject +{ + public NamedObjectList() + { + + } +} \ No newline at end of file