Skip to content

Commit 7941c38

Browse files
committed
refactor: Optimize webview communication in AgentService
- Refactored `postEvent` method to include `Browser` instance for webview communication - Added `isManualTrigger` field to `Agent` class for manual trigger tracking - Imported additional classes for project and browser integration in `Agent` class
1 parent f46db0f commit 7941c38

File tree

2 files changed

+66
-61
lines changed

2 files changed

+66
-61
lines changed

src/main/kotlin/ai/devchat/plugin/completion/agent/Agent.kt

Lines changed: 61 additions & 59 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,9 @@ import okhttp3.MediaType.Companion.toMediaType
1414
import okhttp3.OkHttpClient
1515
import okhttp3.Request
1616
import 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

1921
val CLOSING_BRACES = setOf("}", "]", ")")
2022
const 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
}

src/main/kotlin/ai/devchat/plugin/completion/agent/AgentService.kt

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package ai.devchat.plugin.completion.agent
22

3+
import ai.devchat.plugin.DevChatService
34
import com.intellij.lang.Language
45
import com.intellij.openapi.Disposable
56
import com.intellij.openapi.application.ReadAction
@@ -16,6 +17,7 @@ import com.intellij.openapi.application.ModalityState
1617
import kotlinx.coroutines.suspendCancellableCoroutine
1718
import kotlin.coroutines.resume
1819
import kotlinx.coroutines.CancellationException
20+
import com.intellij.openapi.project.Project
1921

2022
@Service
2123
class AgentService : Disposable {
@@ -68,8 +70,9 @@ suspend fun provideCompletion(editor: Editor, offset: Int, manually: Boolean = f
6870
}
6971
}
7072

71-
suspend fun postEvent(event: Agent.LogEventRequest) {
72-
agent.postEvent(event)
73+
suspend fun postEvent(project: Project, event: Agent.LogEventRequest) {
74+
var browser = project.getService(DevChatService::class.java).browser
75+
agent.postEvent(browser, event)
7376
}
7477

7578
override fun dispose() {

0 commit comments

Comments
 (0)