import gradio as gr from transformers import BlipProcessor, BlipForConditionalGeneration from PIL import Image from groq import Groq from config import GROQ_API_KEY, MODEL_NAME # === Load BLIP image captioning model === processor = BlipProcessor.from_pretrained("Salesforce/blip-image-captioning-base") model = BlipForConditionalGeneration.from_pretrained("Salesforce/blip-image-captioning-base") # === Initialize Groq client === client = Groq(api_key=GROQ_API_KEY) # === Function to describe image using BLIP === def describe_image(image: Image.Image): try: inputs = processor(images=image, return_tensors="pt") out = model.generate(**inputs) description = processor.decode(out[0], skip_special_tokens=True) return description except Exception as e: return f"Error describing the image: {e}" # === Generate response from Groq === def generate_response(user_input): try: response = client.chat.completions.create( messages=[{"role": "user", "content": user_input}], model=MODEL_NAME, ) return response.choices[0].message.content except Exception as e: return f"Error from Groq: {e}" # === Chatbot logic === def chat(user_input, chat_history, image): try: ai_reply = generate_response(user_input) if image is not None: image_description = describe_image(image) ai_reply += f"\n\n[Image Description]: {image_description}" chat_history.append(("User", user_input)) chat_history.append(("AI", ai_reply)) formatted = "\n".join([f"{role}: {msg}" for role, msg in chat_history]) return formatted, chat_history except Exception as e: return f"Error: {e}", chat_history # === Gradio Interface === with gr.Blocks(css=""" .gradio-container { font-family: 'Segoe UI', sans-serif; background-color: #f5f5f5; padding: 20px; } #chatbox { height: 300px; overflow-y: auto; background-color: #ffffff; border: 1px solid #ccc; border-radius: 10px; padding: 15px; font-size: 14px; line-height: 1.5; } """) as demo: gr.Markdown("## 🤖 **Groq-powered Chatbot with Image Understanding (BLIP)**") gr.Markdown("Chat with the bot or upload an image to get a caption.") with gr.Column(): user_input = gr.Textbox(label="Your Message", placeholder="Ask something...", lines=2) submit_button = gr.Button("Send") clear_button = gr.Button("Clear Chat") chatbot_output = gr.Textbox(label="Chat History", lines=12, interactive=False, elem_id="chatbox") image_input = gr.Image(label="Upload an Image", type="pil", elem_id="image-upload") upload_button = gr.Button("Describe Image") image_caption = gr.Textbox(label="Image Description", interactive=False) chat_history = gr.State([]) submit_button.click(fn=chat, inputs=[user_input, chat_history, image_input], outputs=[chatbot_output, chat_history]) clear_button.click(fn=lambda: ("", []), inputs=[], outputs=[chatbot_output, chat_history]) upload_button.click(fn=describe_image, inputs=[image_input], outputs=[image_caption]) # === Launch the app === if __name__ == "__main__": demo.launch()