From b35daaae8862e6818eb91cec16b4c00c99ca7644 Mon Sep 17 00:00:00 2001 From: Carl-Robert Linnupuu Date: Thu, 28 Sep 2023 17:08:31 +0300 Subject: [PATCH] Fix error logging and add more telemetry actions --- .../codegpt.java-conventions.gradle.kts | 2 +- .../{completions => }/TelemetryAction.java | 4 +- .../codegpt/actions/ActionType.java | 11 +++++ .../toolwindow/ClearChatWindowAction.java | 10 ++++- .../CreateNewConversationAction.java | 16 +++++--- .../DeleteAllConversationsAction.java | 5 ++- .../toolwindow/DeleteConversationAction.java | 5 ++- .../toolwindow/OpenInEditorAction.java | 40 ++++++++++++------- .../completions/CompletionRequestHandler.java | 7 ++-- .../chat/BaseChatToolWindowTabPanel.java | 7 +++- 10 files changed, 75 insertions(+), 32 deletions(-) rename src/main/java/ee/carlrobert/codegpt/{completions => }/TelemetryAction.java (84%) create mode 100644 src/main/java/ee/carlrobert/codegpt/actions/ActionType.java diff --git a/buildSrc/src/main/kotlin/codegpt.java-conventions.gradle.kts b/buildSrc/src/main/kotlin/codegpt.java-conventions.gradle.kts index 29d6ad2d..8c67a22f 100644 --- a/buildSrc/src/main/kotlin/codegpt.java-conventions.gradle.kts +++ b/buildSrc/src/main/kotlin/codegpt.java-conventions.gradle.kts @@ -18,7 +18,7 @@ intellij { } dependencies { - implementation("ee.carlrobert:llm-client:0.0.3") + implementation("ee.carlrobert:llm-client:0.0.4") } tasks { diff --git a/src/main/java/ee/carlrobert/codegpt/completions/TelemetryAction.java b/src/main/java/ee/carlrobert/codegpt/TelemetryAction.java similarity index 84% rename from src/main/java/ee/carlrobert/codegpt/completions/TelemetryAction.java rename to src/main/java/ee/carlrobert/codegpt/TelemetryAction.java index 275ef175..5eed80e2 100644 --- a/src/main/java/ee/carlrobert/codegpt/completions/TelemetryAction.java +++ b/src/main/java/ee/carlrobert/codegpt/TelemetryAction.java @@ -1,11 +1,11 @@ -package ee.carlrobert.codegpt.completions; +package ee.carlrobert.codegpt; -import ee.carlrobert.codegpt.TelemetryService; import ee.carlrobert.codegpt.telemetry.core.service.TelemetryMessageBuilder.ActionMessage; public enum TelemetryAction { COMPLETION("CodeGPT-Completion"), + COMPLETION_ERROR("CodeGPT-Completion-Error"), IDE_ACTION("CodeGPT-Action"); private final String code; diff --git a/src/main/java/ee/carlrobert/codegpt/actions/ActionType.java b/src/main/java/ee/carlrobert/codegpt/actions/ActionType.java new file mode 100644 index 00000000..3f6e5b01 --- /dev/null +++ b/src/main/java/ee/carlrobert/codegpt/actions/ActionType.java @@ -0,0 +1,11 @@ +package ee.carlrobert.codegpt.actions; + +public enum ActionType { + + CLEAR_CHAT_WINDOW, + CREATE_NEW_CHAT, + DELETE_ALL_CONVERSATIONS, + DELETE_CONVERSATION, + OPEN_CONVERSATION_IN_EDITOR, + RELOAD_MESSAGE +} diff --git a/src/main/java/ee/carlrobert/codegpt/actions/toolwindow/ClearChatWindowAction.java b/src/main/java/ee/carlrobert/codegpt/actions/toolwindow/ClearChatWindowAction.java index 1fb0efb5..a946a239 100644 --- a/src/main/java/ee/carlrobert/codegpt/actions/toolwindow/ClearChatWindowAction.java +++ b/src/main/java/ee/carlrobert/codegpt/actions/toolwindow/ClearChatWindowAction.java @@ -3,7 +3,9 @@ package ee.carlrobert.codegpt.actions.toolwindow; import com.intellij.icons.AllIcons; import com.intellij.openapi.actionSystem.AnAction; import com.intellij.openapi.actionSystem.AnActionEvent; +import ee.carlrobert.codegpt.actions.ActionType; import ee.carlrobert.codegpt.actions.editor.EditorActionsUtil; +import ee.carlrobert.codegpt.TelemetryAction; import ee.carlrobert.codegpt.conversations.ConversationsState; import org.jetbrains.annotations.NotNull; @@ -27,6 +29,12 @@ public class ClearChatWindowAction extends AnAction { @Override public void actionPerformed(@NotNull AnActionEvent event) { - onActionPerformed.run(); + try { + onActionPerformed.run(); + } finally { + TelemetryAction.createActionMessage(TelemetryAction.IDE_ACTION) + .property("action", ActionType.CLEAR_CHAT_WINDOW.name()) + .send(); + } } } \ No newline at end of file diff --git a/src/main/java/ee/carlrobert/codegpt/actions/toolwindow/CreateNewConversationAction.java b/src/main/java/ee/carlrobert/codegpt/actions/toolwindow/CreateNewConversationAction.java index 95a3866e..9ca36ca8 100644 --- a/src/main/java/ee/carlrobert/codegpt/actions/toolwindow/CreateNewConversationAction.java +++ b/src/main/java/ee/carlrobert/codegpt/actions/toolwindow/CreateNewConversationAction.java @@ -1,11 +1,11 @@ package ee.carlrobert.codegpt.actions.toolwindow; import com.intellij.icons.AllIcons; -import com.intellij.openapi.actionSystem.ActionManager; import com.intellij.openapi.actionSystem.AnAction; import com.intellij.openapi.actionSystem.AnActionEvent; -import com.intellij.openapi.extensions.PluginId; +import ee.carlrobert.codegpt.actions.ActionType; import ee.carlrobert.codegpt.actions.editor.EditorActionsUtil; +import ee.carlrobert.codegpt.TelemetryAction; import org.jetbrains.annotations.NotNull; public class CreateNewConversationAction extends AnAction { @@ -20,9 +20,15 @@ public class CreateNewConversationAction extends AnAction { @Override public void actionPerformed(@NotNull AnActionEvent event) { - var project = event.getProject(); - if (project != null) { - onCreate.run(); + try { + var project = event.getProject(); + if (project != null) { + onCreate.run(); + } + } finally { + TelemetryAction.createActionMessage(TelemetryAction.IDE_ACTION) + .property("action", ActionType.CREATE_NEW_CHAT.name()) + .send(); } } } diff --git a/src/main/java/ee/carlrobert/codegpt/actions/toolwindow/DeleteAllConversationsAction.java b/src/main/java/ee/carlrobert/codegpt/actions/toolwindow/DeleteAllConversationsAction.java index 6a5c75eb..36925a37 100644 --- a/src/main/java/ee/carlrobert/codegpt/actions/toolwindow/DeleteAllConversationsAction.java +++ b/src/main/java/ee/carlrobert/codegpt/actions/toolwindow/DeleteAllConversationsAction.java @@ -6,8 +6,9 @@ import com.intellij.icons.AllIcons; import com.intellij.openapi.actionSystem.AnAction; import com.intellij.openapi.actionSystem.AnActionEvent; import com.intellij.openapi.ui.Messages; +import ee.carlrobert.codegpt.actions.ActionType; import ee.carlrobert.codegpt.actions.editor.EditorActionsUtil; -import ee.carlrobert.codegpt.completions.TelemetryAction; +import ee.carlrobert.codegpt.TelemetryAction; import ee.carlrobert.codegpt.conversations.ConversationService; import ee.carlrobert.codegpt.toolwindow.chat.standard.StandardChatToolWindowContentManager; import org.jetbrains.annotations.NotNull; @@ -45,7 +46,7 @@ public class DeleteAllConversationsAction extends AnAction { project.getService(StandardChatToolWindowContentManager.class).resetActiveTab(); } finally { TelemetryAction.createActionMessage(TelemetryAction.IDE_ACTION) - .property("action", "DELETE_ALL_CONVERSATIONS") + .property("action", ActionType.DELETE_ALL_CONVERSATIONS.name()) .send(); } } diff --git a/src/main/java/ee/carlrobert/codegpt/actions/toolwindow/DeleteConversationAction.java b/src/main/java/ee/carlrobert/codegpt/actions/toolwindow/DeleteConversationAction.java index 3c76ef76..aa10958d 100644 --- a/src/main/java/ee/carlrobert/codegpt/actions/toolwindow/DeleteConversationAction.java +++ b/src/main/java/ee/carlrobert/codegpt/actions/toolwindow/DeleteConversationAction.java @@ -4,8 +4,9 @@ import com.intellij.icons.AllIcons; import com.intellij.openapi.actionSystem.AnAction; import com.intellij.openapi.actionSystem.AnActionEvent; import com.intellij.openapi.ui.Messages; +import ee.carlrobert.codegpt.actions.ActionType; import ee.carlrobert.codegpt.actions.editor.EditorActionsUtil; -import ee.carlrobert.codegpt.completions.TelemetryAction; +import ee.carlrobert.codegpt.TelemetryAction; import ee.carlrobert.codegpt.conversations.ConversationService; import ee.carlrobert.codegpt.conversations.ConversationsState; import ee.carlrobert.codegpt.util.OverlayUtils; @@ -32,7 +33,7 @@ public class DeleteConversationAction extends AnAction { var project = event.getProject(); if (project != null) { TelemetryAction.createActionMessage(TelemetryAction.IDE_ACTION) - .property("action", "DELETE_CONVERSATION") + .property("action", ActionType.DELETE_CONVERSATION.name()) .send(); ConversationService.getInstance().deleteSelectedConversation(); diff --git a/src/main/java/ee/carlrobert/codegpt/actions/toolwindow/OpenInEditorAction.java b/src/main/java/ee/carlrobert/codegpt/actions/toolwindow/OpenInEditorAction.java index 4fe4476c..96bc8a1c 100644 --- a/src/main/java/ee/carlrobert/codegpt/actions/toolwindow/OpenInEditorAction.java +++ b/src/main/java/ee/carlrobert/codegpt/actions/toolwindow/OpenInEditorAction.java @@ -9,8 +9,9 @@ import com.intellij.openapi.fileEditor.FileEditorManager; import com.intellij.openapi.vfs.VirtualFile; import com.intellij.openapi.wm.ToolWindowManager; import com.intellij.testFramework.LightVirtualFile; -import ee.carlrobert.codegpt.TelemetryService; +import ee.carlrobert.codegpt.actions.ActionType; import ee.carlrobert.codegpt.actions.editor.EditorActionsUtil; +import ee.carlrobert.codegpt.TelemetryAction; import ee.carlrobert.codegpt.conversations.ConversationsState; import java.time.format.DateTimeFormatter; import java.util.stream.Collectors; @@ -33,20 +34,29 @@ public class OpenInEditorAction extends AnAction { @Override public void actionPerformed(@NotNull AnActionEvent e) { - var project = e.getProject(); - var currentConversation = ConversationsState.getCurrentConversation(); - if (project != null && currentConversation != null) { - var dateTimeStamp = currentConversation.getUpdatedOn().format(DateTimeFormatter.ofPattern("yyyyMMddHHmm")); - var fileName = String.format("%s_%s.md", currentConversation.getModel(), dateTimeStamp); - var fileContent = currentConversation - .getMessages() - .stream() - .map(it -> String.format("### User:\n%s\n### ChatGPT:\n%s\n", it.getPrompt(), it.getResponse())) - .collect(Collectors.joining()); - VirtualFile file = new LightVirtualFile(fileName, fileContent); - FileEditorManager.getInstance(project).openFile(file, true); - var toolWindow = requireNonNull(ToolWindowManager.getInstance(project).getToolWindow("CodeGPT")); - toolWindow.hide(); + try { + var project = e.getProject(); + var currentConversation = ConversationsState.getCurrentConversation(); + if (project != null && currentConversation != null) { + var dateTimeStamp = currentConversation.getUpdatedOn() + .format(DateTimeFormatter.ofPattern("yyyyMMddHHmm")); + var fileName = String.format("%s_%s.md", currentConversation.getModel(), dateTimeStamp); + var fileContent = currentConversation + .getMessages() + .stream() + .map(it -> String.format("### User:\n%s\n### ChatGPT:\n%s\n", it.getPrompt(), + it.getResponse())) + .collect(Collectors.joining()); + VirtualFile file = new LightVirtualFile(fileName, fileContent); + FileEditorManager.getInstance(project).openFile(file, true); + var toolWindow = requireNonNull( + ToolWindowManager.getInstance(project).getToolWindow("CodeGPT")); + toolWindow.hide(); + } + } finally { + TelemetryAction.createActionMessage(TelemetryAction.IDE_ACTION) + .property("action", ActionType.OPEN_CONVERSATION_IN_EDITOR.name()) + .send(); } } } diff --git a/src/main/java/ee/carlrobert/codegpt/completions/CompletionRequestHandler.java b/src/main/java/ee/carlrobert/codegpt/completions/CompletionRequestHandler.java index d4580b99..39a7fe1d 100644 --- a/src/main/java/ee/carlrobert/codegpt/completions/CompletionRequestHandler.java +++ b/src/main/java/ee/carlrobert/codegpt/completions/CompletionRequestHandler.java @@ -1,6 +1,6 @@ package ee.carlrobert.codegpt.completions; -import ee.carlrobert.codegpt.TelemetryService; +import ee.carlrobert.codegpt.TelemetryAction; import ee.carlrobert.codegpt.conversations.Conversation; import ee.carlrobert.codegpt.conversations.message.Message; import ee.carlrobert.codegpt.settings.state.AzureSettingsState; @@ -230,9 +230,10 @@ public class CompletionRequestHandler { } private void sendError(ErrorDetails error, Throwable ex) { - TelemetryAction.createActionMessage(TelemetryAction.COMPLETION) + TelemetryAction.createActionMessage(TelemetryAction.COMPLETION_ERROR) .property("conversationId", conversation.getId().toString()) - .error(new RuntimeException("Received an error during completion.\n" + error, ex)) + .property("model", conversation.getModel()) + .error(new RuntimeException(error.toString(), ex)) .send(); } } diff --git a/src/main/java/ee/carlrobert/codegpt/toolwindow/chat/BaseChatToolWindowTabPanel.java b/src/main/java/ee/carlrobert/codegpt/toolwindow/chat/BaseChatToolWindowTabPanel.java index 13a7ff89..98327f3e 100644 --- a/src/main/java/ee/carlrobert/codegpt/toolwindow/chat/BaseChatToolWindowTabPanel.java +++ b/src/main/java/ee/carlrobert/codegpt/toolwindow/chat/BaseChatToolWindowTabPanel.java @@ -11,10 +11,11 @@ import com.intellij.openapi.roots.ui.componentsList.components.ScrollablePanel; import com.intellij.ui.JBColor; import com.intellij.ui.components.JBScrollPane; import com.intellij.util.ui.JBUI; +import ee.carlrobert.codegpt.actions.ActionType; import ee.carlrobert.codegpt.TelemetryService; import ee.carlrobert.codegpt.completions.CompletionRequestHandler; import ee.carlrobert.codegpt.completions.SerpResult; -import ee.carlrobert.codegpt.completions.TelemetryAction; +import ee.carlrobert.codegpt.TelemetryAction; import ee.carlrobert.codegpt.conversations.Conversation; import ee.carlrobert.codegpt.conversations.ConversationService; import ee.carlrobert.codegpt.conversations.message.Message; @@ -235,6 +236,10 @@ public abstract class BaseChatToolWindowTabPanel implements ChatToolWindowTabPan conversationService.saveMessage(conversation, message); call(conversation, message, responsePanel, true); } + + TelemetryAction.createActionMessage(TelemetryAction.IDE_ACTION) + .property("action", ActionType.RELOAD_MESSAGE.name()) + .send(); } }