import os import json from typing import Optional import gradio as gr from pydantic import BaseModel from openai import OpenAI # 1. Chargement de la clé via variable d'environnement api_key = os.getenv("OPEN_AI_KEY") if not api_key: raise ValueError("La variable d'environnement 'OPEN_AI_KEY' n'est pas définie.") client = OpenAI(api_key=api_key) # 2. Modèle de sortie class UserInfo(BaseModel): reponse_client: str conseil_methodo: str # 3. Prompt spécifique à Schmidt SYSTEM_PROMPT = """ Tu es un prospect dans un jeu de rôle commercial pour une enseigne de cuisines haut de gamme comme Schmidt. Tu joues le rôle d’un client particulier, en recherche ou non d’une cuisine, avec un profil réaliste : parfois curieux, parfois pressé, hésitant, ou méfiant. À chaque échange, tu dois répondre comme le ferait un vrai client en magasin ou par téléphone. Puis, tu dois fournir un retour pédagogique sur la posture du vendeur. Ta réponse doit être un JSON structuré conforme au schéma suivant : { "reponse_client": "ta réponse réaliste au commercial", "conseil_methodo": "un conseil ou retour constructif sur la méthode de vente utilisée (écoute active, découverte, reformulation, gestion des objections, closing, etc.). Tu peux faire référence à des méthodes comme CAB ou SONCAS." } Sois réaliste et varié dans tes réactions de client : n’hésite pas à poser des objections ou à exprimer des besoins flous. """ # 4. Fonction principale def generer_reponse_structuree(message: str) -> tuple[str, str]: try: response = client.responses.parse( model="gpt-4o", input=[ {"role": "system", "content": SYSTEM_PROMPT}, {"role": "user", "content": message}, ], text_format=UserInfo, temperature=0.7, ) parsed = response.output_parsed return parsed.reponse_client, parsed.conseil_methodo except Exception as e: return f"❌ Erreur : {e}", "" # 5. Interface Gradio UI améliorée exemple_commercial = "Bonjour, je suis conseiller chez Schmidt. Avez-vous déjà une idée de votre projet de cuisine ou souhaitez-vous qu’on en discute ensemble ?" with gr.Blocks(title="Jeu de rôle commercial Schmidt (UI améliorée)") as demo: gr.Markdown(""" # 🎯 Jeu de rôle commercial — Schmidt 👉 Tape une phrase comme si tu étais un conseiller Schmidt. 🤖 L’IA joue le rôle d’un prospect et t’indique un **feedback méthodologique**. --- """) with gr.Row(): input_box = gr.Textbox( label="💬 Ce que tu dis au client", placeholder="Ex : Vous cherchez plutôt une cuisine moderne ou traditionnelle ?", value=exemple_commercial, lines=2, scale=2 ) bouton = gr.Button("Envoyer", scale=1) with gr.Row(): reponse_client = gr.Textbox(label="🗣️ Réponse du client (simulation)", interactive=False, lines=4) conseil = gr.Textbox(label="📚 Conseil sur ta méthode commerciale", interactive=False, lines=3) bouton.click(generer_reponse_structuree, inputs=input_box, outputs=[reponse_client, conseil]) input_box.submit(generer_reponse_structuree, inputs=input_box, outputs=[reponse_client, conseil]) # 6. Lancement if __name__ == "__main__": demo.launch()