2.10.0 (2026-09-24)
Highlights
This release introduces advanced skill lifecycle management, expands database and model integration support, and brings richer efficiency metrics to agent evaluation.
- Skills: Control resource usage and tool persistence dynamically using new ephemeral lifecycles and active skill limits (experimental; enable with
ADK_ENABLE_SKILL_LIFECYCLE=1). (43b73e4) - Database Integrations: Perform high-performance vector and hybrid searches seamlessly within your agent flows with the new MongoDB toolset. (0961ced)
- Evaluation: Optimize agent execution costs and latency with new evaluation metrics for tracking duration, token consumption, and model call counts. (2d428ea)
- Model Support: Integrate OpenAI reasoning models more effectively with automated request parameter adaptation and precise reasoning token reporting. (52a2f0f)
Behavior changes
- BigQuery protected write mode now runs a non-SELECT statement only when the dry run places it in the session's anonymous dataset, so multi-statement scripts,
CALL,EXPORT DATAand other statements the dry run gives no destination are rejected. (8b883d0) - BigQuery protected mode keeps its BigQuery session in process memory instead of session state, so its temporary tables do not survive a restart or carry over to another replica. (094012b)
OpenAIResponsesLlmignoresthinking_config(thinking_level/thinking_budget) with a warning; useOpenAIGenerateContentConfig.effortinstead. (b3d1392)AgentEvaluator.evaluateandevaluate_eval_setraiseValueErrorwhen no eval cases are evaluated, instead of passing. (9dbc2ae)- Instruction templating leaves
${var}and backslash-escaped\{var}as written instead of filling them from state. (0caecd2) - Legacy live-audio modules under
google.adk.flows.llm_flows(audio_cache_manager,audio_transcriber,transcription_manager) emit aDeprecationWarningon import; move togoogle.adk.live. Test suites run with-W errorwill fail on these imports. (bf2bc56)
All changes
Features
- add a duration efficiency metric to ADK eval (49e7264)
- add an EPHEMERAL skill lifecycle that lasts one turn (experimental, off by default; enable with
ADK_ENABLE_SKILL_LIFECYCLE=1) (f938abd) - add an opt-in unload_skill tool to SkillToolset (experimental, off by default; enable with
ADK_ENABLE_SKILL_LIFECYCLE=1) (ce53a36) - add dev-only deploy endpoints for Agent Runtime, Cloud Run, and GKE (1235104)
- add informational efficiency metrics (tokens, calls) to ADK eval (2d428ea)
- add MongoDB toolset with vector and hybrid search (0961ced)
- add name-based request processor helpers to BaseLlmFlow (fd335cd)
- add on_error handler to skill listing functions (9b220e7)
- add optional context_builder to RemoteA2aAgent (322e3bf), closes #3301
- add programmatic skill activation APIs to SkillToolset (a0f3955)
- add skill lifecycle modes and an active-skill cap to SkillToolset (experimental, off by default; enable with
ADK_ENABLE_SKILL_LIFECYCLE=1) (43b73e4) - bigquery: add default_project_id and default_dataset_id to BigQueryToolConfig (6f301fc)
- cli: add gemini-3.8-flash to the
adk createmodel options (6592ee5) - cli: auto-configure session and memory services on Agent Runtime (fede561)
- context: add abort signal primitives to InvocationContext and Context; the Runner and workflows do not act on an abort yet (d99b23f)
- drop an unloaded skill's instructions from later requests (experimental, off by default; enable with
ADK_ENABLE_SKILL_LIFECYCLE=1) (accb906) - expose serving tier via
RunConfig.service_tier(3e3d1dc) - expose session options in api_server REST endpoint (fa4719e), closes #6342
- integrations: add a google-adk[openai] extra (9be86bf)
- integrations: move the OpenAI models to
google.adk.integrations.openai;google.adk.labs.openaistill re-exports them (95c0591) - let SkillToolset notice that a loaded skill has changed (f848b7e)
- mcp: identify ADK in the MCP clientInfo handshake (5117f28)
- mcp: identify ADK in the User-Agent of MCP HTTP requests (061dcd6)
- openai: adapt request params for reasoning models on both surfaces (137eba8)
- openai: add api_key/base_url with per-request key resolution to OpenAILlm (56aabce)
- openai: add OpenAIGenerateContentConfig and per-model reasoning effort (bb9023d)
- openai: honor tool_config mode and all tool declarations in OpenAILlm (ed758bb)
- openai: report reasoning tokens on Chat Completions; add live tests (52a2f0f)
- openai: surface streaming usage and finish reason in OpenAILlm (ed030cb)
- openai: use build_reasoning_effort for reasoning in OpenAIResponsesLlm (b3d1392)
- send the deferred service tier on interactions API requests (cc912d5)
- skills: add SkillDiscoveryMode to control how the skill catalog is disclosed (3d3c1d9), closes #7092
- stamp the Agent Registry URN as gen_ai.main_agent.id (5c3f64e)
- stream partial function-call arguments across model adapters (f449780)
- telemetry: allow per-feature enabling of experimental telemetry (0add163)
- tools: add
behaviorfield to control Live non-blocking function calls (6189b2e) - when using interactions api with deferred tier, wait on an interaction operation (b011fb2)
- workflow: filter rewound invocations during workflow rehydration (ab4dba6)
- workflow: let DEFAULT_ROUTE fan out to several nodes (ffc191b)
- workflow: unwrap NodeTool in build_node and bind state in _ToolNode (5c59a73)
Bug Fixes
- accept a client factory written against either httpx major (b726964)
- agents: accept the default hint in request_confirmation (768969d)
- agents: allow descriptionless BaseNode in LlmAgent tools (6373f23)
- agents: trigger after_agent_callback on cancellation (37aa730)
- allow forwarding session ID as context_id for remote A2A agents (e10a1be)
- auth: keep the OAuth2 client secret out of session state (9b9aac0)
- auth: report an auth scheme that carries no OAuth2 flows (b22cfc4)
- bigquery: reject writes protected mode cannot place in the session dataset (8b883d0)
- bigtable: release the per-call data client in execute_sql (f39cbf5)
- bound artifact reference resolution depth in load_artifact (87b9f25)
- build the Gemini API clients once per event loop (8164341)
- cli: omit http_options from the generated recordings file (09326ca)
- cli: reject multi-line env values when generating the Dockerfile (8192d1b)
- cli: use exec-form RUN/CMD in generated Dockerfiles and validate app names (9327437)
- cli: validate the test name on every dev server test endpoint (4c2bafb)
- coerce integral floats inside list[int] tool parameters (b1cba29)
- compaction: stop backwards prompt token scan at compaction boundary (4d9abb5)
- complete an A2A task whose run ends without a status message (9750c4c)
- confine agent builder file globs to the configured directory (896a29a)
- confirmation: skip confirmation requests authored by other agents before resolving history (e19ce05)
- core: stop executing code found in the model's private reasoning (a2a2f66)
- correct get_bigtable_data_client return annotation (c673c59)
- do not match dollar-brace or escaped patterns in instructions (0caecd2), closes #5706
- eval: ignore UI-only InvocationEvent fields on eval case save (a4a50a4)
- eval: pin the specific version for safety_v1 (997f408)
- exclude the local .adk folder from deployed agent images (c409bd3)
- extract URL fragment key-value pairs as query params (0cfe43b)
- fence server-supplied tool description before reaching the model (a519b6f)
- flows: hold a tool call that requires confirmation in the framework (1d0daeb)
- flows: keep the streaming flags when after_model_callback replaces a response (39e4538), closes #7035
- flows: only hold a tool call when its confirmation hook answers True (659e28f)
- flows: prune orphaned function calls on interrupted turns (54274cd)
- flows: release a tool thread pool when its event loop closes (7ae1c9b)
- forward tool output schema on the LiteLLM path (fca7b88), closes #6784
- give each LocalEvalService its own default UserSimulatorProvider (55d47ae)
- hide run_skill_script when no skill has a script (d8d9715), closes #6281
- honor capability for schema and tools (e37af14), closes #6954
- instruct models to format code for non-builtin sandbox executors (8aafa4e)
- integrations: hold sandbox and BigQuery session bindings in process (094012b)
- join streamed reasoning into one thought part per block (fed0e88), closes #6895
- keep the latest write when parallel tool calls update a state list (d42a3be)
- litellm: report malformed tool-call arguments instead of raising (75d84b1), closes #5896 #6716
- live: enqueue background function response events (7807005)
- live: screen live content that does not complete the turn (58b4fab)
- make shell JSON envelope parsing robust to other stdout garbage (b07ec93)
- mark a workflow's span failed when one of its nodes failed (dfc4b58)
- match a Latin word embedded in unspaced-script text (13ecc31)
- match tool response by name instead of assuming first part (f199858), closes #6603
- mcp: only attach application default credentials over https (5a018c9)
- mcp: rebuild a session the server reports it no longer holds (86ea33d), closes #7060
- mcp: report an api key auth scheme that declares no key location (d7370e1)
- mcp: widen MCP bound to admit MCP 2.x (d64dcfa)
- measure the compaction token threshold against the agent's own prompt (8ccea93)
- models: keep the keys beside "result" in a Claude tool result (ffb5363), closes #7073
- models: say how to reach a third-party model when a bare name misses (87ccdc7)
- only load artifacts listed for the current session (cb7c469)
- openai: robustly parse Chat Completions responses (finish_reason, usage, choices) (f28d28a)
- openai: serialize non-string system_instruction (783463d)
- openapi: handle HTTP 401 in RestApiTool and recover stale OAuth2 credentials (9511479)
- persist sandbox session state and add warning for static sandbox in AgentEngineSandboxCodeExecutor (73ab76d)
- plugins: verify BigQuery table readiness once, not on every restart (a9cf81f), closes #7017
- preserve Annotated metadata in tool declarations and arg conversion (2ecb3fb)
- preserve empty text and bytes in memory (df55309)
- preserve eval case order when updating (a6c6623), closes #7220
- preserve file artifact creation timestamps (e93ff5b)
- prevent cubic backtracking in _strip_json_code_fence (3a06a86)
- prevent filenames from colliding with version storage (26e8af2)
- raise a clear error when conformance replay recordings are missing (7a1b49f), closes #7128
- raise clear ImportError when VertexAiSearchTool bypass needs gcp (4e73b7d)
- raise InvocationNotFoundError instead of bare ValueError on rewind (fc16a78)
- raise when evaluate or evaluate_eval_set evaluates zero cases (9dbc2ae), closes #6951
- redact signed URIs and HTTP options from errors and logs (f425287)
- reject num_samples=0 in JudgeModelOptions at construction time (85e0868)
- reject parallelism < 1 in LocalEvalService instead of hanging (9beb524)
- reject reserved path segments with slashes in validate_path_segment (5e29872), closes #6973
- reject the reserved segment 'user' as a session_id (b8de426), closes #7063
- report an A2A stream that ends before the remote task finishes (e29ee23), closes #6585
- report the event fields a session backend cannot store (3e1ae9f)
- require agent authorship before resume-dispatching a function call (2c61b84)
- resolve agent transfers from the caller's declared targets (1538efe)
- resolve deepcopy recursion in VertexAiCodeExecutor (b3fe92b), closes #1762
- restore oldest-first Redis session lists (6863842)
- run on_event callbacks for before_run early exits (63e918a), closes #7007
- runners: ensure after_run plugin callback executes on early generator exit (ba89707)
- runners: keep the caller's OpenTelemetry trace in sync Runner.run (1760b06)
- sessions: avoid redundant temp state processing in append_event and exclude temp keys from rewind delta (52b247e)
- sessions: avoid runtime index drop and guard concurrent index creation (cd6dee0)
- sessions: disable pool reset on return for StaticPool in DatabaseSessionService (8ff50af)
- sessions: report the redacted database URL when migration cannot connect (1579927)
- sessions: stop get_user_state aliasing stored user state (dd96b81)
- skip unreplayable function responses (7dcfade)
- stop a re-emitted output echo from reordering the replay sequence (4b819ab), closes #7027
- stop Agent import loading authlib (ac1d51b)
- stop background tools before the transfer delay (c79f60f), closes #7006
- stop internal Agent Config subclassing from warning on plain imports (3699fad), closes #6968
- stop probing for mTLS credentials on every MCP session (dfc96d0)
- stop retaining spans on servers with no debug trace endpoint (7560061), closes #6915
- stop returned sessions aliasing scoped state (557643b)
- stop the multimodal tool results plugin sending media twice (a4d97b7)
- StreamingResponseAggregator drops/duplicates function calls in streaming mode (3cf4ce2), closes #6566
- support openapi basic auth (f2fe475), closes #5492
- telemetry: make
google.adk.telemetry.tracingimportable on OpenTelemetry 1.39;google.adk.telemetry.google_cloudstill needs a newer OpenTelemetry (8f1323a) - telemetry: record only the function responses on a merged tool span (42358b1)
- tools: clarify google_search_agent instruction to use built-in grounding (56d3cae)
- tools: propagate outer CancelledError in stop_streaming (b8836bd)
- tools: stop ExampleTool crashing a live run that opens with no message (1414fac)
- trace tool calls under the agent, not under the model call (83d966c)
- use full query text and own logger in PreloadMemoryTool (82687cf), closes #6884
- validate and coerce function tool argument types (opt-in; enable with
ADK_ENABLE_FUNCTION_TOOL_ARG_VALIDATION=1) (24b37e1), closes #4612 - validate the detect_anomalies target data subquery (60d0a9b)
- workflow: allow resolved interrupts to resume without rerun_on_resume (307d041)
- workflow: do not leak descendant isolation_scope to parent in _reconstruct_node_states (2fb34bc)
- workflow: isolate peer task-mode agents in dynamic run_node calls (ddbb59e)
- workflow: resume interrupted agent transfers in static workflows (97aefd8)
- workflow: unwrap Content inputs for parallel workers after START (e80677d)
Performance Improvements
- sessions: add id DESC to events composite index to eliminate filesort (a00a2a9)
- sessions: cache TypeAdapter in State and support key iteration (220acfd)
- trace a streamed model call once instead of once per chunk (733162e)
- workflow: avoid redundant event scans in _apply_rewinds and NodeRunner (f5ef8df)
Documentation
- add unit guides for the third-party and cloud integrations (3d70669)
- agents: add BaseAgent unit guide (7d42b78)
- agents: add Context unit guide (c03683a)
- agents: add InvocationContext unit guide (5f3b6f0)
- agents: add LlmAgent unit guide (75bf1dc)
- apps: describe the sliding-window compaction that actually runs (9cb4eed)
- list the twenty guides missing from the guides index (68204f5)
- make the single-turn node example runnable (06d4895)
- models: add developer unit guide for ServiceTier (0636bf8)
- readme: point the eval quickstart at a sample that exists (c3f4e63)
- remove the 1.x breaking-changes callout from the README (d69f995)
- rewrite the unit guides for the third-party integrations (1addd76)
- samples: add a Grok-4.6-on-Vertex sample using the labs OpenAI model (40a0a8d)
- samples: add a hello-world OpenAI sample using the labs OpenAI model (eb1a002)
- sessions: document runtime DDL and concurrent index guidelines (0002760)
- telemetry: name the real do_not_elide parameter (c7ae45a)
- workflow: index BaseNode unit guide in documentation (692b40a)