Skip to content

Commit

Permalink
123: Added image generation library
Browse files Browse the repository at this point in the history
  • Loading branch information
jarmatys committed Dec 21, 2024
1 parent 909842b commit e694530
Show file tree
Hide file tree
Showing 17 changed files with 230 additions and 44 deletions.
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
<Project Sdk="Microsoft.NET.Sdk">

<PropertyGroup>
<TargetFramework>net9.0</TargetFramework>
<ImplicitUsings>enable</ImplicitUsings>
<Nullable>enable</Nullable>
</PropertyGroup>

<ItemGroup>
<InternalsVisibleTo Include="ASSISTENTE.Infrastructure"/>
</ItemGroup>

<ItemGroup>
<ProjectReference Include="..\ASSISTENTE.Infrastructure.LLM.OpenAi\ASSISTENTE.Infrastructure.LLM.OpenAi.csproj" />
</ItemGroup>

</Project>
8 changes: 8 additions & 0 deletions API/ASSISTENTE.Infrastructure.Image/Contracts/IImageClient.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
using CSharpFunctionalExtensions;

namespace ASSISTENTE.Infrastructure.Image.Contracts;

public interface IImageClient
{
Task<Result<ImageDetails>> GenerateImage(ImagePrompt imagePrompt);
}
27 changes: 27 additions & 0 deletions API/ASSISTENTE.Infrastructure.Image/Contracts/ImageDetails.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
using CSharpFunctionalExtensions;
using SOFTURE.Results;

namespace ASSISTENTE.Infrastructure.Image.Contracts;

public sealed class ImageDetails : ValueObject
{
private ImageDetails(string imageUrl)
{
ImageUrl = imageUrl;
}

public string ImageUrl { get; }

public static Result<ImageDetails> Create(string? imageUrl)
{
if (string.IsNullOrEmpty(imageUrl))
return Result.Failure<ImageDetails>(CommonErrors.EmptyParameter.Build());

return new ImageDetails(imageUrl);
}

protected override IEnumerable<IComparable> GetEqualityComponents()
{
yield return ImageUrl;
}
}
27 changes: 27 additions & 0 deletions API/ASSISTENTE.Infrastructure.Image/Contracts/ImagePrompt.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
using CSharpFunctionalExtensions;
using SOFTURE.Results;

namespace ASSISTENTE.Infrastructure.Image.Contracts;

public sealed class ImagePrompt : ValueObject
{
private ImagePrompt(string prompt)
{
Prompt = prompt;
}

public string Prompt { get; }

public static Result<ImagePrompt> Create(string prompt)
{
if (string.IsNullOrEmpty(prompt))
return Result.Failure<ImagePrompt>(CommonErrors.EmptyParameter.Build());

return new ImagePrompt(prompt);
}

protected override IEnumerable<IComparable> GetEqualityComponents()
{
yield return Prompt;
}
}
6 changes: 6 additions & 0 deletions API/ASSISTENTE.Infrastructure.Image/Contracts/VisionType.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
namespace ASSISTENTE.Infrastructure.Image.Contracts;

public enum VisionType
{
OpenAi
}
20 changes: 20 additions & 0 deletions API/ASSISTENTE.Infrastructure.Image/DependencyInjection.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
using ASSISTENTE.Infrastructure.Image.Contracts;
using ASSISTENTE.Infrastructure.LLM.OpenAi;
using ASSISTENTE.Infrastructure.LLM.OpenAi.Settings;
using Microsoft.Extensions.DependencyInjection;

namespace ASSISTENTE.Infrastructure.Image
{
internal static class DependencyInjection
{
public static IServiceCollection AddOpenAiImage<TSettings>(this IServiceCollection services)
where TSettings : IOpenAiSettings
{
services.AddOpenAi<TSettings>();

services.AddScoped<IImageClient, OpenAiClient>();

return services;
}
}
}
27 changes: 27 additions & 0 deletions API/ASSISTENTE.Infrastructure.Image/OpenAiClient.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
using ASSISTENTE.Infrastructure.Image.Contracts;
using ASSISTENTE.Infrastructure.LLM.OpenAi.Errors;
using CSharpFunctionalExtensions;
using OpenAI;
using OpenAI.Images;

namespace ASSISTENTE.Infrastructure.Image;

internal sealed class OpenAiClient(OpenAIClient client) : IImageClient
{
public async Task<Result<ImageDetails>> GenerateImage(ImagePrompt imagePrompt)
{
var request = new ImageGenerationRequest(
prompt: imagePrompt.Prompt,
size: "1024x1024"
);

var response = await client.ImagesEndPoint.GenerateImageAsync(request);

if (response is null)
return Result.Failure<ImageDetails>(ClientErrors.EmptyAnswer.Build());

var imageDetails = response.FirstOrDefault();

return ImageDetails.Create(imageDetails?.Url);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@
<InternalsVisibleTo Include="ASSISTENTE.Infrastructure.LLM"/>
<InternalsVisibleTo Include="ASSISTENTE.Infrastructure.Audio"/>
<InternalsVisibleTo Include="ASSISTENTE.Infrastructure.Vision"/>
<InternalsVisibleTo Include="ASSISTENTE.Infrastructure.Image"/>
</ItemGroup>

</Project>
Original file line number Diff line number Diff line change
Expand Up @@ -4,5 +4,5 @@ namespace ASSISTENTE.Infrastructure.Vision.Contracts;

public interface IVisionClient
{
Task<Result<Recognition>> Recognize(Image image);
Task<Result<Recognition>> Recognize(VisionImage visionImage);
}
Original file line number Diff line number Diff line change
Expand Up @@ -3,9 +3,9 @@

namespace ASSISTENTE.Infrastructure.Vision.Contracts;

public sealed class Image : ValueObject
public sealed class VisionImage : ValueObject
{
private Image(string prompt, string imageUrl)
private VisionImage(string prompt, string imageUrl)
{
Prompt = prompt;
ImageUrl = imageUrl;
Expand All @@ -14,25 +14,25 @@ private Image(string prompt, string imageUrl)
public string Prompt { get; }
public string ImageUrl { get; }

public static Result<Image> Create(string prompt, string imageBase64, string extension)
public static Result<VisionImage> Create(string prompt, string imageBase64, string extension)
{
if (string.IsNullOrEmpty(imageBase64))
return Result.Failure<Image>(CommonErrors.EmptyParameter.Build());
return Result.Failure<VisionImage>(CommonErrors.EmptyParameter.Build());

if (string.IsNullOrEmpty(extension))
return Result.Failure<Image>(CommonErrors.EmptyParameter.Build());
return Result.Failure<VisionImage>(CommonErrors.EmptyParameter.Build());

var imageUrl = $"data:image/{extension.Replace(".", "")};base64,{imageBase64}";

return new Image(prompt, imageUrl);
return new VisionImage(prompt, imageUrl);
}

public static Result<Image> Create(string prompt, string imageUrl)
public static Result<VisionImage> Create(string prompt, string imageUrl)
{
if (string.IsNullOrEmpty(imageUrl))
return Result.Failure<Image>(CommonErrors.EmptyParameter.Build());
return Result.Failure<VisionImage>(CommonErrors.EmptyParameter.Build());

return new Image(prompt, imageUrl);
return new VisionImage(prompt, imageUrl);
}

protected override IEnumerable<IComparable> GetEqualityComponents()
Expand Down
6 changes: 3 additions & 3 deletions API/ASSISTENTE.Infrastructure.Vision/OpenAiClient.cs
Original file line number Diff line number Diff line change
Expand Up @@ -10,12 +10,12 @@ namespace ASSISTENTE.Infrastructure.Vision;

internal sealed class OpenAiClient(OpenAIClient client) : IVisionClient
{
public async Task<Result<Recognition>> Recognize(Image image)
public async Task<Result<Recognition>> Recognize(VisionImage visionImage)
{
var imageUrl = new ImageUrl(image.ImageUrl);
var imageUrl = new ImageUrl(visionImage.ImageUrl);
var messages = new List<ChatMessage>
{
new(Role.System, image.Prompt),
new(Role.System, visionImage.Prompt),
new(Role.User, new List<Content>
{
new(imageUrl)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@
<ProjectReference Include="..\ASSISTENTE.Infrastructure.Audio\ASSISTENTE.Infrastructure.Audio.csproj" />
<ProjectReference Include="..\ASSISTENTE.Infrastructure.CodeParser\ASSISTENTE.Infrastructure.CodeParser.csproj"/>
<ProjectReference Include="..\ASSISTENTE.Infrastructure.Firecrawl\ASSISTENTE.Infrastructure.Firecrawl.csproj" />
<ProjectReference Include="..\ASSISTENTE.Infrastructure.Image\ASSISTENTE.Infrastructure.Image.csproj" />
<ProjectReference Include="..\ASSISTENTE.Infrastructure.Langfuse\ASSISTENTE.Infrastructure.Langfuse.csproj" />
<ProjectReference Include="..\ASSISTENTE.Infrastructure.MarkDownParser\ASSISTENTE.Infrastructure.MarkDownParser.csproj"/>
<ProjectReference Include="..\ASSISTENTE.Infrastructure.Embeddings\ASSISTENTE.Infrastructure.Embeddings.csproj"/>
Expand Down
2 changes: 2 additions & 0 deletions API/ASSISTENTE.Infrastructure/DependencyInjection.cs
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@
using ASSISTENTE.Infrastructure.Enums;
using ASSISTENTE.Infrastructure.Firecrawl;
using ASSISTENTE.Infrastructure.Firecrawl.Settings;
using ASSISTENTE.Infrastructure.Image;
using ASSISTENTE.Infrastructure.Langfuse;
using ASSISTENTE.Infrastructure.Langfuse.Settings;
using ASSISTENTE.Infrastructure.LLM;
Expand Down Expand Up @@ -42,6 +43,7 @@ public static IServiceCollection AddInfrastructure<TSettings>(
services.AddOpenAiEmbeddings<TSettings>();
services.AddOpenAiAudio<TSettings>();
services.AddOpenAiVision<TSettings>();
services.AddOpenAiImage<TSettings>();
}

if (privacyMode == PrivacyMode.Local)
Expand Down
2 changes: 1 addition & 1 deletion API/ASSISTENTE.Playground/Playground.cs
Original file line number Diff line number Diff line change
Expand Up @@ -40,7 +40,7 @@ public async Task LearnAsync()

public async Task RunAsync()
{
var result = await weekTwo.Task_02();
var result = await weekTwo.Task_03();

result
.Log("Task completed!", logger)
Expand Down
9 changes: 5 additions & 4 deletions API/ASSISTENTE.Playground/Tasks/WeekOne.cs
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,8 @@ public class WeekOne(
IFirecrawlService firecrawlService,
ILlmClient llmClient)
{
private const string ApiKey = "<API-KEY>";

public async Task<Result> Task_01()
{
const string url = "https://xyz.ag3nts.org";
Expand Down Expand Up @@ -69,7 +71,6 @@ public async Task<Result> Task_03()

const string url = "https://centrala.ag3nts.org/report";
const string taskName = "JSON";
const string apiKey = "<API-KEY>";
const string filePath = "Data/data.json";

var fileContent = await File.ReadAllTextAsync(filePath);
Expand Down Expand Up @@ -107,7 +108,7 @@ public async Task<Result> Task_03()
var request = new TaskRequestModel
{
Task = taskName,
ApiKey = apiKey,
ApiKey = ApiKey,
Answer = parsedFile
};

Expand All @@ -128,7 +129,7 @@ public async Task<Result> Task_03()

public async Task<Result> Task_05()
{
const string fileUrl = "https://centrala.ag3nts.org/data/<API-KEY>/cenzura.txt";
const string fileUrl = $"https://centrala.ag3nts.org/data/{ApiKey}/cenzura.txt";

var fileResponse = await httpClient.GetAsync(fileUrl);
var fileContent = await fileResponse.Content.ReadAsStringAsync();
Expand All @@ -141,7 +142,7 @@ public async Task<Result> Task_05()
var request = new TaskRequestModel
{
Task = taskName,
ApiKey = "8bc8fcfb-f273-435c-bcb8-284d12cfa30e",
ApiKey = ApiKey,
Answer = result.Value.Text
};

Expand Down
Loading

0 comments on commit e694530

Please sign in to comment.