通义千问1.5-1.8B-Chat-GPTQ-Int4 IntelliJ IDEA下载安装后的AI插件开发入门
通义千问1.5-1.8B-Chat-GPTQ-Int4 IntelliJ IDEA下载安装后的AI插件开发入门刚下载安装好IntelliJ IDEA看着这个强大的开发环境你是不是也想给它加点“魔法”想象一下在写代码时旁边有个聪明的助手能帮你解释复杂代码、自动生成单元测试甚至给你写代码建议。今天我们就来动手实现它。这篇文章我会手把手带你用通义千问1.5-1.8B-Chat-GPTQ-Int4这个轻量又高效的模型开发你的第一个IntelliJ IDEA AI插件。整个过程不需要你精通复杂的插件架构跟着步骤走你就能让IDEA“开口说话”变成一个懂编程的智能伙伴。我们的目标是创建一个插件选中一段代码右键菜单里多出一个“Ask Qwen”的选项点击后能把代码发给通义千问模型然后把模型的回答比如代码解释、测试用例漂亮地展示在IDEA里。1. 环境准备与项目创建万事开头难但第一步往往最简单。确保你已经完成了IntelliJ IDEA的下载安装并且能正常打开。接下来我们一步步搭建插件开发环境。1.1 安装必备插件打开你的IDEA我们先给它装点“开发插件”的工具。点击File-Settings或者按CtrlAltS找到Plugins选项。在 Marketplace 标签页里搜索并安装这两个插件Plugin DevKit这是IntelliJ平台插件开发的官方工具包必须安装。Gradle我们会用Gradle来管理项目依赖和构建它比传统的Ant更现代、更好用。安装完成后重启一下IDEA让插件生效。1.2 创建Gradle插件项目重启后我们开始创建项目。点击File-New-Project...。在左侧项目类型中选择Gradle。在右侧确保勾选了Java和IntelliJ Platform Plugin。IntelliJ Platform Plugin这个选项只有在安装了Plugin DevKit后才会出现。点击Next。接下来配置项目GroupId: 可以填你的域名倒序比如com.yourname。这里我们简单点填com.example。ArtifactId: 这是你的插件名字我们叫它qwen-idea-plugin。Version: 保持默认的1.0-SNAPSHOT就行。Project SDK: 确保这里选择了你电脑上的JDK比如JDK 11或17。IntelliJ插件开发通常需要JDK 11及以上。继续点击Next在Gradle配置页面使用默认设置即可Gradle JVM选Project SDK再点Next。 最后给你的项目选一个存放的文件夹点击Finish。IDEA会花一点时间创建项目并下载Gradle依赖泡杯茶等一下。2. 理解插件项目结构项目创建好后我们快速浏览一下几个关键文件知道它们都是干嘛的后面改起来心里有数。src/main/resources/META-INF/plugin.xml: 这是插件的“身份证”和“说明书”。所有插件相关的配置比如插件名、描述、版本、依赖、扩展点我们后面加的菜单、动作都在这里声明都在这个文件里。build.gradle.kts: 这是项目的构建脚本用Kotlin DSL写的。我们在这里添加项目依赖比如待会儿要用的HTTP客户端库。src/main/java: 这里就是放我们Java源代码的地方了。我们的核心工作就是修改plugin.xml来声明功能在java目录下写代码实现逻辑在build.gradle.kts里加依赖。3. 开发核心功能一个AI对话动作插件开发的核心是“动作”Action。你可以把它理解为一个事件处理器当用户点击某个菜单项或按钮时对应的Action代码就会被执行。3.1 创建我们的第一个Action我们在src/main/java下新建一个包比如com.example.qwen。然后在这个包里新建一个Java类命名为QwenCodeAction。这个类需要继承AnAction类。下面是一个最基础的骨架代码package com.example.qwen; import com.intellij.openapi.actionSystem.AnAction; import com.intellij.openapi.actionSystem.AnActionEvent; import com.intellij.openapi.ui.Messages; import org.jetbrains.annotations.NotNull; public class QwenCodeAction extends AnAction { Override public void actionPerformed(NotNull AnActionEvent e) { // 这是点击菜单后执行的核心逻辑 Messages.showInfoMessage(Hello from Qwen Plugin!, Qwen); } }现在这个Action被触发时只会弹出一个写着“Hello from Qwen Plugin!”的信息框。我们先用它来测试动作是否绑定成功。3.2 在plugin.xml中注册Action光有Action类还不行我们需要告诉IDEA这个Action的存在并把它绑定到右键菜单上。打开src/main/resources/META-INF/plugin.xml文件。在extensions节点内添加以下配置actions action idcom.example.qwen.QwenCodeAction classcom.example.qwen.QwenCodeAction textAsk Qwen descriptionSend selected code to Qwen for analysis add-to-group group-idEditorPopupMenu anchorfirst/ /action /actions我来解释一下这几个关键属性id: Action的唯一标识符通常用全限定类名。class: 我们刚才写的Action类的全限定名。text: 显示在菜单上的文字。description: 鼠标悬停时的提示文字。add-to-group: 把这个Action添加到哪个菜单组。EditorPopupMenu就是编辑器的右键菜单。anchorfirst表示放在这个菜单组的最前面。3.3 运行并测试插件激动人心的时刻到了我们要第一次运行自己的插件了。在IDEA右上角点击Add Configuration...然后点击号选择Plugin。“Name”可以填Run Plugin。在“JRE”处确保选择了你的项目JDK。点击OK保存配置。现在点击绿色的运行按钮或使用快捷键ShiftF10。IDEA会启动一个新的“沙盒”实例这个实例里就安装了我们正在开发的插件。在新打开的IDEA窗口中随便打开或创建一个Java文件在编辑器里右键点击你应该能看到菜单顶部出现了“Ask Qwen”的选项。点击它如果成功弹出我们写的“Hello”信息框恭喜你插件的基础框架通了。4. 集成通义千问模型API让插件能打招呼只是第一步现在我们来给它装上“大脑”——连接通义千问模型。4.1 添加HTTP依赖我们需要一个库来发送HTTP请求到模型API。修改build.gradle.kts文件在dependencies块里添加以下内容dependencies { // 其他依赖... implementation(com.squareup.okhttp3:okhttp:4.12.0) // 用于HTTP请求 implementation(com.fasterxml.jackson.core:jackson-databind:2.16.1) // 用于JSON解析 }添加后IDEA右上角会提示Gradle同步点击“Sync Now”即可。4.2 实现API调用逻辑我们回到QwenCodeAction类重写actionPerformed方法实现真正的功能获取选中的代码调用通义千问API并显示结果。这里假设你有一个可用的通义千问API端点例如通过DashScope等平台获取。我们需要一个方法来发送请求。我们在同一个包下创建一个工具类QwenClientpackage com.example.qwen; import com.fasterxml.jackson.databind.ObjectMapper; import okhttp3.*; import java.io.IOException; public class QwenClient { private static final String API_URL YOUR_API_ENDPOINT_HERE; // 替换为你的API地址 private static final String API_KEY YOUR_API_KEY_HERE; // 替换为你的API Key private static final OkHttpClient client new OkHttpClient(); private static final ObjectMapper mapper new ObjectMapper(); public static String chatWithQwen(String prompt) throws IOException { // 1. 构建请求体 (JSON格式) String requestBody String.format({\model\: \qwen1.5-1.8b-chat-gptq-int4\, \messages\: [{\role\: \user\, \content\: \%s\}]}, prompt); RequestBody body RequestBody.create( requestBody, MediaType.get(application/json; charsetutf-8) ); // 2. 构建请求 Request request new Request.Builder() .url(API_URL) .post(body) .addHeader(Authorization, Bearer API_KEY) // 根据你的API认证方式调整 .addHeader(Content-Type, application/json) .build(); // 3. 发送请求并获取响应 try (Response response client.newCall(request).execute()) { if (!response.isSuccessful()) { throw new IOException(Unexpected code response); } String responseBody response.body().string(); // 4. 这里需要根据你API返回的实际JSON结构来解析 // 假设返回格式为 {choices:[{message:{content:回答内容}}]} // 这是一个简化示例实际解析需要匹配你的API响应 return extractContentFromResponse(responseBody); } } private static String extractContentFromResponse(String jsonResponse) throws IOException { // 使用Jackson解析JSON这里需要你根据API返回的实际结构编写 // 例如 // JsonNode rootNode mapper.readTree(jsonResponse); // return rootNode.path(choices).get(0).path(message).path(content).asText(); // 为了示例我们先直接返回原始响应或一个提示 return API Response: jsonResponse.substring(0, Math.min(100, jsonResponse.length())) ...; } }重要提示你需要将API_URL和API_KEY替换成你自己获取的真实值。并且extractContentFromResponse方法需要根据你使用的通义千问API的实际返回JSON格式进行调整。4.3 完善Action获取代码与调用现在修改QwenCodeAction的actionPerformed方法Override public void actionPerformed(NotNull AnActionEvent e) { // 1. 获取当前项目和编辑器 Project project e.getProject(); Editor editor e.getData(CommonDataKeys.EDITOR); if (editor null || project null) { Messages.showErrorDialog(Please open a file in the editor first., Error); return; } // 2. 获取选中的文本代码 SelectionModel selectionModel editor.getSelectionModel(); String selectedText selectionModel.getSelectedText(); if (selectedText null || selectedText.trim().isEmpty()) { Messages.showErrorDialog(Please select some code first., Error); return; } // 3. 构建发送给模型的提示词 String prompt 请分析以下代码并给出简要解释和可能的单元测试用例\njava\n selectedText \n; // 4. 在后台线程中调用API避免阻塞UI ApplicationManager.getApplication().executeOnPooledThread(() - { try { String response QwenClient.chatWithQwen(prompt); // 5. 回到UI线程显示结果 ApplicationManager.getApplication().invokeLater(() - { Messages.showMessageDialog(project, response, Qwens Analysis, Messages.getInformationIcon()); }); } catch (IOException ex) { ApplicationManager.getApplication().invokeLater(() - { Messages.showErrorDialog(Failed to call Qwen API: ex.getMessage(), API Error); }); } }); // 给用户一个提示表示请求已发送 Messages.showInfoMessage(Query sent to Qwen, please wait..., Qwen); }别忘了在类顶部导入必要的包import com.intellij.openapi.editor.Editor; import com.intellij.openapi.editor.SelectionModel; import com.intellij.openapi.project.Project; import com.intellij.openapi.application.ApplicationManager;5. 优化交互使用对话框展示结果直接用Messages.showMessageDialog显示结果可能不够美观尤其是当模型返回内容很长时。我们可以创建一个更友好的对话框来展示。5.1 创建自定义对话框在com.example.qwen包下新建一个类QwenResultDialogpackage com.example.qwen; import com.intellij.openapi.ui.DialogWrapper; import org.jetbrains.annotations.Nullable; import javax.swing.*; public class QwenResultDialog extends DialogWrapper { private final String result; public QwenResultDialog(String result) { super(true); // 当前模式 this.result result; setTitle(Qwens Analysis Result); init(); } Override protected Nullable JComponent createCenterPanel() { JTextArea textArea new JTextArea(result, 20, 50); textArea.setLineWrap(true); textArea.setWrapStyleWord(true); textArea.setEditable(false); JScrollPane scrollPane new JScrollPane(textArea); return scrollPane; } }5.2 在Action中使用新对话框修改QwenCodeAction中显示结果的部分将Messages.showMessageDialog替换为ApplicationManager.getApplication().invokeLater(() - { QwenResultDialog dialog new QwenResultDialog(response); dialog.show(); });现在当API返回结果后会弹出一个带滚动条、大小可调的对话框来展示模型的分析阅读体验就好多了。6. 运行与调试完整流程再次点击运行按钮或ShiftF10启动插件沙盒环境进行完整测试在新IDEA中创建一个Java类写一段简单的代码比如一个计算阶乘的方法。用鼠标选中这段方法代码。右键点击选择“Ask Qwen”。你应该会先看到一个“请求已发送”的提示。稍等片刻取决于网络和API速度会弹出一个漂亮的对话框里面包含了通义千问模型对你代码的分析、解释和单元测试建议。如果遇到API调用错误请检查QwenClient中的URL和Key是否正确以及网络连接是否正常。你可以在catch块中打印更详细的错误信息来辅助调试。7. 下一步可以做什么走到这里你已经成功开发了一个能跑通的IntelliJ IDEA AI插件原型。它虽然简单但具备了核心功能感知用户操作、与AI模型交互、展示结果。你可以在这个基础上像搭积木一样添加更多有趣的功能优化提示词工程根据不同的代码场景解释、重构、生成测试、查找Bug设计更专业的提示词让模型的回答更精准。丰富UI界面把简单的对话框升级成更复杂的工具窗口ToolWindow可以常驻在IDE侧边栏支持对话历史、多轮聊天。处理更多上下文不仅获取选中的代码还能获取整个文件、项目结构的信息提供给模型作为上下文让分析更全面。代码直接应用让插件不仅能给出建议还能一键将模型生成的代码如单元测试插入到当前文件中。支持更多模型抽象出AI客户端的接口方便切换不同的模型后端比如除了通义千问还可以接其他大模型。开发插件的过程就是不断探索IDEA平台能力的过程。每当你想到“要是IDEA能自动帮我做这个就好了”很可能就是一个新插件功能的起点。希望这个入门教程能成为你探索IDEA插件世界的第一块敲门砖。动手去改、去试、去加功能乐趣就在其中。获取更多AI镜像想探索更多AI镜像和应用场景访问 CSDN星图镜像广场提供丰富的预置镜像覆盖大模型推理、图像生成、视频生成、模型微调等多个领域支持一键部署。