diff --git a/api/handler/chat_handler.go b/api/handler/chat_handler.go index 899d7d07..d19b9528 100644 --- a/api/handler/chat_handler.go +++ b/api/handler/chat_handler.go @@ -104,18 +104,19 @@ func (h *ChatHandler) RegisterRoutes() { // Chat 处理聊天请求 func (h *ChatHandler) Chat(c *gin.Context) { - var input ChatInput - if err := c.ShouldBindJSON(&input); err != nil { - resp.ERROR(c, types.InvalidArgs) - return - } - // 设置SSE响应头 c.Header("Prompt-Type", "text/event-stream") c.Header("Cache-Control", "no-cache") c.Header("Connection", "keep-alive") c.Header("X-Accel-Buffering", "no") + var input ChatInput + if err := c.ShouldBindJSON(&input); err != nil { + pushMessage(c, ChatEventError, types.InvalidArgs) + c.Abort() + return + } + ctx, cancel := context.WithCancel(c.Request.Context()) defer cancel() @@ -259,6 +260,13 @@ func (h *ChatHandler) sendMessage(ctx context.Context, input ChatInput, c *gin.C var historyMessages []model.ChatMessage dbSession := h.DB.Session(&gorm.Session{}).Where("chat_id", input.ChatId) if input.LastMsgId > 0 { // 重新生成逻辑 + var lastMessage model.ChatMessage + err = dbSession.Where("id <= ?", input.LastMsgId).Where("type", types.PromptMsg).First(&lastMessage).Error + if err != nil { + input.LastMsgId = 0 + } else { + input.LastMsgId = lastMessage.Id + } dbSession = dbSession.Where("id < ?", input.LastMsgId) // 删除对应的聊天记录 h.DB.Debug().Where("chat_id", input.ChatId).Where("id >= ?", input.LastMsgId).Delete(&model.ChatMessage{}) diff --git a/web/src/views/ChatPlus.vue b/web/src/views/ChatPlus.vue index 65e751e0..a3cfc410 100644 --- a/web/src/views/ChatPlus.vue +++ b/web/src/views/ChatPlus.vue @@ -401,7 +401,6 @@ import { fetchEventSource } from '@microsoft/fetch-event-source' import Clipboard from 'clipboard' import { ElMessage, ElMessageBox } from 'element-plus' import 'highlight.js/styles/a11y-dark.css' - import { computed, nextTick, onMounted, ref, watch } from 'vue' import { useRouter } from 'vue-router' import { getUserToken } from '../store/session' @@ -704,35 +703,28 @@ const sendSSERequest = async (message) => { }, body: JSON.stringify(message), openWhenHidden: true, - // 禁用重试机制,避免连接断开后一直重试 - retry: false, + // 重试机制,避免连接断开后一直重试 + retry: 3000, // 设置重试延迟为0,确保不重试 - retryDelay: 0, + retryDelay: 3000, // 设置最大重试次数为0 - maxRetries: 0, + maxRetries: 3, signal: abortController.value.signal, onopen(response) { if (response.ok && response.status === 200) { console.log('SSE connection opened') } else { - const errorMsg = `连接失败 (状态码: ${response.status})` - ElMessage.error(errorMsg) console.error('SSE connection failed', response) isGenerating.value = false - - throw new Error(errorMsg) } }, onmessage(msg) { try { const data = JSON.parse(msg.data) if (data.type === 'error') { - // ElMessage.error(data.body) const reply = chatData.value[chatData.value.length - 1] if (reply) { - reply[ - 'content' - ].text = `