Spaces:
Build error
Build error
| import gradio as gr | |
| import PyPDF2 | |
| import openai | |
| from config import OPENAI_API_KEY | |
| import pandas as pd | |
| import json | |
| import re | |
| import os | |
| openai.api_key = os.getenv("OPENAI_API_KEY") | |
| if not openai.api_key: | |
| try: | |
| openai.api_key = OPENAI_API_KEY | |
| except NameError: | |
| print("API key is not set in the environment or as a variable.") | |
| class PDFChat: | |
| def __init__(self): | |
| self.pdf_text = "" | |
| self.chat_history = [] | |
| self.system_prompt = """You are a knowledgeable assistant specializing in microcontrollers from various manufacturers including but not limited to Renesas, Texas Instruments (TI), and STMicroelectronics (STM). | |
| When comparing microcontrollers, always provide structured data in a JSON format that can be converted to a table. | |
| Focus on key specifications like CPU frequency, memory, peripherals, ADC Resolution, Flash Memory, temperature range, and special features. | |
| Consider all manufacturers' products when making recommendations based on application requirements.""" | |
| def extract_text_from_pdf(self, pdf_file): | |
| if not pdf_file: | |
| return "Please upload a PDF file first." | |
| try: | |
| self.pdf_text = "" | |
| with open(pdf_file.name, "rb") as file: | |
| reader = PyPDF2.PdfReader(file) | |
| for page in reader.pages: | |
| self.pdf_text += page.extract_text() + "\n" | |
| return "PDF loaded successfully! You can now ask questions." | |
| except Exception as e: | |
| return f"Error loading PDF: {str(e)}" | |
| def clear_pdf(self): | |
| self.pdf_text = "" | |
| return "PDF content cleared." | |
| def clear_chat_history(self): | |
| self.chat_history = [] | |
| return "", None | |
| def extract_json_from_text(self, text): | |
| """Extract JSON data from the response text""" | |
| json_match = re.search(r'```json\s*(.*?)\s*```', text, re.DOTALL) | |
| if json_match: | |
| json_str = json_match.group(1) | |
| else: | |
| json_match = re.search(r'({[\s\S]*})', text) | |
| if json_match: | |
| json_str = json_match.group(1) | |
| else: | |
| return None | |
| try: | |
| return json.loads(json_str) | |
| except json.JSONDecodeError: | |
| return None | |
| def answer_question(self, question): | |
| if not question: | |
| return "", None | |
| structured_prompt = """ | |
| Based on the application requirements, recommend suitable microcontrollers and | |
| provide your response in the following JSON format wrapped in ```json ```: | |
| { | |
| "explanation": "Your textual explanation here", | |
| "comparison_table": [ | |
| { | |
| "Feature": "feature name", | |
| "Option1": "value", | |
| "Option2": "value", | |
| ... | |
| }, | |
| ... | |
| ] | |
| } | |
| """ | |
| messages = [ | |
| {"role": "system", "content": self.system_prompt}, | |
| {"role": "system", "content": structured_prompt} | |
| ] | |
| if self.pdf_text: | |
| messages.append({"role": "system", "content": f"PDF Content: {self.pdf_text}"}) | |
| for human, assistant in self.chat_history: | |
| messages.append({"role": "user", "content": human}) | |
| messages.append({"role": "assistant", "content": assistant}) | |
| messages.append({"role": "user", "content": question}) | |
| try: | |
| response = openai.ChatCompletion.create( | |
| model="gpt-4-turbo", | |
| messages=messages | |
| ) | |
| response_text = response.choices[0].message['content'] | |
| json_data = self.extract_json_from_text(response_text) | |
| if json_data and "comparison_table" in json_data: | |
| df = pd.DataFrame(json_data["comparison_table"]) | |
| explanation = json_data.get('explanation', response_text) | |
| self.chat_history.append((question, explanation)) | |
| return explanation, df | |
| else: | |
| self.chat_history.append((question, response_text)) | |
| return response_text, None | |
| except Exception as e: | |
| error_message = f"Error generating response: {str(e)}" | |
| return error_message, None | |
| pdf_chat = PDFChat() | |
| with gr.Blocks() as demo: | |
| gr.Markdown("# Renesas Chatbot") | |
| with gr.Row(): | |
| with gr.Column(scale=1): | |
| gr.Markdown("### PDF Controls") | |
| pdf_input = gr.File( | |
| label="Upload PDF", | |
| file_types=[".pdf"] | |
| ) | |
| with gr.Row(): | |
| load_button = gr.Button("Load PDF") | |
| clear_pdf_button = gr.Button("Clear PDF") | |
| status_text = gr.Textbox( | |
| label="Status", | |
| interactive=False | |
| ) | |
| with gr.Column(scale=2): | |
| gr.Markdown("### Microcontroller Selection Interface") | |
| question_input = gr.Textbox( | |
| label="Briefly describe your target application for controller recommendation", | |
| placeholder="Example: Industrial motor control system with precise temperature monitoring...", | |
| lines=3, | |
| value="" # This will keep the input persistent | |
| ) | |
| explanation_text = gr.Textbox( | |
| label="Explanation", | |
| interactive=False, | |
| lines=4 | |
| ) | |
| table_output = gr.DataFrame( | |
| label="Comparison Table", | |
| interactive=False, | |
| wrap=True | |
| ) | |
| with gr.Row(): | |
| submit_button = gr.Button("Send") | |
| clear_history_button = gr.Button("Clear Chat History") | |
| with gr.Group(): | |
| gr.Markdown("### Example Applications") | |
| gr.Examples( | |
| examples=[ | |
| ["Industrial automation system requiring precise motion control and multiple sensor inputs"], | |
| ["Battery-powered IoT device with wireless connectivity and low power requirements"], | |
| ["High-performance motor control application with real-time processing needs"], | |
| ["Smart building management system with multiple environmental sensors"], | |
| ], | |
| inputs=[question_input], | |
| label="Example Applications" | |
| ) | |
| def handle_question(question): | |
| explanation, df = pdf_chat.answer_question(question) | |
| return explanation, df, question | |
| load_button.click( | |
| pdf_chat.extract_text_from_pdf, | |
| inputs=[pdf_input], | |
| outputs=[status_text] | |
| ) | |
| clear_pdf_button.click( | |
| pdf_chat.clear_pdf, | |
| outputs=[status_text] | |
| ) | |
| clear_history_button.click( | |
| pdf_chat.clear_chat_history, | |
| outputs=[explanation_text, table_output] | |
| ) | |
| question_input.submit( | |
| handle_question, | |
| inputs=[question_input], | |
| outputs=[explanation_text, table_output, question_input] | |
| ) | |
| submit_button.click( | |
| handle_question, | |
| inputs=[question_input], | |
| outputs=[explanation_text, table_output, question_input] | |
| ) | |
| if __name__ == "__main__": | |
| demo.launch(debug=True) |