File size: 3,409 Bytes
eabbafb
a0498f6
e050554
a0498f6
b1abcde
a0498f6
 
eabbafb
 
 
 
 
 
 
 
b1abcde
e050554
 
 
eabbafb
e050554
 
 
 
 
 
 
 
 
 
 
 
eabbafb
e050554
 
 
 
afee056
679abb4
 
b1abcde
 
679abb4
b1abcde
 
e050554
b1abcde
679abb4
e050554
10c48a7
 
e050554
679abb4
afee056
b1abcde
679abb4
10c48a7
679abb4
e050554
 
679abb4
e050554
679abb4
10c48a7
679abb4
 
 
 
e050554
afee056
679abb4
 
 
 
 
 
 
 
 
afee056
679abb4
 
 
afee056
679abb4
 
afee056
679abb4
10c48a7
afee056
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
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()