📄 src/Infrastructure/Ai/ServiceCollectionExtensions.cs
using Microsoft.Extensions.AI;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Options;
using OllamaSharp;

namespace Slopper.Infrastructure.Ai;

public static class ServiceCollectionExtensions
{
    extension(IServiceCollection services)
    {
        public IServiceCollection AddAi()
        {
            services.AddOptions<EmbeddingOptions>().BindConfiguration("Embedding").ValidateOnStart();
            services.AddTransient<IValidateOptions<EmbeddingOptions>, EmbeddingOptionsValidator>();

            services.AddHttpClient<OllamaApiClient, OllamaApiClient>(
                (client, sp) =>
                {
                    var options = sp.GetRequiredService<IOptions<EmbeddingOptions>>().Value;
                    client.BaseAddress = options.Endpoint;
                    if (options.BasicAuth is not null)
                    {
                        client.DefaultRequestHeaders.Authorization = new("Basic", options.BasicAuth);
                    }
                    return new OllamaApiClient(client, options.Model);
                }
            );

            services.AddEmbeddingGenerator(sp => sp.GetRequiredService<OllamaApiClient>()).UseOpenTelemetry();

            return services;
        }
    }
}