File size: 4,543 Bytes
e8a3ff1
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
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://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

@app.route('/chat', methods=['POST'])
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