from fastapi import FastAPI from pydantic import BaseModel from model_loader import ModelLoader from services.text_filter import TextFilterService from services.image_ocr import ImageOCRService from typing import Optional from fastapi.responses import JSONResponse import logging logging.basicConfig( level=logging.INFO, format="%(asctime)s [%(levelname)s] %(message)s", handlers=[ logging.StreamHandler() ] ) logger = logging.getLogger(__name__) app = FastAPI() logger.info("Starting FastAPI app...") model_loader = ModelLoader() logger.info("ModelLoader initialized.") text_filter_service = TextFilterService(model_loader) logger.info("TextFilterService initialized.") image_ocr_service = ImageOCRService() logger.info("Image OCR image initialized") class InputData(BaseModel): text: Optional[str] = None image_url: Optional[str] = None @app.post("/filtercomment") async def filter_comment(input_data: InputData): logger.info("Received request: %s", input_data) final_text = "" # Case 1: Extract text from image if input_data.image_url: logger.info("Image URL provided: %s", input_data.image_url) try: logger.info("Fetching image from URL...") final_text = image_ocr_service.extract_text(input_data.image_url) logger.info("Generated text: %s", final_text) except Exception as e: logger.error("Image processing failed: %s", str(e)) return JSONResponse(status_code=400, content={"error": f"Image processing failed: {str(e)}"}) # Case 2: Use provided text elif input_data.text: logger.info("Text input provided.") final_text = input_data.text else: logger.warning("No input provided.") return JSONResponse(status_code=400, content={"error": "Either 'text' or 'image_url' must be provided."}) try: logger.info("Processing text through TextFilterService...") results = text_filter_service.process_text(final_text) results["extracted_text"] = final_text logger.info("Text filtering complete. Results: %s", results) return results except Exception as e: logger.exception("Text filtering failed.") return JSONResponse(status_code=500, content={"error": f"Text filtering failed: {str(e)}"}) if __name__ == "__main__": import uvicorn logger.info("Starting Uvicorn server...") uvicorn.run(app, host="0.0.0.0", port=3000)