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()