File size: 6,654 Bytes
221a628
b557897
 
 
eabca2c
dfb90bd
b557897
2c4cf73
ab73386
4598a68
23ed2c1
dfb90bd
2c4cf73
6e074fc
221a628
dfb90bd
dfdbfa8
 
d5a9ec5
dfdbfa8
221a628
dfb90bd
 
ccf48ce
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
837873a
dfb90bd
ce73371
 
eabca2c
 
b557897
d5a9ec5
b557897
d5a9ec5
221a628
2c4cf73
d5a9ec5
2c4cf73
ab73386
 
 
d5a9ec5
db9bdff
 
 
dfdbfa8
40e8df5
ce73371
40e8df5
 
dfb90bd
db9bdff
 
50b3dd7
 
497bd07
50b3dd7
497bd07
50b3dd7
 
 
7fd1c6d
497bd07
50b3dd7
497bd07
50b3dd7
 
 
 
db9bdff
 
50b3dd7
 
dfb90bd
d5a9ec5
4479cfb
eabca2c
 
36e811b
dfb90bd
d5a9ec5
94fea6c
36e811b
d5a9ec5
94fea6c
 
 
 
ab73386
db9bdff
 
 
 
ab73386
4598a68
4479cfb
 
7fd1c6d
4479cfb
7fd1c6d
 
d5a9ec5
db9bdff
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
7fd1c6d
dfb90bd
497bd07
9c3f46e
ce73371
50b3dd7
 
dfb90bd
665ff61
4598a68
d5a9ec5
 
 
 
 
 
497bd07
d5a9ec5
 
 
 
 
50b3dd7
d5a9ec5
 
 
389cdce
db9bdff
 
248fc3e
eabca2c
389cdce
 
4598a68
 
 
 
72e6706
4598a68
4479cfb
d5a9ec5
 
665ff61
d5a9ec5
dfb90bd
 
d5a9ec5
e742fb1
 
4af010e
497bd07
 
 
 
 
4af010e
 
497bd07
4af010e
72e6706
e742fb1
d5a9ec5
 
497bd07
2319409
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
import streamlit as st
from PIL import Image
import io
import base64
import uuid
from gtts import gTTS
import google.generativeai as genai
from io import BytesIO
import PyPDF2
from audio_recorder_streamlit import audio_recorder

# Set your API key
api_key = "AIzaSyAHD0FwX-Ds6Y3eI-i5Oz7IdbJqR6rN7pg"  # Replace with your actual API key
genai.configure(api_key=api_key)

# Configure the generative AI model
generation_config = genai.GenerationConfig(
    temperature=0.9,
    max_output_tokens=3000
)

# Safety settings configuration
safety_settings = [
    {
        "category": "HARM_CATEGORY_DANGEROUS_CONTENT",
        "threshold": "BLOCK_NONE",
    },
    {
        "category": "HARM_CATEGORY_SEXUALLY_EXPLICIT",
        "threshold": "BLOCK_NONE",
    },
    {
        "category": "HARM_CATEGORY_HATE_SPEECH",
        "threshold": "BLOCK_NONE",
    },
    {
        "category": "HARM_CATEGORY_HARASSMENT",
        "threshold": "BLOCK_NONE",
    },
]

# Initialize session state
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())

# --- Streamlit UI ---
st.title("Gemini Chatbot")
st.write("Interact with the powerful Gemini 1.5 models.")

# Model Selection Dropdown
selected_model = st.selectbox("Choose a Gemini 1.5 Model:", ["gemini-1.5-flash-latest", "gemini-1.5-pro-latest"])

# TTS Option Checkbox
enable_tts = st.checkbox("Enable Text-to-Speech")

# --- Helper Functions ---
def get_file_base64(file_content, mime_type):
    base64_data = base64.b64encode(file_content).decode()
    return {"mime_type": mime_type, "data": base64_data}

def clear_conversation():
    st.session_state['chat_history'] = []
    st.session_state['file_uploader_key'] = str(uuid.uuid4())

def display_chat_history():
    chat_container = st.empty()
    with chat_container.container():
        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:
                mime_type = parts.get('mime_type', '')
                if mime_type.startswith('image'):
                    st.image(Image.open(io.BytesIO(base64.b64decode(parts['data']))),
                             caption='Uploaded Image', use_column_width=True)
                elif mime_type == 'application/pdf':
                    st.write("**PDF Content:**")
                    pdf_reader = PyPDF2.PdfReader(io.BytesIO(base64.b64decode(parts['data'])))
                    for page_num in range(len(pdf_reader.pages)):
                        page = pdf_reader.pages[page_num]
                        st.write(page.extract_text())
                elif mime_type.startswith('audio'):
                    st.audio(io.BytesIO(base64.b64decode(parts['data'])), format=mime_type)
                elif mime_type.startswith('video'):
                    st.video(io.BytesIO(base64.b64decode(parts['data'])))

# --- Send Message Function ---
def send_message(audio_data=None):
    user_input = st.session_state.user_input
    uploaded_files = st.session_state.uploaded_files
    prompt_parts = []

    # Add user input to the prompt
    if user_input:
        prompt_parts.append({"text": user_input})
        st.session_state['chat_history'].append({"role": "user", "parts": [{"text": user_input}]})

    # Handle uploaded files
    if uploaded_files:
        for uploaded_file in uploaded_files:
            file_content = uploaded_file.read()
            prompt_parts.append(get_file_base64(file_content, uploaded_file.type))
            st.session_state['chat_history'].append(
                {"role": "user", "parts": [get_file_base64(file_content, uploaded_file.type)]}
            )

    # Handle audio data
    if audio_data:
        prompt_parts.append(get_file_base64(audio_data, 'audio/wav'))
        st.session_state['chat_history'].append(
            {"role": "user", "parts": [get_file_base64(audio_data, 'audio/wav')]}
        )

    # Generate response using the selected model
    try:
        model = genai.GenerativeModel(
            model_name=selected_model,
            generation_config=generation_config,
            safety_settings=safety_settings
        )

        response = model.generate_content([{"role": "user", "parts": prompt_parts}])
        response_text = response.text if hasattr(response, "text") else "No response text found."

        if response_text:
            st.session_state['chat_history'].append({"role": "model", "parts": [{"text": response_text}]})
            if enable_tts:
                tts = gTTS(text=response_text, lang='en')
                tts_file = BytesIO()
                tts.write_to_fp(tts_file)
                tts_file.seek(0)
                st.audio(tts_file, format='audio/mp3')

    except Exception as e:
        st.error(f"An error occurred: {e}")

    st.session_state.user_input = ''
    st.session_state.uploaded_files = []
    st.session_state.file_uploader_key = str(uuid.uuid4())

    # Update the chat history display
    display_chat_history()


# --- User Input Area ---
col1, col2 = st.columns([3, 1])
with col1:
    user_input = st.text_area(
        "Enter your message:",
        value="",
        key="user_input"
    )
with col2:
    send_button = st.button(
        "Send",
        on_click=send_message,
        type="primary"
    )

# --- File Uploader ---
uploaded_files = st.file_uploader(
    "Upload Files (Images, Videos, PDFs, MP3):",
    type=["png", "jpg", "jpeg", "mp4", "pdf", "mp3"],
    accept_multiple_files=True,
    key=st.session_state.file_uploader_key
)

# --- Audio Recorder ---
audio_bytes = audio_recorder()
if audio_bytes:
    st.audio(audio_bytes, format="audio/wav")
    if st.button("Send Recording"):
        send_message(audio_data=audio_bytes)

# --- Other Buttons ---
st.button("Clear Conversation", on_click=clear_conversation)

# --- Ensure file_uploader state ---
st.session_state.uploaded_files = uploaded_files

# --- JavaScript for Ctrl+Enter ---
st.markdown(
    """
    <script>
    document.addEventListener('DOMContentLoaded', (event) => {
        document.querySelector('.stTextArea textarea').addEventListener('keydown', function(e) {
            if (e.key === 'Enter' && e.ctrlKey) {
                document.querySelector('.stButton > button').click();
                e.preventDefault();
            }
        });
    });
    </script>
    """,
    unsafe_allow_html=True
)

# --- Display Chat History ---
display_chat_history()