posible solución a issue #60
Deploy Function / deploy (push) Successful in 21s

This commit is contained in:
2026-01-30 12:24:59 -06:00
parent fdc8b688b3
commit e1d865e6c3
5 changed files with 230 additions and 11 deletions
+6 -2
View File
@@ -1,8 +1,12 @@
{
"allowScripts": ["npm:deno@2.6.4", "npm:supabase-js@1.0.4", "npm:supabase@2.72.6"],
"allowScripts": [
"npm:deno@2.6.4",
"npm:supabase-js@1.0.4",
"npm:supabase@2.72.6"
],
"imports": {
"@openai/openai": "jsr:@openai/openai@^6.16.0",
"@zod/zod": "jsr:@zod/zod@^4.3.5"
"@zod/zod": "jsr:@zod/zod@^4.3.5",
"@david/dax": "jsr:@david/dax@^0.44.2"
}
}
+203
View File
@@ -0,0 +1,203 @@
{
"type": "object",
"required": [
"nombre_autorizado_de_la_institucion",
"nivel_y_nombre_del_plan_de_estudios",
"modalidad_educativa",
"vigencia",
"antecedente_academico",
"area_de_estudio",
"clave_del_plan_de_estudios",
"diseno_curricular",
"total_de_ciclos_del_plan_de_estudios",
"duracion_del_ciclo_escolar",
"carga_horaria_a_la_semana",
"fines_de_aprendizaje_o_formacion",
"perfil_de_egreso",
"programa_de_investigacion",
"curso_propedeutico",
"perfil_de_ingreso",
"administracion_y_operatividad_del_plan_de_estudios",
"sustento_teorico_del_modelo_curricular",
"justificacion_de_la_propuesta_curricular",
"propuesta_de_evaluacion_periodica_del_plan_de_estudios",
"nombre_y_cargo_de_la_persona_facultada_para_autorizar_el_plan_de_estudios"
],
"properties": {
"nombre_autorizado_de_la_institucion": {
"type": "string",
"title": "Nombre autorizado de la institución",
"examples": ["Universidad La Salle A.C."],
"description": "Proporcionar el nombre de la institución autorizado por SEP.",
"referencia_normativa": "Dato administrativo del Anexo 1."
},
"nivel_y_nombre_del_plan_de_estudios": {
"type": "string",
"title": "Nivel y nombre del plan de estudios",
"examples": [
"Licenciatura en Derecho",
"Maestría en Ciencias de la Computación"
],
"description": "Indicar el nivel educativo y denominación del plan de estudios.",
"referencia_normativa": "Corresponde al requisito 'Nivel y denominación del plan de estudios' del Artículo 8, fracción I del Acuerdo 17/11/17."
},
"modalidad_educativa": {
"enum": ["Escolar", "No escolarizada", "Mixta"],
"type": "string",
"title": "Modalidad educativa",
"examples": ["Escolar"],
"description": "Señalar la modalidad educativa en la que se impartirá el plan de estudios: escolar, no escolarizada o mixta.",
"referencia_normativa": "Corresponde al requisito de 'Modalidad educativa' del Artículo 8, fracción II del Acuerdo 17/11/17."
},
"vigencia": {
"type": "string",
"title": "Vigencia",
"examples": ["2024-2029"],
"description": "(Espacio para uso exclusivo de la autoridad educativa)",
"referencia_normativa": "Dato administrativo del Anexo 1."
},
"antecedente_academico": {
"type": "string",
"title": "Antecedente académico",
"examples": [
"Bachillerato concluido o equivalente.",
"Título de Licenciatura en áreas afines a la salud."
],
"description": "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.",
"referencia_normativa": "Corresponde al requisito 'Perfil de ingreso' (antecedente académico necesario) del Artículo 8, fracción V del Acuerdo 17/11/17."
},
"area_de_estudio": {
"type": "string",
"title": "Área de estudio",
"examples": [
"Ingeniería, industria y construcción",
"Ciencias sociales y derecho"
],
"description": "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.",
"referencia_normativa": "Deberá vincularse con el fin de aprendizaje y perfil de egreso del plan de estudios."
},
"clave_del_plan_de_estudios": {
"type": "string",
"title": "Clave / Año del plan",
"examples": ["2024"],
"description": "Señalar el año en el que solicita el trámite.",
"referencia_normativa": "Dato administrativo del Anexo 1."
},
"diseno_curricular": {
"enum": ["Rígido", "Flexible"],
"type": "string",
"title": "Diseño curricular",
"examples": ["Flexible"],
"description": "Indicar si es “Rígido” o “Flexible”.",
"referencia_normativa": "Define la estructura para el requisito 'Mapa curricular' del Artículo 8, fracción VII del Acuerdo 17/11/17."
},
"total_de_ciclos_del_plan_de_estudios": {
"type": "string",
"title": "Número de ciclos escolares que integrarán el plan de estudio",
"examples": ["9 cuatrimestres", "8 semestres"],
"description": "En diseño flexible especificar mínimo y máximo de ciclos. En diseño rígido especificar el total de ciclos.",
"referencia_normativa": "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."
},
"duracion_del_ciclo_escolar": {
"type": "string",
"title": "Duración mínima en semanas de cada ciclo escolar",
"examples": ["16 semanas"],
"description": "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.",
"referencia_normativa": "Corresponde exactamente al requisito 'Duración mínima en semanas' del Artículo 8, fracción III del Acuerdo 17/11/17."
},
"carga_horaria_a_la_semana": {
"type": "number",
"title": "Carga horaria a la semana",
"examples": [25],
"description": "Indicar la máxima carga horaria impartida a la semana; no mayor a 50 horas bajo la conducción de un académico.",
"referencia_normativa": "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."
},
"fines_de_aprendizaje_o_formacion": {
"type": "string",
"title": "Fin de aprendizaje o formación",
"examples": [
"El estudiante analizará los principios fundamentales del derecho penal..."
],
"description": "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.",
"referencia_normativa": "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."
},
"perfil_de_egreso": {
"type": "string",
"title": "Perfil de egreso",
"examples": ["El egresado será capaz de diseñar estrategias legales..."],
"description": "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.",
"referencia_normativa": "Corresponde al requisito 'Perfil de egreso' del Artículo 8, fracción VI del Acuerdo 17/11/17."
},
"programa_de_investigacion": {
"type": ["string", "null"],
"title": "Programa de investigación",
"examples": [
"Línea 1: Innovación Educativa. Objetivo: Analizar el impacto de..."
],
"description": "(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.",
"referencia_normativa": "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."
},
"curso_propedeutico": {
"type": ["string", "null"],
"title": "Curso propedéutico",
"examples": [
"Curso de nivelación de 40 horas obligatorio para aspirantes de áreas ajenas."
],
"description": "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.",
"referencia_normativa": "Elemento opcional mencionado en las guías de llenado del Anexo 1."
},
"perfil_de_ingreso": {
"type": "string",
"title": "Perfil de ingreso",
"examples": [
"Conocimientos básicos de matemáticas, capacidad de análisis y redacción."
],
"description": "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.",
"referencia_normativa": "Corresponde al requisito 'Perfil de ingreso' (condiciones mínimas requeridas) del Artículo 8, fracción V del Acuerdo 17/11/17."
},
"administracion_y_operatividad_del_plan_de_estudios": {
"type": ["string", "null"],
"title": "Administración y operatividad del plan de estudios",
"examples": [
"El estudiante podrá inscribir un mínimo de 3 y un máximo de 6 asignaturas por ciclo..."
],
"description": "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.",
"referencia_normativa": "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."
},
"sustento_teorico_del_modelo_curricular": {
"type": ["string", "null"],
"title": "Sustento teórico del modelo curricular",
"examples": [
"Modelo por competencias profesionales fundamentado en el constructivismo..."
],
"description": "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.",
"referencia_normativa": "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."
},
"justificacion_de_la_propuesta_curricular": {
"type": ["string", "null"],
"title": "Justificación de la propuesta curricular en la modalidad no escolarizada o mixta",
"examples": [
"Se utilizará una plataforma LMS asincrónica complementada con sesiones síncronas..."
],
"description": "(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.",
"referencia_normativa": "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."
},
"propuesta_de_evaluacion_periodica_del_plan_de_estudios": {
"type": ["string", "null"],
"title": "Propuesta de evaluación periódica del plan de estudios",
"examples": [
"Revisión quinquenal mediante encuestas a empleadores, egresados y análisis de tendencias del mercado."
],
"description": "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.",
"referencia_normativa": "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."
},
"nombre_y_cargo_de_la_persona_facultada_para_autorizar_el_plan_de_estudios": {
"type": "string",
"title": "Nombre y cargo de la persona facultada para autorizar el plan de estudios",
"examples": ["Dr. Juan Pérez Gómez, Rector de la Universidad XYZ"],
"description": "Indicar el nombre y cargo de la persona facultada para autorizar el plan de estudios.",
"referencia_normativa": "Dato administrativo del Anexo 1."
}
},
"additionalProperties": false
}
+1 -1
View File
@@ -1,5 +1,5 @@
export const corsHeaders = {
"Access-Control-Allow-Origin": "*",
"Access-Control-Allow-Headers":
"authorization, x-client-info, apikey, content-type",
"authorization, x-client-info, apikey, content-type, x-supabase-client-platform",
};
+18 -6
View File
@@ -137,8 +137,15 @@ Deno.serve(async (req) => {
const userPrompt =
`Genera un borrador completo del PLAN DE ESTUDIOS con base en lo siguiente:
- Descripción del enfoque: ${payload.iaConfig.descripcionEnfoque}
- Notas adicionales: ${payload.iaConfig.notasAdicionales ?? "Ninguna"}`;
- Nombre de la institución: Universidad La Salle México
- Nombre del plan: ${payload.datosBasicos.nombrePlan}
- Nivel: ${payload.datosBasicos.nivel}
- Tipo de ciclo: ${payload.datosBasicos.tipoCiclo}
- Número de ciclos: ${payload.datosBasicos.numCiclos}
- Descripción del enfoque académico (sobre el contenido de la respuesta generada): ${payload.iaConfig.descripcionEnfoqueAcademico}
- Notas adicionales (sobre el formato de la respuesta generada): ${
payload.iaConfig.instruccionesAdicionalesIA ?? "Ninguna"
}`;
// Ensure the JSON schema is an object as required by OpenAI types
const schemaDef: Record<string, unknown> =
typeof estructuraPlan?.definicion === "object" &&
@@ -230,8 +237,10 @@ Deno.serve(async (req) => {
repositoriosIds: payload.iaConfig?.repositoriosIds ?? null,
},
iaConfig: {
descripcionEnfoque: payload.iaConfig?.descripcionEnfoque ?? null,
notasAdicionales: payload.iaConfig?.notasAdicionales ?? null,
descripcionEnfoqueAcademico:
payload.iaConfig?.descripcionEnfoqueAcademico ?? null,
instruccionesAdicionalesIA:
payload.iaConfig?.instruccionesAdicionalesIA ?? null,
usarMCP: Boolean(payload.iaConfig?.usarMCP),
},
} as unknown as Json,
@@ -315,8 +324,11 @@ const DatosBasicosSchema: z.ZodType<AIGeneratePlanInput["datosBasicos"]> = z
});
const IAConfigSchema: z.ZodType<AIGeneratePlanInput["iaConfig"]> = z.object({
descripcionEnfoque: z.string().min(10, "La descripción es muy corta"),
notasAdicionales: z.string().optional(),
descripcionEnfoqueAcademico: z.string().min(
10,
"La descripción es muy corta",
),
instruccionesAdicionalesIA: z.string().optional(),
archivosReferencia: z.array(z.string().uuid()).optional(),
repositoriosIds: z.array(z.string().uuid()).optional(),
usarMCP: z.boolean().optional(),
+2 -2
View File
@@ -9,8 +9,8 @@ export type AIGeneratePlanInput = {
estructuraPlanId: string;
};
iaConfig: {
descripcionEnfoque: string;
notasAdicionales?: string;
descripcionEnfoqueAcademico: string;
instruccionesAdicionalesIA?: string;
archivosReferencia?: Array<string>;
repositoriosIds?: Array<string>;
usarMCP?: boolean;