Spaces:
Runtime error
Runtime error
Commit
·
326cdbe
1
Parent(s):
e2815a3
Update app.py
Browse files
app.py
CHANGED
|
@@ -23,8 +23,8 @@ if 'chat_history' not in st.session_state:
|
|
| 23 |
st.session_state['chat_history'] = []
|
| 24 |
if 'file_uploader_key' not in st.session_state:
|
| 25 |
st.session_state['file_uploader_key'] = str(uuid.uuid4())
|
| 26 |
-
if '
|
| 27 |
-
st.session_state['
|
| 28 |
|
| 29 |
# UI layout
|
| 30 |
st.title("Gemini Chatbot")
|
|
@@ -41,29 +41,39 @@ def get_image_base64(image):
|
|
| 41 |
def clear_conversation():
|
| 42 |
st.session_state['chat_history'] = []
|
| 43 |
st.session_state['file_uploader_key'] = str(uuid.uuid4())
|
| 44 |
-
st.session_state['
|
| 45 |
|
| 46 |
# Function to send message and clear input
|
| 47 |
def send_message():
|
| 48 |
user_input = st.session_state.user_input
|
| 49 |
uploaded_files = st.session_state.uploaded_files
|
| 50 |
|
| 51 |
-
#
|
| 52 |
-
|
| 53 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 54 |
|
| 55 |
-
#
|
| 56 |
-
prompts = []
|
| 57 |
if user_input:
|
| 58 |
-
|
| 59 |
-
|
| 60 |
-
|
|
|
|
| 61 |
if uploaded_files:
|
| 62 |
for uploaded_file in uploaded_files:
|
| 63 |
-
|
| 64 |
-
|
| 65 |
-
|
| 66 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 67 |
|
| 68 |
# Use the appropriate model for interaction
|
| 69 |
model = genai.GenerativeModel(
|
|
@@ -71,19 +81,34 @@ def send_message():
|
|
| 71 |
generation_config=generation_config,
|
| 72 |
safety_settings=safety_settings
|
| 73 |
)
|
| 74 |
-
|
|
|
|
|
|
|
| 75 |
response_text = response.text if hasattr(response, "text") else "No response text found."
|
| 76 |
-
|
| 77 |
-
#
|
| 78 |
-
|
| 79 |
-
st.session_state['chat_history'].append(
|
| 80 |
-
st.session_state['chat_history'].append({"role": "model", "parts": [{"text": response_text}]})
|
| 81 |
|
| 82 |
# Clear the user input and reset the file uploader widget
|
| 83 |
st.session_state.user_input = ''
|
| 84 |
st.session_state.uploaded_files = []
|
| 85 |
st.session_state.file_uploader_key = str(uuid.uuid4())
|
| 86 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 87 |
# Multiline text input for the user to send messages
|
| 88 |
user_input = st.text_area("Enter your message here:", key="user_input")
|
| 89 |
|
|
@@ -101,15 +126,5 @@ send_button = st.button("Send", on_click=send_message)
|
|
| 101 |
# Button to clear the conversation
|
| 102 |
clear_button = st.button("Clear Conversation", on_click=clear_conversation)
|
| 103 |
|
| 104 |
-
# Display the chat history
|
| 105 |
-
for entry in st.session_state['chat_history']:
|
| 106 |
-
role = entry["role"]
|
| 107 |
-
parts = entry["parts"][0]
|
| 108 |
-
if 'text' in parts:
|
| 109 |
-
st.markdown(f"{role.title()}: {parts['text']}")
|
| 110 |
-
elif 'data' in parts:
|
| 111 |
-
# Display the image
|
| 112 |
-
st.image(Image.open(io.BytesIO(base64.b64decode(parts['data']))), caption='Uploaded Image')
|
| 113 |
-
|
| 114 |
# Ensure the file_uploader widget state is tied to the randomly generated key
|
| 115 |
st.session_state.uploaded_files = uploaded_files
|
|
|
|
| 23 |
st.session_state['chat_history'] = []
|
| 24 |
if 'file_uploader_key' not in st.session_state:
|
| 25 |
st.session_state['file_uploader_key'] = str(uuid.uuid4())
|
| 26 |
+
if 'use_vision_model' not in st.session_state:
|
| 27 |
+
st.session_state['use_vision_model'] = False
|
| 28 |
|
| 29 |
# UI layout
|
| 30 |
st.title("Gemini Chatbot")
|
|
|
|
| 41 |
def clear_conversation():
|
| 42 |
st.session_state['chat_history'] = []
|
| 43 |
st.session_state['file_uploader_key'] = str(uuid.uuid4())
|
| 44 |
+
st.session_state['use_vision_model'] = False
|
| 45 |
|
| 46 |
# Function to send message and clear input
|
| 47 |
def send_message():
|
| 48 |
user_input = st.session_state.user_input
|
| 49 |
uploaded_files = st.session_state.uploaded_files
|
| 50 |
|
| 51 |
+
# If images are uploaded, switch to using the vision model
|
| 52 |
+
if uploaded_files:
|
| 53 |
+
st.session_state['use_vision_model'] = True
|
| 54 |
+
|
| 55 |
+
# Prepare the prompt with chat history for the vision model
|
| 56 |
+
chat_history_str = "\n".join(
|
| 57 |
+
part['text'] for entry in st.session_state['chat_history'] for part in entry['parts'] if 'text' in part
|
| 58 |
+
)
|
| 59 |
|
| 60 |
+
# If there is text input, add it to the chat history string
|
|
|
|
| 61 |
if user_input:
|
| 62 |
+
chat_history_str += f"\n{user_input}"
|
| 63 |
+
st.session_state['chat_history'].append({"role": "user", "parts": [{"text": user_input}]})
|
| 64 |
+
|
| 65 |
+
# Add uploaded images to chat history string and session state
|
| 66 |
if uploaded_files:
|
| 67 |
for uploaded_file in uploaded_files:
|
| 68 |
+
base64_image = get_image_base64(Image.open(uploaded_file))
|
| 69 |
+
chat_history_str += f"\n[Image]"
|
| 70 |
+
st.session_state['chat_history'].append({
|
| 71 |
+
"role": "user",
|
| 72 |
+
"parts": [{"mime_type": uploaded_file.type, "data": base64_image}]
|
| 73 |
+
})
|
| 74 |
+
|
| 75 |
+
# Determine which model to use based on whether an image has been uploaded
|
| 76 |
+
model_name = 'gemini-pro-vision' if st.session_state['use_vision_model'] else 'gemini-pro'
|
| 77 |
|
| 78 |
# Use the appropriate model for interaction
|
| 79 |
model = genai.GenerativeModel(
|
|
|
|
| 81 |
generation_config=generation_config,
|
| 82 |
safety_settings=safety_settings
|
| 83 |
)
|
| 84 |
+
|
| 85 |
+
# Generate content from the chat history or the latest prompt
|
| 86 |
+
response = model.generate_content([{"role": "user", "parts": [{"text": chat_history_str}]}])
|
| 87 |
response_text = response.text if hasattr(response, "text") else "No response text found."
|
| 88 |
+
|
| 89 |
+
# Display the model response
|
| 90 |
+
if response_text:
|
| 91 |
+
st.session_state['chat_history'].append({"role": "model", "parts": [{"text": response_text}]})
|
|
|
|
| 92 |
|
| 93 |
# Clear the user input and reset the file uploader widget
|
| 94 |
st.session_state.user_input = ''
|
| 95 |
st.session_state.uploaded_files = []
|
| 96 |
st.session_state.file_uploader_key = str(uuid.uuid4())
|
| 97 |
|
| 98 |
+
# Display chat history
|
| 99 |
+
display_chat_history()
|
| 100 |
+
|
| 101 |
+
# Function to display the chat history
|
| 102 |
+
def display_chat_history():
|
| 103 |
+
for entry in st.session_state['chat_history']:
|
| 104 |
+
role = entry["role"]
|
| 105 |
+
parts = entry["parts"][0]
|
| 106 |
+
if 'text' in parts:
|
| 107 |
+
st.markdown(f"{role.title()}: {parts['text']}")
|
| 108 |
+
elif 'data' in parts:
|
| 109 |
+
# Display the image
|
| 110 |
+
st.image(Image.open(io.BytesIO(base64.b64decode(parts['data']))), caption='Uploaded Image')
|
| 111 |
+
|
| 112 |
# Multiline text input for the user to send messages
|
| 113 |
user_input = st.text_area("Enter your message here:", key="user_input")
|
| 114 |
|
|
|
|
| 126 |
# Button to clear the conversation
|
| 127 |
clear_button = st.button("Clear Conversation", on_click=clear_conversation)
|
| 128 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 129 |
# Ensure the file_uploader widget state is tied to the randomly generated key
|
| 130 |
st.session_state.uploaded_files = uploaded_files
|