Spaces:
Running
Running
Download app.py from AxoneSystem/Minerva-chat: direct link, hf CLI and curl.
- Browser
- Download file 2.82 kB
-
https://huggingface.co/spaces/AxoneSystem/Minerva-chat/resolve/main/app.py
- Command line
-
hf download hf://spaces/AxoneSystem/Minerva-chat/app.py
-
curl -L -o app.py https://huggingface.co/spaces/AxoneSystem/Minerva-chat/resolve/main/app.py
2.82 kB
| """Chat web con Minerva v0.1 (https://huggingface.co/AxoneSystem/Minerva-v0.1).""" | |
| import gradio as gr | |
| import torch | |
| from transformers import AutoModelForCausalLM, AutoTokenizer | |
| REPO = "AxoneSystem/Minerva-v0.1" | |
| tok = AutoTokenizer.from_pretrained(REPO) | |
| modelo = AutoModelForCausalLM.from_pretrained(REPO).eval() | |
| CONTEXTO = 512 # tokens que Minerva puede ver a la vez | |
| MAX_RESPUESTA = 200 | |
| def texto(contenido): | |
| """El contenido de un mensaje puede venir como texto, dict o lista de partes (según la versión de Gradio).""" | |
| if isinstance(contenido, str): | |
| return contenido | |
| if isinstance(contenido, dict): | |
| return contenido.get("text") or "" | |
| if isinstance(contenido, (list, tuple)): | |
| return " ".join(texto(p) for p in contenido).strip() | |
| return "" | |
| def a_mensajes(historial): | |
| """Acepta el historial de Gradio en formato de mensajes o de pares (según la versión).""" | |
| mensajes = [] | |
| for item in historial or []: | |
| if isinstance(item, dict): | |
| t = texto(item.get("content")) | |
| if item.get("role") in ("user", "assistant") and t: | |
| mensajes.append({"role": item["role"], "content": t}) | |
| else: | |
| usuario, asistente = texto(item[0]), texto(item[1]) | |
| if usuario: | |
| mensajes.append({"role": "user", "content": usuario}) | |
| if asistente: | |
| mensajes.append({"role": "assistant", "content": asistente}) | |
| return mensajes | |
| def responder(mensaje, historial, temperatura): | |
| mensajes = a_mensajes(historial) + [{"role": "user", "content": texto(mensaje)}] | |
| entrada = tok.apply_chat_template(mensajes, add_generation_prompt=True, return_tensors="pt", return_dict=True) | |
| ids = entrada["input_ids"][:, -(CONTEXTO - MAX_RESPUESTA):] # solo recuerda lo último | |
| with torch.no_grad(): | |
| salida = modelo.generate(input_ids=ids, attention_mask=torch.ones_like(ids), max_new_tokens=MAX_RESPUESTA, | |
| do_sample=True, temperature=temperatura, top_k=30) | |
| return tok.decode(salida[0, ids.shape[1]:], skip_special_tokens=True).strip() | |
| demo = gr.ChatInterface( | |
| responder, | |
| title="Minerva v0.1 🇪🇸", | |
| description=("Un modelo de lenguaje en español diminuto (30M de parámetros), entrenado desde cero en un portátil. " | |
| "Habla bien pero **se lo inventa casi todo**: es un modelo de juguete. " | |
| "[Ver el modelo](https://huggingface.co/AxoneSystem/Minerva-v0.1)"), | |
| examples=[["¿Quién eres?", 0.7], ["¿Por qué te llamas Minerva?", 0.7], ["¿Qué es la paella?", 0.7], | |
| ["Cuéntame un cuento corto.", 0.7]], | |
| additional_inputs=[gr.Slider(0.1, 1.5, value=0.7, step=0.1, label="Temperatura (más alta = más loca)")], | |
| ) | |
| if __name__ == "__main__": | |
| demo.launch() | |