File size: 4,388 Bytes
672778d
e280c8a
5053036
 
e280c8a
5053036
 
672778d
5053036
672778d
5053036
 
 
 
 
 
 
 
 
 
e280c8a
 
 
 
 
 
 
 
29787d2
 
672778d
 
29787d2
5053036
 
 
 
 
 
 
 
 
 
 
 
672778d
5053036
 
 
 
7b67b3d
5053036
7b67b3d
 
 
57d0c46
 
 
5053036
 
672778d
5053036
672778d
5053036
672778d
 
5053036
 
672778d
5053036
672778d
5053036
7b67b3d
672778d
7b67b3d
 
 
5053036
672778d
5053036
45710cd
29787d2
 
45710cd
29787d2
 
45710cd
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
29787d2
45710cd
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
from fastapi import FastAPI, Request, Header, HTTPException
from fastapi.responses import HTMLResponse, JSONResponse
from fastapi.openapi.utils import get_openapi
from fastapi.openapi.docs import get_swagger_ui_html
from fastapi.middleware.cors import CORSMiddleware
from pydantic import BaseModel
from transformers import pipeline
import os, logging, traceback
from model import summarize_review, smart_summarize
from typing import Optional, List

app = FastAPI(
    title="🧠 NeuroPulse AI",
    description="Multilingual GenAI for smarter feedback β€” summarization, sentiment, emotion, aspects, Q&A and tags.",
    version="2025.1.0",
    openapi_url="/openapi.json",
    docs_url=None,
    redoc_url="/redoc"
)

app.add_middleware(
    CORSMiddleware,
    allow_origins=["*"],
    allow_credentials=True,
    allow_methods=["*"],
    allow_headers=["*"],
)

@app.exception_handler(Exception)
async def exception_handler(request: Request, exc: Exception):
    logging.error(f"Unhandled Exception: {traceback.format_exc()}")
    return JSONResponse(status_code=500, content={"detail": "Internal Server Error. Please contact support."})

@app.get("/docs", include_in_schema=False)
def custom_swagger_ui():
    return get_swagger_ui_html(
        openapi_url=app.openapi_url,
        title="🧠 Swagger UI - NeuroPulse AI",
        swagger_favicon_url="https://cdn-icons-png.flaticon.com/512/3794/3794616.png",
        swagger_js_url="https://cdn.jsdelivr.net/npm/[email protected]/swagger-ui-bundle.js",
        swagger_css_url="https://cdn.jsdelivr.net/npm/[email protected]/swagger-ui.css",
    )

@app.get("/", response_class=HTMLResponse)
def root():
    return "<h1>NeuroPulse AI Backend is Running</h1>"

class ReviewInput(BaseModel):
    text: str
    model: str = "distilbert-base-uncased-finetuned-sst-2-english"
    industry: Optional[str] = None
    aspects: bool = False
    follow_up: Optional[str] = None
    product_category: Optional[str] = None
    device: Optional[str] = None
    intelligence: Optional[bool] = False
    verbosity: Optional[str] = "detailed"
    explain: Optional[bool] = False

class BulkReviewInput(BaseModel):
    reviews: List[str]
    model: str = "distilbert-base-uncased-finetuned-sst-2-english"
    industry: Optional[List[str]] = None
    aspects: bool = False
    product_category: Optional[List[str]] = None
    device: Optional[List[str]] = None

VALID_API_KEY = "my-secret-key"
logging.basicConfig(level=logging.INFO)

sentiment_pipeline = pipeline("sentiment-analysis")

def auto_fill(value: Optional[str], default: str = "Generic") -> str:
    if not value or value.lower() == "auto-detect":
        return default
    return value

@app.post("/analyze/")
async def analyze(data: ReviewInput, x_api_key: str = Header(None)):
    if x_api_key != VALID_API_KEY:
        raise HTTPException(status_code=401, detail="❌ Unauthorized: Invalid API key")

    if len(data.text.split()) < 10:
        raise HTTPException(status_code=400, detail="⚠️ Review too short for analysis (min. 10 words).")

    try:
        # Summary Generation
        try:
            summary = smart_summarize(data.text) if data.intelligence else summarize_review(data.text)
        except Exception as e:
            logging.error(f"πŸ” Summarization error: {traceback.format_exc()}")
            raise HTTPException(status_code=500, detail="🧠 Failed to generate summary. Please try again.")

        # Sentiment Analysis
        try:
            sentiment = sentiment_pipeline(data.text)[0]
        except Exception as e:
            logging.error(f"πŸ“Š Sentiment analysis error: {traceback.format_exc()}")
            raise HTTPException(status_code=500, detail="πŸ“‰ Sentiment analysis failed. Please retry.")

        # (Optional future: plug in emotion model)
        emotion = "joy"  # hardcoded placeholder

        return {
            "summary": summary,
            "sentiment": sentiment,
            "emotion": emotion,
            "product_category": auto_fill(data.product_category),
            "device": auto_fill(data.device, "Web"),
            "industry": auto_fill(data.industry)
        }

    except Exception as e:
        logging.error(f"πŸ”₯ Unexpected analysis failure: {traceback.format_exc()}")
        raise HTTPException(status_code=500, detail="Internal Server Error during analysis. Please contact support.")