Spaces:
Sleeping
Sleeping
Perplexity LABS
Browse files- README.md +94 -7
- app.py +118 -124
- exported-assets/.gitignore +0 -51
- exported-assets/CHECKLIST.md +0 -243
- exported-assets/DEPLOYMENT_GUIDE.md +0 -174
- exported-assets/EXAMPLES.md +0 -432
- exported-assets/FINAL_SUMMARY.txt +0 -205
- exported-assets/README.md +0 -179
- exported-assets/SUMMARY.txt +0 -130
- exported-assets/app.py +0 -196
- exported-assets/requirements.txt +0 -4
- exported-assets/script.py +0 -208
- exported-assets/script_1.py +0 -14
- exported-assets/script_2.py +0 -188
- exported-assets/script_3.py +0 -59
- exported-assets/script_4.py +0 -183
- exported-assets/script_5.py +0 -141
- exported-assets/script_6.py +0 -442
- exported-assets/script_7.py +0 -252
- exported-assets/script_8.py +0 -229
- requirements.txt +3 -3
- script.py +297 -0
README.md
CHANGED
|
@@ -1,13 +1,100 @@
|
|
| 1 |
---
|
| 2 |
-
title:
|
| 3 |
-
emoji:
|
| 4 |
-
colorFrom:
|
| 5 |
-
colorTo:
|
| 6 |
sdk: gradio
|
| 7 |
-
sdk_version:
|
| 8 |
app_file: app.py
|
| 9 |
pinned: false
|
| 10 |
-
|
| 11 |
---
|
| 12 |
|
| 13 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
---
|
| 2 |
+
title: Generador de Títulos con Llama 3.2
|
| 3 |
+
emoji: 🎯
|
| 4 |
+
colorFrom: blue
|
| 5 |
+
colorTo: purple
|
| 6 |
sdk: gradio
|
| 7 |
+
sdk_version: 4.0.0
|
| 8 |
app_file: app.py
|
| 9 |
pinned: false
|
| 10 |
+
license: mit
|
| 11 |
---
|
| 12 |
|
| 13 |
+
# Generador de Títulos con Llama 3.2-1B-Instruct
|
| 14 |
+
|
| 15 |
+
Esta aplicación genera títulos concisos a partir de texto o conversaciones usando el modelo **meta-llama/Llama-3.2-1B-Instruct**.
|
| 16 |
+
|
| 17 |
+
## Características
|
| 18 |
+
|
| 19 |
+
- ✅ Interfaz web interactiva con Gradio
|
| 20 |
+
- ✅ Generación de títulos desde texto simple o conversaciones
|
| 21 |
+
- ✅ API accesible mediante Python, JavaScript y HTTP
|
| 22 |
+
- ✅ Modelo ligero y rápido (1B parámetros)
|
| 23 |
+
- ✅ Soporte multiidioma
|
| 24 |
+
|
| 25 |
+
## Configuración
|
| 26 |
+
|
| 27 |
+
### 1. Crear el Space en Hugging Face
|
| 28 |
+
|
| 29 |
+
1. Ve a https://huggingface.co/new-space
|
| 30 |
+
2. Selecciona **Gradio** como SDK
|
| 31 |
+
3. Nombra tu Space (ej: "title-generator-llama")
|
| 32 |
+
|
| 33 |
+
### 2. Configurar el Secret HF_TOKEN
|
| 34 |
+
|
| 35 |
+
**IMPORTANTE**: Este paso es necesario porque el modelo Llama 3.2 es "gated" (requiere acceso).
|
| 36 |
+
|
| 37 |
+
1. Solicita acceso al modelo en: https://huggingface.co/meta-llama/Llama-3.2-1B-Instruct
|
| 38 |
+
2. Genera un token de acceso en: https://huggingface.co/settings/tokens
|
| 39 |
+
3. En tu Space, ve a **Settings** → **Repository secrets**
|
| 40 |
+
4. Añade un nuevo secret:
|
| 41 |
+
- **Name**: `HF_TOKEN`
|
| 42 |
+
- **Value**: Tu token de Hugging Face (empezará con `hf_...`)
|
| 43 |
+
|
| 44 |
+
### 3. Subir los archivos
|
| 45 |
+
|
| 46 |
+
Sube estos archivos a tu Space:
|
| 47 |
+
- `app.py` - Código principal
|
| 48 |
+
- `requirements.txt` - Dependencias
|
| 49 |
+
- `README.md` - Esta documentación
|
| 50 |
+
|
| 51 |
+
## Uso
|
| 52 |
+
|
| 53 |
+
### Interfaz Web
|
| 54 |
+
|
| 55 |
+
Simplemente visita tu Space y usa la interfaz para:
|
| 56 |
+
- **Texto Simple**: Pega cualquier texto y genera un título
|
| 57 |
+
- **Conversación**: Pega un historial de chat y genera un título resumido
|
| 58 |
+
|
| 59 |
+
### API Python
|
| 60 |
+
|
| 61 |
+
```python
|
| 62 |
+
from gradio_client import Client
|
| 63 |
+
|
| 64 |
+
client = Client("tu-usuario/title-generator-llama")
|
| 65 |
+
result = client.predict(
|
| 66 |
+
input_text="Tu texto aquí...",
|
| 67 |
+
is_conversation=False,
|
| 68 |
+
api_name="/predict"
|
| 69 |
+
)
|
| 70 |
+
print(result)
|
| 71 |
+
```
|
| 72 |
+
|
| 73 |
+
### API JavaScript
|
| 74 |
+
|
| 75 |
+
```javascript
|
| 76 |
+
import { Client } from "@gradio/client";
|
| 77 |
+
|
| 78 |
+
const client = await Client.connect("tu-usuario/title-generator-llama");
|
| 79 |
+
const result = await client.predict("/predict", {
|
| 80 |
+
input_text: "Tu texto aquí...",
|
| 81 |
+
is_conversation: false,
|
| 82 |
+
});
|
| 83 |
+
console.log(result.data);
|
| 84 |
+
```
|
| 85 |
+
|
| 86 |
+
### API HTTP
|
| 87 |
+
|
| 88 |
+
```bash
|
| 89 |
+
curl -X POST https://tu-usuario-title-generator-llama.hf.space/api/predict \
|
| 90 |
+
-H "Content-Type: application/json" \
|
| 91 |
+
-d '{"data": ["Tu texto aquí...", false]}'
|
| 92 |
+
```
|
| 93 |
+
|
| 94 |
+
## Hardware
|
| 95 |
+
|
| 96 |
+
Este Space funciona en **CPU básico** de Hugging Face (gratis). El modelo es lo suficientemente pequeño para ejecutarse eficientemente sin GPU.
|
| 97 |
+
|
| 98 |
+
## Licencia
|
| 99 |
+
|
| 100 |
+
MIT License
|
app.py
CHANGED
|
@@ -1,6 +1,6 @@
|
|
| 1 |
-
import gradio as gr
|
| 2 |
import os
|
| 3 |
-
|
|
|
|
| 4 |
import torch
|
| 5 |
|
| 6 |
# Obtener el token de HF desde las variables de entorno (secret)
|
|
@@ -8,147 +8,141 @@ HF_TOKEN = os.getenv("HF_TOKEN")
|
|
| 8 |
|
| 9 |
# Cargar el modelo y tokenizer
|
| 10 |
MODEL_NAME = "meta-llama/Llama-3.2-1B-Instruct"
|
|
|
|
| 11 |
print("Cargando modelo y tokenizer...")
|
| 12 |
tokenizer = AutoTokenizer.from_pretrained(MODEL_NAME, token=HF_TOKEN)
|
| 13 |
model = AutoModelForCausalLM.from_pretrained(
|
| 14 |
MODEL_NAME,
|
| 15 |
token=HF_TOKEN,
|
| 16 |
-
torch_dtype=torch.float16
|
| 17 |
device_map="auto"
|
| 18 |
)
|
| 19 |
-
model.eval()
|
| 20 |
print("Modelo cargado exitosamente!")
|
| 21 |
|
| 22 |
-
def generate_title(
|
| 23 |
"""
|
| 24 |
-
Genera un título
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 25 |
"""
|
| 26 |
try:
|
| 27 |
-
#
|
| 28 |
-
if
|
| 29 |
-
|
| 30 |
-
|
| 31 |
-
history = text_hist
|
| 32 |
-
|
| 33 |
-
# 2. Convertir el historial a texto plano
|
| 34 |
-
if isinstance(history, list):
|
| 35 |
-
conversation_text = ""
|
| 36 |
-
for i, exchange in enumerate(history):
|
| 37 |
-
if isinstance(exchange, (list, tuple)) and len(exchange) >= 2:
|
| 38 |
-
user_msg = exchange[0] if exchange[0] else ""
|
| 39 |
-
assistant_msg = exchange[1] if exchange[1] else ""
|
| 40 |
-
conversation_text += f"Usuario: {user_msg}\n"
|
| 41 |
-
if assistant_msg:
|
| 42 |
-
conversation_text += f"Asistente: {assistant_msg}\n"
|
| 43 |
else:
|
| 44 |
-
|
|
|
|
| 45 |
|
| 46 |
-
#
|
| 47 |
-
system_prompt = "Genera un título breve y descriptivo de máximo 5 palabras. Responde SOLO con el título, sin comillas ni formato adicional."
|
| 48 |
messages = [
|
| 49 |
{"role": "system", "content": system_prompt},
|
| 50 |
-
{"role": "user", "content":
|
| 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 |
-
# 7. Limpiar el título
|
| 77 |
-
title = title.split('\n')[0].strip()
|
| 78 |
-
if title.endswith('.'):
|
| 79 |
-
title = title[:-1]
|
| 80 |
-
|
| 81 |
-
return title if title else "Conversación sin título"
|
| 82 |
|
| 83 |
except Exception as e:
|
| 84 |
-
|
| 85 |
-
|
| 86 |
-
|
| 87 |
-
|
| 88 |
-
|
| 89 |
-
gr.Markdown(
|
| 90 |
-
|
| 91 |
-
|
| 92 |
-
|
| 93 |
-
|
| 94 |
-
|
| 95 |
-
|
| 96 |
-
|
| 97 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 98 |
""")
|
| 99 |
-
|
| 100 |
-
|
| 101 |
-
|
| 102 |
-
|
| 103 |
-
|
| 104 |
-
|
| 105 |
-
label="Tipo de entrada"
|
| 106 |
-
)
|
| 107 |
-
|
| 108 |
-
chat_input = gr.Chatbot(
|
| 109 |
-
label="Historial de conversación",
|
| 110 |
-
height=300,
|
| 111 |
-
visible=False
|
| 112 |
-
)
|
| 113 |
-
|
| 114 |
-
text_input = gr.Textbox(
|
| 115 |
-
label="Historial como texto",
|
| 116 |
-
placeholder="Pega aquí tu conversación...",
|
| 117 |
-
lines=10,
|
| 118 |
-
visible=True
|
| 119 |
-
)
|
| 120 |
-
|
| 121 |
-
generate_btn = gr.Button("✨ Generar Título", variant="primary")
|
| 122 |
-
|
| 123 |
-
with gr.Column():
|
| 124 |
-
title_output = gr.Textbox(
|
| 125 |
-
label="Título generado",
|
| 126 |
-
placeholder="El título aparecerá aquí...",
|
| 127 |
-
lines=2
|
| 128 |
-
)
|
| 129 |
-
|
| 130 |
-
# Funciones para cambiar la visibilidad según el tipo de entrada
|
| 131 |
-
def toggle_input(choice):
|
| 132 |
-
if choice == "Chat":
|
| 133 |
-
return gr.update(visible=True), gr.update(visible=False)
|
| 134 |
-
else:
|
| 135 |
-
return gr.update(visible=False), gr.update(visible=True)
|
| 136 |
-
|
| 137 |
-
input_type.change(
|
| 138 |
-
fn=toggle_input,
|
| 139 |
-
inputs=[input_type],
|
| 140 |
-
outputs=[chat_input, text_input],
|
| 141 |
-
api_name="toggle_input"
|
| 142 |
-
)
|
| 143 |
-
|
| 144 |
-
# Endpoint de la API - CAMBIO IMPORTANTE AQUÍ
|
| 145 |
-
generate_btn.click(
|
| 146 |
-
fn=generate_title,
|
| 147 |
-
inputs=[input_type, chat_input, text_input],
|
| 148 |
-
outputs=[title_output],
|
| 149 |
-
api_name="generate_title"
|
| 150 |
-
)
|
| 151 |
-
|
| 152 |
-
# Lanzar la aplicación
|
| 153 |
if __name__ == "__main__":
|
| 154 |
-
demo.launch()
|
|
|
|
|
|
|
| 1 |
import os
|
| 2 |
+
import gradio as gr
|
| 3 |
+
from transformers import AutoTokenizer, AutoModelForCausalLM, pipeline
|
| 4 |
import torch
|
| 5 |
|
| 6 |
# Obtener el token de HF desde las variables de entorno (secret)
|
|
|
|
| 8 |
|
| 9 |
# Cargar el modelo y tokenizer
|
| 10 |
MODEL_NAME = "meta-llama/Llama-3.2-1B-Instruct"
|
| 11 |
+
|
| 12 |
print("Cargando modelo y tokenizer...")
|
| 13 |
tokenizer = AutoTokenizer.from_pretrained(MODEL_NAME, token=HF_TOKEN)
|
| 14 |
model = AutoModelForCausalLM.from_pretrained(
|
| 15 |
MODEL_NAME,
|
| 16 |
token=HF_TOKEN,
|
| 17 |
+
torch_dtype=torch.float16,
|
| 18 |
device_map="auto"
|
| 19 |
)
|
|
|
|
| 20 |
print("Modelo cargado exitosamente!")
|
| 21 |
|
| 22 |
+
def generate_title(input_text, is_conversation=False):
|
| 23 |
"""
|
| 24 |
+
Genera un título a partir de texto o historial de conversación.
|
| 25 |
+
|
| 26 |
+
Args:
|
| 27 |
+
input_text: String con el texto o historial
|
| 28 |
+
is_conversation: Boolean indicando si es un historial de conversación
|
| 29 |
+
|
| 30 |
+
Returns:
|
| 31 |
+
String con el título generado
|
| 32 |
"""
|
| 33 |
try:
|
| 34 |
+
# Crear el prompt según el tipo de entrada
|
| 35 |
+
if is_conversation:
|
| 36 |
+
system_prompt = "Eres un asistente experto en crear títulos concisos y descriptivos. Analiza la siguiente conversación y genera un título breve (máximo 6 palabras) que capture el tema principal."
|
| 37 |
+
user_prompt = f"Conversación:\n{input_text}\n\nGenera un título breve y descriptivo:"
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 38 |
else:
|
| 39 |
+
system_prompt = "Eres un asistente experto en crear títulos concisos y descriptivos. Analiza el siguiente texto y genera un título breve (máximo 6 palabras) que capture la idea principal."
|
| 40 |
+
user_prompt = f"Texto:\n{input_text}\n\nGenera un título breve y descriptivo:"
|
| 41 |
|
| 42 |
+
# Formatear mensajes para Llama
|
|
|
|
| 43 |
messages = [
|
| 44 |
{"role": "system", "content": system_prompt},
|
| 45 |
+
{"role": "user", "content": user_prompt}
|
| 46 |
]
|
| 47 |
|
| 48 |
+
# Aplicar chat template
|
| 49 |
+
prompt = tokenizer.apply_chat_template(messages, tokenize=False, add_generation_prompt=True)
|
| 50 |
+
|
| 51 |
+
# Tokenizar
|
| 52 |
+
inputs = tokenizer(prompt, return_tensors="pt").to(model.device)
|
| 53 |
+
|
| 54 |
+
# Generar
|
| 55 |
+
outputs = model.generate(
|
| 56 |
+
**inputs,
|
| 57 |
+
max_new_tokens=50,
|
| 58 |
+
temperature=0.7,
|
| 59 |
+
top_p=0.9,
|
| 60 |
+
do_sample=True,
|
| 61 |
+
pad_token_id=tokenizer.eos_token_id
|
| 62 |
+
)
|
| 63 |
+
|
| 64 |
+
# Decodificar solo la respuesta generada
|
| 65 |
+
generated_text = tokenizer.decode(outputs[0][inputs['input_ids'].shape[1]:], skip_special_tokens=True)
|
| 66 |
+
|
| 67 |
+
# Limpiar el título
|
| 68 |
+
title = generated_text.strip().split('\n')[0].strip()
|
| 69 |
+
|
| 70 |
+
return title
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 71 |
|
| 72 |
except Exception as e:
|
| 73 |
+
return f"Error al generar título: {str(e)}"
|
| 74 |
+
|
| 75 |
+
# Crear interfaz de Gradio
|
| 76 |
+
with gr.Blocks(title="Generador de Títulos con Llama 3.2") as demo:
|
| 77 |
+
gr.Markdown("# 🎯 Generador de Títulos con Llama 3.2-1B-Instruct")
|
| 78 |
+
gr.Markdown("Genera títulos concisos a partir de texto o conversaciones usando IA")
|
| 79 |
+
|
| 80 |
+
with gr.Tab("Texto Simple"):
|
| 81 |
+
with gr.Row():
|
| 82 |
+
with gr.Column():
|
| 83 |
+
text_input = gr.Textbox(
|
| 84 |
+
label="Texto de entrada",
|
| 85 |
+
placeholder="Escribe o pega el texto del que quieres generar un título...",
|
| 86 |
+
lines=8
|
| 87 |
+
)
|
| 88 |
+
text_btn = gr.Button("Generar Título", variant="primary")
|
| 89 |
+
|
| 90 |
+
with gr.Column():
|
| 91 |
+
text_output = gr.Textbox(label="Título generado", lines=3)
|
| 92 |
+
|
| 93 |
+
text_btn.click(
|
| 94 |
+
fn=lambda x: generate_title(x, is_conversation=False),
|
| 95 |
+
inputs=text_input,
|
| 96 |
+
outputs=text_output
|
| 97 |
+
)
|
| 98 |
+
|
| 99 |
+
gr.Examples(
|
| 100 |
+
examples=[
|
| 101 |
+
["La inteligencia artificial está revolucionando la forma en que trabajamos. Desde asistentes virtuales hasta sistemas de recomendación, la IA está presente en nuestra vida diaria de formas que ni siquiera imaginamos."],
|
| 102 |
+
["El cambio climático es uno de los mayores desafíos que enfrenta la humanidad. Las temperaturas globales continúan aumentando y los eventos climáticos extremos son cada vez más frecuentes."]
|
| 103 |
+
],
|
| 104 |
+
inputs=text_input
|
| 105 |
+
)
|
| 106 |
+
|
| 107 |
+
with gr.Tab("Historial de Conversación"):
|
| 108 |
+
with gr.Row():
|
| 109 |
+
with gr.Column():
|
| 110 |
+
conv_input = gr.Textbox(
|
| 111 |
+
label="Historial de conversación",
|
| 112 |
+
placeholder="Pega aquí el historial de la conversación...\n\nFormato ejemplo:\nUsuario: Hola, ¿cómo estás?\nAsistente: ¡Bien! ¿En qué puedo ayudarte?",
|
| 113 |
+
lines=10
|
| 114 |
+
)
|
| 115 |
+
conv_btn = gr.Button("Generar Título", variant="primary")
|
| 116 |
+
|
| 117 |
+
with gr.Column():
|
| 118 |
+
conv_output = gr.Textbox(label="Título generado", lines=3)
|
| 119 |
+
|
| 120 |
+
conv_btn.click(
|
| 121 |
+
fn=lambda x: generate_title(x, is_conversation=True),
|
| 122 |
+
inputs=conv_input,
|
| 123 |
+
outputs=conv_output
|
| 124 |
+
)
|
| 125 |
+
|
| 126 |
+
gr.Examples(
|
| 127 |
+
examples=[
|
| 128 |
+
["Usuario: Necesito ayuda con mi código Python\nAsistente: Claro, ¿qué problema tienes?\nUsuario: No sé cómo leer un archivo CSV\nAsistente: Puedes usar la librería pandas..."],
|
| 129 |
+
["Usuario: ¿Cuál es la receta de paella?\nAsistente: La paella es un plato español tradicional...\nUsuario: ¿Qué ingredientes necesito?\nAsistente: Necesitas arroz, azafrán, pollo..."]
|
| 130 |
+
],
|
| 131 |
+
inputs=conv_input
|
| 132 |
+
)
|
| 133 |
+
|
| 134 |
+
gr.Markdown("""
|
| 135 |
+
### 📝 Notas:
|
| 136 |
+
- El modelo genera títulos concisos (máximo 6 palabras)
|
| 137 |
+
- Puedes usar tanto texto simple como conversaciones
|
| 138 |
+
- Funciona en español, inglés y otros idiomas
|
| 139 |
+
- Usa Llama 3.2-1B-Instruct de Meta
|
| 140 |
""")
|
| 141 |
+
|
| 142 |
+
# API habilitada automáticamente - Los usuarios pueden usar:
|
| 143 |
+
# - Cliente Python de Gradio
|
| 144 |
+
# - Cliente JavaScript de Gradio
|
| 145 |
+
# - Llamadas HTTP directas
|
| 146 |
+
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 147 |
if __name__ == "__main__":
|
| 148 |
+
demo.launch(share=False)
|
exported-assets/.gitignore
DELETED
|
@@ -1,51 +0,0 @@
|
|
| 1 |
-
# Python
|
| 2 |
-
__pycache__/
|
| 3 |
-
*.py[cod]
|
| 4 |
-
*$py.class
|
| 5 |
-
*.so
|
| 6 |
-
.Python
|
| 7 |
-
env/
|
| 8 |
-
venv/
|
| 9 |
-
ENV/
|
| 10 |
-
build/
|
| 11 |
-
develop-eggs/
|
| 12 |
-
dist/
|
| 13 |
-
downloads/
|
| 14 |
-
eggs/
|
| 15 |
-
.eggs/
|
| 16 |
-
lib/
|
| 17 |
-
lib64/
|
| 18 |
-
parts/
|
| 19 |
-
sdist/
|
| 20 |
-
var/
|
| 21 |
-
wheels/
|
| 22 |
-
*.egg-info/
|
| 23 |
-
.installed.cfg
|
| 24 |
-
*.egg
|
| 25 |
-
|
| 26 |
-
# PyTorch
|
| 27 |
-
*.pt
|
| 28 |
-
*.pth
|
| 29 |
-
*.ckpt
|
| 30 |
-
|
| 31 |
-
# Jupyter Notebook
|
| 32 |
-
.ipynb_checkpoints
|
| 33 |
-
|
| 34 |
-
# Environment variables
|
| 35 |
-
.env
|
| 36 |
-
.env.local
|
| 37 |
-
|
| 38 |
-
# IDEs
|
| 39 |
-
.vscode/
|
| 40 |
-
.idea/
|
| 41 |
-
*.swp
|
| 42 |
-
*.swo
|
| 43 |
-
*~
|
| 44 |
-
|
| 45 |
-
# OS
|
| 46 |
-
.DS_Store
|
| 47 |
-
Thumbs.db
|
| 48 |
-
|
| 49 |
-
# Gradio
|
| 50 |
-
gradio_cached_examples/
|
| 51 |
-
flagged/
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
exported-assets/CHECKLIST.md
DELETED
|
@@ -1,243 +0,0 @@
|
|
| 1 |
-
# ✅ CHECKLIST DE DESPLIEGUE
|
| 2 |
-
|
| 3 |
-
## Pre-requisitos
|
| 4 |
-
|
| 5 |
-
- [ ] Tienes una cuenta en Hugging Face (https://huggingface.co)
|
| 6 |
-
- [ ] Has leído la documentación de Spaces
|
| 7 |
-
- [ ] Tienes acceso a Git (opcional, pero recomendado)
|
| 8 |
-
|
| 9 |
-
## Paso 1: Obtener Acceso al Modelo
|
| 10 |
-
|
| 11 |
-
- [ ] Ve a https://huggingface.co/facebook/MobileLLM-Pro
|
| 12 |
-
- [ ] Haz clic en "Request access" (si aparece)
|
| 13 |
-
- [ ] Espera la aprobación (suele ser automática)
|
| 14 |
-
- [ ] Verifica que puedes ver la página del modelo
|
| 15 |
-
|
| 16 |
-
## Paso 2: Crear Token de Acceso
|
| 17 |
-
|
| 18 |
-
- [ ] Ve a https://huggingface.co/settings/tokens
|
| 19 |
-
- [ ] Haz clic en "New token"
|
| 20 |
-
- [ ] Configura:
|
| 21 |
-
- [ ] Name: "spaces_token" (o el nombre que prefieras)
|
| 22 |
-
- [ ] Role: "read"
|
| 23 |
-
- [ ] Haz clic en "Generate a token"
|
| 24 |
-
- [ ] **IMPORTANTE**: Copia el token y guárdalo en un lugar seguro
|
| 25 |
-
|
| 26 |
-
## Paso 3: Crear el Space
|
| 27 |
-
|
| 28 |
-
- [ ] Ve a https://huggingface.co/new-space
|
| 29 |
-
- [ ] Completa el formulario:
|
| 30 |
-
- [ ] Owner: Tu usuario u organización
|
| 31 |
-
- [ ] Space name: "title-generator-mobilellm" (o el nombre que prefieras)
|
| 32 |
-
- [ ] License: MIT
|
| 33 |
-
- [ ] Select the Space SDK: **Gradio**
|
| 34 |
-
- [ ] Space hardware: CPU basic (puedes cambiarlo después)
|
| 35 |
-
- [ ] Repo type: Public o Private
|
| 36 |
-
- [ ] Haz clic en "Create Space"
|
| 37 |
-
|
| 38 |
-
## Paso 4: Configurar el Secret
|
| 39 |
-
|
| 40 |
-
- [ ] En tu Space, ve a **Settings**
|
| 41 |
-
- [ ] Encuentra la sección "Variables and secrets"
|
| 42 |
-
- [ ] Haz clic en "New secret"
|
| 43 |
-
- [ ] Configura:
|
| 44 |
-
- [ ] Name: `HF_TOKEN`
|
| 45 |
-
- [ ] Value: Pega tu token de Hugging Face
|
| 46 |
-
- [ ] Haz clic en "Save"
|
| 47 |
-
- [ ] Verifica que el secret aparece en la lista (el valor estará oculto)
|
| 48 |
-
|
| 49 |
-
## Paso 5: Preparar los Archivos Localmente
|
| 50 |
-
|
| 51 |
-
- [ ] Crea una carpeta local para tu proyecto
|
| 52 |
-
- [ ] Copia los archivos generados:
|
| 53 |
-
- [ ] app.py
|
| 54 |
-
- [ ] requirements.txt
|
| 55 |
-
- [ ] README.md
|
| 56 |
-
- [ ] .gitignore (opcional)
|
| 57 |
-
- [ ] Verifica que los archivos no tienen errores de sintaxis
|
| 58 |
-
|
| 59 |
-
## Paso 6: Subir los Archivos
|
| 60 |
-
|
| 61 |
-
### Opción A: Usando Git (Recomendado)
|
| 62 |
-
|
| 63 |
-
- [ ] Abre una terminal en tu carpeta
|
| 64 |
-
- [ ] Clona el repositorio del Space:
|
| 65 |
-
```bash
|
| 66 |
-
git clone https://huggingface.co/spaces/TU-USUARIO/TU-SPACE
|
| 67 |
-
cd TU-SPACE
|
| 68 |
-
```
|
| 69 |
-
- [ ] Copia los archivos al repositorio:
|
| 70 |
-
```bash
|
| 71 |
-
cp /ruta/a/app.py .
|
| 72 |
-
cp /ruta/a/requirements.txt .
|
| 73 |
-
cp /ruta/a/README.md .
|
| 74 |
-
```
|
| 75 |
-
- [ ] Añade los archivos:
|
| 76 |
-
```bash
|
| 77 |
-
git add .
|
| 78 |
-
```
|
| 79 |
-
- [ ] Haz commit:
|
| 80 |
-
```bash
|
| 81 |
-
git commit -m "Añadir aplicación de generación de títulos"
|
| 82 |
-
```
|
| 83 |
-
- [ ] Push al repositorio:
|
| 84 |
-
```bash
|
| 85 |
-
git push
|
| 86 |
-
```
|
| 87 |
-
|
| 88 |
-
### Opción B: Interfaz Web
|
| 89 |
-
|
| 90 |
-
- [ ] Ve a la pestaña "Files" de tu Space
|
| 91 |
-
- [ ] Haz clic en "Add file" → "Create a new file"
|
| 92 |
-
- [ ] Crea `app.py`:
|
| 93 |
-
- [ ] Nombre: app.py
|
| 94 |
-
- [ ] Pega el contenido completo
|
| 95 |
-
- [ ] Haz commit
|
| 96 |
-
- [ ] Crea `requirements.txt`:
|
| 97 |
-
- [ ] Nombre: requirements.txt
|
| 98 |
-
- [ ] Pega el contenido
|
| 99 |
-
- [ ] Haz commit
|
| 100 |
-
- [ ] Crea `README.md`:
|
| 101 |
-
- [ ] Nombre: README.md
|
| 102 |
-
- [ ] Pega el contenido
|
| 103 |
-
- [ ] Haz commit
|
| 104 |
-
|
| 105 |
-
## Paso 7: Monitorear el Build
|
| 106 |
-
|
| 107 |
-
- [ ] Ve a la pestaña "Logs" de tu Space
|
| 108 |
-
- [ ] Observa el proceso de build:
|
| 109 |
-
- [ ] Installing dependencies... (puede tardar 2-5 min)
|
| 110 |
-
- [ ] Loading model... (puede tardar 2-5 min)
|
| 111 |
-
- [ ] Running... ✅
|
| 112 |
-
- [ ] Si hay errores, revisa los logs y corrige
|
| 113 |
-
|
| 114 |
-
## Paso 8: Probar la Aplicación
|
| 115 |
-
|
| 116 |
-
### Prueba en la Interfaz Web
|
| 117 |
-
|
| 118 |
-
- [ ] Ve a la pestaña "App" de tu Space
|
| 119 |
-
- [ ] Espera a que cargue la interfaz
|
| 120 |
-
- [ ] Prueba con los ejemplos predefinidos:
|
| 121 |
-
- [ ] Haz clic en un ejemplo
|
| 122 |
-
- [ ] Haz clic en "Generar Título"
|
| 123 |
-
- [ ] Verifica que genera un título coherente
|
| 124 |
-
- [ ] Prueba con tu propia conversación:
|
| 125 |
-
- [ ] Ingresa una conversación
|
| 126 |
-
- [ ] Genera el título
|
| 127 |
-
- [ ] Verifica el resultado
|
| 128 |
-
|
| 129 |
-
### Prueba con la API (Python)
|
| 130 |
-
|
| 131 |
-
- [ ] Abre un terminal o Jupyter Notebook
|
| 132 |
-
- [ ] Instala el cliente:
|
| 133 |
-
```bash
|
| 134 |
-
pip install gradio-client
|
| 135 |
-
```
|
| 136 |
-
- [ ] Ejecuta el código de prueba:
|
| 137 |
-
```python
|
| 138 |
-
from gradio_client import Client
|
| 139 |
-
|
| 140 |
-
client = Client("TU-USUARIO/TU-SPACE")
|
| 141 |
-
result = client.predict(
|
| 142 |
-
input_choice="Chat",
|
| 143 |
-
chat_hist=[["Hola", "¿Cómo estás?"]],
|
| 144 |
-
text_hist="",
|
| 145 |
-
api_name="/generate_title"
|
| 146 |
-
)
|
| 147 |
-
print(result)
|
| 148 |
-
```
|
| 149 |
-
- [ ] Verifica que funciona correctamente
|
| 150 |
-
|
| 151 |
-
### Prueba con la API (JavaScript)
|
| 152 |
-
|
| 153 |
-
- [ ] Crea un archivo HTML de prueba
|
| 154 |
-
- [ ] Copia el código del ejemplo de JavaScript
|
| 155 |
-
- [ ] Abre el archivo en el navegador
|
| 156 |
-
- [ ] Verifica que funciona correctamente
|
| 157 |
-
|
| 158 |
-
## Paso 9: Optimizaciones (Opcional)
|
| 159 |
-
|
| 160 |
-
- [ ] Revisa el rendimiento en CPU Basic
|
| 161 |
-
- [ ] Si es muy lento, considera:
|
| 162 |
-
- [ ] Upgrade a CPU Upgrade
|
| 163 |
-
- [ ] Upgrade a GPU T4 small
|
| 164 |
-
- [ ] Ajusta los parámetros de generación si es necesario
|
| 165 |
-
- [ ] Añade más ejemplos si lo consideras útil
|
| 166 |
-
|
| 167 |
-
## Paso 10: Documentación y Compartir
|
| 168 |
-
|
| 169 |
-
- [ ] Verifica que el README.md se muestra correctamente
|
| 170 |
-
- [ ] Añade una descripción clara en el Space
|
| 171 |
-
- [ ] Si es público, comparte el enlace:
|
| 172 |
-
- [ ] Twitter/X
|
| 173 |
-
- [ ] LinkedIn
|
| 174 |
-
- [ ] Reddit (r/MachineLearning, r/LocalLLaMA)
|
| 175 |
-
- [ ] Discord de HuggingFace
|
| 176 |
-
- [ ] Considera añadir el Space a tu portfolio
|
| 177 |
-
|
| 178 |
-
## Solución de Problemas
|
| 179 |
-
|
| 180 |
-
### El Space no arranca
|
| 181 |
-
|
| 182 |
-
- [ ] Verifica los logs en la pestaña "Logs"
|
| 183 |
-
- [ ] Comprueba que HF_TOKEN está configurado
|
| 184 |
-
- [ ] Verifica que tienes acceso al modelo MobileLLM-Pro
|
| 185 |
-
- [ ] Revisa que los archivos no tienen errores de sintaxis
|
| 186 |
-
|
| 187 |
-
### Error 401 Unauthorized
|
| 188 |
-
|
| 189 |
-
- [ ] Verifica que solicitaste acceso al modelo
|
| 190 |
-
- [ ] Comprueba que el token es correcto
|
| 191 |
-
- [ ] Asegúrate de que el secret se llama exactamente `HF_TOKEN`
|
| 192 |
-
- [ ] Regenera el token si es necesario
|
| 193 |
-
|
| 194 |
-
### Out of Memory
|
| 195 |
-
|
| 196 |
-
- [ ] Upgrade el hardware del Space
|
| 197 |
-
- [ ] O modifica el código para usar float32 en CPU
|
| 198 |
-
|
| 199 |
-
### El modelo tarda mucho
|
| 200 |
-
|
| 201 |
-
- [ ] Es normal en CPU Basic (primera inferencia: 30-60 seg)
|
| 202 |
-
- [ ] Considera upgrade a GPU
|
| 203 |
-
- [ ] O acepta el tiempo de carga inicial
|
| 204 |
-
|
| 205 |
-
### Error en requirements.txt
|
| 206 |
-
|
| 207 |
-
- [ ] Verifica las versiones de las dependencias
|
| 208 |
-
- [ ] Prueba actualizar a las últimas versiones estables
|
| 209 |
-
- [ ] Revisa los logs para ver qué falta
|
| 210 |
-
|
| 211 |
-
## Post-Despliegue
|
| 212 |
-
|
| 213 |
-
- [ ] Monitorea el uso del Space
|
| 214 |
-
- [ ] Revisa los logs periódicamente
|
| 215 |
-
- [ ] Actualiza el modelo si hay nuevas versiones
|
| 216 |
-
- [ ] Responde a issues y comentarios
|
| 217 |
-
- [ ] Considera añadir nuevas features
|
| 218 |
-
|
| 219 |
-
## Mantenimiento
|
| 220 |
-
|
| 221 |
-
- [ ] Actualiza las dependencias regularmente
|
| 222 |
-
- [ ] Monitorea el rendimiento
|
| 223 |
-
- [ ] Responde a feedback de usuarios
|
| 224 |
-
- [ ] Considera mejoras en la interfaz
|
| 225 |
-
- [ ] Documenta cambios importantes
|
| 226 |
-
|
| 227 |
-
## ¡Felicidades! 🎉
|
| 228 |
-
|
| 229 |
-
Si has completado todos estos pasos, tu Space debería estar funcionando correctamente.
|
| 230 |
-
|
| 231 |
-
Enlaces útiles:
|
| 232 |
-
- Tu Space: https://huggingface.co/spaces/TU-USUARIO/TU-SPACE
|
| 233 |
-
- Documentación: https://huggingface.co/docs/hub/spaces
|
| 234 |
-
- Soporte: https://discuss.huggingface.co/
|
| 235 |
-
|
| 236 |
-
---
|
| 237 |
-
|
| 238 |
-
**¿Algo no funciona?**
|
| 239 |
-
|
| 240 |
-
1. Revisa los logs
|
| 241 |
-
2. Consulta DEPLOYMENT_GUIDE.md
|
| 242 |
-
3. Busca en los foros de HuggingFace
|
| 243 |
-
4. Abre un issue en tu Space
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
exported-assets/DEPLOYMENT_GUIDE.md
DELETED
|
@@ -1,174 +0,0 @@
|
|
| 1 |
-
# 🚀 Guía de Despliegue en Hugging Face Spaces
|
| 2 |
-
|
| 3 |
-
## Paso 1: Crear el Space
|
| 4 |
-
|
| 5 |
-
1. Ve a https://huggingface.co/new-space
|
| 6 |
-
2. Completa los datos:
|
| 7 |
-
- **Owner**: Tu usuario u organización
|
| 8 |
-
- **Space name**: Por ejemplo, "title-generator-mobilellm"
|
| 9 |
-
- **License**: MIT
|
| 10 |
-
- **Select the Space SDK**: Gradio
|
| 11 |
-
- **Space hardware**: CPU basic (gratis) o superior
|
| 12 |
-
- **Repo type**: Public o Private
|
| 13 |
-
|
| 14 |
-
3. Haz clic en "Create Space"
|
| 15 |
-
|
| 16 |
-
## Paso 2: Configurar el Secret HF_TOKEN
|
| 17 |
-
|
| 18 |
-
**IMPORTANTE**: MobileLLM-Pro es un modelo gated. Debes:
|
| 19 |
-
|
| 20 |
-
1. Solicitar acceso al modelo:
|
| 21 |
-
- Ve a https://huggingface.co/facebook/MobileLLM-Pro
|
| 22 |
-
- Haz clic en "Request access"
|
| 23 |
-
- Espera la aprobación (suele ser automática)
|
| 24 |
-
|
| 25 |
-
2. Crear un token:
|
| 26 |
-
- Ve a https://huggingface.co/settings/tokens
|
| 27 |
-
- Haz clic en "New token"
|
| 28 |
-
- Nombre: "spaces_token" o similar
|
| 29 |
-
- Role: "read"
|
| 30 |
-
- Copia el token generado
|
| 31 |
-
|
| 32 |
-
3. Añadir el secret al Space:
|
| 33 |
-
- En tu Space, ve a **Settings** → **Variables and secrets**
|
| 34 |
-
- Haz clic en "New secret"
|
| 35 |
-
- Name: `HF_TOKEN`
|
| 36 |
-
- Value: Pega tu token
|
| 37 |
-
- Haz clic en "Save"
|
| 38 |
-
|
| 39 |
-
## Paso 3: Subir los archivos
|
| 40 |
-
|
| 41 |
-
Puedes usar Git o la interfaz web:
|
| 42 |
-
|
| 43 |
-
### Opción A: Usando Git
|
| 44 |
-
|
| 45 |
-
\`\`\`bash
|
| 46 |
-
# Clonar el repositorio del Space
|
| 47 |
-
git clone https://huggingface.co/spaces/TU-USUARIO/TU-SPACE
|
| 48 |
-
|
| 49 |
-
# Entrar al directorio
|
| 50 |
-
cd TU-SPACE
|
| 51 |
-
|
| 52 |
-
# Copiar los archivos generados
|
| 53 |
-
cp /ruta/a/app.py .
|
| 54 |
-
cp /ruta/a/requirements.txt .
|
| 55 |
-
cp /ruta/a/README.md .
|
| 56 |
-
cp /ruta/a/.gitignore .
|
| 57 |
-
|
| 58 |
-
# Añadir, commit y push
|
| 59 |
-
git add .
|
| 60 |
-
git commit -m "Añadir aplicación de generación de títulos"
|
| 61 |
-
git push
|
| 62 |
-
\`\`\`
|
| 63 |
-
|
| 64 |
-
### Opción B: Interfaz Web
|
| 65 |
-
|
| 66 |
-
1. Ve a la pestaña "Files" de tu Space
|
| 67 |
-
2. Haz clic en "Add file" → "Create a new file"
|
| 68 |
-
3. Crea cada archivo:
|
| 69 |
-
- `app.py` con el contenido generado
|
| 70 |
-
- `requirements.txt` con las dependencias
|
| 71 |
-
- `README.md` con la documentación
|
| 72 |
-
4. Haz commit de cada archivo
|
| 73 |
-
|
| 74 |
-
## Paso 4: Esperar el Build
|
| 75 |
-
|
| 76 |
-
- El Space comenzará a construirse automáticamente
|
| 77 |
-
- Puedes ver los logs en la pestaña "Logs"
|
| 78 |
-
- El proceso puede tardar 5-10 minutos
|
| 79 |
-
- Estados:
|
| 80 |
-
- 🟡 Building: Instalando dependencias
|
| 81 |
-
- 🟡 Running: Cargando el modelo
|
| 82 |
-
- 🟢 Running: ¡Listo para usar!
|
| 83 |
-
|
| 84 |
-
## Paso 5: Probar la Aplicación
|
| 85 |
-
|
| 86 |
-
1. Una vez que el Space esté en estado "Running":
|
| 87 |
-
- Verás la interfaz de Gradio
|
| 88 |
-
- Prueba los ejemplos predefinidos
|
| 89 |
-
- Ingresa tu propia conversación
|
| 90 |
-
|
| 91 |
-
2. Probar la API:
|
| 92 |
-
\`\`\`python
|
| 93 |
-
from gradio_client import Client
|
| 94 |
-
|
| 95 |
-
client = Client("TU-USUARIO/TU-SPACE")
|
| 96 |
-
result = client.predict(
|
| 97 |
-
input_choice="Chat",
|
| 98 |
-
chat_hist=[["Hola", "¿Cómo estás?"]],
|
| 99 |
-
text_hist="",
|
| 100 |
-
api_name="/generate_title"
|
| 101 |
-
)
|
| 102 |
-
print(result)
|
| 103 |
-
\`\`\`
|
| 104 |
-
|
| 105 |
-
## Solución de Problemas
|
| 106 |
-
|
| 107 |
-
### El Space no arranca
|
| 108 |
-
|
| 109 |
-
- **Revisa los logs**: Ve a la pestaña "Logs"
|
| 110 |
-
- **Verifica el HF_TOKEN**: Asegúrate de que está configurado correctamente
|
| 111 |
-
- **Confirma el acceso al modelo**: Verifica que tienes acceso a MobileLLM-Pro
|
| 112 |
-
|
| 113 |
-
### Error de autenticación
|
| 114 |
-
|
| 115 |
-
\`\`\`
|
| 116 |
-
401 Unauthorized: Access to model facebook/MobileLLM-Pro is restricted
|
| 117 |
-
\`\`\`
|
| 118 |
-
|
| 119 |
-
**Solución**:
|
| 120 |
-
1. Solicita acceso en https://huggingface.co/facebook/MobileLLM-Pro
|
| 121 |
-
2. Verifica que tu token tenga permisos de lectura
|
| 122 |
-
3. Asegúrate de que el secret `HF_TOKEN` esté configurado
|
| 123 |
-
|
| 124 |
-
### Out of memory
|
| 125 |
-
|
| 126 |
-
Si usas CPU Basic y obtienes errores de memoria:
|
| 127 |
-
|
| 128 |
-
**Solución**:
|
| 129 |
-
- Upgrade a CPU Upgrade o GPU en Settings → Hardware
|
| 130 |
-
- O modifica el código para usar `torch.float32` en CPU
|
| 131 |
-
|
| 132 |
-
### El modelo tarda mucho
|
| 133 |
-
|
| 134 |
-
En CPU Basic, la primera inferencia puede tardar 30-60 segundos.
|
| 135 |
-
|
| 136 |
-
**Soluciones**:
|
| 137 |
-
- Upgrade a hardware más potente
|
| 138 |
-
- Implementar caché de ejemplos comunes
|
| 139 |
-
- Usar una GPU (más rápido pero de pago)
|
| 140 |
-
|
| 141 |
-
## Optimizaciones Opcionales
|
| 142 |
-
|
| 143 |
-
### 1. Persistencia del modelo (evitar recarga)
|
| 144 |
-
|
| 145 |
-
Hugging Face Spaces carga el modelo cada vez que se reinicia. Para persistencia:
|
| 146 |
-
|
| 147 |
-
- Usa **Space persistencia** (opción de pago)
|
| 148 |
-
- O acepta el tiempo de carga inicial
|
| 149 |
-
|
| 150 |
-
### 2. Cambiar a GPU
|
| 151 |
-
|
| 152 |
-
En Settings → Hardware:
|
| 153 |
-
- Selecciona "T4 small" o superior
|
| 154 |
-
- Costo: ~$0.60/hora
|
| 155 |
-
- Mucho más rápido
|
| 156 |
-
|
| 157 |
-
### 3. Añadir analytics
|
| 158 |
-
|
| 159 |
-
Añade al final de app.py:
|
| 160 |
-
|
| 161 |
-
\`\`\`python
|
| 162 |
-
demo.launch(analytics_enabled=True)
|
| 163 |
-
\`\`\`
|
| 164 |
-
|
| 165 |
-
## Recursos Adicionales
|
| 166 |
-
|
| 167 |
-
- [Documentación de Spaces](https://huggingface.co/docs/hub/spaces)
|
| 168 |
-
- [Gradio Docs](https://gradio.app/docs)
|
| 169 |
-
- [MobileLLM-Pro](https://huggingface.co/facebook/MobileLLM-Pro)
|
| 170 |
-
- [Transformers Docs](https://huggingface.co/docs/transformers)
|
| 171 |
-
|
| 172 |
-
## Contacto
|
| 173 |
-
|
| 174 |
-
Para problemas o preguntas, abre un issue en el repositorio del Space.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
exported-assets/EXAMPLES.md
DELETED
|
@@ -1,432 +0,0 @@
|
|
| 1 |
-
# 📚 Ejemplos de Uso Extendidos
|
| 2 |
-
|
| 3 |
-
## Ejemplo 1: Uso Básico con Python
|
| 4 |
-
|
| 5 |
-
\`\`\`python
|
| 6 |
-
from gradio_client import Client
|
| 7 |
-
|
| 8 |
-
# Conectar al Space
|
| 9 |
-
client = Client("tu-usuario/title-generator-mobilellm")
|
| 10 |
-
|
| 11 |
-
# Ejemplo con historial de chat
|
| 12 |
-
history = [
|
| 13 |
-
["Hola, necesito ayuda para cocinar pasta",
|
| 14 |
-
"¡Claro! Te puedo ayudar con recetas de pasta. ¿Qué tipo de pasta prefieres?"],
|
| 15 |
-
["Me gusta la carbonara",
|
| 16 |
-
"Excelente elección. Necesitarás: huevos, guanciale, queso pecorino romano y pimienta negra."]
|
| 17 |
-
]
|
| 18 |
-
|
| 19 |
-
result = client.predict(
|
| 20 |
-
input_choice="Chat",
|
| 21 |
-
chat_hist=history,
|
| 22 |
-
text_hist="",
|
| 23 |
-
api_name="/generate_title"
|
| 24 |
-
)
|
| 25 |
-
|
| 26 |
-
print(f"Título generado: {result}")
|
| 27 |
-
# Output: "Receta de pasta carbonara"
|
| 28 |
-
\`\`\`
|
| 29 |
-
|
| 30 |
-
## Ejemplo 2: Uso con Texto Libre
|
| 31 |
-
|
| 32 |
-
\`\`\`python
|
| 33 |
-
from gradio_client import Client
|
| 34 |
-
|
| 35 |
-
client = Client("tu-usuario/title-generator-mobilellm")
|
| 36 |
-
|
| 37 |
-
# Conversación como texto
|
| 38 |
-
conversation = """
|
| 39 |
-
Usuario: ¿Puedes ayudarme con un problema de programación?
|
| 40 |
-
Asistente: Por supuesto. ¿Qué lenguaje estás usando?
|
| 41 |
-
Usuario: Python. Necesito iterar sobre un diccionario
|
| 42 |
-
Asistente: Puedes usar dict.items() así: for key, value in mi_dict.items()
|
| 43 |
-
Usuario: Perfecto, gracias!
|
| 44 |
-
"""
|
| 45 |
-
|
| 46 |
-
result = client.predict(
|
| 47 |
-
input_choice="Texto",
|
| 48 |
-
chat_hist=[],
|
| 49 |
-
text_hist=conversation,
|
| 50 |
-
api_name="/generate_title"
|
| 51 |
-
)
|
| 52 |
-
|
| 53 |
-
print(f"Título generado: {result}")
|
| 54 |
-
# Output: "Iteración diccionarios en Python"
|
| 55 |
-
\`\`\`
|
| 56 |
-
|
| 57 |
-
## Ejemplo 3: Integración con JavaScript/Node.js
|
| 58 |
-
|
| 59 |
-
\`\`\`javascript
|
| 60 |
-
import { Client } from "@gradio/client";
|
| 61 |
-
|
| 62 |
-
async function generateTitle() {
|
| 63 |
-
const client = await Client.connect("tu-usuario/title-generator-mobilellm");
|
| 64 |
-
|
| 65 |
-
// Historial de conversación
|
| 66 |
-
const history = [
|
| 67 |
-
["¿Cuál es la mejor forma de aprender machine learning?",
|
| 68 |
-
"Te recomiendo empezar con curso de Andrew Ng en Coursera"],
|
| 69 |
-
["¿Necesito saber mucha matemática?",
|
| 70 |
-
"Es útil conocer álgebra lineal, cálculo y estadística básica"]
|
| 71 |
-
];
|
| 72 |
-
|
| 73 |
-
const result = await client.predict("/generate_title", {
|
| 74 |
-
input_choice: "Chat",
|
| 75 |
-
chat_hist: history,
|
| 76 |
-
text_hist: ""
|
| 77 |
-
});
|
| 78 |
-
|
| 79 |
-
console.log(`Título generado: ${result.data}`);
|
| 80 |
-
// Output: "Aprendizaje de Machine Learning"
|
| 81 |
-
}
|
| 82 |
-
|
| 83 |
-
generateTitle();
|
| 84 |
-
\`\`\`
|
| 85 |
-
|
| 86 |
-
## Ejemplo 4: Uso en el Navegador (JavaScript)
|
| 87 |
-
|
| 88 |
-
\`\`\`html
|
| 89 |
-
<!DOCTYPE html>
|
| 90 |
-
<html>
|
| 91 |
-
<head>
|
| 92 |
-
<title>Generador de Títulos</title>
|
| 93 |
-
</head>
|
| 94 |
-
<body>
|
| 95 |
-
<h1>Generador de Títulos de Conversaciones</h1>
|
| 96 |
-
<div id="result"></div>
|
| 97 |
-
|
| 98 |
-
<script type="module">
|
| 99 |
-
import { Client } from "https://cdn.jsdelivr.net/npm/@gradio/client/dist/index.min.js";
|
| 100 |
-
|
| 101 |
-
async function generateTitle() {
|
| 102 |
-
const client = await Client.connect("tu-usuario/title-generator-mobilellm");
|
| 103 |
-
|
| 104 |
-
const conversation = `
|
| 105 |
-
Usuario: Quiero crear una app móvil
|
| 106 |
-
Asistente: ¿Para Android, iOS o ambos?
|
| 107 |
-
Usuario: Para ambos
|
| 108 |
-
Asistente: Te recomiendo usar Flutter o React Native
|
| 109 |
-
`;
|
| 110 |
-
|
| 111 |
-
const result = await client.predict("/generate_title", {
|
| 112 |
-
input_choice: "Texto",
|
| 113 |
-
chat_hist: [],
|
| 114 |
-
text_hist: conversation
|
| 115 |
-
});
|
| 116 |
-
|
| 117 |
-
document.getElementById('result').textContent =
|
| 118 |
-
`Título: ${result.data}`;
|
| 119 |
-
}
|
| 120 |
-
|
| 121 |
-
generateTitle();
|
| 122 |
-
</script>
|
| 123 |
-
</body>
|
| 124 |
-
</html>
|
| 125 |
-
\`\`\`
|
| 126 |
-
|
| 127 |
-
## Ejemplo 5: Procesamiento por Lotes
|
| 128 |
-
|
| 129 |
-
\`\`\`python
|
| 130 |
-
from gradio_client import Client
|
| 131 |
-
import time
|
| 132 |
-
|
| 133 |
-
def generate_titles_batch(conversations):
|
| 134 |
-
"""Genera títulos para múltiples conversaciones"""
|
| 135 |
-
client = Client("tu-usuario/title-generator-mobilellm")
|
| 136 |
-
results = []
|
| 137 |
-
|
| 138 |
-
for i, conv in enumerate(conversations, 1):
|
| 139 |
-
print(f"Procesando conversación {i}/{len(conversations)}...")
|
| 140 |
-
|
| 141 |
-
result = client.predict(
|
| 142 |
-
input_choice="Chat",
|
| 143 |
-
chat_hist=conv,
|
| 144 |
-
text_hist="",
|
| 145 |
-
api_name="/generate_title"
|
| 146 |
-
)
|
| 147 |
-
|
| 148 |
-
results.append({
|
| 149 |
-
'conversation': conv,
|
| 150 |
-
'title': result
|
| 151 |
-
})
|
| 152 |
-
|
| 153 |
-
# Pequeña pausa para no sobrecargar el servidor
|
| 154 |
-
time.sleep(1)
|
| 155 |
-
|
| 156 |
-
return results
|
| 157 |
-
|
| 158 |
-
# Ejemplo de uso
|
| 159 |
-
conversations = [
|
| 160 |
-
[["¿Cómo instalar Python?", "Puedes descargarlo desde python.org"]],
|
| 161 |
-
[["¿Qué es Docker?", "Es una plataforma de contenedores"]],
|
| 162 |
-
[["Ayuda con SQL", "¿Qué necesitas saber sobre SQL?"]]
|
| 163 |
-
]
|
| 164 |
-
|
| 165 |
-
titles = generate_titles_batch(conversations)
|
| 166 |
-
|
| 167 |
-
for item in titles:
|
| 168 |
-
print(f"Título: {item['title']}")
|
| 169 |
-
\`\`\`
|
| 170 |
-
|
| 171 |
-
## Ejemplo 6: Integración con FastAPI
|
| 172 |
-
|
| 173 |
-
\`\`\`python
|
| 174 |
-
from fastapi import FastAPI, HTTPException
|
| 175 |
-
from pydantic import BaseModel
|
| 176 |
-
from gradio_client import Client
|
| 177 |
-
from typing import List, Tuple
|
| 178 |
-
|
| 179 |
-
app = FastAPI()
|
| 180 |
-
|
| 181 |
-
# Cliente de Gradio (inicializado una vez)
|
| 182 |
-
gradio_client = Client("tu-usuario/title-generator-mobilellm")
|
| 183 |
-
|
| 184 |
-
class ConversationRequest(BaseModel):
|
| 185 |
-
messages: List[Tuple[str, str]]
|
| 186 |
-
|
| 187 |
-
class TitleResponse(BaseModel):
|
| 188 |
-
title: str
|
| 189 |
-
|
| 190 |
-
@app.post("/generate-title", response_model=TitleResponse)
|
| 191 |
-
async def generate_title_endpoint(request: ConversationRequest):
|
| 192 |
-
"""
|
| 193 |
-
Endpoint para generar títulos desde tu API
|
| 194 |
-
"""
|
| 195 |
-
try:
|
| 196 |
-
result = gradio_client.predict(
|
| 197 |
-
input_choice="Chat",
|
| 198 |
-
chat_hist=request.messages,
|
| 199 |
-
text_hist="",
|
| 200 |
-
api_name="/generate_title"
|
| 201 |
-
)
|
| 202 |
-
|
| 203 |
-
return TitleResponse(title=result)
|
| 204 |
-
|
| 205 |
-
except Exception as e:
|
| 206 |
-
raise HTTPException(status_code=500, detail=str(e))
|
| 207 |
-
|
| 208 |
-
# Ejemplo de uso:
|
| 209 |
-
# POST http://localhost:8000/generate-title
|
| 210 |
-
# Body: {
|
| 211 |
-
# "messages": [
|
| 212 |
-
# ["Hola", "¿Cómo estás?"],
|
| 213 |
-
# ["Bien, gracias", "Me alegro"]
|
| 214 |
-
# ]
|
| 215 |
-
# }
|
| 216 |
-
\`\`\`
|
| 217 |
-
|
| 218 |
-
## Ejemplo 7: CLI (Command Line Interface)
|
| 219 |
-
|
| 220 |
-
\`\`\`python
|
| 221 |
-
#!/usr/bin/env python3
|
| 222 |
-
"""
|
| 223 |
-
Script CLI para generar títulos de conversaciones
|
| 224 |
-
Uso: python cli_title_generator.py
|
| 225 |
-
"""
|
| 226 |
-
|
| 227 |
-
import sys
|
| 228 |
-
from gradio_client import Client
|
| 229 |
-
|
| 230 |
-
def main():
|
| 231 |
-
if len(sys.argv) < 2:
|
| 232 |
-
print("Uso: python cli_title_generator.py '<conversación>'")
|
| 233 |
-
print("Ejemplo: python cli_title_generator.py 'Usuario: Hola\nAsistente: Hola'")
|
| 234 |
-
sys.exit(1)
|
| 235 |
-
|
| 236 |
-
conversation = sys.argv[1]
|
| 237 |
-
|
| 238 |
-
print("🔄 Conectando al servidor...")
|
| 239 |
-
client = Client("tu-usuario/title-generator-mobilellm")
|
| 240 |
-
|
| 241 |
-
print("✨ Generando título...")
|
| 242 |
-
result = client.predict(
|
| 243 |
-
input_choice="Texto",
|
| 244 |
-
chat_hist=[],
|
| 245 |
-
text_hist=conversation,
|
| 246 |
-
api_name="/generate_title"
|
| 247 |
-
)
|
| 248 |
-
|
| 249 |
-
print(f"\n📝 Título generado: {result}")
|
| 250 |
-
|
| 251 |
-
if __name__ == "__main__":
|
| 252 |
-
main()
|
| 253 |
-
\`\`\`
|
| 254 |
-
|
| 255 |
-
Uso:
|
| 256 |
-
\`\`\`bash
|
| 257 |
-
chmod +x cli_title_generator.py
|
| 258 |
-
./cli_title_generator.py "Usuario: Hola\nAsistente: ¿En qué puedo ayudarte?"
|
| 259 |
-
\`\`\`
|
| 260 |
-
|
| 261 |
-
## Ejemplo 8: Integración con Discord Bot
|
| 262 |
-
|
| 263 |
-
\`\`\`python
|
| 264 |
-
import discord
|
| 265 |
-
from discord.ext import commands
|
| 266 |
-
from gradio_client import Client
|
| 267 |
-
|
| 268 |
-
bot = commands.Bot(command_prefix='!')
|
| 269 |
-
gradio_client = Client("tu-usuario/title-generator-mobilellm")
|
| 270 |
-
|
| 271 |
-
@bot.command(name='title')
|
| 272 |
-
async def generate_title_command(ctx):
|
| 273 |
-
"""Genera un título para los últimos mensajes del canal"""
|
| 274 |
-
|
| 275 |
-
# Obtener últimos 10 mensajes
|
| 276 |
-
messages = []
|
| 277 |
-
async for msg in ctx.channel.history(limit=10):
|
| 278 |
-
if not msg.author.bot:
|
| 279 |
-
messages.append([
|
| 280 |
-
msg.author.name,
|
| 281 |
-
msg.content
|
| 282 |
-
])
|
| 283 |
-
|
| 284 |
-
messages.reverse()
|
| 285 |
-
|
| 286 |
-
if len(messages) < 2:
|
| 287 |
-
await ctx.send("❌ No hay suficientes mensajes para generar un título")
|
| 288 |
-
return
|
| 289 |
-
|
| 290 |
-
await ctx.send("🔄 Generando título...")
|
| 291 |
-
|
| 292 |
-
try:
|
| 293 |
-
result = gradio_client.predict(
|
| 294 |
-
input_choice="Chat",
|
| 295 |
-
chat_hist=messages,
|
| 296 |
-
text_hist="",
|
| 297 |
-
api_name="/generate_title"
|
| 298 |
-
)
|
| 299 |
-
|
| 300 |
-
await ctx.send(f"📝 **Título:** {result}")
|
| 301 |
-
|
| 302 |
-
except Exception as e:
|
| 303 |
-
await ctx.send(f"❌ Error: {str(e)}")
|
| 304 |
-
|
| 305 |
-
bot.run('TU_TOKEN_DE_DISCORD')
|
| 306 |
-
\`\`\`
|
| 307 |
-
|
| 308 |
-
## Ejemplo 9: Manejo de Errores Robusto
|
| 309 |
-
|
| 310 |
-
\`\`\`python
|
| 311 |
-
from gradio_client import Client
|
| 312 |
-
import time
|
| 313 |
-
from typing import Optional
|
| 314 |
-
|
| 315 |
-
class TitleGenerator:
|
| 316 |
-
def __init__(self, space_name: str, max_retries: int = 3):
|
| 317 |
-
self.space_name = space_name
|
| 318 |
-
self.max_retries = max_retries
|
| 319 |
-
self.client = None
|
| 320 |
-
|
| 321 |
-
def connect(self):
|
| 322 |
-
"""Conectar al Space con reintentos"""
|
| 323 |
-
for attempt in range(self.max_retries):
|
| 324 |
-
try:
|
| 325 |
-
print(f"Intento de conexión {attempt + 1}/{self.max_retries}...")
|
| 326 |
-
self.client = Client(self.space_name)
|
| 327 |
-
print("✅ Conectado exitosamente")
|
| 328 |
-
return True
|
| 329 |
-
except Exception as e:
|
| 330 |
-
print(f"❌ Error en intento {attempt + 1}: {str(e)}")
|
| 331 |
-
if attempt < self.max_retries - 1:
|
| 332 |
-
time.sleep(2 ** attempt) # Backoff exponencial
|
| 333 |
-
return False
|
| 334 |
-
|
| 335 |
-
def generate(self, history: list) -> Optional[str]:
|
| 336 |
-
"""Generar título con manejo de errores"""
|
| 337 |
-
if not self.client:
|
| 338 |
-
if not self.connect():
|
| 339 |
-
return None
|
| 340 |
-
|
| 341 |
-
try:
|
| 342 |
-
result = self.client.predict(
|
| 343 |
-
input_choice="Chat",
|
| 344 |
-
chat_hist=history,
|
| 345 |
-
text_hist="",
|
| 346 |
-
api_name="/generate_title"
|
| 347 |
-
)
|
| 348 |
-
return result
|
| 349 |
-
|
| 350 |
-
except Exception as e:
|
| 351 |
-
print(f"❌ Error al generar título: {str(e)}")
|
| 352 |
-
# Intentar reconectar
|
| 353 |
-
if self.connect():
|
| 354 |
-
return self.generate(history)
|
| 355 |
-
return None
|
| 356 |
-
|
| 357 |
-
# Uso
|
| 358 |
-
generator = TitleGenerator("tu-usuario/title-generator-mobilellm")
|
| 359 |
-
history = [["Hola", "¿Qué tal?"]]
|
| 360 |
-
title = generator.generate(history)
|
| 361 |
-
|
| 362 |
-
if title:
|
| 363 |
-
print(f"✅ Título: {title}")
|
| 364 |
-
else:
|
| 365 |
-
print("❌ No se pudo generar el título")
|
| 366 |
-
\`\`\`
|
| 367 |
-
|
| 368 |
-
## Ejemplo 10: Stream de Conversaciones en Tiempo Real
|
| 369 |
-
|
| 370 |
-
\`\`\`python
|
| 371 |
-
from gradio_client import Client
|
| 372 |
-
import json
|
| 373 |
-
|
| 374 |
-
class ConversationTitleTracker:
|
| 375 |
-
def __init__(self, space_name: str):
|
| 376 |
-
self.client = Client(space_name)
|
| 377 |
-
self.conversation = []
|
| 378 |
-
self.title = None
|
| 379 |
-
|
| 380 |
-
def add_message(self, user_msg: str, assistant_msg: str):
|
| 381 |
-
"""Añadir un intercambio a la conversación"""
|
| 382 |
-
self.conversation.append([user_msg, assistant_msg])
|
| 383 |
-
|
| 384 |
-
# Regenerar título cada 3 intercambios
|
| 385 |
-
if len(self.conversation) % 3 == 0:
|
| 386 |
-
self.update_title()
|
| 387 |
-
|
| 388 |
-
def update_title(self):
|
| 389 |
-
"""Actualizar el título basado en la conversación actual"""
|
| 390 |
-
try:
|
| 391 |
-
self.title = self.client.predict(
|
| 392 |
-
input_choice="Chat",
|
| 393 |
-
chat_hist=self.conversation,
|
| 394 |
-
text_hist="",
|
| 395 |
-
api_name="/generate_title"
|
| 396 |
-
)
|
| 397 |
-
print(f"📝 Nuevo título: {self.title}")
|
| 398 |
-
except Exception as e:
|
| 399 |
-
print(f"❌ Error al actualizar título: {e}")
|
| 400 |
-
|
| 401 |
-
def get_summary(self):
|
| 402 |
-
"""Obtener resumen de la conversación"""
|
| 403 |
-
return {
|
| 404 |
-
'title': self.title,
|
| 405 |
-
'message_count': len(self.conversation),
|
| 406 |
-
'last_update': len(self.conversation)
|
| 407 |
-
}
|
| 408 |
-
|
| 409 |
-
# Uso
|
| 410 |
-
tracker = ConversationTitleTracker("tu-usuario/title-generator-mobilellm")
|
| 411 |
-
|
| 412 |
-
# Simular conversación
|
| 413 |
-
tracker.add_message("Hola", "¿En qué puedo ayudarte?")
|
| 414 |
-
tracker.add_message("Necesito ayuda con Python", "Claro, ¿qué necesitas?")
|
| 415 |
-
tracker.add_message("¿Cómo crear una función?", "Se usa la palabra clave 'def'")
|
| 416 |
-
|
| 417 |
-
print(json.dumps(tracker.get_summary(), indent=2))
|
| 418 |
-
\`\`\`
|
| 419 |
-
|
| 420 |
-
## Notas Importantes
|
| 421 |
-
|
| 422 |
-
1. **Rate Limiting**: Si haces muchas peticiones, considera añadir pausas
|
| 423 |
-
2. **Timeouts**: Las primeras peticiones pueden tardar más (carga del modelo)
|
| 424 |
-
3. **Errores**: Siempre implementa manejo de errores robusto
|
| 425 |
-
4. **Caché**: Considera cachear títulos para conversaciones ya procesadas
|
| 426 |
-
5. **Costes**: Los Spaces gratuitos tienen limitaciones de uso
|
| 427 |
-
|
| 428 |
-
## Recursos Adicionales
|
| 429 |
-
|
| 430 |
-
- [Documentación Gradio Client](https://www.gradio.app/docs/python-client)
|
| 431 |
-
- [Ejemplos de Spaces](https://huggingface.co/spaces)
|
| 432 |
-
- [API Reference](https://www.gradio.app/docs/gradio-client)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
exported-assets/FINAL_SUMMARY.txt
DELETED
|
@@ -1,205 +0,0 @@
|
|
| 1 |
-
|
| 2 |
-
╔════════════════════════════════════════════════════════════════════╗
|
| 3 |
-
║ ║
|
| 4 |
-
║ 📦 CÓDIGO COMPLETO PARA HUGGING FACE SPACE GENERADO ║
|
| 5 |
-
║ Generador de Títulos con MobileLLM-Pro ║
|
| 6 |
-
║ ║
|
| 7 |
-
╚════════════════════════════════════════════════════════════════════╝
|
| 8 |
-
|
| 9 |
-
✅ ARCHIVOS GENERADOS (7 archivos):
|
| 10 |
-
|
| 11 |
-
1️⃣ app.py - Aplicación principal Gradio
|
| 12 |
-
2️⃣ requirements.txt - Dependencias Python
|
| 13 |
-
3️⃣ README.md - Documentación del Space
|
| 14 |
-
4️⃣ .gitignore - Archivos a ignorar en Git
|
| 15 |
-
5️⃣ DEPLOYMENT_GUIDE.md - Guía de despliegue detallada
|
| 16 |
-
6️⃣ EXAMPLES.md - Ejemplos de uso extendidos (10 ejemplos)
|
| 17 |
-
7️⃣ CHECKLIST.md - Lista de verificación paso a paso
|
| 18 |
-
|
| 19 |
-
════════════════════════════════════════════════════════════════════
|
| 20 |
-
|
| 21 |
-
📋 CARACTERÍSTICAS PRINCIPALES:
|
| 22 |
-
|
| 23 |
-
✨ Interfaz Gradio:
|
| 24 |
-
• Dos modos de entrada: Chat (visual) y Texto (libre)
|
| 25 |
-
• Componente Chatbot interactivo
|
| 26 |
-
• Ejemplos predefinidos integrados
|
| 27 |
-
• Diseño responsive y moderno
|
| 28 |
-
• Documentación en español
|
| 29 |
-
|
| 30 |
-
🔐 Seguridad:
|
| 31 |
-
• HF_TOKEN cargado desde secrets de Hugging Face
|
| 32 |
-
• Compatible con modelos gated
|
| 33 |
-
• No expone credenciales en el código
|
| 34 |
-
• Variable de entorno segura
|
| 35 |
-
|
| 36 |
-
⚡ Rendimiento:
|
| 37 |
-
• Usa MobileLLM-Pro (1B parámetros, rápido)
|
| 38 |
-
• Inferencia optimizada con torch.float16 en GPU
|
| 39 |
-
• Fallback automático a float32 en CPU
|
| 40 |
-
• device_map="auto" para distribución óptima
|
| 41 |
-
• Generación limitada a 20 tokens (títulos cortos)
|
| 42 |
-
|
| 43 |
-
🔌 API Completa:
|
| 44 |
-
• Endpoint nombrado: /generate_title
|
| 45 |
-
• Compatible con gradio_client (Python)
|
| 46 |
-
• Compatible con @gradio/client (JavaScript)
|
| 47 |
-
• Documentación de API incluida
|
| 48 |
-
• Ejemplos de uso en 10 escenarios diferentes
|
| 49 |
-
|
| 50 |
-
📝 Generación Inteligente:
|
| 51 |
-
• Prompt optimizado en español
|
| 52 |
-
• Títulos de máximo 5 palabras
|
| 53 |
-
• Limpieza automática de la salida
|
| 54 |
-
• Manejo robusto de errores
|
| 55 |
-
• Soporta múltiples formatos de entrada
|
| 56 |
-
|
| 57 |
-
════════════════════════════════════════════════════════════════════
|
| 58 |
-
|
| 59 |
-
🚀 QUICK START:
|
| 60 |
-
|
| 61 |
-
1. Crea un Space en: https://huggingface.co/new-space
|
| 62 |
-
- SDK: Gradio
|
| 63 |
-
- Hardware: CPU Basic (o superior)
|
| 64 |
-
|
| 65 |
-
2. Solicita acceso al modelo:
|
| 66 |
-
https://huggingface.co/facebook/MobileLLM-Pro
|
| 67 |
-
|
| 68 |
-
3. Crea un token en:
|
| 69 |
-
https://huggingface.co/settings/tokens
|
| 70 |
-
|
| 71 |
-
4. Configura el secret HF_TOKEN:
|
| 72 |
-
Settings → Variables and secrets → New secret
|
| 73 |
-
Name: HF_TOKEN
|
| 74 |
-
Value: [tu token]
|
| 75 |
-
|
| 76 |
-
5. Sube los archivos:
|
| 77 |
-
- app.py
|
| 78 |
-
- requirements.txt
|
| 79 |
-
- README.md
|
| 80 |
-
|
| 81 |
-
6. ¡Espera 5-10 minutos y ya está!
|
| 82 |
-
|
| 83 |
-
════════════════════════════════════════════════════════════════════
|
| 84 |
-
|
| 85 |
-
💻 USO DE LA API:
|
| 86 |
-
|
| 87 |
-
Python:
|
| 88 |
-
-------
|
| 89 |
-
from gradio_client import Client
|
| 90 |
-
|
| 91 |
-
client = Client("tu-usuario/tu-space")
|
| 92 |
-
result = client.predict(
|
| 93 |
-
input_choice="Chat",
|
| 94 |
-
chat_hist=[["Pregunta", "Respuesta"]],
|
| 95 |
-
text_hist="",
|
| 96 |
-
api_name="/generate_title"
|
| 97 |
-
)
|
| 98 |
-
print(result)
|
| 99 |
-
|
| 100 |
-
JavaScript:
|
| 101 |
-
-----------
|
| 102 |
-
import { Client } from "@gradio/client";
|
| 103 |
-
|
| 104 |
-
const client = await Client.connect("tu-usuario/tu-space");
|
| 105 |
-
const result = await client.predict("/generate_title", {
|
| 106 |
-
input_choice: "Chat",
|
| 107 |
-
chat_hist: [["Pregunta", "Respuesta"]],
|
| 108 |
-
text_hist: ""
|
| 109 |
-
});
|
| 110 |
-
console.log(result.data);
|
| 111 |
-
|
| 112 |
-
════════════════════════════════════════════════════════════════════
|
| 113 |
-
|
| 114 |
-
📚 DOCUMENTACIÓN INCLUIDA:
|
| 115 |
-
|
| 116 |
-
• README.md: Documentación completa del Space con ejemplos
|
| 117 |
-
• DEPLOYMENT_GUIDE.md: Guía paso a paso para desplegar
|
| 118 |
-
• EXAMPLES.md: 10 ejemplos de uso en diferentes contextos:
|
| 119 |
-
1. Uso básico con Python
|
| 120 |
-
2. Uso con texto libre
|
| 121 |
-
3. JavaScript/Node.js
|
| 122 |
-
4. JavaScript en el navegador
|
| 123 |
-
5. Procesamiento por lotes
|
| 124 |
-
6. Integración con FastAPI
|
| 125 |
-
7. CLI (línea de comandos)
|
| 126 |
-
8. Bot de Discord
|
| 127 |
-
9. Manejo de errores robusto
|
| 128 |
-
10. Stream en tiempo real
|
| 129 |
-
• CHECKLIST.md: Lista de verificación completa
|
| 130 |
-
|
| 131 |
-
════════════════════════════════���═══════════════════════════════════
|
| 132 |
-
|
| 133 |
-
🛠️ TECNOLOGÍAS UTILIZADAS:
|
| 134 |
-
|
| 135 |
-
• MobileLLM-Pro: Modelo de Meta de 1B parámetros
|
| 136 |
-
• Transformers: Biblioteca de Hugging Face
|
| 137 |
-
• Gradio: Framework para interfaces ML
|
| 138 |
-
• PyTorch: Backend de inferencia
|
| 139 |
-
• Accelerate: Optimización de carga del modelo
|
| 140 |
-
|
| 141 |
-
════════════════════════════════════════════════════════════════════
|
| 142 |
-
|
| 143 |
-
📝 NOTAS IMPORTANTES:
|
| 144 |
-
|
| 145 |
-
1. MobileLLM-Pro es un modelo GATED:
|
| 146 |
-
- Debes solicitar acceso antes de usarlo
|
| 147 |
-
- La aprobación suele ser automática
|
| 148 |
-
- Sin acceso, el Space no funcionará
|
| 149 |
-
|
| 150 |
-
2. El HF_TOKEN debe configurarse como SECRET:
|
| 151 |
-
- No como variable normal
|
| 152 |
-
- Debe llamarse exactamente: HF_TOKEN
|
| 153 |
-
- Con permisos de lectura (read)
|
| 154 |
-
|
| 155 |
-
3. Primera ejecución:
|
| 156 |
-
- En CPU Basic puede tardar 30-60 segundos
|
| 157 |
-
- El modelo se carga en memoria
|
| 158 |
-
- Las siguientes inferencias son más rápidas
|
| 159 |
-
|
| 160 |
-
4. Hardware recomendado:
|
| 161 |
-
- CPU Basic: Funciona pero lento
|
| 162 |
-
- CPU Upgrade: Mejor rendimiento
|
| 163 |
-
- GPU T4: Óptimo pero de pago
|
| 164 |
-
|
| 165 |
-
════════════════════════════════════════════════════════════════════
|
| 166 |
-
|
| 167 |
-
🎯 LO QUE HACE LA APLICACIÓN:
|
| 168 |
-
|
| 169 |
-
Entrada:
|
| 170 |
-
--------
|
| 171 |
-
Un historial de conversación en formato:
|
| 172 |
-
• Lista de tuplas: [["usuario", "asistente"], ...]
|
| 173 |
-
• O texto libre: "Usuario: ...
|
| 174 |
-
Asistente: ..."
|
| 175 |
-
|
| 176 |
-
Procesamiento:
|
| 177 |
-
--------------
|
| 178 |
-
• Convierte el historial a un prompt optimizado
|
| 179 |
-
• Usa MobileLLM-Pro para generar un título
|
| 180 |
-
• Limpia y formatea la salida
|
| 181 |
-
|
| 182 |
-
Salida:
|
| 183 |
-
-------
|
| 184 |
-
• Un título conciso de máximo 5 palabras
|
| 185 |
-
• Descriptivo del tema de la conversación
|
| 186 |
-
• En el idioma de la entrada
|
| 187 |
-
|
| 188 |
-
Ejemplos:
|
| 189 |
-
---------
|
| 190 |
-
Entrada: [["¿Cómo cocinar pasta?", "Hierve agua y..."], ...]
|
| 191 |
-
Salida: "Receta de pasta casera"
|
| 192 |
-
|
| 193 |
-
Entrada: [["¿Qué es Python?", "Es un lenguaje..."], ...]
|
| 194 |
-
Salida: "Introducción a Python"
|
| 195 |
-
|
| 196 |
-
════════════════════════════════════════════════════════════════════
|
| 197 |
-
|
| 198 |
-
✅ TODO LISTO PARA DESPLEGAR
|
| 199 |
-
|
| 200 |
-
Sigue el CHECKLIST.md paso a paso y tendrás tu Space funcionando
|
| 201 |
-
en menos de 15 minutos.
|
| 202 |
-
|
| 203 |
-
¡Buena suerte! 🚀
|
| 204 |
-
|
| 205 |
-
════════════════════════════════════════════════════════════════════
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
exported-assets/README.md
DELETED
|
@@ -1,179 +0,0 @@
|
|
| 1 |
-
---
|
| 2 |
-
title: Generador de Títulos con MobileLLM-Pro
|
| 3 |
-
emoji: 📝
|
| 4 |
-
colorFrom: blue
|
| 5 |
-
colorTo: purple
|
| 6 |
-
sdk: gradio
|
| 7 |
-
sdk_version: 4.44.0
|
| 8 |
-
app_file: app.py
|
| 9 |
-
pinned: false
|
| 10 |
-
license: mit
|
| 11 |
-
---
|
| 12 |
-
|
| 13 |
-
# 📝 Generador de Títulos para Conversaciones
|
| 14 |
-
|
| 15 |
-
Esta aplicación utiliza **MobileLLM-Pro** de Meta para generar títulos concisos y descriptivos a partir de historiales de conversación.
|
| 16 |
-
|
| 17 |
-
## 🚀 Características
|
| 18 |
-
|
| 19 |
-
- ✨ Genera títulos automáticamente a partir de conversaciones
|
| 20 |
-
- 🎯 Interfaz Gradio fácil de usar
|
| 21 |
-
- 🔌 API accesible mediante Python y JavaScript
|
| 22 |
-
- ⚡ Rápido gracias a MobileLLM-Pro (1B parámetros)
|
| 23 |
-
- 🔒 Usa HF_TOKEN como secret para modelos gated
|
| 24 |
-
|
| 25 |
-
## 📋 Configuración
|
| 26 |
-
|
| 27 |
-
### 1. Configurar el Secret HF_TOKEN
|
| 28 |
-
|
| 29 |
-
Este espacio utiliza el modelo `facebook/MobileLLM-Pro` que es un modelo **gated** (requiere acceso).
|
| 30 |
-
|
| 31 |
-
**Pasos para configurar:**
|
| 32 |
-
|
| 33 |
-
1. Ve a [Hugging Face Settings - Tokens](https://huggingface.co/settings/tokens)
|
| 34 |
-
2. Crea un nuevo token (o usa uno existente) con permisos de **read**
|
| 35 |
-
3. Solicita acceso al modelo [facebook/MobileLLM-Pro](https://huggingface.co/facebook/MobileLLM-Pro)
|
| 36 |
-
4. Una vez tengas acceso, ve a: **Settings** → **Variables and secrets** de tu Space
|
| 37 |
-
5. Añade un nuevo **Secret** con:
|
| 38 |
-
- **Name:** `HF_TOKEN`
|
| 39 |
-
- **Value:** Tu token de Hugging Face
|
| 40 |
-
|
| 41 |
-
### 2. Hardware recomendado
|
| 42 |
-
|
| 43 |
-
- **CPU Basic** (gratuito): Funciona, pero puede ser lento
|
| 44 |
-
- **CPU Upgrade** o **GPU**: Recomendado para mejor rendimiento
|
| 45 |
-
|
| 46 |
-
## 💻 Uso de la Interfaz
|
| 47 |
-
|
| 48 |
-
1. Selecciona el tipo de entrada:
|
| 49 |
-
- **Chat**: Para introducir conversaciones en formato de chat
|
| 50 |
-
- **Texto**: Para pegar conversaciones como texto libre
|
| 51 |
-
|
| 52 |
-
2. Ingresa tu conversación
|
| 53 |
-
|
| 54 |
-
3. Haz clic en **"Generar Título"**
|
| 55 |
-
|
| 56 |
-
4. El modelo generará un título breve (máximo 5 palabras)
|
| 57 |
-
|
| 58 |
-
## 🔌 Uso mediante API
|
| 59 |
-
|
| 60 |
-
### Python
|
| 61 |
-
|
| 62 |
-
\`\`\`python
|
| 63 |
-
from gradio_client import Client
|
| 64 |
-
|
| 65 |
-
client = Client("tu-usuario/tu-space-name")
|
| 66 |
-
|
| 67 |
-
# Opción 1: Con lista de conversación
|
| 68 |
-
history = [
|
| 69 |
-
["¿Cómo crear una app web?", "Puedes usar Flask o Django"],
|
| 70 |
-
["¿Cuál es más fácil?", "Flask es más simple para empezar"]
|
| 71 |
-
]
|
| 72 |
-
|
| 73 |
-
result = client.predict(
|
| 74 |
-
input_choice="Chat",
|
| 75 |
-
chat_hist=history,
|
| 76 |
-
text_hist="",
|
| 77 |
-
api_name="/generate_title"
|
| 78 |
-
)
|
| 79 |
-
print(result) # "Creación app web Python"
|
| 80 |
-
|
| 81 |
-
# Opción 2: Con texto
|
| 82 |
-
conversation_text = """
|
| 83 |
-
Usuario: Necesito ayuda con Python
|
| 84 |
-
Asistente: Claro, ¿qué necesitas?
|
| 85 |
-
Usuario: ¿Cómo leer un CSV?
|
| 86 |
-
Asistente: Usa pandas con pd.read_csv()
|
| 87 |
-
"""
|
| 88 |
-
|
| 89 |
-
result = client.predict(
|
| 90 |
-
input_choice="Texto",
|
| 91 |
-
chat_hist=[],
|
| 92 |
-
text_hist=conversation_text,
|
| 93 |
-
api_name="/generate_title"
|
| 94 |
-
)
|
| 95 |
-
print(result) # "Lectura CSV con Python"
|
| 96 |
-
\`\`\`
|
| 97 |
-
|
| 98 |
-
### JavaScript
|
| 99 |
-
|
| 100 |
-
\`\`\`javascript
|
| 101 |
-
import { Client } from "@gradio/client";
|
| 102 |
-
|
| 103 |
-
const client = await Client.connect("tu-usuario/tu-space-name");
|
| 104 |
-
|
| 105 |
-
// Con lista de conversación
|
| 106 |
-
const history = [
|
| 107 |
-
["¿Cómo crear una app web?", "Puedes usar Flask o Django"],
|
| 108 |
-
["¿Cuál es más fácil?", "Flask es más simple para empezar"]
|
| 109 |
-
];
|
| 110 |
-
|
| 111 |
-
const result = await client.predict("/generate_title", {
|
| 112 |
-
input_choice: "Chat",
|
| 113 |
-
chat_hist: history,
|
| 114 |
-
text_hist: ""
|
| 115 |
-
});
|
| 116 |
-
|
| 117 |
-
console.log(result.data); // "Creación app web Python"
|
| 118 |
-
|
| 119 |
-
// Con texto
|
| 120 |
-
const conversationText = \`
|
| 121 |
-
Usuario: Necesito ayuda con Python
|
| 122 |
-
Asistente: Claro, ¿qué necesitas?
|
| 123 |
-
Usuario: ¿Cómo leer un CSV?
|
| 124 |
-
Asistente: Usa pandas con pd.read_csv()
|
| 125 |
-
\`;
|
| 126 |
-
|
| 127 |
-
const result2 = await client.predict("/generate_title", {
|
| 128 |
-
input_choice: "Texto",
|
| 129 |
-
chat_hist: [],
|
| 130 |
-
text_hist: conversationText
|
| 131 |
-
});
|
| 132 |
-
|
| 133 |
-
console.log(result2.data); // "Lectura CSV con Python"
|
| 134 |
-
\`\`\`
|
| 135 |
-
|
| 136 |
-
## 🛠️ Tecnologías
|
| 137 |
-
|
| 138 |
-
- **[MobileLLM-Pro](https://huggingface.co/facebook/MobileLLM-Pro)**: Modelo de lenguaje de 1B parámetros optimizado
|
| 139 |
-
- **[Transformers](https://huggingface.co/docs/transformers)**: Biblioteca de Hugging Face para modelos
|
| 140 |
-
- **[Gradio](https://gradio.app/)**: Framework para interfaces de ML
|
| 141 |
-
- **[PyTorch](https://pytorch.org/)**: Backend para inferencia
|
| 142 |
-
|
| 143 |
-
## 📝 Formato del Historial
|
| 144 |
-
|
| 145 |
-
La aplicación acepta dos formatos:
|
| 146 |
-
|
| 147 |
-
### Formato Chat (lista de tuplas)
|
| 148 |
-
\`\`\`python
|
| 149 |
-
[
|
| 150 |
-
["mensaje usuario 1", "respuesta asistente 1"],
|
| 151 |
-
["mensaje usuario 2", "respuesta asistente 2"]
|
| 152 |
-
]
|
| 153 |
-
\`\`\`
|
| 154 |
-
|
| 155 |
-
### Formato Texto
|
| 156 |
-
\`\`\`
|
| 157 |
-
Usuario: mensaje 1
|
| 158 |
-
Asistente: respuesta 1
|
| 159 |
-
Usuario: mensaje 2
|
| 160 |
-
Asistente: respuesta 2
|
| 161 |
-
\`\`\`
|
| 162 |
-
|
| 163 |
-
## ⚙️ Parámetros del Modelo
|
| 164 |
-
|
| 165 |
-
El modelo se ejecuta con los siguientes parámetros optimizados:
|
| 166 |
-
- **max_new_tokens**: 20 (títulos cortos)
|
| 167 |
-
- **temperature**: 0.7 (creatividad moderada)
|
| 168 |
-
- **top_p**: 0.9 (muestreo nucleus)
|
| 169 |
-
- **do_sample**: True (generación con variabilidad)
|
| 170 |
-
|
| 171 |
-
## 📄 Licencia
|
| 172 |
-
|
| 173 |
-
Este proyecto está bajo licencia MIT.
|
| 174 |
-
|
| 175 |
-
## 🙏 Créditos
|
| 176 |
-
|
| 177 |
-
- Modelo: [Meta Reality Labs - MobileLLM-Pro](https://huggingface.co/facebook/MobileLLM-Pro)
|
| 178 |
-
- Framework: [Gradio](https://gradio.app/)
|
| 179 |
-
- Plataforma: [Hugging Face Spaces](https://huggingface.co/spaces)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
exported-assets/SUMMARY.txt
DELETED
|
@@ -1,130 +0,0 @@
|
|
| 1 |
-
|
| 2 |
-
═══════════════════════════════════════════════════════════════════
|
| 3 |
-
RESUMEN DE ARCHIVOS GENERADOS PARA HUGGING FACE SPACE
|
| 4 |
-
═══════════════════════════════════════════════════════════════════
|
| 5 |
-
|
| 6 |
-
✅ ARCHIVOS PRINCIPALES:
|
| 7 |
-
|
| 8 |
-
1. 📄 app.py (6,489 caracteres)
|
| 9 |
-
- Script principal de la aplicación Gradio
|
| 10 |
-
- Carga MobileLLM-Pro usando HF_TOKEN como secret
|
| 11 |
-
- Interfaz con dos modos: Chat y Texto
|
| 12 |
-
- API nombrada "/generate_title" para clientes Python/JS
|
| 13 |
-
- Función generate_title() que procesa el historial
|
| 14 |
-
- Ejemplos predefinidos integrados
|
| 15 |
-
|
| 16 |
-
2. 📄 requirements.txt (77 caracteres)
|
| 17 |
-
- transformers>=4.36.0
|
| 18 |
-
- torch>=2.0.0
|
| 19 |
-
- gradio>=4.0.0
|
| 20 |
-
- accelerate>=0.25.0
|
| 21 |
-
|
| 22 |
-
3. 📄 README.md (4,712 caracteres)
|
| 23 |
-
- Documentación completa del Space
|
| 24 |
-
- Instrucciones de configuración de HF_TOKEN
|
| 25 |
-
- Ejemplos de uso con Python y JavaScript
|
| 26 |
-
- Documentación de la API
|
| 27 |
-
- Formatos aceptados y parámetros
|
| 28 |
-
|
| 29 |
-
4. 📄 .gitignore
|
| 30 |
-
- Ignorar archivos temporales y de caché
|
| 31 |
-
- Archivos de Python, PyTorch, IDEs
|
| 32 |
-
|
| 33 |
-
5. 📄 DEPLOYMENT_GUIDE.md (4,419 caracteres)
|
| 34 |
-
- Guía paso a paso para desplegar
|
| 35 |
-
- Solución de problemas comunes
|
| 36 |
-
- Optimizaciones opcionales
|
| 37 |
-
|
| 38 |
-
═══════════════════════════════════════════════════════════════════
|
| 39 |
-
CARACTERÍSTICAS IMPLEMENTADAS
|
| 40 |
-
═══════════════════════════════════════════════════════════════════
|
| 41 |
-
|
| 42 |
-
✨ Interfaz Gradio:
|
| 43 |
-
- Dos modos de entrada (Chat/Texto)
|
| 44 |
-
- Componente Chatbot para entrada visual
|
| 45 |
-
- Ejemplos predefinidos
|
| 46 |
-
- Diseño responsive con Row/Column
|
| 47 |
-
- Botón de generación destacado
|
| 48 |
-
|
| 49 |
-
🔒 Seguridad:
|
| 50 |
-
- HF_TOKEN cargado desde secrets de Hugging Face
|
| 51 |
-
- No se expone el token en el código
|
| 52 |
-
- Compatible con modelos gated
|
| 53 |
-
|
| 54 |
-
🚀 Rendimiento:
|
| 55 |
-
- Inferencia con torch.float16 en GPU
|
| 56 |
-
- Fallback a float32 en CPU
|
| 57 |
-
- device_map="auto" para optimización
|
| 58 |
-
- model.eval() para modo inferencia
|
| 59 |
-
- Generación limitada a 20 tokens (títulos cortos)
|
| 60 |
-
|
| 61 |
-
🔌 API:
|
| 62 |
-
- Endpoint nombrado: /generate_title
|
| 63 |
-
- Compatible con gradio_client (Python)
|
| 64 |
-
- Compatible con @gradio/client (JavaScript)
|
| 65 |
-
- Parámetros claramente definidos
|
| 66 |
-
|
| 67 |
-
📝 Generación de Títulos:
|
| 68 |
-
- Prompt optimizado en español
|
| 69 |
-
- Máximo 5 palabras
|
| 70 |
-
- Limpieza automática de salida
|
| 71 |
-
- Manejo de errores robusto
|
| 72 |
-
|
| 73 |
-
═══════════════════════════════════════════════════════════════════
|
| 74 |
-
PRÓXIMOS PASOS
|
| 75 |
-
═══════════════════════════════════════════════════════════════════
|
| 76 |
-
|
| 77 |
-
1. Crear un nuevo Space en Hugging Face:
|
| 78 |
-
https://huggingface.co/new-space
|
| 79 |
-
|
| 80 |
-
2. Solicitar acceso a MobileLLM-Pro:
|
| 81 |
-
https://huggingface.co/facebook/MobileLLM-Pro
|
| 82 |
-
|
| 83 |
-
3. Crear un HF token:
|
| 84 |
-
https://huggingface.co/settings/tokens
|
| 85 |
-
|
| 86 |
-
4. Configurar el secret HF_TOKEN en tu Space:
|
| 87 |
-
Settings → Variables and secrets → New secret
|
| 88 |
-
- Name: HF_TOKEN
|
| 89 |
-
- Value: [tu token]
|
| 90 |
-
|
| 91 |
-
5. Subir los archivos al Space:
|
| 92 |
-
- app.py
|
| 93 |
-
- requirements.txt
|
| 94 |
-
- README.md
|
| 95 |
-
- .gitignore (opcional)
|
| 96 |
-
|
| 97 |
-
6. Esperar a que el Space se construya (5-10 min)
|
| 98 |
-
|
| 99 |
-
7. ¡Probar la aplicación!
|
| 100 |
-
|
| 101 |
-
═══════════════════════════════════════════════════════════════════
|
| 102 |
-
USO DE LA API
|
| 103 |
-
═══════════════════════════════════════════════════════════════════
|
| 104 |
-
|
| 105 |
-
Python:
|
| 106 |
-
-------
|
| 107 |
-
from gradio_client import Client
|
| 108 |
-
|
| 109 |
-
client = Client("tu-usuario/tu-space")
|
| 110 |
-
result = client.predict(
|
| 111 |
-
input_choice="Chat",
|
| 112 |
-
chat_hist=[["Pregunta usuario", "Respuesta IA"]],
|
| 113 |
-
text_hist="",
|
| 114 |
-
api_name="/generate_title"
|
| 115 |
-
)
|
| 116 |
-
print(result)
|
| 117 |
-
|
| 118 |
-
JavaScript:
|
| 119 |
-
-----------
|
| 120 |
-
import { Client } from "@gradio/client";
|
| 121 |
-
|
| 122 |
-
const client = await Client.connect("tu-usuario/tu-space");
|
| 123 |
-
const result = await client.predict("/generate_title", {
|
| 124 |
-
input_choice: "Chat",
|
| 125 |
-
chat_hist: [["Pregunta usuario", "Respuesta IA"]],
|
| 126 |
-
text_hist: ""
|
| 127 |
-
});
|
| 128 |
-
console.log(result.data);
|
| 129 |
-
|
| 130 |
-
════════════════════════════════════════════════════════════════��══
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
exported-assets/app.py
DELETED
|
@@ -1,196 +0,0 @@
|
|
| 1 |
-
import gradio as gr
|
| 2 |
-
import os
|
| 3 |
-
from transformers import AutoTokenizer, AutoModelForCausalLM
|
| 4 |
-
import torch
|
| 5 |
-
|
| 6 |
-
# Obtener el token de HF desde las variables de entorno (secret)
|
| 7 |
-
HF_TOKEN = os.getenv("HF_TOKEN")
|
| 8 |
-
|
| 9 |
-
# Cargar el modelo y tokenizer
|
| 10 |
-
MODEL_NAME = "facebook/MobileLLM-Pro"
|
| 11 |
-
|
| 12 |
-
print("Cargando modelo y tokenizer...")
|
| 13 |
-
tokenizer = AutoTokenizer.from_pretrained(MODEL_NAME, token=HF_TOKEN)
|
| 14 |
-
model = AutoModelForCausalLM.from_pretrained(
|
| 15 |
-
MODEL_NAME,
|
| 16 |
-
token=HF_TOKEN,
|
| 17 |
-
torch_dtype=torch.float16 if torch.cuda.is_available() else torch.float32,
|
| 18 |
-
device_map="auto"
|
| 19 |
-
)
|
| 20 |
-
model.eval()
|
| 21 |
-
print("Modelo cargado exitosamente!")
|
| 22 |
-
|
| 23 |
-
def generate_title(history):
|
| 24 |
-
"""
|
| 25 |
-
Genera un título conciso a partir de un historial de conversación.
|
| 26 |
-
|
| 27 |
-
Args:
|
| 28 |
-
history: Lista de tuplas (usuario, asistente) o string con el historial
|
| 29 |
-
|
| 30 |
-
Returns:
|
| 31 |
-
str: Título generado
|
| 32 |
-
"""
|
| 33 |
-
try:
|
| 34 |
-
# Convertir el historial a texto
|
| 35 |
-
if isinstance(history, list):
|
| 36 |
-
conversation_text = ""
|
| 37 |
-
for i, exchange in enumerate(history):
|
| 38 |
-
if isinstance(exchange, (list, tuple)) and len(exchange) >= 2:
|
| 39 |
-
user_msg = exchange[0] if exchange[0] else ""
|
| 40 |
-
assistant_msg = exchange[1] if exchange[1] else ""
|
| 41 |
-
conversation_text += f"Usuario: {user_msg}\n"
|
| 42 |
-
if assistant_msg:
|
| 43 |
-
conversation_text += f"Asistente: {assistant_msg}\n"
|
| 44 |
-
else:
|
| 45 |
-
conversation_text = str(history)
|
| 46 |
-
|
| 47 |
-
# Crear el prompt para generar el título
|
| 48 |
-
prompt = f"""Basándote en la siguiente conversación, genera un título breve y descriptivo de máximo 5 palabras. Responde SOLO con el título, sin comillas ni formato adicional.
|
| 49 |
-
|
| 50 |
-
Conversación:
|
| 51 |
-
{conversation_text}
|
| 52 |
-
|
| 53 |
-
Título:"""
|
| 54 |
-
|
| 55 |
-
# Tokenizar el prompt
|
| 56 |
-
inputs = tokenizer(prompt, return_tensors="pt", truncation=True, max_length=1024)
|
| 57 |
-
inputs = {k: v.to(model.device) for k, v in inputs.items()}
|
| 58 |
-
|
| 59 |
-
# Generar el título
|
| 60 |
-
with torch.no_grad():
|
| 61 |
-
outputs = model.generate(
|
| 62 |
-
**inputs,
|
| 63 |
-
max_new_tokens=20,
|
| 64 |
-
temperature=0.7,
|
| 65 |
-
do_sample=True,
|
| 66 |
-
top_p=0.9,
|
| 67 |
-
pad_token_id=tokenizer.eos_token_id
|
| 68 |
-
)
|
| 69 |
-
|
| 70 |
-
# Decodificar la respuesta
|
| 71 |
-
generated_text = tokenizer.decode(outputs[0], skip_special_tokens=True)
|
| 72 |
-
|
| 73 |
-
# Extraer solo el título generado (después del prompt)
|
| 74 |
-
title = generated_text[len(prompt):].strip()
|
| 75 |
-
|
| 76 |
-
# Limpiar el título (remover saltos de línea, puntos finales, etc.)
|
| 77 |
-
title = title.split('\n')[0].strip()
|
| 78 |
-
if title.endswith('.'):
|
| 79 |
-
title = title[:-1]
|
| 80 |
-
|
| 81 |
-
return title if title else "Conversación sin título"
|
| 82 |
-
|
| 83 |
-
except Exception as e:
|
| 84 |
-
return f"Error al generar título: {str(e)}"
|
| 85 |
-
|
| 86 |
-
# Crear la interfaz de Gradio
|
| 87 |
-
with gr.Blocks(title="Generador de Títulos con MobileLLM-Pro") as demo:
|
| 88 |
-
gr.Markdown("""
|
| 89 |
-
# 📝 Generador de Títulos para Conversaciones
|
| 90 |
-
|
| 91 |
-
Esta aplicación utiliza **MobileLLM-Pro** de Meta para generar títulos concisos y descriptivos
|
| 92 |
-
a partir de un historial de conversación.
|
| 93 |
-
|
| 94 |
-
### Cómo usar:
|
| 95 |
-
1. Ingresa tu conversación en formato de chat (o pégala como texto)
|
| 96 |
-
2. Haz clic en "Generar Título"
|
| 97 |
-
3. El modelo generará un título breve y descriptivo
|
| 98 |
-
|
| 99 |
-
### Formatos aceptados:
|
| 100 |
-
- Texto libre con la conversación
|
| 101 |
-
- Lista de intercambios usuario/asistente
|
| 102 |
-
""")
|
| 103 |
-
|
| 104 |
-
with gr.Row():
|
| 105 |
-
with gr.Column():
|
| 106 |
-
# Input: puede ser chatbot o texto
|
| 107 |
-
input_type = gr.Radio(
|
| 108 |
-
choices=["Texto", "Chat"],
|
| 109 |
-
value="Chat",
|
| 110 |
-
label="Tipo de entrada"
|
| 111 |
-
)
|
| 112 |
-
|
| 113 |
-
chat_input = gr.Chatbot(
|
| 114 |
-
label="Historial de conversación",
|
| 115 |
-
height=300,
|
| 116 |
-
visible=True
|
| 117 |
-
)
|
| 118 |
-
|
| 119 |
-
text_input = gr.Textbox(
|
| 120 |
-
label="Historial como texto",
|
| 121 |
-
placeholder="Pega aquí tu conversación...",
|
| 122 |
-
lines=10,
|
| 123 |
-
visible=False
|
| 124 |
-
)
|
| 125 |
-
|
| 126 |
-
generate_btn = gr.Button("✨ Generar Título", variant="primary")
|
| 127 |
-
|
| 128 |
-
with gr.Column():
|
| 129 |
-
title_output = gr.Textbox(
|
| 130 |
-
label="Título generado",
|
| 131 |
-
placeholder="El título aparecerá aquí...",
|
| 132 |
-
lines=2
|
| 133 |
-
)
|
| 134 |
-
|
| 135 |
-
gr.Markdown("""
|
| 136 |
-
### Ejemplos de títulos:
|
| 137 |
-
- "Receta de galletas caseras"
|
| 138 |
-
- "Configuración de servidor web"
|
| 139 |
-
- "Análisis de datos Python"
|
| 140 |
-
- "Guía de viaje Roma"
|
| 141 |
-
""")
|
| 142 |
-
|
| 143 |
-
# Ejemplos predefinidos
|
| 144 |
-
gr.Examples(
|
| 145 |
-
examples=[
|
| 146 |
-
[
|
| 147 |
-
[
|
| 148 |
-
["Hola, ¿cómo puedo crear una aplicación web con Python?",
|
| 149 |
-
"Puedes usar frameworks como Flask o Django. Flask es más simple para empezar."],
|
| 150 |
-
["¿Cuál me recomiendas para un proyecto pequeño?",
|
| 151 |
-
"Para proyectos pequeños, te recomiendo Flask. Es ligero y fácil de aprender."]
|
| 152 |
-
]
|
| 153 |
-
],
|
| 154 |
-
[
|
| 155 |
-
[
|
| 156 |
-
["Necesito ayuda con mi código de Python",
|
| 157 |
-
"Claro, ¿qué problema tienes?"],
|
| 158 |
-
["Me da un error cuando intento leer un archivo CSV",
|
| 159 |
-
"Asegúrate de usar pandas y la ruta correcta: pd.read_csv('archivo.csv')"]
|
| 160 |
-
]
|
| 161 |
-
]
|
| 162 |
-
],
|
| 163 |
-
inputs=[chat_input],
|
| 164 |
-
label="Ejemplos de conversaciones"
|
| 165 |
-
)
|
| 166 |
-
|
| 167 |
-
# Funciones para cambiar la visibilidad según el tipo de entrada
|
| 168 |
-
def toggle_input(choice):
|
| 169 |
-
if choice == "Chat":
|
| 170 |
-
return gr.update(visible=True), gr.update(visible=False)
|
| 171 |
-
else:
|
| 172 |
-
return gr.update(visible=False), gr.update(visible=True)
|
| 173 |
-
|
| 174 |
-
input_type.change(
|
| 175 |
-
fn=toggle_input,
|
| 176 |
-
inputs=[input_type],
|
| 177 |
-
outputs=[chat_input, text_input]
|
| 178 |
-
)
|
| 179 |
-
|
| 180 |
-
# Función para manejar la generación según el tipo de entrada
|
| 181 |
-
def generate_from_input(input_choice, chat_hist, text_hist):
|
| 182 |
-
if input_choice == "Chat":
|
| 183 |
-
return generate_title(chat_hist)
|
| 184 |
-
else:
|
| 185 |
-
return generate_title(text_hist)
|
| 186 |
-
|
| 187 |
-
generate_btn.click(
|
| 188 |
-
fn=generate_from_input,
|
| 189 |
-
inputs=[input_type, chat_input, text_input],
|
| 190 |
-
outputs=[title_output],
|
| 191 |
-
api_name="generate_title"
|
| 192 |
-
)
|
| 193 |
-
|
| 194 |
-
# Lanzar la aplicación
|
| 195 |
-
if __name__ == "__main__":
|
| 196 |
-
demo.launch()
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
exported-assets/requirements.txt
DELETED
|
@@ -1,4 +0,0 @@
|
|
| 1 |
-
transformers>=4.36.0
|
| 2 |
-
torch>=2.0.0
|
| 3 |
-
gradio>=4.0.0
|
| 4 |
-
accelerate>=0.25.0
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
exported-assets/script.py
DELETED
|
@@ -1,208 +0,0 @@
|
|
| 1 |
-
|
| 2 |
-
# Voy a crear el código completo para el espacio de Hugging Face
|
| 3 |
-
# Este código generará títulos a partir de un historial de conversación
|
| 4 |
-
|
| 5 |
-
app_py_code = '''import gradio as gr
|
| 6 |
-
import os
|
| 7 |
-
from transformers import AutoTokenizer, AutoModelForCausalLM
|
| 8 |
-
import torch
|
| 9 |
-
|
| 10 |
-
# Obtener el token de HF desde las variables de entorno (secret)
|
| 11 |
-
HF_TOKEN = os.getenv("HF_TOKEN")
|
| 12 |
-
|
| 13 |
-
# Cargar el modelo y tokenizer
|
| 14 |
-
MODEL_NAME = "facebook/MobileLLM-Pro"
|
| 15 |
-
|
| 16 |
-
print("Cargando modelo y tokenizer...")
|
| 17 |
-
tokenizer = AutoTokenizer.from_pretrained(MODEL_NAME, token=HF_TOKEN)
|
| 18 |
-
model = AutoModelForCausalLM.from_pretrained(
|
| 19 |
-
MODEL_NAME,
|
| 20 |
-
token=HF_TOKEN,
|
| 21 |
-
torch_dtype=torch.float16 if torch.cuda.is_available() else torch.float32,
|
| 22 |
-
device_map="auto"
|
| 23 |
-
)
|
| 24 |
-
model.eval()
|
| 25 |
-
print("Modelo cargado exitosamente!")
|
| 26 |
-
|
| 27 |
-
def generate_title(history):
|
| 28 |
-
"""
|
| 29 |
-
Genera un título conciso a partir de un historial de conversación.
|
| 30 |
-
|
| 31 |
-
Args:
|
| 32 |
-
history: Lista de tuplas (usuario, asistente) o string con el historial
|
| 33 |
-
|
| 34 |
-
Returns:
|
| 35 |
-
str: Título generado
|
| 36 |
-
"""
|
| 37 |
-
try:
|
| 38 |
-
# Convertir el historial a texto
|
| 39 |
-
if isinstance(history, list):
|
| 40 |
-
conversation_text = ""
|
| 41 |
-
for i, exchange in enumerate(history):
|
| 42 |
-
if isinstance(exchange, (list, tuple)) and len(exchange) >= 2:
|
| 43 |
-
user_msg = exchange[0] if exchange[0] else ""
|
| 44 |
-
assistant_msg = exchange[1] if exchange[1] else ""
|
| 45 |
-
conversation_text += f"Usuario: {user_msg}\\n"
|
| 46 |
-
if assistant_msg:
|
| 47 |
-
conversation_text += f"Asistente: {assistant_msg}\\n"
|
| 48 |
-
else:
|
| 49 |
-
conversation_text = str(history)
|
| 50 |
-
|
| 51 |
-
# Crear el prompt para generar el título
|
| 52 |
-
prompt = f"""Basándote en la siguiente conversación, genera un título breve y descriptivo de máximo 5 palabras. Responde SOLO con el título, sin comillas ni formato adicional.
|
| 53 |
-
|
| 54 |
-
Conversación:
|
| 55 |
-
{conversation_text}
|
| 56 |
-
|
| 57 |
-
Título:"""
|
| 58 |
-
|
| 59 |
-
# Tokenizar el prompt
|
| 60 |
-
inputs = tokenizer(prompt, return_tensors="pt", truncation=True, max_length=1024)
|
| 61 |
-
inputs = {k: v.to(model.device) for k, v in inputs.items()}
|
| 62 |
-
|
| 63 |
-
# Generar el título
|
| 64 |
-
with torch.no_grad():
|
| 65 |
-
outputs = model.generate(
|
| 66 |
-
**inputs,
|
| 67 |
-
max_new_tokens=20,
|
| 68 |
-
temperature=0.7,
|
| 69 |
-
do_sample=True,
|
| 70 |
-
top_p=0.9,
|
| 71 |
-
pad_token_id=tokenizer.eos_token_id
|
| 72 |
-
)
|
| 73 |
-
|
| 74 |
-
# Decodificar la respuesta
|
| 75 |
-
generated_text = tokenizer.decode(outputs[0], skip_special_tokens=True)
|
| 76 |
-
|
| 77 |
-
# Extraer solo el título generado (después del prompt)
|
| 78 |
-
title = generated_text[len(prompt):].strip()
|
| 79 |
-
|
| 80 |
-
# Limpiar el título (remover saltos de línea, puntos finales, etc.)
|
| 81 |
-
title = title.split('\\n')[0].strip()
|
| 82 |
-
if title.endswith('.'):
|
| 83 |
-
title = title[:-1]
|
| 84 |
-
|
| 85 |
-
return title if title else "Conversación sin título"
|
| 86 |
-
|
| 87 |
-
except Exception as e:
|
| 88 |
-
return f"Error al generar título: {str(e)}"
|
| 89 |
-
|
| 90 |
-
# Crear la interfaz de Gradio
|
| 91 |
-
with gr.Blocks(title="Generador de Títulos con MobileLLM-Pro") as demo:
|
| 92 |
-
gr.Markdown("""
|
| 93 |
-
# 📝 Generador de Títulos para Conversaciones
|
| 94 |
-
|
| 95 |
-
Esta aplicación utiliza **MobileLLM-Pro** de Meta para generar títulos concisos y descriptivos
|
| 96 |
-
a partir de un historial de conversación.
|
| 97 |
-
|
| 98 |
-
### Cómo usar:
|
| 99 |
-
1. Ingresa tu conversación en formato de chat (o pégala como texto)
|
| 100 |
-
2. Haz clic en "Generar Título"
|
| 101 |
-
3. El modelo generará un título breve y descriptivo
|
| 102 |
-
|
| 103 |
-
### Formatos aceptados:
|
| 104 |
-
- Texto libre con la conversación
|
| 105 |
-
- Lista de intercambios usuario/asistente
|
| 106 |
-
""")
|
| 107 |
-
|
| 108 |
-
with gr.Row():
|
| 109 |
-
with gr.Column():
|
| 110 |
-
# Input: puede ser chatbot o texto
|
| 111 |
-
input_type = gr.Radio(
|
| 112 |
-
choices=["Texto", "Chat"],
|
| 113 |
-
value="Chat",
|
| 114 |
-
label="Tipo de entrada"
|
| 115 |
-
)
|
| 116 |
-
|
| 117 |
-
chat_input = gr.Chatbot(
|
| 118 |
-
label="Historial de conversación",
|
| 119 |
-
height=300,
|
| 120 |
-
visible=True
|
| 121 |
-
)
|
| 122 |
-
|
| 123 |
-
text_input = gr.Textbox(
|
| 124 |
-
label="Historial como texto",
|
| 125 |
-
placeholder="Pega aquí tu conversación...",
|
| 126 |
-
lines=10,
|
| 127 |
-
visible=False
|
| 128 |
-
)
|
| 129 |
-
|
| 130 |
-
generate_btn = gr.Button("✨ Generar Título", variant="primary")
|
| 131 |
-
|
| 132 |
-
with gr.Column():
|
| 133 |
-
title_output = gr.Textbox(
|
| 134 |
-
label="Título generado",
|
| 135 |
-
placeholder="El título aparecerá aquí...",
|
| 136 |
-
lines=2
|
| 137 |
-
)
|
| 138 |
-
|
| 139 |
-
gr.Markdown("""
|
| 140 |
-
### Ejemplos de títulos:
|
| 141 |
-
- "Receta de galletas caseras"
|
| 142 |
-
- "Configuración de servidor web"
|
| 143 |
-
- "Análisis de datos Python"
|
| 144 |
-
- "Guía de viaje Roma"
|
| 145 |
-
""")
|
| 146 |
-
|
| 147 |
-
# Ejemplos predefinidos
|
| 148 |
-
gr.Examples(
|
| 149 |
-
examples=[
|
| 150 |
-
[
|
| 151 |
-
[
|
| 152 |
-
["Hola, ¿cómo puedo crear una aplicación web con Python?",
|
| 153 |
-
"Puedes usar frameworks como Flask o Django. Flask es más simple para empezar."],
|
| 154 |
-
["¿Cuál me recomiendas para un proyecto pequeño?",
|
| 155 |
-
"Para proyectos pequeños, te recomiendo Flask. Es ligero y fácil de aprender."]
|
| 156 |
-
]
|
| 157 |
-
],
|
| 158 |
-
[
|
| 159 |
-
[
|
| 160 |
-
["Necesito ayuda con mi código de Python",
|
| 161 |
-
"Claro, ¿qué problema tienes?"],
|
| 162 |
-
["Me da un error cuando intento leer un archivo CSV",
|
| 163 |
-
"Asegúrate de usar pandas y la ruta correcta: pd.read_csv('archivo.csv')"]
|
| 164 |
-
]
|
| 165 |
-
]
|
| 166 |
-
],
|
| 167 |
-
inputs=[chat_input],
|
| 168 |
-
label="Ejemplos de conversaciones"
|
| 169 |
-
)
|
| 170 |
-
|
| 171 |
-
# Funciones para cambiar la visibilidad según el tipo de entrada
|
| 172 |
-
def toggle_input(choice):
|
| 173 |
-
if choice == "Chat":
|
| 174 |
-
return gr.update(visible=True), gr.update(visible=False)
|
| 175 |
-
else:
|
| 176 |
-
return gr.update(visible=False), gr.update(visible=True)
|
| 177 |
-
|
| 178 |
-
input_type.change(
|
| 179 |
-
fn=toggle_input,
|
| 180 |
-
inputs=[input_type],
|
| 181 |
-
outputs=[chat_input, text_input]
|
| 182 |
-
)
|
| 183 |
-
|
| 184 |
-
# Función para manejar la generación según el tipo de entrada
|
| 185 |
-
def generate_from_input(input_choice, chat_hist, text_hist):
|
| 186 |
-
if input_choice == "Chat":
|
| 187 |
-
return generate_title(chat_hist)
|
| 188 |
-
else:
|
| 189 |
-
return generate_title(text_hist)
|
| 190 |
-
|
| 191 |
-
generate_btn.click(
|
| 192 |
-
fn=generate_from_input,
|
| 193 |
-
inputs=[input_type, chat_input, text_input],
|
| 194 |
-
outputs=[title_output],
|
| 195 |
-
api_name="generate_title"
|
| 196 |
-
)
|
| 197 |
-
|
| 198 |
-
# Lanzar la aplicación
|
| 199 |
-
if __name__ == "__main__":
|
| 200 |
-
demo.launch()
|
| 201 |
-
'''
|
| 202 |
-
|
| 203 |
-
# Guardar el código
|
| 204 |
-
with open('app.py', 'w', encoding='utf-8') as f:
|
| 205 |
-
f.write(app_py_code)
|
| 206 |
-
|
| 207 |
-
print("✅ Archivo app.py creado exitosamente")
|
| 208 |
-
print(f"Tamaño: {len(app_py_code)} caracteres")
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
exported-assets/script_1.py
DELETED
|
@@ -1,14 +0,0 @@
|
|
| 1 |
-
|
| 2 |
-
# Crear el archivo requirements.txt con las dependencias necesarias
|
| 3 |
-
requirements_txt = '''transformers>=4.36.0
|
| 4 |
-
torch>=2.0.0
|
| 5 |
-
gradio>=4.0.0
|
| 6 |
-
accelerate>=0.25.0
|
| 7 |
-
'''
|
| 8 |
-
|
| 9 |
-
with open('requirements.txt', 'w', encoding='utf-8') as f:
|
| 10 |
-
f.write(requirements_txt)
|
| 11 |
-
|
| 12 |
-
print("✅ Archivo requirements.txt creado exitosamente")
|
| 13 |
-
print("\nContenido:")
|
| 14 |
-
print(requirements_txt)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
exported-assets/script_2.py
DELETED
|
@@ -1,188 +0,0 @@
|
|
| 1 |
-
|
| 2 |
-
# Crear el archivo README.md con las instrucciones
|
| 3 |
-
readme_md = '''---
|
| 4 |
-
title: Generador de Títulos con MobileLLM-Pro
|
| 5 |
-
emoji: 📝
|
| 6 |
-
colorFrom: blue
|
| 7 |
-
colorTo: purple
|
| 8 |
-
sdk: gradio
|
| 9 |
-
sdk_version: 4.44.0
|
| 10 |
-
app_file: app.py
|
| 11 |
-
pinned: false
|
| 12 |
-
license: mit
|
| 13 |
-
---
|
| 14 |
-
|
| 15 |
-
# 📝 Generador de Títulos para Conversaciones
|
| 16 |
-
|
| 17 |
-
Esta aplicación utiliza **MobileLLM-Pro** de Meta para generar títulos concisos y descriptivos a partir de historiales de conversación.
|
| 18 |
-
|
| 19 |
-
## 🚀 Características
|
| 20 |
-
|
| 21 |
-
- ✨ Genera títulos automáticamente a partir de conversaciones
|
| 22 |
-
- 🎯 Interfaz Gradio fácil de usar
|
| 23 |
-
- 🔌 API accesible mediante Python y JavaScript
|
| 24 |
-
- ⚡ Rápido gracias a MobileLLM-Pro (1B parámetros)
|
| 25 |
-
- 🔒 Usa HF_TOKEN como secret para modelos gated
|
| 26 |
-
|
| 27 |
-
## 📋 Configuración
|
| 28 |
-
|
| 29 |
-
### 1. Configurar el Secret HF_TOKEN
|
| 30 |
-
|
| 31 |
-
Este espacio utiliza el modelo `facebook/MobileLLM-Pro` que es un modelo **gated** (requiere acceso).
|
| 32 |
-
|
| 33 |
-
**Pasos para configurar:**
|
| 34 |
-
|
| 35 |
-
1. Ve a [Hugging Face Settings - Tokens](https://huggingface.co/settings/tokens)
|
| 36 |
-
2. Crea un nuevo token (o usa uno existente) con permisos de **read**
|
| 37 |
-
3. Solicita acceso al modelo [facebook/MobileLLM-Pro](https://huggingface.co/facebook/MobileLLM-Pro)
|
| 38 |
-
4. Una vez tengas acceso, ve a: **Settings** → **Variables and secrets** de tu Space
|
| 39 |
-
5. Añade un nuevo **Secret** con:
|
| 40 |
-
- **Name:** `HF_TOKEN`
|
| 41 |
-
- **Value:** Tu token de Hugging Face
|
| 42 |
-
|
| 43 |
-
### 2. Hardware recomendado
|
| 44 |
-
|
| 45 |
-
- **CPU Basic** (gratuito): Funciona, pero puede ser lento
|
| 46 |
-
- **CPU Upgrade** o **GPU**: Recomendado para mejor rendimiento
|
| 47 |
-
|
| 48 |
-
## 💻 Uso de la Interfaz
|
| 49 |
-
|
| 50 |
-
1. Selecciona el tipo de entrada:
|
| 51 |
-
- **Chat**: Para introducir conversaciones en formato de chat
|
| 52 |
-
- **Texto**: Para pegar conversaciones como texto libre
|
| 53 |
-
|
| 54 |
-
2. Ingresa tu conversación
|
| 55 |
-
|
| 56 |
-
3. Haz clic en **"Generar Título"**
|
| 57 |
-
|
| 58 |
-
4. El modelo generará un título breve (máximo 5 palabras)
|
| 59 |
-
|
| 60 |
-
## 🔌 Uso mediante API
|
| 61 |
-
|
| 62 |
-
### Python
|
| 63 |
-
|
| 64 |
-
\`\`\`python
|
| 65 |
-
from gradio_client import Client
|
| 66 |
-
|
| 67 |
-
client = Client("tu-usuario/tu-space-name")
|
| 68 |
-
|
| 69 |
-
# Opción 1: Con lista de conversación
|
| 70 |
-
history = [
|
| 71 |
-
["¿Cómo crear una app web?", "Puedes usar Flask o Django"],
|
| 72 |
-
["¿Cuál es más fácil?", "Flask es más simple para empezar"]
|
| 73 |
-
]
|
| 74 |
-
|
| 75 |
-
result = client.predict(
|
| 76 |
-
input_choice="Chat",
|
| 77 |
-
chat_hist=history,
|
| 78 |
-
text_hist="",
|
| 79 |
-
api_name="/generate_title"
|
| 80 |
-
)
|
| 81 |
-
print(result) # "Creación app web Python"
|
| 82 |
-
|
| 83 |
-
# Opción 2: Con texto
|
| 84 |
-
conversation_text = """
|
| 85 |
-
Usuario: Necesito ayuda con Python
|
| 86 |
-
Asistente: Claro, ¿qué necesitas?
|
| 87 |
-
Usuario: ¿Cómo leer un CSV?
|
| 88 |
-
Asistente: Usa pandas con pd.read_csv()
|
| 89 |
-
"""
|
| 90 |
-
|
| 91 |
-
result = client.predict(
|
| 92 |
-
input_choice="Texto",
|
| 93 |
-
chat_hist=[],
|
| 94 |
-
text_hist=conversation_text,
|
| 95 |
-
api_name="/generate_title"
|
| 96 |
-
)
|
| 97 |
-
print(result) # "Lectura CSV con Python"
|
| 98 |
-
\`\`\`
|
| 99 |
-
|
| 100 |
-
### JavaScript
|
| 101 |
-
|
| 102 |
-
\`\`\`javascript
|
| 103 |
-
import { Client } from "@gradio/client";
|
| 104 |
-
|
| 105 |
-
const client = await Client.connect("tu-usuario/tu-space-name");
|
| 106 |
-
|
| 107 |
-
// Con lista de conversación
|
| 108 |
-
const history = [
|
| 109 |
-
["¿Cómo crear una app web?", "Puedes usar Flask o Django"],
|
| 110 |
-
["¿Cuál es más fácil?", "Flask es más simple para empezar"]
|
| 111 |
-
];
|
| 112 |
-
|
| 113 |
-
const result = await client.predict("/generate_title", {
|
| 114 |
-
input_choice: "Chat",
|
| 115 |
-
chat_hist: history,
|
| 116 |
-
text_hist: ""
|
| 117 |
-
});
|
| 118 |
-
|
| 119 |
-
console.log(result.data); // "Creación app web Python"
|
| 120 |
-
|
| 121 |
-
// Con texto
|
| 122 |
-
const conversationText = \`
|
| 123 |
-
Usuario: Necesito ayuda con Python
|
| 124 |
-
Asistente: Claro, ¿qué necesitas?
|
| 125 |
-
Usuario: ¿Cómo leer un CSV?
|
| 126 |
-
Asistente: Usa pandas con pd.read_csv()
|
| 127 |
-
\`;
|
| 128 |
-
|
| 129 |
-
const result2 = await client.predict("/generate_title", {
|
| 130 |
-
input_choice: "Texto",
|
| 131 |
-
chat_hist: [],
|
| 132 |
-
text_hist: conversationText
|
| 133 |
-
});
|
| 134 |
-
|
| 135 |
-
console.log(result2.data); // "Lectura CSV con Python"
|
| 136 |
-
\`\`\`
|
| 137 |
-
|
| 138 |
-
## 🛠️ Tecnologías
|
| 139 |
-
|
| 140 |
-
- **[MobileLLM-Pro](https://huggingface.co/facebook/MobileLLM-Pro)**: Modelo de lenguaje de 1B parámetros optimizado
|
| 141 |
-
- **[Transformers](https://huggingface.co/docs/transformers)**: Biblioteca de Hugging Face para modelos
|
| 142 |
-
- **[Gradio](https://gradio.app/)**: Framework para interfaces de ML
|
| 143 |
-
- **[PyTorch](https://pytorch.org/)**: Backend para inferencia
|
| 144 |
-
|
| 145 |
-
## 📝 Formato del Historial
|
| 146 |
-
|
| 147 |
-
La aplicación acepta dos formatos:
|
| 148 |
-
|
| 149 |
-
### Formato Chat (lista de tuplas)
|
| 150 |
-
\`\`\`python
|
| 151 |
-
[
|
| 152 |
-
["mensaje usuario 1", "respuesta asistente 1"],
|
| 153 |
-
["mensaje usuario 2", "respuesta asistente 2"]
|
| 154 |
-
]
|
| 155 |
-
\`\`\`
|
| 156 |
-
|
| 157 |
-
### Formato Texto
|
| 158 |
-
\`\`\`
|
| 159 |
-
Usuario: mensaje 1
|
| 160 |
-
Asistente: respuesta 1
|
| 161 |
-
Usuario: mensaje 2
|
| 162 |
-
Asistente: respuesta 2
|
| 163 |
-
\`\`\`
|
| 164 |
-
|
| 165 |
-
## ⚙️ Parámetros del Modelo
|
| 166 |
-
|
| 167 |
-
El modelo se ejecuta con los siguientes parámetros optimizados:
|
| 168 |
-
- **max_new_tokens**: 20 (títulos cortos)
|
| 169 |
-
- **temperature**: 0.7 (creatividad moderada)
|
| 170 |
-
- **top_p**: 0.9 (muestreo nucleus)
|
| 171 |
-
- **do_sample**: True (generación con variabilidad)
|
| 172 |
-
|
| 173 |
-
## 📄 Licencia
|
| 174 |
-
|
| 175 |
-
Este proyecto está bajo licencia MIT.
|
| 176 |
-
|
| 177 |
-
## 🙏 Créditos
|
| 178 |
-
|
| 179 |
-
- Modelo: [Meta Reality Labs - MobileLLM-Pro](https://huggingface.co/facebook/MobileLLM-Pro)
|
| 180 |
-
- Framework: [Gradio](https://gradio.app/)
|
| 181 |
-
- Plataforma: [Hugging Face Spaces](https://huggingface.co/spaces)
|
| 182 |
-
'''
|
| 183 |
-
|
| 184 |
-
with open('README.md', 'w', encoding='utf-8') as f:
|
| 185 |
-
f.write(readme_md)
|
| 186 |
-
|
| 187 |
-
print("✅ Archivo README.md creado exitosamente")
|
| 188 |
-
print(f"Tamaño: {len(readme_md)} caracteres")
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
exported-assets/script_3.py
DELETED
|
@@ -1,59 +0,0 @@
|
|
| 1 |
-
|
| 2 |
-
# Crear un archivo .gitignore para el espacio
|
| 3 |
-
gitignore = '''# Python
|
| 4 |
-
__pycache__/
|
| 5 |
-
*.py[cod]
|
| 6 |
-
*$py.class
|
| 7 |
-
*.so
|
| 8 |
-
.Python
|
| 9 |
-
env/
|
| 10 |
-
venv/
|
| 11 |
-
ENV/
|
| 12 |
-
build/
|
| 13 |
-
develop-eggs/
|
| 14 |
-
dist/
|
| 15 |
-
downloads/
|
| 16 |
-
eggs/
|
| 17 |
-
.eggs/
|
| 18 |
-
lib/
|
| 19 |
-
lib64/
|
| 20 |
-
parts/
|
| 21 |
-
sdist/
|
| 22 |
-
var/
|
| 23 |
-
wheels/
|
| 24 |
-
*.egg-info/
|
| 25 |
-
.installed.cfg
|
| 26 |
-
*.egg
|
| 27 |
-
|
| 28 |
-
# PyTorch
|
| 29 |
-
*.pt
|
| 30 |
-
*.pth
|
| 31 |
-
*.ckpt
|
| 32 |
-
|
| 33 |
-
# Jupyter Notebook
|
| 34 |
-
.ipynb_checkpoints
|
| 35 |
-
|
| 36 |
-
# Environment variables
|
| 37 |
-
.env
|
| 38 |
-
.env.local
|
| 39 |
-
|
| 40 |
-
# IDEs
|
| 41 |
-
.vscode/
|
| 42 |
-
.idea/
|
| 43 |
-
*.swp
|
| 44 |
-
*.swo
|
| 45 |
-
*~
|
| 46 |
-
|
| 47 |
-
# OS
|
| 48 |
-
.DS_Store
|
| 49 |
-
Thumbs.db
|
| 50 |
-
|
| 51 |
-
# Gradio
|
| 52 |
-
gradio_cached_examples/
|
| 53 |
-
flagged/
|
| 54 |
-
'''
|
| 55 |
-
|
| 56 |
-
with open('.gitignore', 'w', encoding='utf-8') as f:
|
| 57 |
-
f.write(gitignore)
|
| 58 |
-
|
| 59 |
-
print("✅ Archivo .gitignore creado exitosamente")
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
exported-assets/script_4.py
DELETED
|
@@ -1,183 +0,0 @@
|
|
| 1 |
-
|
| 2 |
-
# Crear un documento de instrucciones de despliegue
|
| 3 |
-
deployment_guide = '''# 🚀 Guía de Despliegue en Hugging Face Spaces
|
| 4 |
-
|
| 5 |
-
## Paso 1: Crear el Space
|
| 6 |
-
|
| 7 |
-
1. Ve a https://huggingface.co/new-space
|
| 8 |
-
2. Completa los datos:
|
| 9 |
-
- **Owner**: Tu usuario u organización
|
| 10 |
-
- **Space name**: Por ejemplo, "title-generator-mobilellm"
|
| 11 |
-
- **License**: MIT
|
| 12 |
-
- **Select the Space SDK**: Gradio
|
| 13 |
-
- **Space hardware**: CPU basic (gratis) o superior
|
| 14 |
-
- **Repo type**: Public o Private
|
| 15 |
-
|
| 16 |
-
3. Haz clic en "Create Space"
|
| 17 |
-
|
| 18 |
-
## Paso 2: Configurar el Secret HF_TOKEN
|
| 19 |
-
|
| 20 |
-
**IMPORTANTE**: MobileLLM-Pro es un modelo gated. Debes:
|
| 21 |
-
|
| 22 |
-
1. Solicitar acceso al modelo:
|
| 23 |
-
- Ve a https://huggingface.co/facebook/MobileLLM-Pro
|
| 24 |
-
- Haz clic en "Request access"
|
| 25 |
-
- Espera la aprobación (suele ser automática)
|
| 26 |
-
|
| 27 |
-
2. Crear un token:
|
| 28 |
-
- Ve a https://huggingface.co/settings/tokens
|
| 29 |
-
- Haz clic en "New token"
|
| 30 |
-
- Nombre: "spaces_token" o similar
|
| 31 |
-
- Role: "read"
|
| 32 |
-
- Copia el token generado
|
| 33 |
-
|
| 34 |
-
3. Añadir el secret al Space:
|
| 35 |
-
- En tu Space, ve a **Settings** → **Variables and secrets**
|
| 36 |
-
- Haz clic en "New secret"
|
| 37 |
-
- Name: `HF_TOKEN`
|
| 38 |
-
- Value: Pega tu token
|
| 39 |
-
- Haz clic en "Save"
|
| 40 |
-
|
| 41 |
-
## Paso 3: Subir los archivos
|
| 42 |
-
|
| 43 |
-
Puedes usar Git o la interfaz web:
|
| 44 |
-
|
| 45 |
-
### Opción A: Usando Git
|
| 46 |
-
|
| 47 |
-
\`\`\`bash
|
| 48 |
-
# Clonar el repositorio del Space
|
| 49 |
-
git clone https://huggingface.co/spaces/TU-USUARIO/TU-SPACE
|
| 50 |
-
|
| 51 |
-
# Entrar al directorio
|
| 52 |
-
cd TU-SPACE
|
| 53 |
-
|
| 54 |
-
# Copiar los archivos generados
|
| 55 |
-
cp /ruta/a/app.py .
|
| 56 |
-
cp /ruta/a/requirements.txt .
|
| 57 |
-
cp /ruta/a/README.md .
|
| 58 |
-
cp /ruta/a/.gitignore .
|
| 59 |
-
|
| 60 |
-
# Añadir, commit y push
|
| 61 |
-
git add .
|
| 62 |
-
git commit -m "Añadir aplicación de generación de títulos"
|
| 63 |
-
git push
|
| 64 |
-
\`\`\`
|
| 65 |
-
|
| 66 |
-
### Opción B: Interfaz Web
|
| 67 |
-
|
| 68 |
-
1. Ve a la pestaña "Files" de tu Space
|
| 69 |
-
2. Haz clic en "Add file" → "Create a new file"
|
| 70 |
-
3. Crea cada archivo:
|
| 71 |
-
- `app.py` con el contenido generado
|
| 72 |
-
- `requirements.txt` con las dependencias
|
| 73 |
-
- `README.md` con la documentación
|
| 74 |
-
4. Haz commit de cada archivo
|
| 75 |
-
|
| 76 |
-
## Paso 4: Esperar el Build
|
| 77 |
-
|
| 78 |
-
- El Space comenzará a construirse automáticamente
|
| 79 |
-
- Puedes ver los logs en la pestaña "Logs"
|
| 80 |
-
- El proceso puede tardar 5-10 minutos
|
| 81 |
-
- Estados:
|
| 82 |
-
- 🟡 Building: Instalando dependencias
|
| 83 |
-
- 🟡 Running: Cargando el modelo
|
| 84 |
-
- 🟢 Running: ¡Listo para usar!
|
| 85 |
-
|
| 86 |
-
## Paso 5: Probar la Aplicación
|
| 87 |
-
|
| 88 |
-
1. Una vez que el Space esté en estado "Running":
|
| 89 |
-
- Verás la interfaz de Gradio
|
| 90 |
-
- Prueba los ejemplos predefinidos
|
| 91 |
-
- Ingresa tu propia conversación
|
| 92 |
-
|
| 93 |
-
2. Probar la API:
|
| 94 |
-
\`\`\`python
|
| 95 |
-
from gradio_client import Client
|
| 96 |
-
|
| 97 |
-
client = Client("TU-USUARIO/TU-SPACE")
|
| 98 |
-
result = client.predict(
|
| 99 |
-
input_choice="Chat",
|
| 100 |
-
chat_hist=[["Hola", "¿Cómo estás?"]],
|
| 101 |
-
text_hist="",
|
| 102 |
-
api_name="/generate_title"
|
| 103 |
-
)
|
| 104 |
-
print(result)
|
| 105 |
-
\`\`\`
|
| 106 |
-
|
| 107 |
-
## Solución de Problemas
|
| 108 |
-
|
| 109 |
-
### El Space no arranca
|
| 110 |
-
|
| 111 |
-
- **Revisa los logs**: Ve a la pestaña "Logs"
|
| 112 |
-
- **Verifica el HF_TOKEN**: Asegúrate de que está configurado correctamente
|
| 113 |
-
- **Confirma el acceso al modelo**: Verifica que tienes acceso a MobileLLM-Pro
|
| 114 |
-
|
| 115 |
-
### Error de autenticación
|
| 116 |
-
|
| 117 |
-
\`\`\`
|
| 118 |
-
401 Unauthorized: Access to model facebook/MobileLLM-Pro is restricted
|
| 119 |
-
\`\`\`
|
| 120 |
-
|
| 121 |
-
**Solución**:
|
| 122 |
-
1. Solicita acceso en https://huggingface.co/facebook/MobileLLM-Pro
|
| 123 |
-
2. Verifica que tu token tenga permisos de lectura
|
| 124 |
-
3. Asegúrate de que el secret `HF_TOKEN` esté configurado
|
| 125 |
-
|
| 126 |
-
### Out of memory
|
| 127 |
-
|
| 128 |
-
Si usas CPU Basic y obtienes errores de memoria:
|
| 129 |
-
|
| 130 |
-
**Solución**:
|
| 131 |
-
- Upgrade a CPU Upgrade o GPU en Settings → Hardware
|
| 132 |
-
- O modifica el código para usar `torch.float32` en CPU
|
| 133 |
-
|
| 134 |
-
### El modelo tarda mucho
|
| 135 |
-
|
| 136 |
-
En CPU Basic, la primera inferencia puede tardar 30-60 segundos.
|
| 137 |
-
|
| 138 |
-
**Soluciones**:
|
| 139 |
-
- Upgrade a hardware más potente
|
| 140 |
-
- Implementar caché de ejemplos comunes
|
| 141 |
-
- Usar una GPU (más rápido pero de pago)
|
| 142 |
-
|
| 143 |
-
## Optimizaciones Opcionales
|
| 144 |
-
|
| 145 |
-
### 1. Persistencia del modelo (evitar recarga)
|
| 146 |
-
|
| 147 |
-
Hugging Face Spaces carga el modelo cada vez que se reinicia. Para persistencia:
|
| 148 |
-
|
| 149 |
-
- Usa **Space persistencia** (opción de pago)
|
| 150 |
-
- O acepta el tiempo de carga inicial
|
| 151 |
-
|
| 152 |
-
### 2. Cambiar a GPU
|
| 153 |
-
|
| 154 |
-
En Settings → Hardware:
|
| 155 |
-
- Selecciona "T4 small" o superior
|
| 156 |
-
- Costo: ~$0.60/hora
|
| 157 |
-
- Mucho más rápido
|
| 158 |
-
|
| 159 |
-
### 3. Añadir analytics
|
| 160 |
-
|
| 161 |
-
Añade al final de app.py:
|
| 162 |
-
|
| 163 |
-
\`\`\`python
|
| 164 |
-
demo.launch(analytics_enabled=True)
|
| 165 |
-
\`\`\`
|
| 166 |
-
|
| 167 |
-
## Recursos Adicionales
|
| 168 |
-
|
| 169 |
-
- [Documentación de Spaces](https://huggingface.co/docs/hub/spaces)
|
| 170 |
-
- [Gradio Docs](https://gradio.app/docs)
|
| 171 |
-
- [MobileLLM-Pro](https://huggingface.co/facebook/MobileLLM-Pro)
|
| 172 |
-
- [Transformers Docs](https://huggingface.co/docs/transformers)
|
| 173 |
-
|
| 174 |
-
## Contacto
|
| 175 |
-
|
| 176 |
-
Para problemas o preguntas, abre un issue en el repositorio del Space.
|
| 177 |
-
'''
|
| 178 |
-
|
| 179 |
-
with open('DEPLOYMENT_GUIDE.md', 'w', encoding='utf-8') as f:
|
| 180 |
-
f.write(deployment_guide)
|
| 181 |
-
|
| 182 |
-
print("✅ Archivo DEPLOYMENT_GUIDE.md creado exitosamente")
|
| 183 |
-
print(f"Tamaño: {len(deployment_guide)} caracteres")
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
exported-assets/script_5.py
DELETED
|
@@ -1,141 +0,0 @@
|
|
| 1 |
-
|
| 2 |
-
# Crear un resumen de todos los archivos generados
|
| 3 |
-
summary = """
|
| 4 |
-
═══════════════════════════════════════════════════════════════════
|
| 5 |
-
RESUMEN DE ARCHIVOS GENERADOS PARA HUGGING FACE SPACE
|
| 6 |
-
═══════════════════════════════════════════════════════════════════
|
| 7 |
-
|
| 8 |
-
✅ ARCHIVOS PRINCIPALES:
|
| 9 |
-
|
| 10 |
-
1. 📄 app.py (6,489 caracteres)
|
| 11 |
-
- Script principal de la aplicación Gradio
|
| 12 |
-
- Carga MobileLLM-Pro usando HF_TOKEN como secret
|
| 13 |
-
- Interfaz con dos modos: Chat y Texto
|
| 14 |
-
- API nombrada "/generate_title" para clientes Python/JS
|
| 15 |
-
- Función generate_title() que procesa el historial
|
| 16 |
-
- Ejemplos predefinidos integrados
|
| 17 |
-
|
| 18 |
-
2. 📄 requirements.txt (77 caracteres)
|
| 19 |
-
- transformers>=4.36.0
|
| 20 |
-
- torch>=2.0.0
|
| 21 |
-
- gradio>=4.0.0
|
| 22 |
-
- accelerate>=0.25.0
|
| 23 |
-
|
| 24 |
-
3. 📄 README.md (4,712 caracteres)
|
| 25 |
-
- Documentación completa del Space
|
| 26 |
-
- Instrucciones de configuración de HF_TOKEN
|
| 27 |
-
- Ejemplos de uso con Python y JavaScript
|
| 28 |
-
- Documentación de la API
|
| 29 |
-
- Formatos aceptados y parámetros
|
| 30 |
-
|
| 31 |
-
4. 📄 .gitignore
|
| 32 |
-
- Ignorar archivos temporales y de caché
|
| 33 |
-
- Archivos de Python, PyTorch, IDEs
|
| 34 |
-
|
| 35 |
-
5. 📄 DEPLOYMENT_GUIDE.md (4,419 caracteres)
|
| 36 |
-
- Guía paso a paso para desplegar
|
| 37 |
-
- Solución de problemas comunes
|
| 38 |
-
- Optimizaciones opcionales
|
| 39 |
-
|
| 40 |
-
═══════════════════════════════════════════════════════════════════
|
| 41 |
-
CARACTERÍSTICAS IMPLEMENTADAS
|
| 42 |
-
═══════════════════════════════════════════════════════════════════
|
| 43 |
-
|
| 44 |
-
✨ Interfaz Gradio:
|
| 45 |
-
- Dos modos de entrada (Chat/Texto)
|
| 46 |
-
- Componente Chatbot para entrada visual
|
| 47 |
-
- Ejemplos predefinidos
|
| 48 |
-
- Diseño responsive con Row/Column
|
| 49 |
-
- Botón de generación destacado
|
| 50 |
-
|
| 51 |
-
🔒 Seguridad:
|
| 52 |
-
- HF_TOKEN cargado desde secrets de Hugging Face
|
| 53 |
-
- No se expone el token en el código
|
| 54 |
-
- Compatible con modelos gated
|
| 55 |
-
|
| 56 |
-
🚀 Rendimiento:
|
| 57 |
-
- Inferencia con torch.float16 en GPU
|
| 58 |
-
- Fallback a float32 en CPU
|
| 59 |
-
- device_map="auto" para optimización
|
| 60 |
-
- model.eval() para modo inferencia
|
| 61 |
-
- Generación limitada a 20 tokens (títulos cortos)
|
| 62 |
-
|
| 63 |
-
🔌 API:
|
| 64 |
-
- Endpoint nombrado: /generate_title
|
| 65 |
-
- Compatible con gradio_client (Python)
|
| 66 |
-
- Compatible con @gradio/client (JavaScript)
|
| 67 |
-
- Parámetros claramente definidos
|
| 68 |
-
|
| 69 |
-
📝 Generación de Títulos:
|
| 70 |
-
- Prompt optimizado en español
|
| 71 |
-
- Máximo 5 palabras
|
| 72 |
-
- Limpieza automática de salida
|
| 73 |
-
- Manejo de errores robusto
|
| 74 |
-
|
| 75 |
-
═══════════════════════════════════════════════════════════════════
|
| 76 |
-
PRÓXIMOS PASOS
|
| 77 |
-
═══════════════════════════════════════════════════════════════════
|
| 78 |
-
|
| 79 |
-
1. Crear un nuevo Space en Hugging Face:
|
| 80 |
-
https://huggingface.co/new-space
|
| 81 |
-
|
| 82 |
-
2. Solicitar acceso a MobileLLM-Pro:
|
| 83 |
-
https://huggingface.co/facebook/MobileLLM-Pro
|
| 84 |
-
|
| 85 |
-
3. Crear un HF token:
|
| 86 |
-
https://huggingface.co/settings/tokens
|
| 87 |
-
|
| 88 |
-
4. Configurar el secret HF_TOKEN en tu Space:
|
| 89 |
-
Settings → Variables and secrets → New secret
|
| 90 |
-
- Name: HF_TOKEN
|
| 91 |
-
- Value: [tu token]
|
| 92 |
-
|
| 93 |
-
5. Subir los archivos al Space:
|
| 94 |
-
- app.py
|
| 95 |
-
- requirements.txt
|
| 96 |
-
- README.md
|
| 97 |
-
- .gitignore (opcional)
|
| 98 |
-
|
| 99 |
-
6. Esperar a que el Space se construya (5-10 min)
|
| 100 |
-
|
| 101 |
-
7. ¡Probar la aplicación!
|
| 102 |
-
|
| 103 |
-
═══════════════════════════════════════════════════════════════════
|
| 104 |
-
USO DE LA API
|
| 105 |
-
═══════════════════════════════════════════════════════════════════
|
| 106 |
-
|
| 107 |
-
Python:
|
| 108 |
-
-------
|
| 109 |
-
from gradio_client import Client
|
| 110 |
-
|
| 111 |
-
client = Client("tu-usuario/tu-space")
|
| 112 |
-
result = client.predict(
|
| 113 |
-
input_choice="Chat",
|
| 114 |
-
chat_hist=[["Pregunta usuario", "Respuesta IA"]],
|
| 115 |
-
text_hist="",
|
| 116 |
-
api_name="/generate_title"
|
| 117 |
-
)
|
| 118 |
-
print(result)
|
| 119 |
-
|
| 120 |
-
JavaScript:
|
| 121 |
-
-----------
|
| 122 |
-
import { Client } from "@gradio/client";
|
| 123 |
-
|
| 124 |
-
const client = await Client.connect("tu-usuario/tu-space");
|
| 125 |
-
const result = await client.predict("/generate_title", {
|
| 126 |
-
input_choice: "Chat",
|
| 127 |
-
chat_hist: [["Pregunta usuario", "Respuesta IA"]],
|
| 128 |
-
text_hist: ""
|
| 129 |
-
});
|
| 130 |
-
console.log(result.data);
|
| 131 |
-
|
| 132 |
-
══════════════════════════════════════════���════════════════════════
|
| 133 |
-
"""
|
| 134 |
-
|
| 135 |
-
print(summary)
|
| 136 |
-
|
| 137 |
-
# Guardar el resumen en un archivo
|
| 138 |
-
with open('SUMMARY.txt', 'w', encoding='utf-8') as f:
|
| 139 |
-
f.write(summary)
|
| 140 |
-
|
| 141 |
-
print("\n✅ Resumen guardado en SUMMARY.txt")
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
exported-assets/script_6.py
DELETED
|
@@ -1,442 +0,0 @@
|
|
| 1 |
-
|
| 2 |
-
# Crear un archivo con ejemplos de uso extendidos
|
| 3 |
-
examples_file = '''# 📚 Ejemplos de Uso Extendidos
|
| 4 |
-
|
| 5 |
-
## Ejemplo 1: Uso Básico con Python
|
| 6 |
-
|
| 7 |
-
\`\`\`python
|
| 8 |
-
from gradio_client import Client
|
| 9 |
-
|
| 10 |
-
# Conectar al Space
|
| 11 |
-
client = Client("tu-usuario/title-generator-mobilellm")
|
| 12 |
-
|
| 13 |
-
# Ejemplo con historial de chat
|
| 14 |
-
history = [
|
| 15 |
-
["Hola, necesito ayuda para cocinar pasta",
|
| 16 |
-
"¡Claro! Te puedo ayudar con recetas de pasta. ¿Qué tipo de pasta prefieres?"],
|
| 17 |
-
["Me gusta la carbonara",
|
| 18 |
-
"Excelente elección. Necesitarás: huevos, guanciale, queso pecorino romano y pimienta negra."]
|
| 19 |
-
]
|
| 20 |
-
|
| 21 |
-
result = client.predict(
|
| 22 |
-
input_choice="Chat",
|
| 23 |
-
chat_hist=history,
|
| 24 |
-
text_hist="",
|
| 25 |
-
api_name="/generate_title"
|
| 26 |
-
)
|
| 27 |
-
|
| 28 |
-
print(f"Título generado: {result}")
|
| 29 |
-
# Output: "Receta de pasta carbonara"
|
| 30 |
-
\`\`\`
|
| 31 |
-
|
| 32 |
-
## Ejemplo 2: Uso con Texto Libre
|
| 33 |
-
|
| 34 |
-
\`\`\`python
|
| 35 |
-
from gradio_client import Client
|
| 36 |
-
|
| 37 |
-
client = Client("tu-usuario/title-generator-mobilellm")
|
| 38 |
-
|
| 39 |
-
# Conversación como texto
|
| 40 |
-
conversation = """
|
| 41 |
-
Usuario: ¿Puedes ayudarme con un problema de programación?
|
| 42 |
-
Asistente: Por supuesto. ¿Qué lenguaje estás usando?
|
| 43 |
-
Usuario: Python. Necesito iterar sobre un diccionario
|
| 44 |
-
Asistente: Puedes usar dict.items() así: for key, value in mi_dict.items()
|
| 45 |
-
Usuario: Perfecto, gracias!
|
| 46 |
-
"""
|
| 47 |
-
|
| 48 |
-
result = client.predict(
|
| 49 |
-
input_choice="Texto",
|
| 50 |
-
chat_hist=[],
|
| 51 |
-
text_hist=conversation,
|
| 52 |
-
api_name="/generate_title"
|
| 53 |
-
)
|
| 54 |
-
|
| 55 |
-
print(f"Título generado: {result}")
|
| 56 |
-
# Output: "Iteración diccionarios en Python"
|
| 57 |
-
\`\`\`
|
| 58 |
-
|
| 59 |
-
## Ejemplo 3: Integración con JavaScript/Node.js
|
| 60 |
-
|
| 61 |
-
\`\`\`javascript
|
| 62 |
-
import { Client } from "@gradio/client";
|
| 63 |
-
|
| 64 |
-
async function generateTitle() {
|
| 65 |
-
const client = await Client.connect("tu-usuario/title-generator-mobilellm");
|
| 66 |
-
|
| 67 |
-
// Historial de conversación
|
| 68 |
-
const history = [
|
| 69 |
-
["¿Cuál es la mejor forma de aprender machine learning?",
|
| 70 |
-
"Te recomiendo empezar con curso de Andrew Ng en Coursera"],
|
| 71 |
-
["¿Necesito saber mucha matemática?",
|
| 72 |
-
"Es útil conocer álgebra lineal, cálculo y estadística básica"]
|
| 73 |
-
];
|
| 74 |
-
|
| 75 |
-
const result = await client.predict("/generate_title", {
|
| 76 |
-
input_choice: "Chat",
|
| 77 |
-
chat_hist: history,
|
| 78 |
-
text_hist: ""
|
| 79 |
-
});
|
| 80 |
-
|
| 81 |
-
console.log(`Título generado: ${result.data}`);
|
| 82 |
-
// Output: "Aprendizaje de Machine Learning"
|
| 83 |
-
}
|
| 84 |
-
|
| 85 |
-
generateTitle();
|
| 86 |
-
\`\`\`
|
| 87 |
-
|
| 88 |
-
## Ejemplo 4: Uso en el Navegador (JavaScript)
|
| 89 |
-
|
| 90 |
-
\`\`\`html
|
| 91 |
-
<!DOCTYPE html>
|
| 92 |
-
<html>
|
| 93 |
-
<head>
|
| 94 |
-
<title>Generador de Títulos</title>
|
| 95 |
-
</head>
|
| 96 |
-
<body>
|
| 97 |
-
<h1>Generador de Títulos de Conversaciones</h1>
|
| 98 |
-
<div id="result"></div>
|
| 99 |
-
|
| 100 |
-
<script type="module">
|
| 101 |
-
import { Client } from "https://cdn.jsdelivr.net/npm/@gradio/client/dist/index.min.js";
|
| 102 |
-
|
| 103 |
-
async function generateTitle() {
|
| 104 |
-
const client = await Client.connect("tu-usuario/title-generator-mobilellm");
|
| 105 |
-
|
| 106 |
-
const conversation = `
|
| 107 |
-
Usuario: Quiero crear una app móvil
|
| 108 |
-
Asistente: ¿Para Android, iOS o ambos?
|
| 109 |
-
Usuario: Para ambos
|
| 110 |
-
Asistente: Te recomiendo usar Flutter o React Native
|
| 111 |
-
`;
|
| 112 |
-
|
| 113 |
-
const result = await client.predict("/generate_title", {
|
| 114 |
-
input_choice: "Texto",
|
| 115 |
-
chat_hist: [],
|
| 116 |
-
text_hist: conversation
|
| 117 |
-
});
|
| 118 |
-
|
| 119 |
-
document.getElementById('result').textContent =
|
| 120 |
-
`Título: ${result.data}`;
|
| 121 |
-
}
|
| 122 |
-
|
| 123 |
-
generateTitle();
|
| 124 |
-
</script>
|
| 125 |
-
</body>
|
| 126 |
-
</html>
|
| 127 |
-
\`\`\`
|
| 128 |
-
|
| 129 |
-
## Ejemplo 5: Procesamiento por Lotes
|
| 130 |
-
|
| 131 |
-
\`\`\`python
|
| 132 |
-
from gradio_client import Client
|
| 133 |
-
import time
|
| 134 |
-
|
| 135 |
-
def generate_titles_batch(conversations):
|
| 136 |
-
"""Genera títulos para múltiples conversaciones"""
|
| 137 |
-
client = Client("tu-usuario/title-generator-mobilellm")
|
| 138 |
-
results = []
|
| 139 |
-
|
| 140 |
-
for i, conv in enumerate(conversations, 1):
|
| 141 |
-
print(f"Procesando conversación {i}/{len(conversations)}...")
|
| 142 |
-
|
| 143 |
-
result = client.predict(
|
| 144 |
-
input_choice="Chat",
|
| 145 |
-
chat_hist=conv,
|
| 146 |
-
text_hist="",
|
| 147 |
-
api_name="/generate_title"
|
| 148 |
-
)
|
| 149 |
-
|
| 150 |
-
results.append({
|
| 151 |
-
'conversation': conv,
|
| 152 |
-
'title': result
|
| 153 |
-
})
|
| 154 |
-
|
| 155 |
-
# Pequeña pausa para no sobrecargar el servidor
|
| 156 |
-
time.sleep(1)
|
| 157 |
-
|
| 158 |
-
return results
|
| 159 |
-
|
| 160 |
-
# Ejemplo de uso
|
| 161 |
-
conversations = [
|
| 162 |
-
[["¿Cómo instalar Python?", "Puedes descargarlo desde python.org"]],
|
| 163 |
-
[["¿Qué es Docker?", "Es una plataforma de contenedores"]],
|
| 164 |
-
[["Ayuda con SQL", "¿Qué necesitas saber sobre SQL?"]]
|
| 165 |
-
]
|
| 166 |
-
|
| 167 |
-
titles = generate_titles_batch(conversations)
|
| 168 |
-
|
| 169 |
-
for item in titles:
|
| 170 |
-
print(f"Título: {item['title']}")
|
| 171 |
-
\`\`\`
|
| 172 |
-
|
| 173 |
-
## Ejemplo 6: Integración con FastAPI
|
| 174 |
-
|
| 175 |
-
\`\`\`python
|
| 176 |
-
from fastapi import FastAPI, HTTPException
|
| 177 |
-
from pydantic import BaseModel
|
| 178 |
-
from gradio_client import Client
|
| 179 |
-
from typing import List, Tuple
|
| 180 |
-
|
| 181 |
-
app = FastAPI()
|
| 182 |
-
|
| 183 |
-
# Cliente de Gradio (inicializado una vez)
|
| 184 |
-
gradio_client = Client("tu-usuario/title-generator-mobilellm")
|
| 185 |
-
|
| 186 |
-
class ConversationRequest(BaseModel):
|
| 187 |
-
messages: List[Tuple[str, str]]
|
| 188 |
-
|
| 189 |
-
class TitleResponse(BaseModel):
|
| 190 |
-
title: str
|
| 191 |
-
|
| 192 |
-
@app.post("/generate-title", response_model=TitleResponse)
|
| 193 |
-
async def generate_title_endpoint(request: ConversationRequest):
|
| 194 |
-
"""
|
| 195 |
-
Endpoint para generar títulos desde tu API
|
| 196 |
-
"""
|
| 197 |
-
try:
|
| 198 |
-
result = gradio_client.predict(
|
| 199 |
-
input_choice="Chat",
|
| 200 |
-
chat_hist=request.messages,
|
| 201 |
-
text_hist="",
|
| 202 |
-
api_name="/generate_title"
|
| 203 |
-
)
|
| 204 |
-
|
| 205 |
-
return TitleResponse(title=result)
|
| 206 |
-
|
| 207 |
-
except Exception as e:
|
| 208 |
-
raise HTTPException(status_code=500, detail=str(e))
|
| 209 |
-
|
| 210 |
-
# Ejemplo de uso:
|
| 211 |
-
# POST http://localhost:8000/generate-title
|
| 212 |
-
# Body: {
|
| 213 |
-
# "messages": [
|
| 214 |
-
# ["Hola", "¿Cómo estás?"],
|
| 215 |
-
# ["Bien, gracias", "Me alegro"]
|
| 216 |
-
# ]
|
| 217 |
-
# }
|
| 218 |
-
\`\`\`
|
| 219 |
-
|
| 220 |
-
## Ejemplo 7: CLI (Command Line Interface)
|
| 221 |
-
|
| 222 |
-
\`\`\`python
|
| 223 |
-
#!/usr/bin/env python3
|
| 224 |
-
"""
|
| 225 |
-
Script CLI para generar títulos de conversaciones
|
| 226 |
-
Uso: python cli_title_generator.py
|
| 227 |
-
"""
|
| 228 |
-
|
| 229 |
-
import sys
|
| 230 |
-
from gradio_client import Client
|
| 231 |
-
|
| 232 |
-
def main():
|
| 233 |
-
if len(sys.argv) < 2:
|
| 234 |
-
print("Uso: python cli_title_generator.py '<conversación>'")
|
| 235 |
-
print("Ejemplo: python cli_title_generator.py 'Usuario: Hola\\nAsistente: Hola'")
|
| 236 |
-
sys.exit(1)
|
| 237 |
-
|
| 238 |
-
conversation = sys.argv[1]
|
| 239 |
-
|
| 240 |
-
print("🔄 Conectando al servidor...")
|
| 241 |
-
client = Client("tu-usuario/title-generator-mobilellm")
|
| 242 |
-
|
| 243 |
-
print("✨ Generando título...")
|
| 244 |
-
result = client.predict(
|
| 245 |
-
input_choice="Texto",
|
| 246 |
-
chat_hist=[],
|
| 247 |
-
text_hist=conversation,
|
| 248 |
-
api_name="/generate_title"
|
| 249 |
-
)
|
| 250 |
-
|
| 251 |
-
print(f"\\n📝 Título generado: {result}")
|
| 252 |
-
|
| 253 |
-
if __name__ == "__main__":
|
| 254 |
-
main()
|
| 255 |
-
\`\`\`
|
| 256 |
-
|
| 257 |
-
Uso:
|
| 258 |
-
\`\`\`bash
|
| 259 |
-
chmod +x cli_title_generator.py
|
| 260 |
-
./cli_title_generator.py "Usuario: Hola\\nAsistente: ¿En qué puedo ayudarte?"
|
| 261 |
-
\`\`\`
|
| 262 |
-
|
| 263 |
-
## Ejemplo 8: Integración con Discord Bot
|
| 264 |
-
|
| 265 |
-
\`\`\`python
|
| 266 |
-
import discord
|
| 267 |
-
from discord.ext import commands
|
| 268 |
-
from gradio_client import Client
|
| 269 |
-
|
| 270 |
-
bot = commands.Bot(command_prefix='!')
|
| 271 |
-
gradio_client = Client("tu-usuario/title-generator-mobilellm")
|
| 272 |
-
|
| 273 |
-
@bot.command(name='title')
|
| 274 |
-
async def generate_title_command(ctx):
|
| 275 |
-
"""Genera un título para los últimos mensajes del canal"""
|
| 276 |
-
|
| 277 |
-
# Obtener últimos 10 mensajes
|
| 278 |
-
messages = []
|
| 279 |
-
async for msg in ctx.channel.history(limit=10):
|
| 280 |
-
if not msg.author.bot:
|
| 281 |
-
messages.append([
|
| 282 |
-
msg.author.name,
|
| 283 |
-
msg.content
|
| 284 |
-
])
|
| 285 |
-
|
| 286 |
-
messages.reverse()
|
| 287 |
-
|
| 288 |
-
if len(messages) < 2:
|
| 289 |
-
await ctx.send("❌ No hay suficientes mensajes para generar un título")
|
| 290 |
-
return
|
| 291 |
-
|
| 292 |
-
await ctx.send("🔄 Generando título...")
|
| 293 |
-
|
| 294 |
-
try:
|
| 295 |
-
result = gradio_client.predict(
|
| 296 |
-
input_choice="Chat",
|
| 297 |
-
chat_hist=messages,
|
| 298 |
-
text_hist="",
|
| 299 |
-
api_name="/generate_title"
|
| 300 |
-
)
|
| 301 |
-
|
| 302 |
-
await ctx.send(f"📝 **Título:** {result}")
|
| 303 |
-
|
| 304 |
-
except Exception as e:
|
| 305 |
-
await ctx.send(f"❌ Error: {str(e)}")
|
| 306 |
-
|
| 307 |
-
bot.run('TU_TOKEN_DE_DISCORD')
|
| 308 |
-
\`\`\`
|
| 309 |
-
|
| 310 |
-
## Ejemplo 9: Manejo de Errores Robusto
|
| 311 |
-
|
| 312 |
-
\`\`\`python
|
| 313 |
-
from gradio_client import Client
|
| 314 |
-
import time
|
| 315 |
-
from typing import Optional
|
| 316 |
-
|
| 317 |
-
class TitleGenerator:
|
| 318 |
-
def __init__(self, space_name: str, max_retries: int = 3):
|
| 319 |
-
self.space_name = space_name
|
| 320 |
-
self.max_retries = max_retries
|
| 321 |
-
self.client = None
|
| 322 |
-
|
| 323 |
-
def connect(self):
|
| 324 |
-
"""Conectar al Space con reintentos"""
|
| 325 |
-
for attempt in range(self.max_retries):
|
| 326 |
-
try:
|
| 327 |
-
print(f"Intento de conexión {attempt + 1}/{self.max_retries}...")
|
| 328 |
-
self.client = Client(self.space_name)
|
| 329 |
-
print("✅ Conectado exitosamente")
|
| 330 |
-
return True
|
| 331 |
-
except Exception as e:
|
| 332 |
-
print(f"❌ Error en intento {attempt + 1}: {str(e)}")
|
| 333 |
-
if attempt < self.max_retries - 1:
|
| 334 |
-
time.sleep(2 ** attempt) # Backoff exponencial
|
| 335 |
-
return False
|
| 336 |
-
|
| 337 |
-
def generate(self, history: list) -> Optional[str]:
|
| 338 |
-
"""Generar título con manejo de errores"""
|
| 339 |
-
if not self.client:
|
| 340 |
-
if not self.connect():
|
| 341 |
-
return None
|
| 342 |
-
|
| 343 |
-
try:
|
| 344 |
-
result = self.client.predict(
|
| 345 |
-
input_choice="Chat",
|
| 346 |
-
chat_hist=history,
|
| 347 |
-
text_hist="",
|
| 348 |
-
api_name="/generate_title"
|
| 349 |
-
)
|
| 350 |
-
return result
|
| 351 |
-
|
| 352 |
-
except Exception as e:
|
| 353 |
-
print(f"❌ Error al generar título: {str(e)}")
|
| 354 |
-
# Intentar reconectar
|
| 355 |
-
if self.connect():
|
| 356 |
-
return self.generate(history)
|
| 357 |
-
return None
|
| 358 |
-
|
| 359 |
-
# Uso
|
| 360 |
-
generator = TitleGenerator("tu-usuario/title-generator-mobilellm")
|
| 361 |
-
history = [["Hola", "¿Qué tal?"]]
|
| 362 |
-
title = generator.generate(history)
|
| 363 |
-
|
| 364 |
-
if title:
|
| 365 |
-
print(f"✅ Título: {title}")
|
| 366 |
-
else:
|
| 367 |
-
print("❌ No se pudo generar el título")
|
| 368 |
-
\`\`\`
|
| 369 |
-
|
| 370 |
-
## Ejemplo 10: Stream de Conversaciones en Tiempo Real
|
| 371 |
-
|
| 372 |
-
\`\`\`python
|
| 373 |
-
from gradio_client import Client
|
| 374 |
-
import json
|
| 375 |
-
|
| 376 |
-
class ConversationTitleTracker:
|
| 377 |
-
def __init__(self, space_name: str):
|
| 378 |
-
self.client = Client(space_name)
|
| 379 |
-
self.conversation = []
|
| 380 |
-
self.title = None
|
| 381 |
-
|
| 382 |
-
def add_message(self, user_msg: str, assistant_msg: str):
|
| 383 |
-
"""Añadir un intercambio a la conversación"""
|
| 384 |
-
self.conversation.append([user_msg, assistant_msg])
|
| 385 |
-
|
| 386 |
-
# Regenerar título cada 3 intercambios
|
| 387 |
-
if len(self.conversation) % 3 == 0:
|
| 388 |
-
self.update_title()
|
| 389 |
-
|
| 390 |
-
def update_title(self):
|
| 391 |
-
"""Actualizar el título basado en la conversación actual"""
|
| 392 |
-
try:
|
| 393 |
-
self.title = self.client.predict(
|
| 394 |
-
input_choice="Chat",
|
| 395 |
-
chat_hist=self.conversation,
|
| 396 |
-
text_hist="",
|
| 397 |
-
api_name="/generate_title"
|
| 398 |
-
)
|
| 399 |
-
print(f"📝 Nuevo título: {self.title}")
|
| 400 |
-
except Exception as e:
|
| 401 |
-
print(f"❌ Error al actualizar título: {e}")
|
| 402 |
-
|
| 403 |
-
def get_summary(self):
|
| 404 |
-
"""Obtener resumen de la conversación"""
|
| 405 |
-
return {
|
| 406 |
-
'title': self.title,
|
| 407 |
-
'message_count': len(self.conversation),
|
| 408 |
-
'last_update': len(self.conversation)
|
| 409 |
-
}
|
| 410 |
-
|
| 411 |
-
# Uso
|
| 412 |
-
tracker = ConversationTitleTracker("tu-usuario/title-generator-mobilellm")
|
| 413 |
-
|
| 414 |
-
# Simular conversación
|
| 415 |
-
tracker.add_message("Hola", "¿En qué puedo ayudarte?")
|
| 416 |
-
tracker.add_message("Necesito ayuda con Python", "Claro, ¿qué necesitas?")
|
| 417 |
-
tracker.add_message("¿Cómo crear una función?", "Se usa la palabra clave 'def'")
|
| 418 |
-
|
| 419 |
-
print(json.dumps(tracker.get_summary(), indent=2))
|
| 420 |
-
\`\`\`
|
| 421 |
-
|
| 422 |
-
## Notas Importantes
|
| 423 |
-
|
| 424 |
-
1. **Rate Limiting**: Si haces muchas peticiones, considera añadir pausas
|
| 425 |
-
2. **Timeouts**: Las primeras peticiones pueden tardar más (carga del modelo)
|
| 426 |
-
3. **Errores**: Siempre implementa manejo de errores robusto
|
| 427 |
-
4. **Caché**: Considera cachear títulos para conversaciones ya procesadas
|
| 428 |
-
5. **Costes**: Los Spaces gratuitos tienen limitaciones de uso
|
| 429 |
-
|
| 430 |
-
## Recursos Adicionales
|
| 431 |
-
|
| 432 |
-
- [Documentación Gradio Client](https://www.gradio.app/docs/python-client)
|
| 433 |
-
- [Ejemplos de Spaces](https://huggingface.co/spaces)
|
| 434 |
-
- [API Reference](https://www.gradio.app/docs/gradio-client)
|
| 435 |
-
'''
|
| 436 |
-
|
| 437 |
-
with open('EXAMPLES.md', 'w', encoding='utf-8') as f:
|
| 438 |
-
f.write(examples_file)
|
| 439 |
-
|
| 440 |
-
print("✅ Archivo EXAMPLES.md creado exitosamente")
|
| 441 |
-
print(f"Tamaño: {len(examples_file)} caracteres")
|
| 442 |
-
print("\n📦 Todos los archivos han sido generados correctamente!")
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
exported-assets/script_7.py
DELETED
|
@@ -1,252 +0,0 @@
|
|
| 1 |
-
|
| 2 |
-
# Crear un checklist final
|
| 3 |
-
checklist = '''# ✅ CHECKLIST DE DESPLIEGUE
|
| 4 |
-
|
| 5 |
-
## Pre-requisitos
|
| 6 |
-
|
| 7 |
-
- [ ] Tienes una cuenta en Hugging Face (https://huggingface.co)
|
| 8 |
-
- [ ] Has leído la documentación de Spaces
|
| 9 |
-
- [ ] Tienes acceso a Git (opcional, pero recomendado)
|
| 10 |
-
|
| 11 |
-
## Paso 1: Obtener Acceso al Modelo
|
| 12 |
-
|
| 13 |
-
- [ ] Ve a https://huggingface.co/facebook/MobileLLM-Pro
|
| 14 |
-
- [ ] Haz clic en "Request access" (si aparece)
|
| 15 |
-
- [ ] Espera la aprobación (suele ser automática)
|
| 16 |
-
- [ ] Verifica que puedes ver la página del modelo
|
| 17 |
-
|
| 18 |
-
## Paso 2: Crear Token de Acceso
|
| 19 |
-
|
| 20 |
-
- [ ] Ve a https://huggingface.co/settings/tokens
|
| 21 |
-
- [ ] Haz clic en "New token"
|
| 22 |
-
- [ ] Configura:
|
| 23 |
-
- [ ] Name: "spaces_token" (o el nombre que prefieras)
|
| 24 |
-
- [ ] Role: "read"
|
| 25 |
-
- [ ] Haz clic en "Generate a token"
|
| 26 |
-
- [ ] **IMPORTANTE**: Copia el token y guárdalo en un lugar seguro
|
| 27 |
-
|
| 28 |
-
## Paso 3: Crear el Space
|
| 29 |
-
|
| 30 |
-
- [ ] Ve a https://huggingface.co/new-space
|
| 31 |
-
- [ ] Completa el formulario:
|
| 32 |
-
- [ ] Owner: Tu usuario u organización
|
| 33 |
-
- [ ] Space name: "title-generator-mobilellm" (o el nombre que prefieras)
|
| 34 |
-
- [ ] License: MIT
|
| 35 |
-
- [ ] Select the Space SDK: **Gradio**
|
| 36 |
-
- [ ] Space hardware: CPU basic (puedes cambiarlo después)
|
| 37 |
-
- [ ] Repo type: Public o Private
|
| 38 |
-
- [ ] Haz clic en "Create Space"
|
| 39 |
-
|
| 40 |
-
## Paso 4: Configurar el Secret
|
| 41 |
-
|
| 42 |
-
- [ ] En tu Space, ve a **Settings**
|
| 43 |
-
- [ ] Encuentra la sección "Variables and secrets"
|
| 44 |
-
- [ ] Haz clic en "New secret"
|
| 45 |
-
- [ ] Configura:
|
| 46 |
-
- [ ] Name: `HF_TOKEN`
|
| 47 |
-
- [ ] Value: Pega tu token de Hugging Face
|
| 48 |
-
- [ ] Haz clic en "Save"
|
| 49 |
-
- [ ] Verifica que el secret aparece en la lista (el valor estará oculto)
|
| 50 |
-
|
| 51 |
-
## Paso 5: Preparar los Archivos Localmente
|
| 52 |
-
|
| 53 |
-
- [ ] Crea una carpeta local para tu proyecto
|
| 54 |
-
- [ ] Copia los archivos generados:
|
| 55 |
-
- [ ] app.py
|
| 56 |
-
- [ ] requirements.txt
|
| 57 |
-
- [ ] README.md
|
| 58 |
-
- [ ] .gitignore (opcional)
|
| 59 |
-
- [ ] Verifica que los archivos no tienen errores de sintaxis
|
| 60 |
-
|
| 61 |
-
## Paso 6: Subir los Archivos
|
| 62 |
-
|
| 63 |
-
### Opción A: Usando Git (Recomendado)
|
| 64 |
-
|
| 65 |
-
- [ ] Abre una terminal en tu carpeta
|
| 66 |
-
- [ ] Clona el repositorio del Space:
|
| 67 |
-
```bash
|
| 68 |
-
git clone https://huggingface.co/spaces/TU-USUARIO/TU-SPACE
|
| 69 |
-
cd TU-SPACE
|
| 70 |
-
```
|
| 71 |
-
- [ ] Copia los archivos al repositorio:
|
| 72 |
-
```bash
|
| 73 |
-
cp /ruta/a/app.py .
|
| 74 |
-
cp /ruta/a/requirements.txt .
|
| 75 |
-
cp /ruta/a/README.md .
|
| 76 |
-
```
|
| 77 |
-
- [ ] Añade los archivos:
|
| 78 |
-
```bash
|
| 79 |
-
git add .
|
| 80 |
-
```
|
| 81 |
-
- [ ] Haz commit:
|
| 82 |
-
```bash
|
| 83 |
-
git commit -m "Añadir aplicación de generación de títulos"
|
| 84 |
-
```
|
| 85 |
-
- [ ] Push al repositorio:
|
| 86 |
-
```bash
|
| 87 |
-
git push
|
| 88 |
-
```
|
| 89 |
-
|
| 90 |
-
### Opción B: Interfaz Web
|
| 91 |
-
|
| 92 |
-
- [ ] Ve a la pestaña "Files" de tu Space
|
| 93 |
-
- [ ] Haz clic en "Add file" → "Create a new file"
|
| 94 |
-
- [ ] Crea `app.py`:
|
| 95 |
-
- [ ] Nombre: app.py
|
| 96 |
-
- [ ] Pega el contenido completo
|
| 97 |
-
- [ ] Haz commit
|
| 98 |
-
- [ ] Crea `requirements.txt`:
|
| 99 |
-
- [ ] Nombre: requirements.txt
|
| 100 |
-
- [ ] Pega el contenido
|
| 101 |
-
- [ ] Haz commit
|
| 102 |
-
- [ ] Crea `README.md`:
|
| 103 |
-
- [ ] Nombre: README.md
|
| 104 |
-
- [ ] Pega el contenido
|
| 105 |
-
- [ ] Haz commit
|
| 106 |
-
|
| 107 |
-
## Paso 7: Monitorear el Build
|
| 108 |
-
|
| 109 |
-
- [ ] Ve a la pestaña "Logs" de tu Space
|
| 110 |
-
- [ ] Observa el proceso de build:
|
| 111 |
-
- [ ] Installing dependencies... (puede tardar 2-5 min)
|
| 112 |
-
- [ ] Loading model... (puede tardar 2-5 min)
|
| 113 |
-
- [ ] Running... ✅
|
| 114 |
-
- [ ] Si hay errores, revisa los logs y corrige
|
| 115 |
-
|
| 116 |
-
## Paso 8: Probar la Aplicación
|
| 117 |
-
|
| 118 |
-
### Prueba en la Interfaz Web
|
| 119 |
-
|
| 120 |
-
- [ ] Ve a la pestaña "App" de tu Space
|
| 121 |
-
- [ ] Espera a que cargue la interfaz
|
| 122 |
-
- [ ] Prueba con los ejemplos predefinidos:
|
| 123 |
-
- [ ] Haz clic en un ejemplo
|
| 124 |
-
- [ ] Haz clic en "Generar Título"
|
| 125 |
-
- [ ] Verifica que genera un título coherente
|
| 126 |
-
- [ ] Prueba con tu propia conversación:
|
| 127 |
-
- [ ] Ingresa una conversación
|
| 128 |
-
- [ ] Genera el título
|
| 129 |
-
- [ ] Verifica el resultado
|
| 130 |
-
|
| 131 |
-
### Prueba con la API (Python)
|
| 132 |
-
|
| 133 |
-
- [ ] Abre un terminal o Jupyter Notebook
|
| 134 |
-
- [ ] Instala el cliente:
|
| 135 |
-
```bash
|
| 136 |
-
pip install gradio-client
|
| 137 |
-
```
|
| 138 |
-
- [ ] Ejecuta el código de prueba:
|
| 139 |
-
```python
|
| 140 |
-
from gradio_client import Client
|
| 141 |
-
|
| 142 |
-
client = Client("TU-USUARIO/TU-SPACE")
|
| 143 |
-
result = client.predict(
|
| 144 |
-
input_choice="Chat",
|
| 145 |
-
chat_hist=[["Hola", "¿Cómo estás?"]],
|
| 146 |
-
text_hist="",
|
| 147 |
-
api_name="/generate_title"
|
| 148 |
-
)
|
| 149 |
-
print(result)
|
| 150 |
-
```
|
| 151 |
-
- [ ] Verifica que funciona correctamente
|
| 152 |
-
|
| 153 |
-
### Prueba con la API (JavaScript)
|
| 154 |
-
|
| 155 |
-
- [ ] Crea un archivo HTML de prueba
|
| 156 |
-
- [ ] Copia el código del ejemplo de JavaScript
|
| 157 |
-
- [ ] Abre el archivo en el navegador
|
| 158 |
-
- [ ] Verifica que funciona correctamente
|
| 159 |
-
|
| 160 |
-
## Paso 9: Optimizaciones (Opcional)
|
| 161 |
-
|
| 162 |
-
- [ ] Revisa el rendimiento en CPU Basic
|
| 163 |
-
- [ ] Si es muy lento, considera:
|
| 164 |
-
- [ ] Upgrade a CPU Upgrade
|
| 165 |
-
- [ ] Upgrade a GPU T4 small
|
| 166 |
-
- [ ] Ajusta los parámetros de generación si es necesario
|
| 167 |
-
- [ ] Añade más ejemplos si lo consideras útil
|
| 168 |
-
|
| 169 |
-
## Paso 10: Documentación y Compartir
|
| 170 |
-
|
| 171 |
-
- [ ] Verifica que el README.md se muestra correctamente
|
| 172 |
-
- [ ] Añade una descripción clara en el Space
|
| 173 |
-
- [ ] Si es público, comparte el enlace:
|
| 174 |
-
- [ ] Twitter/X
|
| 175 |
-
- [ ] LinkedIn
|
| 176 |
-
- [ ] Reddit (r/MachineLearning, r/LocalLLaMA)
|
| 177 |
-
- [ ] Discord de HuggingFace
|
| 178 |
-
- [ ] Considera añadir el Space a tu portfolio
|
| 179 |
-
|
| 180 |
-
## Solución de Problemas
|
| 181 |
-
|
| 182 |
-
### El Space no arranca
|
| 183 |
-
|
| 184 |
-
- [ ] Verifica los logs en la pestaña "Logs"
|
| 185 |
-
- [ ] Comprueba que HF_TOKEN está configurado
|
| 186 |
-
- [ ] Verifica que tienes acceso al modelo MobileLLM-Pro
|
| 187 |
-
- [ ] Revisa que los archivos no tienen errores de sintaxis
|
| 188 |
-
|
| 189 |
-
### Error 401 Unauthorized
|
| 190 |
-
|
| 191 |
-
- [ ] Verifica que solicitaste acceso al modelo
|
| 192 |
-
- [ ] Comprueba que el token es correcto
|
| 193 |
-
- [ ] Asegúrate de que el secret se llama exactamente `HF_TOKEN`
|
| 194 |
-
- [ ] Regenera el token si es necesario
|
| 195 |
-
|
| 196 |
-
### Out of Memory
|
| 197 |
-
|
| 198 |
-
- [ ] Upgrade el hardware del Space
|
| 199 |
-
- [ ] O modifica el código para usar float32 en CPU
|
| 200 |
-
|
| 201 |
-
### El modelo tarda mucho
|
| 202 |
-
|
| 203 |
-
- [ ] Es normal en CPU Basic (primera inferencia: 30-60 seg)
|
| 204 |
-
- [ ] Considera upgrade a GPU
|
| 205 |
-
- [ ] O acepta el tiempo de carga inicial
|
| 206 |
-
|
| 207 |
-
### Error en requirements.txt
|
| 208 |
-
|
| 209 |
-
- [ ] Verifica las versiones de las dependencias
|
| 210 |
-
- [ ] Prueba actualizar a las últimas versiones estables
|
| 211 |
-
- [ ] Revisa los logs para ver qué falta
|
| 212 |
-
|
| 213 |
-
## Post-Despliegue
|
| 214 |
-
|
| 215 |
-
- [ ] Monitorea el uso del Space
|
| 216 |
-
- [ ] Revisa los logs periódicamente
|
| 217 |
-
- [ ] Actualiza el modelo si hay nuevas versiones
|
| 218 |
-
- [ ] Responde a issues y comentarios
|
| 219 |
-
- [ ] Considera añadir nuevas features
|
| 220 |
-
|
| 221 |
-
## Mantenimiento
|
| 222 |
-
|
| 223 |
-
- [ ] Actualiza las dependencias regularmente
|
| 224 |
-
- [ ] Monitorea el rendimiento
|
| 225 |
-
- [ ] Responde a feedback de usuarios
|
| 226 |
-
- [ ] Considera mejoras en la interfaz
|
| 227 |
-
- [ ] Documenta cambios importantes
|
| 228 |
-
|
| 229 |
-
## ¡Felicidades! 🎉
|
| 230 |
-
|
| 231 |
-
Si has completado todos estos pasos, tu Space debería estar funcionando correctamente.
|
| 232 |
-
|
| 233 |
-
Enlaces útiles:
|
| 234 |
-
- Tu Space: https://huggingface.co/spaces/TU-USUARIO/TU-SPACE
|
| 235 |
-
- Documentación: https://huggingface.co/docs/hub/spaces
|
| 236 |
-
- Soporte: https://discuss.huggingface.co/
|
| 237 |
-
|
| 238 |
-
---
|
| 239 |
-
|
| 240 |
-
**¿Algo no funciona?**
|
| 241 |
-
|
| 242 |
-
1. Revisa los logs
|
| 243 |
-
2. Consulta DEPLOYMENT_GUIDE.md
|
| 244 |
-
3. Busca en los foros de HuggingFace
|
| 245 |
-
4. Abre un issue en tu Space
|
| 246 |
-
'''
|
| 247 |
-
|
| 248 |
-
with open('CHECKLIST.md', 'w', encoding='utf-8') as f:
|
| 249 |
-
f.write(checklist)
|
| 250 |
-
|
| 251 |
-
print("✅ Archivo CHECKLIST.md creado exitosamente")
|
| 252 |
-
print(f"Tamaño: {len(checklist)} caracteres")
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
exported-assets/script_8.py
DELETED
|
@@ -1,229 +0,0 @@
|
|
| 1 |
-
|
| 2 |
-
# Crear un resumen final con todos los archivos
|
| 3 |
-
final_summary = """
|
| 4 |
-
╔════════════════════════════════════════════════════════════════════╗
|
| 5 |
-
║ ║
|
| 6 |
-
║ 📦 CÓDIGO COMPLETO PARA HUGGING FACE SPACE GENERADO ║
|
| 7 |
-
║ Generador de Títulos con MobileLLM-Pro ║
|
| 8 |
-
║ ║
|
| 9 |
-
╚════════════════════════════════════════════════════════════════════╝
|
| 10 |
-
|
| 11 |
-
✅ ARCHIVOS GENERADOS (7 archivos):
|
| 12 |
-
|
| 13 |
-
1️⃣ app.py - Aplicación principal Gradio
|
| 14 |
-
2️⃣ requirements.txt - Dependencias Python
|
| 15 |
-
3️⃣ README.md - Documentación del Space
|
| 16 |
-
4️⃣ .gitignore - Archivos a ignorar en Git
|
| 17 |
-
5️⃣ DEPLOYMENT_GUIDE.md - Guía de despliegue detallada
|
| 18 |
-
6️⃣ EXAMPLES.md - Ejemplos de uso extendidos (10 ejemplos)
|
| 19 |
-
7️⃣ CHECKLIST.md - Lista de verificación paso a paso
|
| 20 |
-
|
| 21 |
-
════════════════════════════════════════════════════════════════════
|
| 22 |
-
|
| 23 |
-
📋 CARACTERÍSTICAS PRINCIPALES:
|
| 24 |
-
|
| 25 |
-
✨ Interfaz Gradio:
|
| 26 |
-
• Dos modos de entrada: Chat (visual) y Texto (libre)
|
| 27 |
-
• Componente Chatbot interactivo
|
| 28 |
-
• Ejemplos predefinidos integrados
|
| 29 |
-
• Diseño responsive y moderno
|
| 30 |
-
• Documentación en español
|
| 31 |
-
|
| 32 |
-
🔐 Seguridad:
|
| 33 |
-
• HF_TOKEN cargado desde secrets de Hugging Face
|
| 34 |
-
• Compatible con modelos gated
|
| 35 |
-
• No expone credenciales en el código
|
| 36 |
-
• Variable de entorno segura
|
| 37 |
-
|
| 38 |
-
⚡ Rendimiento:
|
| 39 |
-
• Usa MobileLLM-Pro (1B parámetros, rápido)
|
| 40 |
-
• Inferencia optimizada con torch.float16 en GPU
|
| 41 |
-
• Fallback automático a float32 en CPU
|
| 42 |
-
• device_map="auto" para distribución óptima
|
| 43 |
-
• Generación limitada a 20 tokens (títulos cortos)
|
| 44 |
-
|
| 45 |
-
🔌 API Completa:
|
| 46 |
-
• Endpoint nombrado: /generate_title
|
| 47 |
-
• Compatible con gradio_client (Python)
|
| 48 |
-
• Compatible con @gradio/client (JavaScript)
|
| 49 |
-
• Documentación de API incluida
|
| 50 |
-
• Ejemplos de uso en 10 escenarios diferentes
|
| 51 |
-
|
| 52 |
-
📝 Generación Inteligente:
|
| 53 |
-
• Prompt optimizado en español
|
| 54 |
-
• Títulos de máximo 5 palabras
|
| 55 |
-
• Limpieza automática de la salida
|
| 56 |
-
• Manejo robusto de errores
|
| 57 |
-
• Soporta múltiples formatos de entrada
|
| 58 |
-
|
| 59 |
-
════════════════════════════════════════════════════════════════════
|
| 60 |
-
|
| 61 |
-
🚀 QUICK START:
|
| 62 |
-
|
| 63 |
-
1. Crea un Space en: https://huggingface.co/new-space
|
| 64 |
-
- SDK: Gradio
|
| 65 |
-
- Hardware: CPU Basic (o superior)
|
| 66 |
-
|
| 67 |
-
2. Solicita acceso al modelo:
|
| 68 |
-
https://huggingface.co/facebook/MobileLLM-Pro
|
| 69 |
-
|
| 70 |
-
3. Crea un token en:
|
| 71 |
-
https://huggingface.co/settings/tokens
|
| 72 |
-
|
| 73 |
-
4. Configura el secret HF_TOKEN:
|
| 74 |
-
Settings → Variables and secrets → New secret
|
| 75 |
-
Name: HF_TOKEN
|
| 76 |
-
Value: [tu token]
|
| 77 |
-
|
| 78 |
-
5. Sube los archivos:
|
| 79 |
-
- app.py
|
| 80 |
-
- requirements.txt
|
| 81 |
-
- README.md
|
| 82 |
-
|
| 83 |
-
6. ¡Espera 5-10 minutos y ya está!
|
| 84 |
-
|
| 85 |
-
════════════════════════════════════════════════════════════════════
|
| 86 |
-
|
| 87 |
-
💻 USO DE LA API:
|
| 88 |
-
|
| 89 |
-
Python:
|
| 90 |
-
-------
|
| 91 |
-
from gradio_client import Client
|
| 92 |
-
|
| 93 |
-
client = Client("tu-usuario/tu-space")
|
| 94 |
-
result = client.predict(
|
| 95 |
-
input_choice="Chat",
|
| 96 |
-
chat_hist=[["Pregunta", "Respuesta"]],
|
| 97 |
-
text_hist="",
|
| 98 |
-
api_name="/generate_title"
|
| 99 |
-
)
|
| 100 |
-
print(result)
|
| 101 |
-
|
| 102 |
-
JavaScript:
|
| 103 |
-
-----------
|
| 104 |
-
import { Client } from "@gradio/client";
|
| 105 |
-
|
| 106 |
-
const client = await Client.connect("tu-usuario/tu-space");
|
| 107 |
-
const result = await client.predict("/generate_title", {
|
| 108 |
-
input_choice: "Chat",
|
| 109 |
-
chat_hist: [["Pregunta", "Respuesta"]],
|
| 110 |
-
text_hist: ""
|
| 111 |
-
});
|
| 112 |
-
console.log(result.data);
|
| 113 |
-
|
| 114 |
-
════════════════════════════════════════════════════════════════════
|
| 115 |
-
|
| 116 |
-
📚 DOCUMENTACIÓN INCLUIDA:
|
| 117 |
-
|
| 118 |
-
• README.md: Documentación completa del Space con ejemplos
|
| 119 |
-
• DEPLOYMENT_GUIDE.md: Guía paso a paso para desplegar
|
| 120 |
-
• EXAMPLES.md: 10 ejemplos de uso en diferentes contextos:
|
| 121 |
-
1. Uso básico con Python
|
| 122 |
-
2. Uso con texto libre
|
| 123 |
-
3. JavaScript/Node.js
|
| 124 |
-
4. JavaScript en el navegador
|
| 125 |
-
5. Procesamiento por lotes
|
| 126 |
-
6. Integración con FastAPI
|
| 127 |
-
7. CLI (línea de comandos)
|
| 128 |
-
8. Bot de Discord
|
| 129 |
-
9. Manejo de errores robusto
|
| 130 |
-
10. Stream en tiempo real
|
| 131 |
-
• CHECKLIST.md: Lista de verificación completa
|
| 132 |
-
|
| 133 |
-
════════════════════════════════════════════════════════════════════
|
| 134 |
-
|
| 135 |
-
🛠️ TECNOLOGÍAS UTILIZADAS:
|
| 136 |
-
|
| 137 |
-
• MobileLLM-Pro: Modelo de Meta de 1B parámetros
|
| 138 |
-
• Transformers: Biblioteca de Hugging Face
|
| 139 |
-
• Gradio: Framework para interfaces ML
|
| 140 |
-
• PyTorch: Backend de inferencia
|
| 141 |
-
• Accelerate: Optimización de carga del modelo
|
| 142 |
-
|
| 143 |
-
════════════════════════════════════════════════════════════════════
|
| 144 |
-
|
| 145 |
-
📝 NOTAS IMPORTANTES:
|
| 146 |
-
|
| 147 |
-
1. MobileLLM-Pro es un modelo GATED:
|
| 148 |
-
- Debes solicitar acceso antes de usarlo
|
| 149 |
-
- La aprobación suele ser automática
|
| 150 |
-
- Sin acceso, el Space no funcionará
|
| 151 |
-
|
| 152 |
-
2. El HF_TOKEN debe configurarse como SECRET:
|
| 153 |
-
- No como variable normal
|
| 154 |
-
- Debe llamarse exactamente: HF_TOKEN
|
| 155 |
-
- Con permisos de lectura (read)
|
| 156 |
-
|
| 157 |
-
3. Primera ejecución:
|
| 158 |
-
- En CPU Basic puede tardar 30-60 segundos
|
| 159 |
-
- El modelo se carga en memoria
|
| 160 |
-
- Las siguientes inferencias son más rápidas
|
| 161 |
-
|
| 162 |
-
4. Hardware recomendado:
|
| 163 |
-
- CPU Basic: Funciona pero lento
|
| 164 |
-
- CPU Upgrade: Mejor rendimiento
|
| 165 |
-
- GPU T4: Óptimo pero de pago
|
| 166 |
-
|
| 167 |
-
════════════════════════════════════════════════════════════════════
|
| 168 |
-
|
| 169 |
-
🎯 LO QUE HACE LA APLICACIÓN:
|
| 170 |
-
|
| 171 |
-
Entrada:
|
| 172 |
-
--------
|
| 173 |
-
Un historial de conversación en formato:
|
| 174 |
-
• Lista de tuplas: [["usuario", "asistente"], ...]
|
| 175 |
-
• O texto libre: "Usuario: ...\nAsistente: ..."
|
| 176 |
-
|
| 177 |
-
Procesamiento:
|
| 178 |
-
--------------
|
| 179 |
-
• Convierte el historial a un prompt optimizado
|
| 180 |
-
• Usa MobileLLM-Pro para generar un título
|
| 181 |
-
• Limpia y formatea la salida
|
| 182 |
-
|
| 183 |
-
Salida:
|
| 184 |
-
-------
|
| 185 |
-
• Un título conciso de máximo 5 palabras
|
| 186 |
-
• Descriptivo del tema de la conversación
|
| 187 |
-
• En el idioma de la entrada
|
| 188 |
-
|
| 189 |
-
Ejemplos:
|
| 190 |
-
---------
|
| 191 |
-
Entrada: [["¿Cómo cocinar pasta?", "Hierve agua y..."], ...]
|
| 192 |
-
Salida: "Receta de pasta casera"
|
| 193 |
-
|
| 194 |
-
Entrada: [["¿Qué es Python?", "Es un lenguaje..."], ...]
|
| 195 |
-
Salida: "Introducción a Python"
|
| 196 |
-
|
| 197 |
-
════════════════════════════════════════════════════════════════════
|
| 198 |
-
|
| 199 |
-
✅ TODO LISTO PARA DESPLEGAR
|
| 200 |
-
|
| 201 |
-
Sigue el CHECKLIST.md paso a paso y tendrás tu Space funcionando
|
| 202 |
-
en menos de 15 minutos.
|
| 203 |
-
|
| 204 |
-
¡Buena suerte! 🚀
|
| 205 |
-
|
| 206 |
-
════════════════════════════════════════════════════════════════════
|
| 207 |
-
"""
|
| 208 |
-
|
| 209 |
-
print(final_summary)
|
| 210 |
-
|
| 211 |
-
# Guardar también este resumen
|
| 212 |
-
with open('FINAL_SUMMARY.txt', 'w', encoding='utf-8') as f:
|
| 213 |
-
f.write(final_summary)
|
| 214 |
-
|
| 215 |
-
print("\n✅ Resumen final guardado en FINAL_SUMMARY.txt")
|
| 216 |
-
print("\n" + "="*70)
|
| 217 |
-
print("📦 TODOS LOS ARCHIVOS HAN SIDO GENERADOS EXITOSAMENTE")
|
| 218 |
-
print("="*70)
|
| 219 |
-
print("\nArchivos creados:")
|
| 220 |
-
print(" 1. app.py")
|
| 221 |
-
print(" 2. requirements.txt")
|
| 222 |
-
print(" 3. README.md")
|
| 223 |
-
print(" 4. .gitignore")
|
| 224 |
-
print(" 5. DEPLOYMENT_GUIDE.md")
|
| 225 |
-
print(" 6. EXAMPLES.md")
|
| 226 |
-
print(" 7. CHECKLIST.md")
|
| 227 |
-
print(" 8. SUMMARY.txt")
|
| 228 |
-
print(" 9. FINAL_SUMMARY.txt")
|
| 229 |
-
print("\n🚀 Listos para subir a Hugging Face Spaces!")
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
requirements.txt
CHANGED
|
@@ -1,4 +1,4 @@
|
|
| 1 |
-
transformers>=4.36.0
|
| 2 |
-
torch>=2.0.0
|
| 3 |
gradio>=4.0.0
|
| 4 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
gradio>=4.0.0
|
| 2 |
+
transformers>=4.43.0
|
| 3 |
+
torch>=2.0.0
|
| 4 |
+
accelerate>=0.20.0
|
script.py
ADDED
|
@@ -0,0 +1,297 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
|
| 2 |
+
# Voy a crear el código completo para el espacio de Hugging Face
|
| 3 |
+
# que genera títulos usando Llama-3.2-1B-Instruct
|
| 4 |
+
|
| 5 |
+
# Primero creo el código para app.py
|
| 6 |
+
app_py_code = '''import os
|
| 7 |
+
import gradio as gr
|
| 8 |
+
from transformers import AutoTokenizer, AutoModelForCausalLM, pipeline
|
| 9 |
+
import torch
|
| 10 |
+
|
| 11 |
+
# Obtener el token de HF desde las variables de entorno (secret)
|
| 12 |
+
HF_TOKEN = os.getenv("HF_TOKEN")
|
| 13 |
+
|
| 14 |
+
# Cargar el modelo y tokenizer
|
| 15 |
+
MODEL_NAME = "meta-llama/Llama-3.2-1B-Instruct"
|
| 16 |
+
|
| 17 |
+
print("Cargando modelo y tokenizer...")
|
| 18 |
+
tokenizer = AutoTokenizer.from_pretrained(MODEL_NAME, token=HF_TOKEN)
|
| 19 |
+
model = AutoModelForCausalLM.from_pretrained(
|
| 20 |
+
MODEL_NAME,
|
| 21 |
+
token=HF_TOKEN,
|
| 22 |
+
torch_dtype=torch.float16,
|
| 23 |
+
device_map="auto"
|
| 24 |
+
)
|
| 25 |
+
print("Modelo cargado exitosamente!")
|
| 26 |
+
|
| 27 |
+
def generate_title(input_text, is_conversation=False):
|
| 28 |
+
"""
|
| 29 |
+
Genera un título a partir de texto o historial de conversación.
|
| 30 |
+
|
| 31 |
+
Args:
|
| 32 |
+
input_text: String con el texto o historial
|
| 33 |
+
is_conversation: Boolean indicando si es un historial de conversación
|
| 34 |
+
|
| 35 |
+
Returns:
|
| 36 |
+
String con el título generado
|
| 37 |
+
"""
|
| 38 |
+
try:
|
| 39 |
+
# Crear el prompt según el tipo de entrada
|
| 40 |
+
if is_conversation:
|
| 41 |
+
system_prompt = "Eres un asistente experto en crear títulos concisos y descriptivos. Analiza la siguiente conversación y genera un título breve (máximo 6 palabras) que capture el tema principal."
|
| 42 |
+
user_prompt = f"Conversación:\\n{input_text}\\n\\nGenera un título breve y descriptivo:"
|
| 43 |
+
else:
|
| 44 |
+
system_prompt = "Eres un asistente experto en crear títulos concisos y descriptivos. Analiza el siguiente texto y genera un título breve (máximo 6 palabras) que capture la idea principal."
|
| 45 |
+
user_prompt = f"Texto:\\n{input_text}\\n\\nGenera un título breve y descriptivo:"
|
| 46 |
+
|
| 47 |
+
# Formatear mensajes para Llama
|
| 48 |
+
messages = [
|
| 49 |
+
{"role": "system", "content": system_prompt},
|
| 50 |
+
{"role": "user", "content": user_prompt}
|
| 51 |
+
]
|
| 52 |
+
|
| 53 |
+
# Aplicar chat template
|
| 54 |
+
prompt = tokenizer.apply_chat_template(messages, tokenize=False, add_generation_prompt=True)
|
| 55 |
+
|
| 56 |
+
# Tokenizar
|
| 57 |
+
inputs = tokenizer(prompt, return_tensors="pt").to(model.device)
|
| 58 |
+
|
| 59 |
+
# Generar
|
| 60 |
+
outputs = model.generate(
|
| 61 |
+
**inputs,
|
| 62 |
+
max_new_tokens=50,
|
| 63 |
+
temperature=0.7,
|
| 64 |
+
top_p=0.9,
|
| 65 |
+
do_sample=True,
|
| 66 |
+
pad_token_id=tokenizer.eos_token_id
|
| 67 |
+
)
|
| 68 |
+
|
| 69 |
+
# Decodificar solo la respuesta generada
|
| 70 |
+
generated_text = tokenizer.decode(outputs[0][inputs['input_ids'].shape[1]:], skip_special_tokens=True)
|
| 71 |
+
|
| 72 |
+
# Limpiar el título
|
| 73 |
+
title = generated_text.strip().split('\\n')[0].strip()
|
| 74 |
+
|
| 75 |
+
return title
|
| 76 |
+
|
| 77 |
+
except Exception as e:
|
| 78 |
+
return f"Error al generar título: {str(e)}"
|
| 79 |
+
|
| 80 |
+
# Crear interfaz de Gradio
|
| 81 |
+
with gr.Blocks(title="Generador de Títulos con Llama 3.2") as demo:
|
| 82 |
+
gr.Markdown("# 🎯 Generador de Títulos con Llama 3.2-1B-Instruct")
|
| 83 |
+
gr.Markdown("Genera títulos concisos a partir de texto o conversaciones usando IA")
|
| 84 |
+
|
| 85 |
+
with gr.Tab("Texto Simple"):
|
| 86 |
+
with gr.Row():
|
| 87 |
+
with gr.Column():
|
| 88 |
+
text_input = gr.Textbox(
|
| 89 |
+
label="Texto de entrada",
|
| 90 |
+
placeholder="Escribe o pega el texto del que quieres generar un título...",
|
| 91 |
+
lines=8
|
| 92 |
+
)
|
| 93 |
+
text_btn = gr.Button("Generar Título", variant="primary")
|
| 94 |
+
|
| 95 |
+
with gr.Column():
|
| 96 |
+
text_output = gr.Textbox(label="Título generado", lines=3)
|
| 97 |
+
|
| 98 |
+
text_btn.click(
|
| 99 |
+
fn=lambda x: generate_title(x, is_conversation=False),
|
| 100 |
+
inputs=text_input,
|
| 101 |
+
outputs=text_output
|
| 102 |
+
)
|
| 103 |
+
|
| 104 |
+
gr.Examples(
|
| 105 |
+
examples=[
|
| 106 |
+
["La inteligencia artificial está revolucionando la forma en que trabajamos. Desde asistentes virtuales hasta sistemas de recomendación, la IA está presente en nuestra vida diaria de formas que ni siquiera imaginamos."],
|
| 107 |
+
["El cambio climático es uno de los mayores desafíos que enfrenta la humanidad. Las temperaturas globales continúan aumentando y los eventos climáticos extremos son cada vez más frecuentes."]
|
| 108 |
+
],
|
| 109 |
+
inputs=text_input
|
| 110 |
+
)
|
| 111 |
+
|
| 112 |
+
with gr.Tab("Historial de Conversación"):
|
| 113 |
+
with gr.Row():
|
| 114 |
+
with gr.Column():
|
| 115 |
+
conv_input = gr.Textbox(
|
| 116 |
+
label="Historial de conversación",
|
| 117 |
+
placeholder="Pega aquí el historial de la conversación...\\n\\nFormato ejemplo:\\nUsuario: Hola, ¿cómo estás?\\nAsistente: ¡Bien! ¿En qué puedo ayudarte?",
|
| 118 |
+
lines=10
|
| 119 |
+
)
|
| 120 |
+
conv_btn = gr.Button("Generar Título", variant="primary")
|
| 121 |
+
|
| 122 |
+
with gr.Column():
|
| 123 |
+
conv_output = gr.Textbox(label="Título generado", lines=3)
|
| 124 |
+
|
| 125 |
+
conv_btn.click(
|
| 126 |
+
fn=lambda x: generate_title(x, is_conversation=True),
|
| 127 |
+
inputs=conv_input,
|
| 128 |
+
outputs=conv_output
|
| 129 |
+
)
|
| 130 |
+
|
| 131 |
+
gr.Examples(
|
| 132 |
+
examples=[
|
| 133 |
+
["Usuario: Necesito ayuda con mi código Python\\nAsistente: Claro, ¿qué problema tienes?\\nUsuario: No sé cómo leer un archivo CSV\\nAsistente: Puedes usar la librería pandas..."],
|
| 134 |
+
["Usuario: ¿Cuál es la receta de paella?\\nAsistente: La paella es un plato español tradicional...\\nUsuario: ¿Qué ingredientes necesito?\\nAsistente: Necesitas arroz, azafrán, pollo..."]
|
| 135 |
+
],
|
| 136 |
+
inputs=conv_input
|
| 137 |
+
)
|
| 138 |
+
|
| 139 |
+
gr.Markdown("""
|
| 140 |
+
### 📝 Notas:
|
| 141 |
+
- El modelo genera títulos concisos (máximo 6 palabras)
|
| 142 |
+
- Puedes usar tanto texto simple como conversaciones
|
| 143 |
+
- Funciona en español, inglés y otros idiomas
|
| 144 |
+
- Usa Llama 3.2-1B-Instruct de Meta
|
| 145 |
+
""")
|
| 146 |
+
|
| 147 |
+
# API habilitada automáticamente - Los usuarios pueden usar:
|
| 148 |
+
# - Cliente Python de Gradio
|
| 149 |
+
# - Cliente JavaScript de Gradio
|
| 150 |
+
# - Llamadas HTTP directas
|
| 151 |
+
|
| 152 |
+
if __name__ == "__main__":
|
| 153 |
+
demo.launch(share=False)
|
| 154 |
+
'''
|
| 155 |
+
|
| 156 |
+
# Guardar app.py
|
| 157 |
+
with open('app.py', 'w', encoding='utf-8') as f:
|
| 158 |
+
f.write(app_py_code)
|
| 159 |
+
|
| 160 |
+
print("✅ Archivo app.py creado")
|
| 161 |
+
|
| 162 |
+
# Crear requirements.txt
|
| 163 |
+
requirements_txt = '''gradio>=4.0.0
|
| 164 |
+
transformers>=4.43.0
|
| 165 |
+
torch>=2.0.0
|
| 166 |
+
accelerate>=0.20.0
|
| 167 |
+
'''
|
| 168 |
+
|
| 169 |
+
with open('requirements.txt', 'w', encoding='utf-8') as f:
|
| 170 |
+
f.write(requirements_txt)
|
| 171 |
+
|
| 172 |
+
print("✅ Archivo requirements.txt creado")
|
| 173 |
+
|
| 174 |
+
# Crear README.md con instrucciones
|
| 175 |
+
readme_md = '''---
|
| 176 |
+
title: Generador de Títulos con Llama 3.2
|
| 177 |
+
emoji: 🎯
|
| 178 |
+
colorFrom: blue
|
| 179 |
+
colorTo: purple
|
| 180 |
+
sdk: gradio
|
| 181 |
+
sdk_version: 4.0.0
|
| 182 |
+
app_file: app.py
|
| 183 |
+
pinned: false
|
| 184 |
+
license: mit
|
| 185 |
+
---
|
| 186 |
+
|
| 187 |
+
# Generador de Títulos con Llama 3.2-1B-Instruct
|
| 188 |
+
|
| 189 |
+
Esta aplicación genera títulos concisos a partir de texto o conversaciones usando el modelo **meta-llama/Llama-3.2-1B-Instruct**.
|
| 190 |
+
|
| 191 |
+
## Características
|
| 192 |
+
|
| 193 |
+
- ✅ Interfaz web interactiva con Gradio
|
| 194 |
+
- ✅ Generación de títulos desde texto simple o conversaciones
|
| 195 |
+
- ✅ API accesible mediante Python, JavaScript y HTTP
|
| 196 |
+
- ✅ Modelo ligero y rápido (1B parámetros)
|
| 197 |
+
- ✅ Soporte multiidioma
|
| 198 |
+
|
| 199 |
+
## Configuración
|
| 200 |
+
|
| 201 |
+
### 1. Crear el Space en Hugging Face
|
| 202 |
+
|
| 203 |
+
1. Ve a https://huggingface.co/new-space
|
| 204 |
+
2. Selecciona **Gradio** como SDK
|
| 205 |
+
3. Nombra tu Space (ej: "title-generator-llama")
|
| 206 |
+
|
| 207 |
+
### 2. Configurar el Secret HF_TOKEN
|
| 208 |
+
|
| 209 |
+
**IMPORTANTE**: Este paso es necesario porque el modelo Llama 3.2 es "gated" (requiere acceso).
|
| 210 |
+
|
| 211 |
+
1. Solicita acceso al modelo en: https://huggingface.co/meta-llama/Llama-3.2-1B-Instruct
|
| 212 |
+
2. Genera un token de acceso en: https://huggingface.co/settings/tokens
|
| 213 |
+
3. En tu Space, ve a **Settings** → **Repository secrets**
|
| 214 |
+
4. Añade un nuevo secret:
|
| 215 |
+
- **Name**: `HF_TOKEN`
|
| 216 |
+
- **Value**: Tu token de Hugging Face (empezará con `hf_...`)
|
| 217 |
+
|
| 218 |
+
### 3. Subir los archivos
|
| 219 |
+
|
| 220 |
+
Sube estos archivos a tu Space:
|
| 221 |
+
- `app.py` - Código principal
|
| 222 |
+
- `requirements.txt` - Dependencias
|
| 223 |
+
- `README.md` - Esta documentación
|
| 224 |
+
|
| 225 |
+
## Uso
|
| 226 |
+
|
| 227 |
+
### Interfaz Web
|
| 228 |
+
|
| 229 |
+
Simplemente visita tu Space y usa la interfaz para:
|
| 230 |
+
- **Texto Simple**: Pega cualquier texto y genera un título
|
| 231 |
+
- **Conversación**: Pega un historial de chat y genera un título resumido
|
| 232 |
+
|
| 233 |
+
### API Python
|
| 234 |
+
|
| 235 |
+
```python
|
| 236 |
+
from gradio_client import Client
|
| 237 |
+
|
| 238 |
+
client = Client("tu-usuario/title-generator-llama")
|
| 239 |
+
result = client.predict(
|
| 240 |
+
input_text="Tu texto aquí...",
|
| 241 |
+
is_conversation=False,
|
| 242 |
+
api_name="/predict"
|
| 243 |
+
)
|
| 244 |
+
print(result)
|
| 245 |
+
```
|
| 246 |
+
|
| 247 |
+
### API JavaScript
|
| 248 |
+
|
| 249 |
+
```javascript
|
| 250 |
+
import { Client } from "@gradio/client";
|
| 251 |
+
|
| 252 |
+
const client = await Client.connect("tu-usuario/title-generator-llama");
|
| 253 |
+
const result = await client.predict("/predict", {
|
| 254 |
+
input_text: "Tu texto aquí...",
|
| 255 |
+
is_conversation: false,
|
| 256 |
+
});
|
| 257 |
+
console.log(result.data);
|
| 258 |
+
```
|
| 259 |
+
|
| 260 |
+
### API HTTP
|
| 261 |
+
|
| 262 |
+
```bash
|
| 263 |
+
curl -X POST https://tu-usuario-title-generator-llama.hf.space/api/predict \\
|
| 264 |
+
-H "Content-Type: application/json" \\
|
| 265 |
+
-d '{"data": ["Tu texto aquí...", false]}'
|
| 266 |
+
```
|
| 267 |
+
|
| 268 |
+
## Hardware
|
| 269 |
+
|
| 270 |
+
Este Space funciona en **CPU básico** de Hugging Face (gratis). El modelo es lo suficientemente pequeño para ejecutarse eficientemente sin GPU.
|
| 271 |
+
|
| 272 |
+
## Licencia
|
| 273 |
+
|
| 274 |
+
MIT License
|
| 275 |
+
'''
|
| 276 |
+
|
| 277 |
+
with open('README.md', 'w', encoding='utf-8') as f:
|
| 278 |
+
f.write(readme_md)
|
| 279 |
+
|
| 280 |
+
print("✅ Archivo README.md creado")
|
| 281 |
+
|
| 282 |
+
print("\n" + "="*60)
|
| 283 |
+
print("📦 Archivos creados exitosamente:")
|
| 284 |
+
print("="*60)
|
| 285 |
+
print("✅ app.py - Código principal de la aplicación")
|
| 286 |
+
print("✅ requirements.txt - Dependencias necesarias")
|
| 287 |
+
print("✅ README.md - Documentación completa")
|
| 288 |
+
print("\n" + "="*60)
|
| 289 |
+
print("📋 PRÓXIMOS PASOS:")
|
| 290 |
+
print("="*60)
|
| 291 |
+
print("1. Crea un nuevo Space en https://huggingface.co/new-space")
|
| 292 |
+
print("2. Selecciona 'Gradio' como SDK")
|
| 293 |
+
print("3. Sube estos 3 archivos a tu Space")
|
| 294 |
+
print("4. Ve a Settings → Repository secrets")
|
| 295 |
+
print("5. Añade HF_TOKEN con tu token de Hugging Face")
|
| 296 |
+
print("6. ¡El Space se construirá automáticamente!")
|
| 297 |
+
print("="*60)
|