Spaces:
Sleeping
Sleeping
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() |