oriolgds commited on
Commit
b505777
·
unverified ·
1 Parent(s): 760b136

Perplexity LABS

Browse files
README.md CHANGED
@@ -1,13 +1,100 @@
1
  ---
2
- title: Title Generator
3
- emoji: 🐨
4
- colorFrom: indigo
5
- colorTo: pink
6
  sdk: gradio
7
- sdk_version: 5.49.1
8
  app_file: app.py
9
  pinned: false
10
- short_description: An space to generate a title depending on the conversation
11
  ---
12
 
13
- Check out the configuration reference at https://huggingface.co/docs/hub/spaces-config-reference
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
- from transformers import AutoTokenizer, AutoModelForCausalLM
 
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 if torch.cuda.is_available() else torch.float32,
17
  device_map="auto"
18
  )
19
- model.eval()
20
  print("Modelo cargado exitosamente!")
21
 
22
- def generate_title(input_choice, chat_hist, text_hist):
23
  """
24
- Genera un título conciso a partir de un historial de conversación usando Llama 3.2.
 
 
 
 
 
 
 
25
  """
26
  try:
27
- # 1. Obtener el historial según el tipo de entrada
28
- if input_choice == "Chat":
29
- history = chat_hist
30
- else:
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
- conversation_text = str(history)
 
45
 
46
- # 3. Crear el prompt con el formato de chat de Llama 3
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": conversation_text}
51
  ]
52
 
53
- # 4. Tokenizar el prompt usando la plantilla de chat
54
- inputs = tokenizer.apply_chat_template(
55
- messages,
56
- add_generation_prompt=True,
57
- return_tensors="pt"
58
- ).to(model.device)
59
-
60
- # 5. Generar el título
61
- with torch.no_grad():
62
- outputs = model.generate(
63
- inputs,
64
- max_new_tokens=20,
65
- temperature=0.7,
66
- do_sample=True,
67
- top_p=0.9,
68
- pad_token_id=tokenizer.eos_token_id,
69
- eos_token_id=tokenizer.eos_token_id
70
- )
71
-
72
- # 6. Decodificar solo la respuesta (no el prompt)
73
- response_ids = outputs[0][inputs.shape[-1]:]
74
- title = tokenizer.decode(response_ids, skip_special_tokens=True)
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
- print(f"Error al generar título: {e}")
85
- return f"Error: {str(e)}"
86
-
87
- # Crear la interfaz de Gradio
88
- with gr.Blocks(title="Generador de Títulos con Llama-3.2-1B") as demo:
89
- gr.Markdown(f"""
90
- # 📝 Generador de Títulos para Conversaciones
91
- Esta aplicación utiliza **{MODEL_NAME}** 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
-
100
- with gr.Row():
101
- with gr.Column():
102
- input_type = gr.Radio(
103
- choices=["Texto", "Chat"],
104
- value="Texto",
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
- accelerate>=0.25.0
 
 
 
 
 
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)