70 lines
2.1 KiB
Go
70 lines
2.1 KiB
Go
package service
|
||
|
||
import (
|
||
"context"
|
||
|
||
"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
|
||
contextTTL int // 上下文过期时间(秒)
|
||
triggerTurns int // 触发记忆提取的轮数
|
||
}
|
||
|
||
// NewChatService 创建对话服务
|
||
func NewChatService(
|
||
aiProvider AIProvider,
|
||
personaService *PersonaService,
|
||
memoryService *MemoryService,
|
||
auditService *AuditService,
|
||
contextTTL int,
|
||
triggerTurns int,
|
||
) *ChatService {
|
||
return &ChatService{
|
||
aiProvider: aiProvider,
|
||
personaService: personaService,
|
||
memoryService: memoryService,
|
||
auditService: auditService,
|
||
contextTTL: contextTTL,
|
||
triggerTurns: triggerTurns,
|
||
}
|
||
}
|
||
|
||
// 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)
|
||
}
|
||
|
||
// ExtractMemory 提取记忆(接收 LLM 提取结果)
|
||
func (s *ChatService) ExtractMemory(ctx context.Context, userID int64, recentMessages []model.Message, extractedMemories []string) error {
|
||
if ShouldExtractMemory(recentMessages, s.triggerTurns) {
|
||
return s.memoryService.ExtractMemory(ctx, userID, recentMessages, extractedMemories)
|
||
}
|
||
return nil
|
||
}
|
||
|
||
// 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)
|
||
} |