Blog
Mert Özen's blog posts on software development, backend, frontend, and DevOps.
Human-in-the-Loop: Tool Approval, Checkpoints and Long-Running Agents
We put write tools behind approval with ApprovalRequiredAIFunction and, when approval takes hours, write the agent session to JSON and resume in another process. Reasoned rejections, an attempt to change the argument in the approval response (approval-response binding) and resuming a workflow from a checkpoint with RequestPort, all with real runs.
Agent Workflow Patterns: Prompt Chaining, Routing, Parallelization, Orchestrator-Workers and Evaluator-Optimizer
We run five workflow patterns on Bookstore: prompt chaining and orchestrator-workers in plain C#, routing, fan-out/fan-in and a writer-critic loop with MAF WorkflowBuilder. Real runs where a small model approves "must read" and the orchestrator blows the budget, code gates, and exposing a workflow as an agent with AsAIAgent.
Context Engineering: Managing an Agent's Context, Compaction and Memory
Context is a budget, and when it fills up it can be truncated without an error: qwen3:4b loaded with 4,096 tokens loses the budget stated at the start of a long session and makes up a number. Compacting old tool output with MAF's CompactionProvider, cross-session preference memory with an AIContextProvider and taking only a summary back from a sub-agent, with real token counts.
Writing an Agent Loop from Scratch: Plan, Tool Call, Observation and Stop Condition
We write an agent loop in C# without a framework: returning tool results and errors to the model, step/token/time budgets, blocking repeated calls and tracing every step. A real run shows tokens piling up turn by turn; then we do the same job with FunctionInvokingChatClient and MAF's ChatClientAgent and compare what each layer abstracts away.
From Semantic Kernel to Microsoft Agent Framework: History, Support Status and Migrating Old Code
Semantic Kernel still gets critical bug and security fixes, but new features go to Microsoft Agent Framework; the official commitment is at least one year after MAF GA (April 3, 2026). We build the history from NuGet and GitHub dates, run an old SK agent against a local model, migrate it to MAF and derive the mapping table.
Hosting Agents in ASP.NET Core: AddAIAgent, OpenAI-Compatible Endpoints, AG-UI and A2A
You register an agent in DI with AddAIAgent and expose it over three protocols with MapOpenAIChatCompletions, MapAGUIServer and MapA2AJsonRpc; the agent is written once and the adapters only translate the format. With real calls we look at an OpenAI response with multiple choices, an AG-UI stream that carries reasoning to the browser, the A2A agent card, and claims-based session isolation with rate limiting.
Middleware, Context Providers and Session Persistence in Agent Framework
In Agent Framework, agent run middleware handles inputs like card numbers, function invocation middleware blocks access to other customers' orders, and a context provider writes the user's preference into the session, which is saved and restored as JSON. In a real run we see the memory work, the model still invent an author, and reasoning bloat the session.
Getting Started with Microsoft Agent Framework: From IChatClient to AIAgent
AsAIAgent turns an IChatClient into a ChatClientAgent; the agent takes over instructions, function invocation and chat history through AgentSession, but it doesn't make the model smarter. We write the same Bookstore assistant first with a plain IChatClient and then as an agent, and compare RunAsync, RunStreamingAsync and AgentResponse with real outputs.
The .NET AI Stack: Where Microsoft.Extensions.AI, VectorData, Evaluation and Agent Framework Fit
An application takes Microsoft.Extensions.AI plus a provider package, while a library depends only on Abstractions; VectorData, DataIngestion, Evaluation and Agent Framework sit on top of or next to that IChatClient layer. We map the packages, run the aichatweb template against a local Ollama and fix three real errors that appear at the layer boundaries.