feat: 完成agent功能

This commit is contained in:
chenchun
2025-12-24 14:17:32 +08:00
parent 9ca3cd0b1a
commit ee4cb20eef
6 changed files with 100 additions and 70 deletions

View File

@@ -20,6 +20,7 @@ using Yi.Framework.AiHub.Application.Contracts.Dtos;
using Yi.Framework.AiHub.Application.Contracts.Dtos.Chat;
using Yi.Framework.AiHub.Domain;
using Yi.Framework.AiHub.Domain.Entities;
using Yi.Framework.AiHub.Domain.Entities.Chat;
using Yi.Framework.AiHub.Domain.Entities.Model;
using Yi.Framework.AiHub.Domain.Extensions;
using Yi.Framework.AiHub.Domain.Managers;
@@ -47,13 +48,16 @@ public class AiChatService : ApplicationService
private readonly ChatManager _chatManager;
private readonly TokenManager _tokenManager;
private readonly IAccountService _accountService;
private readonly ISqlSugarRepository<AgentStoreAggregateRoot> _agentStoreRepository;
public AiChatService(IHttpContextAccessor httpContextAccessor,
AiBlacklistManager aiBlacklistManager,
ISqlSugarRepository<AiModelEntity> aiModelRepository,
ILogger<AiChatService> logger,
AiGateWayManager aiGateWayManager,
PremiumPackageManager premiumPackageManager,
ChatManager chatManager, TokenManager tokenManager, IAccountService accountService)
ChatManager chatManager, TokenManager tokenManager, IAccountService accountService,
ISqlSugarRepository<AgentStoreAggregateRoot> agentStoreRepository)
{
_httpContextAccessor = httpContextAccessor;
_aiBlacklistManager = aiBlacklistManager;
@@ -64,6 +68,7 @@ public class AiChatService : ApplicationService
_chatManager = chatManager;
_tokenManager = tokenManager;
_accountService = accountService;
_agentStoreRepository = agentStoreRepository;
}
@@ -154,50 +159,6 @@ public class AiChatService : ApplicationService
CurrentUser.Id, sessionId, null, cancellationToken);
}
/// <summary>
/// Agent 发送消息
/// </summary>
[HttpPost("ai-chat/agent/send")]
public async Task PostAgentSendAsync([FromBody] AgentSendInput input, CancellationToken cancellationToken)
{
var tokenValidation = await _tokenManager.ValidateTokenAsync(input.Token, input.ModelId);
await _aiBlacklistManager.VerifiyAiBlacklist(tokenValidation.UserId);
// 验证用户是否为VIP
var userInfo = await _accountService.GetAsync(null, null, tokenValidation.UserId);
if (userInfo == null)
{
throw new UserFriendlyException("用户信息不存在");
}
// 检查是否为VIP使用RoleCodes判断
if (!userInfo.RoleCodes.Contains(AiHubConst.VipRole) && userInfo.User.UserName != "cc")
{
throw new UserFriendlyException("该接口为尊享服务专用需要VIP权限才能使用");
}
//如果是尊享包服务,需要校验是是否尊享包足够
if (PremiumPackageConst.ModeIds.Contains(input.ModelId))
{
// 检查尊享token包用量
var availableTokens = await _premiumPackageManager.GetAvailableTokensAsync(tokenValidation.UserId);
if (availableTokens <= 0)
{
throw new UserFriendlyException("尊享token包用量不足请先购买尊享token包");
}
}
await _chatManager.AgentCompleteChatStreamAsync(_httpContextAccessor.HttpContext,
input.SessionId,
input.Content,
input.Token,
tokenValidation.TokenId,
input.ModelId,
tokenValidation.UserId,
input.Tools,
cancellationToken);
}
/// <summary>
/// 发送消息
/// </summary>
@@ -234,27 +195,75 @@ public class AiChatService : ApplicationService
CurrentUser.Id, null, null, cancellationToken);
}
[HttpPost("ai-chat/tool")]
public string GetTool()
{
var toolClasses = typeof(YiFrameworkAiHubDomainModule).Assembly.GetTypes()
.Where(x => x.GetCustomAttribute<McpServerToolTypeAttribute>() is not null)
.ToList();
List<McpServerTool> mcpTools = new List<McpServerTool>();
foreach (var toolClass in toolClasses)
/// <summary>
/// Agent 发送消息
/// </summary>
[HttpPost("ai-chat/agent/send")]
public async Task PostAgentSendAsync([FromBody] AgentSendInput input, CancellationToken cancellationToken)
{
var tokenValidation = await _tokenManager.ValidateTokenAsync(input.Token, input.ModelId);
await _aiBlacklistManager.VerifiyAiBlacklist(tokenValidation.UserId);
// 验证用户是否为VIP
var userInfo = await _accountService.GetAsync(null, null, tokenValidation.UserId);
if (userInfo == null)
{
var instance = LazyServiceProvider.GetRequiredService(toolClass);
var toolMethods = toolClass.GetMethods()
.Where(y => y.GetCustomAttribute<McpServerToolAttribute>() is not null).ToList();
foreach (var toolMethod in toolMethods)
throw new UserFriendlyException("用户信息不存在");
}
// 检查是否为VIP使用RoleCodes判断
if (!userInfo.RoleCodes.Contains(AiHubConst.VipRole) && userInfo.User.UserName != "cc")
{
throw new UserFriendlyException("该接口为尊享服务专用需要VIP权限才能使用");
}
//如果是尊享包服务,需要校验是是否尊享包足够
if (PremiumPackageConst.ModeIds.Contains(input.ModelId))
{
// 检查尊享token包用量
var availableTokens = await _premiumPackageManager.GetAvailableTokensAsync(tokenValidation.UserId);
if (availableTokens <= 0)
{
mcpTools.add(McpServerTool.Create(toolMethod, instance));
throw new UserFriendlyException("尊享token包用量不足请先购买尊享token包");
}
}
var json = System.Text.Json.JsonSerializer.Serialize(mcpTools.Select(x => x.ProtocolTool).ToList(),
McpJsonUtilities.DefaultOptions);
return json;
await _chatManager.AgentCompleteChatStreamAsync(_httpContextAccessor.HttpContext,
input.SessionId,
input.Content,
input.Token,
tokenValidation.TokenId,
input.ModelId,
tokenValidation.UserId,
input.Tools,
cancellationToken);
}
/// <summary>
/// 获取 Agent 工具
/// </summary>
/// <returns></returns>
[HttpPost("ai-chat/agent/tool")]
public List<AgentToolOutput> GetAgentToolAsync()
{
var agentTools = _chatManager.GetTools().Select(x => new AgentToolOutput
{
Code = x.Code,
Name = x.Name
}).ToList();
return agentTools;
}
/// <summary>
/// 获取 Agent 上下文
/// </summary>
/// <returns></returns>
[HttpPost("ai-chat/agent/context/{sessionId}")]
[Authorize]
public async Task<string?> GetAgentContextAsync([FromRoute] Guid sessionId)
{
var data = await _agentStoreRepository.GetFirstAsync(x => x.SessionId == sessionId);
return data?.Store;
}
}