diff --git a/api/handler/chat_handler.go b/api/handler/chat_handler.go index bb223e67..899d7d07 100644 --- a/api/handler/chat_handler.go +++ b/api/handler/chat_handler.go @@ -40,6 +40,7 @@ import ( const ( ChatEventStart = "start" ChatEventEnd = "end" + ChatEventComplete = "complete" ChatEventError = "error" ChatEventMessageDelta = "message_delta" ChatEventTitle = "title" @@ -539,6 +540,7 @@ func (h *ChatHandler) subUserPower(userVo vo.User, input ChatInput, promptTokens } func (h *ChatHandler) saveChatHistory( + c *gin.Context, req types.ApiRequest, usage Usage, message types.Message, @@ -609,6 +611,22 @@ func (h *ChatHandler) saveChatHistory( logger.Error("failed to save reply history message: ", err) } + // 发送完整聊天记录给前端 + var messageVo vo.ChatMessage + err = utils.CopyObject(historyReplyMsg, &messageVo) + if err == nil { + // 解析内容 + var content vo.MsgContent + err = utils.JsonDecode(historyReplyMsg.Content, &content) + if err != nil { + content.Text = historyReplyMsg.Content + } + messageVo.Content = content + messageVo.CreatedAt = historyReplyMsg.CreatedAt.Unix() + messageVo.UpdatedAt = historyReplyMsg.UpdatedAt.Unix() + pushMessage(c, ChatEventComplete, messageVo) + } + // 更新用户算力 if input.ChatModel.Power > 0 { h.subUserPower(userVo, input, promptTokens, replyTokens) diff --git a/api/handler/chat_openai_handler.go b/api/handler/chat_openai_handler.go index 6a71c405..91a6f59a 100644 --- a/api/handler/chat_openai_handler.go +++ b/api/handler/chat_openai_handler.go @@ -226,7 +226,7 @@ func (h *ChatHandler) sendOpenAiMessage( TotalTokens: 0, } message.Content = usage.Content - h.saveChatHistory(req, usage, message, input, userVo, promptCreatedAt, replyCreatedAt) + h.saveChatHistory(c, req, usage, message, input, userVo, promptCreatedAt, replyCreatedAt) } } else { // 非流式输出 var respVo OpenAIResVo @@ -242,7 +242,7 @@ func (h *ChatHandler) sendOpenAiMessage( pushMessage(c, "text", content) respVo.Usage.Prompt = input.Prompt respVo.Usage.Content = content - h.saveChatHistory(req, respVo.Usage, respVo.Choices[0].Message, input, userVo, promptCreatedAt, time.Now()) + h.saveChatHistory(c, req, respVo.Usage, respVo.Choices[0].Message, input, userVo, promptCreatedAt, time.Now()) } return nil diff --git a/api/service/migration_service.go b/api/service/migration_service.go index e050d59a..26292b27 100644 --- a/api/service/migration_service.go +++ b/api/service/migration_service.go @@ -159,6 +159,8 @@ func (s *MigrationService) MigrateConfigContent() error { // 数据表迁移 func (s *MigrationService) TableMigration() { + // 新数据表 + s.db.AutoMigrate(&model.Moderation{}) // 订单字段整理 if s.db.Migrator().HasColumn(&model.Order{}, "pay_type") { s.db.Migrator().RenameColumn(&model.Order{}, "pay_type", "channel") diff --git a/web/src/components/ChatReply.vue b/web/src/components/ChatReply.vue index 58fd6cda..3d028630 100644 --- a/web/src/components/ChatReply.vue +++ b/web/src/components/ChatReply.vue @@ -168,7 +168,7 @@ const md = new MarkdownIt({ const codeIndex = parseInt(Date.now()) + Math.floor(Math.random() * 10000000) // 显示复制代码按钮和展开/收起按钮 const copyBtn = `