Spaces:
Running
Running
# 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 flask_cors import CORS | |
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...") | |
CORS(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.") | |
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) | |