File size: 3,239 Bytes
60e8c0a
 
 
599f4e5
60e8c0a
 
599f4e5
60e8c0a
 
 
 
 
 
 
 
 
 
599f4e5
 
60e8c0a
599f4e5
60e8c0a
599f4e5
60e8c0a
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
599f4e5
60e8c0a
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
599f4e5
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
60e8c0a
 
 
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
"""
BrainWatches Python Analysis Service
====================================
FastAPI microservice untuk analisis NLP lanjutan.

Jalankan:
    uvicorn app.main:app --host 0.0.0.0 --port 7860
"""
from fastapi import FastAPI, Header, HTTPException, Depends
from fastapi.middleware.cors import CORSMiddleware

from app.config import settings
from app.schemas import (
    SentimentRequest, SentimentResponse,
    SummarizeRequest, SummarizeResponse,
    TopicRequest, TopicResponse,
    SimilarityRequest, SimilarityResponse,
    TextItemsRequest, EmotionResponse,
    FramingResponse, FakeScoreResponse, OpinionFactResponse,
)
from app.analyzers import sentiment, topics, summary, similarity, emotion, framing, fakescore, opinionfact

app = FastAPI(title="BrainWatches Analysis Service", version="1.1.0")

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


def verify_token(x_service_token: str = Header(default="")):
    if x_service_token != settings.API_TOKEN:
        raise HTTPException(status_code=401, detail="Invalid service token")
    return True


@app.get("/health")
def health():
    return {"status": "ok", "model_mode": settings.MODEL_MODE, "version": "1.1.0"}


@app.post("/sentiment", response_model=SentimentResponse, dependencies=[Depends(verify_token)])
def sentiment_endpoint(req: SentimentRequest):
    results = sentiment.analyze_batch(req.items)
    return {"results": results, "model_mode": settings.MODEL_MODE}


@app.post("/summarize", response_model=SummarizeResponse, dependencies=[Depends(verify_token)])
def summarize_endpoint(req: SummarizeRequest):
    return summary.summarize(req.text, req.sentences)


@app.post("/topics", response_model=TopicResponse, dependencies=[Depends(verify_token)])
def topics_endpoint(req: TopicRequest):
    result = topics.discover_topics(req.items, req.num_topics)
    return {"topics": result, "model_mode": settings.MODEL_MODE}


@app.post("/similarity", response_model=SimilarityResponse, dependencies=[Depends(verify_token)])
def similarity_endpoint(req: SimilarityRequest):
    pairs = similarity.find_similar_pairs(req.items, req.threshold)
    return {"pairs": pairs}


@app.post("/emotion", response_model=EmotionResponse, dependencies=[Depends(verify_token)])
def emotion_endpoint(req: TextItemsRequest):
    results = emotion.analyze_batch(req.items)
    return {"results": results}


@app.post("/framing", response_model=FramingResponse, dependencies=[Depends(verify_token)])
def framing_endpoint(req: TextItemsRequest):
    results = framing.analyze_batch(req.items)
    return {"results": results}


@app.post("/fake-score", response_model=FakeScoreResponse, dependencies=[Depends(verify_token)])
def fake_score_endpoint(req: TextItemsRequest):
    results = fakescore.analyze_batch(req.items)
    return {"results": results}


@app.post("/opinion-fact", response_model=OpinionFactResponse, dependencies=[Depends(verify_token)])
def opinion_fact_endpoint(req: TextItemsRequest):
    results = opinionfact.analyze_batch(req.items)
    return {"results": results}


if __name__ == "__main__":
    import uvicorn
    uvicorn.run("app.main:app", host=settings.HOST, port=settings.PORT, reload=True)