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

从零开始:开发你的第一个 VS Code AI 插件

从零开始开发你的第一个 VS Code AI 插件一、为什么开发自己的 AI 插件市面上的 AI 插件很多GitHub Copilot、Cursor、Codeium但开发自己的插件有以下优势完全可控- 选择自己的模型、定价、功能定制化- 针对团队或项目特殊需求成本优化- 使用性价比更高的模型 API数据隐私- 代码不会发送到第三方服务二、环境准备2.1 必需工具# 安装 Node.js (v18)brewinstallnode# 安装 Yeoman 和 VS Code 扩展生成器npminstall-gyo generator-code# 安装 VSCE发布工具npminstall-gvscode/vsce2.2 创建插件项目# 生成插件骨架yo code# 按提示选择# - What type of extension? → New Extension (TypeScript)# - Whats the name of your extension? → ai-code-assistant# - Whats the identifier of your extension? → ai-code-assistant# - Whats the description? → AI Code Assistant with LLM integration# - Whats the base editor? → TypeScript# - Initialize a git repo? → Yes# - Which package manager? → npm# - Install dependencies with npm? → Yes2.3 项目结构ai-code-assistant/ ├── src/ │ └── extension.ts # 主入口 ├── package.json # 插件配置 ├── tsconfig.json # TypeScript 配置 └── .vscodeignore # 发布时忽略的文件三、核心功能实现3.1 安装依赖cdai-code-assistantnpminstallopenai axiosnpminstall--save-dev types/node3.2 配置 API Key在package.json中添加配置项{contributes:{configuration:{title:AI Code Assistant,properties:{aiCodeAssistant.apiKey:{type:string,default:,description:Your LLM API Key (e.g., OpenAI, Anthropic, Aliyun)},aiCodeAssistant.model:{type:string,default:qwen-plus,description:Model to use for code generation},aiCodeAssistant.endpoint:{type:string,default:https://dashscope.aliyuncs.com/compatible-mode/v1,description:API endpoint URL}}}}}3.3 实现 AI 服务类创建src/ai-service.tsimportOpenAIfromopenai;import*asvscodefromvscode;exportclassAIService{privateclient:OpenAI;constructor(){constconfigvscode.workspace.getConfiguration(aiCodeAssistant);constapiKeyconfig.get(apiKey,);constendpointconfig.get(endpoint,);if(!apiKey){thrownewError(请先配置 API Key);}this.clientnewOpenAI({apiKey,baseURL:endpoint,});}/** * 代码解释 */asyncexplainCode(code:string,language:string):Promisestring{constresponseawaitthis.client.chat.completions.create({model:qwen-plus,messages:[{role:system,content:你是一位专业的代码讲解助手。请用简洁清晰的语言解释代码的功能、逻辑和关键点。,},{role:user,content:请解释这段${language}代码\n\n\\\${language}\n${code}\n\\\,},],temperature:0.3,max_tokens:1000,});returnresponse.choices[0].message.content||;}/** * 代码生成 */asyncgenerateCode(prompt:string,language:string):Promisestring{constresponseawaitthis.client.chat.completions.create({model:qwen-plus,messages:[{role:system,content:你是一位专业的代码生成助手。请根据用户需求生成高质量、可运行的代码。,},{role:user,content:请生成${language}代码${prompt},},],temperature:0.7,max_tokens:2000,});returnthis.extractCode(response.choices[0].message.content||);}/** * 代码重构 */asyncrefactorCode(code:string,language:string,instruction:string):Promisestring{constresponseawaitthis.client.chat.completions.create({model:qwen-plus,messages:[{role:system,content:你是一位代码重构专家。请在保持功能不变的前提下优化代码结构、性能和可读性。,},{role:user,content:请重构这段${language}代码要求${instruction}\n\n原始代码\n\\\${language}\n${code}\n\\\,},],temperature:0.5,max_tokens:2000,});returnthis.extractCode(response.choices[0].message.content||);}/** * 从响应中提取代码块 */privateextractCode(content:string):string{constcodeBlockRegex/[\w]*\n([\s\S]*?)\n/;constmatchcontent.match(codeBlockRegex);returnmatch?match[1]:content;}}3.4 实现命令处理器创建src/commands.tsimport*asvscodefromvscode;import{AIService}from./ai-service;exportclassCommandHandler{privateaiService:AIService;constructor(){this.aiServicenewAIService();}/** * 解释选中的代码 */asyncexplainSelection(){consteditorvscode.window.activeTextEditor;if(!editor){vscode.window.showErrorMessage(请先打开一个文件);return;}constselectioneditor.selection;if(selection.isEmpty){vscode.window.showErrorMessage(请先选中一段代码);return;}constcodeeditor.document.getText(selection);constlanguageeditor.document.languageId;vscode.window.withProgress({location:vscode.ProgressLocation.Notification,title:AI 正在分析代码...,cancellable:false,},async(){try{constexplanationawaitthis.aiService.explainCode(code,language);// 在输出面板显示constoutputChannelvscode.window.createOutputChannel(AI Code Assistant);outputChannel.appendLine( 代码解释 );outputChannel.appendLine(explanation);outputChannel.show();// 或者显示为 webviewthis.showExplanationWebview(explanation);}catch(error:any){vscode.window.showErrorMessage(AI 解释失败${error.message});}});}/** * 根据提示生成代码 */asyncgenerateFromPrompt(){constpromptawaitvscode.window.showInputBox({prompt:描述你想要生成的代码,placeHolder:例如创建一个函数计算两个数的最大公约数,});if(!prompt){return;}consteditorvscode.window.activeTextEditor;if(!editor){vscode.window.showErrorMessage(请先打开一个文件);return;}constlanguageeditor.document.languageId;vscode.window.withProgress({location:vscode.ProgressLocation.Notification,title:AI 正在生成代码...,cancellable:false,},async(){try{constcodeawaitthis.aiService.generateCode(prompt,language);// 插入到光标位置constpositioneditor.selection.active;awaiteditor.edit(editBuilder{editBuilder.insert(position,code);});vscode.window.showInformationMessage(代码生成成功);}catch(error:any){vscode.window.showErrorMessage(代码生成失败${error.message});}});}/** * 重构选中的代码 */asyncrefactorSelection(){consteditorvscode.window.activeTextEditor;if(!editor){return;}constselectioneditor.selection;if(selection.isEmpty){vscode.window.showErrorMessage(请先选中一段代码);return;}constinstructionawaitvscode.window.showInputBox({prompt:描述重构要求,placeHolder:例如优化性能、提高可读性、添加错误处理,});if(!instruction){return;}constcodeeditor.document.getText(selection);constlanguageeditor.document.languageId;vscode.window.withProgress({location:vscode.ProgressLocation.Notification,title:AI 正在重构代码...,cancellable:false,},async(){try{constnewCodeawaitthis.aiService.refactorCode(code,language,instruction);// 替换选中的代码awaiteditor.edit(editBuilder{editBuilder.replace(selection,newCode);});vscode.window.showInformationMessage(代码重构完成);}catch(error:any){vscode.window.showErrorMessage(重构失败${error.message});}});}privateshowExplanationWebview(content:string){constpanelvscode.window.createWebviewPanel(aiExplanation,AI 代码解释,vscode.ViewColumn.Beside,{});panel.webview.html!DOCTYPE html html head meta charsetUTF-8 style body { font-family: var(--vscode-font-family); padding: 20px; } pre { background: var(--vscode-editor-background); padding: 10px; border-radius: 4px; } /style /head body h2AI 代码解释/h2 div${content.replace(/\n/g,br)}/div /body /html;}}3.5 注册命令修改src/extension.tsimport*asvscodefromvscode;import{CommandHandler}from./commands;exportfunctionactivate(context:vscode.ExtensionContext){console.log(AI Code Assistant 已激活);consthandlernewCommandHandler();// 注册命令context.subscriptions.push(vscode.commands.registerCommand(aiCodeAssistant.explain,(){handler.explainSelection();}));context.subscriptions.push(vscode.commands.registerCommand(aiCodeAssistant.generate,(){handler.generateFromPrompt();}));context.subscriptions.push(vscode.commands.registerCommand(aiCodeAssistant.refactor,(){handler.refactorSelection();}));}exportfunctiondeactivate(){}四、配置快捷键在package.json中添加快捷键绑定{contributes:{keybindings:[{command:aiCodeAssistant.explain,key:ctrlshifte,mac:cmdshifte,when:editorTextSelection},{command:aiCodeAssistant.generate,key:ctrlshiftg,mac:cmdshiftg},{command:aiCodeAssistant.refactor,key:ctrlshiftr,mac:cmdshiftr,when:editorTextSelection}],menus:{editor/context:[{command:aiCodeAssistant.explain,group:ai-assistant,when:editorTextSelection},{command:aiCodeAssistant.refactor,group:ai-assistant,when:editorTextSelection}]}}}五、测试插件5.1 本地调试# 在 VS Code 中按 F5 启动调试# 这会打开一个新的 VS Code 窗口Extension Development Host# 在新窗口中测试插件功能5.2 测试清单配置 API Key 后插件正常工作选中代码后右键菜单显示 AI 命令快捷键触发命令正常代码解释功能正常代码生成功能正常代码重构功能正常错误处理友好API Key 无效、网络错误等六、打包发布6.1 打包# 打包成 .vsix 文件vsce package6.2 发布到 Marketplace# 登录需要 Microsoft 账号vsce loginpublisher-name# 发布vsce publish6.3 本地安装# 安装 .vsix 文件code --install-extension ai-code-assistant-0.0.1.vsix七、进阶功能建议7.1 可以添加的功能上下文感知- 分析整个项目结构提供更准确的建议单元测试生成- 根据代码自动生成测试用例代码审查- 自动检测潜在 bug 和安全问题文档生成- 根据代码生成 API 文档多模型支持- 支持切换不同的大模型对话模式- 在侧边栏实现聊天界面7.2 性能优化流式响应- 实时显示 AI 生成的内容请求缓存- 相同请求返回缓存结果批量处理- 合并多个小请求离线模式- 本地小模型处理简单任务八、总结开发 VS Code AI 插件的核心步骤环境搭建- Yeoman 生成器创建骨架API 集成- 对接大模型服务命令实现- 解释、生成、重构等功能UI 交互- 快捷键、右键菜单、Webview测试发布- 调试、打包、上架关键要点从简单功能开始逐步迭代重视错误处理和用户体验合理配置 API 调用频率和成本收集用户反馈持续优化现在就开始开发你的第一个 VS Code AI 插件吧

相关文章:

从零开始:开发你的第一个 VS Code AI 插件

从零开始:开发你的第一个 VS Code AI 插件 一、为什么开发自己的 AI 插件? 市面上的 AI 插件很多(GitHub Copilot、Cursor、Codeium),但开发自己的插件有以下优势: 完全可控 - 选择自己的模型、定价、功能定…...

yz-bijini-cosplay一文详解:LoRA无感切换在Cosplay风格AB测试中的提效价值

yz-bijini-cosplay一文详解:LoRA无感切换在Cosplay风格AB测试中的提效价值 1. 为什么Cosplay创作者需要“LoRA无感切换”? 你有没有试过这样的情景: 刚调好一个提示词,生成了三张图,觉得人物发色偏暗,想换…...

cv_unet_image-colorization模型部署到内网环境:离线化企业级解决方案

cv_unet_image-colorization模型部署到内网环境:离线化企业级解决方案 1. 引言 想象一下,你在一家金融机构或者军工单位的技术部门工作。你们手头有大量珍贵的历史黑白文档、老照片或者监控录像需要数字化和修复,其中一项关键任务就是给这些…...

10. GD32E230独立按键硬件原理与软件消抖实战

10. GD32E230独立按键硬件原理与软件消抖实战 大家好,我是老李,一个在嵌入式行业摸爬滚打了十几年的工程师。今天咱们来聊聊嵌入式开发里最基础,但也最容易出问题的一个环节——按键检测。很多新手朋友在用GD32E230这类单片机做项目时&#x…...

异常检测实战:点异常、上下文异常与集合异常的识别与应用

1. 异常检测:不只是找“坏点”,更是理解数据的故事 大家好,我是老张,在AI和数据领域摸爬滚打了十几年,处理过各种各样的数据“疑难杂症”。今天想和大家聊聊一个听起来很技术,但其实非常贴近我们工作和生活…...

HY-Motion 1.0场景应用:游戏动画、体育教学、短视频创作的3D动作神器

HY-Motion 1.0场景应用:游戏动画、体育教学、短视频创作的3D动作神器 1. 引言:当文字描述变成3D动画 你有没有想过,写下一句话,就能让一个3D小人立刻动起来? 比如,你输入“一个人在做深蹲,然…...

自动驾驶车辆动力学模型:从理论到实践的全面解析

1. 车辆动力学模型:自动驾驶的“肌肉与骨骼” 想象一下,你正在教一个刚拿到驾照的朋友如何在复杂的城市道路上安全驾驶。你不仅要告诉他方向盘打多少、油门踩多深,还得解释为什么在湿滑路面急转弯会打滑,为什么上坡时需要提前加速…...

Ultimaker Cura:开源3D打印全流程解决方案的技术解析与实践指南

Ultimaker Cura:开源3D打印全流程解决方案的技术解析与实践指南 【免费下载链接】Cura 3D printer / slicing GUI built on top of the Uranium framework 项目地址: https://gitcode.com/gh_mirrors/cu/Cura 价值定位:为什么选择Ultimaker Cura作…...

AI 编程实战:用 Claude Code 自动化代码审查

AI 编程实战:用 Claude Code 自动化代码审查 一、为什么需要自动化代码审查? 传统代码审查的痛点: 耗时 - 每个 PR 需要人工逐行审查不一致 - 不同审查者标准不同容易遗漏 - 疲劳时容易忽略问题知识依赖 - 新人不了解项目规范 AI 审查的优势&…...

快马平台一键生成SpringBoot用户管理系统原型,5分钟搭建RESTful API

最近在做一个内部工具,需要快速搭建一个用户管理系统的后端原型。时间紧任务重,如果从零开始搭建SpringBoot项目,光是配环境、导依赖、写基础结构就得花上半天。这次我尝试用InsCode(快马)平台来生成代码,整个过程出乎意料地顺畅&…...

科哥二次开发Image-to-Video:支持多种分辨率,满足不同需求

科哥二次开发Image-to-Video:支持多种分辨率,满足不同需求 1. 引言 你有没有想过,一张普通的照片,能在几十秒内“活”过来,变成一段生动的短视频?无论是让照片里的人开始行走,还是让静止的海浪…...

cv_unet_image-colorization一键部署教程:Ubuntu20.04环境配置详解

cv_unet_image-colorization一键部署教程:Ubuntu20.04环境配置详解 想试试给黑白老照片上色,或者让单调的素描图变得生动起来吗?今天咱们就来聊聊一个特别实用的开源项目——cv_unet_image-colorization。它就像一个智能的“数字颜料盘”&am…...

内存故障的隐形杀手:如何用Memtest86+构建系统可靠性防线

内存故障的隐形杀手:如何用Memtest86构建系统可靠性防线 【免费下载链接】memtest86plus memtest86plus: 一个独立的内存测试工具,用于x86和x86-64架构的计算机,提供比BIOS内存测试更全面的检查。 项目地址: https://gitcode.com/gh_mirror…...

OpenClaw入门指南

扫描下载文档详情页: https://www.didaidea.com/wenku/16600.html...

Minio+Nginx配置HTTPS访问的完整避坑指南(附腾讯云SSL证书实战)

MinioNginx配置HTTPS访问的完整避坑指南(附腾讯云SSL证书实战) 在企业级文件存储解决方案中,Minio作为高性能的对象存储服务越来越受到开发者青睐。而将Minio服务通过Nginx配置HTTPS访问,不仅能提升数据传输安全性,还能…...

Text2SQL技术方案全解析:从MAC-SQL到ChatGPT,2023年最新方法横向对比

Text2SQL技术全景:2023年主流方案深度评测与实战选型指南 当你在电商后台看到"显示过去三个月复购率超过30%的VIP客户名单"这样的自然语言查询时,是否想过这背后需要经历怎样的技术转化?这就是Text2SQL技术的魅力所在——它正在彻底…...

Spring AOP实战:如何优雅地实现公共字段自动填充(附完整代码)

Spring AOP实战:优雅实现公共字段自动填充的完整指南 在Java企业级应用开发中,数据表设计常常会包含一些重复出现的字段,比如创建时间(create_time)、更新时间(update_time)、创建人(create_user)和更新人(update_user)等。这些字段几乎出现在…...

内存故障诊断与系统稳定性保障:Memtest86+全维度技术指南

内存故障诊断与系统稳定性保障:Memtest86全维度技术指南 【免费下载链接】memtest86plus memtest86plus: 一个独立的内存测试工具,用于x86和x86-64架构的计算机,提供比BIOS内存测试更全面的检查。 项目地址: https://gitcode.com/gh_mirror…...

第一步:AS5600 I2C驱动移植与角度读取实战

1. AS5600磁编码器与I2C通信基础 AS5600是AMS公司推出的一款高精度磁旋转位置传感器,采用非接触式设计,通过检测磁场变化来测量角度。它内置12位ADC,能够提供4096个位置点,理论分辨率达到0.088度。在实际项目中,我经常…...

小白程序员必看:收藏这份AI智能体入门指南,轻松入门大模型时代!

本文深入浅出地介绍了AI智能体的概念及其与传统软件的区别,阐述了智能体的四大关键特征:自主性、反应性、主动性和社交能力。文章详细解析了智能体循环的工作原理,并通过具体例子展示了智能体如何使用工具和适应环境。此外,还探讨…...

收藏!小白程序员必看:从入门到实操,玩转大语言模型(LLM)

本文介绍了大语言模型(LLM)的核心定位、特点、发展历程,以及其在内容创作、智能客服、编程辅助、专业领域的应用场景。文章详细解析了Transformer架构,包括编码器、解码器、自注意力机制等关键组件,并阐述了LLM的“成长…...

收藏!京东AI岗薪资碾压大厂?附小白必看京东大模型面试题(含算子融合详解)

最近沉迷刷各类AI技术论坛和程序员社区,每天都会花1-2小时翻几十个帖子,其中最能吸引我、也最具参考价值的,就是各位程序员同学分享的AI求职经验帖——尤其是薪资爆料和offer选择类内容。对刚入门AI的小白、正在求职的程序员来说,…...

UiBot自动化办公:如何高效处理Excel数据并遍历数组(实战案例)

UiBot自动化办公实战:Excel数据清洗与数组遍历的高效技巧 在数字化办公环境中,Excel数据处理占据了大量工作时间。传统手工操作不仅效率低下,还容易出错。UiBot作为一款强大的RPA工具,能够帮助我们自动化完成这些重复性工作。本文…...

电商风控避坑指南:从dami商城5.4漏洞看订单金额篡改的5种防御策略

电商风控实战:订单金额篡改漏洞防御体系深度解析 1. 从dami商城5.4漏洞看业务逻辑风险本质 2021年曝光的dami商城5.4版本漏洞事件,堪称电商风控领域的经典反面教材。攻击者仅需拦截订单请求,将商品数量参数改为负数,系统竟成功生成…...

cv_resnet101_face-detection_cvpr22papermogface实际效果:数字孪生展厅中访客人脸位置热力图生成

cv_resnet101_face-detection_cvpr22papermogface实际效果:数字孪生展厅中访客人脸位置热力图生成 你有没有想过,一个数字化的展厅里,每天有多少访客在哪些展品前停留最久?传统的摄像头只能记录画面,但如果我们能自动…...

PCIe热插拔避坑指南:从内核日志分析枚举失败常见原因(附诊断命令)

PCIe热插拔故障排查实战:从内核日志到硬件诊断的完整指南 1. PCIe热插拔机制与常见故障模式 PCIe热插拔功能允许在系统运行状态下安全地添加或移除设备,这一特性对服务器维护和硬件调试至关重要。但实际应用中常会遇到设备无法识别或枚举失败的问题&…...

告别network-scripts!Rocky Linux 10.0双网卡配置实战(含DNS/网关设置)

Rocky Linux 10.0多网卡配置全指南:从基础到高可用实战 在服务器部署和集群管理的世界里,网络配置从来都不是一件简单的事。想象一下,当你正准备上线一个关键业务系统,却发现主网卡突然失效,整个系统陷入瘫痪&#xff…...

Qwen3-Reranker-0.6B入门必看:与bge-reranker-base、cohere-rerank对比选型指南

Qwen3-Reranker-0.6B入门必看:与bge-reranker-base、cohere-rerank对比选型指南 1. 为什么需要重排序模型? 当你使用RAG(检索增强生成)系统时,通常会先用检索器找到一批相关文档,但这些文档的质量参差不齐…...

基于PHP的微信AI智能客服系统源码,完美集成企业微信,支持多媒体交互

温馨提示:文末有资源获取方式在数字化转型浪潮中,企业客户服务效率与体验成为竞争关键。本文将介绍一款基于PHP开发的微信AI智能客服系统源码,它深度集成企业微信,支持文本、图片、视频等多媒体交互,为企业提供724小时…...

KingbaseES+MyBatis-Plus电商项目避坑指南:从数据库设计到秒杀实现的5个关键决策

KingbaseESMyBatis-Plus电商项目避坑指南:从数据库设计到秒杀实现的5个关键决策 在电商系统开发中,技术选型和架构设计往往决定了项目的成败。本文将聚焦五个最容易被忽视但至关重要的技术决策点,这些决策直接影响着系统的性能、可维护性和扩…...