from PIL import Image import google.generativeai as genai import streamlit as st import time import random from utils import SAFETY_SETTTINGS st.set_page_config( page_title="Chat with Gemini-Pro Vision", page_icon="🔥", menu_items={ 'About': "Forked from https://github.com/hiliuxg/geminichat" } ) st.title('Upload Image') if "app_key" not in st.session_state: app_key = st.text_input("Your Gemini App Key", type='password') if app_key: st.session_state.app_key = app_key try: genai.configure(api_key = st.session_state.app_key) model = genai.GenerativeModel('gemini-pro-vision') except AttributeError as e: st.warning("Please Add Your Gemini App Key.") def show_message(prompt, image, loading_str): with st.chat_message("assistant"): message_placeholder = st.empty() message_placeholder.markdown(loading_str) full_response = "" try: for chunk in model.generate_content([prompt, image], stream = True, safety_settings = SAFETY_SETTTINGS): word_count = 0 random_int = random.randint(5, 10) for word in chunk.text: full_response += word word_count += 1 if word_count == random_int: time.sleep(0.05) message_placeholder.markdown(full_response + "_") word_count = 0 random_int = random.randint(5, 10) except genai.types.generation_types.BlockedPromptException as e: st.exception(e) except Exception as e: st.exception(e) message_placeholder.markdown(full_response) st.session_state.history_pic.append({"role": "assistant", "text": full_response}) def clear_state(): st.session_state.history_pic = [] if "history_pic" not in st.session_state: st.session_state.history_pic = [] image = None if "app_key" in st.session_state: uploaded_file = st.file_uploader("choose a pic...", type=["jpg", "png", "jpeg", "gif"], label_visibility='collapsed', on_change = clear_state) if uploaded_file is not None: image = Image.open(uploaded_file) width, height = image.size resized_img = image.resize((128, int(height/(width/128))), Image.LANCZOS) st.image(image) if len(st.session_state.history_pic) > 0: for item in st.session_state.history_pic: with st.chat_message(item["role"]): st.markdown(item["text"]) if "app_key" in st.session_state: if prompt := st.chat_input("desc this picture"): if image is None: st.warning("Please upload an image first", icon="⚠️") else: prompt = prompt.replace('\n', ' \n') with st.chat_message("user"): st.markdown(prompt) st.session_state.history_pic.append({"role": "user", "text": prompt}) show_message(prompt, resized_img, "Thinking...")