import streamlit as st import os import google.generativeai as genai from PyPDF2 import PdfReader from fpdf import FPDF # Inyecta CSS para utilizar la fuente "Poppins" de Google Fonts st.markdown(""" """, unsafe_allow_html=True) api_key = os.environ.get("GEMINI_API_KEY") if not api_key: st.error("La clave API no está configurada. Por favor, configúrala en las variables de entorno.") else: genai.configure(api_key=api_key) configuracion_generacion = { "temperature": 2, "top_p": 0.95, "top_k": 64, "max_output_tokens": 65536, "response_mime_type": "text/plain", } modelo = genai.GenerativeModel( model_name="gemini-2.0-flash-thinking-exp-01-21", generation_config=configuracion_generacion, ) def extraer_texto_de_pdf(archivo): """Extrae el texto de un archivo PDF subido.""" lector = PdfReader(archivo) texto = "" for pagina in lector.pages: texto += pagina.extract_text() + "\n" return texto def respuesta_stream(prompt): """Envía el prompt al modelo generativo y transmite la respuesta en tiempo real.""" sesion_chat = modelo.start_chat( history=[{"role": "user", "parts": [prompt]}] ) for fragmento in sesion_chat.send_message("Procesando entrada...", stream=True): if fragmento.text: yield fragmento.text def crear_pdf(contenido): """Crea un archivo PDF bien formateado a partir del contenido dado.""" pdf = FPDF() pdf.add_page() pdf.set_font("Arial", size=12) lineas = contenido.split("\n") for linea in lineas: # Elimina el formato de negrita estilo markdown (**) linea_formateada = linea.replace("**", "") pdf.multi_cell(0, 10, linea_formateada) return pdf # Interfaz de usuario con Streamlit st.title("Resumen de Texto y Extracción de Ideas Clave") # Estado de sesión para almacenar el texto generado if "texto_generado" not in st.session_state: st.session_state.texto_generado = "" archivo_subido = st.file_uploader("Sube un documento (PDF) o pega el texto a continuación:", type=["pdf"]) texto_entrada = st.text_area("O pega tu artículo aquí:", placeholder="Pega tu artículo o texto aquí...") if st.button("Generar Resumen e Ideas Clave"): if archivo_subido: texto_entrada = extraer_texto_de_pdf(archivo_subido) if texto_entrada.strip(): st.markdown("### Generando resultados...") contenedor_respuesta = st.empty() st.session_state.texto_generado = "" # Limpiar el texto previo for fragmento in respuesta_stream(f"Resume el siguiente texto y extrae las ideas clave:\n{texto_entrada}"): st.session_state.texto_generado += fragmento contenedor_respuesta.markdown(st.session_state.texto_generado) else: st.warning("Por favor, sube un archivo o ingresa texto para procesar.") if st.session_state.texto_generado: st.markdown("### Resumen e Ideas Clave") st.text_area("Resultados:", st.session_state.texto_generado, height=300) # Generar PDF para descarga pdf = crear_pdf(st.session_state.texto_generado) archivo_pdf = "resumen_ideas.pdf" pdf.output(archivo_pdf) with open(archivo_pdf, "rb") as f: st.download_button( label="Descargar PDF", data=f, file_name="resumen_ideas.pdf", mime="application/pdf" )