import gradio as gr from chatbot_simulator import ChatbotSimulation from task_specific_data_population import DataPopulation import os openai_api_key = os.getenv("OPENAI_API_KEY") class AppSimulator: def __init__(self, openai_api_key): self.simulation = None self.conversation = [] # Stores full conversation for logging self.display_conversation = [] # Stores last 2 messages for display self.openai_api_key = openai_api_key def initialize_simulator(self, task, app_name, sitemap): """Initialize the simulator with retries in case of failure.""" success = False retry_count = 0 max_retries = 50 while not success and retry_count < max_retries: try: # Process data data_population = DataPopulation(api_key=self.openai_api_key) sitemap_data, page_details, user_state = data_population.process_data(task, sitemap) self.simulation = ChatbotSimulation( site_map=sitemap_data, page_details=page_details, user_state=user_state, task=task, app_name=app_name, log_location=f'conversation_log_{app_name}_human.txt', openai_api_key=self.openai_api_key, agent='human' ) # Start the conversation and update the logs and display text = self.simulation.start_conversation() self._log_message("assistant", text) self.display_conversation = [('Start Simulator', text)] return self.display_conversation except Exception as e: retry_count += 1 print(f"Attempt {retry_count}/{max_retries}: An error occurred: {e}. Retrying...") def chatbot_interaction(self, user_input): """Handle one round of conversation.""" if self.simulation is None: return [("system", "Simulation is not initialized. Please start the simulator.")] try: # Get the response from the simulator response = self.simulation.one_conversation_round(user_input) # Log both user input and assistant's response self._log_message("user", user_input) self._log_message("assistant", response) # Update display conversation (keep last 2 entries) self.display_conversation.extend([(user_input, response)]) while len(self.display_conversation) > 2: self.display_conversation.pop(0) print(len(self.display_conversation)) return self.display_conversation except Exception as e: return [("system", f"An error occurred: {e}")] def _log_message(self, role, content): """Log conversation messages to both memory and file.""" self.conversation.append({"role": role, "content": content}) self._write_log_to_file(content) def _write_log_to_file(self, content): """Append conversation to a log file.""" log_location = self.simulation.log_location if self.simulation else "conversation_log.txt" try: with open(log_location, 'a') as f: for message in self.conversation: f.write(f"{message['role']}: {message['content']}\n\n") except Exception as e: print(f"Error logging conversation: {e}") # JavaScript function to refresh theme to dark mode js_func = """ function refresh() { const url = new URL(window.location); if (url.searchParams.get('__theme') !== 'dark') { url.searchParams.set('__theme', 'dark'); window.location.href = url.href; } } """ simulator_app = AppSimulator(openai_api_key=openai_api_key) # Gradio Interface with gr.Blocks(js=js_func) as demo: gr.Markdown("## Simulator Setup") task_input = gr.Textbox(label="Task", placeholder="Describe your task...") app_name_input = gr.Textbox(label="App Name", placeholder="Enter the app name...") sitemap_input = gr.Textbox(label="Sitemap", placeholder="Enter the Hugging Face link to sitemap...") initialize_button = gr.Button("Initialize Simulator") chatbot = gr.Chatbot(label="Simulator Chat", height=800) user_message = gr.Textbox(label="Enter your message", placeholder="Type your message here...") submit_button = gr.Button("Send") # Initialize simulator and display the welcome message initialize_button.click( simulator_app.initialize_simulator, inputs=[task_input, app_name_input, sitemap_input], outputs=chatbot ) # Handle conversation interaction submit_button.click( simulator_app.chatbot_interaction, inputs=user_message, outputs=chatbot ) # Launch the Gradio app demo.launch()