@@ -14,7 +14,9 @@ import okhttp3.MediaType.Companion.toMediaType
1414import okhttp3.OkHttpClient
1515import okhttp3.Request
1616import okhttp3.RequestBody.Companion.toRequestBody
17-
17+ import com.intellij.openapi.project.Project
18+ import ai.devchat.plugin.DevChatService
19+ import ai.devchat.plugin.Browser
1820
1921val CLOSING_BRACES = setOf (" }" , " ]" , " )" )
2022const val MAX_CONTINUOUS_INDENT_COUNT = 4
@@ -77,7 +79,8 @@ class Agent(val scope: CoroutineScope) {
7779 @SerializedName(" prompt_time" ) val promptBuildingElapse : Long ,
7880 @SerializedName(" llm_time" ) val llmRequestElapse : Long ,
7981 @SerializedName(" model" ) val model : String? = null ,
80- @SerializedName(" cache_hit" ) val cacheHit : Boolean = false
82+ @SerializedName(" cache_hit" ) val cacheHit : Boolean = false ,
83+ @SerializedName(" is_manual_trigger" ) var isManualTrigger : Boolean = false
8184 ) {
8285 enum class EventType {
8386 @SerializedName(" view" ) VIEW ,
@@ -287,69 +290,68 @@ private fun requestDevChatAPI(prompt: String): Flow<CodeCompletionChunk> = flow
287290 return completion
288291 }
289292
290- suspend fun provideCompletions (
291- completionRequest : CompletionRequest
292- ): CompletionResponse ? = suspendCancellableCoroutine { continuation ->
293- currentRequest = RequestInfo .fromCompletionRequest(completionRequest)
294- val model = CONFIG [" complete_model" ] as ? String
295- var startTime = System .currentTimeMillis()
296- logger.info(" offset: ${completionRequest.position} " )
297- val prompt = ContextBuilder (
298- completionRequest.file,
299- completionRequest.position
300- ).createPrompt(model)
301- logger.info(" Prompt: $prompt " )
302- // output prompt length
303- logger.info(" Prompt length: ${prompt.length} " )
304- val promptBuildingElapse = System .currentTimeMillis() - startTime
293+ suspend fun provideCompletions (
294+ completionRequest : CompletionRequest
295+ ): CompletionResponse ? = suspendCancellableCoroutine { continuation ->
296+ currentRequest = RequestInfo .fromCompletionRequest(completionRequest)
297+ val model = CONFIG [" complete_model" ] as ? String
298+ var startTime = System .currentTimeMillis()
299+ logger.info(" offset: ${completionRequest.position} " )
300+ val prompt = ContextBuilder (
301+ completionRequest.file,
302+ completionRequest.position
303+ ).createPrompt(model)
304+ logger.info(" Prompt: $prompt " )
305+ // output prompt length
306+ logger.info(" Prompt length: ${prompt.length} " )
307+ val promptBuildingElapse = System .currentTimeMillis() - startTime
305308
306- scope.launch {
307- startTime = System .currentTimeMillis()
308- val chunks = request(prompt)
309- .let (::toLines)
310- .let (::stopAtFirstBrace)
311- .let (::stopAtDuplicateLine)
312- .let (::stopAtBlockEnds)
313- val completion = aggregate(chunks)
314- val llmRequestElapse = System .currentTimeMillis() - startTime
315- val offset = completionRequest.position
316- val replaceRange = CompletionResponse .Choice .Range (start = offset, end = offset)
317- val text = completion.text
318- val choice = CompletionResponse .Choice (index = 0 , text = text, replaceRange = replaceRange)
319- val response = CompletionResponse (completion.id, model, listOf (choice), promptBuildingElapse, llmRequestElapse)
309+ scope.launch {
310+ startTime = System .currentTimeMillis()
311+ val chunks = request(prompt)
312+ .let (::toLines)
313+ .let (::stopAtFirstBrace)
314+ .let (::stopAtDuplicateLine)
315+ .let (::stopAtBlockEnds)
316+ val completion = aggregate(chunks)
317+ val llmRequestElapse = System .currentTimeMillis() - startTime
318+ val offset = completionRequest.position
319+ val replaceRange = CompletionResponse .Choice .Range (start = offset, end = offset)
320+ val text = completion.text
321+ val choice = CompletionResponse .Choice (index = 0 , text = text, replaceRange = replaceRange)
322+ val response = CompletionResponse (completion.id, model, listOf (choice), promptBuildingElapse, llmRequestElapse)
320323
321- // 添加日志输出
322- logger.info(" Code completion response: $response " )
323- logger.info(" Final completion text: ${completion.text} " )
324+ // 添加日志输出
325+ logger.info(" Code completion response: $response " )
326+ logger.info(" Final completion text: ${completion.text} " )
324327
325- continuation.resumeWith(Result .success(response))
326- prevCompletion = completion.text
327- }
328+ continuation.resumeWith(Result .success(response))
329+ prevCompletion = completion.text
330+ }
328331
329- continuation.invokeOnCancellation {
330- logger.warn(" Agent request cancelled" )
332+ continuation.invokeOnCancellation {
333+ logger.warn(" Agent request cancelled" )
334+ }
331335 }
332- }
333336
334- suspend fun postEvent (logEventRequest : LogEventRequest ): Unit = suspendCancellableCoroutine {
335- val devChatEndpoint = CONFIG [" providers.devchat.api_base" ] as ? String
336- val devChatAPIKey = CONFIG [" providers.devchat.api_key" ] as ? String
337- val requestBuilder = Request .Builder ()
338- .url(" $devChatEndpoint /complete_events" )
339- .post(
340- gson.toJson(logEventRequest).toRequestBody(
341- " application/json; charset=utf-8" .toMediaType()
342- )
343- )
344- requestBuilder.addHeader(" Authorization" , " Bearer $devChatAPIKey " )
345- requestBuilder.addHeader(" Content-Type" , " application/json" )
346- try {
347- httpClient.newCall(requestBuilder.build()).execute().use { response ->
348- logger.info(" Log event response: $response " )
349- }
350- logger.info(" Code completion log event: $logEventRequest " )
351- } catch (e: Exception ) {
352- logger.warn(e)
337+ suspend fun postEvent (browser : Browser ? = null, logEventRequest : LogEventRequest ): Unit = suspendCancellableCoroutine {
338+ // 创建一个包含命令和事件数据的消息
339+ val message = mapOf (
340+ " command" to " logEvent" ,
341+ " id" to logEventRequest.completionId,
342+ " language" to logEventRequest.language,
343+ " name" to logEventRequest.type,
344+ " value" to logEventRequest
345+ )
346+
347+ // 使用 Browser 类的 sendToWebView 方法发送消息
348+ if (browser == null ) {
349+ logger.warn(" Browser instance is null, cannot send log event to webview." )
350+ } else {
351+ browser.sendToWebView(message)
353352 }
353+
354+ // 记录日志
355+ logger.info(" Code completion log event: $logEventRequest " )
354356 }
355357}
0 commit comments