Skip to content

main: v2.0.0

Latest

Choose a tag to compare

@kalenkevich kalenkevich released this 21 Aug 14:39
4f44910

2.0.0 (2026-08-20)

⚠ BREAKING CHANGES

  • workflow: LLMAgentWrapper and LLMAgentWrapperConfig are removed. An agent is a workflow node as itself — pass it to an edge or node() directly. A non-LlmAgent agent used as a node no longer has the node input appended to its conversation, nor its final model text promoted to the node output.
  • workflow: InvocationContext.agent is now optional. Code reading it outside an agent's own execution must handle undefined; inside one, prefer requireAgent(ctx).
  • agents: constructing a SequentialAgent, ParallelAgent or LoopAgent now logs a deprecation warning once per class per process. The classes are otherwise unchanged and keep working.
  • agents: BaseAgent now extends BaseNode, so subclasses inherit rerunOnResume, waitForOutput, retryConfig, timeout, inputSchema, outputSchema and stateSchema. A subclass that declares a field of the same name now collides with the inherited one. BaseAgent.description is also no longer undefined when unset.
  • workflow: a dynamic ctx.runNode() child that raises an interrupt and re-reads ctx.resumeInputs on re-run must now declare rerunOnResume: true. With the default it is completed with the raw reply as its output instead of re-running. Workflow is still @experimental.
  • workflow: add engine core — execution model, graph, and node registry (Part 2) (#588)

Features

  • agents: deprecate SequentialAgent, ParallelAgent and LoopAgent (#679) (63927e2)
  • agents: make BaseAgent a BaseNode (#667) (4b0c605)
  • core: accept a bare Workflow as a root — runner, App and agent loader (#680) (b3497e0)
  • core: graduate RoutedAgent and RoutedLlm out of experimental (#783) (36e3fcb)
  • core: implement Runner.runLive and LlmAgent live flow (#523) (48165a8)
  • dev: render graph workflows in the dev UI agent graph (#654) (434a43e)
  • dev: serve the agent structure graph the dev UI's graph tab asks for (#694) (8915c2b)
  • Honor GOOGLE_GENAI_USE_ENTERPRISE in getExpressModeApiKey() (adk-python parity) (#569) (444f30b)
  • plugins: add before/after node callbacks (#659) (e03bbad)
  • Port the environment abstraction (BaseEnvironment, ExecutionResult, LocalEnvironment) from adk-python (#582) (f7f541e)
  • tools: FunctionTool require_confirmation — HITL approval (Part 7) (#594) (d2ae57b)
  • utils: enforce schemas declared in the genai dialect, not just Zod (#663) (392511a)
  • workflow: add engine core — execution model, graph, and node registry (Part 2) (#588) (672dbde)
  • workflow: built-in Function and Tool nodes (Part 3) (#590) (68aebdb)
  • workflow: drive workflows as nodes and remove WorkflowAgent (#688) (534546f)
  • workflow: enforce a node's declared stateSchema (#713) (379e45c)
  • workflow: let ctx.runNode() take what edges take (#683) (53535d3)
  • workflow: LLM-agent-as-node, task mode, and node-as-tool (Part 6) (#593) (5334b45)
  • workflow: make isolationScope real by filtering LLM contents on it (#656) (bdc9090)
  • workflow: ParallelWorker and JoinNode (Part 4) (#591) (13f9995)
  • workflow: record a failed node as a NodeErrorEvent (#657) (e5025e9)
  • workflow: trace workflow and node execution with OpenTelemetry (#653) (d0f19c5)
  • workflow: workflow runner and public API (Part 5) (#592) (1b90f3b)

Bug Fixes

  • agent-loader: ignore node_modules and hidden folders in agent discovery and fix integration test timeouts (#674) (d9ffd9d)
  • agents: bind a human-in-the-loop confirmation to the action it approves (#771) (2d1bb44)
  • agents: keep usage metadata from content-less streaming responses (#646) (2e58422), closes #645
  • agents: persist processLlmRequest state changes (#630) (9360bf2)
  • agents: stop warning about transfer config the author never set (#746) (5860560), closes #725 #726
  • api-server: return the events a failed invocation produced from /run (#749) (4bc0e0d), closes #743
  • auth: bind a credential response to the request that asked for it (#775) (10ae7bd)
  • build: retry the ADK Web download instead of failing the build (#693) (e57f6cf)
  • cli: keep one broken agent from killing the dev server; surface HITL prompts and errors in adk run (#633) (a98d132)
  • cli: make --log_level debug actually set the debug level (#658) (d56ea73)
  • deps: bump google.golang.org/grpc to 1.82.1 in the Go test backend (#745) (35b7bdf)
  • dev: keep the adk run REPL alive when a turn fails (#780) (9c3121f)
  • dev: print a node's output when it emitted no text (#779) (2f534b7)
  • dev: stop --verbose eating the agent path (#764) (b633b57)
  • dev: stop an empty node response vanishing from the transcript (#765) (af3a821), closes #728
  • dev: stop dropping piped stdin lines, and keep the prompt on its own line (#781) (e5c8532)
  • encode and validate OpenAPI path parameters in RestApiTool (#638) (cedd2a5)
  • models: consult GOOGLE_API_KEY on the Gemini API path (#748) (60a3c67), closes #712
  • resolve the browser export condition in core and integrations (#618) (0f9f73d)
  • runner: stop warning about workflow nodes when resuming (#672) (e294c4d)
  • samples: validate the classifier's routes, and title-case Unicode (#751) (2d77643), closes #736 #741
  • server: serve /version, which the dev UI reads on load (#685) (2817457)
  • sessions: keep workflow event fields across the Agent Engine fallback path (#649) (a493f74)
  • sessions: redact connection-URI password in unsupported-URI errors (#602) (aee56e0)
  • sessions: restore event round trip in VertexAiSessionService (#565) (90b2417)
  • sessions: send the agent-transfer action under the name the API defines (#660) (6a8224e)
  • sessions: stop a late event commit rolling a state key back (#695) (86459dc)
  • skills: materialize script output into a dedicated dir, not process.cwd() (#620) (2ea08cf)
  • skills: preserve binary skill assets as Buffer (#644) (94cbe4a)
  • skip identity preamble when agent transfer is disabled (#616) (09e2375)
  • telemetry: make a workflow's spans retrievable so its traces render (#750) (63a5f43)
  • tests: give the local code executor tests a Windows-sized budget (#662) (9726467)
  • tests: keep a prompt change from breaking every workflow sample (#647) (5742875)
  • tests: stop cli_create tests reading the developer's gcloud env (#666) (7312efc)
  • three defects found bug-bashing the graph-workflow docs samples (#664) (e0dae58)
  • workflow: apply node overrides to an already-built node (#673) (a9dd7c6)
  • workflow: check a structured HITL reply against its responseSchema (#665) (238d600)
  • workflow: don't replay a finished run on the next turn (#637) (3e4f770)
  • workflow: emit the interrupt schema under the key clients read (#686) (e84eb3f)
  • workflow: fail a node that reports an error instead of throwing (#776) (8786718)
  • workflow: hand the START node the user's text, attachment or not (#778) (7c65534)
  • workflow: keep a jittered retry delay inside maxDelay (#704) (c577510)
  • workflow: let a child's pending interrupt hold its caller (#759) (8b43818), closes #734
  • workflow: let a resumed graph route back through a node it already ran (#700) (074827a)
  • workflow: let an agent node converse and finish a confirmed tool call (#703) (73b9443)
  • workflow: let an item that asks the user pause the whole worker (#708) (d4a5373)
  • workflow: let two route keys share a destination node (#763) (172ccb1), closes #740
  • workflow: match a retryable exception by its class name (#705) (de31b04)
  • workflow: record which nodes an output answers for (#690) (6796f42)
  • workflow: refuse a numeric custom runId whichever call comes first (#762) (fbff483)
  • workflow: refuse a reply that answers no open interrupt (#777) (19c50ef)
  • workflow: refuse a runId that collides with an automatic one (#670) (aca4a32)
  • workflow: report an aborted node as aborted, not timed out (#706) (596f41c)
  • workflow: resume a waiting parent on its original input (#760) (67d5246)
  • workflow: resume dynamic HITL children instead of livelocking (#635) (1961d2c)
  • workflow: say which node failed, and when a route goes nowhere (#650) (a785f3a)
  • workflow: stamp the invocation id on an event a node built itself (#747) (b339f75), closes #715
  • workflow: stop delivering a workflow's output as two events (#669) (7aa76e7)
  • workflow: stop duplicating a delegated output, and parse a structured reply (#702) (bd47431)
  • workflow: stop node state writes from being rolled back mid-run (#636) (fcc6c1e)
  • workflow: stop re-running a dynamic node that already settled (#707) (bc4e238)
  • workflow: stop reinterpreting a text reply the schema asked for as text (#761) (022fcc9), closes #737
  • workflow: unwind a caller past a dynamic child that paused or failed (#709) (5719010)

Performance Improvements

  • core: make situational subsystems optional peers, 591 → 172 packages on install (#626) (a5cdc38)

Code Refactoring

  • workflow: collapse LLMAgentWrapper into LlmAgent.runImpl (#696) (49209ab)