SenseNova/SenseNova-U1-A3B-MoT-SFT
模型介绍文件和版本Pull Requests讨论分析
下载使用量0

SenseNova-U1:基于NEO-unify架构的多模态理解与生成统一模型

英文 | 简体中文

arXiv SenseNova-U1 HuggingFace Model ModelScope-模型 SenseNova-U1 Demo License Discord

SenseNova-U1

visualization

📣 更新动态

  • [2026.05.10] 发布🔥SenseNova-U1技术报告🔥以及SenseNova-U1-A3B-MoT-SFT和SenseNova-U1-A3B-MoT的权重文件。

  • [2026.05.08] 新增GGUF量化检查点和分层卸载显存模式,支持低显存单GPU推理。详情参见内存高效推理。SenseNova-U1-8B-MoT-Merger的GGUF权重可在🤗 smthem/SenseNova-U1-8B-MoT-Merger-gguf获取——特别感谢@smthem提供量化权重。

  • [2026.05.06] 发布SenseNova-U1-8B-MoT-LoRA-8step-V1.0。使用示例参见示例脚本。

  • [2026.04.30] 发布8步推理模型预览版SenseNova-U1-8B-MoT-8step-preview。在多数情况下,该模型的图像生成质量与基础模型接近(参见对比及现存问题)。测试该模型可使用推理脚本,并添加以下参数:--cfg_scale 1.0 --num_steps 8。

  • [2026.04.27] 首次发布SenseNova-U1-8B-MoT-SFT和SenseNova-U1-8B-MoT的权重文件。

  • [2026.04.27] 首次发布SenseNova-U1的推理代码。

🌟 概述

🚀 SenseNova U1 是全新系列的原生多模态模型,它在单一架构内实现了多模态理解、推理与生成的统一。 这标志着多模态人工智能领域的根本性范式转变:从模态集成迈向真正的模态统一。SenseNova U1 模型不再依赖适配器进行模态间的转换,而是能够以原生方式在语言和视觉之间进行思考与行动。

通过端到端架构实现从像素到文字的视觉理解与生成统一,开启了巨大的可能性,能够以原生多模态方式实现高效且强大的理解、生成及交错推理。

radar plot

🏗️ 核心支柱:

SenseNova U1 的核心是 NEO-unify,这是一种从多模态 AI 基本原则出发设计的新型架构:它消除了视觉编码器(VE)和变分自编码器(VAE),使像素-文字信息实现内在且深度的关联。 其主要特性如下:

  • 🔗 将语言和视觉信息作为一个统一的复合体进行端到端建模。
  • 🖼️ 在保持像素级视觉保真度的同时,保留语义丰富性。
  • 🧠 通过原生 MoTs 实现跨模态高效推理,且冲突最小化。

✨ 带来的突破:

依托这一全新核心架构,SenseNova U1 在多模态学习方面展现出卓越的效率:

左图:在 OneIG(英文、中文)、LongText(英文、中文)、BizGenEval(简单、困难)、CVTG 和 IGenBench 上的生成延迟与平均性能对比。
右图:在信息图表基准测试(即 BizGenEval(简单、困难)和 IGenBench)上的生成延迟与平均性能对比。

  • 🏆 开源领域理解与生成双料最佳:SenseNova U1 为统一多模态理解与生成树立了新标准,在众多理解、推理和生成基准测试中,均达到开源模型的最先进性能。

  • 📖 原生图文交错生成:SenseNova U1 能够通过单个模型在一个流程中生成连贯的交错文本和图像,支持制作实用指南、旅行日记等应用场景,将清晰的信息传达与生动的故事叙述相结合,并将复杂信息转化为直观视觉内容。

  • 📰 高密度信息呈现:SenseNova U1 在密集视觉信息传达方面表现出强大能力,可为知识图解、海报、演示文稿、漫画、简历及其他信息密集型格式生成结构丰富的布局。

🌍 超越多模态:

  • 🤖 视觉-语言-动作(VLA)
  • 🌐 世界建模(WM)

🦁 模型介绍

本次发布中,我们开源了两个尺寸的 SenseNova U1 Lite 系列模型:

  • SenseNova U1-8B-MoT — 密集型骨干网络
  • SenseNova U1-A3B-MoT — MoE 骨干网络
模型参数规模Hugging Face 权重
SenseNova-U1-8B-MoT-SFT8B MoT🤗 链接
SenseNova-U1-8B-MoT8B MoT🤗 链接
SenseNova-U1-8B-MoT-LoRA-8step-V1.00.4B🤗 链接
SenseNova-U1-A3B-MoT-SFTA3B MoT🤗 链接
SenseNova-U1-A3B-MoTA3B MoT🤗 链接

这里的 SFT 模型(32 倍下采样率)通过理解预热、生成预训练、统一中期训练和统一 SFT 进行训练,最终模型是在初始轮次的 T2I RL 训练后获得的。

尽管以当今标准来看规模相对紧凑,但这些模型已在多种任务中展现出强劲性能,可与商业模型媲美,且具有出色的成本效益。值得注意的是,我们计划在未来推出更大规模的版本,以进一步增强能力和性能。

💡 SenseNova-U1-8B-MoT 中的 8B-MoT 指的是约 8B 理解参数和约 8B 生成参数。详见 参数分解。

📋 待办清单

  • SenseNova-U1 的训练代码

  • SenseNova-U1 的最终权重和技术报告

🎨 效果展示

🖼️ 文本生成图像(通用)
t2i general dense face hd 07t2i general dense text rendering 18t2i general dense text rendering 12
t2i general face hd 13t2i general face hd 17t2i general face hd 07
t2i general landscape 06t2i general dense landscape 12t2i general landscape 07
t2i general portrait artistic 02 at2i general portrait artistic 02 bt2i general portrait artistic 07
t2i general portrait text rendering 02t2i general portrait dense landscape 05t2i general portrait dense artistic 11
🖼️ 文本生成图像(推理型)
原始文本推理过程生成图像
一只雄性孔雀试图吸引雌性
1. 指令理解:核心主体是一只雄性孔雀。动作是雄性孔雀试图吸引雌性。2. 推理过程:雄性孔雀通过将尾羽展开成巨大、色彩鲜艳的圆形展示来进行求偶。3. 构图确立:画面采用全身镜头捕捉雄性孔雀,以展示完整的尾羽。视角为平视,以突出尾羽的高度。4. 光影与色彩设置:自然光照射色彩斑斓的圆形尾羽,形成柔和阴影。色彩以尾羽上鲜艳的蓝色和绿色为主。5. 风格锁定:风格为写实照片,对雄性孔雀进行清晰对焦。效果自然,不添加艺术滤镜。6. 显式提示词:一只色彩鲜艳的雄性孔雀,尾羽完全展开成宽阔、闪亮的蓝绿色扇形,站立在花园中。
一小块干木头和一块致密的铁块在一个透明的水箱里
1. 指令理解:核心主体是一小块干木头和一块致密的铁块,放置在透明水箱内。木头漂浮在水面,铁块沉在底部。2. 推理过程:木头密度小于水,因此会漂浮;铁密度大于水,因此会沉到底部。3. 构图确立:构图为垂直中景,将矩形水箱置于画面中央。相机视角为平视,以清晰显示水位线和水下底部。对水箱整个深度进行清晰对焦,确保两种物体都清晰可辨。4. 环境构建:场景完全包含在透明玻璃水箱壁内。水充满水箱的大部分容积,为漂浮的木头和下沉的铁块提供介质。背景虚化,以将注意力集中在水箱内部。5. 光影与色彩设置:柔和的自然光从左侧照亮场景,在水面上产生柔和的反射。色彩以木头的棕色纹理与铁块的深灰色金属质感形成对比。阴影通过液体形成柔和的漫反射。6. 显式提示词:一张透明水箱的写实照片,展示一块木头漂浮在水面,一块铁块沉在底部。
那不勒斯所在国家的一道典型菜肴
1. 指令理解:核心主体是拿坡里披萨,作为一道典型菜肴呈现。背景指明那不勒斯位于意大利,是这道美食的起源地。2. 推理过程:那不勒斯在意大利,经典菜肴是拿坡里披萨。3. 构图确立:拿坡里披萨采用特写镜头,充满画面中心。视角略微升高,以清晰展示菜肴的圆形形态。4. 光影与色彩设置:柔和的光线照亮拿坡里披萨表面,以展现其纹理。暖色调主导色彩,突出菜肴的烘焙质感。5. 风格锁定:图像采用写实摄影风格,对主体进行清晰对焦。效果自然诱人,适合食品记录。6. 显式提示词:美味的拿坡里披萨,拥有松软、微焦的 crust,番茄酱和新鲜马苏里拉奶酪,放在质朴的 wooden 桌上,写实食品摄影。
碳酸钙溶液与乙酸反应
1. 指令理解:核心主体是碳酸钙和乙酸的溶液。提示词指定了化学混合物的反应状态。2. 推理过程:反应会产生二氧化碳气体,表现为稳定的气泡流从液体中上升。3. 构图确立:相机近距离拍摄溶液,以捕捉反应细节。构图将焦点放在可见气体产生的液体部分。4. 光影与色彩设置:液体呈透明状,使白色气泡清晰可见。光线明亮均匀,以照亮气体流。5. 风格锁定:图像保持适合科学观察的写实摄影风格。对焦清晰,突出反应溶液和气泡。6. 显式提示词:一个装满透明液体的试管,二氧化碳气泡快速、持续地上升到表面,实验室实验。
🖼️ 文本生成图像(信息图表)
t2i landscape 0001t2i landscape 0002t2i landscape 0003
t2i landscape 0004t2i landscape 0005t2i landscape 0006
t2i landscape 0007t2i landscape 0008t2i landscape 0009
t2i landscape 0010t2i landscape 0011t2i landscape 0012t2i landscape 0012
t2i image 0022t2i image 0020t2i image 0021t2i image 0023
t2i image 0024t2i image 0025t2i image 0026t2i image 0027
t2i image 0028t2i image 0029t2i image 0030t2i image 0031

📸 更多生成样本: 参见 图像生成画廊。

✏️ 图像编辑(通用)
editing input 1 editing output 1
将左边人物的夹克改为亮黄色。
editing input 3 editing output 3
在小狗头上放一个花环,并且把图片变为吉卜力风格。
editing input 2 editing output 2
让图像中的人微笑。
editing input 4 editing output 4
添加一束花。
editing input 8 editing output 8
将男性替换为女性。
editing input 6 editing output 6
将文本 "WARFIGHTER" 替换为 "BATTLEFIELD",使用粗体橙红色字体。
✏️ 图像编辑(推理型)
原文原始图片推理过程结果图片
画出一小时后的样子。
1. 源图分析: 源图中是一杯热茶,茶叶正在浸泡,茶水看起来相对清澈。2. 指令理解: 指令要求画出一小时后的样子。3. 推理过程: 随着时间推移,单宁和色素会析出,使茶水明显变深,颜色更加均匀,茶叶因浸泡可能会显得更肿胀、颜色更深。4. 预期视觉变化: 预期可见的结果是茶水呈现更深的琥珀色至棕色,液体颜色更为饱满。5. 需保留元素: 玻璃杯、周围散落的茶叶、背景以及拍摄角度应保持不变。6. 明确编辑提示: 将茶水编辑为更深、饱和度更高的琥珀棕色,如同完全泡开的状态,同时让茶叶看起来略深且更肿胀,保持玻璃杯、周围茶叶、背景和构图不变。
画出长时间坐在上面的人刚站起来后的样子。
1. 源图分析: 源图中是一个蓬松的青柠绿色豆袋椅,在白色背景上看起来均匀饱满、未受干扰。2. 指令理解: 编辑指令要求画出长时间坐在上面的人刚站起来后的样子。3. 推理过程: 长时间的重量会压缩面料和内部填充物,留下凹陷的座位区域、向外辐射的褶皱以及缓慢恢复的形状。4. 预期视觉变化: 可见结果应是在人坐过的地方有明显的凹陷和褶皱。5. 需保留元素: 背景、豆袋椅颜色、光线和拍摄角度应保持不变,仅豆袋椅的形状需体现出受压状态。6. 明确编辑提示: 编辑豆袋椅,使其中心有明显的坐痕凹陷,周围有褶皱,面料略微压缩,同时保持白色背景、光线和拍摄角度不变。
将水换成高浓度盐水
1. 源图分析: 源图中显示一个鸡蛋沉在一杯水的底部。2. 指令理解: 指令要求将介质换成高浓度盐水。3. 推理过程: 盐水的密度比淡水大,这会增加作用在鸡蛋上的浮力。4. 预期视觉变化: 随着密度增加,鸡蛋将克服重力,漂浮得更高或悬浮在液体中间。5. 需保留元素: 玻璃杯和鸡蛋的外观应保持一致,重点是鸡蛋垂直位置的变化。6. 明确编辑提示: 编辑鸡蛋的位置,使其漂浮在液体中间,而不是沉在底部,同时保持玻璃杯和鸡蛋的外观不变。
图中的水果成熟时是什么样子
1. 源图分析: 源图中是绿色的未成熟香蕉。2. 指令理解: 指令要求画出水果成熟时的样子。3. 推理过程: 成熟过程中,叶绿素分解,糖分生成,这会使香蕉皮从绿色变为黄色,通常还会出现小的棕色糖斑。4. 预期视觉变化: 香蕉皮的颜色和质地应转变为成熟状态。5. 需保留元素: 香蕉的形状和白色背景应保持不变。6. 明确编辑提示: 将绿色香蕉编辑为亮黄色并带有小的棕色斑点,同时保持原有的形状和白色背景不变。

📸 更多编辑示例: 参见 Image Editing Gallery。

♻️ 交错生成(通用)
interleave case 05
interleave case 06
♻️ 交错生成(推理)
interleave case 05

📸 更多交错生成示例: 参见 Interleaved Generation Gallery。

📝 视觉理解(通用)
vqa general cases
📝 视觉理解(智能体)
vqa agentic case

📸 更多理解示例: 参见 Visual Understanding Gallery。

🦾 视觉-语言-动作

YouTube YouTube YouTube

🦾 世界建模
world modeling case

📊 关键基准测试

📝 视觉理解

Understanding Benchmarks

🖼️ 视觉生成

Generation Benchmarks

♻️ 视觉推理

Interleaved Benchmarks

评估脚本和基准测试复现指南已添加至 evaluation。

⚠️ 持续改进方向

尽管模型在各项任务中表现出色,但仍存在一些需要改进的局限性:

  • 视觉理解:
    当前模型仅支持最长 32K tokens 的上下文长度,这可能会限制其在需要更长或更复杂视觉上下文场景中的性能。

  • 以人为中心的生成:
    人体的精细细节生成可能具有挑战性,尤其是当人物在场景中作为较小元素出现或与周围物体进行复杂交互时。

  • 基于文本的生成:
    文本渲染有时可能会出现拼写错误、字符变形或格式不一致的问题,这些问题对提示词的措辞较为敏感,尤其是在文本密集的场景中。(最佳实践请参见 prompt enhancement)

  • 交错生成:

    • 作为一项实验性功能,交错生成仍在不断发展中,其性能可能尚未达到专用文本到图像(T2I)流水线的水平。

    • 测试版状态:强化学习(RL)尚未针对视觉编辑、推理和交错任务进行专门优化,当前性能与监督微调(SFT)模型相当。

我们将这些方面视为积极的改进方向,并期望在未来的迭代版本中不断提升性能。

🛠️ 快速开始

🌐 通过 SenseNova-Studio 使用

体验 SenseNova-U1 最快捷的方式是通过 SenseNova-Studio —— 这是一个 🆓 免费的在线平台,您可以直接在浏览器中试用该模型,无需安装或 GPU 支持。

注意: 为了服务更多用户,U1-Fast 经过了 step 和 CFG 蒸馏,专门用于信息图表生成。

🦞 通过 SenseNova-Skills (OpenClaw) 使用

将 SenseNova-U1 集成到您自己的智能体或应用程序中最简单的方法是通过我们的配套仓库 SenseNova-Skills (OpenClaw) 🦞,该仓库将 SenseNova-U1 作为即用型技能提供,并带有统一的工具调用接口。

有关安装和使用详情,请参考 SenseNova-Skills README。

✨ 通过我们的 Skills 和 Studio 生成的一些有趣案例

Skill Cases

🤗 使用 transformers 运行(默认)

设置: 按照 安装指南 克隆仓库并使用 uv 安装依赖项。

📝 视觉理解
python examples/vqa/inference.py --model_path sensenova/SenseNova-U1-8B-MoT --image examples/vqa/data/images/menu.jpg --question "My friend and I are dining together tonight. Looking at this menu, can you recommend a good combination of dishes for 2 people? We want a balanced meal — a mix of mains and maybe a starter or dessert. Budget-conscious but want to try the highlights." --output outputs/answer.txt --max_new_tokens 8192 --do_sample --temperature 0.6 --top_p 0.95 --top_k 20 --repetition_penalty 1.05 --profile

有关批量推理、生成参数和 JSONL 格式的信息,请参见 examples/README.md。

🖼️ 文本到图像
python examples/t2i/inference.py --model_path sensenova/SenseNova-U1-8B-MoT --prompt "这张信息图的标题是“SenseNova-U1”,采用现代极简科技矩阵风格。整体布局为水平三列网格结构,背景是带有极浅银灰色细密点阵的哑光纯白高级纸张纹理,画面长宽比为16:9。\n\n排版采用严谨的视觉层级:主标题使用粗体无衬线黑体字,正文使用清晰的现代等宽字体。配色方案极其克制,以纯白色为底,深炭黑为主视觉文字和边框,浅石板灰用于背景色块和次要信息区分,图标采用精致的银灰色线框绘制。\n\n在画面正上方居中位置,使用醒目的深炭黑粗体字排布着大标题“SenseNova-U1”。标题正下方是浅石板灰色的等宽字体副标题“新一代端到端统一多模态大模型家族”。\n\n画面主体分为左、中、右三个相等的垂直信息区块,区块之间通过充足的负空间进行物理隔离。\n\n左侧区块的主题是概述。顶部有一个银灰色线框绘制的、由放大镜和齿轮交织的图标,旁边是粗体小标题“Overview”。该区块内从上到下垂直排列着三个要点:第一个要点旁边是一个代表文档与照片重叠的极简图标,紧跟着文字“多模态模型家族,统一文本/图像理解和生成”。向下是由两个相连的同心圆组成的架构图标,配有文字“基于NEO-Unify架构(端到端统一理解和生成)”。最下方是一个带有斜线划掉的眼睛和漏斗形状的图标,明确指示文本“无需视觉编码器(VE)和变分自编码器(VAE)”。\n\n中间区块展示模型矩阵。顶部是一个包含两个分支节点的树状网络图标,旁边是粗体小标题“两个模型规格”。区块内分为上下两个包裹在浅石板灰色极细边框内的卡片。上方的卡片内画着一个代表高密度的实心几何立方体图标,大字标注“SenseNova-U1-8B-MoT”,下方是等宽字体说明“8B MoT 密集主干模型”。下方的卡片内画着一个带有闪电符号的网状发光大脑图标,大字标注“SenseNova-U1-A3B-MoT”,下方是等宽字体说明“A3B MoT 混合专家(MoE)主干模型”。在这两个独立卡片的正下方,左侧放置一个笑脸轮廓图标搭配文字“将在HF等平台公开”,右侧放置一个带有折角的书面报告图标搭配文字“将发布技术报告”。\n\n右侧区块呈现核心优势。顶部是一个代表巅峰的上升阶梯折线图图标,旁边是粗体小标题“Highlights”。该区块内部垂直分布着四个带有浅石板灰底色的长方形色块,每个色块内部左侧对应一个具体的图标,右侧为文字。第一个色块内是一个无缝相连的莫比乌斯环图标,配文“原生统一架构,无VE和VAE”。第二个色块内是一个顶端带有星星的奖杯图标,配文“单一统一模型在理解和生成任务上均达到SOTA性能”。第三个色块内是代表文本行与拍立得照片交替穿插的图标,配文“强大的原生交错推理能力(模型原生生成图像进行推理)”。最后一个色块内是一个被切分出一小块的硬币与详细饼状图结合的图标,配文“能生成复杂信息图表,性价比出色”。" --width 2720 --height 1536 --cfg_scale 4.0 --cfg_norm none --timestep_shift 3.0 --num_steps 50 --output output.png --profile

默认分辨率为 2048×2048(1:1)。其他宽高比请参见支持的分辨率桶。

若要生成高质量信息图表,建议在生成图像前应用提示词增强。

✏️ 图像编辑
python examples/editing/inference.py --model_path sensenova/SenseNova-U1-8B-MoT --prompt "Change the animal's fur color to a darker shade." --image examples/editing/data/images/1.webp --cfg_scale 4.0 --img_cfg_scale 1.0 --cfg_norm none --timestep_shift 3.0 --num_steps 50 --output output_edited.png --profile --compare

💡 推理前,请将输入图像按原始宽高比预调整至约 2048×2048 分辨率,以获得最佳质量(详见 examples/editing/resize_inputs.py)。

♻️ 交错生成
python examples/interleave/inference.py --model_path SenseNova/SenseNova-U1-8B-MoT --prompt "I want to learn how to cook tomato and egg stir-fry. Please give me a beginner-friendly illustrated tutorial." --resolution "16:9" --output_dir outputs/interleave/ --stem demo --profile

有关批量推理、JSONL 格式、提示词增强、分辨率桶以及完整参数参考,请参见 examples/README.md。

有关 GPU 内存分析器,请参见 docs/gpu_mem_profiler.md。

💾 内存高效推理(GGUF + VRAM 模式)

对于使用单块消费级 GPU 的用户,transformers 路径提供了两项互补功能以降低显存占用。它们可以自由组合使用。

GGUF 量化检查点

在四个推理脚本(t2i、editing、interleave、vqa)中的任意一个中传入 --gguf_checkpoint,即可通过 diffusers 的 GGUF Linear 层加载量化后的 .gguf 文件,而非 bf16 safetensors 权重。仍需提供基础的 --model_path(用于加载分词器、配置文件及非语言模型权重)。

# install the optional extra once
uv pip install -e ".[gguf]"   # or: pip install "gguf>=0.10.0" "diffusers>=0.30.0"

python examples/t2i/inference.py \
  --model_path sensenova/SenseNova-U1-8B-MoT \
  --gguf_checkpoint /path/to/SenseNova-U1-8B-MoT-Merger-Q4_K_M.gguf \
  --prompt "A male peacock trying to attract a female" \
  --output output.png

SenseNova-U1-8B-MoT-Merger 的 GGUF 权重(多种量化级别:Q3 / Q4 / Q5 / Q6 / Q8)可在以下位置获取:

量化权重HF 链接
SenseNova-U1-8B-MoT-Merger-gguf🤗 smthem/SenseNova-U1-8B-MoT-Merger-gguf

🙏 感谢 GitHub 用户 @smthem 为社区贡献量化后的 GGUF 权重。

--vram_mode:单 GPU 层卸载

传递 --vram_mode 可将语言模型层保留在 CPU 固定内存中,并在前向传播期间按需将其流式传输到 GPU,释放权重占用的显存,同时将激活值保留在设备上。

模式行为使用场景
full(默认)不卸载;整个模型在 GPU 上显存充足,速度最佳
low同步的每层 CPU↔GPU 交换显存占用最低
balanced异步预取,将主机到设备的复制与计算重叠显存紧张但希望恢复速度
python examples/t2i/inference.py \
  --model_path sensenova/SenseNova-U1-8B-MoT \
  --vram_mode balanced \
  --prompt "..." --output output.png

--gguf_checkpoint 和 --vram_mode 的组合:对于显存约为 10–12 GB 的消费级显卡,推荐使用 Q4 GGUF + balanced 的设置。

⚡ 使用 LightLLM + LightX2V 运行(推荐)

在生产环境部署时,我们基于 LightLLM(理解)和 LightX2V(生成)协同设计了专用推理栈。这两个引擎相互解耦,因此每条路径都可以使用自己的并行策略和资源预算,且两者之间通过低开销的传输通道进行通信。

在配备 TP2 + CFG2 的单节点上,该推理栈在 H100 / H200 上处理 2048×2048 图像时,可实现约 ~0.15 秒/步 的速度和 ~9 秒的端到端 耗时。通过基于 FA3 的混合掩码注意力机制,相比 Triton 基准版本,预填充速度提升了约 2.4–3.2 倍。完整的每 GPU 性能数据详见 docs/inference_infra.md。

我们提供了官方 Docker 镜像,支持一键部署:

docker pull lightx2v/lightllm_lightx2v:20260407

⚙️ 部署指南(Docker、启动参数、模式、量化、API 测试):参见 docs/deployment.md。

📖 完整设计与性能分析:参见 docs/inference_infra.md。

🌐 加入社区!

加入我们不断壮大的社区,分享反馈、获取支持,并及时了解 SenseNova-U1 的最新动态 — 我们非常期待听到您的声音!

Discord微信群

⚖️ 许可证

本项目基于 Apache 2.0 许可证 发布。