Microsoft.Extensions.AI, .NET ekosisteminde farklı yapay zeka sağlayıcılarını tek bir standart arayüz üzerinden kullanmanızı sağlayan resmi abstraction katmanıdır. OpenAI, Azure OpenAI, Ollama veya başka herhangi bir AI sağlayıcısına geçiş yapmak istediğinizde yalnızca DI konfigürasyonunu değiştirmeniz yeterlidir; uygulama kodunuzun geri kalanı aynen çalışmaya devam eder.

Neden Microsoft.Extensions.AI?

Her AI sağlayıcısının kendi SDK'sı ve API tasarımı vardır. Bugün OpenAI kullanan bir servis katmanını yarın Azure OpenAI'ye taşımak zorunda kalırsanız tüm kodu yeniden yazmanız gerekebilir. Microsoft.Extensions.AI bu sorunu IChatClient ve IEmbeddingGenerator<TInput, TEmbedding> gibi sağlayıcı bağımsız arayüzlerle çözer.

Kurulum

// dotnet add package Microsoft.Extensions.AI
// dotnet add package Microsoft.Extensions.AI.OpenAI
// dotnet add package Microsoft.Extensions.AI.Ollama

IChatClient: Temel Kullanım

using Microsoft.Extensions.AI;
using OpenAI;

IChatClient chatClient = new OpenAIClient("sk-...")
    .AsChatClient("gpt-4o");

// Tek satır soru-yanıt
var response = await chatClient.CompleteAsync(
    "C# 12 primary constructors nasıl çalışır?");
Console.WriteLine(response.Message.Text);

// Çok turlu konuşma — sohbet geçmişiyle
var messages = new List<ChatMessage>
{
    new(ChatRole.System, "Sen .NET uzmanı bir asistansın. Net ve kısa yanıtlar ver."),
    new(ChatRole.User, "Span<T> nedir?"),
    new(ChatRole.Assistant, "Span<T>, heap allocation olmadan bellek dilimlerine erişim sağlayan yüksek performanslı bir struct'tır."),
    new(ChatRole.User, "Memory<T> ile farkı nedir?")
};

var result = await chatClient.CompleteAsync(messages);
Console.WriteLine(result.Message.Text);

Dependency Injection ile Kayıt

// Program.cs
builder.Services
    .AddOpenAIClient(options =>
        options.ApiKey = builder.Configuration["OpenAI:ApiKey"]!)
    .AddChatClient("gpt-4o")
    .UseLogging()           // istek/yanıt otomatik loglanır
    .UseOpenTelemetry()     // distributed tracing
    .UseFunctionInvocation(); // otomatik tool çağrısı

// Servis sınıfında kullanım
public class BlogAssistantService(IChatClient chatClient)
{
    public async Task<string> OzetleAsync(string icerik)
    {
        var response = await chatClient.CompleteAsync(
            $"Aşağıdaki içeriği 3 cümleyle özetle:\n\n{icerik}");
        return response.Message.Text ?? string.Empty;
    }
}

Streaming: Token Token Çıktı

// Konsolda gerçek zamanlı çıktı
await foreach (var update in chatClient.CompleteStreamingAsync(
    "ASP.NET Core middleware pipeline'ını adım adım açıkla"))
{
    Console.Write(update.Text);
}

// ASP.NET Core'da Server-Sent Events endpoint
app.MapGet("/api/chat/stream", async (string soru, IChatClient chat, CancellationToken ct) =>
{
    async IAsyncEnumerable<string> TokenStream()
    {
        await foreach (var chunk in chat.CompleteStreamingAsync(soru, cancellationToken: ct))
            if (chunk.Text is { Length: > 0 })
                yield return chunk.Text;
    }
    return Results.Text(TokenStream().ToBlockingEnumerable().Aggregate("", (a, b) => a + b));
});

IEmbeddingGenerator: Vektör Üretimi

IEmbeddingGenerator<string, Embedding<float>> embedder =
    new OpenAIClient("sk-...")
        .AsEmbeddingGenerator("text-embedding-3-small");

var embedding = await embedder.GenerateEmbeddingVectorAsync(
    "ASP.NET Core dependency injection nedir?");
Console.WriteLine($"Vektör boyutu: {embedding.Length}"); // 1536

// Toplu embedding — daha verimli (tek API isteği)
var metinler = new[] { "C# generics", "LINQ nedir?", "async/await" };
var embeddings = await embedder.GenerateAsync(metinler);

Ollama ile Yerel Model

// API key gerektirmez — gizlilik gerektiren senaryolar için ideal
IChatClient ollamaClient = new OllamaChatClient(
    new Uri("http://localhost:11434"),
    "llama3.1");

// Kod tamamen aynı, sadece istemci değişti
var lokalYanit = await ollamaClient.CompleteAsync(
    "C# ile async programlama nasıl yapılır?");
Console.WriteLine(lokalYanit.Message.Text);

Middleware Pipeline: Cache ve Logging

builder.Services
    .AddOpenAIClient(opts => opts.ApiKey = config["OpenAI:ApiKey"]!)
    .AddChatClient("gpt-4o")
    .UseDistributedCache()   // aynı prompt için API'ye ikinci kez gitme
    .UseLogging()
    .UseOpenTelemetry();

// Redis cache ile entegrasyon
builder.Services.AddStackExchangeRedisCache(opts =>
    opts.Configuration = config.GetConnectionString("Redis"));
// veya geliştirme için:
builder.Services.AddDistributedMemoryCache();

Microsoft.Extensions.AI, .NET uygulamalarınıza yapay zeka entegre etmenin standart ve taşınabilir yolunu sunuyor. Sağlayıcı bağımsızlığı, middleware pipeline desteği ve .NET DI ekosistemiyle tam uyum sayesinde AI özelliklerini production'a taşımak artık çok daha az sürtünmeyle gerçekleşiyor.