| import os |
| import json |
| from typing import Optional |
| import gradio as gr |
| from pydantic import BaseModel |
| from openai import OpenAI |
|
|
| |
| 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) |
|
|
| |
| class UserInfo(BaseModel): |
| reponse_client: str |
| conseil_methodo: str |
|
|
| |
| 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. |
| """ |
|
|
| |
| 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}", "" |
|
|
| |
| 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]) |
|
|
| |
| if __name__ == "__main__": |
| demo.launch() |
|
|