free-claude-code:本地运行类Claude推理的轻量实现方案
1. “free-claude-code”不是工具名而是一类开发者的集体求解信号最近在多个技术社区、GitHub Issues 区和开发者 Slack 频道里反复刷到一个高频组合词free-claude-code。它从不单独作为产品名称出现也从未见于任何官方文档或 SDK 发布页它总以小写、连字符连接、无引号的形式嵌在一句急切的提问里——比如“有没有 free-claude-code 的轻量实现”“求一份可离线跑的 free-claude-code 参考”甚至有人直接贴出报错截图标题就写着“free-claude-code 调用失败403”。我最初以为这是某个新开源项目的代号专门去 GitHub 按关键词精确搜索了近三个月的新建仓库结果零匹配。再翻 Discord 开发者频道的历史消息发现这个词几乎从不指向具体代码库而更像一种隐性需求共识的速记符号当开发者说“我要 free-claude-code”他真正想表达的是——“我需要一段能本地调用类 Claude 模型推理能力的、零依赖云服务认证的、可嵌入脚本/CLI/前端的最小可行代码块。”这个词背后藏着三重现实张力一是模型能力Claude 系列在长上下文、结构化输出、逻辑链路生成上的优势与访问门槛官方 API 严格限频、需绑定信用卡、无免费 tier之间的落差二是工程落地诉求快速验证 prompt 效果、做本地 RAG 测试、集成进自动化流水线与现有方案臃肿度动辄要拉起 Ollama Llamafile 自定义 server之间的摩擦三是开源精神“代码应可读、可改、可验”与黑盒服务API 返回即终点无法 inspect tokenization、无法 patch system prompt、无法观测 attention 分布之间的根本分歧。所以“free-claude-code”从来不是找一个现成项目而是在模型即服务MaaS时代重新夺回对推理链路最底层控制权的一次集体尝试。它不追求复刻 Claude 的全部参数但要求输入格式兼容支持 system/user/assistant 角色分隔、输出结构可预测能稳定提取 JSON 或 Markdown 块、token 计数透明不隐藏 padding 或 special token、且整个调用链路能在 20 行以内 Python 脚本中完成初始化与请求封装。接下来的内容就是我过去四个月在某跨平台智能体项目中为解决这一需求所沉淀的真实路径——没有魔法只有可验证的选型逻辑、踩坑记录和最终精简到 17 行的核心代码。2. 为什么放弃“模拟 API 接口”思路Claude 协议的不可仿制性很多初接触“free-claude-code”需求的开发者第一反应是“伪造一个 Claude API 兼容层”。他们设想写个本地 HTTP server监听POST /v1/messages解析传入的messages数组和system字段然后转发给本地运行的 Llama-3 或 Qwen 模型最后把响应按 Anthropic 格式包装返回。听起来很美实测却全线崩盘。我在某高校实验室协作项目中曾和三位不同背景的开发者同步推进该方案两周后全部退回重来。原因不在代码而在协议底层。Anthropic 的 API 并非 RESTful 简单封装其核心约束体现在三个不可绕过的设计点上2.1 system prompt 的强制预处理机制Claude 官方文档明确说明“system字段内容会在 tokenization 前被注入到对话历史开头并参与所有 attention 计算。” 这意味着 system message 不是简单拼接字符串而是作为独立 token 序列插入 embedding 层输入。而主流开源模型Llama-3、Phi-3、Qwen2的 tokenizer 均无此设计——它们的 chat template 仅支持user和assistant交替system要么被忽略要么被硬塞进首条user消息。我们实测对比同一段 system prompt “你是一个严谨的代码审查助手”在 Claude API 中触发的模型行为如自动拒绝模糊请求、主动要求补充函数签名在本地模型中完全消失因为 token ID 序列根本不同。2.2 stop_sequences 的语义级拦截逻辑Claude 的stop_sequences参数并非简单字符串截断。它在 decoding 阶段介入当模型生成 token 的 logits 经 softmax 后若对应词汇表 ID 在 stop list 中则将其概率置零再重新归一化。这导致两个关键现象同一 stop sequence如在 Claude 上能稳定终止代码块在 Llama-3 上却常漏判因 tokenizer 切分粒度不同可能被拆为[, ]后者不在 stop list 中多 stop sequence 组合如[\n\n, ]在 Claude 中按优先级生效在开源模型中常因 logits 处理顺序混乱而失效。我们用相同 prompt 测试 5 款主流本地模型仅 1 款Qwen2-7B-Instruct在 100 次调用中达到 92% 的 stop sequence 命中率其余均低于 65%。2.3 content-type 与 streaming 的强耦合设计Claude 的流式响应stream: true要求客户端必须按 SSEServer-Sent Events协议解析每条 event 必须含event: content_block_delta且 data 字段为合法 JSON。而开源模型的 streaming 输出多为 raw text chunk缺乏事件类型标识。强行适配需在 server 层做状态机解析如检测{type:content_block_delta字符串但一旦模型输出中恰好包含该字符串如用户 prompt 里写了 JSON 示例就会触发误解析。我们在压力测试中发现当 prompt 含 JSON schema 描述时伪造 server 的解析错误率飙升至 38%。提示试图用 Nginx 反向代理 正则替换“模拟”Claude API本质是拿胶带修补高压管道——短期能堵住漏点但每次模型更新 tokenizer 或 response schema整个链路就会不可预测地爆裂。真正的 free-claude-code必须从模型原生支持出发而非在传输层打补丁。3. 选型真相唯一可行路径是拥抱原生支持 Claude 协议的本地模型既然协议层无法伪造那 free-claude-code 的唯一解就是找到原生兼容 Anthropic API 协议的本地模型。这不是玄学而是已有明确技术路径通过 Hugging Face Transformers 库的AutoModelForCausalLMAutoTokenizer组合加载经过特定微调、chat template 显式声明支持system角色、且 tokenizer 保留 Anthropic 特殊 token如|reserved_special_token_0|的模型权重。我们系统性扫描了 Hugging Face Model Hub 上所有标注anthropic、claude、system_prompt的模型结合实际加载测试最终锁定三类真正可用的方案。注意以下所有模型均无需修改一行源码仅需标准transformers加载流程即可直接复用anthropic官方 Python SDK 的Message对象构造逻辑。3.1 第一类基于 Llama-3 架构的 Anthropic 协议微调模型代表模型meta-llama/Llama-3.1-8B-Instruct-Anthropic非官方由某开源社区发布核心改造点修改tokenizer_config.json将chat_template替换为 Anthropic 官方模板{% for message in messages %} {% if message[role] system %}{{ |reserved_special_token_0| message[content] |reserved_special_token_1| }} {% elif message[role] user %}{{ |reserved_special_token_2| message[content] |reserved_special_token_3| }} {% elif message[role] assistant %}{{ |reserved_special_token_4| message[content] |reserved_special_token_5| }} {% endif %}{% endfor %} {{ |reserved_special_token_4| }}在config.json中新增anthropic_compatible: true字段供加载器识别协议模式。实测效果system字段 100% 注入stop_sequences支持完美token 计数与官方 API 误差 ≤ 2 token。缺点仅支持 8B 以下模型显存占用仍较高FP16 下需 16GB VRAM。3.2 第二类专为轻量部署设计的 Phi-3 微调变体代表模型microsoft/Phi-3-mini-4k-instruct-Anthropic优势在于极致精简原生 3.8B 参数INT4 量化后仅 2.1GB 模型文件tokenizer 内置|system|、|user|、|assistant|三类特殊 token无需额外配置generate()方法原生支持stop_tokens参数直接传入[|eot_id|, ]即可生效。我们用 A同学的 M2 MacBook Air16GB RAM实测加载 INT4 模型耗时 8.3 秒首次推理延迟 1.2 秒输入 200 token内存峰值 5.7GB。这是目前唯一能在消费级笔记本上流畅运行的 full-claude-protocol 方案。3.3 第三类纯规则驱动的“协议翻译器”模型零参数这是最反直觉但最实用的方案——不加载大模型而用极简规则引擎模拟 Claude 的基础交互逻辑。代表实现claude-liteGitHub 开源库非官方。其核心思想是将systemuserassistant消息序列按固定规则转换为 Llama-3 格式|begin_of_text||start_header_id|system|end_header_id|{system}|eot_id||start_header_id|user|end_header_id|{user}|eot_id||start_header_id|assistant|end_header_id|对模型原始输出用正则提取首个\.*? 代码块或首个完整句子手动计算 token 数len(tokenizer.encode(system)) len(tokenizer.encode(user)) len(tokenizer.encode(output))。它牺牲了部分生成质量无真实 system role 注入但换来绝对可控性整个逻辑封装在 127 行 Python 中无 GPU 依赖可在树莓派上运行。某物联网项目组用它做设备日志自动摘要准确率 81%远超预期。下表为三类方案关键指标对比维度Llama-3 微调模型Phi-3 微调模型规则翻译器claude-lite模型大小15.2 GBFP162.1 GBINT40 MB纯代码最低硬件要求RTX 309024GB VRAMM2 Mac16GB RAMRaspberry Pi 44GB RAMsystem role 支持✅ 原生注入✅ 原生注入⚠️ 伪注入拼接字符串stop_sequences 精准度99.2%97.8%89.5%正则匹配token 计数误差≤ 2 token≤ 3 token≤ 5 token无 tokenizer首次推理延迟0.8sA1001.2sM20.03sPi4注意所谓“free”在此语境下指“免 API 调用费、免云服务绑定、免信用卡验证”而非“免算力消耗”。即使是 Phi-3 INT4 模型也需要本地 CPU/GPU 执行推理。真正的成本转移是从支付账单转向管理硬件资源。4. 实战17 行可运行的 free-claude-code 核心实现Phi-3 版现在我们把上述选型结论落地为一段真正可复制、可粘贴、可立即运行的代码。目标非常明确不依赖任何外部服务不安装非必要包仅用transformerstorchauto-gptq可选在 20 行内完成一次完整的“类 Claude”调用。以下代码已在 Ubuntu 22.04、macOS Sonoma、Windows WSL2 三种环境实测通过。from transformers import AutoModelForCausalLM, AutoTokenizer, pipeline import torch # 1. 加载 Phi-3 微调模型INT4 量化版约 2.1GB model AutoModelForCausalLM.from_pretrained( microsoft/Phi-3-mini-4k-instruct-Anthropic, device_mapauto, torch_dtypetorch.float16, trust_remote_codeTrue ) tokenizer AutoTokenizer.from_pretrained( microsoft/Phi-3-mini-4k-instruct-Anthropic, trust_remote_codeTrue ) # 2. 构造符合 Anthropic 协议的消息列表 messages [ {role: system, content: 你是一个精准的 Python 代码生成助手只输出可执行代码不加解释。}, {role: user, content: 写一个函数接收列表返回偶数平方和。} ] # 3. 使用 tokenizer.apply_chat_template 生成输入 input_ids tokenizer.apply_chat_template( messages, add_generation_promptTrue, return_tensorspt ).to(model.device) # 4. 执行推理设置 stop token 为 |eot_id|对应 Phi-3 的结束符 outputs model.generate( input_ids, max_new_tokens256, do_sampleFalse, eos_token_idtokenizer.convert_tokens_to_ids(|eot_id|) ) # 5. 解码并提取结果跳过输入部分只取新生成内容 response tokenizer.decode(outputs[0][input_ids.shape[1]:], skip_special_tokensTrue) print(response)这段代码之所以能称为“free-claude-code”关键在于第 3 步和第 4 步的精准控制apply_chat_template方法直接调用模型内置的 Anthropic 兼容模板确保system、user、assistant角色被正确编码为|system|、|user|、|assistant|token 序列而非简单字符串拼接eos_token_id显式指定为|eot_id|End of Turn这是 Phi-3 Anthropic 版本的专用结束符与 Claude 的stop_sequences语义一致避免了通用/stoken 的歧义skip_special_tokensTrue在解码时自动过滤掉所有|...|标记输出干净文本。我们实测该脚本在 M2 Mac 上的完整生命周期首次运行模型未缓存下载 2.1GB 模型约 45 秒加载 8.3 秒推理 1.2 秒总耗时 55 秒后续运行模型已缓存加载 0.9 秒推理 0.8 秒总耗时 1.7 秒内存占用稳定在 5.2–5.7GB无内存泄漏。踩坑经验若省略trust_remote_codeTrueapply_chat_template会 fallback 到默认 Llama 模板导致system消息丢失若未指定eos_token_id模型可能生成超长输出直至自然截断破坏stop_sequences语义。这两处是新手最容易遗漏的“协议开关”。5. 超越代码free-claude-code 的工程化落地 checklistfree-claude-code 的价值绝不仅限于跑通一段 demo。在某智能文档处理 SaaS 项目中我们将上述 Phi-3 方案深度集成进生产环境总结出一套必须落实的工程化 checklist。它决定了这个“免费”方案能否真正替代 API 调用成为业务链路中可靠的一环。5.1 token 计费对齐如何让本地计数与 API 账单一致Anthropic API 的账单按input_tokensoutput_tokens精确计费。本地模型若 token 计数不准会导致成本估算失真。我们的解决方案是弃用len(tokenizer.encode(text))改用tokenizer的__call__方法配合return_lengthTrue。# 错误做法忽略 special tokens input_len len(tokenizer.encode(system user)) # 正确做法等同 API 计数逻辑 inputs tokenizer.apply_chat_template(messages, return_dictTrue, return_lengthTrue) input_len inputs[length] # 返回应用模板后的精确 token 数 output_len len(tokenizer.encode(response, add_special_tokensFalse)) # 输出不加 special tokens实测表明此方法与 Anthropic 控制台显示的 token 数误差为 0。某次处理 127 份合同摘要本地计数 14,283 tokensAPI 账单显示 14,283 tokens。5.2 流式响应模拟在无 SSE 的环境下实现“渐进式输出”虽然本地模型不支持原生 SSE但我们用 Pythonthreadingqueue实现了视觉等效的流式体验启动一个后台线程调用model.generate(..., streamerTextIteratorStreamer)主线程循环从queue取 chunk每收到 16 个 token 就print()一次用户看到的效果与curl -N调用 Claude API 完全一致。关键技巧TextIteratorStreamer的skip_promptTrue参数必须启用否则会重复输出输入部分。5.3 错误处理兜底当模型崩溃时如何优雅降级本地模型可能因显存不足、CUDA OOM、tokenizer 冲突而静默失败。我们的兜底策略是三级熔断第一级秒级try/except捕获torch.cuda.OutOfMemoryError自动切换至 CPU 模式速度降 5 倍但保证可用第二级分钟级启动 watchdog 进程监控主进程内存 95% 持续 30 秒则 kill 并重启第三级业务级若连续 3 次调用返回空或乱码自动切换至规则翻译器claude-lite保障基础功能不中断。这套机制使某客户系统的本地推理服务可用率达 99.97%超过其原用的 Anthropic API99.82%。5.4 安全边界加固防止 prompt 注入攻击的三道防火墙当system字段可由用户输入时存在严重风险。我们添加了三重防护输入清洗用正则re.sub(r[^\w\s\.\,\!\?\;\:\-\_\(\)\[\]\{\}\\\\#\%\\\\~\], , system) 删除所有潜在危险字符长度硬限制system内容强制截断至 256 字符超出部分丢弃Anthropic API 本身也有限制沙箱隔离模型进程运行在firejail沙箱中禁止网络访问、禁止文件系统写入除/tmp外。上线三个月未发生一起因用户输入导致的模型异常。最后分享一个真实教训某次版本更新后apply_chat_template默认启用了add_generation_promptTrue导致assistant角色前多了一个|assistant|token。这使得所有stop_sequences失效模型疯狂输出直到显存溢出。我们花了 6 小时定位最终在transformers的 release note 里发现该参数已从False改为True。从此所有模型加载代码都显式声明该参数绝不依赖默认值——free-claude-code 的稳定性永远建立在对每一行默认行为的彻底掌控之上。

相关新闻

本地开源AI生成3D模型闭环工作流:从文本到Unity可运行资产

本地开源AI生成3D模型闭环工作流:从文本到Unity可运行资产

1. 项目概述:为什么“能用了”这三个字值得单独强调?“3D AI模型终于能用了”——这句话不是营销话术,而是过去两年里我反复在多个跨行业项目中验证后的真实判断。这里的“能用”,特指在消费级硬件(RTX 4070级别显卡、…

2026/10/16 4:16:17 阅读更多 →
Repast多主体仿真完整教程:从环境搭建到结果验收的实例方案

Repast多主体仿真完整教程:从环境搭建到结果验收的实例方案

简介:这份资源是面向多Agent系统建模与仿真学习者的Repast完整教程与实例合集,适合社会科学、经济学及复杂系统方向的研究者、学生与工程师,用于从零掌握Repast的建模流程与实战技巧。压缩包共72个文件,约303KB,以htm与…

2026/10/16 4:16:17 阅读更多 →
Repast 多主体仿真完整教程与实例:从环境搭建到参数扫描的工程化实践

Repast 多主体仿真完整教程与实例:从环境搭建到参数扫描的工程化实践

简介:这份资源是面向多Agent系统建模初学者与研究者的Repast完整教程与实例合集,重点解决从环境搭建到模型落地的学习路径问题,适合社会科学、经济学及复杂系统仿真方向的师生与工程师使用。压缩包共72个文件,约303KB,…

2026/10/16 4:16:17 阅读更多 →

最新新闻

视觉中间件 VM PRO 2.7:从图像接入到推理调度的视觉开发框架实践指南

视觉中间件 VM PRO 2.7:从图像接入到推理调度的视觉开发框架实践指南

视觉框架 VM PRO 2.7 是我这几个月在好几个视觉项目里反复用下来的一套工具集。它本身不是某个具体的检测算法,也不是一个渲染引擎,而是一套把图像接入、预处理、推理调度、结果后处理、设备适配揉在一起的视觉中间件,行话叫视觉开发框架也行…

2026/10/16 5:04:29 阅读更多 →
实测100万条数据:PostgreSQL原生表与TimescaleDB超表性能对比

实测100万条数据:PostgreSQL原生表与TimescaleDB超表性能对比

1. 场景设定:为什么100万条数据会成为存储方案的分水岭1.1 一个真实到有点尴尬的开始我接手过一个物联网设备管理平台,核心业务是持续采集园区内几百台环境监测设备的数据。第一周数据量只有几万条,跑什么都顺。等到第三周数据突破了100万条&…

2026/10/16 5:04:29 阅读更多 →
PostgreSQL还是TimescaleDB?100万条设备数据存储选型实测

PostgreSQL还是TimescaleDB?100万条设备数据存储选型实测

上个月接了个设备数据管理平台的活儿,里面有个模块要存采集上来的设备运行数据。打完样之后发现,数据库里躺着100万条数据的时候,团队内部吵起来了:一部分人坚持用普通表,说100万条不算多,PostgreSQL单表完…

2026/10/16 5:04:29 阅读更多 →
基于Spring Boot的高校科研管理系统开发实践与踩坑记录

基于Spring Boot的高校科研管理系统开发实践与踩坑记录

高校科研管理这类系统的需求,说实话一直都很旺盛,但市面上能直接拿来用的成熟产品反而没那么多。早几年很多学校还在用Excel表格加微信工作群来跑项目申报、中期检查、结题验收这些流程,数据散落在各个学院秘书手里,科研处汇总的时…

2026/10/16 5:04:29 阅读更多 →
Windows下RabbitMQ安装配置全攻略:从Erlang环境到管理控制台

Windows下RabbitMQ安装配置全攻略:从Erlang环境到管理控制台

先说个真实的感受:RabbitMQ本身是一款在服务端消息中转领域非常成熟的开源消息队列中间件,但很多开发者在Windows环境下载完安装包之后,却被Erlang版本不匹配、服务启动失败、命令行无法识别、管理界面打不开这些环节卡住。我见过不少同事在W…

2026/10/16 5:04:29 阅读更多 →
Mac mini + OpenClaw 打造 7×24 小时个人 AI 助手:部署与成本全攻略

Mac mini + OpenClaw 打造 7×24 小时个人 AI 助手:部署与成本全攻略

自从把家里的 Mac mini 改造成 724 小时在线的 AI 助手,已经稳定跑了几个月。这个组合其实很简单:一台常年开机的 Mac mini,一个开源的智能体框架 OpenClaw,再接入按量计费的模型 API——很多人也叫它中转 API。整套方案算下来&am…

2026/10/16 5:03:29 阅读更多 →

日新闻

个人 AI Agent 平台接入 TaoToken:统一 Key 与 API 通道的配置大纲

个人 AI Agent 平台接入 TaoToken:统一 Key 与 API 通道的配置大纲

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

2026/10/16 0:00:05 阅读更多 →
信号与系统频域分析作业解题指南

信号与系统频域分析作业解题指南

1. 作业背景与核心要求解析信号与系统作为电子信息类专业的核心基础课,其作业设计往往直接关联课程的核心知识框架。2026年春季第六次作业的布置,通常对应着课程进展到频域分析的关键阶段。根据常规教学进度推测,本次作业可能涉及以下核心内容…

2026/10/16 0:00:05 阅读更多 →
Django MVT实战:从零构建图书借阅系统,彻底搞懂Model-View-Template分层

Django MVT实战:从零构建图书借阅系统,彻底搞懂Model-View-Template分层

1. 从一个"四不像"的练手项目说起如果你已经看完了Django的官方教程前几章,跟着敲完了投票应用,大概会有一种"我好像会了,又好像什么都不会"的割裂感。教程里每个知识点都是拆开的——这一章讲模型,下一章讲视…

2026/10/16 0:00:05 阅读更多 →

周新闻

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

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

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

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

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

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

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

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

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

2026/10/15 13:48:15 阅读更多 →

月新闻

我发现了一个新思路:用 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/15 0:14:36 阅读更多 →
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/16 3:49:43 阅读更多 →
黑夜航拍船只数据集训练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/15 9:49:14 阅读更多 →