2.8.0 (2026-08-25)
Features
- a2a: add native task mode support to RemoteA2aAgent (72f3ff5)
- add ADK_MAX_LLM_CALLS environment variable to configure max LLM calls limit (75679db)
- add create_data_agent tool to data_agent toolset (5cd38a0)
- add delete_data_agent tool to data_agent toolset (9b451fc)
- add location parameter to list_accessible_data_agents in data_agent toolset (393ec08)
- add Model Armor guardrail plugin (11efc3f)
- add nvidia nim integration sample (c6bba8d)
- add sample for skill state injection via adk_inject_state (9384127)
- add spreadsheet mime types to load_artifact_tool (370027a)
- add update_data_agent tool to data_agent toolset (92d00aa)
- allow configuring Vertex AI API version (ede87c2), closes #3246
- allow streaming tools to set response scheduling per yield (bf2efd7)
- antigravity: capture client-side tool outcomes for a function_response (4599a52)
- cli: Support Cloud Build worker pools for Agent Engine deploy (e577c30)
- eval: support custom metrics in AgentEvaluator (babb11c)
- guard against SQL injection vulnerabilities in BigQuery tools (d6290a0)
- live: Add VIDEO to the allowed modalities in the ADK API server (dd998a7)
- live: let a live streaming tool send messages to the user directly (98896eb)
- live: run before and after model callbacks in live mode (ef2d680)
- live: surface live
interaction_statuson LlmResponse and Event (b858904) - live: use RunConfig.session_resumption.handle when opening a live session (eac32c3)
- mcp: report MCP HTTP exchanges as OpenTelemetry log records (85a6fa1)
- parallelize LLM-as-judge evaluation using asyncio.gather() (0dbb88c)
- preserve field descriptions in set_model_response schema (a30858b), closes #6707
- record context cache state on the LLM call span (c0614d6)
- resolve auth for RemoteA2aAgent in AgentRegistry (d695494)
- support auth_scheme and auth_credential in RemoteA2aAgent (d42c634)
- support injecting custom LLM clients into Gemini and AnthropicLlm (a01d516), closes #5027
- support memory_id and allowed_topics in Vertex Memory Bank (bf73360)
- support opt-in session retention in MultimodalToolResultsPlugin (775c1bd), closes #6695
- support sub-agent escalation event in ParallelAgent (0fd681e), closes #5104
Telemetry
- telemetry: add per-invocation token spend metrics for invoke_agent (dc00db5)
- telemetry: add per-workflow inference and tool call counts (6e6c4a5)
- telemetry: add per-workflow token spend metrics (dd8797e)
- telemetry: Expand telemetry for
load_skill_resourcespan (6e0facf) - telemetry: honor RunConfig.telemetry at the runner's invocation span (00fc6eb)
Note: new experimental telemetry feature for token usage per agent invocation and per workflow, inference and tool call counts per workflow, and expanded load_skill attributes. Off by default, opt in with ADK_EXPERIMENTAL_TELEMETRY=true or RunConfig.telemetry.adk_experimental_telemetry_opt_in=True.
Bug Fixes
- a2a: keep file payloads out of the debug log line (ef158d3)
- agents: report which toolset an agent lost when one fails to load (66930e6)
- artifacts: Publish file artifact versions atomically (94475c9)
- auth: take the auth scheme from the request, not the client's response (8989aea)
- avoid O(n^2) deep event comparison during rehydration (b8dd086), closes #6657
- block yaml and ruamel deserialization in agent-config code references (924d802)
- cache read write token counts in LiteLLM and Anthropic models (d0b33a0), closes #5835
- check every function response, not just the first, when inferring which invocation to resume (5449314)
- cli: clean up pytest subprocesses on test-client disconnect (a84a4b5)
- cli: Preserve non-ASCII text in
adk test --rebuild, Web UI test saving, and CLI JSONL (dc735bd) - cli: report env var names instead of values when overriding env_vars (b0c599f)
- count tool call and response chars in compaction (66908e4)
- declare a2a-sdk[http-server] so the a2a extra can serve (65234e7)
- deduplicate events in InMemorySessionService.append_event (4d74774), closes #5723
- deliver parallel sub-agent failures to the caller (ece924c), closes #5455
- detect MCP tool errors under either field spelling (d18df2f)
- disable Windows glob expansion for CLI args (2638155), closes #6248
- emit Anthropic prompt cache breakpoints for ContextCacheConfig (811d379), closes #5395
- fence relayed agent output so it cannot pose as instructions (9ffe8be)
- filter thought parts from A2A client user-facing response (8963a04), closes #4676
- Fix built-in search tools in agent hierarchy when transfer_to_agent is present (f3250bd)
- Fix crashes and cross-invocation leaks from copying RunConfig.http_options (67ca98c)
- flows: pair a function response with the call it answers (deee6d2), closes #6761
- flows: sort function_call.args when rendering cross-agent context (735402d)
- Guard
invocation_context.branchassignment against mockSessionServiceinstances (9917922) - guard against Content with no parts in _content_to_message_param (1ed8d48)
- handle read-only .git files in deploy cleanup on Windows (c93fcc0)
- honor before_run_callback early-exit for Workflow runs (dac1869), closes #6013
- honor ContextCacheConfig on the LiteLLM path (b1c984b)
- improve clarity and actionable context in error messages (7c2af5f)
- include grounding metadata in rubric judge prompt (b0cdecf), closes #5831
- integrations: send api registry credentials only to google api endpoints (cc275f0)
- keep non-text static_instruction as a stable request prefix (deda5b3), closes #6652
- keep session identity across single-turn node contexts (c602065), closes #6691
- keep tool calls at most once (5bcf5cd)
- live: stop background tool tasks when a live agent run ends (0088abb)
- live: stop live runs from writing back into the caller's RunConfig (0b39e72)
- make SqliteSessionService state merges use dict.update() semantics (e4ba704), closes #6728
- mcp: evict idle sessions from the MCP session pool (69a3ca5)
- only attach default credentials to https endpoints (5d3d152)
- only emit --gemini_enterprise_app_name for adk_version >= 2.2.0 (00932e6)
- pass file metadata tuple to Azure for PDF uploads (ff4567d), closes #6539
- percent-encode path parameter values in RestApiTool (25f53bd)
- point to Gemini Enterprise registration docs after agent_engine deploy (1d2d1ed), closes #6633
- populate developer_instructions when invocation_events is empty (69c9090), closes #5593
- prefer the function response's own invocation over a caller-supplied id on the node path (4d0d63c)
- prevent contextvars leak across async generators (bb86bdd), closes #5722
- prevent duplicate function execution when support_cfc is enabled (c986ff0)
- prevent duplicate OAuth prompts and fix tool resumption (eaad2f8)
- prevent duplicate synthetic user event on single-turn agent resumption (e753651)
- prevent prompt injection via GitHub event data in workflows (4f558f1)
- rank and bound the results of InMemoryMemoryService.search_memory (f3fae72)
- re-raise agent errors from the synchronous Runner.run() (b55000d)
- read long-running function name from data, not metadata (029c17b), closes #6295
- redact credentials from DebugLoggingPlugin output file (a86bd25)
- redact credentials from generate_content_config.http_options in debug logs (1cd6f46)
- reject negative recent-event limits (26110c7)
- reject tool confirmations arriving over A2A (9e9eaa6), closes #6461
- report root_agent type mismatch instead of 'No root_agent found' (4f07c93), closes #6606
- resolve Claude 5 model names in the LLM registry (42a4a5f)
- resolve NameError in legacy create-eval-set route (023f45c)
- resolve nested provider behind litellm_proxy prefix (602e58d), closes #6538
- resolve server disconnect logs (3f2d399)
- resolve systemic parts[0] indexing bugs (2109ea9), closes #6616
- Restore
invocation_context.branchfrom session history when executing a non-root agent node or resuming a sub-agent inRunner(676d1e7) - restrict unpickling of legacy v0 session event actions (97c2af0), closes #5634
- resume an invocation whose user message leads with a non-text part (6d8c588)
- revert the A2A guard that broke every HITL tool confirmation (9a32eba)
- route workflow IDs and retry jitter through platform seams (8f85107)
- samples: widen numeric tool parameters to match their docstrings (0c67410)
- sanitize state deltas before writing them to JSON state columns (3f9e6be)
- send the required list on a CrewAI or LangChain function declaration (186d9f7)
- sessions: dedupe InMemorySessionService events by equality not id (c9323d5)
- sessions: load legacy v0 event actions with the restricted unpickler (fb15710)
- sessions: stop dropping event actions on v0 PostgreSQL migration (e3ae4ac)
- skills: skip search results that fail frontmatter validation (3c977bc), closes #6838
- skip non-agent directories in AgentLoader.list_agents() (caac070)
- skip non-numeric response keys in generate_return_doc (920bc3e), closes #6174
- stop re-sending thought summaries as conversation history (e4f5900)
- stop re-sending thought summaries as conversation history (3c1b1bc)
- stop RemoteA2aAgent forwarding credential requests to the remote peer (2aea859)
- stop the session liveness probe from crashing when the SDK moves its streams (d9f4d3d)
- strip internal planning tags from PlanReActPlanner output (ac8dad2), closes #3378
- telemetry: End the inference span when the inference ends (ecc730c)
- telemetry: record call_llm span attributes when a plugin short-circuits the model call (0321136)
- tools: report no match instead of raising on empty retrieval (99660d9)
- tools: run AgentTool nested agent in unary mode (0d5752b)
- tools: run an agent tool under the caller's RunConfig (983c280)
- trigger Gemini 3.x Live response after sending conversation history (7616c78)
- update unit guide skill to exclude internal implementation details (0c0296c)
- use OAuth2 client-credentials scheme for OpenAPI SA helpers (9897217), closes #6656
- use Unicode-aware keyword extraction in InMemoryMemoryService (b8ea1e8), closes #5501
- validate session initialization events (3fa71b6), closes #5290
- validate SQL identifiers in Spanner search tool (8d2f277), closes #5913
- workflow: cancel parallel worker items when the worker is cancelled (dec729f)
- workflow: declare abc.ABC on BaseNode so abstract subclasses type-check (f3b59fd)
- workflow: do not act on function calls in partial events (816ada5), closes #6583
- workflow: honor START as a satisfied JoinNode predecessor (d8df6fd)
- workflow: resume node auth from the node's own auth config (5b59139)
Performance Improvements
- buffer streamed function call arguments instead of concatenating (f604de2)
- key the Pub/Sub publisher cache on its options' value (51231cd)
- remove redundant event scans in prompt assembly (d7adc1c)
- remove redundant event scans in prompt assembly (e66fdd2)
- resolve the optional id-pairing providers once, not per request (203461c)
- run local code execution in a plain child interpreter (c244a9c)
- run the Google credential refresh off the event loop (2aa2b46)
Documentation
- add audio_stream_end documentation for realtime input (17cb265)
- correct node schema docstrings about which variants validate (e649a38)
- correct the documented contract of the invocation-subtree event filter (be8fcf4)
- fix typos and grammar in README (ffe518a)
- guides: add developer unit guide for BaseCodeExecutor (b370fc0)
- guides: add developer unit guide for BasePlanner (ea23a89)
- guides: add developer unit guide for Runner and Runner Live Streaming (1d89e0f)
- repair the workflow guides and document BaseNode (7c7d2ba)
- tell sample creator skill not to prefix dirs with
$categoryor suffix with_agent(50c3edf)