Spaces:
Sleeping
Sleeping
| import gradio as gr | |
| import os | |
| import json | |
| import time | |
| from collections import defaultdict | |
| from datetime import datetime | |
| # ============================================================ | |
| # 🚀 ContentGenius AI — Suite de Création de Contenu IA | |
| # ============================================================ | |
| # Monétisation : Freemium (5 gratuits/jour) + Pro (15€/mois) | |
| # Stack : Gradio 6 + HF Inference API (gratuit !) | |
| # Pas besoin d'OpenAI — on utilise les modèles HF gratuits | |
| # ============================================================ | |
| from huggingface_hub import InferenceClient | |
| # Client HF Inference (gratuit avec token HF) | |
| client = InferenceClient(token=os.getenv("HF_TOKEN")) | |
| # --- Rate Limiting (Freemium Gate) --- | |
| usage_tracker = defaultdict(list) | |
| FREE_DAILY_LIMIT = 5 | |
| def check_rate_limit(request: gr.Request = None): | |
| """Vérifie si l'utilisateur a dépassé sa limite gratuite""" | |
| user_id = "anonymous" | |
| if request: | |
| user_id = request.username or request.client.host or "anonymous" | |
| now = time.time() | |
| day_start = now - 86400 # 24h | |
| usage_tracker[user_id] = [t for t in usage_tracker[user_id] if t > day_start] | |
| if len(usage_tracker[user_id]) >= FREE_DAILY_LIMIT: | |
| return False, len(usage_tracker[user_id]) | |
| usage_tracker[user_id].append(now) | |
| return True, len(usage_tracker[user_id]) | |
| def call_llm(system_prompt: str, user_prompt: str, max_tokens: int = 2000) -> str: | |
| """Appelle le modèle LLM via HF Inference API""" | |
| try: | |
| response = client.chat_completion( | |
| model="Qwen/Qwen2.5-72B-Instruct", | |
| messages=[ | |
| {"role": "system", "content": system_prompt}, | |
| {"role": "user", "content": user_prompt} | |
| ], | |
| max_tokens=max_tokens, | |
| temperature=0.7, | |
| ) | |
| return response.choices[0].message.content | |
| except Exception as e: | |
| return f"❌ Erreur : {str(e)}\n\nAstuce : Ajoutez votre HF_TOKEN dans les secrets du Space pour débloquer l'API." | |
| # ============================================================ | |
| # 📝 OUTIL 1 : Générateur d'Articles de Blog SEO | |
| # ============================================================ | |
| def generate_blog(topic, keywords, tone, length, language, request: gr.Request = None): | |
| allowed, count = check_rate_limit(request) | |
| if not allowed: | |
| return f"⚠️ **Limite gratuite atteinte ({FREE_DAILY_LIMIT}/jour)**\n\n🚀 Passez à **ContentGenius Pro** pour un accès illimité !\n\n💳 [Upgrader maintenant →](https://buy.stripe.com/test)" | |
| length_map = {"Court (~500 mots)": 500, "Moyen (~1000 mots)": 1000, "Long (~2000 mots)": 2000} | |
| word_count = length_map.get(length, 1000) | |
| system = f"""Tu es un expert en rédaction SEO et marketing de contenu. | |
| Tu rédiges en {language}. Ton style est {tone.lower()}. | |
| Tu dois produire du contenu optimisé pour les moteurs de recherche.""" | |
| prompt = f"""Rédige un article de blog complet d'environ {word_count} mots sur le sujet suivant : | |
| **Sujet :** {topic} | |
| **Mots-clés SEO à intégrer naturellement :** {keywords} | |
| **Ton :** {tone} | |
| Structure obligatoire : | |
| 1. **Titre H1** accrocheur avec le mot-clé principal | |
| 2. **Meta description** (155 caractères max) | |
| 3. **Introduction** captivante avec un hook | |
| 4. **3-5 sections H2** avec sous-sections H3 si nécessaire | |
| 5. **Conclusion** avec un call-to-action | |
| 6. **3 suggestions de titres alternatifs** pour A/B testing | |
| Intègre les mots-clés naturellement. Utilise des listes à puces, des statistiques et des exemples concrets. | |
| Optimise pour la lisibilité (phrases courtes, paragraphes aérés).""" | |
| result = call_llm(system, prompt, max_tokens=3000) | |
| remaining = FREE_DAILY_LIMIT - count | |
| return f"{result}\n\n---\n*✨ Généré par ContentGenius AI | {remaining} génération(s) gratuite(s) restante(s) aujourd'hui*" | |
| # ============================================================ | |
| # 💼 OUTIL 2 : Générateur de Posts LinkedIn | |
| # ============================================================ | |
| def generate_linkedin(topic, context, style, include_emoji, include_hashtags, request: gr.Request = None): | |
| allowed, count = check_rate_limit(request) | |
| if not allowed: | |
| return f"⚠️ **Limite gratuite atteinte ({FREE_DAILY_LIMIT}/jour)**\n\n🚀 Passez à **ContentGenius Pro** !" | |
| system = """Tu es un expert en personal branding LinkedIn. | |
| Tu crées des posts viraux qui génèrent de l'engagement (likes, commentaires, partages). | |
| Tu connais parfaitement l'algorithme LinkedIn.""" | |
| emoji_instruction = "Utilise des emojis stratégiquement pour aérer le texte." if include_emoji else "N'utilise PAS d'emojis." | |
| hashtag_instruction = "Ajoute 3-5 hashtags pertinents à la fin." if include_hashtags else "Pas de hashtags." | |
| prompt = f"""Crée un post LinkedIn viral sur le sujet suivant : | |
| **Sujet :** {topic} | |
| **Contexte/Expérience personnelle :** {context} | |
| **Style :** {style} | |
| Règles : | |
| - Première ligne = HOOK puissant (question provocante, stat choquante, ou affirmation contraire) | |
| - Utilise le format "1 ligne = 1 idée" (sauts de ligne fréquents) | |
| - Maximum 1300 caractères (optimal pour LinkedIn) | |
| - Termine par une question ouverte pour générer des commentaires | |
| - {emoji_instruction} | |
| - {hashtag_instruction} | |
| Génère 3 versions différentes du post (Version A, B, C) pour A/B testing.""" | |
| result = call_llm(system, prompt, max_tokens=2000) | |
| remaining = FREE_DAILY_LIMIT - count | |
| return f"{result}\n\n---\n*✨ {remaining} génération(s) gratuite(s) restante(s)*" | |
| # ============================================================ | |
| # 📧 OUTIL 3 : Générateur d'Emails Marketing | |
| # ============================================================ | |
| def generate_email(objective, product, audience, tone, email_type, request: gr.Request = None): | |
| allowed, count = check_rate_limit(request) | |
| if not allowed: | |
| return f"⚠️ **Limite gratuite atteinte ({FREE_DAILY_LIMIT}/jour)**\n\n🚀 Passez à **ContentGenius Pro** !" | |
| system = """Tu es un expert en email marketing avec 15 ans d'expérience. | |
| Tu connais les techniques de copywriting (AIDA, PAS, Before-After-Bridge). | |
| Ton objectif : maximiser les taux d'ouverture et de clic.""" | |
| prompt = f"""Crée un email marketing complet : | |
| **Type :** {email_type} | |
| **Objectif :** {objective} | |
| **Produit/Service :** {product} | |
| **Audience cible :** {audience} | |
| **Ton :** {tone} | |
| Fournis : | |
| 1. **5 objets d'email** (subject lines) optimisés pour le taux d'ouverture | |
| - Utilise la curiosité, l'urgence ou la personnalisation | |
| 2. **Texte de preview** (40 caractères) | |
| 3. **Corps de l'email complet** avec : | |
| - Hook d'ouverture personnalisé | |
| - Problème → Solution → Bénéfice | |
| - Preuve sociale (template à remplir) | |
| - CTA principal clair et urgent | |
| - P.S. avec offre bonus | |
| 4. **Version courte** (mobile-optimisée, <100 mots)""" | |
| result = call_llm(system, prompt, max_tokens=2500) | |
| remaining = FREE_DAILY_LIMIT - count | |
| return f"{result}\n\n---\n*✨ {remaining} génération(s) gratuite(s) restante(s)*" | |
| # ============================================================ | |
| # 🎯 OUTIL 4 : Générateur de Publicités (Google/Meta Ads) | |
| # ============================================================ | |
| def generate_ads(product, target_audience, platform, budget_range, usp, request: gr.Request = None): | |
| allowed, count = check_rate_limit(request) | |
| if not allowed: | |
| return f"⚠️ **Limite gratuite atteinte ({FREE_DAILY_LIMIT}/jour)**\n\n🚀 Passez à **ContentGenius Pro** !" | |
| system = """Tu es un expert en publicité digitale (Google Ads, Meta Ads, TikTok Ads). | |
| Tu crées des publicités à fort ROI avec des techniques de copywriting avancées. | |
| Tu respectes les limites de caractères de chaque plateforme.""" | |
| prompt = f"""Crée des publicités pour la plateforme {platform} : | |
| **Produit/Service :** {product} | |
| **Audience cible :** {target_audience} | |
| **USP (argument unique) :** {usp} | |
| **Budget indicatif :** {budget_range} | |
| Génère : | |
| **Pour Google Ads :** | |
| - 5 titres (max 30 caractères chacun) | |
| - 3 descriptions (max 90 caractères chacune) | |
| - 10 mots-clés suggérés (avec type de correspondance) | |
| - Extensions d'annonce recommandées | |
| **Pour Meta/Instagram Ads :** | |
| - 3 copies publicitaires (version courte, moyenne, longue) | |
| - Suggestions de visuels/créatifs | |
| - Audiences suggérées (intérêts, comportements) | |
| - Hook pour les 3 premières secondes (vidéo) | |
| **Pour les deux :** | |
| - Estimation du CPC/CPM par audience | |
| - Suggestions de landing page | |
| - A/B tests recommandés""" | |
| result = call_llm(system, prompt, max_tokens=2500) | |
| remaining = FREE_DAILY_LIMIT - count | |
| return f"{result}\n\n---\n*✨ {remaining} génération(s) gratuite(s) restante(s)*" | |
| # ============================================================ | |
| # 📱 OUTIL 5 : Générateur de Contenu Réseaux Sociaux | |
| # ============================================================ | |
| def generate_social(topic, platforms, brand_voice, content_goal, request: gr.Request = None): | |
| allowed, count = check_rate_limit(request) | |
| if not allowed: | |
| return f"⚠️ **Limite gratuite atteinte ({FREE_DAILY_LIMIT}/jour)**\n\n🚀 Passez à **ContentGenius Pro** !" | |
| platforms_str = ", ".join(platforms) if isinstance(platforms, list) else platforms | |
| system = """Tu es un community manager expert multi-plateformes. | |
| Tu connais les algorithmes et best practices de chaque réseau social. | |
| Tu crées du contenu adapté à chaque plateforme.""" | |
| prompt = f"""Crée du contenu pour les réseaux sociaux suivants : {platforms_str} | |
| **Sujet :** {topic} | |
| **Voix de marque :** {brand_voice} | |
| **Objectif :** {content_goal} | |
| Pour CHAQUE plateforme, fournis : | |
| 1. **Texte du post** (adapté au format et à la longueur optimale) | |
| 2. **Meilleur moment de publication** (jour + heure) | |
| 3. **Hashtags recommandés** (nombre optimal par plateforme) | |
| 4. **Type de visuel suggéré** (photo, carrousel, vidéo, infographie) | |
| 5. **CTA adapté** à la plateforme | |
| 6. **Idée de story/reel** associée | |
| Adapte le ton et le format à chaque plateforme : | |
| - Instagram : visuel, émotionnel, storytelling | |
| - Twitter/X : concis, provocant, thread si nécessaire | |
| - TikTok : trend-based, hook 1 seconde, casual | |
| - Facebook : communautaire, engageant, plus long""" | |
| result = call_llm(system, prompt, max_tokens=2500) | |
| remaining = FREE_DAILY_LIMIT - count | |
| return f"{result}\n\n---\n*✨ {remaining} génération(s) gratuite(s) restante(s)*" | |
| # ============================================================ | |
| # 🏷️ OUTIL 6 : Générateur de Fiches Produit E-commerce | |
| # ============================================================ | |
| def generate_product_desc(product_name, features, target_customer, platform, tone, request: gr.Request = None): | |
| allowed, count = check_rate_limit(request) | |
| if not allowed: | |
| return f"⚠️ **Limite gratuite atteinte ({FREE_DAILY_LIMIT}/jour)**\n\n🚀 Passez à **ContentGenius Pro** !" | |
| system = """Tu es un expert en e-commerce et copywriting produit. | |
| Tu crées des fiches produit qui convertissent, optimisées SEO. | |
| Tu connais les best practices Amazon, Shopify, Etsy et WooCommerce.""" | |
| prompt = f"""Crée une fiche produit complète et vendeuse : | |
| **Produit :** {product_name} | |
| **Caractéristiques :** {features} | |
| **Client cible :** {target_customer} | |
| **Plateforme :** {platform} | |
| **Ton :** {tone} | |
| Fournis : | |
| 1. **Titre produit optimisé SEO** (avec mots-clés) | |
| 2. **Bullet points** (5 bénéfices clés, format Amazon) | |
| 3. **Description longue** (200-300 mots, storytelling + bénéfices) | |
| 4. **Description courte** (50 mots, pour les résultats de recherche) | |
| 5. **Tags/Mots-clés** (10 termes SEO) | |
| 6. **FAQ produit** (5 questions fréquentes avec réponses) | |
| 7. **Suggestions de cross-sell** (3 produits complémentaires) | |
| 8. **Script de vidéo produit** (30 secondes)""" | |
| result = call_llm(system, prompt, max_tokens=2500) | |
| remaining = FREE_DAILY_LIMIT - count | |
| return f"{result}\n\n---\n*✨ {remaining} génération(s) gratuite(s) restante(s)*" | |
| # ============================================================ | |
| # ✏️ OUTIL 7 : Réécrivain & Améliorateur de Texte | |
| # ============================================================ | |
| def rewrite_text(original_text, goal, tone, instructions, request: gr.Request = None): | |
| allowed, count = check_rate_limit(request) | |
| if not allowed: | |
| return f"⚠️ **Limite gratuite atteinte ({FREE_DAILY_LIMIT}/jour)**\n\n🚀 Passez à **ContentGenius Pro** !" | |
| system = """Tu es un rédacteur et éditeur professionnel. | |
| Tu améliores les textes en préservant le message original. | |
| Tu es expert en clarté, impact et optimisation SEO.""" | |
| prompt = f"""Réécris et améliore ce texte : | |
| **Texte original :** | |
| {original_text} | |
| **Objectif de la réécriture :** {goal} | |
| **Ton souhaité :** {tone} | |
| **Instructions supplémentaires :** {instructions} | |
| Fournis : | |
| 1. **Version améliorée** du texte | |
| 2. **Liste des changements** effectués (et pourquoi) | |
| 3. **Score de lisibilité** avant/après (estimation Flesch) | |
| 4. **Variante plus courte** (-30% de mots, même impact) | |
| 5. **Variante plus percutante** (copywriting, plus de punch)""" | |
| result = call_llm(system, prompt, max_tokens=2500) | |
| remaining = FREE_DAILY_LIMIT - count | |
| return f"{result}\n\n---\n*✨ {remaining} génération(s) gratuite(s) restante(s)*" | |
| # ============================================================ | |
| # 🎨 INTERFACE GRADIO — Design Professionnel | |
| # ============================================================ | |
| CUSTOM_CSS = """ | |
| /* Hero Header */ | |
| .hero-section { | |
| background: linear-gradient(135deg, #6366f1 0%, #a855f7 50%, #ec4899 100%); | |
| padding: 2rem 2.5rem; | |
| border-radius: 16px; | |
| color: white; | |
| text-align: center; | |
| margin-bottom: 1.5rem; | |
| box-shadow: 0 10px 40px rgba(99, 102, 241, 0.3); | |
| } | |
| .hero-section h1 { | |
| font-size: 2.2rem; | |
| font-weight: 800; | |
| margin: 0; | |
| letter-spacing: -0.5px; | |
| } | |
| .hero-section p { | |
| font-size: 1.1rem; | |
| opacity: 0.9; | |
| margin-top: 0.5rem; | |
| } | |
| /* Stats Banner */ | |
| .stats-banner { | |
| display: flex; | |
| justify-content: center; | |
| gap: 2rem; | |
| padding: 1rem; | |
| background: rgba(255,255,255,0.1); | |
| border-radius: 12px; | |
| margin-top: 1rem; | |
| } | |
| .stat-item { | |
| text-align: center; | |
| } | |
| .stat-number { | |
| font-size: 1.5rem; | |
| font-weight: 700; | |
| } | |
| .stat-label { | |
| font-size: 0.8rem; | |
| opacity: 0.8; | |
| } | |
| /* Pro Badge */ | |
| .pro-badge { | |
| background: linear-gradient(135deg, #f59e0b, #ef4444); | |
| color: white; | |
| padding: 0.3rem 0.8rem; | |
| border-radius: 20px; | |
| font-size: 0.75rem; | |
| font-weight: 700; | |
| display: inline-block; | |
| margin-left: 0.5rem; | |
| } | |
| /* Tab styling */ | |
| .tab-nav button { | |
| font-weight: 600 !important; | |
| font-size: 0.95rem !important; | |
| } | |
| /* CTA Section */ | |
| .cta-section { | |
| background: linear-gradient(135deg, #1e1b4b, #312e81); | |
| padding: 2rem; | |
| border-radius: 16px; | |
| color: white; | |
| text-align: center; | |
| margin-top: 1.5rem; | |
| } | |
| .cta-section h2 { | |
| color: white; | |
| margin-bottom: 0.5rem; | |
| } | |
| .cta-section a { | |
| background: linear-gradient(135deg, #f59e0b, #ef4444); | |
| color: white; | |
| padding: 0.8rem 2rem; | |
| border-radius: 10px; | |
| text-decoration: none; | |
| font-weight: 700; | |
| display: inline-block; | |
| margin-top: 1rem; | |
| transition: transform 0.2s; | |
| } | |
| .cta-section a:hover { | |
| transform: scale(1.05); | |
| } | |
| /* Footer */ | |
| .footer-info { | |
| text-align: center; | |
| padding: 1rem; | |
| opacity: 0.6; | |
| font-size: 0.85rem; | |
| } | |
| """ | |
| with gr.Blocks(title="ContentGenius AI — Créez du Contenu qui Convertit") as demo: | |
| # --- HERO HEADER --- | |
| gr.HTML(""" | |
| <div class="hero-section"> | |
| <h1>⚡ ContentGenius AI</h1> | |
| <p>Créez du contenu marketing professionnel en 30 secondes grâce à l'IA</p> | |
| <div class="stats-banner"> | |
| <div class="stat-item"> | |
| <div class="stat-number">7</div> | |
| <div class="stat-label">Outils IA</div> | |
| </div> | |
| <div class="stat-item"> | |
| <div class="stat-number">∞</div> | |
| <div class="stat-label">Possibilités</div> | |
| </div> | |
| <div class="stat-item"> | |
| <div class="stat-number">30s</div> | |
| <div class="stat-label">Par contenu</div> | |
| </div> | |
| <div class="stat-item"> | |
| <div class="stat-number">5</div> | |
| <div class="stat-label">Gratuits/jour</div> | |
| </div> | |
| </div> | |
| </div> | |
| """) | |
| with gr.Tabs(): | |
| # === TAB 1 : Articles de Blog === | |
| with gr.Tab("📝 Articles Blog", id="blog"): | |
| gr.Markdown("### Génère des articles de blog optimisés SEO en un clic") | |
| with gr.Row(): | |
| with gr.Column(scale=1): | |
| blog_topic = gr.Textbox( | |
| label="Sujet de l'article", | |
| placeholder="Ex: Les 10 meilleures stratégies de marketing digital en 2025", | |
| lines=2 | |
| ) | |
| blog_keywords = gr.Textbox( | |
| label="Mots-clés SEO (séparés par des virgules)", | |
| placeholder="Ex: marketing digital, stratégie SEO, growth hacking" | |
| ) | |
| blog_tone = gr.Dropdown( | |
| ["Professionnel", "Conversationnel", "Éducatif", "Inspirant", "Technique", "Humoristique"], | |
| label="Ton", value="Professionnel" | |
| ) | |
| blog_length = gr.Radio( | |
| ["Court (~500 mots)", "Moyen (~1000 mots)", "Long (~2000 mots)"], | |
| label="Longueur", value="Moyen (~1000 mots)" | |
| ) | |
| blog_language = gr.Dropdown( | |
| ["Français", "English", "Español", "Deutsch", "Italiano", "Português"], | |
| label="Langue", value="Français" | |
| ) | |
| blog_btn = gr.Button("🚀 Générer l'article", variant="primary", size="lg") | |
| with gr.Column(scale=2): | |
| blog_output = gr.Markdown(label="Article généré") | |
| blog_btn.click( | |
| generate_blog, | |
| inputs=[blog_topic, blog_keywords, blog_tone, blog_length, blog_language], | |
| outputs=blog_output, | |
| api_name="generate_blog" | |
| ) | |
| # === TAB 2 : LinkedIn === | |
| with gr.Tab("💼 LinkedIn", id="linkedin"): | |
| gr.Markdown("### Crée des posts LinkedIn viraux qui génèrent de l'engagement") | |
| with gr.Row(): | |
| with gr.Column(scale=1): | |
| li_topic = gr.Textbox( | |
| label="Sujet du post", | |
| placeholder="Ex: Pourquoi j'ai quitté mon CDI pour entreprendre", | |
| lines=2 | |
| ) | |
| li_context = gr.Textbox( | |
| label="Contexte / Expérience personnelle", | |
| placeholder="Ex: Après 5 ans en finance, j'ai lancé ma startup...", | |
| lines=3 | |
| ) | |
| li_style = gr.Dropdown( | |
| ["Storytelling", "Leçon apprise", "Controverse", "How-to", "Liste de tips", "Célébration"], | |
| label="Style de post", value="Storytelling" | |
| ) | |
| li_emoji = gr.Checkbox(label="Inclure des emojis 🚀", value=True) | |
| li_hashtags = gr.Checkbox(label="Ajouter des hashtags #", value=True) | |
| li_btn = gr.Button("🚀 Générer le post", variant="primary", size="lg") | |
| with gr.Column(scale=2): | |
| li_output = gr.Markdown(label="Posts LinkedIn") | |
| li_btn.click( | |
| generate_linkedin, | |
| inputs=[li_topic, li_context, li_style, li_emoji, li_hashtags], | |
| outputs=li_output, | |
| api_name="generate_linkedin" | |
| ) | |
| # === TAB 3 : Emails Marketing === | |
| with gr.Tab("📧 Emails", id="email"): | |
| gr.Markdown("### Crée des emails marketing à fort taux de conversion") | |
| with gr.Row(): | |
| with gr.Column(scale=1): | |
| email_objective = gr.Textbox( | |
| label="Objectif de l'email", | |
| placeholder="Ex: Promouvoir le lancement de notre nouvelle formation en ligne", | |
| lines=2 | |
| ) | |
| email_product = gr.Textbox( | |
| label="Produit / Service", | |
| placeholder="Ex: Formation 'Maîtrisez le Marketing Digital' — 497€" | |
| ) | |
| email_audience = gr.Textbox( | |
| label="Audience cible", | |
| placeholder="Ex: Entrepreneurs débutants, 25-40 ans, francophones" | |
| ) | |
| email_tone = gr.Dropdown( | |
| ["Professionnel", "Amical", "Urgent", "Exclusif", "Éducatif"], | |
| label="Ton", value="Professionnel" | |
| ) | |
| email_type = gr.Dropdown( | |
| ["Lancement produit", "Newsletter", "Relance panier abandonné", | |
| "Bienvenue", "Promotion/Soldes", "Réengagement", "Invitation événement"], | |
| label="Type d'email", value="Lancement produit" | |
| ) | |
| email_btn = gr.Button("🚀 Générer l'email", variant="primary", size="lg") | |
| with gr.Column(scale=2): | |
| email_output = gr.Markdown(label="Email Marketing") | |
| email_btn.click( | |
| generate_email, | |
| inputs=[email_objective, email_product, email_audience, email_tone, email_type], | |
| outputs=email_output, | |
| api_name="generate_email" | |
| ) | |
| # === TAB 4 : Publicités === | |
| with gr.Tab("🎯 Publicités", id="ads"): | |
| gr.Markdown("### Crée des publicités Google & Meta Ads performantes") | |
| with gr.Row(): | |
| with gr.Column(scale=1): | |
| ads_product = gr.Textbox( | |
| label="Produit / Service à promouvoir", | |
| placeholder="Ex: Application de méditation — abonnement 9.99€/mois", | |
| lines=2 | |
| ) | |
| ads_audience = gr.Textbox( | |
| label="Audience cible", | |
| placeholder="Ex: Cadres stressés 30-50 ans, intéressés par le bien-être" | |
| ) | |
| ads_platform = gr.Dropdown( | |
| ["Google Ads + Meta Ads", "Google Ads uniquement", "Meta/Instagram Ads", "TikTok Ads", "LinkedIn Ads"], | |
| label="Plateforme", value="Google Ads + Meta Ads" | |
| ) | |
| ads_budget = gr.Dropdown( | |
| ["Petit (< 500€/mois)", "Moyen (500-2000€/mois)", "Grand (2000-10000€/mois)", "Enterprise (> 10000€/mois)"], | |
| label="Budget mensuel", value="Moyen (500-2000€/mois)" | |
| ) | |
| ads_usp = gr.Textbox( | |
| label="Argument unique de vente (USP)", | |
| placeholder="Ex: Résultats prouvés en 7 jours, 100 000+ utilisateurs satisfaits" | |
| ) | |
| ads_btn = gr.Button("🚀 Générer les publicités", variant="primary", size="lg") | |
| with gr.Column(scale=2): | |
| ads_output = gr.Markdown(label="Publicités générées") | |
| ads_btn.click( | |
| generate_ads, | |
| inputs=[ads_product, ads_audience, ads_platform, ads_budget, ads_usp], | |
| outputs=ads_output, | |
| api_name="generate_ads" | |
| ) | |
| # === TAB 5 : Réseaux Sociaux === | |
| with gr.Tab("📱 Social Media", id="social"): | |
| gr.Markdown("### Crée du contenu adapté à chaque réseau social") | |
| with gr.Row(): | |
| with gr.Column(scale=1): | |
| social_topic = gr.Textbox( | |
| label="Sujet / Message clé", | |
| placeholder="Ex: Lancement de notre nouvelle gamme de produits bio", | |
| lines=2 | |
| ) | |
| social_platforms = gr.CheckboxGroup( | |
| ["Instagram", "Twitter/X", "TikTok", "Facebook", "Pinterest"], | |
| label="Plateformes", value=["Instagram", "Twitter/X"] | |
| ) | |
| social_voice = gr.Dropdown( | |
| ["Fun & Décalé", "Corporate & Pro", "Inspirant & Motivant", "Éducatif & Expert", "Luxe & Premium"], | |
| label="Voix de marque", value="Fun & Décalé" | |
| ) | |
| social_goal = gr.Dropdown( | |
| ["Notoriété", "Engagement", "Trafic web", "Ventes", "Recrutement", "Communauté"], | |
| label="Objectif", value="Engagement" | |
| ) | |
| social_btn = gr.Button("🚀 Générer le contenu", variant="primary", size="lg") | |
| with gr.Column(scale=2): | |
| social_output = gr.Markdown(label="Contenu Social Media") | |
| social_btn.click( | |
| generate_social, | |
| inputs=[social_topic, social_platforms, social_voice, social_goal], | |
| outputs=social_output, | |
| api_name="generate_social" | |
| ) | |
| # === TAB 6 : Fiches Produit === | |
| with gr.Tab("🏷️ Fiches Produit", id="product"): | |
| gr.Markdown("### Crée des fiches produit e-commerce qui vendent") | |
| with gr.Row(): | |
| with gr.Column(scale=1): | |
| prod_name = gr.Textbox( | |
| label="Nom du produit", | |
| placeholder="Ex: Casque audio sans fil NovaSound Pro X3" | |
| ) | |
| prod_features = gr.Textbox( | |
| label="Caractéristiques principales", | |
| placeholder="Ex: Bluetooth 5.3, ANC, 40h autonomie, charge rapide 10min=3h...", | |
| lines=3 | |
| ) | |
| prod_customer = gr.Textbox( | |
| label="Client cible", | |
| placeholder="Ex: Gamers et professionnels, 18-35 ans, budget 100-200€" | |
| ) | |
| prod_platform = gr.Dropdown( | |
| ["Amazon", "Shopify", "WooCommerce", "Etsy", "eBay", "Générique"], | |
| label="Plateforme e-commerce", value="Shopify" | |
| ) | |
| prod_tone = gr.Dropdown( | |
| ["Premium & Luxe", "Technique & Détaillé", "Fun & Accessible", "Eco-responsable", "Minimaliste"], | |
| label="Ton", value="Premium & Luxe" | |
| ) | |
| prod_btn = gr.Button("🚀 Générer la fiche", variant="primary", size="lg") | |
| with gr.Column(scale=2): | |
| prod_output = gr.Markdown(label="Fiche Produit") | |
| prod_btn.click( | |
| generate_product_desc, | |
| inputs=[prod_name, prod_features, prod_customer, prod_platform, prod_tone], | |
| outputs=prod_output, | |
| api_name="generate_product" | |
| ) | |
| # === TAB 7 : Réécrivain === | |
| with gr.Tab("✏️ Réécrivain", id="rewrite"): | |
| gr.Markdown("### Améliore et reformule n'importe quel texte") | |
| with gr.Row(): | |
| with gr.Column(scale=1): | |
| rw_text = gr.Textbox( | |
| label="Texte original à améliorer", | |
| placeholder="Collez ici le texte que vous souhaitez améliorer...", | |
| lines=8 | |
| ) | |
| rw_goal = gr.Dropdown( | |
| ["Améliorer la clarté", "Rendre plus persuasif", "Simplifier", | |
| "Rendre plus professionnel", "Optimiser SEO", "Raccourcir", | |
| "Corriger et améliorer", "Adapter pour le web"], | |
| label="Objectif", value="Améliorer la clarté" | |
| ) | |
| rw_tone = gr.Dropdown( | |
| ["Même ton", "Plus professionnel", "Plus casual", "Plus percutant", "Plus empathique"], | |
| label="Ton cible", value="Même ton" | |
| ) | |
| rw_instructions = gr.Textbox( | |
| label="Instructions supplémentaires (optionnel)", | |
| placeholder="Ex: Garder la longueur similaire, ajouter des données...", | |
| lines=2 | |
| ) | |
| rw_btn = gr.Button("🚀 Réécrire & Améliorer", variant="primary", size="lg") | |
| with gr.Column(scale=2): | |
| rw_output = gr.Markdown(label="Texte amélioré") | |
| rw_btn.click( | |
| rewrite_text, | |
| inputs=[rw_text, rw_goal, rw_tone, rw_instructions], | |
| outputs=rw_output, | |
| api_name="rewrite_text" | |
| ) | |
| # --- CTA SECTION --- | |
| gr.HTML(""" | |
| <div class="cta-section"> | |
| <h2>🔥 Passez à ContentGenius Pro</h2> | |
| <p>Générations illimitées • API Access • Support prioritaire • Tous les outils</p> | |
| <p style="font-size: 2rem; font-weight: 800; margin: 0.5rem 0;">15€<span style="font-size: 1rem; opacity: 0.7">/mois</span></p> | |
| <p style="opacity: 0.7;">soit 0.50€/jour pour un contenu marketing illimité</p> | |
| <a href="#" onclick="alert('💡 Pour activer les paiements : Créez un compte Stripe, ajoutez un lien de paiement, et remplacez ce # par votre URL Stripe.')"> | |
| ⚡ Commencer l'essai gratuit de 7 jours | |
| </a> | |
| </div> | |
| """) | |
| # --- FOOTER --- | |
| gr.HTML(""" | |
| <div class="footer-info"> | |
| <p>ContentGenius AI — Propulsé par des modèles IA open-source sur Hugging Face 🤗</p> | |
| <p>Chaque contenu est unique et original. Vérifiez toujours avant de publier.</p> | |
| </div> | |
| """) | |
| # --- LAUNCH --- | |
| if __name__ == "__main__": | |
| demo.launch( | |
| css=CUSTOM_CSS, | |
| theme=gr.themes.Soft( | |
| primary_hue=gr.themes.colors.indigo, | |
| secondary_hue=gr.themes.colors.purple, | |
| ), | |
| ) | |