Browse Source

Introduce typed chat client services

pull/23533/head
Halil İbrahim Kalkan 1 year ago
parent
commit
83ca085c3c
  1. 7
      framework/src/Volo.Abp.AI/Volo/Abp/AI/AbpAIChatClientOptions.cs
  2. 10
      framework/src/Volo.Abp.AI/Volo/Abp/AI/AbpAIModule.cs
  3. 17
      framework/src/Volo.Abp.AI/Volo/Abp/AI/ChatClientConfigurationCollection.cs
  4. 37
      framework/src/Volo.Abp.AI/Volo/Abp/AI/ChatClientNameAttribute.cs
  5. 9
      framework/src/Volo.Abp.AI/Volo/Abp/AI/IChatClient.cs
  6. 18
      framework/src/Volo.Abp.AI/Volo/Abp/AI/TypedChatClient.cs

7
framework/src/Volo.Abp.AI/Volo/Abp/AI/AbpAIChatClientOptions.cs

@ -2,5 +2,12 @@ namespace Volo.Abp.AI;
public class AbpAIChatClientOptions
{
public const string ChatClientServiceKeyNamePrefix = "Abp.AI.ChatClient_";
public ChatClientConfigurationDictionary ChatClients { get; } = new();
public static string GetChatClientServiceKeyName(string name)
{
return $"{ChatClientServiceKeyNamePrefix}{name}";
}
}

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

@ -1,4 +1,5 @@
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.DependencyInjection.Extensions;
using Volo.Abp.Modularity;
namespace Volo.Abp.AI;
@ -28,8 +29,13 @@ public class AbpAIModule : AbpModule
{
builderConfigurer.Action(chatClientConfig.Builder);
}
context.Services.AddKeyedChatClient(chatClientConfig.Name, provider => chatClientConfig.Builder.Build(provider));
context.Services.AddKeyedChatClient(
AbpAIChatClientOptions.GetChatClientServiceKeyName(chatClientConfig.Name),
provider => chatClientConfig.Builder.Build(provider)
);
}
context.Services.TryAddTransient(typeof(IChatClient<>), typeof(TypedChatClient<>));
}
}

17
framework/src/Volo.Abp.AI/Volo/Abp/AI/ChatClientConfigurationCollection.cs

@ -5,9 +5,24 @@ namespace Volo.Abp.AI;
public class ChatClientConfigurationDictionary : Dictionary<string, ChatClientConfiguration>
{
public static string DefaultName => "Default";
public void ConfigureDefault(Action<ChatClientConfiguration> configureAction) =>
Configure("Default", configureAction);
Configure(DefaultName, configureAction);
public void Configure<T>(Action<ChatClientConfiguration> configureAction)
{
Configure(typeof(T), configureAction);
}
public void Configure(Type chatClientType, Action<ChatClientConfiguration> configureAction)
{
Configure(
ChatClientNameAttribute.GetChatClientName(chatClientType),
configureAction
);
}
public void Configure(string name, Action<ChatClientConfiguration> configureAction)
{
if (!this.TryGetValue(name, out var configuration))

37
framework/src/Volo.Abp.AI/Volo/Abp/AI/ChatClientNameAttribute.cs

@ -0,0 +1,37 @@
using System;
using System.Linq;
namespace Volo.Abp.AI;
[AttributeUsage(AttributeTargets.Class | AttributeTargets.Interface | AttributeTargets.Struct)]
public class ChatClientNameAttribute : Attribute
{
public string Name { get; }
public ChatClientNameAttribute(string name)
{
Check.NotNull(name, nameof(name));
Name = name;
}
public static string GetChatClientName<TChatClient>()
{
return GetChatClientName(typeof(TChatClient));
}
public static string GetChatClientName(Type chatClientType)
{
var chatClientNameAttribute = chatClientType
.GetCustomAttributes(true)
.OfType<ChatClientNameAttribute>()
.FirstOrDefault();
if (chatClientNameAttribute != null)
{
return chatClientNameAttribute.Name;
}
return chatClientType.FullName!;
}
}

9
framework/src/Volo.Abp.AI/Volo/Abp/AI/IChatClient.cs

@ -0,0 +1,9 @@
using Microsoft.Extensions.AI;
namespace Volo.Abp.AI;
public interface IChatClient<T> : IChatClient
where T: class
{
}

18
framework/src/Volo.Abp.AI/Volo/Abp/AI/TypedChatClient.cs

@ -0,0 +1,18 @@
using System;
using Microsoft.Extensions.AI;
using Microsoft.Extensions.DependencyInjection;
namespace Volo.Abp.AI;
public class TypedChatClient<T> : DelegatingChatClient, IChatClient<T>
where T : class
{
public TypedChatClient(IServiceProvider serviceProvider)
: base(
serviceProvider.GetRequiredKeyedService<IChatClient>(
AbpAIChatClientOptions.GetChatClientServiceKeyName(
ChatClientNameAttribute.GetChatClientName<T>()))
)
{
}
}
Loading…
Cancel
Save