当前位置: 首页 > news >正文

如何开发一个 IDEA 插件通过 Ollama 调用大模型为方法生成仙侠风格的注释

如何开发一个 IDEA 插件通过 Ollama 调用大模型为方法生成仙侠风格的注释

本文将介绍如何创建一个 IntelliJ IDEA 插件,该插件可以通过 Ollama 调用大型语言模型为 Java 方法生成具有仙侠风格的注释。

项目结构与配置

首先我们需要建立一个基本的 IntelliJ Platform Plugin 项目,并在 plugin.xml中定义插件的基本信息:

<idea-plugin><id>cn.wubo.xianxiacomment</id><name>Xianxiacomment</name><vendor url="https://gitee.com/wb04307201/XianxiaComment">wubo</vendor><description><![CDATA[通过 Ollama 调用大模型为方法生成仙侠风格注释并自动插入<br><em>右键点击方法,选择生成修仙注释即可使用</em>]]></description><depends>com.intellij.modules.platform</depends><depends>com.intellij.modules.java</depends>
</idea-plugin>

实现核心功能

配置服务

为了使用户能够自定义 Ollama 地址和使用的模型名称,我们实现了 OllamaConfigService和 OllamaConfigurable类。这些类允许用户在设置中输入他们的 Ollama URL 和希望使用的大模型名称。

动作处理器

接下来是实现主要逻辑的部分 —— 创建一个动作处理器 GenerateXianXiaCommentAction来响应用户的操作请求。这个类继承自 AnAction 并重写了几个关键的方法:

  • actionPerformed: 处理实际的动作事件。
  • update: 控制菜单项何时可见以及是否启用。
  • getActionUpdateThread: 定义更新 UI 的线程。

当用户右键单击某个 Java 方法并选择“生成修仙注释”时,会触发 actionPerformed方法。此方法检查当前选中的元素是否为 PsiMethod 类型,如果是,则开始执行后台任务来获取注释。

if (element is PsiMethod) {val methodText = element.textval settings = OllamaConfigService.instanceobject : Task.Backgroundable(project, "正在生成仙侠注释...", true) {override fun run(indicator: ProgressIndicator) {indicator.text = "正在调用 Ollama 服务..."val comment = callOllama(settings.ollamaUrl, settings.modelName, methodText)WriteCommandAction.runWriteCommandAction(project) {insertComment(element, comment)}}override fun onThrowable(error: Throwable) {// Handle error}}.queue()
}

调用 Ollama API

核心部分在于 callOllama 函数,它负责构建请求体并向 Ollama 发送 POST 请求以获得生成的注释内容。这里使用了 OkHttp 库来进行网络通信。

private fun callOllama(url: String, model: String, methodText: String): String {val prompt = "请为以下方法生成仙侠风格的注释,只返回注释内容,不要包含任何其他内容:\n\n$methodText"val json = JSONObject()json.put("model", model)json.put("prompt", prompt)json.put("stream", false)val body = json.toString().toRequestBody("application/json; charset=utf-8".toMediaType())val request = Request.Builder().url("$url/api/generate").post(body).build()client.newBuilder().connectTimeout(600, java.util.concurrent.TimeUnit.SECONDS).build().newCall(request).execute().use { response ->val responseBody = response.body?.string()if (response.isSuccessful && responseBody != null) {val jsonResponse = JSONObject(responseBody)return jsonResponse.getString("response")}return "// 未能生成注释"}
}

最后,在收到返回的结果后,利用 insertComment将生成的注释放置到对应的方法上方。

private fun insertComment(method: PsiMethod, comment: String) {method.addCommentBefore(comment)
}

以上就是整个插件的核心流程。通过这种方式,我们可以轻松地扩展更多有趣的功能,例如支持不同的编程语言或者提供更多样式的注释模板等。

示例

我们用一段两数之和算法进行测试

    public int[] twoSum(int[] nums, int target) {if (nums == null || nums.length < 2) {return new int[0];}Map<Integer, Integer> map = new HashMap<>();for (int i = 0; i < nums.length; i++) {int temp = target - nums[i];if (map.containsKey(temp)) {return new int[]{map.get(temp), i};}map.put(nums[i], i);}return new int[0];}

在这里插入图片描述
在这里插入图片描述
[示例代码](https://gitee.com/wb04307201/XianxiaComment)

http://www.dtcms.com/a/511423.html

相关文章:

  • 【论文精读】Latent-Shift:基于时间偏移模块的高效文本生成视频技术
  • unity基础学习笔记<上>
  • C# WPF Dragablz使用记录 TabControl选项卡可拖拽为单独界面或停靠
  • 机器人场景落地步入技术验证阶段,微美全息加快创新势能探索AI多元路径变革
  • YOLOv4 核心内容笔记
  • 网站开发工程师待遇家庭网站建设
  • 医疗门户网站模板wordpress3.8
  • iOS的多线程下数据安全和内存泄漏以及工具使用监测内存泄漏
  • 『CMake』关于使用CMake构建项目时的现代/传统指令
  • 请被人做网站怎么做倒计时网站
  • App开发框架调研对比
  • Ubuntu下载以及安装详解以及应用安装
  • 亚马逊云代理:AWS的EC2, S3, RDS,Lambda具体简介
  • 2640. QYQ在艾泽拉斯
  • 基于 React + TypeScript + Fabric.js 构建一个封面生成器网站
  • 营销型电子商务网站品牌建设与推广思路
  • 更新网站 seo公司的管理方式与管理方法
  • BZV49-C22,115稳压二极管 NXP安世半导体 工业电源芯片 芯片解析
  • 职场发展—如何避雷垃圾公司
  • 【Linux篇】软链接vs硬链接:Linux文件系统中的两种引用机制
  • C++ list核心接口与实战技巧
  • 微服务框架
  • 网站模块结构图wordpress调用栏目名称
  • 算法学习记录03——二叉树学习笔记:从两道题看透后序位置的关键作用​
  • Rust高性能分布式任务调度系统开发实践:从设计到性能优化
  • go tools安装
  • 阿里云代理商:如何给阿里云配置网络ACL?
  • 阿里巴巴 Java 开发手册解读:DO、DTO、BO、AO、VO、Query 的区别与用法
  • 接口测试如何做
  • 记录日常日志