Skip to content
Merged
Show file tree
Hide file tree
Changes from all 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, startTaskAssistLimitReachedMessage } 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(startTaskAssistLimitReachedMessage)) {
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 startTaskAssistLimitReachedMessage = '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
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@ import {
createUserFacingErrorMessage,
denyListedErrors,
FeatureDevServiceError,
isAPIClientError,
MonthlyConversationLimitError,
NoChangeRequiredException,
PrepareRepoFailedError,
Expand Down Expand Up @@ -555,12 +556,18 @@ 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 (isAPIClientError(err)) {
result = MetricDataResult.Error
} else {
result = MetricDataResult.Fault
}
break
}

Expand Down
16 changes: 15 additions & 1 deletion packages/core/src/amazonqFeatureDev/errors.ts
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,12 @@
*/

import { ToolkitError } from '../shared/errors'
import { featureName } from './constants'
import {
featureName,
clientErrorMessages,
startCodeGenClientErrorMessages,
startTaskAssistLimitReachedMessage,
} from './constants'
import { uploadCodeError } from './userFacingText'
import { i18n } from '../shared/i18n-helper'

Expand Down Expand Up @@ -140,3 +145,12 @@ export function createUserFacingErrorMessage(message: string) {
}
return message
}

export function isAPIClientError(error: { code?: string; message: string }): boolean {
return (
(error.code === 'StartCodeGenerationFailed' &&
startCodeGenClientErrorMessages.some((msg: string) => error.message.includes(msg))) ||
clientErrorMessages.some((msg: string) => error.message.includes(msg)) ||
error.message.includes(startTaskAssistLimitReachedMessage)
)
}
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,7 @@ import {
ContentLengthError,
createUserFacingErrorMessage,
FeatureDevServiceError,
isAPIClientError,
MonthlyConversationLimitError,
NoChangeRequiredException,
PrepareRepoFailedError,
Expand Down Expand Up @@ -471,12 +472,17 @@ 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 (isAPIClientError(error)) {
return MetricDataResult.Error
}
return errorResultMapping.get(error.constructor.name) ?? MetricDataResult.Fault
}

Expand Down
Loading