Skip to content
Merged
Show file tree
Hide file tree
Changes from 2 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
7 changes: 2 additions & 5 deletions packages/core/src/amazonqFeatureDev/client/featureDev.ts
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@ import { ServiceOptions } from '../../shared/awsClientBuilder'
import globals from '../../shared/extensionGlobals'
import { getLogger } from '../../shared/logger'
import * as FeatureDevProxyClient from './featuredevproxyclient'
import { featureName } from '../constants'
import { featureName, startTaskAssisLimitReachedMessage } from '../constants'
import { CodeReference } from '../../amazonq/webview/ui/connector'
import {
ApiError,
Expand Down Expand Up @@ -185,10 +185,7 @@ export class FeatureDevClient {
)
if (isAwsError(e)) {
// API Front-end will throw Throttling if conversation limit is reached. API Front-end monitors StartCodeGeneration for throttling
if (
e.code === 'ThrottlingException' &&
e.message.includes('StartTaskAssistCodeGeneration reached for this month.')
) {
if (e.code === 'ThrottlingException' && e.message.includes(startTaskAssisLimitReachedMessage)) {
throw new MonthlyConversationLimitError(e.message)
}
// BE service will throw ServiceQuota if code generation iteration limit is reached
Expand Down
6 changes: 6 additions & 0 deletions packages/core/src/amazonqFeatureDev/constants.ts
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,12 @@ export const generateDevFilePrompt =
// Max allowed size for file collection
export const maxRepoSizeBytes = 200 * 1024 * 1024

export const startCodeGenClientErrorMessages = ['Improperly formed request', 'Resource not found']
export const startTaskAssisLimitReachedMessage = 'StartTaskAssistCodeGeneration reached for this month.'
export const clientErrorMessages = [
'The folder you chose did not contain any source files in a supported language. Choose another folder and try again.',
]

// License text that's used in codewhisperer reference log
export const referenceLogText = (reference: CodeReference) =>
`[${new Date().toLocaleString()}] Accepted recommendation from Amazon Q. Code provided with reference under <a href="${LicenseUtil.getLicenseHtml(
Expand Down
22 changes: 20 additions & 2 deletions packages/core/src/amazonqFeatureDev/controllers/chat/controller.ts
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,14 @@ import {
} from '../../errors'
import { codeGenRetryLimit, defaultRetryLimit } from '../../limits'
import { Session } from '../../session/session'
import { featureDevScheme, featureName, generateDevFilePrompt } from '../../constants'
import {
clientErrorMessages,
featureDevScheme,
featureName,
generateDevFilePrompt,
startCodeGenClientErrorMessages,
startTaskAssisLimitReachedMessage,
} from '../../constants'
import { DeletedFileInfo, DevPhase, MetricDataOperationName, MetricDataResult, type NewFileInfo } from '../../types'
import { AuthUtil } from '../../../codewhisperer/util/authUtil'
import { AuthController } from '../../../amazonq/auth/controller'
Expand Down Expand Up @@ -555,12 +562,23 @@ export class FeatureDevController {
result = MetricDataResult.Fault
}
break
case MonthlyConversationLimitError.name:
case CodeIterationLimitError.name:
case PromptRefusalException.name:
case NoChangeRequiredException.name:
result = MetricDataResult.Error
break
default:
result = MetricDataResult.Fault
if (
(err.code === 'StartCodeGenerationFailed' &&
startCodeGenClientErrorMessages.some((msg) => err.message.includes(msg))) ||
clientErrorMessages.some((msg) => err.message.includes(msg)) ||
err.message.includes(startTaskAssisLimitReachedMessage)
) {
result = MetricDataResult.Error
} else {
result = MetricDataResult.Fault
}
break
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -39,7 +39,14 @@ import { CodeGenState, PrepareCodeGenState } from '../../../../amazonqFeatureDev
import { FeatureDevClient } from '../../../../amazonqFeatureDev/client/featureDev'
import { createAmazonQUri } from '../../../../amazonq/commons/diff'
import { AuthUtil } from '../../../../codewhisperer'
import { featureDevScheme, featureName, messageWithConversationId } from '../../../../amazonqFeatureDev'
import {
featureDevScheme,
featureName,
messageWithConversationId,
clientErrorMessages,
startCodeGenClientErrorMessages,
startTaskAssisLimitReachedMessage,
} from '../../../../amazonqFeatureDev'
import { i18n } from '../../../../shared/i18n-helper'
import { FollowUpTypes } from '../../../../amazonq/commons/types'
import { ToolkitError } from '../../../../shared'
Expand Down Expand Up @@ -471,12 +478,26 @@ describe('Controller', () => {
['EmptyPatchException', MetricDataResult.LlmFailure],
[PromptRefusalException.name, MetricDataResult.Error],
[NoChangeRequiredException.name, MetricDataResult.Error],
[MonthlyConversationLimitError.name, MetricDataResult.Error],
[CodeIterationLimitError.name, MetricDataResult.Error],
])

function getMetricResult(error: ToolkitError): MetricDataResult {
if (error instanceof FeatureDevServiceError && error.code) {
return errorResultMapping.get(error.code) ?? MetricDataResult.Error
}
if (
error.code === 'StartCodeGenerationFailed' &&
startCodeGenClientErrorMessages.some((msg: string) => error.message.includes(msg))
) {
return MetricDataResult.Error
}
if (
clientErrorMessages.some((msg: string) => error.message.includes(msg)) ||
error.message.includes(startTaskAssisLimitReachedMessage) // Include this check
) {
return MetricDataResult.Error
}
return errorResultMapping.get(error.constructor.name) ?? MetricDataResult.Fault
}

Expand Down