topfans/backend/services/aiChatService/service/chat_service.go
2026-07-06 10:25:06 +08:00

79 lines
2.1 KiB
Go
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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
}