AiAppServiceImpl.cs 3.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586
  1. using HTEXGpt.Models;
  2. namespace HTEXGpt.Services
  3. {
  4. public class AiAppServiceImpl : IAiAppService
  5. {
  6. private readonly IServiceProvider _serviceProvider;
  7. public AiAppServiceImpl(IServiceProvider serviceProvider)
  8. {
  9. _serviceProvider = serviceProvider;
  10. }
  11. public async Task<ChatResponse> ChatMessage(string? modelType, ChatRequest dto, HttpContext httpContext,HttpResponse response)
  12. {
  13. this.CheckMessages(dto.messages);
  14. IModelService? modelService = GetModelService(modelType!);
  15. return await modelService!.ChatMessage(dto,httpContext, response);
  16. }
  17. /// <summary>
  18. /// 根据模型类型获取对应的模型服务
  19. /// </summary>
  20. /// <param name="modelType"></param>
  21. /// <returns></returns>
  22. /// <exception cref="InvalidOperationException"></exception>
  23. private IModelService? GetModelService(string modelType)
  24. {
  25. try
  26. {
  27. // 将字符串转换为枚举值
  28. ModelTypeEnum modelTypeEnum = (ModelTypeEnum)Enum.Parse(typeof(ModelTypeEnum), modelType!);
  29. // 根据枚举值获取对应的服务类型
  30. Type? serviceType = typeof(IModelService).Assembly.GetTypes()
  31. .FirstOrDefault(t => t.IsClass && !t.IsAbstract && t.GetInterfaces().Contains(typeof(IModelService)) && t.Name.StartsWith(modelTypeEnum.ToString()));
  32. if (serviceType == null)
  33. {
  34. throw new InvalidOperationException($"未找到与模型类型 {modelType} 对应的服务。");
  35. }
  36. // 获取服务实例
  37. var s= _serviceProvider.GetRequiredService(serviceType);
  38. var s1 = _serviceProvider.GetService(serviceType);
  39. return (IModelService?)_serviceProvider.GetService(serviceType);
  40. }
  41. catch (ArgumentException e)
  42. {
  43. throw new InvalidOperationException("模型类型错误", e);
  44. }
  45. }
  46. /// <summary>
  47. /// 检查消息参数是否符合规范@param messages 消息参数
  48. /// </summary>
  49. /// <param name="messages"></param>
  50. /// <exception cref="RuntimeException"></exception>
  51. private void CheckMessages(List<MessageDTO> messages)
  52. {
  53. if (messages!=null && messages.Count>0)
  54. {
  55. // messages参数个数必须为奇数并且奇数个数的消息role必须为user,偶数个数的消息role必须为assistant
  56. if (messages.Count() % 2 == 0)
  57. {
  58. throw new Exception("messages参数个数必须为奇数");
  59. }
  60. for (int i = 0; i < messages.Count(); i++)
  61. {
  62. if (i % 2 == 0)
  63. {
  64. if (!"user".Equals(messages[i].role))
  65. {
  66. throw new Exception("messages奇数参数的role必须为user");
  67. }
  68. }
  69. else
  70. {
  71. if (!"assistant".Equals(messages[i].role))
  72. {
  73. throw new Exception("messages偶数参数的role必须为assistant");
  74. }
  75. }
  76. }
  77. }
  78. }
  79. }
  80. }