Skip to content

Commit 0325905

Browse files
Merge branch 'main' into custom-session-id-with-agent-engine
2 parents d5058dc + abcf14c commit 0325905

88 files changed

Lines changed: 5964 additions & 520 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,3 @@
11
{
2-
".": "1.28.0"
2+
".": "1.29.0"
33
}

.github/release-please-config.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"$schema": "https://raw.githubusercontent.com/googleapis/release-please/main/schemas/config.json",
3-
"last-release-sha": "50209549206256abe5d1c5d84ab2b14dfdf80d66",
3+
"last-release-sha": "6b1600fbf53bcf634c5fe4793f02921bc0b75125",
44
"packages": {
55
".": {
66
"release-type": "python",

.github/workflows/triage.yml

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,8 +17,7 @@ jobs:
1717
if: >-
1818
github.repository == 'google/adk-python' && (
1919
github.event_name == 'schedule' ||
20-
github.event.action == 'opened' ||
21-
github.event.label.name == 'planned'
20+
github.event.action == 'opened'
2221
)
2322
permissions:
2423
issues: write

CHANGELOG.md

Lines changed: 75 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,80 @@
11
# Changelog
22

3+
## [1.29.0](https://github.com/google/adk-python/compare/v1.28.0...v1.29.0) (2026-04-09)
4+
5+
6+
### Features
7+
8+
* Add auth scheme/credential support to MCP toolsets in Agent Registry ([7913a3b](https://github.com/google/adk-python/commit/7913a3b76432caf16953ea7b2a2cf4872baad417))
9+
* add ability to block shell metacharacters in BashTool ([23bd95b](https://github.com/google/adk-python/commit/23bd95bcf23367a8df3342ca4bb9d17f0b3b0d8f))
10+
* add configurable resource limits for subprocesses in BashTool ([1b05842](https://github.com/google/adk-python/commit/1b0584241f6418fd5fe9bd05fa666d03c310b8ae))
11+
* Add configurable view_prefix to BigQueryLoggerConfig ([37973da](https://github.com/google/adk-python/commit/37973daff47d3c67e928a240acd188d4e318f52b))
12+
* Add custom session id functionality to vertex ai session service ([e1913a6](https://github.com/google/adk-python/commit/e1913a6b411aec9e8774ca92ea39531b085c43f0))
13+
* Add Description column to SKILL.md and update terminology ([435f7c7](https://github.com/google/adk-python/commit/435f7c7a9fdf8b1214f4439c6d953b6426d90da1))
14+
* Add Easy GCP support to ADK CLI ([8850916](https://github.com/google/adk-python/commit/8850916e1908ace19a058102f0392eee08349d60))
15+
* Add regional endpoint support to `SecretManagerClient` ([19ac679](https://github.com/google/adk-python/commit/19ac679aeacc045ed78cb9fd48bb295440843288))
16+
* Add support for model endpoints in Agent Registry ([eb4674b](https://github.com/google/adk-python/commit/eb4674b49f017f3947506c55be4075b1ea0369d6))
17+
* **auth:** Add public api to register custom auth provider with credential manager ([a220910](https://github.com/google/adk-python/commit/a22091058dd2ea6e1e0655b5946ce6ed7e72d25e))
18+
* **auth:** Pass consent_nonce to Agent Frontend ([9fec503](https://github.com/google/adk-python/commit/9fec503061846b9903c18921f7848b358a041331))
19+
* **auth:** Support additional HTTP headers in MCP tools ([b3e9962](https://github.com/google/adk-python/commit/b3e99628ee1b87b61badf56e67f8ddee15e6fe54))
20+
* **bigquery:** Add ADK 1P Skills for ADK BQ Toolset ([4030c0d](https://github.com/google/adk-python/commit/4030c0d0167b348cf2e4c941c8610aa6ede28275))
21+
* **environment:** Add EnvironmentToolset for file I/O and command execution ([9082b9e](https://github.com/google/adk-python/commit/9082b9e38eeb3465c399b41633e6441e339c47c3))
22+
* **environment:** Add LocalEnvironment for executing commands and file I/O locally ([f973673](https://github.com/google/adk-python/commit/f97367381e820c75ad16d4ce7ee27c0f9929c81d))
23+
* Implement robust process group management and timeouts in BashTool ([f641b1a](https://github.com/google/adk-python/commit/f641b1a219b041659e6d429c47974bc9e5cfe1af))
24+
* **live:** Added in 1.28.1, support live for `gemini-3.1-flash-live-preview` model ([8082893](https://github.com/google/adk-python/commit/8082893619bb85d4ee0dc53fd2133d12b9434d07))
25+
* Option to use shallow-copy for session in InMemorySessionService ([16a1a18](https://github.com/google/adk-python/commit/16a1a185ab77a904fd01712779fa1bc6417dc628))
26+
* Propagate context to thread pools ([83393ab](https://github.com/google/adk-python/commit/83393ab839d5733568699195683408fccbd1cb6e))
27+
* refresh credentials if token is missing in the common code and samples ([1445ad5](https://github.com/google/adk-python/commit/1445ad5069841e446328e0856553f69a6699f0f4))
28+
* Remove use of raw_event field in vertex ai session service ([642d337](https://github.com/google/adk-python/commit/642d337a9069fae334192d045c9f85922cbcef53))
29+
* **skill:** Standardize skill tools and make script arguments flexible ([9e73ab8](https://github.com/google/adk-python/commit/9e73ab846672065f1fbe1c2642419e8a008efd43))
30+
* Support AgentRegistry association ([6754760](https://github.com/google/adk-python/commit/675476088b9f3c0a488ce48f652b7f3f7ea47230))
31+
* Support loading agents from Visual Builder with BigQuery-powered logging ([2074889](https://github.com/google/adk-python/commit/20748894cdaa5a95d0c4ccb0daf87a34496639dd))
32+
* Support propagating grounding metadata from AgentTool ([d689a04](https://github.com/google/adk-python/commit/d689a04f16846c2aa483dd45dcc65e2decdb419c))
33+
* Support short options and positional arguments in RunSkillScriptTool ([2b49163](https://github.com/google/adk-python/commit/2b49163b399135f0d96b73a99eb4ace764ce87db))
34+
* Use raw_event field in vertex ai session service for append and list events ([6ee0362](https://github.com/google/adk-python/commit/6ee036292e9eefabb032e8ebec3580a2243f3a96))
35+
* Use raw_event to store event data in vertex ai session service ([9da9dee](https://github.com/google/adk-python/commit/9da9dee140a3c8971d2dc267eab7d8d17a22a089))
36+
37+
38+
### Bug Fixes
39+
40+
* Add A2ATransport.http_json to the default supported transports list ([7dd9359](https://github.com/google/adk-python/commit/7dd9359fa1c419f82db84b844195e1b77d8070e7))
41+
* add httpx_client_factory support to SseConnectionParams ([815ebb4](https://github.com/google/adk-python/commit/815ebb441579724e5aa22830b2e6f7c22f94fde6))
42+
* **adk:** redact credentials in BigQuery analytics plugin ([a27ce47](https://github.com/google/adk-python/commit/a27ce4771ff271947a0d94762231da842095836e))
43+
* api client initialization logic to be mutually exclusive between ExpressMode and GCP projects ([4ffe8fb](https://github.com/google/adk-python/commit/4ffe8fb4a6befc9e9d0e838427b7bf4890df4ba3))
44+
* avoid load all agents in adk web server ([ede8a56](https://github.com/google/adk-python/commit/ede8a56a3cd18311ce82e761f0f3da6228fbc0d6))
45+
* Cache BaseToolset.get_tools() for calls within the same invocation ([92cad99](https://github.com/google/adk-python/commit/92cad99724d333760e4ebc6116951d78a9b1cb7a))
46+
* **cli:** fail Agent Engine deploy when config file path is invalid ([bbad9ec](https://github.com/google/adk-python/commit/bbad9ec64ce1617bc45148de97e6246752845b98))
47+
* Disable tool caching for skill toolset ([064f0d2](https://github.com/google/adk-python/commit/064f0d278e55e1e9fd6db1b6ccf3d1cb95cba47b))
48+
* Disallow args on /builder and Add warning about Web UI usage to CLI help ([dcee290](https://github.com/google/adk-python/commit/dcee2902729e178b41086c4039a3828917bbb9f3))
49+
* empty events_iterator assignment ([898c4e5](https://github.com/google/adk-python/commit/898c4e5f78b60c4c4732c7cd19ff2da9a64964a1))
50+
* **environment:** fix package references ([add8e86](https://github.com/google/adk-python/commit/add8e8664bd2ae9257c8b37a5e602d0c7aae7625))
51+
* Fix RemoteA2AAgent deepcopy errors ([6f29775](https://github.com/google/adk-python/commit/6f29775f4bf7172b1378b17856534f95b9d4eeb6))
52+
* Fixes for initializing RemoteA2aAgent - passing in preferred transport, protocol version, and auth headers ([0f3850f](https://github.com/google/adk-python/commit/0f3850f56c857dfb86c7ad8de372bcc7fe495968))
53+
* Generate IDs for FunctionCalls when processing streaming LLM responses ([fe41817](https://github.com/google/adk-python/commit/fe4181718d104843b974417c59203ed8a7b15255)), closes [#4609](https://github.com/google/adk-python/issues/4609)
54+
* Handle merging lists in deep_merge_dicts ([cdb3ff4](https://github.com/google/adk-python/commit/cdb3ff4e1f155c357f8cf720132d09bbc1446075))
55+
* In memory session service to evaluate dictionary keys and value into an isolated snapshot sequence before starting loop ([f75de59](https://github.com/google/adk-python/commit/f75de59362e07c0cce0ead723ceea3102081af4d))
56+
* include intermediate subagent final response events in evaluation intermediate data ([f8a6bd7](https://github.com/google/adk-python/commit/f8a6bd7fc0ca4b37cac4dc93c725c8973a1c9027))
57+
* **live:** Handle live session resumption and GoAway signal ([6b1600f](https://github.com/google/adk-python/commit/6b1600fbf53bcf634c5fe4793f02921bc0b75125)), closes [#4996](https://github.com/google/adk-python/issues/4996)
58+
* move BigQueryAgentAnalyticsPlugin import inside get_runner_async ([6fd0f85](https://github.com/google/adk-python/commit/6fd0f85191dea17b7c6b033473bd39764250265b))
59+
* Safer fix for UI widget merging in ADK ([0e71985](https://github.com/google/adk-python/commit/0e71985501c00682eff0f0c5328a3d429f2bdc68))
60+
* Small fixes for express mode ([3a374ce](https://github.com/google/adk-python/commit/3a374ce0aae73c138cd51d754220d0d7a64677b3))
61+
* sync callbacks with call_llm span ([b2daf83](https://github.com/google/adk-python/commit/b2daf83db406f8844f9db75abc7fee17362433b3))
62+
* **tools:** handle toolset errors gracefully in canonical_tools ([5df03f1](https://github.com/google/adk-python/commit/5df03f1f412e3ab55a5a6ceac892ba6b985a8036)), closes [#3341](https://github.com/google/adk-python/issues/3341)
63+
* truncate error_message in v0 schema to prevent VARCHAR overflow ([62daf4f](https://github.com/google/adk-python/commit/62daf4f61b14aee7bca9d8dec479bfd940bbb955)), closes [#4993](https://github.com/google/adk-python/issues/4993)
64+
* update toolbox-adk and toolbox server versions ([1486925](https://github.com/google/adk-python/commit/14869253d072e901d530fd3b7ee8ef67fbe5ddbc))
65+
66+
67+
### Code Refactoring
68+
69+
* Move SecretManagerClient to google.adk.integrations.secret_manager package ([1104523](https://github.com/google/adk-python/commit/110452375c6ccaa16e4ade7d7fe3438d185d4355))
70+
* Remove the session events dependency from A2aAgentExecutor ([aaa03ac](https://github.com/google/adk-python/commit/aaa03ac30841b2e12e3ddf4bb02fbcbf08ae13e8))
71+
72+
73+
### Documentation
74+
75+
* **adk:** clean up remote triggers README to remove internal references ([ccac461](https://github.com/google/adk-python/commit/ccac461b2ab6291ecd09577ca0553833eaff71b9))
76+
* Update the MCP Toolbox docsite with the new URL ([a60baca](https://github.com/google/adk-python/commit/a60baca3ddfe2541159b32d67b738a836d2395e7))
77+
378
## [1.28.0](https://github.com/google/adk-python/compare/v1.27.5...v1.28.0) (2026-03-26)
479

580

contributing/samples/adk_triaging_agent/agent.py

Lines changed: 29 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,14 @@
4242
"workflow": "DeanChensj",
4343
}
4444

45+
46+
LABEL_TO_GTECH = [
47+
"klateefa",
48+
"llalitkumarrr",
49+
"surajksharma07",
50+
"sanketpatil06",
51+
]
52+
4553
LABEL_GUIDELINES = """
4654
Label rubric and disambiguation rules:
4755
- "documentation": Tutorials, README content, reference docs, or samples.
@@ -121,15 +129,13 @@ def list_untriaged_issues(issue_count: int) -> dict[str, Any]:
121129

122130
existing_component_labels = issue_labels & component_labels
123131
has_component = bool(existing_component_labels)
124-
has_planned = "planned" in issue_labels
125132

126133
# Determine what actions are needed
127134
needs_component_label = not has_component
128-
needs_owner = has_planned and not assignees
135+
needs_owner = not assignees
129136

130137
# Include issue if it needs any action
131138
if needs_component_label or needs_owner:
132-
issue["has_planned_label"] = has_planned
133139
issue["has_component_label"] = has_component
134140
issue["existing_component_label"] = (
135141
list(existing_component_labels)[0]
@@ -146,7 +152,6 @@ def list_untriaged_issues(issue_count: int) -> dict[str, Any]:
146152

147153
def add_label_to_issue(issue_number: int, label: str) -> dict[str, Any]:
148154
"""Add the specified component label to the given issue number.
149-
150155
Args:
151156
issue_number: issue number of the GitHub issue.
152157
label: label to assign
@@ -177,37 +182,30 @@ def add_label_to_issue(issue_number: int, label: str) -> dict[str, Any]:
177182
}
178183

179184

180-
def add_owner_to_issue(issue_number: int, label: str) -> dict[str, Any]:
181-
"""Assign an owner to the issue based on the component label.
185+
def assign_gtech_owner_to_issue(issue_number: int) -> dict[str, Any]:
186+
"""Assign an owner from the GTech team to the given issue number.
182187
183-
This should only be called for issues that have the 'planned' label.
188+
This is go to option irrespective of component label or planned label,
189+
as long as the issue needs an owner.
190+
191+
All unassigned issues will be considered for GTech ownership. Unassigned
192+
issues will seperated in two categories: issues with type "Bug" and issues
193+
with type "Feature". Then bug issues and feature issues will be equally
194+
assigned to the Gtech members in such a way that every day all members get
195+
equal number of bug and feature issues.
184196
185197
Args:
186198
issue_number: issue number of the GitHub issue.
187-
label: component label that determines the owner to assign
188199
189200
Returns:
190201
The status of this request, with the assigned owner when successful.
191202
"""
192-
print(
193-
f"Attempting to assign owner for label '{label}' to issue #{issue_number}"
194-
)
195-
if label not in LABEL_TO_OWNER:
196-
return error_response(
197-
f"Error: Label '{label}' is not a valid component label."
198-
)
199-
200-
owner = LABEL_TO_OWNER.get(label, None)
201-
if not owner:
202-
return {
203-
"status": "warning",
204-
"message": f"Label '{label}' does not have an owner. Will not assign.",
205-
}
206-
203+
print(f"Attempting to assign GTech owner to issue #{issue_number}")
204+
gtech_assignee = LABEL_TO_GTECH[issue_number % len(LABEL_TO_GTECH)]
207205
assignee_url = (
208206
f"{GITHUB_BASE_URL}/repos/{OWNER}/{REPO}/issues/{issue_number}/assignees"
209207
)
210-
assignee_payload = {"assignees": [owner]}
208+
assignee_payload = {"assignees": [gtech_assignee]}
211209

212210
try:
213211
response = post_request(assignee_url, assignee_payload)
@@ -217,7 +215,7 @@ def add_owner_to_issue(issue_number: int, label: str) -> dict[str, Any]:
217215
return {
218216
"status": "success",
219217
"message": response,
220-
"assigned_owner": owner,
218+
"assigned_owner": gtech_assignee,
221219
}
222220

223221

@@ -259,7 +257,7 @@ def change_issue_type(issue_number: int, issue_type: str) -> dict[str, Any]:
259257
260258
Each issue will have flags indicating what actions are needed:
261259
- `needs_component_label`: true if the issue needs a component label
262-
- `needs_owner`: true if the issue needs an owner assigned (has 'planned' label but no assignee)
260+
- `needs_owner`: true if the issue needs an owner assigned
263261
264262
For each issue, perform ONLY the required actions based on the flags:
265263
@@ -271,8 +269,8 @@ def change_issue_type(issue_number: int, issue_type: str) -> dict[str, Any]:
271269
- Otherwise → do not change the issue type
272270
273271
2. **If `needs_owner` is true**:
274-
- Use `add_owner_to_issue` to assign an owner based on the component label
275-
- Note: If the issue already has a component label (`has_component_label: true`), use that existing label to determine the owner
272+
- Use `assign_gtech_owner_to_issue` to assign an owner.
273+
276274
277275
Do NOT add a component label if `needs_component_label` is false.
278276
Do NOT assign an owner if `needs_owner` is false.
@@ -282,19 +280,18 @@ def change_issue_type(issue_number: int, issue_type: str) -> dict[str, Any]:
282280
placeholders (never output text like "[fill in later]").
283281
- Justify the chosen label with a short explanation referencing the issue
284282
details.
285-
- Mention the assigned owner only when you actually assign one (i.e., when
286-
the issue has the 'planned' label).
283+
- Mention the assigned owner only when you actually assign one.
287284
- If no label is applied, clearly state why.
288285
289286
Present the following in an easy to read format highlighting issue number and your label.
290287
- the issue summary in a few sentence
291288
- your label recommendation and justification
292-
- the owner of the label if you assign the issue to an owner (only for planned issues)
289+
- the owner, if you assign the issue to an owner
293290
""",
294291
tools=[
295292
list_untriaged_issues,
296293
add_label_to_issue,
297-
add_owner_to_issue,
294+
assign_gtech_owner_to_issue,
298295
change_issue_type,
299296
],
300297
)

contributing/samples/adk_triaging_agent/main.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -57,7 +57,7 @@ async def fetch_specific_issue_details(issue_number: int):
5757

5858
# Determine what actions are needed
5959
needs_component_label = not has_component
60-
needs_owner = has_planned and not has_assignee
60+
needs_owner = not has_assignee
6161

6262
if needs_component_label or needs_owner:
6363
print(
Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
# Local Environment Skill Sample
2+
3+
This sample demonstrates how to use the `LocalEnvironment` with the `EnvironmentToolset` to allow an agent to manually discover and load skills from the environment, rather than using the pre-configured `SkillToolset`.
4+
5+
## Description
6+
7+
The agent is configured with the `EnvironmentToolset` and is initialized with a `LocalEnvironment` pointing to the agent's directory.
8+
Instead of having skills pre-loaded, the agent uses system instructions that guide it to search for skills in the `skills/` folder and load them by reading their `SKILL.md` files using the `ReadFile` tool.
9+
10+
This demonstrates a "manual skill loading" pattern where the agent can acquire new capabilities dynamically by reading instructions from the environment.
11+
12+
## Sample Usage
13+
14+
You can interact with the agent by providing prompts that require a specific skill (like weather).
15+
16+
### Example Prompt
17+
18+
> "Can you check the weather in Sunnyvale?"
19+
20+
### Expected Behavior
21+
22+
1. **Find Skill**: The agent uses the `Execute` tool to search for all available skills by running `find skills -name SKILL.md`.
23+
2. **Load Skill**: The agent identifies the relevant skill and uses the `ReadFile` tool to read its `SKILL.md` file.
24+
3. **Execute Skill**: The agent follows the instructions in the skill file (e.g., reading references or running scripts) to answer the user's request.
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
# Copyright 2026 Google LLC
2+
#
3+
# Licensed under the Apache License, Version 2.0 (the "License");
4+
# you may not use this file except in compliance with the License.
5+
# You may obtain a copy of the License at
6+
#
7+
# http://www.apache.org/licenses/LICENSE-2.0
8+
#
9+
# Unless required by applicable law or agreed to in writing, software
10+
# distributed under the License is distributed on an "AS IS" BASIS,
11+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12+
# See the License for the specific language governing permissions and
13+
# limitations under the License.
14+
15+
from . import agent

0 commit comments

Comments
 (0)