Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
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
2 changes: 1 addition & 1 deletion a2a/README.md → a2a/google-adk-a2a-core/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -177,7 +177,7 @@ curl -X POST http://localhost:8081/a2a/remote/v1/message:send \
"kind": "message",
"contextId": "cli-demo-context",
"messageId": "cli-check-2",
"role": "USER",
"role": "user",
"parts": [
{ "kind": "text", "text": "Is 2 prime?" }
]
Expand Down
117 changes: 117 additions & 0 deletions a2a/google-adk-a2a-core/pom.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,117 @@
<?xml version='1.0' encoding='utf-8'?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>

<parent>
<groupId>com.google.adk</groupId>
<artifactId>google-adk-a2a</artifactId>
<version>0.3.1-SNAPSHOT</version>
</parent>

<artifactId>google-adk-a2a-core</artifactId>
<packaging>jar</packaging>

<name>Google ADK A2A Integration</name>

<properties>
<java.version>17</java.version>
<maven.compiler.release>${java.version}</maven.compiler.release>
<a2a.sdk.version>0.3.0.Beta1</a2a.sdk.version>
<google.adk.version>${project.version}</google.adk.version>
<guava.version>33.0.0-jre</guava.version>
<jackson.version>2.19.0</jackson.version>
<rxjava.version>3.1.5</rxjava.version>
<jspecify.version>1.0.0</jspecify.version>
<slf4j.version>2.0.17</slf4j.version>
<errorprone.version>2.38.0</errorprone.version>
<truth.version>1.4.4</truth.version>
<junit4.version>4.13.2</junit4.version>
</properties>

<dependencies>
<dependency>
<groupId>com.google.adk</groupId>
<artifactId>google-adk</artifactId>
<version>${google.adk.version}</version>
</dependency>
<dependency>
<groupId>com.google.guava</groupId>
<artifactId>guava</artifactId>
<version>${guava.version}</version>
</dependency>
<dependency>
<groupId>com.google.errorprone</groupId>
<artifactId>error_prone_annotations</artifactId>
<version>${errorprone.version}</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-annotations</artifactId>
<version>${jackson.version}</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>${jackson.version}</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.module</groupId>
<artifactId>jackson-module-parameter-names</artifactId>
<version>${jackson.version}</version>
</dependency>
<dependency>
<groupId>io.reactivex.rxjava3</groupId>
<artifactId>rxjava</artifactId>
<version>${rxjava.version}</version>
</dependency>
<dependency>
<groupId>org.jspecify</groupId>
<artifactId>jspecify</artifactId>
<version>${jspecify.version}</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>${slf4j.version}</version>
</dependency>
<dependency>
<groupId>io.github.a2asdk</groupId>
<artifactId>a2a-java-sdk-spec</artifactId>
<version>${a2a.sdk.version}</version>
</dependency>
<dependency>
<groupId>io.github.a2asdk</groupId>
<artifactId>a2a-java-sdk-transport-rest</artifactId>
<version>${a2a.sdk.version}</version>
</dependency>
<dependency>
<groupId>io.github.a2asdk</groupId>
<artifactId>a2a-java-sdk-http-client</artifactId>
<version>${a2a.sdk.version}</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>${junit4.version}</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>com.google.truth</groupId>
<artifactId>truth</artifactId>
<version>${truth.version}</version>
<scope>test</scope>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.13.0</version>
<configuration>
<release>${java.version}</release>
</configuration>
</plugin>
</plugins>
</build>
</project>
Original file line number Diff line number Diff line change
Expand Up @@ -3,16 +3,21 @@
import static com.google.common.base.Strings.isNullOrEmpty;
import static java.util.concurrent.TimeUnit.MILLISECONDS;

import com.google.adk.a2a.converters.ConversationPreprocessor;
import com.google.adk.a2a.converters.RequestConverter;
import com.google.adk.a2a.converters.ResponseConverter;
import com.google.adk.agents.BaseAgent;
import com.google.adk.agents.RunConfig;
import com.google.adk.artifacts.InMemoryArtifactService;
import com.google.adk.events.Event;
import com.google.adk.memory.InMemoryMemoryService;
import com.google.adk.runner.Runner;
import com.google.adk.sessions.BaseSessionService;
import com.google.adk.sessions.InMemorySessionService;
import com.google.adk.sessions.Session;
import com.google.common.collect.ImmutableList;
import com.google.genai.types.Content;
import io.a2a.spec.AgentCard;
import io.a2a.spec.Message;
import io.a2a.spec.TextPart;
import io.reactivex.rxjava3.core.Completable;
Expand Down Expand Up @@ -43,12 +48,13 @@ Single<ImmutableList<Event>> execute(
String invocationId);
}

private final InMemorySessionService sessionService;
private final BaseSessionService sessionService;
private final String appName;
@Nullable private final Runner runner;
@Nullable private final Duration agentTimeout;
private static final RunConfig DEFAULT_RUN_CONFIG =
RunConfig.builder().setStreamingMode(RunConfig.StreamingMode.NONE).setMaxLlmCalls(20).build();
private AgentCard agentCard;

public A2ASendMessageExecutor(InMemorySessionService sessionService, String appName) {
this.sessionService = sessionService;
Expand All @@ -57,7 +63,16 @@ public A2ASendMessageExecutor(InMemorySessionService sessionService, String appN
this.agentTimeout = null;
}

public A2ASendMessageExecutor(BaseAgent agent, String appName, Duration agentTimeout) {
public A2ASendMessageExecutor(Runner runner, Duration agentTimeout, AgentCard agentCard) {
this.sessionService = runner.sessionService();
this.appName = runner.appName();
this.runner = runner;
this.agentTimeout = agentTimeout;
this.agentCard = agentCard;
}

public A2ASendMessageExecutor(
BaseAgent agent, String appName, Duration agentTimeout, AgentCard agentCard) {
InMemorySessionService sessionService = new InMemorySessionService();
Runner runnerInstance =
new Runner(
Expand All @@ -70,6 +85,7 @@ public A2ASendMessageExecutor(BaseAgent agent, String appName, Duration agentTim
this.appName = appName;
this.runner = runnerInstance;
this.agentTimeout = agentTimeout;
this.agentCard = agentCard;
}

public Single<Message> execute(
Expand Down Expand Up @@ -296,4 +312,8 @@ private static boolean isTimeout(@Nullable Throwable throwable) {
}
return false;
}

public AgentCard getAgentCard() {
return agentCard;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,8 @@
import static com.google.common.base.Strings.nullToEmpty;

import com.fasterxml.jackson.databind.ObjectMapper;
import com.google.adk.a2a.converters.EventConverter;
import com.google.adk.a2a.converters.ResponseConverter;
import com.google.adk.agents.BaseAgent;
import com.google.adk.agents.Callbacks;
import com.google.adk.agents.InvocationContext;
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package com.google.adk.a2a;
package com.google.adk.a2a.converters;

import com.google.adk.events.Event;
import com.google.common.collect.ImmutableList;
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package com.google.adk.a2a;
package com.google.adk.a2a.converters;

import com.google.adk.agents.InvocationContext;
import com.google.adk.events.Event;
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package com.google.adk.a2a;
package com.google.adk.a2a.converters;

import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package com.google.adk.a2a;
package com.google.adk.a2a.converters;

import com.google.adk.events.Event;
import com.google.common.collect.ImmutableList;
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package com.google.adk.a2a;
package com.google.adk.a2a.converters;

import com.google.adk.events.Event;
import com.google.genai.types.Content;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,8 @@

import static com.google.common.truth.Truth.assertThat;

import com.google.adk.a2a.converters.EventConverter;
import com.google.adk.a2a.converters.PartConverter;
import com.google.adk.agents.BaseAgent;
import com.google.adk.agents.InvocationContext;
import com.google.adk.agents.RunConfig;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,8 +6,8 @@

<parent>
<groupId>com.google.adk</groupId>
<artifactId>google-adk-parent</artifactId>
<version>0.3.1-SNAPSHOT</version><!-- {x-version-update:google-adk:current} -->
<artifactId>google-adk-a2a</artifactId>
<version>0.3.1-SNAPSHOT</version>
</parent>

<artifactId>google-adk-a2a-webservice</artifactId>
Expand All @@ -23,8 +23,8 @@
<dependencies>
<dependency>
<groupId>com.google.adk</groupId>
<artifactId>google-adk-a2a</artifactId>
<version>${project.version}</version>
<artifactId>google-adk-a2a-core</artifactId>
<version>0.3.1-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,9 +2,12 @@

import com.google.adk.a2a.A2ASendMessageExecutor;
import com.google.adk.agents.BaseAgent;
import com.google.adk.runner.Runner;
import io.a2a.spec.AgentCard;
import java.time.Duration;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
Expand Down Expand Up @@ -34,13 +37,21 @@ public class A2ARemoteConfiguration {

@Bean
public A2ASendMessageExecutor a2aSendMessageExecutor(
BaseAgent agent,
@Autowired(required = false) BaseAgent agent,
@Autowired(required = false) Runner runner,
@Value("${a2a.remote.appName:" + DEFAULT_APP_NAME + "}") String appName,
@Value("${a2a.remote.timeoutSeconds:" + DEFAULT_TIMEOUT_SECONDS + "}") long timeoutSeconds) {
@Value("${a2a.remote.timeoutSeconds:" + DEFAULT_TIMEOUT_SECONDS + "}") long timeoutSeconds,
AgentCard agentCard) {
logger.info(
"Initializing A2A send message executor for appName {} with timeout {}s",
appName,
timeoutSeconds);
return new A2ASendMessageExecutor(agent, appName, Duration.ofSeconds(timeoutSeconds));
if (agent != null) {
return new A2ASendMessageExecutor(
agent, appName, Duration.ofSeconds(timeoutSeconds), agentCard);
} else if (runner != null) {
return new A2ASendMessageExecutor(runner, Duration.ofSeconds(timeoutSeconds), agentCard);
}
throw new IllegalStateException("Neither BaseAgent nor Runner is available!");
}
}
Original file line number Diff line number Diff line change
@@ -1,9 +1,12 @@
package com.google.adk.webservice;

import io.a2a.spec.AgentCard;
import io.a2a.spec.SendMessageRequest;
import io.a2a.spec.SendMessageResponse;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
Expand Down Expand Up @@ -32,4 +35,10 @@ public SendMessageResponse sendMessage(@RequestBody SendMessageRequest request)
logger.debug("Responding with remote A2A payload: {}", response);
return response;
}

/** Get agent card information */
@GetMapping(path = "/v1/.well-known/agent-card.json", produces = "application/json")
public ResponseEntity<AgentCard> getAgentCard() {
return ResponseEntity.ok(service.getAgentCard());
}
}
Original file line number Diff line number Diff line change
@@ -1,7 +1,8 @@
package com.google.adk.webservice;

import com.google.adk.a2a.A2ASendMessageExecutor;
import com.google.adk.a2a.ResponseConverter;
import com.google.adk.a2a.converters.ResponseConverter;
import io.a2a.spec.AgentCard;
import io.a2a.spec.JSONRPCError;
import io.a2a.spec.Message;
import io.a2a.spec.MessageSendParams;
Expand Down Expand Up @@ -85,4 +86,8 @@ private static SendMessageResponse errorResponse(SendMessageRequest request, Thr
JSONRPCError jsonrpcError = new JSONRPCError(ERROR_CODE_INTERNAL_ERROR, message, null);
return new SendMessageResponse(request != null ? request.getId() : null, jsonrpcError);
}

public AgentCard getAgentCard() {
return executor.getAgentCard();
}
}
Loading