diff --git a/src/main/kotlin/cc/unitmesh/devti/connector/openai/OpenCodeCopilot.kt b/src/main/kotlin/cc/unitmesh/devti/connector/openai/OpenCodeCopilot.kt index 0dee46f23e..85cdc73158 100644 --- a/src/main/kotlin/cc/unitmesh/devti/connector/openai/OpenCodeCopilot.kt +++ b/src/main/kotlin/cc/unitmesh/devti/connector/openai/OpenCodeCopilot.kt @@ -5,14 +5,22 @@ import cc.unitmesh.devti.connector.CodeCopilot import cc.unitmesh.devti.connector.DevtiFlowAction import cc.unitmesh.devti.kanban.SimpleProjectInfo import cc.unitmesh.devti.prompt.parseCodeFromString +import cc.unitmesh.devti.settings.DevtiSettingsState import com.intellij.openapi.diagnostic.Logger import com.intellij.openapi.diagnostic.logger import com.intellij.openapi.util.NlsSafe +import com.intellij.psi.codeStyle.arrangement.std.StdArrangementSettingsToken.token +import com.theokanning.openai.OpenAiApi import com.theokanning.openai.completion.chat.ChatCompletionRequest import com.theokanning.openai.completion.chat.ChatMessage import com.theokanning.openai.completion.chat.ChatMessageRole import com.theokanning.openai.service.OpenAiService +import com.theokanning.openai.service.OpenAiService.defaultClient +import com.theokanning.openai.service.OpenAiService.defaultObjectMapper +import com.theokanning.openai.service.OpenAiService.defaultRetrofit import kotlinx.coroutines.runBlocking +import java.net.InetSocketAddress +import java.net.Proxy import java.time.Duration @@ -20,8 +28,23 @@ class OpenCodeCopilot(val openAIKey: String, val version: String) : CodeCopilot, private val promptGenerator = PromptGenerator() private lateinit var service: OpenAiService + private val timeout = Duration.ofSeconds(600) + init { - service = OpenAiService(openAIKey, Duration.ofSeconds(600)) + val openAiProxy = DevtiSettingsState.getInstance()?.openAiProxy + if (openAiProxy.isNullOrEmpty()) { + service = OpenAiService(openAIKey, timeout) + } else { + val mapper = defaultObjectMapper() + val proxy = Proxy(Proxy.Type.HTTP, InetSocketAddress(openAiProxy, 80)) + val client = defaultClient(openAIKey, timeout) + .newBuilder() + .proxy(proxy) + .build() + val retrofit = defaultRetrofit(client, mapper) + val api = retrofit.create(OpenAiApi::class.java) + service = OpenAiService(api); + } } private fun prompt(instruction: String): String { diff --git a/src/main/kotlin/cc/unitmesh/devti/settings/DevtiSettingsConfigurable.kt b/src/main/kotlin/cc/unitmesh/devti/settings/DevtiSettingsConfigurable.kt index a2108d9033..1af182fb3a 100644 --- a/src/main/kotlin/cc/unitmesh/devti/settings/DevtiSettingsConfigurable.kt +++ b/src/main/kotlin/cc/unitmesh/devti/settings/DevtiSettingsConfigurable.kt @@ -28,6 +28,7 @@ class DevtiSettingsConfigurable : Configurable { var modified = !mySettingsComponent!!.openAiKey.equals(settings.openAiKey) modified = modified or (!mySettingsComponent!!.githubToken.equals(settings.githubToken)) modified = modified or (!mySettingsComponent!!.openAiVersion.equals(settings.openAiVersion)) + modified = modified or (!mySettingsComponent!!.openAiProxy.equals(settings.openAiProxy)) return modified } @@ -36,6 +37,7 @@ class DevtiSettingsConfigurable : Configurable { settings.openAiKey = mySettingsComponent!!.getOpenAiKey() settings.githubToken = mySettingsComponent!!.getGithubToken() settings.openAiVersion = mySettingsComponent!!.getOpenAiVersion() + settings.openAiProxy = mySettingsComponent!!.getOpenAiProxy() } override fun reset() { @@ -43,6 +45,7 @@ class DevtiSettingsConfigurable : Configurable { mySettingsComponent!!.setOpenAiKey(settings.openAiKey) mySettingsComponent!!.setGithubToken(settings.githubToken) mySettingsComponent!!.setOpenAiVersion(settings.openAiVersion) + mySettingsComponent!!.setOpenAiProxy(settings.openAiProxy) } override fun disposeUIResources() {