共计 2491 个字符,预计需要花费 7 分钟才能阅读完成。
背景痛点
在日常开发中,我们经常会遇到这样的场景:正在 IDEA 里写代码时,突然需要查找某个 API 的用法或解决一个报错,不得不切到浏览器搜索,然后手动把解决方案抄回 IDE。这个过程不仅打断思路,还会造成上下文切换的认知负担。更不用说那些重复性的模板代码编写,既耗时又容易出错。

技术方案对比
目前集成 ChatGPT 主要有三种方式:
- OpenAI 官方 API
- 优点:功能最全,更新及时
-
缺点:需要自行处理认证、上下文管理等
-
第三方封装 SDK
- 优点:简化了基础调用
-
缺点:可能缺少最新功能,额外依赖
-
直接插件集成
- 优点:深度结合 IDE 特性,体验无缝
- 缺点:开发成本较高
综合来看,对于 IDE 插件场景,直接集成 API 是最佳选择,既能充分利用 IDE 能力,又能保证功能完整性。
核心实现
OAuth2.0 鉴权实现
使用 Kotlin 实现的安全认证流程:
class AuthService {private val client = HttpClient(CIO) {install(JsonFeature) {serializer = KotlinxSerializer()
}
}
// 使用环境变量保护 API 密钥
private val apiKey = System.getenv("OPENAI_API_KEY")
suspend fun authenticate(): String {val response: HttpResponse = client.post("https://api.openai.com/v1/chat/completions") {
headers {append("Authorization", "Bearer $apiKey")
append("Content-Type", "application/json")
}
}
return response.status.toString()}
}
上下文保持设计
采用环形缓冲区存储最近 5 次对话:
class ConversationContext(private val capacity: Int = 5) {private val buffer = ArrayDeque<String>(capacity)
fun addMessage(role: String, content: String) {if (buffer.size >= capacity) {buffer.removeFirst()
}
buffer.add("{\"role\":\"$role\",\"content\":\"${content.escape()}\"}")
}
fun getContext(): String = buffer.joinToString(",")
}
代码示例
plugin.xml 配置
<idea-plugin>
<id>com.your.company.chatgpt</id>
<name>ChatGPT Assistant</name>
<depends>com.intellij.modules.platform</depends>
<extensions defaultExtensionNs="com.intellij">
<toolWindow id="ChatGPT" anchor="right"
factoryClass="com.your.company.ChatGPTToolWindowFactory"/>
</extensions>
<actions>
<action id="ChatGPT.GenerateCode" class="com.your.company.GenerateCodeAction"
text="Generate Code" description="Generate code using ChatGPT">
<add-to-group group-id="EditorPopupMenu" anchor="last"/>
</action>
</actions>
</idea-plugin>
异步调用实现
suspend fun getCompletion(prompt: String): String {return withContext(Dispatchers.IO) {
val response = client.post<ChatCompletionResponse> {url("https://api.openai.com/v1/chat/completions")
body = ChatCompletionRequest(
model = "gpt-3.5-turbo",
messages = listOf(Message(role = "user", content = prompt))
)
}
response.choices.first().message.content}
}
生产环境考量
重试机制实现
private suspend fun <T> retry(
times: Int = 3,
initialDelay: Long = 100,
maxDelay: Long = 1000,
factor: Double = 2.0,
block: suspend () -> T): T {
var currentDelay = initialDelay
repeat(times - 1) { attempt ->
try {return block()
} catch (e: Exception) {delay(currentDelay)
currentDelay = (currentDelay * factor).toLong().coerceAtMost(maxDelay)
}
}
return block() // 最后一次尝试}
避坑指南
- Token 控制
- 使用
tiktoken库计算 token 数 -
设置 max_tokens 参数防止超额收费
-
大文件处理
- 按 1000 行分块处理
-
维护块间上下文关联
-
版本兼容
- 测试支持 2021.3+ 版本
- 使用
<since-build>和<until-build>标签
动手实验
尝试扩展功能:自动生成单元测试
- 选中目标方法
- 通过右键菜单调用 ”Generate Test”
- 观察生成的测试用例
- 优化 prompt 提高生成质量
完整项目代码已开源在 GitHub,欢迎一起完善这个提高开发者效率的工具!
正文完
发表至: 软件开发
近一天内
