Spaces:
Sleeping
Sleeping
Final Update
Browse files- app/api/main.py +30 -2
app/api/main.py
CHANGED
|
@@ -29,10 +29,16 @@ def log_prediction(query, text, sentiment, confidence):
|
|
| 29 |
writer.writerow([datetime.now(), query, text, sentiment, confidence])
|
| 30 |
|
| 31 |
# --- MODELLI DATI (Pydantic) ---
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 32 |
class AnalysisRequest(BaseModel):
|
| 33 |
-
query: str
|
| 34 |
limit: int = 5
|
| 35 |
|
|
|
|
| 36 |
class SingleResult(BaseModel):
|
| 37 |
text: str
|
| 38 |
sentiment: str
|
|
@@ -41,7 +47,7 @@ class SingleResult(BaseModel):
|
|
| 41 |
class AnalysisResponse(BaseModel):
|
| 42 |
query: str
|
| 43 |
results: List[SingleResult]
|
| 44 |
-
summary: dict
|
| 45 |
|
| 46 |
# --- ENDPOINTS ---
|
| 47 |
|
|
@@ -52,6 +58,28 @@ def health_check():
|
|
| 52 |
return {"status": "ok", "model_loaded": True}
|
| 53 |
raise HTTPException(status_code=503, detail="Model not loaded")
|
| 54 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 55 |
@app.post("/analyze", response_model=AnalysisResponse)
|
| 56 |
def analyze_company(request: AnalysisRequest):
|
| 57 |
# --- DEBUG PRINT ---
|
|
|
|
| 29 |
writer.writerow([datetime.now(), query, text, sentiment, confidence])
|
| 30 |
|
| 31 |
# --- MODELLI DATI (Pydantic) ---
|
| 32 |
+
# 1. Modello per la richiesta singola (/predict)
|
| 33 |
+
class SentimentRequest(BaseModel):
|
| 34 |
+
text: str
|
| 35 |
+
|
| 36 |
+
# 2. Modello per la richiesta complessa (/analyze)
|
| 37 |
class AnalysisRequest(BaseModel):
|
| 38 |
+
query: str
|
| 39 |
limit: int = 5
|
| 40 |
|
| 41 |
+
# 3. Modello per il risultato singolo (usato da entrambi)
|
| 42 |
class SingleResult(BaseModel):
|
| 43 |
text: str
|
| 44 |
sentiment: str
|
|
|
|
| 47 |
class AnalysisResponse(BaseModel):
|
| 48 |
query: str
|
| 49 |
results: List[SingleResult]
|
| 50 |
+
summary: dict
|
| 51 |
|
| 52 |
# --- ENDPOINTS ---
|
| 53 |
|
|
|
|
| 58 |
return {"status": "ok", "model_loaded": True}
|
| 59 |
raise HTTPException(status_code=503, detail="Model not loaded")
|
| 60 |
|
| 61 |
+
# --- ENDPOINT 1: PREVISIONE PURA (Utilizzabile per implementazioni dirette) ---
|
| 62 |
+
@app.post("/predict", response_model=SingleResult)
|
| 63 |
+
def predict_sentiment(request: SentimentRequest):
|
| 64 |
+
"""
|
| 65 |
+
Analizza un singolo testo manuale.
|
| 66 |
+
Utile per test unitari o integrazioni dirette.
|
| 67 |
+
"""
|
| 68 |
+
try:
|
| 69 |
+
sentiment, confidence = model_instance.predict(request.text)
|
| 70 |
+
|
| 71 |
+
# Logghiamo usando "MANUAL" come query per distinguerlo nel CSV
|
| 72 |
+
log_prediction("MANUAL_INPUT", request.text, sentiment, confidence)
|
| 73 |
+
|
| 74 |
+
return {
|
| 75 |
+
"text": request.text,
|
| 76 |
+
"sentiment": sentiment,
|
| 77 |
+
"confidence": confidence
|
| 78 |
+
}
|
| 79 |
+
except Exception as e:
|
| 80 |
+
raise HTTPException(status_code=500, detail=str(e))
|
| 81 |
+
|
| 82 |
+
# --- ENDPOINT 2: Scarping + AI Classification
|
| 83 |
@app.post("/analyze", response_model=AnalysisResponse)
|
| 84 |
def analyze_company(request: AnalysisRequest):
|
| 85 |
# --- DEBUG PRINT ---
|