import gradio as gr from huggingface_hub import InferenceClient import os import json import requests from fastapi import FastAPI, Request from fastapi.responses import JSONResponse from fastapi.staticfiles import StaticFiles # ====================== CONFIGURATION ====================== client = InferenceClient("meta-llama/Meta-Llama-3-8B-Instruct", token=os.getenv("HF_TOKEN")) SPECIAL_USERS = {"nastlach", "spikelatour"} paid_users = {} user_usage = {} LIMIT_FREE = 3 PRICE_PRO = "29.00" CURRENCY = "EUR" # ====================== FASTAPI + PWA ====================== app = FastAPI() # Dossier static pour PWA try: os.makedirs("static", exist_ok=True) except: pass # Manifest PWA @app.get("/manifest.json") async def get_manifest(): return { "name": "AI Money Machine PRO", "short_name": "AI Money", "description": "IA Business - Dropshipping, OnlyFans, Crypto, Dubaï", "start_url": "/", "display": "standalone", "background_color": "#1a1a2e", "theme_color": "#00ff9d", "icons": [ {"src": "/static/icon-192.png", "sizes": "192x192", "type": "image/png"}, {"src": "/static/icon-512.png", "sizes": "512x512", "type": "image/png"} ] } app.mount("/static", StaticFiles(directory="static"), name="static") # ====================== PAYPAL WEBHOOK (minimal) ====================== @app.post("/webhook") async def paypal_webhook(request: Request): try: body = await request.json() event_type = body.get("event_type") if event_type in ["CHECKOUT.ORDER.APPROVED", "PAYMENT.CAPTURE.COMPLETED"]: resource = body.get("resource", {}) custom_id = resource.get("purchase_units", [{}])[0].get("custom_id") if custom_id: user_key = str(custom_id).strip().lower() paid_users[user_key] = True # Sauvegarde persistante with open("paid_users.json", "w", encoding="utf-8") as f: json.dump(paid_users, f) except: pass return JSONResponse({"status": "success"}) # ====================== FONCTIONS ====================== def ask_ai(prompt, stream=False): try: messages = [ {"role": "system", "content": "Tu es une IA experte en business en ligne. Réponds en Français de manière structurée et motivante."}, {"role": "user", "content": prompt} ] output = client.chat_completion( messages=messages, max_tokens=1300, temperature=0.75, stream=stream ) if stream: for chunk in output: if chunk.choices and chunk.choices[0].delta and chunk.choices[0].delta.content: yield chunk.choices[0].delta.content return return output.choices[0].message.content except Exception as e: return f"Erreur technique : {str(e)}" def valider_session(p): if not p or len(p.strip()) < 2: return gr.update(), gr.update(), gr.update(visible=False), "⚠️ Pseudo trop court (min. 2 caractères)." return gr.update(interactive=False), gr.update(visible=False), gr.update(visible=True), f"✅ Pseudo '{p}' enregistré." def generate_business_plan(service, details, user_id): if not user_id or user_id.strip() == "": yield "❌ Valide ton pseudo d’abord." return original_id = user_id.strip() user_key = original_id.lower() is_vip = user_key in SPECIAL_USERS is_pro = user_key in paid_users unlimited = is_vip or is_pro count = user_usage.get(user_key, 0) PREMIUM_SERVICES = {"💰 Conseils Bitcoin", "🪙 Management de Coins créés en d’autres", "📱 Management OnlyFans", "🐦 Management X (Twitter)", "🏙️ Stratégies Dubaï High-Ticket"} if service in PREMIUM_SERVICES and not unlimited: yield "❌ Ce service premium est réservé aux PRO ou VIP (nastlach / spikelatour)." return if not unlimited and count >= LIMIT_FREE: yield """❌ **LIMITE ATTEINTE !**\n\n**PASSE À LA VERSION PRO POUR UN ACCÈS ILLIMITÉ**""" return # Message de réflexion if is_vip: thinking = "🤖 **L'IA réfléchit...**\n\n✅ **ACCÈS VIP TOTAL** → Tout est gratuit et illimité" elif is_pro: thinking = "🤖 **L'IA réfléchit...**\n\n✅ **PRO ACTIVÉ** → Accès illimité" else: thinking = f"🤖 **L'IA réfléchit...**\n\n**PASSE À LA VERSION PRO POUR PLUS DE RAPIDITÉ**\n📊 Essais restants : {LIMIT_FREE - count}" yield thinking # Prompts base_prompts = { "💡 Produit gagnant": "Trouve un produit dropshipping gagnant avec analyse.", "🔥 Script TikTok": "Ecris un script TikTok viral avec accroche.", "🛒 Boutique": "Donne 3 étapes clés pour lancer une boutique.", "📈 Scaling": "Explique comment passer de 100€ à 1000€ de profit.", "✍️ Question Libre": "Réponds à cette question business :", "💰 Conseils Bitcoin": "Expert crypto. Conseils complets sur Bitcoin.", "🪙 Management de Coins créés en d’autres": "Expert en management de coins et cryptos.", "📱 Management OnlyFans": "Expert OnlyFans : croissance, contenu et monétisation.", "🐦 Management X (Twitter)": "Expert Twitter/X : croissance et monétisation.", "🏙️ Stratégies Dubaï High-Ticket": "Expert ventes high-ticket style Dubaï." } prompt_final = base_prompts.get(service, "") + f" Détails : {details}" ai_response = "" for chunk in ask_ai(prompt_final, stream=True): ai_response += chunk yield f"{thinking}\n\n{ai_response}" if not unlimited: user_usage[user_key] = count + 1 remaining = "✅ **ACCÈS ILLIMITÉ TOTAL** 🎉" if unlimited else f"📊 Essais restants : {LIMIT_FREE - user_usage[user_key]}" yield f"{ai_response}\n\n---\n{remaining}" # ====================== INTERFACE ====================== with gr.Blocks( theme=gr.themes.Soft(), title="AI Money Machine PRO", head=""" """ ) as demo: gr.Markdown("# 💸 AI MONEY MACHINE PRO") gr.Markdown("ℹ️ Rafraîchis la page (F5) pour changer de pseudo") with gr.Row(): pseudo = gr.Textbox(label="👤 Ton Pseudo", placeholder="Ex: nastlach ou spikelatour", scale=3) btn_valider = gr.Button("✅ Valider", variant="primary", scale=1) with gr.Column(visible=False) as business_section: gr.Markdown("---") btn_pay = gr.Button("💎 Payer 29€ PayPal → PRO Illimité", variant="stop", size="large") payment_status = gr.Markdown("") choix = gr.Dropdown( choices=["💡 Produit gagnant", "🔥 Script TikTok", "🛒 Boutique", "📈 Scaling", "✍️ Question Libre", "💰 Conseils Bitcoin", "🪙 Management de Coins créés en d’autres", "📱 Management OnlyFans", "🐦 Management X (Twitter)", "🏙️ Stratégies Dubaï High-Ticket"], label="Service", value="💡 Produit gagnant" ) details = gr.Textbox(label="🎯 Détails spécifiques", placeholder="Niche, budget, objectifs...", lines=3) btn_go = gr.Button("🚀 GÉNÉRER MON PLAN", variant="primary") output_text = gr.Markdown(label="📋 Résultat") # Logique btn_valider.click(valider_session, inputs=[pseudo], outputs=[pseudo, btn_valider, business_section, output_text]) btn_go.click(generate_business_plan, inputs=[choix, details, pseudo], outputs=output_text) # btn_pay.click(...) → à ajouter si tu veux le paiement dynamique # ====================== LANCEMENT ====================== app = gr.mount_gradio_app(app, demo, path="/")