File size: 8,072 Bytes
4227970 59bfaac fa92574 509b02d fa92574 9dd3d1d fa92574 9dd3d1d fa92574 4227970 fa92574 97cdbe1 9dd3d1d fa92574 9dd3d1d fa92574 9dd3d1d 300e083 4227970 9dd3d1d 4227970 4b02bb7 4227970 2b28b66 4b02bb7 9dd3d1d 300e083 9dd3d1d 48344ea 300e083 9dd3d1d 4b02bb7 f54757c 300e083 9dd3d1d 2251b3a 9dd3d1d a36d2f3 f54757c 300e083 9dd3d1d 300e083 9dd3d1d 300e083 9dd3d1d 97cdbe1 300e083 9dd3d1d 48344ea f54757c 300e083 97cdbe1 a36d2f3 f54757c 97cdbe1 b6dc07e 97cdbe1 |
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 |
import os
import streamlit as st
import json
from streamlit_option_menu import option_menu
from gemini_utility import (load_gemini_pro, gemini_pro_vision_responce)
from PIL import Image
import time
# Configuraci贸n de la p谩gina
st.set_page_config(
page_title="GnosticDev AI",
page_icon="馃",
layout="centered",
initial_sidebar_state="expanded",
)
# Add the missing translation function
def translate_role_to_streamlit(role):
"""
Translate Gemini message roles to Streamlit chat roles
"""
role_mapping = {
'model': 'assistant',
'user': 'user'
}
return role_mapping.get(role, 'assistant')
# Archivo para almacenamiento permanente
PROMPTS_FILE = "training_prompts.json"
# Funciones para manejar el almacenamiento permanente
def load_prompts():
try:
if os.path.exists(PROMPTS_FILE):
with open(PROMPTS_FILE, 'r', encoding='utf-8') as file:
return json.load(file)
except Exception as e:
st.error(f"Error cargando prompts: {e}")
return {"prompts": [], "current_prompt": ""}
def save_prompts(prompts_data):
try:
with open(PROMPTS_FILE, 'w', encoding='utf-8') as file:
json.dump(prompts_data, file, ensure_ascii=False, indent=2)
except Exception as e:
st.error(f"Error guardando prompts: {e}")
# Inicializaci贸n de datos
if 'prompts_data' not in st.session_state:
st.session_state.prompts_data = load_prompts()
with st.sidebar:
selected = option_menu(
"GD AI",
["System Prompts", "Chatbot", "Image Captioning"],
menu_icon="robot",
icons=['gear', 'chat-dots-fill', 'image-fill'],
default_index=0
)
if selected == "System Prompts":
st.title("Gesti贸n de System Prompts")
# 脕rea para nuevo prompt
new_prompt = st.text_area(
"Nuevo System Prompt",
value="",
height=200,
help="Escribe aqu铆 las nuevas instrucciones para el AI"
)
col1, col2 = st.columns([1, 2])
with col1:
if st.button("A帽adir Nuevo Prompt"):
if new_prompt and new_prompt not in st.session_state.prompts_data["prompts"]:
st.session_state.prompts_data["prompts"].append(new_prompt)
save_prompts(st.session_state.prompts_data)
st.success("Nuevo prompt a帽adido!")
time.sleep(1)
st.rerun()
# Lista de prompts guardados
st.markdown("### Prompts Guardados")
for i, prompt in enumerate(st.session_state.prompts_data["prompts"]):
with st.expander(f"Prompt {i+1}"):
st.text_area("", prompt, height=100, key=f"prompt_{i}", disabled=True)
col1, col2, col3 = st.columns([1, 1, 1])
with col1:
if st.button("Usar este prompt", key=f"use_{i}"):
st.session_state.prompts_data["current_prompt"] = prompt
save_prompts(st.session_state.prompts_data)
if "chat_session" in st.session_state:
del st.session_state.chat_session
st.success("Prompt activado!")
with col2:
if st.button("Editar", key=f"edit_{i}"):
st.session_state.editing_prompt = i
st.session_state.editing_text = prompt
with col3:
if st.button("Eliminar", key=f"delete_{i}"):
st.session_state.prompts_data["prompts"].pop(i)
save_prompts(st.session_state.prompts_data)
st.success("Prompt eliminado!")
time.sleep(1)
st.rerun()
# Mostrar prompt actual
st.markdown("### Prompt Actual")
current_prompt = st.session_state.prompts_data.get("current_prompt", "")
if current_prompt:
st.info(current_prompt)
else:
st.warning("No hay prompt activo")
elif selected == "Chatbot":
model = load_gemini_pro()
# Initialize chat session with current prompt
if "chat_session" not in st.session_state:
st.session_state.chat_session = model.start_chat(history=[])
current_prompt = st.session_state.prompts_data.get("current_prompt")
if current_prompt:
st.session_state.chat_session.send_message(current_prompt)
st.title("Gnosticdev Chatbot")
# Mostrar prompt actual
current_prompt = st.session_state.prompts_data.get("current_prompt")
if current_prompt:
with st.expander("Ver System Prompt actual"):
st.info(current_prompt)
# Display chat history
if hasattr(st.session_state.chat_session, 'history'):
for message in st.session_state.chat_session.history:
role = translate_role_to_streamlit(message.role)
with st.chat_message(role):
st.markdown(message.parts[0].text)
# Chat input
user_prompt = st.chat_input("Preguntame algo...")
if user_prompt:
st.chat_message("user").markdown(user_prompt)
try:
gemini_response = st.session_state.chat_session.send_message(user_prompt)
with st.chat_message("assistant"):
st.markdown(gemini_response.text)
except Exception as e:
st.error(f"Error en la respuesta: {str(e)}")
elif selected == "Image Captioning":
st.title("Image Caption Generation馃摳")
# Add custom prompt option
use_custom_prompt = st.checkbox("Usar prompt personalizado")
if use_custom_prompt:
custom_prompt = st.text_area(
"Escribe tu prompt personalizado",
value="Write a caption for this image",
help="Puedes personalizar las instrucciones para el an谩lisis de la imagen"
)
upload_image = st.file_uploader("Upload an image...", type=["jpg", "jpeg", "png"])
if upload_image:
try:
image = Image.open(upload_image)
col1, col2 = st.columns(2)
with col1:
st.image(image, caption="Uploaded Image", use_column_width=True)
image_info = f"Dimensiones: {image.size[0]}x{image.size[1]}"
st.text(image_info)
if st.button("Generate", key="generate_caption"):
with st.spinner("Generando descripci贸n..."):
prompt = custom_prompt if use_custom_prompt else "Write a caption for this image"
try:
caption = gemini_pro_vision_responce(prompt, image)
with col2:
st.success("隆Descripci贸n generada!")
st.info(caption)
# Opci贸n para guardar la descripci贸n
if st.button("Guardar descripci贸n"):
timestamp = time.strftime("%Y%m%d-%H%M%S")
filename = f"caption_{timestamp}.txt"
try:
with open(filename, "w", encoding="utf-8") as f:
f.write(caption)
st.success(f"Descripci贸n guardada en {filename}")
except Exception as e:
st.error(f"Error al guardar la descripci贸n: {str(e)}")
except Exception as e:
st.error(f"Error al generar la descripci贸n: {str(e)}")
st.error("Por favor, intenta con otra imagen o revisa tu conexi贸n")
except Exception as e:
st.error(f"Error al procesar la imagen: {str(e)}")
st.error("Por favor, aseg煤rate de que el archivo es una imagen v谩lida")
# A帽adir footer
st.markdown("---")
col1, col2, col3 = st.columns(3)
with col1:
st.markdown("**GnosticDev AI**")
with col2:
st.markdown("Versi贸n 1.0.0")
with col3:
st.markdown("Made with 鉂わ笍 by GnosticDev") |