DeepSeek Harness插件从零开发:完整流程与发布指南

发布时间:2026/8/26 4:03:20
DeepSeek Harness插件从零开发:完整流程与发布指南 最近在做 AI 辅助开发工具链时总遇到一个很实际的需求不想每次写代码都切到网页聊天窗口去问 DeepSeek而是希望直接在开发工具里唤起一个命令把问题丢给模型结果输出到面板里。这就涉及到“给 Harness 写一个 DeepSeek 插件”这件事。市面上的资料大多停留在“下载现成插件”或“改配置”的层面真正从零手写一个插件、落成文件、装进插件目录、打包发布到 GitHub 的完整教程并不多。本文就从开发者的实际视角带你走一遍完整的插件开发流程覆盖概念、环境准备、代码实现、安装验证和发布维护新手和有一定开发经验的朋友都可以按步骤操作。1. 为什么要开发一个 DeepSeek Harness 插件1.1 插件到底解决什么问题Harness 是一个偏工程化的开发辅助工具。为了不让工具本身越来越臃肿Harness 采用插件机制来扩展能力。也就是说核心功能保持精简AI 对话、代码生成、批量重构、Prompt 管理等能力都通过插件按需加载。DeepSeek 插件要解决的痛点很明确开发过程中频繁切换上下文影响专注度。网页对话不适合处理编辑器里的长文件内容。团队内部希望统一模型调用方式和参数配置。需要在自动化场景中把模型能力集成到本地脚本。插件解决的是“最后一公里”问题。模型能力再强如果无法和开发工具打通日常使用效率就很难上去。1.2 DeepSeek、Harness 与插件的关系先理清三个概念DeepSeek 是国产开源大模型系列提供 API 接口支持对话和代码理解。它采用 OpenAI 兼容的接口格式这对开发者非常友好。Harness 是一个支持扩展的 AI 开发工具平台。它提供插件加载机制、命令注册、配置面板和输出展示能力。插件是一组遵循约定目录结构的文件。Harness 通过 manifest 文件了解插件的名称、入口、命令和配置项然后动态加载。三者的关系可以理解为Harness 是宿主DeepSeek 是能力提供方插件是连接两者的桥梁。1.3 学完本文你能获得什么掌握插件目录结构和 manifest 配置规则。学会用 JavaScript 编写插件主逻辑。掌握 DeepSeek API 的调用方式和参数讲解。能手动把插件安装到本地插件目录。能打包插件并发布到 GitHub。了解插件开发中的常见报错和最佳实践。2. 环境准备与版本说明插件开发本质上是一个 Node.js 项目所以环境准备并不复杂。2.1 基础运行环境建议准备以下环境工具用途版本说明Node.js运行插件代码建议 16 以上越高越好npm安装依赖和打包工具随 Node.js 一起安装Git代码版本管理建议 2.x 以上GitHub 账号发布仓库和 Release提前注册Harness 工具插件宿主环境不同版本协议有差异以你的实际版本为准版本需要根据你的项目实际情况调整本文示例以常见环境为例重点演示配置思路。如果你使用的 Harness 版本基于 VS Code 扩展协议那么本文的目录结构和代码可以完全复用如果是自定义协议把 VS Code API 替换成工具暴露的 SDK 即可。2.2 检查 Node.js 与 npm打开终端输入以下命令node -v npm -v如果输出版本号说明环境正常。如果提示命令不存在需要先安装 Node.js。注意在安装完成后重启终端避免 PATH 没有刷新。2.3 准备 Git 与 GitHub 配置检查 Git 是否可用git --version配置提交者信息如果之前没有配置过git config --global user.name 你的用户名 git config --global user.email 你的邮箱这里有一点要提前说明GitHub 在国内偶尔会出现连接慢或访问不稳定的情况。如果 push 或 clone 时超时先检查网络再尝试切换网络、修改 DNS 或使用 SSH 方式提交。不要使用任何绕过访问限制的工具保持合规的开发环境。2.4 示例项目目录规划我们计划创建一个名为harness-deepseek-plugin的插件项目目录结构如下harness-deepseek-plugin/ ├── package.json ├── extension.js ├── README.md ├── LICENSE ├── .gitignore └── .vscode/ └── launch.json其中extension.js是插件主逻辑package.json是插件清单文件README.md是使用说明LICENSE是开源许可证.gitignore用于忽略敏感文件。3. 插件开发核心原理3.1 插件目录的约定结构以最通用的 VS Code 兼容扩展协议为例插件的本质是一个普通文件夹但必须包含以下要素package.json描述插件信息。入口文件通过main字段指定通常叫extension.js。图标和资源文件可选用于插件市场展示。Harness 在启动时会读取插件目录下的package.json解析contributes字段从而知道这个插件提供了哪些命令、配置和菜单。所以package.json是整个插件的地基。3.2 manifest 文件如何描述插件package.json中的关键字段如下字段作用name插件唯一标识小写用短横线分隔displayName显示名称用于界面展示version插件版本号遵循语义化版本规则publisher发布者 ID相当于作者身份engines宿主工具的最低版本要求activationEvents插件在什么事件下被激活contributes插件向宿主提供的命令、菜单、配置等main插件的入口文件路径为什么需要activationEvents因为插件不应在工具启动时全部加载那样会拖慢启动速度。更合理的做法是当用户执行某个命令时才激活对应插件。这种按需加载的机制和浏览器的懒加载思路一致。3.3 插件入口与生命周期插件入口文件通常会导出activate和deactivate两个函数activate插件被激活时执行。一般在这里注册命令、监听事件、初始化资源。deactivate插件被停用时执行。清理定时器、释放资源、断开连接。命令注册是最常见的操作。命令一旦注册成功用户就可以在命令面板中搜索并执行。3.4 调用 DeepSeek 模型的接口方式DeepSeek API 采用 OpenAI 兼容格式典型调用方式是POST https://api.deepseek.com/chat/completions Authorization: Bearer 你的 API Key Content-Type: application/json请求体如下{ model: deepseek-chat, messages: [ { role: system, content: 你是一个可靠的技术助手。 }, { role: user, content: 帮我写一个快速排序的 JavaScript 函数 } ], temperature: 0.7 }具体模型名称、接口地址和鉴权方式请以 DeepSeek 官方文档为准。本文的代码会使用上述格式作为示例方便你在真实项目中快速落地。这里要注意API Key 属于敏感信息严禁硬编码在代码或配置文件中。推荐做法是保存在宿主工具的本地配置中或者通过环境变量注入。4. 手写插件从零到落成文件下面开始正式写插件。我们分步骤完成package.json、extension.js、README.md和辅助文件。4.1 创建项目目录和 package.json先在本地创建项目目录mkdir harness-deepseek-plugin cd harness-deepseek-plugin然后创建package.json。文件路径harness-deepseek-plugin/package.json{ name: harness-deepseek-plugin, displayName: DeepSeek Harness Plugin, description: 在 Harness 中直接调用 DeepSeek 模型实现问答、代码解释、代码生成等能力。, version: 0.1.0, publisher: your-github-username, license: MIT, engines: { vscode: ^1.85.0 }, categories: [ Other ], activationEvents: [ onCommand:harness-deepseek.ask ], main: ./extension.js, contributes: { commands: [ { command: harness-deepseek.ask, title: DeepSeek Harness向 DeepSeek 提问 } ], configuration: { title: DeepSeek Harness, properties: { harnessDeepseek.apiKey: { type: string, default: , description: DeepSeek API Key建议在本地设置中配置不要提交到代码仓库。 }, harnessDeepseek.model: { type: string, default: deepseek-chat, description: 使用的 DeepSeek 模型名称。 } } } }, scripts: { package: vsce package }, devDependencies: {} }这里有个容易忽略的细节engines.vscode中的版本号不是随便填的。^1.85.0表示插件至少需要 1.85.0 版本的宿主工具。如果你的 Harness 版本较老要适当调低这个版本否则插件可能无法被加载。4.2 编写插件主逻辑创建extension.js文件。文件路径harness-deepseek-plugin/extension.jsconst vscode require(vscode); const https require(https); /** * 插件激活入口 * 当用户执行 harness-deepseek.ask 命令时会触发 activate 并注册命令。 */ function activate(context) { console.log(DeepSeek Harness 插件已激活); const disposable vscode.commands.registerCommand( harness-deepseek.ask, async function () { try { await handleAskCommand(context); } catch (error) { vscode.window.showErrorMessage(DeepSeek Harness 执行失败 error.message); } } ); context.subscriptions.push(disposable); } /** * 核心命令处理函数 */ async function handleAskCommand(context) { const text await vscode.window.showInputBox({ prompt: 请输入你想让 DeepSeek 处理的问题, placeHolder: 例如帮我写一个快速排序的 JavaScript 函数 }); if (!text) { return; } const config vscode.workspace.getConfiguration(harnessDeepseek); const apiKey config.get(apiKey); const model config.get(model) || deepseek-chat; if (!apiKey) { vscode.window.showErrorMessage( 未配置 DeepSeek API Key请在设置中配置 harnessDeepseek.apiKey ); return; } const output vscode.window.createOutputChannel(DeepSeek Harness); output.show(); output.appendLine(请求问题 text); output.appendLine(模型 model); output.appendLine(等待 DeepSeek 响应……); try { const answer await callDeepSeek(apiKey, model, text); output.appendLine(); output.appendLine(返回结果); output.appendLine(answer); } catch (error) { output.appendLine(); output.appendLine(调用失败 error.message); vscode.window.showErrorMessage(调用 DeepSeek 失败 error.message); } } /** * 调用 DeepSeek Chat Completions 接口 */ function callDeepSeek(apiKey, model, prompt) { return new Promise((resolve, reject) { const apiUrl https://api.deepseek.com; // 请以 DeepSeek 官方文档为准 const postData JSON.stringify({ model: model, messages: [ { role: system, content: 你是一个可靠的技术助手擅长代码生成、代码解释和技术问答。 }, { role: user, content: prompt } ], temperature: 0.7 }); const options { hostname: api.deepseek.com, path: /chat/completions, method: POST, headers: { Content-Type: application/json, Authorization: Bearer apiKey, Content-Length: Buffer.byteLength(postData) } }; const req https.request(options, (res) { let body ; res.on(data, (chunk) { body chunk; }); res.on(end, () { if (res.statusCode (res.statusCode 200 || res.statusCode 300)) { reject(new Error(HTTP res.statusCode body)); return; } try { const json JSON.parse(body); const answer json.choices json.choices[0] json.choices[0].message ? json.choices[0].message.content : ; resolve(answer); } catch (e) { reject(new Error(解析响应失败 e.message)); } }); }); req.on(error, (error) { reject(new Error(网络请求失败 error.message)); }); req.write(postData); req.end(); }); } /** * 插件停用入口 */ function deactivate() {} module.exports { activate, deactivate };解释一下这段代码做了什么事情通过vscode.commands.registerCommand注册了一个名为harness-deepseek.ask的命令。用户执行命令后弹出输入框收集问题文本。从配置中读取 API Key 和模型名称。创建输出面板显示请求和响应。调用callDeepSeek函数通过 HTTPS 请求访问 DeepSeek 接口。将返回结果写入输出面板。其中callDeepSeek使用了 Node.js 内置的https模块。为什么不用更流行的axios或fetch因为插件要尽量避免不必要的依赖。内置模块启动更快、体积更小也减少版本冲突风险。如果你的项目已经使用其他 HTTP 库可以根据实际情况替换。4.3 创建 README 和许可证一个正式的插件项目不能没有 README。它既是给使用者的说明也是发布到 GitHub 后的门面。文件路径harness-deepseek-plugin/README.md# DeepSeek Harness Plugin 一个在 Harness 中调用 DeepSeek 模型问答和代码生成能力的插件。 ## 功能 - 在命令面板中唤起提问输入框。 - 调用 DeepSeek Chat Completions 接口。 - 在输出面板中展示模型返回结果。 ## 安装 1. 将本插件目录复制到宿主工具的插件目录。 2. 在配置中设置 harnessDeepseek.apiKey。 3. 重启宿主工具。 ## 使用 1. 打开命令面板。 2. 搜索“向 DeepSeek 提问”。 3. 输入问题等待输出结果。 ## 配置项 | 配置项 | 类型 | 说明 | | --- | --- | --- | | harnessDeepseek.apiKey | string | DeepSeek API Key | | harnessDeepseek.model | string | 模型名称默认 deepseek-chat | ## 安全说明 API Key 只保存在本地配置中不会提交到代码仓库。请勿将密钥写入任何公开文件。然后创建LICENSE文件。这里以 MIT 协议为例。文件路径harness-deepseek-plugin/LICENSEMIT License Copyright (c) 2025 your-github-username Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the Software), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED AS IS, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.4.4 创建 .gitignore 忽略敏感文件文件路径harness-deepseek-plugin/.gitignorenode_modules/ *.vsix .vscode/ *.log .env这里把.env也忽略掉了。即使你以后改用环境变量保存 API Key也能避免误提交。5. 把插件装进插件目录插件写完之后不是直接双击运行而是要安装到宿主工具的插件目录中。不同系统的插件目录位置不一样。5.1 开发模式安装如果你使用的是 VS Code 兼容协议可以在项目目录下按 F5 启动调试模式VS Code 会自动加载当前项目为开发插件。这是开发阶段最快捷的方式。如果 Harness 工具支持命令行安装也可以使用类似参数指向本地目录harness-cli install-extension ./harness-deepseek-plugin具体命令名根据你的工具实际版本调整。核心思路是告诉宿主工具“把当前目录当成插件加载”。5.2 手动复制到插件目录最朴素的安装方式就是把整个插件文件夹复制到插件目录。各系统的插件目录通常为Windows: %USERPROFILE%\.vscode\extensions macOS: ~/.vscode/extensions Linux: ~/.vscode/extensions注意插件目录的命名规则。以 VS Code 为例扩展目录格式一般是发布者.插件名-版本号例如your-github-username.harness-deepseek-plugin-0.1.0如果你的插件目录名不符合这个规则宿主工具可能无法识别。手动复制时可以在插件目录下新建一个同名子目录再把文件放进去。也可以直接用命令创建并复制mkdir -p ~/.vscode/extensions/your-github-username.harness-deepseek-plugin-0.1.0 cp -r . ~/.vscode/extensions/your-github-username.harness-deepseek-plugin-0.1.0复制完成后重启宿主工具。5.3 打包成 VSIX 安装正式分发时建议打包成 VSIX 格式。VSIX 是 VS Code 兼容扩展的标准安装包。先全局安装打包工具npm install -g vscode/vsce然后进入插件目录执行vsce package执行成功后会生成一个.vsix文件例如harness-deepseek-plugin-0.1.0.vsix之后在扩展市场右上角选择“从 VSIX 安装”选择刚才生成的文件即可。5.4 验证插件是否生效安装完成后在命令面板中搜索“向 DeepSeek 提问”。如果能看到命令说明插件加载成功。执行命令输入问题观察输出面板是否显示结果。如果提示找不到命令先重启工具再检查插件目录名和package.json。6. 发布到 GitHub发布到 GitHub 的好处是版本管理、协作开发、Release 分发、用户反馈都在同一个平台。下面从创建仓库开始。6.1 创建远程仓库在 GitHub 点击右上角加号选择“New repository”。Repository name 填写harness-deepseek-plugin。Description 简单描述插件功能。选择 Public 公开仓库方便他人使用。不要勾选 README因为我们本地已经有文件了。创建完成后GitHub 会显示仓库地址例如https://github.com/your-github-username/harness-deepseek-plugin.git6.2 初始化并提交代码进入本地项目目录执行初始化git init git add . git commit -m feat: 初始版本支持 DeepSeek 问答提交信息建议规范一点使用feat、fix、docs等前缀方便后续浏览历史。6.3 关联远程仓库并推送git branch -M main git remote add origin https://github.com/your-github-username/harness-deepseek-plugin.git git push -u origin main推送成功后前往 GitHub 仓库页面刷新应该能看到代码文件。如果遇到网络超时先不要急着反复重试。检查当前网络是否正常尝试调整 DNS或者改用 SSH 方式提交。SSH 方式的 GitHub 仓库地址格式是gitgithub.com:your-github-username/harness-deepseek-plugin.git使用 SSH 前需要在 GitHub Settings 中配置 SSH Key。这属于通用开发技能这里不展开。6.4 创建 Release 发布版本代码推送成功只是第一步。为了让用户方便下载和使用建议创建 Release。在 GitHub 仓库页面点击Create a new release。Tag 填写v0.1.0对应package.json中的版本号。Release title 写v0.1.0或描述性标题。在说明区写上本次更新的功能列表。上传之前的.vsix文件和源码压缩包。点击Publish release后用户就可以从 Release 页面下载插件包。6.5 发布后的维护发布之后还需要注意修改代码后使用vsce package重新打包。升级版本号再创建新的 Release。在 README 中注明使用方法和支持的模型。如果收到 issue及时回复和修复。7. 常见问题与排查思路插件开发最常见的坑主要集中在加载、配置和网络三个层面。问题现象常见原因解决思路插件没有被加载插件目录名不符合规则调整为发布者.插件名-版本号格式命令面板找不到命令activationEvents或contributes配置缺失检查package.json并重启工具提示 API Key 未配置本地配置中没有设置harnessDeepseek.apiKey检查宿主工具设置项调用接口返回 401API Key 错误或已过期重新生成 Key 并更新配置请求超时网络波动或接口地址不可达检查网络确认接口地址正确返回结果乱码控制台编码问题检查输出面板编码避免中文字符截断打包失败vsce 未安装或缺少 LICENSE安装 vsce补充 LICENSE 文件push 到 GitHub 失败网络不稳定检查网络换 SSH 方式提交下面补充几个详细排查方法。7.1 插件不生效先确认插件目录是否在宿主工具扫描范围内再看文件夹命名。VS Code 兼容协议的插件目录命名必须严格匹配publisher.name-version其中 publisher 对应 package.json 的publisher字段。7.2 指令找不到命令找不到通常不是代码问题而是插件根本没有被激活。检查activationEvents中是否包含onCommand:harness-deepseek.ask并且contributes.commands中的command字段是否和注册命令时保持一致。7.3 网络请求失败如果插件在调用 DeepSeek 时出现超时或连接失败可以先用curl测试接口连通性curl -X POST https://api.deepseek.com/chat/completions \ -H Content-Type: application/json \ -H Authorization: Bearer $DEEPSEEK_API_KEY \ -d {model:deepseek-chat,messages:[{role:user,content:hi}]}如果命令行能正常访问说明是插件代码的问题如果命令行也超时说明是网络环境或接口地址的问题。7.4 API Key 安全提醒排查过程中不要在聊天群、博客评论区或截图里展示完整 API Key。API Key 泄露可能导致额度被滥用。如果怀疑泄露去 DeepSeek 控制台立即删除并重新生成。8. 插件开发最佳实践写完一个能跑的插件只是开始真正“正式”的插件需要具备可维护性、安全性和扩展性。8.1 API Key 不要硬编码代码仓库是公开的任何硬编码的密钥都会被搜索引擎收录。推荐的做法插件配置中读取但不提交到仓库。使用环境变量注入。或者使用宿主工具的 Secret 存储能力。在本文示例中我们让 API Key 从宿主工具配置中读取.gitignore里也忽略了.env文件已经规避了大部分误提交风险。8.2 日志与异常提示插件在用户环境里运行你无法看到用户终端输出。因此日志和异常提示必须足够清晰。建议在关键节点输出日志console.log(开始请求 DeepSeek问题 text); console.log(请求完成正在解析响应);同时捕获HTTP 错误和JSON 解析错误把原因拼接进错误信息而不是只输出一个笼统的“请求失败”。8.3 版本管理与语义化版本版本号遵循主版本号.次版本号.修订号规则。修复小 bug升级修订号。新增功能升级次版本号。不兼容的重大变更升级主版本号。每次发布前修改package.json的version字段然后重新打包成 VSIX。8.4 兼容性与测试插件开发要特别注意兼容性明确engines中支持的宿主工具最低版本。不要使用太新的语法特性除非你确定目标环境支持。在多个版本的宿主工具中做冒烟测试。测试覆盖面至少包括命令能注册、输入框能弹出、接口能返回结果、错误提示能显示。8.5 安全边界与最小权限插件只能请求必要的权限。不要随意添加文件读写、终端执行等能力除非功能确实需要。比如我们的插件只需要网络请求功能所以不用申请文件系统权限。另外调用 AI 模型时要对输入做必要限制避免向模型发送包含敏感业务数据的超长内容。如果要在企业环境中使用需要提前评估数据合规性。9. 总结与下一步学习方向本文从零开始手写了一个 DeepSeek Harness 插件核心步骤可以归纳为理清插件机制宿主工具通过 manifest 文件发现和加载插件。编写package.json登记命令、配置、入口和版本信息。实现主逻辑注册命令、读取配置、调用 DeepSeek API。安装到插件目录开发模式、手动复制或打包 VSIX。发布到 GitHub提交代码、打 Tag、创建 Release。维护和迭代处理 issue、升级版本、补充文档。如果你使用的是 VS Code 兼容协议这个插件已经可以直接在日常开发中使用。如果你的 Harness 是自定义协议核心思路不变只需要替换宿主工具相关 API。下一步可以继续扩展的方向支持选中代码直接发送给模型。把响应结果插入当前编辑器文件。增加对话历史记忆。支持多个模型参数预设。添加自定义 Prompt 模板。插件开发最大的价值不在于代码多复杂而在于把重复的“复制-粘贴-切换窗口”流程固化下来。动手把这个项目跑通你会对“工具扩展”这件事有更深的理解后续想写其他插件也就不再陌生。如果觉得本文对你有帮助可以先收藏备用再按照步骤从第一个命令开始写起。