pareaud commited on
Commit
679abb4
·
verified ·
1 Parent(s): e050554

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +32 -46
app.py CHANGED
@@ -4,26 +4,17 @@ import gradio as gr
4
  from pydantic import BaseModel
5
  from openai import OpenAI
6
 
7
- # ------------------------------------------------------------------
8
- # 1 — Initialisation OpenAI
9
- # ------------------------------------------------------------------
10
-
11
  client = OpenAI(
12
  api_key="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"
13
  )
14
 
15
- # ------------------------------------------------------------------
16
- # 2 — Définition du schéma pour la réponse structurée
17
- # ------------------------------------------------------------------
18
-
19
  class UserInfo(BaseModel):
20
  reponse_client: str
21
  conseil_methodo: str
22
 
23
- # ------------------------------------------------------------------
24
- # 3 — Prompt système adapté à la vente Schmidt
25
- # ------------------------------------------------------------------
26
-
27
  SYSTEM_PROMPT = """
28
  Tu es un prospect dans un jeu de rôle commercial pour une enseigne de cuisines haut de gamme comme Schmidt.
29
  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.
@@ -36,66 +27,61 @@ Ta réponse doit être un JSON structuré conforme au schéma suivant :
36
 
37
  {
38
  "reponse_client": "ta réponse réaliste au commercial",
39
- "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."
40
  }
41
 
42
  Sois réaliste et varié dans tes réactions de client : n’hésite pas à poser des objections ou à exprimer des besoins flous.
43
-
44
- Exemples d’obstacles :
45
- - “Je veux juste un devis pour comparer.”
46
- - “On a un petit budget.”
47
- - “Je dois en parler à mon conjoint.”
48
- - “J’hésite avec Ikea.”
49
-
50
- Exemples de conseils :
51
- - “Bonne reformulation, cela permet de s’assurer de bien comprendre le besoin.”
52
- - “Tu aurais pu creuser le contexte de la demande avant de proposer une solution.”
53
- - “Attention, tu proposes trop tôt sans avoir découvert le projet.”
54
  """
55
 
56
- # ------------------------------------------------------------------
57
- # 4 Fonction de jeu de rôle avec retour structuré
58
- # ------------------------------------------------------------------
59
-
60
- def generer_reponse_structuree(message: str) -> str:
61
  try:
62
  response = client.responses.parse(
63
- model="gpt-4o", # utilise Structured Outputs
64
  input=[
65
  {"role": "system", "content": SYSTEM_PROMPT},
66
  {"role": "user", "content": message},
67
  ],
68
- text_format=UserInfo, # output structuré
69
  temperature=0.7,
70
  )
71
 
72
  parsed = response.output_parsed
73
- return json.dumps(parsed.model_dump(), indent=2, ensure_ascii=False)
74
 
75
  except Exception as e:
76
- return f"❌ Erreur : {e}"
77
-
78
- # ------------------------------------------------------------------
79
- # 5 — Interface Gradio
80
- # ------------------------------------------------------------------
81
 
 
82
  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 ?"
83
 
84
- with gr.Blocks(title="Jeu de rôle commercial Schmidt (B2C)") as demo:
85
  gr.Markdown("""
86
- ## 🎯 Jeu de rôle commercial — Vente de cuisines Schmidt
87
 
88
- Simule une interaction avec un client dans un contexte B2C. Reçois une **réponse réaliste** du prospect et un **retour méthodologique** sur ta posture commerciale.
 
 
 
89
  """)
90
 
91
- input_box = gr.Textbox(label="Ta phrase de vendeur", lines=3, value=exemple_commercial)
92
- output_json = gr.Code(label="Réponse + Conseil structuré (JSON)")
 
 
 
 
 
 
 
93
 
94
- gr.Button("Lancer le jeu de rôle").click(generer_reponse_structuree, input_box, output_json)
 
 
95
 
96
- # ------------------------------------------------------------------
97
- # 6 Lancement
98
- # ------------------------------------------------------------------
99
 
 
100
  if __name__ == "__main__":
101
  demo.launch()
 
4
  from pydantic import BaseModel
5
  from openai import OpenAI
6
 
7
+ # 1. Initialisation OpenAI
 
 
 
8
  client = OpenAI(
9
  api_key="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"
10
  )
11
 
12
+ # 2. Modèle Pydantic
 
 
 
13
  class UserInfo(BaseModel):
14
  reponse_client: str
15
  conseil_methodo: str
16
 
17
+ # 3. Prompt système adapté Schmidt
 
 
 
18
  SYSTEM_PROMPT = """
19
  Tu es un prospect dans un jeu de rôle commercial pour une enseigne de cuisines haut de gamme comme Schmidt.
20
  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.
 
27
 
28
  {
29
  "reponse_client": "ta réponse réaliste au commercial",
30
+ "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."
31
  }
32
 
33
  Sois réaliste et varié dans tes réactions de client : n’hésite pas à poser des objections ou à exprimer des besoins flous.
 
 
 
 
 
 
 
 
 
 
 
34
  """
35
 
36
+ # 4. Fonction principale
37
+ def generer_reponse_structuree(message: str) -> tuple[str, str]:
 
 
 
38
  try:
39
  response = client.responses.parse(
40
+ model="gpt-4o",
41
  input=[
42
  {"role": "system", "content": SYSTEM_PROMPT},
43
  {"role": "user", "content": message},
44
  ],
45
+ text_format=UserInfo,
46
  temperature=0.7,
47
  )
48
 
49
  parsed = response.output_parsed
50
+ return parsed.reponse_client, parsed.conseil_methodo
51
 
52
  except Exception as e:
53
+ return f"❌ Erreur : {e}", ""
 
 
 
 
54
 
55
+ # 5. Interface Gradio UI améliorée
56
  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 ?"
57
 
58
+ with gr.Blocks(title="Jeu de rôle commercial Schmidt (UI améliorée)") as demo:
59
  gr.Markdown("""
60
+ # 🎯 Jeu de rôle commercial — Schmidt
61
 
62
+ 👉 Tape une phrase comme si tu étais un conseiller Schmidt.
63
+ 🤖 L’IA joue le rôle d’un prospect et t’indique un **feedback méthodologique**.
64
+
65
+ ---
66
  """)
67
 
68
+ with gr.Row():
69
+ input_box = gr.Textbox(
70
+ label="💬 Ce que tu dis au client",
71
+ placeholder="Ex : Vous cherchez plutôt une cuisine moderne ou traditionnelle ?",
72
+ value=exemple_commercial,
73
+ lines=2,
74
+ scale=2
75
+ )
76
+ bouton = gr.Button("Envoyer", scale=1)
77
 
78
+ with gr.Row():
79
+ reponse_client = gr.Textbox(label="🗣️ Réponse du client (simulation)", interactive=False, lines=4)
80
+ conseil = gr.Textbox(label="📚 Conseil sur ta méthode commerciale", interactive=False, lines=3)
81
 
82
+ bouton.click(generer_reponse_structuree, inputs=input_box, outputs=[reponse_client, conseil])
83
+ input_box.submit(generer_reponse_structuree, inputs=input_box, outputs=[reponse_client, conseil])
 
84
 
85
+ # 6. Lancement
86
  if __name__ == "__main__":
87
  demo.launch()