Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
36 commits
Select commit Hold shift + click to select a range
bfebfbc
Upgrade GitHub Actions for Node 24 compatibility
salmanmkc Jan 23, 2026
8624d59
dev: Introduce initial AGENTS.md
vorburger Mar 3, 2026
b6356d2
chore: update mcp dependency version to 0.17.2
tilgalas Mar 16, 2026
7ebeb07
feat: init AGENTS.md file
google-genai-bot Mar 16, 2026
567fdf0
fix: fix null handling in runAsyncImpl
tilgalas Mar 16, 2026
b8cb7e2
feat: add type-safe runAsync methods to BaseTool
tilgalas Mar 16, 2026
d8ca834
Merge pull request #942 from google:vorburger-AGENTS.md
copybara-github Mar 16, 2026
fca43fb
fix: prevent ConcurrentModificationException when session events are …
google-genai-bot Mar 16, 2026
28a8cd0
chore!: remove deprecated Example processor
Mar 17, 2026
8556d4a
feat: Propagating the otel context
google-genai-bot Mar 17, 2026
2fcff3c
Extract timestamp as double for InMemorySessionService events
tlanclos Mar 4, 2026
4eb3613
fix: improve processRequest_concurrentReadAndWrite_noException test case
google-genai-bot Mar 17, 2026
c8ab0f9
feat: Implement basic version of BigQuery Agent Analytics Plugin
google-genai-bot Mar 17, 2026
551c31f
fix: include saveArtifact invocations in event chain
tilgalas Mar 18, 2026
e51f911
feat: add handling the a2a metadata in the RemoteA2AAgent; Add the en…
google-genai-bot Mar 18, 2026
8bc6b12
Merge pull request #956 from tlanclos:inmemss-timestamp-fix
copybara-github Mar 18, 2026
ca6a75d
Merge branch 'main' into upgrade-github-actions-node24
sherryfox Mar 18, 2026
0d1e5c7
feat: update stateDelta builder input to Map from ConcurrentMap
google-genai-bot Mar 18, 2026
de3b276
Remove ADK dependency for langchain4j module
Jan 12, 2026
296b2a2
Merge pull request #725 from gbrail:langchain-dependency
copybara-github Mar 18, 2026
3ba04d3
fix: workaround for the client config streaming settings are not resp…
google-genai-bot Mar 18, 2026
94de7f1
fix: Use ConcurrentHashMap in InvocationReplayState
tilgalas Mar 18, 2026
2c71ba1
feat: Enhance LangChain4j to support MCP tools with parametersJsonSchema
curefat Mar 18, 2026
ce610ff
Merge pull request #803 from curefat:patch-1
copybara-github Mar 18, 2026
fa67101
ADK changes
google-genai-bot Mar 18, 2026
8b6b344
Merge pull request #668 from salmanmkc:upgrade-github-actions-node24
copybara-github Mar 19, 2026
d7e03ee
fix: Relaxing constraints for output schema
google-genai-bot Mar 19, 2026
e534f12
refactor: Update map handling in EventActions to always use defensive…
google-genai-bot Mar 19, 2026
cd56902
feat: Update return type of toolsets() from ImmutableList to List
google-genai-bot Mar 19, 2026
9a08076
feat: fixing context propagation for agent transfers
google-genai-bot Mar 19, 2026
0af82e6
fix: Removing deprecated methods in Runner
google-genai-bot Mar 19, 2026
dc5d794
chore: set version to 1.0.0-rc.1
tilgalas Mar 19, 2026
dfbab95
Updated tests in Spring AI, Langchain4j, dependency for Spering AI an…
ddobrin Mar 17, 2026
55a4953
Merge pull request #1046 from ddobrin:spring-ai-update-20-M3
copybara-github Mar 19, 2026
dbb1394
feat!: remove McpToolset constructors taking Optional parameters
tilgalas Mar 19, 2026
897f9d9
chore: add test-jar goal in core sub-project
tilgalas Mar 19, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions .github/workflows/validation.yml
Original file line number Diff line number Diff line change
Expand Up @@ -23,13 +23,13 @@ jobs:
uses: actions/checkout@v6

- name: Set up Java ${{ matrix.java-version }}
uses: actions/setup-java@v4
uses: actions/setup-java@v5
with:
distribution: temurin
java-version: ${{ matrix.java-version }}

- name: Cache Maven packages
uses: actions/cache@v3
uses: actions/cache@v5
with:
path: ~/.m2/repository
key: ${{ runner.os }}-maven-${{ matrix.java-version }}-${{ hashFiles('**/pom.xml') }}
Expand Down
1 change: 0 additions & 1 deletion .release-please-manifest.json
Original file line number Diff line number Diff line change
@@ -1,4 +1,3 @@
{
".": "0.9.0"
}

3 changes: 3 additions & 0 deletions AGENTS.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
# AGENTS.md

Validate changes by running `./mvnw test`.
13 changes: 12 additions & 1 deletion a2a/src/main/java/com/google/adk/a2a/agent/RemoteA2AAgent.java
Original file line number Diff line number Diff line change
Expand Up @@ -117,7 +117,7 @@ private RemoteA2AAgent(Builder builder) {
if (this.description.isEmpty() && this.agentCard.description() != null) {
this.description = this.agentCard.description();
}
this.streaming = this.agentCard.capabilities().streaming();
this.streaming = builder.streaming && this.agentCard.capabilities().streaming();
}

public static Builder builder() {
Expand All @@ -133,6 +133,13 @@ public static class Builder {
private List<? extends BaseAgent> subAgents;
private List<Callbacks.BeforeAgentCallback> beforeAgentCallback;
private List<Callbacks.AfterAgentCallback> afterAgentCallback;
private boolean streaming;

@CanIgnoreReturnValue
public Builder streaming(boolean streaming) {
this.streaming = streaming;
return this;
}

@CanIgnoreReturnValue
public Builder name(String name) {
Expand Down Expand Up @@ -181,6 +188,10 @@ public RemoteA2AAgent build() {
}
}

public boolean isStreaming() {
return streaming;
}

private Message.Builder newA2AMessage(Message.Role role, List<io.a2a.spec.Part<?>> parts) {
return new Message.Builder().messageId(UUID.randomUUID().toString()).role(role).parts(parts);
}
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,40 @@
/*
* Copyright 2026 Google LLC
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.google.adk.a2a.converters;

/**
* Enum for the type of A2A metadata. Adds a prefix used to differentiage ADK-related values stored
* in Metadata an A2A event.
*/
public enum A2AMetadataKey {
TYPE("type"),
IS_LONG_RUNNING("is_long_running"),
PARTIAL("partial"),
GROUNDING_METADATA("grounding_metadata"),
USAGE_METADATA("usage_metadata"),
CUSTOM_METADATA("custom_metadata"),
ERROR_CODE("error_code");

private final String type;

private A2AMetadataKey(String type) {
this.type = "adk_" + type;
}

public String getType() {
return type;
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
/*
* Copyright 2026 Google LLC
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.google.adk.a2a.converters;

/**
* Enum for the type of ADK metadata. Adds a prefix used to differentiate A2A-related values stored
* in custom metadata of an ADK session event.
*/
public enum AdkMetadataKey {
TASK_ID("task_id"),
CONTEXT_ID("context_id");

private final String type;

private AdkMetadataKey(String type) {
this.type = "a2a:" + type;
}

public String getType() {
return type;
}
}
19 changes: 7 additions & 12 deletions a2a/src/main/java/com/google/adk/a2a/converters/PartConverter.java
Original file line number Diff line number Diff line change
Expand Up @@ -52,11 +52,7 @@ public final class PartConverter {

private static final Logger logger = LoggerFactory.getLogger(PartConverter.class);
private static final ObjectMapper objectMapper = new ObjectMapper();
// Constants for metadata types. By convention metadata keys are prefixed with "adk_" to align
// with the Python and Golang libraries.
public static final String A2A_DATA_PART_METADATA_TYPE_KEY = "adk_type";
public static final String A2A_DATA_PART_METADATA_IS_LONG_RUNNING_KEY = "adk_is_long_running";
public static final String A2A_DATA_PART_METADATA_IS_PARTIAL_KEY = "adk_partial";
// Constants for metadata types.
public static final String LANGUAGE_KEY = "language";
public static final String OUTCOME_KEY = "outcome";
public static final String CODE_KEY = "code";
Expand Down Expand Up @@ -135,7 +131,7 @@ private static com.google.genai.types.Part convertDataPartToGenAiPart(DataPart d
Map<String, Object> metadata =
Optional.ofNullable(dataPart.getMetadata()).map(HashMap::new).orElseGet(HashMap::new);

String metadataType = metadata.getOrDefault(A2A_DATA_PART_METADATA_TYPE_KEY, "").toString();
String metadataType = metadata.getOrDefault(A2AMetadataKey.TYPE.getType(), "").toString();

if ((data.containsKey(NAME_KEY) && data.containsKey(ARGS_KEY))
|| metadataType.equals(A2ADataPartMetadataType.FUNCTION_CALL.getType())) {
Expand Down Expand Up @@ -218,7 +214,7 @@ private static DataPart createDataPartFromFunctionCall(
addValueIfPresent(data, WILL_CONTINUE_KEY, functionCall.willContinue());
addValueIfPresent(data, PARTIAL_ARGS_KEY, functionCall.partialArgs());

metadata.put(A2A_DATA_PART_METADATA_TYPE_KEY, A2ADataPartMetadataType.FUNCTION_CALL.getType());
metadata.put(A2AMetadataKey.TYPE.getType(), A2ADataPartMetadataType.FUNCTION_CALL.getType());

return new DataPart(data.buildOrThrow(), metadata.buildOrThrow());
}
Expand All @@ -245,7 +241,7 @@ private static DataPart createDataPartFromFunctionResponse(
addValueIfPresent(data, PARTS_KEY, functionResponse.parts());

metadata.put(
A2A_DATA_PART_METADATA_TYPE_KEY, A2ADataPartMetadataType.FUNCTION_RESPONSE.getType());
A2AMetadataKey.TYPE.getType(), A2ADataPartMetadataType.FUNCTION_RESPONSE.getType());

return new DataPart(data.buildOrThrow(), metadata.buildOrThrow());
}
Expand All @@ -268,7 +264,7 @@ private static DataPart createDataPartFromCodeExecutionResult(
addValueIfPresent(data, OUTPUT_KEY, codeExecutionResult.output());

metadata.put(
A2A_DATA_PART_METADATA_TYPE_KEY, A2ADataPartMetadataType.CODE_EXECUTION_RESULT.getType());
A2AMetadataKey.TYPE.getType(), A2ADataPartMetadataType.CODE_EXECUTION_RESULT.getType());

return new DataPart(data.buildOrThrow(), metadata.buildOrThrow());
}
Expand All @@ -290,8 +286,7 @@ private static DataPart createDataPartFromExecutableCode(
.orElse(Language.Known.LANGUAGE_UNSPECIFIED.toString()));
addValueIfPresent(data, CODE_KEY, executableCode.code());

metadata.put(
A2A_DATA_PART_METADATA_TYPE_KEY, A2ADataPartMetadataType.EXECUTABLE_CODE.getType());
metadata.put(A2AMetadataKey.TYPE.getType(), A2ADataPartMetadataType.EXECUTABLE_CODE.getType());

return new DataPart(data.buildOrThrow(), metadata.buildOrThrow());
}
Expand All @@ -305,7 +300,7 @@ public static io.a2a.spec.Part<?> fromGenaiPart(Part part, boolean isPartial) {
}
ImmutableMap.Builder<String, Object> metadata = ImmutableMap.builder();
if (isPartial) {
metadata.put(A2A_DATA_PART_METADATA_IS_PARTIAL_KEY, true);
metadata.put(A2AMetadataKey.PARTIAL.getType(), true);
}

if (part.text().isPresent()) {
Expand Down
Loading
Loading