KiMiApi.cs 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147
  1. 
  2. using OASystem.Domain.Dtos.Groups;
  3. using OASystem.Domain.Dtos.KiMi;
  4. using System.Net.Http.Headers;
  5. namespace OASystem.API.OAMethodLib.KiMiApi
  6. {
  7. public class KiMiApiClient
  8. {
  9. //读取配置文件
  10. private KiMiSetting _kimiSetting { get; set; }
  11. private readonly HttpClient _httpClient;
  12. public KiMiApiClient()
  13. {
  14. _httpClient = new HttpClient();
  15. _kimiSetting = AutofacIocManager.Instance.GetService<KiMiSetting>();
  16. // 设置公共请求头
  17. _httpClient.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", _kimiSetting.Key);
  18. }
  19. //private string apiKey = "sk-AY1Sv4rLnSUgGGHcC8SGSWYYKzGID7leZJcFfxAYozLC8dIc";
  20. //private string baseUrl = "https://api.moonshot.cn/v1";
  21. public async Task<string> UploadFileAsync(IFormFile file)
  22. {
  23. string message = string.Empty;
  24. byte[] fileBytes = null;
  25. using (var memoryStream = new MemoryStream())
  26. {
  27. await file.CopyToAsync(memoryStream);
  28. fileBytes = memoryStream.ToArray();
  29. }
  30. // 上传文件
  31. var fileContent = new ByteArrayContent(fileBytes);
  32. var fileFormData = new MultipartFormDataContent
  33. {
  34. { fileContent, "file", file.FileName },
  35. { new StringContent("file-extract"), "purpose" }
  36. };
  37. HttpResponseMessage fileResponse = await _httpClient.PostAsync($"{_kimiSetting.BaseUrl}/files", fileFormData);
  38. string fileResponseContent = await fileResponse.Content.ReadAsStringAsync();
  39. if (!fileResponse.IsSuccessStatusCode)
  40. {
  41. throw new Exception($"Failed to upload file: {fileResponseContent}");
  42. }
  43. dynamic fileObject = JsonConvert.DeserializeObject(fileResponseContent);
  44. string fileId = fileObject.id;
  45. HttpResponseMessage contentResponse = await _httpClient.GetAsync($"{_kimiSetting.BaseUrl}/files/{fileId}/content");
  46. string fileContentText = await contentResponse.Content.ReadAsStringAsync();
  47. if (!contentResponse.IsSuccessStatusCode)
  48. {
  49. throw new Exception($"Failed to get file content: {fileContentText}");
  50. }
  51. message = fileContentText;
  52. return message;
  53. }
  54. public async Task<List<SeedMessages>> UploadFilesAsync(List<IFormFile> files)
  55. {
  56. List<SeedMessages> result = new List<SeedMessages>();
  57. foreach (IFormFile file in files)
  58. {
  59. var fileConter = await this.UploadFileAsync(file);
  60. result.Add(new SeedMessages() { Role = KimiRole.system , Content = fileConter });
  61. }
  62. return result;
  63. }
  64. public async Task<string> SeedMessage(List<SeedMessages> messages)
  65. {
  66. var completionRequest = new
  67. {
  68. model = _kimiSetting.Model,
  69. messages = messages.Select(x=> new
  70. {
  71. Role = StringEnumHelper.ToStringValue(x.Role),
  72. x.Content
  73. }),
  74. temperature = 1
  75. };
  76. var completionJson = JsonConvert.SerializeObject(completionRequest);
  77. var completionContent = new StringContent(completionJson, Encoding.UTF8, "application/json");
  78. HttpResponseMessage completionResponse = await _httpClient.PostAsync($"{_kimiSetting.BaseUrl}/chat/completions", completionContent);
  79. string completionResponseContent = await completionResponse.Content.ReadAsStringAsync();
  80. if (!completionResponse.IsSuccessStatusCode)
  81. {
  82. throw new Exception($"Failed to seed message: {completionResponseContent}");
  83. }
  84. // 解析返回的完成结果
  85. var completion = JObject.Parse(completionResponseContent);
  86. string reply = completion["choices"][0]["message"].ToString();
  87. return reply;
  88. }
  89. }
  90. public class SeedMessages
  91. {
  92. public KimiRole Role { get; set; }
  93. public string Content { get; set; }
  94. }
  95. public enum KimiRole
  96. {
  97. system,
  98. user
  99. }
  100. public static class StringEnumHelper
  101. {
  102. public static string ToStringValue(KimiRole value)
  103. {
  104. return value switch
  105. {
  106. KimiRole.system => "system",
  107. KimiRole.user => "user",
  108. _ => throw new ArgumentOutOfRangeException(nameof(value), value, null)
  109. };
  110. }
  111. }
  112. }