test-llm / app.py
tracy04's picture
Update app.py
2b295a0 verified
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()