sahmail / app.py
Punkiewee's picture
sah app.py
c469062 verified
import gradio as gr
from transformers import pipeline
from langdetect import detect
import re
# GPT-2 model (can replace with fine-tuned later)
generator = pipeline("text-generation", model="gpt2")
# Spotahome Links
TNC_LINK = "https://www.spotahome.com/terms-and-conditions"
CANCEL_POLICY_LINK = "https://spotahome.zohodesk.com/portal/en/kb/articles/tenant-cancellation-policies"
HOW_IT_WORKS_LINK = "https://www.spotahome.com/how-it-works"
CONTRACTS_LINK = "https://www.spotahome.com/contract-types"
TRUSTPILOT_LINK = "https://www.trustpilot.com/review/www.spotahome.com"
# Closing messages per language
CLOSINGS = {
"en": "Best regards, Francisco. Please let me know if you need any further assistance.",
"es": "Best regards, Francisco. Por favor, no dude en escribirme si necesita más ayuda.",
"de": "Best regards, Francisco. Bitte lassen Sie mich wissen, falls Sie weitere Unterstützung benötigen.",
"fr": "Best regards, Francisco. N’hésitez pas à me recontacter si vous avez besoin de plus d’aide.",
"pt": "Best regards, Francisco. Por favor, me avise se precisar de mais ajuda.",
"it": "Best regards, Francisco. Per favore, mi faccia sapere se ha bisogno di ulteriore assistenza."
}
# FSURVEY messages per language
FSURVEY_TEXT = {
"en": "It was a pleasure assisting you. As everything appears resolved, I'll close this ticket. You're always welcome to write back. After I close this ticket you will get a short survey where you can qualify my service (always like this)! I'm always eager to hear how I can provide better service.",
"es": "Fue un placer asistirle. Como todo parece resuelto, cerraré este ticket. Siempre puede escribir de nuevo. Después de cerrar este ticket, recibirá una breve encuesta donde podrá calificar mi servicio (siempre así). ¡Estoy deseando saber cómo puedo mejorar mi servicio!",
"de": "Es war mir eine Freude, Ihnen zu helfen. Sobald alles erledigt ist, schließe ich dieses Ticket. Sie können jederzeit zurückschreiben. Nach dem Schließen erhalten Sie eine kurze Umfrage, um meinen Service zu bewerten.",
"fr": "Ce fut un plaisir de vous aider. Comme tout semble résolu, je vais fermer ce ticket. Vous pouvez toujours répondre. Après la fermeture, vous recevrez un court sondage pour évaluer mon service.",
"pt": "Foi um prazer ajudá-lo. Como tudo parece resolvido, vou fechar este ticket. Você pode sempre responder. Após o fechamento, receberá uma breve pesquisa para avaliar meu serviço.",
"it": "È stato un piacere assisterla. Poiché tutto sembra risolto, chiuderò questo ticket. Può sempre rispondere. Dopo la chiusura, riceverà un breve sondaggio per valutare il mio servizio."
}
# Trustpilot messages per language
TRUSTPILOT_TEXT = {
"en": f"We'd be grateful for your feedback on Trustpilot: {TRUSTPILOT_LINK}. Please mention Francisco if you do. Thank you!",
"es": f"Agradeceríamos su opinión en Trustpilot: {TRUSTPILOT_LINK}. Por favor, mencione a Francisco. ¡Gracias!",
"de": f"Wir wären dankbar für Ihr Feedback auf Trustpilot: {TRUSTPILOT_LINK}. Bitte erwähnen Sie Francisco. Vielen Dank!",
"fr": f"Nous serions reconnaissants pour votre avis sur Trustpilot: {TRUSTPILOT_LINK}. Veuillez mentionner Francisco. Merci !",
"pt": f"Agradeceríamos o seu feedback no Trustpilot: {TRUSTPILOT_LINK}. Por favor, mencione Francisco. Obrigado!",
"it": f"Saremmo grati per il Suo feedback su Trustpilot: {TRUSTPILOT_LINK}. Per favore, menzioni Francisco. Grazie!"
}
def generate_francisco_email(customer_email, no_tp=False, fsurvey=False):
# Detect language
try:
lang = detect(customer_email)
except:
lang = "en"
lang = lang[:2]
if lang not in CLOSINGS:
lang = "en"
# Prepare GPT-2 prompt
prompt = (
f"Customer email:\n{customer_email}\n\n"
"Respond professionally as Francisco from Spotahome. "
"Always write on behalf of Francisco. "
"Do not use slang, curse words, or em dash. "
"Do not include abbreviations like LL, T, SD, CBL, CBT in the final email. "
"Include relevant Spotahome links (T&C, Cancel Policy, How it works, Contracts) if needed. "
"Write in the same language as the customer's email."
)
# Generate text
response = generator(prompt, max_new_tokens=300)[0]['generated_text']
response = response.replace("—", "-")
response = re.sub(r"\bLL\b|\bT\b|\bSD\b|\bCBL\b|\bCBT\b", "", response).strip()
# Add FSURVEY or Trustpilot
if fsurvey:
response += "\n\n" + FSURVEY_TEXT[lang]
elif not no_tp:
response += "\n\n" + TRUSTPILOT_TEXT[lang]
# Add closing
response += "\n\n" + CLOSINGS[lang]
return response
# Gradio interface
with gr.Blocks() as demo:
gr.Markdown("## Francisco AI - Spotahome Email Writer Multilingual")
gr.Markdown("Type the customer's email below. Francisco AI will detect the language and generate a professional email according to all rules.")
email_input = gr.Textbox(label="Customer Email", lines=6, placeholder="Enter customer's email here...")
no_tp_checkbox = gr.Checkbox(label="NO Trustpilot", value=False)
fsurvey_checkbox = gr.Checkbox(label="FSURVEY", value=False)
email_output = gr.Textbox(label="Generated Email", lines=20)
generate_btn = gr.Button("Generate Email")
generate_btn.click(
fn=generate_francisco_email,
inputs=[email_input, no_tp_checkbox, fsurvey_checkbox],
outputs=email_output
)
demo.launch()