-
Notifications
You must be signed in to change notification settings - Fork 21
Expand file tree
/
Copy pathChatService.cs
More file actions
104 lines (89 loc) · 3.28 KB
/
ChatService.cs
File metadata and controls
104 lines (89 loc) · 3.28 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
using MaIN.Domain.Configuration;
using MaIN.Domain.Entities;
using MaIN.Domain.Exceptions;
using MaIN.Domain.Models;
using MaIN.Infrastructure.Repositories.Abstract;
using MaIN.Services.Mappers;
using MaIN.Services.Services.Abstract;
using MaIN.Services.Services.ImageGenServices;
using MaIN.Services.Services.LLMService;
using MaIN.Services.Services.LLMService.Factory;
using MaIN.Services.Services.Models;
namespace MaIN.Services.Services;
public class ChatService(
ITranslatorService translatorService,
IChatRepository chatProvider,
ILLMServiceFactory llmServiceFactory,
IImageGenServiceFactory imageGenServiceFactory,
MaINSettings settings) : IChatService
{
public async Task Create(Chat chat)
{
chat.Type = ChatType.Conversation;
await chatProvider.AddChat(chat.ToDocument());
}
public async Task<ChatResult> Completions(
Chat chat,
bool translate = false,
bool interactiveUpdates = false,
Func<LLMTokenValue?, Task>? changeOfValue = null)
{
if (chat.Model == ImageGenService.LocalImageModels.FLUX)
{
chat.Visual = true;
}
chat.Backend ??= settings.BackendType;
chat.Messages.Where(x => x.Type == MessageType.NotSet).ToList()
.ForEach(x => x.Type = chat.Backend != BackendType.Self ? MessageType.CloudLLM : MessageType.LocalLLM);
translate = translate || chat.Translate;
interactiveUpdates = interactiveUpdates || chat.Interactive;
var newMsg = chat.Messages.Last();
newMsg.Time = DateTime.Now;
var lng = translate ? await translatorService.DetectLanguage(newMsg.Content) : null;
var originalMessages = chat.Messages;
if (translate)
{
chat.Messages = (await Task.WhenAll(chat.Messages.Select(async m => new Message()
{
Role = m.Role,
Content = await translatorService.Translate(m.Content, "en"),
Type = m.Type
}))).ToList();
}
var result = chat.Visual
? await imageGenServiceFactory.CreateService(chat.Backend.Value).Send(chat)
: await llmServiceFactory.CreateService(chat.Backend.Value).Send(chat, new ChatRequestOptions()
{
InteractiveUpdates = interactiveUpdates,
TokenCallback = changeOfValue
});
if (translate)
{
result!.Message.Content = await translatorService.Translate(result.Message.Content, lng!);
result.Message.Time = DateTime.Now;
}
originalMessages.Add(result!.Message);
chat.Messages = originalMessages;
await chatProvider.UpdateChat(chat.Id!, chat.ToDocument());
return result;
}
public async Task Delete(string id)
{
var chat = await chatProvider.GetChatById(id);
var llmService = llmServiceFactory.CreateService(chat?.Backend ?? settings.BackendType);
await llmService.CleanSessionCache(id);
await chatProvider.DeleteChat(id);
}
public async Task<Chat> GetById(string id)
{
var chatDocument = await chatProvider.GetChatById(id);
if (chatDocument == null)
{
throw new ChatNotFoundException(id);
}
return chatDocument.ToDomain();
}
public async Task<List<Chat>> GetAll()
=> (await chatProvider.GetAllChats())
.Select(x => x.ToDomain()).ToList();
}