Maxime Bourliatoux commited on
Commit
c60bf95
1 Parent(s): b3b3d34

Add bottom stuff

Browse files
Files changed (4) hide show
  1. .gitignore +3 -1
  2. .vscode/settings.json +6 -0
  3. app.py +79 -24
  4. logo_onepoint.png +0 -0
.gitignore CHANGED
@@ -1 +1,3 @@
1
- /.streamlit/secrets.toml
 
 
 
1
+ /.streamlit/secrets.toml
2
+
3
+ .vscode
.vscode/settings.json ADDED
@@ -0,0 +1,6 @@
 
 
 
 
 
 
 
1
+ {
2
+ "[python]": {
3
+ "editor.defaultFormatter": "ms-python.black-formatter"
4
+ },
5
+ "python.formatting.provider": "none"
6
+ }
app.py CHANGED
@@ -5,34 +5,70 @@ import openai
5
 
6
  PROMPT_TEMPLATE = "Ecris un email au ton {tone} destiné à un client d'une entreprise de type {company_type} a propos de : {offer}"
7
 
8
- VOICE_TONE_OPTIONS = ["drôle", "formel", "professionnel", "informel", "amical", "humoristique", "sérieux", "optimiste", "motivant", "respectueux", "assertif", "conversationnel", "urgent"]
9
-
10
- 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"]
11
-
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
12
 
13
 
14
  EXAMPLE_OFFERS = {
15
- "banque" : [
16
  "Comptes chèques qui permettent aux clients de déposer et retirer des fonds, écrire des chèques et effectuer des transactions électroniques",
17
  "Comptes d'épargne, où les clients peuvent déposer de l'argent et gagner des intérêts sur leurs économies",
18
  "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é",
19
  "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",
20
  "Prêts immobiliers, un prêt dans le but d'acheter ou de refinancer une maison",
21
- ],
22
- "assurance" : [
23
  "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",
24
  "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",
25
  "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",
26
  "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",
27
  "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",
28
- ],
29
  "télécommunications (télécoms)": [
30
  "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",
31
  "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",
32
  "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",
33
  "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",
34
  "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",
35
- ],
36
  "retail": [
37
  "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",
38
  "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",
@@ -46,7 +82,7 @@ EXAMPLE_OFFERS = {
46
  "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",
47
  "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",
48
  "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",
49
- ]
50
  }
51
 
52
  openai.api_key = st.secrets["openai-api-key"]
@@ -64,15 +100,17 @@ def generate_email(prompt: str, max_tokens: int = 256) -> str:
64
  max_tokens=max_tokens,
65
  top_p=1,
66
  frequency_penalty=0,
67
- presence_penalty=0
68
  )
69
  message = completions.choices[0].text
70
  return message
71
 
72
 
73
  def company_type_changed():
74
- company_type = st.session_state['company_type']
75
- st.session_state['offer'] = choice(EXAMPLE_OFFERS.get(company_type, ["Premier contact client"]))
 
 
76
 
77
 
78
  def main():
@@ -81,10 +119,11 @@ def main():
81
 
82
  st.sidebar.markdown("### :arrow_right: Parametres")
83
 
84
- email_tone = st.sidebar.selectbox(
85
- label="Tonalité de l'email",
86
- options=(sorted(VOICE_TONE_OPTIONS))
87
- ),
 
88
 
89
  email_company_type = st.sidebar.selectbox(
90
  label="Type d'entreprise",
@@ -93,22 +132,25 @@ def main():
93
  on_change=company_type_changed,
94
  )
95
 
96
- if 'offer' not in st.session_state:
97
- st.session_state['offer'] = choice(EXAMPLE_OFFERS.get(email_company_type, ["Premier contact client"]))
 
 
98
 
99
  email_offer = st.sidebar.text_area(
100
  label="Sujet du mail",
101
  key="offer",
102
- value=st.session_state['offer'],
103
  height=200,
104
  )
105
 
106
- email_include_emojis = st.sidebar.checkbox('Include emojis 🤩')
107
 
108
  prompt_input = None
109
 
110
  if email_tone and email_company_type and email_offer:
111
- prompt_input = PROMPT_TEMPLATE.format(tone=email_tone, company_type=email_company_type, offer=email_offer)
 
 
112
  if email_include_emojis:
113
  prompt_input = prompt_input + ", including emojis"
114
 
@@ -117,17 +159,30 @@ def main():
117
  help="Un email typique contient souvent 100-500 mots",
118
  min_value=64,
119
  max_value=400,
120
- value=200
121
  )
122
 
123
  with st.form(key="form"):
124
- if st.form_submit_button(label='Générer un email', disabled=prompt_input is None or len(prompt_input) == 0):
 
 
 
125
  with st.spinner("Email en cours de rédaction..."):
126
  output = generate_email(prompt_input, max_tokens=max_tokens_input)
127
  st.markdown("Email généré :")
128
  st.markdown("----")
129
  st.markdown(output)
130
 
 
 
 
 
 
 
 
 
 
 
131
 
132
  if __name__ == "__main__":
133
  main()
 
5
 
6
  PROMPT_TEMPLATE = "Ecris un email au ton {tone} destiné à un client d'une entreprise de type {company_type} a propos de : {offer}"
7
 
8
+ VOICE_TONE_OPTIONS = [
9
+ "drôle",
10
+ "formel",
11
+ "professionnel",
12
+ "informel",
13
+ "amical",
14
+ "humoristique",
15
+ "sérieux",
16
+ "optimiste",
17
+ "motivant",
18
+ "respectueux",
19
+ "assertif",
20
+ "conversationnel",
21
+ "urgent",
22
+ ]
23
+
24
+ COMPANY_TYPE_OPTIONS = [
25
+ "banque",
26
+ "assurance",
27
+ "télécommunications (télécoms)",
28
+ "retail",
29
+ "transport",
30
+ "pharmacie",
31
+ "énergie",
32
+ "automobile",
33
+ "immobilier",
34
+ "technologie",
35
+ "hôtellerie",
36
+ "alimentation et boissons",
37
+ "soins de santé",
38
+ "fabrication",
39
+ "construction",
40
+ "extraction minière",
41
+ "agriculture",
42
+ "commerce électronique",
43
+ "divertissement",
44
+ "services de conseil",
45
+ "services de comptabilité",
46
+ "services juridiques",
47
+ ]
48
 
49
 
50
  EXAMPLE_OFFERS = {
51
+ "banque": [
52
  "Comptes chèques qui permettent aux clients de déposer et retirer des fonds, écrire des chèques et effectuer des transactions électroniques",
53
  "Comptes d'épargne, où les clients peuvent déposer de l'argent et gagner des intérêts sur leurs économies",
54
  "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é",
55
  "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",
56
  "Prêts immobiliers, un prêt dans le but d'acheter ou de refinancer une maison",
57
+ ],
58
+ "assurance": [
59
  "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",
60
  "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",
61
  "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",
62
  "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",
63
  "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",
64
+ ],
65
  "télécommunications (télécoms)": [
66
  "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",
67
  "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",
68
  "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",
69
  "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",
70
  "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",
71
+ ],
72
  "retail": [
73
  "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",
74
  "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",
 
82
  "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",
83
  "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",
84
  "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",
85
+ ],
86
  }
87
 
88
  openai.api_key = st.secrets["openai-api-key"]
 
100
  max_tokens=max_tokens,
101
  top_p=1,
102
  frequency_penalty=0,
103
+ presence_penalty=0,
104
  )
105
  message = completions.choices[0].text
106
  return message
107
 
108
 
109
  def company_type_changed():
110
+ company_type = st.session_state["company_type"]
111
+ st.session_state["offer"] = choice(
112
+ EXAMPLE_OFFERS.get(company_type, ["Premier contact client"])
113
+ )
114
 
115
 
116
  def main():
 
119
 
120
  st.sidebar.markdown("### :arrow_right: Parametres")
121
 
122
+ email_tone = (
123
+ st.sidebar.selectbox(
124
+ label="Tonalité de l'email", options=(sorted(VOICE_TONE_OPTIONS))
125
+ ),
126
+ )
127
 
128
  email_company_type = st.sidebar.selectbox(
129
  label="Type d'entreprise",
 
132
  on_change=company_type_changed,
133
  )
134
 
135
+ if "offer" not in st.session_state:
136
+ st.session_state["offer"] = choice(
137
+ EXAMPLE_OFFERS.get(email_company_type, ["Premier contact client"])
138
+ )
139
 
140
  email_offer = st.sidebar.text_area(
141
  label="Sujet du mail",
142
  key="offer",
 
143
  height=200,
144
  )
145
 
146
+ email_include_emojis = st.sidebar.checkbox("Include emojis 🤩")
147
 
148
  prompt_input = None
149
 
150
  if email_tone and email_company_type and email_offer:
151
+ prompt_input = PROMPT_TEMPLATE.format(
152
+ tone=email_tone, company_type=email_company_type, offer=email_offer
153
+ )
154
  if email_include_emojis:
155
  prompt_input = prompt_input + ", including emojis"
156
 
 
159
  help="Un email typique contient souvent 100-500 mots",
160
  min_value=64,
161
  max_value=400,
162
+ value=200,
163
  )
164
 
165
  with st.form(key="form"):
166
+ if st.form_submit_button(
167
+ label="Générer un email",
168
+ disabled=prompt_input is None or len(prompt_input) == 0,
169
+ ):
170
  with st.spinner("Email en cours de rédaction..."):
171
  output = generate_email(prompt_input, max_tokens=max_tokens_input)
172
  st.markdown("Email généré :")
173
  st.markdown("----")
174
  st.markdown(output)
175
 
176
+ st.markdown("----")
177
+ col1, mid1, mid2, col2 = st.columns([3, 2, 1, 3])
178
+ with mid1:
179
+ st.caption("Made by onepoint")
180
+ with mid2:
181
+ st.image(
182
+ "logo_onepoint.png",
183
+ width=50,
184
+ )
185
+
186
 
187
  if __name__ == "__main__":
188
  main()
logo_onepoint.png ADDED