Blog
Mert Özen'in yazılım geliştirme, backend, frontend ve DevOps üzerine blog yazıları.
AI Agent Nedir? Workflow, Agent ve "Burada Agent Gerekmez" Kararı
Agent, kontrol akışını modelin yönettiği sistemdir; workflow'da yolu kod çizer. Bookstore'dan üç senaryoyu (sipariş durumu, iade, kitap bul ve sepete ekle) aynı kodla qwen3:4b üzerinde koşturup model çağrısı, token ve süreyi ölçüyor, agent'ın bedelini ve "burada agent gerekmez" kararının kriterlerini çıkarıyoruz.
Agent Loop'unu Sıfırdan Yazmak: Plan, Tool Çağrısı, Gözlem ve Durma Koşulu
Bir agent loop'u framework'süz C# ile yazıyoruz: tool sonucunu ve hatasını modele geri vermek, adım/token/zaman bütçesi, tekrar eden çağrıyı engellemek ve her adımı trace'lemek. Gerçek koşuda token'ın turdan tura nasıl biriktiğini görüp aynı işi FunctionInvokingChatClient ve MAF ChatClientAgent ile yapıyor, neyin soyutlandığını karşılaştırıyoruz.
Agent'lar için Tool Tasarımı: İsim, Açıklama, Şema, Hata Mesajı ve Tool Sayısı
API'yi birebir saran on iki CRUD tool'u ile iki iş odaklı tool'u aynı isteklerle qwen3:4b üzerinde karşılaştırıyoruz: on üç kat token, bulunamayan kitap ve yanlış kitabı ekleyip "eklendi" diyen agent. Şemanın doğrulama olmadığı, insan okunur çıktı, boş sonucun nedenini söyleyen mesaj, isim çakışması ve yan etkili tool'lar.
Context Engineering: Agent'ın Context'ini Yönetmek, Compaction ve Memory
Context bir bütçedir ve dolduğunda hata vermeden kesilebilir: 4.096 token'la yüklenmiş qwen3:4b, uzayan bir oturumda baştaki bütçe cümlesini kaybedip rakam uyduruyor. MAF CompactionProvider ile eski tool çıktılarını sıkıştırmak, AIContextProvider ile oturumlar arası tercih memory'si ve iş devredilen sub-agent'tan yalnızca özet almak, gerçek token sayılarıyla.
Agent Workflow Pattern'leri: Prompt Chaining, Routing, Parallelization, Orchestrator-Workers ve Evaluator-Optimizer
Beş workflow pattern'ini Bookstore üzerinde koşturuyoruz: prompt chaining ve orchestrator-workers düz C# ile, routing, fan-out/fan-in ve writer-critic döngüsü MAF WorkflowBuilder ile. Küçük modelin "must read" ifadesini onayladığı, orchestrator'ın bütçeyi aştığı gerçek koşular, kod kapıları ve workflow'u AsAIAgent ile agent gibi dışarı açmak.
Multi-agent Sistemler: Handoff, Group Chat, Orchestration ve A2A
Birden fazla agent uzmanlaşma, izolasyon ve paralellik getirir ama token çarpanı ve koordinasyon hatasıyla ödenir. MAF'ın sequential, concurrent, handoff, group chat ve Magentic orkestrasyonlarını Bookstore'da koşturuyor; uzmanın tool çağırmadan geri devrettiği handoff'u ve bitmeyen group chat'i gerçek çıktılarla görüyor, başka servisteki agent'a A2A ile iş veriyoruz.
Human-in-the-loop: Tool Onayı, Checkpoint ve Uzun Süren Agent'lar
Yazma yapan tool'ları ApprovalRequiredAIFunction ile onaya bağlıyor, onay saatler sürdüğünde agent session'ını JSON'a yazıp başka bir process'te devam ediyoruz. Gerekçeli ret, onay cevabındaki argümanı değiştirme denemesi (approval-response binding) ve RequestPort ile workflow'u checkpoint'ten sürdürmek gerçek koşularla.
Model Context Protocol Nedir? Host, Client, Server ve 2026-07-28 Spec'i
MCP, tool ve veri kaynaklarını bir kez server olarak yazıp her AI uygulamasına standart bir client üzerinden bağlamanı sağlayan JSON-RPC tabanlı bir protokoldür. Host, client ve server rollerini, tools/resources/prompts primitive'lerini, stdio ve Streamable HTTP transport'larını ve el sıkışmasını kaldıran 2026-07-28 revizyonunu elle yazılmış JSON mesajlarıyla kabloda görüyoruz.
C# ile MCP Server: ModelContextProtocol SDK 2.x, [McpServerTool] ve stdio
C# ile MCP server'ı ModelContextProtocol 2.x paketi, Generic Host ve [McpServerTool] attribute'larıyla yazarsın; stdio transport'unda log'ları stderr'e yönlendirmek şarttır. Bookstore tool'larını DI'dan servis alarak, structured output, resource ve prompt tanımlarıyla kuruyor, MCP Inspector ile test ediyor ve stdout'u kirletmenin bir dakikalık timeout'a, culture ayarının bozuk tool çıktısına nasıl dönüştüğünü gerçek çıktılarla görüyoruz.
ASP.NET Core'da Remote MCP Server: Streamable HTTP, Stateless Mod, State Handle'ları ve Authorization
ASP.NET Core'da remote MCP server'ı WithHttpTransport ve MapMcp ile kurar, stateless modda çalıştırır ve OAuth resource server olarak korursun: token yalnız bu server için verilmiş olmalı, state handle'ları kullanıcıya bağlanmalı. Protected resource metadata'yı, audience hatasını, iki instance ile stateless'ın bedelini, MRTR ile imzalı requestState kullanarak onay istemeyi ve Mcp-Method/Mcp-Name header doğrulamasını curl çıktılarıyla görüyoruz.
TypeScript ile MCP Server: Zod Şemaları, Tool/Resource Kaydı ve Node.js
TypeScript'te MCP server için 2026-07-28'i destekleyen v2 SDK'yı (@modelcontextprotocol/server 2.4.0) seçer, tool'ları Zod 4 schema'larıyla kaydeder, serveStdio ve createMcpHandler ile stdio ve Streamable HTTP'den sunarsın. Aynı Bookstore server'ını C# sürümüyle karşılaştırıp aynı girdiye farklı cevaplar veren schema'ları, Zod 3 uyumsuzluğunu, npx ile dağıtımı ve supply chain riskini gerçek çıktılarla görüyoruz.
MCP Client Yazmak: McpClient, Tool'ları IChatClient ve Agent'a Bağlamak, Elicitation
C#'ta MCP client'ı McpClient.CreateAsync ile stdio ya da HTTP transport üzerinden kurarsın; ListToolsAsync'in döndürdüğü McpClientTool bir AIFunction olduğu için doğrudan IChatClient'a ve MAF agent'ına verilebilir. İki server'daki aynı adlı tool'ları önekle ayırıyor, tool tanımlarını parmak iziyle pinliyor, yerel qwen3:4b ile gerçek tool çağrılarını ve server'ın onay isteğini SDK'nın MRTR turlarıyla nasıl karşıladığını görüyoruz.