2.4.0 (2026-07-07)
Features
- Add mTLS support for DiscoveryEngineSearchTool (8ba0e6a)
- Add mTLS support to Google API tools (3466586)
- add OpenAI Responses API support in labs (6b831d5), closes #3209
- Add support for reusing an existing SQLAlchemy AsyncEngine in DatabaseSessionService (f4c7e4c)
- add support for session TTL and expiration in Vertex AI session service (49d4441)
- adk: add Anthropic
effortconfig handling, thinking parameter propagation, and conflict mitigation (4c862b9) - agents: add ManagedAgent backed by the Managed Agents API (cf91b84)
- bigquery: expose thinking and tool-use token columns in analytics views (c14258d)
- bigtable: Support parameterized views with secure parameter inj… (14a24f2)
- HTTP traces for MCP server requests/errors (4c4f77a)
- Implement Workflow as Tool core feature (1263ed6)
- integrations: Add DaytonaEnvironment for remote sandbox workspaces (df6baf4)
- interactions: stream thought, media, code-exec and function-result deltas (b2dda6e)
- interactions: surface streamed grounding and final usage metadata (6a50b8d)
- memory: add Vertex AI load_profiles tool (fb2b3af)
- models: Add configuration options to Gemini class (037ec12), closes #3813
- models: surface and recover environment_id from interactions (81f9f2e)
- plugins: add otel correlation, custom_metadata allowlist, and column projection to BigQuery analytics (38d715c)
- scripts: add check for private-by-default new Python files (63561ce)
- support file_data URI references in GcsArtifactService (43115b2)
- support mTLS and GOOGLE_API_USE_MTLS_ENDPOINT for GDA client (e85a7b2)
- Support passing dynamic custom headers to LiteLLM via RunConfig (000d74d)
- Support provider-prefixed Gemini model IDs (816a87f)
- tools: add response_scheduling to control Live function response behavior (7443bfa)
- tools: exposed configurable parameter as property in McpToolset (cca8c56)
- tools: resolve built-in tools for managed-agent requests (f11d19d)
- tools: Support tuple tool parameters (a57c3e4)
- utils: Add support for nested state access in template injection (94c43a2)
- workflow: Allow ToolNode to accept JSON string or Content inputs (4e44632)
Bug Fixes
- adapt interactions conversion to google-genai 2.9 SDK changes (9f3aeef)
- Add credential_key to ApplicationIntegrationToolset and IntegrationConnectorTool (c6a94b8), closes #4553
- Add debug level logging to mcp sse agent sample (3962d0b)
- add DNS-rebinding protection to _OriginCheckMiddleware (9a4f479)
- add module blocklist for YAML agent config code references (6a5be34)
- add parameter validation for sync tools in ADK functions.py (9b9d27d)
- add trailing newline to check_new_py_files.sh (21512ea)
- Address mypy failures in google_api_tool/ (5301ffa)
- agents: persist
output_keywhenbefore_agent_callbackshort-circuits LlmAgent (0e263f1) - agents: preserve text streamed before tool calls in output_key (5a0b4af)
- agents: prevent path traversal in AgentTool config_path resolution (171ae9e)
- ApplicationIntegrationTool: implement dynamic mTLS endpoint resolution (37ca6fb)
- apply run_config custom_metadata to user event in node runtime (066fbce)
- artifacts: Preserve .text on GcsArtifactService load (ba51ff2), closes #3157
- auth: allow configuring OAuth prompt parameter (ac99770)
- auth: strip redirect_uri from credential_key (ffa1843)
- avoid mutating event validation input (6b385e4)
- Avoid overwriting existing isolation scope in stamp_event_branch_context (798207a)
- avoid yielding a None function-response event in live mode (4d88a52)
- catch RecursionError in safe JSON serialization helpers (5515800), closes #5411
- check if transfer target is a sibling agent (fa18d26)
- ci: Restrict GitHub Actions to main/v1 branches and main repository (8c4173e)
- cli: detailed error message on sse stream specifying stacktrack (error type on client side as well) (56b84e1)
- cli: enable interspersed option parsing for cloud_run command (7b049b9)
- cli: Ensure ADK compatibility in agent engine requirements (ea772b9), closes #5966
- cli: respect ignore files in adk deploy commands (ee79e71)
- cli: support flat-module agents in _determine_agent_language (7a553b7)
- concatenate list values in deep_merge_dicts during parallel tool call merge (fda2347), closes #5190
- concatenate list values in deep_merge_dicts during parallel tool call merge (1ff84eb), closes #5190
- Constrain artifact references to the caller scope (f863150), closes #6124 #6125
- correct misleading workflow-agent deprecation messages (53a8ab1)
- Derive sandbox reasoning engine from template or snapshot name (5afa9db)
- drop nonexistent log_query tool from session_state_agent sample (ade8577)
- emit standard OTel cloud.resource_id for Agent Engine telemetry (8fc25f1), closes #6247
- Enable history_config on Vertex AI now that it is supported (2920145)
- enforce agent-config args denylist when loaded under adk web (e506fa6)
- ensure AgentTool text output when skip_summarization is True (b983fcf), closes #3881
- exclude live HTTP clients from trace serialization (59868ea)
- exclude scripts/ from pre-commit compliance checks (c91fc75)
- exit connection cleanly on expected GoAway signal in bidi streaming (4d165ef)
- fingerprint cacheable context prefix (7c7f1e7)
- firestore: preserve update timestamps in list_sessions (99ba8ce)
- Fix branch parsing and unify branch stamping (9e3b43f)
- Fix Code Generation Template Injection via Filenames (e042b8d)
- Fix error swallowing in MCP session context (ccb8138)
- Fix event loop closed and thread leak errors in unit tests (2f2e03b)
- Fix instructions_utils matching invalid nested paths (20ba01c)
- Fix MCP debug client factory compatibility with keyword-only factories (1ad8864)
- fix polling loop in IAM Connector Credentials Provider when consent is pending (a614507)
- Fix regression in instructions_utils placeholder matching (9ecbaed)
- Fix Vertex AI Live API session replay on reconnect / modality switch (c007a87)
- guard against None converter results in RemoteA2aAgent (23ff66e)
- guard against None converter results in RemoteA2aAgent handlers (2e3d717)
- guard user_content assignment against None in EvaluationGenerator (6bc9c9f)
- Handle empty message in LiteLLM response (d3e793f)
- handle Pydantic models in safe_json_serialize for tool tracing (25d666a), closes #4629
- harden ContainerCodeExecutor sandbox by default (0a9ce0f)
- implement dynamic mtls endpoint resolution for parameter manager (62b9700)
- implement dynamic mtls endpoint resolution for secret manager (5d4a13f)
- import App lazily in _resolve_app to fix legacy Runner NameError (7481d07)
- in mcp mtls logic, check for authorization header case insensitively (3870032)
- LiteLLM Claude thinking blocks with display: "omitted" were lost (7461863)
- Litellm preserve streamed reasoning deltas in LiteLLM adapter (b9625bf)
- litellm: parse DeepSeek-V3 proprietary inline tool-call tokens (c5b2caa)
- LiteLlm: recognize assistant- prefix as valid OpenAI file ID (ea325c7), closes #5664
- LiteLlm: recognize assistant- prefix as valid OpenAI file ID (796964a)
- live: fix the return type hint of handle_function_calls_live (9865e2b)
- live: forward thinking config (71d8c84)
- live: keep streaming tool yields from completing turns (07aa1e0)
- Make EUC request args JSON-serializable (a181a39)
- map A2A Message.role to correct GenAI content role (fe08a9f)
- mcp: await async MCP header providers (c01e538), closes #6090
- mcp: propagate trace context in default streamable HTTP client (431e3c2), closes #4768
- migrate AgentRegistry base URLs from v1alpha to v1 (82432a3)
- models: gate Gemini cache creation on cacheable prefix tokens (1070036)
- N sized sliding window (d00ad67)
- preserve Anthropic thinking blocks and signatures in LiteLLM round-trip (febb250)
- preserve JSON-native types in A2A _serialize_value() (139c700), closes #5183
- prevent crash when parsing default values for typing.Any parameters (e360241)
- prevent empty responses after load_skill (7c79230)
- prevent VertexAiRagRetrieval from blocking the event loop (5898f37), closes #5033
- prevent warning logs when cancelling MCP session runner task (4aa0fd8)
- propagate Gemini grounding metadata from ModelResponse (c303c62)
- raise ValueError for unsupported MIME types in file_data URI path (42eceb3)
- reconnect on live connection 1011 error (f36d257), closes #5525
- recurse into JSON-native containers in A2A _serialize_value() (c08debc)
- refactor
_redact_file_uri_for_logto dynamically extract file ID prefixes (file-,assistant-). This ensures compatibility with both current prefixes and future OpenAI/Azure file ID types. (ea325c7) - remove unit test with wrong assumption about claude thinking parts (94fcdbb)
- remove unused userinfo_endpoint from GoogleApiToolset OIDC config (1509dcf)
- restore auth_token initialization for secret and parameter manager clients (46a2181)
- Rollback instruction util refactoring as its breaking internal customers (59fe9b3)
- sandbox nested persona template rendering in evaluation prompts (30493ba)
- scope single-turn node inputs to workflow branch (8d389e2)
- security: enable Jinja2 autoescape to prevent XSS in gepa sample (a721c1e)
- send correct field names for sandbox input files (2b7e08a)
- sessions: drop unsupported part_metadata before Vertex appendEvent (40a0279), closes #6014
- sessions: strip tzinfo for MariaDB in DatabaseSessionService (2f799d5)
- Set persist-credentials to false in release-update-adk-web workflow (79b8923)
- strip tzinfo from datetime for MySQL in create_session (a012bb7)
- surface error for empty STOP model turn in non-streaming mode (932a9b5), closes #5631
- telemetry: always export Agent Engine logs to stdout (e6df097)
- telemetry: emit gen_ai.workflow.nested for nested workflows (20197de)
- terminate infinite retry loop in RunSkillScriptTool on SCRIPT_NOT_FOUND (89d9bda), closes #5684
- tools: accept dict output_schema in SetModelResponseTool (#5469) (d69dedd)
- tools: handle tuple schemas in function parsing fallback (4fa7741)
- Truncate MCP http debug logs if greater than 1000 chars (3ebef82)
- Update custom gemini llm connection logic to be used for all 3_x models, not just 3.1 (8aff514)
- update litellm dependency constraint to >=1.84.0 (a912306)
- update mtls_utils import in secret_client.py (0b79f8d)
- use branch-scoped events for auth responses (f706a1e)
- use exchanged OAuth credential in ApplicationIntegrationToolset (e76df3d)
- use Modality enum for RunConfig.response_modalities (5c8c55a)
- use mTLS endpoint for Google OAuth2 token requests (ffe41f0)
- Use RELEASE_PAT for checkout in release-update-adk-web workflow (28b7721)
- validate local eval path segments (7b87f91)
- Wrap math formulas in
mathblocks in retry config guide (a40f199)
Performance Improvements
- avoid deepcopy of session contents when building LLM requests (400f512)
- create SQLite session schema once per service instance (10a2cc5)
- remove state injection when instruction has no placeholders (59970b6)
- skip event query in DB get_session when num_recent_events is 0 (7e8191a)
Documentation
- Add manual batch mode trigger for ADK Pull Request Triaging workflow (dbd4bb0)
- clarify is_final_response() is a public helper (978be4b), closes #4016
- fix typo in per-turn user simulator quality prompt (9a79fa1)
- index missing reference guides in adk-agent-builder SKILL.md (c922b08)
- remove trailing whitespace in dynamic_nodes guide (a7377b4)
- samples: Add ManagedAgent code-execution sample (527e3c1)
- samples: Add ManagedAgent sample using server-side google_search (969909f)
- Sort PRs by update time in list_untriaged_pull_requests (8679aa8)
- Streamline open_source_workspace/AGENTS.md (ea2ea73)
- Update ADK Pull Request Triaging Agent workflow to run periodically (b3f278a)
- update GoogleSearchTool docstring to refer to Gemini models (8b011f9), closes #12345
- Update sample-creator skill with agent topology graph rule (7423101)
- workflow: Add and update workflow developer guides (e5c7d20)