同样叫 HarnessDeepSeek Harness 和 Pi 根本不在同一层先把结论放在前面过去两周我分别在 DeepSeek Harness 和 Pi 上各折腾了一个完整的 Agent 工作流踩了不少坑也终于把这两个项目的定位彻底搞明白了。最开始我也被“harness”这个词带偏了以为它们只是同一个概念的两种实现翻完源码、写完插件、跑完实际任务之后发现这俩根本不在同一层——一个是外面包了层壳让你直接用的应用框架一个是嵌在你的 Agent 核心逻辑里帮你编排复杂任务的基础组件。你要是打算在这两个之间“二选一”那方向可能从一开始就错了。这篇文章我不打算做那种拉踩式的对比而是想用实际操作的视角把 DeepSeek Harness 和 Pi 各自处在什么位置、适合什么人、解决什么问题拆开讲清楚。尤其是那些在热搜词里反复出现的“harness failed to load plugins”“Pi error: the response stream was malformed”还有“deepseek harness 安装失败”这类问题我会一并整理成可复现的排查方案。如果你最近也在纠结“到底该用哪个”或者已经在用其中之一但总觉得哪里别扭这篇应该能帮你省不少时间。1. 先别管“Harness”这个词搞清楚两个项目各自是什么1.1 Harness 的真实含义与行业背景“Harness”这个词在传统软件工程里不是新概念最早出现在测试领域叫 test harness测试夹具/测试框架。它的核心作用是把被测对象“挂”到一个可控制的环境里由外部统一管理依赖、输入、状态和执行结果。到了 AI Agent 时代这个词的含义被扩展成了“Agent Harness”——也就是包裹在模型能力外面的一整套运行时框架负责解决工具调用、上下文管理、权限控制、用户交互这些问题。我用一个类比来解释模型本身就像一个脑瓜很好使但没手没脚的顾问Harness 就是这位顾问的“职场工位”——桌子上摆好了电话、电脑、资料柜、审批流程顾问只需要坐在那里思考和发指令具体怎么拿东西、怎么记账、怎么汇报结果都是工位上的基础设施帮忙完成的。你做“Harness Engineering”本质上就是在设计这套工位布局。1.2 DeepSeek Harness 的定位与设计目标DeepSeek Harness 本质上是一套围绕 DeepSeek 模型设计的多 Agent 协作工作流框架。它的核心诉求是让你能像操作一个 IDE 一样地去配置和管理多个 Agent每个 Agent 负责一类任务通过共享上下文和工具集协作完成复杂目标。它提供了桌面端、插件机制、可视化的代理编排界面用户可以通过配置文件和 Skill 来扩展 Agent 的能力。注意这里的关键词应用层、编排层、用户直接使用。DeepSeek Harness 解决的是“如何把模型能力变成一套可用的工作环境”的问题它假设模型是现成的DeepSeek 系列然后往上搭了一层生产环境。安装它你得到的是一整套东西运行时、配置中心、插件管理、会话界面、工具商店。用户面对的是“操作台”。1.3 Pi 的定位与设计目标PiPi Agent / subagent则完全是另一回事。它更像是一个“Agent 核心组件库”关注的是单个 Agent 内部的行为组织方式。Pi 解决的是“当一个 Agent 接收到一个复杂的用户请求时如何规划任务、调起子代理、汇总结果”这类问题。它的名字出现在很多项目里经常被嵌入到更大的 Harness 或框架中作为子任务执行器。Pi 这一层其实是很多上层应用看不见的“幕后引擎”。它做的事情包括任务拆解、子代理调度、流式响应解析、上下文窗口策略管理等。你说它在哪一层它处在模型之上、应用框架之下的中间层。如果你在用某个基于 Agent 的产品感觉它“很聪明、会自动拆任务、会调工具”那背后大概率就是类似 Pi 这样的核心组件在工作。1.4 一句话区分二者DeepSeek Harness 是“你直接操作的工作台”Pi 是“工作台里替你干活的引擎”。所以标题说“根本不在同一层”指的是一个是用户可见的框架层一个是用户通常无感的组件层。把这两个放在一起选本身就是个伪命题——真正的问题是你的项目需要的是哪一层的能力以及你打算怎么把它们组合起来。2. 核心架构拆解各自的技术层级与工作方式2.1 DeepSeek Harness 的技术栈与插件机制DeepSeek Harness 的架构大致分为三层交互层桌面端/命令行、编排层Agent 路由与任务分配、执行层工具调用、Skill 运行、会话存储。这三层里最值得关注的是它的插件机制因为热搜词里出现的“harness failed to load plugins”和“web boot: 2 entries did not activate”都和它有关。插件系统本质上是一个动态加载的模块仓库。每个插件包通常包含一个 manifest 文件声明插件 ID、版本、入口点和对应实现代码。Harness 启动时会扫描配置目录下的插件包逐个校验 manifest 的合法性然后尝试导入入口模块并注册到运行时中。如果某一步失败就会报出“failed to load plugins”这样的错误。我当时遇到的情况是这样的装了个第三方写的工作流插件Harness 启动后直接拒绝加载报错显示某个插件包里引用了当前版本不存在的 API。排查下来发现是插件包的 manifest 里声明的 API 版本号比实际运行时版本高导致激活阶段校验没通过。解决办法很直接——检查 Harness 版本和插件包的兼容矩阵把插件降级到 0.1.4 就能正常加载了。2.2 Pi 的组件化设计与执行模型Pi 走的是一条完全不同的技术路线。它的核心思想是通过一个轻量级核心加上一组可替换的“策略组件”来实现 Agent 行为。任务到来时Pi 会先执行一个“规划策略”把目标拆成若干子任务然后为每个子任务挑选匹配的工具或子代理执行过程中持续监听流式输出实时解析格式并累积上下文最后将结果拼装汇总回传给上级调用方。这种设计的优势是职责边界特别清晰。Pi 本身不关心你是用什么模型做推理也不关心你最终的用户界面长什么样它只关心“一个 Agent 该怎么把任务干完”。所以你会发现 Pi 经常被多个不同项目复用而 DeepSeek Harness 这种框架级的项目则很少会被别人嵌进去再包一层——因为它的目标用户就是最终使用者不是开发者。2.3 层级差异带来的关键差异点正因为层级不同两者的关注点完全不同对比维度DeepSeek HarnessPi面向用户最终使用者/普通开发者开发者/框架集成者关注问题如何组织多个 Agent 协同工作如何让单个 Agent 高效完成复杂任务用户直接感受配置文件、插件市场、桌面操作界面需要通过代码调用无独立界面错误现象failed to load plugins、安装失败response stream malformed、subagent 调度异常核心价值降低使用门槛、快速搭建工作环境提升任务执行效率、增强可扩展性这也解释了为什么网上关于“deepseek harness 安装”的讨论这么多而 Pi 相关的讨论更多集中在“怎么改配置”“为什么流式响应解析失败了”。安装 DeepSeek Harness 对你来说是第一道坎而用 Pi 的时候安装通常不是问题运行时的稳定性才是问题。3. DeepSeek Harness 实操从安装到插件工作流配置3.1 安装环境准备与常见失败点我想先从安装开始聊因为这是好多人第一次接触 DeepSeek Harness 就劝退的地方。热搜词里“deepseek harness 0.1.5 安装失败”“deepseek harness 装到 d 盘”“kali安装deepseek harness”这几条基本涵盖了安装阶段最容易踩的三类坑。第一类依赖环境冲突。DeepSeek Harness 的桌面端依赖一套完整的运行时环境包括 Node.js、Python用于运行部分 Skill、以及某些系统级依赖库。如果你机器上原本就有多个版本的 Node 或 Python很容易出现 Harness 启动时报缺依赖或者版本不兼容的错。我一个同事就是装了 NVM 切换了 Node 版本之后Harness 桌面端直接白屏折腾了半天才发现是 Node 版本从 18 切到 20 之后某个原生模块没有重新编译。我的建议是给 Harness 单独准备一套干净的环境或者至少记录好它自带的依赖说明尽量按照官方推荐的版本装别图新。第二类路径问题。有人喜欢把大软件装到 D 盘Windows 场景但 Harness 的插件系统默认会扫描当前用户目录下的配置文件夹如果安装路径里有中文或者空格部分插件加载会遇到问题。如果你确实要装到 D 盘注意把所有路径里的空格处理成下划线且保证配置目录不受安装路径影响。第三类Linux 环境的权限和系统依赖。在 Kali 或者别的 Debian 系系统上装最容易漏的是系统级依赖比如 libgtk、libnotify 这类图形界面运行库。漏了这些安装过程会报一个和图形界面相关的错误但具体描述往往有迷惑性容易被误判成软件本身的 bug。3.2 配置 DeepSeek Harness 连接模型和工具安装完成之后核心的配置工作有两块联模型、联工具。联模型这一步比较直观DeepSeek Harness 本身就是为了 DeepSeek 模型设计的在设置里填上 API Key 和模型名称就能跑通。不过你也可以通过配置来接入其他兼容 OpenAI 接口的模型灵活性比想象中高。联工具这块就有意思了。Harness 里“工具”指的不是你在传统开发里用的静态库而是供给 Agent 调用的动态能力比如网页搜索、代码解释器、文件读写等等。你需要在配置里为工具指定“参数描述”因为大模型本身不知道怎么调用一个函数它全靠描述来决定“什么时候应该用哪个工具”。我当时配了一个自定义搜索工具一开始只写了很简短的工具描述Agent 经常在不需要搜索的时候乱调后来我把描述改成了带“使用条件”和“典型场景示例”的完整版本情况立刻好转。这个细节官方文档里是没有的但实操中极其关键。3.3 插件工作流用 Skill 扩展 Agent 能力Skill 是 DeepSeek Harness 里的一等公民也是“harness anything”这类需求的支撑点。一个 Skill 可以理解为一个“预定义的行为模块”它包含一段 prompt 模板、一组可能调用的工具列表、以及若干执行约束。当主 Agent 判定当前任务符合某个 Skill 的触发条件时它会把该 Skill 的模板注入到上下文中并优先按这个模板引导执行。举个实际案例。我想做一个“网页端信息采集和分析”的工作流于是写了一个 Skill定义了这样的触发条件“用户输入包含‘调研’或‘分析某主题’时启动”。Skill 内部把任务拆成了搜索、阅读、提炼、汇总四个子步骤每个子步骤指定要用哪个工具。配置好之后我只需要输入一句“调研一下最近三个月 AIGC 领域的重要进展”整个 Agent 就会自动沿着这个流程走完。这个过程中我踩过一个坑Skill 的触发条件写得过于宽泛导致几乎所有任务都会先命中这个 Skill反而拖慢了响应。后来我加了排除条件比如“不包括具体产品参数对比类问题”效果才对。所以 Skill 设计一定要“窄进宽出”——触发条件宁可设置得严格些也不想让 Agent 频繁误入。3.4 插件加载失败的排查路径如果你不幸遇到了“harness failed to load plugins”的问题别慌按这个路径走先看日志。启动 Harness 时加上--verbose参数它会输出每个插件的激活记录。凡是加载失败的插件日志里都会给出具体的错误类型是模块导入错误、API 版本不匹配还是资源冲突一目了然。看插件包的 manifest 文件。检查声明版本号与实际包的依赖要求是否一致。很多第三方插件打包时没锁好版本你装上的是一个当时能跑的包但你后续把 Harness 升级了这个包就废了需要重新安装或更新。清理缓存和配置目录里的旧插件索引。我遇到过一种很奇怪的情况插件文件明明都在但 Harness 每次都报加载失败。后来发现是配置目录里的一个缓存索引损坏了删掉缓存重建索引就正常了。3.5 DeepSeek Harness 的实际适用场景我在 DeepSeek Harness 上跑通的一个比较完整的工作流是“软件开发辅助”。我有多个项目在不同的目录里以前每次要打开终端、切目录、看代码、跑测试现在我把这些都配置成了不同的 Agent主 Agent 负责理解用户意图再把任务分发给对应项目 Agent模板统一调用项目自己的工具集。整个体验其实已经很接近 Claude Code 这类工具的形态了。如果你是一个重度依赖 AI 辅助编程、同时又希望所有模型调用和工具调度有一个统一管理入口的人Harness 值得花时间配置。4. Pi 补全核心组件、响应流异常与子代理调度4.1 自己在项目里接入 Pi 的实际经验再说说我在这类子代理组件上拿 Pi 跑通的一个例子。当时我在做一个内部的知识库问答 Agent最大的痛点是用户一个问题往往需要拆成多个子问题分别查不同文档库然后汇总答案。我抽了一个通用模块出来用类似 Pi 的组件化方式去组织子代理核心改动是三层第一层是主代理的意图分解只负责把原始问题拆成 N 个子查询并给每个子查询标注类型第二层是子代理池每个子代理绑定固定的文档库和检索工具第三层是聚合器把各子代理返回的内容拼成一个统一格式的答案。这套逻辑跑了一段时间后我发现子代理数量很关键。子代理开太少每个子代理的检索压力大问题也会排队子代理开太多汇总阶段的结果冲突增多上下文瞬间被打爆。最终我按“文档库数量 1”的动态规则来分配子代理数量效果最稳定。4.2 Pi 的流式输出异常处理热搜词里有一条很经典“Pi error: the response stream was malformed and no response was produced. Try again.”这个报错我在接入流式响应解析时也遇到过。根本原因通常是上游模型返回的内容流在传输过程中出现帧不完整或格式异常或者 Agent 在解析时收到的字符串流被某种编码问题破坏了。最有效的排查手法是抓原始流日志看是不是每一条 SSE 事件帧都完整。其次如果问题只在特定输入长度下出现那么大概率是解析缓冲区的窗口设得太小。把缓冲区的上限调大同时在解析逻辑里增加“容忍半截行”的重试机制基本能解决 90% 的此类问题。4.3 子代理调度配置技巧和参数取舍Pi 这类组件的调度策略里有一个参数特别值得关注max_consecutive_message_length。它控制的是 Agent 在单次推理中最多累积多长的连续上下文。如果这个值设得太大Agent 会倾向于在一个循环里把所有事情做完导致上下文超限设得太小Agent 遇到复杂任务时可能过早终止对话你得反复告诉它“继续”。我的经验公式是先看你的模型上下文窗口假设是 128K那就把 max_consecutive_message_length 设在 24K 到 30K 之间给推理结果和系统提示预留足够空间。不要超过 50% 的窗口否则一旦工具返回长文档整个上下文会瞬间膨胀。另外子代理完成一个任务后返回给主代理的内容尽量是压缩后的摘要不要把原始全文都塞回去。这一步是很多 Agent 产品变卡变慢的隐形元凶——每个子代理都完整返回主代理的上下文瞬间扛不住。4.4 Pi 的上层应用整合与组合方式如果你在写自己的 Agent 框架我比较推荐的整合方式是用 Pi 承担“任务规划”和“子代理调度”再单独写一层“工具注册表”给主代理用最后在你自己的前端界面里展示结果。这三个模块互相独立替换成本都很低——哪天你想换掉其中一层不会牵一发动全身。这种“中间层组件”有一个天然优势就是它不依赖特定模型品牌也不绑定某个公司的生态。你今天可以用它搭 DeepSeek明天换成别的模型核心调度逻辑完全不用动。这恰恰是 DeepSeek Harness 这样绑定生态的框架做不到的。5. 选型建议什么时候用哪个怎么配合使用5.1 按需求场景选型的完整建议如果你是“终端用户”想要一个拿到就能用的环境DeepSeek Harness 是最快上手的选择。但你要接受它的插件体系和生态相对封闭大部分插件都是社区网友各写各的质量参差不齐遇到问题经常要靠自己改配置。如果你是“开发者”想要的是自己项目里能稳定运行的组件内核那 Pi 的架构思路远比任何 Harness 框架都适合参考借鉴。别把 Pi 当应用来用它不是把它当组件库来用它很顺手。如果你既是终端用户又是开发者那理想组合是日常操作使用 Harness 作为入口同时在 Harness 内置的代码块里嵌入 Pi 风格的子代理调度逻辑。这个组合能帮你同时享受“开箱即用”和“深度可控”的好处。5.2 实际推荐程度能打多少分我只代表个人的体验总结DeepSeek Harness 的成熟度在不断提升安装和插件配置的坑也在快速减少。0.1.5 比起前几个版本插件激活的成功率已经高出很多。但如果你指望它能像商业产品那样稳定开箱建议再给它一个版本的迭代时间。Pi 这类组件的稳定性取决于你自己的工程能力。它的代码逻辑相对清晰调试起来比上层框架容易很多但你需要对 Agent 系统的整体架构有基本认知。如果你是个刚入门的小白直接从 Pi 开始可能有些吃力。6. 经验与避坑笔记6.1 我在两个项目上踩过最深的坑在 DeepSeek Harness 上我踩过最深的坑是把大量精力花在配插件上而忽略了主线任务目标。插件装了一堆每次启动都要处理各种激活失败问题真正拿它跑实际任务的次数反而很少。后来我把插件数量从 27 个砍到 6 个世界清净了。Harness 的价值在于“够用就好”不是“装得越多越厉害”。在 Pi 风格的组件上我踩过最深的坑是流式解析逻辑写得不够健壮一遇到模型输出格式稍有变化就崩。后来我在解析层加了多级容错处理第一遍按标准格式解析失败就降级为“按行处理”再失败就整段重试。这个兜底逻辑帮我避免了好几次线上故障。6.2 一个小小的实用技巧最后分享一个我在配置任何 Harness 类项目时都会用的技巧把所有配置文件纳入版本管理哪怕是本地项目。因为这类系统的配置项非常多一次误改可能会让整个工作流失效但你不知道是哪一处改坏了。有了版本历史对比配置 diff 就能秒定位问题。这个习惯帮我在 Harness 和 Pi 相关的调试上省下了大量时间。既然你已经看到这里了我的建议其实很简单不要被“同样的名字”迷惑先问自己想干的事是“搭一个工作台”还是“造一个能干活的心脏”。想清楚了选择自然就出来了而且大概率你会在不同项目里都用上它们。
企业数字化 ERP 产品动态
相关推荐
AI法律文书测试方法论:准确性评估与合规性验证 1. AI法律文书准确性测试方法论概述在法律科技领域,AI生成文书的质量直接关系到司法公正和当事人权益。我作为法律科技行业从业者,在过去三年深度参与了7个省级法院系统的智能文书项目,总结出一套行之有效的测试方法论。这套方法不仅适用于评… · 2026/11/5 10:51:55
自动驾驶动态避障路径规划全流程解析 1. 项目概述自动驾驶技术中最具挑战性的环节之一就是动态避障路径规划。这个看似简单的任务实际上涉及复杂的运动学和动力学模型计算,以及多学科知识的融合应用。作为一名从事自动驾驶算法开发多年的工程师,我将分享一套完整的动态避障路径规划解决方案&… · 2026/11/5 12:46:58
经典iPod固件镜像提取:wInd3x只读优先与验证前置实践 1. 先想清楚:一台十几年前的随身听,为什么还值得动手开源宝藏这个词经常被用滥,但放在老播放器这个圈子里,它是有具体所指的:一批被厂商停止维护、社区仍在维护的设备,硬件设计公开可查、接口协议被反复测绘… · 2026/11/5 12:44:12
EasyU优启通PE维护盘实战指南:制作、启动与核心操作全解析 1. 为什么一个PE维护盘值得单独拿出来聊装系统、修引导、救数据、清病毒,这些活儿但凡干过几次的人都知道,真正决定效率的往往不是你手速多快,而是手边那套PE环境靠不靠谱。EasyU(圈内习惯叫优启通)就是在这个场景下被… · 2026/11/5 16:49:35
Rust原来很简单二:所有权系统 Part 2 核心篇 —— 所有权系统
本篇覆盖 第 6 ~ 10 章:所有权、借用与引用、生命周期、字符串与切片、内存模型。 ⚠️ 这是全书最重要的一篇。 把它吃透,Rust 从此“很简单”;跳过它,你会处处碰壁。请慢下来,动手敲每一段代码。 第 6 章 所有权:Rust 的第一性原理
6… · 2026/11/5 16:26:08
基于Hadoop+Spark的民宿智能推荐系统设计与实现 1. 项目概述:大数据时代的民宿智能推荐这个毕业设计项目融合了当前大数据领域最主流的技术栈,构建了一个完整的民宿推荐系统解决方案。作为一名长期从事大数据系统开发的工程师,我认为这个选题非常贴合实际应用场景——随着旅游业的复苏和共享… · 2026/11/5 14:59:25
ADS122U04IPWR+STM32F427ZI工业级温度测量信号链设计 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/5 14:10:41
UART接口24位ADC搭配RS485,解决远距离温度监控难题 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/5 14:10:41
UART接口24位ADC搭配PIC18F46K22的RTD与热电偶测温实践 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/5 14:10:41
双极步进电机控制实战:DRV8818PWPR与PIC18F86K22驱动调试 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/5 10:27:59
STM32F207ZG + DRV8818PWPR 步进电机驱动实战解析 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/5 10:28:03
DRV8818PWPR+dsPIC30F4013工业级双极步进电机控制方案 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/5 10:28:07
多智能体协作系统架构设计与实践优化 1. 多智能体协作系统的时代背景2017年Transformer架构的诞生彻底改变了人工智能的发展轨迹。当行业还沉浸在单一大模型带来的性能突破时,Anthropic的研究团队已经将目光投向了更前沿的领域——如何让多个智能体通过协作产生超越单体能力的系统智能。这就像交响乐团中… · 2026/11/5 0:00:39
大模型系统性入门实战指南:从原理到部署微调的全链路路线 提到大模型的系统性入门,我先说个结论:这事真不难,难的是资料太散、路线太多,今天这个框架明天那个工具,新人很容易在“收藏夹吃灰”和“教程看到一半放弃”之间反复横跳。市面上关于大模型的内容少说有几十万篇&#… · 2026/11/5 0:00:39
鸿蒙文件系统沙箱机制解析与开发实践 1. 鸿蒙文件系统沙箱机制深度解析作为一名从Android转向鸿蒙开发的工程师,我深刻体会到文件系统访问是迁移过程中最先遇到的"拦路虎"。在Android上运行良好的文件读写代码,在鸿蒙真机环境却频频出现文件写入后神秘消失或直接抛出权限拒绝错误的… · 2026/11/5 0:00:39
双极步进电机控制实战:DRV8818PWPR与PIC18F86K22驱动调试 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/5 10:27:59
STM32F207ZG + DRV8818PWPR 步进电机驱动实战解析 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/5 10:28:03
DRV8818PWPR+dsPIC30F4013工业级双极步进电机控制方案 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/5 10:28:07