from flask import Flask, render_template_string, request, jsonify
from transformers import pipeline, set_seed
import threading
# --- CONFIGURACIÓN DEL MODELO ---
# Cargamos el modelo al inicio una sola vez
print("Cargando modelo GPT-2...")
generator = pipeline('text-generation', model='openai-community/gpt2')
set_seed(42)
print("Modelo cargado.")
app = Flask(__name__)
# --- PLANTILLA HTML/CSS/JS (Incrustada para tener un solo archivo manejable) ---
# Esto define la interfaz visual completa
HTML_TEMPLATE = """
GPT-2 Chat Clone
GPT-2
Examples
"Explain quantum computing in simple terms"
"Got any creative ideas for a 10 year old’s birthday?"
Capabilities
Remembers what user said earlier in the conversation
Allows user to provide follow-up corrections
Limitations
May occasionally generate incorrect information
Limited knowledge of world and events after 2021
"""
# --- RUTAS FLASK ---
@app.route('/')
def home():
return render_template_string(HTML_TEMPLATE)
@app.route('/generate', methods=['POST'])
def generate():
data = request.json
prompt_text = data.get('prompt', '')
if not prompt_text:
return jsonify({'response': 'Please write something.'})
try:
# Generar texto con GPT-2
# max_length es dinámico para no tardar una eternidad
input_len = len(prompt_text.split())
response = generator(
prompt_text,
max_length=input_len + 60, # Genera unas 60 palabras
num_return_sequences=1,
pad_token_id=50256,
no_repeat_ngram_size=2,
temperature=0.7,
top_k=50,
top_p=0.95
)
full_text = response[0]['generated_text']
# Limpieza básica: Quitamos el prompt original para simular un chat
# (Opcional, GPT-2 no es un modelo de chat instruccional, así que a veces ayuda ver todo)
bot_response = full_text.replace(prompt_text, "", 1).strip()
if not bot_response:
bot_response = "..."
return jsonify({'response': bot_response})
except Exception as e:
return jsonify({'response': f"Error: {str(e)}"})
# Configuración necesaria para Hugging Face Spaces
if __name__ == '__main__':
app.run(host='0.0.0.0', port=7860)