import logging from typing import List from fastapi import FastAPI, File, UploadFile, HTTPException from pydantic import BaseModel # Настройка логгера logging.basicConfig(level=logging.INFO) logger = logging.getLogger(__name__) app = FastAPI(title="RMSER OCR Service") # DTO ответа (должно совпадать с Go-структурой RecognizedItem) class RecognizedItem(BaseModel): raw_name: str amount: float price: float sum: float class RecognitionResult(BaseModel): items: List[RecognizedItem] @app.get("/health") def health_check(): return {"status": "ok"} @app.post("/recognize", response_model=RecognitionResult) async def recognize_receipt(image: UploadFile = File(...)): """ Принимает изображение, 'распознает' его (пока заглушка) и возвращает список позиций. """ logger.info(f"Received file: {image.filename}, content_type: {image.content_type}") if not image.content_type.startswith("image/"): raise HTTPException(status_code=400, detail="File must be an image") # Читаем байты (имитация обработки) content = await image.read() logger.info(f"Read {len(content)} bytes") # --- ЗАГЛУШКА (MOCK) --- # Здесь в будущем будет вызов нейросети/Tesseract. # Пока возвращаем хардкод, чтобы проверить интеграцию с Go. mock_items = [ RecognizedItem( raw_name="Молоко Петмол 3.2", # Это мы потом свяжем с реальным молоком amount=5.0, price=100.0, sum=500.0 ), RecognizedItem( raw_name="Хлеб Бородинский", # Этого, возможно, нет в базе (проверим обработку неизвестных) amount=2.0, price=45.50, sum=91.0 ), RecognizedItem( raw_name="НЕИЗВЕСТНЫЙ ТОВАР 123", amount=1.0, price=1000.0, sum=1000.0 ) ] # ----------------------- return RecognitionResult(items=mock_items) if __name__ == "__main__": import uvicorn # Запуск: python main.py uvicorn.run(app, host="0.0.0.0", port=5000)