79 lines
2.1 KiB
Go
79 lines
2.1 KiB
Go
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
|
||
} |