From 9fc7233324cbed7579d282ff09c03b3505fe97d0 Mon Sep 17 00:00:00 2001 From: zpc Date: Mon, 12 Aug 2024 01:22:43 +0800 Subject: [PATCH] =?UTF-8?q?=E6=8F=90=E4=BA=A4=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../SensitiveWord/SensitiveWordFilter.cs | 6 +- .../HuanMeng.MiaoYu.Code/Cache/MiaoYuCache.cs | 7 +- .../Cache/MiaoYuDataEntityCache.cs | 19 ++- .../Cache/Special/CharacterEntityCache.cs | 8 +- .../HuanMeng.MiaoYu.Code/Chat/ChatBLL.cs | 108 +++++++++++----- .../Chat/Contract/BaseChatInfo.cs | 35 +++++ .../Chat/Minimax/MinimaxChat.cs | 97 ++++++++++++++ .../Chat/Minimax/MinimaxChatParams.cs | 122 ++++++++++++++++++ .../HuanMeng.MiaoYu.Code.csproj | 1 + .../DbSqlServer/Db_MiaoYu/MiaoYuContext.cs | 4 + .../DbSqlServer/Db_MiaoYu/T_Model_Config.cs | 20 +++ .../Dto/Character/CharacterCache.cs | 19 ++- .../Dto/Shop/ShopInfoDto.cs | 16 +-- .../Controllers/CategoryController.cs | 2 - .../Controllers/ChatController.cs | 3 - 15 files changed, 408 insertions(+), 59 deletions(-) create mode 100644 src/0-core/HuanMeng.MiaoYu.Code/Chat/Minimax/MinimaxChat.cs create mode 100644 src/0-core/HuanMeng.MiaoYu.Code/Chat/Minimax/MinimaxChatParams.cs diff --git a/src/0-core/HuanMeng.DotNetCore/TextCensor/SensitiveWord/SensitiveWordFilter.cs b/src/0-core/HuanMeng.DotNetCore/TextCensor/SensitiveWord/SensitiveWordFilter.cs index d697783..7994def 100644 --- a/src/0-core/HuanMeng.DotNetCore/TextCensor/SensitiveWord/SensitiveWordFilter.cs +++ b/src/0-core/HuanMeng.DotNetCore/TextCensor/SensitiveWord/SensitiveWordFilter.cs @@ -1,4 +1,5 @@ using System; +using System.Collections.Frozen; using System.Collections.Generic; using System.Linq; using System.Text; @@ -22,7 +23,10 @@ namespace HuanMeng.DotNetCore.TextCensor.SensitiveWord /// 存储子节点 /// public Dictionary Children { get; set; } - + /// + /// + /// + //public FrozenDictionary fChildren { get; set; } public TrieNode() { IsEnd = false; diff --git a/src/0-core/HuanMeng.MiaoYu.Code/Cache/MiaoYuCache.cs b/src/0-core/HuanMeng.MiaoYu.Code/Cache/MiaoYuCache.cs index 3078e6b..d2d05b0 100644 --- a/src/0-core/HuanMeng.MiaoYu.Code/Cache/MiaoYuCache.cs +++ b/src/0-core/HuanMeng.MiaoYu.Code/Cache/MiaoYuCache.cs @@ -113,7 +113,6 @@ namespace HuanMeng.MiaoYu.Code.Cache #endregion - #region 角色类型缓存表 @@ -227,7 +226,7 @@ namespace HuanMeng.MiaoYu.Code.Cache /// /// /// - public static CommonDataEntityCache GetMiaoYuDataEntityCache(CacheBase cacheBase) where T : class + public static CommonDataEntityCache GetMiaoYuDataEntityCache(CacheBase cacheBase, Expression> expWhere = null) where T : class { object cacheLock; var typeo = typeof(T); @@ -243,7 +242,7 @@ namespace HuanMeng.MiaoYu.Code.Cache cacheLock = new object(); CacheLockList[typeo] = cacheLock; } - return new MiaoYuDataEntityCache(cacheBase, cacheLock); + return new MiaoYuDataEntityCache(cacheBase, cacheLock, expWhere: expWhere); } /// /// 获取缓存数据 @@ -277,7 +276,7 @@ namespace HuanMeng.MiaoYu.Code.Cache var obj = SpecialCacheLockList[typeof(CharacterCache)]; CharacterEntityCache characterEntityCache = new CharacterEntityCache(miaoYuBase, obj); characterEntityCache.ClearData(); - var dictionaryInfo= miaoYuBase.DictionaryInfo; + var dictionaryInfo = miaoYuBase.DictionaryInfo; var _dictionaryInfo = dictionaryInfo as ICacheClearData; if (_dictionaryInfo != null) { diff --git a/src/0-core/HuanMeng.MiaoYu.Code/Cache/MiaoYuDataEntityCache.cs b/src/0-core/HuanMeng.MiaoYu.Code/Cache/MiaoYuDataEntityCache.cs index faf8e4c..d3d0c63 100644 --- a/src/0-core/HuanMeng.MiaoYu.Code/Cache/MiaoYuDataEntityCache.cs +++ b/src/0-core/HuanMeng.MiaoYu.Code/Cache/MiaoYuDataEntityCache.cs @@ -5,15 +5,22 @@ using HuanMeng.MiaoYu.Code.DataAccess; using Microsoft.EntityFrameworkCore; +using System.Linq.Expressions; + namespace HuanMeng.MiaoYu.Code.Cache { /// - /// 妙语数据库实体类缓存 + /// 妙语数据库实体类缓存 /// - public class MiaoYuDataEntityCache(CacheBase cacheBase, object lockObj, int cacheTime = 36000) + /// + /// + /// + /// + /// + public class MiaoYuDataEntityCache(CacheBase cacheBase, object lockObj, int cacheTime = 36000, Expression> expWhere = null) : CommonDataEntityCache(lockObj, cacheTime) where T : class { - public DataAccess.DAO _dao = cacheBase.Dao; + public DataAccess.DAO _dao = cacheBase.Dao; /// /// 缓存的key /// @@ -21,7 +28,7 @@ namespace HuanMeng.MiaoYu.Code.Cache { get { - return $"{_dao.daoDbMiaoYu.context.TenantInfo?.TenantId}:MiaoYu:{typeof(T).Name}"; + return $"Cache:{_dao.daoDbMiaoYu.context.TenantInfo?.TenantId}:MiaoYu:{typeof(T).Name}"; } } /// @@ -36,6 +43,10 @@ namespace HuanMeng.MiaoYu.Code.Cache { return new List(); } + if (expWhere != null) + { + dbSet = dbSet.Where(expWhere); + } return dbSet.ToList(); } } diff --git a/src/0-core/HuanMeng.MiaoYu.Code/Cache/Special/CharacterEntityCache.cs b/src/0-core/HuanMeng.MiaoYu.Code/Cache/Special/CharacterEntityCache.cs index 08b776e..d157f7b 100644 --- a/src/0-core/HuanMeng.MiaoYu.Code/Cache/Special/CharacterEntityCache.cs +++ b/src/0-core/HuanMeng.MiaoYu.Code/Cache/Special/CharacterEntityCache.cs @@ -59,9 +59,13 @@ namespace HuanMeng.MiaoYu.Code.Cache.Special foreach (var characterCache in characterCaches) { var modelConfig = modelConfigs.FirstOrDefault(it => it.Id == characterCache.ModelConfigId); - if (modelConfig==null) + if (modelConfig == null) { - modelConfig= modelConfigs.FirstOrDefault(); + modelConfig = modelConfigs.FirstOrDefault(it => it.IsDefabult ?? false); + } + if (modelConfig == null) + { + modelConfig = modelConfigs.FirstOrDefault(); } if (modelConfig != null) { diff --git a/src/0-core/HuanMeng.MiaoYu.Code/Chat/ChatBLL.cs b/src/0-core/HuanMeng.MiaoYu.Code/Chat/ChatBLL.cs index 4304b90..651c27f 100644 --- a/src/0-core/HuanMeng.MiaoYu.Code/Chat/ChatBLL.cs +++ b/src/0-core/HuanMeng.MiaoYu.Code/Chat/ChatBLL.cs @@ -3,8 +3,10 @@ using HuanMeng.MiaoYu.Code.Cache; using HuanMeng.MiaoYu.Code.Chat.Claude; using HuanMeng.MiaoYu.Code.Chat.Claude.Model; using HuanMeng.MiaoYu.Code.Chat.Contract; +using HuanMeng.MiaoYu.Code.Chat.Minimax; using HuanMeng.MiaoYu.Code.Users; using HuanMeng.MiaoYu.Model.DbSqlServer.Db_MiaoYu; +using HuanMeng.MiaoYu.Model.Dto.Character; using HuanMeng.MiaoYu.Model.Dto.Chat; using HuanMeng.MiaoYu.Model.EnumModel.Chat; using HuanMeng.MiaoYu.Model.EnumModel.User; @@ -16,6 +18,8 @@ using Microsoft.EntityFrameworkCore.Storage; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Logging; +using Newtonsoft.Json.Linq; + using System; using System.Collections; using System.Collections.Generic; @@ -175,8 +179,8 @@ namespace HuanMeng.MiaoYu.Code.Chat chatListDto.ChatList = chatMessageDtos; return new BaseResponse(ResonseCode.Success, "", chatListDto); } - - + + var charact = MiaoYuCache.CharacterList.FirstOrDefault(it => it.Id == characterId); if (charact == null) { @@ -264,37 +268,20 @@ namespace HuanMeng.MiaoYu.Code.Chat }; - #endregion - #region 调用api - ClaudeChatChatParams baseChatParams = new ClaudeChatChatParams(); - baseChatParams.Messages = mess.ToArray(); - baseChatParams.System = charact.System; - baseChatParams.MaxTokens = charact.ModelConfig.MaxTokens; - var claude = charact.ModelConfig.GetClaudeChatConfig(); - IChat chat = new ClaudeChat(claude, HttpClientFactory); - var response = await chat.MessagesAsync(baseChatParams); - if (response == null) - { - throw new Exception("ai出现错误"); - } - var claudeChatResponse = response as ClaudeChatResponse; - if (claudeChatResponse == null) - { - throw new Exception("ai返回出现错误"); - } #endregion - T_Chat t_Chat = new T_Chat + var claudeChatResponse = await Chat(charact, mess); + var t_Chat = new T_Chat { CharacterId = charact.Id, ClaudeModel = claudeChatResponse.Model, ClaudeId = claudeChatResponse.Id, - ClaudeType = claudeChatResponse.Content[0]?.Type, - Content = claudeChatResponse.Content[0]?.Text, + ClaudeType = "text", + Content = claudeChatResponse.Message, CreateTime = DateTime.Now, - Input_tokens = claudeChatResponse.Usage.InputTokens, - Output_tokens = claudeChatResponse.Usage.OutputTokens, - Role = claudeChatResponse.Role, + Input_tokens = claudeChatResponse.InputTokens, + Output_tokens = claudeChatResponse.OutputTokens, + Role = ChatRole.assistant.ToString(), SendDateDay = int.Parse(DateTime.Now.ToString("yyyyMMdd")), SendMessageDay = DateTime.Now.ToUnixTimestamp(), SessionId = userChatSession.SessionId, @@ -303,9 +290,8 @@ namespace HuanMeng.MiaoYu.Code.Chat Type = 0, UpdateTime = DateTime.Now, UserId = _UserId, - Tokens = claudeChatResponse.Usage.OutputTokens + Tokens = claudeChatResponse.OutputTokens }; - #region 开启事务 using (IDbContextTransaction transaction = Dao.daoDbMiaoYu.context.Database.BeginTransaction()) { @@ -313,17 +299,21 @@ namespace HuanMeng.MiaoYu.Code.Chat { if (charact.Token == null || charact.Token == 0) { - charact.Token = (int)(claudeChatResponse.Usage.InputTokens - (message.Length * 2)); + charact.Token = (int)(claudeChatResponse.InputTokens - (message.Length * 2)); + if (charact.Token <= 0) + { + charact.Token = claudeChatResponse.Message.Length * 2; + } var t_Character = await Dao.daoDbMiaoYu.context.T_Character.FirstOrDefaultAsync(it => it.Id == charact.Id); if (t_Character != null) { t_Character.Token = charact.Token; } } - t_Chat1.Tokens = claudeChatResponse.Usage.InputTokens - charact.Token; - t_Chat1.Input_tokens = claudeChatResponse.Usage.InputTokens; + t_Chat1.Tokens = claudeChatResponse.InputTokens - charact.Token; + t_Chat1.Input_tokens = claudeChatResponse.InputTokens; //设置消耗的总token - userChatSession.TotalToken += claudeChatResponse.Usage.InputTokens + claudeChatResponse.Usage.OutputTokens; + userChatSession.TotalToken += claudeChatResponse.InputTokens + claudeChatResponse.OutputTokens; Dao.daoDbMiaoYu.context.Add(t_Chat1); Dao.daoDbMiaoYu.context.Add(t_Chat); //最后一次聊天时间 @@ -356,7 +346,7 @@ namespace HuanMeng.MiaoYu.Code.Chat ChatMessageDto chatMessageDto = new ChatMessageDto() { ClaudeType = ChatMessageType.text.ToString(), - Content = claudeChatResponse.Content[0].Text, + Content = claudeChatResponse.Message, Role = ChatRole.assistant.ToString(), Timestamp = DateTime.Now, UserIcon = charact.IconImage, @@ -384,6 +374,58 @@ namespace HuanMeng.MiaoYu.Code.Chat return new BaseResponse(ResonseCode.Success, "", chatListDto); } + public async Task Chat(CharacterCache? charact, List mess) + { + if (charact.ModelConfig.ModelName.Contains("minimaxi")) + { + var chat = new MinimaxChat(HttpClientFactory); + MinimaxChatParams minimaxChatParams = new MinimaxChatParams(mess, charact, charact.Name); + return await chat.MessagesAsync(minimaxChatParams); + } + else + { + return await ClaudeChat(charact, mess); + } + } + + /// + /// + /// + /// + /// + /// + /// + /// + /// + private async Task ClaudeChat(CharacterCache? charact, List mess) + { + #region 调用api + ClaudeChatChatParams baseChatParams = new ClaudeChatChatParams(); + baseChatParams.Messages = mess.ToArray(); + baseChatParams.System = charact.System; + baseChatParams.MaxTokens = charact.ModelConfig.MaxTokens; + var claude = charact.ModelConfig.GetClaudeChatConfig(); + IChat chat = new ClaudeChat(claude, HttpClientFactory); + var response = await chat.MessagesAsync(baseChatParams); + if (response == null) + { + throw new Exception("ai出现错误"); + } + var claudeChatResponse = response as ClaudeChatResponse; + if (claudeChatResponse == null) + { + throw new Exception("ai返回出现错误"); + } + #endregion + claudeChatResponse.TotalTokens = claudeChatResponse.Usage.OutputTokens + claudeChatResponse.Usage.InputTokens; + claudeChatResponse.InputTokens = claudeChatResponse.Usage.InputTokens; + claudeChatResponse.OutputTokens = claudeChatResponse.Usage.OutputTokens; + claudeChatResponse.Message = claudeChatResponse.Content[0].Text; + + + return claudeChatResponse; + } + /// /// 通过递归判断聊天是否满足 /// diff --git a/src/0-core/HuanMeng.MiaoYu.Code/Chat/Contract/BaseChatInfo.cs b/src/0-core/HuanMeng.MiaoYu.Code/Chat/Contract/BaseChatInfo.cs index 7cbfe33..f0b50b2 100644 --- a/src/0-core/HuanMeng.MiaoYu.Code/Chat/Contract/BaseChatInfo.cs +++ b/src/0-core/HuanMeng.MiaoYu.Code/Chat/Contract/BaseChatInfo.cs @@ -1,3 +1,5 @@ +using Newtonsoft.Json; + using System; using System.Collections.Generic; using System.Linq; @@ -11,5 +13,38 @@ namespace HuanMeng.MiaoYu.Code.Chat.Contract /// public class BaseChatInfo { + /// + /// 消息 ID + /// + public virtual string Id { get; set; } + + /// + /// 模型 + /// + public virtual string Model { get; set; } + + /// + /// 消息类型 + /// + public virtual string Type { get; set; } + + /// + /// 总token + /// + public virtual int TotalTokens { get; set; } + + /// + /// 消息内容 + /// + public virtual string Message { get; set; } + + /// + /// 输入token + /// + public virtual int InputTokens { get; set; } + /// + /// 输出token + /// + public virtual int OutputTokens { get; set; } } } diff --git a/src/0-core/HuanMeng.MiaoYu.Code/Chat/Minimax/MinimaxChat.cs b/src/0-core/HuanMeng.MiaoYu.Code/Chat/Minimax/MinimaxChat.cs new file mode 100644 index 0000000..3546607 --- /dev/null +++ b/src/0-core/HuanMeng.MiaoYu.Code/Chat/Minimax/MinimaxChat.cs @@ -0,0 +1,97 @@ +using HuanMeng.MiaoYu.Code.Chat.Claude; +using HuanMeng.MiaoYu.Code.Chat.Contract; + +using System; +using System.Collections.Generic; +using System.Linq; +using System.Net.Http.Headers; +using System.Net.Http; +using System.Text; +using System.Threading.Tasks; +using Newtonsoft.Json.Linq; +using Microsoft.EntityFrameworkCore.Metadata.Internal; + +namespace HuanMeng.MiaoYu.Code.Chat.Minimax +{ + /// + /// + /// + /// + public class MinimaxChat(IHttpClientFactory factory) : IChat + { + public async Task MessagesAsync(BaseChatParams chatParams) + { + var param = chatParams as MinimaxChatParams; + if (param == null) + { + throw new ArgumentNullException("请求错误"); + } + + using var httpClient = factory.CreateClient(); + httpClient.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json")); + if (param.Headers != null) + { + foreach (var header in param.Headers) + { + httpClient.DefaultRequestHeaders.Add(header.Key, header.Value); + } + } + BaseChatInfo baseChatInfo = new BaseChatInfo(); + var content = new StringContent(param.RequestBody, Encoding.UTF8, "application/json"); + var response = await httpClient.PostAsync(param.Model_Config.Url, content); + if (response != null && response.IsSuccessStatusCode) + { + var responseContent = await response.Content.ReadAsStringAsync(); + if (responseContent != null) + { + if (param.ResponseConten != null) + { + var responseJobject = JObject.Parse(responseContent); + var message = GetResponseContent("messgae", param, responseJobject); + var model = GetResponseContent("model", param, responseJobject); + var total_tokens = GetResponseContent("total_tokens", param, responseJobject); + var id = GetResponseContent("id", param, responseJobject); + baseChatInfo.Message = message; + baseChatInfo.Model = model; + baseChatInfo.InputTokens = param.Message.Length * 2; + baseChatInfo.OutputTokens = message.Length * 2; + if (!string.IsNullOrEmpty(total_tokens)) + { + if (int.TryParse(total_tokens, out var count)) + { + baseChatInfo.TotalTokens = count; + } + } + else + { + baseChatInfo.TotalTokens = baseChatInfo.InputTokens + baseChatInfo.OutputTokens; + } + + + baseChatInfo.Id = id; + } + } + } + return baseChatInfo; + } + + private string GetResponseContent(string parmat, MinimaxChatParams? param, JObject responseJobject) + { + if (responseJobject != null) + { + if (param.ResponseConten?.TryGetValue(parmat, out var messgae) ?? false) + { + var mes = responseJobject.SelectToken(messgae).ToString(); + return mes; + }; + } + + return ""; + } + + public IAsyncEnumerable MessagesStreamAsync(BaseChatParams chatParams) + { + throw new NotImplementedException(); + } + } +} diff --git a/src/0-core/HuanMeng.MiaoYu.Code/Chat/Minimax/MinimaxChatParams.cs b/src/0-core/HuanMeng.MiaoYu.Code/Chat/Minimax/MinimaxChatParams.cs new file mode 100644 index 0000000..5734174 --- /dev/null +++ b/src/0-core/HuanMeng.MiaoYu.Code/Chat/Minimax/MinimaxChatParams.cs @@ -0,0 +1,122 @@ +using HuanMeng.MiaoYu.Code.Chat.Claude; +using HuanMeng.MiaoYu.Code.Chat.Contract; +using HuanMeng.MiaoYu.Model.DbSqlServer.Db_MiaoYu; +using HuanMeng.MiaoYu.Model.Dto.Character; +using HuanMeng.MiaoYu.Model.EnumModel.Chat; + +using Newtonsoft.Json; +using Newtonsoft.Json.Linq; + +using System; +using System.Collections.Generic; +using System.Linq; +using System.Reflection.PortableExecutable; +using System.Runtime.InteropServices.JavaScript; +using System.Text; +using System.Threading.Tasks; + +namespace HuanMeng.MiaoYu.Code.Chat.Minimax +{ + /// + /// + /// + public class MinimaxChatParams : BaseChatParams + { + public string Message { get; set; } + /// + /// + /// + /// + /// + /// + public MinimaxChatParams(List messages, CharacterCache character, string botName) + { + this.Model_Config = character.ModelConfig; + // + if (!string.IsNullOrEmpty(Model_Config.HeadersTemplate)) + { + + this.Headers = JsonConvert.DeserializeObject>(Model_Config.HeadersTemplate) ?? new Dictionary(); + } + Message = messages[messages.Count - 1].Content; + if (!string.IsNullOrEmpty(Model_Config.RequestTemplate)) + { + var assistant = ChatRole.assistant.ToString(); + var user = ChatRole.user.ToString(); + List minimaxChatMessages = new List(); + messages.ForEach(message => + { + MinimaxChatMessage minimaxChatMessage = new MinimaxChatMessage(); + minimaxChatMessage.Text = message.Content; + if (message.Role == assistant) + { + minimaxChatMessage.SenderType = "BOT"; + } + else if (message.Role == user) + { + minimaxChatMessage.SenderType = "USER"; + } + minimaxChatMessages.Add(minimaxChatMessage); + + }); + var mess = JsonConvert.SerializeObject(minimaxChatMessages); + + var systemp = Model_Config.RequestTemplate + .Replace("${messages}", mess) + .Replace("${bot_name}", botName) + ; + var jobj = JObject.Parse(systemp); + foreach (var item in jobj) + { + if (item.Value?.Type == JTokenType.String) + { + var prompt = item.Value?.ToString() ?? ""; + if (prompt.Contains("${prompt}")) + { + jobj[item.Key] = prompt.Replace("${prompt}", character.System); + } + } + + + } + systemp = JsonConvert.SerializeObject(jobj); + //.Replace("${prompt}", cc["prompt"].ToString()) + + this.RequestBody = systemp; + } + if (!string.IsNullOrEmpty(character.ModelConfig.ResponseTemplate)) + { + this.ResponseConten = JsonConvert.DeserializeObject>(Model_Config.ResponseTemplate) ?? new Dictionary(); + } + } + /// + /// + /// + public T_Model_Config Model_Config { get; set; } + + /// + /// 请求标头 + /// + public Dictionary? Headers { get; set; } + + /// + /// 请求体 + /// + public string RequestBody { get; set; } + + /// + /// 请求返回结果 + /// + public Dictionary? ResponseConten { get; set; } + } + /// + /// + /// + public class MinimaxChatMessage + { + [JsonProperty("sender_type")] + public string SenderType { get; set; } + [JsonProperty("text")] + public string Text; + } +} diff --git a/src/0-core/HuanMeng.MiaoYu.Code/HuanMeng.MiaoYu.Code.csproj b/src/0-core/HuanMeng.MiaoYu.Code/HuanMeng.MiaoYu.Code.csproj index 3407612..ecff960 100644 --- a/src/0-core/HuanMeng.MiaoYu.Code/HuanMeng.MiaoYu.Code.csproj +++ b/src/0-core/HuanMeng.MiaoYu.Code/HuanMeng.MiaoYu.Code.csproj @@ -24,6 +24,7 @@ + diff --git a/src/0-core/HuanMeng.MiaoYu.Model/DbSqlServer/Db_MiaoYu/MiaoYuContext.cs b/src/0-core/HuanMeng.MiaoYu.Model/DbSqlServer/Db_MiaoYu/MiaoYuContext.cs index a207f6f..973c217 100644 --- a/src/0-core/HuanMeng.MiaoYu.Model/DbSqlServer/Db_MiaoYu/MiaoYuContext.cs +++ b/src/0-core/HuanMeng.MiaoYu.Model/DbSqlServer/Db_MiaoYu/MiaoYuContext.cs @@ -548,6 +548,8 @@ public partial class MiaoYuContext : MultiTenantDbContext//DbContext entity.Property(e => e.CreateTime) .HasComment("创建时间") .HasColumnType("datetime"); + entity.Property(e => e.HeadersTemplate).HasComment("headers对象"); + entity.Property(e => e.IsDefabult).HasComment("是否默认"); entity.Property(e => e.MaxTokens).HasComment("模型运行最大的max_tokens"); entity.Property(e => e.Model) .HasMaxLength(50) @@ -555,6 +557,8 @@ public partial class MiaoYuContext : MultiTenantDbContext//DbContext entity.Property(e => e.ModelName) .HasMaxLength(50) .HasComment("模型名称"); + entity.Property(e => e.RequestTemplate).HasComment("请求模板"); + entity.Property(e => e.ResponseTemplate).HasComment("返回数据模板"); entity.Property(e => e.SystemTemplate).HasComment("system上下文模板"); entity.Property(e => e.TenantId).HasComment("租户"); entity.Property(e => e.UpdateTime) diff --git a/src/0-core/HuanMeng.MiaoYu.Model/DbSqlServer/Db_MiaoYu/T_Model_Config.cs b/src/0-core/HuanMeng.MiaoYu.Model/DbSqlServer/Db_MiaoYu/T_Model_Config.cs index 9c503e4..49fbcf1 100644 --- a/src/0-core/HuanMeng.MiaoYu.Model/DbSqlServer/Db_MiaoYu/T_Model_Config.cs +++ b/src/0-core/HuanMeng.MiaoYu.Model/DbSqlServer/Db_MiaoYu/T_Model_Config.cs @@ -55,4 +55,24 @@ public partial class T_Model_Config: MultiTenantEntity /// system上下文模板 /// public virtual string? SystemTemplate { get; set; } + + /// + /// 请求模板 + /// + public virtual string? RequestTemplate { get; set; } + + /// + /// headers对象 + /// + public virtual string? HeadersTemplate { get; set; } + + /// + /// 返回数据模板 + /// + public virtual string? ResponseTemplate { get; set; } + + /// + /// 是否默认 + /// + public virtual bool? IsDefabult { get; set; } } diff --git a/src/0-core/HuanMeng.MiaoYu.Model/Dto/Character/CharacterCache.cs b/src/0-core/HuanMeng.MiaoYu.Model/Dto/Character/CharacterCache.cs index 9e139db..8e02267 100644 --- a/src/0-core/HuanMeng.MiaoYu.Model/Dto/Character/CharacterCache.cs +++ b/src/0-core/HuanMeng.MiaoYu.Model/Dto/Character/CharacterCache.cs @@ -106,6 +106,21 @@ namespace HuanMeng.MiaoYu.Model.Dto.Character } #endregion private string? _system = null; + public string GenderStr + { + get + { + if(this.Gender == 0) + { + return "男"; + } + if (this.Gender == 1) + { + return "女"; + } + return "其它"; + } + } /// /// 上下文 /// @@ -121,8 +136,8 @@ namespace HuanMeng.MiaoYu.Model.Dto.Character _system = ModelConfig.SystemTemplate ?? ""; _system = _system .Replace("{assistant}", this.Name) //ai角色名称 - .Replace("{user}", this.UserName) //用户角色名称 - .Replace("{sex}", this.Gender == 0 ? "男" : "女") //角色 + .Replace("{user}", "我") //用户角色名称 + .Replace("{sex}", GenderStr) //角色 .Replace("{biography}", this.Biography) //提示词 简介 .Replace("{personality}", this.PersonalityStr) //性格 .Replace("{prologue}", this.Prologue) //剧情 diff --git a/src/0-core/HuanMeng.MiaoYu.Model/Dto/Shop/ShopInfoDto.cs b/src/0-core/HuanMeng.MiaoYu.Model/Dto/Shop/ShopInfoDto.cs index 96485f7..83bf252 100644 --- a/src/0-core/HuanMeng.MiaoYu.Model/Dto/Shop/ShopInfoDto.cs +++ b/src/0-core/HuanMeng.MiaoYu.Model/Dto/Shop/ShopInfoDto.cs @@ -37,10 +37,10 @@ namespace HuanMeng.MiaoYu.Model.Dto.Shop ///// //public int PropId { get; set; } - ///// - ///// 道具名称 - ///// - //public string PropName { get; set; } + /// + /// 道具名称 + /// + public string PropName { get; set; } /// /// 道具剩余数量 @@ -63,10 +63,10 @@ namespace HuanMeng.MiaoYu.Model.Dto.Shop public int PriceType { get; set; } - ///// - ///// 图片地址 - ///// - //public string ImgUrl { get; set; } + /// + /// 图片地址 + /// + public string ImgUrl { get; set; } } /// diff --git a/src/2-api/HuanMeng.MiaoYu.WebApi/Controllers/CategoryController.cs b/src/2-api/HuanMeng.MiaoYu.WebApi/Controllers/CategoryController.cs index 652d80c..2718589 100644 --- a/src/2-api/HuanMeng.MiaoYu.WebApi/Controllers/CategoryController.cs +++ b/src/2-api/HuanMeng.MiaoYu.WebApi/Controllers/CategoryController.cs @@ -61,8 +61,6 @@ namespace HuanMeng.MiaoYu.WebApi.Controllers public BaseResponse>> GetCategoryFindList() { CategoryBLL categoryBLL = new CategoryBLL(ServiceProvider); - //var x = categoryBLL.GetRecommendList(); - //var json = JsonConvert.SerializeObject(x); return categoryBLL.GetRecommendList(); } } diff --git a/src/2-api/HuanMeng.MiaoYu.WebApi/Controllers/ChatController.cs b/src/2-api/HuanMeng.MiaoYu.WebApi/Controllers/ChatController.cs index 46515c6..05b7677 100644 --- a/src/2-api/HuanMeng.MiaoYu.WebApi/Controllers/ChatController.cs +++ b/src/2-api/HuanMeng.MiaoYu.WebApi/Controllers/ChatController.cs @@ -58,9 +58,6 @@ namespace HuanMeng.MiaoYu.WebApi.Controllers CharacterBLL characterBLL = new CharacterBLL(ServiceProvider); var obj = await characterBLL.GetCharacterInfo(requestCharacterInfo); return obj; - - //var obj = JsonConvert.DeserializeObject>("[{\"Icon\":\"\",\"Intimacy\":10,\"CharacterIdModel\":2,\"CharacterName\":\"许荷姻\",\"Gender\":1,\"LookCount\":2,\"BgUrl\":\"\",\"Biography\":\"你那商业联姻得来的妻子,原本的天才女孩,聪明伶俐,生的漂亮、端庄,不知贵圈多少人梦寐以求的存在。\",\"Prologue\":\"坐在轮椅上,眼神平静的看着你,语气也同样平静)你回来了。饭菜在桌上,我刚刚热了。(说到这,又垂下眸子道)我还做了碗醒酒汤,记得喝\",\"Label\":[{\"CharacterIdModel\":1,\"Name\":\"美女\"},{\"CharacterIdModel\":2,\"Name\":\"二次元\"}],\"RemainingChatCount\":1}]"); - //return new BaseResponse>(ResonseCode.Success, "", obj); } ///