Skip to content

Commit 937e9b4

Browse files
authored
Chat customization support (#4642)
* q streaming service sdk udpate * telemetry addMessage will send customizationArn * gamma endpoint * fix sending empty string instead null to the service if no customization * internal scope * revert dev config change * patch * move selectCustomization action under Q:Other Feature instead of inline suggestion * typo resourceArn -> customizationArn * Revert "typo resourceArn -> customizationArn" This reverts commit eaf014b. * patch * compile error due to stale code changes * detekt * detekt * remove stale comment
1 parent 5862224 commit 937e9b4

File tree

8 files changed

+36
-17
lines changed

8 files changed

+36
-17
lines changed

plugins/amazonq/chat/jetbrains-community/src/software/aws/toolkits/jetbrains/services/cwc/clients/chat/model/Requests.kt

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ package software.aws.toolkits.jetbrains.services.cwc.clients.chat.model
55

66
import com.fasterxml.jackson.annotation.JsonProperty
77
import software.amazon.awssdk.services.codewhispererstreaming.model.UserIntent
8+
import software.aws.toolkits.jetbrains.services.codewhisperer.customization.CodeWhispererCustomization
89
import software.aws.toolkits.jetbrains.services.cwc.editor.context.ActiveFileContext
910

1011
enum class TriggerType {
@@ -19,7 +20,8 @@ data class ChatRequestData(
1920
val message: String,
2021
val activeFileContext: ActiveFileContext,
2122
val userIntent: UserIntent?,
22-
val triggerType: TriggerType
23+
val triggerType: TriggerType,
24+
val customization: CodeWhispererCustomization?
2325
)
2426

2527
interface CodeNames {

plugins/amazonq/chat/jetbrains-community/src/software/aws/toolkits/jetbrains/services/cwc/clients/chat/v1/ChatSessionV1.kt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -211,6 +211,7 @@ class ChatSessionV1(
211211
.conversationId(conversationId)
212212
.currentMessage(ChatMessage.fromUserInputMessage(userInput))
213213
.chatTriggerType(ChatTriggerType.MANUAL)
214+
.customizationArn(customization?.arn)
214215
.build()
215216
return GenerateAssistantResponseRequest.builder()
216217
.conversationState(conversationState)

plugins/amazonq/chat/jetbrains-community/src/software/aws/toolkits/jetbrains/services/cwc/controller/ChatController.kt

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@ import kotlinx.coroutines.flow.mapNotNull
2828
import kotlinx.coroutines.flow.onEach
2929
import kotlinx.coroutines.job
3030
import kotlinx.coroutines.withContext
31+
import migration.software.aws.toolkits.jetbrains.services.codewhisperer.customization.CodeWhispererModelConfigurator
3132
import software.amazon.awssdk.services.codewhispererstreaming.model.UserIntent
3233
import software.aws.toolkits.core.utils.getLogger
3334
import software.aws.toolkits.core.utils.info
@@ -356,6 +357,7 @@ class ChatController private constructor(
356357
activeFileContext = activeFileContext,
357358
userIntent = userIntent,
358359
triggerType = triggerType,
360+
customization = CodeWhispererModelConfigurator.getInstance().activeCustomization(context.project)
359361
)
360362

361363
val sessionInfo = getSessionInfo(tabId)

plugins/amazonq/chat/jetbrains-community/src/software/aws/toolkits/jetbrains/services/cwc/controller/chat/telemetry/TelemetryHelper.kt

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -104,7 +104,8 @@ class TelemetryHelper(private val context: AmazonQAppInitContext, private val se
104104
cwsprChatRequestLength = data.message.length,
105105
cwsprChatResponseLength = responseLength,
106106
cwsprChatConversationType = CwsprChatConversationType.Chat,
107-
credentialStartUrl = getStartUrl(context.project)
107+
credentialStartUrl = getStartUrl(context.project),
108+
codewhispererCustomizationArn = data.customization?.arn
108109
)
109110

110111
val programmingLanguage = data.activeFileContext.fileContext?.fileLanguage

plugins/amazonq/codewhisperer/jetbrains-community/src/software/aws/toolkits/jetbrains/services/codewhisperer/explorer/QStatusBarLoggedInActionGroup.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -59,7 +59,7 @@ class QStatusBarLoggedInActionGroup : DefaultActionGroup() {
5959

6060
add(Separator.create())
6161
add(Separator.create(message("codewhisperer.statusbar.sub_menu.other_features.title")))
62-
addAll(buildActionListForOtherFeatures(actionProvider))
62+
addAll(buildActionListForOtherFeatures(it, actionProvider))
6363

6464
add(Separator.create())
6565
add(Separator.create(message("codewhisperer.statusbar.sub_menu.connect_help.title")))

plugins/amazonq/codewhisperer/jetbrains-community/src/software/aws/toolkits/jetbrains/services/codewhisperer/explorer/actions/ActionFactory.kt

Lines changed: 15 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,10 @@
44
package software.aws.toolkits.jetbrains.services.codewhisperer.explorer.actions
55

66
import com.intellij.openapi.project.Project
7+
import software.aws.toolkits.jetbrains.core.credentials.ToolkitConnectionManager
8+
import software.aws.toolkits.jetbrains.core.credentials.pinning.QConnection
9+
import software.aws.toolkits.jetbrains.core.credentials.sono.isSono
710
import software.aws.toolkits.jetbrains.services.codewhisperer.codescan.CodeWhispererCodeScanManager
8-
import software.aws.toolkits.jetbrains.services.codewhisperer.credentials.CodeWhispererLoginType
911
import software.aws.toolkits.jetbrains.services.codewhisperer.customization.CodeWhispererModelConfigurator
1012
import software.aws.toolkits.jetbrains.services.codewhisperer.explorer.CodeWhispererExplorerActionManager
1113
import software.aws.toolkits.jetbrains.services.codewhisperer.explorer.isUserBuilderId
@@ -27,9 +29,9 @@ interface ActionProvider<T> {
2729
val documentation: T
2830
}
2931

30-
fun<T> buildActionListForInlineSuggestions(project: Project, actionProvider: ActionProvider<T>): List<T> {
32+
@SuppressWarnings("UnusedParameter")
33+
fun <T> buildActionListForInlineSuggestions(project: Project, actionProvider: ActionProvider<T>): List<T> {
3134
val manager = CodeWhispererExplorerActionManager.getInstance()
32-
val activeConnectionType = manager.checkActiveCodeWhispererConnectionType(project)
3335

3436
return buildList {
3537
if (manager.isAutoEnabled()) {
@@ -40,18 +42,11 @@ fun<T> buildActionListForInlineSuggestions(project: Project, actionProvider: Act
4042

4143
add(actionProvider.openCodeReference)
4244

43-
// We only show this customization node to SSO users who are in CodeWhisperer Gated Preview list
44-
if (activeConnectionType == CodeWhispererLoginType.SSO &&
45-
CodeWhispererModelConfigurator.getInstance().shouldDisplayCustomNode(project)
46-
) {
47-
add(actionProvider.customize)
48-
}
49-
5045
add(actionProvider.learn)
5146
}
5247
}
5348

54-
fun<T> buildActionListForCodeScan(project: Project, actionProvider: ActionProvider<T>): List<T> =
49+
fun <T> buildActionListForCodeScan(project: Project, actionProvider: ActionProvider<T>): List<T> =
5550
buildList {
5651
val codeScanManager = CodeWhispererCodeScanManager.getInstance(project)
5752
val manager = CodeWhispererExplorerActionManager.getInstance()
@@ -69,14 +64,21 @@ fun<T> buildActionListForCodeScan(project: Project, actionProvider: ActionProvid
6964
}
7065
}
7166

72-
fun<T> buildActionListForOtherFeatures(actionProvider: ActionProvider<T>): List<T> =
67+
fun <T> buildActionListForOtherFeatures(project: Project, actionProvider: ActionProvider<T>): List<T> =
7368
buildList {
7469
if (!isRunningOnRemoteBackend()) {
7570
add(actionProvider.openChatPanel)
7671
}
72+
73+
val isIdC = ToolkitConnectionManager.getInstance(project).activeConnectionForFeature(QConnection.getInstance()).let { conn ->
74+
conn != null && !conn.isSono()
75+
}
76+
if (isIdC && CodeWhispererModelConfigurator.getInstance().shouldDisplayCustomNode(project)) {
77+
add(actionProvider.customize)
78+
}
7779
}
7880

79-
fun<T> buildActionListForConnectHelp(actionProvider: ActionProvider<T>): List<T> =
81+
fun <T> buildActionListForConnectHelp(actionProvider: ActionProvider<T>): List<T> =
8082
buildList {
8183
add(actionProvider.sendFeedback)
8284
add(actionProvider.connectOnGithub)

plugins/core/jetbrains-community/resources/telemetryOverride.json

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -461,6 +461,10 @@
461461
{
462462
"type": "credentialStartUrl",
463463
"required": false
464+
},
465+
{
466+
"type": "codewhispererCustomizationArn",
467+
"required": false
464468
}
465469
]
466470
},

plugins/core/sdk-codegen/codegen-resources/codewhispererstreaming/service-2.json

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -214,7 +214,8 @@
214214
"conversationId":{"shape":"ConversationId"},
215215
"history":{"shape":"ChatHistory"},
216216
"currentMessage":{"shape":"ChatMessage"},
217-
"chatTriggerType":{"shape":"ChatTriggerType"}
217+
"chatTriggerType":{"shape":"ChatTriggerType"},
218+
"customizationArn":{"shape": "ResourceArn"}
218219
}
219220
},
220221
"CursorState":{
@@ -479,6 +480,12 @@
479480
"max":10,
480481
"min":0
481482
},
483+
"ResourceArn":{
484+
"type":"string",
485+
"max":1224,
486+
"min":0,
487+
"pattern":"arn:([-.a-z0-9]{1,63}:){2}([-.a-z0-9]{0,63}:){2}([a-zA-Z0-9-_:/]){1,1023}"
488+
},
482489
"ResourceNotFoundException":{
483490
"type":"structure",
484491
"required":["message"],

0 commit comments

Comments
 (0)