from groq import Groq from langchain_groq import ChatGroq import streamlit as st from docx import Document from io import BytesIO from langchain_huggingface.embeddings import HuggingFaceEmbeddings from langchain.vectorstores import Chroma import os from docx.shared import Inches, Pt, RGBColor from docx.oxml import OxmlElement from docx.oxml.ns import qn from docx.oxml import parse_xml from docx.oxml.ns import nsdecls from docx.enum.text import WD_PARAGRAPH_ALIGNMENT from PyPDF2 import PdfReader from langchain.text_splitter import RecursiveCharacterTextSplitter from chromadb.config import Settings # Verificar que la clave de API se ha cargado api_key= os.environ.get("API_KEY") # Updated initialization with model_name embeddings = HuggingFaceEmbeddings(model_name="sentence-transformers/all-MiniLM-L6-v2") # Load the vector databases vectordb_PEI = Chroma(persist_directory="./vector_db_PEI2", embedding_function=embeddings) vectordb_guia = Chroma(persist_directory="./vector_db_guia2", embedding_function=embeddings) # Prepare the list of vector databases vectordb_list = [vectordb_PEI, vectordb_guia] client = Groq(api_key=api_key) # Inicializar el modelo de chat chat_groq = ChatGroq(model="llama-3.1-70b-versatile",api_key=api_key) # Configurar la página st.set_page_config( page_title="Microcurriculum UdeA con IA", page_icon="🩺", layout="centered", initial_sidebar_state="auto", ) st.sidebar.image("UdeA+simplificado-01.png", width=200) st.sidebar.title("Microcurriculum con IA") st.sidebar.write("Entrega Diplomado Pedagogía UdeA 2024-2") st.sidebar.write("Equipo GIE Inclusión y Tecnología") st.title("PROGRAMA OFICIAL DE CURSO") st.write("Aplica para Pregrado y Posgrado") # Sección para subir documentos adicionales st.write("### Añadir Documentos Adicionales") st.write("Ya están incluidos el PEI y el manual para la creación de microcurrículo. Puedes añadir documentos específicos del programa. Tamaño máximo por archivo: 50 MB.") uploaded_files = st.file_uploader( "Subir documentos en formato PDF", type="pdf", accept_multiple_files=True, key="uploaded_files", help="Puedes subir múltiples archivos PDF." ) if uploaded_files: total_size = sum([file.size for file in uploaded_files]) if any(file.size > 50 * 1024 * 1024 for file in uploaded_files): st.error("Uno o más archivos exceden el tamaño máximo de 50 MB. Por favor, sube archivos más pequeños.") else: if st.button("Añadir"): with st.spinner("Procesando documentos..."): # Crear una base de datos vectorial en memoria vectordb_custom = Chroma( embedding_function=embeddings, ) # Procesar cada archivo subido for uploaded_file in uploaded_files: # Leer el contenido del archivo PDF pdf_reader = PdfReader(uploaded_file) text = "" for page in pdf_reader.pages: text += page.extract_text() # Dividir el texto en fragmentos text_splitter = RecursiveCharacterTextSplitter( chunk_size=1000, chunk_overlap=200, length_function=len ) texts = text_splitter.split_text(text) # Añadir los textos a la base de datos vectorial vectordb_custom.add_texts(texts) st.success("Documentos añadidos y procesados correctamente.") # Guardar la base de datos vectorial en la sesión st.session_state['vectordb_custom'] = vectordb_custom # Si el usuario ha subido documentos personalizados, incluir su base de datos vectorial if 'vectordb_custom' in st.session_state: vectordb_list.append(st.session_state['vectordb_custom']) def mejorar_texto_con_IA(var_name, var_value, vectordb_list, nombre_curso): context_docs = [] search=var_name+"\n"+var_value for vectordb in vectordb_list: docs = vectordb.similarity_search(search, k=3) context_docs.extend([doc.page_content for doc in docs]) context = "\n".join(context_docs) prompt = f"""Tu eres una inteligencia artificial experta en pedagogia. Tu tarea es mejorar el siguiente microcurriculum del curso {nombre_curso} texto en la sección {var_name} teniendo en cuenta el contexto proporcionado. Solo dame el texto mejorado Contexto: {context} Texto: {var_value} Texto mejorado:""" improved_text = chat_groq.invoke(prompt) improved_text = improved_text.content return improved_text, context def crear_documento(nombre_curso, variables): doc = Document('plantilla_micro.docx') # Insertar la imagen con estilo centrado imagen = doc.add_paragraph() imagen.alignment = WD_PARAGRAPH_ALIGNMENT.CENTER run_imagen = imagen.add_run() run_imagen.add_picture("UdeA+simplificado-01.png", width=Inches(1.5)) # Título Principal titulo = doc.add_paragraph() titulo_run = titulo.add_run("PROGRAMA OFICIAL DE CURSO\n(Pregrado y Posgrado)\nUNIVERSIDAD DE ANTIOQUIA") titulo_run.bold = True titulo_run.font.size = Pt(16) titulo_run.font.color.rgb = RGBColor(34, 85, 85) # Color verde azulado # Información General - Tabla doc.add_paragraph("\nINFORMACIÓN GENERAL", style='Heading 1') info_table = doc.add_table(rows=0, cols=2) info_general = [ ("Nombre del curso", nombre_curso), ("Programa académico", variables.get('programa_academico', '')), ("Unidad académica", variables.get('unidad_academica', '')), ("Programas que ofrecen el curso", variables.get('programas_ofrece', '')), ("Vigencia", variables.get('vigencia', '')), ("Código del curso", variables.get('codigo_curso', '')), ("Tipo de curso", variables.get('tipo_curso', '') if variables.get('tipo_curso', '') != 'Otro' else variables.get('tipo_curso_otro', '')), ("Características del curso", ', '.join(variables.get('caracteristicas_curso', []))), ("Modalidad educativa", variables.get('modalidad', '') if variables.get('modalidad', '') != 'Otra' else variables.get('modalidad_otra', '')), ("Área, núcleo o componente", variables.get('nombre_area', '')), ("Prerrequisitos", variables.get('prerrequisitos', '')), ("Correquisitos", variables.get('correquisitos', '')), ("Créditos académicos", variables.get('num_creditos', '')), ("Horas de interacción", variables.get('horas_interaccion', '')), ("Horas de trabajo independiente", variables.get('horas_independiente', '')), ("Horas totales del curso", variables.get('horas_totales', '')) ] for key, value in info_general: row = info_table.add_row().cells row[0].text = key row[0].paragraphs[0].runs[0].font.bold = True row[1].text = str(value) # Secciones con Títulos # Secciones con Títulos secciones = [ ("RELACIONES CON EL PERFIL", variables.get('relaciones_perfil', '')), ("INTENCIONALIDADES FORMATIVAS", variables.get('intencionalidades', '')), ("APORTES DEL CURSO A LA FORMACIÓN INTEGRAL Y A LA FORMACIÓN EN INVESTIGACIÓN", variables.get('aportes_formacion', '')), ("LÍNEAS DE SENTIDO Y DERROTERO DE PREGUNTAS", f"Líneas de sentido: {variables.get('lineas_sentido', '')}\nDerrotero de preguntas: {variables.get('derrotero_preguntas', '')}"), ("DESCRIPCIÓN DE LOS CONOCIMIENTOS Y/O SABERES", variables.get('descripcion_conocimientos', '')), ("METODOLOGÍA", f"Estrategias didácticas: {variables.get('estrategias_didacticas', '')}\nMetodología: {variables.get('metodologia', '')}\nMedios y recursos didácticos: {variables.get('medios_recursos', '')}\nFormas de interacción: {variables.get('formas_interaccion', '')}\nEstrategias de internacionalización: {variables.get('estrategias_internacionalizacion', '')}\nEstrategias de diversidad: {variables.get('estrategias_diversidad', '')}"), ("EVALUACIÓN", f"Concepción de evaluación: {variables.get('concepcion_evaluacion', '')}\nProcesos de aprendizaje: {variables.get('procesos_aprendizaje', '')}\nMomentos de evaluación y porcentajes: {variables.get('momentos_evaluacion', '')}"), ("BIBLIOGRAFÍA Y OTRAS FUENTES", variables.get('bibliografia', '')), ("COMUNIDAD ACADÉMICA QUE PARTICIPÓ EN LA ELABORACIÓN DEL MICROCURRÍCULO", f"Nombres: {variables.get('nombres_apellidos', '')}\nUnidad académica: {variables.get('unidad_academica_participantes', '')}\nFormación académica: {variables.get('formacion_academica', '')}") ] for titulo, contenido in secciones: # Añadir título de sección con color personalizado parrafo_titulo = doc.add_paragraph(f"\n{titulo}") run_titulo = parrafo_titulo.runs[0] run_titulo.font.size = Pt(14) run_titulo.bold = True run_titulo.font.color.rgb = RGBColor(34, 85, 85) # Color verde azulado # Añadir contenido con viñetas si es necesario if '\n' in contenido: for linea in contenido.split('\n'): parrafo = doc.add_paragraph(linea) parrafo.paragraph_format.left_indent = Inches(0.5) else: doc.add_paragraph(contenido) # Aprobación del Consejo de Unidad Académica aprobacion_titulo = doc.add_paragraph("\nAPROBACIÓN DEL CONSEJO DE UNIDAD ACADÉMICA") aprobacion_titulo_run = aprobacion_titulo.runs[0] aprobacion_titulo_run.bold = True aprobacion_titulo_run.font.size = Pt(14) aprobacion_titulo_run.font.color.rgb = RGBColor(34, 85, 85) # Color verde azulado aprobacion_parrafo = doc.add_paragraph() aprobacion_parrafo.add_run("Aprobado en Acta número ").bold = False aprobacion_parrafo.add_run("_______________").underline = True # Información del secretario (puedes ajustar según tus necesidades) secretario_info = [ ("Secretario Académico", "________________________"), ("Decano", "________________________"), ] for label, line in secretario_info: parrafo_label = doc.add_paragraph(label) parrafo_label.runs[0].font.bold = True parrafo_label.runs[0].font.color.rgb = RGBColor(34, 85, 85) # Color verde azulado parrafo_linea = doc.add_paragraph(line) parrafo_linea.runs[0].underline = True # Guardar el documento en un objeto de bytes doc_buffer = BytesIO() doc.save(doc_buffer) doc_buffer.seek(0) return doc_buffer with st.expander("INFORMACIÓN GENERAL"): nombre_curso = st.text_input("Nombre del curso:", value=st.session_state.get('nombre_curso', ''), key='nombre_curso') programa_academico = st.text_input("Programa académico al que pertenece:", value=st.session_state.get('programa_academico', ''), key='programa_academico') unidad_academica = st.text_input("Unidad académica:", value=st.session_state.get('unidad_academica', ''), key='unidad_academica') programas_ofrece = st.text_input("Programa(s) académico(s) en los cuales se ofrece el curso:", value=st.session_state.get('programas_ofrece', ''), key='programas_ofrece') vigencia = st.text_input("Vigencia (Periodo académico o Cohorte):", value=st.session_state.get('vigencia', ''), key='vigencia') codigo_curso = st.text_input("Código curso (en MARES):", value=st.session_state.get('codigo_curso', ''), key='codigo_curso') tipo_curso_options = ["Obligatorio", "Electivo", "Otro"] tipo_curso_index = tipo_curso_options.index(st.session_state.get('tipo_curso', 'Obligatorio')) tipo_curso = st.selectbox("Tipo de curso:", tipo_curso_options, index=tipo_curso_index, key='tipo_curso') if tipo_curso == "Otro": tipo_curso_otro = st.text_input("En caso de elegir 'Otro', indique cuál:", value=st.session_state.get('tipo_curso_otro', ''), key='tipo_curso_otro') else: tipo_curso_otro = '' caracteristicas_curso = st.multiselect( "Características del curso:", ["Validable", "Habilitable", "Clasificable", "Evaluación de suficiencia (posgrado)"], default=st.session_state.get('caracteristicas_curso', []), key='caracteristicas_curso' ) modalidad_options = ["Presencial", "Virtual", "Mixta", "Otra"] modalidad_index = modalidad_options.index(st.session_state.get('modalidad', 'Presencial')) modalidad = st.selectbox("Modalidad educativa del curso:", modalidad_options, index=modalidad_index, key='modalidad') if modalidad == "Otra": modalidad_otra = st.text_input("En caso de elegir 'Otra', indique cuál:", value=st.session_state.get('modalidad_otra', ''), key='modalidad_otra') else: modalidad_otra = '' nombre_area = st.text_input("Nombre del área, núcleo o componente de la organización curricular a la que pertenece el curso:", value=st.session_state.get('nombre_area', ''), key='nombre_area') prerrequisitos = st.text_area("Prerrequisitos (con nombre y código en MARES):", value=st.session_state.get('prerrequisitos', ''), key='prerrequisitos') correquisitos = st.text_area("Correquisitos (con nombre y código en MARES):", value=st.session_state.get('correquisitos', ''), key='correquisitos') num_creditos = st.number_input("Número de créditos académicos (Acuerdo Académico 576 de marzo de 2021):", min_value=0, step=1, value=st.session_state.get('num_creditos', 0), key='num_creditos') horas_interaccion = st.number_input("Horas totales de interacción estudiante-profesor:", min_value=0, step=1, value=st.session_state.get('horas_interaccion', 0), key='horas_interaccion') horas_independiente = st.number_input("Horas totales de trabajo independiente:", min_value=0, step=1, value=st.session_state.get('horas_independiente', 0), key='horas_independiente') horas_totales = st.number_input("Horas totales del curso (suma de las horas anteriores):", min_value=0, step=1, value=st.session_state.get('horas_totales', 0), key='horas_totales') horas_teoricas = st.number_input("Horas totales de actividades académicas teóricas:", min_value=0, step=1, value=st.session_state.get('horas_teoricas', 0), key='horas_teoricas') horas_practicas = st.number_input("Horas totales de actividades académicas prácticas:", min_value=0, step=1, value=st.session_state.get('horas_practicas', 0), key='horas_practicas') horas_teorico_practicas = st.number_input("Horas totales de actividades académicas teórico-prácticas:", min_value=0, step=1, value=st.session_state.get('horas_teorico_practicas', 0), key='horas_teorico_practicas') # For 'relaciones_perfil' with st.expander("RELACIONES CON EL PERFIL"): var_name = 'relaciones_perfil' var_value = st.session_state.get('improved_' + var_name, st.session_state.get(var_name, '')) relaciones_perfil = st.text_area( "Describir el propósito del curso en relación con los perfiles del programa académico.", value=var_value, key=var_name ) if st.button("Mejorar con IA✨", key='btn_' + var_name): with st.spinner(f'Mejorando {var_name} con IA...'): try: improved_text, context = mejorar_texto_con_IA(var_name, relaciones_perfil, vectordb_list, nombre_curso) st.session_state['improved_' + var_name] = improved_text st.session_state['context_' + var_name] = context st.rerun() except Exception as e: st.warning(e) pass if 'context_' + var_name in st.session_state: st.warning("Fragmentos del PEI-UdeA usados por la IA") st.info(st.session_state['context_' + var_name]) # For 'intencionalidades' with st.expander("INTENCIONALIDADES FORMATIVAS"): var_name = 'intencionalidades' var_value = st.session_state.get('improved_' + var_name, st.session_state.get(var_name, '')) intencionalidades = st.text_area( "Explicitar los elementos orientadores del curso de acuerdo con el diseño curricular del programa académico.", value=var_value, key=var_name ) if st.button("Mejorar con IA✨", key='btn_' + var_name): with st.spinner(f'Mejorando {var_name} con IA...'): try: improved_text, context = mejorar_texto_con_IA(var_name, intencionalidades, vectordb_list, nombre_curso) st.session_state['improved_' + var_name] = improved_text st.session_state['context_' + var_name] = context st.rerun() except Exception as e: st.warning(e) pass if 'context_' + var_name in st.session_state: st.warning("Fragmentos del PEI-UdeA usados por la IA") st.info(st.session_state['context_' + var_name]) # For 'aportes_formacion', 'lineas_sentido', 'derrotero_preguntas' with st.expander("APORTES DEL CURSO A LA FORMACIÓN INTEGRAL Y A LA FORMACIÓN EN INVESTIGACIÓN"): # 'aportes_formacion' var_name = 'aportes_formacion' var_value = st.session_state.get('improved_' + var_name, st.session_state.get(var_name, '')) aportes_formacion = st.text_area( "Describir cómo el curso hace aportes a la formación integral y a la formación en investigación.", value=var_value, key=var_name ) if st.button("Mejorar con IA✨", key='btn_' + var_name): with st.spinner(f"Mejorando {var_name} con IA..."): try: improved_text, context = mejorar_texto_con_IA(var_name, aportes_formacion, vectordb_list, nombre_curso) st.session_state['improved_' + var_name] = improved_text st.session_state['context_' + var_name] = context st.rerun() except Exception as e: st.warning(e) pass if 'context_' + var_name in st.session_state: st.warning("Fragmentos del PEI-UdeA usados por la IA") st.info(st.session_state['context_' + var_name]) # 'lineas_sentido' var_name = 'lineas_sentido' var_value = st.session_state.get('improved_' + var_name, st.session_state.get(var_name, '')) lineas_sentido = st.text_area( "Líneas de sentido", value=var_value, key=var_name ) if st.button("Mejorar con IA✨", key='btn_' + var_name): with st.spinner(f"Mejorando {var_name} con IA..."): try: improved_text, context = mejorar_texto_con_IA(var_name, lineas_sentido, vectordb_list, nombre_curso) st.session_state['improved_' + var_name] = improved_text st.session_state['context_' + var_name] = context st.rerun() except Exception as e: st.warning(e) pass if 'context_' + var_name in st.session_state: st.warning("Fragmentos del PEI-UdeA usados por la IA") st.info(st.session_state['context_' + var_name]) # 'derrotero_preguntas' var_name = 'derrotero_preguntas' var_value = st.session_state.get('improved_' + var_name, st.session_state.get(var_name, '')) derrotero_preguntas = st.text_area( "Derrotero de preguntas", value=var_value, key=var_name ) if st.button("Mejorar con IA✨", key='btn_' + var_name): with st.spinner(f"Mejorando {var_name} con IA..."): try: improved_text, context = mejorar_texto_con_IA(var_name, derrotero_preguntas, vectordb_list, nombre_curso) st.session_state['improved_' + var_name] = improved_text st.session_state['context_' + var_name] = context st.rerun() except Exception as e: st.warning(e) pass if 'context_' + var_name in st.session_state: st.warning("Fragmentos del PEI-UdeA usados por la IA") st.info(st.session_state['context_' + var_name]) # For 'descripcion_conocimientos' with st.expander("DESCRIPCIÓN DE LOS CONOCIMIENTOS Y/O SABERES"): var_name = 'descripcion_conocimientos' var_value = st.session_state.get('improved_' + var_name, st.session_state.get(var_name, '')) descripcion_conocimientos = st.text_area( "Explicitar los ejes problémicos, saberes, proyectos, contenidos o temas que se abordan en el desarrollo del curso.", value=var_value, key=var_name ) if st.button("Mejorar con IA✨", key='btn_' + var_name): with st.spinner(f"Mejorando {var_name} con IA..."): try: improved_text, context = mejorar_texto_con_IA(var_name, descripcion_conocimientos, vectordb_list, nombre_curso) st.session_state['improved_' + var_name] = improved_text st.session_state['context_' + var_name] = context st.rerun() except Exception as e: st.warning(e) pass if 'context_' + var_name in st.session_state: st.warning("Fragmentos del PEI-UdeA usados por la IA") st.info(st.session_state['context_' + var_name]) # For 'metodologia' and others in "METODOLOGÍA" with st.expander("METODOLOGÍA"): # Existing code for 'estrategias_didacticas' and others... estrategias_didacticas_options = [ "Aprendizaje Basado en Problemas (ABP)", "Aprendizaje Basado en Proyectos (ABP)", "Aprendizaje invertido", "Aprendizaje Basado en Retos (ABR)", "Estudio de caso", "Aprendizaje entre pares", "Clase magistral", "Salida de campo", "Taller", "Otra(s)" ] estrategias_didacticas = st.multiselect("Estrategias didácticas:", estrategias_didacticas_options, default=st.session_state.get('estrategias_didacticas', []), key='estrategias_didacticas') if "Otra(s)" in estrategias_didacticas: estrategias_otras = st.text_input("Escriba el nombre de la estrategia.", value=st.session_state.get('estrategias_otras', ''), key='estrategias_otras') else: estrategias_otras = '' # 'metodologia' var_name = 'metodologia' var_value = st.session_state.get('improved_' + var_name, st.session_state.get(var_name, '')) metodologia = st.text_area( "Describa brevemente la metodología(s) utilizada(s).", value=var_value, key=var_name ) if st.button("Mejorar con IA✨", key='btn_' + var_name): with st.spinner(f"Mejorando {var_name} con IA..."): try: improved_text, context = mejorar_texto_con_IA(var_name, metodologia, vectordb_list, nombre_curso) st.session_state['improved_' + var_name] = improved_text st.session_state['context_' + var_name] = context st.rerun() except Exception as e: st.warning(e) pass if 'context_' + var_name in st.session_state: st.warning("Fragmentos del PEI-UdeA usados por la IA") st.info(st.session_state['context_' + var_name]) # 'medios_recursos' var_name = 'medios_recursos' var_value = st.session_state.get('improved_' + var_name, st.session_state.get(var_name, '')) medios_recursos = st.text_area( "Medios y recursos didácticos:", value=var_value, key=var_name ) if st.button("Mejorar con IA✨", key='btn_' + var_name): with st.spinner(f"Mejorando {var_name} con IA..."): try: improved_text, context = mejorar_texto_con_IA(var_name, medios_recursos, vectordb_list, nombre_curso) st.session_state['improved_' + var_name] = improved_text st.session_state['context_' + var_name] = context st.rerun() except Exception as e: st.warning(e) pass if 'context_' + var_name in st.session_state: st.warning("Fragmentos del PEI-UdeA usados por la IA") st.info(st.session_state['context_' + var_name]) # 'formas_interaccion' var_name = 'formas_interaccion' var_value = st.session_state.get('improved_' + var_name, st.session_state.get(var_name, '')) formas_interaccion = st.text_area( "Formas de interacción en los ambientes de aprendizaje y de acompañamiento del trabajo independiente del estudiante:", value=var_value, key=var_name ) if st.button("Mejorar con IA✨", key='btn_' + var_name): with st.spinner(f"Mejorando {var_name} con IA..."): try: improved_text, context = mejorar_texto_con_IA(var_name, formas_interaccion, vectordb_list, nombre_curso) st.session_state['improved_' + var_name] = improved_text st.session_state['context_' + var_name] = context st.rerun() except Exception as e: st.warning(e) pass if 'context_' + var_name in st.session_state: st.warning("Fragmentos del PEI-UdeA usados por la IA") st.info(st.session_state['context_' + var_name]) # 'estrategias_internacionalizacion' var_name = 'estrategias_internacionalizacion' var_value = st.session_state.get('improved_' + var_name, st.session_state.get(var_name, '')) estrategias_internacionalizacion = st.text_area( "Estrategias de internacionalización del currículo que se desarrollan para cumplir con las intencionalidades formativas del microcurrículo:", value=var_value, key=var_name ) if st.button("Mejorar con IA✨", key='btn_' + var_name): with st.spinner(f"Mejorando {var_name} con IA..."): try: improved_text, context = mejorar_texto_con_IA(var_name, estrategias_internacionalizacion, vectordb_list, nombre_curso) st.session_state['improved_' + var_name] = improved_text st.session_state['context_' + var_name] = context st.rerun() except Exception as e: st.warning(e) pass if 'context_' + var_name in st.session_state: st.warning("Fragmentos del PEI-UdeA usados por la IA") st.info(st.session_state['context_' + var_name]) # 'estrategias_diversidad' var_name = 'estrategias_diversidad' var_value = st.session_state.get('improved_' + var_name, st.session_state.get(var_name, '')) estrategias_diversidad = st.text_area( "Estrategias para abordar o visibilizar la diversidad desde la perspectiva de género, el enfoque diferencial o el enfoque intercultural:", value=var_value, key=var_name ) if st.button("Mejorar con IA✨", key='btn_' + var_name): with st.spinner(f"Mejorando {var_name} con IA..."): try: improved_text, context = mejorar_texto_con_IA(var_name, estrategias_diversidad, vectordb_list, nombre_curso) st.session_state['improved_' + var_name] = improved_text st.session_state['context_' + var_name] = context st.rerun() except Exception as e: st.warning(e) pass if 'context_' + var_name in st.session_state: st.warning("Fragmentos del PEI-UdeA usados por la IA") st.info(st.session_state['context_' + var_name]) # For 'concepcion_evaluacion' with st.expander("EVALUACIÓN"): # Variable 'concepcion_evaluacion' var_name = 'concepcion_evaluacion' var_value = st.session_state.get('improved_' + var_name, st.session_state.get(var_name, '')) concepcion_evaluacion = st.text_area( "Concepción de evaluación, modalidades y estrategias a través de las cuales se va a orientar.", value=var_value, key=var_name ) if st.button("Mejorar con IA✨", key='btn_' + var_name): with st.spinner(f'Mejorando {var_name} con IA...'): try: improved_text, context = mejorar_texto_con_IA(var_name, concepcion_evaluacion, vectordb_list, nombre_curso) st.session_state['improved_' + var_name] = improved_text st.session_state['context_' + var_name] = context st.rerun() except Exception as e: st.warning(e) pass if 'context_' + var_name in st.session_state: st.warning("Fragmentos del PEI-UdeA usados por la IA") st.info(st.session_state['context_' + var_name]) # Variable 'procesos_aprendizaje' var_name = 'procesos_aprendizaje' var_value = st.session_state.get('improved_' + var_name, st.session_state.get(var_name, '')) procesos_aprendizaje = st.text_area( "Procesos y resultados de aprendizaje del Programa Académico que se abordan en el curso.", value=var_value, key=var_name ) if st.button("Mejorar con IA✨", key='btn_' + var_name): with st.spinner(f'Mejorando {var_name} con IA...'): try: improved_text, context = mejorar_texto_con_IA(var_name, procesos_aprendizaje, vectordb_list, nombre_curso) st.session_state['improved_' + var_name] = improved_text st.session_state['context_' + var_name] = context st.rerun() except Exception as e: st.warning(e) pass if 'context_' + var_name in st.session_state: st.warning("Fragmentos del PEI-UdeA usados por la IA") st.info(st.session_state['context_' + var_name]) # Variable 'momentos_evaluacion' var_name = 'momentos_evaluacion' var_value = st.session_state.get('improved_' + var_name, st.session_state.get(var_name, '')) momentos_evaluacion = st.text_area( "Momentos y/o productos de la evaluación del curso y sus respectivos porcentajes.", value=var_value, key=var_name ) if st.button("Mejorar con IA✨", key='btn_' + var_name): with st.spinner(f'Mejorando {var_name} con IA...'): try: improved_text, context = mejorar_texto_con_IA(var_name, momentos_evaluacion, vectordb_list, nombre_curso) st.session_state['improved_' + var_name] = improved_text st.session_state['context_' + var_name] = context st.rerun() except Exception as e: st.warning(e) pass if 'context_' + var_name in st.session_state: st.warning("Fragmentos del PEI-UdeA usados por la IA") st.info(st.session_state['context_' + var_name]) with st.expander("BIBLIOGRAFÍA Y OTRAS FUENTES"): bibliografia = st.text_area("Incluir solo la bibliografía que se requiere para el desarrollo del curso.", value=st.session_state.get('bibliografia', ''), key='bibliografia') with st.expander("COMUNIDAD ACADÉMICA QUE PARTICIPÓ EN LA ELABORACIÓN DEL MICROCURRÍCULO"): nombres_apellidos = st.text_area("Nombres y apellidos:", value=st.session_state.get('nombres_apellidos', ''), key='nombres_apellidos') unidad_academica_participantes = st.text_area("Unidad académica:", value=st.session_state.get('unidad_academica_participantes', ''), key='unidad_academica_participantes') formacion_academica = st.text_area("Formación académica:", value=st.session_state.get('formacion_academica', ''), key='formacion_academica') # Suponiendo que st.session_state ya contiene las variables necesarias variables = st.session_state.to_dict() variables['estrategias_didacticas'] = ', '.join(variables.get('estrategias_didacticas', [])) if "Otra(s)" in variables.get('estrategias_didacticas', '') and variables.get('estrategias_otras', ''): variables['estrategias_didacticas'] += f", {variables['estrategias_otras']}" def generar_documento(): doc_buffer = crear_documento(variables['nombre_curso'], variables) return doc_buffer.getvalue() st.download_button( label="Descargar Microcurriculum", data=generar_documento(), file_name=f"Microcurriculum_{variables['nombre_curso']}.docx", mime="application/vnd.openxmlformats-officedocument.wordprocessingml.document" )