chatbot2 / app.py
Reshmarb's picture
modified
0c0aaee
raw
history blame
5.65 kB
from groq import Groq
import gradio as gr
from gtts import gTTS
import uuid
import base64
from io import BytesIO
import os
import logging
# Set up logger
logger = logging.getLogger(__name__)
logger.setLevel(logging.DEBUG)
console_handler = logging.StreamHandler()
file_handler = logging.FileHandler('chatbot_log.log')
formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
console_handler.setFormatter(formatter)
file_handler.setFormatter(formatter)
logger.addHandler(console_handler)
logger.addHandler(file_handler)
# Initialize Groq Client
client = Groq(api_key=os.getenv("GROQ_API_KEY_2"))
# Function to encode the image
def encode_image(uploaded_image):
try:
logger.debug("Encoding image...")
buffered = BytesIO()
uploaded_image.save(buffered, format="PNG") # Ensure the correct format
logger.debug("Image encoding complete.")
return base64.b64encode(buffered.getvalue()).decode("utf-8")
except Exception as e:
logger.error(f"Error encoding image: {e}")
raise
# Function to handle text and image inputs
def customLLMBot(user_input, uploaded_image, chat_history):
try:
logger.info("Processing input...")
# Append user input to the chat history
chat_history.append((user_input, None))
if uploaded_image is not None:
# Encode the image to base64
base64_image = encode_image(uploaded_image)
# Log the image size and type
logger.debug(f"Image received, size: {len(base64_image)} bytes")
# Create a message specifically for image prompts
messages = [
{
"role": "user",
"content": [
{"type": "text", "text": "What's in this image?"},
{"type": "image_url", "image_url": {"url": f"data:image/png;base64,{base64_image}"}}
]
}
]
logger.info("Sending image to Groq API for processing...")
# Send the image message to the Groq API
response = client.chat.completions.create(
model="llama-3.2-11b-vision-preview",
messages=messages,
)
logger.info("Image processed successfully.")
else:
# Process text input
logger.info("Processing text input...")
messages = [
{"role": "system", "content": "You are Dr. HealthBuddy, a professional virtual doctor chatbot."},
{"role": "user", "content": user_input},
]
response = client.chat.completions.create(
model="llama-3.2-11b-vision-preview",
messages=messages,
)
logger.info("Text processed successfully.")
# Extract the reply
LLM_reply = response.choices[0].message.content
logger.debug(f"LLM reply: {LLM_reply}")
# Append the bot's response to the chat history
chat_history[-1] = (user_input, LLM_reply)
# Generate audio for response
audio_file = f"response_{uuid.uuid4().hex}.mp3"
tts = gTTS(LLM_reply, lang='en')
tts.save(audio_file)
logger.info(f"Audio response saved as {audio_file}")
# Return chat history and audio file
return chat_history, audio_file
except Exception as e:
# Handle errors gracefully
logger.error(f"Error in customLLMBot function: {e}")
return [(user_input, f"An error occurred: {e}")], None
# Gradio Interface
def chatbot_ui():
chat_history = [] # Initialize empty chat history
with gr.Blocks() as demo:
gr.Markdown("# Healthcare Chatbot Doctor")
# Layout for chatbot and input box alignment
with gr.Row():
with gr.Column(scale=3): # Main column for chatbot
chatbot = gr.Chatbot(label=None, elem_id="chatbot").style(
align_self_right=True,
align_self_left=False,
match=False,
)
user_input = gr.Textbox(
label="Ask a health-related question",
placeholder="Describe your symptoms...",
elem_id="user-input",
lines=1,
)
with gr.Column(scale=1): # Side column for image and buttons
uploaded_image = gr.Image(label="Upload an Image", type="pil")
submit_btn = gr.Button("Submit")
clear_btn = gr.Button("Clear")
audio_output = gr.Audio(label="Audio Response")
# Define actions
def handle_submit(user_query, image):
logger.info("User submitted a query.")
response, audio = customLLMBot(user_query, image, chat_history)
return response, audio, ""
# Submit on pressing Enter key
user_input.submit(
handle_submit,
inputs=[user_input, uploaded_image],
outputs=[chatbot, audio_output, user_input],
)
# Submit on button click
submit_btn.click(
handle_submit,
inputs=[user_input, uploaded_image],
outputs=[chatbot, audio_output, user_input],
)
# Action for clearing all fields
clear_btn.click(
lambda: ([], "", None, None),
inputs=[],
outputs=[chatbot, user_input, uploaded_image, audio_output],
)
return demo
# Launch the interface
chatbot_ui().launch(server_name="0.0.0.0", server_port=7860)