Skip to content

Commit c71f355

Browse files
authored
Merge pull request #14 from devoxx/issue-9
Feat #9: Support for cloud based LLM's: Anthropic, OpenAI, Groq, ...
2 parents 9e7e8ee + 8ba662d commit c71f355

20 files changed

+430
-191
lines changed

build.gradle.kts

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ plugins {
55
}
66

77
group = "com.devoxx.genie"
8-
version = "0.0.5"
8+
version = "0.0.6"
99

1010
repositories {
1111
mavenCentral()
@@ -15,6 +15,9 @@ dependencies {
1515
implementation("dev.langchain4j:langchain4j:0.29.1")
1616
implementation("dev.langchain4j:langchain4j-ollama:0.29.1")
1717
implementation("dev.langchain4j:langchain4j-local-ai:0.29.1")
18+
implementation("dev.langchain4j:langchain4j-open-ai:0.29.1")
19+
implementation("dev.langchain4j:langchain4j-anthropic:0.29.1")
20+
implementation("dev.langchain4j:langchain4j-mistral-ai:0.29.1")
1821
implementation("org.commonmark:commonmark:0.22.0")
1922

2023
testImplementation("org.junit.jupiter:junit-jupiter-api:5.10.2")

src/main/java/com/devoxx/genie/DevoxxGenieClient.java

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,13 @@
11
package com.devoxx.genie;
22

3+
import com.devoxx.genie.chatmodel.anthropic.AnthropicChatModelFactory;
4+
import com.devoxx.genie.chatmodel.deepinfra.DeepInfraChatModelFactory;
35
import com.devoxx.genie.chatmodel.gpt4all.GPT4AllChatModelFactory;
6+
import com.devoxx.genie.chatmodel.groq.GroqChatModelFactory;
47
import com.devoxx.genie.chatmodel.lmstudio.LMStudioChatModelFactory;
8+
import com.devoxx.genie.chatmodel.mistral.MistralChatModelFactory;
59
import com.devoxx.genie.chatmodel.ollama.OllamaChatModelFactory;
10+
import com.devoxx.genie.chatmodel.openai.OpenAIChatModelFactory;
611
import com.devoxx.genie.model.ChatModel;
712
import com.devoxx.genie.model.enumarations.ModelProvider;
813
import com.devoxx.genie.model.ollama.OllamaModelEntryDTO;
@@ -69,10 +74,16 @@ public void setModelName(String modelName) {
6974
private ChatLanguageModel getChatLanguageModel() {
7075
log.debug("Get chat language model: {}", modelProvider);
7176
ChatModel chatModel = initChatModelSettings();
77+
SettingsState settings = SettingsState.getInstance();
7278
return switch (modelProvider) {
7379
case Ollama -> createOllamaModel(chatModel);
7480
case LMStudio -> createLmStudioModel(chatModel);
7581
case GPT4All -> createGPT4AllModel(chatModel);
82+
case OpenAI -> new OpenAIChatModelFactory(settings.getOpenAIKey(), modelName).createChatModel(chatModel);
83+
case Mistral -> new MistralChatModelFactory(settings.getMistralKey(), modelName).createChatModel(chatModel);
84+
case Anthropic -> new AnthropicChatModelFactory(settings.getAnthropicKey(), modelName).createChatModel(chatModel);
85+
case Groq -> new GroqChatModelFactory(settings.getGroqKey(), modelName).createChatModel(chatModel);
86+
case DeepInfra -> new DeepInfraChatModelFactory(settings.getDeepInfraKey(), modelName).createChatModel(chatModel);
7687
};
7788
}
7889

@@ -128,12 +139,12 @@ private void setLanguageModelName(ChatModel chatModel) {
128139
if (modelName == null) {
129140
try {
130141
OllamaModelEntryDTO[] models = new OllamaService().getModels();
131-
chatModel.name = models[0].getName();
142+
chatModel.modelName = models[0].getName();
132143
} catch (IOException e) {
133144
log.error("Failed to get Ollama models", e);
134145
}
135146
} else {
136-
chatModel.name = modelName;
147+
chatModel.modelName = modelName;
137148
}
138149
}
139150

src/main/java/com/devoxx/genie/chatmodel/ChatModelFactory.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@ default String getBaseUrlByType(ModelProvider modelProvider) {
2525
case GPT4All -> SettingsState.getInstance().getGpt4allModelUrl();
2626
case LMStudio -> SettingsState.getInstance().getLmstudioModelUrl();
2727
case Ollama -> SettingsState.getInstance().getOllamaModelUrl();
28+
default -> "na";
2829
};
2930
}
3031
}
Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
package com.devoxx.genie.chatmodel.anthropic;
2+
3+
import com.devoxx.genie.chatmodel.ChatModelFactory;
4+
import com.devoxx.genie.model.ChatModel;
5+
import dev.langchain4j.model.anthropic.AnthropicChatModel;
6+
import dev.langchain4j.model.chat.ChatLanguageModel;
7+
8+
public class AnthropicChatModelFactory implements ChatModelFactory {
9+
10+
private final String apiKey;
11+
private final String modelName;
12+
13+
public AnthropicChatModelFactory(String apiKey, String modelName) {
14+
this.apiKey = apiKey;
15+
this.modelName = modelName;
16+
}
17+
18+
@Override
19+
public ChatLanguageModel createChatModel(ChatModel chatModel) {
20+
return AnthropicChatModel.builder()
21+
.apiKey(apiKey)
22+
.modelName(modelName)
23+
.temperature(chatModel.temperature)
24+
.topP(chatModel.topP)
25+
.maxTokens(chatModel.maxTokens)
26+
.maxRetries(chatModel.maxRetries)
27+
.build();
28+
}
29+
30+
}
Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
package com.devoxx.genie.chatmodel.deepinfra;
2+
3+
import com.devoxx.genie.chatmodel.ChatModelFactory;
4+
import com.devoxx.genie.model.ChatModel;
5+
import dev.langchain4j.model.chat.ChatLanguageModel;
6+
import dev.langchain4j.model.openai.OpenAiChatModel;
7+
8+
import java.time.Duration;
9+
10+
public class DeepInfraChatModelFactory implements ChatModelFactory {
11+
12+
private final String apiKey;
13+
private final String modelName;
14+
15+
public DeepInfraChatModelFactory(String apiKey, String modelName) {
16+
this.apiKey = apiKey;
17+
this.modelName = modelName;
18+
}
19+
20+
@Override
21+
public ChatLanguageModel createChatModel(ChatModel chatModel) {
22+
return OpenAiChatModel.builder()
23+
.baseUrl("https://api.deepinfra.com/v1/openai")
24+
.apiKey(apiKey)
25+
.modelName(modelName)
26+
.maxRetries(chatModel.maxRetries)
27+
.temperature(chatModel.temperature)
28+
.maxTokens(chatModel.maxTokens)
29+
.timeout(Duration.ofSeconds(chatModel.timeout))
30+
.topP(chatModel.topP)
31+
.build();
32+
}
33+
}
Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
package com.devoxx.genie.chatmodel.groq;
2+
3+
import com.devoxx.genie.chatmodel.ChatModelFactory;
4+
import com.devoxx.genie.model.ChatModel;
5+
import dev.langchain4j.model.chat.ChatLanguageModel;
6+
import dev.langchain4j.model.openai.OpenAiChatModel;
7+
8+
import java.time.Duration;
9+
10+
public class GroqChatModelFactory implements ChatModelFactory {
11+
12+
private final String apiKey;
13+
private final String modelName;
14+
15+
public GroqChatModelFactory(String apiKey, String modelName) {
16+
this.apiKey = apiKey;
17+
this.modelName = modelName;
18+
}
19+
20+
@Override
21+
public ChatLanguageModel createChatModel(ChatModel chatModel) {
22+
return OpenAiChatModel.builder()
23+
.baseUrl("https://api.groq.com/openai/v1")
24+
.apiKey(apiKey)
25+
.modelName(modelName)
26+
.maxRetries(chatModel.maxRetries)
27+
.maxTokens(chatModel.maxTokens)
28+
.temperature(chatModel.temperature)
29+
.timeout(Duration.ofSeconds(chatModel.timeout))
30+
.topP(chatModel.topP)
31+
.build();
32+
}
33+
}
Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
package com.devoxx.genie.chatmodel.mistral;
2+
3+
import com.devoxx.genie.chatmodel.ChatModelFactory;
4+
import com.devoxx.genie.model.ChatModel;
5+
import dev.langchain4j.model.chat.ChatLanguageModel;
6+
import dev.langchain4j.model.mistralai.MistralAiChatModel;
7+
8+
import java.time.Duration;
9+
10+
public class MistralChatModelFactory implements ChatModelFactory {
11+
12+
private final String apiKey;
13+
private final String modelName;
14+
15+
public MistralChatModelFactory(String apiKey, String modelName) {
16+
this.apiKey = apiKey;
17+
this.modelName = modelName;
18+
}
19+
20+
@Override
21+
public ChatLanguageModel createChatModel(ChatModel chatModel) {
22+
return MistralAiChatModel.builder()
23+
.apiKey(apiKey)
24+
.modelName(modelName)
25+
.maxRetries(chatModel.maxRetries)
26+
.temperature(chatModel.temperature)
27+
.maxTokens(chatModel.maxTokens)
28+
.timeout(Duration.ofSeconds(chatModel.timeout))
29+
.topP(chatModel.topP)
30+
.build();
31+
}
32+
}

src/main/java/com/devoxx/genie/chatmodel/ollama/OllamaChatModelFactory.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ public class OllamaChatModelFactory implements ChatModelFactory {
1414
public ChatLanguageModel createChatModel(ChatModel chatModel) {
1515
return OllamaChatModel.builder()
1616
.baseUrl(getBaseUrlByType(ModelProvider.Ollama))
17-
.modelName(chatModel.name)
17+
.modelName(chatModel.modelName)
1818
.temperature(chatModel.temperature)
1919
.topP(chatModel.topP)
2020
.maxRetries(chatModel.maxRetries)
Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
package com.devoxx.genie.chatmodel.openai;
2+
3+
import com.devoxx.genie.chatmodel.ChatModelFactory;
4+
import com.devoxx.genie.model.ChatModel;
5+
import dev.langchain4j.model.chat.ChatLanguageModel;
6+
import dev.langchain4j.model.openai.OpenAiChatModel;
7+
8+
import java.time.Duration;
9+
10+
public class OpenAIChatModelFactory implements ChatModelFactory {
11+
12+
private final String apiKey;
13+
private final String modelName;
14+
15+
public OpenAIChatModelFactory(String apiKey, String modelName) {
16+
this.apiKey = apiKey;
17+
this.modelName = modelName;
18+
}
19+
20+
@Override
21+
public ChatLanguageModel createChatModel(ChatModel chatModel) {
22+
return OpenAiChatModel.builder()
23+
.apiKey(apiKey)
24+
.modelName(modelName)
25+
.maxRetries(chatModel.maxRetries)
26+
.temperature(chatModel.temperature)
27+
.maxTokens(chatModel.maxTokens)
28+
.timeout(Duration.ofSeconds(chatModel.timeout))
29+
.topP(chatModel.topP)
30+
.build();
31+
}
32+
}

src/main/java/com/devoxx/genie/model/ChatModel.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
public class ChatModel {
44

55
public String baseUrl;
6-
public String name; // the model name to use
6+
public String modelName; // the model name to use
77
public Double temperature = 0.7;
88
public Double topP = 0.7;
99
public int maxTokens = 2_000;

0 commit comments

Comments
 (0)