From 70126fb307d297cdc8b5718797fb6d437538f537 Mon Sep 17 00:00:00 2001 From: zpc Date: Sat, 22 Jun 2024 12:38:23 +0800 Subject: [PATCH] =?UTF-8?q?=E6=B5=8B=E8=AF=95=E9=A1=B9=E7=9B=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../TextGenerationRequestAbstract.cs | 6 +- .../BLL/TextGenerationBLL.cs | 43 ++++-- .../Models/TextGenerationTestContext.cs | 6 +- .../api/TextGenerationModel.cs | 48 +++++++ .../api/TextGenerationRequestHttpApi.cs | 83 +++-------- .../api/TextGenerationRequestHttpApiModel.cs | 25 ---- .../api/TextGenerationRequestHttpApiStream.cs | 129 ++++++++++++++++++ ...TextGenerationRequestHttpApiStreamModel.cs | 82 +++++++++++ .../api/TextGenerationRequestHttpModel.cs | 8 +- .../.config/dotnet-tools.json | 13 ++ .../TextGenerationApiController.cs | 108 +++++++++++++-- src/2-api/TextGenerationApi/Program.cs | 10 +- .../api/TextGenerationRequestHttpApiTests.cs | 2 +- 13 files changed, 439 insertions(+), 124 deletions(-) create mode 100644 src/0-core/HuanMeng.StableDiffusion.TextGeneration/api/TextGenerationModel.cs delete mode 100644 src/0-core/HuanMeng.StableDiffusion.TextGeneration/api/TextGenerationRequestHttpApiModel.cs create mode 100644 src/0-core/HuanMeng.StableDiffusion.TextGeneration/api/TextGenerationRequestHttpApiStream.cs create mode 100644 src/0-core/HuanMeng.StableDiffusion.TextGeneration/api/TextGenerationRequestHttpApiStreamModel.cs create mode 100644 src/2-api/TextGenerationApi/.config/dotnet-tools.json diff --git a/src/0-core/HuanMeng.StableDiffusion.TextGeneration/Abstractions/TextGenerationRequestAbstract.cs b/src/0-core/HuanMeng.StableDiffusion.TextGeneration/Abstractions/TextGenerationRequestAbstract.cs index 247718f..36052f4 100644 --- a/src/0-core/HuanMeng.StableDiffusion.TextGeneration/Abstractions/TextGenerationRequestAbstract.cs +++ b/src/0-core/HuanMeng.StableDiffusion.TextGeneration/Abstractions/TextGenerationRequestAbstract.cs @@ -1,4 +1,6 @@ -using System; +using HuanMeng.StableDiffusion.TextGeneration.api; + +using System; using System.Collections.Generic; using System.Linq; using System.Text; @@ -11,7 +13,7 @@ namespace HuanMeng.StableDiffusion.TextGeneration.Abstractions /// public abstract class TextGenerationRequestAbstract { - + public TextGenerationModel textGenerationModel { get; set; } /// /// 发送数据 /// diff --git a/src/0-core/HuanMeng.StableDiffusion.TextGeneration/BLL/TextGenerationBLL.cs b/src/0-core/HuanMeng.StableDiffusion.TextGeneration/BLL/TextGenerationBLL.cs index ce38fc2..1b73872 100644 --- a/src/0-core/HuanMeng.StableDiffusion.TextGeneration/BLL/TextGenerationBLL.cs +++ b/src/0-core/HuanMeng.StableDiffusion.TextGeneration/BLL/TextGenerationBLL.cs @@ -26,26 +26,26 @@ namespace HuanMeng.StableDiffusion.TextGeneration.BLL /// /// /// - public async IAsyncEnumerable Chat(string sessionId, string message) + public async IAsyncEnumerable Chat(string sessionId, string message, string character) { if (string.IsNullOrEmpty(sessionId)) { sessionId = Guid.NewGuid().ToString(); } - var x = textGenerationTestContext.TextGenerationSessionDetails.Where(it => it.SessionId == sessionId).OrderBy(it => it.TimeStamp).ToList(); - List textGenerationRequestHttpApiModels = new List(); + var x = new List(); // textGenerationTestContext.TextGenerationSessionDetails.Where(it => it.SessionId == sessionId).OrderBy(it => it.TimeStamp).ToList(); + List textGenerationRequestHttpApiModels = new List(); if (textGenerationRequestHttpApiModels != null) { foreach (var item in x) { - textGenerationRequestHttpApiModels.Add(new TextGenerationRequestHttpApiModel + textGenerationRequestHttpApiModels.Add(new TextGenerationRequestHttpApiStreamModel { Role = item.Role, Content = item.Message }); } } - textGenerationRequestHttpApiModels.Add(new TextGenerationRequestHttpApiModel + textGenerationRequestHttpApiModels.Add(new TextGenerationRequestHttpApiStreamModel { Role = "user", Content = message @@ -65,30 +65,49 @@ namespace HuanMeng.StableDiffusion.TextGeneration.BLL TimeStamp = ((DateTimeOffset)DateTime.Now).ToUnixTimeSeconds(), TextGenerationSessionId = 0 }; - textGenerationTestContext.TextGenerationSessionDetails.Add(d); + //textGenerationTestContext.TextGenerationSessionDetails.Add(d); + string datex = ""; + if (!string.IsNullOrEmpty(character)) + { + datex = $@" ""character"":""{character}"" "; + } + // string json = $@" + //{{ + // ""messages"": {messageStr}, + // ""stream"": true, + // ""mode"": ""chat"", + // {datex} + //}} + //"; string json = $@" {{ ""messages"": {messageStr}, - ""stream"": true + ""mode"": ""chat"", + {datex} }} "; + //TextGenerationRequestHttpApiStream textGenerationRequestHttpApi = new TextGenerationRequestHttpApiStream(json); TextGenerationRequestHttpApi textGenerationRequestHttpApi = new TextGenerationRequestHttpApi(json); await foreach (var item in textGenerationRequestHttpApi.SendMessageAsync()) { + if (item == "") + { + continue; + } yield return item; } TextGenerationSessionDetail d1 = new TextGenerationSessionDetail() { CreateDateTime = DateTime.Now, - Message = textGenerationRequestHttpApi?.textGenerationRequestHttpModel?.Choices?[0]?.Delta?.Content ?? "", - Role = textGenerationRequestHttpApi?.textGenerationRequestHttpModel?.Choices?[0]?.Delta?.Role ?? "", - Model = textGenerationRequestHttpApi?.textGenerationRequestHttpModel?.Model ?? "", + Message = textGenerationRequestHttpApi?.textGenerationModel?.Content ?? "", + Role = textGenerationRequestHttpApi?.textGenerationModel?.Role ?? "", + Model = textGenerationRequestHttpApi?.textGenerationModel?.Model ?? "", SessionId = sessionId, TimeStamp = ((DateTimeOffset)DateTime.Now).ToUnixTimeSeconds(), TextGenerationSessionId = 0 }; - textGenerationTestContext.TextGenerationSessionDetails.Add(d1); - await textGenerationTestContext.SaveChangesAsync(); + //textGenerationTestContext.TextGenerationSessionDetails.Add(d1); + //await textGenerationTestContext.SaveChangesAsync(); } } } diff --git a/src/0-core/HuanMeng.StableDiffusion.TextGeneration/Models/TextGenerationTestContext.cs b/src/0-core/HuanMeng.StableDiffusion.TextGeneration/Models/TextGenerationTestContext.cs index 53a119d..f4bf897 100644 --- a/src/0-core/HuanMeng.StableDiffusion.TextGeneration/Models/TextGenerationTestContext.cs +++ b/src/0-core/HuanMeng.StableDiffusion.TextGeneration/Models/TextGenerationTestContext.cs @@ -39,14 +39,14 @@ public partial class TextGenerationTestContext : DbContext .HasComment("最后一次请求时间") .HasColumnType("datetime"); entity.Property(e => e.SessionId) - .HasMaxLength(32) + .HasMaxLength(64) .IsUnicode(false) .HasComment("绘画Id"); entity.Property(e => e.SessionName) .HasMaxLength(100) .HasComment("绘画名称"); entity.Property(e => e.UserId) - .HasMaxLength(32) + .HasMaxLength(64) .IsUnicode(false) .HasComment("用户Id"); }); @@ -66,7 +66,7 @@ public partial class TextGenerationTestContext : DbContext .HasMaxLength(50) .HasComment("角色"); entity.Property(e => e.SessionId) - .HasMaxLength(32) + .HasMaxLength(64) .IsUnicode(false) .HasComment("会话Id"); entity.Property(e => e.TextGenerationSessionId).HasComment("会话id"); diff --git a/src/0-core/HuanMeng.StableDiffusion.TextGeneration/api/TextGenerationModel.cs b/src/0-core/HuanMeng.StableDiffusion.TextGeneration/api/TextGenerationModel.cs new file mode 100644 index 0000000..a2e6620 --- /dev/null +++ b/src/0-core/HuanMeng.StableDiffusion.TextGeneration/api/TextGenerationModel.cs @@ -0,0 +1,48 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Text.Json.Serialization; +using System.Threading.Tasks; + +namespace HuanMeng.StableDiffusion.TextGeneration.api +{ + /// + /// + /// + public class TextGenerationModel + { + /// + /// 文本生成请求的唯一标识符。 + /// + + public string? Id { get; set; } + + /// + /// 返回的对象类型(例如,"text_completion")。 + /// + + public string? Object { get; set; } + + /// + /// 请求创建的时间戳。 + /// + + public long? Created { get; set; } + + /// + /// 用于文本生成的模型。 + /// + public string? Model { get; set; } + + /// + /// 文本内容 + /// + public string? Content { get; set; } + + /// + /// 角色 + /// + public string? Role { get; set; } + } +} diff --git a/src/0-core/HuanMeng.StableDiffusion.TextGeneration/api/TextGenerationRequestHttpApi.cs b/src/0-core/HuanMeng.StableDiffusion.TextGeneration/api/TextGenerationRequestHttpApi.cs index d8a199e..4c9654d 100644 --- a/src/0-core/HuanMeng.StableDiffusion.TextGeneration/api/TextGenerationRequestHttpApi.cs +++ b/src/0-core/HuanMeng.StableDiffusion.TextGeneration/api/TextGenerationRequestHttpApi.cs @@ -3,27 +3,27 @@ using Newtonsoft.Json; using System; +using System.Collections.Generic; +using System.Linq; using System.Net.Http.Headers; - +using System.Net.Http.Json; using System.Text; -using System.Text.Json.Serialization; using System.Text.RegularExpressions; - +using System.Threading.Tasks; namespace HuanMeng.StableDiffusion.TextGeneration.api { - /// - /// - /// public class TextGenerationRequestHttpApi : TextGenerationRequestAbstract { - public string Url = "http://117.50.182.144:5000/v1/chat/completions"; - string jsonContent = "{\"messages\":[{\"role\":\"user\",\"content\":\"你好?\"}],\"stream\":true}"; + //http://127.0.0.1:7860/ + public string Url = "http://127.0.0.1:5000/v1/chat/completions"; + //public string Url = "http://117.50.182.144:5000/v1/chat/completions"; + string jsonContent = "{\"messages\":[{\"role\":\"user\",\"content\":\"你好?\"}]}"; string analysisStr = "data:"; /// /// 请求内容 /// - public TextGenerationRequestHttpModel textGenerationRequestHttpModel { get; set; } + public TextGenerationRequestHttpApi(string jsonContent) { this.jsonContent = jsonContent; @@ -34,71 +34,32 @@ namespace HuanMeng.StableDiffusion.TextGeneration.api { // 设置请求头 httpClient.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json")); - //httpClient.DefaultRequestHeaders.Add("Content-Type", "application/json"); - var content = new StringContent(jsonContent, Encoding.UTF8, "application/json"); // 发送请求 using (var response = await httpClient.PostAsync(Url, content)) { if (response.IsSuccessStatusCode) { - // 获取响应流 - using (var stream = await response.Content.ReadAsStreamAsync()) - using (var reader = new System.IO.StreamReader(stream)) + var x = await response.Content.ReadFromJsonAsync(); + if (x != null) { - string textContent = ""; - // 持续读取流中的事件 - while (!reader.EndOfStream) + yield return x.Choices[0].Message.Content; + textGenerationModel = new TextGenerationModel() { - var line = await reader.ReadLineAsync(); - if (!string.IsNullOrEmpty(line)) - { - var index = line.IndexOf(analysisStr); - if (index > -1) - { - line = line.Substring(index + analysisStr.Length).Trim(); - } - if (!string.IsNullOrEmpty(line)) - { - var linex = JsonConvert.DeserializeObject(line); - if (linex != null) - { - textGenerationRequestHttpModel = linex; - textContent += linex?.Choices?[0].Delta?.Content ?? ""; - yield return linex?.Choices?[0].Delta?.Content ?? ""; - } - } - //yield return line; - } - } - if (textGenerationRequestHttpModel != null) - { - if (textGenerationRequestHttpModel?.Choices?.Length == 0) - { - textGenerationRequestHttpModel.Choices = new Choice[1] { new Choice() { Delta = new Delta() } }; - } - textGenerationRequestHttpModel.Choices[0].Delta.Content = textContent; - } + Id = x.Id, + Content = x.Choices[0].Message.Content, + Created = x.Created, + Model = x.Model, + Object = x.Object, + Role = x.Choices[0].Message.Role + }; } } - } + } - } - /// - /// 解析 - /// - /// - /// - public string DecodeUnicodeString(string input) - { - // 使用正则表达式匹配 \u 后面跟随的 4 个十六进制数字 - return Regex.Replace(input, @"\\u([0-9A-Fa-f]{4})", m => - { - return ((char)Convert.ToInt32(m.Groups[1].Value, 16)).ToString(); - }); - } } + } diff --git a/src/0-core/HuanMeng.StableDiffusion.TextGeneration/api/TextGenerationRequestHttpApiModel.cs b/src/0-core/HuanMeng.StableDiffusion.TextGeneration/api/TextGenerationRequestHttpApiModel.cs deleted file mode 100644 index 9fc0dc7..0000000 --- a/src/0-core/HuanMeng.StableDiffusion.TextGeneration/api/TextGenerationRequestHttpApiModel.cs +++ /dev/null @@ -1,25 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; - -namespace HuanMeng.StableDiffusion.TextGeneration.api -{ - /// - /// 消息内容 - /// - public class TextGenerationRequestHttpApiModel - { - /// - /// 角色 - /// - public string Role { get; set; } - - /// - /// 控制器 - /// - public string Content { get; set; } - } - -} diff --git a/src/0-core/HuanMeng.StableDiffusion.TextGeneration/api/TextGenerationRequestHttpApiStream.cs b/src/0-core/HuanMeng.StableDiffusion.TextGeneration/api/TextGenerationRequestHttpApiStream.cs new file mode 100644 index 0000000..d88a149 --- /dev/null +++ b/src/0-core/HuanMeng.StableDiffusion.TextGeneration/api/TextGenerationRequestHttpApiStream.cs @@ -0,0 +1,129 @@ +using HuanMeng.StableDiffusion.TextGeneration.Abstractions; + +using Newtonsoft.Json; + +using System; +using System.Data; +using System.Net.Http.Headers; + +using System.Text; +using System.Text.Json.Serialization; +using System.Text.RegularExpressions; + + +namespace HuanMeng.StableDiffusion.TextGeneration.api +{ + /// + /// + /// + public class TextGenerationRequestHttpApiStream : TextGenerationRequestAbstract + { + //http://127.0.0.1:7860/ + public string Url = "http://127.0.0.1:5000/v1/chat/completions"; + //public string Url = "http://117.50.182.144:5000/v1/chat/completions"; + string jsonContent = "{\"messages\":[{\"role\":\"user\",\"content\":\"你好?\"}],\"stream\":true}"; + string analysisStr = "data:"; + /// + /// 请求内容 + /// + public TextGenerationRequestHttpModel textGenerationRequestHttpModel { get; set; } + public TextGenerationRequestHttpApiStream(string jsonContent) + { + this.jsonContent = jsonContent; + } + public override async IAsyncEnumerable SendMessageAsync() + { + using (var httpClient = new HttpClient()) + { + // 设置请求头 + httpClient.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json")); + //httpClient.DefaultRequestHeaders.Add("Content-Type", "application/json"); + + var content = new StringContent(jsonContent, Encoding.UTF8, "application/json"); + // 发送请求 + using (var response = await httpClient.PostAsync(Url, content)) + { + if (response.IsSuccessStatusCode) + { + // 获取响应流 + using (var stream = await response.Content.ReadAsStreamAsync()) + using (var reader = new System.IO.StreamReader(stream)) + { + string textContent = ""; + + // 持续读取流中的事件 + while (!reader.EndOfStream) + { + string t = ""; + var line = await reader.ReadLineAsync(); + try + { + if (!string.IsNullOrEmpty(line)) + { + var index = line.IndexOf(analysisStr); + if (index > -1) + { + line = line.Substring(index + analysisStr.Length).Trim(); + } + if (!string.IsNullOrEmpty(line)) + { + var linex = JsonConvert.DeserializeObject(line); + if (linex != null) + { + textGenerationRequestHttpModel = linex; + textContent += linex?.Choices?[0].Delta?.Content ?? ""; + t = linex?.Choices?[0].Delta?.Content ?? ""; + } + } + //yield return line; + } + } + catch (Exception ex) + { + + + } + yield return t; + } + if (textGenerationRequestHttpModel != null) + { + if (textGenerationRequestHttpModel?.Choices?.Length == 0) + { + textGenerationRequestHttpModel.Choices = new TextGenerationRequestHttpApiChoice[1] { new TextGenerationRequestHttpApiChoice() { Delta = new Delta() } }; + } + textGenerationRequestHttpModel.Choices[0].Delta.Content = textContent; + + textGenerationModel = new TextGenerationModel() + { + Id = textGenerationRequestHttpModel.Id, + Content = textContent, + Created = textGenerationRequestHttpModel.Created, + Model = textGenerationRequestHttpModel.Model, + Object = textGenerationRequestHttpModel.Object, + Role = textGenerationRequestHttpModel?.Choices?[0]?.Delta?.Role ?? "" + }; + + } + } + } + + } + } + + } + + /// + /// 解析 + /// + /// + /// + public string DecodeUnicodeString(string input) + { + // 使用正则表达式匹配 \u 后面跟随的 4 个十六进制数字 + return Regex.Replace(input, @"\\u([0-9A-Fa-f]{4})", m => + { + return ((char)Convert.ToInt32(m.Groups[1].Value, 16)).ToString(); + }); + } + } +} diff --git a/src/0-core/HuanMeng.StableDiffusion.TextGeneration/api/TextGenerationRequestHttpApiStreamModel.cs b/src/0-core/HuanMeng.StableDiffusion.TextGeneration/api/TextGenerationRequestHttpApiStreamModel.cs new file mode 100644 index 0000000..d5b506f --- /dev/null +++ b/src/0-core/HuanMeng.StableDiffusion.TextGeneration/api/TextGenerationRequestHttpApiStreamModel.cs @@ -0,0 +1,82 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Text.Json.Serialization; +using System.Threading.Tasks; + +namespace HuanMeng.StableDiffusion.TextGeneration.api +{ + + /// + /// + /// + public class TextGenerationRequestHttpApiModel + { + /// + /// 文本生成请求的唯一标识符。 + /// + [JsonPropertyName("id")] + public string Id { get; set; } + + /// + /// 返回的对象类型(例如,"text_completion")。 + /// + [JsonPropertyName("object")] + public string Object { get; set; } + + /// + /// 请求创建的时间戳。 + /// + [JsonPropertyName("created")] + public int Created { get; set; } + + /// + /// 用于文本生成的模型。 + /// + [JsonPropertyName("model")] + public string Model { get; set; } + + /// + /// 包含生成文本和相关信息的选项数组。 + /// + [JsonPropertyName("choices")] + public TextGenerationRequestHttpApiChoiceExtend[] Choices { get; set; } + + /// + /// 请求的使用统计信息,包括令牌计数。 + /// + [JsonPropertyName("usage")] + public TextGenerationRequestHttpApiUsage Usage { get; set; } + } + + + public class TextGenerationRequestHttpApiChoiceExtend : TextGenerationRequestHttpApiChoice + { + /// + /// 包含生成文本的角色和内容的 delta 对象。 + /// + [JsonPropertyName("message")] + public Delta? Message { get; set; } + } + + + /// + /// 消息内容 + /// + public class TextGenerationRequestHttpApiStreamModel + { + /// + /// 角色 + /// + public string Role { get; set; } + + /// + /// 控制器 + /// + public string Content { get; set; } + } + + + +} diff --git a/src/0-core/HuanMeng.StableDiffusion.TextGeneration/api/TextGenerationRequestHttpModel.cs b/src/0-core/HuanMeng.StableDiffusion.TextGeneration/api/TextGenerationRequestHttpModel.cs index 9cc8c27..e4a23cc 100644 --- a/src/0-core/HuanMeng.StableDiffusion.TextGeneration/api/TextGenerationRequestHttpModel.cs +++ b/src/0-core/HuanMeng.StableDiffusion.TextGeneration/api/TextGenerationRequestHttpModel.cs @@ -41,16 +41,16 @@ namespace HuanMeng.StableDiffusion.TextGeneration.api /// 包含生成文本和相关信息的选项数组。 /// [JsonPropertyName("choices")] - public Choice[]? Choices { get; set; } + public TextGenerationRequestHttpApiChoice[]? Choices { get; set; } /// /// 请求的使用统计信息,包括令牌计数。 /// [JsonPropertyName("usage")] - public Usage? Usage { get; set; } + public TextGenerationRequestHttpApiUsage? Usage { get; set; } } - public class Usage + public class TextGenerationRequestHttpApiUsage { /// /// 提示中使用的令牌数。 @@ -73,7 +73,7 @@ namespace HuanMeng.StableDiffusion.TextGeneration.api /// /// 消息内容 /// - public class Choice + public class TextGenerationRequestHttpApiChoice { /// /// 返回列表中选项的索引。 diff --git a/src/2-api/TextGenerationApi/.config/dotnet-tools.json b/src/2-api/TextGenerationApi/.config/dotnet-tools.json new file mode 100644 index 0000000..4f257cf --- /dev/null +++ b/src/2-api/TextGenerationApi/.config/dotnet-tools.json @@ -0,0 +1,13 @@ +{ + "version": 1, + "isRoot": true, + "tools": { + "dotnet-ef": { + "version": "8.0.6", + "commands": [ + "dotnet-ef" + ], + "rollForward": false + } + } +} \ No newline at end of file diff --git a/src/2-api/TextGenerationApi/Controllers/TextGenerationApiController.cs b/src/2-api/TextGenerationApi/Controllers/TextGenerationApiController.cs index 2ca033e..17d1f8e 100644 --- a/src/2-api/TextGenerationApi/Controllers/TextGenerationApiController.cs +++ b/src/2-api/TextGenerationApi/Controllers/TextGenerationApiController.cs @@ -13,26 +13,112 @@ namespace TextGenerationApi.Controllers [ApiController] public class TextGenerationApiController(TextGenerationTestContext textGenerationTestContext) : ControllerBase { - [HttpPost] /// - /// 聊天接口 + /// 对话接口 /// - /// - /// + /// 消息 + /// 角色 + /// 会话Id /// - public async Task Chat(string sessionId, string message) + [HttpPost] + public async Task Chat(string? message, string? character = "Assistant", string? sessionId = "") { var outputStream = this.Response.Body; - TextGenerationBLL textGenerationBLL = new TextGenerationBLL(textGenerationTestContext); - await foreach (var item in textGenerationBLL.Chat(sessionId, message)) + Response.ContentType = "text/plain"; // 设置响应内容类型 + Response.StatusCode = 200; // 设置状态码 + try { - if (item == null) + TextGenerationBLL textGenerationBLL = new TextGenerationBLL(textGenerationTestContext); + await foreach (var item in textGenerationBLL.Chat(sessionId, message, character)) { - continue; + if (item == null) + { + continue; + } + await outputStream.WriteAsync(Encoding.UTF8.GetBytes(item)); + await outputStream.FlushAsync(); } - await outputStream.WriteAsync(Encoding.UTF8.GetBytes(item)); - await outputStream.FlushAsync(); } + catch (Exception ex) + { + await outputStream.WriteAsync(Encoding.UTF8.GetBytes(ex.Message)); + await outputStream.FlushAsync(); + + } + return new EmptyResult(); + //return StatusCode(200); // 表示响应已完成 + } + + + /// + /// 对话接口 + /// + /// 消息 + /// 角色 + /// 会话Id + /// + [HttpPost] + public async Task ChatStr(string? message, string? character = "Assistant", string? sessionId = "") + { + var outputStream = this.Response.Body; + string content = ""; + try + { + TextGenerationBLL textGenerationBLL = new TextGenerationBLL(textGenerationTestContext); + + await foreach (var item in textGenerationBLL.Chat(sessionId, message, character)) + { + content += item; + } + } + catch (Exception ex) + { + + content = ex.Message; + } + return content; + //return StatusCode(200); // 表示响应已完成 + } + + + /// + /// 对话接口 + /// + /// 会话Id + /// 消息 + /// 角色 + /// + [HttpPost] + public async Task IChat() + { + var outputStream = Response.Body; + + Response.ContentType = "text/plain"; // 设置响应内容类型 + Response.StatusCode = 200; // 设置状态码 + try + { + + TextGenerationBLL textGenerationBLL = new TextGenerationBLL(textGenerationTestContext); + await foreach (var item in textGenerationBLL.Chat("", "哈喽", "Assistant")) + { + if (item == null) + { + continue; + } + await outputStream.WriteAsync(Encoding.UTF8.GetBytes(item)); + await outputStream.FlushAsync(); + } + } + catch (Exception ex) + { + + + } + + //await outputStream.WriteAsync(Encoding.UTF8.GetBytes("aaaa")); + //await outputStream.FlushAsync(); + + return new EmptyResult(); } } } diff --git a/src/2-api/TextGenerationApi/Program.cs b/src/2-api/TextGenerationApi/Program.cs index 4de4235..adafb1f 100644 --- a/src/2-api/TextGenerationApi/Program.cs +++ b/src/2-api/TextGenerationApi/Program.cs @@ -34,8 +34,8 @@ builder.Services.AddSwaggerGen(); var app = builder.Build(); // Configure the HTTP request pipeline. -if (app.Environment.IsDevelopment()) -{ +//if (app.Environment.IsDevelopment()) +//{ app.UseSwagger(); app.UseSwaggerUI(c => { @@ -47,9 +47,9 @@ if (app.Environment.IsDevelopment()) //c.RoutePrefix = "swagger"; //c.SwaggerEndpoint("/swagger/v1/swagger.json", "Your API V1"); }); - //} -} - +//} +//} +app.MapGet("/", () => "请求成功").WithName("默认请求"); //app.UseHttpsRedirection(); //使用跨域 app.UseCors(_myAllowSpecificOrigins); diff --git a/src/9-test/HuanMeng.StableDiffusion.TextGenerationTests/api/TextGenerationRequestHttpApiTests.cs b/src/9-test/HuanMeng.StableDiffusion.TextGenerationTests/api/TextGenerationRequestHttpApiTests.cs index 07feda1..59d8332 100644 --- a/src/9-test/HuanMeng.StableDiffusion.TextGenerationTests/api/TextGenerationRequestHttpApiTests.cs +++ b/src/9-test/HuanMeng.StableDiffusion.TextGenerationTests/api/TextGenerationRequestHttpApiTests.cs @@ -14,7 +14,7 @@ namespace HuanMeng.StableDiffusion.TextGeneration.api.Tests [TestMethod()] public async Task SendMessageAsyncTest() { - TextGenerationRequestHttpApi textGenerationRequestHttpApi = new TextGenerationRequestHttpApi(); + TextGenerationRequestHttpApiStream textGenerationRequestHttpApi = new TextGenerationRequestHttpApi(); await foreach (var item in textGenerationRequestHttpApi.SendMessageAsync()) { Console.WriteLine(item);