diff --git a/Admin.NET/Admin.NET.Core/Ai/Interface/ISseChannelManager.cs b/Admin.NET/Admin.NET.Core/Ai/Interface/ISseChannelManager.cs new file mode 100644 index 00000000..c89d4e6e --- /dev/null +++ b/Admin.NET/Admin.NET.Core/Ai/Interface/ISseChannelManager.cs @@ -0,0 +1,26 @@ +// 1. 定义接口 +using System.Threading.Channels; +namespace Admin.NET.Core.Ai.Interface; + +/// +/// SSE通道管理接口 +/// +public interface ISseChannelManager +{ + /// + /// 注册 + /// + ChannelReader Register(long userId); + /// + /// 注销 + /// + /// + void Unregister(long userId); + /// + /// 发送消息 + /// + /// + /// + /// + Task SendMessageAsync(long userId, string message, CancellationToken cancellationToken = default); +} \ No newline at end of file diff --git a/Admin.NET/Admin.NET.Core/Ai/Services/SSE/BaseSseChannelManager.cs b/Admin.NET/Admin.NET.Core/Ai/Services/SSE/BaseSseChannelManager.cs new file mode 100644 index 00000000..5f8a8cfb --- /dev/null +++ b/Admin.NET/Admin.NET.Core/Ai/Services/SSE/BaseSseChannelManager.cs @@ -0,0 +1,52 @@ +using System.Threading.Channels; + +namespace Admin.NET.Core.Ai.Services.SSE; + +/// +/// SSE通道管理 +/// +public class BaseSseChannelManager : ISseChannelManager +{ + private readonly ConcurrentDictionary> _userChannels = new(); + + /// + /// 注册 + /// + /// + /// + public ChannelReader Register(long userId) + { + var channel = Channel.CreateBounded(new BoundedChannelOptions(100) + { + FullMode = BoundedChannelFullMode.Wait + }); + _userChannels[userId] = channel; + return channel.Reader; + } + + /// + /// 注销 + /// + /// + public void Unregister(long userId) + { + if (_userChannels.TryRemove(userId, out var channel)) + { + channel.Writer.TryComplete(); // 结束读端 + } + } + + /// + /// 发送消息 + /// + /// + /// + /// + public async Task SendMessageAsync(long userId, string message, CancellationToken cancellationToken = default) + { + if (_userChannels.TryGetValue(userId, out var channel)) + { + await channel.Writer.WriteAsync(message, cancellationToken); + } + } +} diff --git a/Admin.NET/Admin.NET.Core/Ai/Services/SSE/SseChannelManager.cs b/Admin.NET/Admin.NET.Core/Ai/Services/SSE/SseChannelManager.cs index 60293d53..9d64a68c 100644 --- a/Admin.NET/Admin.NET.Core/Ai/Services/SSE/SseChannelManager.cs +++ b/Admin.NET/Admin.NET.Core/Ai/Services/SSE/SseChannelManager.cs @@ -3,49 +3,8 @@ using System.Threading.Channels; namespace Admin.NET.Core.Ai.Services.SSE; /// -/// SSE通道管理 +/// 聊天通道管理 /// -public class SseChannelManager: ISingleton +public class SseChannelManager: BaseSseChannelManager,ISingleton { - private readonly ConcurrentDictionary> _userChannels = new(); - - /// - /// 注册 - /// - /// - /// - public ChannelReader Register(long userId) - { - var channel = Channel.CreateBounded(new BoundedChannelOptions(100){ - FullMode = BoundedChannelFullMode.Wait - }); - _userChannels[userId] = channel; - return channel.Reader; - } - - /// - /// 注销 - /// - /// - public void Unregister(long userId) - { - if (_userChannels.TryRemove(userId, out var channel)) - { - channel.Writer.TryComplete(); // 结束读端 - } - } - - /// - /// 发送消息 - /// - /// - /// - /// - public async Task SendMessageAsync(long userId, string message, CancellationToken cancellationToken = default) - { - if (_userChannels.TryGetValue(userId, out var channel)) - { - await channel.Writer.WriteAsync(message,cancellationToken); - } - } } diff --git a/Admin.NET/Admin.NET.Core/Ai/Services/SSE/SseDeepThinkingChannelManager.cs b/Admin.NET/Admin.NET.Core/Ai/Services/SSE/SseDeepThinkingChannelManager.cs index e4f71686..a12fef36 100644 --- a/Admin.NET/Admin.NET.Core/Ai/Services/SSE/SseDeepThinkingChannelManager.cs +++ b/Admin.NET/Admin.NET.Core/Ai/Services/SSE/SseDeepThinkingChannelManager.cs @@ -3,49 +3,8 @@ using System.Threading.Channels; namespace Admin.NET.Core.Ai.Services.SSE; /// -/// SSE通道管理 +/// 深度思考通道管理 /// -public class SseDeepThinkingChannelManager: ISingleton +public class SseDeepThinkingChannelManager: BaseSseChannelManager,ISingleton { - private readonly ConcurrentDictionary> _userChannels = new(); - - /// - /// 注册 - /// - /// - /// - public ChannelReader Register(long userId) - { - var channel = Channel.CreateBounded(new BoundedChannelOptions(100){ - FullMode = BoundedChannelFullMode.Wait - }); - _userChannels[userId] = channel; - return channel.Reader; - } - - /// - /// 注销 - /// - /// - public void Unregister(long userId) - { - if (_userChannels.TryRemove(userId, out var channel)) - { - channel.Writer.TryComplete(); // 结束读端 - } - } - - /// - /// 发送消息 - /// - /// - /// - /// - public async Task SendMessageAsync(long userId, string message, CancellationToken cancellationToken = default) - { - if (_userChannels.TryGetValue(userId, out var channel)) - { - await channel.Writer.WriteAsync(message,cancellationToken); - } - } }