File size: 8,872 Bytes
6596bac
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
import gradio as gr
import logging
import random
from openai import OpenAI
import smtplib
from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMEText
import threading
import time
from tqdm import tqdm
from dotenv import load_dotenv
import os

# Charger les variables d'environnement
load_dotenv()

client = OpenAI(api_key=os.getenv('OPENAI_API_KEY'))
logging.basicConfig(level=logging.DEBUG, format='%(asctime)s - %(levelname)s - %(message)s')

categories = ["Nature", "Technologie", "Histoire", "Fantaisie", "Sports", "Arts", "Sciences", "Cuisine", "Voyage", "Musique"]

def query(prompt, max_tokens=100):
    try:
        response = client.chat.completions.create(
            model="gpt-4o-mini",
            messages=[{"role": "user", "content": prompt}],
            max_tokens=max_tokens,
            temperature=random.uniform(0.7, 1.2)
        )
        return response.choices[0].message.content.strip()
    except Exception as e:
        logging.error(f"Erreur de requête API: {e}")
        return None

def generate_single_theme(prompt, age_group, budget, location, index, used_categories):
    available_categories = [cat for cat in categories if cat not in used_categories]
    
    if not available_categories:
        return "Erreur: Pas de catégorie disponible", None
    
    category = random.choice(available_categories)
    full_prompt = (f"Thème {index}: Génère un thème de fête créatif et original basé sur : '{prompt}' "
                   f"et la catégorie '{category}'. Pour un groupe d'âge {age_group}, avec un budget {budget}, "
                   f"à organiser {location}. Le thème doit être unique et amusant en une phrase courte.")
    
    theme = query(full_prompt)
    return theme, category

def translate_theme(theme):
    prompt = f"Traduis ce thème de fête en anglais : '{theme}'\nTraduction :"
    return query(prompt)

def format_results(results):
    formatted = "# 🎉 Thèmes de fête générés\n\n"
    
    for i, theme in enumerate(results["themes"], 1):
        formatted += f"## Thème {i}: {theme['theme']}\n\n"
        formatted += f"**Traduction:** {theme['translation']}\n\n"
        formatted += "---\n\n"
    
    return formatted

def generate_and_format(prompt, num_themes, age_group_val, budget_val, location_val, progress=gr.Progress()):
    results = {"themes": []}
    used_categories = set()
    
    for i in range(int(num_themes)):
        theme, category = generate_single_theme(prompt, age_group_val, budget_val, location_val, i+1, used_categories)
        
        if category:
            used_categories.add(category)
        
        translation = translate_theme(theme)
        
        results["themes"].append({"theme": theme, "translation": translation})
        
        progress((i + 1) / int(num_themes))
    
    formatted_results = format_results(results)
    developed_theme_output.value = ""
    developed_theme_output.visible = False
    return formatted_results, results

def run_query(prompt, max_tokens=2000):
    try:
        response = client.chat.completions.create(
            model="gpt-4o-mini",
            messages=[{"role": "user", "content": prompt}],
            max_tokens=max_tokens,
            temperature=random.uniform(0.7, 1.2)
        )
        return response.choices[0].message.content.strip()
    except Exception as e:
        logging.error(f"Erreur de requête API: {e}")
        return None

def develop_theme(theme, age_group, budget, location):
    prompt = (
        f"Développe un plan d'action détaillé pour organiser une fête sur le thème : '{theme}'. "
        f"Pour un groupe d'âge {age_group}, avec un budget {budget}, à organiser {location}. "
        f"Inclus des idées concrètes pour la décoration, les activités, la nourriture, les boissons et la musique."
    )

    result = None
    thread = threading.Thread(target=lambda: setattr(threading.current_thread(), 'result', run_query(prompt)))
    thread.start()

    with tqdm(total=100, desc="Recherche en cours") as pbar:
        while thread.is_alive():
            time.sleep(0.1)
            pbar.update(1)
            if pbar.n >= 100:
                pbar.n = 0
                pbar.refresh()

    thread.join()
    developed_theme = thread.result
    
    return developed_theme

def send_email(subject, body, to_email):
    sender_email = os.getenv('EMAIL_SENDER')
    sender_password = os.getenv('EMAIL_PASSWORD')
    smtp_server = "smtp.gmail.com"
    smtp_port = 587

    message = MIMEMultipart()
    message['From'] = sender_email
    message['To'] = to_email
    message['Subject'] = subject
    message.attach(MIMEText(body, 'plain'))

    try:
        server = smtplib.SMTP(smtp_server, smtp_port)
        server.starttls()
        server.login(sender_email, sender_password)
        server.sendmail(sender_email, to_email, message.as_string())
        return "E-mail envoyé avec succès !"
    except Exception as e:
        return f"Erreur lors de l'envoi de l'e-mail : {e}"
    finally:
        server.quit()

with gr.Blocks(theme=gr.themes.Soft()) as demo:
    gr.Markdown("# 🎉 Générateur de Thèmes de Fête Personnalisés")
    
    with gr.Row():
        prompt_input = gr.Textbox(label="Inspiration pour la fête")
        num_themes_input = gr.Slider(minimum=1, maximum=5, step=1, value=3, label="Nombre de thèmes")
    
    with gr.Row():
        age_group = gr.Dropdown(["Enfants", "Adolescents", "Adultes", "Tous âges"], label="Groupe d'âge")
        budget = gr.Dropdown(["Économique", "Modéré", "Luxe"], label="Budget")
        location = gr.Dropdown(["Intérieur", "Extérieur", "Les deux"], label="Lieu")
    
    with gr.Row():
        theme_selector = gr.Dropdown(label="Sélectionner un thème à développer", visible=False)
        develop_theme_button = gr.Button("Développer le thème", visible=False)

    developed_theme_output = gr.Markdown(label="Plan d'action détaillé", visible=False)
    developed_theme_state = gr.State()
    generate_button = gr.Button("Générer les thèmes")
    
    output = gr.Markdown(label="Thèmes générés")
    
    include_detailed_theme = gr.Checkbox(label="Inclure le thème détaillé dans l'e-mail", visible=False)
    with gr.Row():
        email_input = gr.Textbox(label="Votre adresse email", visible=False)
        send_email_button = gr.Button("Envoyer par email", visible=False)
    
    generated_themes = gr.State()
    
    def show_email_options(formatted_results, results):
        theme_choices = [f"Thème {i+1}: {theme['theme']}" for i, theme in enumerate(results['themes'])]
        return (
            gr.update(visible=True),
            gr.update(visible=True),
            gr.update(choices=theme_choices, visible=True),
            gr.update(visible=True),
            formatted_results,
            gr.update(visible=True),
            results
        )

    def send_email_wrapper(email, formatted_results, detailed_theme, include_detailed):
        subject = "Thèmes de fête générés"
        body = formatted_results
        
        if include_detailed and (detailed_theme is None or detailed_theme.strip() == ""):
            return "Erreur : Le thème détaillé n'est pas encore généré."
        
        if include_detailed and detailed_theme:
            body += "\n\nThème détaillé :\n" + detailed_theme
        
        return send_email(subject, body, email)
    
    def develop_selected_theme(selected_theme, age_group_val, budget_val, location_val, results):
        theme_index = int(selected_theme.split(':')[0].split()[1]) - 1
        theme = results['themes'][theme_index]['theme']
        developed = develop_theme(theme, age_group_val, budget_val, location_val)
        return gr.update(value=developed, visible=True)

    generate_button.click(
        generate_and_format,
        inputs=[prompt_input, num_themes_input, age_group, budget, location],
        outputs=[output, generated_themes]
    ).then(
        show_email_options,
        inputs=[output, generated_themes],
        outputs=[email_input, send_email_button, theme_selector, develop_theme_button, output, include_detailed_theme, generated_themes]
    )

    send_email_button.click(
        send_email_wrapper,
        inputs=[email_input, output, developed_theme_output, include_detailed_theme],
        outputs=[gr.Markdown(label="Statut de l'email")]
    )
    
    develop_theme_button.click(
        develop_selected_theme,
        inputs=[theme_selector, age_group, budget, location, generated_themes],
        outputs=[developed_theme_output]
    )

if __name__ == "__main__":
    demo.launch()