AutoGen İle Semantic Kernel Kullanımı ve MCP Desteği
Merhaba,
Bu içeriğimizde AutoGen ile birlikte Semantic Kernel kullanımını pratiksel olarak inceleyecek ve bir yandan da çoklu agent sürecini yeteneksel açıdan daha da zenginleştirebilmek için Model Context Protocol (MCP) desteğini devreye sokup dış servisleri de sürece dahil edeceğiz. Evet, böylece çoklu agent’lara dair önemli bir ihtiyaca da cevap vermiş ve sonraki yapay zekâ çalışmaları için kritik bir safhaya kaynak oluşturmuş olacağız. Hazırsanız, başlayalım…
Temel Kurulumlar
İçerik sürecinde, Semantic Kernel ve MCP teknolojilerinin kullanımı için AutoGen merkezli bir yaklaşımdan yola çıkacak ve bu odakta diğer teknolojileri sürece dahil etmeye çalışacağız. Bundan kaynaklı ilgili projeye öncelikle dotnet add package AutoGen talimatı eşliğinde AutoGen kütüphanesinin yüklenmesi gerekmektedir. Tabi bu kütüphane içerisinde aşağıdaki ekran görüntüsünde olduğu gibi AutoGen.SemanticKernel kütüphanesi dependency olarak gelmektedir.
Haliyle buradan yola çıkarak Semantic Kernel’ın kurulmasına gerek olmadığını düşünebilirsiniz, ancak! bu yazının yazıldığı tarihlerde AutoGen kütüphanesinin barındırdığı bu Semantic Kernel dependency’sine göz atarsanız eğer 1.45.0 sürümü olduğunu göreceksiniz.
Ee haliyle bu durumda, bu sürümle yola devam edersek eğer, içerik sürecinde ele alacağımız MCP çalışmalarına dair AI modele gönderilen prompt’ların mahiyetlerine göre gerekli tool’ların tetiklenmediğini görecek ve AI modelden türlü hataların alındığına dair cevapların döndüğünü deneyimleyeceğiz. İşte süreçte bu acı tecrübeyi yaşamamak için Semantic Kernel’ı, bu hatalardan arındırılmış yeni sürümlerine güncellememiz gerekecektir. Bundan kaynalı ilgili kütüphane için
dotnet add package Microsoft.SemanticKernel talimatıyla sürüm güncellemesinin gerçekleştirilmesi gerekmektedir. Böylece daha güvenli ve emin adımlarla Semantic Kernel çalışmalarına odaklanabilecek ve makale sürecindeki hiçbir adımda beklenmeyen hatalarla karşılaşmaksızın yolumuza devam ediyor olacağız.
Bunların dışında bir de MCP ile ilgili dış yeteneklerin sürece kazandırılabilmesi için gerekli olan çalışmaları yürütebilmek maksadıyla dotnet add package ModelContextProtocol talimatıyla MCP kütüphanesinin yüklenmesi gerekmektedir.
Evet, artık bu kurulumlar neticesinde AutoGen, Semantic Kernel ve MCP üçlemesine dair gönül rahatlığıyla çalışmalarımıza başlayabiliriz.
AutoGen Üzerinden SemanticKernelAgent Kullanımı
İlk olarak AutoGen kapsamında Semantic Kernel’ı nasıl kullanabileceğimizi değerlendireceğiz. Tabi bunun için klasik Semantic Kernel yapılandırmasından ziyade AutoGen’in bizlere sunduğu SemanticKernelAgent‘la tanışacağız.
Şimdi öncelikle AutoGen olmaksızın Semantic Kernel’ı klasik bir şekilde nasıl yapılandırabildiğimizi hatırlayalım;
var builder = Kernel.CreateBuilder();
builder.AddOpenAIChatCompletion(
modelId: model,
openAIClient: new OpenAIClient(
credential: new ApiKeyCredential(apiKey),
options: new OpenAIClientOptions
{
Endpoint = new Uri(endpoint)
}
)
);
var kernel = builder.Build();
var response = await kernel.InvokePromptAsync("Merhaba, nasılsın?");
Console.WriteLine(response);
Bakın! Bunu zaten bildiğinizi varsayıyorum 🙂 Buradaki kernel üzerinden her türlü AI modelle etkileşime girebilir ve çalışmalarımızı yürütebiliriz. Şimdi de AutoGen ile gelen Semantic Kernel altyapısında tasarlanmış SemanticKernelAgent‘a odaklanalım;
var builder = Kernel.CreateBuilder()
.AddOpenAIChatCompletion(
modelId: model,
apiKey: apiKey,
endpoint: new Uri(endpoint)
);
var kernel = builder.Build();
var semanticKernelAgent = new SemanticKernelAgent(
kernel: kernel,
name: "semanticKernelAssistant",
systemMessage: "Sen kullanıcıya yardımcı olan bir asistansın!"
)
.RegisterMessageConnector()
.RegisterPrintMessage();
Dikkat ederseniz SemanticKernelAgent direkt system prompt’u yapılandırabileceğimiz bir imkan tanımakta ve sadece AI modelle etkileşim sağlamayarak bir yandan da hali hazırda bir agent sunmaktadır.
Hoca la! Klasik Semantic Kernel yapılandırmasında system prompt’unu nasıl ayarlıyorduk? diye sorduğunuzu duyar gibiyim… Klasik Semantic Kernel yapılandırmasında bu ayarlamayı aşağıdaki gibi CreateFunctionFromPrompt metodu eşliğinde system function oluşturarak gerçekleştiriyor ve AI modelle olan tüm etkileşimi bu system function üzerinden yürütüyorduk.
var agentSystemPrompt = @"
Sen kullanıcıya yardımcı olan bir asistansın!
";
var systemFunction = kernel.CreateFunctionFromPrompt(
promptTemplate: agentSystemPrompt,
executionSettings: new PromptExecutionSettings
{
FunctionChoiceBehavior = FunctionChoiceBehavior.Auto()
});
Halbuki AutoGen sayesinde buradaki uzun tarifler SemanticKernelAgent sayesinde süreçten törpülenmekte ve tek kalemde hızlıca tanımlama gerçekleştirilebilmektedir.
Bunların dışında, oluşturulan kernel sınıfı, ister Semantic Kernel’dan olsun isterse de AutoGen’den fark etmeksizin birebir aynı işlevsellikte ve konfigürasyonda plugin yapılandırmasına sahiptir diyebiliriz.
SemanticKernelAgent İle Tekil Haberleşme
Birazdan içeriğimiz devamında SemanticKernelAgent‘ı diğer agent’lar ile nasıl haberleştirebileceğimizi inceleyeceğiz. Lakin bundan önce bu agent türünü tekil olarak nasıl kullanabileceğimizi hızlıca görelim istiyorum;
var builder = Kernel.CreateBuilder()
.AddOpenAIChatCompletion(
modelId: model,
apiKey: apiKey,
endpoint: new Uri(endpoint)
);
var kernel = builder.Build();
var semanticKernelAgent = new SemanticKernelAgent(
kernel: kernel,
name: "semanticKernelAssistant",
systemMessage: "Sen kullanıcıya yardımcı olan bir asistansın!"
)
.RegisterMessageConnector()
.RegisterPrintMessage();
await semanticKernelAgent.SendAsync("Bir matematiksel işlem düşün ve bu işlem neticesinin 9 olduğunu varsay. Sence bu işlem hangi sayılarla, neler olabilir?");
Burada görüldüğü üzere SemanticKernelAgent ile tekil olarak haberleşmek oldukça kolay ve sade bir şekilde gerçekleştirilebilmektedir.
SemanticKernelAgent İle Farklı Bir Agent’ı Haberleştirme
Şimdi de SemanticKernelAgent‘ı farklı bir agent ile haberleştirmeyi ele alalım. Tabi bunun için aşağıdaki gibi agent’lar arası basit bir sayı tahmin oyununu kurgulamamız yerinde bir örnek olacaktır kanaatindeyim.
var builder = Kernel.CreateBuilder()
.AddOpenAIChatCompletion(
modelId: model,
apiKey: apiKey,
endpoint: new Uri(endpoint)
);
var kernel = builder.Build();
var semanticKernelAgent = new SemanticKernelAgent(
kernel: kernel,
name: "semanticKernelAgent",
systemMessage: "Sayı tahmin eden bir agent'sın."
)
.RegisterMessageConnector()
.RegisterPrintMessage();
var assistantAgent = new AutoGen.OpenAI.OpenAIChatAgent(
chatClient: new OpenAI.Chat.ChatClient(
model: model,
credential: new ApiKeyCredential(apiKey),
options: new OpenAIClientOptions()
{
Endpoint = new Uri(endpoint)
}),
name: "assistantAgent",
systemMessage: "Rastgele bir sayı tutacaksın ta ki diğer agent tahmin edene kadar bir tahmin oyunu oynayacaksın.")
.RegisterMessageConnector()
.RegisterPrintMessage();
var result = semanticKernelAgent.InitiateChatAsync(
receiver: assistantAgent,
message: "3 ile başlayalım.",
maxRound: 100);
Yukarıdaki çalışmayı derleyip, çalıştırırsanız eğer aşağıdaki gibi iki agent arasında tahmin oyununun cereyan ettiğine şahitlik edebilirsiniz.
Nasıl ama 🙂 İki insan gibi kendi aralarında konuşup, eğleniyorlar 🤣
Hatta burada çitayı biraz daha yükseltelim ve agent’lar arası gıybet dedikodu atmosferi yaratarak kültürümüze uygun bir çalışma sergileyelim…
Agent’lar Arası Gıybet & Dedikodu Örneği
var builder = Kernel.CreateBuilder()
.AddOpenAIChatCompletion(
modelId: model,
apiKey: apiKey,
endpoint: new Uri(endpoint)
);
var kernel = builder.Build();
var semanticKernelAgent = new SemanticKernelAgent(
kernel: kernel,
name: "semanticKernelAssistant",
systemMessage: @"
Gıybet dedikodu seven bir agent'sın.
Masum bir şekilde Gençay Yıldız hakkında dedikodu yapıyorsun."
)
.RegisterMessageConnector()
.RegisterPrintMessage();
var assistantAgent = new AutoGen.OpenAI.OpenAIChatAgent(
chatClient: new OpenAI.Chat.ChatClient(
model: model,
credential: new ApiKeyCredential(apiKey),
options: new OpenAIClientOptions()
{
Endpoint = new Uri(endpoint)
}),
name: "assistant",
systemMessage: @"
Gıybet dedikodu seven bir agent'sın.
Özellikle bu tarz konularda muhabbete eşlik etmeye bayılırsın.
Ve masum bir şekilde Gençay Yıldız hakkında dedikodu yapıyorsun.")
.RegisterMessageConnector()
.RegisterPrintMessage();
var result = semanticKernelAgent.InitiateChatAsync(
receiver: assistantAgent,
message: "Hadi gel Gençay Yıldız hakkında masum bir şekilde gıybet yapalım :)",
maxRound: 100);
Yukarıdaki kod bloğuna bakarsanız agent’lara dedikodu malzemesi olarak kendimi kurban ettiğimi görmüşsünüzdür 🙂 Hadi bakalım, bu kodun çalıştırılması neticesinde kulağım nasıl çınlayacak merak etmiyor değilim doğrusu 🤣
P*ze**klere baakk senn 🙂 Ulan iki satırlık agent’sınız şu dediklerinizi olmayan kulaklarınız duyuyor mu lo sizin🤣Valla yapay zeka felan demem sopayla kovalarım…
Neyse 🙂
Şimdi geldik içeriğin en can alıcı noktasına… AutoGen ile birlikte MCP desteği alarak süreci yetenek açısından daha da zengin kılmaya…
AutoGen İle Birlikte MCP Kullanımı
AutoGen’in .NET sürümünde MCP ile doğrudan bir uyumluluk söz konusu değildir. Bunun nedeni, AutoGen esas olarak Python tabanlı tasarlanmıştır ve MCP entegrasyonu da bu ekosistemde geçerlilik göstermektedir. Haliyle bizler bu durumu aşabilmek için yine .NET dostu olan Semantic Kernel’dan istifade edecek ve çözüm getireceğiz.
Bunu örneklendirebilmek için önceki yazılarımdan birinde (bknz: Semantic Kernel ve MCP Eşliğinde Bir Görev Yönetimi AI Agent’ı Oluşturalım) örneklendirdiğimiz görev yönetimi senaryosuna benzer bir çalışmayı AutoGen üzerinden SemanticKernelAgent‘ı kullanarak test edecek ve böylece AutoGen ile birlikte MCP’yi deneyimlemiş olacağız.
Haliyle ilk olarak MCP ile ilgili MCP Host/Client çalışmalarını aşağıdaki gibi yürütelim istiyorum;
IMcpClient mcpClient = await McpClientFactory.CreateAsync(
clientTransport: new SseClientTransport(new()
{
Endpoint = new Uri("https://api.mcpverse.dev/api/mcp/sse?server_id=9d34001*****f-5e2b617eef93"),
Name = "todoist.mcpverse.dev",
AdditionalHeaders = new()
{
["Authorization"] = "Bearer sk_7xLQj-oEqsC4*********"
}
}),
clientOptions: new McpClientOptions
{
ClientInfo = new Implementation()
{
Name = "MCP.Client",
Version = "1.0.0"
}
});
var tools = await mcpClient.ListToolsAsync();
Evet, burada yine yukarıda referans ettiğim içeriğimizde olduğu gibi mcpverse.dev platformundan destek alıyor olacağız. Görüldüğü üzere burada MCP Server’a bağlantı sağlamakta ve ilgili server’ın bize sunduğu tool’ları elde etmekteyiz.
Şimdi bu tool’ları AutoGen’de kullanabilmek için Semantic Kernel altyapısına sahip SemanticKernelAgent‘ın imkanlarından istifade edecek ve bu agent’a plugin olarak ekleyeceğiz.
var builder = Kernel.CreateBuilder();
builder.AddOpenAIChatCompletion(
modelId: model,
openAIClient: new OpenAIClient(
credential: new ApiKeyCredential(apiKey),
options: new OpenAIClientOptions
{
Endpoint = new Uri(endpoint)
}
)
)
.Plugins.AddFromFunctions("Todoist", tools.Select(tool => tool.AsKernelFunction()));
var kernel = builder.Build();
var semanticKernelAgent = new SemanticKernelAgent(
kernel: kernel,
name: "semanticKernelAssistant",
systemMessage: @"
Sen bir yapay zeka asistanısın.
Kullanıcı görev yönetimiyle ilgili sorular soracak ve senden yardım bekleyecektir.
Bu soruları en iyi şekilde cevapla ve yardımcı ol.
Verileri analiz edebilir, aralarında mantıksal ilişki kurabilirsin.
İhtiyaç gördüğün taktirde farklı görevleri yerine getirebilirsin.
Yanıtı açık ve yardımcı bir şekilde ver:
",
settings: new OpenAIPromptExecutionSettings
{
FunctionChoiceBehavior = FunctionChoiceBehavior.Auto(options: new() { RetainArgumentTypes = true }),
}
)
.RegisterMessageConnector()
.RegisterPrintMessage();
var userProxyAgent = new UserProxyAgent(
name: "user",
humanInputMode: HumanInputMode.ALWAYS)
.RegisterPrintMessage();
await userProxyAgent.InitiateChatAsync(
receiver: semanticKernelAgent,
message: Console.ReadLine(),
maxRound: 10);
13. satıra dikkat ederseniz MCP’den gelen tool’lar agent’a aktarılmakta ve bir yandan da PromptExecutionSettings ayarları 29 ile 32. satır aralığında gerçekleştirilmektedir. Dolayısıyla bu yapılanmayı derleyip çalıştırdığınızda aşağıdaki gibi Todoist servisinin AI model tarafından kullanıldığını gözlemleyebilirsiniz.
Îşte bu kadar… Nasıl, oldukça basit değil mi? 😉
Nihai olarak;
Bu içeriğimizde AutoGen kütüphanesinde Semantic Kernel altyapısına sahip olan SemanticKernelAgent‘ı tanımış ve kullanımını değerlenmiş bulunuyoruz. Bir yandan da, her ne kadar AutoGen’in yapısı MCP’ye uygun olmasa da SemanticKernelAgent sayesinde bu açığı nasıl kapatabileceğimizi incelemiş ve böylece kolaylıkla agent’lar arası harici yetenekleri devreye sokarak süreci daha da zenginleştirebilmiş, ayrıca sistem dışındaki AI modellerini bu agent’ların bağlamına dahil edebilmiş olduk.
İlgilenenlerin faydalanması dileğiyle…
Sonraki yazılarımda görüşmek üzere…
İyi çalışmalar…
Not : Örnek çalışmaya aşağıdaki GitHub adresinden erişebilirsiniz.
https://github.com/gncyyldz/UsingSemanticKernelWithAutoGenAndMCP

Abi manyak gibisin ai giybet dedikodu yaptirmak nedir ? Yarim saat ekran basinda guldum. Allah senden razi olsun. Emegin icin tesekkurler.
🤣👍