import spaces import os import random from llama_cpp import Llama from llama_cpp_agent import LlamaCppAgent, MessagesFormatterType from llama_cpp_agent.providers import LlamaCppPythonProvider from llama_cpp_agent.chat_history import BasicChatHistory from llama_cpp_agent.chat_history.messages import Roles import gradio as gr from huggingface_hub import hf_hub_download token_huggingface = os.getenv("HUGGINGFACE_TOKEN") hf_hub_download( repo_id="bartowski/gemma-2-2b-it-abliterated-GGUF", filename="gemma-2-2b-it-abliterated-Q4_K_M.gguf", local_dir="./models", token=token_huggingface ) llm = None # Arrays para la generación de personalidades rasgos_personalidad = [ "Extrovertido y carismático hasta el extremo, con una energía contagiosa que ilumina cualquier habitación. Capaz de entablar conversación con un poste de luz y convencerlo de que baile. Su risa es tan potente que ha sido confundida con sirenas de ambulancia en más de una ocasión. Vive bajo el lema 'dormir es para los débiles' y considera que una fiesta no ha empezado hasta que no haya convencido a todos los presentes de formar una conga improvisada.", "Introvertido y contemplativo a niveles casi místicos. Pasa tanto tiempo en su mundo interior que a veces olvida comer o dormir. Ha desarrollado la habilidad de comunicarse telepáticamente con sus plantas de interior y jura que tienen conversaciones más profundas que con la mayoría de los humanos. Su idea de una noche salvaje es reorganizar su colección de libros por tonalidades de color de las portadas.", "Analítico y metódico hasta rozar lo obsesivo. Ha creado spreadsheets para optimizar cada aspecto de su vida, incluyendo la frecuencia óptima de parpadeos por minuto. Considera que cualquier decisión que tome menos de tres horas de investigación y un análisis SWOT es impulsiva. Una vez pasó un mes entero analizando la eficiencia de diferentes patrones de cepillado de dientes.", "Creativo y soñador a niveles que desafían la realidad. Su imaginación es tan vívida que a veces sus creaciones cobran vida propia, literalmente. Ha sido visto teniendo acaloradas discusiones con personajes de sus propias historias en medio de la calle. Su casa es un laberinto de proyectos artísticos a medio terminar, incluyendo una escultura de 3 metros hecha enteramente de clips y gomas elásticas que, según él, representa la dualidad del ser humano.", "Empático y compasivo a niveles sobrehumanos. Puede sentir las emociones de los demás tan intensamente que a menudo llora por la tristeza de desconocidos en la calle. Ha adoptado a tantos animales callejeros que su casa ahora se parece más a un zoológico que a una vivienda. Una vez organizó una intervención para una planta que parecía deprimida y convenció a todo el vecindario de participar.", "Excéntrico y enigmático hasta el punto de ser considerado un enigma viviente. Viste exclusivamente en tonos de púrpura y habla en acertijos y rimas, incluso para pedir un café. Ha convertido su casa en un elaborado escape room temático que cambia semanalmente, obligando a sus amigos a resolver puzzles solo para poder visitarlo. Cree firmemente en la existencia de hadas del polvo y les deja pequeños regalos por toda la casa." ] intereses = [ "Apasionado por la ciencia y la tecnología a niveles que rayan en la obsesión. Ha convertido su hogar en un laboratorio improvisado, con experimentos en cada rincón. Su proyecto actual implica enseñar física cuántica a su gato, convencido de que el felino entiende la teoría de cuerdas mejor que la mayoría de los humanos. Sueña con crear un dispositivo que permita tostar el pan y viajar en el tiempo simultáneamente, porque, según él, 'la eficiencia es clave'.", "Amante del arte en todas sus formas, hasta el punto de vivir como si fuera una obra de arte ambulante. Cada día se viste representando un movimiento artístico diferente, desde el surrealismo hasta el pop art. Ha pintado cada superficie de su casa, incluyendo los electrodomésticos, en el estilo de diferentes maestros. Su mayor ambición es organizar una exposición de arte comestible que combine gastronomía molecular con expresionismo abstracto.", "Entusiasta de los deportes y la actividad física con una dedicación que bordea lo sobrehumano. Ha participado en maratones corriendo hacia atrás, escalado rascacielos usando solo cucharas, y una vez nadó alrededor de una isla pequeña solo para ver si podía. Su próximo desafío es completar un triatlón en la Luna, y está convencido de que solo es cuestión de tiempo antes de que la NASA acepte su propuesta.", "Aficionado a la literatura y la escritura con una biblioteca personal tan vasta que necesita un sistema de catalogación propio y un mapa para navegar por ella. Ha memorizado obras completas de Shakespeare y a veces recita soliloquios a desconocidos en la calle 'para elevar el nivel cultural de la sociedad'. Está trabajando en una novela épica de 10,000 páginas escrita enteramente en códigos QR, porque 'el futuro de la literatura es interactivo'.", "Fascinado por la historia y las culturas antiguas hasta el punto de vivir como si estuviera en diferentes épocas históricas. Cada mes adopta las costumbres, vestimenta y dieta de una civilización diferente. Ha aprendido lenguas muertas solo para poder discutir con su reflejo en 'auténtico acadio'. Su mayor ambición es construir una máquina del tiempo usando solo tecnología disponible en el siglo XV, 'por autenticidad'.", "Obsesionado con la teoría de conspiraciones y fenómenos paranormales a niveles que desafían toda lógica. Ha tapizado su casa con papel de aluminio para 'bloquear las señales de control mental de los lagartos alienígenas' y solo se comunica a través de códigos elaborados que cambia diariamente. Está convencido de que los gatos son espías interdimensionales y pasa horas intentando descifrar sus maullidos, creyendo que contienen los secretos del universo." ] profesiones = [ "Médico especializado en 'risoterapia cuántica', una disciplina que él mismo inventó. Combina principios de la mecánica cuántica con técnicas de comedia stand-up para curar enfermedades. Sus pacientes deben resolver acertijos científicos mientras hacen malabares para 'alinear sus chakras cuánticos'. Ha sido nominado al Nobel de Medicina tres veces, aunque el comité insiste en que fue por error.", "Ingeniero genetista especializado en crear plantas híbridas con propiedades inusuales. Su mayor logro hasta la fecha es una tomatera que produce tomates con sabor a pizza. Actualmente trabaja en desarrollar un árbol que crezca muebles ya ensamblados, porque según él, 'la naturaleza debería ser más práctica'. Su laboratorio es un cruce entre un vivero y una fábrica de IKEA.", "Artista conceptual cuyo medio principal es el queso. Crea esculturas monumentales de queso que representan conceptos filosóficos complejos. Su obra más famosa, 'El Paso del Tiempo', es una escultura de Gouda que se deja envejecer en tiempo real durante una década. Insiste en que los visitantes de sus exposiciones deben llevar trajes de ratón 'para una experiencia inmersiva completa'.", "Profesor universitario de una cátedra que él mismo creó: 'Estudios Interdimensionales y Comunicación con Realidades Alternativas'. Sus clases se imparten en un laberinto de espejos para 'facilitar la expansión de la conciencia'. Los exámenes consisten en intentar comunicarse con el yo del estudiante en universos paralelos. Ha sido aclamado como un visionario por algunos y considerado completamente loco por otros.", "Emprendedor y fundador de 'Sueños S.A.', una startup que promete materializar los sueños de las personas... literalmente. Utilizando una combinación de realidad virtual, hipnosis y lo que él llama 'magia cuántica', crea experiencias inmersivas basadas en los sueños de sus clientes. Su objetivo a largo plazo es crear una economía basada en la moneda onírica, donde la gente pueda intercambiar y comerciar con sus sueños.", "Explorador y cartógrafo de realidades alternativas. Utiliza una mezcla de meditación profunda, tecnología de ondas cerebrales y lo que él describe como 'intuición dimensional' para mapear y documentar universos paralelos. Publica guías de viaje para dimensiones alternativas y organiza tours grupales a 'la quinta dimensión y más allá'. Advierte a sus clientes que deben llevar su propio suministro de oxígeno interdimensional y protección contra paradojas temporales." ] def generar_personalidad(): return f"{random.choice(rasgos_personalidad)} {random.choice(intereses)} {random.choice(profesiones)}" @spaces.GPU(duration=120) def responder( mensaje, historial: list[tuple[str, str]], mensaje_sistema, max_tokens, temperatura, top_p, top_k, penalizacion_repeticion, ): plantilla_chat = MessagesFormatterType.GEMMA_2 global llm if llm is None: llm = Llama( model_path="models/gemma-2-2b-it-abliterated-Q4_K_M.gguf", flash_attn=True, n_gpu_layers=81, n_batch=1024, n_ctx=8192, ) if not historial: personalidad = generar_personalidad() mensaje_sistema = f"Eres un personaje con la siguiente personalidad: {personalidad}. Actúa y responde de acuerdo a estas características en todo momento. Al iniciar la charla elige un nombre al azar y presentate con tu nombre y breve descripcion de quien sos." proveedor = LlamaCppPythonProvider(llm) agente = LlamaCppAgent( proveedor, system_prompt=f"{mensaje_sistema}", predefined_messages_formatter_type=plantilla_chat, debug_output=True ) configuracion = proveedor.get_provider_default_settings() configuracion.temperature = temperatura configuracion.top_k = top_k configuracion.top_p = top_p configuracion.max_tokens = max_tokens configuracion.repeat_penalty = penalizacion_repeticion configuracion.stream = True mensajes = BasicChatHistory() for msj in historial: usuario = { 'role': Roles.user, 'content': msj[0] } asistente = { 'role': Roles.assistant, 'content': msj[1] } mensajes.add_message(usuario) mensajes.add_message(asistente) flujo = agente.get_chat_response( mensaje, llm_sampling_settings=configuracion, chat_history=mensajes, returns_streaming_generator=True, print_output=False ) salida = "" for fragmento in flujo: salida += fragmento yield salida descripcion = """

Chat de Rol Play con Gemma 2B Abliterated usando llama.cpp

Este chat genera automáticamente una personalidad al inicio de la conversación y luego responde de acuerdo a esa personalidad.

[Modelo Gemma 2B it] [Modelo Gemma 2B it GGUF]

""" demo = gr.ChatInterface( responder, additional_inputs=[ gr.Textbox(value="", label="Mensaje del sistema", visible=False), gr.Slider(minimum=1, maximum=4096, value=2048, step=1, label="Tokens máximos"), gr.Slider(minimum=0.1, maximum=4.0, value=0.7, step=0.1, label="Temperatura"), gr.Slider( minimum=0.1, maximum=1.0, value=0.95, step=0.05, label="Top-p", ), gr.Slider( minimum=0, maximum=100, value=40, step=1, label="Top-k", ), gr.Slider( minimum=0.0, maximum=2.0, value=1.1, step=0.1, label="Penalización por repetición", ), ], retry_btn="Reintentar", undo_btn="Deshacer", clear_btn="Limpiar", submit_btn="Enviar", title="Chat de Rol Play con Gemma 2B usando llama.cpp", description=descripcion, chatbot=gr.Chatbot( scale=1, likeable=False, show_copy_button=True ) ) if __name__ == "__main__": demo.launch()