ai_scheduler/internal/services/chat.go

95 lines
2.5 KiB
Go

package services
import (
"ai_scheduler/internal/data/constant"
"ai_scheduler/internal/entitys"
"encoding/json"
"log"
"github.com/gofiber/websocket/v2"
)
// ChatHandler 聊天处理器
type ChatService struct {
routerService entitys.RouterService
}
// NewChatHandler 创建聊天处理器
func NewChatService(routerService entitys.RouterService) *ChatService {
return &ChatService{
routerService: routerService,
}
}
// ToolCallResponse 工具调用响应
type ToolCallResponse struct {
ID string `json:"id" example:"call_1"`
Type string `json:"type" example:"function"`
Function FunctionCallResponse `json:"function"`
Result interface{} `json:"result,omitempty"`
}
// FunctionCallResponse 函数调用响应
type FunctionCallResponse struct {
Name string `json:"name" example:"get_weather"`
Arguments interface{} `json:"arguments"`
}
func (h *ChatService) ChatFail(c *websocket.Conn, content string) {
//c.WriteMessage(messageType, message)
}
func (h *ChatService) Chat(c *websocket.Conn) {
log.Println("客户端已连接")
defer c.Close()
// 循环读取客户端消息
for {
messageType, message, err := c.ReadMessage()
if err != nil {
log.Println("读取错误:", err)
break
}
msg, chatType := h.handleMessageToString(c, messageType, message)
if chatType == constant.ConnStatusClosed {
break
}
if chatType == constant.ConnStatusIgnore {
continue
}
log.Printf("收到消息: %s", string(msg))
var req entitys.ChatSockRequest
if err := json.Unmarshal(msg, &req); err != nil {
log.Println("JSON parse error:", err)
continue
}
err = h.routerService.RouteWithSocket(c, &req)
if err != nil {
log.Println("处理失败:", err)
continue
}
}
log.Println("客户端已断开")
}
func (h *ChatService) handleMessageToString(c *websocket.Conn, msgType int, msg any) (text []byte, chatType constant.ConnStatus) {
switch msgType {
case websocket.TextMessage:
return msg.([]byte), constant.ConnStatusNormal
case websocket.BinaryMessage:
return msg.([]byte), constant.ConnStatusNormal
case websocket.CloseMessage:
return nil, constant.ConnStatusClosed
case websocket.PingMessage:
// 可选:回复 Pong
c.WriteMessage(websocket.PongMessage, nil)
return nil, constant.ConnStatusIgnore
case websocket.PongMessage:
return nil, constant.ConnStatusIgnore
default:
return nil, constant.ConnStatusIgnore
}
return msg.([]byte), constant.ConnStatusIgnore
}