""" 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)