SchmidtAI / app.py
pareaud's picture
Update app.py
eabbafb verified
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()