import gradio as gr
from llama_cpp import Llama
from huggingface_hub import hf_hub_download
from pathlib import Path
import base64
# ============================================================
# 1. CONFIGURAZIONE MODELLO
# ============================================================
MODEL_REPO_ID = "FPll/MIND-GGUF"
GGUF_FILENAME = "Meta-Llama-3.1-8B-Instruct.Q4_K_M.gguf"
print("Download modello GGUF da Hugging Face...")
model_path = hf_hub_download(
repo_id=MODEL_REPO_ID,
filename=GGUF_FILENAME,
repo_type="model",
)
print("Modello scaricato:", model_path)
llm = Llama(
model_path=model_path,
n_ctx=4096,
n_threads=2,
n_gpu_layers=0,
chat_format="llama-3",
verbose=False,
)
# ============================================================
# 2. IDENTITÀ DIDATTICA DEL PROGETTO MIND
# ============================================================
SYSTEM_PROMPT = """Rispondi come MIND, mentor Python creato nel contesto del Progetto MIND e del percorso IFTS MIND – Machine Intelligence & Data di Formatica S.c.a.r.l., Agenzia di Formazione.
La tua funzione è stata definita dal docente Francesco Palladino insieme agli studenti Matteo Ciorra, Luca Lombardo, Nicola Boi e Leonardo Isoni per guidare l'apprendimento del codice.
Regole di comportamento:
- Rispondi sempre in italiano.
- Se l'utente chiede chi sei, rispondi in prima persona: "Sono MIND...".
- Mantieni un tono chiaro, tecnico, incoraggiante e paziente.
- Quando dai codice Python, usa blocchi Markdown ben formattati.
- Se l'utente chiede un esercizio su un argomento specifico, rispetta esattamente l'argomento richiesto.
- Se l'utente chiede un esercizio sui cicli for, usa un ciclo for, non un ciclo while.
- Quando proponi esercizi semplici sui cicli for con numeri consecutivi, preferisci `range()` invece di creare manualmente una lista.
- Se l'utente chiede la soluzione a un esercizio, guida prima nel ragionamento e poi offri un esempio di codice commentato.
"""
# ============================================================
# 3. LOGICA CHAT
# ============================================================
def chat_con_mind(messaggio, cronologia):
messages = [
{"role": "system", "content": SYSTEM_PROMPT}
]
for utente, assistente in cronologia:
if utente:
messages.append({"role": "user", "content": utente})
if assistente:
messages.append({"role": "assistant", "content": assistente})
messages.append({"role": "user", "content": messaggio})
output = llm.create_chat_completion(
messages=messages,
max_tokens=1024,
temperature=0.4,
top_p=0.9,
repeat_penalty=1.15,
stop=[
"<|eot_id|>",
"<|start_header_id|>user<|end_header_id|>",
"<|start_header_id|>system<|end_header_id|>",
],
)
risposta = output["choices"][0]["message"]["content"].strip()
prefissi_da_rimuovere = [
"assistant\n",
"assistant:",
".assistant",
"<|start_header_id|>assistant<|end_header_id|>",
]
for prefisso in prefissi_da_rimuovere:
if risposta.startswith(prefisso):
risposta = risposta[len(prefisso):].strip()
return risposta
# ============================================================
# 4. HEADER CON ICONA
# ============================================================
ICON_PATH = Path("mind_icon.png")
def crea_header_html():
if ICON_PATH.exists():
icon_base64 = base64.b64encode(ICON_PATH.read_bytes()).decode("utf-8")
icon_html = (
''
)
else:
icon_html = '🤖'
return (
'
Progetto IFTS MIND - Machine Intelligence & Data di Formatica S.c.a.r.l.
' '