doudou34's picture
🚀 Launch ContentGenius AI — Suite de contenu IA avec 7 outils
07ff2ac verified
Raw
History Blame Contribute Delete
30.8 kB
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,
),
)