SamiKLN commited on
Commit
ab409a5
·
verified ·
1 Parent(s): 213f424

Update main.py

Browse files
Files changed (1) hide show
  1. main.py +51 -13
main.py CHANGED
@@ -3,21 +3,26 @@ import uuid
3
  import logging
4
  from pathlib import Path
5
  from typing import List, Optional
6
- from fastapi import FastAPI, UploadFile, File, Form, HTTPException, Request
7
  from fastapi.staticfiles import StaticFiles
8
- from fastapi.responses import HTMLResponse, JSONResponse, FileResponse
9
  from fastapi.middleware.cors import CORSMiddleware
10
  from pydantic import BaseModel
11
  from huggingface_hub import InferenceClient
12
  import fitz # PyMuPDF
13
- from PIL import Image
14
- import io
15
  import pandas as pd
16
  from docx import Document
17
  from pptx import Presentation
18
 
19
  # Configuration du logging
20
- logging.basicConfig(level=logging.INFO)
 
 
 
 
 
 
 
21
  logger = logging.getLogger(__name__)
22
 
23
  # Initialisation de l'application FastAPI
@@ -27,6 +32,7 @@ app = FastAPI()
27
  app.add_middleware(
28
  CORSMiddleware,
29
  allow_origins=["*"],
 
30
  allow_methods=["*"],
31
  allow_headers=["*"],
32
  )
@@ -37,13 +43,13 @@ UPLOAD_FOLDER = BASE_DIR / "uploads"
37
  os.makedirs(UPLOAD_FOLDER, exist_ok=True)
38
 
39
  # Configuration des modèles Hugging Face
40
- HF_TOKEN = os.getenv("HF_TOKEN", "votre_token_ici") # Remplacez par votre vrai token
41
  client = InferenceClient(token=HF_TOKEN)
42
 
43
  MODELS = {
44
  "summary": "facebook/bart-large-cnn",
45
  "caption": "Salesforce/blip-image-captioning-large",
46
- "qa": "mistralai/Mistral-7B-Instruct-v0.2" # Modèle adapté et performant
47
  }
48
 
49
  # Modèles Pydantic
@@ -65,7 +71,33 @@ class QARequest(BaseModel):
65
  file_id: Optional[str] = None
66
  question: str
67
 
68
- # Fonctions utilitaires (conservées identiques)
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
69
  def extract_text_from_pdf(file_path: str) -> str:
70
  try:
71
  doc = fitz.open(file_path)
@@ -133,7 +165,7 @@ async def process_uploaded_file(file: UploadFile) -> FileInfo:
133
  extracted_text=text if text else None
134
  )
135
 
136
- # Endpoints
137
  @app.post("/api/upload")
138
  async def upload_files(files: List[UploadFile] = File(...)):
139
  try:
@@ -205,7 +237,6 @@ async def answer_question(request: QARequest):
205
  with open(file_path, "r", encoding="utf-8") as f:
206
  context = f.read()
207
 
208
- # Format du prompt spécifique pour Mistral
209
  prompt = f"""<s>[INST] Vous êtes un assistant IA expert. Répondez en français.
210
  Contexte: {context[:3000]}
211
  Question: {request.question}
@@ -218,15 +249,22 @@ Fournissez une réponse précise et concise. [/INST]"""
218
  temperature=0.7
219
  )
220
 
221
- # Nettoyage de la réponse
222
  clean_response = response.split("[/INST]")[-1].strip()
223
  return {"answer": clean_response}
224
  except Exception as e:
225
  logger.error(f"QA error: {e}")
226
  raise HTTPException(500, f"Erreur de réponse: {str(e)}")
227
 
228
- # ... (le reste de votre code reste inchangé)
 
229
 
230
  if __name__ == "__main__":
231
  import uvicorn
232
- uvicorn.run("main:app", host="0.0.0.0", port=8000, reload=True)
 
 
 
 
 
 
 
 
3
  import logging
4
  from pathlib import Path
5
  from typing import List, Optional
6
+ from fastapi import FastAPI, UploadFile, File, HTTPException, Request
7
  from fastapi.staticfiles import StaticFiles
8
+ from fastapi.responses import JSONResponse, FileResponse, HTMLResponse
9
  from fastapi.middleware.cors import CORSMiddleware
10
  from pydantic import BaseModel
11
  from huggingface_hub import InferenceClient
12
  import fitz # PyMuPDF
 
 
13
  import pandas as pd
14
  from docx import Document
15
  from pptx import Presentation
16
 
17
  # Configuration du logging
18
+ logging.basicConfig(
19
+ level=logging.INFO,
20
+ format='%(asctime)s - %(name)s - %(levelname)s - %(message)s',
21
+ handlers=[
22
+ logging.FileHandler("app.log"),
23
+ logging.StreamHandler()
24
+ ]
25
+ )
26
  logger = logging.getLogger(__name__)
27
 
28
  # Initialisation de l'application FastAPI
 
32
  app.add_middleware(
33
  CORSMiddleware,
34
  allow_origins=["*"],
35
+ allow_credentials=True,
36
  allow_methods=["*"],
37
  allow_headers=["*"],
38
  )
 
43
  os.makedirs(UPLOAD_FOLDER, exist_ok=True)
44
 
45
  # Configuration des modèles Hugging Face
46
+ HF_TOKEN = os.getenv("HF_TOKEN", "votre_token_ici")
47
  client = InferenceClient(token=HF_TOKEN)
48
 
49
  MODELS = {
50
  "summary": "facebook/bart-large-cnn",
51
  "caption": "Salesforce/blip-image-captioning-large",
52
+ "qa": "mistralai/Mistral-7B-Instruct-v0.2"
53
  }
54
 
55
  # Modèles Pydantic
 
71
  file_id: Optional[str] = None
72
  question: str
73
 
74
+ # Middleware pour gérer les 404
75
+ @app.middleware("http")
76
+ async def catch_404(request: Request, call_next):
77
+ response = await call_next(request)
78
+ if response.status_code == 404:
79
+ return JSONResponse(
80
+ status_code=404,
81
+ content={"detail": "Endpoint non trouvé"},
82
+ headers={"X-Custom-Header": "404-handled"}
83
+ )
84
+ return response
85
+
86
+ # Routes de base
87
+ @app.get("/")
88
+ async def read_root():
89
+ return {"message": "Bienvenue sur l'API de traitement de documents"}
90
+
91
+ @app.get("/logs")
92
+ async def get_logs():
93
+ """Endpoint pour récupérer les logs"""
94
+ try:
95
+ with open("app.log", "r") as f:
96
+ return {"logs": f.read()}
97
+ except FileNotFoundError:
98
+ raise HTTPException(404, "Aucun log disponible")
99
+
100
+ # Fonctions utilitaires (identique à votre version originale)
101
  def extract_text_from_pdf(file_path: str) -> str:
102
  try:
103
  doc = fitz.open(file_path)
 
165
  extracted_text=text if text else None
166
  )
167
 
168
+ # Endpoints fonctionnels
169
  @app.post("/api/upload")
170
  async def upload_files(files: List[UploadFile] = File(...)):
171
  try:
 
237
  with open(file_path, "r", encoding="utf-8") as f:
238
  context = f.read()
239
 
 
240
  prompt = f"""<s>[INST] Vous êtes un assistant IA expert. Répondez en français.
241
  Contexte: {context[:3000]}
242
  Question: {request.question}
 
249
  temperature=0.7
250
  )
251
 
 
252
  clean_response = response.split("[/INST]")[-1].strip()
253
  return {"answer": clean_response}
254
  except Exception as e:
255
  logger.error(f"QA error: {e}")
256
  raise HTTPException(500, f"Erreur de réponse: {str(e)}")
257
 
258
+ # Montage des fichiers statiques
259
+ app.mount("/static", StaticFiles(directory="static"), name="static")
260
 
261
  if __name__ == "__main__":
262
  import uvicorn
263
+ uvicorn.run(
264
+ "main:app",
265
+ host="0.0.0.0",
266
+ port=8000,
267
+ reload=True,
268
+ workers=4,
269
+ log_config="log.ini"
270
+ )