Spaces:
Runtime error
Runtime error
| import os | |
| from flask import Flask, request, jsonify | |
| from flask_cors import CORS | |
| import requests | |
| from transformers import AutoTokenizer | |
| app = Flask(__name__) | |
| CORS(app) # Esto es crucial para permitir peticiones desde tu index.html en GitHub Pages | |
| # --- Configuración de la API de Hugging Face --- | |
| # Es VITAL que este token NO esté aquí directamente en un repo público. | |
| # Lo obtendremos de las variables de entorno en Hugging Face Spaces. | |
| HUGGINGFACE_API_TOKEN = os.getenv("HF_API_TOKEN") | |
| # URL del modelo de inferencia de Hugging Face. | |
| # Usa el modelo Falcon-H1-1.5B-Deep-Instruct que te interesa. | |
| HUGGINGFACE_API_URL = "https://huggingface.co/proxy/api-inference.huggingface.co/models/tiiuae/Falcon-H1-1.5B-Deep-Instruct" | |
| # Inicializa el tokenizador (solo para formatear el chat, no para cargar el modelo completo) | |
| try: | |
| tokenizer = AutoTokenizer.from_pretrained("tiiuae/Falcon-H1-1.5B-Deep-Instruct") | |
| except Exception as e: | |
| print(f"Error al inicializar el tokenizador: {e}") | |
| tokenizer = None # En caso de error, el tokenizer será None | |
| def chat(): | |
| if not HUGGINGFACE_API_TOKEN: | |
| return jsonify({"error": "Hugging Face API token no configurado."}), 500 | |
| user_message = request.json.get('message') | |
| conversation_history = request.json.get('history', []) | |
| if not user_message: | |
| return jsonify({"error": "Mensaje no proporcionado"}), 400 | |
| # Personalidad de Amside AI (System Prompt) | |
| system_message = ( | |
| "Eres Amside AI, una inteligencia artificial creada por Hodelygil. " | |
| "Tu propósito principal es asistir en el estudio y el aprendizaje, " | |
| "proporcionando información y explicaciones detalladas. " | |
| "Sin embargo, también eres amigable y puedes mantener conversaciones informales y agradables. " | |
| "Responde de manera informativa y útil, pero con un tono conversacional." | |
| ) | |
| # Formatear el historial de conversación para el modelo | |
| messages = [{"role": "system", "content": system_message}] | |
| for human_msg, ai_msg in conversation_history: | |
| messages.append({"role": "user", "content": human_msg}) | |
| messages.append({"role": "assistant", "content": ai_msg}) | |
| messages.append({"role": "user", "content": user_message}) | |
| # Usar el tokenizador para aplicar la plantilla de chat | |
| # Esto es vital para que el modelo entienda el formato del diálogo. | |
| if tokenizer: | |
| formatted_input = tokenizer.apply_chat_template(messages, tokenize=False, add_generation_prompt=True) | |
| else: | |
| # Fallback simple si el tokenizer no pudo inicializarse | |
| formatted_input = "\n".join([f"{m['role']}: {m['content']}" for m in messages]) + "\nassistant:" | |
| # Datos a enviar a la API de Hugging Face | |
| payload = { | |
| "inputs": formatted_input, | |
| "parameters": { | |
| "max_new_tokens": 500, | |
| "do_sample": True, | |
| "temperature": 0.7, | |
| "top_p": 0.9, | |
| "repetition_penalty": 1.1, | |
| "return_full_text": False # Para que solo devuelva la respuesta del modelo | |
| } | |
| } | |
| headers = { | |
| "Authorization": f"Bearer {HUGGINGFACE_API_TOKEN}" | |
| } | |
| try: | |
| response = requests.post(HUGGINGFACE_API_URL, headers=headers, json=payload) | |
| response.raise_for_status() # Lanza una excepción si la petición HTTP falla (4xx o 5xx) | |
| result = response.json() | |
| # La respuesta de la API es una lista de diccionarios, y el texto está en 'generated_text' | |
| generated_text = result[0].get("generated_text", "No se pudo generar respuesta.") | |
| return jsonify({"response": generated_text}) | |
| except requests.exceptions.RequestException as e: | |
| print(f"Error al llamar a la API de Hugging Face: {e}") | |
| return jsonify({"error": f"Error al comunicarse con la API de IA: {e}"}), 500 | |
| except IndexError: # Si result está vacío | |
| return jsonify({"error": "La API de IA devolvió una respuesta inesperada o vacía."}), 500 | |
| except Exception as e: | |
| print(f"Error inesperado: {e}") | |
| return jsonify({"error": f"Error inesperado en el servidor: {e}"}), 500 | |
| if __name__ == '__main__': | |
| # En Hugging Face Spaces, la app se ejecuta con un servidor Gunicorn/Uvicorn, | |
| # así que esta parte solo es útil para pruebas locales. | |
| # app.run(host='0.0.0.0', port=5000, debug=True) | |
| pass # No hacemos un app.run() aquí para que Spaces lo maneje correctamente |