123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154 |
- using HTEXGpt.Models;
- using Microsoft.AspNetCore.Http;
- using System.Diagnostics;
- using System.Text;
- using System.Text.Json;
- using System.Text.Json.Nodes;
- namespace HTEXGpt.Services
- {
- public class ErnieBotServiceImpl : IModelService
- {
- private readonly string appSecret = "7E0C6SzWE7kb1lSp1Dkb7k6Eg2xFkJoR";
- private readonly string apiKey = "vnxaIH9aJLrsiwMI8OchFKEf";
- private readonly static string TOKEN_URL_TEMPLATE = "https://aip.baidubce.com/oauth/2.0/token?grant_type=client_credentials&client_id={0}&client_secret={1}";
- //最大输出Token max_output_tokens=4096
- // private readonly static String CHAT_URL = "https://aip.baidubce.com/rpc/2.0/ai_custom/v1/wenxinworkshop/chat/ernie-speed-128k?access_token={0}";
- //最大输出Token max_output_tokens=2048
- private readonly static String CHAT_URL = "https://aip.baidubce.com/rpc/2.0/ai_custom/v1/wenxinworkshop/chat/ernie_speed?access_token={0}";
- private readonly string appId = "71670766";
- private readonly IHttpClientFactory _httpClientFactory;
- public ErnieBotServiceImpl(IHttpClientFactory httpClientFactory)
- {
- _httpClientFactory=httpClientFactory;
- }
- public async Task<ChatResponse> ChatMessage(ChatRequest dto, HttpContext httpContext, HttpResponse response)
- {
- // response.Headers.ContentType="text/event-stream";
- //response.Headers.CacheControl="no-cache";
- //response.Headers.Connection="keep-alive";
- Stopwatch stopwatch = Stopwatch.StartNew(); // 开始计时
- ChatResponse chatResponse= new ChatResponse();
- try {
- var token = await getAccessToken();
- JsonElement json = JsonSerializer.Deserialize<JsonElement>(token);
- var access_token= json.GetProperty("access_token").GetString();
- ErnieBotDTO ernieBotDTO = new ErnieBotDTO
- {
- messages= dto.messages,
- system=dto.system,
- stream=false,
- // temperature=dto.@params.temperature,
- // top_p=dto.@params.top_p,
- // max_output_tokens=4096
- user_id =dto.uid
- };
- var httpClient = _httpClientFactory.CreateClient();
- string url = string.Format(CHAT_URL, access_token);
- var data = JsonSerializer.Serialize(ernieBotDTO);
- HttpResponseMessage httpResponse = await httpClient.PostAsJsonAsync(url, ernieBotDTO);
- if (httpResponse.IsSuccessStatusCode)
- {
- var content = await httpResponse.Content.ReadAsStringAsync();
- //using (var responseStream = await httpResponse.Content.ReadAsStreamAsync())
- //{
- // StringBuilder sb = new StringBuilder();
- // var buffer = new byte[1024];
- // int bytesRead;
- // while ((bytesRead = responseStream.Read(buffer, 0, buffer.Length)) > 0)
- // {
- // string contentData = System.Text.Encoding.UTF8.GetString(buffer, 0, bytesRead);
- // Console.WriteLine(contentData);
- // await response.WriteAsync($"event:result\n");
- // await response.WriteAsync(@$"{contentData}");
- // await response.Body.FlushAsync();
- // await Task.Delay(500);
- // }
- //}
- StringBuilder sb = new StringBuilder();
- var datas = content.Split("data:");
- foreach (var jsonData in datas)
- {
- try
- {
- JsonNode j = JsonSerializer.Deserialize<JsonNode>(jsonData);
- sb.Append($"{j["result"]}");
- var total_tokens = j?["usage"]?["total_tokens"];
- if (total_tokens!= null)
- {
- chatResponse.total_tokens=int.Parse($"{total_tokens}");
- }
- var completion_tokens = j?["usage"]?["completion_tokens"];
- if (completion_tokens!= null)
- {
- chatResponse.completion_tokens=int.Parse($"{completion_tokens}");
- }
- var prompt_tokens = j?["usage"]?["prompt_tokens"];
- if (prompt_tokens!= null)
- {
- chatResponse.prompt_tokens=int.Parse($"{prompt_tokens}");
- }
- }
- catch { }
- }
- chatResponse.result= sb.ToString();
- chatResponse.statusCode= System.Net.HttpStatusCode.OK;
- // await response.WriteAsync(@$"{content}");
- // await response.Body.FlushAsync();
- }
- else {
- chatResponse.statusCode=httpResponse.StatusCode;
- string content = await httpResponse.Content.ReadAsStringAsync();
- chatResponse.error=$"{content}";
- }
- } catch (Exception ex) {
- chatResponse.statusCode=System.Net.HttpStatusCode.InternalServerError;
- chatResponse.error=$"{ex.Message},{ex.StackTrace}";
- }
- finally
- {
- // response.Body.Close();
- stopwatch.Stop(); // 停止计时
- chatResponse.time= stopwatch.ElapsedMilliseconds;
- }
- return chatResponse;
- }
- private async Task<string> getAccessToken()
- {
- var token_url= string.Format(TOKEN_URL_TEMPLATE, apiKey, appSecret);
- var httpClient = _httpClientFactory.CreateClient();
- httpClient.DefaultRequestHeaders.Add("Accept", "application/json");
- var response = await httpClient.PostAsJsonAsync(token_url,new { });
- if (response.StatusCode==System.Net.HttpStatusCode.OK) {
- var content = await response.Content.ReadAsStringAsync();
- return content;
- }
- return null;
- }
- }
- public class ErnieBotDTO
- {
- public List<MessageDTO> messages { get; set; } = new List<MessageDTO>();
- public string? system { get; set; }
- public double temperature { get; set; } = 0.95;
- public bool stream { get; set; } = true;
- public double top_p { get; set; } = 0.7;
- public string response_format { get; set; } = "text";
- // public double penalty_score { get; set; }
- // public bool enable_citation { get; set; }
- // public bool disable_search { get; set; }
- public string? user_id { get; set; }
- }
- }
|