-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathProgram.cs
130 lines (107 loc) · 4.27 KB
/
Program.cs
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
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
using Common.AiDevsApi.Contracts;
using Common.AiDevsApi.Extensions;
using Common.AiDevsApi.Models;
using Common.Cache.Contracts;
using Common.Cache.Extensions;
using Common.OpenAI;
using Microsoft.Extensions.DependencyInjection;
using OpenAI;
using OpenAI.Audio;
using OpenAI.Chat;
using S02E04;
using S02E04.Models;
var builder = Host.CreateApplicationBuilder(args);
builder.Services
.AddAiDevsApi()
.AddOpenAIClient()
.AddOpenAIChatClient()
.AddFileCacheService();
var host = builder.Build();
await using var scope = host.Services.CreateAsyncScope();
var sp = scope.ServiceProvider;
var directory = Path.Combine(AppContext.BaseDirectory, "Resources", "pliki_z_fabryki");
var categorized = await GetTextContents(directory)
.SelectAwait(async (file) => (file.Name, Category: await AssignCategory(file.Content)))
.ToLookupAsync(file => file.Category, file => file.Name);
var people = categorized[Category.People].OrderBy(file => file).ToArray();
var hardware = categorized[Category.Hardware].OrderBy(file => file).ToArray();
var taskAnswer = new TaskAnswer<TaskAnswerData>
{
Task = "kategorie",
Answer = new TaskAnswerData { People = people, Hardware = hardware },
};
Console.WriteLine(JsonSerializer.Serialize(taskAnswer));
Console.WriteLine();
var response = await sp.GetRequiredService<IAiDevsApiService>().VerifyTaskAnswerAsync(taskAnswer);
Console.WriteLine(JsonSerializer.Serialize(response));
async IAsyncEnumerable<(string Name, string Content)> GetTextContents(string directory)
{
var textFiles = Directory.EnumerateFiles(directory, "*.txt", SearchOption.TopDirectoryOnly);
foreach (var textFile in textFiles)
{
var content = await File.ReadAllTextAsync(textFile);
yield return (Path.GetFileName(textFile), content);
}
var cacheService = sp.GetRequiredService<ICacheService>();
var audioFiles = Directory.EnumerateFiles(directory, "*.mp3", SearchOption.TopDirectoryOnly);
foreach (var audioFile in audioFiles)
{
var cacheKey = Path.GetFileName(audioFile);
var content = await cacheService.GetAsync(cacheKey);
if (content is null)
{
content = await GetAudioContent(audioFile);
await cacheService.SetAsync(cacheKey, content);
}
yield return (Path.GetFileName(audioFile), content);
}
var imageFiles = Directory.EnumerateFiles(directory, "*.png", SearchOption.TopDirectoryOnly);
foreach (var imageFile in imageFiles)
{
var cacheKey = Path.GetFileName(imageFile);
var content = await cacheService.GetAsync(cacheKey);
if (content is null)
{
content = await GetImageContent(imageFile);
await cacheService.SetAsync(cacheKey, content);
}
yield return (Path.GetFileName(imageFile), content);
}
}
async Task<string> GetAudioContent(string filePath)
{
var audioClient = sp.GetRequiredService<OpenAIClient>().GetAudioClient("whisper-1");
AudioTranscriptionOptions options = new()
{
ResponseFormat = AudioTranscriptionFormat.Simple,
};
var transcription = await audioClient.TranscribeAudioAsync(filePath, options);
return transcription.Value.Text;
}
async Task<string> GetImageContent(string filePath)
{
var chatClient = sp.GetRequiredService<ChatClient>();
await using Stream imageStream = File.OpenRead(filePath);
var imageBytes = BinaryData.FromStream(imageStream);
List<ChatMessage> messages =
[
new SystemChatMessage(Prompts.SystemExtractNoteText),
new UserChatMessage(
ChatMessageContentPart.CreateTextPart(Prompts.UserExtractNoteText),
ChatMessageContentPart.CreateImagePart(imageBytes, MimeTypes.GetMimeType(filePath))),
];
var response = await chatClient.CompleteChatAsync(messages);
return response.Value.Content[0].Text;
}
async Task<Category> AssignCategory(string text)
{
var chatClient = sp.GetRequiredService<ChatClient>();
List<ChatMessage> messages =
[
new SystemChatMessage(Prompts.Categorize),
new UserChatMessage(text),
];
var response = await chatClient.CompleteChatAsync(messages);
var responseText = response.Value.Content[0].Text;
return Enum.Parse<Category>(responseText, ignoreCase: true);
}