From 6abf55c0488c77fe8a5091d04ed9258822bf0a8b Mon Sep 17 00:00:00 2001 From: "Haiyang.Pu" <761396462@qq.com> Date: Fri, 9 Jan 2026 17:48:20 +0800 Subject: [PATCH] Feat: support openapi (#12521) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ### What problem does this PR solve? Support OpenAPI interface description. The issue of not supporting the Swagger interface after upgrading the system framework from Flask to Quart has been resolved. Resolved https://github.com/infiniflow/ragflow/issues/5264 ### Type of change - [x] New Feature (non-breaking change which adds functionality) --------- Co-authored-by: puhaiyang <“761396462@qq.com”> --- api/apps/__init__.py | 35 +++-------------------------------- pyproject.toml | 1 + uv.lock | 24 ++++++++++++++++++++++++ 3 files changed, 28 insertions(+), 32 deletions(-) diff --git a/api/apps/__init__.py b/api/apps/__init__.py index c99e5f0dce..6e0f89c67b 100644 --- a/api/apps/__init__.py +++ b/api/apps/__init__.py @@ -19,7 +19,6 @@ import sys from importlib.util import module_from_spec, spec_from_file_location from pathlib import Path from quart import Blueprint, Quart, request, g, current_app, session -from flasgger import Swagger from itsdangerous.url_safe import URLSafeTimedSerializer as Serializer from quart_cors import cors from common.constants import StatusEnum @@ -29,6 +28,7 @@ from api.utils.json_encode import CustomJSONEncoder from api.utils import commands from quart_auth import Unauthorized +from quart_schema import QuartSchema from common import settings from api.utils.api_utils import server_error_response from api.constants import API_VERSION @@ -41,37 +41,8 @@ __all__ = ["app"] app = Quart(__name__) app = cors(app, allow_origin="*") -# Add this at the beginning of your file to configure Swagger UI -swagger_config = { - "headers": [], - "specs": [ - { - "endpoint": "apispec", - "route": "/apispec.json", - "rule_filter": lambda rule: True, # Include all endpoints - "model_filter": lambda tag: True, # Include all models - } - ], - "static_url_path": "/flasgger_static", - "swagger_ui": True, - "specs_route": "/apidocs/", -} - -swagger = Swagger( - app, - config=swagger_config, - template={ - "swagger": "2.0", - "info": { - "title": "RAGFlow API", - "description": "", - "version": "1.0.0", - }, - "securityDefinitions": { - "ApiKeyAuth": {"type": "apiKey", "name": "Authorization", "in": "header"} - }, - }, -) +# openapi supported +QuartSchema(app) app.url_map.strict_slashes = False app.json_encoder = CustomJSONEncoder diff --git a/pyproject.toml b/pyproject.toml index 1db1ab84a1..2575194eb5 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -152,6 +152,7 @@ dependencies = [ "pygithub>=2.8.1", "asana>=5.2.2", "python-gitlab>=7.0.0", + "quart-schema==0.23.0", ] [dependency-groups] diff --git a/uv.lock b/uv.lock index 426139c450..82ff34cec7 100644 --- a/uv.lock +++ b/uv.lock @@ -5534,6 +5534,15 @@ wheels = [ { url = "https://pypi.tuna.tsinghua.edu.cn/packages/c7/21/705964c7812476f378728bdf590ca4b771ec72385c533964653c68e86bdc/pygments-2.19.2-py3-none-any.whl", hash = "sha256:86540386c03d588bb81d44bc3928634ff26449851e99741617ecb9037ee5ec0b", size = 1225217, upload-time = "2025-06-21T13:39:07.939Z" }, ] +[[package]] +name = "pyhumps" +version = "3.8.0" +source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple" } +sdist = { url = "https://pypi.tuna.tsinghua.edu.cn/packages/c4/83/fa6f8fb7accb21f39e8f2b6a18f76f6d90626bdb0a5e5448e5cc9b8ab014/pyhumps-3.8.0.tar.gz", hash = "sha256:498026258f7ee1a8e447c2e28526c0bea9407f9a59c03260aee4bd6c04d681a3", size = 9018, upload-time = "2022-10-21T10:38:59.496Z" } +wheels = [ + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/9e/11/a1938340ecb32d71e47ad4914843775011e6e9da59ba1229f181fef3119e/pyhumps-3.8.0-py3-none-any.whl", hash = "sha256:060e1954d9069f428232a1adda165db0b9d8dfdce1d265d36df7fbff540acfd6", size = 6095, upload-time = "2022-10-21T10:38:58.231Z" }, +] + [[package]] name = "pyjwt" version = "2.8.0" @@ -6161,6 +6170,19 @@ wheels = [ { url = "https://pypi.tuna.tsinghua.edu.cn/packages/ea/31/da390a5a10674481dea2909178973de81fa3a246c0eedcc0e1e4114f52f8/quart_cors-0.8.0-py3-none-any.whl", hash = "sha256:62dc811768e2e1704d2b99d5880e3eb26fc776832305a19ea53db66f63837767", size = 8698, upload-time = "2024-12-27T20:34:29.511Z" }, ] +[[package]] +name = "quart-schema" +version = "0.23.0" +source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple" } +dependencies = [ + { name = "pyhumps" }, + { name = "quart" }, +] +sdist = { url = "https://pypi.tuna.tsinghua.edu.cn/packages/24/65/97b69c76bc8838f0389387c87f480382eea48ca60d5262aeaf4086ad14e2/quart_schema-0.23.0.tar.gz", hash = "sha256:778f36aa80697420a0148807eb324b7d6ca1f10793cd1d0eb4f1c7908d860bdd", size = 24485, upload-time = "2025-12-02T22:01:08.508Z" } +wheels = [ + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/12/ba/54c4516499bf6549ff47d656b8dc8cd58cea7f6d03d3097aebf1958f4974/quart_schema-0.23.0-py3-none-any.whl", hash = "sha256:f8f217942d433954dfe9860b4d748fe4b111836d8d74e06bc0afc512dd991c80", size = 21682, upload-time = "2025-12-02T22:01:06.522Z" }, +] + [[package]] name = "ragflow" version = "0.23.1" @@ -6251,6 +6273,7 @@ dependencies = [ { name = "qianfan" }, { name = "quart-auth" }, { name = "quart-cors" }, + { name = "quart-schema" }, { name = "ranx" }, { name = "readability-lxml" }, { name = "replicate" }, @@ -6383,6 +6406,7 @@ requires-dist = [ { name = "qianfan", specifier = "==0.4.6" }, { name = "quart-auth", specifier = "==0.11.0" }, { name = "quart-cors", specifier = "==0.8.0" }, + { name = "quart-schema", specifier = "==0.23.0" }, { name = "ranx", specifier = "==0.3.20" }, { name = "readability-lxml", specifier = ">=0.8.4,<1.0.0" }, { name = "replicate", specifier = "==0.31.0" },