@@ -39,107 +39,135 @@ import java.time.Instant
3939import software.amazon.awssdk.services.codewhispererruntime.model.ChatTriggerType as SyncChatTriggerType
4040
4141@Service(Service .Level .PROJECT )
42- class FeatureDevClient (private val project : Project ) {
42+ class FeatureDevClient (
43+ private val project : Project ,
44+ ) {
4345 fun getTelemetryOptOutPreference () =
4446 if (AwsSettings .getInstance().isTelemetryEnabled) {
4547 OptOutPreference .OPTIN
4648 } else {
4749 OptOutPreference .OPTOUT
4850 }
4951
50- private val featureDevUserContext = ClientMetadata .getDefault().let {
51- val osForFeatureDev: OperatingSystem =
52- when {
53- SystemInfo .isWindows -> OperatingSystem .WINDOWS
54- SystemInfo .isMac -> OperatingSystem .MAC
55- // For now, categorize everything else as "Linux" (Linux/FreeBSD/Solaris/etc.)
56- else -> OperatingSystem .LINUX
57- }
52+ private val featureDevUserContext =
53+ ClientMetadata .getDefault().let {
54+ val osForFeatureDev: OperatingSystem =
55+ when {
56+ SystemInfo .isWindows -> OperatingSystem .WINDOWS
57+ SystemInfo .isMac -> OperatingSystem .MAC
58+ // For now, categorize everything else as "Linux" (Linux/FreeBSD/Solaris/etc.)
59+ else -> OperatingSystem .LINUX
60+ }
5861
59- UserContext .builder()
60- .ideCategory(IdeCategory .JETBRAINS )
61- .operatingSystem(osForFeatureDev)
62- .product(FEATURE_EVALUATION_PRODUCT_NAME )
63- .clientId(it.clientId)
64- .ideVersion(it.awsVersion)
65- .build()
66- }
62+ UserContext
63+ .builder()
64+ .ideCategory(IdeCategory .JETBRAINS )
65+ .operatingSystem(osForFeatureDev)
66+ .product(FEATURE_EVALUATION_PRODUCT_NAME )
67+ .clientId(it.clientId)
68+ .ideVersion(it.awsVersion)
69+ .build()
70+ }
6771
68- private fun connection () = ToolkitConnectionManager .getInstance(project).activeConnectionForFeature(QConnection .getInstance())
69- ? : error(" Attempted to use connection while one does not exist" )
72+ private fun connection () =
73+ ToolkitConnectionManager .getInstance(project).activeConnectionForFeature(QConnection .getInstance())
74+ ? : error(" Attempted to use connection while one does not exist" )
7075
7176 private fun bearerClient () = connection().getConnectionSettings().awsClient<CodeWhispererRuntimeClient >()
7277
7378 private val amazonQStreamingClient
7479 get() = AmazonQStreamingClient .getInstance(project)
7580
76- fun sendFeatureDevTelemetryEvent (conversationId : String ): SendTelemetryEventResponse = bearerClient().sendTelemetryEvent { requestBuilder ->
77- requestBuilder.telemetryEvent { telemetryEventBuilder ->
78- telemetryEventBuilder.featureDevEvent {
79- it.conversationId(conversationId)
81+ fun sendFeatureDevTelemetryEvent (conversationId : String ): SendTelemetryEventResponse =
82+ bearerClient().sendTelemetryEvent { requestBuilder ->
83+ requestBuilder.telemetryEvent { telemetryEventBuilder ->
84+ telemetryEventBuilder.featureDevEvent {
85+ it.conversationId(conversationId)
86+ }
8087 }
88+ requestBuilder.optOutPreference(getTelemetryOptOutPreference())
89+ requestBuilder.userContext(featureDevUserContext)
8190 }
82- requestBuilder.optOutPreference(getTelemetryOptOutPreference())
83- requestBuilder.userContext(featureDevUserContext)
84- }
8591
86- fun createTaskAssistConversation (): CreateTaskAssistConversationResponse = bearerClient().createTaskAssistConversation(
87- CreateTaskAssistConversationRequest .builder().build()
88- )
89-
90- fun createTaskAssistUploadUrl (conversationId : String , contentChecksumSha256 : String , contentLength : Long ): CreateUploadUrlResponse =
92+ fun createTaskAssistConversation (): CreateTaskAssistConversationResponse =
93+ bearerClient().createTaskAssistConversation(
94+ CreateTaskAssistConversationRequest .builder().build(),
95+ )
96+
97+ fun createTaskAssistUploadUrl (
98+ conversationId : String ,
99+ contentChecksumSha256 : String ,
100+ contentLength : Long ,
101+ uploadId : String ,
102+ ): CreateUploadUrlResponse =
91103 bearerClient().createUploadUrl {
92- it.contentChecksumType(ContentChecksumType .SHA_256 )
104+ it
105+ .contentChecksumType(ContentChecksumType .SHA_256 )
106+ .uploadId(uploadId)
93107 .contentChecksum(contentChecksumSha256)
94108 .contentLength(contentLength)
95109 .artifactType(ArtifactType .SOURCE_CODE )
96110 .uploadIntent(UploadIntent .TASK_ASSIST_PLANNING )
97111 .uploadContext(
98- UploadContext .builder()
112+ UploadContext
113+ .builder()
99114 .taskAssistPlanningUploadContext(
100- TaskAssistPlanningUploadContext .builder()
115+ TaskAssistPlanningUploadContext
116+ .builder()
101117 .conversationId(conversationId)
102- .build()
103- )
104- .build()
118+ .build(),
119+ ).build(),
105120 )
106121 }
107122
108- fun startTaskAssistCodeGeneration (conversationId : String , uploadId : String , userMessage : String ): StartTaskAssistCodeGenerationResponse = bearerClient()
109- .startTaskAssistCodeGeneration {
110- request ->
111- request
112- .conversationState {
113- it
114- .conversationId(conversationId)
115- .chatTriggerType(SyncChatTriggerType .MANUAL )
116- .currentMessage { cm -> cm.userInputMessage { um -> um.content(userMessage) } }
117- }
118- .workspaceState {
119- it
120- .programmingLanguage { pl -> pl.languageName(" javascript" ) } // This parameter is omitted by featureDev but required in the request
121- .uploadId(uploadId)
122- }
123- }
123+ fun startTaskAssistCodeGeneration (
124+ conversationId : String ,
125+ uploadId : String ,
126+ userMessage : String ,
127+ codeGenerationId : String? ,
128+ currentCodeGenerationId : String? ,
129+ ): StartTaskAssistCodeGenerationResponse =
130+ bearerClient()
131+ .startTaskAssistCodeGeneration { request ->
132+ request
133+ .conversationState {
134+ it
135+ .conversationId(conversationId)
136+ .chatTriggerType(SyncChatTriggerType .MANUAL )
137+ .currentMessage { cm -> cm.userInputMessage { um -> um.content(userMessage) } }
138+ }.workspaceState {
139+ it
140+ .programmingLanguage { pl -> pl.languageName(" javascript" ) } // This parameter is omitted by featureDev but required in the request
141+ .uploadId(uploadId)
142+ }.codeGenerationId(codeGenerationId.toString())
143+ .currentCodeGenerationId(currentCodeGenerationId)
144+ }
124145
125- fun getTaskAssistCodeGeneration (conversationId : String , codeGenerationId : String ): GetTaskAssistCodeGenerationResponse = bearerClient()
126- .getTaskAssistCodeGeneration {
127- it
128- .conversationId(conversationId)
129- .codeGenerationId(codeGenerationId)
130- }
146+ fun getTaskAssistCodeGeneration (
147+ conversationId : String ,
148+ codeGenerationId : String ,
149+ ): GetTaskAssistCodeGenerationResponse =
150+ bearerClient()
151+ .getTaskAssistCodeGeneration {
152+ it
153+ .conversationId(conversationId)
154+ .codeGenerationId(codeGenerationId)
155+ }
131156
132- suspend fun exportTaskAssistResultArchive (conversationId : String ): MutableList <ByteArray > = amazonQStreamingClient.exportResultArchive(
133- conversationId,
134- ExportIntent .TASK_ASSIST ,
135- null ,
136- { e ->
137- LOG .error(e) { " TaskAssist - ExportResultArchive stream exportId=$conversationId exportIntent=${ExportIntent .TASK_ASSIST } Failed: ${e.message} " }
138- },
139- { startTime ->
140- LOG .info { " TaskAssist - ExportResultArchive latency: ${calculateTotalLatency(startTime, Instant .now())} " }
141- }
142- )
157+ suspend fun exportTaskAssistResultArchive (conversationId : String ): MutableList <ByteArray > =
158+ amazonQStreamingClient.exportResultArchive(
159+ conversationId,
160+ ExportIntent .TASK_ASSIST ,
161+ null ,
162+ { e ->
163+ LOG .error(
164+ e,
165+ ) { " TaskAssist - ExportResultArchive stream exportId=$conversationId exportIntent=${ExportIntent .TASK_ASSIST } Failed: ${e.message} " }
166+ },
167+ { startTime ->
168+ LOG .info { " TaskAssist - ExportResultArchive latency: ${calculateTotalLatency(startTime, Instant .now())} " }
169+ },
170+ )
143171
144172 companion object {
145173 private val LOG = getLogger<FeatureDevClient >()
0 commit comments