ChatBot / app.py
Eddyhzd
test
c548a89
import gradio as gr
from openai import OpenAI
import os
import asyncio
from contextlib import AsyncExitStack
from mcp import ClientSession
from mcp.client.streamable_http import streamablehttp_client
cle_api = os.environ.get("CLE_API_MISTRAL")
# Initialisation du client Mistral (API compatible OpenAI)
clientLLM = OpenAI(api_key=cle_api, base_url="https://api.mistral.ai/v1")
loop = asyncio.new_event_loop()
asyncio.set_event_loop(loop)
class MCPClientWrapper:
def __init__(self):
self.session = None
self.exit_stack = None
self.tools = []
def connect(self, server_url: str) -> str:
return loop.run_until_complete(self._connect(server_url))
async def _connect(self, server_url: str) -> str:
if self.exit_stack:
await self.exit_stack.aclose()
self.exit_stack = AsyncExitStack()
# Utiliser le transport HTTP streamable ou SSE selon ce qui est disponible
streams = await self.exit_stack.enter_async_context(streamablehttp_client(url=server_url))
# streams va typiquement donner une paire (transport_read, transport_write) ou similaire
self.http_read, self.http_write = streams
self.session = await self.exit_stack.enter_async_context(ClientSession(self.http_read, self.http_write))
await self.session.initialize()
tools_response = await self.session.list_tools()
self.tools = [
{
"name": t.name,
"description": t.description,
"input_schema": t.inputSchema
}
for t in tools_response.tools
]
tool_names = [t["name"] for t in self.tools]
return f"Connecté au MCP {server_url}. Outils disponibles : {', '.join(tool_names)}"
clientMCP = MCPClientWrapper()
print(clientMCP.connect("https://huggingface.co/spaces/HackathonCRA/mcp"))
print(clientMCP.tools)
# Chatbot
def chatbot(message, history):
# Préparer l’historique
messages = []
for user_msg, bot_msg in history:
messages.append({"role": "user", "content": user_msg})
messages.append({"role": "assistant", "content": bot_msg})
messages.append({"role": "user", "content": message})
# Appel API Mistral
response = clientLLM.chat.completions.create(
model="mistral-small-latest",
messages=messages,
tools=clientMCP.tools # ⚡ maintenant on injecte directement les tools MCP récupérés
)
bot_reply = response.choices[0].message.content.strip()
history.append(("Vous: " + message, "Bot: " + bot_reply))
return history, history
with gr.Blocks() as demo:
chatbot_ui = gr.Chatbot(label="ChatBot")
msg = gr.Textbox(placeholder="Écrivez un message...")
msg.submit(chatbot, [msg, chatbot_ui], [chatbot_ui, chatbot_ui])
demo.launch(debug=True)