necesito que esto sea con fastapi:

from flask import Flask, request, jsonify
import requests
from flask_cors import CORS
import os
import logging
from requests.exceptions import HTTPError, Timeout, RequestException

app = Flask(__name__)
CORS(app)  # Permitir CORS para que el frontend pueda comunicarse con el backend

# Configuración de la API de Hugging Face
HUGGINGFACE_API_URL = "Qwen/Qwen2.5-Math-RM-72B"
HUGGINGFACE_API_TOKEN = os.getenv("HUGGINGFACE_API_TOKEN")

if not HUGGINGFACE_API_TOKEN:
    raise ValueError("HUGGINGFACE_API_TOKEN no está configurado en las variables de entorno.")

headers = {
    "Authorization": f"Bearer {HUGGINGFACE_API_TOKEN}"
}

# Configurar logging
logging.basicConfig(level=logging.INFO)
logger = logging.getLogger(__name__)

@app.route('/api/query', methods=['POST'])
def query():
    data = request.json
    user_question = data.get('question', '').strip()

    if not user_question:
        logger.error("No se proporcionó una pregunta.")
        return jsonify({"error": "No se proporcionó una pregunta."}), 400

    # Construir el prompt con el template deseado
    prompt = f"Please reason step by step, and put your final answer within \\boxed{{}}.\n\n{user_question}"

    payload = {
        "inputs": prompt,
        "parameters": {
            "max_new_tokens": 256,
            "temperature": 0.7,
            "top_p": 0.9,
            "do_sample": True,
            "num_return_sequences": 1
        }
    }

    try:
        response = requests.post(
            HUGGINGFACE_API_URL,
            headers=headers,
            json=payload,
            timeout=60  # Timeout en segundos
        )

        response.raise_for_status()  # Lanzar excepción para códigos de estado 4xx/5xx

        response_data = response.json()

        # Manejar diferentes estructuras de respuesta
        if isinstance(response_data, list) and len(response_data) > 0:
            generated_text = response_data[0].get('generated_text', '')
        elif isinstance(response_data, dict):
            generated_text = response_data.get('generated_text', '')
        else:
            generated_text = ''

        if not generated_text:
            logger.error("No se recibió texto generado en la respuesta.")
            return jsonify({"error": "No se recibió texto generado en la respuesta."}), 500

        logger.info("Respuesta generada exitosamente.")
        return jsonify({"response": generated_text})

    except HTTPError as http_err:
        logger.error(f"HTTP error occurred: {http_err} - Response: {response.text}")
        return jsonify({"error": f"HTTP error occurred: {http_err}"}), response.status_code
    except Timeout as timeout_err:
        logger.error(f"Timeout error occurred: {timeout_err}")
        return jsonify({"error": "La solicitud a la API de Hugging Face excedió el tiempo de espera."}), 504
    except RequestException as req_err:
        logger.error(f"Request exception occurred: {req_err}")
        return jsonify({"error": "Ocurrió un error al comunicarse con la API de Hugging Face."}), 500
    except ValueError as val_err:
        logger.error(f"Value error: {val_err}")
        return jsonify({"error": "Error en el formato de la respuesta de la API."}), 500
    except Exception as e:
        logger.error(f"Excepción desconocida: {str(e)}")
        return jsonify({"error": "Ocurrió un error inesperado."}), 500

if __name__ == '__main__':
    app.run(host='0.0.0.0', port=5000)