v0.1.14 Consolidated versioning to .env
This commit is contained in:
9
Makefile
9
Makefile
@@ -1,4 +1,5 @@
|
|||||||
SHELL := /bin/bash
|
SHELL := /bin/bash
|
||||||
|
include .env
|
||||||
|
|
||||||
build:
|
build:
|
||||||
docker rmi siren && docker-compose build
|
docker rmi siren && docker-compose build
|
||||||
@@ -18,3 +19,11 @@ exec:
|
|||||||
|
|
||||||
clean:
|
clean:
|
||||||
docker rmi siren
|
docker rmi siren
|
||||||
|
|
||||||
|
deploy:
|
||||||
|
@echo "Deploying application..."
|
||||||
|
@mvn clean deploy || { \
|
||||||
|
echo "Deployment failed!"; \
|
||||||
|
exit 1; \
|
||||||
|
}
|
||||||
|
@echo "Deployment successful!"
|
||||||
|
|||||||
@@ -9,7 +9,7 @@ services:
|
|||||||
dockerfile: ./Dockerfile
|
dockerfile: ./Dockerfile
|
||||||
args:
|
args:
|
||||||
- JAVA_VERSION=17
|
- JAVA_VERSION=17
|
||||||
- VERSION=0.1.13
|
- VERSION=${SIREN_VERSION}
|
||||||
volumes:
|
volumes:
|
||||||
- ./data:/app
|
- ./data:/app
|
||||||
restart: unless-stopped
|
restart: unless-stopped
|
||||||
|
|||||||
2
pom.xml
2
pom.xml
@@ -3,7 +3,7 @@
|
|||||||
<modelVersion>4.0.0</modelVersion>
|
<modelVersion>4.0.0</modelVersion>
|
||||||
<groupId>com.bensherriff</groupId>
|
<groupId>com.bensherriff</groupId>
|
||||||
<artifactId>siren</artifactId>
|
<artifactId>siren</artifactId>
|
||||||
<version>0.1.13</version>
|
<version>${env.SIREN_VERSION}</version>
|
||||||
<packaging>jar</packaging>
|
<packaging>jar</packaging>
|
||||||
|
|
||||||
<repositories>
|
<repositories>
|
||||||
|
|||||||
@@ -27,12 +27,13 @@ public class OpenAIManager {
|
|||||||
private final Settings settings;
|
private final Settings settings;
|
||||||
private final JDA jda;
|
private final JDA jda;
|
||||||
private final ScheduledExecutorService executor;
|
private final ScheduledExecutorService executor;
|
||||||
private final Map<String, List<ChatMessage>> threadMessages = new HashMap<>();
|
private final Map<String, List<ChatMessage>> threadMessages;
|
||||||
|
|
||||||
public OpenAIManager(Listener listener) {
|
public OpenAIManager(Listener listener) {
|
||||||
this.settings = listener.getSettings();
|
this.settings = listener.getSettings();
|
||||||
this.jda = listener.getJDA();
|
this.jda = listener.getJDA();
|
||||||
this.executor = listener.getExecutor();
|
this.executor = listener.getExecutor();
|
||||||
|
this.threadMessages = new HashMap<>();
|
||||||
|
|
||||||
if (settings.getOpenAISettings().getToken().isEmpty()) {
|
if (settings.getOpenAISettings().getToken().isEmpty()) {
|
||||||
LOGGER.warn("No OpenAI token; OpenAI functionality is disabled");
|
LOGGER.warn("No OpenAI token; OpenAI functionality is disabled");
|
||||||
@@ -48,106 +49,106 @@ public class OpenAIManager {
|
|||||||
* @param event The message event received
|
* @param event The message event received
|
||||||
*/
|
*/
|
||||||
public void handleEvent(MessageReceivedEvent event) {
|
public void handleEvent(MessageReceivedEvent event) {
|
||||||
String message = parseMessage(event.getMessage().getContentRaw());
|
|
||||||
long guildId = event.getGuild().getIdLong();
|
|
||||||
GuildSettings guildSettings = settings.getGuildSettings().get(guildId);
|
|
||||||
Model model = settings.getGuildSettings().get(guildId).getModel();
|
|
||||||
|
|
||||||
if (event.getAuthor().isBot()) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (message.isEmpty() || message.isBlank()) {
|
|
||||||
event.getMessage().reply("Your message is empty. Please try again").queue();
|
|
||||||
}
|
|
||||||
|
|
||||||
if (shouldReply(event)) {
|
if (shouldReply(event)) {
|
||||||
if (openAiService != null) {
|
if (openAiService != null) {
|
||||||
LOGGER.trace("Guild: <{}> User: <{}> Message: <{}>", guildId, event.getAuthor().getId(), message);
|
executor.execute(() -> sendMessage(event));
|
||||||
executor.execute(() -> {
|
|
||||||
try {
|
|
||||||
StringBuilder stringBuilder = new StringBuilder();
|
|
||||||
List<ChatMessage> chatMessages = new ArrayList<>();
|
|
||||||
ChatMessage chatMessage = createChatMessage(message, event);
|
|
||||||
|
|
||||||
// Send OpenAI Message and get response
|
|
||||||
switch (model) {
|
|
||||||
case DAVINCI_3, DAVINCI_2, CURIE_1, BABBAGE_1, ADA_1 -> {
|
|
||||||
CompletionRequest completionRequest = CompletionRequest.builder()
|
|
||||||
.model(guildSettings.getModel().getName())
|
|
||||||
.maxTokens(guildSettings.getMaxTokens())
|
|
||||||
.user(event.getAuthor().getId())
|
|
||||||
.temperature(settings.getOpenAISettings().getTemperature())
|
|
||||||
.topP(settings.getOpenAISettings().getTopP())
|
|
||||||
.frequencyPenalty(settings.getOpenAISettings().getFrequencyPenalty())
|
|
||||||
.presencePenalty(settings.getOpenAISettings().getPresencePenalty())
|
|
||||||
.prompt(message)
|
|
||||||
.build();
|
|
||||||
CompletionResult completionResult = openAiService.createCompletion(completionRequest);
|
|
||||||
completionResult.getChoices().forEach(choice -> stringBuilder.append(choice.getText().trim()));
|
|
||||||
}
|
|
||||||
case GPT_4, GPT_4_0314, GPT_4_32K, GPT_4_32K_0314, GPT_35_TURBO, GPT_35_TURBO_0301 -> {
|
|
||||||
|
|
||||||
//TODO check logic here, something is broken
|
|
||||||
// if (event.isFromThread()) {
|
|
||||||
// String channelId = event.getChannel().asThreadChannel().getId();
|
|
||||||
// // Update ThreadMessages with the new message, and add previous messages to be sent out
|
|
||||||
// if (threadMessages.containsKey(channelId)) {
|
|
||||||
// chatMessages.addAll(threadMessages.get(channelId));
|
|
||||||
// threadMessages.get(channelId).add(chatMessage);
|
|
||||||
// } else {
|
|
||||||
// threadMessages.put(channelId, List.of(chatMessage));
|
|
||||||
// }
|
|
||||||
// }
|
|
||||||
chatMessages.add(chatMessage);
|
|
||||||
|
|
||||||
ChatCompletionRequest chatCompletionRequest = ChatCompletionRequest.builder()
|
|
||||||
.model(guildSettings.getModel().getName())
|
|
||||||
.maxTokens(guildSettings.getMaxTokens())
|
|
||||||
.user(event.getAuthor().getId())
|
|
||||||
.temperature(settings.getOpenAISettings().getTemperature())
|
|
||||||
.topP(settings.getOpenAISettings().getTopP())
|
|
||||||
.frequencyPenalty(settings.getOpenAISettings().getFrequencyPenalty())
|
|
||||||
.presencePenalty(settings.getOpenAISettings().getPresencePenalty())
|
|
||||||
.messages(chatMessages)
|
|
||||||
.build();
|
|
||||||
ChatCompletionResult chatCompletionResult = openAiService.createChatCompletion(chatCompletionRequest);
|
|
||||||
chatCompletionResult.getChoices().forEach(choice -> stringBuilder.append(choice.getMessage().getContent().trim()));
|
|
||||||
}
|
|
||||||
default -> {
|
|
||||||
event.getMessage().reply("Unexpected model in settings. Please contact an administrator.").queue();
|
|
||||||
LOGGER.warn("Unexpected model in settings for guild {}: {}. Expected one of {}", guildId,
|
|
||||||
model, Arrays.toString(Model.values()));
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Respond to user
|
|
||||||
if (event.isFromThread()) {
|
|
||||||
ThreadChannel channel = event.getChannel().asThreadChannel();
|
|
||||||
channel.sendMessage(stringBuilder.toString()).queue();
|
|
||||||
} else {
|
|
||||||
String threadTitle = message;
|
|
||||||
if (message.length() > 20) {
|
|
||||||
threadTitle = message.substring(0, 20);
|
|
||||||
}
|
|
||||||
event.getMessage().createThreadChannel(threadTitle).queue(channel -> {
|
|
||||||
channel.sendMessage(stringBuilder.toString()).queue();
|
|
||||||
threadMessages.put(channel.getId(), List.of(chatMessage));
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
} catch (Exception ex) {
|
|
||||||
LOGGER.error(ex.getMessage());
|
|
||||||
event.getMessage().reply("An error occurred while processing your message. Please contact your administrator.").queue();
|
|
||||||
}
|
|
||||||
});
|
|
||||||
} else {
|
} else {
|
||||||
event.getMessage().reply("OpenAI functionality is disabled. Please contact an administrator").queue();
|
event.getMessage().reply("OpenAI functionality is disabled. Please contact an administrator").queue();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void sendMessage(MessageReceivedEvent event) {
|
||||||
|
String message = parseMessage(event.getMessage().getContentRaw());
|
||||||
|
long guildId = event.getGuild().getIdLong();
|
||||||
|
Model model = settings.getGuildSettings().get(guildId).getModel();
|
||||||
|
GuildSettings guildSettings = settings.getGuildSettings().get(guildId);
|
||||||
|
|
||||||
|
LOGGER.trace("Guild: <{}> User: <{}> Message: <{}>", guildId, event.getAuthor().getId(), message);
|
||||||
|
|
||||||
|
if (message.isEmpty() || message.isBlank()) {
|
||||||
|
event.getMessage().reply("Your message is empty. Please try again").queue();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
StringBuilder stringBuilder = new StringBuilder();
|
||||||
|
List<ChatMessage> chatMessages = new ArrayList<>();
|
||||||
|
ChatMessage chatMessage = createChatMessage(message, event);
|
||||||
|
|
||||||
|
try {
|
||||||
|
// Send OpenAI Message and get response
|
||||||
|
switch (model) {
|
||||||
|
case DAVINCI_3, DAVINCI_2, CURIE_1, BABBAGE_1, ADA_1 -> {
|
||||||
|
CompletionRequest completionRequest = CompletionRequest.builder()
|
||||||
|
.model(guildSettings.getModel().getName())
|
||||||
|
.maxTokens(guildSettings.getMaxTokens())
|
||||||
|
.user(event.getAuthor().getId())
|
||||||
|
.temperature(settings.getOpenAISettings().getTemperature())
|
||||||
|
.topP(settings.getOpenAISettings().getTopP())
|
||||||
|
.frequencyPenalty(settings.getOpenAISettings().getFrequencyPenalty())
|
||||||
|
.presencePenalty(settings.getOpenAISettings().getPresencePenalty())
|
||||||
|
.prompt(message)
|
||||||
|
.build();
|
||||||
|
CompletionResult completionResult = openAiService.createCompletion(completionRequest);
|
||||||
|
completionResult.getChoices().forEach(choice -> stringBuilder.append(choice.getText().trim()));
|
||||||
|
}
|
||||||
|
case GPT_4, GPT_4_0314, GPT_4_32K, GPT_4_32K_0314, GPT_35_TURBO, GPT_35_TURBO_0301 -> {
|
||||||
|
//TODO Handle memories properly
|
||||||
|
// if (event.isFromThread()) {
|
||||||
|
// String channelId = event.getChannel().asThreadChannel().getId();
|
||||||
|
// // Update ThreadMessages with the new message, and add previous messages to be sent out
|
||||||
|
// if (threadMessages.containsKey(channelId)) {
|
||||||
|
// threadMessages.get(channelId).add(chatMessage);
|
||||||
|
// chatMessages.addAll(threadMessages.get(channelId));
|
||||||
|
// } else {
|
||||||
|
// threadMessages.put(channelId, new ArrayList<>(Arrays.asList(chatMessage)));
|
||||||
|
// }
|
||||||
|
// }
|
||||||
|
chatMessages.add(chatMessage);
|
||||||
|
|
||||||
|
ChatCompletionRequest chatCompletionRequest = ChatCompletionRequest.builder()
|
||||||
|
.model(guildSettings.getModel().getName())
|
||||||
|
.maxTokens(guildSettings.getMaxTokens())
|
||||||
|
.user(event.getAuthor().getId())
|
||||||
|
.temperature(settings.getOpenAISettings().getTemperature())
|
||||||
|
.topP(settings.getOpenAISettings().getTopP())
|
||||||
|
.frequencyPenalty(settings.getOpenAISettings().getFrequencyPenalty())
|
||||||
|
.presencePenalty(settings.getOpenAISettings().getPresencePenalty())
|
||||||
|
.messages(chatMessages)
|
||||||
|
.build();
|
||||||
|
ChatCompletionResult chatCompletionResult = openAiService.createChatCompletion(chatCompletionRequest);
|
||||||
|
chatCompletionResult.getChoices().forEach(choice -> stringBuilder.append(choice.getMessage().getContent().trim()));
|
||||||
|
}
|
||||||
|
default -> {
|
||||||
|
event.getMessage().reply("Unexpected model in settings. Please contact an administrator.").queue();
|
||||||
|
LOGGER.warn("Unexpected model in settings for guild {}: {}. Expected one of {}", guildId,
|
||||||
|
model, Arrays.toString(Model.values()));
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Respond to user
|
||||||
|
if (event.isFromThread()) {
|
||||||
|
ThreadChannel channel = event.getChannel().asThreadChannel();
|
||||||
|
channel.sendMessage(stringBuilder.toString()).queue();
|
||||||
|
} else {
|
||||||
|
// The max discord title length is 100 characters
|
||||||
|
String threadTitle = message;
|
||||||
|
if (message.length() > 100) {
|
||||||
|
threadTitle = message.substring(0, 100);
|
||||||
|
}
|
||||||
|
event.getMessage().createThreadChannel(threadTitle).queue(channel -> {
|
||||||
|
channel.sendMessage(stringBuilder.toString()).queue();
|
||||||
|
// threadMessages.put(channel.getId(), new ArrayList<>(Arrays.asList(chatMessage)));
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
} catch (Exception ex) {
|
||||||
|
LOGGER.error("Caught exception while processing message; {}", ex.getMessage());
|
||||||
|
event.getMessage().reply("An error occurred while processing your message. Please contact your administrator.").queue();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
private ChatMessage createChatMessage(String message, MessageReceivedEvent event) {
|
private ChatMessage createChatMessage(String message, MessageReceivedEvent event) {
|
||||||
ChatMessage chatMessage = new ChatMessage();
|
ChatMessage chatMessage = new ChatMessage();
|
||||||
chatMessage.setContent(message);
|
chatMessage.setContent(message);
|
||||||
@@ -185,7 +186,7 @@ public class OpenAIManager {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
} catch (Exception ex) {
|
} catch (Exception ex) {
|
||||||
LOGGER.error(ex.getMessage());
|
LOGGER.error("Failed to determine bot reply status; {}", ex.getMessage());
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
return shouldReply;
|
return shouldReply;
|
||||||
|
|||||||
Reference in New Issue
Block a user