A2A Protokolü : Ajanlar Arası İletişim
Bu yazı, agent’ların kendi aralarında nasıl konuşabileceğini standartlarını ortaya koyan A2A (Agent-to-Agent) protokolünü inceleyip, C# ile ufak bir örnek yapıp kurcaladıktan sonra çıkan teknik notlarımdan oluşuyor.
Neden A2A? (Ya da MCP Yetmiyor muydu?)
Anthropic’in duyurduğu Model Context Protocol (MCP) hepimizin artık en azından genel kapsamını bildiği bir protokol diye düşünüyorum. MCP harika bir şey, yalan yok. Ancak çözdüğü problem dikey: Bir LLM’in (Model) yerel bilgisayarınızdaki dosyalara, veri tabanlarına veya araçlara (tool) nasıl erişeceğini standartlaştırıyor. Yani “Model -> Araç” ilişkisini çözüyor.
Peki, benim yazdığım bir kod asistanı agent’ı, senin yazdığın ve tamamen farklı bir sunucuda çalışan veri analizi agent’ı ile konuşmak isterse ne olacak? İşte MCP burada duruyor ve sahneye Google’ın geliştirmeye başladığı A2A Protokolü çıkıyor.
A2A, yatay (horizontal) bir protokol. Farklı dillerde yazılmış, farklı cloud sağlayıcılarında barınan ve tamamen bağımsız çalışan agent’ların ortak bir dilde anlaşmasını, iş delege etmesini ve iş birliği yapmasını sağlıyor. Kısacası, agent’lar arası bir diplomatik dil kuruyor diyebiliriz.
A2A Protokolü’nün Temel Yapı Taşları
A2A, tamamen opaque agent sistemlerinin birbirini tanıması için birkaç temel konsept üzerine inşa edilmiş:
Agent Card
Bir agent’ın adeta LinkedIn profili veya dijital kartviziti. Genelde /.well-known/agent-card.json adresinde barınan standart bir JSON metadata dosyasıdır. Diğer agent'lar bu dosyayı okuyarak ( discovery aşaması) karşıdaki agent'ın hangi yeteneklere sahip olduğunu, hangi endpoint üzerinden çağrılabileceğini ve hangi kimlik doğrulama ( handshake / auth) yöntemlerini kullandığını öğrenir.
Task
İşte en önemli kısım burası. Agent’lar arası işler genelde bir saniyede bitmez. Bir agent’a “Bana 2026 yılı yapay zeka trendleri hakkında 5 sayfalık bir rapor hazırla” dediğinizde bu iş dakikalar, hatta saatler alabilir. A2A’da Task, benzersiz ID’ye sahip, durum bilgisi olan (stateful) bir iş birimidir. Başlatılır, takip edilir, durdurulabilir ve gerekirse insan onayı sürecine (human-in-the-loop) sokulabilir.
Message
Task yürütülürken veya doğrudan iletişim kurulurken kullanılan tek turluk (single-turn) veri paketleri. Klasik chat API’lerindeki gibi “user” veya “agent” rollerine sahiptir.
Artifact & Part
Bir task tamamlandığında ortaya çıkan somut çıktılara Artifact denir. Bu bir PDF raporu, bir kod dosyası veya yapılandırılmış JSON verisi olabilir. Part ise (örneğin TextPart, FilePart) bu mesajların veya artifact'lerin içindeki veri konteynerleridir. Multimodal veri alışverişini standartlaştırmak için kullanılırlar.
Gerçek Hayat: Streaming ve Async Operations
AI dünyasında işler yavaş yürür. LLM’in düşünmesi, tool’ları tetiklemesi derken geçen sürede HTTP bağlantısını açık tutup boş boş beklemek (ya da sürekli polling yapmak) modern yazılım mimarilerinde kabul edilemez (çünkü hangi çağda yaşıyoruz, bir API’nin cevabını 40 saniye boyunca bloklayacak vaktimiz yok).
A2A bu problemi iki şekilde çözüyor:
Real-time Aşkına: Streaming (SSE)
Eğer istemci ( Client) aktif bir HTTP bağlantısı sürdürebiliyorsa, sunucu ( server) üretilen sonuçları anlık olarak akıtabilir. A2A bunun için Server-Sent Events (SSE) standartını kullanır. İstemci, agent’ın o an ne düşündüğünü, hangi alt adımları tamamladığını canlı canlı izler.
Büyük İşler İçin: Asynchronous & Push (Webhooks)
Bağlantının kopma ihtimalinin yüksek olduğu mobil istemcilerde veya saatler süren devasa analizlerde SSE de kurtarmaz. A2A burada Webhookmekanizmasını devreye sokar. Client, işi gönderirken “Benim callback adresim bu, iş bittiğinde beni dürt” der. Server işi bitirdiğinde (ya da kritik bir state değişikliği olduğunda) istemcinin sağladığı webhook’a güvenli bir push bildirimi gönderir.
.NET Dünyasında A2A: Hadi Kod Yazalım!
A2A protokolünün resmi C#/.NET SDK’sı olan a2a-dotnet reposuna a2aproject/a2a-dotnet adresinden ulaşabilirsiniz. Kütüphane .NET 8 ve .NET 9 uyumlu, Native AOT dostu ve OpenTelemetry destekli modern bir altyapıya sahip.
Çok basitçe, bir server tarafında agent’ımızı nasıl dışarı açacağımıza ve clienttarafında buna nasıl istek atacağımıza bakalım.
Server Tarafı (ASP.NET Core ile Agent Host Etme)
ASP.NET Core uygulamanızda A2A.AspNetCore paketini kullanarak bir agent'ı dış dünyaya HTTP endpoint'i olarak açmak sadece birkaç satır sürüyor:
using A2A.AspNetCore;
using A2A.Core;
var builder = WebApplication.CreateBuilder(args);
// A2A servislerini ve kendi yazdığımız agent mantığını ekliyoruz
builder.Services.AddA2A();
var app = builder.Build();
// TaskManager, agent'ın durumunu ve işlerini yöneten arkada dönen çarktır.
var taskManager = new TaskManager();
var codeGeneratorAgent = new CodeGeneratorAgent();
codeGeneratorAgent.Attach(taskManager);
// Agent'ımızı dış dünyaya "/agents/code-gen" endpoint'i üzerinden açıyoruz
app.MapA2A(taskManager, "/agents/code-gen");
app.Run();(Gördüğünüz gibi, HTTP routing ve protokol detaylarıyla boğuşmak yerine sadece MapA2A deyip geçiyoruz. Framework arkada Agent Card yönetimini ve JSON-RPC isteklerini otomatik hallediyor.)
Client Tarafı (Başka Bir Agent’a Bağlanıp İstek Atma)
Şimdi de bu agent’ı çağıran diğer tarafı ( Client) yazalım. SDK içindeki A2AClient işimizi acayip kolaylaştırıyor:
using A2A.Client;
using A2A.Core;
// 1. Agent'ın endpoint'ine bağlanıyoruz
var client = new A2AClient(new Uri("https://api.mycompany.com/agents/code-gen"));
// 2. Mesaj parametrelerimizi hazırlıyoruz (C# 12 Collection Expressions güzelliğiyle)
var messageParams = new MessageSendParams
{
Message = new Message
{
Role = MessageRole.User,
Parts = [new TextPart { Text = "Bana C# ile basit bir Singleton pattern örneği yazabilir misin?" }]
}
};
// 3. Mesajı gönderip cevabı bekliyoruz
var response = await client.SendMessageAsync(messageParams);
// 4. Gelen cevabı ekrana yazdırıyoruz
if (response.Message.Parts.FirstOrDefault() is TextPart textPart)
{
Console.WriteLine($"Agent Yanıtı:\n{textPart.Text}");
}Yapay zeka dünyası sadece tek bir LLM’e prompt atıp yanıt aldığımız evreyi çoktan geçti. Gelecek, özelleşmiş binlerce agent’ın (biri veri tabanından veri çeken, diğeri analiz eden, öbürü raporlayan) kendi aralarında organize olduğu otonom workflow’larda yatıyor.
Kapanış
A2A protokolü, bu organizasyonu standarda bağlayarak bizi spagetti entegrasyon kodlarından kurtarıyor. Eğer yolunuz çoklu ajan (multi-agent) sistemlerine düşerse, kendi özel protokolünüzü sıfırdan yazmaya kalkışmadan önce kesinlikle A2A SDK’sına bir bakın.
Bu yazı ilk önce medium profilimde yayınlandı ; oradan okumak için https://medium.com/@serkanince/a2a-protokol%C3%BC-ajanlar-aras%C4%B1-i%CC%87leti%C5%9Fim-9b8e1fc60b66
İyi kodlamalar ❤



Yorumlar
Yorum Gönder
Evet şimdi yorumlar ;