Refactor conversation handling in the OpenAI integration notebook
- Updated execution counts for code cells to reflect the correct order of execution. - Modified the structure of conversation-related database interactions to align with new naming conventions. - Enhanced the conversation creation process by including additional metadata and improving the response handling. - Implemented better error handling and logging for conversation archiving and message retrieval. - Adjusted the schema definitions for input and output to ensure compatibility with the latest API changes.
This commit is contained in:
@@ -2,7 +2,7 @@
|
||||
"cells": [
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 8,
|
||||
"execution_count": 1,
|
||||
"id": "a9a99d9d",
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
@@ -19,7 +19,7 @@
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 9,
|
||||
"execution_count": 2,
|
||||
"id": "89b3fffb",
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
@@ -27,19 +27,290 @@
|
||||
"import { createClient } from \"@supabase/supabase-js\";\n",
|
||||
"const supabaseUrl = Deno.env.get(\"SUPABASE_URL\") || env.SUPABASE_URL;\n",
|
||||
"const supabaseKey = Deno.env.get(\"SUPABASE_ANON_KEY\") || env.SUPABASE_ANON_KEY;\n",
|
||||
"const supabase = createClient(supabaseUrl, supabaseKey);"
|
||||
"const supabase = createClient(supabaseUrl, supabaseKey);\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": null,
|
||||
"execution_count": 48,
|
||||
"id": "fea911a1",
|
||||
"metadata": {},
|
||||
"outputs": [
|
||||
{
|
||||
"data": {
|
||||
"text/plain": [
|
||||
"{\n",
|
||||
" id: \u001b[32m\"4660b774-a6e2-44f4-a340-747b41235c7c\"\u001b[39m,\n",
|
||||
" carrera_id: \u001b[32m\"089cdeda-d557-4a57-b49f-eb44921dfa3a\"\u001b[39m,\n",
|
||||
" estructura_id: \u001b[32m\"69fb2b77-5a95-47e0-bf1f-389d384200e4\"\u001b[39m,\n",
|
||||
" nombre: \u001b[32m\"Ingeniería en Sistemas Domóticos (2027)\"\u001b[39m,\n",
|
||||
" nivel: \u001b[32m\"Otro\"\u001b[39m,\n",
|
||||
" tipo_ciclo: \u001b[32m\"Semestre\"\u001b[39m,\n",
|
||||
" numero_ciclos: \u001b[33m9\u001b[39m,\n",
|
||||
" datos: {\n",
|
||||
" nivel: \u001b[32m\"Bachillerato\"\u001b[39m,\n",
|
||||
" nombre: \u001b[32m\"Especialización en Gravedad Cuántica de Bucles\"\u001b[39m,\n",
|
||||
" area_de_estudio: \u001b[32m\"Ciencias Físico-Matemáticas\"\u001b[39m,\n",
|
||||
" perfil_de_egreso: \u001b[32m\"La Specialización en Gravedad Cuántica de Bucles formará a un especialista capaz de integrar creativamente conocimientos avanzados en física, matemáticas y computación para enfrentar problemas teóricos y fenomenológicos en la intersección de la relatividad general y la mecánica cuántica. Al finalizar el programa, el egresado será capaz de: 1) Comprender y aplicar los fundamentos de la gravedad cuántica de bucles, incluyendo su formulación canónica, las variables de Ashtekar y el formalismo de redes de espín; 2) Desarrollar modelos y simulaciones rigurosas de fenómenos cuántico-gravitacionales, empleando métodos numéricos y herramientas de cómputo científico para analizar redes y espumas de espín, así como su relación con la cosmología cuántica; 3) Utilizar y conectar conceptos avanzados de geometría diferencial, teoría de grupos de Lie, representaciones y espinores para la construcción de estados cuánticos geométricos; 4) Resolver y comunicar de manera crítica problemas de frontera en física teórica contemporánea, integrando procesos de modelado matemático, análisis computacional y validación fenomenológica; 5) Evaluar y proponer soluciones innovadoras en entornos de trabajo colaborativo, mostrando habilidad para desarrollar proyectos científicos reproducibles bajo principios éticos y de buenas prácticas en la investigación; 6) Integrarse a comunidades científicas y continuar con estudios de posgrado o desempeñarse en entornos interdisciplinares que involucren física matemática, simulación, cosmología, información cuántica o modelado de sistemas complejos.\"\u001b[39m,\n",
|
||||
" diseno_curricular: \u001b[32m\"Rígido\"\u001b[39m,\n",
|
||||
" perfil_de_ingreso: \u001b[32m\"El aspirante debe haber concluido el bachillerato con perfil Área 1 (Ciencias Físico-Matemáticas), lo que implica sólidas bases en matemáticas, física, química, razonamiento lógico y competencia en análisis de problemas. Se espera capacidad para el aprendizaje autónomo y familiaridad con herramientas y conceptos científicos y tecnológicos, así como interés en la resolución de problemas complejos y trabajo experimental.\"\u001b[39m,\n",
|
||||
" curso_propedeutico: \u001b[32m\"No tiene\"\u001b[39m,\n",
|
||||
" modalidad_educativa: \u001b[32m\"Escolar\"\u001b[39m,\n",
|
||||
" antecedente_academico: \u001b[32m\"Bachillerato en Ciencias Físico-Matemáticas, con orientación en matemáticas y física; requisito previo para ingreso a la especialización. El plan asume que el aspirante ha concluido un bachillerato con áreas de Ciencias Físico-Matemáticas.\"\u001b[39m,\n",
|
||||
" carga_horaria_a_la_semana: \u001b[33m27\u001b[39m,\n",
|
||||
" programa_de_investigacion: \u001b[32m\"No aplica\"\u001b[39m,\n",
|
||||
" clave_del_plan_de_estudios: \u001b[32m\"2020\"\u001b[39m,\n",
|
||||
" duracion_del_ciclo_escolar: \u001b[32m\"16 semanas\"\u001b[39m,\n",
|
||||
" fines_de_aprendizaje_o_formacion: \u001b[32m\"Analizar fundamentos de la gravedad cuántica de bucles y su relación con la relatividad general; Diseñar modelos computacionales para explorar redes de espín y espumas cuánticas, con enfoque en cosmología cuántica; Evaluar resultados numéricos mediante criterios de reproducibilidad y validación fenomenológica; Comunicar resultados científicos de forma clara, estructurada y técnica; Integrar conceptos de domótica, electrónica, control y sistemas computacionales mediante herramientas de simulación para proyectos interdisciplinarios y el desarrollo de asistentes virtuales; Aplicar herramientas de cómputo para la creación de proyectos con código reproducible y documentación adecuada; Desarrollar capacidades de trabajo en equipo, ética científica y buenas prácticas en investigación.\"\u001b[39m,\n",
|
||||
" total_de_ciclos_del_plan_de_estudios: \u001b[32m\"9\"\u001b[39m,\n",
|
||||
" sustento_teorico_del_modelo_curricular: \u001b[32m\"No aplica\"\u001b[39m,\n",
|
||||
" justificacion_de_la_propuesta_curricular: \u001b[32m\"No aplica\"\u001b[39m,\n",
|
||||
" administracion_y_operatividad_del_plan_de_estudios: \u001b[32m\"La administración y operatividad del plan de estudios se ubica bajo la Dirección de Asuntos Académicos - Anexo 1; modalidad escolar; estructura rígida con 9 ciclos; carga horaria semanal de 27 horas; responsable: Lic. María González Pérez, Directora Académica; procesos de revisión y actualización conforme a la Propuesta de Evaluación Periódica y a los lineamientos del Acuerdo 17/11/17.\"\u001b[39m,\n",
|
||||
" propuesta_de_evaluacion_periodica_del_plan_de_estudios: \u001b[32m\"Nivel de evaluación curricular interna: diagnóstico de estructura y operación. Análisis técnico-pedagógico del planteamiento curricular vigente; consulta a directivos del área académica para valorar problemáticas de formación y operación; consulta a docentes sobre problemáticas de formación, operación y necesidades disciplinarias; estudio de opinión de estudiantes sobre la formación y operación. Nivel de evaluación curricular externa: diagnóstico de impacto y prácticas profesionales. Análisis del estado del conocimiento en campos disciplinarios vinculados al programa, comparación de planes y tendencias en criterios de organismos evaluadores; estudio con egresados y empleadores para valorar inserción laboral y requerimientos actuales; recopilación de criterios y reformas necesarias para mantener el programa actualizado y acorde con la disciplina.\"\u001b[39m\n",
|
||||
" },\n",
|
||||
" estado_actual_id: \u001b[32m\"18f49b67-8077-4371-be6e-2019a3be3562\"\u001b[39m,\n",
|
||||
" activo: \u001b[33mtrue\u001b[39m,\n",
|
||||
" tipo_origen: \u001b[32m\"IA\"\u001b[39m,\n",
|
||||
" meta_origen: {\n",
|
||||
" iaConfig: {\n",
|
||||
" usarMCP: \u001b[33mfalse\u001b[39m,\n",
|
||||
" notasAdicionales: \u001b[32m\"Agrega a los asistentes virtuales\"\u001b[39m,\n",
|
||||
" descripcionEnfoque: \u001b[32m\"Carrera relacionada con la domótica, electrónica, control y sistemas computacionales\"\u001b[39m\n",
|
||||
" },\n",
|
||||
" referencias: { repositoriosIds: [], archivosReferenciaIds: [] },\n",
|
||||
" generado_por: \u001b[32m\"ai_generate_plan\"\u001b[39m,\n",
|
||||
" ai_structured: {\n",
|
||||
" model: \u001b[32m\"gpt-5-nano-2025-08-07\"\u001b[39m,\n",
|
||||
" usage: {\n",
|
||||
" input_tokens: \u001b[33m9812\u001b[39m,\n",
|
||||
" total_tokens: \u001b[33m19204\u001b[39m,\n",
|
||||
" output_tokens: \u001b[33m9392\u001b[39m,\n",
|
||||
" input_tokens_details: { cached_tokens: \u001b[33m0\u001b[39m },\n",
|
||||
" output_tokens_details: { reasoning_tokens: \u001b[33m8256\u001b[39m }\n",
|
||||
" },\n",
|
||||
" responseId: \u001b[32m\"resp_0b1339b15ea08d51006973b4892a20819c954b7fe00a35e1ed\"\u001b[39m,\n",
|
||||
" conversationId: \u001b[1mnull\u001b[22m\n",
|
||||
" }\n",
|
||||
" },\n",
|
||||
" creado_por: \u001b[1mnull\u001b[22m,\n",
|
||||
" actualizado_por: \u001b[1mnull\u001b[22m,\n",
|
||||
" creado_en: \u001b[32m\"2026-01-23T17:50:00.85346+00:00\"\u001b[39m,\n",
|
||||
" actualizado_en: \u001b[32m\"2026-01-23T22:00:33.119999+00:00\"\u001b[39m,\n",
|
||||
" nombre_search: \u001b[32m\"ingenieria en sistemas domoticos (2027)\"\u001b[39m,\n",
|
||||
" plan_hash: \u001b[32m\"d7a4bd1c6d444ceb11be1dba\"\u001b[39m,\n",
|
||||
" estructuras_plan: {\n",
|
||||
" definicion: {\n",
|
||||
" type: \u001b[32m\"object\"\u001b[39m,\n",
|
||||
" required: [\n",
|
||||
" \u001b[32m\"nombre_autorizado_de_la_institucion\"\u001b[39m,\n",
|
||||
" \u001b[32m\"nivel_y_nombre_del_plan_de_estudios\"\u001b[39m,\n",
|
||||
" \u001b[32m\"modalidad_educativa\"\u001b[39m,\n",
|
||||
" \u001b[32m\"vigencia\"\u001b[39m,\n",
|
||||
" \u001b[32m\"antecedente_academico\"\u001b[39m,\n",
|
||||
" \u001b[32m\"area_de_estudio\"\u001b[39m,\n",
|
||||
" \u001b[32m\"clave_del_plan_de_estudios\"\u001b[39m,\n",
|
||||
" \u001b[32m\"diseno_curricular\"\u001b[39m,\n",
|
||||
" \u001b[32m\"total_de_ciclos_del_plan_de_estudios\"\u001b[39m,\n",
|
||||
" \u001b[32m\"duracion_del_ciclo_escolar\"\u001b[39m,\n",
|
||||
" \u001b[32m\"carga_horaria_a_la_semana\"\u001b[39m,\n",
|
||||
" \u001b[32m\"fines_de_aprendizaje_o_formacion\"\u001b[39m,\n",
|
||||
" \u001b[32m\"perfil_de_egreso\"\u001b[39m,\n",
|
||||
" \u001b[32m\"programa_de_investigacion\"\u001b[39m,\n",
|
||||
" \u001b[32m\"curso_propedeutico\"\u001b[39m,\n",
|
||||
" \u001b[32m\"perfil_de_ingreso\"\u001b[39m,\n",
|
||||
" \u001b[32m\"administracion_y_operatividad_del_plan_de_estudios\"\u001b[39m,\n",
|
||||
" \u001b[32m\"sustento_teorico_del_modelo_curricular\"\u001b[39m,\n",
|
||||
" \u001b[32m\"justificacion_de_la_propuesta_curricular\"\u001b[39m,\n",
|
||||
" \u001b[32m\"propuesta_de_evaluacion_periodica_del_plan_de_estudios\"\u001b[39m,\n",
|
||||
" \u001b[32m\"nombre_y_cargo_de_la_persona_facultada_para_autorizar_el_plan_de_estudios\"\u001b[39m\n",
|
||||
" ],\n",
|
||||
" properties: {\n",
|
||||
" vigencia: {\n",
|
||||
" type: \u001b[32m\"string\"\u001b[39m,\n",
|
||||
" title: \u001b[32m\"Vigencia\"\u001b[39m,\n",
|
||||
" examples: \u001b[36m[Array]\u001b[39m,\n",
|
||||
" description: \u001b[32m\"(Espacio para uso exclusivo de la autoridad educativa)\"\u001b[39m,\n",
|
||||
" referencia_normativa: \u001b[32m\"Dato administrativo del Anexo 1.\"\u001b[39m\n",
|
||||
" },\n",
|
||||
" area_de_estudio: {\n",
|
||||
" type: \u001b[32m\"string\"\u001b[39m,\n",
|
||||
" title: \u001b[32m\"Área de estudio\"\u001b[39m,\n",
|
||||
" examples: \u001b[36m[Array]\u001b[39m,\n",
|
||||
" description: \u001b[32m\"Señalar el “campo amplio” al que pertenece el plan de estudios. Para ello, considerar la Clasificación Mexicana de Planes de Estudio por Campos de Formación Académica (CMPE 2016), publicado por INEGI.\"\u001b[39m,\n",
|
||||
" referencia_normativa: \u001b[32m\"Deberá vincularse con el fin de aprendizaje y perfil de egreso del plan de estudios.\"\u001b[39m\n",
|
||||
" },\n",
|
||||
" perfil_de_egreso: {\n",
|
||||
" type: \u001b[32m\"string\"\u001b[39m,\n",
|
||||
" title: \u001b[32m\"Perfil de egreso\"\u001b[39m,\n",
|
||||
" examples: \u001b[36m[Array]\u001b[39m,\n",
|
||||
" description: \u001b[32m\"Describir los atributos que habrán desarrollado los estudiantes al concluir el plan de estudios, acordes al nivel educativo y denominación propuesta. De preferencia, dividirlo en conocimientos, habilidades y actitudes.\"\u001b[39m,\n",
|
||||
" referencia_normativa: \u001b[32m\"Corresponde al requisito 'Perfil de egreso' del Artículo 8, fracción VI del Acuerdo 17/11/17.\"\u001b[39m\n",
|
||||
" },\n",
|
||||
" diseno_curricular: {\n",
|
||||
" enum: \u001b[36m[Array]\u001b[39m,\n",
|
||||
" type: \u001b[32m\"string\"\u001b[39m,\n",
|
||||
" title: \u001b[32m\"Diseño curricular\"\u001b[39m,\n",
|
||||
" examples: \u001b[36m[Array]\u001b[39m,\n",
|
||||
" description: \u001b[32m\"Indicar si es “Rígido” o “Flexible”.\"\u001b[39m,\n",
|
||||
" referencia_normativa: \u001b[32m\"Define la estructura para el requisito 'Mapa curricular' del Artículo 8, fracción VII del Acuerdo 17/11/17.\"\u001b[39m\n",
|
||||
" },\n",
|
||||
" perfil_de_ingreso: {\n",
|
||||
" type: \u001b[32m\"string\"\u001b[39m,\n",
|
||||
" title: \u001b[32m\"Perfil de ingreso\"\u001b[39m,\n",
|
||||
" examples: \u001b[36m[Array]\u001b[39m,\n",
|
||||
" description: \u001b[32m\"Indicar las condiciones académicas ideales (conocimientos, habilidades y aptitudes), para incorporarse al plan de estudios. Deberá vincularse con el nivel educativo y campo de estudio.\"\u001b[39m,\n",
|
||||
" referencia_normativa: \u001b[32m\"Corresponde al requisito 'Perfil de ingreso' (condiciones mínimas requeridas) del Artículo 8, fracción V del Acuerdo 17/11/17.\"\u001b[39m\n",
|
||||
" },\n",
|
||||
" curso_propedeutico: {\n",
|
||||
" type: \u001b[36m[Array]\u001b[39m,\n",
|
||||
" title: \u001b[32m\"Curso propedéutico\"\u001b[39m,\n",
|
||||
" examples: \u001b[36m[Array]\u001b[39m,\n",
|
||||
" description: \u001b[32m\"Señalar las situaciones en las que aplicará el curso propedéutico, la población a la que estará dirigido, su duración, la relación con el plan de estudios, así como la información que considere relevante.\"\u001b[39m,\n",
|
||||
" referencia_normativa: \u001b[32m\"Elemento opcional mencionado en las guías de llenado del Anexo 1.\"\u001b[39m\n",
|
||||
" },\n",
|
||||
" modalidad_educativa: {\n",
|
||||
" enum: \u001b[36m[Array]\u001b[39m,\n",
|
||||
" type: \u001b[32m\"string\"\u001b[39m,\n",
|
||||
" title: \u001b[32m\"Modalidad educativa\"\u001b[39m,\n",
|
||||
" examples: \u001b[36m[Array]\u001b[39m,\n",
|
||||
" description: \u001b[32m\"Señalar la modalidad educativa en la que se impartirá el plan de estudios: escolar, no escolarizada o mixta.\"\u001b[39m,\n",
|
||||
" referencia_normativa: \u001b[32m\"Corresponde al requisito de 'Modalidad educativa' del Artículo 8, fracción II del Acuerdo 17/11/17.\"\u001b[39m\n",
|
||||
" },\n",
|
||||
" antecedente_academico: {\n",
|
||||
" type: \u001b[32m\"string\"\u001b[39m,\n",
|
||||
" title: \u001b[32m\"Antecedente académico\"\u001b[39m,\n",
|
||||
" examples: \u001b[36m[Array]\u001b[39m,\n",
|
||||
" description: \u001b[32m\"Señalar el nivel educativo requerido para ingresar al plan de estudios. Para posgrados, además del nivel educativo; indicar la(s) disciplina(s) o área(s) afín(es) al plan de estudios.\"\u001b[39m,\n",
|
||||
" referencia_normativa: \u001b[32m\"Corresponde al requisito 'Perfil de ingreso' (antecedente académico necesario) del Artículo 8, fracción V del Acuerdo 17/11/17.\"\u001b[39m\n",
|
||||
" },\n",
|
||||
" carga_horaria_a_la_semana: {\n",
|
||||
" type: \u001b[32m\"number\"\u001b[39m,\n",
|
||||
" title: \u001b[32m\"Carga horaria a la semana\"\u001b[39m,\n",
|
||||
" examples: \u001b[36m[Array]\u001b[39m,\n",
|
||||
" description: \u001b[32m\"Indicar la máxima carga horaria impartida a la semana; no mayor a 50 horas bajo la conducción de un académico.\"\u001b[39m,\n",
|
||||
" referencia_normativa: \u001b[32m\"Corresponde a la restricción 'sin exceder una carga máxima de 50 horas efectivas por semana' del Artículo 8, fracción III del Acuerdo 17/11/17.\"\u001b[39m\n",
|
||||
" },\n",
|
||||
" programa_de_investigacion: {\n",
|
||||
" type: \u001b[36m[Array]\u001b[39m,\n",
|
||||
" title: \u001b[32m\"Programa de investigación\"\u001b[39m,\n",
|
||||
" examples: \u001b[36m[Array]\u001b[39m,\n",
|
||||
" description: \u001b[32m\"(Obligatorio para el nivel de Doctorado y para aquéllas Maestrías orientadas a la investigación). Presentar el programa de investigación que describa los objetivos del programa y líneas de investigación con sus respectivos objetivos. Asimismo, detallar la vinculación con las asignaturas que conforman el plan de estudios, la metodología y presentación de las investigaciones, así como el perfil de los docentes que guiarán su desarrollo.\"\u001b[39m,\n",
|
||||
" referencia_normativa: \u001b[32m\"Requisito obligatorio solo para Doctorados o Maestrías con orientación a investigación según el Artículo 10, fracción III incisos b) y c) del Acuerdo 17/11/17.\"\u001b[39m\n",
|
||||
" },\n",
|
||||
" clave_del_plan_de_estudios: {\n",
|
||||
" type: \u001b[32m\"string\"\u001b[39m,\n",
|
||||
" title: \u001b[32m\"Clave / Año del plan\"\u001b[39m,\n",
|
||||
" examples: \u001b[36m[Array]\u001b[39m,\n",
|
||||
" description: \u001b[32m\"Señalar el año en el que solicita el trámite.\"\u001b[39m,\n",
|
||||
" referencia_normativa: \u001b[32m\"Dato administrativo del Anexo 1.\"\u001b[39m\n",
|
||||
" },\n",
|
||||
" duracion_del_ciclo_escolar: {\n",
|
||||
" type: \u001b[32m\"string\"\u001b[39m,\n",
|
||||
" title: \u001b[32m\"Duración mínima en semanas de cada ciclo escolar\"\u001b[39m,\n",
|
||||
" examples: \u001b[36m[Array]\u001b[39m,\n",
|
||||
" description: \u001b[32m\"Señalar el número mínimo de semanas efectivas de clase que integran el tipo de ciclo en el que se imparte el plan de estudios.\"\u001b[39m,\n",
|
||||
" referencia_normativa: \u001b[32m\"Corresponde exactamente al requisito 'Duración mínima en semanas' del Artículo 8, fracción III del Acuerdo 17/11/17.\"\u001b[39m\n",
|
||||
" },\n",
|
||||
" fines_de_aprendizaje_o_formacion: {\n",
|
||||
" type: \u001b[32m\"string\"\u001b[39m,\n",
|
||||
" title: \u001b[32m\"Fin de aprendizaje o formación\"\u001b[39m,\n",
|
||||
" examples: \u001b[36m[Array]\u001b[39m,\n",
|
||||
" description: \u001b[32m\"Describir los aprendizajes que lograrán los estudiantes al concluir el plan de estudios. Deberá corresponder con el nivel educativo y la denominación del plan de estudios.\"\u001b[39m,\n",
|
||||
" referencia_normativa: \u001b[32m\"Corresponde al requisito 'Descripción de los fines del aprendizaje o formación' del Artículo 8, fracción IV del Acuerdo 17/11/17.\"\u001b[39m\n",
|
||||
" },\n",
|
||||
" nivel_y_nombre_del_plan_de_estudios: {\n",
|
||||
" type: \u001b[32m\"string\"\u001b[39m,\n",
|
||||
" title: \u001b[32m\"Nivel y nombre del plan de estudios\"\u001b[39m,\n",
|
||||
" examples: \u001b[36m[Array]\u001b[39m,\n",
|
||||
" description: \u001b[32m\"Indicar el nivel educativo y denominación del plan de estudios.\"\u001b[39m,\n",
|
||||
" referencia_normativa: \u001b[32m\"Corresponde al requisito 'Nivel y denominación del plan de estudios' del Artículo 8, fracción I del Acuerdo 17/11/17.\"\u001b[39m\n",
|
||||
" },\n",
|
||||
" nombre_autorizado_de_la_institucion: {\n",
|
||||
" type: \u001b[32m\"string\"\u001b[39m,\n",
|
||||
" title: \u001b[32m\"Nombre autorizado de la institución\"\u001b[39m,\n",
|
||||
" examples: \u001b[36m[Array]\u001b[39m,\n",
|
||||
" description: \u001b[32m\"Proporcionar el nombre de la institución autorizado por SEP.\"\u001b[39m,\n",
|
||||
" referencia_normativa: \u001b[32m\"Dato administrativo del Anexo 1.\"\u001b[39m\n",
|
||||
" },\n",
|
||||
" total_de_ciclos_del_plan_de_estudios: {\n",
|
||||
" type: \u001b[32m\"string\"\u001b[39m,\n",
|
||||
" title: \u001b[32m\"Número de ciclos escolares que integrarán el plan de estudio\"\u001b[39m,\n",
|
||||
" examples: \u001b[36m[Array]\u001b[39m,\n",
|
||||
" description: \u001b[32m\"En diseño flexible especificar mínimo y máximo de ciclos. En diseño rígido especificar el total de ciclos.\"\u001b[39m,\n",
|
||||
" referencia_normativa: \u001b[32m\"Corresponde a 'señalando el número de ciclos en que se impartirá' del Artículo 8, fracción III del Acuerdo 17/11/17.\"\u001b[39m\n",
|
||||
" },\n",
|
||||
" sustento_teorico_del_modelo_curricular: {\n",
|
||||
" type: \u001b[36m[Array]\u001b[39m,\n",
|
||||
" title: \u001b[32m\"Sustento teórico del modelo curricular\"\u001b[39m,\n",
|
||||
" examples: \u001b[36m[Array]\u001b[39m,\n",
|
||||
" description: \u001b[32m\"Presentar de forma concreta el marco conceptual en el que se justifica y fundamenta el diseño y organización curricular del plan de estudios.\"\u001b[39m,\n",
|
||||
" referencia_normativa: \u001b[32m\"Corresponde al 'sustento teórico del modelo curricular' que el particular puede incluir según el Artículo 8 (párrafo tercero) del Acuerdo 17/11/17.\"\u001b[39m\n",
|
||||
" },\n",
|
||||
" justificacion_de_la_propuesta_curricular: {\n",
|
||||
" type: \u001b[36m[Array]\u001b[39m,\n",
|
||||
" title: \u001b[32m\"Justificación de la propuesta curricular en la modalidad no escolarizada o mixta\"\u001b[39m,\n",
|
||||
" examples: \u001b[36m[Array]\u001b[39m,\n",
|
||||
" description: \u001b[32m\"(Exclusivo para modalidades no escolarizada y mixta). Describir cómo se impartirá el plan de estudios en la modalidad educativa elegida, los recursos tecnológicos y/o didácticos que emplearán para su desarrollo y su vinculación con las asignaturas y actividades de aprendizaje.\"\u001b[39m,\n",
|
||||
" referencia_normativa: \u001b[32m\"Corresponde a lo solicitado en el Artículo 14 (justificación de modalidad) y Artículo 15 (especificaciones de plataforma/modelo) del Acuerdo 17/11/17.\"\u001b[39m\n",
|
||||
" },\n",
|
||||
" administracion_y_operatividad_del_plan_de_estudios: {\n",
|
||||
" type: \u001b[36m[Array]\u001b[39m,\n",
|
||||
" title: \u001b[32m\"Administración y operatividad del plan de estudios\"\u001b[39m,\n",
|
||||
" examples: \u001b[36m[Array]\u001b[39m,\n",
|
||||
" description: \u001b[32m\"Describir la administración del plan de estudios, así como su operatividad; considerando el tipo de diseño curricular empleado. Si es flexible; incorporar el número mínimo y máximo de asignaturas que se cursarán por ciclo.\"\u001b[39m,\n",
|
||||
" referencia_normativa: \u001b[32m\"Corresponde a la 'descripción detallada de la(s) forma(s) de administración y operatividad' permitida en el Artículo 8 (párrafo tercero) del Acuerdo 17/11/17.\"\u001b[39m\n",
|
||||
" },\n",
|
||||
" propuesta_de_evaluacion_periodica_del_plan_de_estudios: {\n",
|
||||
" type: \u001b[36m[Array]\u001b[39m,\n",
|
||||
" title: \u001b[32m\"Propuesta de evaluación periódica del plan de estudios\"\u001b[39m,\n",
|
||||
" examples: \u001b[36m[Array]\u001b[39m,\n",
|
||||
" description: \u001b[32m\"Describir de manera detallada la metodología que emplearán para la evaluación del plan de estudios, incluyendo los instrumentos y periodicidad en la que se llevará a cabo; con la finalidad de mantenerlo actualizado y acorde a las necesidades educativas y disciplinares.\"\u001b[39m,\n",
|
||||
" referencia_normativa: \u001b[32m\"Corresponde al requisito 'Propuesta de evaluación periódica del Plan de estudio' del Artículo 8, fracción VIII del Acuerdo 17/11/17.\"\u001b[39m\n",
|
||||
" },\n",
|
||||
" nombre_y_cargo_de_la_persona_facultada_para_autorizar_el_plan_de_estudios: {\n",
|
||||
" type: \u001b[32m\"string\"\u001b[39m,\n",
|
||||
" title: \u001b[32m\"Nombre y cargo de la persona facultada para autorizar el plan de estudios\"\u001b[39m,\n",
|
||||
" examples: \u001b[36m[Array]\u001b[39m,\n",
|
||||
" description: \u001b[32m\"Indicar el nombre y cargo de la persona facultada para autorizar el plan de estudios.\"\u001b[39m,\n",
|
||||
" referencia_normativa: \u001b[32m\"Dato administrativo del Anexo 1.\"\u001b[39m\n",
|
||||
" }\n",
|
||||
" },\n",
|
||||
" additionalProperties: \u001b[33mfalse\u001b[39m\n",
|
||||
" }\n",
|
||||
" }\n",
|
||||
"}"
|
||||
]
|
||||
},
|
||||
"execution_count": 48,
|
||||
"metadata": {},
|
||||
"output_type": "execute_result"
|
||||
}
|
||||
],
|
||||
"source": [
|
||||
"const { data: input } = await supabase.from(\"planes_estudio\")\n",
|
||||
".select(\"*, estructuras_plan (definicion)\").limit(1).single();\n",
|
||||
"input"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 49,
|
||||
"id": "33290880",
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
"outputs": [
|
||||
{
|
||||
"data": {
|
||||
"text/plain": [
|
||||
"{ id: \u001b[32m\"623fe7e9-9b38-46aa-ba0c-15fb337d851e\"\u001b[39m }"
|
||||
]
|
||||
},
|
||||
"execution_count": 49,
|
||||
"metadata": {},
|
||||
"output_type": "execute_result"
|
||||
}
|
||||
],
|
||||
"source": [
|
||||
"// Create a conversation for a plan de estudio\n",
|
||||
"\n",
|
||||
"const { data: input } = await supabase.from(\"planes_estudio\").limit(1).select(\"id\").single();\n",
|
||||
"const openaiConversation = await openai.conversations.create({\n",
|
||||
" metadata: {\n",
|
||||
" \"tabla\": \"planes_estudio\",\n",
|
||||
@@ -53,10 +324,30 @@
|
||||
" ],\n",
|
||||
"});\n",
|
||||
"\n",
|
||||
"const conversationPlane = await supabase.from(\"conversation_planes_estudio\").insert({\n",
|
||||
" conversation_id: openaiConversation.id,\n",
|
||||
"const {data: conversationPlane} = await supabase.from(\"conversaciones_plan\").insert({\n",
|
||||
" openai_conversation_id: openaiConversation.id,\n",
|
||||
" plan_estudio_id: input.id,\n",
|
||||
"}).select(\"id\").single();"
|
||||
"}).select(\"id\").single();\n",
|
||||
"\n",
|
||||
"conversationPlane"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 51,
|
||||
"id": "2c222219",
|
||||
"metadata": {},
|
||||
"outputs": [
|
||||
{
|
||||
"name": "stdout",
|
||||
"output_type": "stream",
|
||||
"text": [
|
||||
"4660b774-a6e2-44f4-a340-747b41235c7c 623fe7e9-9b38-46aa-ba0c-15fb337d851e conv_698f3438114c8194a400f01568cf1a56058487a13fa1da16\n"
|
||||
]
|
||||
}
|
||||
],
|
||||
"source": [
|
||||
"console.log(input.id, conversationPlane.id, openaiConversation.id);\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
@@ -64,45 +355,190 @@
|
||||
"execution_count": null,
|
||||
"id": "f726b80e",
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
"outputs": [
|
||||
{
|
||||
"data": {
|
||||
"text/plain": [
|
||||
"{\n",
|
||||
" id: \u001b[32m\"conv_698f33afabe48195a8a5788835263c32097da13f4f3911d1\"\u001b[39m,\n",
|
||||
" object: \u001b[32m\"conversation.deleted\"\u001b[39m,\n",
|
||||
" deleted: \u001b[33mtrue\u001b[39m\n",
|
||||
"}"
|
||||
]
|
||||
},
|
||||
"execution_count": 47,
|
||||
"metadata": {},
|
||||
"output_type": "execute_result"
|
||||
}
|
||||
],
|
||||
"source": [
|
||||
"// Archivar una conversación\n",
|
||||
"const { data: conversation } = await supabase.from(\"conversation_planes_estudio\").limit(1).select(\"conversation_id\").single();\n",
|
||||
"\n",
|
||||
"const items = await openai.conversations.items(conversation.conversation_id);\n",
|
||||
"await supabase.from(\"conversation_planes_estudio\").update({\n",
|
||||
"const items = await openai.conversations.items.list(conversation.openai_conversation_id);\n",
|
||||
"await supabase.from(\"conversaciones_plan\").update({\n",
|
||||
" estado: \"ARCHIVANDO\",\n",
|
||||
" conversation_json: items,\n",
|
||||
" conversacion_json: items,\n",
|
||||
"}).eq(\"id\", conversationPlane.id);\n",
|
||||
"\n",
|
||||
"await openai.conversations.delete(conversation.conversation_id);"
|
||||
"await openai.conversations.delete(conversation.openai_conversation_id);"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": null,
|
||||
"execution_count": 58,
|
||||
"id": "cfae6e48",
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
"outputs": [
|
||||
{
|
||||
"data": {
|
||||
"text/plain": [
|
||||
"[\n",
|
||||
" {\n",
|
||||
" id: \u001b[32m\"msg_058487a13fa1da1600698f347ff8ac81948528bcffdd319170\"\u001b[39m,\n",
|
||||
" type: \u001b[32m\"message\"\u001b[39m,\n",
|
||||
" status: \u001b[32m\"completed\"\u001b[39m,\n",
|
||||
" content: [\n",
|
||||
" {\n",
|
||||
" type: \u001b[32m\"output_text\"\u001b[39m,\n",
|
||||
" annotations: [],\n",
|
||||
" logprobs: [],\n",
|
||||
" text: \u001b[32m'{\"perfil_de_ingreso\":\"El aspirante debe haber concluido el bachillerato con un perfil orientado a áreas de Ciencias e Ingenierías, con sólida formación en matemáticas, física y tecnología. Se requieren habilidades en razonamiento lógico, análisis de problemas complejos y capacidad de aprendizaje autónomo. Se valora el interés por la programación, electrónica básica, automatización, redes y sistemas embebidos, así como la capacidad de trabajar en equipo y de abordar proyectos interdisciplinarios en domótica, eficiencia energética y interacción humano–máquina. (Conforme al marco normativo aplicable, Artículo 8, fracción V del Acuerdo 17/11/17)\",\"programa_de_investigacion\":\"Desarrollo de un marco de domótica inteligente para la optimización energética, seguridad y confort en viviendas, integrando redes de sensores y dispositivos IoT con algoritmos de IA para control adaptativo; evaluación de interoperabilidad entre dispositivos, usabilidad y consideraciones de privacidad y ciberseguridad.\",\"ai-message\":\"Entendido. He generado una redacción más clara para el perfil de ingreso y propongo un tema de investigación relevante para el programa de investigación dentro de la disciplina de domótica, energía y seguridad.\"}'\u001b[39m\n",
|
||||
" }\n",
|
||||
" ],\n",
|
||||
" role: \u001b[32m\"assistant\"\u001b[39m\n",
|
||||
" },\n",
|
||||
" {\n",
|
||||
" id: \u001b[32m\"msg_058487a13fa1da1600698f345d5aa48194a93591b54113d934\"\u001b[39m,\n",
|
||||
" type: \u001b[32m\"message\"\u001b[39m,\n",
|
||||
" status: \u001b[32m\"completed\"\u001b[39m,\n",
|
||||
" content: [\n",
|
||||
" {\n",
|
||||
" type: \u001b[32m\"input_text\"\u001b[39m,\n",
|
||||
" text: \u001b[32m\"Dale una mejor redacción al perfil de ingreso y para el programa de investigación sugiere un tema de investigación relevante para el plan de estudio.\"\u001b[39m\n",
|
||||
" }\n",
|
||||
" ],\n",
|
||||
" role: \u001b[32m\"user\"\u001b[39m\n",
|
||||
" }\n",
|
||||
"]"
|
||||
]
|
||||
},
|
||||
"execution_count": 58,
|
||||
"metadata": {},
|
||||
"output_type": "execute_result"
|
||||
}
|
||||
],
|
||||
"source": [
|
||||
"// Listar conversaciones dadas de un plan de estudio\n",
|
||||
"const { data: conversations } = await supabase.from(\"conversation_planes_estudio\").select(\"*\").eq(\"plan_estudio_id\", input.id);\n",
|
||||
"conversations"
|
||||
"// Listar mensajes dado una conversacion_plan.id\n",
|
||||
"const { data: conversation } = await supabase.from(\"conversaciones_plan\").select(\"openai_conversation_id\").eq(\"id\", conversationPlane.id).single();\n",
|
||||
"const items = await openai.conversations.items.list(conversation.openai_conversation_id);\n",
|
||||
"items.data.filter((item) => item.type === \"message\" && [\"assistant\", \"user\"].includes(item.role))"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 54,
|
||||
"id": "83e060ae",
|
||||
"metadata": {},
|
||||
"outputs": [
|
||||
{
|
||||
"data": {
|
||||
"text/plain": [
|
||||
"{\n",
|
||||
" perfil_de_ingreso: \u001b[32m\"El aspirante debe haber concluido el bachillerato con un perfil orientado a áreas de Ciencias e Ingenierías, con sólida formación en matemáticas, física y tecnología. Se requieren habilidades en razonamiento lógico, análisis de problemas complejos y capacidad de aprendizaje autónomo. Se valora el interés por la programación, electrónica básica, automatización, redes y sistemas embebidos, así como la capacidad de trabajar en equipo y de abordar proyectos interdisciplinarios en domótica, eficiencia energética y interacción humano–máquina. (Conforme al marco normativo aplicable, Artículo 8, fracción V del Acuerdo 17/11/17)\"\u001b[39m,\n",
|
||||
" programa_de_investigacion: \u001b[32m\"Desarrollo de un marco de domótica inteligente para la optimización energética, seguridad y confort en viviendas, integrando redes de sensores y dispositivos IoT con algoritmos de IA para control adaptativo; evaluación de interoperabilidad entre dispositivos, usabilidad y consideraciones de privacidad y ciberseguridad.\"\u001b[39m,\n",
|
||||
" \u001b[32m\"ai-message\"\u001b[39m: \u001b[32m\"Entendido. He generado una redacción más clara para el perfil de ingreso y propongo un tema de investigación relevante para el programa de investigación dentro de la disciplina de domótica, energía y seguridad.\"\u001b[39m\n",
|
||||
"}"
|
||||
]
|
||||
},
|
||||
"execution_count": 54,
|
||||
"metadata": {},
|
||||
"output_type": "execute_result"
|
||||
}
|
||||
],
|
||||
"source": [
|
||||
"// Add a message to the conversation\n",
|
||||
"const campos = [\"programa_de_investigacion\", \"perfil_de_ingreso\"];\n",
|
||||
"\n",
|
||||
"const { data: conversationToUpdate } = await supabase.from(\n",
|
||||
" \"conversaciones_plan\",\n",
|
||||
").select(\"openai_conversation_id\").eq(\n",
|
||||
" \"id\",\n",
|
||||
" conversationPlane.id,\n",
|
||||
").single();\n",
|
||||
"\n",
|
||||
"const definicion = input.estructuras_plan.definicion;\n",
|
||||
"\n",
|
||||
"// Estructura que hace que la IA incluya mensaje, en la estructura le agregará otro campo llamado \"ai-mensaje\"\n",
|
||||
"const estructura_complementaria_de_respuesta = {\n",
|
||||
" properties: {\n",
|
||||
" \"ai-message\": {\n",
|
||||
" type: \"string\",\n",
|
||||
" description:\n",
|
||||
" \"Un mensaje que la IA incluirá en su respuesta para el usuario final que le confirme que ha entendido la solicitud y que ha mejorado el plan de estudio\",\n",
|
||||
" examples: [\n",
|
||||
" \"Claro, aquí tienes una mejor redacción para el perfil de ingreso. Además, he sugerido el siguiente tema de investigación relevante para el plan de estudio.\",\n",
|
||||
" ],\n",
|
||||
" },\n",
|
||||
" },\n",
|
||||
"};\n",
|
||||
"\n",
|
||||
"if (definicion?.type === \"object\" && definicion?.properties) {\n",
|
||||
" const entries = Object.entries(definicion.properties).filter(([key]) =>\n",
|
||||
" campos.includes(key)\n",
|
||||
" );\n",
|
||||
"\n",
|
||||
" input.estructuras_plan.definicion = {\n",
|
||||
" ...definicion,\n",
|
||||
" properties: Object.fromEntries(entries),\n",
|
||||
" required: Array.isArray(definicion.required)\n",
|
||||
" ? definicion.required.filter((key) => campos.includes(key))\n",
|
||||
" : undefined,\n",
|
||||
" };\n",
|
||||
"}\n",
|
||||
"\n",
|
||||
"if (definicion?.properties) {\n",
|
||||
" definicion.properties = {\n",
|
||||
" ...definicion.properties,\n",
|
||||
" ...estructura_complementaria_de_respuesta.properties,\n",
|
||||
" };\n",
|
||||
" definicion.required = [\n",
|
||||
" ...(definicion.required || []),\n",
|
||||
" ...Object.keys(estructura_complementaria_de_respuesta.properties),\n",
|
||||
" ];\n",
|
||||
"}\n",
|
||||
"\n",
|
||||
"const plan_sin_estructura = { ...input, estructuras_plan: undefined };\n",
|
||||
"\n",
|
||||
"const mejoras = await openai.responses.create({\n",
|
||||
" conversation: conversationToUpdate.openai_conversation_id,\n",
|
||||
" model: \"gpt-5-nano\",\n",
|
||||
" text: {\n",
|
||||
" format: { type: \"json_schema\", name: \"definicion\", schema: definicion },\n",
|
||||
" },\n",
|
||||
" metadata: {\n",
|
||||
" usuario: \"admin\",\n",
|
||||
" plan_estudio_id: input.id,\n",
|
||||
" },\n",
|
||||
" input: [{\n",
|
||||
" role: \"system\",\n",
|
||||
" content: `Eres un asistente que ayuda a mejorar este plan de estudio: ${\n",
|
||||
" JSON.stringify(plan_sin_estructura)\n",
|
||||
" }. Si te hacen una pregunta que no tiene nada que ver con el plan de estudio, responde con un refusal.`,\n",
|
||||
" }, {\n",
|
||||
" role: \"user\",\n",
|
||||
" content:\n",
|
||||
" \"Dale una mejor redacción al perfil de ingreso y para el programa de investigación sugiere un tema de investigación relevante para el plan de estudio.\",\n",
|
||||
" }],\n",
|
||||
"});\n",
|
||||
"JSON.parse(mejoras.output_text);\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": null,
|
||||
"id": "83e060ae",
|
||||
"id": "3e705a02",
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
"// Add a message to the conversation\n",
|
||||
"const { data: conversationToUpdate } = await supabase.from(\n",
|
||||
" \"conversation_planes_estudio\",\n",
|
||||
").eq(\"id\", conversationPlane.id)\n",
|
||||
" .select(\"conversation_id\").single();\n"
|
||||
]
|
||||
"source": []
|
||||
}
|
||||
],
|
||||
"metadata": {
|
||||
|
||||
Reference in New Issue
Block a user