Paresh1879's picture
Upload API Server File
44ad3d0 verified
raw
history blame contribute delete
No virus
2.57 kB
import requests
import io
import logging
from PIL import Image
from flask import Flask, request, jsonify, send_file
from functools import wraps
from requests.adapters import HTTPAdapter
from requests.packages.urllib3.util.retry import Retry
API_URL = "https://api-inference.huggingface.co/models/Paresh1879/stable-diffusion-xl-thumbsup-extend"
API_KEY = "your-api-key"
app = Flask(__name__)
# Storage for API key usage counts
api_key_usage = {}
logging.basicConfig(level=logging.INFO)
logger = logging.getLogger(__name__)
# Configure HTTP Session with Retry Logic
session = requests.Session()
retry = Retry(
total=10,
backoff_factor=2,
status_forcelist=[429, 500, 502, 503, 504],
allowed_methods=["HEAD", "GET", "OPTIONS", "POST"]
)
adapter = HTTPAdapter(max_retries=retry)
session.mount("http://", adapter)
session.mount("https://", adapter)
def query(payload):
try:
response = session.post(API_URL, headers={"Authorization": f"Bearer {API_KEY}"}, json=payload)
response.raise_for_status()
return response.content
except requests.exceptions.RequestException as e:
logger.error(f"Request failed: {e}")
raise
# checking api_key
def require_api_key(f):
@wraps(f)
def check_api_key(*args, **kwargs):
api_key = request.headers.get('Authorization')
if api_key != f"Bearer {API_KEY}":
return jsonify({"error": "Unauthorized"}), 401
if api_key not in api_key_usage:
api_key_usage[api_key] = 0
api_key_usage[api_key] += 1
return f(*args, **kwargs)
return check_api_key
# /generate_image endpoint
@app.route('/generate_image', methods=['POST'])
@require_api_key
def generate_image():
prompt = request.json.get('prompt')
if not prompt:
return jsonify({"error": "Missing prompt"}), 400
try:
image_bytes = query({"inputs": prompt})
image = Image.open(io.BytesIO(image_bytes))
img_io = io.BytesIO()
image.save(img_io, 'PNG')
img_io.seek(0)
return send_file(img_io, mimetype='image/png')
except requests.exceptions.RequestException as e:
return jsonify({"error": "Service is temporarily unavailable. Please try again later."}), 503
# api_key_usage endpoint
@app.route('/api_key_usage', methods=['GET'])
@require_api_key
def get_api_key_usage():
api_key = request.headers.get('Authorization')
usage_count = api_key_usage.get(api_key, 0)
return jsonify({"usage_count": usage_count})
if __name__ == '__main__':
app.run(debug=True)