renesas_chatbot / app.py
arjunanand13's picture
Update app.py
797a9c7 verified
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",
model="gpt-4o-mini" ,
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
)
# PDF example right under PDF controls
gr.Examples(
[[os.path.join(os.path.dirname(__file__), "renesas-ra6m1-group-datasheet.pdf")]],
inputs=[pdf_input],
label="Example PDF"
)
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=""
)
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")
# Example applications section
gr.Markdown("### Example Applications")
gr.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 Queries"
)
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)