Skip to content

Commit 86de439

Browse files
committed
customization override
1 parent ded64c5 commit 86de439

File tree

2 files changed

+44
-34
lines changed

2 files changed

+44
-34
lines changed

plugins/amazonq/codewhisperer/jetbrains-community/src/software/aws/toolkits/jetbrains/services/codewhisperer/startup/CodeWhispererProjectStartupActivity.kt

Lines changed: 6 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,6 @@ import software.aws.toolkits.jetbrains.core.coroutines.projectCoroutineScope
1313
import software.aws.toolkits.jetbrains.services.amazonq.CodeWhispererFeatureConfigService
1414
import software.aws.toolkits.jetbrains.services.amazonq.calculateIfIamIdentityCenterConnection
1515
import software.aws.toolkits.jetbrains.services.codewhisperer.codescan.CodeWhispererCodeScanManager
16-
import software.aws.toolkits.jetbrains.services.codewhisperer.customization.CodeWhispererCustomization
1716
import software.aws.toolkits.jetbrains.services.codewhisperer.customization.CodeWhispererModelConfigurator
1817
import software.aws.toolkits.jetbrains.services.codewhisperer.explorer.CodeWhispererExplorerActionManager
1918
import software.aws.toolkits.jetbrains.services.codewhisperer.explorer.isUserBuilderId
@@ -79,18 +78,16 @@ class CodeWhispererProjectStartupActivity : StartupActivity.DumbAware {
7978
projectCoroutineScope(project).launch {
8079
while (isActive) {
8180
CodeWhispererFeatureConfigService.getInstance().fetchFeatureConfigs(project)
82-
CodeWhispererFeatureConfigService.getInstance().getCustomizationFeature()?.let { customization ->
81+
CodeWhispererFeatureConfigService.getInstance().getCustomizationFeature()?.let { overrideContext ->
8382
val persistedCustomizationOverride = CodeWhispererModelConfigurator.getInstance().getPersistedCustomizationOverride()
84-
val latestCustomizationOverride = customization.value.stringValue()
83+
val latestCustomizationOverride = overrideContext.value.stringValue()
8584
if (persistedCustomizationOverride == latestCustomizationOverride) return@let
8685

8786
// latest is different from the currently persisted, need update
88-
CodeWhispererFeatureConfigService.getInstance().validateCustomizationOverride(project, customization)
89-
CodeWhispererModelConfigurator.getInstance().switchCustomization(
90-
project,
91-
CodeWhispererCustomization(arn = customization.value.stringValue(), name = customization.variation),
92-
isOverride = true
93-
)
87+
val customization = CodeWhispererFeatureConfigService.getInstance().validateCustomizationOverride(project, overrideContext)
88+
if (customization != null) {
89+
CodeWhispererModelConfigurator.getInstance().switchCustomization(project, customization, isOverride = true)
90+
}
9491
}
9592

9693
delay(FEATURE_CONFIG_POLL_INTERVAL_IN_MS)

plugins/amazonq/shared/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/CodeWhispererFeatureConfigService.kt

Lines changed: 38 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ import software.aws.toolkits.core.utils.getLogger
1515
import software.aws.toolkits.jetbrains.core.credentials.ToolkitConnectionManager
1616
import software.aws.toolkits.jetbrains.core.credentials.pinning.QConnection
1717
import software.aws.toolkits.jetbrains.services.amazonq.profile.QRegionProfileManager
18+
import software.aws.toolkits.jetbrains.services.codewhisperer.customization.CodeWhispererCustomization
1819
import software.aws.toolkits.jetbrains.utils.isQExpired
1920

2021
@Service
@@ -103,37 +104,49 @@ class CodeWhispererFeatureConfigService {
103104
}
104105
}
105106

106-
fun validateCustomizationOverride(project: Project, customization: FeatureContext) {
107-
val customizationArnOverride = customization.value.stringValue()
108-
val connection = connection(project) ?: return
109-
if (customizationArnOverride != null) {
110-
// Double check if server-side wrongly returns a customizationArn to BID users
111-
calculateIfBIDConnection(project) {
112-
featureConfigs.remove(CUSTOMIZATION_ARN_OVERRIDE_NAME)
113-
}
114-
val availableCustomizations =
115-
calculateIfIamIdentityCenterConnection(project) {
116-
try {
107+
fun validateCustomizationOverride(project: Project, featOverrideContext: FeatureContext): CodeWhispererCustomization? {
108+
val customizationArnOverride = featOverrideContext.value.stringValue()
109+
connection(project) ?: return null
110+
customizationArnOverride ?: return null
111+
112+
// Double check if server-side wrongly returns a customizationArn to BID users
113+
calculateIfBIDConnection(project) {
114+
featureConfigs.remove(CUSTOMIZATION_ARN_OVERRIDE_NAME)
115+
}
116+
val availableCustomizations =
117+
calculateIfIamIdentityCenterConnection(project) {
118+
try {
119+
val profiles = QRegionProfileManager.getInstance().listRegionProfiles(project)
120+
?: error("Attempted to fetch profiles while there does not exist")
121+
122+
val customs = profiles.flatMap { profile ->
117123
QRegionProfileManager.getInstance().getQClient<CodeWhispererRuntimeClient>(project)
118-
.listAvailableCustomizationsPaginator {}
119-
.flatMap { resp ->
120-
resp.customizations().map {
121-
it.arn()
122-
}
124+
.listAvailableCustomizations { it.profileArn(profile.arn) }.customizations().map { originalCustom ->
125+
CodeWhispererCustomization(
126+
arn = originalCustom.arn(),
127+
name = originalCustom.name(),
128+
description = originalCustom.description(),
129+
profile = profile
130+
)
123131
}
124-
} catch (e: Exception) {
125-
LOG.debug(e) { "Failed to list available customizations" }
126-
null
127132
}
128-
}
129133

130-
// If customizationArn from A/B is not available in listAvailableCustomizations response, don't use this value
131-
if (availableCustomizations?.contains(customizationArnOverride) == false) {
132-
LOG.debug {
133-
"Customization arn $customizationArnOverride not available in listAvailableCustomizations, not using"
134+
customs
135+
} catch (e: Exception) {
136+
LOG.debug(e) { "encountered error while validating customization override" }
137+
null
134138
}
135-
featureConfigs.remove(CUSTOMIZATION_ARN_OVERRIDE_NAME)
136139
}
140+
141+
val isValidOverride = availableCustomizations != null && availableCustomizations.any { it.arn == customizationArnOverride }
142+
143+
// If customizationArn from A/B is not available in listAvailableCustomizations response, don't use this value
144+
return if (!isValidOverride) {
145+
LOG.debug { "Customization arn $customizationArnOverride not available in listAvailableCustomizations, not using" }
146+
featureConfigs.remove(CUSTOMIZATION_ARN_OVERRIDE_NAME)
147+
null
148+
} else {
149+
availableCustomizations?.find { it.arn == customizationArnOverride }
137150
}
138151
}
139152

0 commit comments

Comments
 (0)