import streamlit as st from PIL import Image import io import base64 import uuid # Assuming google.generativeai as genai is the correct import based on your description import google.generativeai as genai # Configure the API key (should be set as an environment variable or secure storage in production) api_key = "AIzaSyC70u1sN87IkoxOoIj4XCAPw97ae2LZwNM" # Replace with your actual API key genai.configure(api_key=api_key) generation_config = genai.GenerationConfig( temperature=0.9, max_output_tokens=3000 ) safety_settings = [] # Initialize session state for chat history and file uploader key if 'chat_history' not in st.session_state: st.session_state['chat_history'] = [] if 'file_uploader_key' not in st.session_state: st.session_state['file_uploader_key'] = str(uuid.uuid4()) # UI layout st.title("Gemini Chatbot") # Function to convert image to base64 def get_image_base64(image): image = image.convert("RGB") # Convert to RGB to remove alpha channel if present buffered = io.BytesIO() image.save(buffered, format="JPEG") img_str = base64.b64encode(buffered.getvalue()).decode() return img_str # Function to send message and clear input def send_message(): user_input = st.session_state.user_input uploaded_files = st.session_state.uploaded_files if user_input or uploaded_files: # Save user input to the chat history if user_input: st.session_state['chat_history'].append({"role": "user", "parts": [{"text": user_input}]}) # Process uploaded images image_prompts = [] if uploaded_files: for uploaded_file in uploaded_files: image = Image.open(uploaded_file).convert("RGB") # Ensure image is in RGB image_base64 = get_image_base64(image) image_prompt = {"role": "user", "parts": [{"mime_type": uploaded_file.type, "data": image_base64}]} image_prompts.append(image_prompt) st.session_state['chat_history'].extend(image_prompts) # Choose the appropriate model based on the input type model_name = 'gemini-pro-vision' if uploaded_files else 'gemini-pro' model = genai.GenerativeModel( model_name=model_name, generation_config=generation_config, safety_settings=safety_settings ) # Generate the response response = model.generate_content(st.session_state['chat_history']) response_text = response.text if hasattr(response, "text") else "No response text found." st.session_state['chat_history'].append({"role": "model", "parts": [{"text": response_text}]}) # Clear the user input and generate a new key for the file uploader widget to reset it st.session_state.user_input = '' st.session_state.file_uploader_key = str(uuid.uuid4()) # Multiline text input for the user to send messages user_input = st.text_area("Enter your message here:", key="user_input", value="") # File uploader for images uploaded_files = st.file_uploader( "Upload images:", type=["png", "jpg", "jpeg"], accept_multiple_files=True, key=st.session_state.file_uploader_key ) # Button to send the message send_button = st.button("Send", on_click=send_message) # Display the chat history for entry in st.session_state['chat_history']: role = entry["role"] parts = entry["parts"][0] if 'text' in parts: st.markdown(f"**{role.title()}**: {parts['text']}") elif 'data' in parts: st.markdown(f"**{role.title()}**: (Image)") # Ensure the file_uploader widget state is tied to the randomly generated key st.session_state.uploaded_files = uploaded_files