import gradio as gr import torch from transformers import AutoTokenizer, AutoModelForCausalLM from peft import PeftModel # 1. Configurazioni iniziali BASE_MODEL = "Qwen/Qwen2.5-1.5B-Instruct" ADAPTER_CIRO = "YecoAI/napoletano-ciro" ADAPTER_GIOAN = "YecoAI/piemontese-gioan" print("Caricamento del Tokenizer...") tokenizer = AutoTokenizer.from_pretrained(BASE_MODEL) print("Caricamento del Modello Base (Qwen2.5-1.5B)...") base_model = AutoModelForCausalLM.from_pretrained( BASE_MODEL, dtype=torch.float32, device_map="cpu" ) print("Caricamento degli Adapter LoRA...") model = PeftModel.from_pretrained(base_model, ADAPTER_CIRO, adapter_name="ciro") model.load_adapter(ADAPTER_GIOAN, adapter_name="gioan") def respond(message, history, persona): selected_persona = persona if persona is not None else "🌋 Ciro (Napoletano)" if "Ciro" in selected_persona: model.set_adapter("ciro") system_prompt = "Sei Ciro, un ragazzo di Napoli verace, amichevole e ironico. Parli in dialetto napoletano. Rispondi in modo breve e simpatico." else: model.set_adapter("gioan") system_prompt = "Sei Gioan, un signore del Piemonte cordiale, pacato e ironico. Parli in dialetto piemontese. Rispondi in modo breve e gentile." messages = [{"role": "system", "content": system_prompt}] # Gradio 6.0 può inviare history come lista di dizionari con content come stringa o lista for msg in history: content = msg.get("content", "") if isinstance(content, list): # Estraiamo il testo dal formato lista di dict text_content = " ".join([item.get("text", "") for item in content if item.get("type") == "text"]) messages.append({"role": msg["role"], "content": text_content}) else: messages.append({"role": msg["role"], "content": content}) messages.append({"role": "user", "content": message}) text = tokenizer.apply_chat_template(messages, tokenize=False, add_generation_prompt=True) model_inputs = tokenizer([text], return_tensors="pt").to(model.device) with torch.no_grad(): generated_ids = model.generate( **model_inputs, max_new_tokens=150, temperature=0.8, top_p=0.9, repetition_penalty=1.1, pad_token_id=tokenizer.eos_token_id ) generated_ids = [output_ids[len(input_ids):] for input_ids, output_ids in zip(model_inputs.input_ids, generated_ids)] return tokenizer.batch_decode(generated_ids, skip_special_tokens=True)[0] # Interfaccia custom custom_css = """ .gradio-container { background-color: #0f1115 !important; font-family: 'Inter', system-ui, -apple-system, sans-serif !important; } .main-header { text-align: center; padding: 40px 20px; background: linear-gradient(135deg, #1e293b 0%, #0f172a 100%); border-radius: 20px; margin-bottom: 30px; border: 1px solid #334155; } .chatbot-container { border-radius: 20px !important; border: 1px solid #334155 !important; overflow: hidden; } .persona-card { background: #1e293b; padding: 15px; border-radius: 15px; border: 1px solid #334155; } .footer-text { text-align: center; margin-top: 30px; color: #94a3b8; font-size: 0.9rem; } """ with gr.Blocks() as demo: with gr.Column(elem_classes="main-header"): gr.HTML("""
La prima intelligenza artificiale a parlare il dialetto in modo ironico.
L'unica AI che ti risponde col cuore (e un po' di pregiudizio regionale).