package service import ( "context" "strings" "github.com/topfans/backend/services/aiChatService/model" ) // AIProvider 流式对话接口(实现类:LLMService、DifyAdapter) type AIProvider interface { StreamChat(ctx context.Context, messages []model.Message) (StreamReader, error) } // ChatService 对话服务 type ChatService struct { aiProvider AIProvider personaService *PersonaService memoryService *MemoryService auditService *AuditService } // NewChatService 创建对话服务 func NewChatService( aiProvider AIProvider, personaService *PersonaService, memoryService *MemoryService, auditService *AuditService, ) *ChatService { return &ChatService{ aiProvider: aiProvider, personaService: personaService, memoryService: memoryService, auditService: auditService, } } // GetHistory 获取对话历史 func (s *ChatService) GetHistory(ctx context.Context, sessionID string) ([]model.Message, error) { return s.memoryService.GetContext(ctx, sessionID) } // SaveContext 保存对话上下文 func (s *ChatService) SaveContext(ctx context.Context, sessionID string, messages []model.Message, personaID string) error { return s.memoryService.SaveContext(ctx, sessionID, messages, personaID) } // GetWelcomeMessage 获取欢迎消息 func (s *ChatService) GetWelcomeMessage(sessionID string, userID int64, starID int64) string { // 默认欢迎消息 return "亲爱的你来辣 ~~" } // StreamChat 流式对话(委托给 aiProvider) func (s *ChatService) StreamChat(ctx context.Context, messages []model.Message) (StreamReader, error) { return s.aiProvider.StreamChat(ctx, messages) } // Chat 非流式对话,收集所有流式 chunk 拼接为完整响应 func (s *ChatService) Chat(ctx context.Context, messages []model.Message) (string, error) { reader, err := s.aiProvider.StreamChat(ctx, messages) if err != nil { return "", err } defer reader.Close() var sb strings.Builder for { content, done, err := reader.Next() if err != nil { return sb.String(), err } sb.WriteString(content) if done { break } } return sb.String(), nil }