1284 Commits

Author SHA1 Message Date
George Weale 104edc8317 fix: convert Union[Pydantic, Pydantic] tool args at runtime
FunctionTool._preprocess_args only converted dict args to a Pydantic
model for single-model and Optional[Model] annotations. A
Union[ModelA, ModelB] parameter was left as a raw dict, so
isinstance checks inside the tool failed with "Unexpected entity
type: <class 'dict'>"

Use pydantic.TypeAdapter to validate against the full Union so
pydantic picks the matching member. None and instances of any
declared union member pass through unchanged; instances of
unrelated BaseModels fall back to the existing graceful-failure
warning path.

Close #5799

Change-Id: Ie69f8efc8395162eac375a0eaad0c77ed2097cec
2026-05-22 16:21:58 -07:00
Wenhua Zhang b3d0759e42 feat: Preserve transcription event order in conversation trajectory
Refactor live inference to emit synthetic text events for output
transcriptions as they arrive (streaming), rather than accumulating all
transcriptions and appending a single synthetic event after the turn
completes. This preserves event ordering and enables downstream
consumers to process transcriptions incrementally.

Co-authored-by: Wenhua Zhang <wenhzhang@google.com>
Change-Id: Idca79968729f2145ebf1f1c993d79ab7f6a3bd78
2026-05-22 15:47:43 -07:00
Google Team Member e56c021ef7 feat: Fix error message telemetry for tool calls
Merge: https://github.com/google/adk-python/pull/5797

ORIGINAL_AUTHOR=Achuth Narayan Rajagopal <achuth.narayan@gmail.com>
GitOrigin-RevId: 5c41f0352b2a2852eda1b1a80b746477ba4f61de
Change-Id: I07edf4c4fff92e37228f876f16cf53310146a257
2026-05-22 11:49:09 -07:00
George Weale 68785f53cf chore: edit docs
Change-Id: I47379cb495725595571ae5274ad34d8201ba1ca3
2026-05-22 11:41:51 -07:00
Google Team Member eb379bea5b feat: Add user.id to gen_ai.user.message log records for telemetry
Merge: https://github.com/google/adk-python/pull/5796

ORIGINAL_AUTHOR=Achuth Narayan Rajagopal <achuth.narayan@gmail.com>
GitOrigin-RevId: ec8265ecab7ae4342f8a6b5605f112e3a3673775
Change-Id: Ib77c4e2ad3df29a7ca734f142b9dc42d0890f429
2026-05-22 11:36:14 -07:00
George Weale a4f394e139 chore: edit files
Change-Id: I4e3e3e9f1846520f3fda86cc83453b30bdd336ef
2026-05-22 10:47:37 -07:00
Sasha Sobran 5f91a9db03 fix: lazy-import GCS evaluation managers in evals utility
Fixes https://github.com/google/adk-python/issues/5787

Change-Id: I0aadfb11fedc49c1d45d4fcd9f89087c27a0e6ea
2026-05-22 09:50:10 -07:00
asobran 416775dcce fix: Make google-cloud-storage import lazy in skill utils
Change-Id: Id86475d867e31e3f8d3ee1429f2b8a7b8c53da34
2026-05-22 08:44:54 -07:00
Yifan Wang 1f245535ff fix: update EditFileTool to handle cross-platform line breaks and escape regex characters
Change-Id: Id155218fa6feb7e004684d8f96cd0598fa4d2766
2026-05-21 16:15:26 -07:00
Yifan Wang 1b86d8eafe chore: Add single folder support in adk web
Change-Id: If593c0118bb44ec4a4dd836d8c5d5c4025591af2
2026-05-21 16:15:15 -07:00
Kathy Wu b9751eb9df fix: Fix bug where grounding metadata in Gemini 3.1 live was being silently discarded
In Gemini 3.1 live, LlmResponse packets sometimes contain only grounding metadata - don't skip these responses

Change-Id: I9e2c1080395588d61aefffd1b6570102930e1fe0
2026-05-21 11:06:44 -07:00
Kathy Wu d17a2a3221 fix: fix input and output transcription finished events for Gemini v3.1
Change-Id: I3c33e84569d5f63f46c99154afa9e9d68a2fdf3c
2026-05-21 10:41:12 -07:00
Shangjie Chen 1ba586383f style(cli): Format code and assets to comply with pyink and linter guidelines
Reformat tests/unittests/cli/utils/test_gcp_utils.py using pyink, and restore the trailing newline in runtime-config.json to align with pre-commit style rules.

Change-Id: Id2593bf761845d15c45cbde18f6d3a8f0e5dd639
2026-05-21 09:10:27 -07:00
Sasha Sobran 933653c61c fix(tools): Prevent session drop on MCP tool error
Enable MCP graceful error handling by default and retrieve background session context task exceptions. This prevents unhandled AnyIO TaskGroup transport failures from bubbling through the event loop and abruptly terminating live streaming sessions with 1006 abnormal closure.

Change-Id: Ib4669fb57cddfc6ce61f9a3991b80db3f2b3e9ab
2026-05-21 08:32:33 -07:00
Sasha Sobran 57d677c5cd fix(cli): Inform user to install optional dependency on missing google.cloud
Importing `gcp_utils` during `adk create` caused a ModuleNotFoundError because `resourcemanager_v3` was imported at module level. Moved the import into `list_gcp_projects` function scope where ImportError is caught specifically to raise an informative RuntimeError indicating they need to install the 'gcp' optional dependency. Also added google-cloud-resource-manager to optional dependencies.

Fixes https://github.com/google/adk-python/issues/5766

Change-Id: I9469e03c72342730cd0a1418551305a5e8058f60
2026-05-20 16:04:21 +00:00
Shangjie Chen 6d7bab6897 test(workflow): Move agent transfer integration tests to workflow folder
Migrated the multi-agent dynamic transfer integration tests from `flows/llm_flows/test_agent_transfer.py` to the consolidated `workflow/` directory to align with ADK 2.0 patterns.

During this migration and alignment:
1. Fixed a critical runner bug in `NodeRunner._track_event_in_context` where structured parent nodes (like SequentialAgent or LoopAgent) executing legacy recursive sub-agents internally would mistakenly intercept and bubble up the sub-agent's internal routing actions, causing crashing `unrelated transfer` errors in the parent scheduler. Fixed by restricting route/transfer tracking to native node events (`not event.author` or `event.author == self._node.name`).
2. Restored five previously deleted legacy structured transfer tests (`test_auto_to_single`, `test_auto_to_auto_to_single`, `test_auto_to_sequential`, `test_auto_to_sequential_to_auto`, and `test_auto_to_loop`) to maintain regression protection.
3. Hardened the suite with dedicated new tests for sibling peer transfers, child-to-parent climbing transfers, grandchild nested transfers, self-transfer blocking, and unrelated sandbox crossing defenses.

Change-Id: I2f087c211a5a78508689f4dfeea2c533219df208
2026-05-19 16:00:24 -07:00
Sasha Sobran e6537decc9 chore(release): configure release-please for v2.0.0 GA
Change-Id: If39d565130df657d08e4367394c33771e68ad364
2026-05-19 13:36:37 +00:00
Sasha Sobran 162279358c chore: switch main to v2.0.0 GA (transition to v2)
Co-authored-by: Bo Yang <ybo@google.com>
Co-authored-by: Wei Sun (Jack) <weisun@google.com>
Co-authored-by: George Weale <gweale@google.com>
Co-authored-by: Swapnil Agarwal <swapnilag@google.com>
Co-authored-by: Xuan Yang <xygoogle@google.com>
Co-authored-by: Shangjie Chen <deanchen@google.com>
Co-authored-by: Yifan Wang <wanyif@google.com>
Co-authored-by: Kathy Wu <wukathy@google.com>
2026-05-19 02:01:33 +00:00
Xuan Yang 07a9a01b3c fix: Preserve live_session_id in function call handling
Fixes https://github.com/google/adk-python/issues/5702

Co-authored-by: Xuan Yang <xygoogle@google.com>
PiperOrigin-RevId: 917452441
2026-05-18 15:17:43 -07:00
Google Team Member 03b915b1bd fix(anthropic): map negative thinking_budget to adaptive thinking
- Claude Opus 4.7 rejects `thinking.type: "enabled"` with a 400 error
  and requires `thinking.type: "adaptive"`; adaptive is also the
  recommended mode for Opus 4.6 / Sonnet 4.6 where `"enabled"` is
  deprecated.
- The genai `ThinkingConfig.thinking_budget = -1` (AUTOMATIC) sentinel
  is the natural mapping for adaptive: the model picks the depth
  itself. Callers opt in with `-1`; positive values keep the existing
  `"enabled"` path so older models are unchanged.
- Bump `anthropic>=0.78` in `pyproject.toml`; 0.78 introduced
  `ThinkingConfigAdaptiveParam`. The previous floor (`>=0.43`) let
  Kokoro install `anthropic==0.75.0`, which crashes the new tests
  with `AttributeError: module 'anthropic.types' has no attribute
  'ThinkingConfigAdaptiveParam'`.

PiperOrigin-RevId: 917449729
2026-05-18 15:12:26 -07:00
George Weale 57d8fc7d81 perf(models): guard debug log evaluation with isEnabledFor
Co-authored-by: George Weale <gweale@google.com>
PiperOrigin-RevId: 917411239
2026-05-18 13:57:16 -07:00
Google Team Member baf7efbaa9 feat: Added config option to include tool calls/responses in conversation history passed to user simulator
PiperOrigin-RevId: 917340645
2026-05-18 11:31:14 -07:00
Google Team Member 48f1b30251 feat: Simplify data retrieved handling of ask_data_agent tool and ask_data_insights tool
PiperOrigin-RevId: 917326615
2026-05-18 11:04:04 -07:00
Google Team Member 59f7347a63 fix(small): Convert events to the A2A format while respecting user vs agent role
PiperOrigin-RevId: 917275872
2026-05-18 09:28:29 -07:00
Jorge Israel Frómeta Moya 3d07960a70 fix: use tool_responses role for gemma4 models in LiteLLM integration
Merge https://github.com/google/adk-python/pull/5655
Closes: #5650

Co-authored-by: Xuan Yang <xygoogle@google.com>
COPYBARA_INTEGRATE_REVIEW=https://github.com/google/adk-python/pull/5655 from jfrometa88:main d74b5216b0937ff371b25cc8f272ee8ab33c8dc9
PiperOrigin-RevId: 917231422
2026-05-18 07:54:00 -07:00
Google Team Member 790c9bef9a feat: add general support for Gemini Live API in ADK evaluate
* Implements live inference in evaluation_generator.py using Runner.run_live().
* Updates base_eval_service.py, local_eval_service.py to support live mode data structures and connection handling.

Testing: Added unit tests:
* test_generates_inferences_with_user_simulator_live
* test_live_session_manually_triggers_callbacks
* test_live_session_manually_triggers_callbacks_with_tools
* test_perform_inference_with_use_live
* test_perform_inference_single_eval_item_live
* test_perform_inference_single_eval_item_non_live
PiperOrigin-RevId: 916231029
2026-05-15 16:14:21 -07:00
Google Team Member a5cddb8e86 chore: Remove experimental tag from SkillToolset
PiperOrigin-RevId: 916227202
2026-05-15 16:05:59 -07:00
Sasha Sobran 4309159700 fix(tools): Prevent AnyIO CancelScope task boundary violations during MCP session creation failure
Co-authored-by: Sasha Sobran <asobran@google.com>
PiperOrigin-RevId: 916220631
2026-05-15 15:50:01 -07:00
George Weale ec54bd439e perf(utils): cache find_context_parameter introspection
Adds @functools.lru_cache to find_context_parameter so the inspect.signature
+ typing.get_type_hints lookup runs once per function, not on every MCP
confirmation callback or declaration build. No public surface change.

Co-authored-by: George Weale <gweale@google.com>
PiperOrigin-RevId: 916204929
2026-05-15 15:14:36 -07:00
Kathy Wu 2388090cd2 chore: Remove experimental tag from SkillToolset
Co-authored-by: Kathy Wu <wukathy@google.com>
PiperOrigin-RevId: 916198410
2026-05-15 15:00:19 -07:00
George Weale 7e61b51702 fix(tools): preserve code_execution_result and executable_code in AgentTool
AgentTool.run_async only extracted text parts from the inner agent's
response, silently dropping code_execution_result.output and
executable_code.code. Outer agents using an inner agent with a code
executor saw nothing.

Close #5481

Co-authored-by: George Weale <gweale@google.com>
PiperOrigin-RevId: 916196604
2026-05-15 14:56:02 -07:00
George Weale 0cb9ae94b3 fix(models): treat empty GenerateContentResponse without prompt feedback as successful
Previously, an empty `candidates` list without `prompt_feedback` resulted in an `UNKNOWN_ERROR`. This change updates the logic to handle such cases as a successful completion with no generated content, which is valid for certain model interactions like tool-driven turns.

Co-authored-by: George Weale <gweale@google.com>
PiperOrigin-RevId: 916115022
2026-05-15 11:55:40 -07:00
Amaad Martin 0524797ac7 fix(agents): fix visibility of output_key state delta in callbacks
Co-authored-by: Amaad Martin <amaadmartin@google.com>
PiperOrigin-RevId: 916112779
2026-05-15 11:51:28 -07:00
George Weale 9a1e75f242 fix(models): preserve string content in Anthropic tool_result blocks
`part_to_message_block` iterated `content` char-by-char when a tool
returned it as a plain string (e.g. `LoadSkillResourceTool`'s
`{"content": <file text>}`), producing `"H\ne\nl\nl\no"` instead of
`"Hello"`. Guard the list branch with `isinstance(..., list)` and add
a sibling branch that passes a scalar string through directly, matching
Anthropic's `content: str | list[ContentBlockParam]` shape.

Close #5358

Co-authored-by: George Weale <gweale@google.com>
PiperOrigin-RevId: 916109239
2026-05-15 11:44:41 -07:00
George Weale bb2efb6bd2 fix: Prevent compaction of events involved in Human-in-the-Loop interactions
This change introduces logic to identify events containing requests for tool confirmation or auth credentials. The compaction process will now stop before any such "Human-in-the-Loop" (HITL) events, ensuring that the full context of the interaction is preserved and not summarized away. This applies to both sliding window and token threshold compaction strategies.

Co-authored-by: George Weale <gweale@google.com>
PiperOrigin-RevId: 916108771
2026-05-15 11:43:53 -07:00
George Weale eed9bd319f fix(evaluation): handle none config in per_turn_user_simulator_quality
When judge_model_config is None, LlmRequest raises a ValidationError
because it requires a config. We now construct a default GenerateContentConfig
if one isn't provided.

Close #5677

Co-authored-by: George Weale <gweale@google.com>
PiperOrigin-RevId: 916087055
2026-05-15 11:00:49 -07:00
Google Team Member 85f397d20f fix: avoid pre-serializing dict values in Interactions API to prevent double-escaping
PiperOrigin-RevId: 916037238
2026-05-15 09:17:19 -07:00
Google Team Member 115124cdf4 feat: add support for A2aAgentExecutor factory in to_a2a() function
PiperOrigin-RevId: 916015512
2026-05-15 08:22:25 -07:00
Kathy Wu 88ebd426be feat: Implement GCPSkillRegistry in ADK
This CL implements the  class in the integrations folder, used specifically for the Skill Registry API.

Co-authored-by: Kathy Wu <wukathy@google.com>
PiperOrigin-RevId: 915627057
2026-05-14 14:47:42 -07:00
Google Team Member 9f38973081 feat: Make Agent Skill description validation more informative
PiperOrigin-RevId: 915616175
2026-05-14 14:24:45 -07:00
Kathy Wu 8de1ae8f80 chore: change name of skill cache to "fetched_skill_cache" to reduce confusion from BaseToolset's invocation_cache
Co-authored-by: Kathy Wu <wukathy@google.com>
PiperOrigin-RevId: 915578052
2026-05-14 13:11:27 -07:00
Google Team Member cfe8d2cc2b feat: Add mTLS support to Google Cloud Telemetry exporter
This change enables the Google Cloud Telemetry exporter to use mTLS endpoints. It checks for the availability of client certificates and respects the GOOGLE_API_USE_CLIENT_CERTIFICATE environment variables to determine whether to use the mTLS-specific endpoint and configure the session accordingly.

PiperOrigin-RevId: 915541335
2026-05-14 11:54:45 -07:00
Shangjie Chen e04a4683f4 chore: Remove deprecated CLI flags and version-based service URI handling
This change removes support for the deprecated `--session_db_url`, `--artifact_storage_uri`, and `--verbosity` flags from the ADK CLI. It also simplifies the service URI handling in `cli_deploy.py` by always using the new `--session_service_uri`, `--artifact_service_uri`, and `--memory_service_uri` flags, regardless of the ADK version.

The deprecated flags has been more than 1 year

Co-authored-by: Shangjie Chen <deanchen@google.com>
PiperOrigin-RevId: 915100881
2026-05-13 15:48:39 -07:00
Kathy Wu e377cb5ec0 fix: fallback to project id if crendetials don't contain quota project
Co-authored-by: Kathy Wu <wukathy@google.com>
PiperOrigin-RevId: 914934690
2026-05-13 10:25:49 -07:00
Google Team Member 6e534723dd feat: add support for non-ADK produced input-required events
This CL introduces logic to handle scenarios where a non-ADK agent transitions to the `TaskState.input_required` or `TaskState.auth_required` states. It intercepts these events and converts them into a synthetic ADK `FunctionCall` event.

PiperOrigin-RevId: 914877123
2026-05-13 08:25:10 -07:00
knQzx 327c45f9f4 fix(models): preserve tool_use IDs for Anthropic models on session resume
When resuming a session with Anthropic (Claude) models, tool_use IDs were
getting stripped during content replay, causing BadRequestError from the
Anthropic API. Two fixes: (1) preserve function call IDs in the contents
flow for AnthropicLlm models, (2) sanitize invalid/empty tool_use IDs
to match Anthropic's required pattern (^[a-zA-Z0-9_-]+$) instead of
passing empty strings.

Fixes #5074

Co-authored-by: George Weale <gweale@google.com>
PiperOrigin-RevId: 914550905
2026-05-12 16:57:53 -07:00
Kathy Wu 380d261e59 feat: Implement Skill Registry in ADK
Co-authored-by: Kathy Wu <wukathy@google.com>
PiperOrigin-RevId: 914515552
2026-05-12 15:42:27 -07:00
Stephen Allen cd78d87b96 feat(a2a): add support for persistent task stores
Merge https://github.com/google/adk-python/pull/5597

**Please ensure you have read the [contribution guide](https://github.com/google/adk-python/blob/main/CONTRIBUTING.md) before creating a pull request.**

### Link to Issue or Description of Change

**1. Link to an existing issue (if applicable):**

- Related: https://github.com/google/adk-python/issues/4971

**2. Or, if no issue exists, describe the change:**

_If applicable, please follow the issue templates to provide as much detail as
possible._

**Problem:**
A2A support lacked pluggable or persistent task store backends, forcing a strict default to `InMemoryTaskStore`.

**Solution:**
Extended `ServiceRegistry` and `ServiceFactory` to support URI-driven configuration for A2A task stores. Added built-in support for `memory://`, `postgresql://`, `mysql://`, and `sqlite://` schemes. Plumbed the options down into `to_a2a()` and `get_fast_api_app()`, ensuring connection strings are securely redacted from application logs.

### Testing Plan

**Unit Tests:**

- [x] I have added or updated unit tests for my change.
- [x] All unit tests pass locally.

Summary: Ran `pytest` against `test_agent_to_a2a.py`, `test_fast_api.py`, `test_service_registry.py`, and `test_service_factory.py`. All 131 unit tests passed successfully.

**Manual End-to-End (E2E) Tests:**

Compiled the package distribution wheel via `uv build` and successfully validated its installation inside a clean isolated sandbox environment via `uv pip install dist/google_adk-1.32.0-py3-none-any.whl[a2a]`. Verified that the application instantiates default in-memory stores and custom persistent URI stores

### Checklist

- [x] I have read the [CONTRIBUTING.md](https://github.com/google/adk-python/blob/main/CONTRIBUTING.md) document.
- [x] I have performed a self-review of my own code.
- [x] I have commented my code, particularly in hard-to-understand areas.
- [x] I have added tests that prove my fix is effective or that my feature works.
- [x] New and existing unit tests pass locally with my changes.
- [x] I have manually tested my changes end-to-end.
- [x] Any dependent changes have been merged and published in downstream modules.

COPYBARA_INTEGRATE_REVIEW=https://github.com/google/adk-python/pull/5597 from allen-stephen:feat/a2a-task-store-support f53ba0fa35fa3c28e4923b6850a5873fd5293525
PiperOrigin-RevId: 914496800
2026-05-12 15:03:55 -07:00
George Weale 76b9f0baa0 fix(cache): enforce CacheMetadata active-state invariant
Co-authored-by: George Weale <gweale@google.com>
PiperOrigin-RevId: 914400439
2026-05-12 11:51:05 -07:00
Amy Wu 8dd9147443 fix(live): ensure sub live agent doesn't inherit session resumption handle from parent live agent to avoid interrupting the conversation
PiperOrigin-RevId: 914367901
2026-05-12 10:50:55 -07:00