123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147 |
-
- using OASystem.Domain.Dtos.Groups;
- using OASystem.Domain.Dtos.KiMi;
- using System.Net.Http.Headers;
- namespace OASystem.API.OAMethodLib.KiMiApi
- {
- public class KiMiApiClient
- {
- //读取配置文件
- private KiMiSetting _kimiSetting { get; set; }
- private readonly HttpClient _httpClient;
- public KiMiApiClient()
- {
- _httpClient = new HttpClient();
- _kimiSetting = AutofacIocManager.Instance.GetService<KiMiSetting>();
- // 设置公共请求头
- _httpClient.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", _kimiSetting.Key);
- }
- //private string apiKey = "sk-AY1Sv4rLnSUgGGHcC8SGSWYYKzGID7leZJcFfxAYozLC8dIc";
- //private string baseUrl = "https://api.moonshot.cn/v1";
- public async Task<string> UploadFileAsync(IFormFile file)
- {
- string message = string.Empty;
- byte[] fileBytes = null;
- using (var memoryStream = new MemoryStream())
- {
- await file.CopyToAsync(memoryStream);
- fileBytes = memoryStream.ToArray();
- }
- // 上传文件
- var fileContent = new ByteArrayContent(fileBytes);
- var fileFormData = new MultipartFormDataContent
- {
- { fileContent, "file", file.FileName },
- { new StringContent("file-extract"), "purpose" }
- };
- HttpResponseMessage fileResponse = await _httpClient.PostAsync($"{_kimiSetting.BaseUrl}/files", fileFormData);
- string fileResponseContent = await fileResponse.Content.ReadAsStringAsync();
- if (!fileResponse.IsSuccessStatusCode)
- {
- throw new Exception($"Failed to upload file: {fileResponseContent}");
- }
- dynamic fileObject = JsonConvert.DeserializeObject(fileResponseContent);
- string fileId = fileObject.id;
- HttpResponseMessage contentResponse = await _httpClient.GetAsync($"{_kimiSetting.BaseUrl}/files/{fileId}/content");
- string fileContentText = await contentResponse.Content.ReadAsStringAsync();
- if (!contentResponse.IsSuccessStatusCode)
- {
- throw new Exception($"Failed to get file content: {fileContentText}");
- }
- message = fileContentText;
- return message;
- }
- public async Task<List<SeedMessages>> UploadFilesAsync(List<IFormFile> files)
- {
- List<SeedMessages> result = new List<SeedMessages>();
- foreach (IFormFile file in files)
- {
- var fileConter = await this.UploadFileAsync(file);
- result.Add(new SeedMessages() { Role = KimiRole.system , Content = fileConter });
- }
- return result;
- }
- public async Task<string> SeedMessage(List<SeedMessages> messages)
- {
- var completionRequest = new
- {
- model = _kimiSetting.Model,
- messages = messages.Select(x=> new
- {
- Role = StringEnumHelper.ToStringValue(x.Role),
- x.Content
- }),
- temperature = 1
- };
- var completionJson = JsonConvert.SerializeObject(completionRequest);
- var completionContent = new StringContent(completionJson, Encoding.UTF8, "application/json");
- HttpResponseMessage completionResponse = await _httpClient.PostAsync($"{_kimiSetting.BaseUrl}/chat/completions", completionContent);
- string completionResponseContent = await completionResponse.Content.ReadAsStringAsync();
- if (!completionResponse.IsSuccessStatusCode)
- {
- throw new Exception($"Failed to seed message: {completionResponseContent}");
- }
- // 解析返回的完成结果
- var completion = JObject.Parse(completionResponseContent);
- string reply = completion["choices"][0]["message"].ToString();
- return reply;
- }
- }
- public class SeedMessages
- {
- public KimiRole Role { get; set; }
- public string Content { get; set; }
- }
- public enum KimiRole
- {
- system,
- user
- }
- public static class StringEnumHelper
- {
- public static string ToStringValue(KimiRole value)
- {
- return value switch
- {
- KimiRole.system => "system",
- KimiRole.user => "user",
- _ => throw new ArgumentOutOfRangeException(nameof(value), value, null)
- };
- }
- }
- }
|