Spaces:
Running
Running
File size: 9,871 Bytes
56f6374 c878823 cc3fb58 c878823 dd6c9a9 c878823 |
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 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 |
import streamlit as st
import pandas as pd
import google.generativeai as genai
import re
from PIL import Image
import requests
#Je t'aime plus que les mots,
#Plus que les sentiments,
#Plus que la vie elle-même
st.set_page_config(
page_title="Google AI Chat",
page_icon="https://seeklogo.com/images/G/google-ai-logo-996E85F6FD-seeklogo.com.png",
layout="wide",
)
# Path: Main.py
#Author: Sergio Demis Lopez Martinez
#------------------------------------------------------------
#HEADER
st.markdown('''
Powered by Google AI <img src="https://seeklogo.com/images/G/google-ai-logo-996E85F6FD-seeklogo.com.png" width="20" height="20">
, Streamlit and Python''', unsafe_allow_html=True)
st.caption("By Sergio Demis Lopez Martinez")
#------------------------------------------------------------
#LANGUAGE
langcols = st.columns([0.2,0.8])
with langcols[0]:
lang = st.selectbox('Select your language',
('English', 'Español', 'Français', 'Deutsch',
'Italiano', 'Português', 'Polski', 'Nederlands',
'Русский', '日本語', '한국어', '中文', 'العربية',
'हिन्दी', 'Türkçe', 'Tiếng Việt', 'Bahasa Indonesia',
'ภาษาไทย', 'Română', 'Ελληνικά', 'Magyar', 'Čeština',
'Svenska', 'Norsk', 'Suomi', 'Dansk', 'हिन्दी', 'हिन्�'),index=1)
if 'lang' not in st.session_state:
st.session_state.lang = lang
st.divider()
#------------------------------------------------------------
#FUNCTIONS
def extract_graphviz_info(text: str) -> list[str]:
"""
The function `extract_graphviz_info` takes in a text and returns a list of graphviz code blocks found in the text.
:param text: The `text` parameter is a string that contains the text from which you want to extract Graphviz information
:return: a list of strings that contain either the word "graph" or "digraph". These strings are extracted from the input
text.
"""
graphviz_info = text.split('```')
return [graph for graph in graphviz_info if ('graph' in graph or 'digraph' in graph) and ('{' in graph and '}' in graph)]
def append_message(message: dict) -> None:
"""
The function appends a message to a chat session.
:param message: The `message` parameter is a dictionary that represents a chat message. It typically contains
information such as the user who sent the message and the content of the message
:type message: dict
:return: The function is not returning anything.
"""
st.session_state.chat_session.append({'user': message})
return
@st.cache_resource
def load_model() -> genai.GenerativeModel:
"""
The function `load_model()` returns an instance of the `genai.GenerativeModel` class initialized with the model name
'gemini-pro'.
:return: an instance of the `genai.GenerativeModel` class.
"""
model = genai.GenerativeModel('gemini-pro')
return model
@st.cache_resource
def load_modelvision() -> genai.GenerativeModel:
"""
The function `load_modelvision` loads a generative model for vision tasks using the `gemini-pro-vision` model.
:return: an instance of the `genai.GenerativeModel` class.
"""
model = genai.GenerativeModel('gemini-pro-vision')
return model
#------------------------------------------------------------
#CONFIGURATION
genai.configure(api_key=st.secrets["GOOGLE_API_KEY"])
model = load_model()
vision = load_modelvision()
if 'chat' not in st.session_state:
st.session_state.chat = model.start_chat(history=[])
if 'chat_session' not in st.session_state:
st.session_state.chat_session = []
#st.session_state.chat_session
#------------------------------------------------------------
#CHAT
if 'messages' not in st.session_state:
st.session_state.messages = []
if 'welcome' not in st.session_state or lang != st.session_state.lang:
st.session_state.lang = lang
welcome = model.generate_content(f'''
Da un saludo de bienvenida al usuario y sugiere que puede hacer
(Puedes describir imágenes, responder preguntas, leer archivos texto, leer tablas,generar gráficos con graphviz, etc)
eres un chatbot en una aplicación de chat creada en streamlit y python. generate the answer in {lang}''')
welcome.resolve()
st.session_state.welcome = welcome
with st.chat_message('ai'):
st.write(st.session_state.welcome.text)
else:
with st.chat_message('ai'):
st.write(st.session_state.welcome.text)
if len(st.session_state.chat_session) > 0:
count = 0
for message in st.session_state.chat_session:
if message['user']['role'] == 'model':
with st.chat_message('ai'):
st.write(message['user']['parts'])
graphs = extract_graphviz_info(message['user']['parts'])
if len(graphs) > 0:
for graph in graphs:
st.graphviz_chart(graph,use_container_width=False)
if lang == 'Español':
view = "Ver texto"
else:
view = "View text"
with st.expander(view):
st.code(graph, language='dot')
else:
with st.chat_message('user'):
st.write(message['user']['parts'][0])
if len(message['user']['parts']) > 1:
st.image(message['user']['parts'][1], width=200)
count += 1
#st.session_state.chat.history
cols=st.columns(4)
with cols[0]:
if lang == 'Español':
image_atachment = st.toggle("Adjuntar imagen", value=False, help="Activa este modo para adjuntar una imagen y que el chatbot pueda leerla")
else:
image_atachment = st.toggle("Attach image", value=False, help="Activate this mode to attach an image and let the chatbot read it")
with cols[1]:
if lang == 'Español':
txt_atachment = st.toggle("Adjuntar archivo de texto", value=False, help="Activa este modo para adjuntar un archivo de texto y que el chatbot pueda leerlo")
else:
txt_atachment = st.toggle("Attach text file", value=False, help="Activate this mode to attach a text file and let the chatbot read it")
with cols[2]:
if lang == 'Español':
csv_excel_atachment = st.toggle("Adjuntar CSV o Excel", value=False, help="Activa este modo para adjuntar un archivo CSV o Excel y que el chatbot pueda leerlo")
else:
csv_excel_atachment = st.toggle("Attach CSV or Excel", value=False, help="Activate this mode to attach a CSV or Excel file and let the chatbot read it")
with cols[3]:
if lang == 'Español':
graphviz_mode = st.toggle("Modo graphviz", value=False, help="Activa este modo para generar un grafo con graphviz en .dot a partir de tu mensaje")
else:
graphviz_mode = st.toggle("Graphviz mode", value=False, help="Activate this mode to generate a graph with graphviz in .dot from your message")
if image_atachment:
if lang == 'Español':
image = st.file_uploader("Sube tu imagen", type=['png', 'jpg', 'jpeg'])
url = st.text_input("O pega la url de tu imagen")
else:
image = st.file_uploader("Upload your image", type=['png', 'jpg', 'jpeg'])
url = st.text_input("Or paste your image url")
else:
image = None
url = ''
if txt_atachment:
if lang == 'Español':
txtattachment = st.file_uploader("Sube tu archivo de texto", type=['txt'])
else:
txtattachment = st.file_uploader("Upload your text file", type=['txt'])
else:
txtattachment = None
if csv_excel_atachment:
if lang == 'Español':
csvexcelattachment = st.file_uploader("Sube tu archivo CSV o Excel", type=['csv', 'xlsx'])
else:
csvexcelattachment = st.file_uploader("Upload your CSV or Excel file", type=['csv', 'xlsx'])
else:
csvexcelattachment = None
if lang == 'Español':
prompt = st.chat_input("Escribe tu mensaje")
else:
prompt = st.chat_input("Write your message")
if prompt:
txt = ''
if txtattachment:
txt = txtattachment.getvalue().decode("utf-8")
if lang == 'Español':
txt = ' Archivo de texto: \n' + txt
else:
txt = ' Text file: \n' + txt
if csvexcelattachment:
try:
df = pd.read_csv(csvexcelattachment)
except:
df = pd.read_excel(csvexcelattachment)
txt += ' Dataframe: \n' + str(df)
if graphviz_mode:
if lang == 'Español':
txt += ' Genera un grafo con graphviz en .dot \n'
else:
txt += ' Generate a graph with graphviz in .dot \n'
if len(txt) > 5000:
txt = txt[:5000] + '...'
if image or url != '':
if url != '':
img = Image.open(requests.get(url, stream=True).raw)
else:
img = Image.open(image)
prmt = {'role': 'user', 'parts':[prompt+txt, img]}
else:
prmt = {'role': 'user', 'parts':[prompt+txt]}
append_message(prmt)
if lang == 'Español':
spinertxt = 'Espera un momento, estoy pensando...'
else:
spinertxt = 'Wait a moment, I am thinking...'
with st.spinner(spinertxt):
if len(prmt['parts']) > 1:
response = vision.generate_content(prmt['parts'],stream=True,safety_settings=[
{
"category": "HARM_CATEGORY_HARASSMENT",
"threshold": "BLOCK_LOW_AND_ABOVE",
},
{
"category": "HARM_CATEGORY_HATE_SPEECH",
"threshold": "BLOCK_LOW_AND_ABOVE",
},
]
)
response.resolve()
else:
response = st.session_state.chat.send_message(prmt['parts'][0])
try:
append_message({'role': 'model', 'parts':response.text})
except Exception as e:
append_message({'role': 'model', 'parts':f'{type(e).__name__}: {e}'})
st.rerun()
#st.session_state.chat_session |