Skip to content

Commit a388c87

Browse files
committed
Restore prompt tests
1 parent be3f35a commit a388c87

34 files changed

+2699
-45
lines changed

README.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -72,6 +72,7 @@ With Claude 3.7 Sonnet, DevoxxGenie isn't just another developer tool... it's a
7272

7373
### 🗂️ Model Context Protocol servers support (from v0.5.0 onwards)
7474

75+
Initial support for Model Context Protocol (MCP) server tools.
7576

7677

7778
### 🗂️ DEVOXXGENIE.md (from v0.5.0 onwards)

core/README.md

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
## TODO
2+
We'll refactor this module to devoxxgenie-core and update it with the newest model java files
3+
See also https://github.com/devoxx/DevoxxGenieIDEAPlugin/issues/564

src/main/java/com/devoxx/genie/chatmodel/cloud/bedrock/BedrockModelFactory.java

Lines changed: 63 additions & 43 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,9 @@
55
import com.devoxx.genie.model.LanguageModel;
66
import com.devoxx.genie.model.enumarations.ModelProvider;
77
import com.devoxx.genie.ui.settings.DevoxxGenieStateService;
8-
import dev.langchain4j.model.bedrock.*;
8+
import dev.langchain4j.model.bedrock.BedrockChatModel;
9+
import dev.langchain4j.model.chat.request.ChatRequestParameters;
10+
import software.amazon.awssdk.services.bedrockruntime.BedrockRuntimeClient;
911
import dev.langchain4j.model.chat.ChatLanguageModel;
1012
import org.apache.commons.lang3.NotImplementedException;
1113
import org.jetbrains.annotations.NotNull;
@@ -65,68 +67,86 @@ public ChatLanguageModel createChatModel(ChatModel chatModel) {
6567
* @return An instance of {@link ChatLanguageModel} configured for Anthropic models.
6668
*/
6769
private ChatLanguageModel createAnthropicChatModel(@NotNull ChatModel chatModel) {
68-
// TODO Refactor the deprecated class and use the new one
69-
return BedrockAnthropicMessageChatModel.builder()
70-
.model(chatModel.getModelName())
71-
.temperature(chatModel.getTemperature())
72-
.maxTokens(chatModel.getMaxTokens())
73-
.credentialsProvider(getCredentialsProvider())
74-
.region(getRegion())
70+
return BedrockChatModel.builder()
71+
.modelId(chatModel.getModelName())
72+
.client(BedrockRuntimeClient.builder()
73+
.region(getRegion())
74+
.credentialsProvider(getCredentialsProvider())
75+
.build())
76+
.defaultRequestParameters(ChatRequestParameters.builder()
77+
.temperature(chatModel.getTemperature())
78+
.maxOutputTokens(chatModel.getMaxTokens())
79+
.build())
7580
.build();
7681
}
7782

7883
private ChatLanguageModel createMistralChatModel(@NotNull ChatModel chatModel) {
79-
// TODO Refactor the deprecated class and use the new one
80-
return BedrockMistralAiChatModel.builder()
81-
.model(chatModel.getModelName())
82-
.temperature(chatModel.getTemperature())
83-
.maxTokens(chatModel.getMaxTokens())
84-
.credentialsProvider(getCredentialsProvider())
85-
.region(getRegion())
84+
return BedrockChatModel.builder()
85+
.modelId(chatModel.getModelName())
86+
.client(BedrockRuntimeClient.builder()
87+
.region(getRegion())
88+
.credentialsProvider(getCredentialsProvider())
89+
.build())
90+
.defaultRequestParameters(ChatRequestParameters.builder()
91+
.temperature(chatModel.getTemperature())
92+
.maxOutputTokens(chatModel.getMaxTokens())
93+
.build())
8694
.build();
8795
}
8896

8997
private ChatLanguageModel createCohereChatModel(@NotNull ChatModel chatModel) {
90-
// TODO Refactor the deprecated class and use the new one
91-
return BedrockCohereChatModel.builder()
92-
.model(chatModel.getModelName())
93-
.temperature(chatModel.getTemperature())
94-
.maxTokens(chatModel.getMaxTokens())
95-
.credentialsProvider(getCredentialsProvider())
96-
.region(getRegion())
98+
return BedrockChatModel.builder()
99+
.modelId(chatModel.getModelName())
100+
.client(BedrockRuntimeClient.builder()
101+
.region(getRegion())
102+
.credentialsProvider(getCredentialsProvider())
103+
.build())
104+
.defaultRequestParameters(ChatRequestParameters.builder()
105+
.temperature(chatModel.getTemperature())
106+
.maxOutputTokens(chatModel.getMaxTokens())
107+
.build())
97108
.build();
98109
}
99110

100111
private ChatLanguageModel createLamaChatModel(@NotNull ChatModel chatModel) {
101-
// TODO Refactor the deprecated class and use the new one
102-
return BedrockLlamaChatModel.builder()
103-
.model(chatModel.getModelName())
104-
.temperature(chatModel.getTemperature())
105-
.maxTokens(chatModel.getMaxTokens())
106-
.credentialsProvider(getCredentialsProvider())
107-
.region(getRegion())
112+
return BedrockChatModel.builder()
113+
.modelId(chatModel.getModelName())
114+
.client(BedrockRuntimeClient.builder()
115+
.region(getRegion())
116+
.credentialsProvider(getCredentialsProvider())
117+
.build())
118+
.defaultRequestParameters(ChatRequestParameters.builder()
119+
.temperature(chatModel.getTemperature())
120+
.maxOutputTokens(chatModel.getMaxTokens())
121+
.build())
108122
.build();
109123
}
110124

111125
private ChatLanguageModel createAI21ChatModel(@NotNull ChatModel chatModel) {
112-
// TODO Refactor the deprecated class and use the new one
113-
return BedrockAI21LabsChatModel.builder()
114-
.model(chatModel.getModelName())
115-
.temperature(chatModel.getTemperature())
116-
.maxTokens(chatModel.getMaxTokens())
117-
.credentialsProvider(getCredentialsProvider())
118-
.region(getRegion())
126+
return BedrockChatModel.builder()
127+
.modelId(chatModel.getModelName())
128+
.client(BedrockRuntimeClient.builder()
129+
.region(getRegion())
130+
.credentialsProvider(getCredentialsProvider())
131+
.build())
132+
.defaultRequestParameters(ChatRequestParameters.builder()
133+
.temperature(chatModel.getTemperature())
134+
.maxOutputTokens(chatModel.getMaxTokens())
135+
.build())
119136
.build();
120137
}
121138

122139
private ChatLanguageModel createStabilityChatModel(@NotNull ChatModel chatModel) {
123-
// TODO Refactor the deprecated class and use the new one
124-
return BedrockStabilityAIChatModel.builder()
125-
.model(chatModel.getModelName())
126-
.temperature(chatModel.getTemperature())
127-
.maxTokens(chatModel.getMaxTokens())
128-
.credentialsProvider(getCredentialsProvider())
129-
.region(getRegion())
140+
return BedrockChatModel.builder()
141+
.modelId(chatModel.getModelName())
142+
.client(BedrockRuntimeClient.builder()
143+
.region(getRegion())
144+
.credentialsProvider(getCredentialsProvider())
145+
.build())
146+
.defaultRequestParameters(ChatRequestParameters.builder()
147+
.temperature(chatModel.getTemperature())
148+
.maxOutputTokens(chatModel.getMaxTokens())
149+
.build())
130150
.build();
131151
}
132152

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
package com.devoxx.genie.model;
2+
3+
import lombok.AllArgsConstructor;
4+
import lombok.Getter;
5+
import lombok.NoArgsConstructor;
6+
import lombok.Setter;
7+
8+
@NoArgsConstructor
9+
@AllArgsConstructor
10+
@Getter
11+
@Setter
12+
public class CustomPrompt {
13+
private String name;
14+
private String prompt;
15+
}
Lines changed: 97 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,97 @@
1+
package com.devoxx.genie.model;
2+
3+
import com.devoxx.genie.model.enumarations.ModelProvider;
4+
5+
import lombok.AllArgsConstructor;
6+
import lombok.Builder;
7+
import lombok.Data;
8+
import lombok.NoArgsConstructor;
9+
10+
import org.jetbrains.annotations.NotNull;
11+
12+
import java.util.Comparator;
13+
14+
@Data
15+
@Builder
16+
@NoArgsConstructor
17+
@AllArgsConstructor
18+
public class LanguageModel implements Comparable<LanguageModel> {
19+
20+
private ModelProvider provider;
21+
private String modelName;
22+
private String displayName;
23+
private boolean apiKeyUsed;
24+
private double inputCost;
25+
private double outputCost;
26+
private int inputMaxTokens;
27+
private int outputMaxTokens;
28+
29+
@Override
30+
public String toString() {
31+
return displayName;
32+
}
33+
34+
@Override
35+
public int compareTo(@NotNull LanguageModel other) {
36+
return new ModelVersionComparator().compare(this.displayName, other.displayName);
37+
}
38+
39+
private static class ModelVersionComparator implements Comparator<String> {
40+
@Override
41+
public int compare(String v1, String v2) {
42+
String[] parts1 = v1.split(" ");
43+
String[] parts2 = v2.split(" ");
44+
45+
// Compare model names
46+
int modelNameCompare = parts1[0].compareTo(parts2[0]);
47+
if (modelNameCompare != 0) return modelNameCompare;
48+
49+
// Extract version strings
50+
String version1 = parts1.length > 1 ? parts1[1] : "";
51+
String version2 = parts2.length > 1 ? parts2[1] : "";
52+
53+
// Handle special versions (Sonnet, Haiku, Opus)
54+
if (isSpecialVersion(version1) || isSpecialVersion(version2)) {
55+
return compareSpecialVersions(version1, version2);
56+
}
57+
58+
// Compare version strings
59+
return compareVersions(version1, version2);
60+
}
61+
62+
private boolean isSpecialVersion(@NotNull String version) {
63+
return version.equals("Sonnet") || version.equals("Haiku") || version.equals("Opus");
64+
}
65+
66+
private int compareSpecialVersions(@NotNull String v1, String v2) {
67+
if (v1.equals(v2)) return 0;
68+
if (v1.equals("Opus")) return 1;
69+
if (v2.equals("Opus")) return -1;
70+
if (v1.equals("Sonnet")) return 1;
71+
if (v2.equals("Sonnet")) return -1;
72+
return v1.compareTo(v2);
73+
}
74+
75+
private int compareVersions(@NotNull String v1, @NotNull String v2) {
76+
String[] parts1 = v1.split("[^a-zA-Z0-9]+");
77+
String[] parts2 = v2.split("[^a-zA-Z0-9]+");
78+
79+
for (int i = 0; i < Math.max(parts1.length, parts2.length); i++) {
80+
String part1 = i < parts1.length ? parts1[i] : "";
81+
String part2 = i < parts2.length ? parts2[i] : "";
82+
83+
int cmp = compareAlphanumeric(part1, part2);
84+
if (cmp != 0) return cmp;
85+
}
86+
87+
return 0;
88+
}
89+
90+
private int compareAlphanumeric(@NotNull String s1, String s2) {
91+
if (s1.matches("\\d+") && s2.matches("\\d+")) {
92+
return Integer.compare(Integer.parseInt(s1), Integer.parseInt(s2));
93+
}
94+
return s1.compareTo(s2);
95+
}
96+
}
97+
}
Lines changed: 63 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,63 @@
1+
package com.devoxx.genie.model.enumarations;
2+
3+
import lombok.Getter;
4+
import org.jetbrains.annotations.NotNull;
5+
6+
import java.util.Arrays;
7+
import java.util.List;
8+
9+
@Getter
10+
public enum ModelProvider {
11+
CustomOpenAI("CustomOpenAI", Type.LOCAL),
12+
GPT4All("GPT4All", Type.LOCAL),
13+
Jan("Jan", Type.LOCAL),
14+
LLaMA("LLaMA.c++", Type.LOCAL),
15+
LMStudio("LMStudio", Type.LOCAL),
16+
Ollama("Ollama", Type.LOCAL),
17+
18+
OpenAI("OpenAI", Type.CLOUD),
19+
Anthropic("Anthropic", Type.CLOUD),
20+
Mistral("Mistral", Type.CLOUD),
21+
Groq("Groq", Type.CLOUD),
22+
DeepInfra("DeepInfra", Type.CLOUD),
23+
Google("Google", Type.CLOUD),
24+
OpenRouter("OpenRouter", Type.CLOUD),
25+
DeepSeek("DeepSeek", Type.CLOUD),
26+
27+
AzureOpenAI("AzureOpenAI", Type.OPTIONAL),
28+
Bedrock("Bedrock", Type.OPTIONAL);
29+
30+
public enum Type {
31+
LOCAL, // Local Providers
32+
CLOUD, // Cloud Providers
33+
OPTIONAL // Optional Providers(Need to be enabled from settings, due to inconvenient setup)
34+
}
35+
36+
private final String name;
37+
private final Type type;
38+
39+
ModelProvider(String name, Type type) {
40+
this.name = name;
41+
this.type = type;
42+
}
43+
44+
@Override
45+
public String toString() {
46+
return name;
47+
}
48+
49+
public static @NotNull ModelProvider fromString(String text) {
50+
for (ModelProvider provider : ModelProvider.values()) {
51+
if (provider.name.equalsIgnoreCase(text)) {
52+
return provider;
53+
}
54+
}
55+
throw new IllegalArgumentException("No constant with text " + text + " found");
56+
}
57+
58+
public static List<ModelProvider> fromType(Type type) {
59+
return Arrays.stream(ModelProvider.values())
60+
.filter(provider -> provider.type == type)
61+
.toList();
62+
}
63+
}
Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
package com.devoxx.genie.model.gpt4all;
2+
3+
import com.fasterxml.jackson.annotation.JsonProperty;
4+
import lombok.Getter;
5+
import lombok.Setter;
6+
7+
import java.util.List;
8+
9+
@Getter
10+
@Setter
11+
public class Model {
12+
@JsonProperty("created")
13+
private long created;
14+
15+
@JsonProperty("id")
16+
private String id;
17+
18+
@JsonProperty("object")
19+
private String object;
20+
21+
@JsonProperty("owned_by")
22+
private String ownedBy;
23+
24+
@JsonProperty("parent")
25+
private String parent;
26+
27+
@JsonProperty("permissions")
28+
private List<ModelPermission> permissions;
29+
30+
@JsonProperty("root")
31+
private String root;
32+
}

0 commit comments

Comments
 (0)