|
| 1 | +--- |
| 2 | +name: dotnet-microsoft-agent-framework |
| 3 | +version: "1.4.0" |
| 4 | +category: "AI" |
| 5 | +description: "Build .NET AI agents and multi-agent workflows with Microsoft Agent Framework using the right agent type, threads, tools, workflows, hosting protocols, and enterprise guardrails." |
| 6 | +compatibility: "Requires preview-era Microsoft Agent Framework packages and a .NET application that truly needs agentic or workflow orchestration." |
| 7 | +--- |
| 8 | + |
| 9 | +# Microsoft Agent Framework |
| 10 | + |
| 11 | +## Trigger On |
| 12 | + |
| 13 | +- building or reviewing `.NET` code that uses `Microsoft.Agents.*`, `Microsoft.Extensions.AI`, `AIAgent`, `AgentThread`, or Agent Framework hosting packages |
| 14 | +- choosing between `ChatClientAgent`, Responses agents, hosted agents, custom agents, workflows, or durable agents |
| 15 | +- adding tools, MCP, A2A, OpenAI-compatible hosting, AG-UI, DevUI, background responses, or OpenTelemetry |
| 16 | +- migrating from Semantic Kernel agent APIs or aligning AutoGen-style multi-agent patterns to Agent Framework |
| 17 | + |
| 18 | +## Workflow |
| 19 | + |
| 20 | +1. Decide whether the problem should stay deterministic. If plain code or a typed workflow without LLM autonomy is enough, do that instead of adding an agent. |
| 21 | +2. Choose the execution shape first: single `AIAgent`, explicit `Workflow`, Azure Functions durable agent, ASP.NET Core hosted agent, AG-UI remote UI, or DevUI local debugging. |
| 22 | +3. Choose the agent type and provider intentionally. Prefer the simplest agent that satisfies the threading, tooling, and hosting requirements. |
| 23 | +4. Keep agents stateless and keep conversation or long-lived state in `AgentThread`. Treat serialized threads as opaque provider-specific state. |
| 24 | +5. Add only the tools and middleware that the scenario needs. Narrow the tool surface, require approval for side effects, and treat MCP, A2A, and third-party services as trust boundaries. |
| 25 | +6. For workflows, model executors, edges, request-response ports, checkpoints, shared state, and human-in-the-loop explicitly rather than hiding control flow in prompts. |
| 26 | +7. Prefer Responses-based protocols for new remote/OpenAI-compatible integrations unless you specifically need Chat Completions compatibility. |
| 27 | +8. Use durable agents only when you truly need Azure Functions serverless hosting, durable thread storage, or deterministic long-running orchestrations. |
| 28 | +9. Verify preview status, package maturity, docs recency, and provider-specific limitations before locking a production architecture. |
| 29 | + |
| 30 | +## Architecture |
| 31 | + |
| 32 | +```mermaid |
| 33 | +flowchart LR |
| 34 | + A["Task"] --> B{"Deterministic code is enough?"} |
| 35 | + B -->|Yes| C["Write normal .NET code or a plain workflow"] |
| 36 | + B -->|No| D{"One dynamic decision-maker is enough?"} |
| 37 | + D -->|Yes| E["Use an `AIAgent` / `ChatClientAgent`"] |
| 38 | + D -->|No| F["Use a typed `Workflow`"] |
| 39 | + F --> G{"Needs durable Azure hosting or week-long execution?"} |
| 40 | + G -->|Yes| H["Use durable agents on Azure Functions"] |
| 41 | + G -->|No| I["Use in-process workflows"] |
| 42 | + E --> J{"Need a remote protocol or UI?"} |
| 43 | + F --> J |
| 44 | + J -->|OpenAI-compatible HTTP| K["ASP.NET Core Hosting.OpenAI"] |
| 45 | + J -->|Agent-to-agent protocol| L["A2A hosting"] |
| 46 | + J -->|Web UI protocol| M["AG-UI"] |
| 47 | + J -->|Local debug shell| N["DevUI (dev only)"] |
| 48 | +``` |
| 49 | + |
| 50 | +## Core Knowledge |
| 51 | + |
| 52 | +- `AIAgent` is the common runtime abstraction. It should stay mostly stateless. |
| 53 | +- `AgentThread` holds conversation identity and long-lived interaction state. Treat serialized thread payloads as opaque provider-owned data. |
| 54 | +- `AgentResponse` and `AgentResponseUpdate` are not just text containers. They can include tool calls, tool results, structured output, reasoning-like updates, and response metadata. |
| 55 | +- `ChatClientAgent` is the safest default when you already have an `IChatClient` and do not need a hosted-agent service. |
| 56 | +- `Workflow` is an explicit graph of executors and edges. Use it when the control flow must stay inspectable, typed, resumable, or human-steerable. |
| 57 | +- Hosting layers such as OpenAI-compatible HTTP, A2A, and AG-UI are adapters over your in-process agent or workflow. They do not replace the core architecture choice. |
| 58 | +- Durable agents are a hosting and persistence decision for Azure Functions. They are not the default answer for ordinary app-level orchestration. |
| 59 | + |
| 60 | +## Decision Cheatsheet |
| 61 | + |
| 62 | +| If you need | Default choice | Why | |
| 63 | +|---|---|---| |
| 64 | +| One model-backed assistant with normal .NET composition | `ChatClientAgent` or `chatClient.AsAIAgent(...)` | Lowest friction, middleware-friendly, works with `IChatClient` | |
| 65 | +| OpenAI-style future-facing APIs, background responses, or richer response state | Responses-based agent | Better fit for new OpenAI-compatible integrations | |
| 66 | +| Simple client-managed chat history | Chat Completions agent | Keeps request/response simple | |
| 67 | +| Service-hosted agents and service-owned threads/tools | Azure AI Foundry Agent or other hosted agent | Managed runtime is the requirement | |
| 68 | +| Typed multi-step orchestration | `Workflow` | Control flow stays explicit and testable | |
| 69 | +| Week-long or failure-resilient Azure execution | Durable agent on Azure Functions | Durable Task gives replay and persisted state | |
| 70 | +| Agent-to-agent interoperability | A2A hosting or A2A proxy agent | This is protocol-level delegation, not local inference | |
| 71 | +| Browser or web UI protocol integration | AG-UI | Designed for remote UI sync and approval flows | |
| 72 | + |
| 73 | +## Common Failure Modes |
| 74 | + |
| 75 | +- Adding an agent where deterministic code or a plain typed workflow would be clearer and cheaper. |
| 76 | +- Assuming agent instance fields are the durable source of truth instead of storing real state in `AgentThread`, stores, or workflow state. |
| 77 | +- Picking Chat Completions when the scenario really needs Responses features such as background execution or service-backed response chains. |
| 78 | +- Treating hosted-agent services and local `IChatClient` agents as if they share the same thread and tool guarantees. |
| 79 | +- Hiding orchestration inside prompts instead of modeling executors, edges, requests, checkpoints, and HITL explicitly. |
| 80 | +- Exposing too many tools at once, especially side-effecting tools without approvals, middleware checks, or clear trust boundaries. |
| 81 | +- Treating DevUI as a production UI surface instead of a development and debugging tool. |
| 82 | + |
| 83 | +## Deliver |
| 84 | + |
| 85 | +- a justified architecture choice: agent vs workflow vs durable orchestration |
| 86 | +- the concrete .NET agent type, provider, and package set |
| 87 | +- an explicit thread, tool, middleware, and observability strategy |
| 88 | +- hosting and protocol decisions for OpenAI-compatible APIs, A2A, AG-UI, or Azure Functions |
| 89 | +- migration notes when replacing Semantic Kernel agent APIs or AutoGen-style orchestration |
| 90 | + |
| 91 | +## Validate |
| 92 | + |
| 93 | +- the scenario really needs agentic behavior and is not better served by deterministic code |
| 94 | +- the selected agent type matches the provider, thread model, and tool model |
| 95 | +- `AgentThread` lifecycle, serialization, and compatibility boundaries are explicit |
| 96 | +- tool approval, MCP headers, and third-party trust boundaries are handled safely |
| 97 | +- workflows define checkpoints, request-response, shared state, and HITL paths deliberately |
| 98 | +- DevUI is treated as a development sample, not a production surface |
| 99 | +- docs or packages marked preview are called out, and Python-only docs are not mistaken for guaranteed .NET APIs |
| 100 | + |
| 101 | +When a decision depends on exact wording, long-tail feature coverage, or a less-common integration, check the local official docs snapshot before relying on summaries. |
| 102 | + |
| 103 | +## References |
| 104 | + |
| 105 | +- [official-docs-index.md](references/official-docs-index.md) - Slim local Microsoft Learn snapshot map with direct links to every mirrored page, live-only support pages, and API-reference pointers |
| 106 | +- [patterns.md](references/patterns.md) - Architecture routing, agent types, provider and thread model selection, and durable-agent guidance |
| 107 | +- [providers.md](references/providers.md) - Provider, SDK, endpoint, package, and Responses-vs-ChatCompletions selection |
| 108 | +- [tools.md](references/tools.md) - Function tools, hosted tools, tool approval, agent-as-tool, and service limitations |
| 109 | +- [sessions.md](references/sessions.md) - `AgentThread`, chat history storage, reducers, context providers, and thread serialization |
| 110 | +- [middleware.md](references/middleware.md) - Agent, function-calling, and `IChatClient` middleware with guardrail patterns |
| 111 | +- [workflows.md](references/workflows.md) - Executors, edges, requests and responses, checkpoints, orchestrations, and declarative workflow notes |
| 112 | +- [mcp.md](references/mcp.md) - MCP integration, agent-as-MCP, security rules, and MCP-vs-A2A guidance |
| 113 | +- [hosting.md](references/hosting.md) - ASP.NET Core hosting, OpenAI-compatible APIs, A2A, AG-UI, Azure Functions, and Purview integration |
| 114 | +- [devui.md](references/devui.md) - DevUI capabilities, modes, auth, tracing, and safe usage boundaries |
| 115 | +- [migration.md](references/migration.md) - Semantic Kernel and AutoGen migration notes, concept mapping, and breaking-model shifts |
| 116 | +- [support.md](references/support.md) - Preview status, official support channels, and recurring troubleshooting checks |
| 117 | +- [examples.md](references/examples.md) - Quick-start and tutorial recipe index covering the official docs set |
0 commit comments