Awesome DSH Plugin 怎么用?给 DeepSeek Harness 搭建自己的插件生态
1. 从零理解 Awesome DSH Plugin 与 DeepSeek Harness 插件生态很多人第一次听到 Awesome DSH Plugin会下意识以为它是一个可以直接安装的软件包或者一个需要跑起来的服务。我一开始也这么想结果在仓库里翻了半天才发现它本质上是一份插件目录也就是社区把散落在 GitHub 上的 DeepSeek Harness下文简称 DSH插件集中整理出来的索引清单。它解决的不是给 DSH 加功能而是我该去哪里找插件这个问题。所以正确的链路是这样的Awesome DSH Plugin 负责发现和检索你从里面挑出想要的插件再用dsh plugin add把它装进自己的 DSH 环境功能才真正生效。它更接近 Awesome List 加 Plugin Directory 的组合而不是传统意义上的可执行程序。理解这一点非常关键否则你会一直在等一个根本不存在的启动命令。那 DSH 本身是什么定位它是一套插件化程度相当彻底的 AI Coding Harness。模型、工具、Sandbox、Session Storage、UI甚至 Agent Loop 本身都可以通过插件体系扩展。这意味着你手里的 DSH 不是一个固定功能的产品而是一个可以被逐步组装的开发工作台。今天装一个 Git Review 插件明天加一个 Memory 插件后天接一个模型 Provider你的环境就一点点长成了贴合自己习惯的样子。这套生态里插件要能被dsh plugin add识别必须声明dsh.bundlemanifest这是安装的通行证。目前目录里的插件大致分成这些方向UI Enhancements、Themes Appearance、Sessions Messages、Memory、Tools Capabilities、Skills、Workflow Automation、Notifications Integrations、Models Providers、Development Runtime还有一类 Just for Fun。你可以把它想象成给 DSH 装零件UI 类让界面从基础聊天窗变成带文件浏览、终端、Git、Diff Viewer 的工作区Memory 类解决跨 Session 的项目上下文丢失Tools 类让 Agent 从只会聊天变成能调 Browser、Search、File、Terminal、Git、MCP、API 的执行体Models Providers 类则让你在同一套 DSH 里挂多个模型来源。这篇文章要交付的不是概念科普而是一条能跑通的路径先理清目录结构和加载约定再写一个本地插件模板把它注册进 DSH最后用统一 Key 通道管理模型调用凭证并跑一条从加载到调用成功的验证命令。适合已经装好 DSH、想自己动手搭插件生态的开发者也适合想搞明白插件到底怎么被加载的进阶用户。下面每一步我都会给出可复制的配置和命令你跟着做就能跑通第一个自建插件。2. TaoToken 前置准备统一管理 DSH 模型调用凭证在动手写插件之前得先把模型调用的凭证通道理顺。因为插件一旦跑起来大概率要调用模型 API如果每个插件各自维护一份 Key很快就会乱成一团这个插件用 A Key那个插件用 B Key换一次凭证要改十几个地方。我试过用统一通道来管后面维护成本低很多。TaoToken 在这里扮演的角色就是统一的模型调用凭证入口。它提供兼容 OpenAI 风格的 API 接口你拿到一个 Key就可以在 DSH 的各个插件、Provider 配置里复用同一套 Base URL 和 Key。官网地址是 https://taotoken.net/?utm_sourcetaotoken_aicg_blog_end API 端点是 https://taotoken.net/api 注意 API 地址后面不加任何查询参数保持干净。具体操作上你需要先拿到 API Key。进入控制台创建密钥的入口在 https://taotoken.net/console/api-keys?utm_sourcetaotoken_aicg_blog_endutm_contentapi_keysutm_campaignrewrite 登录后新建一个 Key复制出来保存好。这个 Key 就是后面所有插件和 Provider 共用的凭证。如果你还没想好要接哪个模型可以先去模型对话页面 https://taotoken.net/chat?utm_sourcetaotoken_aicg_blog_endutm_contentmodel_chatutm_campaignrewrite 试一下调用是否正常确认通道没问题再往下走。为什么要在插件开发前做这一步因为 DSH 的插件加载约定里模型 Provider 往往是通过环境变量或配置文件读取凭证的。如果你提前把统一 Key 通道建好插件里就只需要引用同一个环境变量不用硬编码。这样做的另一个好处是当你要换模型或换额度时只改一处配置所有插件同步生效。这里要提醒一点不要把 Key 直接写进插件的源码里尤其是准备开源或提交到插件目录的插件。正确做法是通过环境变量注入或者放在 DSH 的 profile 配置里。下面给一个环境变量的示例你可以放在 shell 的启动文件里或者用 DSH 支持的.env机制加载export TAOTOKEN_API_KEYsk-你的密钥 export TAOTOKEN_BASE_URLhttps://taotoken.net/api如果你更习惯用配置文件也可以写一个.env文件放在项目根目录TAOTOKEN_API_KEYsk-你的密钥 TAOTOKEN_BASE_URLhttps://taotoken.net/api这样插件在运行时通过process.env.TAOTOKEN_API_KEY就能拿到凭证既安全又便于切换。前置准备做到这里就够了接下来进入插件目录结构和加载约定的梳理。3. 可复制配置插件目录模板与 dsh plugin 注册片段这一节是全文的核心操作部分。我会先给出一个标准的本地插件目录模板再给出dsh plugin的注册配置片段最后说明 DSH 是怎么发现并加载这个插件的。你照着建目录、填文件就能得到一个可被识别的插件骨架。先看目录结构。一个符合 DSH 加载约定的插件最小结构大概是这样my-dsh-plugin/ ├── package.json ├── dsh.bundle.json ├── src/ │ └── index.ts ├── dist/ │ └── index.js └── README.md其中dsh.bundle.json是插件能被dsh plugin add识别的关键也就是前面反复提到的 manifest。它声明了这个插件叫什么、入口在哪、属于哪个类别、需要什么权限。一个可用的 manifest 模板如下{ name: my-dsh-plugin, version: 0.1.0, displayName: My First DSH Plugin, description: 一个用于演示 DSH 插件加载的最小插件, category: Tools Capabilities, entry: dist/index.js, main: dist/index.js, permissions: [network], engines: { dsh: 0.1.0 } }package.json里要保证name和 manifest 一致并且把构建脚本写清楚方便本地编译{ name: my-dsh-plugin, version: 0.1.0, type: module, main: dist/index.js, scripts: { build: tsc, dev: tsc --watch }, devDependencies: { typescript: ^5.4.0 } }入口文件src/index.ts先写一个最小可运行逻辑比如注册一个工具调用统一 Key 通道去请求模型import type { DshPluginContext } from dsh-plugin-sdk; export default function register(ctx: DshPluginContext) { ctx.registerTool({ name: hello-model, description: 调用统一 Key 通道返回模型的一句话回复, async run(input: { prompt: string }) { const apiKey process.env.TAOTOKEN_API_KEY; const baseUrl process.env.TAOTOKEN_BASE_URL ?? https://taotoken.net/api; if (!apiKey) { throw new Error(缺少 TAOTOKEN_API_KEY请先配置统一 Key 通道); } const res await fetch(${baseUrl}/v1/chat/completions, { method: POST, headers: { Content-Type: application/json, Authorization: Bearer ${apiKey} }, body: JSON.stringify({ model: deepseek-chat, messages: [{ role: user, content: input.prompt }] }) }); const data await res.json(); return data.choices?.[0]?.message?.content ?? ; } }); }编译之后dist/index.js就是 manifest 里entry指向的入口。接下来是注册环节。DSH 用dsh plugin命令管理插件按 profile 区分环境。本地插件可以用路径方式注册命令格式如下dsh plugin --profile web add ./my-dsh-plugin如果你已经把插件发布到 npm也可以直接按包名安装dsh plugin --profile web add my-dsh-plugin从 GitHub 安装的格式是dsh plugin --profile web add github:owner/plugin-name这里有个安全细节值得单独说从 GitHub 安装时第三方构建脚本可能直接在你的机器上执行。生产或长期使用的环境建议锁定 Commitdsh plugin --profile web add github:owner/repo#commit-sha这样即使仓库主分支更新你安装到的代码也不会悄悄变化。注册完成后DSH 会在对应 profile 的插件清单里记录这个插件下次启动时按 manifest 的entry加载。你可以用下面的命令确认插件是否已经进入清单dsh plugin --profile web list如果列表里出现了my-dsh-plugin说明注册成功。整个配置过程的关键就是三件套对齐Base URL 用https://taotoken.net/apiKey 用统一通道的TAOTOKEN_API_KEYModel ID 在插件请求体里指定。这三者一致插件调用模型时就不会出现凭证错乱的问题。4. 验证请求从加载到调用成功的完整命令配置写完最怕的就是看起来都对一跑就报错。所以这一节给一条从加载到调用成功的验证路径你按顺序执行每一步都有明确的预期结果。第一步确认插件已经被 DSH 识别。执行dsh plugin --profile web list预期输出里应该包含你刚注册的插件名类似web profile plugins: - my-dsh-plugin0.1.0 (local)如果这里没有出现说明注册没成功先回到上一节检查路径和 manifest 是否正确。第二步确认插件入口能被加载。DSH 一般会在启动时加载插件你可以用调试模式启动观察加载日志dsh --profile web --debug预期在日志里看到类似loaded plugin: my-dsh-plugin的行。如果出现failed to load plugin多半是entry路径写错或者dist/index.js没编译出来。先跑一次npm run build再试。第三步直接调用插件注册的工具。假设你的 DSH 支持命令行触发工具可以这样验证dsh tool run hello-model --profile web --input {prompt:用一句话介绍你自己}预期返回一段模型生成的文本。如果返回的是空字符串检查请求体里的model字段是否写对如果抛出缺少 TAOTOKEN_API_KEY说明环境变量没注入到 DSH 进程里需要在启动 DSH 前先export或者写进 profile 的环境配置。第四步验证统一 Key 通道本身是否通畅。可以绕过插件直接用 curl 打一次接口curl -s https://taotoken.net/api/v1/chat/completions \ -H Content-Type: application/json \ -H Authorization: Bearer $TAOTOKEN_API_KEY \ -d { model: deepseek-chat, messages: [{role:user,content:ping}] }预期返回一个包含choices数组的 JSON。如果这一步通了但插件调用失败问题就在插件代码或环境变量传递上如果这一步也不通问题在 Key 或网络通道上先去控制台确认 Key 状态。第五步把插件调用结果和直连结果对比。正常情况下两者应该都能返回内容说明从 DSH 加载插件、插件读取统一 Key、请求模型 API 这条链路完全打通。到这里你的第一个自建插件就算跑通了。整个过程里最容易出问题的环节是环境变量没传进 DSH 进程以及entry路径和实际编译产物不一致这两个点优先排查。5. 本篇常见报错排查401、local proxy failed、reading choices 与 OAuth跑通过程中总会遇到几个典型报错我把最常见的几类整理出来对照着排查能省不少时间。401 Unauthorized。这个基本是 Key 的问题。先确认TAOTOKEN_API_KEY是否真的注入到了运行插件的进程里可以在插件入口打印一下process.env.TAOTOKEN_API_KEY的前几位。如果为空说明环境变量没生效如果有值但仍然 401去控制台 https://taotoken.net/console/api-keys?utm_sourcetaotoken_aicg_blog_endutm_contentapi_keysutm_campaignrewrite 检查这个 Key 是否被禁用或额度耗尽。还有一种情况是 Base URL 写成了带路径的地址比如多加了/v1导致拼接重复正确写法是https://taotoken.net/api请求路径再拼/v1/chat/completions。local proxy failed。这个报错通常出现在 DSH 尝试通过本地代理转发请求时。先确认你的 DSH 配置里没有残留的代理设置插件请求应该直连https://taotoken.net/api。如果 DSH 的 profile 配置里有proxy字段把它清掉再重启。另外检查系统环境变量里有没有HTTP_PROXY、HTTPS_PROXY之类的设置它们会干扰插件的 fetch 请求。Cannot read properties of undefined (reading choices)。这是解析响应时data.choices为 undefined 导致的。原因一般是请求没成功返回的是错误对象而不是正常的 completion 结构。在插件里加一层判断if (!res.ok) { const errText await res.text(); throw new Error(模型请求失败: ${res.status} ${errText}); } const data await res.json(); if (!data.choices) { throw new Error(响应结构异常: ${JSON.stringify(data)}); }这样报错信息会清晰很多能直接看到是 401 还是 404。OAuth 相关报错。如果你用的是需要 OAuth 授权的 Provider 插件可能会遇到 token 过期或回调失败。这类问题先检查插件文档里要求的授权范围确认回调地址和 DSH 的 profile 配置一致。OAuth token 一般有有效期过期后需要重新授权。如果插件同时支持 API Key 和 OAuth 两种模式建议在开发阶段先用 API Key 模式跑通减少变量。排查时有个通用思路先隔离变量。用 curl 直连 API 确认通道没问题再回到插件层排查。如果 curl 通、插件不通问题一定在插件代码或环境变量如果 curl 也不通问题在 Key 或网络。这个二分法能帮你快速定位问题在哪一层。另外插件安装后如果行为异常先看dsh plugin --profile web list里的版本号确认装的是你预期的那个版本避免因为缓存或旧版本导致排查方向跑偏。6. 长期编码与 Agent 场景把插件生态用起来跑通第一个插件之后你大概能体会到 DSH 插件生态的价值它不是让你一次装几十个插件把环境塞满而是让你按需组装。我踩过的坑就是一开始看到目录里几百个插件恨不得全装上结果依赖冲突、权限混乱、启动变慢最后反而不好用。合理的节奏是基础 DSH 先跑起来确定一个具体需求装一个插件测试稳定再考虑下一个。比如先装 UI 加 Git 加 Memory 加一个 Tool用一段时间再决定要不要继续加。如果你打算长期做 AI Coding把 DSH 和插件环境放在一台长期在线的机器上会更省心。项目代码、Agent、插件环境都保留着换一台电脑也能继续用同一套环境。这种情况下插件来源的可信度、安装脚本是否检查过、Agent 权限是否受控、插件版本是否锁定这几件事比堆配置更重要。尤其是从 GitHub 安装的插件尽量锁定 Commit避免主分支更新带来意外变化。对于需要长期跑编码任务和 Agent 工作流的场景可以考虑用 Coding Plan 来管理调用额度入口在 https://taotoken.net/coding-plan?utm_sourcetaotoken_aicg_blog_endutm_contentcoding_planutm_campaignrewrite 。它适合那种需要持续、稳定调用模型的开发场景比按次调用更好规划。如果你还在选模型阶段可以先去模型对话页面 https://taotoken.net/chat?utm_sourcetaotoken_aicg_blog_endutm_contentmodel_chatutm_campaignrewrite 对比一下不同模型的表现再决定插件里默认用哪个 Model ID。接入相关的文档都在 https://taotoken.net/doc?utm_sourcetaotoken_aicg_blog_endutm_contentdocutm_campaignrewrite 遇到接口细节问题可以查这里。如果你用的是 Claude Code 这类工具想把它接到统一 Key 通道上可以参考 https://taotoken.net/claude-code-anthropic?utm_sourcetaotoken_aicg_blog_endutm_contentclaude_codeutm_campaignrewrite 里的配置说明。需要管理多个 Key 或查看用量时控制台入口在 https://taotoken.net/console/api-keys?utm_sourcetaotoken_aicg_blog_endutm_contentapi_keysutm_campaignrewrite 。最后回到插件本身当你熟悉了 manifest 和加载约定就可以自己开发插件给仓库加上dsh-plugintopic按贡献规则提交收录让其他 DSH 用户也能发现。到这一步你就不只是插件生态的使用者而是参与者了。整套流程走下来核心其实就三件事目录结构对齐 manifest、注册命令用对 profile、统一 Key 通道贯穿所有插件。把这三件事做扎实后面加多少插件都不会乱。

相关新闻

Flutter for OpenHarmony实战:猫咪管家疫苗记录模块开发指南

Flutter for OpenHarmony实战:猫咪管家疫苗记录模块开发指南

做猫咪管家App的时候,最让我头疼的模块不是宠物相册,不是喂养记录,反而是那个看起来没什么技术含量的“疫苗记录”。当时我用的技术栈是Flutter for OpenHarmony,也就是说,我要在一套还没完全成熟的开源鸿蒙生态里&…

2026/10/10 14:39:39 阅读更多 →
微信小程序校园外卖平台开发实战:从系统设计到部署全攻略

微信小程序校园外卖平台开发实战:从系统设计到部署全攻略

做校园外卖平台这个项目,说实话,是我近两年见过需求量最大的一个开发选题。微信小程序加外卖场景,这两个词凑在一起,几乎成了计算机类项目开发的"顶流"配置。原因也不难理解:一方面小程序开发门槛相对较低&a…

2026/10/10 14:39:39 阅读更多 →
膜法SBR处理皮革废水:启动调试、膜污染控制与异常排查指南

膜法SBR处理皮革废水:启动调试、膜污染控制与异常排查指南

简介:这是一份关于膜法SBR工艺处理皮革废水的完整研究文档,面向环境工程、污水处理及皮革工业领域的工程师与研究人员,可作为工艺设计、方案对比和技术改造的参考依据。全文基于实际皮革废水试验,系统梳理了SBR工艺的进水期、反应…

2026/10/10 14:39:39 阅读更多 →

最新新闻

探索AI工具——我的Cursor初体验:从Base URL改到TaoToken

探索AI工具——我的Cursor初体验:从Base URL改到TaoToken

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/10 16:00:51 阅读更多 →
SpringBoot2+Vue3校园生活信息平台:前后端分离实践与部署

SpringBoot2+Vue3校园生活信息平台:前后端分离实践与部署

1. 项目解析与整体思路1.1 校园生活信息平台到底解决什么问题大学校园的信息流通,说实话一直是个"说起来重要、做起来随意"的事情。今天社团要纳新,明天食堂有新品试吃,后天图书馆临时闭馆——这些信息要么贴在公告栏,要…

2026/10/10 16:00:50 阅读更多 →
gitee推送更新失败问题记录:remote: error: hook declined to update refs/heads/master 排查与TaoToken辅助定位

gitee推送更新失败问题记录:remote: error: hook declined to update refs/heads/master 排查与TaoToken辅助定位

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/10 16:00:50 阅读更多 →
为什么钉钉、飞书、企微都在做 CLI?用 TaoToken 统一 Key 跑通开源项目 CLI 的实战拆解

为什么钉钉、飞书、企微都在做 CLI?用 TaoToken 统一 Key 跑通开源项目 CLI 的实战拆解

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/10 16:00:50 阅读更多 →
C语言贪吃蛇项目——第二部分绘制菜单和初始界面:用TaoToken统一Key调试控制台渲染

C语言贪吃蛇项目——第二部分绘制菜单和初始界面:用TaoToken统一Key调试控制台渲染

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/10 16:00:50 阅读更多 →
高通 IQ9075 大模型 Benchmark 全维度实测:从算力基准到场景落地,TaoToken 统一 Key 打通评测链路

高通 IQ9075 大模型 Benchmark 全维度实测:从算力基准到场景落地,TaoToken 统一 Key 打通评测链路

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/10 15:59:48 阅读更多 →

日新闻

卫星轨道分类全解析:从LEO到GEO的选型逻辑与工程实践

卫星轨道分类全解析:从LEO到GEO的选型逻辑与工程实践

1. 从“卫星轨道分类”这个标题说起:为什么值得花时间搞懂第一次接触“卫星轨道分类”这个概念,很多人会觉得它离自己很远——不就是天上的星星怎么转吗?但如果你正在做航天任务规划、遥感数据接收、星座设计,甚至只是准备一场航天…

2026/10/10 0:00:39 阅读更多 →
Spring AOP 核心原理与实战:从概念到日志切面落地

Spring AOP 核心原理与实战:从概念到日志切面落地

1. 从一个真实痛点说起:为什么你的代码里到处都是重复逻辑刚入行那会儿,我写过一个用户管理模块,注册、登录、改密码、注销四个接口。每个接口里都塞了几乎一样的日志打印、参数校验、事务开启和提交。当时觉得没什么,能跑就行。直…

2026/10/10 0:00:40 阅读更多 →
Python招聘数据采集与分析可视化:从采集清洗到薪资技能城市可视化全链路

Python招聘数据采集与分析可视化:从采集清洗到薪资技能城市可视化全链路

简介:这是一套面向计算机相关专业学生与项目实战学习者的Python数据采集与分析可视化完整项目,以Boss直聘岗位数据为对象,适合用作毕业设计、课程设计或期末大作业。资源包共38个文件,约246KB,以13个py源码文件为核心&…

2026/10/10 0:00:40 阅读更多 →

周新闻

KT148A语音芯片外挂8002D功放的工程实践指南

KT148A语音芯片外挂8002D功放的工程实践指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/10 11:14:25 阅读更多 →
LLC谐振变换器增益公式推导:从FHA等效到完整归一化表达式

LLC谐振变换器增益公式推导:从FHA等效到完整归一化表达式

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/10 1:36:08 阅读更多 →
ARM架构深度解析:从RISC设计理念到交叉编译实战

ARM架构深度解析:从RISC设计理念到交叉编译实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/10 11:14:58 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/10 5:23:50 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/9 21:32:20 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/10 10:38:42 阅读更多 →