import streamlit as st
import re
import anthropic
import os
st.set_page_config(page_title="Prompt Coach", layout="wide")
# ✅ Titolo e sottotitolo in verde fluo
st.markdown("
🧠 Prompt Coach
", unsafe_allow_html=True)
st.markdown("Scrivi prompt migliori, capendo come si costruiscono.
", unsafe_allow_html=True)
# ✅ CSS personalizzato
st.markdown(
'''
''',
unsafe_allow_html=True
)
# ✅ Espandi guida
with st.expander("📘 Le 6 regole fondamentali del prompting"):
st.markdown(
""
"
"
"- RUOLO – Chi è il modello?
"
"- TONO / STILE – Che tono usare?
"
"- OUTPUT ATTESO – Che tipo di contenuto vuoi?
"
"- VINCOLI – Cosa deve includere o evitare?
"
"- CONTESTO – A chi è rivolto?
"
"- RESPONSABILITÀ – Qual è lo scopo?
"
"
"
"
",
unsafe_allow_html=True
)
# ✅ Layout due colonne
col1, col2 = st.columns([1.2, 1])
with col1:
st.markdown("✍️ Inserisci il tuo prompt
", unsafe_allow_html=True)
prompt_input = st.text_area("Prompt grezzo", height=200, label_visibility="collapsed")
with col2:
st.markdown("🎯 Prompt raffinato + spiegazione
", unsafe_allow_html=True)
def analizza_e_riscrivi(prompt):
sezioni = []
spiegazioni = []
base = prompt.strip()
if not re.search(r"agisc[ia] come|sei un|ti comporti come", base.lower()):
base += " 🟨 **[Aggiunto: Agisci come un esperto HR e copywriter SEO.]**"
spiegazioni.append("🟨 RUOLO mancante.")
if "tono" not in base.lower():
base += " 🟨 **[Aggiunto: Usa un tono professionale e accessibile.]**"
spiegazioni.append("🟨 TONO mancante.")
if not any(x in base.lower() for x in ["scrivi", "genera", "crea", "elabora"]):
base += " 🟨 **[Aggiunto: Genera un articolo strutturato con H2 e bullet.]**"
spiegazioni.append("🟨 OUTPUT ATTESO mancante.")
if "keyword" not in base.lower():
base += " 🟨 **[Aggiunto: Includi la keyword 'digitalizzazione HR'.]**"
spiegazioni.append("🟨 VINCOLI mancanti.")
if "pubblico" not in base.lower():
base += " 🟨 **[Aggiunto: Il target è un HR manager di PMI italiane.]**"
spiegazioni.append("🟨 CONTESTO mancante.")
if "obiettivo" not in base.lower() and "scopo" not in base.lower():
base += " 🟨 **[Aggiunto: Obiettivo: informare e spingere alla prova gratuita di Fluida.]**"
spiegazioni.append("🟨 RESPONSABILITÀ mancante.")
sezioni.append("### ✅ Prompt raffinato:")
sezioni.append(base)
sezioni.append("---\n### 📚 Spiegazione didattica:")
for s in spiegazioni:
sezioni.append(f"- {s}")
return "\n\n".join(sezioni), base
risultato = ""
raffinato = ""
if st.button("🧠 Analizza il prompt", type="primary"):
if prompt_input.strip():
risultato, raffinato = analizza_e_riscrivi(prompt_input)
st.markdown(f"{risultato}
", unsafe_allow_html=True)
else:
st.warning("⚠️ Inserisci prima un prompt.")
if prompt_input.strip():
raffinato, _ = analizza_e_riscrivi(prompt_input)
st.download_button("⬇️ Scarica prompt raffinato", data=raffinato, file_name="prompt_raffinato.txt")
st.text_area("📋 Copia prompt", value=raffinato, height=150, label_visibility="collapsed")
if st.button("🤖 Genera risposta con Claude", type="secondary"):
if prompt_input.strip():
with st.spinner("Sto generando la risposta..."):
client = anthropic.Anthropic(api_key=os.getenv("ANTHROPIC_API_KEY"))
full_prompt, _ = analizza_e_riscrivi(prompt_input)
response = client.messages.create(
model="claude-3-sonnet-20240229",
max_tokens=600,
temperature=0.7,
messages=[{"role": "user", "content": full_prompt}]
)
risposta = response.content[0].text
st.markdown("📝 Risposta generata da Claude:
", unsafe_allow_html=True)
st.markdown(f"{risposta}
", unsafe_allow_html=True)
else:
st.warning("⚠️ Inserisci prima un prompt.")