AgentScope 24.4:多智能体协作标准化,从零搭建高效Agent系统
1. 这个24.4版本到底解决了什么问题多智能体系统喊了好几年真正用起来的人并不多。原因很简单搞一个大模型应用单Agent已经够折腾了再往上堆三五个Agent协同光是消息格式、上下文传递、调用顺序这些问题就能把人逼疯。每次和同行聊起来大家普遍的感受是——多智能体的概念很性感代码很骨感。AgentScope这个工具我第一次看到24.4这个版本号的时候第一反应是“又来了个框架”。但真正跑起来之后它给我的感觉不太一样。它不是又造了个Agent轮子而是把重点放在了“标准化”这三个字上。简单说它想解决的就是多智能体协作中那些杂七杂八的协议问题、消息乱飞的问题、不同模型不好适配的问题。24.4版本最大的变化就是把多智能体之间的交互协议做得更规整了同时强化了对各类大模型的原生适配能力。这个工具适合谁如果你正在做复杂任务拆解、多角色协同、或者想把手头的单Agent升级成真正能分工协作的系统AgentScope值得花点时间研究。哪怕你完全没接触过多智能体只要懂一点Python照着这篇文章走一遍也能快速搭起一个能跑的多智能体Demo。2. 为什么多智能体开发需要一套标准化交互协议2.1 没有协议约束的Agent协作就是一场灾难假设你要做一个内容创作助手让一个Agent负责选题一个Agent负责写初稿一个Agent负责润色。听起来分工明确对吧实际跑起来你会发现选题Agent输出的是一段自然语言写稿Agent需要的是结构化指令润色Agent又要接收Markdown格式的文本。如果每个Agent都按自己的喜好输出格式整个链路根本跑不通。而且还有个更隐蔽的问题Agent之间的消息传递是没有“上下文”概念的。A发给B的消息B要不要记住记住了存多久多个Agent同时工作的时候消息怎么路由这些问题如果不通过统一的协议来解决最后的代码会变成一个巨大的if-else泥潭。我之前见过一个项目团队用最原始的方式实现多Agent协作——直接互相调函数传参。结果就是每个Agent都要知道其他Agent的内部接口耦合度极高加一个新Agent就崩一次。2.2 标准化协议的价值在于让Agent成为可替换的“零件”AgentScope的设计理念我梳理下来核心就一句话把Agent当成乐高积木而不是焊死的零件。它通过一套标准化的消息格式和会话模式让每个Agent只关心自己收到的消息和应产出的结果至于消息从哪来、发给谁全部交给框架层处理。这个思路其实和我们做微服务很像。你把每个Agent看作一个独立的服务Agent之间的通信看作服务间的API调用。只要API定得足够清晰服务内部怎么实现都无所谓。AgentScope就是把这些API规范给固化了开发者只需要实现每个Agent的业务逻辑不用再重复造通信的轮子。24.4版本里这套标准化做得更彻底了。我看了一下它新增的消息结构已经在底层预留了更多扩展字段这意味着以后接入新的模型或者新的Agent类型不用再改核心代码。3. 核心机制解读AgentScope的三大支柱3.1 说话者选择机制谁来发言怎么决定AgentScope里最值得琢磨的机制是说话者选择。它定义了一套完整的发言规则当多个Agent在一个会话里下一个发言的是谁由什么决定。最简单的方式是轮流发言每人说一轮。但在真实业务里轮流发言效率很低。比如一个翻译场景需要先有“翻译者”输出译文再有“校审者”去校审最后“输出者”整理格式。如果轮流来顺序不对任务根本没法完成。AgentScope支持几种模式我自己惯用的是基于“任务状态”的发言选择机制。说白了就是给每个Agent设置一个触发条件条件满足才允许发言。这个还不够24.4版本把触发条件做了更细的扩展比如可以基于消息内容的语义判断来决定是否触发某个Agent。这一点在实战中非常管用比如检测到消息里含有“翻译”关键字才唤醒负责翻译的Agent而不是让它每轮都跑一遍。下表是我整理的几种常见说话者选择模式供大家参考模式类型适用场景优点缺点轮流发言头脑风暴、自由讨论实现简单效率低无重点条件触发发言流水线任务、场景化工作流精准、可控规则设计有一定成本基于语义的发言选择动态任务拆解、复杂协作灵活、智能依赖模型语义理解能力有失败概率3.2 消息传递与共享上下文怎么让Agent“记忆一致”多Agent协作另一个坑是上下文管理。每个Agent调用大模型都需要把相关上下文拼进Prompt里。你总不能让每个Agent都看到所有消息——先不说费用问题单是Token超限就卡死了。AgentScope的解决方案是给每条消息打上“可见范围”的标签。就好比在群里人一样一条消息发出去了不是所有人都需要响应只要让相关Agent感知到就够了。24.4版本在消息传递上优化了上下文蒸馏的功能我测试下来它会把已经完成的历史对话做一轮摘要压缩然后再注入到下一轮Prompt里。这个能力对于需要长时间运行的任务来说可以说是救命级别的。我之前跑一个需要几十轮迭代的任务如果没有这种机制光上下文费用就顶不住了。3.3 标准化Agent规范原生适配大模型的底层能力这里必须解释一下AgentScope说的“原生适配大模型”到底指什么。不是说你接入了ChatGPT或者开源模型就叫适配了而是指它在消息协议层面就兼容了各类模型对长文本、系统提示词、函数调用格式的不同要求。不同的大模型它们的输入限制和处理偏好差异巨大。有的模型适合接收结构化JSON有的模型更适合自然语言指令有的模型则对Prompt的前后顺序特别敏感。AgentScope在框架层把这些差异封装掉了对外提供统一的API接口你只需要在配置里指定用哪个模型它自动帮你做格式转换。这一点在24.4版本里调得很细。比如你让一个Agent使用开源模型一个Agent使用商业模型的API两个Agent之间通信只需要按AgentScope的消息格式发送完全不用关心彼此底层用的什么模型。4. 从零搭建一个多智能体应用手把手实操4.1 环境准备与安装先准备好Python环境建议3.10以上版本。然后用pip安装AgentScope这一步没什么特别的pip install agentscope安装完之后验证一下版本号确保是24.4系列import agentscope print(agentscope.__version__)我之前踩过一个坑就是版本混用。AgentScope更新节奏挺快不同版本的API多多少少有点变动所以务必统一版本最好是用虚拟环境隔离项目依赖。4.2 构建一个最小可运行的多智能体Demo我先写了一个最简单的双Agent协作任务一个Agent负责生成文案一个Agent负责审查文案并给出修改意见如果审查不通过生成方根据意见重写循环几轮直到通过。from agentscope.agents import ReActAgent from agentscope.message import Msg # 配置两个Agent本质上是包装了两套大模型调用 writer ReActAgent( namewriter, sys_prompt你是一名专业的文案创作人员根据要求输出高质量文案。, model_config_nameqwen-plus, # 假设配置里已注册该模型 ) reviewer ReActAgent( namereviewer, sys_prompt你是一名严格的文案审校人员负责审核文案质量并给出修改意见。, model_config_namegpt-4o-mini, # 演练时用便宜的模型即可 ) # 主循环最多迭代3轮 for _ in range(3): # 让写手Agent生成文案 writer_res writer(Msg(nameuser, content写一句关于咖啡的广告语)) print(f{writer_res.name}: {writer_res.content}) # 让审校Agent审查 review_res reviewer(writer_res) print(f{review_res.name}: {review_res.content}) # 简单判断是否通过这里可以用规则判断也可以让模型自行判断 if 通过 in review_res.content or 没问题 in review_res.content: print(终稿已确认协作结束) break # 不通过则把审校意见传给写手继续修改 writer_res writer(review_res)这段代码虽然简单但已经把AgentScope的核心用法体现出来了——Agent之间通过Msg对象传递消息每个Agent的返回值又是一个Msg天然形成了消息链路。注意一点代码里的模型配置名需要提前在配置文件中注册。我习惯用一个JSON文件集中管理模型配置{ model_configs: [ { config_name: gpt-4o-mini, model_type: openai, model_name: gpt-4o-mini, api_key: sk-xxx }, { config_name: qwen-plus, model_type: dashscope, model_name: qwen-plus, api_key: sk-xxx } ] }加载方式也很直接from agentscope.manager import ModelManager manager ModelManager.get_instance() manager.load_model_configs(config.json)4.3 进阶玩法加入标准化消息路由只有两个Agent串联比较简单一旦场景复杂起来比如三个以上Agent消息该给谁就变成了大问题。AgentScope提供了msg的路由字段解决这个问题。举一个实战案例我想做一个“选题-创作-配图”三位一体的内容生产链路。选题Agent先产出一个选题然后创作Agent写初稿配图Agent根据初稿内容出配图提示词最后汇总Agent把文案和提示词打包。这里的关键是消息路由——创作Agent写完初稿后这条消息要同时发给配图Agent和汇总Agent而不是只发给其中一个。AgentScope里可以通过给消息挂载routing信息来实现。from agentscope.message import Msg # 创作Agent生成初稿 draft_msg writer(Msg(nameuser, content基于‘秋季奶茶’写一篇小红书文案, routing[image_agent, summary])) # 配图Agent接收初稿返回配图建议 image_msg image_agent(draft_msg) # 汇总Agent同时接收初稿和配图建议输出最终内容 final_msg summary_agent(draft_msg, image_msg)实际跑通之后感受很明显多Agent协作的代码结构依然很清晰没有因为通信关系复杂而变得不可维护。这正是标准化协议带来的直接好处。5. 常见问题与避坑指南实测记录5.1 模型幻觉导致Agent偏离任务多Agent场景里模型的幻觉问题会被放大。一个Agent跑偏了后面的Agent也会跟着跑偏最后得到的结果完全没法用。我遇到过一个案例一个负责“提取关键词”的Agent在链路中自作主张开始“总结中心思想”导致后面所有Agent都基于错误输入工作。排查下来原因是系统提示词写得太开放没有限制Agent的输出范围。避坑建议给Agent的syst_prompt里一定要写明确边界。比如提取关键词的Agent我会加上“你只负责输出关键词列表禁止输出任何其他内容”。也不要再用“你可以...”这种开放式引导直接用“你必须...”这种强约束描述。5.2 消息体太大导致Token超限多轮对话跑久了历史消息越攒越多很容易把上下文窗口撑爆。我在跑长链路任务时经常会收到上下文超长的报错。排查之后发现问题出在消息的“可见范围”上。AgentScope虽然有能力做上下文摘要但前提是消息挂载了合理的路由和生命周期标识。我最初写代码时没有给历史消息设置过期策略导致所有历史消息无限期保留。建议养成习惯对于一次性消息用完后及时做清理对于长期逻辑用AgentScope提供的记忆组件做持久化而不是把所有历史都塞到上下文里。5.3 多Agent争抢发言导致死循环另一个非常有意思的坑是“两个Agent互相对话停不下来”。比如一个Agent说“你觉得呢”另一个Agent说“我觉得你提的建议不错但我们可以进一步优化”然后第一个Agent又回复“那请你提出优化建议”……循环就开始了。这本质上是因为Agent的“终结条件”没有设置。有两种解决办法第一种在系统提示词里告诉Agent“当你认为任务已达成时输出固定的结束标记例如[FINISH]”第二种在代码层面设置最大循环次数超限强制结束。我建议两个都做毕竟模型有时会用完工具也没法判断任务是否真的完成。下面整理一个问题速查表方便遇到问题时候快速定位常见问题可能原因排查方法解决方案Agent不听从指令系统提示词模糊检查sys_prompt边界是否明确用强约束语言重写提示词消息越积越多没有设置消息生命周期或路由查看发送消息的routing字段合理设置可见范围与清理策略两个Agent陷入死循环缺终止条件观察日志中循环的输出内容增加结束标记与最大轮数不同模型间对接格式乱码模型提示词偏好差异检查模型配置类型统一走标准消息协议不让Agent之间直接传原始文本5.4 高并发与性能调优如果你打算在多智能体系统外面再包一层API服务性能问题是绕不开的。几个Agent同时调用外部大模型API如果没用异步机制整体延迟会线性叠加一个不理性的任务甚至跑上一分钟。AgentScope底层支持了异步模式我建议在涉及外部模型调用的场景下优先考虑异步并行执行。但要注意不是所有Agent都能并行存在依赖关系的Agent必须串行等待。合理的策略是先梳理Agent依赖树把能并行的模块用异步调用搞定有依赖的链路再按顺序执行。6. 更进一步AgentScope与现有系统的集成6.1 用工具调用扩展Agent能力边界单独让Agent写Prompt、做总结这些功能其实很有限。AgentScope支持给Agent挂载工具让它可以做一些“动手”的事情比如查数据库、调用搜索API、读写本地文件。我有一次做数据分析任务让一个Agent负责写统计逻辑另一个Agent负责跑代码第三个Agent负责解读运行结果整体过程非常流程化。如果没有工具调用能力这类任务根本没法实现自动化。工具注册的方式很直观就是通过装饰器把普通Python函数注册为Agent可调用的工具from agentscope.service import ServiceToolkit, tool toolkit ServiceToolkit() tool def query_daily_sales(date: str) - str: 查询指定日期的销售数据 # 这里写实际的查询逻辑 return 当日销售额: 120000元 toolkit.add(query_daily_sales) agent ReActAgent( namedata_analyzer, sys_prompt你会根据销售数据进行业务分析, model_config_nameqwen-plus, toolstoolkit )注意一点工具函数给Agent的“描述信息”太重要了。Agent自己是通过函数的docstring来判断“这个工具是干什么的、什么时候用”。docstring写不清楚Agent就不会正确调用工具。所以凡是注册给Agent的函数docstring建议写成“当...时调用返回...”这种结构千万不要只写一句“查询数据”。6.2 落地到业务系统的实用建议很多人关心AgentScope怎么和现有业务系统结合。我目前用的模式是把它封装成一个独立的Python微服务对外暴露HTTP接口内部跑Agent工作流。业务系统只需要传一段任务描述服务端负责调度多个Agent协作完成最后把结果返回回去。这种“异步任务状态轮询”的模式相对最稳。因为多Agent协作耗时不确定HTTP同步接口容易超时。更好的做法是提交任务后立刻返回任务ID业务系统用任务ID查询执行进度和最终结果。实现思路也不算复杂AgentScope本身提供了状态管理能力结合任务队列就能完成。跑起来的架构大概是这样API接口接收入参 → 写任务队列 → 后台Worker消费任务 → 调度AgentScope多Agent协作 → 回写结果 → 业务端轮询获取。6.3 关于24.4版本后续扩展的几点体会这个版本对标准化的强调让后续扩展变得相对省心。我举个实际感受之前想在现有系统里加一个“翻译Agent”只需要在配置里加一个模型配置、写一个Agent实例再把它挂到消息路由上整个过程不到半小时不需要动任何底层代码。标准化交互协议带来的红利是长期的。当你的Agent数量从两三个增加到十几个的时候代码的复杂度对比会非常明显。如果一开始没有协议约束这个阶段基本就是重写项目但有了标准协议这个阶段只是增加节点而已。7. 写在最后多智能体协作的关键心得最后分享一个我踩过不少坑之后总结出来的心得多智能体系统的复杂度大多数时候不是来自模型能力而是来自“如何让多个模型记住任务的整体目标”。模型本身是没有记忆的对话一多上一个Agent说的话就成了下几个Agent的“认知基础”。如果这条链路上任何一个Agent理解偏差了后面的Agent就会在错误的基础上继续发散。所以我现在的习惯是给Agent设置“阶段性目标”而不是“最终目标”。每个Agent只需要关注自己这一步的产出不需要理解整个系统的全貌。这样即使某个环节出了错也只是局部失败不会带崩全局。另外日志记录一定要做细。多Agent协作的调试比单Agent难很多因为问题可能出现在任意一个环节。我的做法是每个Agent的输入和输出都单独落日志同时记录消息的来源和路由。这样一旦出问题顺着日志就能定位在哪个环节发生了信息丢失或歧义。AgentScope 24.4给我的整体感觉是它确实让多智能体开发从“手工拼装”走向了“标准化装配”。但它归根到底还是一个工具决定系统上限的还是你自己的任务拆解能力和Agent提示词功底。工具解决“怎么连”的问题你解决“连起来干什么”的问题。两者配合好多智能体系统才能真正发挥出威力。

相关新闻

Element树组件勾选逻辑详解:半选父级处理与全选过滤实践

Element树组件勾选逻辑详解:半选父级处理与全选过滤实践

做中后台系统的人,几乎都会在某个版本里被el-tree的勾选逻辑绕晕一遍。标题里这个问题我拆开说:默认父子联动模式下,你勾选几个子节点,父节点只显示半选(checked是false,但复选框上有一条横杠)&…

2026/10/13 23:29:27 阅读更多 →
【Bug已解决】In Colaboratory, CUDA cannot be used for Pytorch 解决方案

【Bug已解决】In Colaboratory, CUDA cannot be used for Pytorch 解决方案

【Bug已解决】In Colaboratory, CUDA cannot be used for Pytorch 解决方案 问题描述 Google Colaboratory(Colab)是深度学习领域最受欢迎的免费 GPU 云端开发环境之一。然而,许多开发者在使用 PyTorch 时会遇到 CUDA 不可用的问题&#xff0…

2026/10/13 23:28:26 阅读更多 →
LeetCode 226翻转二叉树:六种遍历实现与面试避坑指南

LeetCode 226翻转二叉树:六种遍历实现与面试避坑指南

LeetCode 226 这道翻转二叉树,在算法面试里可以说是“抬头不见低头见”的经典题。题目本身不难,难的是你能不能把它回答得漂亮——递归前序遍历、后序遍历、中序遍历、迭代栈、层序遍历队列,加上各种变体,至少能写出六种实现方案。…

2026/10/13 23:28:26 阅读更多 →

最新新闻

构建数学解题Agent:从LLM局限到工具调用与验证优先架构

构建数学解题Agent:从LLM局限到工具调用与验证优先架构

1. 从“让模型直接做数学”到“让模型组织数学”写这篇的时候,我翻了下前面三篇的留言,发现问得最多的不是某一个具体提示词怎么写,而是一类带着困惑的问题:为什么我让大模型算个积分、解个方程,它经常一本正经地给我一…

2026/10/14 4:47:57 阅读更多 →
C++类型转换详解:原理、实践与陷阱

C++类型转换详解:原理、实践与陷阱

1. 类型转换的本质与分类在C编程中,类型转换是每个开发者每天都会遇到的常规操作。但看似简单的类型转换背后,却隐藏着许多值得深入探讨的技术细节。类型转换本质上是在不同类型之间建立桥梁的过程,它决定了数据如何在不同类型间流动和解释。…

2026/10/14 4:47:57 阅读更多 →
B2B电商平台银联电子支付实战接入指南

B2B电商平台银联电子支付实战接入指南

1. 项目概述:为什么一个B2B电商平台必须认真对待银联电子支付接入“B2B电商平台——ChinaPay银联电子支付功能(实战)”,这个标题看起来平实,甚至有点老派,但背后藏着的是中国产业数字化进程中一个极其关键却…

2026/10/14 4:47:57 阅读更多 →
Rabbit health check failed排查:从健康检查原理到连接配置修复

Rabbit health check failed排查:从健康检查原理到连接配置修复

排查过一阵“Rabbit health check failed”报错之后,我发现不少开发者在Spring Cloud项目里见到这个日志的第一反应都是先Check一下RabbitMQ的端口通不通、账号密码对不对,结果发现Rabbit本身好好的,消息也能发能收,但服务注册到注…

2026/10/14 4:47:57 阅读更多 →
亲测2026最新10款免费降ai率工具(附工具优缺点对比图)

亲测2026最新10款免费降ai率工具(附工具优缺点对比图)

看到满页飘红的AIGC检测结果,真的挺让人头疼的。我之前为了降低ai率,各种偏方都试过,现在网上的降ai率工具五花八门,挑得人眼晕。 为了搞清楚到底哪个靠谱,我干脆把市面上热度最高的10款工具全测了一遍。今天把这些免…

2026/10/14 4:47:57 阅读更多 →
Qt Linux打包失败原因与linuxdeployqt避坑指南

Qt Linux打包失败原因与linuxdeployqt避坑指南

简介:本资源是一份面向Linux Qt开发者的技术实践指南,聚焦Ubuntu环境下使用linuxdeployqt工具完成Qt程序跨机部署的核心痛点。针对无Qt运行环境的目标机器,系统性梳理了从Qt开发环境配置、linuxdeployqt源码编译(含Ubuntu 18.04兼…

2026/10/14 4:46:57 阅读更多 →

日新闻

AnyPS5通用适配层设计:兼容性与性能的工程取舍

AnyPS5通用适配层设计:兼容性与性能的工程取舍

1. 从"AnyPS5"这个名字说起:它到底想解决什么问题第一次看到"AnyPS5"这个标题,我脑子里冒出来的第一个念头是:这大概率是一个围绕"跨平台运行"或者"通用适配"做文章的项目。名字里的"Any"…

2026/10/14 0:00:41 阅读更多 →
Flutter跨平台开发实战:二手交易应用与HarmonyOS适配

Flutter跨平台开发实战:二手交易应用与HarmonyOS适配

1. 项目概述:Flutter跨平台二手交易应用开发作为一名长期从事移动应用开发的工程师,我最近完成了一个基于Flutter框架的二手物品交易平台项目。这个项目最吸引我的地方在于它完美结合了Flutter的跨平台优势与HarmonyOS的生态特性,实现了"…

2026/10/14 0:00:41 阅读更多 →
DFS算法解决飞机降落调度问题实战

DFS算法解决飞机降落调度问题实战

1. 项目背景与核心思路飞机降落问题是一个经典的调度优化场景,也是算法竞赛和面试中的高频题目。这个题目要求我们合理安排多架飞机的降落顺序和时间,确保所有飞机都能安全着陆而不发生冲突。在实际航空管制中,这类问题直接关系到飞行安全和机…

2026/10/14 0:00:41 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/14 3:30:28 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/13 16:22:04 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/14 3:29: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/13 22:01:27 阅读更多 →
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/13 14:57:39 阅读更多 →
黑夜航拍船只数据集训练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/12 18:11:17 阅读更多 →