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("""

⚡ ContentGenius AI

Créez du contenu marketing professionnel en 30 secondes grùce à l'IA

7
Outils IA
∞
Possibilités
30s
Par contenu
5
Gratuits/jour
""") 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("""

đŸ”„ Passez Ă  ContentGenius Pro

GĂ©nĂ©rations illimitĂ©es ‱ API Access ‱ Support prioritaire ‱ Tous les outils

15€/mois

soit 0.50€/jour pour un contenu marketing illimitĂ©

⚡ Commencer l'essai gratuit de 7 jours
""") # --- FOOTER --- gr.HTML(""" """) # --- 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, ), )