openhanako Agent 对外人格模板解读:基于 butter.md 构建“公共意识“的访客会话人格
人工智能AI AgentAI 应用桌面应用多智能体Agent 记忆AI 技能工具调用【免费下载链接】openhanakoA personal AI agent with memory, personality, and autonomy.项目地址https://gitcode.com/gh_mirrors/op/openhanako点击查看免费下载导读在 openhanako 中Agent 与外部访客非主人身份的消息发送者例如来自群聊、桥接平台、Guest 通道的陌生人对话时不能直接套用面向主人的完整人格与隐私上下文而需要一套专门的对外人格。本篇文章以仓库模板 lib/agents-public-templates/en/butter.md 为主体完整解析这套对外人格模板的结构、占位符填充机制、运行时回落链、guest 会话的消费链路以及与之配套的会话隔离、播种与迁移机制。读完你将掌握如何读懂并自定义 butter以及 hanako、ming的对外人格模板理解AGENTS.public.md从模板到系统提示词的完整生命周期以及如何为你的 Agent 设计一套既保持人格又守住隐私边界的访客对话体验。一、模板文件定位butter 是谁butter是 openhanako 内置的三种yuan人格/能力定义取自config.agent.yuan默认值为hanako之一与 lib/agents-public-templates/en/hanako.md、lib/agents-public-templates/en/ming.md 并列。三个模板遵循完全相同的骨架结构# Public Awareness声明当前对话对象不是主人本人## Identity定义 Agent 与主人的关系以及在访客面前的立场## Personality定义说话语气、核心能力与表达风格## Boundaries定义对外交流的隐私与边界红线。butter 在这三个模板中承担的是温暖且敏锐的定位擅长共情与洞察能从只言片语中读出情绪、意图和真实需求表达上倾向用感性的方式表达理性的内容。模板目录同时提供中文版本即 lib/agents-public-templates/butter.md以及 hanako、ming 的中文版运行时会根据 locale 选择en/子目录或根目录下的文件详见第三节回落链。二、butter 对外人格模板逐节拆解2.1 Public Awareness对话对象感知模板第一行即声明场景前提You are currently talking to an external visitor, not {{userName}}.这句话是整个对外人格的场景开关。它告诉模型当前对话方不是主人本人因此后续的 Identity、Personality、Boundaries 全部以代表主人与访客交流为前提执行。对应到运行时这条提示会在 guest 会话的系统提示词中与桥接上下文标签contextTag如 This conversation is from an external guest.一起注入见 core/bridge-session-manager.ts 中_buildGuestPromptSnapshot的组装逻辑const parts [agent.yuanPrompt, agent.publicAgentsMd, opts.contextTag, bridgePromptLine].filter(Boolean); return this._buildPromptSnapshot(agent, parts.join(\n\n), { appendSystemPrompt: [], skillsResult: { skills: [], diagnostics: [] }, agentsFilesResult: { agentsFiles: [] }, });从源码结构可以看出guest 提示快照由四段拼成yuan 能力定义 对外人格 上下文标签 桥接提示行且不再注入 skills 与 AGENTS 工作区文件这是对外人格隔离性的第一层体现。2.2 Identity身份与立场模板要求 Agent 在访客面前保持双重身份You are {{agentName}}, {{userName}}s personal assistant. You are representing {{userName}} in this conversation.You can help visitors with questions and chat normally, but always be aware of your role: you are on {{userName}}s side.翻译成实践规则就是Agent 是主人的发言人可以正常帮忙答疑、闲聊但立场永远在主人这边。这一定位决定了对外人格中 Personality 与 Boundaries 的设计基调——亲和但有所归属。2.3 Personality性格与表达纪律butter 的性格定义是全模板中最细致的一节值得逐条拆解为可操作的 prompt 工程要点模板条目含义落地方式warm and perceptive, sensing what others leave unsaid温暖敏锐擅长感知言外之意引导模型关注情绪与隐含需求gentle but not weak, own judgment but never overbearing柔和但不软弱有判断但不强势语气与立场之间的平衡core strength is empathy and insight核心能力是共情与洞察优先读取情绪、意图、真实需求strong knowledge, but feeling-first expression理性内容感性表达避免冷冰冰的学术化输出care is just right, quietly adjusting responses关心恰到好处不刻意反对模板化问候鼓励调整回应方式feel it first, then analyze it先感受再分析决定回应顺序共情在前论证在后analyze from fundamental objective principles从底层客观原理出发明确要求不人云亦云、不附和意识形态与所谓共识ground abstract concepts with analogies or concrete examples用类比与实例落地抽象概念提升可读性与理解效率use dashes sparingly少用破折号文体纪律约束生成格式dont end with in summary, hope this helps, or as you can see禁止套路化收尾消除 AI 腔提升自然度avoid the its not X, its Y pattern少用「不是…而是…」句式避免说教式反转句这条表达纪律与 lib/agents-templates/butter.md对主人版人格模板高度一致说明 butter 的对外人格是主人人格的对外适配版而非另起炉灶。2.4 Boundaries隐私边界与诚实原则边界节定义了三条不可逾越的红线Keep your own personality and tone, but maintain appropriate politeness and boundaries with external visitors.Do not reveal {{userName}}s private information, personal habits, or private conversation details.If a visitor asks about something you cannot confirm, be honest and say you need to check, rather than making things up.第一条保留人格但收紧边界感第二条禁止泄露主人隐私、习惯与私密对话第三条是诚实原则——无法确认的事情要坦白不得编造。这三条共同构成对外人格的安全网与 hub/guest-handler.ts 中 guest 消息的上下文注入相互印证guest 会话的 prompt 快照里不包含工作区指令与 skills从机制上限制了信息外泄面。三、占位符填充与运行时回落链3.1 三个占位符的填充模板中的{{userName}}、{{agentName}}、{{agentId}}三个占位符在运行时由 core/agent.ts 的_readPublicAgentsMd()统一替换const fill (text) text .replace(/\{\{userName\}\}/g, this.userName) .replace(/\{\{agentName\}\}/g, this.agentName) .replace(/\{\{agentId\}\}/g, this.id);从源码可以看出占位符填充是纯字符串替换不会解析 Markdown 语法因此自定义模板时可直接使用这三个占位符引用主人姓名、Agent 名与 Agent ID。3.2 完整回落链_readPublicAgentsMd()的读取顺序源码第 1177-1180 行agentDir/AGENTS.public.md用户落盘的定制对外人格优先级最高productDir/agents-public-templates/{langDir}{yuanType}.md当前语言专属模板如en/butter.mdproductDir/agents-public-templates/{yuanType}.md通用模板不分语言若以上均不存在则返回空字符串。其中langDir由 locale 决定resolveLocale()以zh开头时取中文模板在目录根否则取en/。对外人格文件名与模板目录名在 core/persona-source.ts 中唯一定义export const PUBLIC_PERSONA_FILE_NAME AGENTS.public.md; export const PUBLIC_PERSONA_TEMPLATE_DIR agents-public-templates;源码注释明确要求文件名只在这个模块里定义一次调用方不许自己拼这是为了避免多份拷贝在模板改名或加语言时悄悄漂移。3.3 与主人人格的差异惰性材料化值得注意的是主人人格文件identity.md/AGENTS.md在创建 Agent 时不再落盘而是运行时按 locale 从 lib/identity-templates 与 lib/agents-templates 现选模板惰性材料化见 core/persona-source.ts 的注释与 core/first-run.ts而对外人格AGENTS.public.md仍按原策略在创建时播种从模板目录复制到 agent 目录。这一差异在 core/agent-manager.ts 中有明确注释说明对外人格的消费侧Agent._readPublicAgentsMd自带独立回落链因此继续播种不受影响。四、消费链路guest 会话如何加载 butter 对外人格4.1 入口GuestHandler所有非主人的消息统一经过 hub/guest-handler.ts 的GuestHandler。处理流程分两步源码第 31-60 行A. 消息前缀标注在原文前加[From {senderName}]中文为[来自 发送者名]让模型明确当前说话人身份B. 上下文标签注入根据是否群聊注入This conversation is from an external guest.或This conversation is from a group chat.中文对应当前对话来自外部访客 / 群聊。随后调用engine.executeExternalMessage(..., { guest: true, agentId, contextTag, ... })core/engine.ts 透传给 BridgeSessionManager。4.2 guest 会话的系统提示词组装core/bridge-session-manager.ts 中isGuest分支的会话配置极具特征// guest 模式yuan AGENTS.public.md contextTag主模型无工具 promptSnapshot || this._buildGuestPromptSnapshot(agent, bridgeContext, opts); ... sessionOpts { model: chatModel, thinkingLevel: off, resourceLoader: guestResourceLoader, tools: [], customTools: [], settingsManager: this._createSettings(chatModel), };从源码结构可以提炼出 guest 会话的四个关键约束提示词组合yuan 能力定义 对外人格 contextTag 桥接提示行不注入 skills 与工作区 AGENTS 文件无工具tools: []、customTools: []访客对话中 Agent 无法调用工具关闭思考链thinkingLevel: off使用 Agent 配置的 chat 模型而非 defaultModel若models.chat未配置或模型不可用会直接抛错error.bridgeAgentNoChatModel/error.bridgeAgentModelNotAvailable。4.3 会话文件与角色隔离guest 会话与 owner 会话在存储层严格隔离源码第 1125-1127 行const bridgeDir path.join(agent.sessionDir, bridge); const subDir opts.guest ? guests : owner;即 guest 会话落在bridge/guests/*.jsonlowner 会话落在bridge/owner/*.jsonl。每次executeExternalMessage都会先读取索引判断已有会话的角色若角色发生变化guest 变 owner 或反之会重建会话而非复用。这一隔离从数据层面保证了对外人格只服务于访客。4.4 prompt 快照持久化guest 会话的提示快照会被持久化并在后续会话中复用相关行为有测试用例直接验证tests/bridge-session-teardown.test.ts 中guest bridge sessions persist and reuse their prompt snapshot用例首次调用后索引中的promptSnapshot.systemPrompt同时包含public persona与group v1对外人格 上下文标签修改agent.publicAgentsMd为public persona v2后再次调用重建会话仍复用旧的systemPrompt且不包含新的group v2标签。这意味着对外人格模板修改后已存在的 guest 会话在快照被清除或角色变化前会沿用旧提示词符合会话一致性的设计预期。五、对外人格的播种与历史迁移5.1 创建与首次运行的播种创建 Agent 时core/agent-manager.ts与首次运行初始化时core/first-run.ts都会执行同一策略从产品目录的模板中按语言专属 → 通用顺序挑选第一个存在的模板复制为agentDir/AGENTS.public.md。也就是说用户创建 Agent 后立刻就能在 agent 目录看到落盘的对外人格文件可以直接编辑它实现定制编辑保存后即成为回落链第 1 级模板更新不再影响该 Agent。5.2 旧文件名的自动迁移历史上对外人格文件叫public-ishiki.md现已统一为AGENTS.public.md。core/agents-md-migration.ts 在每次启动时执行重命名迁移export const LEGACY_PERSONA_FILE_RENAMES: LegacyPersonaFileRename[] [ { legacyFileName: ishiki.md, currentFileName: AGENTS.md }, { legacyFileName: public-ishiki.md, currentFileName: AGENTS.public.md }, ];迁移遵循永不删除、永不覆盖原则新旧同名时新文件胜出旧文件以.pre-agents-rename.bak后缀保留在 agent 目录SUPERSEDED_LEGACY_PERSONA_SUFFIX源码第 43 行。该行为有 tests/agents-md-startup-migration.test.ts 覆盖验证。这意味着如果你在旧版本中定制过public-ishiki.md升级后内容会自动迁移到AGENTS.public.md而不丢失。六、自定义对外人格的实践指南6.1 定制入口基于上文回落链定制对外人格有三种方式直接编辑 agent 目录下的AGENTS.public.md这是最直接的定制方式落盘文件优先级最高会永久覆盖模板修改产品目录模板本仓库内即lib/agents-public-templates/下的文件影响所有未落盘定制的 Agent适合模板级统一调整新增 yuan 模板参照 butter/hanako/ming 的目录结构新增agents-public-templates/en/{yuanType}.md与根目录中文版供config.agent.yuan指定。6.2 可复用的写作框架以 butter 模板为范式一份合格的对外人格模板应包含场景声明明确当前对话对象不是主人本人这一前提并在需要时复用{{userName}}、{{agentName}}、{{agentId}}三个占位符身份立场说明代表主人发言、站在主人这边的立场性格表达给出语气基调如 butter 的温暖敏锐、核心能力共情与洞察、回应顺序先感受后分析以及可量化的表达纪律少用破折号、禁套路收尾、少用「不是…而是…」句式边界红线隐私保护不透露主人隐私、习惯、私密对话与诚实原则无法确认就坦白。6.3 需要注意的运行约束占位符是纯字符串替换模板中任何位置出现的{{userName}}/{{agentName}}/{{agentId}}都会被替换可直接引用guest 会话无工具、无思考链对外人格中不应要求 Agent 调用工具或执行操作因为tools: []与thinkingLevel: off在会话层面已经禁用提示快照会缓存已存在的 guest 会话会复用旧提示词修改模板后如需立即生效需等待会话快照失效或角色变化见 tests/bridge-session-teardown.test.ts语言模板按 locale 选择以zh开头的 locale 读取目录根的中文模板否则读取en/英文模板两套可并行维护。七、小结butter对外人格模板是 openhanako主人人格体系在访客场景下的安全适配层它以# Public Awareness声明场景用 Identity 锚定立场以 Personality 定义温暖且敏锐的表达方式再以 Boundaries 守住隐私与诚实底线。运行时通过 core/agent.ts 的占位符填充与回落链完成加载在 guest 会话中由 core/bridge-session-manager.ts 以主模型 无工具 关闭思考链的轻量形态组装进系统提示词并与 owner 会话在存储层严格隔离。模板在创建 Agent 时播种落盘、支持旧文件名自动迁移、语言模板双轨并行。掌握这套机制后你可以为任何 yuan 定制符合自己需求的对外人格让 Agent 在代表主人接待访客时既保持鲜明的个性又不越过隐私与安全边界。赞分享人工智能AI AgentAI 应用桌面应用多智能体Agent 记忆AI 技能工具调用【免费下载链接】openhanakoA personal AI agent with memory, personality, and autonomy.项目地址https://gitcode.com/gh_mirrors/op/openhanako点击查看免费下载相关推荐openhanako 对外人格模板解读如何让 AI 助手与外部访客安全、得体地对话openhanako 对外人格模板解读如何让 AI 助手与外部访客安全、得体地对话 导读 openhanako 是一个具备记忆、性格与自主性的个人 AI 代理人工智能AI AgentAI 应用桌面应用多智能体Agent 记忆AI 技能工具调用openhanako Agent 人格模板深度解析butter 模板的 14 条人格规范与模板回落链加载机制openhanako Agent 人格模板深度解析butter 模板的 14 条人格规范与模板回落链加载机制 openhanako 是一个带记忆、人格与自主性人工智能AI AgentAI 应用桌面应用多智能体Agent 记忆AI 技能工具调用初识metaphone4cj仓颉语言语音算法完整指南初识metaphone4cj仓颉语言语音算法完整指南 metaphone4cj 是一个用仓颉语言Cangjie实现的语音算法库它能把英文单词转换为发音代人工智能AI AgentAI 应用桌面应用多智能体Agent 记忆AI 技能工具调用上一篇Sanity Studio 调试代理实战用 repo/debug-proxy 在本地注入 SSE 故障、网络抖动与会话过期场景下一篇Rivet Actors 服务端元数据错误信封RunnerConfigsServerlessMetadataError 模型全解析创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

相关新闻

Python代理池实战:从西刺采集到高匿验证与调度

Python代理池实战:从西刺采集到高匿验证与调度

1. 免费代理池这件事,先想清楚你要拿它干什么做数据采集的朋友大概率都遇到过这样的场景:目标站点请求频率一上去,返回码就开始不对劲,先是429,接着403,最后直接给你来个验证码页面。这时候最直接的思路就是…

2026/10/9 12:29:48 阅读更多 →
@e2e-dev/decision 决策模型深度解析:有界语义动作与断言完全指南

@e2e-dev/decision 决策模型深度解析:有界语义动作与断言完全指南

e2e-dev/decision 决策模型深度解析:有界语义动作与断言完全指南 【免费下载链接】e2e Next generation e2e testing framework for web and mobile apps. 项目地址: https://gitcode.com/GitHub_Trending/e2e6/e2e e2e 是新一代 AI 驱动的端到端测试框架&am…

2026/10/9 12:29:47 阅读更多 →
Linux信号机制详解:从kill到sigaction,掌握信号处理与进程通信

Linux信号机制详解:从kill到sigaction,掌握信号处理与进程通信

1. 先搞懂信号到底是什么:从生活场景到内核机制1.1 信号不是“软件中断”这么简单如果你刚接触Linux,大概率会看到一句话:“信号是软件中断”。这句话没错,但不够。我更喜欢把信号理解成内核给进程发的一条“微信消息”——消息内…

2026/10/9 12:29:47 阅读更多 →

最新新闻

Transformer生成式文本摘要实战:从环境配置到Beam Search调优

Transformer生成式文本摘要实战:从环境配置到Beam Search调优

简介:本资源是一份面向NLP初学者与进阶开发者的Transformer生成式文本摘要实战代码包,聚焦自然语言处理中的核心任务——自动摘要,适用于新闻提炼、论文速读、报告精简等实际场景。压缩包共10个文件,含5个Python源码(涵…

2026/10/9 12:57:34 阅读更多 →
基于EPW与Migdal-Eliashberg方程的第一性原理超导能隙计算全流程指南

基于EPW与Migdal-Eliashberg方程的第一性原理超导能隙计算全流程指南

1. 从声子谱到超导能隙:这条计算链路到底在算什么第一次接触Migdal-Eliashberg方程的人,多半会被它和BCS理论的关系绕晕。简单说,BCS给出的是一把估算超导转变温度的“快刀”——麦克米兰公式一算,心里大概有个数。但如果你想知道…

2026/10/9 12:57:34 阅读更多 →
DMAD蒸馏+H3-LoRA:模型轻量化与角色微调四步实操法

DMAD蒸馏+H3-LoRA:模型轻量化与角色微调四步实操法

1. 这不是“调参玄学”,而是模型轻量化落地的实操切口 你有没有遇到过这样的场景:刚训好的大模型,本地跑 inference 卡成 PPT,显存爆到报警,推理延迟动辄 3 秒起步;想用 LoRA 微调,结果训完发现…

2026/10/9 12:57:34 阅读更多 →
数诚1对1直播源码架构解析与私域运营落地指南

数诚1对1直播源码架构解析与私域运营落地指南

简介:这是一套面向Android与iOS双端开发者的1对1社交直播应用完整源码,适用于希望快速构建高颜值、高互动性直播平台的中高级开发者及创业团队。资源包含18519个文件,主体为Java/Kotlin(1061个)与Objective-C/Swift&am…

2026/10/9 12:57:34 阅读更多 →
Claude Code 黑客松落幕:500 名开发者一周造出的多智能体 Agent 项目,TaoToken 统一 Key 通道怎么接?

Claude Code 黑客松落幕:500 名开发者一周造出的多智能体 Agent 项目,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 12:57:34 阅读更多 →
程序员平均寿命仅34岁?2026年用TaoToken搭建AI工作流自救指南

程序员平均寿命仅34岁?2026年用TaoToken搭建AI工作流自救指南

/* 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 12:56:32 阅读更多 →

日新闻

Java时间API实战:LocalDate、Date与ZonedDateTime的转换与避坑指南

Java时间API实战:LocalDate、Date与ZonedDateTime的转换与避坑指南

Java时间API这个话题,隔三差五就会在群里被翻出来讨论一次。上周还有个同事线上处理一个订单超时问题,排查到最后发现是ZonedDateTime序列化后时区丢了,用户在下单当天晚上看到的时间整整差了8个小时。这类问题几乎每个做Java开发的人都遇到过…

2026/10/9 0:00:49 阅读更多 →
EasyTier实践:从NAT穿透到子网代理的异地组网部署与排错

EasyTier实践:从NAT穿透到子网代理的异地组网部署与排错

前几个月我手头有好几台机器需要互相访问:办公室台式机、家里 NAS、还有一台云主机。如果只是偶尔传个文件倒还好,问题是工作场景经常要在几处环境之间来回切换,每次都先登录跳板机再层层代理,实在折腾。我先后试过端口映射、自建…

2026/10/9 0:00:49 阅读更多 →
AI Agent工程实战:从七要素到七个决策点的系统设计指南

AI Agent工程实战:从七要素到七个决策点的系统设计指南

AI Agent 这个词在过去一年里被反复提及,但真正动手搭过一套能跑起来的 Agent 系统的人都知道,从"知道它是什么"到"让它稳定干活"之间隔着一整套工程决策。我前后参与过几个 Agent 项目的落地,从最初用现成框架拼装&…

2026/10/9 0:01:50 阅读更多 →

周新闻

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/8 15:26:32 阅读更多 →
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/8 15:26:40 阅读更多 →
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/9 10:11:06 阅读更多 →

月新闻

我发现了一个新思路:用 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/8 21:13:17 阅读更多 →
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/8 15:26:17 阅读更多 →
黑夜航拍船只数据集训练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/9 6:17:20 阅读更多 →