package service import ( "io" "github.com/sundynix/pets-be/internal/model" ) // AIChat 记录一问一答:启用模型则真调(注入宠物档案),否则规则化文案 func (s *Service) AIChat(userID string, petID *string, session, text string) (string, error) { reply := "我会先判断风险等级,再建议你记录关键观察项。若出现频繁呕吐、便血、精神明显变差或持续超过 24 小时,建议尽快就医。" if s.ai != nil && s.ai.Enabled() { if r, err := s.llmChat(petID, text); err == nil && r != "" { reply = r } } msgs := []model.AIMessage{ {UserID: userID, PetID: petID, Session: session, Role: "user", Text: text}, {UserID: userID, PetID: petID, Session: session, Role: "ai", Text: reply}, } if err := s.db.Create(&msgs).Error; err != nil { return "", err } return reply, nil } // Upload 代理到对象存储 func (s *Service) Upload(objectName string, reader io.Reader, size int64, contentType string) (string, error) { return s.storage.Upload(objectName, reader, size, contentType) } // ListAIMessages 取当前用户的聊天历史(按会话,默认最近 N 条,返回时间正序) func (s *Service) ListAIMessages(userID, session string, limit int) ([]model.AIMessage, error) { if limit <= 0 || limit > 100 { limit = 30 } q := s.db.Where("user_id = ?", userID) if session != "" { q = q.Where("session = ?", session) } var msgs []model.AIMessage if err := q.Order("id desc").Limit(limit).Find(&msgs).Error; err != nil { return nil, err } // 反转成时间正序,前端直接按顺序渲染 for i, j := 0, len(msgs)-1; i < j; i, j = i+1, j-1 { msgs[i], msgs[j] = msgs[j], msgs[i] } return msgs, nil }