Spaces:
Sleeping
Sleeping
| import os | |
| import io | |
| import json | |
| import hashlib | |
| from datetime import datetime | |
| from PIL import Image | |
| from flask import Flask, request, jsonify | |
| from flask_cors import CORS | |
| import google.generativeai as genai | |
| app = Flask(__name__) | |
| CORS(app) # Enable CORS for all routes | |
| # Use the Gemini API key from the environment, or set it here for testing. | |
| api_key = os.environ.get('Gemini', 'YOUR_GEMINI_API_KEY') | |
| def configure_gemini(api_key): | |
| genai.configure(api_key=api_key) | |
| return genai.GenerativeModel('gemini-2.0-flash-thinking-exp') | |
| def process_receipt(model, image): | |
| prompt = ( | |
| "Analyze this image and determine if it's a receipt. If it is a receipt, extract:\n" | |
| " - Total amount (as float)\n" | |
| " - List of items purchased (array of strings)\n" | |
| " - Date of transaction (DD/MM/YYYY format)\n" | |
| " - Receipt number (as string)\n" | |
| "Return JSON format with keys: is_receipt (boolean), total, items, date, receipt_number.\n" | |
| "If not a receipt, return {\"is_receipt\": false}" | |
| ) | |
| response = model.generate_content([prompt, image]) | |
| return response.text | |
| def process_receipt_endpoint(): | |
| try: | |
| if 'receipt' not in request.files: | |
| return jsonify({'error': 'No file uploaded'}), 400 | |
| file = request.files['receipt'] | |
| if file.filename == '': | |
| return jsonify({'error': 'No file selected'}), 400 | |
| # Read file bytes and compute a hash (for duplicate checking or logging) | |
| image_bytes = file.read() | |
| file_hash = hashlib.md5(image_bytes).hexdigest() | |
| # Open the image using Pillow | |
| image = Image.open(io.BytesIO(image_bytes)) | |
| # Configure Gemini and process the receipt image | |
| model = configure_gemini(api_key) | |
| result_text = process_receipt(model, image) | |
| # Attempt to extract JSON from the response text | |
| json_start = result_text.find('{') | |
| json_end = result_text.rfind('}') | |
| if json_start == -1 or json_end == -1: | |
| return jsonify({'error': 'Invalid response format', 'raw': result_text}), 500 | |
| json_str = result_text[json_start:json_end+1] | |
| # Clean up any markdown formatting if necessary | |
| json_str = json_str.replace('```json', '').replace('```', '') | |
| data = json.loads(json_str) | |
| # Optionally, add metadata to the response | |
| data['file_hash'] = file_hash | |
| data['timestamp'] = datetime.now().isoformat() | |
| return jsonify(data) | |
| except Exception as e: | |
| return jsonify({'error': str(e)}), 500 | |
| if __name__ == '__main__': | |
| # The server listens on all interfaces at port 7860. | |
| app.run(debug=True, host="0.0.0.0", port=7860) | |