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( "
" "
    " "
  1. RUOLO – Chi è il modello?
  2. " "
  3. TONO / STILE – Che tono usare?
  4. " "
  5. OUTPUT ATTESO – Che tipo di contenuto vuoi?
  6. " "
  7. VINCOLI – Cosa deve includere o evitare?
  8. " "
  9. CONTESTO – A chi è rivolto?
  10. " "
  11. RESPONSABILITÀ – Qual è lo scopo?
  12. " "
" "
", 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.")