Spaces:
Sleeping
Sleeping
Create appy.pi
Browse files
appy.pi
ADDED
|
@@ -0,0 +1,92 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
import streamlit as st
|
| 2 |
+
import re
|
| 3 |
+
|
| 4 |
+
st.set_page_config(page_title="Prompt Coach", layout="wide")
|
| 5 |
+
|
| 6 |
+
st.title("🧠 Prompt Coach – Scrivi prompt migliori, capendo come si costruiscono")
|
| 7 |
+
|
| 8 |
+
st.markdown("Crea prompt efficaci e coerenti per AI come ChatGPT, Claude, Gemini... anche se non sei un tecnico.")
|
| 9 |
+
|
| 10 |
+
# 📘 GUIDA ESPANDIBILE
|
| 11 |
+
with st.expander("📘 Le 6 regole fondamentali del prompting"):
|
| 12 |
+
st.markdown("""
|
| 13 |
+
1. **RUOLO** – Chi è il modello? (es. “Agisci come un esperto HR”)
|
| 14 |
+
2. **TONO / STILE** – Qual è il tono più adatto? (professionale, informale…)
|
| 15 |
+
3. **OUTPUT ATTESO** – Cosa deve produrre? (articolo, lista, email…)
|
| 16 |
+
4. **VINCOLI** – Keyword, lunghezza, struttura, ecc.
|
| 17 |
+
5. **CONTESTO** – Per chi e dove verrà usato?
|
| 18 |
+
6. **RESPONSABILITÀ** – Qual è lo scopo finale? (informare, convincere, generare azione)
|
| 19 |
+
""")
|
| 20 |
+
|
| 21 |
+
# LAYOUT A COLONNE
|
| 22 |
+
col1, col2 = st.columns([1.2, 1])
|
| 23 |
+
|
| 24 |
+
with col1:
|
| 25 |
+
st.subheader("✍️ Inserisci il tuo prompt")
|
| 26 |
+
prompt_input = st.text_area("Prompt grezzo", height=200, placeholder="Es: Scrivi un articolo SEO sull'onboarding")
|
| 27 |
+
|
| 28 |
+
with col2:
|
| 29 |
+
st.subheader("🎯 Prompt raffinato + spiegazione")
|
| 30 |
+
|
| 31 |
+
# FUNZIONE PRINCIPALE
|
| 32 |
+
def analizza_e_riscrivi(prompt):
|
| 33 |
+
sezioni = []
|
| 34 |
+
spiegazioni = []
|
| 35 |
+
base = prompt.strip()
|
| 36 |
+
|
| 37 |
+
# REGOLE BASE
|
| 38 |
+
if not re.search(r"agisc[ia] come|sei un|ti comporti come", base.lower()):
|
| 39 |
+
base += " 🟨 **[Aggiunto: Agisci come un esperto di contenuti HR e copywriting SEO.]**"
|
| 40 |
+
spiegazioni.append("🟨 RUOLO mancante: specificare chi è il modello aiuta il comportamento.")
|
| 41 |
+
|
| 42 |
+
if "tono" not in base.lower():
|
| 43 |
+
base += " 🟨 **[Aggiunto: Usa un tono professionale e accessibile per un pubblico HR.]**"
|
| 44 |
+
spiegazioni.append("🟨 TONO assente: guida lo stile del testo.")
|
| 45 |
+
|
| 46 |
+
if not any(x in base.lower() for x in ["scrivi", "genera", "crea", "elabora"]):
|
| 47 |
+
base += " 🟨 **[Aggiunto: Genera un contenuto strutturato (es. articolo con H2 e bullet).]**"
|
| 48 |
+
spiegazioni.append("🟨 OUTPUT ATTESO non chiaro: cosa deve produrre esattamente?")
|
| 49 |
+
|
| 50 |
+
if "parola chiave" not in base.lower() and "keyword" not in base.lower():
|
| 51 |
+
base += " 🟨 **[Aggiunto: Includi la parola chiave 'digitalizzazione HR'.]**"
|
| 52 |
+
spiegazioni.append("🟨 VINCOLI mancanti: definire keyword guida la direzione del testo.")
|
| 53 |
+
|
| 54 |
+
if "pubblico" not in base.lower() and "target" not in base.lower():
|
| 55 |
+
base += " 🟨 **[Aggiunto: Il pubblico target è un HR manager di PMI italiane.]**"
|
| 56 |
+
spiegazioni.append("🟨 CONTESTO assente: importante per tono e contenuto.")
|
| 57 |
+
|
| 58 |
+
if not any(x in base.lower() for x in ["obiettivo", "scopo", "serve a"]):
|
| 59 |
+
base += " 🟨 **[Aggiunto: L'obiettivo è informare e invogliare alla prova gratuita di Fluida.]**"
|
| 60 |
+
spiegazioni.append("🟨 RESPONSABILITÀ mancante: chiarire lo scopo aiuta la struttura e l’intento.")
|
| 61 |
+
|
| 62 |
+
# CONTRASTI REALI
|
| 63 |
+
contraddizioni = []
|
| 64 |
+
|
| 65 |
+
if "in inglese" in base.lower() and ("PMI italiane" in base.lower() or "pubblico italiano" in base.lower()):
|
| 66 |
+
base += "\n\n🟥 **[CONTRASTO: Il prompt è in inglese ma il target è italiano. AUT AUT → (1) usare inglese o (2) passare all'italiano?]**"
|
| 67 |
+
contraddizioni.append("🟥 Lingua e pubblico non allineati: per PMI italiane è più efficace usare l’italiano.")
|
| 68 |
+
|
| 69 |
+
if "tono informale" in base.lower() and ("presentazione aziendale" in base.lower() or "documento ufficiale" in base.lower()):
|
| 70 |
+
base += "\n\n🟥 **[CONTRASTO: Tono informale per un contesto istituzionale. AUT AUT → (1) mantenere informale o (2) passare a tono formale?]**"
|
| 71 |
+
contraddizioni.append("🟥 Tono troppo leggero per un uso formale. Rivedere il registro.")
|
| 72 |
+
|
| 73 |
+
if "convincere il lettore" in base.lower() and ("elenco" in base.lower() or "lista" in base.lower()):
|
| 74 |
+
base += "\n\n🟥 **[CONTRASTO: Elenco poco adatto per persuadere. AUT AUT → (1) lascia elenco o (2) passa a forma argomentativa?]**"
|
| 75 |
+
contraddizioni.append("🟥 Elenco è utile per chiarezza, ma poco efficace per convincere. Scegli il formato giusto.")
|
| 76 |
+
|
| 77 |
+
# Spiegazioni
|
| 78 |
+
sezioni.append("### ✅ Prompt raffinato:")
|
| 79 |
+
sezioni.append(base)
|
| 80 |
+
sezioni.append("---\n### 📚 Spiegazione didattica:")
|
| 81 |
+
for s in spiegazioni + contraddizioni:
|
| 82 |
+
sezioni.append(f"- {s}")
|
| 83 |
+
|
| 84 |
+
return "\n\n".join(sezioni)
|
| 85 |
+
|
| 86 |
+
# OUTPUT
|
| 87 |
+
if st.button("🧠 Analizza il prompt"):
|
| 88 |
+
if prompt_input.strip():
|
| 89 |
+
risultato = analizza_e_riscrivi(prompt_input)
|
| 90 |
+
st.markdown(risultato)
|
| 91 |
+
else:
|
| 92 |
+
st.warning("⚠️ Inserisci prima un prompt da analizzare.")
|