Spaces:
Runtime error
Runtime error
from random import choice | |
import streamlit as st | |
import openai | |
PROMPT_TEMPLATE = "Ecris un email au ton {tone} destiné à un client d'une entreprise de type {company_type} a propos de : {offer}" | |
VOICE_TONE_OPTIONS = [ | |
"drôle", | |
"formel", | |
"professionnel", | |
"informel", | |
"amical", | |
"humoristique", | |
"sérieux", | |
"optimiste", | |
"motivant", | |
"respectueux", | |
"assertif", | |
"conversationnel", | |
"urgent", | |
] | |
COMPANY_TYPE_OPTIONS = [ | |
"banque", | |
"assurance", | |
"télécommunications (télécoms)", | |
"retail", | |
"transport", | |
"pharmacie", | |
"énergie", | |
"automobile", | |
"immobilier", | |
"technologie", | |
"hôtellerie", | |
"alimentation et boissons", | |
"soins de santé", | |
"fabrication", | |
"construction", | |
"extraction minière", | |
"agriculture", | |
"commerce électronique", | |
"divertissement", | |
"services de conseil", | |
"services de comptabilité", | |
"services juridiques", | |
] | |
EXAMPLE_OFFERS = { | |
"banque": [ | |
"Comptes chèques qui permettent aux clients de déposer et retirer des fonds, écrire des chèques et effectuer des transactions électroniques", | |
"Comptes d'épargne, où les clients peuvent déposer de l'argent et gagner des intérêts sur leurs économies", | |
"Certificats de dépôt, un type de compte d'épargne où les clients déposent de l'argent pour une période fixe et gagnent un taux d'intérêt plus élevé", | |
"Prêts personnels, un prêt offert aux particuliers pour un usage personnel, comme l'amélioration de l'habitat, la consolidation de dettes ou les frais médicaux", | |
"Prêts immobiliers, un prêt dans le but d'acheter ou de refinancer une maison", | |
], | |
"assurance": [ | |
"Assurance automobile : Un type de police d'assurance qui offre une couverture pour les pertes liées à la voiture d'un individu, y compris la responsabilité civile, les collisions et la couverture tous risques", | |
"Assurance habitation : Un type de police d'assurance qui offre une couverture pour les pertes liées à la maison d'un individu, y compris la protection de la structure, des biens personnels et la responsabilité civile", | |
"Assurance vie : Un type de police d'assurance qui offre une protection financière à la famille d'un individu en cas de décès", | |
"Assurance santé : Un type de police d'assurance qui offre une couverture pour les frais médicaux et les traitements, y compris les visites médicales, les séjours à l'hôpital et les médicaments sur ordonnance", | |
"Assurance entreprise : Un type de police d'assurance qui offre une couverture pour les pertes liées à une entreprise, y compris la responsabilité civile, les biens immobiliers et la couverture des accidents du travail", | |
], | |
"télécommunications (télécoms)": [ | |
"Forfait postpayé : Un forfait postpayé fournit aux clients une facture mensuelle pour les services utilisés. Le client reçoit généralement une quantité fixe de données, de minutes et de messages texte pour un prix fixe, avec la possibilité d'ajouter des services supplémentaires moyennant des frais supplémentaires", | |
"Forfait prépayé : Un forfait prépayé permet aux clients de payer à l'avance pour les services avant de les utiliser. Le client ajoute du crédit sur son compte, qui est ensuite déduit pour chaque appel, texte ou utilisation de données", | |
"Forfait famille : Un forfait famille permet à plusieurs utilisateurs de partager un compte unique, en regroupant leurs données, leurs minutes et leurs messages texte. Ce type de forfait est souvent plus économique que les forfaits individuels et est populaire auprès des familles ou des groupes d'amis", | |
"Forfait illimité : Un forfait illimité offre aux clients une quantité illimitée de données, de minutes et de messages texte pour un montant mensuel fixe. Ces forfaits sont attrayants pour les clients qui utilisent fréquemment leurs appareils mobiles et ont besoin de beaucoup de données", | |
"Forfait d'itinérance : Un forfait d'itinérance offre aux clients la possibilité d'utiliser leurs appareils mobiles lorsqu'ils voyagent à l'étranger. Le client paie des frais pour chaque jour d'utilisation de son appareil et reçoit une quantité fixe de données, de minutes et de messages texte pendant son séjour à l'étranger", | |
], | |
"retail": [ | |
"Achetez-en un, obtenez-en un gratuit : Les clients peuvent acheter un produit et recevoir un deuxième produit de valeur égale ou inférieure gratuitement", | |
"Remise temporaire : Une réduction temporaire du prix pour un produit spécifique ou une ligne de produits, conçue pour encourager les clients à effectuer un achat rapidement", | |
"Offre groupée : Une offre qui regroupe plusieurs produits ou services à un prix réduit, souvent comme moyen de promouvoir des produits complémentaires", | |
"Programme de fidélité : Un système de récompense qui encourage les clients à continuer à effectuer des achats en offrant des points, des coupons ou d'autres avantages pour leurs dépenses", | |
"Cadeau gratuit avec achat : Les clients reçoivent un article gratuit lorsqu'ils effectuent un achat, souvent pour promouvoir de nouveaux produits ou stimuler les ventes d'inventaire plus lent.", | |
], | |
"transport": [ | |
"Service de livraison express : Cette offre conviendrait aux clients qui ont besoin de faire livrer leurs colis rapidement et avec un délai de livraison garanti. Cela pourrait être réalisé grâce à l'utilisation de l'expédition prioritaire, des services de courrier et des véhicules de livraison spécialisés", | |
"Transport de fret : Cette offre ciblerait les clients qui ont besoin de transporter de grandes quantités de marchandises sur de longues distances. La société fournirait les ressources nécessaires, telles que des conteneurs d'expédition, des remorques et des camions, pour transporter en toute sécurité les marchandises de point A à point B", | |
"Solutions logistiques : Cette offre fournirait aux clients un ensemble complet de services pour gérer leur chaîne d'approvisionnement. Cela pourrait inclure des services d'entreposage, de gestion des stocks et de traitement des commandes, entre autres", | |
"Services de navette : Cette offre ciblerait les clients qui ont besoin de transporter des groupes de personnes d'un endroit à un autre, tels que les transferts aéroportuaires, les sorties scolaires et les visites de groupe. La société fournirait les véhicules et les conducteurs nécessaires pour transporter en toute sécurité les passagers", | |
"Livraison de dernière étape : Cette offre conviendrait aux clients qui ont besoin de faire livrer leurs colis directement au client final. Cela pourrait être réalisé grâce à l'utilisation de véhicules de livraison, de vélos et même de drones, en fonction des besoins du client", | |
], | |
} | |
openai.api_key = st.secrets["openai-api-key"] | |
def generate_email(prompt: str, max_tokens: int = 256) -> str: | |
""" | |
Returns a generated email using GPT3 with a certain prompt and starting sentence | |
""" | |
completions = openai.Completion.create( | |
model="text-davinci-003", | |
prompt=prompt, | |
temperature=0.7, | |
max_tokens=max_tokens, | |
top_p=1, | |
frequency_penalty=0, | |
presence_penalty=0, | |
) | |
message = completions.choices[0].text | |
return message | |
def company_type_changed(): | |
company_type = st.session_state["company_type"] | |
st.session_state["offer"] = choice( | |
EXAMPLE_OFFERS.get(company_type, ["Premier contact client"]) | |
) | |
def main(): | |
st.title("Onepoint's Email Generator") | |
st.text("by Maxime") | |
st.sidebar.markdown("### :arrow_right: Parametres") | |
email_tone = ( | |
st.sidebar.selectbox( | |
label="Tonalité de l'email", options=(sorted(VOICE_TONE_OPTIONS)) | |
), | |
) | |
email_company_type = st.sidebar.selectbox( | |
label="Type d'entreprise", | |
key="company_type", | |
options=(sorted(COMPANY_TYPE_OPTIONS)), | |
on_change=company_type_changed, | |
) | |
if "offer" not in st.session_state: | |
st.session_state["offer"] = choice( | |
EXAMPLE_OFFERS.get(email_company_type, ["Premier contact client"]) | |
) | |
email_offer = st.sidebar.text_area( | |
label="Sujet du mail", | |
key="offer", | |
height=200, | |
) | |
email_include_emojis = st.sidebar.checkbox("Include emojis 🤩") | |
prompt_input = None | |
if email_tone and email_company_type and email_offer: | |
prompt_input = PROMPT_TEMPLATE.format( | |
tone=email_tone, company_type=email_company_type, offer=email_offer | |
) | |
if email_include_emojis: | |
prompt_input = prompt_input + ", including emojis" | |
max_tokens_input = st.slider( | |
label="Combien de mots voulez-vous dans le mail ?", | |
help="Un email typique contient souvent 100-500 mots", | |
min_value=64, | |
max_value=400, | |
value=200, | |
) | |
with st.form(key="form"): | |
if st.form_submit_button( | |
label="Générer un email", | |
disabled=prompt_input is None or len(prompt_input) == 0, | |
): | |
with st.spinner("Email en cours de rédaction..."): | |
output = generate_email(prompt_input, max_tokens=max_tokens_input) | |
st.markdown("Email généré :") | |
st.markdown("----") | |
st.markdown(output) | |
st.markdown("----") | |
col1, mid1, mid2, col2 = st.columns([3, 2, 1, 3]) | |
with mid1: | |
st.caption("Made by onepoint") | |
with mid2: | |
st.image( | |
"logo_onepoint.png", | |
width=50, | |
) | |
if __name__ == "__main__": | |
main() | |