|
@@ -55,29 +55,53 @@ func Manager() *ConnectionManager {
|
|
|
}
|
|
|
|
|
|
// HandleMessage 消息处理核心逻辑
|
|
|
-func (manager *ConnectionManager) HandleMessage(userID int, sessionID string, message []byte) error {
|
|
|
-
|
|
|
+func (manager *ConnectionManager) HandleMessage(userID int, sessionID string, message []byte) {
|
|
|
+ var err error
|
|
|
session, exists := manager.GetSession(sessionID)
|
|
|
if !exists {
|
|
|
- return errors.New("session not found")
|
|
|
+ err = errors.New("session not found")
|
|
|
+ return
|
|
|
}
|
|
|
+
|
|
|
if strings.ToLower(string(message)) == "pong" {
|
|
|
session.UpdateActivity()
|
|
|
fmt.Printf("收到心跳消息,续期长连接:%v", session.LastActive)
|
|
|
- return nil
|
|
|
- }
|
|
|
- if !Allow(userID, QA_LIMITER) {
|
|
|
- _ = session.Conn.WriteMessage(websocket.TextMessage, []byte("<think></think>"))
|
|
|
- _ = session.Conn.WriteMessage(websocket.TextMessage, []byte("您提问的太频繁了,请稍后再试"))
|
|
|
- _ = session.Conn.WriteMessage(websocket.TextMessage, []byte("<EOF/>"))
|
|
|
- return nil
|
|
|
+ return
|
|
|
}
|
|
|
+ defer func() {
|
|
|
+ if err != nil {
|
|
|
+ //写应答
|
|
|
+ _ = session.writeWithTimeout("<think></think>")
|
|
|
+ _ = session.writeWithTimeout(err.Error())
|
|
|
+ _ = session.writeWithTimeout("<EOF/>")
|
|
|
+ }
|
|
|
+ }()
|
|
|
var userMessage Message
|
|
|
- err := json.Unmarshal(message, &userMessage)
|
|
|
+ err = json.Unmarshal(message, &userMessage)
|
|
|
if err != nil {
|
|
|
utils.FileLog.Error(fmt.Sprintf("消息格式错误:%s", string(message)))
|
|
|
fmt.Printf("消息格式错误:%s", string(message))
|
|
|
- return errors.New("消息格式错误:" + err.Error())
|
|
|
+ err = errors.New("消息格式错误:" + err.Error())
|
|
|
+ return
|
|
|
+ }
|
|
|
+
|
|
|
+ if userMessage.MessageType == `stop` {
|
|
|
+ if session.LLMStatus == 1 {
|
|
|
+ // 标记llm提问状态:暂停提问
|
|
|
+ session.LLMStatus = -1
|
|
|
+ }
|
|
|
+ if session.CloseLlmChan != nil {
|
|
|
+ *session.CloseLlmChan <- true
|
|
|
+ }
|
|
|
+ return
|
|
|
+ }
|
|
|
+
|
|
|
+ // 限流
|
|
|
+ if !Allow(userID, QA_LIMITER) {
|
|
|
+ _ = session.Conn.WriteMessage(websocket.TextMessage, []byte("<think></think>"))
|
|
|
+ _ = session.Conn.WriteMessage(websocket.TextMessage, []byte("您提问的太频繁了,请稍后再试"))
|
|
|
+ _ = session.Conn.WriteMessage(websocket.TextMessage, []byte("<EOF/>"))
|
|
|
+ return
|
|
|
}
|
|
|
// 处理业务逻辑
|
|
|
//session.History = append(session.History, userMessage.LastTopics...)
|
|
@@ -104,29 +128,37 @@ func (manager *ConnectionManager) HandleMessage(userID int, sessionID string, me
|
|
|
}()
|
|
|
if resp == nil {
|
|
|
utils.FileLog.Error("知识库问答失败: 无应答")
|
|
|
- return errors.New("知识库问答失败: 无应答")
|
|
|
+ err = errors.New("知识库问答失败: 无应答")
|
|
|
+ return
|
|
|
}
|
|
|
if err != nil {
|
|
|
utils.FileLog.Error(fmt.Sprintf("知识库问答失败: httpCode:%d,错误信息:%s", resp.StatusCode, http.StatusText(resp.StatusCode)))
|
|
|
err = errors.New(fmt.Sprintf("知识库问答失败: httpCode:%d,错误信息:%s", resp.StatusCode, http.StatusText(resp.StatusCode)))
|
|
|
- return err
|
|
|
+ return
|
|
|
}
|
|
|
|
|
|
if resp.StatusCode != http.StatusOK {
|
|
|
utils.FileLog.Error(fmt.Sprintf("知识库问答失败: httpCode:%d,错误信息:%s", resp.StatusCode, http.StatusText(resp.StatusCode)))
|
|
|
err = errors.New(fmt.Sprintf("知识库问答失败: httpCode:%d,错误信息:%s", resp.StatusCode, http.StatusText(resp.StatusCode)))
|
|
|
- return err
|
|
|
+ return
|
|
|
}
|
|
|
+
|
|
|
// 解析流式响应
|
|
|
- contentChan, errChan, closeChan := eta_llm.ParseStreamResponse(resp)
|
|
|
+ contentChan, errChan, closeChan, closeLlmChan := eta_llm.ParseStreamResponse(resp)
|
|
|
+ session.CloseLlmChan = &closeLlmChan
|
|
|
+ // 标记llm提问状态:提问中
|
|
|
+ session.LLMStatus = 1
|
|
|
emptyContent := true
|
|
|
// 处理流式数据并发送到 WebSocket
|
|
|
for {
|
|
|
select {
|
|
|
case content, ok := <-contentChan:
|
|
|
- if !ok {
|
|
|
- err = errors.New("未知的错误异常")
|
|
|
- return err
|
|
|
+ if !ok && session.LLMStatus != -1 {
|
|
|
+ err = errors.New("未知的内容错误异常")
|
|
|
+
|
|
|
+ // 标记llm提问状态:未提问
|
|
|
+ session.LLMStatus = 0
|
|
|
+ return
|
|
|
}
|
|
|
session.UpdateActivity()
|
|
|
if emptyContent {
|
|
@@ -140,15 +172,20 @@ func (manager *ConnectionManager) HandleMessage(userID int, sessionID string, me
|
|
|
} else {
|
|
|
err = errors.New(chanErr.Error())
|
|
|
}
|
|
|
+ // 标记llm提问状态:未提问
|
|
|
+ session.LLMStatus = 0
|
|
|
// 发送错误消息到 WebSocket
|
|
|
- return err
|
|
|
+ return
|
|
|
case <-closeChan:
|
|
|
if emptyContent {
|
|
|
_ = session.Conn.WriteMessage(websocket.TextMessage, []byte("<think></think>"))
|
|
|
_ = session.Conn.WriteMessage(websocket.TextMessage, []byte("暂时找不到答案"))
|
|
|
}
|
|
|
_ = session.Conn.WriteMessage(websocket.TextMessage, []byte("<EOF/>"))
|
|
|
- return nil
|
|
|
+ // 标记llm提问状态:未提问
|
|
|
+ session.LLMStatus = 0
|
|
|
+
|
|
|
+ return
|
|
|
}
|
|
|
}
|
|
|
// 更新最后活跃时间
|