donut

GitHub
6.8k 560 中等 1 次阅读 昨天MIT其他语言模型图像
AI 解读 由 AI 自动生成,仅供参考

Donut(Document Understanding Transformer)是一款创新的开源 AI 模型,专为智能文档理解而设计。它彻底改变了传统处理流程,无需依赖任何现成的 OCR(光学字符识别)引擎或 API,即可直接端到端地从文档图像中提取结构化信息。

长期以来,文档自动化处理往往受限于 OCR 环节的误差传递,且在面对复杂版式或多语言场景时表现不稳定。Donut 通过引入无 OCR 的 Transformer 架构,直接将图像映射为文本序列,有效解决了这一痛点。它在文档分类、信息抽取(如发票解析、票据识别)等任务上达到了业界领先的准确率。此外,项目配套的 SynthDoG 合成数据生成器,能灵活生成多语言、多领域的训练数据,进一步提升了模型在少样本场景下的泛化能力。

这款工具非常适合人工智能开发者、学术研究人员以及需要构建高精度文档自动化系统的企业技术团队使用。无论是希望复现前沿论文成果的学者,还是致力于优化财务、物流等领域单据处理流程的工程师,Donut 都提供了预训练模型、详细的代码实现以及便捷的 Web 演示环境,帮助大家轻松上手并探索视觉文档理解的无限可能。

使用场景

某跨国电商的财务团队每天需处理来自全球不同国家的数万张手写或打印格式各异的报销收据,以提取金额、日期和商户信息进行自动入账。

没有 donut 时

  • 依赖传统 OCR 引擎:必须串联调用第三方 OCR 服务识别文字,再使用正则表达式提取字段,链路长且维护成本高。
  • 多语言支持困难:面对日语、韩语或小语种收据,通用 OCR 识别率大幅下降,导致后续提取频繁出错。
  • 版面适应性差:一旦收据模板发生微小变化(如字段位置移动),原本写死的规则立即失效,需人工重新调整代码。
  • 手写体识别瓶颈:对于店员手写的金额或备注,传统 OCR 几乎无法准确识别,大量单据被迫转入人工复核流程。

使用 donut 后

  • 端到端直接解析:donut 摒弃了独立的 OCR 步骤,直接将收据图像输入模型,一次性输出结构化的 JSON 数据,大幅简化架构。
  • 原生多语言能力:得益于 SynthDoG 生成的合成数据预训练,donut 能无缝理解并提取多种语言收据中的关键信息,无需额外配置。
  • 鲁棒的泛化性能:基于 Transformer 架构,donut 对文档布局变化具有极强的适应力,即使面对从未见过的收据版式也能准确定位字段。
  • 精准处理手写内容:在视觉文档理解任务上表现卓越,donut 能高精度识别手写数字和非标准打印字体,显著降低人工干预比例。

donut 通过“无 OCR"的端到端转型,将复杂的多国别票据处理流程从繁琐的规则维护中解放出来,实现了真正的智能化与自动化。

运行环境要求

操作系统
  • 未说明
GPU
  • 训练需多卡环境(官方使用 64 张 A100 或 8 张 V100)
  • 推理未强制要求但建议使用支持 CUDA 的 NVIDIA GPU
  • 官方测试环境为 CUDA 11.3 (cu113)
内存

未说明

依赖
notes官方指出由于关键依赖库更新,配置本地测试环境面临挑战,建议优先使用已更新的 Google Colab 演示进行体验。模型输入分辨率较高(如 2560x1920),对显存有一定要求。可通过 pip 安装 donut-python 或使用 conda 创建名为 donut_official 的环境进行源码安装。
python3.7
torch==1.11.0+cu113
torchvision==0.12.0+cu113
pytorch-lightning==1.6.4
transformers==4.11.3
timm==0.5.4
donut hero image

快速开始

Donut 🍩:文档理解 Transformer

论文 会议 演示 演示 PyPI 下载量

Donut 和 SynthDoG 的官方实现 | 论文 | 幻灯片 | 海报

简介

Donut 🍩,即 Document understanding transformer,是一种全新的文档理解方法,它采用无 OCR 的端到端 Transformer 模型。Donut 无需现成的 OCR 引擎或 API,却在多种视觉文档理解任务上表现出最先进的性能,例如视觉文档分类或信息提取(即文档解析)。此外,我们还提出了 SynthDoG 🐶,即 Synthetic Document Generator,它可以帮助模型在多种语言和领域上进行灵活的预训练。

我们的学术论文详细描述了该方法,并提供了完整的实验结果与分析,可在此处找到:

无 OCR 文档理解 Transformer
Geewook Kim (https://geewook.kim), Teakgyu Hong (https://dblp.org/pid/183/0952.html), Moonbin Yim (https://github.com/moonbings), JeongYeon Nam (https://github.com/long8v), Jinyoung Park (https://github.com/jyp1111), Jinyeong Yim (https://jinyeong.github.io), Wonseok Hwang (https://scholar.google.com/citations?user=M13_WdcAAAAJ), Sangdoo Yun (https://sangdooyun.github.io), Dongyoon Han (https://dongyoonhan.github.io), Seunghyun Park (https://scholar.google.com/citations?user=iowjmTwAAAAJ)。发表于 ECCV 2022。

image

预训练模型与网页演示

Gradio 网页演示现已上线!演示 演示
image
  • 您可以使用 ./app.py 文件运行演示。
  • 示例图片可在 ./misc 中找到,更多收据图片则可在 CORD 数据集链接 获取。
  • 网页演示可通过下表中的链接访问。
  • 注意:我们已于 2023 年 6 月 15 日更新了 Google Colab 演示,以确保其正常运行。
任务 每张图片耗时 分数 训练模型
演示
CORD(文档解析) 0.7 /
0.7 /
1.2
91.3 /
91.1 /
90.9
donut-base-finetuned-cord-v2 (1280) /
donut-base-finetuned-cord-v1 (1280) /
donut-base-finetuned-cord-v1-2560
gradio space 网页演示,
google colab 演示(23.06.15 更新)
火车票(文档解析) 0.6 98.7 donut-base-finetuned-zhtrainticket google colab 演示(23.06.15 更新)
RVL-CDIP(文档分类) 0.75 95.3 donut-base-finetuned-rvlcdip gradio space 网页演示,
google colab 演示(23.06.15 更新)
DocVQA Task1(文档 VQA) 0.78 67.5 donut-base-finetuned-docvqa gradio space 网页演示,
google colab 演示(23.06.15 更新)

预训练骨干模型的链接如下:

  • donut-base:由 64 块 A100 GPU 训练而成(约 2.5 天),层数为(编码器:{2,2,14,2}, 解码器:4),输入尺寸为 2560×1920,Swin 窗口大小为 10,数据来源为 IIT-CDIP(1100 万张)和 SynthDoG(英语、中文、日语、韩语,每种 50 万张)。
  • donut-proto:(初步模型)由 8 块 V100 GPU 训练而成(约 5 天),层数为(编码器:{2,2,18,2}, 解码器:4),输入尺寸为 2048×1536,Swin 窗口大小为 8,数据来源为 SynthDoG(英语、日语、韩语,每种 40 万张)。

更多详情请参阅我们的论文(见“如何引用”部分)。

SynthDoG 数据集

image

SynthDoG 生成的数据集链接如下:

如需使用我们的 SynthDoG 生成合成数据集,请参阅 ./synthdog/README.md 及我们的论文(见“如何引用”部分)获取详细信息。

更新

2023-06-15 我们已更新所有 Google Colab 演示,以确保其正常运行。
2022-11-14 新版本 1.0.9 已发布(pip install donut-python --upgrade)。请参阅 1.0.9 发行说明
2022-08-12 Donut 🍩 也已在 huggingface/transformers 🤗 上提供(由 @NielsRogge 贡献)。donut-python 会从模型仓库的 official 分支加载预训练权重。请参阅 1.0.5 发行说明
2022-08-05 关于 donut 🍩 的一篇操作性很强的教程已在 Towards Data Science 上发表(作者为 @estaudere)。
2022-07-20 首次提交,我们发布了代码、模型权重、合成数据及生成器。

软件安装

PyPI 下载量

pip install donut-python

或者克隆此仓库并安装依赖项:

git clone https://github.com/clovaai/donut.git
cd donut/
conda create -n donut_official python=3.7
conda activate donut_official
pip install .

我们使用以下版本测试了 donut-python == 1.0.1:

注意:根据多起反馈的问题,我们注意到由于关键依赖库的近期更新,配置 donut-python 的测试环境变得愈发困难。虽然我们正在积极寻找解决方案,但我们已于 2023 年 6 月 15 日更新了 Google Colab 演示,以确保其正常运行。如需帮助,请参考以下演示链接:CORD Colab 演示火车票 Colab 演示RVL-CDIP Colab 演示DocVQA Colab 演示

入门指南

数据

本仓库假定数据集具有如下结构:

> tree dataset_name
dataset_name
├── test
│   ├── metadata.jsonl
│   ├── {image_path0}
│   ├── {image_path1}
│             .
│             .
├── train
│   ├── metadata.jsonl
│   ├── {image_path0}
│   ├── {image_path1}
│             .
│             .
└── validation
    ├── metadata.jsonl
    ├── {image_path0}
    ├── {image_path1}
              .
              .

> cat dataset_name/test/metadata.jsonl
{"file_name": {image_path0}, "ground_truth": "{\"gt_parse\": {ground_truth_parse}, ... {other_metadata_not_used} ... }"}
{"file_name": {image_path1}, "ground_truth": "{\"gt_parse\": {ground_truth_parse}, ... {other_metadata_not_used} ... }"}
     .
     .
  • metadata.jsonl 文件的结构采用 JSON Lines 文本格式,即 .jsonl。每行包含:
    • file_name:图像文件的相对路径。
    • ground_truth:字符串格式(JSON 序列化),字典中包含 gt_parsegt_parses。其他字段(元数据)可以添加到字典中,但不会被使用。
  • donut 将所有任务视为 JSON 预测问题。因此,所有 donut 模型的训练都遵循相同的流程。在训练和推理时,唯一需要做的就是按照下文所述的格式准备任务所需的 gt_parsegt_parses

对于文档分类

gt_parse 的格式为 {"class" : {class_name}},例如 {"class" : "scientific_report"}{"class" : "presentation"}

  • Google Colab 演示可在 这里 查看。
  • Gradio 网页演示可在 这里 查看。

对于文档信息抽取

gt_parse 是一个包含文档图像全部信息的 JSON 对象,例如,一张收据的 JSON 对象可能看起来是 {"menu" : [{"nm": "ICE BLACKCOFFEE", "cnt": "2", ...}, ...], ...}

  • 更多示例可在 CORD 数据集 中找到。
  • Google Colab 演示可在 这里 查看。
  • Gradio 网页演示可在 这里 查看。

对于文档视觉问答

gt_parses 的格式为 [{"question" : {question_sentence}, "answer" : {answer_candidate_1}}, {"question" : {question_sentence}, "answer" : {answer_candidate_2}}, ...],例如 [{"question" : "模型名称是什么?", "answer" : "donut"}, {"question" : "模型名称是什么?", "answer" : "文档理解 Transformer"}]

  • DocVQA Task1 有多重答案,因此 gt_parses 应该是一个包含问题与答案对的字典列表。
  • Google Colab 演示可在 这里 查看。
  • Gradio 网页演示可在 这里 查看。

对于(伪)文本阅读任务

gt_parse 的格式为 {"text_sequence" : "word1 word2 word3 ... "}

  • 该任务同时也是 Donut 模型的预训练任务。
  • 您可以使用我们的 SynthDoG 🐶 生成适合文本阅读任务的合成图像,并附带正确的 gt_parse。详情请参阅 ./synthdog/README.md

训练

这是我们实验中使用的、在 CORD 数据集上训练 Donut 模型的配置。我们使用单块 NVIDIA A100 GPU 运行了该训练。

python train.py --config config/train_cord.yaml \
                --pretrained_model_name_or_path "naver-clova-ix/donut-base" \
                --dataset_name_or_paths '["naver-clova-ix/cord-v2"]' \
                --exp_version "test_experiment"    
  .
  .                                                                                                                                                                                                                                         
预测: <s_menu><s_nm>柠檬茶 (L)</s_nm><s_cnt>1</s_cnt><s_price>25.000</s_price></s_menu><s_total><s_total_price>25.000</s_total_price><s_cashprice>30.000</s_cashprice><s_changeprice>5.000</s_changeprice></s_total>
答案: <s_menu><s_nm>柠檬茶 (L)</s_nm><s_cnt>1</s_cnt><s_price>25.000</s_price></s_menu><s_total><s_total_price>25.000</s_total_price><s_cashprice>30.000</s_cashprice><s_changeprice>5.000</s_changeprice></s_total>
归一化编辑距离: 0.0
预测: <s_menu><s_nm>浩克顶配套餐</s_nm><s_cnt>1</s_cnt><s_price>100.000</s_price></s_menu><s_total><s_total_price>100.000</s_total_price><s_cashprice>100.000</s_cashprice><s_changeprice>0</s_changeprice></s_total>
答案: <s_menu><s_nm>浩克顶配套餐</s_nm><s_cnt>1</s_cnt><s_price>100.000</s_price></s_menu><s_total><s_total_price>100.000</s_total_price><s_cashprice>100.000</s_cashprice><s_changeprice>0</s_changeprice></s_total>
归一化编辑距离: 0.0
预测: <s_menu><s_nm>巨型乌贼</s_nm><s_cnt>x 1</s_cnt><s_price>Rp. 39.000</s_price><s_sub><s_nm>C.精加工 - 切割</s_nm><s_price>Rp. 0</s_price><sep/><s_nm>B.辣度 - 极辣 Rp. 0</s_price></s_sub><sep/><s_nm>A.口味 - 盐椒</s_nm><s_price>Rp. 0</s_price></s_sub></s_menu><s_sub_total><s_subtotal_price>Rp. 39.000</s_subtotal_price></s_sub_total><s_total><s_total_price>Rp. 39.000</s_total_price><s_cashprice>Rp. 50.000</s_cashprice><s_changeprice>Rp. 11.000</s_changeprice></s_total>
答案: <s_menu><s_nm>巨型乌贼</s_nm><s_cnt>x1</s_cnt><s_price>Rp. 39.000</s_price><s_sub><s_nm>C.精加工 - 切割</s_nm><s_price>Rp. 0</s_price><sep/><s_nm>B.辣度 - 极辣</s_nm><s_price>Rp. 0</s_price><sep/><s_nm>A.口味 - 盐椒</s_nm><s_price>Rp. 0</s_price></s_sub></s_menu><s_sub_total><s_subtotal_price>Rp. 39.000</s_subtotal_price></s_sub_total><s_total><s_total_price>Rp. 39.000</s_total_price><s_cashprice>Rp. 50.000</s_cashprice><s_changeprice>Rp. 11.000</s_changeprice></s_total>
归一化编辑距离: 0.039603960396039604                                                                                                                                  
第29轮: 100%|█████████████| 200/200 [01:49<00:00,  1.82项/s, 损失=0.00327, 实验名称=train_cord, 实验版本=test_experiment]

一些重要参数:

  • --config:模型训练的配置文件路径。
  • --pretrained_model_name_or_path:字符串格式,可以是 Hugging Face Model Hub 中的模型名称或本地路径。
  • --dataset_name_or_paths:字符串格式(JSON 格式),包含 Hugging Face 数据集中的数据集名称列表或本地路径。
  • --result_path:用于保存模型输出和中间产物的文件路径。
  • --exp_version:用于实验版本管理。输出文件将保存在 {result_path}/{exp_version}/* 目录下。

测试

使用训练好的模型、测试图像以及真实标注,可以获取推理结果和准确率分数。

python test.py --dataset_name_or_path naver-clova-ix/cord-v2 --pretrained_model_name_or_path ./result/train_cord/test_experiment --save_path ./result/output.json
100%|█████████████| 100/100 [00:35<00:00,  2.80项/s]
样本总数: 100,基于树编辑距离(TED)的准确率:0.9129639764131697,F1 准确率:0.8406020841373987

一些重要参数:

  • --dataset_name_or_path:字符串格式,目标数据集的名称或本地路径。
  • --pretrained_model_name_or_path:字符串格式,Hugging Face Model Hub 中的模型名称或本地路径。
  • --save_path:用于保存预测结果和评分的文件路径。

引用方式

如果您觉得这项工作对您有帮助,请引用以下内容:

@inproceedings{kim2022donut,
  title     = {无OCR文档理解Transformer},
  author    = {Kim, Geewook 和 Hong, Teakgyu 和 Yim, Moonbin 和 Nam, JeongYeon 和 Park, Jinyoung 和 Yim, Jinyeong 和 Hwang, Wonseok 和 Yun, Sangdoo 和 Han, Dongyoon 和 Park, Seunghyun},
  booktitle = {欧洲计算机视觉大会 (ECCV)},
  year      = {2022}
}

许可证

MIT 许可证

版权所有 © 2022-present NAVER Corp.

特此授予任何人免费获得本软件及其相关文档文件(“软件”)副本的权利,以进行处理。在不受限制的情况下,包括但不限于使用、复制、修改、合并、发布、分发、再许可和/或销售软件副本的权利,以及允许向任何接收软件的人提供软件的权利,但须遵守以下条件:

上述版权声明和本许可声明应包含在所有副本或软件的重要部分中。

“软件”按“原样”提供,不提供任何形式的保证,无论是明示的还是默示的,包括但不限于适销性、特定用途适用性和非侵权性的保证。在任何情况下,作者或版权所有者均不对任何索赔、损害或其他责任负责,无论这些责任是基于合同、侵权行为或其他原因产生的,与软件或其使用有关的一切责任均由作者或版权所有者承担。

版本历史

1.0.92022/11/14
1.0.82022/10/05
1.0.72022/08/23
1.0.52022/08/04
1.0.42022/07/29
1.0.32022/07/20

常见问题

相似工具推荐

openclaw

OpenClaw 是一款专为个人打造的本地化 AI 助手,旨在让你在自己的设备上拥有完全可控的智能伙伴。它打破了传统 AI 助手局限于特定网页或应用的束缚,能够直接接入你日常使用的各类通讯渠道,包括微信、WhatsApp、Telegram、Discord、iMessage 等数十种平台。无论你在哪个聊天软件中发送消息,OpenClaw 都能即时响应,甚至支持在 macOS、iOS 和 Android 设备上进行语音交互,并提供实时的画布渲染功能供你操控。 这款工具主要解决了用户对数据隐私、响应速度以及“始终在线”体验的需求。通过将 AI 部署在本地,用户无需依赖云端服务即可享受快速、私密的智能辅助,真正实现了“你的数据,你做主”。其独特的技术亮点在于强大的网关架构,将控制平面与核心助手分离,确保跨平台通信的流畅性与扩展性。 OpenClaw 非常适合希望构建个性化工作流的技术爱好者、开发者,以及注重隐私保护且不愿被单一生态绑定的普通用户。只要具备基础的终端操作能力(支持 macOS、Linux 及 Windows WSL2),即可通过简单的命令行引导完成部署。如果你渴望拥有一个懂你

349.3k|★★★☆☆|2周前
Agent开发框架图像

n8n

n8n 是一款面向技术团队的公平代码(fair-code)工作流自动化平台,旨在让用户在享受低代码快速构建便利的同时,保留编写自定义代码的灵活性。它主要解决了传统自动化工具要么过于封闭难以扩展、要么完全依赖手写代码效率低下的痛点,帮助用户轻松连接 400 多种应用与服务,实现复杂业务流程的自动化。 n8n 特别适合开发者、工程师以及具备一定技术背景的业务人员使用。其核心亮点在于“按需编码”:既可以通过直观的可视化界面拖拽节点搭建流程,也能随时插入 JavaScript 或 Python 代码、调用 npm 包来处理复杂逻辑。此外,n8n 原生集成了基于 LangChain 的 AI 能力,支持用户利用自有数据和模型构建智能体工作流。在部署方面,n8n 提供极高的自由度,支持完全自托管以保障数据隐私和控制权,也提供云端服务选项。凭借活跃的社区生态和数百个现成模板,n8n 让构建强大且可控的自动化系统变得简单高效。

184.7k|★★☆☆☆|今天
数据工具开发框架Agent

AutoGPT

AutoGPT 是一个旨在让每个人都能轻松使用和构建 AI 的强大平台,核心功能是帮助用户创建、部署和管理能够自动执行复杂任务的连续型 AI 智能体。它解决了传统 AI 应用中需要频繁人工干预、难以自动化长流程工作的痛点,让用户只需设定目标,AI 即可自主规划步骤、调用工具并持续运行直至完成任务。 无论是开发者、研究人员,还是希望提升工作效率的普通用户,都能从 AutoGPT 中受益。开发者可利用其低代码界面快速定制专属智能体;研究人员能基于开源架构探索多智能体协作机制;而非技术背景用户也可直接选用预置的智能体模板,立即投入实际工作场景。 AutoGPT 的技术亮点在于其模块化“积木式”工作流设计——用户通过连接功能块即可构建复杂逻辑,每个块负责单一动作,灵活且易于调试。同时,平台支持本地自托管与云端部署两种模式,兼顾数据隐私与使用便捷性。配合完善的文档和一键安装脚本,即使是初次接触的用户也能在几分钟内启动自己的第一个 AI 智能体。AutoGPT 正致力于降低 AI 应用门槛,让人人都能成为 AI 的创造者与受益者。

183.6k|★★★☆☆|今天
Agent语言模型插件

stable-diffusion-webui

stable-diffusion-webui 是一个基于 Gradio 构建的网页版操作界面,旨在让用户能够轻松地在本地运行和使用强大的 Stable Diffusion 图像生成模型。它解决了原始模型依赖命令行、操作门槛高且功能分散的痛点,将复杂的 AI 绘图流程整合进一个直观易用的图形化平台。 无论是希望快速上手的普通创作者、需要精细控制画面细节的设计师,还是想要深入探索模型潜力的开发者与研究人员,都能从中获益。其核心亮点在于极高的功能丰富度:不仅支持文生图、图生图、局部重绘(Inpainting)和外绘(Outpainting)等基础模式,还独创了注意力机制调整、提示词矩阵、负向提示词以及“高清修复”等高级功能。此外,它内置了 GFPGAN 和 CodeFormer 等人脸修复工具,支持多种神经网络放大算法,并允许用户通过插件系统无限扩展能力。即使是显存有限的设备,stable-diffusion-webui 也提供了相应的优化选项,让高质量的 AI 艺术创作变得触手可及。

162.1k|★★★☆☆|2周前
开发框架图像Agent

everything-claude-code

everything-claude-code 是一套专为 AI 编程助手(如 Claude Code、Codex、Cursor 等)打造的高性能优化系统。它不仅仅是一组配置文件,而是一个经过长期实战打磨的完整框架,旨在解决 AI 代理在实际开发中面临的效率低下、记忆丢失、安全隐患及缺乏持续学习能力等核心痛点。 通过引入技能模块化、直觉增强、记忆持久化机制以及内置的安全扫描功能,everything-claude-code 能显著提升 AI 在复杂任务中的表现,帮助开发者构建更稳定、更智能的生产级 AI 代理。其独特的“研究优先”开发理念和针对 Token 消耗的优化策略,使得模型响应更快、成本更低,同时有效防御潜在的攻击向量。 这套工具特别适合软件开发者、AI 研究人员以及希望深度定制 AI 工作流的技术团队使用。无论您是在构建大型代码库,还是需要 AI 协助进行安全审计与自动化测试,everything-claude-code 都能提供强大的底层支持。作为一个曾荣获 Anthropic 黑客大奖的开源项目,它融合了多语言支持与丰富的实战钩子(hooks),让 AI 真正成长为懂上

161.7k|★★☆☆☆|今天
开发框架Agent语言模型

ComfyUI

ComfyUI 是一款功能强大且高度模块化的视觉 AI 引擎,专为设计和执行复杂的 Stable Diffusion 图像生成流程而打造。它摒弃了传统的代码编写模式,采用直观的节点式流程图界面,让用户通过连接不同的功能模块即可构建个性化的生成管线。 这一设计巧妙解决了高级 AI 绘图工作流配置复杂、灵活性不足的痛点。用户无需具备编程背景,也能自由组合模型、调整参数并实时预览效果,轻松实现从基础文生图到多步骤高清修复等各类复杂任务。ComfyUI 拥有极佳的兼容性,不仅支持 Windows、macOS 和 Linux 全平台,还广泛适配 NVIDIA、AMD、Intel 及苹果 Silicon 等多种硬件架构,并率先支持 SDXL、Flux、SD3 等前沿模型。 无论是希望深入探索算法潜力的研究人员和开发者,还是追求极致创作自由度的设计师与资深 AI 绘画爱好者,ComfyUI 都能提供强大的支持。其独特的模块化架构允许社区不断扩展新功能,使其成为当前最灵活、生态最丰富的开源扩散模型工具之一,帮助用户将创意高效转化为现实。

109.2k|★★☆☆☆|2天前
开发框架图像Agent