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