import gradio as gr from groq import Groq def clean_text_from_file(file_path): with open(file_path, "r", encoding="utf-8") as file: text = file.read() return text def generate_narrative_arc(narrative_arc): narrative_mapping = { "Hero's Journey": "Using the \"Hero's Journey\" (a classic storytelling structure where the protagonist goes through departure, initiation, and return phases, facing challenges and undergoing transformation).", "Story Cycle": "Using the \"Story Cycle\" (a recurring sequence of narrative events or situations that form a pattern, often seen in episodic or serial narratives).", "Motivation Sequence": "Using the \"Motivation Sequence\" (a series of events or actions that drive the protagonist's desires, goals, and motivations, propelling the story forward).", "Narrative Transportation": "Using the \"Narrative Transportation\" (the phenomenon where readers become immersed and transported into the narrative world, temporarily detaching from their real-world surroundings).", "Narrative Persuasion": "Using the \"Narrative Persuasion\" (the use of storytelling to influence attitudes, beliefs, or behaviors by presenting arguments or perspectives through a narrative format).", "Conciso": "Using the \"Concise Style\" (concise and extremely brief, conveying the essence of a narrative arc or structure in a highly condensed form)." } return narrative_mapping.get(narrative_arc, "") def generate_marketing_model(marketing_model): if marketing_model in ["PAS", "AIDA", "BAB", "4Cs", "So What", "PPPP", "SSS", "FAB", "SLAP", "4Us"]: additional_text = """Non rivelare il modello usato e non spiegarlo inline. Però alla fine del testo che scrivi, aggiungi la spiegazione di come e dove hai usato il modello, aiutandoti con parentesi quadre. """ else: additional_text = "" if marketing_model == "PAS": return "Problem Agitate Solve: This technique starts by identifying a problem that the reader is experiencing. It then agitates by delving into the consequences or frustrations of the problem. Finally, it offers a solution that the product or service can solve." + additional_text elif marketing_model == "AIDA": return "Attention Interest Desire Action: This model guides copywriters to first grab the reader's attention, then generate interest in the product or service, followed by creating a desire for it, and finally prompting an action, such as making a purchase." + additional_text elif marketing_model == "BAB": return "Before After Bridge: This framework begins by showing the reader their world 'before' the product, then contrasts it with the 'after' world where their problem is solved by the product, and bridges the gap with how the product can take them there." + additional_text elif marketing_model == "4Cs": return "Clear, Concise, Compelling, Credible: This checklist ensures copy is easily understood (Clear), gets to the point (Concise), engages the reader (Compelling), and establishes trust (Credible)." + additional_text elif marketing_model == "So What": return "This technique focuses on the benefits of the product or service, asking 'So what?' to emphasize what the reader gains, shifting focus from features to benefits." + additional_text elif marketing_model == "PPPP": return "Problem, Promise, Proof, Proposal: Start by identifying a problem, make a promise of solving it, provide proof to back up your claims, and end with a proposal or call-to-action." + additional_text elif marketing_model == "SSS": return "Star, Story, Solution: Introduce a protagonist (Star) who faces a challenge or problem, narrate their journey (Story) including struggles, and present your product or service as the solution that helps them overcome the challenge." + additional_text elif marketing_model == "FAB": return "Features, Advantages, Benefits: Highlight the features of your product, explain how these features give an advantage over competitors, and delineate the benefits that the user will enjoy." + additional_text elif marketing_model == "SLAP": return "Stop, Look, Action, Purchase: Grab the reader's attention (Stop), make them look at what you're offering (Look), encourage immediate action (Action), and guide towards making a purchase (Purchase)." + additional_text elif marketing_model == "4Us": return "Urgency, Uniqueness, Utility, Ultimatum: Create a sense of Urgency for the reader, show how your offer is Unique, describe its Utility, and present an Ultimatum to prompt action." + additional_text elif marketing_model == "Nessuno": return "Nessun modello di marketing in particolare (scegli tu il modo migliore di creare un wonderful copy)" + additional_text # Prepara i dati della tabella in formato HTML def generate_marketing_models_table_html(): rows = [ "ModelDescription", "PASProblem Agitate Solve: This technique starts by identifying a problem that the reader is experiencing. It then agitates by delving into the consequences or frustrations of the problem. Finally, it offers a solution that the product or service can solve.", "AIDAAttention Interest Desire Action: This model guides copywriters to first grab the reader's attention, then generate interest in the product or service, followed by creating a desire for it, and finally prompting an action, such as making a purchase.", "BABBefore After Bridge: This framework begins by showing the reader their world 'before' the product, then contrasts it with the 'after' world where their problem is solved by the product, and bridges the gap with how the product can take them there.", "4CsClear, Concise, Compelling, Credible: This checklist ensures copy is easily understood (Clear), gets to the point (Concise), engages the reader (Compelling), and establishes trust (Credible).", "So WhatThis technique focuses on the benefits of the product or service, asking 'So what?' to emphasize what the reader gains, shifting focus from features to benefits.", "PPPPProblem, Promise, Proof, Proposal: Start by identifying a problem, make a promise of solving it, provide proof to back up your claims, and end with a proposal or call-to-action.", "SSSStar, Story, Solution: Introduce a protagonist (Star) who faces a challenge or problem, narrate their journey (Story) including struggles, and present your product or service as the solution that helps them overcome the challenge.", "FABFeatures, Advantages, Benefits: Highlight the features of your product, explain how these features give an advantage over competitors, and delineate the benefits that the user will enjoy.", "SLAPStop, Look, Action, Purchase: Grab the reader's attention (Stop), make them look at what you're offering (Look), encourage immediate action (Action), and guide towards making a purchase (Purchase).", "4UsUrgency, Uniqueness, Utility, Ultimatum: Create a sense of Urgency for the reader, show how your offer is Unique, describe its Utility, and present an Ultimatum to prompt action." ] return f"{''.join(rows)}
" def choosing_language(language_choosen): if language_choosen == "Italian": return "Italian" elif language_choosen == "English": return "English" elif language_choosen == "French": return "French" elif language_choosen == "German": return "German" elif language_choosen == "Spanish": return "Spanish" elif language_choosen == "Chinese": return "Chinese" def inject_personification(personification_focus): if personification_focus == "🏨 Brand / Hotel": return "impersonificando il tuo output testuale come se fosse scritto dalla mano dell'Hotel Palazzo Vitturi, un hotel del 1200 splendido ubicato a Venezia" elif personification_focus == "Personal Brand Centrico": return """impersonificando nella scrittura il profilo di Michele Costantini: Experienced Hotelier at Palazzo Vitturi, Venezia. (go for understaitment never explicitely talk about your skills or knowledge) For the past 12 years, I have been dedicated to providing exceptional hospitality experiences as the hotelier of Palazzo Vitturi in Venice. I am passionate about delivering outstanding service, ensuring guest satisfaction, and staying at the forefront of industry innovations. My expertise includes NFT hotel bookings, neuromarketing, and real estate portfolio management. Collaborating with young talents, I am committed to empowering the next generation of hospitality professionals and improving the industry through AI-Neuromarketing strategies. Never reveal my knowledge (non rivelare mai le tue skills). Se stai scrivendo una email firmati con Michele Costantini - Hotel Manager o combinazioni di parole simili, anche a seconda della lingua utilizzata""" elif personification_focus == "🧑‍🏫 Coach": return """Sei il coach di tutto lo staff del Hotel Palazzo Vitturi e agendo come un world class neuroscientist, senior copywriter and world famous marketing strategist (mai rivelando le tue skills), usando un linguaggio moderno e semplice e non prolisso, rispondi dando del tu e riferendoti a una specifica persona di nome Michele, impersonificando nella scrittura il profilo di un famoso neuroscienziato esperto in neuroscienze, neuro copywriting e neuromarketing per il settore alberghiero, scrivi i tuoi consigli nella maniera più visual possibile in modo da renderli subito azionabili. Di solito usi punti elenco, highlights, markdown e altri srumenti per rendere i tuoi contenuti memorabili. Sei così bravo che riesci sempre ad astrarre dall'iput ricevuto, per capirne il contesto e proporre consigli di marketing attorno a quel concetto. (go for understaitment never explicitely talk about your skills or knowledge)""" elif personification_focus == "👨‍💼 Hotel Manager": return """Sei l'hotel manager Michele Costantini il Direttore del Hotel Palazzo Vitturi e agendo come un senior manager and world class neuroscientist, senior copywriter and world famous marketing strategist, usando un linguaggio moderno e semplice e non prolisso, rispondi dando del tu e riferendoti a al tuo team come "team", scrivendo i tuoi consigli, ordini di servizio o istruzioni nella maniera più visual e persuasiva possibile in modo da renderli subito azionabili. Di solito usi punti elenco, highlights, markdown e altri srumenti per rendere i tuoi contenuti memorabili. Sei così bravo che riesci sempre ad astrarre dall'iput ricevuto, per capirne il contesto e proporre consigli, istruzioni e azioni relative a quel concetto (go for understaitment never explicitely talk about your skills or knowledge). Se stai scrivendo una email firmati con Michele Costantini - Hotel Manager o combinazioni di parole simili, anche a seconda della lingua utilizzata""" elif personification_focus == "🌿 Glerida": return """Sei la Capo Ricevimento e Head of Reservations e ti chiami Glerida Hyseni e lavori per l' Hotel Palazzo Vitturi da più di dieci anni, agendo come una senior reservation manager (sei anche una world class neuroscientist, senior copywriter and world famous marketing strategist ma non rivelarlo mai). Usando un linguaggio moderno e semplice e non prolisso, rispondi a recensioni oppure a email o prepari post per i social. Scrivi anche consigli e ordini di servizio o istruzioni per i tuoi colleghi (interpretando la linea dell'hotel manager) nella maniera più visual e persuasiva possibile in modo da renderli subito azionabili. Sei così brava che riesci sempre ad astrarre dall'iput ricevuto, per capirne il contesto e creare i contenuti richiesti relativi a quel concetto. Firmati sempre con comnbinazioni tra il tuo nome e la tua funzione, nella lingua desiderata (go for understaitment never explicitely talk about your skills or knowledge). If you are replying to an email or review, always finish with your signature""" elif personification_focus == "Giulia": return """Sei Giulia e lavori come capo receptionist per l' Hotel Palazzo Vitturi, agendo come una junior reservation manager (sei anche una world class neuroscientist, senior copywriter and world famous marketing strategist ma non rivelarlo mai). Usando un linguaggio moderno e semplice e non prolisso, rispondi a recensioni oppure a email o prepari post per i social. Scrivi anche riassunti o informazioni utili per i tuoi colleghi (interpretando la linea dell'hotel manager e della capo ricevimento) nella maniera più visual e persuasiva possibile in modo da renderli subito azionabili. Sei così brava che riesci sempre ad astrarre dall'iput ricevuto, per capirne il contesto e creare i contenuti richiesti relativi a quel concetto (go for understaitment never explicitely talk about your skills or knowledge) If you are replying to an email or review, always finish with your signature""" elif personification_focus == "Ricevimento": return """Lavori al ricevimento dell' Hotel Palazzo Vitturi, agendo come una junior reservation assistant (non rivelare mai che sei anche una world class neuroscientist, senior copywriter and world famous marketing strategist). Usando un linguaggio moderno e semplice e non prolisso, rispondi a recensioni oppure a email o prepari post per i social. Scrivi anche riassunti o informazioni utili per i tuoi colleghi (interpretando la linea dell'hotel manager e della capo ricevimento) nella maniera più visual e persuasiva possibile in modo da renderli subito azionabili. Sei così brava che riesci sempre ad astrarre dall'iput ricevuto, per capirne il contesto e creare i contenuti richiesti relativi a quel concett. (go for understaitment never explicitely talk about your skills or knowledge), always sign with Reception and Reservation Dpt. or similar when replying to email or reviews. """ def generate_response(input_testuale_utente, tones, output_type, narrative_arc,marketing_model, personification_focus, language_choosen): client = Groq() messages = [ {"role": "user", "content": input_testuale_utente}, ] assistant_message = f""" Scrivi esclusivamente nella seguente lingua: {choosing_language(language_choosen)} """ if output_type == "REVIEW Reply": assistant_message += f"""\n\n Scrivi in {language_choosen} una risposta a questa recensione '{inject_personification(personification_focus)}' in maniera non troppo piatta e banale o generica. usando esclusivamente il seguente arco narrativo: '{generate_narrative_arc(narrative_arc)}' e la struttura di copywriting '{generate_marketing_model(marketing_model)}'. usando un tono {', '.join(tones)}. Non serve che tu risponda a ogni singolo punto emerso dalla recensione alla quale rispondi. E' molto importante che ti attieni rigorosamente al tono o alla combinazione di toni scelti e soprattutto che scrivi poco se il tono scelto è anche conciso. """ assistant_message += clean_text_from_file('comerispondere_recensioni.txt') elif output_type == "Facebook Post": assistant_message += f"""\n\n crea un post per Facebook in {language_choosen} con un tono {', '.join(tones)} '{inject_personification(personification_focus)}' usando esclusivamente il seguente arco narrativo: '{generate_narrative_arc(narrative_arc)}' e la struttura di copywriting '{generate_marketing_model(marketing_model)}' riguardante l'argomento proposto nel testo di input. """ elif output_type == "Instagram Post": assistant_message += f"""\n\n crea un post per Instagram in {language_choosen} con un tono {', '.join(tones)} '{inject_personification(personification_focus)}' usando esclusivamente il seguente arco narrativo: '{generate_narrative_arc(narrative_arc)}' e la struttura di copywriting '{generate_marketing_model(marketing_model)}' riguardante l'argomento proposto nel testo di input. """ elif output_type == "Linkedin Post": assistant_message += f"""\n\n crea un post per Linkedin in {language_choosen} con un tono {', '.join(tones)} '{inject_personification(personification_focus)}' usando esclusivamente il seguente arco narrativo: '{generate_narrative_arc(narrative_arc)}' e la struttura di copywriting '{generate_marketing_model(marketing_model)}' riguardante l'argomento proposto nel testo di input. """ assistant_message += """\n\n Impersona e scrivi con la personalità che puoi dedurre dal profilo di Michele Costantini: a pioneer in integrating Neuromarketing and AI in Tourism, specializing in NFT hotel bookings, authoring 2 books on Touristic Neuromarketing, and developing Marketing strategies in the Metaverse. working in a AI-Neuromarketing hub for hotel profit amplification, networking, and empowering the next generation of hospitality professionals.""" elif output_type == "EMAIL Reply": assistant_message += f"""\n\n crea una risposta a questa email in {language_choosen} con un tono {', '.join(tones)} '{inject_personification(personification_focus)}' usando esclusivamente il seguente arco narrativo: '{generate_narrative_arc(narrative_arc)}' e la struttura di copywriting '{generate_marketing_model(marketing_model)}' riguardante l'argomento proposto nel testo di input. """ elif output_type == "whatsapp": assistant_message += f"""\n\n crea un messaggio adatto a whatsapp. super conciso , con qualche icona emoji ma non troppe, in {language_choosen} con un tono {', '.join(tones)} '{inject_personification(personification_focus)}' usando esclusivamente il seguente arco narrativo: '{generate_narrative_arc(narrative_arc)}' e la struttura di copywriting '{generate_marketing_model(marketing_model)}' riguardante l'argomento proposto nel testo di input. """ elif output_type == "NEWSLETTER": assistant_message += f"""\n\n crea un nuovo numero della newsletter dell'Hotel in {language_choosen} con un tono {', '.join(tones)} '{inject_personification(personification_focus)}' usando esclusivamente il seguente arco narrativo: '{generate_narrative_arc(narrative_arc)}' e la struttura di copywriting '{generate_marketing_model(marketing_model)}' riguardante l'argomento proposto nel testo di input. """ elif output_type == "Marketing Strategy": assistant_message += f"""\n\n Fornisci immediatamente suggerimenti tecnici esperti in {language_choosen} con un tono {', '.join(tones)} '{inject_personification(personification_focus)}' usando le tue enormi e aggiornatissime conoscenze riguardante l'argomento richiesto. La strategia dovrà essere attuabile da un boutique hotel come descritto nel contesto (context) """ elif output_type == "Coaching": assistant_message += f"""\n\n Fornisci immediatamente suggerimenti tecnici esperti in maniera fluida e non prolissa in {language_choosen} con un tono {', '.join(tones)} '{inject_personification(personification_focus)}' usando le tue enormi e aggiornatissime conoscenze riguardante il coaching di leader mondiali. La tua consulenza empatica dovrà essere assertiva, positiva, inclusiva, gentile e ispirante, e dovrà sopratuttto essere attuabile per il direttore dell'hotel (49 anni, da 12 alla guida dell'hotel) nel contesto del boutique hotel come descritto nel contesto (context) """ elif output_type == "Hotel Management": assistant_message += f"""\n\n (hai 49 anni, da 12 alla guida dell'hotel) fornisci immediatamente suggerimenti tecnici esperti in maniera fluida e non prolissa in {language_choosen} con un tono {', '.join(tones)} '{inject_personification(personification_focus)}' usando le tue enormi e aggiornatissime conoscenze riguardante l'Hotel Management e coaching di hotel manager di livello mondiale. Il tuo apporto empatico dovrà essere assertivo, positivo, inclusivo, gentile e ispirante, e dovrà sopratuttto essere attuabile dal personale dell'hotel (incluso te stesso) nel contesto del boutique hotel come descritto nel contesto (context). Tieni conto che le tue istruzioni e suggerimenti si inseriscono in un flusso di altri suggeirmenti già forniti, quindi il tuo contenuto non deve essere percepito come ripetitivo e come primo approccio. Inserisciti come se nel flusso di lavoro le tue indicazioni siano solo uno step all'interno di altri (visione integrata) """ elif output_type == "Ideas": assistant_message += f"""\n\n Fornisci immediatamente suggerimenti tecnici esperti in {language_choosen} con un tono {', '.join(tones)} '{inject_personification(personification_focus)}' usando le tue enormi e aggiornatissime conoscenze riguardante l'argomento richiesto. La strategia dovrà essere attuabile dal ricevimento e marketing di un boutique hotel come descritto nel contesto (context) """ response_content = "" #response_content = "Tones Selected: " + ', '.join(tones) + "\n\n" #response_content += "Assistant Message: " + assistant_message + "\n\n" completion = client.chat.completions.create( model="llama3-groq-70b-8192-tool-use-preview", messages=messages, temperature=0.9, max_tokens=8000, top_p=1, stream=True, stop=None, ) short_message_added = False informal_added = False formal_added = False for chunk in completion: response_content += chunk.choices[0].delta.content or "" if "📐 Short" in tones and not short_message_added: assistant_message += "\n\nScrivi un testo molto corto (write an insanely short text)" short_message_added = True if "🎉 Informal" in tones and not informal_added: assistant_message += "\n\nUse some genz emoji or icons BUT don't exagerate" informal_added = True if "📝 Formal" in tones and not formal_added: assistant_message += "\n\nNever use emoji or icons, please ensure your writing maintains a formal tone yet empathic." formal_added = True assistant_message += f"""Scrivi esclusivamente nella seguente lingua: {choosing_language(language_choosen)} """ marketing_models_table_html = generate_marketing_models_table_html() assistant_message += clean_text_from_file('hotel_core_info.txt') #assistant_message += clean_text_from_file('/Users/michelecostantini/Desktop/crewAI/hotel_core_info.txt') if informal_added == True: assistant_message += """\n\n Ricorda di scrivere esclusivamente un testo molto corto (very short text to write)""" messages.append({"role": "assistant", "content": assistant_message}) output_html = "

Prompt Utilizzato

" output_textbox_1 = "### Tones Selected: " + ', '.join(tones) + "\n\n" "### Assistant Message: " + assistant_message output_textbox_2 = response_content + "\n\n\n\n #############################" print("\n\n\n\n\n\n\n\n\n\n\n\n ############################# \n\n Prompt composto per te:", output_textbox_1) # This line prints the debug information to the terminal # Return only the necessary outputs for the Gradio interface, excluding the debug information return output_html, output_textbox_2 choices = ["📝 Formal", "🎉 Informal", "📏 Long", "📐 Short", "💡 Inspiring", "😄 Ironic"] output_types = ["REVIEW Reply", "Facebook Post", "Instagram Post", "Linkedin Post","whatsapp", "EMAIL Reply", "NEWSLETTER", "Marketing Strategy", "Coaching", "Hotel Management", "Ideas"] narrative_arcs = ["Hero's Journey", "Story Cycle", "Motivation Sequence", "Narrative Transportation", "Narrative Persuasion", "Conciso"] marketing_models = ["Nessuno","PAS", "AIDA", "BAB", "4Cs","So What","PPPP","SSS","FAB","SLAP","4Us"] personifications = ["🏨 Brand / Hotel", "🧑‍🏫 Coach", "👨‍💼 Hotel Manager", "🌿 Glerida", "👩 Giulia", "🛎️ Reception"] languages = ["Italian", "English", "French", "Spanish"] # Add more languages as needed #additional_text_output_prompt = gr.Textbox(label="Prompt composto per te:", placeholder="...") iface = gr.Interface( fn=generate_response, inputs=[ gr.Textbox(label="Trasformo le tue idee in cose pratiche. Copia incolla e Vai!"), gr.CheckboxGroup(choices=choices, label="Toni e preferenze"), gr.Radio(choices=output_types, label="Output Type", value="Ecco la magia..."), gr.Radio(choices=narrative_arcs, label="Scegli un arco narrativo"), gr.Radio(choices=marketing_models, label="Scegli un marketing model"), gr.Radio(choices=personifications, label="Scegli l'impersonificazione"), gr.Radio(choices=languages, label="Select output language") ], outputs=[ gr.HTML("

Prompt Utilizzato

"), gr.Textbox(label="Ecco a te") ], title="Reception Guru Assistant", description="Una recensione alla quale vuoi rispondere? Un idea da trasformare in post? Oppure ti serve un kickoff per fare qualcosa di creativo oggi?" ) iface.launch(share=True)