Spaces:
Sleeping
Sleeping
import os | |
import json | |
from flask import Flask, render_template, request, jsonify, redirect, url_for | |
from werkzeug.utils import secure_filename | |
from huggingface_hub import InferenceClient | |
import pandas as pd | |
import docx | |
from PyPDF2 import PdfReader | |
app = Flask(__name__) | |
# Set up file upload configurations | |
UPLOAD_FOLDER = "uploads" | |
app.config["UPLOAD_FOLDER"] = UPLOAD_FOLDER | |
ALLOWED_EXTENSIONS = {"txt", "csv", "json", "pdf", "docx"} | |
# Retrieve Hugging Face API key securely from environment variables | |
api_key = os.getenv("HF_API_KEY") | |
if not api_key: | |
raise ValueError("Hugging Face API key not found. Set 'HF_API_KEY' in your Space secrets.") | |
# Initialize Hugging Face Inference Client | |
client = InferenceClient(api_key=api_key) | |
# Function to check allowed file types | |
def allowed_file(filename): | |
return '.' in filename and filename.rsplit('.', 1)[1].lower() in ALLOWED_EXTENSIONS | |
# Function to read uploaded files and extract content | |
def extract_file_content(filepath, file_type): | |
content = "" | |
try: | |
if file_type == "txt": | |
with open(filepath, "r", encoding="utf-8") as file: | |
content = file.read() | |
elif file_type == "csv": | |
df = pd.read_csv(filepath) | |
content = df.to_string() | |
elif file_type == "json": | |
with open(filepath, "r", encoding="utf-8") as file: | |
content = json.dumps(json.load(file), indent=4) | |
elif file_type == "pdf": | |
reader = PdfReader(filepath) | |
content = "".join(page.extract_text() for page in reader.pages) | |
elif file_type == "docx": | |
doc = docx.Document(filepath) | |
content = "\n".join(paragraph.text for paragraph in doc.paragraphs) | |
except Exception as e: | |
raise ValueError(f"Error extracting file content: {e}") | |
return content | |
# Function to send content to Hugging Face model | |
def get_bot_response(prompt): | |
try: | |
response = client.text_generation( | |
prompt=prompt, | |
model="Qwen/Qwen2.5-Coder-32B-Instruct", | |
max_tokens=500 | |
) | |
return response | |
except Exception as e: | |
return f"Error in model response: {e}" | |
# Route: Home Page (File Upload Form) | |
def upload_file(): | |
if request.method == "POST": | |
# Check if file is uploaded | |
if "file" not in request.files: | |
return jsonify({"error": "No file part"}), 400 | |
file = request.files["file"] | |
if file.filename == "": | |
return jsonify({"error": "No selected file"}), 400 | |
if file and allowed_file(file.filename): | |
filename = secure_filename(file.filename) | |
filepath = os.path.join(app.config["UPLOAD_FOLDER"], filename) | |
os.makedirs(app.config["UPLOAD_FOLDER"], exist_ok=True) | |
file.save(filepath) | |
# Extract file content | |
file_type = filename.rsplit(".", 1)[1].lower() | |
try: | |
content = extract_file_content(filepath, file_type) | |
except Exception as e: | |
return jsonify({"error": str(e)}), 500 | |
# Send content to Hugging Face model | |
response = get_bot_response(content) | |
return jsonify({"response": response}) | |
else: | |
return jsonify({"error": "File type not allowed"}), 400 | |
return render_template("upload.html") | |
# Route: Retrieve Model Response (API Endpoint) | |
def generate_response(): | |
data = request.get_json() | |
prompt = data.get("prompt") | |
if not prompt: | |
return jsonify({"error": "No prompt provided"}), 400 | |
# Send prompt to Hugging Face model | |
response = get_bot_response(prompt) | |
return jsonify({"response": response}) | |
if __name__ == "__main__": | |
app.run(debug=True) | |