Skip to content

Commit 9f2bd48

Browse files
committed
Update Google AI Studio Addon to use langchain4j's google-ai-gemini module
1 parent 98dfbd9 commit 9f2bd48

14 files changed

Lines changed: 54 additions & 399 deletions

google-aistudio/build.gradle.kts

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
plugins {
22
id("java")
33
id("net.minecrell.plugin-yml.bukkit")
4+
id("com.github.johnrengelman.shadow")
45
}
56

67
var pckg = rootProject.ext.get("pckg")
@@ -13,5 +14,12 @@ bukkit {
1314
}
1415

1516
dependencies {
16-
compileOnly(libs.retrofit2)
17+
implementation(libs.langchain4j.googleai) {
18+
isTransitive = false
19+
}
20+
bukkitLibrary(libs.retrofit2.gson)
21+
}
22+
23+
tasks.shadowJar {
24+
relocate("dev.langchain4j.model.googleai", "$pckg.dependencies.langchain4j.googleai")
1725
}

google-aistudio/src/main/java/dev/bluetree242/saaiaddons/aistudio/GoogleAiStudioChatModelProvider.java

Lines changed: 35 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,36 +1,57 @@
11
package dev.bluetree242.saaiaddons.aistudio;
22

3-
import dev.bluetree242.saaiaddons.aistudio.api.AiStudioChatLanguageModel;
43
import dev.bluetree242.serverassistantai.api.ServerAssistantAIAPI;
54
import dev.bluetree242.serverassistantai.api.config.option.OptionMap;
65
import dev.bluetree242.serverassistantai.api.registry.chatmodel.ChatModelContext;
76
import dev.bluetree242.serverassistantai.api.registry.chatmodel.ChatModelProvider;
7+
import dev.langchain4j.data.message.AiMessage;
8+
import dev.langchain4j.data.message.ChatMessage;
9+
import dev.langchain4j.data.message.SystemMessage;
10+
import dev.langchain4j.data.message.UserMessage;
11+
import dev.langchain4j.model.chat.ChatLanguageModel;
12+
import dev.langchain4j.model.googleai.GeminiHarmBlockThreshold;
13+
import dev.langchain4j.model.googleai.GeminiHarmCategory;
14+
import dev.langchain4j.model.googleai.GoogleAiGeminiChatModel;
15+
import dev.langchain4j.model.output.Response;
816
import lombok.RequiredArgsConstructor;
917
import org.jetbrains.annotations.NotNull;
1018
import org.jetbrains.annotations.Nullable;
1119

1220
import java.time.Duration;
1321
import java.util.Collections;
22+
import java.util.HashMap;
23+
import java.util.List;
1424
import java.util.Map;
25+
import java.util.stream.Collectors;
1526

1627
@RequiredArgsConstructor
17-
public class GoogleAiStudioChatModelProvider implements ChatModelProvider<AiStudioChatLanguageModel> {
28+
public class GoogleAiStudioChatModelProvider implements ChatModelProvider<GoogleAiStudioChatModelProvider.GoogleAiWrapper> {
29+
private static final Map<GeminiHarmCategory, GeminiHarmBlockThreshold> safetySettings;
30+
31+
static {
32+
Map<GeminiHarmCategory, GeminiHarmBlockThreshold> result = new HashMap<>();
33+
for (GeminiHarmCategory value : GeminiHarmCategory.values()) {
34+
result.put(value, GeminiHarmBlockThreshold.BLOCK_NONE);
35+
}
36+
safetySettings = Collections.unmodifiableMap(result);
37+
}
38+
1839
private final ServerAssistantAIAPI api;
1940

2041
@NotNull
2142
@Override
22-
public AiStudioChatLanguageModel provide(@NotNull ChatModelContext context) {
43+
public GoogleAiWrapper provide(@NotNull ChatModelContext context) {
2344
OptionMap options = context.options();
2445
String model = options.getString("model");
25-
//noinspection unchecked
2646
if (model.isBlank()) throw new IllegalStateException("Please set the model for Google AI Studio chat model.");
27-
return AiStudioChatLanguageModel.builder()
28-
.model(model)
47+
return new GoogleAiWrapper(GoogleAiGeminiChatModel.builder()
48+
.safetySettings(safetySettings)
49+
.modelName(model)
2950
.timeout(Duration.ofSeconds(options.getLong("timeout")))
3051
.maxOutputTokens(options.getIntegerOrDefault("max_output_tokens", i -> i == 0, null))
3152
.stopSequences(options.getList("stop").getStringList())
3253
.apiKey(api.getCredentialsRegistry().getConfigured(GoogleAiStudioAddon.NAME, GoogleAiStudioCredentialsLoader.class))
33-
.build();
54+
.build());
3455
}
3556

3657
@NotNull
@@ -58,4 +79,11 @@ public Map<String, Object> export(@NotNull ChatModelContext context) {
5879
public String getDisplayName(@Nullable ChatModelContext context) {
5980
return "Google AI Studio";
6081
}
82+
83+
public record GoogleAiWrapper(GoogleAiGeminiChatModel model) implements ChatLanguageModel {
84+
@Override
85+
public Response<AiMessage> generate(List<ChatMessage> messages) {
86+
return model.generate(UserMessage.userMessage(messages.stream().filter(m -> m instanceof SystemMessage).map(m -> (SystemMessage) m).map(SystemMessage::text).collect(Collectors.joining("\n\n\n\n"))));
87+
}
88+
}
6189
}

google-aistudio/src/main/java/dev/bluetree242/saaiaddons/aistudio/GoogleAiStudioEmbeddingProvider.java

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,10 @@
11
package dev.bluetree242.saaiaddons.aistudio;
22

3-
import dev.bluetree242.saaiaddons.aistudio.api.AiStudioEmbeddingModel;
43
import dev.bluetree242.serverassistantai.api.ServerAssistantAIAPI;
54
import dev.bluetree242.serverassistantai.api.config.option.OptionMap;
65
import dev.bluetree242.serverassistantai.api.registry.embedding.EmbeddingContext;
76
import dev.bluetree242.serverassistantai.api.registry.embedding.EmbeddingModelProvider;
7+
import dev.langchain4j.model.googleai.GoogleAiEmbeddingModel;
88
import lombok.RequiredArgsConstructor;
99
import org.jetbrains.annotations.NotNull;
1010
import org.jetbrains.annotations.Nullable;
@@ -13,17 +13,21 @@
1313
import java.util.Map;
1414

1515
@RequiredArgsConstructor
16-
public class GoogleAiStudioEmbeddingProvider implements EmbeddingModelProvider<AiStudioEmbeddingModel> {
16+
public class GoogleAiStudioEmbeddingProvider implements EmbeddingModelProvider<GoogleAiEmbeddingModel> {
1717
private final ServerAssistantAIAPI api;
1818

1919
@Override
20-
public @NotNull AiStudioEmbeddingModel provide(@NotNull EmbeddingContext context) {
20+
public @NotNull GoogleAiEmbeddingModel provide(@NotNull EmbeddingContext context) {
2121
OptionMap options = context.options();
2222
String apiKey = api.getCredentialsRegistry().getConfigured(GoogleAiStudioAddon.NAME, GoogleAiStudioCredentialsLoader.class);
2323
String model = options.getString("model");
2424
if (model.isBlank())
2525
throw new IllegalStateException("Please set the model for Google AI Studio embedding model.");
26-
return new AiStudioEmbeddingModel(apiKey, model, Duration.ofSeconds(options.getLong("timeout")));
26+
return GoogleAiEmbeddingModel.builder()
27+
.apiKey(apiKey)
28+
.modelName(model)
29+
.timeout(Duration.ofSeconds(options.getLong("timeout")))
30+
.build();
2731
}
2832

2933
@NotNull

google-aistudio/src/main/java/dev/bluetree242/saaiaddons/aistudio/api/AiStudioApi.java

Lines changed: 0 additions & 25 deletions
This file was deleted.

google-aistudio/src/main/java/dev/bluetree242/saaiaddons/aistudio/api/AiStudioChatLanguageModel.java

Lines changed: 0 additions & 113 deletions
This file was deleted.

google-aistudio/src/main/java/dev/bluetree242/saaiaddons/aistudio/api/AiStudioClient.java

Lines changed: 0 additions & 78 deletions
This file was deleted.

0 commit comments

Comments
 (0)