from openai import AsyncAssistantEventHandler from openai import AsyncOpenAI import gradio as gr import asyncio import os # set the keys client = AsyncOpenAI( api_key=os.getenv("OPENAI_API_KEY") ) assistantID = os.getenv("OPENAI_ASSISTANT_ID") mypassword = os.getenv("RTL_PASSWORD") class EventHandler(AsyncAssistantEventHandler): def __init__(self) -> None: super().__init__() self.response_text = "" async def on_text_created(self, text) -> None: self.response_text += str(text) async def on_text_delta(self, delta, snapshot): self.response_text += str(delta.value) async def on_text_done(self, text): pass async def on_tool_call_created(self, tool_call): self.response_text += f"\n[Tool Call]: {str(tool_call.type)}\n" async def on_tool_call_delta(self, delta, snapshot): if snapshot.id != getattr(self, "current_tool_call", None): self.current_tool_call = snapshot.id self.response_text += f"\n[Tool Call Delta]: {str(delta.type)}\n" if delta.type == 'code_interpreter': if delta.code_interpreter.input: self.response_text += str(delta.code_interpreter.input) if delta.code_interpreter.outputs: self.response_text += "\n\n[Output]:\n" for output in delta.code_interpreter.outputs: if output.type == "logs": self.response_text += f"\n{str(output.logs)}" async def on_tool_call_done(self, text): pass # Initialize session variables session_data = {"assistant_id": assistantID, "thread_id": None} async def initialize_thread(): # Create a Thread thread = await client.beta.threads.create() # Store thread ID in session_data for later use session_data["thread_id"] = thread.id async def generate_response(user_input): if user_input == "": yield "Veuillez soumettre une question !" else: assistant_id = session_data["assistant_id"] thread_id = session_data["thread_id"] # Add a Message to the Thread oai_message = await client.beta.threads.messages.create( thread_id=thread_id, role="user", content=user_input ) # Create and Stream a Run event_handler = EventHandler() async with client.beta.threads.runs.stream( thread_id=thread_id, assistant_id=assistant_id, instructions="Please assist the user with their query.", event_handler=event_handler, ) as stream: # Yield incremental updates async for _ in stream: await asyncio.sleep(0.1) # Small delay to mimic streaming yield event_handler.response_text # Gradio interface function (generator) async def gradio_chat_interface(mode, password, user_input, example): if mode == "Exemples": filename = example[-6:-2] + ".md" file = open("examples/" + filename, "r") output = file.read() yield output else: # check the password if password == "": yield "Pour faire des recherches vous devez entrer un mot de passe !" elif password != mypassword: yield "Veuillez entrer le mot de passe correct !" else: # Create a new event loop if none exists (or if we are in a new thread) try: loop = asyncio.get_running_loop() except RuntimeError: loop = asyncio.new_event_loop() asyncio.set_event_loop(loop) # Initialize the thread if not already done if session_data["thread_id"] is None: await initialize_thread() # Generate and yield responses async for response in generate_response(user_input): yield response with gr.Blocks() as demo: with gr.Row(): myTitle = gr.HTML("
🐶 🏃🏻♂️ 🌗 🍇 🌈 🍽️ 🏆 🚘 ✈️ 🩺
Veuillez soumettre votre question en français ou dans une autre langue !
""" ) with gr.Row(): mode = gr.Radio(choices=["Recherche", "Exemples"], label = "Vous pouvez lire les exemples sans mots de passe !", value = "Exemples") pw = gr.Textbox(lines=1, label="Veuillez entrer le mot de passe :") with gr.Row(): question = gr.Textbox(lines=3, label="Veuillez soumettre votre question :") with gr.Row(): examples = gr.Radio(["Prière d'établir la liste des meilleurs sportifs luxembourgeois votés par le public entre 2014 et 2023 !", "Quelle évolution a eu lieu dans le domaine de la protection de la nature pendant les dix dernières années ?"], value="Prière d'établir la liste des meilleurs sportifs luxembourgeois votés par le public entre 2014 et 2023 !", label="Exemples") with gr.Row(): clear = gr.Button("Clear") submit = gr.Button("Submit") with gr.Row(): mySubtitle = gr.HTML("French RTL News :
") with gr.Row(): myOutput = gr.Markdown(label="Réponses de l'assistant OpenAI File-Search :") submit.click(fn = gradio_chat_interface, inputs=[mode, pw, question, examples], outputs = myOutput) demo.launch()