Skip to content

Commit 4dc770f

Browse files
authored
fix(amazonq): Add error handling of agentic chat (#5680)
1 parent da5ba25 commit 4dc770f

File tree

4 files changed

+64
-13
lines changed

4 files changed

+64
-13
lines changed

plugins/amazonq/chat/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/webview/BrowserConnector.kt

Lines changed: 31 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@ import kotlinx.coroutines.launch
2222
import org.cef.browser.CefBrowser
2323
import org.eclipse.lsp4j.Position
2424
import org.eclipse.lsp4j.Range
25+
import software.aws.toolkits.core.utils.error
2526
import software.aws.toolkits.core.utils.getLogger
2627
import software.aws.toolkits.core.utils.warn
2728
import software.aws.toolkits.jetbrains.services.amazonq.apps.AppConnection
@@ -31,7 +32,6 @@ import software.aws.toolkits.jetbrains.services.amazonq.lsp.AmazonQLspService
3132
import software.aws.toolkits.jetbrains.services.amazonq.lsp.encryption.JwtEncryptionManager
3233
import software.aws.toolkits.jetbrains.services.amazonq.lsp.flareChat.AwsServerCapabilitiesProvider
3334
import software.aws.toolkits.jetbrains.services.amazonq.lsp.flareChat.ChatCommunicationManager
34-
import software.aws.toolkits.jetbrains.services.amazonq.lsp.flareChat.ChatCommunicationManager.Companion.convertToJsonToSendToChat
3535
import software.aws.toolkits.jetbrains.services.amazonq.lsp.flareChat.getTextDocumentIdentifier
3636
import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.ButtonClickNotification
3737
import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.ButtonClickParams
@@ -424,8 +424,18 @@ class BrowserConnector(
424424
server, params ->
425425
val result = server.tabBarActions(params)
426426
result.whenComplete { params1, error ->
427-
val res = ChatCommunicationManager.convertNotificationToJsonForChat(CHAT_TAB_BAR_ACTIONS, params1)
428-
browser.postChat(res)
427+
try {
428+
if (error != null) {
429+
throw error
430+
}
431+
val res = ChatCommunicationManager.convertNotificationToJsonForChat(CHAT_TAB_BAR_ACTIONS, params1)
432+
browser.postChat(res)
433+
} catch (e: Exception) {
434+
LOG.error { "Failed to perform chat tab bar action $e" }
435+
params.tabId?.let {
436+
browser.postChat(chatCommunicationManager.getErrorUiMessage(it, e, null))
437+
}
438+
}
429439
}
430440
}
431441
}
@@ -451,7 +461,7 @@ class BrowserConnector(
451461
)
452462
)
453463

454-
val uiMessage = convertToJsonToSendToChat(
464+
val uiMessage = ChatCommunicationManager.convertToJsonToSendToChat(
455465
command = SEND_CHAT_COMMAND_PROMPT,
456466
tabId = stopResponseRequest.params.tabId,
457467
params = paramsJson.toString(),
@@ -470,15 +480,23 @@ class BrowserConnector(
470480
browser: Browser,
471481
) {
472482
result.whenComplete { value, error ->
473-
chatCommunicationManager.removePartialChatMessage(partialResultToken)
474-
val messageToChat = ChatCommunicationManager.convertToJsonToSendToChat(
475-
SEND_CHAT_COMMAND_PROMPT,
476-
tabId,
477-
encryptionManager?.decrypt(value).orEmpty(),
478-
isPartialResult = false
479-
)
480-
browser.postChat(messageToChat)
481-
chatCommunicationManager.removeInflightRequestForTab(tabId)
483+
try {
484+
if (error != null) {
485+
throw error
486+
}
487+
chatCommunicationManager.removePartialChatMessage(partialResultToken)
488+
val messageToChat = ChatCommunicationManager.convertToJsonToSendToChat(
489+
SEND_CHAT_COMMAND_PROMPT,
490+
tabId,
491+
encryptionManager?.decrypt(value).orEmpty(),
492+
isPartialResult = false
493+
)
494+
browser.postChat(messageToChat)
495+
chatCommunicationManager.removeInflightRequestForTab(tabId)
496+
} catch (e: Exception) {
497+
LOG.error { "Failed to send chat message $e" }
498+
browser.postChat(chatCommunicationManager.getErrorUiMessage(tabId, e, partialResultToken))
499+
}
482500
}
483501
}
484502

plugins/amazonq/shared/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/lsp/flareChat/ChatCommunicationManager.kt

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,8 @@ import com.intellij.openapi.project.Project
1010
import org.eclipse.lsp4j.ProgressParams
1111
import software.aws.toolkits.jetbrains.services.amazonq.lsp.AmazonQLspService
1212
import software.aws.toolkits.jetbrains.services.amazonq.lsp.flareChat.ProgressNotificationUtils.getObject
13+
import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.CHAT_ERROR_PARAMS
14+
import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.ErrorParams
1315
import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.GetSerializedChatResult
1416
import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.OpenTabResult
1517
import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.SEND_CHAT_COMMAND_PROMPT
@@ -70,6 +72,25 @@ class ChatCommunicationManager {
7072
}
7173
}
7274

75+
fun getErrorUiMessage(tabId: String, exception: Exception, token: String?): String {
76+
token?.let {
77+
removePartialChatMessage(it)
78+
}
79+
val errorTitle = "An error occurred while processing your request."
80+
val errorMessage = "Details: ${exception.message}"
81+
val errorParams = Gson().toJson(ErrorParams(tabId, null, errorMessage, errorTitle)).toString()
82+
val isPartialResult = false
83+
val uiMessage = """
84+
{
85+
"command":"$CHAT_ERROR_PARAMS",
86+
"tabId": "$tabId",
87+
"params": $errorParams,
88+
"isPartialResult": $isPartialResult
89+
}
90+
""".trimIndent()
91+
return uiMessage
92+
}
93+
7394
companion object {
7495
fun getInstance(project: Project) = project.service<ChatCommunicationManager>()
7596

Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
// Copyright 2025 Amazon.com, Inc. or its affiliates. All Rights Reserved.
2+
// SPDX-License-Identifier: Apache-2.0
3+
4+
package software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat
5+
6+
data class ErrorParams(
7+
val tabId: String,
8+
val triggerType: String?,
9+
val message: String,
10+
val title: String,
11+
)

plugins/amazonq/shared/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/lsp/model/aws/chat/FlareChatCommands.kt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,4 +32,5 @@ const val CHAT_CREATE_PROMPT = "aws/chat/createPrompt"
3232
const val SHOW_SAVE_FILE_DIALOG_REQUEST_METHOD = "aws/showSaveFileDialog"
3333
const val GET_SERIALIZED_CHAT_REQUEST_METHOD = "aws/chat/getSerializedChat"
3434
const val OPEN_FILE_DIFF = "aws/openFileDiff"
35+
const val CHAT_ERROR_PARAMS = "errorMessage"
3536
const val STOP_CHAT_RESPONSE = "stopChatResponse"

0 commit comments

Comments
 (0)