Spaces:
Sleeping
Sleeping
| import os | |
| import gradio as gr | |
| import logging | |
| # --- Config logs --- | |
| logging.basicConfig( | |
| level=logging.INFO, | |
| format="[%(asctime)s] %(levelname)s - %(message)s" | |
| ) | |
| logger = logging.getLogger(__name__) | |
| # --- OpenAI (SDK officiel) --- | |
| from openai import OpenAI | |
| openai_client = OpenAI(api_key=os.getenv("OPENAI_API_KEY")) | |
| # --- Mistral (SDK officiel) --- | |
| from mistralai import Mistral | |
| mistral_client = Mistral(api_key=os.getenv("MISTRAL_API_KEY")) | |
| # Choix par défaut | |
| DEFAULT_PROVIDER = "openai" # ou "mistral" | |
| def llm_chat(messages, max_tokens, temperature, top_p, provider=DEFAULT_PROVIDER): | |
| provider = (provider or "").strip().lower() | |
| logger.info(f"Appel LLM provider={provider}, max_tokens={max_tokens}, temp={temperature}, top_p={top_p}") | |
| logger.info(f"Messages envoyés: {messages}") | |
| if provider == "openai": | |
| logger.info("→ Appel OpenAI Chat Completions") | |
| stream = openai_client.chat.completions.create( | |
| model="gpt-4o-mini", | |
| messages=messages, | |
| temperature=temperature, | |
| top_p=top_p, | |
| max_tokens=max_tokens, | |
| stream=True, | |
| ) | |
| for chunk in stream: | |
| delta = chunk.choices[0].delta | |
| if delta and delta.content: | |
| logger.debug(f"OpenAI renvoie token: {delta.content!r}") | |
| yield delta.content | |
| elif provider == "mistral": | |
| logger.info("→ Appel Mistral Chat Completions") | |
| stream = mistral_client.chat.stream( | |
| model="mistral-large-latest", | |
| messages=messages, | |
| temperature=temperature, | |
| top_p=top_p, | |
| max_tokens=max_tokens, | |
| ) | |
| for event in stream: | |
| if event.type == "chat.completion.chunk": | |
| piece = event.data.delta or "" | |
| if piece: | |
| logger.debug(f"Mistral renvoie token: {piece!r}") | |
| yield piece | |
| stream.close() | |
| else: | |
| logger.error(f"Provider inconnu: {provider}") | |
| yield "[Erreur] Provider inconnu (utilise 'openai' ou 'mistral')." | |
| def respond( | |
| message, | |
| history: list[dict[str, str]], | |
| system_message, | |
| max_tokens, | |
| temperature, | |
| top_p, | |
| provider, # "openai" ou "mistral" | |
| ): | |
| messages = [{"role": "system", "content": system_message}] | |
| messages.extend(history) | |
| messages.append({"role": "user", "content": message}) | |
| logger.info(f"Nouvelle requête utilisateur: {message}") | |
| response = "" | |
| for token in llm_chat( | |
| messages=messages, | |
| max_tokens=max_tokens, | |
| temperature=temperature, | |
| top_p=top_p, | |
| provider=provider, | |
| ): | |
| response += token | |
| yield response | |
| logger.info(f"Réponse finale générée: {response}") | |
| chatbot = gr.ChatInterface( | |
| respond, | |
| type="messages", | |
| additional_inputs=[ | |
| gr.Textbox(value="You are a friendly Chatbot.", label="System message"), | |
| gr.Slider(minimum=1, maximum=4096, value=512, step=1, label="Max new tokens"), | |
| gr.Slider(minimum=0.0, maximum=2.0, value=0.7, step=0.1, label="Temperature"), | |
| gr.Slider(minimum=0.0, maximum=1.0, value=0.95, step=0.05, label="Top-p"), | |
| gr.Dropdown(choices=["openai", "mistral"], value=DEFAULT_PROVIDER, label="Provider"), | |
| ], | |
| ) | |
| with gr.Blocks() as demo: | |
| chatbot.render() | |
| if __name__ == "__main__": | |
| demo.launch() | |