PhilPrz commited on
Commit
6596bac
·
verified ·
1 Parent(s): 3ac4fcd

Upload 6 files

Browse files
Files changed (6) hide show
  1. .env +3 -0
  2. .gitattributes +35 -35
  3. .gitignore +19 -0
  4. Generate_Parties.py +226 -0
  5. README.md +13 -13
  6. app.py +7 -7
.env ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ OPENAI_API_KEY=sk-proj-vVEaBAWuqVm4GyDbVMWFT3BlbkFJcqBYPG2ZcqpE25RfSe7B
2
+ EMAIL_SENDER=philippelebahut@gmail.com
3
+ EMAIL_PASSWORD=gggv vegn zexh augc
.gitattributes CHANGED
@@ -1,35 +1,35 @@
1
- *.7z filter=lfs diff=lfs merge=lfs -text
2
- *.arrow filter=lfs diff=lfs merge=lfs -text
3
- *.bin filter=lfs diff=lfs merge=lfs -text
4
- *.bz2 filter=lfs diff=lfs merge=lfs -text
5
- *.ckpt filter=lfs diff=lfs merge=lfs -text
6
- *.ftz filter=lfs diff=lfs merge=lfs -text
7
- *.gz filter=lfs diff=lfs merge=lfs -text
8
- *.h5 filter=lfs diff=lfs merge=lfs -text
9
- *.joblib filter=lfs diff=lfs merge=lfs -text
10
- *.lfs.* filter=lfs diff=lfs merge=lfs -text
11
- *.mlmodel filter=lfs diff=lfs merge=lfs -text
12
- *.model filter=lfs diff=lfs merge=lfs -text
13
- *.msgpack filter=lfs diff=lfs merge=lfs -text
14
- *.npy filter=lfs diff=lfs merge=lfs -text
15
- *.npz filter=lfs diff=lfs merge=lfs -text
16
- *.onnx filter=lfs diff=lfs merge=lfs -text
17
- *.ot filter=lfs diff=lfs merge=lfs -text
18
- *.parquet filter=lfs diff=lfs merge=lfs -text
19
- *.pb filter=lfs diff=lfs merge=lfs -text
20
- *.pickle filter=lfs diff=lfs merge=lfs -text
21
- *.pkl filter=lfs diff=lfs merge=lfs -text
22
- *.pt filter=lfs diff=lfs merge=lfs -text
23
- *.pth filter=lfs diff=lfs merge=lfs -text
24
- *.rar filter=lfs diff=lfs merge=lfs -text
25
- *.safetensors filter=lfs diff=lfs merge=lfs -text
26
- saved_model/**/* filter=lfs diff=lfs merge=lfs -text
27
- *.tar.* filter=lfs diff=lfs merge=lfs -text
28
- *.tar filter=lfs diff=lfs merge=lfs -text
29
- *.tflite filter=lfs diff=lfs merge=lfs -text
30
- *.tgz filter=lfs diff=lfs merge=lfs -text
31
- *.wasm filter=lfs diff=lfs merge=lfs -text
32
- *.xz filter=lfs diff=lfs merge=lfs -text
33
- *.zip filter=lfs diff=lfs merge=lfs -text
34
- *.zst filter=lfs diff=lfs merge=lfs -text
35
- *tfevents* filter=lfs diff=lfs merge=lfs -text
 
1
+ *.7z filter=lfs diff=lfs merge=lfs -text
2
+ *.arrow filter=lfs diff=lfs merge=lfs -text
3
+ *.bin filter=lfs diff=lfs merge=lfs -text
4
+ *.bz2 filter=lfs diff=lfs merge=lfs -text
5
+ *.ckpt filter=lfs diff=lfs merge=lfs -text
6
+ *.ftz filter=lfs diff=lfs merge=lfs -text
7
+ *.gz filter=lfs diff=lfs merge=lfs -text
8
+ *.h5 filter=lfs diff=lfs merge=lfs -text
9
+ *.joblib filter=lfs diff=lfs merge=lfs -text
10
+ *.lfs.* filter=lfs diff=lfs merge=lfs -text
11
+ *.mlmodel filter=lfs diff=lfs merge=lfs -text
12
+ *.model filter=lfs diff=lfs merge=lfs -text
13
+ *.msgpack filter=lfs diff=lfs merge=lfs -text
14
+ *.npy filter=lfs diff=lfs merge=lfs -text
15
+ *.npz filter=lfs diff=lfs merge=lfs -text
16
+ *.onnx filter=lfs diff=lfs merge=lfs -text
17
+ *.ot filter=lfs diff=lfs merge=lfs -text
18
+ *.parquet filter=lfs diff=lfs merge=lfs -text
19
+ *.pb filter=lfs diff=lfs merge=lfs -text
20
+ *.pickle filter=lfs diff=lfs merge=lfs -text
21
+ *.pkl filter=lfs diff=lfs merge=lfs -text
22
+ *.pt filter=lfs diff=lfs merge=lfs -text
23
+ *.pth filter=lfs diff=lfs merge=lfs -text
24
+ *.rar filter=lfs diff=lfs merge=lfs -text
25
+ *.safetensors filter=lfs diff=lfs merge=lfs -text
26
+ saved_model/**/* filter=lfs diff=lfs merge=lfs -text
27
+ *.tar.* filter=lfs diff=lfs merge=lfs -text
28
+ *.tar filter=lfs diff=lfs merge=lfs -text
29
+ *.tflite filter=lfs diff=lfs merge=lfs -text
30
+ *.tgz filter=lfs diff=lfs merge=lfs -text
31
+ *.wasm filter=lfs diff=lfs merge=lfs -text
32
+ *.xz filter=lfs diff=lfs merge=lfs -text
33
+ *.zip filter=lfs diff=lfs merge=lfs -text
34
+ *.zst filter=lfs diff=lfs merge=lfs -text
35
+ *tfevents* filter=lfs diff=lfs merge=lfs -text
.gitignore ADDED
@@ -0,0 +1,19 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # Python
2
+ __pycache__/
3
+ *.py[cod]
4
+ *$py.class
5
+ *.so
6
+ .Python
7
+ env/
8
+ venv/
9
+ .env
10
+
11
+ # IDE
12
+ .idea/
13
+ .vscode/
14
+
15
+ # Logs
16
+ *.log
17
+
18
+ # Autres
19
+ .DS_Store
Generate_Parties.py ADDED
@@ -0,0 +1,226 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import gradio as gr
2
+ import logging
3
+ import random
4
+ from openai import OpenAI
5
+ import smtplib
6
+ from email.mime.multipart import MIMEMultipart
7
+ from email.mime.text import MIMEText
8
+ import threading
9
+ import time
10
+ from tqdm import tqdm
11
+ from dotenv import load_dotenv
12
+ import os
13
+
14
+ # Charger les variables d'environnement
15
+ load_dotenv()
16
+
17
+ client = OpenAI(api_key=os.getenv('OPENAI_API_KEY'))
18
+ logging.basicConfig(level=logging.DEBUG, format='%(asctime)s - %(levelname)s - %(message)s')
19
+
20
+ categories = ["Nature", "Technologie", "Histoire", "Fantaisie", "Sports", "Arts", "Sciences", "Cuisine", "Voyage", "Musique"]
21
+
22
+ def query(prompt, max_tokens=100):
23
+ try:
24
+ response = client.chat.completions.create(
25
+ model="gpt-4o-mini",
26
+ messages=[{"role": "user", "content": prompt}],
27
+ max_tokens=max_tokens,
28
+ temperature=random.uniform(0.7, 1.2)
29
+ )
30
+ return response.choices[0].message.content.strip()
31
+ except Exception as e:
32
+ logging.error(f"Erreur de requête API: {e}")
33
+ return None
34
+
35
+ def generate_single_theme(prompt, age_group, budget, location, index, used_categories):
36
+ available_categories = [cat for cat in categories if cat not in used_categories]
37
+
38
+ if not available_categories:
39
+ return "Erreur: Pas de catégorie disponible", None
40
+
41
+ category = random.choice(available_categories)
42
+ full_prompt = (f"Thème {index}: Génère un thème de fête créatif et original basé sur : '{prompt}' "
43
+ f"et la catégorie '{category}'. Pour un groupe d'âge {age_group}, avec un budget {budget}, "
44
+ f"à organiser {location}. Le thème doit être unique et amusant en une phrase courte.")
45
+
46
+ theme = query(full_prompt)
47
+ return theme, category
48
+
49
+ def translate_theme(theme):
50
+ prompt = f"Traduis ce thème de fête en anglais : '{theme}'\nTraduction :"
51
+ return query(prompt)
52
+
53
+ def format_results(results):
54
+ formatted = "# 🎉 Thèmes de fête générés\n\n"
55
+
56
+ for i, theme in enumerate(results["themes"], 1):
57
+ formatted += f"## Thème {i}: {theme['theme']}\n\n"
58
+ formatted += f"**Traduction:** {theme['translation']}\n\n"
59
+ formatted += "---\n\n"
60
+
61
+ return formatted
62
+
63
+ def generate_and_format(prompt, num_themes, age_group_val, budget_val, location_val, progress=gr.Progress()):
64
+ results = {"themes": []}
65
+ used_categories = set()
66
+
67
+ for i in range(int(num_themes)):
68
+ theme, category = generate_single_theme(prompt, age_group_val, budget_val, location_val, i+1, used_categories)
69
+
70
+ if category:
71
+ used_categories.add(category)
72
+
73
+ translation = translate_theme(theme)
74
+
75
+ results["themes"].append({"theme": theme, "translation": translation})
76
+
77
+ progress((i + 1) / int(num_themes))
78
+
79
+ formatted_results = format_results(results)
80
+ developed_theme_output.value = ""
81
+ developed_theme_output.visible = False
82
+ return formatted_results, results
83
+
84
+ def run_query(prompt, max_tokens=2000):
85
+ try:
86
+ response = client.chat.completions.create(
87
+ model="gpt-4o-mini",
88
+ messages=[{"role": "user", "content": prompt}],
89
+ max_tokens=max_tokens,
90
+ temperature=random.uniform(0.7, 1.2)
91
+ )
92
+ return response.choices[0].message.content.strip()
93
+ except Exception as e:
94
+ logging.error(f"Erreur de requête API: {e}")
95
+ return None
96
+
97
+ def develop_theme(theme, age_group, budget, location):
98
+ prompt = (
99
+ f"Développe un plan d'action détaillé pour organiser une fête sur le thème : '{theme}'. "
100
+ f"Pour un groupe d'âge {age_group}, avec un budget {budget}, à organiser {location}. "
101
+ f"Inclus des idées concrètes pour la décoration, les activités, la nourriture, les boissons et la musique."
102
+ )
103
+
104
+ result = None
105
+ thread = threading.Thread(target=lambda: setattr(threading.current_thread(), 'result', run_query(prompt)))
106
+ thread.start()
107
+
108
+ with tqdm(total=100, desc="Recherche en cours") as pbar:
109
+ while thread.is_alive():
110
+ time.sleep(0.1)
111
+ pbar.update(1)
112
+ if pbar.n >= 100:
113
+ pbar.n = 0
114
+ pbar.refresh()
115
+
116
+ thread.join()
117
+ developed_theme = thread.result
118
+
119
+ return developed_theme
120
+
121
+ def send_email(subject, body, to_email):
122
+ sender_email = os.getenv('EMAIL_SENDER')
123
+ sender_password = os.getenv('EMAIL_PASSWORD')
124
+ smtp_server = "smtp.gmail.com"
125
+ smtp_port = 587
126
+
127
+ message = MIMEMultipart()
128
+ message['From'] = sender_email
129
+ message['To'] = to_email
130
+ message['Subject'] = subject
131
+ message.attach(MIMEText(body, 'plain'))
132
+
133
+ try:
134
+ server = smtplib.SMTP(smtp_server, smtp_port)
135
+ server.starttls()
136
+ server.login(sender_email, sender_password)
137
+ server.sendmail(sender_email, to_email, message.as_string())
138
+ return "E-mail envoyé avec succès !"
139
+ except Exception as e:
140
+ return f"Erreur lors de l'envoi de l'e-mail : {e}"
141
+ finally:
142
+ server.quit()
143
+
144
+ with gr.Blocks(theme=gr.themes.Soft()) as demo:
145
+ gr.Markdown("# 🎉 Générateur de Thèmes de Fête Personnalisés")
146
+
147
+ with gr.Row():
148
+ prompt_input = gr.Textbox(label="Inspiration pour la fête")
149
+ num_themes_input = gr.Slider(minimum=1, maximum=5, step=1, value=3, label="Nombre de thèmes")
150
+
151
+ with gr.Row():
152
+ age_group = gr.Dropdown(["Enfants", "Adolescents", "Adultes", "Tous âges"], label="Groupe d'âge")
153
+ budget = gr.Dropdown(["Économique", "Modéré", "Luxe"], label="Budget")
154
+ location = gr.Dropdown(["Intérieur", "Extérieur", "Les deux"], label="Lieu")
155
+
156
+ with gr.Row():
157
+ theme_selector = gr.Dropdown(label="Sélectionner un thème à développer", visible=False)
158
+ develop_theme_button = gr.Button("Développer le thème", visible=False)
159
+
160
+ developed_theme_output = gr.Markdown(label="Plan d'action détaillé", visible=False)
161
+ developed_theme_state = gr.State()
162
+ generate_button = gr.Button("Générer les thèmes")
163
+
164
+ output = gr.Markdown(label="Thèmes générés")
165
+
166
+ include_detailed_theme = gr.Checkbox(label="Inclure le thème détaillé dans l'e-mail", visible=False)
167
+ with gr.Row():
168
+ email_input = gr.Textbox(label="Votre adresse email", visible=False)
169
+ send_email_button = gr.Button("Envoyer par email", visible=False)
170
+
171
+ generated_themes = gr.State()
172
+
173
+ def show_email_options(formatted_results, results):
174
+ theme_choices = [f"Thème {i+1}: {theme['theme']}" for i, theme in enumerate(results['themes'])]
175
+ return (
176
+ gr.update(visible=True),
177
+ gr.update(visible=True),
178
+ gr.update(choices=theme_choices, visible=True),
179
+ gr.update(visible=True),
180
+ formatted_results,
181
+ gr.update(visible=True),
182
+ results
183
+ )
184
+
185
+ def send_email_wrapper(email, formatted_results, detailed_theme, include_detailed):
186
+ subject = "Thèmes de fête générés"
187
+ body = formatted_results
188
+
189
+ if include_detailed and (detailed_theme is None or detailed_theme.strip() == ""):
190
+ return "Erreur : Le thème détaillé n'est pas encore généré."
191
+
192
+ if include_detailed and detailed_theme:
193
+ body += "\n\nThème détaillé :\n" + detailed_theme
194
+
195
+ return send_email(subject, body, email)
196
+
197
+ def develop_selected_theme(selected_theme, age_group_val, budget_val, location_val, results):
198
+ theme_index = int(selected_theme.split(':')[0].split()[1]) - 1
199
+ theme = results['themes'][theme_index]['theme']
200
+ developed = develop_theme(theme, age_group_val, budget_val, location_val)
201
+ return gr.update(value=developed, visible=True)
202
+
203
+ generate_button.click(
204
+ generate_and_format,
205
+ inputs=[prompt_input, num_themes_input, age_group, budget, location],
206
+ outputs=[output, generated_themes]
207
+ ).then(
208
+ show_email_options,
209
+ inputs=[output, generated_themes],
210
+ outputs=[email_input, send_email_button, theme_selector, develop_theme_button, output, include_detailed_theme, generated_themes]
211
+ )
212
+
213
+ send_email_button.click(
214
+ send_email_wrapper,
215
+ inputs=[email_input, output, developed_theme_output, include_detailed_theme],
216
+ outputs=[gr.Markdown(label="Statut de l'email")]
217
+ )
218
+
219
+ develop_theme_button.click(
220
+ develop_selected_theme,
221
+ inputs=[theme_selector, age_group, budget, location, generated_themes],
222
+ outputs=[developed_theme_output]
223
+ )
224
+
225
+ if __name__ == "__main__":
226
+ demo.launch()
README.md CHANGED
@@ -1,13 +1,13 @@
1
- ---
2
- title: CreateTheme
3
- emoji: 😻
4
- colorFrom: gray
5
- colorTo: blue
6
- sdk: gradio
7
- sdk_version: 5.1.0
8
- app_file: app.py
9
- pinned: false
10
- short_description: Vous avez une thème, mais ne savez pas quoi faire avec ?
11
- ---
12
-
13
- Check out the configuration reference at https://huggingface.co/docs/hub/spaces-config-reference
 
1
+ ---
2
+ title: CreateTheme
3
+ emoji: 😻
4
+ colorFrom: gray
5
+ colorTo: blue
6
+ sdk: gradio
7
+ sdk_version: 5.1.0
8
+ app_file: app.py
9
+ pinned: false
10
+ short_description: Vous avez une thème, mais ne savez pas quoi faire avec ?
11
+ ---
12
+
13
+ Check out the configuration reference at https://huggingface.co/docs/hub/spaces-config-reference
app.py CHANGED
@@ -1,7 +1,7 @@
1
- import gradio as gr
2
-
3
- def greet(name):
4
- return "Hello " + name + "!!"
5
-
6
- demo = gr.Interface(fn=greet, inputs="text", outputs="text")
7
- demo.launch()
 
1
+ import gradio as gr
2
+
3
+ def greet(name):
4
+ return "Hello " + name + "!!"
5
+
6
+ demo = gr.Interface(fn=greet, inputs="text", outputs="text")
7
+ demo.launch()