feat: 完成错误信息输出
This commit is contained in:
@@ -4,6 +4,7 @@ using Microsoft.AspNetCore.Authorization;
|
|||||||
using Microsoft.AspNetCore.Http;
|
using Microsoft.AspNetCore.Http;
|
||||||
using Microsoft.AspNetCore.Mvc;
|
using Microsoft.AspNetCore.Mvc;
|
||||||
using Microsoft.Extensions.DependencyInjection;
|
using Microsoft.Extensions.DependencyInjection;
|
||||||
|
using Microsoft.Extensions.Logging;
|
||||||
using Microsoft.Extensions.Options;
|
using Microsoft.Extensions.Options;
|
||||||
using Newtonsoft.Json;
|
using Newtonsoft.Json;
|
||||||
using Newtonsoft.Json.Serialization;
|
using Newtonsoft.Json.Serialization;
|
||||||
@@ -31,16 +32,19 @@ public class AiChatService : ApplicationService
|
|||||||
private readonly ISqlSugarRepository<AiModelEntity> _aiModelRepository;
|
private readonly ISqlSugarRepository<AiModelEntity> _aiModelRepository;
|
||||||
private readonly AiBlacklistManager _aiBlacklistManager;
|
private readonly AiBlacklistManager _aiBlacklistManager;
|
||||||
private readonly UsageStatisticsManager _usageStatisticsManager;
|
private readonly UsageStatisticsManager _usageStatisticsManager;
|
||||||
|
private readonly ILogger<AiChatService> _logger;
|
||||||
|
|
||||||
public AiChatService(IHttpContextAccessor httpContextAccessor,
|
public AiChatService(IHttpContextAccessor httpContextAccessor,
|
||||||
AiMessageManager aiMessageManager, AiBlacklistManager aiBlacklistManager,
|
AiMessageManager aiMessageManager, AiBlacklistManager aiBlacklistManager,
|
||||||
ISqlSugarRepository<AiModelEntity> aiModelRepository, UsageStatisticsManager usageStatisticsManager)
|
ISqlSugarRepository<AiModelEntity> aiModelRepository, UsageStatisticsManager usageStatisticsManager,
|
||||||
|
ILogger<AiChatService> logger)
|
||||||
{
|
{
|
||||||
this._httpContextAccessor = httpContextAccessor;
|
this._httpContextAccessor = httpContextAccessor;
|
||||||
_aiMessageManager = aiMessageManager;
|
_aiMessageManager = aiMessageManager;
|
||||||
_aiBlacklistManager = aiBlacklistManager;
|
_aiBlacklistManager = aiBlacklistManager;
|
||||||
_aiModelRepository = aiModelRepository;
|
_aiModelRepository = aiModelRepository;
|
||||||
_usageStatisticsManager = usageStatisticsManager;
|
_usageStatisticsManager = usageStatisticsManager;
|
||||||
|
_logger = logger;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -97,7 +101,7 @@ public class AiChatService : ApplicationService
|
|||||||
if (CurrentUser.IsAuthenticated)
|
if (CurrentUser.IsAuthenticated)
|
||||||
{
|
{
|
||||||
await _aiBlacklistManager.VerifiyAiBlacklist(CurrentUser.GetId());
|
await _aiBlacklistManager.VerifiyAiBlacklist(CurrentUser.GetId());
|
||||||
if (!CurrentUser.Roles.Contains("YiXinAi-Vip")&&CurrentUser.UserName!="cc")
|
if (!CurrentUser.Roles.Contains("YiXinAi-Vip") && CurrentUser.UserName != "cc")
|
||||||
{
|
{
|
||||||
throw new UserFriendlyException("该模型需要VIP用户才能使用,请购买VIP后重新登录重试");
|
throw new UserFriendlyException("该模型需要VIP用户才能使用,请购买VIP后重新登录重试");
|
||||||
}
|
}
|
||||||
@@ -165,24 +169,39 @@ public class AiChatService : ApplicationService
|
|||||||
}, cancellationToken);
|
}, cancellationToken);
|
||||||
|
|
||||||
|
|
||||||
await foreach (var data in completeChatResponse)
|
//IAsyncEnumerable 只能在最外层捕获异常(如果你有其他办法的话...)
|
||||||
|
try
|
||||||
{
|
{
|
||||||
if (data.IsFinish)
|
await foreach (var data in completeChatResponse)
|
||||||
{
|
{
|
||||||
tokenUsage = data.TokenUsage;
|
if (data.IsFinish)
|
||||||
}
|
{
|
||||||
|
tokenUsage = data.TokenUsage;
|
||||||
|
}
|
||||||
|
|
||||||
var model = MapToMessage(input.Model, data.Content);
|
var model = MapToMessage(input.Model, data.Content);
|
||||||
|
var message = JsonConvert.SerializeObject(model, new JsonSerializerSettings
|
||||||
|
{
|
||||||
|
ContractResolver = new CamelCasePropertyNamesContractResolver()
|
||||||
|
});
|
||||||
|
backupSystemContent.Append(data.Content);
|
||||||
|
// 将消息加入队列而不是直接写入
|
||||||
|
messageQueue.Enqueue($"data: {message}\n");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
catch (Exception e)
|
||||||
|
{
|
||||||
|
_logger.LogError(e, $"Ai对话异常");
|
||||||
|
var errorContent = $"Ai对话异常,异常信息:\n{e.Message}";
|
||||||
|
var model = MapToMessage(input.Model, errorContent);
|
||||||
var message = JsonConvert.SerializeObject(model, new JsonSerializerSettings
|
var message = JsonConvert.SerializeObject(model, new JsonSerializerSettings
|
||||||
{
|
{
|
||||||
ContractResolver = new CamelCasePropertyNamesContractResolver()
|
ContractResolver = new CamelCasePropertyNamesContractResolver()
|
||||||
});
|
});
|
||||||
backupSystemContent.Append(data.Content);
|
backupSystemContent.Append(errorContent);
|
||||||
// 将消息加入队列而不是直接写入
|
|
||||||
messageQueue.Enqueue($"data: {message}\n");
|
messageQueue.Enqueue($"data: {message}\n");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
//断开连接
|
//断开连接
|
||||||
messageQueue.Enqueue("data: [DONE]\n");
|
messageQueue.Enqueue("data: [DONE]\n");
|
||||||
// 标记完成并发送结束标记
|
// 标记完成并发送结束标记
|
||||||
|
|||||||
@@ -0,0 +1,31 @@
|
|||||||
|
using Microsoft.Extensions.Logging;
|
||||||
|
|
||||||
|
namespace Yi.Framework.AiHub.Domain.AiChat;
|
||||||
|
|
||||||
|
public class ChatErrorException : Exception
|
||||||
|
{
|
||||||
|
public string? Code { get; set; }
|
||||||
|
|
||||||
|
public string? Details { get; set; }
|
||||||
|
|
||||||
|
public LogLevel LogLevel { get; set; }
|
||||||
|
|
||||||
|
public ChatErrorException(
|
||||||
|
string? code = null,
|
||||||
|
string? message = null,
|
||||||
|
string? details = null,
|
||||||
|
Exception? innerException = null,
|
||||||
|
LogLevel logLevel = LogLevel.Warning)
|
||||||
|
: base(message, innerException)
|
||||||
|
{
|
||||||
|
this.Code = code;
|
||||||
|
this.Details = details;
|
||||||
|
this.LogLevel = logLevel;
|
||||||
|
}
|
||||||
|
|
||||||
|
public ChatErrorException WithData(string name, object value)
|
||||||
|
{
|
||||||
|
this.Data[(object)name] = value;
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user