Download app.py from pareaud/SchmidtAI: direct link, hf CLI and curl.
- Browser
- Download file 3.41 kB
-
https://huggingface.co/spaces/pareaud/SchmidtAI/resolve/main/app.py
- Command line
-
hf download hf://spaces/pareaud/SchmidtAI/app.py
-
curl -L -o app.py https://huggingface.co/spaces/pareaud/SchmidtAI/resolve/main/app.py
3.41 kB
| 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() | |