KiMiApi.cs 4.4 KB

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