diff --git a/.env-example b/.env-example index 843a7b1..ce50694 100644 --- a/.env-example +++ b/.env-example @@ -1,2 +1,3 @@ # This is an example of env file. github.token= +quarkus.langchain4j.gemini.api-key= \ No newline at end of file diff --git a/pom.xml b/pom.xml index e0f9308..c30de4b 100644 --- a/pom.xml +++ b/pom.xml @@ -12,8 +12,8 @@ UTF-8 quarkus-bom io.quarkus.platform - 3.12.1 - 3.2.5 + 3.21.2 + 3.5.0 2.13.0 @@ -34,6 +34,7 @@ pom import + ${quarkus.platform.group-id} quarkus-google-cloud-services-bom @@ -45,22 +46,6 @@ - - io.quarkus - quarkus-resteasy-jackson - - - io.quarkus - quarkus-resteasy - - - io.quarkus - quarkus-resteasy-client - - - io.quarkus - quarkus-resteasy-client-jackson - io.quarkus @@ -84,19 +69,35 @@ io.quarkiverse.googlecloudservices quarkus-google-cloud-firestore + + + io.quarkiverse.langchain4j + quarkus-langchain4j-mcp + 1.3.0 + + + + io.quarkiverse.langchain4j + quarkus-langchain4j-ai-gemini + 1.3.0 + + io.quarkus quarkus-junit5 test + - io.rest-assured - rest-assured + io.quarkus + quarkus-junit5-mockito test + - io.quarkus - quarkus-junit5-mockito + io.rest-assured + rest-assured + 5.5.6 test diff --git a/src/main/java/zenika/oss/stats/mcp/GitHubAIService.java b/src/main/java/zenika/oss/stats/mcp/GitHubAIService.java new file mode 100644 index 0000000..db9b5c1 --- /dev/null +++ b/src/main/java/zenika/oss/stats/mcp/GitHubAIService.java @@ -0,0 +1,18 @@ +package zenika.oss.stats.mcp; + +import dev.langchain4j.service.SystemMessage; +import dev.langchain4j.service.UserMessage; +import io.quarkiverse.langchain4j.RegisterAiService; +import io.quarkiverse.langchain4j.mcp.runtime.McpToolBox; + +@RegisterAiService +public interface GitHubAIService { + + @SystemMessage("You are an open source lovers") + @UserMessage(""" + Get the GitHub profile url for this user {userHandle} + """) + @McpToolBox + String getGitHubProfile(String userHandle); + +} diff --git a/src/main/java/zenika/oss/stats/ressources/AIRessources.java b/src/main/java/zenika/oss/stats/ressources/AIRessources.java new file mode 100644 index 0000000..d148966 --- /dev/null +++ b/src/main/java/zenika/oss/stats/ressources/AIRessources.java @@ -0,0 +1,24 @@ +package zenika.oss.stats.ressources; + +import jakarta.enterprise.context.ApplicationScoped; +import jakarta.inject.Inject; +import jakarta.ws.rs.GET; +import jakarta.ws.rs.Path; +import jakarta.ws.rs.PathParam; +import jakarta.ws.rs.core.Response; +import zenika.oss.stats.mcp.GitHubAIService; + +@ApplicationScoped +@Path("/v1/ai/") +public class AIRessources { + + @Inject + GitHubAIService gitHubAIService; + + @GET + @Path("/profile/{userHandle}") + public Response getProfile(@PathParam("userHandle") String userHandle) { + return Response.ok(gitHubAIService.getGitHubProfile(userHandle)).build(); + } + +} diff --git a/src/main/resources/application.properties b/src/main/resources/application.properties index 6e3f271..765ffaa 100644 --- a/src/main/resources/application.properties +++ b/src/main/resources/application.properties @@ -1,10 +1,10 @@ -quarkus.datasource.db-kind=postgresql -quarkus.datasource.jdbc.url=jdbc:postgresql:///mydatabase -quarkus.datasource.username=quarkus -quarkus.datasource.password=quarkus -quarkus.datasource.jdbc.additional-jdbc-properties.cloudSqlInstance=project-id:gcp-region:instance -quarkus.datasource.jdbc.additional-jdbc-properties.socketFactory=com.google.cloud.sql.postgres.SocketFactory +#quarkus.datasource.db-kind=postgresql +#quarkus.datasource.jdbc.url=jdbc:postgresql:///mydatabase +#quarkus.datasource.username=quarkus +#quarkus.datasource.password=quarkus +#quarkus.datasource.jdbc.additional-jdbc-properties.cloudSqlInstance=project-id:gcp-region:instance +#quarkus.datasource.jdbc.additional-jdbc-properties.socketFactory=com.google.cloud.sql.postgres.SocketFactory # Cron members.cron=0 9 1 * * ? @@ -35,4 +35,11 @@ quarkus.google.cloud.firestore.database-id=opensource-statistics %dev.quarkus.google.cloud.firestore.devservice.enabled=false %test.quarkus.google.cloud.firestore.devservice.enabled=true quarkus.google.cloud.service-account-location = ./.gcloud-conf.json -%dev.quarkus.google.cloud.service-account-location = ./.gcloud-conf.json \ No newline at end of file +%dev.quarkus.google.cloud.service-account-location = ./.gcloud-conf.json + +# GitHub MCP +quarkus.langchain4j.mcp.github.transport-type=http +quarkus.langchain4j.mcp.github.url=https://api.githubcopilot.com/mcp/sse +quarkus.langchain4j.log-requests=true +quarkus.langchain4j.log-responses=true +# quarkus.langchain4j.gemini.api-key to defined in .env file \ No newline at end of file diff --git a/src/test/java/zenika/oss/stats/ressources/ContributionsRessourcesTest.java b/src/test/java/zenika/oss/stats/ressources/ContributionsRessourcesTest.java index 8e62f74..c500f60 100644 --- a/src/test/java/zenika/oss/stats/ressources/ContributionsRessourcesTest.java +++ b/src/test/java/zenika/oss/stats/ressources/ContributionsRessourcesTest.java @@ -6,6 +6,7 @@ import static io.restassured.RestAssured.given; + @QuarkusTest class ContributionsRessourcesTest { diff --git a/src/test/java/zenika/oss/stats/ressources/workflow/WorkflowRessourcesTest.java b/src/test/java/zenika/oss/stats/ressources/workflow/WorkflowRessourcesTest.java index c47d312..b6cd0aa 100644 --- a/src/test/java/zenika/oss/stats/ressources/workflow/WorkflowRessourcesTest.java +++ b/src/test/java/zenika/oss/stats/ressources/workflow/WorkflowRessourcesTest.java @@ -6,10 +6,8 @@ import org.junit.jupiter.api.Test; import org.mockito.Mockito; import zenika.oss.stats.beans.github.GitHubMember; -import zenika.oss.stats.services.FirestoreServices; import zenika.oss.stats.services.GitHubServices; -import java.util.Arrays; import java.util.List; import static io.restassured.RestAssured.given;