Build reliable multi-agent applications with ADK Go 2.0. Discover our new graph-based workflow engine, built-in human-in-the-loop, and dynamic orchestration Google released ADK Go 2.0, a major update to its Agent Development Kit for Go, introducing a graph-based workflow engine for building reliable multi-agent applications. The new version features built-in human-in-the-loop support, dynamic orchestration, and a scheduler that handles concurrent execution, state persistence, and pause-resume across restarts. Building real-world agent applications is rarely as simple as sending a single prompt. Production agents must classify, branch, fan out, ask a human to approve something, retry on failure, and loop until done. Expressing that complex orchestration as ad-hoc control flow gets brittle fast. Since its 1.0 release, Agent Development Kit ADK for Go has helped Go developers build production agents with a clean, idiomatic API — strong typing, iter.Seq2 event streams, and a runtime that fits naturally into existing Go services. That foundation has been a real success, and it's exactly what made the next step possible. Today we're excited to share ADK for Go 2.0 https://github.com/google/adk-go/releases/tag/v2.0.0 . The headline is a brand-new, first-class way to compose multi-agent applications: a If you've followed Python ADK 2.0 https://adk.dev/2.0/ , this will feel familiar: it's the same graph-first direction, designed from the ground up to feel like Go. Real agent applications are rarely a single prompt. They classify, branch, fan out to specialists, gather results, ask a human to approve something, retry on failure, and loop until done. Expressing that as ad-hoc control flow gets brittle fast. ADK 2.0 lets you describe the shape of your application as a graph of nodes connected by edges , and hands execution to a scheduler that knows how to run it concurrently, persist its state, pause for a human, and resume later — even across process restarts. Here is how simple it is to chain nodes together: import "google.golang.org/adk/v2/workflow" upper := workflow.NewFunctionNode "upper", upperFn, cfg suffix := workflow.NewFunctionNode "suffix", suffixFn, cfg edges := workflow.Chain workflow.Start, upper, suffix wf, := workflowagent.New workflowagent.Config{ Name: "simple sequence workflow", Edges: edges, } That wf is just an agent.Agent . It runs in the same runner, launcher, and console you already use — no special harness, no new server. A graph is an agent. A node is any unit of work that implements the Node interface https://pkg.go.dev/google.golang.org/adk/v2@v2.0.0/workflow Node . You rarely write that interface by hand — ADK ships typed node constructors for the common cases: workflow.NewFunctionNode "classify", func ctx agent.Context, in string Category, error { ... }, cfg emit callback, so a single function can workflow.NewEmittingFunctionNode "progress", func ctx agent.Context, in Job, emit func session.Event error Result, error { ... }, cfg agent.Agent like an LlmAgent into the graph. tool.Tool into a graph step. NewFunctionNodeFromState pull selected session-state values straight into a typed Params struct via state:"