analisisNews / app /main.py
ahmadsayadi's picture
feat: add keywords extraction, NER, project digest endpoints
f39a9fa
Raw
History Blame Contribute Delete
4.06 kB
"""
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,
KeywordsResponse, NerResponse, DigestRequest, DigestResponse,
)
from app.analyzers import sentiment, topics, summary, similarity, emotion, framing, fakescore, opinionfact
from app.analyzers import keywords as kw_module, ner as ner_module, digest as digest_module
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}
@app.post("/keywords", response_model=KeywordsResponse, dependencies=[Depends(verify_token)])
def keywords_endpoint(req: TextItemsRequest):
results = kw_module.extract_keywords_batch(req.items)
return {"results": results}
@app.post("/ner", response_model=NerResponse, dependencies=[Depends(verify_token)])
def ner_endpoint(req: TextItemsRequest):
results = ner_module.extract_batch(req.items)
return {"results": results}
@app.post("/digest", response_model=DigestResponse, dependencies=[Depends(verify_token)])
def digest_endpoint(req: DigestRequest):
result = digest_module.generate_digest(req.items, req.project_name)
return result
if __name__ == "__main__":
import uvicorn
uvicorn.run("app.main:app", host=settings.HOST, port=settings.PORT, reload=True)