# 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) from flask import Flask, request, jsonify,Response from model_loader import ModelLoader from services.text_filter import TextFilterService from services.image_ocr import ImageOCRService import logging import os import json # Set Hugging Face cache directory os.environ["HF_HOME"] = "/app/cache" # Logging setup logging.basicConfig( level=logging.INFO, format="%(asctime)s [%(levelname)s] %(message)s" ) logger = logging.getLogger(__name__) app = Flask(__name__) logger.info("Starting Flask app...") # Load model and services model_loader = ModelLoader() logger.info("ModelLoader initialized.") text_filter_service = TextFilterService(model_loader) logger.info("TextFilterService initialized.") image_ocr_service = ImageOCRService() logger.info("ImageOCRService initialized.") @app.route("/filtercomment", methods=["POST"]) def filter_comment(): data = request.get_json() logger.info("Received request: %s", data) text = data.get("text") image_url = data.get("image_url") final_text = "" if image_url: logger.info("Image URL provided: %s", image_url) try: final_text = image_ocr_service.extract_text(image_url) logger.info("Generated text: %s", final_text) except Exception as e: logger.error("Image processing failed: %s", str(e)) return jsonify({"error": f"Image processing failed: {str(e)}"}), 400 elif text: final_text = text else: logger.warning("No input provided.") return jsonify({"error": "Either 'text' or 'image_url' must be provided."}), 400 try: results = text_filter_service.process_text(final_text) results["extracted_text"] = final_text logger.info("Text filtering complete. Results: %s", results) # Ensure results dict is JSON serializable safe_results = { k: float(v) if isinstance(v, (float, int)) or hasattr(v, "item") else v for k, v in results.items() } safe_results["extracted_text"] = final_text logger.info("Returning response now...") return Response(json.dumps(safe_results), mimetype="application/json") except Exception as e: logger.exception("Text filtering failed.") return jsonify({"error": f"Text filtering failed: {str(e)}"}), 500 if __name__ == "__main__": app.run(host="0.0.0.0", port=7860)