ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

DeepSeek Harness插件开发:从机制理解到内网部署全指南

DeepSeek Harness插件开发:从机制理解到内网部署全指南 先说一个最直观的感受很多人一听到DeepSeek Harness 插件开发第一反应是去搜怎么写代码但真正卡住新手的往往不是代码本身而是没搞明白 Harness 到底是怎么把插件接进去的。我最早也踩了这个坑花了一周在插件实现里加日志结果发现工具根本没被加载。所以这篇教程我打算完全按照先理解机制、再动手开发、最后排错的顺序来讲配套一个完整的代码仓库巡检插件案例把从零到部署内网的全流程都过一遍。适合正在用 DeepSeek Harness 写编码 Agent、想扩展工具集、或者准备把 Harness 带到离线环境的读者看完应该能独立写出自己的第一个插件。1. 先搞清楚DeepSeek Harness 是驾驶舱插件才是方向盘上的按钮1.1 Harness 的本质不是模型而是模型和外部世界的调度层DeepSeek Harness 这类框架社区里也常叫 Agent Harness、Harness Engineering本质上解决的是一个控制循环问题模型负责思考Harness 负责行动。你可以把大语言模型想象成一个只会纸上谈兵的参谋它读了大量资料、能给出精妙的计划但它自己不能打开文件、不能执行命令、不能调 API。Harness 就是那个把参谋的指令翻译成实际行动的执行官——它接收模型输出的结构化调用请求去调用真实工具再把执行结果作为观察喂回给模型让模型基于新信息继续推理。这个循环通常长这样用户下达任务 → Harness 组装上下文并发送给模型 → 模型决定调用某个工具 → Harness 执行工具并返回结果 → 模型看到结果后决定下一步 → 直到任务完成。插件就是这个循环里可插拔的工具库。没装插件的 Harness 只有几个内置动作装了什么插件模型才知道自己能用什么招式。想清楚这一点后面开发时你就不会老纠结为什么模型不调用我的工具这种问题了——它没调用大概率是它压根不知道有这个工具存在或者不知道什么时候该用。1.2 插件体系里的三个基本对象工具、技能、提示词优化器在 Harness 生态里插件并不是单一形态。按我实际接触过的项目大概可以分成三类工具型插件提供可调用的函数比如执行 Shell 命令、读写文件、调用搜索引擎、操作 Git。这是最常见的一类也是本文重点。技能型插件Skill本质是一组预置的提示词、规则和少量脚本的组合。它不直接暴露工具而是教会模型在什么场景下按什么流程做事。比如代码审查技能会让模型先看 diff、再检查安全项、最后输出报告。部署技能到内网服务器本质是把技能目录放进 Harness 的技能路径下。提示词优化型插件干预模型输入或输出的格式比如自动压缩超长上下文、给系统提示词追加约束、对输出做后处理。这类插件对 coding 场景特别实用因为在复杂任务里上下文窗口很快会被撑爆。新手最容易把工具和技能混为一谈。我打个比方工具是手技能是操作手册。Harness 给了模型手模型得靠技能才知道按什么顺序动手。开发工具插件时你要保证工具描述写清楚这是什么、什么时候用、参数怎么填开发技能时你要保证流程足够结构化模型不会跳步骤。1.3 为什么我建议新手从工具型插件起步工具型插件有三个优点对新手特别友好。第一它功能边界清晰——一个插件只做一件事比如统计代码变更不需要考虑复杂的状态机转换第二它天然适合验证——写完后直接给 Harness 一个指令看模型会不会正确调用反馈链路很短第三它最容易理解参数 Schema 的设计——这是 Harness 插件开发的核心难点工具型插件的 Schema 就是一份 JSON Schema学一次能用在所有工具开发上。等你把工具型插件跑通再去做技能型插件和提示词优化插件就会觉得豁然开朗。2. 开发前的环境准备先把官方插件玩熟再动自己写2.1 Harness 本体安装与最小化验证不管你是用 Linux 还是 Windows第一步都是把 Harness 本体跑起来。安装方式现在一般有两种官方提供的命令行安装脚本以及通过包管理器安装。装完后先不要急于开发做一次最小化验证在终端里进入一个空目录运行 Harness 并输入一句最简单的指令比如列出当前目录下的文件。如果它能执行ls或dir并返回结果说明这个模型 → 工具调用 → 观察结果的基础闭环已经成立。这一步极其重要。我在社区帖子里看到很多人反馈deepseek harness 无法安装绝大多数情况不是工具本身坏了而是环境没配好。比较常见的是 Node.js 版本过低、Python 解释器没在 PATH 里、或者安装目录权限不足。建议你在验证时把终端日志级别开到 debug确认工具调用时是否出现了 tool executed 之类的关键标记。这个习惯能帮你日后排查所有问题。2.2 装上官方推荐插件观察插件的加载形态在动手开发之前我强烈建议你先安装两三个社区公认的实用插件比如 Git 操作增强、代码搜索增强类然后看两样东西插件的目录结构长什么样、Harness 的配置文件里是如何声明插件的。安装完插件后去 Harness 的配置目录通常在你的用户主目录下类似~/.deepseek-harness/翻一下。你会看到plugins/或skills/这样的子目录里面每一个插件文件夹都包含一个清单文件常见叫法如harness-plugin.json、manifest.json不同版本可能不一样和实际实现代码。这个清单文件就是插件的身份证写了插件名、版本、作者、描述、以及暴露出来的工具列表。把官方插件的清单文件从头到尾读一遍比看十篇文档都有用。你会发现一个规律每个工具的描述都写得异常啰嗦——明明列出文件这个功能描述里却写了当用户需要查看指定目录下的条目时使用支持递归、支持过滤适用于了解项目结构。这不是废话这是故意给模型看的模型靠这段描述来决定是否触发工具。开发插件时最忌讳我懂就行的简洁描述必须站在模型的角度去写。2.3 开发语言与运行时的选型逻辑那么插件到底用什么语言写这个没有统一答案取决于 Harness 运行时支持什么。以 Node.js 为基础的 Harness 一般支持 JavaScript/TypeScript 插件以 Python 为基础的版本则支持 Python 插件。选择语言时不要只看自己熟不熟还要考虑依赖的便利性。我的建议是如果插件简单执行命令、读写文件、调 HTTP用 Harness 默认运行时语言最省事因为不需要额外启动子进程。如果插件要处理复杂数据比如解析 AST、做代码分析选你生态最熟的语言但要注意它能否被 Harness 的子进程机制调用。另外不管用什么语言都要确保运行时能通过PATH找到。Windows 上最容易出问题的是 Python 用了 Microsoft Store 版导致命令行里python能用但 Harness 子进程找不到解释器。这种问题排查起来非常隐蔽。2.4 插件进程模型为什么模型描述比实现代码更关键这里要强调一个很多新手都会忽略的点Harness 插件工具运行在一个独立的子进程里而不是和模型推理在同一个进程。这意味着插件崩溃不会导致整个任务中断也意味着你无法在插件里直接读取 Harness 内部的上下文变量除非显式通过参数传入。同时这也带来一个反直觉的结论你的工具实现代码写得再漂亮如果描述写得像执行命令行命令这种含糊话模型在大多数场景下根本不会触发它。描述才是你和模型之间的桥梁。参数 Schema 更是如此它决定了模型能不能正确地把任务转换成工具参数。我在后面第三节会用完整例子展示怎么设计一份模型友好的工具描述。3. 从零写第一个插件给 Harness 加一个代码仓库巡检工具接下来是最核心的部分。我们做一个真实可用的工具型插件repo-inspect功能是让模型自动扫描一个 Git 仓库的工作区状态包括当前分支、未提交的改动、未推送的提交、以及最近的提交记录。这个工具对 coding Agent 非常实用——模型在执行任务前先用它了解仓库处于什么状态再决定下一步操作。3.1 插件目录结构从创建一个文件夹开始先创建插件目录。假设你的 Harness 插件目录是~/.deepseek-harness/plugins/在里面新建repo-inspect/ ├── harness-plugin.json # 插件清单 ├── index.js # 插件实现 └── README.md # 可选的说明文件如果你的 Harness 版本要求技能型插件有单独目录通常会在插件目录里再建一个skills/子目录。这里我们先专注工具型插件目录保持简单即可。3.2 写插件清单把身份信息声明清楚以常见的清单格式为例harness-plugin.json大概长这样{ name: repo-inspect, version: 0.1.0, description: 提供 Git 仓库状态巡检工具分支、未提交改动、未推送提交、最近提交记录, main: index.js, tools: [ { name: repo_inspect_status, description: 检查当前 Git 仓库的工作区状态。当你需要了解项目当前分支、有哪些已修改未提交的文件、以及是否有未推送的提交时使用此工具。适用于代码审查前、改动提交前、或者任务开始前快速掌握仓库概况。, parameters: { type: object, properties: { path: { type: string, description: 要检查的 Git 仓库绝对路径。如果不确定使用当前工作目录。 }, include_commits: { type: boolean, description: 是否同时返回最近 10 条提交记录默认 false } }, required: [path] } } ] }注意看description字段我特意写了当...时使用适用于...这些场景触发词而不是只写检查 Git 状态。模型对工具触发条件的理解几乎完全依赖这段描述里的场景词汇。参数上path是必需项因为 Harness 子进程的工作目录不一定等于目标仓库目录明确传绝对路径能避免大量找不到仓库的误调用。3.3 实现逻辑在 index.js 里定义工具行为清单只负责声明真正的执行逻辑在index.js。以 Node.js 为例实现会导出包含工具名和函数的一个结构大概思路如下const { execSync } require(child_process); function repoInspectStatus({ path, include_commits }) { if (!path) { return JSON.stringify({ error: 请提供仓库路径 path }); } const run (cmd) { try { return execSync(cmd, { cwd: path, encoding: utf-8, stdio: [pipe, pipe, pipe], timeout: 10000, }).trim(); } catch (e) { return 执行失败: ${e.stderr || e.message}; } }; const branch run(git rev-parse --abbrev-ref HEAD); const status run(git status --porcelain); const aheadBehind run(git rev-list --left-right --count {u}...HEAD 2/dev/null || echo 0 0); const result { branch, hasUncommittedChanges: status.length 0, uncommittedChanges: status || 无, aheadBehind, }; if (include_commits) { result.recentCommits run(git log --oneline -10) || 无提交记录; } return JSON.stringify(result); } module.exports { repo_inspect_status: repoInspectStatus, };这里有几个细节值得新手注意。第一所有输出我统一用JSON.stringify转成字符串返回。Harness 工具调用的返回值本质上都是文本模型通过阅读文本来做下一步决策结构化的 JSON 文本比一堆散落的命令行输出更容易被模型消化。第二执行命令要加timeout防止某个git操作卡住导致整个 Agent 循环停滞。第三尽量把执行失败的情况也变成正常返回值而不是抛异常——模型能读懂失败文本但异常往往会被 Harness 吞掉给模型一个毫无信息的报错。3.4 自定义技能文件让模型在合适场景自动使用这个工具工具写完后为了让模型真正用好它我们可以在插件里顺带加一个技能文件部分版本要求放到skills/子目录。这个技能文件的作用是告诉模型在什么工作流阶段应该主动调用repo_inspect_status。例如# 技能代码仓库巡检 ## 适用场景 - 任务开始前先了解仓库当前状态 - 提交代码前检查是否有遗漏的改动 - 代码审查前生成改动概览 ## 执行流程 1. 调用 repo_inspect_statuspath 设为当前项目目录 2. 如果有未提交改动先列出改动文件列表 3. 如果用户要求审查基于改动内容生成审查意见技能文件的作用是约束模型行为的工具它不执行代码但能显著提高工具被正确调用的概率。我见过不少团队工具函数写得没问题但效果很差最后发现就是少了这么一份技能说明。模型没有流程约束时即使知道有工具也常常忘记在关键节点调用。3.5 本地安装与第一次触发验证别跳过这个闭环把插件目录放进plugins/后重启 Harness 让它重新扫描配置。然后打开一个真实 Git 仓库输入这样一句指令或者直接在 Harness 的交互界面里输入先看一下这个项目的仓库状态包括分支、未提交的改动再列出最近 5 条提交。如果一切正常你会看到 Harness 的对话流里出现工具调用记录工具名为repo_inspect_status参数里自动填入了当前目录的绝对路径。这说明你的第一个 Harness 插件已经跑通了。如果在对话里没有出现工具调用而是模型拒答或直接猜测不要急——按照第 4 节的排查思路一步步来。3.6 发布插件复用清单里的信息生成说明文档当插件稳定后你会发现一个天然的复用点harness-plugin.json里的描述可以直接作为 README 的底稿。把工具的description展开成普通语言加上安装方法和示例就是一份不错的插件说明。很多新手忽略了这一步但在社区分享插件时说明文档的质量直接决定了别人的采纳率。4. 调试与排错模型调用了但结果不对问题出在哪一层插件开发完成后真正花时间的往往不是写代码而是调试。下面按我实际排查的经验按照从高频到低频的顺序列出最常遇到的四类问题。每一类我都给出错误现象、可能原因和解决方案方便你对号入座。4.1 模型压根不调用工具从参数 Schema 与描述找问题现象你发指令让模型看一下仓库状态但模型的回复直接是文字猜测完全没有工具调用记录。这类问题最恼人因为它不会报错。排查思路分两步。第一步打开 Harness 的调试日志确认你的工具是否已经被加载进上下文。如果工具压根没加载问题出在插件清单的解析上——检查harness-plugin.json的 JSON 格式是否合法、main指向的文件是否存在、插件目录是否被 Harness 正确扫描。第二步如果工具已加载但模型不调用问题几乎总是出在描述和用户语义匹配不上。你的工具描述里如果只写执行 git status 命令模型看到用户说看看仓库状态时根本无法建立联想。解决办法是重写描述把触发场景写得直白且多样。比如当用户要求检查项目当前状态、查看有什么改动、确认提交前是否干净、或者了解分支情况时使用此工具。用户可能不会明确提到 Git但只要涉及改动未提交仓库状态这类词都应该考虑调用。不要怕啰嗦模型是从你的描述里做关键词触发的描述越像用户真实会说的话触发率越高。4.2 工具被调用了但参数里 path 是空的现象日志显示工具被触发但参数path为空字符串实现函数里因为缺参数直接返回错误。这也是很常见的问题。原因是模型在接收到看仓库状态这种指令时并没有在上下文中找到明确的路径线索。如果你的工具把path设为必填但用户没有给路径模型就面临一个两难选一个假路径还是留空很多模型会选择留空。我有两个建议。一是把path设为可选在函数内部做兜底读取环境变量里的当前工作目录或尝试process.cwd()。二是如果必须传路径就在描述里指示模型如果用户没有提供路径先询问用户或者在当前工作目录下尝试不要编造路径。让模型学会不编造参数这件事能减少大量无效调用。4.3 工具返回了 JSON但模型说看不懂现象工具正常执行返回了一段很长的 JSON但模型的后续回答却说无法理解工具结果或工具没有返回有用信息。问题通常出在输出格式。模型读的是 Token不是结构体。如果 JSON 里字段嵌套太深、层级太多或者在字符串里混入了大量转义符模型确实会迷路。我在长期使用后的一个心得是工具返回的文本要尽可能扁平化、短小化。比如上面的repo-inspect与其返回一个巨大的嵌套对象不如返回这种人类可读格式分支: main 未提交改动: 2 个文件 - src/app.js (modified) - docs/readme.md (modified) 未推送提交: 3 个 最近提交: 3a2f1e9 fix: 修复登录超时问题 8b7c6d5 feat: 增加导出功能模型对这种格式的处理错误率远低于多层 JSON。所以我的建议是工具返回内容时把模型可读性放在第一位把结构化放在第二位。只有在数据量极大、必须由另一段程序处理时才返回紧凑 JSON。4.4 Windows 环境下 Skill 读取文件报setnamedsecurityinfow failed的完整排错链路在 Windows 上跑 Harness 的用户一定会遇到这个世纪之坑Skill 试图读取某个文件时报错信息里出现setnamedsecurityinfow failed (win32 错误码)。我第一次遇到时完全懵这个函数名长得像 Windows SDK 里的 API怎么会出现在一个 AI 工具链的报错里经过排查我确认这个报错的直接原因是当 Harness 的脚本或工具尝试读取一个文件而该文件的安全描述符ACL无法被正常枚举或修改时Windows 底层的SetNamedSecurityInfoW调用会失败。触发条件通常有三个你在排查时可以按顺序检查文件在网络驱动器 / 映射盘 / 共享目录上尤其是 SMB 共享。这些位置的 NTFS ACL 权限继承规则复杂跨机器访问时尤其容易失败。文件在云同步盘如 OneDrive、坚果云的占位文件上文件实际内容没有下载到本地只是云端的僵尸占位符导致 Windows 无法正常设置安全信息。Harness 进程运行在一个权限受限的服务或终端里比如从以管理员身份运行的终端启动但实际工作目录在普通用户目录权限继承错位。解决方案按从简单到复杂的顺序把整个 Harness 配置目录和项目目录都搬到本地磁盘的非同步文件夹下比如C:\Users\你的用户名\harness-work\。这个操作能解决绝大多数问题。如果仍报错在 PowerShell 里对插件目录执行icacls C:\path\to\plugins /reset /T重置权限继承。关闭文件索引服务和同步盘的按需同步功能让所有占位文件变成实体文件。以标准用户身份重新打开终端再跑 Harness避免因为管理员权限引起的令牌差异。这里还有个小技巧报错里只要保留功能位置和文件路径两段信息就够用来定位了。别被一长串 Windows API 名称吓住你在 Harness 生态里碰到的绝大多 Windows 权限问题本质上就是文件系统权限模型和 POSIX 不同这一个原因。5. 把插件带到内网离线部署、模型接入与依赖收敛开发完插件只是第一步很多团队真正的需求是把 DeepSeek Harness 部署到内网服务器包括让插件和技能一起离线可用。这块内容社区里问得很多我把完整流程和注意事项写清楚。5.1 内网部署的三种方式和插件目录迁移内网部署首先要解决两件事Harness 本体怎么装插件怎么迁移。Harness 本体在离线环境下的安装最省事的方案是在能联网的机器上把安装包和所有依赖npm 依赖或 pip 依赖下载好拷到内网。具体操作用npm pack把所有依赖打包或pip download到本地目录然后用npm install或pip install的离线模式安装。这个流程和普通 Node/Python 项目离线部署没区别Harness 不特殊。插件的迁移就更简单了。插件目录本质上是一堆文件直接把~/.deepseek-harness/plugins/整个打包复制到内网机器的对应位置即可。复制时要注意如果插件实现里有node_modules或虚拟环境一定连依赖一起打进去。我最常翻车的点就是只拷了index.js忘了拷node_modules结果内网机器上怎么都跑不起来。为了避免这种问题建议在项目里维护一个package.json明确声明依赖版本并在迁移时用lockfile做依赖锁定。如果你有附带 skill 部署到内网服务器的需求操作方式类似把 skill 目录整体复制到 Harness 技能目录下然后在配置文件里把技能路径指过去。技能文件只是 Markdown 和少量脚本没有二进制依赖迁移非常干净。5.2 内网模型接入如何让 Harness 指向本地的 DeepSeek 服务内网部署的核心问题是模型从哪里来。Harness 这类工具在设计上通常会暴露一个模型服务地址配置项一般指向一个 OpenAI 兼容的 API 地址。DeepSeek 的官方 API 以及本地用 vLLM、Ollama、llama.cpp 部署的模型都兼容这套接口格式。所以你在内网要做的就是把 Harness 的模型服务地址从公网 API 换成内网地址。以 vLLM 部署 DeepSeek 模型为例内网启动服务的命令行大致是python -m vllm.entrypoints.openai.api_server \ --model /path/to/deepseek-model \ --served-model-name deepseek-chat \ --host 0.0.0.0 \ --port 8000然后在 Harness 配置文件里把模型 API 地址设为http://内网IP:8000/v1以及 API Key 随便填一个占位符如果不校验的话模型名填deepseek-chat或者在--served-model-name里定义的名字。这里有一个我踩过的坑内网部署时如果 Harness 发起的请求需要走代理而代理又指向公网会导致请求超时。部署内网模型时记得把代理相关的环境变量HTTP_PROXY、HTTPS_PROXY、NO_PROXY清掉尤其要把内网地址加进NO_PROXY。5.3 接入免费模型或替代模型的路径社区热搜里有deepseek harness 接入免费模型claude code harness 可以不登录用其他模型吗这类问题其实原理都一样Harness 只认模型 API 长什么样不认模型是谁。只要你的模型服务暴露了 OpenAI 兼容接口把地址和模型名一换Harness 就能切过去。如果你想用本地免费模型建议至少选 14B 以上参数的模型做代码类任务太小的模型在工具调用的参数生成上会频繁出错——不是工具不会调而是会生成不存在的工具名或者把参数类型写错。顺便提一句社区里偶尔出现的 deepseek hermes 这个词它更像是一个社区项目/包装版代称本质还是围绕 DeepSeek 的 Harness 系列工具。新手使用时不建议纠结这类概念名认准模型 API 是否 OpenAI 兼容这一条就足够解决绝大多数串联问题。5.4 内网使用中的安全边界和实用建议内网部署时安全是必须考虑的事。模型如果部署在纯内网、没有外网出口那么任何需要公网 API 的插件工具比如在线搜索、公网代码库查询都会失败。这反而是一种天然的安全边界内网数据不会被发送到外部大模型。但要注意插件里如果存在读取任意文件路径的工具那么任何向模型提出的指令都可能读取到服务器上的敏感文件。权限管控应该收敛到 Harness 进程的用户权限上用最小权限账户运行它而不是用 root。另外一个内网部署的高频问题是端口和防火墙模型服务监听在0.0.0.0:8000但 Harness 和它不在同一台机器时要确认防火墙放行对应端口。排查时可以用curl http://内网IP:8000/v1/models先验证模型服务本身是否可达这能帮你快速判断问题出在 Harness 配置还是网络层。6. 编码场景下我实际在用的插件组合与高分问答6.1 coding 场景的插件组合思路不是越多越好很多新手会陷入一个误区插件装得越多Agent 越强大。实际上恰恰相反Harness 每次为模型组织上下文时都要把所有工具的描述塞进去工具越多个占用的上下文越长模型挑选工具的准确率反而下降。我整理过一套相对稳健的组合适合中大型代码库的日常开发插件/工具作用调用频率代码搜索与符号跳转精确定位函数/类定义位置高Git 状态巡检开动任务前了解仓库概况中终端命令执行运行测试、构建、Lint高文件读写查看/修改代码文件高上下文压缩超长对话中压缩历史防止上下文溢出中你注意没有这个组合里没有万金油插件每个工具都是要么高频、要么在关键节点卡位。插件开发也遵循同样的原则——先想清楚你要补的是模型频繁手动操作但做不好的事还是模型完全没有能力做的事再去开发。6.2 提示词优化与代码回退插件怎么理解它们的价值提示词优化插件本质上不是优化模型而是优化交给模型的内容。它可能做的事情包括把超长的对话历史压缩成摘要、把用户指令转成更结构化的任务描述、在系统提示词里统一注入团队规范。这类插件适合在使用 Harness 一段时间、遇到上下文一长模型就开始丢信息的问题后去开发。代码回退这个场景很多团队会做专门的插件工具。它的核心逻辑是在做批量修改前先让 Harness 对关键文件做快照如果后续测试失败可以一键回退到快照。实现上无非是文件复制和 Git 操作但它的价值在于给 Agent 加上后悔药。有了回退能力模型在前置任务里会更敢于动手修改因为风险可控。这个思路我在很多团队里推荐过反馈都不错。6.3 高频问题解答安装失败的通用解法、局域网能力边界关于deepseek harness 如何安装插件流程上通常就三步把插件目录放进 Harness 扫描路径、重启 Harness、在配置里确认插件已加载。如果重启后没生效优先检查 JSON 清单格式和插件日志中的加载记录。关于无法安装的通用排查顺序先看运行日志、再看依赖是否安装、最后看网络代理是否干扰了安装过程——很多无法安装其实不是 Harness 的问题而是安装脚本下载依赖时被网络策略拦截。关于deepseek harness 可以在离线局域网使用吗答案是肯定的这是它最大的优势之一。模型走内网、插件纯文件化、技能纯文本这三样东西都不依赖公网。我甚至见过完全物理隔离的机房环境里Harness 配合本地 vLLM 服务稳定跑了一个季度的案例。我个人在实际操作中的体会是Harness 插件开发最难的从来不是 API 调用也不是参数校验而是让模型准确理解你的工具。这个过程的调试很像教一个新同事做事——你得把工具描述写到他看了就懂把技能流程写到他不跳步把返回结果格式化到他不用猜。本教程里的仓库巡检插件虽小但描述场景化、参数兜底化、返回扁平化这三个原则可以迁移到你后续所有的插件开发里。最后再分享一个小技巧每次写完插件都强迫自己用完全不懂这个工具的新模型去测一次你会发现它能帮你暴露大量想当然的问题。
返回列表