ADK-Python v2.9.0 enhances agent resilience, voice integration, and workflow management
ADK-Python version 2.9.0 introduces significant updates focused on agent resilience and ecosystem integration. Key enhancements include automatic model failover for increased uptime and native voice support through a new LiveKit runner, enabling development of rich voice and telephony agents. The release also simplifies workflow management by allowing direct authoring and loading of ADK 2.0 graphs from declarative YAML configurations. Additionally, it adds compatibility with MCP SDK 2.x, alongside several breaking changes for existing workflows and session handling.
- →retry a nested workflow when a node inside it fails
- →confine GCS tool local file paths to a configured root
- →rerun a failed node on resume instead of replaying it as complete
- →raise SessionNotFoundError when appending to an unknown session
- →add a2a_state_forwarding sample
Breaking changes (8) ›
Workflow node resumption: A node that failed now runs again when the workflow resumes, where before it replayed as though it had completed. Make node bodies idempotent: a node that performs an external side effect and then fails will perform that side effect again on every resume
GCS tool local paths: The GCS tools now read and write local files only inside the directory named by local_file_root, and refuse local file access entirely when that setting is absent. Paths may be absolute or relative, and are judged by where they resolve
In-memory sessions only: InMemorySessionService now raises SessionNotFoundError when an event is appended to a session it does not hold, instead of accepting the event and discarding it. The database-backed services already behaved this way, so this affects in-memory sessions alone
- retry a nested workflow when a node inside it fails
- confine GCS tool local file paths to a configured root
- rerun a failed node on resume instead of replaying it as complete
- raise SessionNotFoundError when appending to an unknown session
- mcp
under MCP SDK 2.x, fields a server sends that the SDK does not declare no longer reach the caller. 2.x closed its models, so an unknown key on a CallToolResult, or on a tool declaration read via raw_mcp_tool, is discarded during validation before ADK sees it. _meta is unaffected: it is a declared field and still arrives. Nothing in ADK can restore the others; a server that relies on vendor extensions should move them under _meta. On 1.x they still arrive as before
Features (15) ›
- add a2a_state_forwarding sample
- add FallbackModel for automatic failover between models
- add get_authenticated_url and get_signed_url to GcsArtifactService
- add ignore_args option to tool trajectory evaluation
- add transfer_reason to transfer_to_agent to prevent loops
- agent evaluations print detailed results when all tests pass , closes #3891
- generalize docker build and run for multicloud environments
- integrations add LiveKit runner for voice and telephony
- load ADK 2.0 graph workflows from YAML configuration
- mcp support MCP SDK 2.x alongside 1.x
- support hyphenated column names in BigQuery tools
- telemetry add ability to track skill loads
- telemetry add script execution instrumentation
- telemetry export logs over OTLP to telemetry.googleapis.com
- tools support FunctionNode auto-inference in NodeTool
Enhancements (3) ›
- defer imports in code executors
- extend the workflow replay index instead of rebuilding it per event
- stop rescanning the session for every user response event
Fixes (112) ›
- a2a quote a fetched card description and drop relayed auth responses
- a2a require https for a non-loopback agent card URL
- a2a stop a completed task delegation breaking later peer delegations , closes #6831
- add optional OIDC verification for Pub/Sub and Eventarc triggers
- append the user's next turn when it joins a paused task
- apply state_delta when resuming without a new_message , closes #6644
- artifacts give concurrent gcs artifact saves distinct versions
- auth declare that AuthHandler.generate_auth_uri can return None
- balance callback lifecycle for hallucinated tool calls , closes #4775
- bigquery lazy-load Dataplex so BigQueryToolset imports without it
- callables extract unified CallableSpec and resolve doc and unwrap edge cases
- cancel the invocation when a sync run() generator is closed early
- cli explicitly set memory_service_uri='memory://' when --in_memory is passed
- cli make the decorators on API and dev server routes take effect
- cli sync the Agent Engine class-method catalogue with its source
- close a task-mode delegation when the remote agent finishes
- coerce an integral float back to int for an int-typed tool parameter
- coerce callable AgentInfo.instruction for app-info , closes #6909
- default AgentCardBuilder capabilities to streaming=True , closes #6672
- defer local state/event mutation until Vertex append succeeds , closes #6998
- end a live session when the client closes the request queue, instead of reconnecting or busy-waiting
- end tool callback chains on the first non-None result
- environment terminate the whole process tree when a local command times out
- fail a workflow when a detached dynamic node errors or interrupts
- flows keep code execution going instead of reporting no content , closes #7002
- flows move before_tool_callback from prepare phase into per-tool execution
- flows propagate contextvars set in before_tool_callback to the tool
- flows restrict agent transfer to the declared transfer targets
- forward GenerateContentConfig.seed to LiteLLM , closes #6513
- forward the agent's generation config (temperature, top_p, top_k, max_output_tokens, seed, media_resolution) to the Live API
- gcs judge a local path by where it lands, not by whether it is absolute
- guard malformed tool call argument JSON in LiteLlm response parsing , closes #5896
- handle failed inference cases gracefully in GEPA pipeline , closes #6004
- honor save_live_blob when caching live user audio
- initialize Anthropic client off event loop
- invalidate import caches during agent module validation , closes #6948
- keep the original event id when reloading a Vertex session , closes #6530
- keep the tool filter and name prefix when cloning a skill toolset
- keep the turn anchor when a long-running tool result is posted back
- label the dynamic instruction so a model does not read it as a user turn and imitate it
- log an error when a model returns multiple candidates
- make SkillToolset system instruction respect tool_filter , closes #6448
- match a branch's run ids exactly when resolving HITL interrupts
- mcp keep resolving MCP 1.x by default
- mcp only attach application default credentials to Google API hosts
- mcp skip summarization when a tool call pauses for confirmation
- memory do not let a failing temp-file cleanup mask the upload error
- microsecond-safe DatabaseSessionService on SQL Server (mssql)
- models stop a content-free thought signature from wedging a session
- name the async driver when a database URL uses a sync one
- never empty the request contents when applying a context cache , closes #6945
- normalize session_id before duplicate check in in-memory service , closes #6887
- openapi bound the REST API tool's default HTTP waits
- plugins keep a staticmethod a staticmethod when auto-tracing wraps it
- point misplaced generation kwargs at generate_content_config , closes #6836
- populate model_version on AnthropicLlm responses , closes #6847
- preserve anyOf and camelCase aliases in LiteLLM tool schemas , closes #6738
- preserve Gemini 3 thought signatures in interaction history
- raise a sub-agent's own error from ParallelAgent, not a group
- raise AlreadyExistsError on concurrent create_session races
- read an MCP tool's schema under either spelling in telemetry
- rebind an agent's own callback methods when cloning
- redis match app_name and user_id literally when listing sessions
- refuse a tool call whose arguments a broken stream cut short , closes #6716
- refuse a transfer to a forbidden parent or peer agent
- reload changed agent correctly , closes #4956
- report a metric that never ran as not evaluated, not as failed
- report an unknown tool name to the model instead of raising
- report the real finish reason from a LiteLlm stream
- rerun a paused workflow node after the user answers it
- resolve every Claude model id rather than enumerated generations
- resolve scheduler leakage and use node.clone() in DynamicNodeScheduler
- retry once on 429 in VertexAiSessionService
- return custom_metadata from VertexAiMemoryBankService.search_memory , closes #6946
- route interleaved interactions function-call deltas by step index , closes #6832
- samples correct the live audio path, the live eval config and the multimodal samples
- samples read the knowledge agent data store from the environment
- sanitize anyOf schemas for Vertex AI function declarations , closes #6373
- show adk create --type in --help , closes #6737
- skip duplicate user event append on invocation retry , closes #4506
- skip rewound invocations when resuming agent in _find_agent_to_run , closes #4169
- skip summarization for terminal A2A task states
- spanner release the client, transports and sessions each tool call creates
- stop a child branch stamped on a user event moving the invocation root
- stop after final preprocessing responses , closes #4472
- stop caching a remote agent card that failed validation
- stop CompletionsHTTPClient leaking its httpx client via atexit
- stop ContainerCodeExecutor leaking via atexit
- stop declaring dict value types to Google AI
- stop offering run_skill_script when no code executor is configured
- stop sending the OAuth client secret to the client
- stop silently dropping sampling settings on interactions API
- support multi-turn nested HITL pause and resumption across workflows and agent tools
- telemetry end the inference span at the finish reason, not at the first chunk
- telemetry keep thought signatures out of span attributes
- telemetry remove helper methods for type-safe hallucination checking and update function signatures
- tools import the two annotation names that are referenced but unbound
- tools support zero-argument nodes in NodeTool
- tools treat an empty openapi security requirement as optional auth
- treat a max_iterations of zero as zero loop passes
- treat an error event without function calls as a final response
- update max_llm_calls validation to reject values greater than or equal to sys.maxsize
- utils adapt callback keyword arguments to positional parameters
- utils include agent name in instruction context variable missing error
- utils report an unknown session id in the cache performance analyzer
- validate app_name before interpolating into deploy Dockerfile
- validate function call author before resuming auth-gated tool calls
- vmaas cache the sandbox access token on the computer instance
- warn once per experimental surface instead of on every use
- workflow drop resume inputs from the resumable node checkpoint
- workflow omit the oauth client secret from the credential request event
- workflow retry subclasses of a configured retry exception
Maintenance (24) ›
- a2a explain the human-input resume tests in their own terms
- add node as tool developer unit guide and sample docs
- add unit guides for A2A, skills and the execution backends
- add unit guides for evaluation, serving and observability
- agents state the lazy-import rule the comment only pointed at
- align callback contracts with runtime behavior
- antigravity add the AntigravityAgent unit guide
- antigravity describe the scenario a compaction-turn test covers
- antigravity name the Antigravity SDK in full and disambiguate "agent"
- correct the heading in the llms-full.txt pointer
- document Live streaming in adk-agent-builder and adk-architecture
- document replacing a failed tools listing via get_tools , closes #6748
- features use a real feature name in the is_feature_enabled example
- flows drop the incorrect move instruction from three compatibility shims
- give the unit guide skill a voice section
- live move LiveRequestQueue developer guide to docs/guides/live
- memory describe ttl as the revision_ttl alias it actually is
- openai drop the third-party gateway from the OPENAI_BASE_URL tip
- plugins say what the reflect-and-retry failure counter's lock guarantees
- scope the gVisor claim to the mode that provides it
- state what a parallel branch isolates and what it shares
- tests remove the internal notebook link from the hello world fixtures
- tools scope the Spanner capabilities setting to the toolset that reads it
- release as 2.9.0
https://github.com/google/adk-python/releases/tag/v2.9.0
Related releases
- CrewAI 1.15.21 Release Introduces Telemetry and Resolves Multiple Bugs CrewAI Releases ·
- OpenAI Python Agents SDK v0.22.2 Released OpenAI Agents SDK (Python) Releases ·
- Pydantic-AI v2.42.0 Enhances GitHub Copilot Integration and Fixes Bugs Pydantic AI Releases ·
- OpenAI Agents Python SDK v0.22.1 enhances tools, guardrails, and voice features OpenAI Agents SDK (Python) Releases ·
- Pydantic-AI v2.41.0 Adds Image Generation API, Deprecates `fallback_model` Pydantic AI Releases ·
- pydantic-ai v2.40.0 enhances real-time AI session control and agent events Pydantic AI Releases ·