CreateTheme / app.py
PhilPrz's picture
Rename Generate_Parties.py to app.py
bfff119 verified
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()