├── .env ├── README.md ├── __pycache__ └── main.cpython-311.pyc ├── dockerfile ├── gunicorn_conf.py ├── main copy 2.py ├── main copy.py ├── main.py └── requirements.txt /.env: -------------------------------------------------------------------------------- 1 | # 零一万物 2 | API_KEY="dbe000b3e7f44df98d6c3f330cccf5a1" 3 | 4 | API_url="https://api.lingyiwanwu.com/v1/chat/completions" 5 | 6 | # 阶跃星辰 7 | # API_KEY="6L6WPLeIR4VPqcjX1OHxWhd1thSWOxq5TGLoJzkV5aSgw11HBPPNxHsI0fYdBYYXC" 8 | 9 | # API_url="https://api.stepfun.com/v1/chat/completions" -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # 不挂科AI后端 2 | ![image](https://github.com/user-attachments/assets/9de82070-8118-42f0-b569-32aee4f01715) 3 | 4 | ## 项目简介 5 | 6 | 不挂科AI后端是一个基于FastAPI框架构建的Web应用程序,旨在为用户提供一系列智能化的服务,包括视频转PPT、PPT转PDF、PDF和PPT内容解析、考试重点大纲生成、出题、思维导图生成等功能。该后端服务使用了多种Python库,如FastAPI、PyPDF2、python-pptx、sqlalchemy、pydantic、passlib、python-jose、python-dotenv、requests、pymysql、scikit-image、opencv-python、imutils和img2pdf等。 7 | 8 | ## 功能 9 | 10 | - 视频转PPT 11 | - PPT转PDF 12 | - PDF和PPT内容解析 13 | - 考试重点大纲生成 14 | - 出题 15 | - 思维导图生成 16 | 17 | ## 环境配置 18 | 19 | 在开始使用本应用之前,您需要确保您的环境中安装了以下依赖项: 20 | 21 | - fastapi 22 | - PyPDF2 23 | - python-pptx 24 | - sqlalchemy 25 | - pydantic 26 | - passlib 27 | - python-jose 28 | - python-dotenv 29 | - requests 30 | - pymysql 31 | - scikit-image 32 | - opencv-python 33 | - imutils 34 | - img2pdf 35 | - python-multipart 36 | 37 | 您可以通过以下命令安装这些依赖项: 38 | 39 | ```bash 40 | pip install -r requirements.txt 41 | ``` 42 | 43 | ## 运行应用 44 | 45 | 要运行该应用,请使用以下命令: 46 | 47 | ```bash 48 | uvicorn main:app --host 0.0.0.0 --port 8000 49 | ``` 50 | 51 | ## API端点 52 | 53 | 以下是该项目提供的API端点列表: 54 | 55 | - /upload/:上传视频文件,并将其转换为PPT。 56 | - /mindmap:上传PDF或PPTX文件,并生成思维导图。 57 | - /topics:上传PDF或PPTX文件,并生成考试重点大纲。 58 | - /examkeypoints:上传PDF或PPTX文件,并生成期末考试试卷。 59 | - /check_user:检查用户名是否已存在。 60 | 61 | ## 贡献 62 | 63 | 如果您想为该项目做出贡献,请遵循以下步骤: 64 | 65 | 1. Fork该项目。 66 | 2. 创建一个新的分支。 67 | 3. 提交您的更改。 68 | 4. 发起一个Pull Request。 69 | 70 | ## 许可证 71 | 72 | 该项目采用MIT许可证。有关详细信息,请查看LICENSE文件。 73 | 74 | ## 联系方式 75 | 76 | 如果您有任何问题或建议,请通过以下方式联系我们: 77 | 78 | - 邮箱:[3038880699@qq.com](mailto:3038880699@qq.com) 79 | - GitHub:[zjrwtx](https://github.com/zjrwtx) 80 | 81 | 感谢您的关注和使用! 82 | -------------------------------------------------------------------------------- /__pycache__/main.cpython-311.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zjrwtx/Pass_the_exam/b71435a2cc3eb6362a3ab49212095f3c8c504d24/__pycache__/main.cpython-311.pyc -------------------------------------------------------------------------------- /dockerfile: -------------------------------------------------------------------------------- 1 | # 使用官方 Python 运行时作为基础镜像 2 | FROM python:3.10-slim 3 | 4 | # 更新软件包列表并安装FFmpeg和必要的构建工具 5 | # RUN apt-get update && apt-get install -y ffmpeg gcc 6 | 7 | # 设置工作目录 8 | WORKDIR /app 9 | 10 | # 将当前目录内容复制到容器中的 /app 目录 11 | COPY . /app 12 | 13 | # 安装 requirements.txt 中指定的任何需要的程序包 14 | RUN pip install --no-cache-dir -r requirements.txt 15 | 16 | # 使端口 8000 可供此容器外的环境使用 17 | EXPOSE 8000 18 | 19 | # 使用 Uvicorn 运行 FastAPI 应用 20 | CMD ["uvicorn", "main:app", "--host", "0.0.0.0", "--port", "8000"] 21 | -------------------------------------------------------------------------------- /gunicorn_conf.py: -------------------------------------------------------------------------------- 1 | # gunicorn_conf.py 2 | import multiprocessing 3 | 4 | workers = multiprocessing.cpu_count() * 2 + 1 5 | worker_class = 'uvicorn.workers.UvicornWorker' 6 | bind = '0.0.0.0:8000' 7 | loglevel = 'info' 8 | -------------------------------------------------------------------------------- /main copy 2.py: -------------------------------------------------------------------------------- 1 | # app/main.py 2 | from fastapi import FastAPI, File, UploadFile, Form 3 | from typing import List 4 | from PyPDF2 import PdfReader 5 | from pptx import Presentation 6 | import os 7 | from io import BytesIO 8 | from fastapi.middleware.cors import CORSMiddleware 9 | from dotenv import load_dotenv 10 | import requests 11 | def maketopics(text, typeoftopic, numoftopic): 12 | # 加载环境变量文件 13 | load_dotenv() 14 | API_KEY = os.getenv('API_KEY') 15 | API_url = os.getenv('API_url') 16 | 17 | # 设置请求头 18 | headers = { 19 | 'Content-Type': 'application/json', 20 | 'Authorization': f"Bearer {API_KEY}", 21 | } 22 | 23 | # 设置要发送的数据 24 | json_data = { 25 | 'model': 'yi-large', 26 | 'messages': [ 27 | { 28 | 'role': 'system', 29 | 'content': '你是一个专业的出题者,能对用户输入的内容生成详细的高质量的题目,且带上答案与解释', 30 | }, 31 | { 32 | 'role': 'user', 33 | 'content': f"请你把我输入的内容生成{numoftopic}道详细的高质量的{typeoftopic}类型题目,且带上答案与解释: {text}", 34 | }, 35 | ], 36 | 'temperature': 0.3, 37 | "max_tokens": 10000, 38 | "top_p": 1.0, 39 | } 40 | 41 | # 发送请求 42 | response = requests.post(API_url, headers=headers, json=json_data) 43 | 44 | # 打印响应内容 45 | try: 46 | output = response.json()['choices'][0]['message']['content'] 47 | print(output) 48 | return output 49 | 50 | except (KeyError, IndexError, AttributeError): 51 | print("无法获取响应内容或响应格式不正确。") 52 | return "出错啦! 请联系和push一下开发者解决问题" 53 | 54 | 55 | 56 | 57 | def mindmap(text): 58 | # 加载环境变量文件 59 | load_dotenv() 60 | API_KEY = os.getenv('API_KEY') 61 | API_url = os.getenv('API_url') 62 | 63 | # 设置请求头 64 | headers = { 65 | 'Content-Type': 'application/json', 66 | 'Authorization': f"Bearer {API_KEY}", 67 | } 68 | 69 | # 设置要发送的数据 70 | json_data = { 71 | 'model': 'yi-large', 72 | 'messages': [ 73 | { 74 | 'role': 'system', 75 | 'content': '你是一个专业的思维导图专家,能对用户输入的内容生成详细的高质量的markdown格式的思维导图', 76 | }, 77 | { 78 | 'role': 'user', 79 | 'content': f"请你把我输入的内容生成详细的高质量的markdown格式的思维导图{text}", 80 | }, 81 | ], 82 | 'temperature': 0.3, 83 | "max_tokens": 10000, 84 | "top_p": 1.0, 85 | } 86 | 87 | # 发送请求 88 | response = requests.post(API_url, headers=headers, json=json_data) 89 | 90 | # 打印响应内容 91 | try: 92 | output = response.json()['choices'][0]['message']['content'] 93 | print(output) 94 | return output 95 | 96 | except (KeyError, IndexError, AttributeError): 97 | print("无法获取响应内容或响应格式不正确。") 98 | return "出错啦! 请联系和push一下开发者解决问题" 99 | 100 | app = FastAPI() 101 | app.add_middleware( 102 | CORSMiddleware, 103 | allow_origins=["*"], 104 | allow_credentials=True, 105 | allow_methods=["*"], 106 | allow_headers=["*"], 107 | ) 108 | 109 | @app.post("/topics") 110 | async def upload_files( 111 | files: List[UploadFile] = File(...), 112 | typeoftopic: str = Form(...), 113 | numoftopic: str = Form(...) 114 | ): 115 | responses = [] 116 | for file in files: 117 | content = await file.read() 118 | filename = file.filename 119 | ext = os.path.splitext(filename)[1].lower() 120 | 121 | if ext == ".pdf": 122 | extracted_text = extract_text_from_pdf(content) 123 | elif ext == ".pptx" or ext == ".ppt": 124 | extracted_text = extract_text_from_pptx(content) 125 | else: 126 | extracted_text = "Unsupported file type" 127 | 128 | api_response = maketopics(extracted_text, typeoftopic, numoftopic) 129 | responses.append({"filename": filename, "api_response": api_response}) 130 | 131 | return {"responses": responses} 132 | @app.post("/mindmap") 133 | async def upload_files( 134 | files: List[UploadFile] = File(...), 135 | 136 | ): 137 | responses = [] 138 | for file in files: 139 | content = await file.read() 140 | filename = file.filename 141 | ext = os.path.splitext(filename)[1].lower() 142 | 143 | if ext == ".pdf": 144 | extracted_text = extract_text_from_pdf(content) 145 | elif ext == ".pptx" or ext == ".ppt": 146 | extracted_text = extract_text_from_pptx(content) 147 | else: 148 | extracted_text = "Unsupported file type" 149 | 150 | api_response = mindmap(extracted_text) 151 | responses.append({"filename": filename, "api_response": api_response}) 152 | 153 | return {"responses": responses} 154 | 155 | 156 | def extract_text_from_pdf(content): 157 | pdf_file = BytesIO(content) 158 | pdf_reader = PdfReader(pdf_file) 159 | text = '' 160 | for page_num in range(len(pdf_reader.pages)): 161 | page = pdf_reader.pages[page_num] 162 | text += page.extract_text() 163 | return text 164 | 165 | def extract_text_from_pptx(content): 166 | pptx_file = BytesIO(content) 167 | prs = Presentation(pptx_file) 168 | text_runs = [] 169 | for slide in prs.slides: 170 | for shape in slide.shapes: 171 | if not shape.has_text_frame: 172 | continue 173 | for paragraph in shape.text_frame.paragraphs: 174 | for run in paragraph.runs: 175 | text_runs.append(run.text) 176 | return "\n".join(text_runs) 177 | 178 | if __name__ == "__main__": 179 | import uvicorn 180 | uvicorn.run(app, host="0.0.0.0", port=8000) 181 | -------------------------------------------------------------------------------- /main copy.py: -------------------------------------------------------------------------------- 1 | # app/main.py 2 | from fastapi import FastAPI, File, UploadFile, Form 3 | from typing import List 4 | from PyPDF2 import PdfReader 5 | from pptx import Presentation 6 | import os 7 | from io import BytesIO 8 | from fastapi.middleware.cors import CORSMiddleware 9 | from dotenv import load_dotenv 10 | import requests 11 | 12 | def call_api_and_print_response(text, typeoftopic, numoftopic): 13 | # 加载环境变量文件 14 | load_dotenv() 15 | API_KEY = os.getenv('API_KEY') 16 | API_url = os.getenv('API_url') 17 | 18 | # 设置请求头 19 | headers = { 20 | 'Content-Type': 'application/json', 21 | 'Authorization': f"Bearer {API_KEY}", 22 | } 23 | 24 | # 设置要发送的数据 25 | json_data = { 26 | 'model': 'step-1-256k', 27 | 'messages': [ 28 | { 29 | 'role': 'system', 30 | 'content': '你是一个专业的出题者,能对用户输入的内容生成详细的高质量的题目,且带上答案与解释', 31 | }, 32 | { 33 | 'role': 'user', 34 | 'content': f"请你把我输入的内容生成{numoftopic}道详细的高质量的{typeoftopic}类型题目,且带上答案与解释: {text}", 35 | }, 36 | ], 37 | 'temperature': 0.3, 38 | "max_tokens": 10000, 39 | "top_p": 1.0, 40 | } 41 | 42 | # 发送请求 43 | response = requests.post(API_url, headers=headers, json=json_data) 44 | 45 | # 打印响应内容 46 | try: 47 | output = response.json()['choices'][0]['message']['content'] 48 | print(output) 49 | return output 50 | 51 | except (KeyError, IndexError, AttributeError): 52 | print("无法获取响应内容或响应格式不正确。") 53 | return "出错啦" 54 | 55 | app = FastAPI() 56 | app.add_middleware( 57 | CORSMiddleware, 58 | allow_origins=["*"], 59 | allow_credentials=True, 60 | allow_methods=["*"], 61 | allow_headers=["*"], 62 | ) 63 | 64 | @app.post("/upload") 65 | async def upload_files( 66 | files: List[UploadFile] = File(...), 67 | typeoftopic: str = Form(...), 68 | numoftopic: str = Form(...) 69 | ): 70 | responses = [] 71 | for file in files: 72 | content = await file.read() 73 | filename = file.filename 74 | ext = os.path.splitext(filename)[1].lower() 75 | 76 | if ext == ".pdf": 77 | extracted_text = extract_text_from_pdf(content) 78 | elif ext == ".pptx" or ext == ".ppt": 79 | extracted_text = extract_text_from_pptx(content) 80 | else: 81 | extracted_text = "Unsupported file type" 82 | 83 | api_response = call_api_and_print_response(extracted_text, typeoftopic, numoftopic) 84 | responses.append({"filename": filename, "api_response": api_response}) 85 | 86 | return {"responses": responses} 87 | 88 | def extract_text_from_pdf(content): 89 | pdf_file = BytesIO(content) 90 | pdf_reader = PdfReader(pdf_file) 91 | text = '' 92 | for page_num in range(len(pdf_reader.pages)): 93 | page = pdf_reader.pages[page_num] 94 | text += page.extract_text() 95 | return text 96 | 97 | def extract_text_from_pptx(content): 98 | pptx_file = BytesIO(content) 99 | prs = Presentation(pptx_file) 100 | text_runs = [] 101 | for slide in prs.slides: 102 | for shape in slide.shapes: 103 | if not shape.has_text_frame: 104 | continue 105 | for paragraph in shape.text_frame.paragraphs: 106 | for run in paragraph.runs: 107 | text_runs.append(run.text) 108 | return "\n".join(text_runs) 109 | 110 | if __name__ == "__main__": 111 | import uvicorn 112 | uvicorn.run(app, host="0.0.0.0", port=8000) 113 | -------------------------------------------------------------------------------- /main.py: -------------------------------------------------------------------------------- 1 | # app/main.py 2 | from fastapi import FastAPI, File, UploadFile, Form, HTTPException 3 | from typing import List 4 | from PyPDF2 import PdfReader 5 | from pptx import Presentation 6 | import os 7 | from io import BytesIO 8 | from fastapi.middleware.cors import CORSMiddleware 9 | from dotenv import load_dotenv 10 | import requests 11 | 12 | def maketopics(text, typeoftopic, numoftopic): 13 | # 加载环境变量文件 14 | load_dotenv() 15 | API_KEY = os.getenv('API_KEY') 16 | API_url = os.getenv('API_url') 17 | 18 | # 设置请求头 19 | headers = { 20 | 'Content-Type': 'application/json', 21 | 'Authorization': f"Bearer {API_KEY}", 22 | } 23 | 24 | # 设置要发送的数据 25 | json_data = { 26 | 'model': 'yi-large', 27 | 'messages': [ 28 | { 29 | 'role': 'system', 30 | 'content': '你是一个专业的出题者,能对用户输入的内容生成详细的高质量的题目,且带上答案与解释', 31 | }, 32 | { 33 | 'role': 'user', 34 | 'content': f"请你把我输入的内容生成{numoftopic}道详细的高质量的{typeoftopic}类型题目,且带上答案与解释: {text}", 35 | }, 36 | ], 37 | 'temperature': 0.3, 38 | "max_tokens": 10000, 39 | "top_p": 1.0, 40 | } 41 | 42 | # 发送请求 43 | response = requests.post(API_url, headers=headers, json=json_data) 44 | 45 | # 打印响应内容 46 | try: 47 | output = response.json()['choices'][0]['message']['content'] 48 | print(output) 49 | return output 50 | except (KeyError, IndexError, AttributeError): 51 | print("无法获取响应内容或响应格式不正确。") 52 | return "出错啦! 请联系和push一下开发者解决问题" 53 | 54 | def mindmap(text): 55 | # 加载环境变量文件 56 | load_dotenv() 57 | API_KEY = os.getenv('API_KEY') 58 | API_url = os.getenv('API_url') 59 | 60 | # 设置请求头 61 | headers = { 62 | 'Content-Type': 'application/json', 63 | 'Authorization': f"Bearer {API_KEY}", 64 | } 65 | 66 | # 设置要发送的数据 67 | json_data = { 68 | 'model': 'yi-large', 69 | 'messages': [ 70 | { 71 | 'role': 'system', 72 | 'content': '你是一个专业的思维导图专家,能对用户输入的内容生成详细的高质量的markdown格式的思维导图', 73 | }, 74 | { 75 | 'role': 'user', 76 | 'content': f"请你把我输入的内容生成详细的高质量的markdown格式的思维导图{text}", 77 | }, 78 | ], 79 | 'temperature': 0.3, 80 | "max_tokens": 10000, 81 | "top_p": 1.0, 82 | } 83 | 84 | # 发送请求 85 | response = requests.post(API_url, headers=headers, json=json_data) 86 | 87 | # 打印响应内容 88 | try: 89 | output = response.json()['choices'][0]['message']['content'] 90 | print(output) 91 | return output 92 | except (KeyError, IndexError, AttributeError): 93 | print("无法获取响应内容或响应格式不正确。") 94 | return "出错啦! 请联系和push一下开发者解决问题" 95 | 96 | app = FastAPI() 97 | app.add_middleware( 98 | CORSMiddleware, 99 | allow_origins=["*"], 100 | allow_credentials=True, 101 | allow_methods=["*"], 102 | allow_headers=["*"], 103 | ) 104 | 105 | @app.post("/topics") 106 | async def upload_files( 107 | files: List[UploadFile] = File(...), 108 | typeoftopic: str = Form(...), 109 | numoftopic: str = Form(...) 110 | ): 111 | responses = [] 112 | for file in files: 113 | filename = file.filename 114 | ext = os.path.splitext(filename)[1].lower() 115 | 116 | if ext not in [".pdf", ".pptx"]: 117 | raise HTTPException(status_code=400, detail="Unsupported file type. Only PDF and PPTX files are allowed.") 118 | 119 | content = await file.read() 120 | 121 | if ext == ".pdf": 122 | extracted_text = extract_text_from_pdf(content) 123 | elif ext == ".pptx": 124 | extracted_text = extract_text_from_pptx(content) 125 | 126 | api_response = maketopics(extracted_text, typeoftopic, numoftopic) 127 | responses.append({"filename": filename, "api_response": api_response}) 128 | 129 | return {"responses": responses} 130 | 131 | @app.post("/mindmap") 132 | async def upload_files( 133 | files: List[UploadFile] = File(...), 134 | ): 135 | responses = [] 136 | for file in files: 137 | filename = file.filename 138 | ext = os.path.splitext(filename)[1].lower() 139 | 140 | if ext not in [".pdf", ".pptx"]: 141 | raise HTTPException(status_code=400, detail="Unsupported file type. Only PDF and PPTX files are allowed.") 142 | 143 | content = await file.read() 144 | 145 | if ext == ".pdf": 146 | extracted_text = extract_text_from_pdf(content) 147 | elif ext == ".pptx": 148 | extracted_text = extract_text_from_pptx(content) 149 | 150 | api_response = mindmap(extracted_text) 151 | responses.append({"filename": filename, "api_response": api_response}) 152 | 153 | return {"responses": responses} 154 | 155 | def extract_text_from_pdf(content): 156 | pdf_file = BytesIO(content) 157 | pdf_reader = PdfReader(pdf_file) 158 | text = '' 159 | for page_num in range(len(pdf_reader.pages)): 160 | page = pdf_reader.pages[page_num] 161 | text += page.extract_text() 162 | return text 163 | 164 | def extract_text_from_pptx(content): 165 | pptx_file = BytesIO(content) 166 | prs = Presentation(pptx_file) 167 | text_runs = [] 168 | for slide in prs.slides: 169 | for shape in slide.shapes: 170 | if not shape.has_text_frame: 171 | continue 172 | for paragraph in shape.text_frame.paragraphs: 173 | for run in paragraph.runs: 174 | text_runs.append(run.text) 175 | return "\n".join(text_runs) 176 | 177 | if __name__ == "__main__": 178 | import uvicorn 179 | uvicorn.run(app, host="0.0.0.0", port=8000) 180 | -------------------------------------------------------------------------------- /requirements.txt: -------------------------------------------------------------------------------- 1 | fastapi 2 | PyPDF2 3 | python-pptx 4 | requests 5 | python-dotenv --------------------------------------------------------------------------------