ChatBot / app.py
Eddyhzd
test
c548a89
Raw
History Blame Contribute Delete
2.89 kB
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)