OpenRIG实战:将AI Agent作为基础设施构建生产级应用

发布时间:2026/10/4 20:06:57

OpenRIG实战:将AI Agent作为基础设施构建生产级应用 最近两三周我的信息流里反复出现同一个词openrig。GitHub Trending上榜Hacker News上有讨论串连几个平时只聊业务的AI群里都有人问“这东西和LangChain到底什么区别”。我把官方文档和源码仓库都过了一遍又在本地搭了个Demo跑了一周还试着把一个真实的客服场景搬了上去。先说结论OpenRIG不是又一个“Hello Agent”级别的玩具框架它更像是把Agent当基础设施来做的开源项目。2025年的技术圈几乎没有人怀疑“AI Agent会进入生产线”这件事。但真正动手做过的人都知道从一次成功的ChatGPT对话到一个稳定的线上Agent服务中间隔着十万八千里模型输出不稳定、工具调用经常冒出参数错误、上下文越跑越长、日志基本没法看。OpenRIG就是冲着这些真实问题来的。这篇文章里我会拆解它的核心设计、上手路径和工程化改造方法也会给出我基于实战的选型建议和排坑记录。1. OpenRIG是什么我为什么要盯上这个项目1.1 Agent开发正在从“聊天”走向“干活”过去两年大家讨论AI应用多数还是在讨论“一个更强的模型能生成什么”。但到了2025年方向已经明显变了大家关心的是“一个模型能不能调用某接口把事情办完”——查订单、退款、排产、调度、写纪要甚至跨系统完成一整个业务流程。这个转变带来的第一个冲击就是工程复杂度突然暴涨。以前做AI聊天机器人写一个Prompt加上服务端流式转发就够了现在做Agent你要管理模型、工具、记忆、权限、重试、观测每一块单独拿出来都是一大摊子事。我在自己团队里做过一次摸底发现最花时间的根本不是Prompt微调而是“怎么让工具调用变得稳一点”。同一个工具模型今天愿意用JSON传参明天就给你来一段Markdown乱码同一个会话聊到第20轮之后就开始忘记前面的结论。这些问题单个看都不难处理合在一起就变成一个系统工程。所以当我看到OpenRIG这类项目时关心的不是它又包装了多少模型层而是它有没有真正把工程化问题纳入自己的核心设计。1.2 OpenRIG的定位Agent基础设施而不是Agent SDK如果把这两年出现的AI开发框架放一起看大致有三种定位面向算法工程师的SDK比如LangChain面向业务人员的低代码平台比如Dify还有一种就是面向应用开发团队的基础设施——OpenRIG更接近这一种。它的核心不是提供几个顺手的内存工具函数而是尝试把“模型接入、工具注册、记忆管理、多Agent编排、可观测性、发布流程”做成一套可以反复使用的底座。你在这套底座上开发的每一个Agent都会自动获得日志、追踪、回滚、灰度这些能力而不需要每个项目都自己从头搭一遍。这一点非常关键。因为Agent应用真正上生产之后你遭遇的绝大多数痛苦都来自“没有基础设施”——模型供应商一换SDK里十几个调用点跟着改一个Agent工具执行出问题日志里只能看到一句含糊其辞的长字符串完全不知道是哪个环节错了。OpenRIG试图通过模块化和可观测性来解决这些问题。它当然不是银弹但它的设计思路是值得仔细研究的。1.3 这个项目适合谁不适合谁先说不适合。如果你想快速写一个脚本让大模型调几个API不需要用户会话、不需要长期记忆、不需要团队协作那直接用OpenAI/Anthropic的SDK反而更轻。OpenRIG的抽象层和配置体系会给你增加不少概念负担属于杀鸡用牛刀。适合的场景包括做AI客服、企业知识助手、业务自动化流程、多Agent协作产品的团队或者打算把AI能力嵌入到已有系统里希望有一套统一的模型接入、工具调用和观测方案的平台组。它也适合那些吃过“LangChain代码越写越乱”亏的人——这类项目把配置与代码分离Agent跑在引擎上你的业务逻辑放服务里边界会更清楚。2. 核心架构拆解Agent不再是“一个巨大的Prompt”2.1 主要模块分层OpenRIG的架构思路说穿了就是把一个Agent的运行过程拆成几个可独立替换的模块。以我看到的实现至少有这么几层模型接入层统一对接各家大模型。你只需要在配置里指定provider和model名不用在业务代码里写死某家的SDK。切换模型或做多模型路由时改动都在配置层完成。工具层Agent要调用的外部能力都注册成工具。工具定义、鉴权、执行日志、重试策略统一处理模型侧只需要看见一份带参数说明的清单。记忆层管理短期会话记忆和长期持久记忆。短期记忆存多轮上下文长期记忆可以落库用来跨会话复用信息。编排层决定Agent怎么思考、怎么调用工具是单Agent完成还是多个Agent协作。不同的推理循环可以直接配置。可观测层记录每次请求的输入输出、每一步模型调用、工具调用耗时和费用方便定位问题和做评估。这个分层方式并不算惊天动地但比大多数同类项目更接近“产品形态”。以模型接入层为例很多框架都支持多个模型厂商但切换时Prompt模板可能不兼容OpenRIG在模型厂商能力差异上做了一层格式翻译实际用起来会少踩不少格式坑。这里提醒一句别把架构层当成“多套一层就万能”。该层解决的是“接得进来、换得动”如果你的业务对某家模型有深度依赖过度抽象反而会带来性能损耗。2.2 声明式配置把Agent当作代码来管理OpenRIG里我印象最深的设计是“声明式配置”一个Agent可以被描述成一个YAML文件里面包含模型选择、System Prompt、工具列表、记忆策略、运行时参数。这带来几个直接好处。第一可评审。Agent的行为配置作为文件进入Git仓库每次改动都有diff可以走代码评审流程。这比在Web界面上点来点去、最后没人知道生产环境跑的是什么版本要可靠得多。第二可复制。测试环境、预发环境、生产环境的差异可以只体现在环境变量和部署参数上Agent本体配置保持一致。第三可回滚。发坏了一个版本直接把配置回退到上一个commit即可不用改代码重新发版。当然声明式配置也有代价。它把灵活性压了一些——极其复杂的动态逻辑比如根据用户输入现场生成一段有状态脚本再去执行写配置会变得很别扭。这也是我后来在实践中摸索出边界的原因OpenRIG适合结构化明确的Agent业务不适合需要大量动态代码的场合。硬要用其实也能用但会陷入“为了配置而配置”的困境。2.3 编排与推理循环推理循环是Agent的内核。OpenRIG不是只提供一个“ReAct循环”就完事它允许你配置不同的编排策略单Agent直调最简单适合任务边界清晰的场景。Plan-and-Execute先让模型规划步骤再按计划执行适合多步骤、外部依赖重的流程。多Agent协作把复杂任务拆给路由Agent、执行Agent、质检Agent等多个角色每个Agent有独立的Prompt和工具集。我自己早期做Agent经常犯一个错不管任务简单复杂全部塞进一个大Prompt一个Agent循环里反复调工具。一开始还行任务一旦复杂上下文就大量冗余模型也容易在步骤之间“忘记”自己原来要干嘛。后来切到Plan-and-Execute或者把流程拆成多个Agent协作出错率明显下降。OpenRIG的编排设计在这个层面的价值是实实在在的——它不逼你用某一种模式而是让模式成为配置项按场景选就行。2.4 可观测性不是附加功能我对Agent框架的好感度很大程度取决于它的可观测性做得多好。原因很简单模型是概率系统你没法用“catch exception”的心态去调试它。有时候一个工具调用失败不是真的网络报错而是模型的参数本来就传错了。只看最终结果完全无法判断是哪一步出了问题。OpenRIG把运行时追踪做成内置能力每次会话从用户输入到最终输出中间每一步的推理内容、工具调用、上下文片段、Token消耗都会被记录下来。我做客服Agent的时候遇到过一次“用户说退货Agent反复查订单但就是不提交退款申请”的问题。如果只有最终日志我只能看到“Agent最后说已为您处理”。而有了追踪我能看到它在工具调用阶段一直拿不到有效订单号。原因是我给订单查询工具传了一个错误参数格式工具返回报错后它尝试了几次都失败于是“编”了一个成功回复。这种问题如果不看运行时追踪靠肉眼几乎排查不出来。3. 快速上手从零搭第一个OpenRIG Agent3.1 环境准备与安装官方仓库的安装方式迭代比较快我这里只说方法论不搬可能过期的命令。最稳妥的做法是去GitHub Releases页面下载对应平台的编译产物或者直接拉官方Docker镜像跑一个standalone实例。我自己是在一台4核8G的Linux机器上跑的用Docker Compose起了一个runtime加一个Redis内存占用比预期低很多日常调试完全够用。如果你偏向本地开发也可以只装CLI工具连远程的OpenRIG服务。这样团队里每个人共享一套开发环境模型API Key只需要配置在服务端本地不用存密钥。这个方式对多人协作很友好推荐给两三个人的小团队。安装完成后先跑一下rig version之类的命令确认环境正常然后启动本地runtime。我只提醒一个点如果你的机器上有多个容器网络启动时注意端口映射别让runtime端口和你的业务服务端口冲突。我第一次启动时8080端口被占折腾了十几分钟才定位到是另一个监控服务抢了端口。3.2 两种创建路线Studio可视化和YAML直写OpenRIG提供了一个Web端的Studio界面我建议新手先从这里开始。Studio里可以直接创建Agent选择模型填写System Prompt添加工具保存后它会给你生成一份对应的YAML配置。这相当于一个“可视化编辑器代码生成器”的组合你能一边点点点一边看配置长什么样理解速度会快很多。当你对配置结构熟悉了再切到YAML直写。直写的好处是速度快、可复用、适合批量创建。我会在一个团队里这样分工业务同学用Studio调Prompt和工具后端工程师把验证好的配置落成YAML文件走Git管理。两条路线最终产出的是同一种配置格式所以切换成本很低。3.3 实战一个YAML客服Agent实例下面这个配置是我在Demo里用的意图是做一个电商售后客服负责订单查询和退换货引导。你不需要照抄但可以感受一下OpenRIG的配置组织方式name: support-agent description: 电商售后客服负责订单查询和退换货引导 version: 0.1.0 model: provider: openai name: gpt-4.1 temperature: 0.3 prompt: | 你是电商平台的售后客服。 第一步永远是查询订单信息确认用户身份。 不要在未确认订单的情况下给出任何退款承诺。 所有涉及金额或售后动作的操作必须向用户二次确认。 memory: session_ttl: 30m persistence: backend: redis key_prefix: memory:support tools: - name: order_query endpoint: http://internal/order/query auth: ${ORDER_SVC_TOKEN} - name: refund_create endpoint: http://internal/refund/create auth: ${REFUND_SVC_TOKEN} runtime: stream: sse max_iterations: 8 concurrency: 20注意几个细节。system prompt里我强调了“先查订单”和“不要乱承诺”这看起来像废话但实际能显著降低幻觉率。max_iterations设置成8是防止Agent在某些场景下陷入无限循环。stream: sse会把模型输出以Server-Sent Events方式推给前端用户看到的打字机效果就是这么来的。3.4 运行与调试配置写好后运行起来基本是单命令操作。跑通之后第一件事不是接前端而是先在Studio的调试面板里试几个典型问题。我会把“正常订单查询”“无订单信息的退货请求”“超出售后范围的诉求”“上下文切换后的追问”这四类问题分别测一遍确认Agent行为符合预期再往下走。调试面板能完整展示每一轮推理和工具调用过程这是我最依赖的功能。比如我发现模型经常不调用order_query就直接回答后来在Prompt里补了一句“没有订单号就必须调用工具查询”并且把工具的参数描述写得更明确问题就解决了。这个调试习惯能帮你提前干掉一大半生产事故。前端接入方面如果你的应用是Web直接用SSE接收流式输出即可。如果是小程序或App通常要在你后端起一个适配层把SSE转成WebSocket再推给客户端。OpenRIG本身不关心你的传输层它把消息推给调用方之后剩下的路由是你的业务自由。4. 生产级改造记忆、多Agent与发布流程4.1 记忆策略配置Demo阶段可以不配记忆但生产环境几乎所有场景都需要。记忆分两层理解短期记忆是当前会话的多轮上下文OpenRIG会按你设定的窗口和TTL自动管理长期记忆则是跨会话的信息沉淀比如用户的偏好、历史工单结论一般要落到Redis或数据库里。配置长期记忆时有一个坑别把所有东西都往记忆里塞。有些团队想把对话全程存下来以便“随时回溯”结果Token成本直线上升模型反而被无关历史干扰。我的做法是设计摘要型记忆——每次会话结束用一个专门的模型调用把本轮关键信息压缩成100到200字的摘要存起来下一次会话再把相关摘要注入上下文。这样又省钱又有效。4.2 多Agent协作模式单Agent做客服够了但如果你要做的是“智能助手平台”比如同时管日程、审批、数据分析单Agent就会变得臃肿。OpenRIG支持把不同能力拆成多个Agent由一个路由Agent根据用户意图分发请求。我的经验是两个Agent之间尽量不要共享工具否则职责边界会糊。路由Agent只负责识别意图日程Agent只管日历操作数据分析Agent只管查数和出图表。边界越清楚调试越轻松。多Agent协作最怕的是“循环踢皮球”A判断不了就丢给BB判断不了又丢回A。我在配置里会为每个Agent设置max_iterations并且监控跨Agent的消息流转次数。一旦某个请求的流转次数异常说明路由策略或Agent职责划分有问题需要立刻调整而不是加更多Agent来“救场”。4.3 灰度发布与配置版本管理OpenRIG把Agent配置当作版本化文件来管理这让我在做灰度发布时省了很大力气。上生产之前我会在测试环境把配置提交进Git然后在预发环境用同样的配置指向预发服务跑一轮回归。确认没问题后在线上对一个很小的流量比例发布新版本配置观察误伤率和用户反馈再把流量逐步放大。发生问题时的回滚也很快把配置回退到上一个commit版本重新部署runtime即可。这里有个经验回滚时不只是回配置也要检查记忆数据是否有兼容性问题。比如旧版本Agent产生的记忆格式和新版本冲突会导致新版本读不到长期记忆。我的做法是在Agent配置里给记忆加版本字段读取时做一次格式判断不匹配就启动重新摘要流程。5. 选型对比OpenRIG和LangChain、CrewAI、Dify怎么选5.1 横向对比这段时间总有人问我“OpenRIG是不是要取代LangChain”。我觉得这类问题本身就不太准确。它们解决的不是同一层的问题。简单做个对比维度OpenRIGLangChainCrewAIDify定位Agent基础设施/平台开发者SDK多Agent编排框架低代码AI应用平台配置方式YAMLStudio代码为主代码为主可视化上手门槛中中高低中低生产特性内置追踪/发布/回滚靠生态拼装较弱闭环但封闭灵活度中高高中低适合场景产品团队、平台组深度定制开发快速多Agent原型业务侧自助搭应用LangChain的优势是灵活几乎什么都能接但灵活性也意味着你用了多少代码就得自己维护多少逻辑越到后期“技术债”越重。CrewAI在“多个角色协作”上很直观特别适合做原型但生产级稳定性需要你额外投入。Dify对业务人员友好但你很难突破它的平台边界去做完全自定义的运行时逻辑。OpenRIG的取舍在于它希望你在一定的框架内做事换取工程化能力。5.2 我的选型建议我现在的习惯是这么判断的如果团队是纯后端/算法背景想做高定制AgentLangChain或直接调用模型SDK都行OpenRIG可能是束缚。如果需要给非技术业务人员一个自助界面Dify这一类先试。如果目标是做“一个运行很久的Agent产品”希望从第一天就有日志、追踪、灰度、回滚我推荐认真看看OpenRIG。选型还有一个容易被忽略的因素团队规模。两三个人的项目怎么快怎么来七八人以上的团队就要考虑协作和运维了。OpenRIG的配置文件和观测能力在多人心智对齐上很有价值——它相当于给Agent项目定了一套团队工作流而不是只给一个人写代码方便。6. 实战中常见的坑与排查实录6.1 工具调用失败模型传参和工具契约不一致这是Agent项目里最高频的问题。现象是模型说“已为您查询”实际上工具压根没被正确调用或者调用了但参数传错。排查时先别急着改Prompt打开一次会话的完整trace看模型实际生成的tool_call结构。绝大多数情况是两种一是参数名对不上比如接口约定是order_id工具描述里写成了orderNo二是参数类型不对接口要字符串模型传成了数组。我的标准修法有三步第一步把工具描述写成“命令式示例”的格式明确给出一个正确调用样例第二步在OpenRIG的工具层开启参数格式校验不合法直接返回明确错误信息给模型让它重新生成第三步给关键工具加上“人工确认环节”涉及资金、权限变更时绝不能只靠模型判断。经过这三步之后工具调用成功率能稳定提高一大截。6.2 上下文失控与Token爆炸会话轮次一多上下文长度会快速膨胀。模型输入Token变长不但费钱还会让回复延迟明显增加。而且老对话内容会稀释新指令的权重模型越来越“迷糊”。我做过一个统计同一个Agent在会话第15轮之后的准确率比第2轮下降了将近10个百分点。最有效的办法是给Agent配置多层记忆策略窗口内保留原文窗口外的内容转成摘要真正久远的关键信息用长期记忆存储。副作用是要在“摘要丢失细节”和“上下文过长”之间做取舍。我的经验是摘要保留四类信息用户的核心诉求、已完成的操作、未完成的承诺、明确提到的偏好。业务细节宁可不存也不要存一堆没用的过程记录。另外用压缩摘要的模型选便宜快速的小模型就好没必要每次都调最强模型。6.3 Agent无限循环Agent在Plan-and-Execute或多Agent协作模式下容易出死循环。最常见的原因是“工具调用成功但信息不足”比如查询接口返回了一个空列表Agent无法得到它期望的结果于是反复调整参数重试。另一个原因是多Agent互相等待路由Agent等执行Agent返回执行Agent又觉得信息不够需要路由Agent补充。我在配置里固定了两个防线第一运行时设置max_iterations单Agent最多执行N轮工具调用第二工具层设置“错误码语义”把“数据为空”和“系统异常”明确区分开让Agent知道空结果是一个合法结果不需要反复重试。这两条加上监控里的流转次数告警基本能杜绝半夜被循环任务打爆模型账单的情况。6.4 并发与性能问题Agent服务和普通的HTTP服务不一样一次请求里可能包含多次模型调用和多次工具调用延迟和资源消耗都更加不可控。如果你的调用方是外部用户直接用同步等待可能会把服务线程池占满。我自己遇到过一次生产事故某个入口没做并发控制用户量稍涨几十个Agent请求同时涌进来每个请求内部又要调三次模型直接把模型网关的配额打爆连带着正常请求也全部超时。解决办法分两层。应用层要做信号量与熔断Agent实例的并发上限设一个合理值超出的请求排队或直接返回“稍后再试”模型层要把“限流重试、退避指数、模型降级”配置清楚。OpenRIG的runtime支持配置并发线程数但更重要的是你的业务侧要维护一个“调用预算”别让一个用户请求触发几十次底层模型调用。6.5 安全与权限边界Agent一旦拥有工具调用能力安全边界就是最不能省的事。我见过一个很典型的错误Agent工具直接暴露了内部接口只靠模型“不乱调用”来保证安全。这在测试环境没事一上生产就可能出现越权动作。我建议把工具访问控制放到模型之外OpenRIG的工具层应该对接自己的鉴权系统请求进来先验证用户身份再根据角色判断能不能调用这个工具。模型只是生成参数的“大脑”不该成为权限判断的唯一依据。对涉及资金、删除类的高危操作强制人工审批而不是让Agent自动执行。这个原则没人会质疑但实际操作中很多团队为了省事会绕过最后吃亏的还是自己。7. 写在最后我踩过坑后的一点体会我接触OpenRIG的时间不算长但这类Agent基础设施解决了我非常多的真实痛苦。以前我做一个AI客服项目感觉不是在写业务而是在“修管道”今天修模型输出格式明天调工具超时后天研究为什么context里全是垃圾。OpenRIG把管道里的常用件做成了标准件让我能把精力放回到用户问题和业务流程上。如果让我给正准备入坑的人一句提醒那就是不要一开始就追求“所有配置都要用最复杂的模式”。先用直调一个工具跑通最小闭环再按业务复杂度逐步加入记忆、多Agent、灰度发布。Agent类项目的复杂性是一点点长出来的不是第一天设计的。OpenRIG最大的价值是当业务复杂度真的长上来时它已经提前为那些迟早要面对的问题准备好了答案。
延伸阅读

更多相关文章

2026/10/4 20:06:57

那行藏在代码里的开关,让我在客户面前圆了一场大谎

上个月我陪一个客户做版本上线复盘,翻代码的时候无意间看到一行注释,写着"这个开关别动,动了线上出大事"。我当时心里咯噔一下——不是因为发现了什么惊天秘密,而是这句话让我想起自己刚入行那会儿,也被一行…

2026/10/4 21:12:00

从 failed to load plugins 看插件系统:加载失败根因与排查

我不止一次在启动日志里被一行failed to load plugins或plugins did not activate的告警搞得头皮发麻。尤其是那些把插件机制做得比较“野”的工具,装了一堆插件,最后启动时某个不显眼的报错让你排查一整个下午。这次不聊某个具体产品,而是从…

2026/10/4 21:11:59

SpringBoot多数据源配置,其实没你想的那么难

很多后端开发一听到“多数据源”就头大,觉得要写一堆配置、切面、注解,还容易踩坑。其实,SpringBoot多数据源的核心就一句话:动态路由 多个DataSource Bean。搞懂这个,半小时就能跑起来。为什么需要多数据源&#xff…

2026/10/4 21:11:59

Java面试被问烂的10道题,答错3道直接挂

Java面试中总有一些题被反复问,候选人觉得“太简单”,面试官却用它快速筛人。原因很现实:这些题看似基础,却能暴露你是否真正理解Java的设计哲学。以下10道被问烂的题,答错3道,基本宣告面试失败。1. String…

2026/10/4 21:11:59

芯片内置时钟RE超标破局:滤波失效的三大噪声路径与协同抑制

1. 项目概述:当滤波失效时,芯片内置时钟的RE超标破局之道到底在解决什么问题? “当滤波失效时:芯片内置时钟的RE超标破局之道”——这个标题一出来,我就知道又是一个被EMC实验室逼到墙角的真实战例。RE,即R…

2026/10/4 21:06:59

RealPLC Agent:TIA Portal原生AI编程闭环

1. 这不是又一个“AIPLC”的概念包装,而是TIA Portal里真正能跑通的工程闭环 我第一次在客户现场看到RealPLC Agent v1.1.0跑起来时,手里的咖啡杯差点没端稳——不是因为炫酷的UI动效,而是因为它在TIA Portal里直接调用了S7-1500的DB块&#…

2026/10/4 0:01:02

Jev+Agent接管浏览器:browser-use实战与jev-ultrafast性能优化

1. 从“Jev”说起:为什么我要把Agent接进浏览器“Jev”这个词最近在圈子里出现的频率越来越高,很多人第一次听到会以为是某个新模型的名字,其实它更像是一种思路——把Jev模型的能力当作底座,通过Agent的方式去接管浏览器&#xf…

2026/10/4 0:01:02

多智能体集群实战:DeepAgents编排、MCP与A2A协议及Skills体系

1. 从"单兵作战"到"集群协同":多智能体编排到底在解决什么问题如果你最近在折腾 Agent 相关的东西,大概率会有一种感觉:单个 Agent 能做的事情,其实很快就摸到天花板了。你给它一个提示词,挂几个工…

2026/10/4 1:01:05

无源低通滤波器设计实战:从RC到LC,手把手教你避开那些坑

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

2026/10/4 0:01:02

Jev+Agent接管浏览器:browser-use实战与jev-ultrafast性能优化

1. 从“Jev”说起:为什么我要把Agent接进浏览器“Jev”这个词最近在圈子里出现的频率越来越高,很多人第一次听到会以为是某个新模型的名字,其实它更像是一种思路——把Jev模型的能力当作底座,通过Agent的方式去接管浏览器&#xf…

2026/10/4 0:01:02

多智能体集群实战:DeepAgents编排、MCP与A2A协议及Skills体系

1. 从"单兵作战"到"集群协同":多智能体编排到底在解决什么问题如果你最近在折腾 Agent 相关的东西,大概率会有一种感觉:单个 Agent 能做的事情,其实很快就摸到天花板了。你给它一个提示词,挂几个工…

2026/10/4 1:01:05

无源低通滤波器设计实战:从RC到LC,手把手教你避开那些坑

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

还想了解更多?直接咨询顾问

免费诊断 + 免费方案 + 透明报价。

全国咨询热线400-8866-253
免费获取方案
☎咨询二维码 ☎ ↑