diff --git a/Yi.Abp.Net8/module/chat-hub/Yi.Framework.ChatHub.Domain/Managers/AiManager.cs b/Yi.Abp.Net8/module/chat-hub/Yi.Framework.ChatHub.Domain/Managers/AiManager.cs index 2b760068..ddc81fd3 100644 --- a/Yi.Abp.Net8/module/chat-hub/Yi.Framework.ChatHub.Domain/Managers/AiManager.cs +++ b/Yi.Abp.Net8/module/chat-hub/Yi.Framework.ChatHub.Domain/Managers/AiManager.cs @@ -1,9 +1,11 @@ using System.Collections.Generic; +using System.Net; using Microsoft.Extensions.Options; using OpenAI; using OpenAI.Managers; using OpenAI.ObjectModels; using OpenAI.ObjectModels.RequestModels; +using OpenAI.ObjectModels.ResponseModels; using Volo.Abp.DependencyInjection; using Volo.Abp.Domain.Services; using Yi.Framework.ChatHub.Domain.Shared.Dtos; @@ -24,46 +26,58 @@ namespace Yi.Framework.ChatHub.Domain.Managers public async IAsyncEnumerable ChatAsStreamAsync(List aiChatContextDtos) { - var temp = "站长正在接入ChatGpt,敬请期待~"; + //var temp = "站长正在接入ChatGpt,敬请期待~"; - for (var i = 0; i < temp.Length; i++) + //for (var i = 0; i < temp.Length; i++) + //{ + // await Task.Delay(200); + // yield return temp[i].ToString(); + //} + + + + + if (aiChatContextDtos.Count == 0) { - await Task.Delay(200); - yield return temp[i].ToString(); + yield return null; } + List messages = aiChatContextDtos.Select(x => + { + if (x.AnswererType == AnswererTypeEnum.Ai) + { + return ChatMessage.FromSystem(x.Message); + } + else + { + return ChatMessage.FromUser(x.Message); + } + }).ToList(); + var completionResult = OpenAIService.ChatCompletion.CreateCompletionAsStream(new ChatCompletionCreateRequest + { + Messages = messages, + Model = Models.Gpt_4o_mini + }); - - - //if (aiChatContextDtos.Count == 0) - //{ - // yield return null; - //} - - //List messages= aiChatContextDtos.Select(x => - //{ - // if (x.AnswererType == AnswererTypeEnum.Ai) - // { - // return ChatMessage.FromSystem(x.Message); - // } - // else - // { - // return ChatMessage.FromUser(x.Message); - // } - //}).ToList(); - //var completionResult = OpenAIService.ChatCompletion.CreateCompletionAsStream(new ChatCompletionCreateRequest - //{ - // Messages = messages, - // Model = Models.Gpt_3_5_Turbo - //}); - - //await foreach (var result in completionResult) - //{ - // if (result.Successful) - // { - // yield return result.Choices.FirstOrDefault()?.Message.Content ?? string.Empty; - // } - //} + HttpStatusCode? error = null; + await foreach (var result in completionResult) + { + if (result.Successful) + { + yield return result.Choices.FirstOrDefault()?.Message.Content ?? string.Empty; + } + else + { + error = result.HttpStatusCode; + break; + } + + } + if (error == HttpStatusCode.PaymentRequired) + { + yield return "余额不足,请联系站长充值"; + + } } } diff --git a/Yi.Bbs.Vue3/src/stores/chat.js b/Yi.Bbs.Vue3/src/stores/chat.js index c7d88325..aa7682ed 100644 --- a/Yi.Bbs.Vue3/src/stores/chat.js +++ b/Yi.Bbs.Vue3/src/stores/chat.js @@ -4,26 +4,28 @@ const chatStore = defineStore("chat", { userList: [], msgList: [] }), - getters: { - allMsgContext: (state) => state.msgList.filter(x=>x.messageType=="All"), - personalMsgContext: (state) => state.msgList.filter(x=>x.messageType=="Personal"), - aiMsgContext: (state) => state.msgList.filter(x=>x.messageType=="Ai") - }, + getters: { + allMsgContext: (state) => state.msgList.filter(x => x.messageType == "All"), + personalMsgContext: (state) => state.msgList.filter(x => x.messageType == "Personal"), + aiMsgContext: (state) => state.msgList.filter(x => x.messageType == "Ai") + }, actions: { - addOrUpdateMsg(msg){ - var currentMsg= this.msgList.filter(x => x.id == msg.id)[0]; - //当前没有包含,如果有相同的上下文id,只需要改变content即可 - if(currentMsg==undefined) - { - this.addMsg(msg); - } - else - { - currentMsg.content+=msg.content; - } + addOrUpdateMsg(msg) { + var currentMsg = this.msgList.filter(x => x.id == msg.id)[0]; + //当前没有包含,如果有相同的上下文id,只需要改变content即可 + if (currentMsg == undefined) { + this.addMsg(msg); + } + else { + currentMsg.content += msg.content; + } }, + clearAiMsg() + { + this.msgList=this.msgList.filter(x => x.messageType != "Ai") + }, setMsgList(value) { this.msgList = value; }, diff --git a/Yi.Bbs.Vue3/src/views/chathub/Index.vue b/Yi.Bbs.Vue3/src/views/chathub/Index.vue index 14dc07ab..7ac17db9 100644 --- a/Yi.Bbs.Vue3/src/views/chathub/Index.vue +++ b/Yi.Bbs.Vue3/src/views/chathub/Index.vue @@ -60,11 +60,10 @@ const getChatUrl=(url,position)=> const currentHeaderName = computed(() => { if (selectIsAll()) { return "官方学习交流群"; - } else if (selectIsAi()) { - return "Ai-ChatGpt(你的私人ai小助手)" + return "Ai-ChatGpt4.0(你的私人ai小助手)" } else { currentSelectUser.value.userName; @@ -233,7 +232,11 @@ const onclickSendGroupMsg = (groupName, msg) => { alert("暂未实现"); } } - +//清除ai对话 +const clearAiMsg=()=>{ + sendAiChatContext.value=[]; + chatStore.clearAiMsg(); +} //获取当前最后一条信息 const getLastMessage = ((receiveId, itemType) => { @@ -264,7 +267,11 @@ const getLastMessage = ((receiveId, itemType) => {

tip:官方学习交流群每次发送消息消耗 1 钱钱

tip:点击聊天窗口右上角“X”可退出

tip:多人同时在聊天室时,左侧可显示其他成员

-

tip:即将接入OpenAi ChatGpt Ai聊天

+ +

Ai聊天:当前Ai为 OpenAi ChatGpt4

+

tip:当前Ai为OpenAi ChatGpt4,由于接口收费原因,还请各位手下留情

+

tip:ai对话为持续对话,如果想清空,可以刷新页面

+

tip:ai对话只有本地存储了记录,刷新后将情况

@@ -353,7 +360,8 @@ const getLastMessage = ((receiveId, itemType) => {
-
{{ currentHeaderName }}
+
{{ currentHeaderName }} 点击清空当前对话
+
    @@ -808,6 +816,7 @@ const getLastMessage = ((receiveId, itemType) => { .content-others-msg { background-color: #FFFFFF; padding: 10px 15px; + text-align: justify; } .content-others-msg:hover { diff --git a/Yi.Bbs.Vue3/src/views/home/Index.vue b/Yi.Bbs.Vue3/src/views/home/Index.vue index 1c79f1f5..1b8a22e6 100644 --- a/Yi.Bbs.Vue3/src/views/home/Index.vue +++ b/Yi.Bbs.Vue3/src/views/home/Index.vue @@ -3,7 +3,7 @@
    -

    点击前往-最新上线《聊天室》 ,探索更多可能,结交更多朋友,闭上眼睛,聆听名刀破碎的声音

    +

    点击前往-最新上线《聊天室》 ,现已支持Ai助手,希望能帮助大家

    @@ -470,11 +470,13 @@ const onClickAccessLog = async () => { span{ color: red; } + display: flex; + align-content: center; + flex-wrap: wrap; + height: 30px; p { - cursor: pointer; - display: inline-block; - padding-left: 100%; - animation: marquee 20s linear infinite; + margin:0 auto ; + cursor:pointer; } }