我在规划 Hermes Agent 的架构时花了很长时间纠结一个问题到底要不要把子系统切得这么细。后来实际跑过几轮复杂任务之后我立刻理解了模块化的价值——当任务链路稍微长一点你就会无比需要一个清晰的执行路径地图。这篇文章我就从整体视角梳理一遍 Hermes Agent 的子系统划分以及一条任务从触发到落地的完整路径适合刚开始接触这套框架、正在翻源码或者准备把 Hermes Agent 接进自己项目做二次开发的工程师参考。Hermes Agent 本质上是一个可编排的智能代理执行框架它的核心价值不是“调用一次大模型”而是把感知、规划、工具调用、记忆读写、权限控制这几个环节拆成各自独立的子系统再通过统一的事件总线串联起来。这样做的直接好处是你可以只替换其中某一个子系统而不影响整体链路。我见过很多项目把 Agent 写成一个巨型函数所有逻辑揉在一起后来每次加功能都是一次重构。Hermes Agent 这种子系统化的思路实际用下来确实省心很多。1. 整体架构设计与思路拆解1.1 为什么是“子系统”而不是“模块”很多框架喜欢叫“模块”但 Hermes Agent 用的是“子系统”这个词区别在哪模块通常只是代码层面的划分而子系统是可以独立运行、独立部署、独立降级的单元。比如记忆管理子系统它内部有独立的存储引擎、独立的读写接口、独立的缓存策略你可以在不重启主进程的情况下单独重启它或者换一种存储后端。这种设计对生产环境非常友好。从执行路径角度看子系统之间的边界是清晰的调度编排子系统只管流程模型网关子系统只管与大模型交互工具桥接子系统只管把指令翻译成具体操作。每一条边界都是经过实际任务验证后确定的。我之前踩过一个坑刚开始想让调度编排子系统直接调用工具省一层转发结果任务稍微复杂一点编排逻辑就变得臃肿不堪后来老老实实加回工具桥接层问题立刻缓解。1.2 三层拓扑外层网关、核心调度、设备与工具适配Hermes Agent 整体上可以分为三层拓扑结构。外层是网关层负责接收触发信号。触发来源有很多种命令行输入、HTTP 回调、定时任务、系统事件监听甚至 Obsidian 里的笔记更新也能作为触发源。网关层的作用是统一封装这些入口把它们转换成标准的内部事件格式然后丢到事件总线上。中间是核心调度层包含意图编排、模型网关、记忆管理、权限控制这几个关键子系统。这一层决定了“这个任务该怎么拆、该找谁做、能不能做”。调度层不关心具体的工具实现它只负责制定策略和检查约束所以它的运行逻辑相对稳定不会因为底层工具版本变化而频繁改动。底层是工具与设备适配层这是最容易被重视也最容易膨胀的一层。Hermes Agent 把工具分为两类一类是通用工具比如文件读写、网页请求、命令行执行另一类是设备工具比如通过 v4l2 协议读取摄像头数据、通过 i2c 或者 spi 总线操作传感器。设备工具和通用工具的差异很大设备操作通常有实时性要求、有硬件状态约束所以这里必须单独做一层抽象把所有硬件交互收敛到统一的接口后面。三层拓扑的好处是你可以在最外层网关做流控和鉴权在核心调度层做任务编排和模型路由在工具适配层做具体执行。每一层的改动都不会直接影响其他层。2. 核心子系统解析从输入感知到任务落地2.1 意图编排子系统把一句话拆成可执行的树状流程意图编排子系统是我觉得 Hermes Agent 设计得最聪明的部分。它接收经过模型网关解析后的用户意图然后把它拆成一棵“任务树”。任务树的根节点是最终目标子节点是具体的操作步骤每个操作步骤又可能带前置条件和回退策略。举个例子如果用户说“读取摄像头画面识别画面中的物体并把识别结果保存到 Obsidian 笔记里”意图编排子系统会生成这样的任务树根节点完成摄像头画面物体识别并记录子节点 A通过设备抽象层调用 v4l2 接口采集一帧画面子节点 B把画面数据交给视觉模型做物体识别子节点 C识别结果格式化写入 Obsidian 数据库回退策略如果 A 失败尝试重新初始化设备如果 B 失败改用低精度模式重试一次这套子系统的关键在于它不做具体执行只做策略决策。它会根据当前系统的状态、可用工具列表、权限配置等信息动态决定任务树怎么生成。我用下来最大的体会是把“做什么”和“怎么做”分开确实是降低复杂度的良方。2.2 工具桥接子系统把意图翻译成可执行的动作工具桥接子系统是执行路径上最关键的通道。它维护了一张“工具注册表”每个工具在注册时需要声明自己的能力范围、输入输出格式、权限等级、超时设置等信息。意图编排子系统在生成任务树时会向工具桥接子系统查询“当前有没有工具能完成这个动作”然后获得一个工具句柄。工具桥接子系统内部采用适配器模式每种工具对应一个适配器。适配器负责把统一的中间表示翻译成工具原生指令。比如对于命令行工具适配器负责拼接命令、处理参数转义对于 v4l2 设备适配器负责处理像素格式转换、帧缓冲管理。这样做的好处是上层逻辑完全不需要关心底层工具的实现细节替换工具时只需要替换对应的适配器。我实际使用中比较惊喜的一个点是工具桥接子系统支持工具链的组合。单个工具的适配器只能完成单一操作但工具桥接可以按顺序串联多个工具形成一个复合能力。比如先通过 i2c 总线的适配器读取温湿度传感器的原始数据再通过一个数据清洗工具把原始数据转成结构化 JSON最后交给模型网关做分析整个链路在工具桥接层就能完成编排不用去上层循环。2.3 记忆与上下文子系统让 Agent 记住该记住的记忆管理子系统是 Hirerch Agent 里另一个很关键的环节。它分为短期记忆和长期记忆两部分。短期记忆存放当前任务上下文的对话历史、中间状态、临时变量任务结束后可以丢弃。长期记忆存放在跨任务仍然需要保留的信息比如用户的偏好设置、设备的状态特征、常用工具的调用参数等等。长期记忆的实现采用了向量检索与结构化存储结合的方式。对于语义类的内容通过嵌入模型生成向量存入向量数据库查询时用相似度匹配对于事实类的内容比如某个 i2c 设备的地址、某个传感器的量程范围存入结构化数据库。检索时会先从结构化数据里过滤候选再用向量检索做语义匹配这种混合检索方式在实测中准确率明显高于单独使用一种方案。这个子系统比较反直觉的一点是记忆不是存得越多越好。如果长期记忆里塞满了一些过期的设备状态调度编排子系统在查询时反而会被干扰。我后来给记忆子系统加了时间衰减策略写入超过一定时间没有被访问过的记忆会被自动降权查询结果里排到后面去效果很显著。2.4 设备抽象层统一 v4l2、i2c、spi 等外设接口设备抽象层是 Hermes Agent 里比较偏底层的一个子系统但对擅长折腾硬件的朋友来说这反而是最值得研究的部分。它把 Linux 系统下常见的设备接口封装成了统一的 Python 接口你在写任务逻辑时不需要直接面对繁琐的 ioctl、设备文件读写等操作。v4l2 视频设备接口负责采集摄像头图像数据适配了不同的像素格式YUYV、MJPEG 等支持设置分辨率、帧率、曝光参数。i2c 接口负责读写 i2c 总线上的从设备寄存器适用于温湿度传感器、光照传感器、OLED 显示屏等。spi 接口负责高速同步通信适用于需要大吞吐量的设备比如高速 ADC、LCD 屏幕、Flash 存储等。这个子系统的设计目标是让上层“设备不可知”。你在一个用 i2c 温湿度传感器的任务里写的逻辑理论上可以通过更换适配器平滑迁移到一个走 spi 接口的同类型传感器上上层代码几乎不用动。实测下来不同设备之间的差异主要是时序和寄存器定义适配器把这些差异全部吞掉了确实省掉了大量重复工作。3. 执行路径地图一次任务从触发到落地的全链路3.1 Bot Mode 下的触发与装载过程Hermes Agent 在 v0.21 版本中正式完善了 Bot Mode 的执行路径。Bot Mode 是指 Agent 以常驻后台服务的方式运行持续监听外部触发源。在这种模式下一条任务的完整路径大致是触发事件到达网关事件源可能是 HTTP 请求、命令行指令、定时任务或者 Obsidian 的插件回调。网关做初步解析与鉴权检查请求的来源是否合法按照预设的权限策略判断这个触发源能不能发起某类任务。事件写入消息队列经过鉴权的事件被写入内部消息队列由核心调度层异步消费避免长耗时操作阻塞入口。意图编排子系统初始化任务从消息队列中接收到事件查询当前可用的工具列表生成初始任务树。模型网关介入做细粒度规划如果是需要大模型参与的任务请求模型接口进行任务拆解和参数补全。工具桥接子系统依次执行子任务按照任务树的顺序调用各个工具适配器每完成一步更新状态。记忆管理子系统更新状态把执行过程中的关键信息写入短期记忆和长期记忆。输出结果由网关统一返回结果可能是文本、文件路径、数据库更新记录也可能是触发了另一个任务的信号。这套链路最值得关注的是第 4 和第 5 步的衔接。意图编排做的是“硬规则”的拆解模型网关做的是“软规则”的补全。硬规则保证任务不越界、不调用无权限工具软规则让任务执行得更聪明两条线配合起来才能兼顾安全性和智能性。3.2 CUAComputer-Use Agent路径桌面端交互的特殊通道除了 Bot ModeHermes Agent 还提供了一条特殊的执行路径叫做 CUA也就是 Computer-Use Agent它专门处理桌面端的图形界面交互。这条路径把“点击按钮、输入文字、移动光标”这类操作也抽象成了工具挂在工具桥接子系统下面。CUA 路径的执行流程和普通任务路径类似但有两点不同。第一它的输入源通常是桌面级的操作事件在 Windows 桌面版中这一点尤为明显第二它需要额外的视觉反馈回路——Agent 执行一个点击操作后需要截取屏幕画面来判断操作是否生效如果画面没有按预期变化就说明点击可能没有命中目标。实际跑下来这条路径最核心的难点在于界面元素的定位。如果是在原生桌面应用里操作相对容易如果遇到远程桌面或者渲染方式特殊的应用截图识别很容易出偏差。我在使用中一般会让 CUA 在每一步操作前先做一次界面快照然后再做位移比对确认操作没有偏差后才继续下一步。Windows 桌面版本身打包了一个轻量级的界面解析组件配合起来效果还挺稳的。3.3 工具调用链路的异常回退机制执行路径上最刺激的部分不是顺利执行而是出错时的回退。Hermes Agent 在意图编排阶段就为每一个子任务设计了回退链回退不是简单的“失败重试”而是按预设策略逐级降级。比如一个走 v4l2 接口采集图像的任务如果设备被占用导致打开摄像头失败回退策略可能是先尝试重启 v4l2 设备节点再尝试降低分辨率采集如果还是不行就切换到备用驱动模式。不同的回退层级对应不同的资源开销和成功率调度子系统会按照从轻到重的顺序依次尝试。我在实际使用中发现设置合理的回退策略能大幅提升任务的最终成功率。最怕的是没有回退策略一次失败就直接把整个任务标记为失败。后来我养成了一个习惯在编写任务定义时把所有可能出现失败的操作都标注清楚并且给每个操作至少写一层回退方案。这比在代码里写一堆 try-except 要有用得多因为回退方案是从架构层面去兜底而不只是代码层面的报错处理。4. 实操中的配置要点与子系统调优4.1 Windows 桌面版安装后的基础配置如果你用的是 Windows 桌面版的 Hermes Agent安装完成后有几处配置需要特别关注。桌面版默认会开启一部分子系统但并不是所有功能都默认激活尤其是设备抽象层相关的功能在 Windows 环境下需要单独确认。第一次启动后建议先检查配置文件中的subsystem_status字段确认你需要用到的子系统状态是active而不是disabled。我碰过最多次的问题是工具桥接子系统状态正常但记忆管理子系统没有启动导致每次运行任务都缺少长期记忆任务执行得显然不聪明。另外Windows 桌面版会自动关联一些外部工具比如 Obsidian 的本地 vault首次启动时建议把 vault 路径配置好不然联结功能虽然能启用但实际的读写会失败。配置完成后建议跑一遍内置的自检命令它会测试各子系统的连通性并且输出一张子系统状态表。这张表在实际排查问题的时候非常有用它能直接告诉你哪个子系统没有准备好。4.2 执行路径上的关键参数调优Hermes Agent 的执行路径上有一批关键的参数调好它们能让任务执行流畅不少。以下这几个是我实际使用中调得最多、收益最明显的参数task_tree_depth_limit限制任务树的最大深度防止意图编排子系统生成过深的递归结构。tool_call_timeout设置工具调用的超时时间尤其是设备类的工占v4l2 和 i2c 操作如果超时默认等待时间往往过短或过长。memory_retention_hours长期记忆的时间衰减窗口默认值可能不适合你的场景需要按任务的频率调整。agent_retry_chain回退链的长度设置过长会导致错误累计过短则起不到兜底作用。调参的时候建议一次只动一个参数并且观察改动前后的日志对比。我用过一次同时调三个参数结果出了 bug 都不知道是哪个参数导致的浪费了半天时间。后来学乖了每调整一个参数跑一遍固定的测试任务对比执行路径日志。这样参数变更的效果一目了然。4.3 与 Obsidian 联动时的子系统配合很多同学喜欢用 Hermes Agent 和 Obsidian 联动让 Agent 读取笔记、整理资料、甚至把任务结果写入 vault。这里有一个很容易踩坑的点Hermes Agent 的 Obsidian 桥接工具与记忆管理子系统是两条独立的通道前者负责读写笔记后者负责维护任务记忆两者互不干扰。如果你希望任务执行完后不仅写入笔记还能在之后的对话中“记住”这份笔记的关系那么你需要在任务树里显式地加上一步“更新长期记忆”否则记忆管理子系统是不会主动去读取 Obsidian 内容的。刚开始我以为它们会自动同步结果显示 Agent 每次都是现场搜索速度慢还偶发遗漏。配置联动时建议在 Obsidian 桥接工具的适配器配置里打开auto_update_memory开关并且在记忆管理子系统的配置里添加对 vault 路径的扫描规则。这样每次写入笔记后记忆子系统会自动索引新的内容后续任务就能直接读取到。5. 常见问题与排查技巧实录5.1 任务在规划阶段卡住不动如果你发现任务提交后一直停留在“规划中”状态最可能存在两种情况一是意图编排子系统在查询工具表时没有匹配到合适的工具导致生成的树为空二是模型网关的调用超时规划过程中依赖的模型接口没有及时返回。排查思路是这样的先看调度日志里有没有生成 token 的编号如果有说明任务树已经生成问题出在后续执行阶段如果没有说明任务树都没有生成成功。然后检查工具桥接子系统的注册表用自带的列表命令确认目标工具是否存在、状态是否启用了。我曾经遇到过一种情况工具本身存在但是它的权限等级比当前触发源高导致查询时被过滤掉了这种情况下在日志里会看到permission denied的记录。5.2 设备操作类工具频繁超时v4l2 或者 i2c 操作频繁超时是一个比较常见的问题。超时通常不是适配器本身的问题而是硬件层面的冲突或者资源被抢占。比如摄像头被其他进程占用或者 i2c 总线上有其他设备地址冲突。排查建议是优先确认设备路径是否可用Linux 环境下可以用系统自带工具查看对应的设备文件状态。如果设备文件存在但还是超时就要检查是不是有多个进程同时在打开同一个设备节点。设备抽象层在设计时已经做了互斥锁但不建议跨进程使用同一个设备节点这一点在配置多任务并发时要特别注意。5.3 工具桥接子系统权限控制过于严格这个问题在把 Hermes Agent 接入已有项目时特别常见。默认配置下工具桥接子系统对权限的判定很严格凡是未显式授权的工具都不允许调用。有些工具明明在注册表里存在但权限配置文件里没有给它分配允许的调用来源导致任务执行时直接被拒绝。我自己的处理办法是先跑一个最低权限模型把真正用得到的工具加到白名单里然后把权限评级设置在“仅允许可信来源调用”。在开发环境可以适当放宽但生产环境还是建议保持严格。这个子系统定期会生成权限访问记录记得偶尔翻一翻可以看到有没有工具被反复拒绝用顺手了之后哪些工具需要解开权限一目了然。5.4 一次执行路径的完整日志解读日志是排查 Hermes Agent 问题最直接的武器。执行路径日志的设计比较规整每一行都包含了子系统编号、事件类型、时间戳、任务 ID。我一般会用事件类型做过滤直接看SYS.SCHED调度编排、SYS.TOOL工具桥接、SYS.MEM记忆管理三类记录。定位问题时先顺着任务 ID 把全链路日志拉出来看状态流转的轨迹在哪个环节断了问题就在哪个子系统范围里。有个小技巧是把日志输出切到 JSON 格式配合一些文本处理工具做关键字统计能快速看出哪个工具调用的失败率最高哪个阶段耗时最长。这个方法帮我发现过一个隐藏很深的瓶颈——原来记忆检索占了整个任务执行时间的四成后来做了索引调优速度提了快一倍。我个人在实际操作中最大的体会是架构总览这种东西不能只当成一份读文档而是应该作为你在排障时反复对照的“地形图”。刚开始接触 Hermes Agent 的时候我也觉得看子系统定义很枯燥直到任务链路跑复杂之后才发现只有心里有一张清晰的路径地图才能在报错日志跳出来的时候几秒钟之内判断问题出在哪一环。这套框架的子系统划分和路径设计把复杂的智能体任务拆解成了可控的流水线你在接入和使用时越理解它的边界就越能把它的能力发挥出来。按照这个思路去梳理你自己的项目架构收获会非常大。
企业数字化 ERP 产品动态
相关推荐
Android A2UI:从XML到Jetpack Compose的声明式UI演进 1. 这不是“替代”,而是Android UI开发的代际分水岭“Android 原生的 Compose A2UI 也来了,你还抱着 XML 养老吗?”——这句话乍看像营销口号,但背后是过去三年我带团队重构6个中大型App时反复验证过的事实:XML 布局文… · 2026/11/7 1:28:25
Iceoryx无锁队列设计与实时系统性能优化 1. Iceoryx无锁队列的设计背景与核心价值在实时系统和自动驾驶领域,进程间通信(IPC)的性能瓶颈一直是困扰开发者的难题。传统基于锁的共享内存通信方式,在高并发场景下会出现严重的线程争用问题。我曾参与过一个车载传感器数据融合项目,当12个… · 2026/11/3 7:29:25
LeetCode 3010题解:数组最小分割代价的动态规划实现 1. 问题背景与核心挑战这道LeetCode周赛题目(编号3010)要求我们将一个整数数组分割成若干子数组,使得所有子数组的"代价"之和最小。题目给出的代价计算规则是:每个子数组的代价等于该子数组中的最小值,而总代… · 2026/11/13 21:55:36
工地太忙根本没时间复习考试?电工证在哪点办值不值得考全攻略 工地太忙根本没时间复习考试?电工证在哪点办值不值得考全攻略 工地太忙根本没时间复习考试,这是很多一线施工人员的普遍烦恼,尤其是像你这样在平顶山项目做现场管理员的,每天忙得连轴转,一想到还要抽时间备考电工证,脑袋就大了。但问题是,… · 2026/11/14 10:33:47
当下电工证合并了吗真实经历告诉你实操考试心里没底怕挂科 当下电工证合并了吗真实经历告诉你实操考试心里没底怕挂科 实操考试心里没底怕挂科,这是三门峡初次报考电工证的很多学员的共同心声。说实话,第一次接触这类考试,谁都有点紧张,毕竟涉及安全操作,容不得半点马虎。但根据我的真实经历来看,只要你准备充分… · 2026/11/14 10:33:47
低压电工证在杭州怎么复审?含金量高的证书别让有效期“过期” 低压电工证在杭州怎么复审?含金量高的证书别让有效期“过期” 你是不是也遇到过这种情况?低压电工证在杭州证到期了,却不知道该怎么复审延期,结果一拖再拖,影响了工作机会,甚至被单位辞退?别急,这期我们就来聊聊低压电工证在杭州的复审流程、含金量以… · 2026/11/14 10:33:47
山东汽车电工证办理值不值得考?这些坑千万别踩 山东汽车电工证办理值不值得考?这些坑千万别踩 你是不是也这样,看到【山东汽车电工证办理】这几个字就犯愁?不知道去哪报名怕被中介坑,还担心考了也没用?别急,这期我来给你讲明白, 山东汽车电工证到底值不值得考 ,该怎么避开那些报名坑。 ###… · 2026/11/14 10:33:47
柳州市电工证快速办理怎么避开中介坑?考前押题资料曝光 柳州市电工证快速办理怎么避开中介坑?考前押题资料曝光 你是不是也在为柳州市电工证快速办理发愁?不知道哪里报名怕被中介骗,还担心考试不过?别急,我来给你支招,教你避开那些套路,轻松拿证!… · 2026/11/14 10:33:47
电工证代审有效吗电子证书能否异地转接 电工证代审有效吗电子证书能否异地转接 之前考的证在外省能不能转过来?这几乎是所有在外地打工、想转岗的电工从业者最关心的问题。现在不少人在问, 电工证代审有效吗 ,而很多人也关心,自己在外省考的证能不能拿到本地用, 电子证书… · 2026/11/14 10:32:47
电工证丢失还能补吗?千万别踩坑,丢了证等于失业 电工证丢失还能补吗?千万别踩坑,丢了证等于失业 你正在找工作,但手里的电工证突然丢了,这下怎么办?别急,先别慌, 电工证丢失还能补吗 ?答案是肯定的,但 千万别踩坑 ,补办流程如果不了解,可能会耽误你上岗、甚至影响到你的收入。… · 2026/11/13 22:30:50
电力电缆作业证直播报名入口与办理流程良心建议 电力电缆作业证直播报名入口与办理流程良心建议 你是不是也担心学历不高报不了名?别急,今天就给你讲讲 电力电缆作业证直播 的报名流程和那些你必须知道的干货, 良心建议 在这里,别错过。 电力电缆作业证直播报名需要什么条件?… · 2026/11/13 5:40:45
英德电工证报考费多少钱,怕考不过白交培训费?看完这篇别再踩坑 英德电工证报考费多少钱,怕考不过白交培训费?看完这篇别再踩坑 怕考不过白交培训费?英德电工证报考费多少钱,你真的了解吗?现在市面上培训机构五花八门,价格参差不齐,很多人一不小心就花了冤枉钱,结果还考不过。别急,今天就来给你说清楚英德电工证的… · 2026/11/12 23:27:43
有初级电工证怎么工作 2026河南最新政策怎么应对 有初级电工证怎么工作 2026河南最新政策怎么应对 之前考的证在外省能不能转过来?这个问题我每天被问上百次。2026年河南最新政策对证书跨省转移有了明确说明,特别是南阳市的从业者,需要特别关注。… · 2026/11/14 0:00:31
电工证过期了不知道怎么复审?考电工证自学书+官方报名入口全攻略 电工证过期了不知道怎么复审?考电工证自学书+官方报名入口全攻略 证书过期了不知道怎么复审延期?很多人遇到这种情况,要么是工作太忙没时间处理,要么是不知道具体流程,导致证书失效,影响工作和项目进展。其实复审并不难,关键是要找准官方报名入口,掌… · 2026/11/14 0:00:31
为什么要低压电工证实操考试考什么 为什么低压电工证值不值得考?别再被中介骗了 你是不是也经常看到网上有人在问“低压电工证到底值不值得考”?或者在找报名点时,担心被中间人骗钱?这些问题,我懂,我也经历过。作为一名在应急管理行业摸爬滚打多年的从业者,我深知低压电工证不仅是一个从… · 2026/11/14 0:00:31
双极步进电机控制实战: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/13 6:12:21
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/13 6:11:51
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/13 22:31:30