1. Introduction — The Problem Frameworks Actually Solve
Wiring a tool onto an LLM for a single call takes maybe 40 lines of code. Frameworks become necessary at the next stage: where do you resume when an agent dies three hours into a task, how do you express a branch that requires human approval, and how do you trace why call number 7 out of 12 tool calls went wrong. None of these are solved by prompt engineering.
To repeat an expression I keep coming back to: an LLM is a spreadsheet, not an oracle. The same applies to frameworks. A framework doesn't raise a model's reasoning quality. What it raises is the odds of recovering when the model is wrong and how fast you notice it was wrong. Viewed through this lens, tool selection becomes much simpler.
This market went through a consolidation between Q4 2025 and the first half of 2026. LangChain and LangGraph shipped 1.0 in October 2025, and Microsoft Agent Framework (MAF) went through an RC in February 2026 before reaching .NET/Python 1.0 GA in April. AutoGen and Semantic Kernel are both on a path to being absorbed into MAF. In other words, this isn't a moment for picking a framework — it's a moment for deciding which layer you want to hand off to a framework.
2. Concepts — The Three Layers of the Agent Stack
The reason these frameworks feel incomparable is that they operate at different layers. Let's split them apart first.
| Layer | What it does | What breaks without it | Representative implementations |
|---|---|---|---|
| L1. Agent harness | The model-call → tool-call → inject-result → re-call loop, structured output, retries | You can write it yourself (tens of lines). But add streaming, token accounting, and error branching and it quickly becomes hundreds of lines | LangChain create_agent, MAF agent, Eino ADK |
| L2. Orchestration | Multi-agent graphs, conditional routing, parallel/sequential/group collaboration, sub-workflows | State passed between agents degrades into a global dict. Debugging becomes impossible | LangGraph, MAF workflow, CrewAI Flows |
| L3. Runtime / operations | Checkpointing, restarts, durable execution, HITL interrupts, observability (OTel), deployment | A long-running task loses everything on a single process restart | LangGraph durable execution, MAF checkpointing, Foundry Hosted Agents |
The key point is that L3 is the real moat. Anyone can write L1, and L2 can be expressed as code, but the property of "a three-day approval workflow keeps going even if the server dies" effectively means building a task queue + state store + idempotency design from scratch if you try to implement it yourself.
2.1 Not using a framework is also a legitimate choice
There's a particularly strong counter-argument in the Go community. The agent loop itself is short, OpenAI, Anthropic, and Google all provide official Go SDKs, and Go engineers customarily prefer the standard library plus a handful of dependencies. In fact, as of mid-2026, a large share of Go teams don't use a framework at all.
There's also a security angle layered on top. A multi-provider SDK is the single point where every provider's API key ends up concentrated. The dependency tree itself is becoming an attack surface.
| Project | Approximate dependency count (community measurement, as of 2026-04) |
|---|---|
| LangChainGo | 170+ |
| Genkit Go | 129 |
| Eino | 37 |
| Lightweight SDKs (GoAI, etc.) | 2–5 |
After the 2025–2026 LiteLLM package tampering incident and the npm axios supply-chain breach, this table is no longer just a reference figure. From a CTI standpoint, adopting an agent framework is a trade-off between runtime convenience and supply-chain exposure.
3. Microsoft Agent Framework for Go
Repository:
github.com/microsoft/agent-framework-go· License MIT · Language 100% Go
3.1 Summary
MAF is a multi-language open-source framework spanning .NET, Python, and Go, aimed at going beyond prototypes to agents actually operated in production. It supports a broad ecosystem including Microsoft Foundry, Azure OpenAI, OpenAI, MCP, A2A, AG-UI, and the GitHub Copilot SDK.
There's one important structural fact. The Go implementation is developed in a separate repository from the mainline .NET/Python repo, and it's in public preview. In other words, the "MAF 1.0 GA" headline is a .NET/Python story, not a Go story. Missing this distinction leads to disappointment once you notice how many features are actually missing when planning an adoption.
| Item | .NET / Python | Go |
|---|---|---|
| Status | 1.0 GA (2026-04) | Public preview |
| Repository | microsoft/agent-framework |
microsoft/agent-framework-go (separate) |
| Breadth of product integration | Wide | Narrow |
| Unimplemented features | Mostly resolved | Numerous (see §3.3) |
3.2 Advantages
- Fully leverages Go's runtime characteristics — goroutine-based concurrency, low memory footprint, single-binary deployment. Agent workloads are inherently long-running, concurrent, and I/O-bound, so they map well onto Go's shape.
- Operational features built into the framework — checkpointing, restartability, streaming, human-in-the-loop (HITL), and time-travel patterns provided at the workflow layer.
- Graph-based orchestration — supports sequential, concurrent, group-collaboration, conditional-routing, and sub-workflow patterns.
- Middleware chain— request/response handling, logging, OpenTelemetry, context providers,tool approval, and automatic tool calling. The tool-approval middleware matters especially from a security standpoint (see §7).
- First-class observability — OpenTelemetry integration for both agents and workflows.
- Provider flexibility — not tied to a specific LLM vendor; you can swap without rewriting the architecture.
- Agent Skills — build a domain knowledge base from files, inline definitions, or scripts that agents can discover and use.
- MIT license — low barrier to commercial use.
3.3 Drawbacks and Limitations
The unimplemented list is not short. Based on the repository README and the .NET–Go feature comparison document, it breaks down as follows.
| Missing feature | Impact |
|---|---|
| Handoff orchestration | You have to build control-transfer patterns between agents yourself. Directly impacts customer-facing routing scenarios |
| Declarative agents | No YAML/JSON-config-based agent definitions → can't modify agents without a code deployment |
| RAG | Retrieval-augmented pipelines need to be built separately |
| CodeAct | No support for code-execution-based actions |
| Functional workflows | No support for functional-workflow style |
| Foundry-hosted deployment | Can't deploy directly to Foundry (requires a container workaround, etc.) |
| DevUI / AF Labs | No developer UI or experimental features → local debugging experience is worse than Python's |
Additional points to consider
- Ecosystem maturity — less product integration than .NET, and the API surface is still moving. You should assume breaking changes are possible in the preview stage.
- Small community size — see the fact-check below.
- Third-party system responsibility shift — if you use external servers, agents, or models instead of the Azure Direct model, responsibility for data flow, cost, and compliance falls entirely on you. Microsoft's documentation states this explicitly.
- The
DefaultAzureCredentialtrap — it's meant for development convenience. In production, you should specify a concrete credential such as a managed identity. The fallback mechanism performs a sequential search, adding latency and creating a security risk that an unintended credential gets picked.
3.4 Fact-Check — Circulating Figures Contain Errors
Several summaries describe this repository as having "360 stars, 14 contributors." A direct check of the repository page in July 2026 shows roughly 16 stars, 1 fork, 3 contributors, 406 commits, and no published release. The figure of 360 appears to be confused with the mainline microsoft/agent-framework repository (tens of thousands) or a different project.
This gap isn't trivial. 16 stars versus 360 stars implies entirely different expectations about will I get a response if I file an issue. If you're basing an adoption decision on community size, be sure to check the repository directly.
Metrics change depending on when they're checked. The figures above are as of July 2026; when citing them, it's advisable to note the snapshot date alongside.
4. LangChain 1.0 / LangGraph 1.0
4.1 The division of roles is now clear after 1.0
The October 2025 1.0 release redefined the relationship between the two projects. Previously the framing was "use LangChain, and move to LangGraph if it's insufficient," but now LangChain is a higher-level abstraction sitting on top of the LangGraph runtime.
| Dimension | LangChain 1.0 | LangGraph 1.0 |
|---|---|---|
| Layer | L1 (agent harness) | L2 + L3 (orchestration + runtime) |
| Core API | create_agent |
StateGraph, checkpointers, interrupt |
| Orientation | Build and ship fast | Fine-grained control and durability |
| Execution model | Standard tool-calling loop | Graph-based execution (branches, loops, state revisits) |
| Stability commitment | No breaking changes before 2.0 | Same |
| Languages | Python, TypeScript | Python, TypeScript |
LangChain 1.0 was rewritten to focus on the core agent loop, and introduced a new concept, middleware, providing HITL, summarization, and PII masking as built-in middleware. Structured output was integrated into the main loop, eliminating an extra LLM call and reducing both latency and cost.
LangGraph 1.0 bills itself as "the first stable major release in the space of durable agent frameworks." The only significant change is the deprecation of langgraph.prebuilt, with its functionality moved to langchain.agents. Backward compatibility is preserved.
4.2 LangGraph's Decisive Strength — Durable Execution
The reason to use LangGraph essentially comes down to one thing: state persists automatically. Even if the server restarts mid-conversation, or a long-running workflow is interrupted, execution resumes precisely at the point it stopped. Because persistence and resumption happen without custom DB logic, you can express approval processes spanning several days or background work that crosses sessions.
HITL is also a first-class API. Pausing execution for human review, revision, or approval comes down to a single line: interrupt. In systems that need a human in the loop for high-stakes decisions, this one line dictates the entire architecture.
4.3 Advantages
- An overwhelming ecosystem — #1 in integration count, documentation, examples, Stack Overflow answers, and the job market. Tens of millions of downloads per month.
- Production references — Uber, LinkedIn, Klarna, and J.P. Morgan have publicly stated they run LangGraph in production.
- Mixed expression of determinism and agency — real systems are never 100% agentic nor 100% deterministic. You can explicitly model a structure where some branches use fixed logic and others use LLM judgment, via a graph.
- LangSmith integration — observability, evaluation, and deployment tooling attach across the lifecycle.
- Dynamic tool calling — control the set of available tools per execution point.
4.4 Drawbacks
- Python/TypeScript only — can't be directly attached to Go, Java, or Rust backends. You'd need to split it out as an HTTP service or switch languages.
- Weight of the abstraction layer — early LangChain was criticized for building a "customization wall" through hidden prompts and implicit context manipulation. 1.0 resolved much of this, but there's still a burden of having to read what the framework is doing.
- Dependency footprint — not lightweight from a supply-chain perspective.
- Coupling with a commercial product — LangSmith is not open source. Using observability to its fullest puts you on a commercial path. You can substitute your own OTel stack, but the integration quality differs.
- A different position on the learning curve — LangChain is easy, LangGraph is hard. You need to understand state schemas, reducers, checkpointers, and the thread concept.
5. Full Map of Competing Projects
5.1 Positioning by Language and Layer
| Project | Language | Primary layer | Status (2026-07) | One-line description |
|---|---|---|---|---|
| Microsoft Agent Framework | C#, Python | L1–L3 | 1.0 GA (2026-04) | Successor to SK/AutoGen. Oriented toward enterprise governance |
| Microsoft Agent Framework for Go | Go | L1–L3 | Public preview | The Go implementation above. Feature gaps exist |
| LangGraph | Python, TS | L2–L3 | 1.0 GA (2025-10) | Durable state-graph runtime. The de facto standard |
| LangChain | Python, TS | L1 | 1.0 GA (2025-10) | The fastest path to building an agent |
| AutoGen | Python | L2 | On a path into MAF | Started from multi-agent conversation/collaboration research |
| Semantic Kernel | C#, Python, Java | L1–L2 | On a path into MAF | Lightweight orchestration SDK. Migration tooling provided |
| CrewAI | Python | L2 | Active | Role-based collaboration + event-driven Flows |
| Google ADK | Python,Go, Java | L1–L2 | Go 1.0 (2025-11) | Sequential/parallel/loop agent primitives, native OTel |
| Genkit | Go, JS | L1 | Production-oriented | Flow-centric. Strong local debugging/tracing |
| Eino (CloudWeGo) | Go | L1–L2 | Active, validated at large-scale operation | Used in production at ByteDance. Component graph, circuit breaker/backoff |
| LangChainGo | Go | L1 | Community port | Widest surface area, lags behind the mainline |
| OpenAI Agents SDK | Python,Go | L1 | Active | Handoffs + guardrails, MCP support |
| Dify | Python (product) | GUI | Active | No-code workflow / RAG pipelines |
5.2 Competitors Within the Go Camp
"Real, but young" is the accurate description of the Go agent ecosystem. Reference figures from community tallies as of May 2026:
| Framework | Stars (approx.) | MCP support | Strengths |
|---|---|---|---|
| Eino | 11,100+ | Unsupported (as of that time) | Production hardening, graph composition |
| LangChainGo | 9,200+ | Unsupported (as of that time) | 10+ providers, a complete RAG pipeline |
| Google ADK Go | — | Supported | Reached 1.0, native OTel |
| OpenAI Agents Go | 255 | Supported | Handoffs + guardrails |
| MAF for Go | ~16 | Supported (MCP/A2A/AG-UI) | Aligned with Azure/Foundry, checkpointing |
If MCP integration is the priority, Google ADK Go, OpenAI Agents Go, and MAF Go are candidates. For pure throughput and proven stability, Eino is strong. On the other hand, if Azure Entra ID/Purview/Defender-based governance is a requirement, there's effectively no alternative to MAF. This is the one sufficient reason MAF Go stays under consideration despite its low star count.
6. Selection Criteria — What Should You Use for Which Workload?
6.1 Decision order
1) Is the language stack fixed?
Go/single-binary required → MAF Go / Eino / ADK Go / no framework
Python·TS is possible → go to 2)
2) Does execution run for minutes or more, or involve a human approval step midway?
Yes → LangGraph (or MAF workflow)
No → go to 3)
3) Is the organization within an Azure/Entra governance boundary?
Yes → MAF (.NET/Python) + Foundry Hosted Agents
No → start with LangChain create_agent, drop down to LangGraph if needed
4) Do non-developers need to modify the workflow?
Yes → GUI-based tools like Dify
6.2 Concrete Use Cases
| Scenario | Recommendation | Reason |
|---|---|---|
| Internal document Q&A bot, 3–5 tools | LangChain create_agent |
Ships in a day. No graph needed |
| A 3-day multi-stage approval pipeline | LangGraph | Durable state + interrupt. Resilient to server restarts |
| Multi-agent research → verification → report drafting | LangGraphorCrewAI | The former if you need graph control, the latter for role-based collaboration description |
| An agent monitoring exchange quotes/order flow in real time | Go: MAF Go / Eino / no framework | Latency and GC pressure dominate. Keep the Python runtime off the critical path |
| A CTI ingestion → normalization → report drafting pipeline | LangGraph + a separate collector | Per-source failure isolation and retry points need to be explicit |
| An internal agent deployed to Microsoft 365 / Teams | MAF (.NET/Python) | Foundry Hosted Agents, Teams/M365 Copilot publishing path |
| An existing Semantic Kernel / AutoGen codebase | Migrate to MAF | Official migration guide and tooling provided |
| A non-developer planner needs to edit prompt chains directly | Dify | Declarative GUI. Versioning and audit still need separate design |
| Agent logic fits in a 40-line loop | No framework | This is the majority position among Go teams |
6.3 A Hybrid Deployment Is Realistic
Foundry's hosted runtime is designed to be framework-agnostic, letting you deploy agents built with MAF, the GitHub Copilot SDK, LangGraph, and others without rewriting them. In other words, a combination like "orchestration on LangGraph, hosting and governance on Foundry" is viable. It's practically advantageous not to treat framework choice as all-or-nothing.
7. Getting Started for Beginners
7.1 Microsoft Agent Framework for Go
Install
go get github.com/microsoft/agent-framework-go
Environment variables
export FOUNDRY_PROJECT_ENDPOINT="<your-endpoint>"
export FOUNDRY_MODEL="gpt-4o-mini" # optional
az login # secure credential source
A basic agent
package main
import (
"cmp"
"context"
"fmt"
"os"
"github.com/Azure/azure-sdk-for-go/sdk/azidentity"
"github.com/microsoft/agent-framework-go/provider/foundryprovider"
)
func main() {
endpoint := os.Getenv("FOUNDRY_PROJECT_ENDPOINT")
model := cmp.Or(os.Getenv("FOUNDRY_MODEL"), "gpt-4o-mini")
// Authenticate with Microsoft Foundry
token, err := azidentity.NewDefaultAzureCredential(nil)
if err != nil {
panic(err)
}
// Create the Foundry agent
a := foundryprovider.NewAgent(endpoint, token, foundryprovider.ModelDeployment(model),
foundryprovider.AgentConfig{
Instructions: "You are a helpful assistant.",
},
)
// Run it
ctx := context.Background()
fmt.Println(a.RunText(ctx, "Write a haiku about the Microsoft Agent Framework").Collect())
}
The one line you must change before going to production
// Development: probes multiple credential sources sequentially → latency, false positives, security risk
token, _ := azidentity.NewDefaultAzureCredential(nil)
// Production: specify the credential to use explicitly
token, _ := azidentity.NewManagedIdentityCredential(&azidentity.ManagedIdentityCredentialOptions{
ID: azidentity.ClientID("<user-assigned-client-id>"),
})
Directories to look at next
| Path | Contents |
|---|---|
examples/01-get-started |
hello world → step by step up to workflows |
examples/02-agents |
Tools, middleware, providers, observability, A2A, AG-UI, MCP, skills |
examples/03-workflows |
Multi-agent patterns, routing, checkpointing |
examples/05-end-to-end |
Complete applications |
docs/dotnet-go-sdk-feature-comparison.md |
Must-read before adoption. The feature gap vs. .NET |
provider/ |
List of provider packages (check options beyond Foundry) |
Troubleshooting summary
| Symptom | Cause | Action |
|---|---|---|
| Azure credential authentication failure | Not logged into Azure CLI, or credential source not configured | Run az login, or explicitly configure the credential to use |
| API key error | Wrong key, or mismatched with the target resource | Verify the key against its corresponding resource/provider |
| Provider endpoint error | Missing or mistyped endpoint, deployment name, model, or API version | Cross-check the sample's environment variables and constructor options |
7.2 LangChain 1.0 — The Fastest Path
pip install --upgrade langchain
from langchain.agents import create_agent
from langchain.tools import tool
@tool
def get_close_price(ticker: str) -> str:
"""Return the recent closing price for the given ticker."""
# In a real implementation, call an actual data source
return f"{ticker}: no lookup result"
agent = create_agent(
model="openai:gpt-4.1-mini",
tools=[get_close_price],
system_prompt=(
"You are a market-data lookup assistant. "
"If a tool returns no value, answer 'no data available'. "
"Never fabricate a number."
),
)
result = agent.invoke(
{"messages": [{"role": "user", "content": "What's NVDA's recent closing price?"}]}
)
print(result["messages"][-1].content)
That last sentence in the system prompt isn't boilerplate. A model fabricating a plausible-looking number when a tool call fails is the most common and most expensive failure mode in agent systems. It will happen without exception if you don't specify the behavior for an empty tool result.
7.3 LangGraph 1.0 — Checkpoints + Human Approval
pip install --upgrade langgraph langchain
from typing import Annotated, TypedDict
from langchain.chat_models import init_chat_model
from langgraph.graph import StateGraph, START, END
from langgraph.graph.message import add_messages
from langgraph.checkpoint.memory import InMemorySaver
from langgraph.types import interrupt, Command
class State(TypedDict):
messages: Annotated[list, add_messages]
approval: str
llm = init_chat_model("openai:gpt-4.1-mini")
def analyze(state: State):
"""Produce a first-pass analysis draft"""
resp = llm.invoke(state["messages"])
return {"messages": [resp]}
def human_review(state: State):
"""Pause execution and wait for human approval"""
decision = interrupt(
{
"question": "Do you approve this judgment?",
"draft": state["messages"][-1].content,
}
)
return {"approval": decision}
def finalize(state: State):
if state["approval"] != "approved":
return {"messages": [{"role": "assistant", "content": "Rejected. Needs revision."}]}
return {"messages": [{"role": "assistant", "content": "Approved. Added to the deployment queue."}]}
builder = StateGraph(State)
builder.add_node("analyze", analyze)
builder.add_node("human_review", human_review)
builder.add_node("finalize", finalize)
builder.add_edge(START, "analyze")
builder.add_edge("analyze", "human_review")
builder.add_edge("human_review", "finalize")
builder.add_edge("finalize", END)
# The checkpointer is the core of durable execution. Use a Postgres/Redis checkpointer in production
graph = builder.compile(checkpointer=InMemorySaver())
config = {"configurable": {"thread_id": "review-001"}}
# Step 1: pauses at the interrupt point
for event in graph.stream(
{"messages": [{"role": "user", "content": "Summarize this quarter's risk."}]},
config,
):
print(event)
# ... the process can safely die here. State stays with the checkpointer ...
# Step 2: once a human approves days later, resume exactly from that point
final = graph.invoke(Command(resume="approved"), config)
print(final["messages"][-1].content)
Three things to notice here
thread_idis the identity of the conversation/task. Resumption happens through this key.InMemorySaveris example-only. If you use this as-is in production, the whole rationale for adopting durability disappears.- The
interruptcall site re-executes the node from the beginning upon resume. So placing side effects (payments, sending email, orders) before the interrupt causes duplicate execution. Move side effects into a node after the interrupt.
7.4 In Go, Without a Framework — Structural Analysis
Writing this structure by hand once, before adopting a framework, makes clear exactly what the framework is doing for you. Below is a conceptual structure that isn't tied to any particular vendor SDK.
// Conceptual sketch: swap in whichever vendor SDK's actual types you're using
func RunAgent(ctx context.Context, c ModelClient, tools map[string]Tool, prompt string) (string, error) {
msgs := []Message{{Role: "user", Content: prompt}}
for turn := 0; turn < maxTurns; turn++ {
resp, err := c.Complete(ctx, msgs, toolSpecs(tools))
if err != nil {
return "", err
}
msgs = append(msgs, resp.Message)
if len(resp.ToolCalls) == 0 {
return resp.Message.Content, nil // exit condition
}
// Concurrent execution: where Go's strength shows
results := make([]Message, len(resp.ToolCalls))
var wg sync.WaitGroup
for i, call := range resp.ToolCalls {
wg.Add(1)
go func(i int, call ToolCall) {
defer wg.Done()
out, err := tools[call.Name].Invoke(ctx, call.Args)
results[i] = toolResultMessage(call.ID, out, err) // return errors to the model too
}(i, call)
}
wg.Wait()
msgs = append(msgs, results...)
}
return "", fmt.Errorf("exceeded max turns (%d)", maxTurns)
}
What's missing from these roughly 40 lines is exactly the reason frameworks exist: checkpointing, resumption, streaming, token accounting, tool-approval gates, OTel spans, sub-agent routing, and context-window management. If two or three of these are all you actually need, writing it yourself is usually the better call.
8. Pre-Operations Checklist — Security and Governance Perspective
An agent framework is a mechanism that grants an LLM execution authority. Here's a list of items to verify before adoption.
| Area | What to check | Rationale |
|---|---|---|
| Supply chain | The number of transitive dependencies in the framework and its signature-verification setup. For Go, go.sum + the GOPROXY transparency log is the line of defense |
Numerous package-tampering incidents in 2025–2026 |
| MCP trust boundary | MCP servers are external code. Pin the server list/permissions to a whitelist and don't enable dynamic discovery in production | MCP tool descriptions themselves are a prompt-injection vector |
| Tool approval | Destructive operations (file deletion, money transfers, deployments) must sit behind an approval middleware. Use MAF's tool approval or LangChain's HITL middleware | Automatic tool calling is the default in many frameworks |
| Credentials | Ban fallback-style credentials (DefaultAzureCredential, etc.). Specify explicitly, e.g. via managed identity |
Official Microsoft recommendation |
| Data boundary | When using third-party models/agents, review whether data crosses your organization's compliance/geographic boundaries. Responsibility falls on the user | Explicitly stated in MAF documentation |
| Observability | OTel spans may carry raw prompt/response text. Establish a masking policy first | A leakage vector for PII/trade secrets |
| Side-effect idempotency | Check that no operation gets duplicated on resume/retry | See §7.3 |
| Version pinning | Recommend pinning preview-stage SDKs to a specific commit | MAF Go has not published release tags |
9. Summary
Choose your solution through the following lens.
Decide the layer first. Sorting out whether what you need is a tool loop (L1), a graph (L2), or a durable runtime (L3) narrows the candidates to two or three. What most teams actually want is L3, and that's the one thing that's expensive to build yourself.
The language dominates the decision. For Python/TS, LangGraph is the realistic default; for .NET, MAF is the default. For Go, the options are thin. MAF Go's direction is right, but as of July 2026 it's still in public preview, lacking handoffs, declarative agents, RAG, CodeAct, and DevUI, with a very small community. If Azure governance isn't a requirement, Eino, ADK Go, or a no-framework implementation may be the safer choice.
A framework buys failure handling, not performance. If an adoption review document says "performance improves," that document is wrong. The correct statement is "failures become observable and recoverable." An LLM is a spreadsheet, not an oracle, and a framework is the tool that turns that spreadsheet into an auditable one.
The practical recommendation for MAF Go is as follows. Keep it at the pilot/PoC stage for now, and first check whether your required features are implemented in docs/dotnet-go-sdk-feature-comparison.md. If handoff orchestration is among your requirements, it's not currently a candidate for adoption.
Appendix A. Reference Links
| Item | URL |
|---|---|
| Microsoft Agent Framework for Go | https://github.com/microsoft/agent-framework-go |
| .NET–Go feature comparison document | https://github.com/microsoft/agent-framework-go/blob/main/docs/dotnet-go-sdk-feature-comparison.md |
| Go reference | https://pkg.go.dev/github.com/microsoft/agent-framework-go |
| MAF mainline (.NET/Python) | https://github.com/microsoft/agent-framework |
| MS Learn documentation | https://learn.microsoft.com/agent-framework/ |
| Agent Framework dev blog | https://devblogs.microsoft.com/agent-framework/ |
| LangChain·LangGraph 1.0 announcement | https://blog.langchain.com/langchain-langgraph-1dot0/ |
| LangGraph 1.0 changelog | https://changelog.langchain.com/announcements/langgraph-1-0-is-now-generally-available |
| Eino (CloudWeGo) | https://github.com/cloudwego/eino |
| Foundry Build 2026 summary | https://devblogs.microsoft.com/foundry/whats-new-in-microsoft-foundry-build-2026/ |
Appendix B. Glossary
| Abbreviation | Full form | Meaning |
|---|---|---|
| MAF | Microsoft Agent Framework | Microsoft's multi-language agent framework |
| MCP | Model Context Protocol | Standard protocol for models to discover/call external tools |
| A2A | Agent-to-Agent | A messaging protocol between agents across runtimes |
| AG-UI | Agent-GUI protocol | A protocol for interaction between agents and user interfaces |
| HITL | Human-in-the-Loop | A pattern that inserts human review/approval during execution |
| OTel | OpenTelemetry | Standard for distributed tracing and metrics collection |
| SK | Semantic Kernel | Microsoft's previous-generation orchestration SDK |
| GA | General Availability | Official release, supported for production |
Data as of: July 22, 2026. GitHub metrics and framework feature lists change quickly. Cite the snapshot date alongside any figures and check the repository directly before making an adoption decision.
This piece is provided for informational purposes and is not an endorsement of any specific product or investment advice.