diff --git a/aibotPro/aibotPro/.config/dotnet-tools.json b/aibotPro/aibotPro/.config/dotnet-tools.json deleted file mode 100644 index d9d129c..0000000 --- a/aibotPro/aibotPro/.config/dotnet-tools.json +++ /dev/null @@ -1,12 +0,0 @@ -{ - "version": 1, - "isRoot": true, - "tools": { - "dotnet-ef": { - "version": "8.0.3", - "commands": [ - "dotnet-ef" - ] - } - } -} \ No newline at end of file diff --git a/aibotPro/aibotPro/AppCode/WorkflowEngine.cs b/aibotPro/aibotPro/AppCode/WorkflowEngine.cs index 54af73e..8851fea 100644 --- a/aibotPro/aibotPro/AppCode/WorkflowEngine.cs +++ b/aibotPro/aibotPro/AppCode/WorkflowEngine.cs @@ -15,6 +15,7 @@ using Spire.Presentation; using Spire.Presentation.Charts; using StackExchange.Redis; +using System; using System.Diagnostics; using System.Security.AccessControl; using System.Security.Principal; @@ -42,7 +43,8 @@ public class WorkflowEngine private readonly IServiceProvider _serviceProvider; private readonly IHubContext _hubContext; private readonly IRedisService _redisService; - public WorkflowEngine(WorkFlowNodeData workflowData, IAiServer aiServer, ISystemService systemService, IFinanceService financeService, AIBotProContext context, string account, IServiceProvider serviceProvider, IHubContext hubContext, string chatId, string senMethod, IRedisService redisService) + private readonly IMilvusService _milvusService; + public WorkflowEngine(WorkFlowNodeData workflowData, IAiServer aiServer, ISystemService systemService, IFinanceService financeService, AIBotProContext context, string account, IServiceProvider serviceProvider, IHubContext hubContext, string chatId, string senMethod, IRedisService redisService, IMilvusService milvusService) { _workflowData = workflowData; _aiServer = aiServer; @@ -55,6 +57,7 @@ public WorkflowEngine(WorkFlowNodeData workflowData, IAiServer aiServer, ISystem _chatId = chatId; _senMethod = senMethod; _redisService = redisService; + _milvusService = milvusService; } public async Task> Execute(string startNodeOutput) { @@ -194,7 +197,20 @@ private async Task> ExecuteFlow(string startNodeOutput) { if (!string.IsNullOrEmpty(nodeOutput.OutputData)) { - result.Add(nodeOutput); + // 查找是否已经有相同NodeName的NodeOutput + var existingItem = result.FirstOrDefault(no => no.NodeName == nodeOutput.NodeName); + + if (existingItem != null) + { + // 如果存在,替换旧的NodeOutput + int index = result.IndexOf(existingItem); + result[index] = nodeOutput; + } + else + { + // 如果不存在,添加新的NodeOutput到列表 + result.Add(nodeOutput); + } } } } @@ -659,7 +675,7 @@ private async Task ProcessDALLNode(NodeData node, List r string savePath = Path.Combine("wwwroot", "files/dallres", _account); await _aiServer.DownloadImageAsync(airesult, savePath, newFileName); var aiSaveService = scope.ServiceProvider.GetRequiredService(); // 假设保存记录方法在IAiSaveService中。 - await aiSaveService.SaveAiDrawResult(_account, "DALLE3", imgResPath, "workflow_Engine", "workflow_Engine"); + await aiSaveService.SaveAiDrawResult(_account, "DALLE3", imgResPath, prompt, "workflow_Engine"); } }); nodeOutput.NodeName = nodeName + nodeId; @@ -734,7 +750,7 @@ private async Task ProcessDALLsmNode(NodeData node, List string savePath = Path.Combine("wwwroot", "files/dallres", _account); await _aiServer.DownloadImageAsync(airesult, savePath, newFileName); var aiSaveService = scope.ServiceProvider.GetRequiredService(); // 假设保存记录方法在IAiSaveService中。 - await aiSaveService.SaveAiDrawResult(_account, "DALLE2", imgResPath, "workflow_Engine", "workflow_Engine"); + await aiSaveService.SaveAiDrawResult(_account, "DALLE2", imgResPath, prompt, "workflow_Engine"); } }); nodeOutput.NodeName = nodeName + nodeId; @@ -882,7 +898,32 @@ private async Task ProcessKonwledgeNode(NodeData node, List typeCode = knowledgeData.Output.TypeCode; + //SearchVectorResult searchVectorResult = vectorHelper.SearchVector(searchVectorPr); + SearchVectorResult searchVectorResult = new SearchVectorResult(); + if (typeCode != null && typeCode.Count > 0) + { + List vectorByMilvus = searchVectorPr.vector.ConvertAll(x => (float)x); + var resultByMilvus = await _milvusService.SearchVector(vectorByMilvus, _account, typeCode, searchVectorPr.topk); + searchVectorResult = new SearchVectorResult + { + code = resultByMilvus.Code, + request_id = Guid.NewGuid().ToString(), + message = string.Empty, + output = resultByMilvus.Data.Select(data => new Output + { + id = data.Id, + fields = new Fields + { + account = string.Empty, + knowledge = data.VectorContent + }, + score = (double)data.Distance + }).ToList() + }; + } + else + searchVectorResult = vectorHelper.SearchVector(searchVectorPr); string data = string.Empty; if (searchVectorResult.output != null) { diff --git a/aibotPro/aibotPro/Controllers/OpenAPIController.cs b/aibotPro/aibotPro/Controllers/OpenAPIController.cs index 556bd58..e18994e 100644 --- a/aibotPro/aibotPro/Controllers/OpenAPIController.cs +++ b/aibotPro/aibotPro/Controllers/OpenAPIController.cs @@ -153,13 +153,13 @@ public async Task Completions() //不是会员且余额为0时不提供服务 if (!isVip && user.Mcoin <= 0) { - throw new Exception("本站已停止向【非会员且余额为0】的用户提供服务,您可以前往充值1元及以上,长期使用本站的免费服务"); + return Ok("本站已停止向【非会员且余额为0】的用户提供服务,您可以前往充值1元及以上,长期使用本站的免费服务"); } // 检查用户余额是否不足,只有在需要收费时检查 if (shouldCharge && user.Mcoin <= 0) { - throw new Exception("余额不足,请充值后再使用,您可以前往充值"); + return Ok("余额不足,请充值后再使用,您可以前往充值"); } //记录系统使用日志 await _systemService.WriteLog($"用户调用API:{chatSession.Model}", Dtos.LogLevel.Info, Account); @@ -167,11 +167,11 @@ public async Task Completions() aImodels = _systemService.GetWorkShopAImodel(); if (aImodels == null || aImodels.Count == 0) { - throw new Exception("模型不存在"); + return Ok("模型不存在"); } if (aImodels.Where(x => x.ModelName == chatSession.Model).FirstOrDefault() == null) { - throw new Exception("模型不存在"); + return Ok("模型不存在"); } OpenAiOptions openAiOptions = new OpenAiOptions(); openAiOptions.BaseDomain = aImodels.Where(x => x.ModelName == chatSession.Model).FirstOrDefault().BaseUrl; @@ -330,6 +330,10 @@ await response.Body.WriteAsync(msgBytes, await response.Body.FlushAsync();// 确保立即发送消息 output += chatCompletionResponse.Choices[0].delta.Content; } + else + { + return Ok("模型未回复,请重试"); + } var tools = choice.Message.ToolCalls; if (tools != null) { @@ -348,7 +352,7 @@ await response.Body.WriteAsync(msgBytes, case "dalle3": if (!string.IsNullOrEmpty(pluginResDto.errormsg) || string.IsNullOrEmpty(pluginResDto.result)) { - throw new Exception("Draw Fail"); + return Ok("Draw Fail"); } res = $"绘制完成 图片地址:{pluginResDto.result}"; break; @@ -465,6 +469,8 @@ await response.Body.WriteAsync(msgBytes, if (completionResult.Successful) { var choice = completionResult.Choices.First(); + if (choice == null || choice.Message == null) + return Ok("模型未回复,请重试"); if (choice.Message.ToolCalls != null && choice.Message.ToolCalls[0].FunctionCall != null) { var fn = choice.Message.ToolCalls[0].FunctionCall; @@ -479,7 +485,7 @@ await response.Body.WriteAsync(msgBytes, case "dalle3": if (!string.IsNullOrEmpty(pluginResDto.errormsg) || string.IsNullOrEmpty(pluginResDto.result)) { - throw new Exception("Draw Fail"); + return Ok("Draw Fail"); } res = $"绘制完成 图片地址:{pluginResDto.result}"; break; @@ -579,11 +585,12 @@ await response.Body.WriteAsync(msgBytes, } } } - throw new Exception("Error"); + return Ok("error"); } catch (Exception e) { - throw e; + await _systemService.WriteLog(e.Message, Dtos.LogLevel.Error, "system"); + return Ok(e.Message); } } diff --git a/aibotPro/aibotPro/Dtos/WorkFlowNodeData.cs b/aibotPro/aibotPro/Dtos/WorkFlowNodeData.cs index 02881fb..16d6dd5 100644 --- a/aibotPro/aibotPro/Dtos/WorkFlowNodeData.cs +++ b/aibotPro/aibotPro/Dtos/WorkFlowNodeData.cs @@ -302,6 +302,8 @@ public class Konwledge public int Retry { get; set; } [JsonProperty("topk")] public int TopK { get; set; } + [JsonProperty("typecode")] + public List TypeCode { get; set; } } public class EndOutput { diff --git a/aibotPro/aibotPro/Properties/PublishProfiles/FolderProfile.pubxml b/aibotPro/aibotPro/Properties/PublishProfiles/FolderProfile.pubxml index a083666..199d856 100644 --- a/aibotPro/aibotPro/Properties/PublishProfiles/FolderProfile.pubxml +++ b/aibotPro/aibotPro/Properties/PublishProfiles/FolderProfile.pubxml @@ -4,7 +4,7 @@ https://go.microsoft.com/fwlink/?LinkID=208121. --> - false + true false true Debug diff --git a/aibotPro/aibotPro/Properties/PublishProfiles/FolderProfile.pubxml.user b/aibotPro/aibotPro/Properties/PublishProfiles/FolderProfile.pubxml.user index b732e8b..d54ddb1 100644 --- a/aibotPro/aibotPro/Properties/PublishProfiles/FolderProfile.pubxml.user +++ b/aibotPro/aibotPro/Properties/PublishProfiles/FolderProfile.pubxml.user @@ -5,7 +5,7 @@ https://go.microsoft.com/fwlink/?LinkID=208121. <_PublishTargetUrl>D:\VSdemoPush\AIBotPRO - True|2024-05-21T02:16:47.1933621Z;True|2024-05-18T02:23:05.6515039+08:00;True|2024-05-18T00:33:34.5095168+08:00;True|2024-05-14T23:45:15.9030381+08:00;True|2024-05-14T19:00:55.6341074+08:00;True|2024-05-14T17:13:52.5478701+08:00;True|2024-05-13T04:25:12.5467049+08:00;True|2024-05-13T01:44:02.2096068+08:00;True|2024-05-13T01:41:40.6658374+08:00;True|2024-05-13T01:22:05.9513321+08:00;True|2024-05-13T01:21:47.0411709+08:00;True|2024-05-12T20:41:21.4625449+08:00;True|2024-05-12T01:25:49.3741757+08:00;True|2024-05-11T00:36:33.6900336+08:00;True|2024-05-11T00:35:42.7046391+08:00;True|2024-05-10T00:20:15.0395526+08:00;True|2024-05-09T01:24:19.0631611+08:00;True|2024-05-09T00:43:51.4199517+08:00;True|2024-05-08T00:28:09.9518881+08:00;True|2024-05-08T00:23:13.4558043+08:00;True|2024-05-08T00:07:59.7680181+08:00;True|2024-05-02T01:03:14.6311716+08:00;True|2024-04-29T02:22:08.4746665+08:00;True|2024-04-29T00:17:38.5035250+08:00;True|2024-04-28T23:59:28.9917647+08:00;True|2024-04-26T00:10:27.7445249+08:00;True|2024-04-23T01:30:37.6768866+08:00;True|2024-04-23T00:48:14.5734865+08:00;True|2024-04-23T00:11:21.2642059+08:00;True|2024-04-17T22:03:14.0209432+08:00;True|2024-04-16T23:31:45.4904127+08:00;True|2024-04-13T19:21:59.0302533+08:00;True|2024-04-13T18:58:28.9264697+08:00;True|2024-04-13T05:33:26.4813048+08:00;True|2024-04-13T05:13:20.9770193+08:00;True|2024-04-10T02:24:18.6295740+08:00;True|2024-04-10T00:39:48.6198222+08:00;True|2024-04-08T00:24:19.4359801+08:00;True|2024-04-07T23:50:43.6071658+08:00;True|2024-04-07T01:12:26.5533469+08:00;True|2024-04-07T00:43:56.5552998+08:00;True|2024-04-07T00:39:21.3379439+08:00;True|2024-04-06T17:21:04.3043952+08:00;True|2024-04-05T02:55:32.9429986+08:00;True|2024-04-04T04:07:41.2501774+08:00;True|2024-04-04T03:53:10.8291446+08:00;True|2024-04-03T22:43:45.5710990+08:00;True|2024-04-03T00:10:26.4855901+08:00;True|2024-04-02T23:33:44.5375815+08:00;True|2024-04-02T02:07:31.8671366+08:00;True|2024-04-02T01:57:06.9534372+08:00;True|2024-04-02T00:36:02.0548374+08:00;True|2024-04-02T00:15:55.8075496+08:00;True|2024-04-01T23:57:31.1397373+08:00;True|2024-04-01T23:52:36.9511083+08:00;True|2024-04-01T23:40:50.9679343+08:00;True|2024-03-25T22:59:45.7135876+08:00;True|2024-03-25T01:37:33.2347496+08:00;True|2024-03-21T01:10:45.8809381+08:00;True|2024-03-20T23:42:34.4221941+08:00;True|2024-03-19T22:19:17.3268675+08:00;True|2024-03-19T22:15:25.0722518+08:00;True|2024-03-19T22:08:15.4905716+08:00;True|2024-03-19T01:04:44.9760500+08:00;True|2024-03-17T23:39:34.0352088+08:00;True|2024-03-17T08:31:23.5063725+08:00;True|2024-03-17T06:37:59.4183114+08:00;True|2024-03-17T06:37:27.0050941+08:00;True|2024-03-17T06:32:51.6628157+08:00;True|2024-03-17T06:03:58.9767100+08:00;True|2024-03-17T05:09:18.9285417+08:00;True|2024-03-17T05:03:51.1403040+08:00;True|2024-03-15T21:54:20.7306218+08:00;True|2024-03-15T02:27:06.3007171+08:00;True|2024-03-15T02:18:16.5382941+08:00;True|2024-03-15T02:16:34.5159231+08:00;True|2024-03-15T01:47:40.6505319+08:00;True|2024-03-15T01:38:52.4149526+08:00;True|2024-03-13T22:26:16.3031907+08:00;True|2024-03-13T17:22:18.3512709+08:00;True|2024-03-13T10:21:25.5131621+08:00;True|2024-03-11T17:34:04.8687102+08:00;True|2024-03-11T17:26:27.3873869+08:00;True|2024-03-08T17:17:06.8450054+08:00;True|2024-03-08T11:37:37.1180423+08:00;True|2024-03-07T15:56:21.1999674+08:00;True|2024-03-05T01:10:10.0710862+08:00;True|2024-03-04T14:01:44.6177022+08:00;True|2024-03-03T19:55:06.1013727+08:00;True|2024-03-03T18:15:37.8484692+08:00;True|2024-03-03T12:21:48.1679155+08:00;True|2024-03-03T00:16:48.7641081+08:00;True|2024-03-02T04:52:08.4562277+08:00;True|2024-03-02T04:40:24.4469334+08:00;True|2024-03-02T04:19:45.9907382+08:00;True|2024-03-02T03:44:02.2101754+08:00;True|2024-03-02T03:41:50.6931359+08:00;True|2024-03-02T02:25:10.1162115+08:00;True|2024-03-02T02:21:16.3141505+08:00;True|2024-03-01T19:01:47.7699379+08:00; + True|2024-05-25T18:46:44.7140982Z;True|2024-05-26T02:46:14.2619095+08:00;True|2024-05-24T18:14:25.7273450+08:00;True|2024-05-24T17:20:32.0801007+08:00;True|2024-05-24T01:43:51.2645313+08:00;True|2024-05-23T18:52:51.9569553+08:00;True|2024-05-23T18:52:23.8576708+08:00;True|2024-05-23T18:49:36.0410836+08:00;True|2024-05-23T17:57:52.3867879+08:00;True|2024-05-23T17:33:35.3307943+08:00;True|2024-05-21T10:16:47.1933621+08:00;True|2024-05-18T02:23:05.6515039+08:00;True|2024-05-18T00:33:34.5095168+08:00;True|2024-05-14T23:45:15.9030381+08:00;True|2024-05-14T19:00:55.6341074+08:00;True|2024-05-14T17:13:52.5478701+08:00;True|2024-05-13T04:25:12.5467049+08:00;True|2024-05-13T01:44:02.2096068+08:00;True|2024-05-13T01:41:40.6658374+08:00;True|2024-05-13T01:22:05.9513321+08:00;True|2024-05-13T01:21:47.0411709+08:00;True|2024-05-12T20:41:21.4625449+08:00;True|2024-05-12T01:25:49.3741757+08:00;True|2024-05-11T00:36:33.6900336+08:00;True|2024-05-11T00:35:42.7046391+08:00;True|2024-05-10T00:20:15.0395526+08:00;True|2024-05-09T01:24:19.0631611+08:00;True|2024-05-09T00:43:51.4199517+08:00;True|2024-05-08T00:28:09.9518881+08:00;True|2024-05-08T00:23:13.4558043+08:00;True|2024-05-08T00:07:59.7680181+08:00;True|2024-05-02T01:03:14.6311716+08:00;True|2024-04-29T02:22:08.4746665+08:00;True|2024-04-29T00:17:38.5035250+08:00;True|2024-04-28T23:59:28.9917647+08:00;True|2024-04-26T00:10:27.7445249+08:00;True|2024-04-23T01:30:37.6768866+08:00;True|2024-04-23T00:48:14.5734865+08:00;True|2024-04-23T00:11:21.2642059+08:00;True|2024-04-17T22:03:14.0209432+08:00;True|2024-04-16T23:31:45.4904127+08:00;True|2024-04-13T19:21:59.0302533+08:00;True|2024-04-13T18:58:28.9264697+08:00;True|2024-04-13T05:33:26.4813048+08:00;True|2024-04-13T05:13:20.9770193+08:00;True|2024-04-10T02:24:18.6295740+08:00;True|2024-04-10T00:39:48.6198222+08:00;True|2024-04-08T00:24:19.4359801+08:00;True|2024-04-07T23:50:43.6071658+08:00;True|2024-04-07T01:12:26.5533469+08:00;True|2024-04-07T00:43:56.5552998+08:00;True|2024-04-07T00:39:21.3379439+08:00;True|2024-04-06T17:21:04.3043952+08:00;True|2024-04-05T02:55:32.9429986+08:00;True|2024-04-04T04:07:41.2501774+08:00;True|2024-04-04T03:53:10.8291446+08:00;True|2024-04-03T22:43:45.5710990+08:00;True|2024-04-03T00:10:26.4855901+08:00;True|2024-04-02T23:33:44.5375815+08:00;True|2024-04-02T02:07:31.8671366+08:00;True|2024-04-02T01:57:06.9534372+08:00;True|2024-04-02T00:36:02.0548374+08:00;True|2024-04-02T00:15:55.8075496+08:00;True|2024-04-01T23:57:31.1397373+08:00;True|2024-04-01T23:52:36.9511083+08:00;True|2024-04-01T23:40:50.9679343+08:00;True|2024-03-25T22:59:45.7135876+08:00;True|2024-03-25T01:37:33.2347496+08:00;True|2024-03-21T01:10:45.8809381+08:00;True|2024-03-20T23:42:34.4221941+08:00;True|2024-03-19T22:19:17.3268675+08:00;True|2024-03-19T22:15:25.0722518+08:00;True|2024-03-19T22:08:15.4905716+08:00;True|2024-03-19T01:04:44.9760500+08:00;True|2024-03-17T23:39:34.0352088+08:00;True|2024-03-17T08:31:23.5063725+08:00;True|2024-03-17T06:37:59.4183114+08:00;True|2024-03-17T06:37:27.0050941+08:00;True|2024-03-17T06:32:51.6628157+08:00;True|2024-03-17T06:03:58.9767100+08:00;True|2024-03-17T05:09:18.9285417+08:00;True|2024-03-17T05:03:51.1403040+08:00;True|2024-03-15T21:54:20.7306218+08:00;True|2024-03-15T02:27:06.3007171+08:00;True|2024-03-15T02:18:16.5382941+08:00;True|2024-03-15T02:16:34.5159231+08:00;True|2024-03-15T01:47:40.6505319+08:00;True|2024-03-15T01:38:52.4149526+08:00;True|2024-03-13T22:26:16.3031907+08:00;True|2024-03-13T17:22:18.3512709+08:00;True|2024-03-13T10:21:25.5131621+08:00;True|2024-03-11T17:34:04.8687102+08:00;True|2024-03-11T17:26:27.3873869+08:00;True|2024-03-08T17:17:06.8450054+08:00;True|2024-03-08T11:37:37.1180423+08:00;True|2024-03-07T15:56:21.1999674+08:00;True|2024-03-05T01:10:10.0710862+08:00;True|2024-03-04T14:01:44.6177022+08:00;True|2024-03-03T19:55:06.1013727+08:00;True|2024-03-03T18:15:37.8484692+08:00; \ No newline at end of file diff --git a/aibotPro/aibotPro/Service/AiServer.cs b/aibotPro/aibotPro/Service/AiServer.cs index 2833753..96c4e95 100644 --- a/aibotPro/aibotPro/Service/AiServer.cs +++ b/aibotPro/aibotPro/Service/AiServer.cs @@ -222,6 +222,7 @@ public List GetChatHistories(string account, string chatId, int his //写入缓存 _redis.SetAsync(chatId, JsonConvert.SerializeObject(chatHistories), TimeSpan.FromHours(1)); } + chatHistories = chatHistories.OrderBy(x => x.CreateTime).ToList(); //使用historyCount截取chatHistories,因为chatHistories是双行的所以要乘以2 if (chatHistories.Count > historyCount * 2) chatHistories = chatHistories.Skip(chatHistories.Count - historyCount * 2).Take(historyCount * 2).ToList(); @@ -293,7 +294,8 @@ public List ShowHistoryDetail(string account, string chatId) List chatHistories = new List(); //从数据库加载 chatHistories = _context.ChatHistories - .Where(x => x.ChatId == chatId && x.IsDel == 0 && x.Account == account).ToList(); + .Where(x => x.ChatId == chatId && x.IsDel == 0 && x.Account == account) + .OrderBy(y => y.CreateTime).ToList(); //写入缓存 _redis.SetAsync(chatId, JsonConvert.SerializeObject(chatHistories), TimeSpan.FromHours(1)); diff --git a/aibotPro/aibotPro/Service/KnowledgeService.cs b/aibotPro/aibotPro/Service/KnowledgeService.cs index 7817cca..7747f04 100644 --- a/aibotPro/aibotPro/Service/KnowledgeService.cs +++ b/aibotPro/aibotPro/Service/KnowledgeService.cs @@ -3,6 +3,7 @@ using aibotPro.Models; using Newtonsoft.Json; using Newtonsoft.Json.Linq; +using NuGet.Packaging; using RestSharp; using StackExchange.Redis; using System.Collections; @@ -313,7 +314,7 @@ private async Task> CutFile(string content, string processType, str else if (processType == "DoubleNewline")// 双换行符切片 { // 使用正则表达式匹配所有类型的双重换行符进行分割,并去除空白项。 - var blocks = Regex.Split(content, @"(\r?\n){2}") + var blocks = Regex.Split(content, @"\r?\n\r?\n") .Select(block => block.Trim().Replace("\r", "").Replace("\n", "").Replace("\"", "“")) .Where(block => !string.IsNullOrWhiteSpace(block)); @@ -323,16 +324,12 @@ private async Task> CutFile(string content, string processType, str { try { - Regex regex = new Regex(processType); - var matches = regex.Matches(content); + Regex regex = new Regex(processType, RegexOptions.Singleline); + MatchCollection matches = regex.Matches(content); foreach (Match match in matches) { - string value = match.Value.Trim().Replace("\"", "“"); - if (!string.IsNullOrWhiteSpace(value)) - { - chunkList.Add(value); - } + chunkList.Add(match.Value.Replace("\r", "").Replace("\n", "").Replace("\"", "“")); } } catch (ArgumentException ex) @@ -364,28 +361,38 @@ public async Task, string>>> StringToVectorByMilvusA await semaphore.WaitAsync(); //等待可用的并发插槽 tasks.Add(Task.Run(async () => { - try + int retryCount = 0; + const int maxRetryCount = 3; // 最大重试次数 + while (retryCount < maxRetryCount) { - var request = CreateRequest(model, input, embeddingsapikey); - var response = await client.ExecuteAsync(request); - Interlocked.Increment(ref completeCount); - List vector = ParseResponse(response); - if (vector != null) + try + { + var request = CreateRequest(model, input, embeddingsapikey); + var response = await client.ExecuteAsync(request); + if (response.IsSuccessful) + { + Interlocked.Increment(ref completeCount); + List vector = ParseResponse(response); + Dictionary, string> pairs = new Dictionary, string>(); + pairs.Add(vector, input); + return pairs; + } + else + { + retryCount++; + } + } + catch (Exception ex) { - Dictionary, string> pairs = new Dictionary, string>(); - pairs.Add(vector, input); - return pairs; + retryCount++; } - else + finally { - return null; + await _redisService.SetAsync($"knowledge_{fileCode}", $"{((double)completeCount / totalCount * 100).ToString("F2")}"); + semaphore.Release(); } } - finally - { - semaphore.Release(); - await _redisService.SetAsync($"knowledge_{fileCode}", $"{((double)completeCount / totalCount * 100).ToString("F2")}");// 在释放并发资源的时候更新完成的任务数 - } + return null; // 重试达到上限后返回null })); } @@ -435,18 +442,35 @@ private async Task>> StringToQA(string model, List inputs, await semaphore.WaitAsync(); //等待可用的并发插槽 tasks.Add(Task.Run(async () => { - try + int retryCount = 0; + const int maxRetryCount = 3; // 最大重试次数 + while (retryCount < maxRetryCount) { - var request = CreateQARequest(model, input, embeddingsapikey); - var response = await client.ExecuteAsync(request); - Interlocked.Increment(ref completeCount); - return ParseQAResponse(response); - } - finally - { - semaphore.Release(); - await _redisService.SetAsync($"knowledge_{fileCode}", $"{((double)completeCount / totalCount * 100).ToString("F2")}");// 在释放并发资源的时候更新完成的任务数 + try + { + var request = CreateQARequest(model, input, embeddingsapikey); + var response = await client.ExecuteAsync(request); + if (response.IsSuccessful) + { + Interlocked.Increment(ref completeCount); + return ParseQAResponse(response); + } + else + { + retryCount++; + } + } + catch (Exception ex) + { + retryCount++; + } + finally + { + semaphore.Release(); + await _redisService.SetAsync($"knowledge_{fileCode}", $"{((double)completeCount / totalCount * 100).ToString("F2")}");// 在释放并发资源的时候更新完成的任务数 + } } + return null; // 重试达到上限后返回null })); } diff --git a/aibotPro/aibotPro/Service/WorkShopService.cs b/aibotPro/aibotPro/Service/WorkShopService.cs index fd38d3e..40b5f2b 100644 --- a/aibotPro/aibotPro/Service/WorkShopService.cs +++ b/aibotPro/aibotPro/Service/WorkShopService.cs @@ -806,7 +806,7 @@ public async Task RunPlugin(string account, FunctionCall fn, strin { startOutputJson = "{}"; } - WorkflowEngine workflowEngine = new WorkflowEngine(workFlowNodeData, _aiServer, _systemService, _financeService, _context, account, _serviceProvider, _hubContext, chatId, senMethod, _redisService); + WorkflowEngine workflowEngine = new WorkflowEngine(workFlowNodeData, _aiServer, _systemService, _financeService, _context, account, _serviceProvider, _hubContext, chatId, senMethod, _redisService, _milvusService); List workflowResult = await workflowEngine.Execute(startOutputJson); //查询工作流结束模式 var endNodeData = (EndData)workFlowNodeData.Drawflow.Home.Data.Values.FirstOrDefault(x => x.Name == "end").Data; diff --git a/aibotPro/aibotPro/Views/Shared/_Layout.cshtml b/aibotPro/aibotPro/Views/Shared/_Layout.cshtml index 61559dc..6b3b239 100644 --- a/aibotPro/aibotPro/Views/Shared/_Layout.cshtml +++ b/aibotPro/aibotPro/Views/Shared/_Layout.cshtml @@ -260,12 +260,12 @@ 对话 (Chat by 知识库) - - 知识库管理(Management) + @* + 知识库管理(Management) - 知识库构建(Build) - + 知识库构建(Build) + *@ Milvus知识库构建(Milvus) diff --git a/aibotPro/aibotPro/aibotPro.csproj.user b/aibotPro/aibotPro/aibotPro.csproj.user index 2f437f9..66a7e35 100644 --- a/aibotPro/aibotPro/aibotPro.csproj.user +++ b/aibotPro/aibotPro/aibotPro.csproj.user @@ -11,7 +11,7 @@ MvcControllerEmptyScaffolder root/Common/MVC/Controller ~/Views/Shared/_Layout.cshtml - D:\AIBotPro\AIBot-Pro-Public\AIBotPublic\aibotPro\aibotPro\Properties\PublishProfiles\FolderProfile1.pubxml + D:\VSdemo\lenvo-MayMayBlog\MayMayAIBot_Pro\AIBot-Pro-Public\AIBotPublic\aibotPro\aibotPro\Properties\PublishProfiles\FolderProfile1.pubxml ProjectDebugger diff --git a/aibotPro/aibotPro/wwwroot/static/css/cassie.css b/aibotPro/aibotPro/wwwroot/static/css/cassie.css index 58d2537..850df29 100644 --- a/aibotPro/aibotPro/wwwroot/static/css/cassie.css +++ b/aibotPro/aibotPro/wwwroot/static/css/cassie.css @@ -72400,7 +72400,7 @@ button.bg-twitter:focus, } .chat-message-box img { - width: 100%; + width: 350px; } .chat-message-box p { diff --git a/aibotPro/aibotPro/wwwroot/system/js/javascript.min.js b/aibotPro/aibotPro/wwwroot/system/js/javascript.min.js new file mode 100644 index 0000000..96baeb0 --- /dev/null +++ b/aibotPro/aibotPro/wwwroot/system/js/javascript.min.js @@ -0,0 +1 @@ +!function(e){"object"==typeof exports&&"object"==typeof module?e(require("../../lib/codemirror")):"function"==typeof define&&define.amd?define(["../../lib/codemirror"],e):e(CodeMirror)}(function(nt){"use strict";nt.defineMode("javascript",function(e,l){var t,r,n,a,f=e.indentUnit,d=l.statementIndent,i=l.jsonld,o=l.json||i,c=!1!==l.trackScope,u=l.typescript,p=l.wordCharacters||/[\w$\xa1-\uffff]/,s=(t=m("keyword a"),r=m("keyword b"),n=m("keyword c"),a=m("keyword d"),e=m("operator"),{if:m("if"),while:t,with:t,else:r,do:r,try:r,finally:r,return:a,break:a,continue:a,new:m("new"),delete:n,void:n,throw:n,debugger:m("debugger"),var:m("var"),const:m("var"),let:m("var"),function:m("function"),catch:m("catch"),for:m("for"),switch:m("switch"),case:m("case"),default:m("default"),in:e,typeof:e,instanceof:e,true:e={type:"atom",style:"atom"},false:e,null:e,undefined:e,NaN:e,Infinity:e,this:m("this"),class:m("class"),super:m("atom"),yield:n,export:m("export"),import:m("import"),extends:n,await:n});function m(e){return{type:e,style:"keyword"}}var k,v,y=/[+\-*&%=<>!?|~^@]/,w=/^@(context|id|value|language|type|container|list|set|reverse|index|base|vocab|graph)"/;function b(e,t,r){return k=e,v=r,t}function x(e,t){var a,r=e.next();if('"'==r||"'"==r)return t.tokenize=(a=r,function(e,t){var r,n=!1;if(i&&"@"==e.peek()&&e.match(w))return t.tokenize=x,b("jsonld-keyword","meta");for(;null!=(r=e.next())&&(r!=a||n);)n=!n&&"\\"==r;return n||(t.tokenize=x),b("string","string")}),t.tokenize(e,t);if("."==r&&e.match(/^\d[\d_]*(?:[eE][+\-]?[\d_]+)?/))return b("number","number");if("."==r&&e.match(".."))return b("spread","meta");if(/[\[\]{}\(\),;\:\.]/.test(r))return b(r);if("="==r&&e.eat(">"))return b("=>","operator");if("0"==r&&e.match(/^(?:x[\dA-Fa-f_]+|o[0-7_]+|b[01_]+)n?/))return b("number","number");if(/\d/.test(r))return e.match(/^[\d_]*(?:n|(?:\.[\d_]*)?(?:[eE][+\-]?[\d_]+)?)?/),b("number","number");if("/"==r)return e.eat("*")?(t.tokenize=h)(e,t):e.eat("/")?(e.skipToEnd(),b("comment","comment")):rt(e,t,1)?(function(e){for(var t,r=!1,n=!1;null!=(t=e.next());){if(!r){if("/"==t&&!n)return;"["==t?n=!0:n&&"]"==t&&(n=!1)}r=!r&&"\\"==t}}(e),e.match(/^\b(([gimyus])(?![gimyus]*\2))+\b/),b("regexp","string-2")):(e.eat("="),b("operator","operator",e.current()));if("`"==r)return(t.tokenize=g)(e,t);if("#"==r&&"!"==e.peek())return e.skipToEnd(),b("meta","meta");if("#"==r&&e.eatWhile(p))return b("variable","property");if("<"==r&&e.match("!--")||"-"==r&&e.match("->")&&!/\S/.test(e.string.slice(0,e.start)))return e.skipToEnd(),b("comment","comment");if(y.test(r))return">"==r&&t.lexical&&">"==t.lexical.type||(e.eat("=")?"!"!=r&&"="!=r||e.eat("="):/[<>*+\-|&?]/.test(r)&&(e.eat(r),">"==r&&e.eat(r))),"?"==r&&e.eat(".")?b("."):b("operator","operator",e.current());if(p.test(r)){e.eatWhile(p);r=e.current();if("."!=t.lastType){if(s.propertyIsEnumerable(r)){t=s[r];return b(t.type,t.style,r)}if("async"==r&&e.match(/^(\s|\/\*([^*]|\*(?!\/))*?\*\/)*[\[\(\w]/,!1))return b("async","keyword",r)}return b("variable","variable",r)}}function h(e,t){for(var r,n=!1;r=e.next();){if("/"==r&&n){t.tokenize=x;break}n="*"==r}return b("comment","comment")}function g(e,t){for(var r,n=!1;null!=(r=e.next());){if(!n&&("`"==r||"$"==r&&e.eat("{"))){t.tokenize=x;break}n=!n&&"\\"==r}return b("quasi","string-2",e.current())}var j="([{}])";function M(e,t){t.fatArrowAt&&(t.fatArrowAt=null);var r,n=e.string.indexOf("=>",e.start);if(!(n<0)){!u||(r=/:\s*(?:\w+(?:<[^>]*>|\[\])?|\{[^}]*\})\s*$/.exec(e.string.slice(e.start,n)))&&(n=r.index);for(var a=0,i=!1,o=n-1;0<=o;--o){var c=e.string.charAt(o),s=j.indexOf(c);if(0<=s&&s<3){if(!a){++o;break}if(0==--a){"("==c&&(i=!0);break}}else if(3<=s&&s<6)++a;else if(p.test(c))i=!0;else if(/["'\/`]/.test(c))for(;;--o){if(0==o)return;if(e.string.charAt(o-1)==c&&"\\"!=e.string.charAt(o-2)){o--;break}}else if(i&&!a){++o;break}}i&&!a&&(t.fatArrowAt=o)}}var A={atom:!0,number:!0,variable:!0,string:!0,regexp:!0,this:!0,import:!0,"jsonld-keyword":!0};function V(e,t,r,n,a,i){this.indented=e,this.column=t,this.type=r,this.prev=a,this.info=i,null!=n&&(this.align=n)}function E(e,t,r,n,a){var i=e.cc;for(z.state=e,z.stream=a,z.marked=null,z.cc=i,z.style=t,e.lexical.hasOwnProperty("align")||(e.lexical.align=!0);;)if((i.length?i.pop():o?G:H)(r,n)){for(;i.length&&i[i.length-1].lex;)i.pop()();return z.marked?z.marked:"variable"==r&&function(e,t){if(c){for(var r=e.localVars;r;r=r.next)if(r.name==t)return 1;for(var n=e.context;n;n=n.prev)for(r=n.vars;r;r=r.next)if(r.name==t)return 1}}(e,n)?"variable-2":t}}var z={state:null,column:null,marked:null,cc:null};function I(){for(var e=arguments.length-1;0<=e;e--)z.cc.push(arguments[e])}function T(){return I.apply(null,arguments),!0}function $(e,t){for(var r=t;r;r=r.next)if(r.name==e)return 1}function q(e){var t=z.state;if(z.marked="def",c){if(t.context)if("var"==t.lexical.info&&t.context&&t.context.block){var r=function e(t,r){{if(r){if(r.block){var n=e(t,r.prev);return n?n==r.prev?r:new S(n,r.vars,!0):null}return $(t,r.vars)?r:new S(r.prev,new _(t,r.vars),!1)}return null}}(e,t.context);if(null!=r)return void(t.context=r)}else if(!$(e,t.localVars))return void(t.localVars=new _(e,t.localVars));l.globalVars&&!$(e,t.globalVars)&&(t.globalVars=new _(e,t.globalVars))}}function C(e){return"public"==e||"private"==e||"protected"==e||"abstract"==e||"readonly"==e}function S(e,t,r){this.prev=e,this.vars=t,this.block=r}function _(e,t){this.name=e,this.next=t}var O=new _("this",new _("arguments",null));function P(){z.state.context=new S(z.state.context,z.state.localVars,!1),z.state.localVars=O}function N(){z.state.context=new S(z.state.context,z.state.localVars,!0),z.state.localVars=null}function U(){z.state.localVars=z.state.context.vars,z.state.context=z.state.context.prev}function W(n,a){function e(){var e=z.state,t=e.indented;if("stat"==e.lexical.type)t=e.lexical.indented;else for(var r=e.lexical;r&&")"==r.type&&r.align;r=r.prev)t=r.indented;e.lexical=new V(t,z.stream.column(),n,null,e.lexical,a)}return e.lex=!0,e}function B(){var e=z.state;e.lexical.prev&&(")"==e.lexical.type&&(e.indented=e.lexical.indented),e.lexical=e.lexical.prev)}function F(r){return function e(t){return t==r?T():";"==r||"}"==t||")"==t||"]"==t?I():T(e)}}function H(e,t){return"var"==e?T(W("vardef",t),Ee,F(";"),B):"keyword a"==e?T(W("form"),K,H,B):"keyword b"==e?T(W("form"),H,B):"keyword d"==e?z.stream.match(/^\s*$/,!1)?T():T(W("stat"),Q,F(";"),B):"debugger"==e?T(F(";")):"{"==e?T(W("}"),N,fe,B,U):";"==e?T():"if"==e?("else"==z.state.lexical.info&&z.state.cc[z.state.cc.length-1]==B&&z.state.cc.pop()(),T(W("form"),K,H,B,Ce)):"function"==e?T(Pe):"for"==e?T(W("form"),N,Se,H,U,B):"class"==e||u&&"interface"==t?(z.marked="keyword",T(W("form","class"==e?e:t),Fe,B)):"variable"==e?u&&"declare"==t?(z.marked="keyword",T(H)):u&&("module"==t||"enum"==t||"type"==t)&&z.stream.match(/^\s*\w/,!1)?(z.marked="keyword","enum"==t?T(et):"type"==t?T(Ue,F("operator"),ve,F(";")):T(W("form"),ze,F("{"),W("}"),fe,B,B)):u&&"namespace"==t?(z.marked="keyword",T(W("form"),G,H,B)):u&&"abstract"==t?(z.marked="keyword",T(H)):T(W("stat"),ae):"switch"==e?T(W("form"),K,F("{"),W("}","switch"),N,fe,B,B,U):"case"==e?T(G,F(":")):"default"==e?T(F(":")):"catch"==e?T(W("form"),P,D,H,B,U):"export"==e?T(W("stat"),Je,B):"import"==e?T(W("stat"),Le,B):"async"==e?T(H):"@"==t?T(G,H):I(W("stat"),G,F(";"),B)}function D(e){if("("==e)return T(We,F(")"))}function G(e,t){return L(e,t,!1)}function J(e,t){return L(e,t,!0)}function K(e){return"("!=e?I():T(W(")"),Q,F(")"),B)}function L(e,t,r){if(z.state.fatArrowAt==z.stream.start){var n=r?te:ee;if("("==e)return T(P,W(")"),ue(We,")"),B,F("=>"),n,U);if("variable"==e)return I(P,ze,F("=>"),n,U)}var a,n=r?X:R;return A.hasOwnProperty(e)?T(n):"function"==e?T(Pe,n):"class"==e||u&&"interface"==t?(z.marked="keyword",T(W("form"),Be,B)):"keyword c"==e||"async"==e?T(r?J:G):"("==e?T(W(")"),Q,F(")"),B,n):"operator"==e||"spread"==e?T(r?J:G):"["==e?T(W("]"),Ze,B,n):"{"==e?le(oe,"}",null,n):"quasi"==e?I(Y,n):"new"==e?T((a=r,function(e){return"."==e?T(a?ne:re):"variable"==e&&u?T(Me,a?X:R):I(a?J:G)})):T()}function Q(e){return e.match(/[;\}\)\],]/)?I():I(G)}function R(e,t){return","==e?T(Q):X(e,t,!1)}function X(e,t,r){var n=0==r?R:X,a=0==r?G:J;return"=>"==e?T(P,r?te:ee,U):"operator"==e?/\+\+|--/.test(t)||u&&"!"==t?T(n):u&&"<"==t&&z.stream.match(/^([^<>]|<[^<>]*>)*>\s*\(/,!1)?T(W(">"),ue(ve,">"),B,n):"?"==t?T(G,F(":"),a):T(a):"quasi"==e?I(Y,n):";"!=e?"("==e?le(J,")","call",n):"."==e?T(ie,n):"["==e?T(W("]"),Q,F("]"),B,n):u&&"as"==t?(z.marked="keyword",T(ve,n)):"regexp"==e?(z.state.lastType=z.marked="operator",z.stream.backUp(z.stream.pos-z.stream.start-1),T(a)):void 0:void 0}function Y(e,t){return"quasi"!=e?I():"${"!=t.slice(t.length-2)?T(Y):T(Q,Z)}function Z(e){if("}"==e)return z.marked="string-2",z.state.tokenize=g,T(Y)}function ee(e){return M(z.stream,z.state),I("{"==e?H:G)}function te(e){return M(z.stream,z.state),I("{"==e?H:J)}function re(e,t){if("target"==t)return z.marked="keyword",T(R)}function ne(e,t){if("target"==t)return z.marked="keyword",T(X)}function ae(e){return":"==e?T(B,H):I(R,F(";"),B)}function ie(e){if("variable"==e)return z.marked="property",T()}function oe(e,t){return"async"==e?(z.marked="property",T(oe)):"variable"!=e&&"keyword"!=z.style?"number"==e||"string"==e?(z.marked=i?"property":z.style+" property",T(se)):"jsonld-keyword"==e?T(se):u&&C(t)?(z.marked="keyword",T(oe)):"["==e?T(G,de,F("]"),se):"spread"==e?T(J,se):"*"==t?(z.marked="keyword",T(oe)):":"==e?I(se):void 0:(z.marked="property","get"==t||"set"==t?T(ce):(u&&z.state.fatArrowAt==z.stream.start&&(r=z.stream.match(/^\s*:\s*/,!1))&&(z.state.fatArrowAt=z.stream.pos+r[0].length),T(se)));var r}function ce(e){return"variable"!=e?I(se):(z.marked="property",T(Pe))}function se(e){return":"==e?T(J):"("==e?I(Pe):void 0}function ue(n,a,i){function o(e,t){if(i?-1"),ve):"quasi"==e?I(xe,je):void 0}function ye(e){if("=>"==e)return T(ve)}function we(e){return e.match(/[\}\)\]]/)?T():","==e||";"==e?T(we):I(be,we)}function be(e,t){return"variable"==e||"keyword"==z.style?(z.marked="property",T(be)):"?"==t||"number"==e||"string"==e?T(be):":"==e?T(ve):"["==e?T(F("variable"),pe,F("]"),be):"("==e?I(Ne,be):e.match(/[;\}\)\],]/)?void 0:T()}function xe(e,t){return"quasi"!=e?I():"${"!=t.slice(t.length-2)?T(xe):T(ve,he)}function he(e){if("}"==e)return z.marked="string-2",z.state.tokenize=g,T(xe)}function ge(e,t){return"variable"==e&&z.stream.match(/^\s*[?:]/,!1)||"?"==t?T(ge):":"==e?T(ve):"spread"==e?T(ge):I(ve)}function je(e,t){return"<"==t?T(W(">"),ue(ve,">"),B,je):"|"==t||"."==e||"&"==t?T(ve):"["==e?T(ve,F("]"),je):"extends"==t||"implements"==t?(z.marked="keyword",T(ve)):"?"==t?T(ve,F(":"),ve):void 0}function Me(e,t){if("<"==t)return T(W(">"),ue(ve,">"),B,je)}function Ae(){return I(ve,Ve)}function Ve(e,t){if("="==t)return T(ve)}function Ee(e,t){return"enum"==t?(z.marked="keyword",T(et)):I(ze,de,$e,qe)}function ze(e,t){return u&&C(t)?(z.marked="keyword",T(ze)):"variable"==e?(q(t),T()):"spread"==e?T(ze):"["==e?le(Te,"]"):"{"==e?le(Ie,"}"):void 0}function Ie(e,t){return"variable"!=e||z.stream.match(/^\s*:/,!1)?("variable"==e&&(z.marked="property"),"spread"==e?T(ze):"}"==e?I():"["==e?T(G,F("]"),F(":"),Ie):T(F(":"),ze,$e)):(q(t),T($e))}function Te(){return I(ze,$e)}function $e(e,t){if("="==t)return T(J)}function qe(e){if(","==e)return T(Ee)}function Ce(e,t){if("keyword b"==e&&"else"==t)return T(W("form","else"),H,B)}function Se(e,t){return"await"==t?T(Se):"("==e?T(W(")"),_e,B):void 0}function _e(e){return"var"==e?T(Ee,Oe):("variable"==e?T:I)(Oe)}function Oe(e,t){return")"==e?T():";"==e?T(Oe):"in"==t||"of"==t?(z.marked="keyword",T(G,Oe)):I(G,Oe)}function Pe(e,t){return"*"==t?(z.marked="keyword",T(Pe)):"variable"==e?(q(t),T(Pe)):"("==e?T(P,W(")"),ue(We,")"),B,me,H,U):u&&"<"==t?T(W(">"),ue(Ae,">"),B,Pe):void 0}function Ne(e,t){return"*"==t?(z.marked="keyword",T(Ne)):"variable"==e?(q(t),T(Ne)):"("==e?T(P,W(")"),ue(We,")"),B,me,U):u&&"<"==t?T(W(">"),ue(Ae,">"),B,Ne):void 0}function Ue(e,t){return"keyword"==e||"variable"==e?(z.marked="type",T(Ue)):"<"==t?T(W(">"),ue(Ae,">"),B):void 0}function We(e,t){return"@"==t&&T(G,We),"spread"==e?T(We):u&&C(t)?(z.marked="keyword",T(We)):u&&"this"==e?T(de,$e):I(ze,de,$e)}function Be(e,t){return("variable"==e?Fe:He)(e,t)}function Fe(e,t){if("variable"==e)return q(t),T(He)}function He(e,t){return"<"==t?T(W(">"),ue(Ae,">"),B,He):"extends"==t||"implements"==t||u&&","==e?("implements"==t&&(z.marked="keyword"),T(u?ve:G,He)):"{"==e?T(W("}"),De,B):void 0}function De(e,t){return"async"==e||"variable"==e&&("static"==t||"get"==t||"set"==t||u&&C(t))&&z.stream.match(/^\s+[\w$\xa1-\uffff]/,!1)?(z.marked="keyword",T(De)):"variable"==e||"keyword"==z.style?(z.marked="property",T(Ge,De)):"number"==e||"string"==e?T(Ge,De):"["==e?T(G,de,F("]"),Ge,De):"*"==t?(z.marked="keyword",T(De)):u&&"("==e?I(Ne,De):";"==e||","==e?T(De):"}"==e?T():"@"==t?T(G,De):void 0}function Ge(e,t){if("!"==t)return T(Ge);if("?"==t)return T(Ge);if(":"==e)return T(ve,$e);if("="==t)return T(J);t=z.state.lexical.prev;return I(t&&"interface"==t.info?Ne:Pe)}function Je(e,t){return"*"==t?(z.marked="keyword",T(Ye,F(";"))):"default"==t?(z.marked="keyword",T(G,F(";"))):"{"==e?T(ue(Ke,"}"),Ye,F(";")):I(H)}function Ke(e,t){return"as"==t?(z.marked="keyword",T(F("variable"))):"variable"==e?I(J,Ke):void 0}function Le(e){return"string"==e?T():"("==e?I(G):"."==e?I(R):I(Qe,Re,Ye)}function Qe(e,t){return"{"==e?le(Qe,"}"):("variable"==e&&q(t),"*"==t&&(z.marked="keyword"),T(Xe))}function Re(e){if(","==e)return T(Qe,Re)}function Xe(e,t){if("as"==t)return z.marked="keyword",T(Qe)}function Ye(e,t){if("from"==t)return z.marked="keyword",T(G)}function Ze(e){return"]"==e?T():I(ue(J,"]"))}function et(){return I(W("form"),ze,F("{"),W("}"),ue(tt,"}"),B,B)}function tt(){return I(ze,$e)}function rt(e,t,r){return t.tokenize==x&&/^(?:operator|sof|keyword [bcd]|case|new|export|default|spread|[\[{}\(,;:]|=>)$/.test(t.lastType)||"quasi"==t.lastType&&/\{\s*$/.test(e.string.slice(0,e.pos-(r||0)))}return B.lex=U.lex=!0,{startState:function(e){e={tokenize:x,lastType:"sof",cc:[],lexical:new V((e||0)-f,0,"block",!1),localVars:l.localVars,context:l.localVars&&new S(null,null,!1),indented:e||0};return l.globalVars&&"object"==typeof l.globalVars&&(e.globalVars=l.globalVars),e},token:function(e,t){if(e.sol()&&(t.lexical.hasOwnProperty("align")||(t.lexical.align=!1),t.indented=e.indentation(),M(e,t)),t.tokenize!=h&&e.eatSpace())return null;var r=t.tokenize(e,t);return"comment"==k?r:(t.lastType="operator"!=k||"++"!=v&&"--"!=v?k:"incdec",E(t,r,k,v,e))},indent:function(e,t){if(e.tokenize==h||e.tokenize==g)return nt.Pass;if(e.tokenize!=x)return 0;var r,n=t&&t.charAt(0),a=e.lexical;if(!/^\s*else\b/.test(t))for(var i=e.cc.length-1;0<=i;--i){var o=e.cc[i];if(o==B)a=a.prev;else if(o!=Ce&&o!=U)break}for(;("stat"==a.type||"form"==a.type)&&("}"==n||(r=e.cc[e.cc.length-1])&&(r==R||r==X)&&!/^[,\.=+\-*:?[\(]/.test(t));)a=a.prev;var c,s=(a=d&&")"==a.type&&"stat"==a.prev.type?a.prev:a).type,u=n==s;return"vardef"==s?a.indented+("operator"==e.lastType||","==e.lastType?a.info.length+1:0):"form"==s&&"{"==n?a.indented:"form"==s?a.indented+f:"stat"==s?a.indented+(c=t,"operator"==(s=e).lastType||","==s.lastType||y.test(c.charAt(0))||/[,.]/.test(c.charAt(0))?d||f:0):"switch"!=a.info||u||0==l.doubleIndentSwitch?a.align?a.column+(u?0:1):a.indented+(u?0:f):a.indented+(/^(?:case|default)\b/.test(t)?f:2*f)},electricInput:/^\s*(?:case .*?:|default:|\{|\})$/,blockCommentStart:o?null:"/*",blockCommentEnd:o?null:"*/",blockCommentContinue:o?null:" * ",lineComment:o?null:"//",fold:"brace",closeBrackets:"()[]{}''\"\"``",helperType:o?"json":"javascript",jsonldMode:i,jsonMode:o,expressionAllowed:rt,skipExpression:function(e){E(e,"atom","atom","true",new nt.StringStream("",2,null))}}}),nt.registerHelper("wordChars","javascript",/[\w$]/),nt.defineMIME("text/javascript","javascript"),nt.defineMIME("text/ecmascript","javascript"),nt.defineMIME("application/javascript","javascript"),nt.defineMIME("application/x-javascript","javascript"),nt.defineMIME("application/ecmascript","javascript"),nt.defineMIME("application/json",{name:"javascript",json:!0}),nt.defineMIME("application/x-json",{name:"javascript",json:!0}),nt.defineMIME("application/manifest+json",{name:"javascript",json:!0}),nt.defineMIME("application/ld+json",{name:"javascript",jsonld:!0}),nt.defineMIME("text/typescript",{name:"javascript",typescript:!0}),nt.defineMIME("application/typescript",{name:"javascript",typescript:!0})}); \ No newline at end of file diff --git a/aibotPro/aibotPro/wwwroot/system/js/knowledgeallinmilvus.js b/aibotPro/aibotPro/wwwroot/system/js/knowledgeallinmilvus.js index 7022f64..2c86218 100644 --- a/aibotPro/aibotPro/wwwroot/system/js/knowledgeallinmilvus.js +++ b/aibotPro/aibotPro/wwwroot/system/js/knowledgeallinmilvus.js @@ -341,42 +341,33 @@ function goback() { } function regularInfo() { var content = `

为了提供更加灵活的文件切片方式,以达到最佳知识库生成效果,我们提供了“正则表达式切片”

-

您可以根据具体需求进行调整,来实现更复杂和灵活的文本处理逻辑

我们为您提供了一些使用示例如下

- - +
+ - - - + + + - - - + + + - - - + + + - - - + + + - - - - - - - - - - - - - -
表达式 描述
[。!?]
([^。!?]+[。!?]) 按结束标点符号切片(如句号、问号、感叹号)
(\\r?\\n){2,}
((?:\r?\n){2,}.+?) 按段落切片(以双换行符为分隔)
[。!?.!?]
([^。!?.!?]+[。!?.!?]) 按句子切片(包括英文标点符号,如句号、问号和感叹号)
,|,
([^,,]+[,,]) 按逗号切片(适用于需要根据逗号分割长文本的情况)
章节\\s*\\d+按特定关键词切片(例如分割以“章节”开头的部分)
\\s+按空白字符切片(包括空格、制表符和换行符等)
(?<=\\b[A-Z])[^A-Z]+(?=\\b[A-Z])按大写字母开头的新段落进行切片
`; + + + 第\\s*(?:[一二三四五六七八九十]\\s*)*章\\s+.*?(?=第\\s*(?:[一二三四五六七八九十]\\s*)*章\\s+|$) + 按章节(例如第*章分割,兼容空格阿拉伯数字和汉字) + + `; showConfirmationModal("正则表达式说明", content); } $(document).ready(function () { diff --git a/aibotPro/aibotPro/wwwroot/system/js/openapi.js b/aibotPro/aibotPro/wwwroot/system/js/openapi.js index 0290f0a..4d40f1a 100644 --- a/aibotPro/aibotPro/wwwroot/system/js/openapi.js +++ b/aibotPro/aibotPro/wwwroot/system/js/openapi.js @@ -26,6 +26,7 @@ function getAIModelList() { type: "Post", url: "/WorkShop/GetWorkShopAImodel", dataType: "json", + async: false, success: function (res) { var html = ""; if (res.success) { diff --git a/aibotPro/aibotPro/wwwroot/system/js/robot.js b/aibotPro/aibotPro/wwwroot/system/js/robot.js index 19595f6..da110c5 100644 --- a/aibotPro/aibotPro/wwwroot/system/js/robot.js +++ b/aibotPro/aibotPro/wwwroot/system/js/robot.js @@ -351,7 +351,7 @@ function sendMsg_bot() { `; $(".bot-chat-body").append(gpthtml); $(".bot-chat-body").scrollTop($(".bot-chat-body")[0].scrollHeight); - connection_bot.invoke("SendWorkShopMessage", data, false) + connection_bot.invoke("SendWorkShopMessage", data, false, []) .then(function () { }) .catch(function (err) { diff --git a/aibotPro/aibotPro/wwwroot/system/js/userinfo.js b/aibotPro/aibotPro/wwwroot/system/js/userinfo.js index b222098..df98967 100644 --- a/aibotPro/aibotPro/wwwroot/system/js/userinfo.js +++ b/aibotPro/aibotPro/wwwroot/system/js/userinfo.js @@ -42,6 +42,7 @@ function loadImage(event) { success: function (res) { if (res.success) { avatar = res.filePath.replace('wwwroot', ''); + HeadImgPath = res.filePath.replace('wwwroot', ''); } else { balert(res.msg, 'danger', false, 1500, 'center'); diff --git a/aibotPro/aibotPro/wwwroot/system/js/workflow/workflow.js b/aibotPro/aibotPro/wwwroot/system/js/workflow/workflow.js index fb4746a..e01976d 100644 --- a/aibotPro/aibotPro/wwwroot/system/js/workflow/workflow.js +++ b/aibotPro/aibotPro/wwwroot/system/js/workflow/workflow.js @@ -1,5 +1,7 @@ var workflowcode = ''; var jsonmodelAI = ['gpt-3.5-turbo-0125', 'gpt-3.5-turbo-0125-openai', 'gpt-4-0125-preview', 'gpt-4-0125-preview-openai']; +let pageIndex_k = 1; +let pageSize_k = 20; $(function () { //changeMode('lock'); workflowcode = getUrlParam('workflowcode'); @@ -170,7 +172,46 @@ function getAIModelList(callback) { } }); } - +function getKonwLedgeTypeByMilvus(type, callback) { + if (type == 'loadmore') + loadingBtn('.loadmorebtn'); + var name = $("#seachKnowledge").val(); + $.ajax({ + type: "Post", + url: "/KnowledgeAI/GetKnowledgeType", + dataType: "json", + data: { + name: name, + page: pageIndex_k, + pageSize: pageSize_k + }, + success: function (res) { + unloadingBtn('.loadmorebtn'); + var html = ``; + res = res.data; + if (res.length > 0) { + if (res.length < pageSize_k) + $('.loadmorebtn').hide(); + for (var i = 0; i < res.length; i++) { + html += `
+
+ + ${truncateString(res[i].typeName, 15)} +
+
`; + } + } else { + html = `没有知识库~`; + $('.loadmorebtn').hide(); + } + $('#onknowledgeitem').html(html); + callback && callback(); + }, + error: function (e) { + unloadingBtn('.loadmorebtn'); + } + }); +} var thisNodeId = 0; var thisNodeName = ''; @@ -624,23 +665,36 @@ editor.on('nodeSelected', function (id) {

topK(3≤topK≤10):

+

知识库选用:

+
加载中...

当下级节点需要获取知识库检索结果时,使用{{knowledge+节点Id.data}}获取,例如{{knowledge1.data}}

` $('.configure').html(html); - if (node && node.data && Object.entries(node.data).length > 0) { - //回写 - var data = node.data; - if (data.output.prompt) { - $(".prompt").val(data.output.prompt); - } - if (data.output.retry) { - $(".retry").val(data.output.retry); - } - if (data.output.topk) { - $(".topk").val(data.output.topk); + getKonwLedgeTypeByMilvus("init", function () { + if (node && node.data && Object.entries(node.data).length > 0) { + //回写 + var data = node.data; + if (data.output.prompt) { + $(".prompt").val(data.output.prompt); + } + if (data.output.retry) { + $(".retry").val(data.output.retry); + } + if (data.output.topk) { + $(".topk").val(data.output.topk); + } + $('#onknowledgeitem input[type="checkbox"]').each(function () { + var typecode = $(this).val(); + if (data.output.typecode.includes(typecode)) { + $(this).prop('checked', true); + } else { + $(this).prop('checked', false); + } + }); } - } + }); + break; case 'end': html = `
@@ -972,7 +1026,8 @@ function addNodeToDrawFlow(name, pos_x, pos_y) { output: { prompt: "", retry: 0, - topk: 3 + topk: 3, + typecode: [] } }, knowledge); break; diff --git a/aibotPro/aibotPro/wwwroot/system/js/workflow/workflowaction.js b/aibotPro/aibotPro/wwwroot/system/js/workflow/workflowaction.js index 861fd9c..8446281 100644 --- a/aibotPro/aibotPro/wwwroot/system/js/workflow/workflowaction.js +++ b/aibotPro/aibotPro/wwwroot/system/js/workflow/workflowaction.js @@ -66,7 +66,8 @@ var knowledgedata = { output: { prompt: "", retry: 0, - topk: 3 + topk: 3, + typecode: [] } } var regex = /'/; @@ -328,7 +329,8 @@ function saveNodeData() { output: { prompt: "", retry: 0, - topk: 3 + topk: 3, + typecode: [] } } var Prompt = $('.prompt').val(); @@ -346,6 +348,17 @@ function saveNodeData() { layer.msg('TopK填写错误', { icon: 2, time: 2500 }); return false; } + $('#onknowledgeitem input[type="checkbox"]:checked').each(function () { + var typecode = $(this).val(); + // 添加到knowledgedata.output.typecode + if (knowledgedata.output.typecode.findIndex(item => item === typecode) === -1) { + knowledgedata.output.typecode.push(typecode); + } + }); + if (knowledgedata.output.typecode.length == 0) { + layer.msg('请选用知识库', { icon: 2, time: 2500 }); + return false; + } knowledgedata.output.prompt = Prompt; knowledgedata.output.retry = Retry; knowledgedata.output.topk = TopK; diff --git a/aibotPro/aibotPro/wwwroot/system/js/workflow/worknode.css b/aibotPro/aibotPro/wwwroot/system/js/workflow/worknode.css index 465a31a..83d3afd 100644 --- a/aibotPro/aibotPro/wwwroot/system/js/workflow/worknode.css +++ b/aibotPro/aibotPro/wwwroot/system/js/workflow/worknode.css @@ -69,3 +69,18 @@ table select { margin-bottom: -200px; margin-right: 5px; } + +.list-group-item { + background-color: rgb(255,255,255); + margin-bottom: 10px; + padding: 5px; + border-radius: 5px; +} + +#onknowledgeitem { + height: 200px; + overflow-y: scroll; + border: 1px solid lightgray; + border-radius: 5px; + padding: 10px; +} diff --git a/aibotPro/aibotPro/wwwroot/system/js/workshopchat.js b/aibotPro/aibotPro/wwwroot/system/js/workshopchat.js index 1638e98..34d58aa 100644 --- a/aibotPro/aibotPro/wwwroot/system/js/workshopchat.js +++ b/aibotPro/aibotPro/wwwroot/system/js/workshopchat.js @@ -22,11 +22,11 @@ var connection = new signalR.HubConnectionBuilder() // 启动连接 connection.start() .then(function () { - console.log('与服务器握手成功 :-)'); // 与服务器握手成功 + console.log('与工坊服务器握手成功 :-)'); // 与服务器握手成功 }) .catch(function (error) { - console.log('与服务器握手失败 :-( 原因: ' + error); // 与服务器握手失败 - sendExceptionMsg('与服务器握手失败 :-( 原因: ' + error); + console.log('与工坊服务器握手失败 :-( 原因: ' + error); // 与服务器握手失败 + sendExceptionMsg('与工坊服务器握手失败 :-( 原因: ' + error); // 检查令牌是否过期,如果是,则跳转到登录页面 if (isTokenExpiredError(error)) { window.location.href = "/Users/Login"; @@ -45,13 +45,13 @@ function isTokenExpiredError(error) { // You can also handle the reconnection events if needed: connection.onreconnecting((error) => { console.assert(connection.state === signalR.HubConnectionState.Reconnecting); - console.log(`由于错误"${error}"失去连接。正在尝试重新连接。`); + console.log(`由于错误"${error}"失去连接。正在尝试重新连接工坊。`); // Here you might want to inform the user that the connection is being reattempted. }); connection.onreconnected((connectionId) => { console.assert(connection.state === signalR.HubConnectionState.Connected); - console.log(`连接已重新建立。已连接到connectionId为"${connectionId}"。`); + console.log(`工坊连接已重新建立。已连接到connectionId为"${connectionId}"。`); // Here you might want to inform the user that the connection has been successfully reestablished. }); $(function () { @@ -428,7 +428,7 @@ function sendMsg() { $(".chat-body-content").append(gpthtml); adjustTextareaHeight(); chatBody.scrollTop(chatBody[0].scrollHeight); - connection.invoke("SendWorkShopMessage", data, false) + connection.invoke("SendWorkShopMessage", data, false, []) .then(function () { }) .catch(function (err) { diff --git a/aibotPro/fakenode.log b/aibotPro/fakenode.log deleted file mode 100644 index e69de29..0000000