Browse Source

feat: Reconstruct the general user message

pull/1421/head
colin 3 weeks ago
parent
commit
389ad566fb
  1. 5
      aspnet-core/modules/ai/LINGYUN.Abp.AI.Agent/LINGYUN/Abp/AI/Agent/AgentService.cs
  2. 6
      aspnet-core/modules/ai/LINGYUN.Abp.AI.Core/LINGYUN/Abp/AI/AbpAICoreModule.cs
  3. 2
      aspnet-core/modules/ai/LINGYUN.Abp.AI.Core/LINGYUN/Abp/AI/Internal/ChatClientFactory.cs
  4. 2
      aspnet-core/modules/ai/LINGYUN.Abp.AI.Core/LINGYUN/Abp/AI/Internal/ChatClientProviderManager.cs
  5. 15
      aspnet-core/modules/ai/LINGYUN.Abp.AI.Core/LINGYUN/Abp/AI/Internal/DeepSeekChatClientProvider.cs
  6. 13
      aspnet-core/modules/ai/LINGYUN.Abp.AI.Core/LINGYUN/Abp/AI/Internal/DeepSeekKernelProvider.cs
  7. 2
      aspnet-core/modules/ai/LINGYUN.Abp.AI.Core/LINGYUN/Abp/AI/Internal/KernelFactory.cs
  8. 2
      aspnet-core/modules/ai/LINGYUN.Abp.AI.Core/LINGYUN/Abp/AI/Internal/KernelProviderManager.cs
  9. 6
      aspnet-core/modules/ai/LINGYUN.Abp.AI.Core/LINGYUN/Abp/AI/Internal/OpenAIChatClientProvider.cs
  10. 4
      aspnet-core/modules/ai/LINGYUN.Abp.AI.Core/LINGYUN/Abp/AI/Internal/OpenAIKernelProvider.cs
  11. 5
      aspnet-core/modules/ai/LINGYUN.Abp.AI.Core/LINGYUN/Abp/AI/Models/TokenUsageInfo.cs
  12. 37
      aspnet-core/modules/ai/LINGYUN.Abp.AI.Core/LINGYUN/Abp/AI/Models/UserMessage.cs
  13. 20
      aspnet-core/modules/ai/LINGYUN.Abp.AI.Core/LINGYUN/Abp/AI/Models/UserTextMessage.cs
  14. 9
      aspnet-core/modules/ai/LINGYUN.Abp.AI.Core/LINGYUN/Abp/AI/Tokens/InMemoryTokenUsageStore.cs

5
aspnet-core/modules/ai/LINGYUN.Abp.AI.Agent/LINGYUN/Abp/AI/Agent/AgentService.cs

@ -56,11 +56,11 @@ public class AgentService : IAgentService, IScopedDependency
foreach (var chatMessage in historyMessages)
{
messages.Add(new ChatMessage(ChatRole.System, chatMessage.Content));
messages.Add(new ChatMessage(ChatRole.System, chatMessage.GetMessagePrompt()));
}
}
messages.Add(new ChatMessage(ChatRole.User, message.Content));
messages.Add(new ChatMessage(ChatRole.User, message.GetMessagePrompt()));
return messages;
}
@ -84,7 +84,6 @@ public class AgentService : IAgentService, IScopedDependency
TotalTokenCount = usage.Details.TotalTokenCount,
CachedInputTokenCount = usage.Details.CachedInputTokenCount,
InputTokenCount = usage.Details.InputTokenCount,
AdditionalCounts = usage.Details.AdditionalCounts,
OutputTokenCount = usage.Details.OutputTokenCount,
ReasoningTokenCount = usage.Details.ReasoningTokenCount,
});

6
aspnet-core/modules/ai/LINGYUN.Abp.AI.Core/LINGYUN/Abp/AI/AbpAICoreModule.cs

@ -1,4 +1,5 @@
using LINGYUN.Abp.AI.Localization;
using LINGYUN.Abp.AI.Internal;
using LINGYUN.Abp.AI.Localization;
using LINGYUN.Abp.AI.Workspaces;
using Microsoft.Extensions.DependencyInjection;
using System;
@ -38,7 +39,10 @@ public class AbpAICoreModule : AbpModule
Configure<AbpAICoreOptions>(options =>
{
options.ChatClientProviders.Add<OpenAIChatClientProvider>();
options.ChatClientProviders.Add<DeepSeekChatClientProvider>();
options.KernelProviders.Add<OpenAIKernelProvider>();
options.KernelProviders.Add<DeepSeekKernelProvider>();
});
Configure<AbpExceptionLocalizationOptions>(options =>

2
aspnet-core/modules/ai/LINGYUN.Abp.AI.Core/LINGYUN/Abp/AI/ChatClientFactory.cs → aspnet-core/modules/ai/LINGYUN.Abp.AI.Core/LINGYUN/Abp/AI/Internal/ChatClientFactory.cs

@ -8,7 +8,7 @@ using Volo.Abp.Authorization;
using Volo.Abp.DependencyInjection;
using Volo.Abp.SimpleStateChecking;
namespace LINGYUN.Abp.AI;
namespace LINGYUN.Abp.AI.Internal;
public class ChatClientFactory : IChatClientFactory, IScopedDependency
{
protected ISimpleStateCheckerManager<WorkspaceDefinition> StateCheckerManager { get; }

2
aspnet-core/modules/ai/LINGYUN.Abp.AI.Core/LINGYUN/Abp/AI/ChatClientProviderManager.cs → aspnet-core/modules/ai/LINGYUN.Abp.AI.Core/LINGYUN/Abp/AI/Internal/ChatClientProviderManager.cs

@ -7,7 +7,7 @@ using System.Linq;
using Volo.Abp;
using Volo.Abp.DependencyInjection;
namespace LINGYUN.Abp.AI;
namespace LINGYUN.Abp.AI.Internal;
public class ChatClientProviderManager : IChatClientProviderManager, ISingletonDependency
{
public List<IChatClientProvider> Providers => _lazyProviders.Value;

15
aspnet-core/modules/ai/LINGYUN.Abp.AI.Core/LINGYUN/Abp/AI/Internal/DeepSeekChatClientProvider.cs

@ -0,0 +1,15 @@
using System;
namespace LINGYUN.Abp.AI.Internal;
public class DeepSeekChatClientProvider : OpenAIChatClientProvider
{
protected override string DefaultEndpoint => "https://api.deepseek.com/v1";
public new const string ProviderName = "DeepSeek";
public override string Name => ProviderName;
public DeepSeekChatClientProvider(
IServiceProvider serviceProvider)
: base(serviceProvider)
{
}
}

13
aspnet-core/modules/ai/LINGYUN.Abp.AI.Core/LINGYUN/Abp/AI/Internal/DeepSeekKernelProvider.cs

@ -0,0 +1,13 @@
using System;
namespace LINGYUN.Abp.AI.Internal;
public class DeepSeekKernelProvider : OpenAIKernelProvider
{
protected override string DefaultEndpoint => "https://api.deepseek.com/v1";
public new const string ProviderName = "DeepSeek";
public override string Name => ProviderName;
public DeepSeekKernelProvider(IServiceProvider serviceProvider) : base(serviceProvider)
{
}
}

2
aspnet-core/modules/ai/LINGYUN.Abp.AI.Core/LINGYUN/Abp/AI/KernelFactory.cs → aspnet-core/modules/ai/LINGYUN.Abp.AI.Core/LINGYUN/Abp/AI/Internal/KernelFactory.cs

@ -8,7 +8,7 @@ using Volo.Abp.Authorization;
using Volo.Abp.DependencyInjection;
using Volo.Abp.SimpleStateChecking;
namespace LINGYUN.Abp.AI;
namespace LINGYUN.Abp.AI.Internal;
public class KernelFactory : IKernelFactory, IScopedDependency
{
protected ISimpleStateCheckerManager<WorkspaceDefinition> StateCheckerManager { get; }

2
aspnet-core/modules/ai/LINGYUN.Abp.AI.Core/LINGYUN/Abp/AI/KernelProviderManager.cs → aspnet-core/modules/ai/LINGYUN.Abp.AI.Core/LINGYUN/Abp/AI/Internal/KernelProviderManager.cs

@ -6,7 +6,7 @@ using System.Linq;
using Volo.Abp;
using Volo.Abp.DependencyInjection;
namespace LINGYUN.Abp.AI;
namespace LINGYUN.Abp.AI.Internal;
public class KernelProviderManager : IKernelProviderManager, ISingletonDependency
{
public List<IKernelProvider> Providers => _lazyProviders.Value;

6
aspnet-core/modules/ai/LINGYUN.Abp.AI.Core/LINGYUN/Abp/AI/OpenAIChatClientProvider.cs → aspnet-core/modules/ai/LINGYUN.Abp.AI.Core/LINGYUN/Abp/AI/Internal/OpenAIChatClientProvider.cs

@ -6,12 +6,12 @@ using System.ClientModel;
using System.Threading.Tasks;
using Volo.Abp;
namespace LINGYUN.Abp.AI;
namespace LINGYUN.Abp.AI.Internal;
public class OpenAIChatClientProvider : ChatClientProvider
{
private const string DefaultEndpoint = "https://api.openai.com/v1";
public const string ProviderName = "OpenAI";
protected virtual string DefaultEndpoint => "https://api.openai.com/v1";
public const string ProviderName = "OpenAI";
public override string Name => ProviderName;
public OpenAIChatClientProvider(IServiceProvider serviceProvider)
: base(serviceProvider)

4
aspnet-core/modules/ai/LINGYUN.Abp.AI.Core/LINGYUN/Abp/AI/OpenAIKernelProvider.cs → aspnet-core/modules/ai/LINGYUN.Abp.AI.Core/LINGYUN/Abp/AI/Internal/OpenAIKernelProvider.cs

@ -6,10 +6,10 @@ using System.ClientModel;
using System.Threading.Tasks;
using Volo.Abp;
namespace LINGYUN.Abp.AI;
namespace LINGYUN.Abp.AI.Internal;
public class OpenAIKernelProvider : KernelProvider
{
private const string DefaultEndpoint = "https://api.openai.com/v1";
protected virtual string DefaultEndpoint { get; set; } = "https://api.openai.com/v1";
public const string ProviderName = "OpenAI";
public override string Name => ProviderName;

5
aspnet-core/modules/ai/LINGYUN.Abp.AI.Core/LINGYUN/Abp/AI/Models/TokenUsageInfo.cs

@ -1,6 +1,4 @@
using System.Collections.Generic;
namespace LINGYUN.Abp.AI.Models;
namespace LINGYUN.Abp.AI.Models;
public class TokenUsageInfo
{
public string Workspace { get; }
@ -9,7 +7,6 @@ public class TokenUsageInfo
public long? TotalTokenCount { get; set; }
public long? CachedInputTokenCount { get; set; }
public long? ReasoningTokenCount { get; set; }
public IDictionary<string, long>? AdditionalCounts { get; set; }
public TokenUsageInfo(string workspace)
{
Workspace = workspace;

37
aspnet-core/modules/ai/LINGYUN.Abp.AI.Core/LINGYUN/Abp/AI/Models/UserMessage.cs

@ -1,12 +1,6 @@
using System.Linq;
namespace LINGYUN.Abp.AI.Models;
public class UserMessage
namespace LINGYUN.Abp.AI.Models;
public abstract class UserMessage
{
/// <summary>
/// 消息内容
/// </summary>
public string Content { get; }
/// <summary>
/// 工作区
/// </summary>
@ -29,44 +23,31 @@ public class UserMessage
/// AI回复消息
/// </summary>
public string ReplyMessage { get; private set; }
/// <summary>
/// 媒体附件
/// </summary>
/// <remarks>
/// 暂未实现
/// </remarks>
public MediaMessage[]? Medias { get; private set; }
public UserMessage(
string workspace,
string content)
protected UserMessage(string workspace)
{
Workspace = workspace;
Content = content;
}
public UserMessage WithMessageId(string id)
public virtual UserMessage WithMessageId(string id)
{
Id = id;
return this;
}
public UserMessage WithConversationId(string conversationId)
public virtual UserMessage WithConversationId(string conversationId)
{
ConversationId = conversationId;
return this;
}
public UserMessage WithMedia(MediaMessage media)
public virtual UserMessage WithReply(string replyMessage)
{
Medias ??= [];
Medias = Medias.Union([media]).ToArray();
ReplyMessage = replyMessage;
return this;
}
public UserMessage WithReply(string replyMessage)
public virtual string GetMessagePrompt()
{
ReplyMessage = replyMessage;
return this;
return string.Empty;
}
}

20
aspnet-core/modules/ai/LINGYUN.Abp.AI.Core/LINGYUN/Abp/AI/Models/UserTextMessage.cs

@ -0,0 +1,20 @@
namespace LINGYUN.Abp.AI.Models;
public class UserTextMessage : UserMessage
{
/// <summary>
/// 消息内容
/// </summary>
public string Content { get; }
public UserTextMessage(
string workspace,
string content)
: base(workspace)
{
Content = content;
}
public override string GetMessagePrompt()
{
return Content;
}
}

9
aspnet-core/modules/ai/LINGYUN.Abp.AI.Core/LINGYUN/Abp/AI/Tokens/InMemoryTokenUsageStore.cs

@ -25,15 +25,6 @@ public class InMemoryTokenUsageStore : ITokenUsageStore
ReasoningTokenCount = usageInfo.Sum(x => x.ReasoningTokenCount),
CachedInputTokenCount = usageInfo.Sum(x => x.CachedInputTokenCount),
};
tokenUsageInfo.AdditionalCounts ??= new Dictionary<string, long>();
foreach (var item in usageInfo)
{
if (item.AdditionalCounts == null)
{
continue;
}
tokenUsageInfo.AdditionalCounts.AddIfNotContains(item.AdditionalCounts);
}
if (!_tokenUsageCache.ContainsKey(usageInfo.Key))
{

Loading…
Cancel
Save