github google/adk-python v2.10.0

5 hours ago

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 DATA and 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)
  • OpenAIResponsesLlm ignores thinking_config (thinking_level / thinking_budget) with a warning; use OpenAIGenerateContentConfig.effort instead. (b3d1392)
  • AgentEvaluator.evaluate and evaluate_eval_set raise ValueError when 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 a DeprecationWarning on import; move to google.adk.live. Test suites run with -W error will 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 create model 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.openai still 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 behavior field 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.tracing importable on OpenTelemetry 1.39; google.adk.telemetry.google_cloud still 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)

Don't miss a new adk-python release

NewReleases is sending notifications on new releases.