Skip to content

Commit 3b14912

Browse files
kumsmritmatboros
andauthored
feat(/dev): handle validation exceptions for planning and code gen (#4630)
* feat(/dev): handle validation exceptions for planning and code gen * handling exception during generate code also * Add changelog --------- Co-authored-by: Matyas Boros <[email protected]>
1 parent 0c6ebd5 commit 3b14912

File tree

4 files changed

+61
-8
lines changed

4 files changed

+61
-8
lines changed
Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
{
2+
"type" : "bugfix",
3+
"description" : "Expose Amazon Q backend validation error message"
4+
}

plugins/amazonq/chat/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonqFeatureDev/FeatureDevExceptions.kt

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,8 @@ open class FeatureDevException(override val message: String?, override val cause
1010

1111
class ContentLengthError(override val message: String, override val cause: Throwable?) : RepoSizeError, RuntimeException()
1212

13+
class ZipFileError(override val message: String, override val cause: Throwable?) : RuntimeException()
14+
1315
class PlanIterationLimitError(override val message: String, override val cause: Throwable?) : RuntimeException()
1416

1517
class CodeIterationLimitError(override val message: String, override val cause: Throwable?) : RuntimeException()

plugins/amazonq/chat/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonqFeatureDev/controller/FeatureDevController.kt

Lines changed: 45 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@ import software.aws.toolkits.jetbrains.services.amazonqFeatureDev.InboundAppMess
3434
import software.aws.toolkits.jetbrains.services.amazonqFeatureDev.ModifySourceFolderErrorReason
3535
import software.aws.toolkits.jetbrains.services.amazonqFeatureDev.MonthlyConversationLimitError
3636
import software.aws.toolkits.jetbrains.services.amazonqFeatureDev.PlanIterationLimitError
37+
import software.aws.toolkits.jetbrains.services.amazonqFeatureDev.ZipFileError
3738
import software.aws.toolkits.jetbrains.services.amazonqFeatureDev.createUserFacingErrorMessage
3839
import software.aws.toolkits.jetbrains.services.amazonqFeatureDev.messages.FeatureDevMessageType
3940
import software.aws.toolkits.jetbrains.services.amazonqFeatureDev.messages.FollowUp
@@ -282,14 +283,42 @@ class FeatureDevController(
282283
session.initCodegen(messenger)
283284
onCodeGeneration(session, "", tabId)
284285
} catch (err: Exception) {
285-
val message = createUserFacingErrorMessage(err.message)
286-
messenger.sendError(
287-
tabId = tabId,
288-
errMessage = message ?: message("amazonqFeatureDev.exception.request_failed"),
289-
retries = retriesRemaining(session),
290-
phase = session.sessionState.phase,
291-
conversationId = session.conversationIdUnsafe
292-
)
286+
logger.warn(err) { "Encountered ${err.message} for tabId: $tabId" }
287+
if (err is RepoSizeError) {
288+
messenger.sendError(
289+
tabId = tabId,
290+
errMessage = err.message,
291+
retries = retriesRemaining(session),
292+
conversationId = session.conversationIdUnsafe
293+
)
294+
messenger.sendSystemPrompt(
295+
tabId = tabId,
296+
followUp = listOf(
297+
FollowUp(
298+
pillText = message("amazonqFeatureDev.follow_up.modify_source_folder"),
299+
type = FollowUpTypes.MODIFY_DEFAULT_SOURCE_FOLDER,
300+
status = FollowUpStatusType.Info,
301+
)
302+
),
303+
)
304+
} else if (err is ZipFileError) {
305+
messenger.sendError(
306+
tabId = tabId,
307+
errMessage = err.message,
308+
retries = 0,
309+
phase = session.sessionState.phase,
310+
conversationId = session.conversationIdUnsafe
311+
)
312+
} else {
313+
val message = createUserFacingErrorMessage(err.message)
314+
messenger.sendError(
315+
tabId = tabId,
316+
errMessage = message ?: message("amazonqFeatureDev.exception.request_failed"),
317+
retries = retriesRemaining(session),
318+
phase = session.sessionState.phase,
319+
conversationId = session.conversationIdUnsafe
320+
)
321+
}
293322
}
294323
}
295324

@@ -496,6 +525,14 @@ class FeatureDevController(
496525
)
497526
),
498527
)
528+
} else if (err is ZipFileError) {
529+
messenger.sendError(
530+
tabId = tabId,
531+
errMessage = err.message,
532+
retries = 0,
533+
phase = session?.sessionState?.phase,
534+
conversationId = session?.conversationIdUnsafe
535+
)
499536
} else {
500537
val msg = createUserFacingErrorMessage("$FEATURE_NAME request failed: ${err.message ?: err.cause?.message}")
501538
messenger.sendError(

plugins/amazonq/chat/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonqFeatureDev/util/FeatureDevService.kt

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@ import software.aws.toolkits.jetbrains.services.amazonqFeatureDev.ContentLengthE
2424
import software.aws.toolkits.jetbrains.services.amazonqFeatureDev.FEATURE_NAME
2525
import software.aws.toolkits.jetbrains.services.amazonqFeatureDev.MonthlyConversationLimitError
2626
import software.aws.toolkits.jetbrains.services.amazonqFeatureDev.PlanIterationLimitError
27+
import software.aws.toolkits.jetbrains.services.amazonqFeatureDev.ZipFileError
2728
import software.aws.toolkits.jetbrains.services.amazonqFeatureDev.apiError
2829
import software.aws.toolkits.jetbrains.services.amazonqFeatureDev.clients.FeatureDevClient
2930
import software.aws.toolkits.jetbrains.services.amazonqFeatureDev.clients.GenerateTaskAssistPlanResult
@@ -34,6 +35,7 @@ import software.aws.toolkits.jetbrains.services.cwc.controller.chat.telemetry.ge
3435
import software.aws.toolkits.resources.message
3536
import software.aws.toolkits.telemetry.AmazonqTelemetry
3637
import software.aws.toolkits.telemetry.Result
38+
import software.amazon.awssdk.services.codewhispererstreaming.model.ValidationException as StreamingValidationException
3739

3840
private val logger = getLogger<FeatureDevClient>()
3941

@@ -138,6 +140,10 @@ class FeatureDevService(val proxyClient: FeatureDevClient, val project: Project)
138140
(e is ThrottlingException && e.message?.contains("limit for number of iterations on an implementation plan") == true)
139141
) {
140142
throw PlanIterationLimitError(message("amazonqFeatureDev.approach_gen.iteration_limit.error_text"), e.cause)
143+
} else if (e is StreamingValidationException && e.message?.contains("repo size is exceeding the limits") == true) {
144+
throw ContentLengthError(message("amazonqFeatureDev.content_length.error_text"), e.cause)
145+
} else if (e is StreamingValidationException && e.message?.contains("zipped file is corrupted") == true) {
146+
throw ZipFileError("The zip file is corrupted", e.cause)
141147
}
142148
}
143149
apiError(errMssg, e.cause)
@@ -181,6 +187,10 @@ class FeatureDevService(val proxyClient: FeatureDevClient, val project: Project)
181187
)
182188
) {
183189
throw CodeIterationLimitError(message("amazonqFeatureDev.code_generation.iteration_limit.error_text"), e.cause)
190+
} else if (e is ValidationException && e.message?.contains("repo size is exceeding the limits") == true) {
191+
throw ContentLengthError(message("amazonqFeatureDev.content_length.error_text"), e.cause)
192+
} else if (e is ValidationException && e.message?.contains("zipped file is corrupted") == true) {
193+
throw ZipFileError("The zip file is corrupted", e.cause)
184194
}
185195
}
186196
apiError(errMssg, e.cause)

0 commit comments

Comments
 (0)