Skip to content

Commit 081971e

Browse files
authored
feat: Added handling for iteration limit exceeded exceptions for approach and code gen in featureDev (#1840)
1 parent 313245a commit 081971e

File tree

4 files changed

+53
-0
lines changed

4 files changed

+53
-0
lines changed

plugins/toolkit/jetbrains-core/src/software/aws/toolkits/jetbrains/services/amazonqFeatureDev/FeatureDevExceptions.kt

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

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

12+
class PlanIterationLimitError(override val message: String, override val cause: Throwable?) : RuntimeException()
13+
14+
class CodeIterationLimitError(override val message: String, override val cause: Throwable?) : RuntimeException()
15+
1216
internal fun codeGenerationFailedError(): Nothing =
1317
throw FeatureDevException(message("amazonqFeatureDev.code_generation.failed_generation"))
1418

plugins/toolkit/jetbrains-core/src/software/aws/toolkits/jetbrains/services/amazonqFeatureDev/controller/FeatureDevController.kt

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,10 +30,12 @@ import software.aws.toolkits.jetbrains.core.coroutines.EDT
3030
import software.aws.toolkits.jetbrains.services.amazonq.apps.AmazonQAppInitContext
3131
import software.aws.toolkits.jetbrains.services.amazonq.auth.AuthController
3232
import software.aws.toolkits.jetbrains.services.amazonq.toolwindow.AmazonQToolWindowFactory
33+
import software.aws.toolkits.jetbrains.services.amazonqFeatureDev.CodeIterationLimitError
3334
import software.aws.toolkits.jetbrains.services.amazonqFeatureDev.ContentLengthError
3435
import software.aws.toolkits.jetbrains.services.amazonqFeatureDev.DEFAULT_RETRY_LIMIT
3536
import software.aws.toolkits.jetbrains.services.amazonqFeatureDev.FEATURE_NAME
3637
import software.aws.toolkits.jetbrains.services.amazonqFeatureDev.InboundAppMessagesHandler
38+
import software.aws.toolkits.jetbrains.services.amazonqFeatureDev.PlanIterationLimitError
3739
import software.aws.toolkits.jetbrains.services.amazonqFeatureDev.createUserFacingErrorMessage
3840
import software.aws.toolkits.jetbrains.services.amazonqFeatureDev.messages.FeatureDevMessageType
3941
import software.aws.toolkits.jetbrains.services.amazonqFeatureDev.messages.FollowUp
@@ -389,6 +391,37 @@ class FeatureDevController(
389391
)
390392
),
391393
)
394+
} else if (err is PlanIterationLimitError) {
395+
messenger.sendError(tabId = tabId, errMessage = err.message, retries = retriesRemaining(session))
396+
messenger.sendSystemPrompt(
397+
tabId = tabId,
398+
followUp = listOf(
399+
FollowUp(
400+
pillText = message("amazonqFeatureDev.follow_up.new_plan"),
401+
type = FollowUpTypes.NEW_PLAN,
402+
status = FollowUpStatusType.Info,
403+
),
404+
FollowUp(
405+
pillText = message("amazonqFeatureDev.follow_up.generate_code"),
406+
type = FollowUpTypes.GENERATE_CODE,
407+
status = FollowUpStatusType.Info,
408+
)
409+
),
410+
)
411+
messenger.sendUpdatePlaceholder(tabId = tabId, newPlaceholder = message("amazonqFeatureDev.placeholder.after_code_generation"))
412+
} else if (err is CodeIterationLimitError) {
413+
messenger.sendError(tabId = tabId, errMessage = err.message, retries = retriesRemaining(session))
414+
messenger.sendSystemPrompt(
415+
tabId = tabId,
416+
followUp = listOf(
417+
FollowUp(
418+
pillText = message("amazonqFeatureDev.follow_up.insert_code"),
419+
type = FollowUpTypes.INSERT_CODE,
420+
icon = FollowUpIcons.Ok,
421+
status = FollowUpStatusType.Success,
422+
)
423+
),
424+
)
392425
} else {
393426
val msg = createUserFacingErrorMessage("$FEATURE_NAME request failed: ${err.message ?: err.cause?.message}")
394427
messenger.sendError(

plugins/toolkit/jetbrains-core/src/software/aws/toolkits/jetbrains/services/amazonqFeatureDev/util/FeatureDevClientUtil.kt

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,11 +11,14 @@ import software.amazon.awssdk.services.codewhispererruntime.model.GetTaskAssistC
1111
import software.amazon.awssdk.services.codewhispererruntime.model.StartTaskAssistCodeGenerationResponse
1212
import software.amazon.awssdk.services.codewhispererruntime.model.ValidationException
1313
import software.amazon.awssdk.services.codewhispererstreaming.model.CodeWhispererStreamingException
14+
import software.amazon.awssdk.services.codewhispererstreaming.model.ThrottlingException
1415
import software.aws.toolkits.core.utils.debug
1516
import software.aws.toolkits.core.utils.error
1617
import software.aws.toolkits.core.utils.getLogger
18+
import software.aws.toolkits.jetbrains.services.amazonqFeatureDev.CodeIterationLimitError
1719
import software.aws.toolkits.jetbrains.services.amazonqFeatureDev.ContentLengthError
1820
import software.aws.toolkits.jetbrains.services.amazonqFeatureDev.FEATURE_NAME
21+
import software.aws.toolkits.jetbrains.services.amazonqFeatureDev.PlanIterationLimitError
1922
import software.aws.toolkits.jetbrains.services.amazonqFeatureDev.apiError
2023
import software.aws.toolkits.jetbrains.services.amazonqFeatureDev.clients.FeatureDevClient
2124
import software.aws.toolkits.jetbrains.services.amazonqFeatureDev.clients.GenerateTaskAssistPlanResult
@@ -110,6 +113,10 @@ suspend fun generatePlan(
110113
if (e is CodeWhispererStreamingException) {
111114
errMssg = e.awsErrorDetails().errorMessage()
112115
logger.error(e) { "Generate plan failed for request: ${e.requestId()}" }
116+
117+
if (e is ThrottlingException && e.message?.contains("limit for number of iterations on an implementation plan") == true) {
118+
throw PlanIterationLimitError(message("amazonqFeatureDev.approach_gen.iteration_limit.error_text"), e.cause)
119+
}
113120
}
114121
apiError(errMssg, e.cause)
115122
}
@@ -134,6 +141,13 @@ fun startTaskAssistCodeGeneration(proxyClient: FeatureDevClient, conversationId:
134141
if (e is CodeWhispererRuntimeException) {
135142
errMssg = e.awsErrorDetails().errorMessage()
136143
logger.error(e) { "StartTaskAssistCodeGeneration failed for request: ${e.requestId()}" }
144+
145+
if (e is software.amazon.awssdk.services.codewhispererruntime.model.ThrottlingException && e.message?.contains(
146+
"limit for number of iterations on a code generation"
147+
) == true
148+
) {
149+
throw CodeIterationLimitError(message("amazonqFeatureDev.code_generation.iteration_limit.error_text"), e.cause)
150+
}
137151
}
138152
apiError(errMssg, e.cause)
139153
}

plugins/toolkit/resources/resources/software/aws/toolkits/resources/MessagesBundle.properties

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,13 +35,15 @@ action.aws.toolkit.toolwindow.sso.signout.text=Sign out of SSO
3535
action.dynamic.open.text=Open Resource...
3636
action.q.openchat.text=Chat with Q
3737
amazonqFeatureDev.approach_gen.error_text=Sorry, we're experiencing an issue on our side. Would you like to try again?
38+
amazonqFeatureDev.approach_gen.iteration_limit.error_text=You have reached the free tier limit for number of iterations on an implementation plan. Please proceed to generating code or start to discuss a new plan.
3839
amazonqFeatureDev.chat_message.ask_for_new_task=What change would you like to make?
3940
amazonqFeatureDev.chat_message.closed_session=Your session is now closed
4041
amazonqFeatureDev.chat_message.requesting_changes=Requesting changes ...
4142
amazonqFeatureDev.chat_message.start_code_generation=This may take a few minutes. I will send a notification when it's complete if you navigate away from this panel, but please keep the tab open.
4243
amazonqFeatureDev.chat_message.uploading_code=Uploading code ...
4344
amazonqFeatureDev.code_generation.failed_generation=Code generation failed
4445
amazonqFeatureDev.code_generation.generating_code=Generating code ...
46+
amazonqFeatureDev.code_generation.iteration_limit.error_text=You have reached the free tier limit for number of iterations on a code generation. Please proceed to accept the code or start a new conversation.
4547
amazonqFeatureDev.code_generation.no_file_changes=Unable to generate any file changes
4648
amazonqFeatureDev.code_generation.notification_message=Your code suggestions from Amazon Q are ready to review
4749
amazonqFeatureDev.code_generation.notification_open_link=Open chat

0 commit comments

Comments
 (0)