import os import time import uuid from typing import List, Tuple, Optional, Dict, Union import google.generativeai as genai import streamlit as st from PIL import Image # Database setup conn = sqlite3.connect('chat_history.db') c = conn.cursor() c.execute(''' CREATE TABLE IF NOT EXISTS history (role TEXT, message TEXT) ''') # Generative AI setup api_key = "AIzaSyC70u1sN87IkoxOoIj4XCAPw97ae2LZwNM" genai.configure(api_key=api_key) generation_config = { "temperature": 0.9, "max_output_tokens": 3000 } safety_settings = [] # Streamlit UI st.set_page_config(page_title="Chatbot", page_icon="🤖") # Header st.markdown("""

Chatbot

""", unsafe_allow_html=True) # Sidebar st.sidebar.title("Parameters") temperature = st.sidebar.slider( "Temperature", min_value=0.0, max_value=1.0, value=0.9, step=0.01, help="Temperature controls the degree of randomness in token selection. Lower temperatures are good for prompts that expect a true or correct response, while higher temperatures can lead to more diverse or unexpected results." ) max_output_tokens = st.sidebar.slider( "Token limit", min_value=1, max_value=2048, value=3000, step=1, help="Token limit determines the maximum amount of text output from one prompt. A token is approximately four characters. The default value is 2048." ) st.sidebar.title("Model") model_name = st.sidebar.selectbox( "Select a model", options=["gemini-pro", "gemini-pro-vision"], index=0, help="Gemini Pro is a text-only model that can generate natural language responses based on the chat history. Gemini Pro Vision is a multimodal model that can generate natural language responses based on the chat history and the uploaded images." ) model_info = st.sidebar.expander("Model info", expanded=False) with model_info: st.markdown(f""" - Model name: {model_name} - Model size: {genai.get_model_size(model_name)} - Model description: {genai.get_model_description(model_name)} """) # Chat history st.title("Chatbot") chat_history = st.session_state.get("chat_history", []) if len(chat_history) % 2 == 0: role = "user" else: role = "model" for message in chat_history: r, t = message["role"], message["parts"][0]["text"] st.markdown(f"**{r.title()}:** {t}") # User input user_input = st.text_area("", height=5, key="user_input") # Image uploader uploaded_files = st.image_uploader("Upload images here or paste screenshots", type=["png", "jpg", "jpeg"], accept_multiple_files=True, key="uploaded_files") # Run button run_button = st.button("Run", key="run_button") # Clear button clear_button = st.button("Clear", key="clear_button") # Download button download_button = st.button("Download", key="download_button") # Progress bar progress_bar = st.progress(0) # Footer st.markdown(""" """, unsafe_allow_html=True) # Clear chat history and image uploader if clear_button: chat_history.clear() st.session_state["chat_history"] = chat_history st.session_state["user_input"] = "" st.session_state["uploaded_files"] = None st.experimental_rerun() # Save chat history to a text file if download_button: chat_text = "\n".join([f"{r.title()}: {t}" for r, t in chat_history]) st.download_button( label="Download chat history", data=chat_text, file_name="chat_history.txt", mime="text/plain" ) # Generate model response if run_button or user_input: if user_input: chat_history.append({"role": role, "parts": [{"text": user_input}]}) st.session_state["user_input"] = "" if role == "user": # Model code model = genai.GenerativeModel( model_name=model_name, generation_config=generation_config, safety_settings=safety_settings ) if uploaded_files: # Preprocess the uploaded images and convert them to image_parts image_parts = [] for uploaded_file in uploaded_files: image = Image.open(uploaded_file).convert('RGB') image_parts.append({ "mime_type": uploaded_file.type, "data": uploaded_file.read() }) # Display the uploaded images st.image(image) # Add the user input to the prompt_parts prompt_parts = [ user_input, ] + image_parts # Use gemini-pro-vision model to generate the response response = model.generate_content(prompt_parts, stream=True) else: # Use gemini-pro model to generate the response response = model.generate_content(chat_history, stream=True) # Streaming effect chat_history.append({"role": "model", "parts": [{"text": ""}]}) progress_bar.progress(0) for chunk in response: for i in range(0, len(chunk.text), 10): section = chunk.text[i:i + 10] chat_history[-1]["parts"][0]["text"] += section progress = min((i + 10) / len(chunk.text), 1.0) progress_bar.progress(progress) time.sleep(0.01) st.experimental_rerun() progress_bar.progress(1.0) st.session_state["chat_history"] = chat_history st.session_state["uploaded_files"] = None st.experimental_rerun()